ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNWM0MjYKLS0tIC9kZXYvbnVsbAorKysgYi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAyMDI0IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKK30KKworLy8gUGFja2FnZSB0aGUgbWluaW1hbCBmaWxlcyByZXF1aXJlZCB0byBydW4gZW52c2V0dXAuc2ggaW4gdGhlIHRlc3QKKy8vIGVudmlyb25tZW50LgorZ2VucnVsZSB7CisgICAgbmFtZTogImVudnNldHVwX21pbmltdW0uemlwIiwKKyAgICB2aXNpYmlsaXR5OiBbCisgICAgICAgICIvL2J1aWxkL21ha2UvdGVzdHM6X19zdWJwYWNrYWdlc19fIiwKKyAgICBdLAorICAgIHRvb2xzOiBbCisgICAgICAgICJzb29uZ196aXAiLAorICAgIF0sCisgICAgc3JjczogWworICAgICAgICAiZW52c2V0dXAuc2giLAorICAgICAgICAic2hlbGxfdXRpbHMuc2giLAorICAgICAgICAiY29yZS9lbnZzZXR1cC5tayIsCisgICAgXSwKKyAgICBvdXQ6IFsiZW52c2V0dXAuemlwIl0sCisgICAgY21kOiAiJChsb2NhdGlvbiBzb29uZ196aXApIC1vICQob3V0KSAtRCBidWlsZC9tYWtlIiwKK30KZGlmZiAtLWdpdCBhL0NoYW5nZXMubWQgYi9DaGFuZ2VzLm1kCmluZGV4IGRhZWJkNTIuLjlmMjQ0OWMgMTAwNjQ0Ci0tLSBhL0NoYW5nZXMubWQKKysrIGIvQ2hhbmdlcy5tZApAQCAtMSwxOCArMSw1MSBAQAotIyBCdWlsZCBTeXN0ZW0gQ2hhbmdlcyBmb3IgQW5kcm9pZC5tayBXcml0ZXJzCisjIEJ1aWxkIFN5c3RlbSBDaGFuZ2VzIGZvciBBbmRyb2lkLm1rL0FuZHJvaWQuYnAgV3JpdGVycworCisjIyBTb29uZyBnZW5ydWxlcyBhcmUgbm93IHNhbmRib3hlZAorCitQcmV2aW91c2x5LCBzb29uZyBnZW5ydWxlcyBjb3VsZCBhY2Nlc3MgYW55IGZpbGVzIGluIHRoZSBzb3VyY2UgdHJlZSwgd2l0aG91dCBzcGVjaWZ5aW5nIHRoZW0gYXMKK2lucHV0cy4gVGhpcyBtYWtlcyB0aGVtIGluY29ycmVjdCBpbiBpbmNyZW1lbnRhbCBidWlsZHMsIGFuZCBpbmNvbXBhdGlibGUgd2l0aCBSQkUgYW5kIEJhemVsLgorCitOb3csIGdlbnJ1bGVzIGFyZSBzYW5kYm94ZWQgc28gdGhleSBjYW4gb25seSBhY2Nlc3MgdGhlaXIgbGlzdGVkIHNyY3MuIE1vZHVsZXMgZGVueWxpc3RlZCBpbgorZ2VucnVsZS9hbGxvd2xpc3RzLmdvIGFyZSBleGVtcHQgZnJvbSB0aGlzLiBZb3UgY2FuIGFsc28gc2V0IGBCVUlMRF9CUk9LRU5fR0VOUlVMRV9TQU5EQk9YSU5HYAoraW4gYm9hcmQgY29uZmlnIHRvIGRpc2FibGUgdGhpcyBiZWhhdmlvci4KKworIyMgUGFydGl0aW9ucyBhcmUgbm8gbG9uZ2VyIGFmZmVjdGVkIGJ5IHByZXZpb3VzIGJ1aWxkcworCitQYXJ0aXRpb24gYnVpbGRzIHVzZWQgdG8gaW5jbHVkZSBldmVyeXRoaW5nIGluIHRoZWlyIHN0YWdpbmcgZGlyZWN0b3JpZXMsIGFuZCBidWlsZGluZyBhbgoraW5kaXZpZHVhbCBtb2R1bGUgd2lsbCBpbnN0YWxsIGl0IHRvIHRoZSBzdGFnaW5nIGRpcmVjdG9yeS4gVGh1cywgcHJldmlvdXNseSwgYG0gbXltb2R1bGVgIGZvbGxvd2VkCitieSBgbWAgd291bGQgY2F1c2UgYG15bW9kdWxlYCB0byBiZSBwcmVzaW5zdGFsbGVkIG9uIHRoZSBkZXZpY2UsIGV2ZW4gaWYgaXQgd2Fzbid0IGxpc3RlZCBpbgorYFBST0RVQ1RfUEFDS0FHRVNgLgorCitUaGlzIGJlaGF2aW9yIGhhcyBiZWVuIGNoYW5nZWQsIGFuZCBub3cgdGhlIHBhcnRpdGlvbiBpbWFnZXMgb25seSBpbmNsdWRlIHdoYXQgdGhleSdkIGhhdmUgaWYgeW91CitkaWQgYSBjbGVhbiBidWlsZC4gVGhpcyBiZWhhdmlvciBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGUKK2BCVUlMRF9CUk9LRU5fSU5DT1JSRUNUX1BBUlRJVElPTl9JTUFHRVNgIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIGJvYXJkIGNvbmZpZyB2YXJpYWJsZS4KKworTWFudWFsbHkgYWRkaW5nIG1ha2UgcnVsZXMgdGhhdCBidWlsZCB0byB0aGUgc3RhZ2luZyBkaXJlY3RvcmllcyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhlIG1ha2UKK21vZHVsZSBzeXN0ZW0gd2lsbCBub3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoaXMgY2hhbmdlLiBUaGlzIGluY2x1ZGVzIG1hbnkgdXNhZ2VzIG9mCitgTE9DQUxfUE9TVF9JTlNUQUxMX0NNRGAuCisKKyMjIFBlcmZvcm0gdmFsaWRhdGlvbiBvZiBTb29uZyBwbHVnaW5zCisKK0VhY2ggU29vbmcgcGx1Z2luIHdpbGwgcmVxdWlyZSBtYW51YWwgd29yayB0byBtaWdyYXRlIHRvIEJhemVsLiBJbiBvcmRlciB0bworbWluaW1pemUgdGhlIG1hbnVhbCB3b3JrIG91dHNpZGUgb2YgYnVpbGQvc29vbmcsIHdlIGFyZSByZXN0cmljdGluZyBwbHVnaW5zIHRvCit0aG9zZSB0aGF0IGV4aXN0IHRvZGF5IGFuZCB0aG9zZSBpbiB2ZW5kb3Igb3IgaGFyZHdhcmUgZGlyZWN0b3JpZXMuCisKK0lmIHlvdSBuZWVkIHRvIGV4dGVuZCB0aGUgYnVpbGQgc3lzdGVtIHZpYSBhIHBsdWdpbiwgcGxlYXNlIHJlYWNoIG91dCB0byB0aGUKK2J1aWxkIHRlYW0gdmlhIGVtYWlsIGFuZHJvaWQtYnVpbGRpbmdAZ29vZ2xlZ3JvdXBzLmNvbSAoZXh0ZXJuYWwpIGZvciBhbnkKK3F1ZXN0aW9ucywgb3Igc2VlIFtnby9zb29uZ10oaHR0cDovL2dvL3Nvb25nKSAoaW50ZXJuYWwpLgorCitUbyBvbWl0IHRoZSB2YWxpZGF0aW9uLCBgQlVJTERfQlJPS0VOX1BMVUdJTl9WQUxJREFUSU9OYCBleHBlY3RzIGEKK3NwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBsdWdpbnMgdG8gb21pdCBmcm9tIHRoZSB2YWxpZGF0aW9uLiBUaGlzIG11c3QgYmUgc2V0Cit3aXRoaW4gYSBwcm9kdWN0IGNvbmZpZ3VyYXRpb24gLm1rIGZpbGUsIGJvYXJkIGNvbmZpZyAubWsgZmlsZSwgb3IgYnVpbGRzcGVjLm1rLgogCiAjIyBQeXRob24gMiB0byAzIG1pZ3JhdGlvbgogCiBUaGUgcGF0aCBzZXQgd2hlbiBydW5uaW5nIGJ1aWxkcyBub3cgbWFrZXMgdGhlIGBweXRob25gIGV4ZWN1dGFibGUgcG9pbnQgdG8gcHl0aG9uIDMsCiB3aGVyZWFzIG9uIHByZXZpb3VzIHZlcnNpb25zIGl0IHBvaW50ZWQgdG8gcHl0aG9uIDIuIElmIHlvdSBzdGlsbCBoYXZlIHB5dGhvbiAyIHNjcmlwdHMsCiB5b3UgY2FuIGNoYW5nZSB0aGUgc2hlYmFuZyBsaW5lIHRvIHVzZSBgcHl0aG9uMmAgZXhwbGljaXRseS4gVGhpcyBvbmx5IGFwcGxpZXMgZm9yCi1zY3JpcHRzIHJ1biBkaXJlY3RseSBmcm9tIG1ha2VmaWxlcywgb3IgZnJvbSBzb29uZyBnZW5ydWxlcy4gVGhpcyBiZWhhdmlvciBjYW4gYmUKLXRlbXBvcmFyaWx5IG92ZXJyaWRkZW4gYnkgc2V0dGluZyB0aGUgYEJVSUxEX0JST0tFTl9QWVRIT05fSVNfUFlUSE9OMmAgZW52aXJvbm1lbnQKLXZhcmlhYmxlIHRvIGB0cnVlYC4gSXQncyBvbmx5IGFuIGVudmlyb25tZW50IHZhcmlhYmxlIGFuZCBub3QgYSBwcm9kdWN0IGNvbmZpZyB2YXJpYWJsZQotYmVjYXVzZSBwcm9kdWN0IGNvbmZpZyBzb21ldGltZXMgY2FsbHMgcHl0aG9uIGNvZGUuCitzY3JpcHRzIHJ1biBkaXJlY3RseSBmcm9tIG1ha2VmaWxlcywgb3IgZnJvbSBzb29uZyBnZW5ydWxlcy4KIAotSW4gYWRkaXRpb24sIGBweXRob25fKmAgc29vbmcgbW9kdWxlcyBubyBsb25nZXIgYWxsb3cgcHl0aG9uIDIuIFRoaXMgY2FuIGJlIHRlbXBvcmFyaWx5Ci1vdmVycmlkZGVuIGJ5IHNldHRpbmcgdGhlIGBCVUlMRF9CUk9LRU5fVVNFU19TT09OR19QWVRIT04yX01PRFVMRVNgIHByb2R1Y3QgY29uZmlndXJhdGlvbgotdmFyaWFibGUgdG8gYHRydWVgLgorSW4gYWRkaXRpb24sIGBweXRob25fKmAgc29vbmcgbW9kdWxlcyBubyBsb25nZXIgYWxsb3cgcHl0aG9uIDIuCiAKIFB5dGhvbiAyIGlzIHNsYXRlZCBmb3IgY29tcGxldGUgcmVtb3ZhbCBpbiBWLgogCkBAIC00OTMsNiArNTI2LDI0IEBACiAKIHdpbGwgY29weSBgYmFyL2JhemAgaW50byBgJERJU1RfRElSL2JhemAgd2hlbiBgbSBmb28gZGlzdGAgaXMgcnVuLgogCisjIyMjIEZJTEVfTkFNRV9UQUcgIHsjRklMRV9OQU1FX1RBR30KKworVG8gZW1iZWQgdGhlIGBCVUlMRF9OVU1CRVJgIChvciBmb3IgbG9jYWwgYnVpbGRzLCBgZW5nLiR7VVNFUn1gKSwgaW5jbHVkZQorYEZJTEVfTkFNRV9UQUdfUExBQ0VIT0xERVJgIGluIHRoZSBkZXN0aW5hdGlvbjoKKworYGBgIG1ha2UKKyMgeW91IGNhbiB1c2UgZGlzdC1mb3ItZ29hbHMtd2l0aC1maWxlbmFtZXRhZyBmdW5jdGlvbgorJChjYWxsIGRpc3QtZm9yLWdvYWxzLXdpdGgtZmlsZW5hbWV0YWcsZm9vLGJhci56aXApCisjIG9yIHVzZSBGSUxFX05BTUVfVEFHX1BMQUNFSE9MREVSIG1hbnVhbGx5CiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsZm9vLGJhci56aXA6YmF6LUZJTEVfTkFNRV9UQUdfUExBQ0VIT0xERVIuemlwKQorYGBgCisKK1doaWNoIHdpbGwgcHJvZHVjZSBgJERJU1RfRElSL2Jhei0xMjM0NTY3LnppcGAgb24gYnVpbGQgc2VydmVycyB3aGljaCBzZXQKK2BCVUlMRF9OVU1CRVI9MTIzNDU2N2AsIG9yIGAkRElTVF9ESVIvYmF6LWVuZy5idWlsZGVyLnppcGAgZm9yIGxvY2FsIGJ1aWxkcy4KKworSWYgeW91IGp1c3Qgd2FudCB0byBhcHBlbmQgYEJVSUxEX05VTUJFUmAgYXQgdGhlIGVuZCBvZiBiYXNlbmFtZSwgdXNlCitgZGlzdC1mb3ItZ29hbHMtd2l0aC1maWxlbmFtZXRhZ2AgaW5zdGVhZCBvZiBgZGlzdC1mb3ItZ29hbHNgLgorCiAjIyMjIFJlbmFtZXMgZHVyaW5nIGNvcHkKIAogSW5zdGVhZCBvZiBzcGVjaWZ5aW5nIGp1c3QgYSBmaWxlLCBhIGRlc3RpbmF0aW9uIG5hbWUgY2FuIGJlIHNwZWNpZmllZCwKZGlmZiAtLWdpdCBhL0NsZWFuU3BlYy5tayBiL0NsZWFuU3BlYy5tawppbmRleCA5NTdkYTkyLi44YzMwODgzIDEwMDY0NAotLS0gYS9DbGVhblNwZWMubWsKKysrIGIvQ2xlYW5TcGVjLm1rCkBAIC03NzMsNiArNzczLDI3IEBACiAjIERvbid0IHVzZSBTT09OR19IT1NUX09VVCwgaXQgaXMgbm93IGFuIGFsaWFzIGZvciBIT1NUX09VVC4KICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvc29vbmcvaG9zdCkKIAorIyBDbGVhciBvdXQgdG9vbHMvbWV0YWxhdmEgQmF6ZWwgb3V0cHV0IGRpcgorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS9iYXplbC9vdXRwdXQvZXhlY3Jvb3QvX19tYWluX18vYmF6ZWwtb3V0L21peGVkX2J1aWxkc19wcm9kdWN0LSovYmluL3Rvb2xzL21ldGFsYXZhKQorCisjIENsZWFyIG91dCBydXN0YyBjb21waWxlciBpbnRlcm1lZGlhdGVzIGFmdGVyIHJldmVydGluZyBydXN0IGNvbXBpbGVyL2xpbmtlciBzcGxpdC4KKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgZmluZCAkKE9VVF9ESVIpIC1uYW1lICIqLnJzcC53aG9sZS5hIiAtcHJpbnQwIHwgeGFyZ3MgLTAgL2Jpbi9iYXNoIC1jICdybSAtZiAkJCQke0B9OyBybSAtZiAkJCQke0AvLnJzcC53aG9sZS5hLy5yc3AuYX07IHJtIC1mICQkJCR7QC8ucnNwLndob2xlLmEvLnJzcH0nKQorCisjIFJlbW92ZSBvYnNvbGV0ZSBqYXZhIGNvbXBpbGF0aW9uIGFydGlmYWN0cworJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy8pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIGZpbmQgJChPVVRfRElSKSAtdHlwZSBmIC1uYW1lICIqLmphciIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mKQorCisjIFJlbW92ZSBvYnNvbGV0ZSBqYXZhIGNvbXBpbGF0aW9uIGFydGlmYWN0cworJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy8pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIGZpbmQgJChPVVRfRElSKSAtdHlwZSBmIC1uYW1lICIqLmphciIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mKQorCisjIFJlbW92ZSBvYnNvbGV0ZSBkZXhwcmVvcHRfY29uZmlnIGFydGlmYWN0cworJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtZiAkKFBST0RVQ1RfT1VUKS9kZXhwcmVvcHRfY29uZmlnL2RleHByZW9wdC5jb25maWcpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1mICQoUFJPRFVDVF9PVVQpL2RleHByZW9wdF9jb25maWcvZGV4cHJlb3B0X3Nvb25nLmNvbmZpZykKKworIyBDbGVhciBvdXQgU29vbmcgLmludGVybWVkaWF0ZXMgZGlyZWN0b3J5IHJlZ2FyZGluZyByZW1vdmFsIG9mIGhhc2hlZCBzdWJkaXIKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvc29vbmcvLmludGVybWVkaWF0ZXMpCisKICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAjIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVAogIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL01FVEFEQVRBIGIvTUVUQURBVEEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NzgxYTcuLjAwMDAwMDAKLS0tIGEvTUVUQURBVEEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXRoaXJkX3BhcnR5IHsKLSAgbGljZW5zZV9ub3RlOiAid291bGQgYmUgTk9USUNFIHNhdmUgZm9yIEdQTCBpbjpcbiIKLSAgIiAgIGNvcmUvTElOVVhfS0VSTkVMX0NPUFlJTkdcbiIKLSAgIiAgIHRvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1wZGsvYXNzZXRzL2pxdWVyeS0xLjYuMi5taW4uanNcbiIKLSAgIiAgIHRvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1wZGsvYXNzZXRzL2pxdWVyeS1oaXN0b3J5LmpzXG4iCi0gICIgICB0b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtcGRrL2Fzc2V0cy9qcXVlcnktcmVzaXphYmxlLm1pbi5qcyIKLSAgbGljZW5zZV90eXBlOiBSRVNUUklDVEVECi19CmRpZmYgLS1naXQgYS9PV05FUlMgYi9PV05FUlMKaW5kZXggMzIwOTY2NS4uYmQwNDllOSAxMDA2NDQKLS0tIGEvT1dORVJTCisrKyBiL09XTkVSUwpAQCAtMiw1ICsyLDYgQEAKIAogIyBTaW5jZSB0aGlzIGZpbGUgYWZmZWN0cyBhbGwgQW5kcm9pZCBkZXZlbG9wZXJzLCBsb2NrIGl0IGRvd24uIFRoZXJlIGlzIHN0aWxsCiAjIHJvdW5kIHRoZSB3b3JsZCB0aW16ZW9uZSBjb3ZlcmFnZS4KLXBlci1maWxlIGVudnNldHVwLnNoID0gam9lb0Bnb29nbGUuY29tLCBqaW5nd2VuQGdvb2dsZS5jb20sIGxiZXJraUBnb29nbGUuY29tCi1wZXItZmlsZSBzaGVsbF91dGlscy5zaCA9IGpvZW9AZ29vZ2xlLmNvbSwgamluZ3dlbkBnb29nbGUuY29tLCBsYmVya2lAZ29vZ2xlLmNvbQorcGVyLWZpbGUgZW52c2V0dXAuc2ggPSBqb2VvQGdvb2dsZS5jb20sIGppbmd3ZW5AZ29vZ2xlLmNvbQorcGVyLWZpbGUgc2hlbGxfdXRpbHMuc2ggPSBqb2VvQGdvb2dsZS5jb20sIGppbmd3ZW5AZ29vZ2xlLmNvbQorCmRpZmYgLS1naXQgYS9QUkVVUExPQUQuY2ZnIGIvUFJFVVBMT0FELmNmZwppbmRleCBjZTc1MTUwLi45N2VjZDMzIDEwMDY0NAotLS0gYS9QUkVVUExPQUQuY2ZnCisrKyBiL1BSRVVQTE9BRC5jZmcKQEAgLTEsMiArMSw1IEBACiBbSG9vayBTY3JpcHRzXQogZG9fbm90X3VzZV9ET19OT1RfTUVSR0UgPSAke1JFUE9fUk9PVH0vYnVpbGQvc29vbmcvc2NyaXB0cy9jaGVja19kb19ub3RfbWVyZ2Uuc2ggJHtQUkVVUExPQURfQ09NTUlUfQorCitbQnVpbHRpbiBIb29rc10KK2t0Zm10ID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvYmFja3BvcnRlZF9maXhlcy9BbmRyb2lkLmJwIGIvYmFja3BvcnRlZF9maXhlcy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYWVhNTYKLS0tIC9kZXYvbnVsbAorKysgYi9iYWNrcG9ydGVkX2ZpeGVzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNDQgQEAKKy8vIENvcHlyaWdodCAyMDI0IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKKyAgICBkZWZhdWx0X3RlYW06ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX21lZGlhX3JlbGlhYmlsaXR5IiwKK30KKworZ2VucnVsZSB7CisgICAgbmFtZTogImFwcGxpZWRfYmFja3BvcnRlZF9maXhlcyIsCisgICAgdG9vbHM6IFsiYXBwbGllZF9iYWNrcG9ydGVkX2ZpeGVzX3Byb3BlcnR5X3dyaXRlciJdLAorICAgIHNyY3M6IFsiOmFwcGxpZWRfYmFja3BvcnRlZF9maXhfYmlucGJzIl0sCisgICAgb3V0OiBbImFwcGxpZWRfYmFja3BvcnRlZF9maXhlcy5wcm9wIl0sCisgICAgY21kOiAiJChsb2NhdGlvbiBhcHBsaWVkX2JhY2twb3J0ZWRfZml4ZXNfcHJvcGVydHlfd3JpdGVyKSIgKworICAgICAgICAiIC1wICQobG9jYXRpb24gYXBwbGllZF9iYWNrcG9ydGVkX2ZpeGVzLnByb3ApIiArCisgICAgICAgICIgJChpbikiLAorfQorCitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJiYWNrcG9ydGVkX2ZpeGVzX3Byb3RvX2ZpbGUiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImJhY2twb3J0ZWRfZml4ZXMucHJvdG8iLAorICAgIF0sCit9CisKK2phdmFfbGlicmFyeSB7CisgICAgbmFtZTogImJhY2twb3J0ZWRfZml4ZXNfcHJvdG8iLAorICAgIHNyY3M6IFsiYmFja3BvcnRlZF9maXhlcy5wcm90byJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHNka192ZXJzaW9uOiAiY3VycmVudCIsCit9CisKK2phdmFfbGlicmFyeSB7CisgICAgbmFtZTogImJhY2twb3J0ZWRfZml4ZXNfY29tbW9uIiwKKyAgICBzcmNzOiBbInNyYy9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2JhY2twb3J0ZWRmaXhlcy9jb21tb24vKi5qYXZhIl0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImJhY2twb3J0ZWRfZml4ZXNfcHJvdG8iLAorICAgICAgICAiZ3VhdmEiLAorICAgIF0sCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCit9CisKK2phdmFfdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiYmFja3BvcnRlZF9maXhlc19jb21tb25fdGVzdCIsCisgICAgc3JjczogWyJ0ZXN0cy9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2JhY2twb3J0ZWRmaXhlcy9jb21tb24vKi5qYXZhIl0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImJhY2twb3J0ZWRfZml4ZXNfY29tbW9uIiwKKyAgICAgICAgImJhY2twb3J0ZWRfZml4ZXNfcHJvdG8iLAorICAgICAgICAianVuaXQiLAorICAgICAgICAidHJ1dGgiLAorICAgICAgICAidHJ1dGgtbGl0ZXByb3RvLWV4dGVuc2lvbiIsCisgICAgICAgICJ0cnV0aC1wcm90by1leHRlbnNpb24iLAorICAgIF0sCisgICAgdGVzdF9vcHRpb25zOiB7CisgICAgICAgIHVuaXRfdGVzdDogdHJ1ZSwKKyAgICB9LAorICAgIHRlc3Rfc3VpdGVzOiBbImdlbmVyYWwtdGVzdHMiXSwKK30KKworamF2YV9saWJyYXJ5IHsKKyAgICBuYW1lOiAiYmFja3BvcnRlZF9maXhlc19tYWluX2xpYiIsCisgICAgc3JjczogWyJzcmMvamF2YS9jb20vYW5kcm9pZC9idWlsZC9iYWNrcG9ydGVkZml4ZXMvKi5qYXZhIl0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImJhY2twb3J0ZWRfZml4ZXNfY29tbW9uIiwKKyAgICAgICAgImJhY2twb3J0ZWRfZml4ZXNfcHJvdG8iLAorICAgICAgICAiamNvbW1hbmRlciIsCisgICAgICAgICJndWF2YSIsCisgICAgXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKK30KKworamF2YV9iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogImFwcGxpZWRfYmFja3BvcnRlZF9maXhlc19wcm9wZXJ0eV93cml0ZXIiLAorICAgIG1haW5fY2xhc3M6ICJjb20uYW5kcm9pZC5idWlsZC5iYWNrcG9ydGVkZml4ZXMuV3JpdGVCYWNrcG9ydGVkRml4ZXNQcm9wRmlsZSIsCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImJhY2twb3J0ZWRfZml4ZXNfbWFpbl9saWIiLAorICAgIF0sCit9CisKK2phdmFfYmluYXJ5X2hvc3QgeworICAgIG5hbWU6ICJiYWNrcG9ydGVkX2ZpeGVzX2NvbWJpbmVyIiwKKyAgICBtYWluX2NsYXNzOiAiY29tLmFuZHJvaWQuYnVpbGQuYmFja3BvcnRlZGZpeGVzLkNvbWJpbmVCYWNrcG9ydGVkRml4ZXMiLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJiYWNrcG9ydGVkX2ZpeGVzX21haW5fbGliIiwKKyAgICBdLAorfQorCisvLyBDb21iaW5lcyBCYWNrcG9ydGVkRml4IGJpbmFyeSBwcm90byBmaWxlcyBpbnRvIGEgc2luZ2xlIEJhY2twb3J0ZWRGaXhlcyBiaW5hcnkgcHJvdG8gZmlsZS4KK2dlbnJ1bGVfZGVmYXVsdHMgeworICAgIG5hbWU6ICJkZWZhdWx0X2JhY2twb3J0ZWRfZml4ZXNfY29tYmluZXIiLAorICAgIHRvb2xzOiBbImJhY2twb3J0ZWRfZml4ZXNfY29tYmluZXIiXSwKKyAgICBjbWQ6ICIkKGxvY2F0aW9uIGJhY2twb3J0ZWRfZml4ZXNfY29tYmluZXIpIiArCisgICAgICAgICIgLW8gJChvdXQpIiArCisgICAgICAgICIgJChpbikiLAorfQorCitqYXZhX3Rlc3RfaG9zdCB7CisgICAgbmFtZTogImJhY2twb3J0ZWRfZml4ZXNfbWFpbl9saWJfdGVzdCIsCisgICAgc3JjczogWyJ0ZXN0cy9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2JhY2twb3J0ZWRmaXhlcy8qLmphdmEiXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYmFja3BvcnRlZF9maXhlc19tYWluX2xpYiIsCisgICAgICAgICJiYWNrcG9ydGVkX2ZpeGVzX3Byb3RvIiwKKyAgICAgICAgImp1bml0IiwKKyAgICAgICAgInRydXRoIiwKKyAgICBdLAorICAgIHRlc3Rfb3B0aW9uczogeworICAgICAgICB1bml0X3Rlc3Q6IHRydWUsCisgICAgfSwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCit9CisKKy8vIENvbnZlcnRzIEJhY2twcm90ZWRGaXggdGV4dCBwcm90b3MgdG8gYmluYXJ5IHByb3RvcworZ2VucnVsZV9kZWZhdWx0cyB7CisgICAgbmFtZTogImRlZmF1bHRfYmFja3BvcnRlZF9maXhfYmlucGJzIiwKKyAgICB0b29sczogWyJhcHJvdG9jIl0sCisgICAgdG9vbF9maWxlczogWworICAgICAgICAiOmJhY2twb3J0ZWRfZml4ZXNfcHJvdG9fZmlsZSIsCisgICAgXSwKKyAgICBjbWQ6ICIkKGxvY2F0aW9uIGFwcm90b2MpICAiICsKKyAgICAgICAgIiAtLWVuY29kZT1jb20uYW5kcm9pZC5idWlsZC5iYWNrcG9ydGVkZml4ZXMuQmFja3BvcnRlZEZpeCIgKworICAgICAgICAiICAkKGxvY2F0aW9uIDpiYWNrcG9ydGVkX2ZpeGVzX3Byb3RvX2ZpbGUpIiArCisgICAgICAgICIgPCAkKGluKSIgKworICAgICAgICAiID4gJChvdXQpOyBlY2hvICQob3V0KSIsCit9CisKK2dlbnNyY3MgeworICAgIG5hbWU6ICJhcHBsaWVkX2JhY2twb3J0ZWRfZml4X2JpbnBicyIsCisgICAgZGVmYXVsdHM6IFsiZGVmYXVsdF9iYWNrcG9ydGVkX2ZpeF9iaW5wYnMiXSwKKyAgICBvdXRwdXRfZXh0ZW5zaW9uOiAiYmlucGIiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFwcGxpZWRfZml4ZXMvKi50eHRwYiIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2JhY2twb3J0ZWRfZml4ZXMvT1dORVJTIGIvYmFja3BvcnRlZF9maXhlcy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxNzZiZgotLS0gL2Rldi9udWxsCisrKyBiL2JhY2twb3J0ZWRfZml4ZXMvT1dORVJTCkBAIC0wLDAgKzEsMyBAQAorZXNzaWNrQGdvb2dsZS5jb20KK25jaGFsa29AZ29vZ2xlLmNvbQorcG9ydG1hbm5jQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3Nka194ODYubWsgYi9iYWNrcG9ydGVkX2ZpeGVzL2FwcGxpZWRfZml4ZXMva2kzNTAwMzcwMjMudHh0cGIKc2ltaWxhcml0eSBpbmRleCA2NiUKY29weSBmcm9tIHRhcmdldC9wcm9kdWN0L3Nka194ODYubWsKY29weSB0byBiYWNrcG9ydGVkX2ZpeGVzL2FwcGxpZWRfZml4ZXMva2kzNTAwMzcwMjMudHh0cGIKaW5kZXggMTNlZTU3ZC4uNDU2YTdhZSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3g4Ni5taworKysgYi9iYWNrcG9ydGVkX2ZpeGVzL2FwcGxpZWRfZml4ZXMva2kzNTAwMzcwMjMudHh0cGIKQEAgLTEsMTEgKzEsMTAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMgQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICMKICMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTMsOSArMTIsOCBAQAogIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIworIyBwcm90by1maWxlOiAuLi9iYWNrcG9ydGVkX2ZpeGVzLnByb3RvCisjIHByb3RvLW1lc3NhZ2U6IEJhY2twb3J0ZWRGaXgKIAotIyBEb24ndCBtb2RpZnkgdGhpcyBmaWxlIC0gSXQncyBqdXN0IGFuIGFsaWFzIQotCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L3Nka19waG9uZV94ODYubWspCi0KLVBST0RVQ1RfTkFNRSA6PSBzZGtfeDg2Citrbm93bl9pc3N1ZTogMzUwMDM3MDIzCithbGlhczogMQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3g4Ni5tayBiL2JhY2twb3J0ZWRfZml4ZXMvYXBwbGllZF9maXhlcy9raTM4NTEyNDA1Ni50eHRwYgpzaW1pbGFyaXR5IGluZGV4IDY2JQpjb3B5IGZyb20gdGFyZ2V0L3Byb2R1Y3Qvc2RrX3g4Ni5tawpjb3B5IHRvIGJhY2twb3J0ZWRfZml4ZXMvYXBwbGllZF9maXhlcy9raTM4NTEyNDA1Ni50eHRwYgppbmRleCAxM2VlNTdkLi5lMmQ0NTQ1IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9zZGtfeDg2Lm1rCisrKyBiL2JhY2twb3J0ZWRfZml4ZXMvYXBwbGllZF9maXhlcy9raTM4NTEyNDA1Ni50eHRwYgpAQCAtMSwxMSArMSwxMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogIwogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xMyw5ICsxMiw4IEBACiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCisjIHByb3RvLWZpbGU6IC4uL2JhY2twb3J0ZWRfZml4ZXMucHJvdG8KKyMgcHJvdG8tbWVzc2FnZTogQmFja3BvcnRlZEZpeAogCi0jIERvbid0IG1vZGlmeSB0aGlzIGZpbGUgLSBJdCdzIGp1c3QgYW4gYWxpYXMhCi0KLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3Qvc2RrX3Bob25lX3g4Ni5taykKLQotUFJPRFVDVF9OQU1FIDo9IHNka194ODYKK2tub3duX2lzc3VlOiAzODUxMjQwNTYKK2FsaWFzOiA0CmRpZmYgLS1naXQgYS9iYWNrcG9ydGVkX2ZpeGVzL2JhY2twb3J0ZWRfZml4ZXMucHJvdG8gYi9iYWNrcG9ydGVkX2ZpeGVzL2JhY2twb3J0ZWRfZml4ZXMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE2MThlZQotLS0gL2Rldi9udWxsCisrKyBiL2JhY2twb3J0ZWRfZml4ZXMvYmFja3BvcnRlZF9maXhlcy5wcm90bwpAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitzeW50YXggPSAicHJvdG8yIjsKKworcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZC5iYWNrcG9ydGVkZml4ZXM7CisKK29wdGlvbiBqYXZhX211bHRpcGxlX2ZpbGVzID0gdHJ1ZTsKKworLy8gQSBsaXN0IG9mIGJhY2twb3J0ZWQgZml4ZXMuCittZXNzYWdlIEJhY2twb3J0ZWRGaXhlcyB7CisgIHJlcGVhdGVkIEJhY2twb3J0ZWRGaXggZml4ZXMgPSAxOworfQorCisvLyBBIGtub3duIGlzc3VlIGFwcHJvdmVkIGZvciByZXBvcnRpbmcgQnVpbGQuZ2V0QmFja3BvcnRlZEZpeFN0YXR1cworbWVzc2FnZSBCYWNrcG9ydGVkRml4IHsKKworICAvLyBUaGUgaXNzdWUgaWQgZnJvbSB0aGUgcHVibGljIGJ1ZyB0cmFja2VyCisgIC8vIGh0dHBzOi8vaXNzdWV0cmFja2VyLmdvb2dsZS5jb20vaXNzdWVzL3trbm93bl9pc3N1ZX0KKyAgb3B0aW9uYWwgaW50NjQga25vd25faXNzdWUgPSAxOworICAvLyBUaGUgYWxpYXMgZm9yIHRoZSBrbm93biBpc3N1ZS4KKyAgLy8gMSAtIDEwMjMgYXJlIHZhbGlkIGFsaWFzZXMKKyAgLy8gTXVzdCBiZSB1bmlxdWUgYWNyb3NzIGFsbCBiYWNrcG9ydGVkIGZpeGVzLgorICBvcHRpb25hbCBpbnQzMiBhbGlhcyA9IDI7Cit9CisKZGlmZiAtLWdpdCBhL2JhY2twb3J0ZWRfZml4ZXMvc3JjL2phdmEvY29tL2FuZHJvaWQvYnVpbGQvYmFja3BvcnRlZGZpeGVzL0NvbWJpbmVCYWNrcG9ydGVkRml4ZXMuamF2YSBiL2JhY2twb3J0ZWRfZml4ZXMvc3JjL2phdmEvY29tL2FuZHJvaWQvYnVpbGQvYmFja3BvcnRlZGZpeGVzL0NvbWJpbmVCYWNrcG9ydGVkRml4ZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTkyY2MxCi0tLSAvZGV2L251bGwKKysrIGIvYmFja3BvcnRlZF9maXhlcy9zcmMvamF2YS9jb20vYW5kcm9pZC9idWlsZC9iYWNrcG9ydGVkZml4ZXMvQ29tYmluZUJhY2twb3J0ZWRGaXhlcy5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkLmJhY2twb3J0ZWRmaXhlczsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmJhY2twb3J0ZWRmaXhlcy5jb21tb24uUGFyc2VyOworCitpbXBvcnQgY29tLmJldXN0Lmpjb21tYW5kZXIuSkNvbW1hbmRlcjsKK2ltcG9ydCBjb20uYmV1c3QuamNvbW1hbmRlci5QYXJhbWV0ZXI7CitpbXBvcnQgY29tLmJldXN0Lmpjb21tYW5kZXIuY29udmVydGVycy5GaWxlQ29udmVydGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisKKy8qKiBDcmVhdGVzIGEgQmFja3BvcnRlZEZpeGVzIGJpbmFyeSBwcm90byBmaWxlIGZyb20gYSBsaXN0IG9mIEJhY2twb3J0ZWRGaXggcHJvdG8gYmluYXJ5IGZpbGVzLiAqLworcHVibGljIGZpbmFsIGNsYXNzIENvbWJpbmVCYWNrcG9ydGVkRml4ZXMgeworCisgICAgQFBhcmFtZXRlcihkZXNjcmlwdGlvbiA9ICJCYWNrcG9ydGVkRml4IHByb3RvIGJpbmFyeSBmaWxlcyIsCisgICAgICAgICAgICBjb252ZXJ0ZXIgPSBGaWxlQ29udmVydGVyLmNsYXNzLAorICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQorICAgIExpc3Q8RmlsZT4gZml4RmlsZXM7CisgICAgQFBhcmFtZXRlcihkZXNjcmlwdGlvbiA9ICJXcml0ZSB0aGUgQmFja3BvcnRlZEZpeGVzIHByb3RvIGJpbmFyeSB0byB0aGlzIGZpbGUiLAorICAgICAgICAgICAgbmFtZXMgPSB7Ii0tb3V0IiwiLW8ifSwKKyAgICAgICAgICAgIGNvbnZlcnRlciA9IEZpbGVDb252ZXJ0ZXIuY2xhc3MsCisgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCisgICAgRmlsZSBvdXRGaWxlOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nLi4uIGFyZ3YpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDb21iaW5lQmFja3BvcnRlZEZpeGVzIG1haW4gPSBuZXcgQ29tYmluZUJhY2twb3J0ZWRGaXhlcygpOworICAgICAgICBKQ29tbWFuZGVyLm5ld0J1aWxkZXIoKS5hZGRPYmplY3QobWFpbikuYnVpbGQoKS5wYXJzZShhcmd2KTsKKyAgICAgICAgbWFpbi5ydW4oKTsKKyAgICB9CisKKyAgICBDb21iaW5lQmFja3BvcnRlZEZpeGVzKCkgeworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5ICh2YXIgb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0RmlsZSkpIHsKKyAgICAgICAgICAgIHZhciBmaXhlcyA9IFBhcnNlci5wYXJzZUJhY2twb3J0ZWRGaXhGaWxlcyhmaXhGaWxlcyk7CisgICAgICAgICAgICB3cml0ZUJhY2twb3J0ZWRGaXhlcyhmaXhlcywgb3V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHdyaXRlQmFja3BvcnRlZEZpeGVzKEJhY2twb3J0ZWRGaXhlcyBmaXhlcywgT3V0cHV0U3RyZWFtIG91dCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpeGVzLndyaXRlVG8ob3V0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iYWNrcG9ydGVkX2ZpeGVzL3NyYy9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2JhY2twb3J0ZWRmaXhlcy9Xcml0ZUJhY2twb3J0ZWRGaXhlc1Byb3BGaWxlLmphdmEgYi9iYWNrcG9ydGVkX2ZpeGVzL3NyYy9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2JhY2twb3J0ZWRmaXhlcy9Xcml0ZUJhY2twb3J0ZWRGaXhlc1Byb3BGaWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZmYjRhYwotLS0gL2Rldi9udWxsCisrKyBiL2JhY2twb3J0ZWRfZml4ZXMvc3JjL2phdmEvY29tL2FuZHJvaWQvYnVpbGQvYmFja3BvcnRlZGZpeGVzL1dyaXRlQmFja3BvcnRlZEZpeGVzUHJvcEZpbGUuamF2YQpAQCAtMCwwICsxLDg5IEBACisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZC5iYWNrcG9ydGVkZml4ZXM7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworCitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuYmFja3BvcnRlZGZpeGVzLmNvbW1vbi5QYXJzZXI7CisKK2ltcG9ydCBjb20uYmV1c3QuamNvbW1hbmRlci5KQ29tbWFuZGVyOworaW1wb3J0IGNvbS5iZXVzdC5qY29tbWFuZGVyLlBhcmFtZXRlcjsKK2ltcG9ydCBjb20uYmV1c3QuamNvbW1hbmRlci5jb252ZXJ0ZXJzLkZpbGVDb252ZXJ0ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaW8uRmlsZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworCisvKioKKyAqIENyZWF0ZXMgYmFja3BvcnRlZCBmaXggcHJvcGVydGllcyBmaWxlLgorICoKKyAqIDxwPldyaXRlcyBCaXRTZXQgb2YgYmFja3BvcnRlZCBmaXggYWxpYXNlcyBmcm9tIGEgbGlzdCBvZiBCYWNrcG9ydGVkRml4IHByb3RvIGJpbmFyeSBmaWxlcyBhbmQKKyAqIHdyaXRlcyB0aGUgcHJvcGVydHkge0B2YWx1ZSBQUk9QRVJUWV9OQU1FfSB0byBhIGZpbGUuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBXcml0ZUJhY2twb3J0ZWRGaXhlc1Byb3BGaWxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OQU1FID0gInJvLmJ1aWxkLmJhY2twb3J0ZWRfZml4ZXMuYWxpYXNfYml0c2V0LmxvbmdfbGlzdCI7CisgICAgQFBhcmFtZXRlcihkZXNjcmlwdGlvbiA9ICJCYWNrcG9ydGVkRml4IHByb3RvIGJpbmFyeSBmaWxlcyIsCisgICAgICAgICAgICBjb252ZXJ0ZXIgPSBGaWxlQ29udmVydGVyLmNsYXNzLAorICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQorICAgIExpc3Q8RmlsZT4gZml4RmlsZXM7CisgICAgQFBhcmFtZXRlcihkZXNjcmlwdGlvbiA9ICJUaGUgZmlsZSB0byB3cml0ZSB0aGUgcHJvcGVydHkgdmFsdWUgdG8uIiwKKyAgICAgICAgICAgIG5hbWVzID0geyItLXByb3BlcnR5X2ZpbGUiLCAiLXAifSwKKyAgICAgICAgICAgIGNvbnZlcnRlciA9IEZpbGVDb252ZXJ0ZXIuY2xhc3MsCisgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCisgICAgRmlsZSBwcm9wZXJ0eUZpbGU7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcuLi4gYXJndikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFdyaXRlQmFja3BvcnRlZEZpeGVzUHJvcEZpbGUgbWFpbiA9IG5ldyBXcml0ZUJhY2twb3J0ZWRGaXhlc1Byb3BGaWxlKCk7CisgICAgICAgIEpDb21tYW5kZXIubmV3QnVpbGRlcigpLmFkZE9iamVjdChtYWluKS5idWlsZCgpLnBhcnNlKGFyZ3YpOworICAgICAgICBtYWluLnJ1bigpOworICAgIH0KKworICAgIFdyaXRlQmFja3BvcnRlZEZpeGVzUHJvcEZpbGUoKSB7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKHZhciBvdXQgPSBGaWxlcy5uZXdXcml0ZXIocHJvcGVydHlGaWxlLCBVVEZfOCkpIHsKKyAgICAgICAgICAgIHZhciBmaXhlcyA9IFBhcnNlci5wYXJzZUJhY2twb3J0ZWRGaXhGaWxlcyhmaXhGaWxlcyk7CisgICAgICAgICAgICB3cml0ZUZpeGVzQXNBbGlhc0JpdFNldChmaXhlcywgb3V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHdyaXRlRml4ZXNBc0FsaWFzQml0U2V0KEJhY2twb3J0ZWRGaXhlcyBmaXhlcywgV3JpdGVyIG91dCkgeworICAgICAgICBQcmludFdyaXRlciBwcmludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihvdXQpOworICAgICAgICBwcmludFdyaXRlci5wcmludGxuKCIjIFRoZSBmb2xsb3dpbmcgYmFja3BvcnRlZCBmaXhlcyBoYXZlIGJlZW4gYXBwbGllZCIpOworICAgICAgICBmb3IgKHZhciBmIDogZml4ZXMuZ2V0Rml4ZXNMaXN0KCkpIHsKKyAgICAgICAgICAgIHByaW50V3JpdGVyLnByaW50ZigiIyBodHRwczovL2lzc3VldHJhY2tlci5nb29nbGUuY29tL2lzc3Vlcy8lZCB3aXRoIGFsaWFzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgZi5nZXRLbm93bklzc3VlKCksIGYuZ2V0QWxpYXMoKSk7CisgICAgICAgICAgICBwcmludFdyaXRlci5wcmludGxuKCk7CisgICAgICAgIH0KKyAgICAgICAgdmFyIGJzQXJyYXkgPSBQYXJzZXIuZ2V0Qml0U2V0QXJyYXkoCisgICAgICAgICAgICAgICAgZml4ZXMuZ2V0Rml4ZXNMaXN0KCkuc3RyZWFtKCkubWFwVG9JbnQoQmFja3BvcnRlZEZpeDo6Z2V0QWxpYXMpLnRvQXJyYXkoKSk7CisgICAgICAgIFN0cmluZyBic1N0cmluZyA9IEFycmF5cy5zdHJlYW0oYnNBcnJheSkubWFwVG9PYmooTG9uZzo6dG9TdHJpbmcpLmNvbGxlY3QoCisgICAgICAgICAgICAgICAgQ29sbGVjdG9ycy5qb2luaW5nKCIsIikpOworICAgICAgICBwcmludFdyaXRlci5wcmludGYoIiVzPSVzIiwgUFJPUEVSVFlfTkFNRSwgYnNTdHJpbmcpOworICAgICAgICBwcmludFdyaXRlci5wcmludGxuKCk7CisgICAgICAgIGlmIChwcmludFdyaXRlci5jaGVja0Vycm9yKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGVyZSB3YXMgYW4gZXJyb3Igd3JpdGluZyB0byAiICsgb3V0LnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmFja3BvcnRlZF9maXhlcy9zcmMvamF2YS9jb20vYW5kcm9pZC9idWlsZC9iYWNrcG9ydGVkZml4ZXMvY29tbW9uL1BhcnNlci5qYXZhIGIvYmFja3BvcnRlZF9maXhlcy9zcmMvamF2YS9jb20vYW5kcm9pZC9idWlsZC9iYWNrcG9ydGVkZml4ZXMvY29tbW9uL1BhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxODBmZGMKLS0tIC9kZXYvbnVsbAorKysgYi9iYWNrcG9ydGVkX2ZpeGVzL3NyYy9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2JhY2twb3J0ZWRmaXhlcy9jb21tb24vUGFyc2VyLmphdmEKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZC5iYWNrcG9ydGVkZml4ZXMuY29tbW9uOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5iYWNrcG9ydGVkZml4ZXMuQmFja3BvcnRlZEZpeDsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5iYWNrcG9ydGVkZml4ZXMuQmFja3BvcnRlZEZpeGVzOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKKworLyoqIFN0YXRpYyB1dGlsaXRpZXMgZm9yIHdvcmtpbmcgd2l0aCB7QGxpbmsgQmFja3BvcnRlZEZpeGVzfS4gKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQYXJzZXIgeworCisgICAgLyoqIENyZWF0ZXMgbGlzdCBvZiBGaWxlSW5wdXRTdHJlYW1zIGZvciBhIGxpc3Qgb2YgZmlsZXMuICovCisgICAgcHVibGljIHN0YXRpYyBJbW11dGFibGVMaXN0PEZpbGVJbnB1dFN0cmVhbT4gZ2V0RmlsZUlucHV0U3RyZWFtcyhMaXN0PEZpbGU+IGZpeEZpbGVzKSB0aHJvd3MKKyAgICAgICAgICAgIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHZhciBzdHJlYW1zID0gSW1tdXRhYmxlTGlzdC48RmlsZUlucHV0U3RyZWFtPmJ1aWxkZXIoKTsKKyAgICAgICAgZm9yICh2YXIgZiA6IGZpeEZpbGVzKSB7CisgICAgICAgICAgICBzdHJlYW1zLmFkZChuZXcgRmlsZUlucHV0U3RyZWFtKGYpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RyZWFtcy5idWlsZCgpOworICAgIH0KKworICAgIC8qKiBDb252ZXJ0cyBhIGxpc3Qgb2YgYmFja3BvcnRlZCBmaXggYWxpYXNlcyBpbnRvIGEgbG9uZyBhcnJheSByZXByZXNlbnRpbmcgYSB7QGxpbmsgQml0U2V0fSAqLworICAgIHB1YmxpYyBzdGF0aWMgbG9uZ1tdIGdldEJpdFNldEFycmF5KGludFtdIGFsaWFzZXMpIHsKKyAgICAgICAgQml0U2V0IGJzID0gbmV3IEJpdFNldCgpOworICAgICAgICBmb3IgKGludCBhIDogYWxpYXNlcykgeworICAgICAgICAgICAgYnMuc2V0KGEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBicy50b0xvbmdBcnJheSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgQmFja3BvcnRlZEZpeGVzfSBmcm9tIGEgbGlzdCBvZiB7QGxpbmsgQmFja3BvcnRlZEZpeH0gYmluYXJ5IHByb3RvIHN0cmVhbXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCYWNrcG9ydGVkRml4ZXMgcGFyc2VCYWNrcG9ydGVkRml4RmlsZXMoTGlzdDxGaWxlPiBmaXhGaWxlcykKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZml4RmlsZXMuc3RyZWFtKCkubWFwKFBhcnNlcjo6dHVuZWxGaWxlSW5wdXRTdHJlYW0pCisgICAgICAgICAgICAgICAgICAgIC5tYXAoUGFyc2VyOjp0dW5uZWxQYXJzZSkKKyAgICAgICAgICAgICAgICAgICAgLnNvcnRlZChDb21wYXJhdG9yLmNvbXBhcmluZyhCYWNrcG9ydGVkRml4OjpnZXRLbm93bklzc3VlKSkKKyAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoZml4Q29sbGVjdG9yKCkpOworCisgICAgICAgIH0gY2F0Y2ggKFR1bm5lbEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBlLnJldGhyb3coRmlsZU5vdEZvdW5kRXhjZXB0aW9uLmNsYXNzLCBJT0V4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIENvbGxlY3RvcjxCYWNrcG9ydGVkRml4LCA/LCBCYWNrcG9ydGVkRml4ZXM+IGZpeENvbGxlY3RvcigpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3RvcnMuY29sbGVjdGluZ0FuZFRoZW4oQ29sbGVjdG9ycy50b0xpc3QoKSwgZml4TGlzdCAtPiB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gQmFja3BvcnRlZEZpeGVzLm5ld0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHJlc3VsdC5hZGRBbGxGaXhlcyhmaXhMaXN0KTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuYnVpbGQoKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgRmlsZUlucHV0U3RyZWFtIHR1bmVsRmlsZUlucHV0U3RyZWFtKEZpbGUgZmlsZSkgdGhyb3dzIFR1bm5lbEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUdW5uZWxFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBCYWNrcG9ydGVkRml4IHR1bm5lbFBhcnNlKElucHV0U3RyZWFtIHMpIHRocm93cyBUdW5uZWxFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIGZpeCA9IEJhY2twb3J0ZWRGaXgucGFyc2VGcm9tKHMpOworICAgICAgICAgICAgcy5jbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuIGZpeDsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFR1bm5lbEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFR1bm5lbEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICAgICAgICBUdW5uZWxFeGNlcHRpb24oRXhjZXB0aW9uIGNhdXNlKSB7CisgICAgICAgICAgICBzdXBlcigiSWYgeW91IHNlZSB0aGlzIFR1bm5lbEV4Y2VwdGlvbiBzb21ldGhpbmcgd2VudCB3cm9uZy4gIEl0IHNob3VsZCBhbHdheXMgYmUgcmV0aHJvd24gYXMgdGhlIGNhdXNlLiIsIGNhdXNlKTsKKyAgICAgICAgfQorCisgICAgICAgIDxYIGV4dGVuZHMgRXhjZXB0aW9uPiBSdW50aW1lRXhjZXB0aW9uIHJldGhyb3coQ2xhc3M8WD4gZXhjZXB0aW9uQ2xhenopIHRocm93cyBYIHsKKyAgICAgICAgICAgIGNoZWNrTm90TnVsbChleGNlcHRpb25DbGF6eik7CisgICAgICAgICAgICBUaHJvd2FibGVzLnRocm93SWZJbnN0YW5jZU9mKGdldENhdXNlKCksIGV4Y2VwdGlvbkNsYXp6KTsKKyAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgZ2V0Q2F1c2UoKSwKKyAgICAgICAgICAgICAgICAgICAgInJldGhyb3coJXMpIGRvZXNuJ3QgbWF0Y2ggdW5kZXJseWluZyBleGNlcHRpb24iLCBleGNlcHRpb25DbGF6eik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgPFgxIGV4dGVuZHMgRXhjZXB0aW9uLCBYMiBleHRlbmRzIEV4Y2VwdGlvbj4gUnVudGltZUV4Y2VwdGlvbiByZXRocm93KAorICAgICAgICAgICAgICAgIENsYXNzPFgxPiBleGNlcHRpb25DbGF6ejEsIENsYXNzPFgyPiBleGNlcHRpb25DbGF6ejIpIHRocm93cyBYMSwgWDIgeworICAgICAgICAgICAgY2hlY2tOb3ROdWxsKGV4Y2VwdGlvbkNsYXp6MSk7CisgICAgICAgICAgICBjaGVja05vdE51bGwoZXhjZXB0aW9uQ2xhenoyKTsKKyAgICAgICAgICAgIFRocm93YWJsZXMudGhyb3dJZkluc3RhbmNlT2YoZ2V0Q2F1c2UoKSwgZXhjZXB0aW9uQ2xhenoxKTsKKyAgICAgICAgICAgIFRocm93YWJsZXMudGhyb3dJZkluc3RhbmNlT2YoZ2V0Q2F1c2UoKSwgZXhjZXB0aW9uQ2xhenoyKTsKKyAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgZ2V0Q2F1c2UoKSwKKyAgICAgICAgICAgICAgICAgICAgInJldGhyb3coJXMsICVzKSBkb2Vzbid0IG1hdGNoIHVuZGVybHlpbmcgZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uQ2xhenoxLAorICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25DbGF6ejIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NDYXN0RXhjZXB0aW9uIGV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUaHJvd2FibGUgY2F1c2UsIFN0cmluZyBtZXNzYWdlLCBPYmplY3QuLi4gZm9ybWF0QXJncykgeworICAgICAgICAgICAgQ2xhc3NDYXN0RXhjZXB0aW9uIHJlc3VsdCA9IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oU3RyaW5nLmZvcm1hdChtZXNzYWdlLCBmb3JtYXRBcmdzKSk7CisgICAgICAgICAgICByZXN1bHQuaW5pdENhdXNlKGNhdXNlKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgUGFyc2VyKCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JhY2twb3J0ZWRfZml4ZXMvdGVzdHMvamF2YS9jb20vYW5kcm9pZC9idWlsZC9iYWNrcG9ydGVkZml4ZXMvQ29tYmluZUJhY2twb3J0ZWRGaXhlc1Rlc3QuamF2YSBiL2JhY2twb3J0ZWRfZml4ZXMvdGVzdHMvamF2YS9jb20vYW5kcm9pZC9idWlsZC9iYWNrcG9ydGVkZml4ZXMvQ29tYmluZUJhY2twb3J0ZWRGaXhlc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWQ1ZjFlCi0tLSAvZGV2L251bGwKKysrIGIvYmFja3BvcnRlZF9maXhlcy90ZXN0cy9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2JhY2twb3J0ZWRmaXhlcy9Db21iaW5lQmFja3BvcnRlZEZpeGVzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkLmJhY2twb3J0ZWRmaXhlczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKiogVGVzdHMgZm9yIHtAbGluayBDb21iaW5lQmFja3BvcnRlZEZpeGVzfS4gKi8KK3B1YmxpYyBjbGFzcyBDb21iaW5lQmFja3BvcnRlZEZpeGVzVGVzdCB7CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgd3JpdGVCYWNrcG9ydGVkRml4ZXNfZGVmYXVsdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIE5vdCBtdWNoIG9mIGEgdGVzdCwgYnV0IHRoZXJlIGlzIG5vdCBtdWNoIHRvIHRlc3QuCisgICAgICAgIEJhY2twb3J0ZWRGaXhlcyBmaXhlcyA9IEJhY2twb3J0ZWRGaXhlcy5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkRml4ZXMoQmFja3BvcnRlZEZpeC5uZXdCdWlsZGVyKCkuc2V0S25vd25Jc3N1ZSgxMjMpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIHZhciByZXN1bHQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIENvbWJpbmVCYWNrcG9ydGVkRml4ZXMud3JpdGVCYWNrcG9ydGVkRml4ZXMoZml4ZXMsIHJlc3VsdCk7CisgICAgICAgIFRydXRoLmFzc2VydFRoYXQoQmFja3BvcnRlZEZpeGVzLnBhcnNlRnJvbShyZXN1bHQudG9CeXRlQXJyYXkoKSkpCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhmaXhlcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmFja3BvcnRlZF9maXhlcy90ZXN0cy9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2JhY2twb3J0ZWRmaXhlcy9Xcml0ZUJhY2twb3J0ZWRGaXhlc1Byb3BGaWxlVGVzdC5qYXZhIGIvYmFja3BvcnRlZF9maXhlcy90ZXN0cy9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2JhY2twb3J0ZWRmaXhlcy9Xcml0ZUJhY2twb3J0ZWRGaXhlc1Byb3BGaWxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMDljMTUKLS0tIC9kZXYvbnVsbAorKysgYi9iYWNrcG9ydGVkX2ZpeGVzL3Rlc3RzL2phdmEvY29tL2FuZHJvaWQvYnVpbGQvYmFja3BvcnRlZGZpeGVzL1dyaXRlQmFja3BvcnRlZEZpeGVzUHJvcEZpbGVUZXN0LmphdmEKQEAgLTAsMCArMSw2NCBAQAorCisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuYnVpbGQuYmFja3BvcnRlZGZpeGVzOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGg7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CisKKy8qKiBUZXN0cyBmb3Ige0BsaW5rIFdyaXRlQmFja3BvcnRlZEZpeGVzUHJvcEZpbGV9LiAqLworcHVibGljIGNsYXNzIFdyaXRlQmFja3BvcnRlZEZpeGVzUHJvcEZpbGVUZXN0IHsKKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUZpeGVzQXNBbGlhc0JpdFNldF9kZWZhdWx0KCkgeworICAgICAgICBCYWNrcG9ydGVkRml4ZXMgZml4ZXMgPSBCYWNrcG9ydGVkRml4ZXMubmV3QnVpbGRlcigpLmJ1aWxkKCk7CisgICAgICAgIHZhciByZXN1bHQgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisKKyAgICAgICAgV3JpdGVCYWNrcG9ydGVkRml4ZXNQcm9wRmlsZS53cml0ZUZpeGVzQXNBbGlhc0JpdFNldChmaXhlcywgbmV3IFByaW50V3JpdGVyKHJlc3VsdCkpOworCisgICAgICAgIFRydXRoLmFzc2VydFRoYXQocmVzdWx0LnRvU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbygiIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIGZvbGxvd2luZyBiYWNrcG9ydGVkIGZpeGVzIGhhdmUgYmVlbiBhcHBsaWVkCisgICAgICAgICAgICAgICAgICAgICAgICByby5idWlsZC5iYWNrcG9ydGVkX2ZpeGVzLmFsaWFzX2JpdHNldC5sb25nX2xpc3Q9CisgICAgICAgICAgICAgICAgICAgICAgICAiIiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgd3JpdGVGaXhlc0FzQWxpYXNCaXRTZXRfc29tZSgpIHsKKyAgICAgICAgQmFja3BvcnRlZEZpeGVzIGZpeGVzID0gQmFja3BvcnRlZEZpeGVzLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5hZGRGaXhlcyhCYWNrcG9ydGVkRml4Lm5ld0J1aWxkZXIoKS5zZXRLbm93bklzc3VlKDEyMzRMKS5zZXRBbGlhcygxKSkKKyAgICAgICAgICAgICAgICAuYWRkRml4ZXMoQmFja3BvcnRlZEZpeC5uZXdCdWlsZGVyKCkuc2V0S25vd25Jc3N1ZSgzTCkuc2V0QWxpYXMoNjUpKQorICAgICAgICAgICAgICAgIC5hZGRGaXhlcyhCYWNrcG9ydGVkRml4Lm5ld0J1aWxkZXIoKS5zZXRLbm93bklzc3VlKDRMKS5zZXRBbGlhcyg2NykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIHZhciByZXN1bHQgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisKKyAgICAgICAgV3JpdGVCYWNrcG9ydGVkRml4ZXNQcm9wRmlsZS53cml0ZUZpeGVzQXNBbGlhc0JpdFNldChmaXhlcywgbmV3IFByaW50V3JpdGVyKHJlc3VsdCkpOworCisgICAgICAgIFRydXRoLmFzc2VydFRoYXQocmVzdWx0LnRvU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbygiIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIGZvbGxvd2luZyBiYWNrcG9ydGVkIGZpeGVzIGhhdmUgYmVlbiBhcHBsaWVkCisgICAgICAgICAgICAgICAgICAgICAgICAjIGh0dHBzOi8vaXNzdWV0cmFja2VyLmdvb2dsZS5jb20vaXNzdWVzLzEyMzQgd2l0aCBhbGlhcyAxCisgICAgICAgICAgICAgICAgICAgICAgICAjIGh0dHBzOi8vaXNzdWV0cmFja2VyLmdvb2dsZS5jb20vaXNzdWVzLzMgd2l0aCBhbGlhcyA2NQorICAgICAgICAgICAgICAgICAgICAgICAgIyBodHRwczovL2lzc3VldHJhY2tlci5nb29nbGUuY29tL2lzc3Vlcy80IHdpdGggYWxpYXMgNjcKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvLmJ1aWxkLmJhY2twb3J0ZWRfZml4ZXMuYWxpYXNfYml0c2V0LmxvbmdfbGlzdD0yLDEwCisgICAgICAgICAgICAgICAgICAgICAgICAiIiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JhY2twb3J0ZWRfZml4ZXMvdGVzdHMvamF2YS9jb20vYW5kcm9pZC9idWlsZC9iYWNrcG9ydGVkZml4ZXMvY29tbW9uL1BhcnNlclRlc3QuamF2YSBiL2JhY2twb3J0ZWRfZml4ZXMvdGVzdHMvamF2YS9jb20vYW5kcm9pZC9idWlsZC9iYWNrcG9ydGVkZml4ZXMvY29tbW9uL1BhcnNlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2EwYTQwCi0tLSAvZGV2L251bGwKKysrIGIvYmFja3BvcnRlZF9maXhlcy90ZXN0cy9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2JhY2twb3J0ZWRmaXhlcy9jb21tb24vUGFyc2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuYnVpbGQuYmFja3BvcnRlZGZpeGVzLmNvbW1vbjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5leHRlbnNpb25zLnByb3RvLlByb3RvVHJ1dGguYXNzZXJ0VGhhdDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmJhY2twb3J0ZWRmaXhlcy5CYWNrcG9ydGVkRml4OworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmJhY2twb3J0ZWRmaXhlcy5CYWNrcG9ydGVkRml4ZXM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVtcG9yYXJ5Rm9sZGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CisKKy8qKiBUZXN0cyBmb3Ige0BsaW5rIFBhcnNlcn0uKi8KK3B1YmxpYyBjbGFzcyBQYXJzZXJUZXN0IHsKKworICAgIEBSdWxlCisgICAgcHVibGljIFRlbXBvcmFyeUZvbGRlciBtVGVtcEZvbGRlciA9IG5ldyBUZW1wb3JhcnlGb2xkZXIoKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZ2V0RmlsZUlucHV0U3RyZWFtcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHZhciByZXN1bHRzID0gUGFyc2VyLmdldEZpbGVJbnB1dFN0cmVhbXMoCisgICAgICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5vZihGaWxlcy5jcmVhdGVUZW1wRmlsZSgidGVzdCIsIG51bGwpLnRvRmlsZSgpKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzdWx0cykuaXNOb3RFbXB0eSgpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBnZXRCaXRTZXRBcnJheV9lbXB0eSgpIHsKKyAgICAgICAgdmFyIHJlc3VsdHMgPSBQYXJzZXIuZ2V0Qml0U2V0QXJyYXkobmV3IGludFtde30pOworICAgICAgICBhc3NlcnRUaGF0KHJlc3VsdHMpLmlzRW1wdHkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdldEJpdFNldEFycmF5XzJfM182NCgpIHsKKyAgICAgICAgdmFyIHJlc3VsdHMgPSBQYXJzZXIuZ2V0Qml0U2V0QXJyYXkobmV3IGludFtdezIsMyw2NH0pOworICAgICAgICBhc3NlcnRUaGF0KHJlc3VsdHMpLmFzTGlzdCgpLmNvbnRhaW5zRXhhY3RseSgxMkwsMUwpLmluT3JkZXIoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcnNlQmFja3BvcnRlZEZpeEZpbGVzX2VtcHR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdmFyIHJlc3VsdCA9IFBhcnNlci5wYXJzZUJhY2twb3J0ZWRGaXhGaWxlcyhJbW11dGFibGVMaXN0Lm9mKCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3VsdCkuaXNFcXVhbFRvKEJhY2twb3J0ZWRGaXhlcy5nZXREZWZhdWx0SW5zdGFuY2UoKSk7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcnNlQmFja3BvcnRlZEZpeEZpbGVzX29uZUJsYW5rKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdmFyIHJlc3VsdCA9IFBhcnNlci5wYXJzZUJhY2twb3J0ZWRGaXhGaWxlcyhJbW11dGFibGVMaXN0Lm9mKG1UZW1wRm9sZGVyLm5ld0ZpbGUoKSkpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzdWx0KS5pc0VxdWFsVG8oCisgICAgICAgICAgICAgICAgQmFja3BvcnRlZEZpeGVzLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEZpeGVzKEJhY2twb3J0ZWRGaXguZ2V0RGVmYXVsdEluc3RhbmNlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZUJhY2twb3J0ZWRGaXhGaWxlc190d28oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCYWNrcG9ydGVkRml4IGtpMTIzID0gQmFja3BvcnRlZEZpeC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0S25vd25Jc3N1ZSgxMjMpCisgICAgICAgICAgICAgICAgLnNldEFsaWFzKDEpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIEJhY2twb3J0ZWRGaXgga2k0NTYgPSBCYWNrcG9ydGVkRml4Lm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRLbm93bklzc3VlKDQ1NikKKyAgICAgICAgICAgICAgICAuc2V0QWxpYXMoMikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgdmFyIHJlc3VsdCA9IFBhcnNlci5wYXJzZUJhY2twb3J0ZWRGaXhGaWxlcygKKyAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKHRlbXBGaWxlKGtpNDU2KSwgdGVtcEZpbGUoa2kxMjMpKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzdWx0KS5pc0VxdWFsVG8oCisgICAgICAgICAgICAgICAgQmFja3BvcnRlZEZpeGVzLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEZpeGVzKGtpMTIzKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEZpeGVzKGtpNDU2KQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHByaXZhdGUgRmlsZSB0ZW1wRmlsZShCYWNrcG9ydGVkRml4IGZpeCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBmID0gbVRlbXBGb2xkZXIubmV3RmlsZSgpOworICAgICAgICB0cnkgKEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZikpIHsKKyAgICAgICAgICAgIGZpeC53cml0ZVRvKG91dCk7CisgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NpL0FuZHJvaWQuYnAgYi9jaS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMjhiZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jaS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTM2IEBACisvLyBDb3B5cmlnaHQgMjAyNCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCisgICAgZGVmYXVsdF90ZWFtOiAidHJlbmR5X3RlYW1fYWR0ZSIsCit9CisKK3B5dGhvbl90ZXN0X2hvc3QgeworICAgIG5hbWU6ICJidWlsZF90ZXN0X3N1aXRlc190ZXN0IiwKKyAgICBtYWluOiAiYnVpbGRfdGVzdF9zdWl0ZXNfdGVzdC5weSIsCisgICAgcGtnX3BhdGg6ICJ0ZXN0ZGF0YSIsCisgICAgc3JjczogWworICAgICAgICAiYnVpbGRfdGVzdF9zdWl0ZXNfdGVzdC5weSIsCisgICAgXSwKKyAgICBsaWJzOiBbCisgICAgICAgICJidWlsZF90ZXN0X3N1aXRlc19saWIiLAorICAgICAgICAicHlmYWtlZnMiLAorICAgICAgICAiY2lfdGVzdF9saWIiLAorICAgIF0sCisgICAgdGVzdF9vcHRpb25zOiB7CisgICAgICAgIHVuaXRfdGVzdDogdHJ1ZSwKKyAgICB9LAorICAgIGRhdGE6IFsKKyAgICAgICAgIjpweTMtY21kIiwKKyAgICBdLAorICAgIHZlcnNpb246IHsKKyAgICAgICAgcHkzOiB7CisgICAgICAgICAgICBlbWJlZGRlZF9sYXVuY2hlcjogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCisvLyBUaGlzIHRlc3QgaXMgb25seSBpbnRlbmRlZCB0byBiZSBydW4gbG9jYWxseSBzaW5jZSBpdCdzIHNsb3csIG5vdCBoZXJtZXRpYywKKy8vIGFuZCByZXF1aXJlcyBhIGxvdCBvZiBzeXN0ZW0gc3RhdGUuIEl0IGlzIHRoZXJlZm9yZSBub3QgbWFya2VkIGFzIGB1bml0X3Rlc3RgCisvLyBhbmQgaXMgbm90IHBhcnQgb2YgYW55IHRlc3Qgc3VpdGUuIE5vdGUgdGhhdCB3ZSBhbHNvIGRvbid0IHdhbnQgdG8gcnVuIHRoaXMKKy8vIHRlc3Qgd2l0aCBCYXplbCBzaW5jZSB0aGF0IHdvdWxkIHJlcXVpcmUgZGlzYWJsaW5nIHNhbmRib3hpbmcgYW5kIGV4cGxpY2l0bHkKKy8vIHBhc3NpbmcgaW4gYWxsIHRoZSBlbnYgdmFycyB3ZSBkZXBlbmQgb24gdmlhIHRoZSBjb21tYW5kLWxpbmUuIFRoZSB0ZXN0CisvLyB0YXJnZXQgY291bGQgYmUgY29uZmlndXJlZCB0byBkbyBzbyBidXQgaXQncyBub3Qgd29ydGggZG9pbmcgc2VlaW5nIHRoYXQKKy8vIHdlJ3JlIG1vdmluZyBhd2F5IGZyb20gQmF6ZWwuCitweXRob25fdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiYnVpbGRfdGVzdF9zdWl0ZXNfbG9jYWxfdGVzdCIsCisgICAgbWFpbjogImJ1aWxkX3Rlc3Rfc3VpdGVzX2xvY2FsX3Rlc3QucHkiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImJ1aWxkX3Rlc3Rfc3VpdGVzX2xvY2FsX3Rlc3QucHkiLAorICAgIF0sCisgICAgbGliczogWworICAgICAgICAiYnVpbGRfdGVzdF9zdWl0ZXNfbGliIiwKKyAgICAgICAgInB5ZmFrZWZzIiwKKyAgICAgICAgImNpX3Rlc3RfbGliIiwKKyAgICBdLAorICAgIHRlc3RfY29uZmlnX3RlbXBsYXRlOiAiQW5kcm9pZFRlc3QueG1sLnRlbXBsYXRlIiwKKyAgICB0ZXN0X29wdGlvbnM6IHsKKyAgICAgICAgdW5pdF90ZXN0OiBmYWxzZSwKKyAgICB9LAorICAgIHZlcnNpb246IHsKKyAgICAgICAgcHkzOiB7CisgICAgICAgICAgICBlbWJlZGRlZF9sYXVuY2hlcjogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCitweXRob25fdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAib3B0aW1pemVkX3RhcmdldHNfdGVzdCIsCisgICAgbWFpbjogIm9wdGltaXplZF90YXJnZXRzX3Rlc3QucHkiLAorICAgIHBrZ19wYXRoOiAidGVzdGRhdGEiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIm9wdGltaXplZF90YXJnZXRzX3Rlc3QucHkiLAorICAgIF0sCisgICAgbGliczogWworICAgICAgICAiYnVpbGRfdGVzdF9zdWl0ZXNfbGliIiwKKyAgICAgICAgInB5ZmFrZWZzIiwKKyAgICBdLAorICAgIHRlc3Rfb3B0aW9uczogeworICAgICAgICB1bml0X3Rlc3Q6IHRydWUsCisgICAgfSwKKyAgICBkYXRhOiBbCisgICAgICAgICI6cHkzLWNtZCIsCisgICAgXSwKKyAgICB2ZXJzaW9uOiB7CisgICAgICAgIHB5MzogeworICAgICAgICAgICAgZW1iZWRkZWRfbGF1bmNoZXI6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKK30KKworcHl0aG9uX2JpbmFyeV9ob3N0IHsKKyAgICBuYW1lOiAiYnVpbGRfdGVzdF9zdWl0ZXMiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImJ1aWxkX3Rlc3Rfc3VpdGVzLnB5IiwKKyAgICAgICAgIm9wdGltaXplZF90YXJnZXRzLnB5IiwKKyAgICAgICAgInRlc3RfbWFwcGluZ19tb2R1bGVfcmV0cmlldmVyLnB5IiwKKyAgICAgICAgImJ1aWxkX2NvbnRleHQucHkiLAorICAgICAgICAidGVzdF9kaXNjb3ZlcnlfYWdlbnQucHkiLAorICAgICAgICAibWV0cmljc19hZ2VudC5weSIsCisgICAgICAgICJidWlsZGJvdC5weSIsCisgICAgXSwKKyAgICBtYWluOiAiYnVpbGRfdGVzdF9zdWl0ZXMucHkiLAorICAgIGxpYnM6IFsKKyAgICAgICAgInNvb25nLW1ldHJpY3MtcHJvdG8tcHkiLAorICAgIF0sCit9CisKK3B5dGhvbl9saWJyYXJ5X2hvc3QgeworICAgIG5hbWU6ICJidWlsZF90ZXN0X3N1aXRlc19saWIiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImJ1aWxkX3Rlc3Rfc3VpdGVzLnB5IiwKKyAgICAgICAgIm9wdGltaXplZF90YXJnZXRzLnB5IiwKKyAgICAgICAgInRlc3RfbWFwcGluZ19tb2R1bGVfcmV0cmlldmVyLnB5IiwKKyAgICAgICAgImJ1aWxkX2NvbnRleHQucHkiLAorICAgICAgICAidGVzdF9kaXNjb3ZlcnlfYWdlbnQucHkiLAorICAgICAgICAibWV0cmljc19hZ2VudC5weSIsCisgICAgICAgICJidWlsZGJvdC5weSIsCisgICAgXSwKKyAgICBsaWJzOiBbCisgICAgICAgICJzb29uZy1tZXRyaWNzLXByb3RvLXB5IiwKKyAgICBdLAorfQorCitweXRob25fbGlicmFyeV9ob3N0IHsKKyAgICBuYW1lOiAiY2lfdGVzdF9saWIiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImNpX3Rlc3RfbGliLnB5IiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvY2kvQW5kcm9pZFRlc3QueG1sLnRlbXBsYXRlIGIvY2kvQW5kcm9pZFRlc3QueG1sLnRlbXBsYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYTM0MzUKLS0tIC9kZXYvbnVsbAorKysgYi9jaS9BbmRyb2lkVGVzdC54bWwudGVtcGxhdGUKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uPgorICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUucHl0aG9uLlB5dGhvbkJpbmFyeUhvc3RUZXN0Ij4KKyAgICA8b3B0aW9uIG5hbWU9InBhci1maWxlLW5hbWUiIHZhbHVlPSJ7TU9EVUxFfSIvPgorICAgIDxvcHRpb24gbmFtZT0idXNlLXRlc3Qtb3V0cHV0LWZpbGUiIHZhbHVlPSJmYWxzZSIvPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC10aW1lb3V0IiB2YWx1ZT0iNW0iLz4KKyAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvY2kvYnVpbGRfY29udGV4dC5weSBiL2NpL2J1aWxkX2NvbnRleHQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdhMWRlZgotLS0gL2Rldi9udWxsCisrKyBiL2NpL2J1aWxkX2NvbnRleHQucHkKQEAgLTAsMCArMSw2NyBAQAorIyBDb3B5cmlnaHQgMjAyNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisiIiJDb250YWluZXIgY2xhc3MgZm9yIGJ1aWxkIGNvbnRleHQgd2l0aCB1dGlsaXR5IGZ1bmN0aW9ucy4iIiIKKworaW1wb3J0IHJlCisKKworY2xhc3MgQnVpbGRDb250ZXh0OgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBidWlsZF9jb250ZXh0X2RpY3Q6IGRpY3Rbc3RyLCBhbnldKToKKyAgICBzZWxmLmVuYWJsZWRfYnVpbGRfZmVhdHVyZXMgPSBzZXQoKQorICAgIGZvciBvcHQgaW4gYnVpbGRfY29udGV4dF9kaWN0LmdldCgnZW5hYmxlZEJ1aWxkRmVhdHVyZXMnLCBbXSk6CisgICAgICBzZWxmLmVuYWJsZWRfYnVpbGRfZmVhdHVyZXMuYWRkKG9wdC5nZXQoJ25hbWUnKSkKKyAgICBzZWxmLnRlc3RfaW5mb3MgPSBzZXQoKQorICAgIGZvciB0ZXN0X2luZm9fZGljdCBpbiBidWlsZF9jb250ZXh0X2RpY3QuZ2V0KCd0ZXN0Q29udGV4dCcsIGRpY3QoKSkuZ2V0KAorICAgICAgICAndGVzdEluZm9zJywgW10KKyAgICApOgorICAgICAgc2VsZi50ZXN0X2luZm9zLmFkZChzZWxmLlRlc3RJbmZvKHRlc3RfaW5mb19kaWN0KSkKKworICBkZWYgYnVpbGRfdGFyZ2V0X3VzZWQoc2VsZiwgdGFyZ2V0OiBzdHIpIC0+IGJvb2w6CisgICAgcmV0dXJuIGFueSh0ZXN0LmJ1aWxkX3RhcmdldF91c2VkKHRhcmdldCkgZm9yIHRlc3QgaW4gc2VsZi50ZXN0X2luZm9zKQorCisgIGNsYXNzIFRlc3RJbmZvOgorCisgICAgX0RPV05MT0FEX09QVFMgPSB7CisgICAgICAgICd0ZXN0LWNvbmZpZy1vbmx5LXppcCcsCisgICAgICAgICd0ZXN0LXppcC1maWxlLWZpbHRlcicsCisgICAgICAgICdleHRyYS1ob3N0LXNoYXJlZC1saWItemlwJywKKyAgICAgICAgJ3NhbmRib3gtdGVzdHMtemlwcycsCisgICAgICAgICdhZGRpdGlvbmFsLWZpbGVzLWZpbHRlcicsCisgICAgICAgICdjdHMtcGFja2FnZS1uYW1lJywKKyAgICB9CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdF9pbmZvX2RpY3Q6IGRpY3Rbc3RyLCBhbnldKToKKyAgICAgIHNlbGYuaXNfdGVzdF9tYXBwaW5nID0gRmFsc2UKKyAgICAgIHNlbGYudGVzdF9tYXBwaW5nX3Rlc3RfZ3JvdXBzID0gc2V0KCkKKyAgICAgIHNlbGYuZmlsZV9kb3dubG9hZF9vcHRpb25zID0gc2V0KCkKKyAgICAgIHNlbGYubmFtZSA9IHRlc3RfaW5mb19kaWN0LmdldCgnbmFtZScpCisgICAgICBzZWxmLmNvbW1hbmQgPSB0ZXN0X2luZm9fZGljdC5nZXQoJ2NvbW1hbmQnKQorICAgICAgc2VsZi5leHRyYV9vcHRpb25zID0gdGVzdF9pbmZvX2RpY3QuZ2V0KCdleHRyYU9wdGlvbnMnKQorICAgICAgZm9yIG9wdCBpbiB0ZXN0X2luZm9fZGljdC5nZXQoJ2V4dHJhT3B0aW9ucycsIFtdKToKKyAgICAgICAga2V5ID0gb3B0LmdldCgna2V5JykKKyAgICAgICAgaWYga2V5ID09ICd0ZXN0LW1hcHBpbmctdGVzdC1ncm91cCc6CisgICAgICAgICAgc2VsZi5pc190ZXN0X21hcHBpbmcgPSBUcnVlCisgICAgICAgICAgc2VsZi50ZXN0X21hcHBpbmdfdGVzdF9ncm91cHMudXBkYXRlKG9wdC5nZXQoJ3ZhbHVlcycsIHNldCgpKSkKKworICAgICAgICBpZiBrZXkgaW4gc2VsZi5fRE9XTkxPQURfT1BUUzoKKyAgICAgICAgICBzZWxmLmZpbGVfZG93bmxvYWRfb3B0aW9ucy51cGRhdGUob3B0LmdldCgndmFsdWVzJywgc2V0KCkpKQorCisgICAgZGVmIGJ1aWxkX3RhcmdldF91c2VkKHNlbGYsIHRhcmdldDogc3RyKSAtPiBib29sOgorICAgICAgIyBGb3IgYWxsIG9mIGEgdGFyZ2V0cycgb3V0cHV0cywgY2hlY2sgaWYgYW55IG9mIHRoZSByZWdleGVzIHVzZWQgYnkgdGVzdHMKKyAgICAgICMgdG8gZG93bmxvYWQgYXJ0aWZhY3RzIHdvdWxkIG1hdGNoIGl0LiBJZiBhbnkgb2YgdGhlbSBkbyB0aGVuIHRoaXMgdGFyZ2V0CisgICAgICAjIGlzIG5lY2Vzc2FyeS4KKyAgICAgIHJlZ2V4ID0gcidcYiglcylcYicgJSByZS5lc2NhcGUodGFyZ2V0KQorICAgICAgcmV0dXJuIGFueShyZS5zZWFyY2gocmVnZXgsIG9wdCkgZm9yIG9wdCBpbiBzZWxmLmZpbGVfZG93bmxvYWRfb3B0aW9ucykKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3Nka194ODZfNjQubWsgYi9jaS9idWlsZF9kZXZpY2VfYW5kX3Rlc3RzCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKc2ltaWxhcml0eSBpbmRleCA2MiUKY29weSBmcm9tIHRhcmdldC9wcm9kdWN0L3Nka194ODZfNjQubWsKY29weSB0byBjaS9idWlsZF9kZXZpY2VfYW5kX3Rlc3RzCmluZGV4IDVmNjU1M2UuLjYzZDNjZTMKLS0tIGEvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3g4Nl82NC5taworKysgYi9jaS9idWlsZF9kZXZpY2VfYW5kX3Rlc3RzCkBAIC0xLDIxICsxLDE5IEBACisjIS91c3IvYmluL2VudiBiYXNoCiAjCi0jIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjIENvcHlyaWdodCAyMDI0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCitzZXQgLWV1byBwaXBlZmFpbAogCi0jIERvbid0IG1vZGlmeSB0aGlzIGZpbGUgLSBJdCdzIGp1c3QgYW4gYWxpYXMhCi0KLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3Qvc2RrX3Bob25lX3g4Nl82NC5taykKLQotUFJPRFVDVF9OQU1FIDo9IHNka194ODZfNjQKK2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgYnVpbGRfdGVzdF9zdWl0ZXMKKyQoYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLWR1bXB2YXItbW9kZSBIT1NUX09VVCkvYmluL2J1aWxkX3Rlc3Rfc3VpdGVzIC0tZGV2aWNlLWJ1aWxkICRACmRpZmYgLS1naXQgYS9jaS9idWlsZF9tZXRhZGF0YSBiL2NpL2J1aWxkX21ldGFkYXRhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNlOTIxOGYKLS0tIC9kZXYvbnVsbAorKysgYi9jaS9idWlsZF9tZXRhZGF0YQpAQCAtMCwwICsxLDQ0IEBACisjL2Jpbi9iYXNoCisKKyMgQ29weXJpZ2h0IDIwMjQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworc2V0IC14CisKK3NvdXJjZSBidWlsZC9tYWtlL3NoZWxsX3V0aWxzLnNoCisKK2V4cG9ydCBUQVJHRVRfUFJPRFVDVD1hb3NwX2FybTY0CitleHBvcnQgVEFSR0VUX1JFTEVBU0U9dHJ1bmtfc3RhZ2luZworZXhwb3J0IFRBUkdFVF9CVUlMRF9WQVJJQU5UPWVuZworCitpbXBvcnRfYnVpbGRfdmFycyBcCisgICAgICAgIE9VVF9ESVIgXAorICAgICAgICBESVNUX0RJUiBcCisgICAgICAgIEhPU1RfT1VUX0VYRUNVVEFCTEVTIFwKKyAgICB8fCBleGl0ICQ/CisKK1RBUkdFVFM9KAorICAgIGFsbF90ZWFtcworICAgIHNvdXJjZV90cmVlX3NpemUKKyAgICByZWxlYXNlX2NvbmZpZ19tZXRhZGF0YQorKQorCisjIEJ1aWxkIG1vZHVsZXMKK2J1aWxkL3Nvb25nL2Jpbi9tIGRpc3QgJHtUQVJHRVRTW0BdfSB8fCBleGl0ICQ/CisKKyMgTGlzdCBhbGwgc291cmNlIGZpbGVzIGluIHRoZSB0cmVlCisoIFwKKyAgICAkSE9TVF9PVVRfRVhFQ1VUQUJMRVMvc291cmNlX3RyZWVfc2l6ZSAtbyAkRElTVF9ESVIvYWxsX3NvdXJjZV90cmVlX2ZpbGVzLnBiIFwKKyAgICAgICAgJiYgZ3ppcCAtZm4gJERJU1RfRElSL2FsbF9zb3VyY2VfdHJlZV9maWxlcy5wYiBcCispIHx8IGV4aXQgJD8KZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3Nka194ODZfNjQubWsgYi9jaS9idWlsZF90ZXN0X3N1aXRlcwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CnNpbWlsYXJpdHkgaW5kZXggNjQlCmNvcHkgZnJvbSB0YXJnZXQvcHJvZHVjdC9zZGtfeDg2XzY0Lm1rCmNvcHkgdG8gY2kvYnVpbGRfdGVzdF9zdWl0ZXMKaW5kZXggNWY2NTUzZS4uNzQ0NzBhOAotLS0gYS90YXJnZXQvcHJvZHVjdC9zZGtfeDg2XzY0Lm1rCisrKyBiL2NpL2J1aWxkX3Rlc3Rfc3VpdGVzCkBAIC0xLDIxICsxLDE5IEBACisjIS91c3IvYmluL2VudiBiYXNoCiAjCi0jIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjIENvcHlyaWdodCAyMDI0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCitzZXQgLWV1byBwaXBlZmFpbAogCi0jIERvbid0IG1vZGlmeSB0aGlzIGZpbGUgLSBJdCdzIGp1c3QgYW4gYWxpYXMhCi0KLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3Qvc2RrX3Bob25lX3g4Nl82NC5taykKLQotUFJPRFVDVF9OQU1FIDo9IHNka194ODZfNjQKK2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgYnVpbGRfdGVzdF9zdWl0ZXMKKyQoYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLWR1bXB2YXItbW9kZSBIT1NUX09VVCkvYmluL2J1aWxkX3Rlc3Rfc3VpdGVzICRACmRpZmYgLS1naXQgYS9jaS9idWlsZF90ZXN0X3N1aXRlcy5weSBiL2NpL2J1aWxkX3Rlc3Rfc3VpdGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkY2JhNWEKLS0tIC9kZXYvbnVsbAorKysgYi9jaS9idWlsZF90ZXN0X3N1aXRlcy5weQpAQCAtMCwwICsxLDMzOCBAQAorIyBDb3B5cmlnaHQgMjAyNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisiIiJCdWlsZCBzY3JpcHQgZm9yIHRoZSBDSSBgdGVzdF9zdWl0ZXNgIHRhcmdldC4iIiIKKworaW1wb3J0IGFyZ3BhcnNlCitmcm9tIGRhdGFjbGFzc2VzIGltcG9ydCBkYXRhY2xhc3MKK2ltcG9ydCBqc29uCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCitpbXBvcnQgcGF0aGxpYgoraW1wb3J0IHJlCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworZnJvbSB0eXBpbmcgaW1wb3J0IENhbGxhYmxlCitmcm9tIGJ1aWxkX2NvbnRleHQgaW1wb3J0IEJ1aWxkQ29udGV4dAoraW1wb3J0IG9wdGltaXplZF90YXJnZXRzCitpbXBvcnQgbWV0cmljc19hZ2VudAoraW1wb3J0IHRlc3RfZGlzY292ZXJ5X2FnZW50CisKKworUkVRVUlSRURfRU5WX1ZBUlMgPSBmcm96ZW5zZXQoWydUQVJHRVRfUFJPRFVDVCcsICdUQVJHRVRfUkVMRUFTRScsICdUT1AnLCAnRElTVF9ESVInXSkKK1NPT05HX1VJX0VYRV9SRUxfUEFUSCA9ICdidWlsZC9zb29uZy9zb29uZ191aS5iYXNoJworTE9HX1BBVEggPSAnbG9ncy9idWlsZF90ZXN0X3N1aXRlcy5sb2cnCisjIEN1cnJlbnRseSwgdGhpcyBwcmV2ZW50cyB0aGUgcmVtb3ZhbCBvZiB0aG9zZSB0YWdzIHdoZW4gdGhleSBleGlzdC4gSW4gdGhlIGZ1dHVyZSB3ZSBsaWtlbHkKKyMgd2FudCB0aGUgc2NyaXB0IHRvIHN1cHBseSAnZGlzdCBkaXJlY3RseQorUkVRVUlSRURfQlVJTERfVEFSR0VUUyA9IGZyb3plbnNldChbJ2Rpc3QnLCAnZHJvaWQnLCAnY2hlY2tidWlsZCddKQorCisKK2NsYXNzIEVycm9yKEV4Y2VwdGlvbik6CisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpOgorICAgIHN1cGVyKCkuX19pbml0X18obWVzc2FnZSkKKworCitjbGFzcyBCdWlsZEZhaWx1cmVFcnJvcihFcnJvcik6CisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHJldHVybl9jb2RlKToKKyAgICBzdXBlcigpLl9faW5pdF9fKGYnQnVpbGQgY29tbWFuZCBmYWlsZWQgd2l0aCByZXR1cm4gY29kZTogZntyZXR1cm5fY29kZX0nKQorICAgIHNlbGYucmV0dXJuX2NvZGUgPSByZXR1cm5fY29kZQorCisKK2NsYXNzIEJ1aWxkUGxhbm5lcjoKKyAgIiIiQ2xhc3MgaW4gY2hhcmdlIG9mIGRldGVybWluaW5nIGhvdyB0byBvcHRpbWl6ZSBidWlsZCB0YXJnZXRzLgorCisgIEdpdmVuIHRoZSBidWlsZCBjb250ZXh0IGFuZCB0YXJnZXRzIHRvIGJ1aWxkIGl0IHdpbGwgZGV0ZXJtaW5lIGEgZmluYWwgbGlzdCBvZgorICB0YXJnZXRzIHRvIGJ1aWxkIGFsb25nIHdpdGggZ2V0dGluZyBhIHNldCBvZiBwYWNrYWdpbmcgZnVuY3Rpb25zIHRvIHBhY2thZ2UgdXAKKyAgYW55IG91dHB1dCB6aXAgZmlsZXMgbmVlZGVkIGJ5IHRoZSBidWlsZC4KKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKAorICAgICAgc2VsZiwKKyAgICAgIGJ1aWxkX2NvbnRleHQ6IEJ1aWxkQ29udGV4dCwKKyAgICAgIGFyZ3M6IGFyZ3BhcnNlLk5hbWVzcGFjZSwKKyAgICAgIHRhcmdldF9vcHRpbWl6YXRpb25zOiBkaWN0W3N0ciwgb3B0aW1pemVkX3RhcmdldHMuT3B0aW1pemVkQnVpbGRUYXJnZXRdLAorICApOgorICAgIHNlbGYuYnVpbGRfY29udGV4dCA9IGJ1aWxkX2NvbnRleHQKKyAgICBzZWxmLmFyZ3MgPSBhcmdzCisgICAgc2VsZi50YXJnZXRfb3B0aW1pemF0aW9ucyA9IHRhcmdldF9vcHRpbWl6YXRpb25zCisKKyAgZGVmIGNyZWF0ZV9idWlsZF9wbGFuKHNlbGYpOgorCisgICAgaWYgJ29wdGltaXplZF9idWlsZCcgbm90IGluIHNlbGYuYnVpbGRfY29udGV4dC5lbmFibGVkX2J1aWxkX2ZlYXR1cmVzOgorICAgICAgcmV0dXJuIEJ1aWxkUGxhbihzZXQoc2VsZi5hcmdzLmV4dHJhX3RhcmdldHMpLCBzZXQoKSkKKworICAgIGlmIG5vdCBzZWxmLmJ1aWxkX2NvbnRleHQudGVzdF9pbmZvczoKKyAgICAgIGxvZ2dpbmcud2FybmluZygnQnVpbGQgY29udGV4dCBoYXMgbm8gdGVzdCBpbmZvcywgc2tpcHBpbmcgb3B0aW1pemF0aW9ucy4nKQorICAgICAgZm9yIHRhcmdldCBpbiBzZWxmLmFyZ3MuZXh0cmFfdGFyZ2V0czoKKyAgICAgICAgZ2V0X21ldHJpY3NfYWdlbnQoKS5yZXBvcnRfdW5vcHRpbWl6ZWRfdGFyZ2V0KHRhcmdldCwgJ0JVSUxEX0NPTlRFWFQgaGFzIG5vIHRlc3QgaW5mb3MuJykKKyAgICAgIHJldHVybiBCdWlsZFBsYW4oc2V0KHNlbGYuYXJncy5leHRyYV90YXJnZXRzKSwgc2V0KCkpCisKKyAgICBidWlsZF90YXJnZXRzID0gc2V0KCkKKyAgICBwYWNrYWdpbmdfY29tbWFuZHNfZ2V0dGVycyA9IFtdCisgICAgIyBJbiBvcmRlciB0byByb2xsIG9wdGltaXphdGlvbnMgb3V0IGRpZmZlcmVudGx5IGJldHdlZW4gdGVzdCBzdWl0ZXMgYW5kCisgICAgIyBkZXZpY2UgYnVpbGRzLCB3ZSBoYXZlIHNlcGFyYXRlIGZsYWdzLgorICAgIGVuYWJsZV9kaXNjb3ZlcnkgPSAoJ3Rlc3Rfc3VpdGVzX3ppcF90ZXN0X2Rpc2NvdmVyeScKKyAgICAgICAgaW4gc2VsZi5idWlsZF9jb250ZXh0LmVuYWJsZWRfYnVpbGRfZmVhdHVyZXMKKyAgICAgICAgYW5kIG5vdCBzZWxmLmFyZ3MuZGV2aWNlX2J1aWxkCisgICAgKSBvciAoCisgICAgICAgICdkZXZpY2VfemlwX3Rlc3RfZGlzY292ZXJ5JworICAgICAgICBpbiBzZWxmLmJ1aWxkX2NvbnRleHQuZW5hYmxlZF9idWlsZF9mZWF0dXJlcworICAgICAgICBhbmQgc2VsZi5hcmdzLmRldmljZV9idWlsZAorICAgICkKKyAgICBsb2dnaW5nLmluZm8oZidEaXNjb3ZlcnkgbW9kZSBpcyBlbmFibGVkPSB7ZW5hYmxlX2Rpc2NvdmVyeX0nKQorICAgIHByZWxpbWluYXJ5X2J1aWxkX3RhcmdldHMgPSBzZWxmLl9jb2xsZWN0X3ByZWxpbWluYXJ5X2J1aWxkX3RhcmdldHMoZW5hYmxlX2Rpc2NvdmVyeSkKKworICAgIGZvciB0YXJnZXQgaW4gcHJlbGltaW5hcnlfYnVpbGRfdGFyZ2V0czoKKyAgICAgIHRhcmdldF9vcHRpbWl6ZXJfZ2V0dGVyID0gc2VsZi50YXJnZXRfb3B0aW1pemF0aW9ucy5nZXQodGFyZ2V0LCBOb25lKQorICAgICAgaWYgbm90IHRhcmdldF9vcHRpbWl6ZXJfZ2V0dGVyOgorICAgICAgICBidWlsZF90YXJnZXRzLmFkZCh0YXJnZXQpCisgICAgICAgIGNvbnRpbnVlCisKKyAgICAgIHRhcmdldF9vcHRpbWl6ZXIgPSB0YXJnZXRfb3B0aW1pemVyX2dldHRlcigKKyAgICAgICAgICB0YXJnZXQsIHNlbGYuYnVpbGRfY29udGV4dCwgc2VsZi5hcmdzCisgICAgICApCisgICAgICBidWlsZF90YXJnZXRzLnVwZGF0ZSh0YXJnZXRfb3B0aW1pemVyLmdldF9idWlsZF90YXJnZXRzKCkpCisgICAgICBwYWNrYWdpbmdfY29tbWFuZHNfZ2V0dGVycy5hcHBlbmQoCisgICAgICAgICAgdGFyZ2V0X29wdGltaXplci5nZXRfcGFja2FnZV9vdXRwdXRzX2NvbW1hbmRzCisgICAgICApCisKKyAgICByZXR1cm4gQnVpbGRQbGFuKGJ1aWxkX3RhcmdldHMsIHBhY2thZ2luZ19jb21tYW5kc19nZXR0ZXJzKQorCisgIGRlZiBfY29sbGVjdF9wcmVsaW1pbmFyeV9idWlsZF90YXJnZXRzKHNlbGYsIGVuYWJsZV9kaXNjb3Zlcnk6IGJvb2wpOgorICAgIGJ1aWxkX3RhcmdldHMgPSBzZXQoKQorICAgIHRyeToKKyAgICAgIHRlc3RfZGlzY292ZXJ5X3ppcF9yZWdleGVzID0gc2VsZi5fZ2V0X3Rlc3RfZGlzY292ZXJ5X3ppcF9yZWdleGVzKCkKKyAgICAgIGxvZ2dpbmcuaW5mbyhmJ0Rpc2NvdmVyZWQgdGVzdCBkaXNjb3ZlcnkgcmVnZXhlczoge3Rlc3RfZGlzY292ZXJ5X3ppcF9yZWdleGVzfScpCisgICAgZXhjZXB0IHRlc3RfZGlzY292ZXJ5X2FnZW50LlRlc3REaXNjb3ZlcnlFcnJvciBhcyBlOgorICAgICAgb3B0aW1pemF0aW9uX3JhdGlvbmFsZSA9IGUubWVzc2FnZQorICAgICAgbG9nZ2luZy53YXJuaW5nKGYnVW5hYmxlIHRvIHBlcmZvcm0gdGVzdCBkaXNjb3Zlcnk6IHtvcHRpbWl6YXRpb25fcmF0aW9uYWxlfScpCisKKyAgICAgIGZvciB0YXJnZXQgaW4gc2VsZi5hcmdzLmV4dHJhX3RhcmdldHM6CisgICAgICAgIGdldF9tZXRyaWNzX2FnZW50KCkucmVwb3J0X3Vub3B0aW1pemVkX3RhcmdldCh0YXJnZXQsIG9wdGltaXphdGlvbl9yYXRpb25hbGUpCisgICAgICByZXR1cm4gc2VsZi5fbGVnYWN5X2NvbGxlY3RfcHJlbGltaW5hcnlfYnVpbGRfdGFyZ2V0cygpCisKKyAgICBmb3IgdGFyZ2V0IGluIHNlbGYuYXJncy5leHRyYV90YXJnZXRzOgorICAgICAgaWYgdGFyZ2V0IGluIFJFUVVJUkVEX0JVSUxEX1RBUkdFVFM6CisgICAgICAgIGJ1aWxkX3RhcmdldHMuYWRkKHRhcmdldCkKKyAgICAgICAgZ2V0X21ldHJpY3NfYWdlbnQoKS5yZXBvcnRfdW5vcHRpbWl6ZWRfdGFyZ2V0KHRhcmdldCwgJ1JlcXVpcmVkIGJ1aWxkIHRhcmdldC4nKQorICAgICAgICBjb250aW51ZQorICAgICAgIyBJZiBub3RoaW5nIGlzIGRpc2NvdmVyZWQgd2l0aG91dCBlcnJvciwgdGhhdCBtZWFucyBub3RoaW5nIGlzIG5lZWRlZC4KKyAgICAgIGlmIG5vdCB0ZXN0X2Rpc2NvdmVyeV96aXBfcmVnZXhlczoKKyAgICAgICAgZ2V0X21ldHJpY3NfYWdlbnQoKS5yZXBvcnRfb3B0aW1pemVkX3RhcmdldCh0YXJnZXQpCisgICAgICAgIGNvbnRpbnVlCisKKyAgICAgIHJlZ2V4ID0gcidcYiglcy4qKVxiJyAlIHJlLmVzY2FwZSh0YXJnZXQpCisgICAgICBmb3Igb3B0IGluIHRlc3RfZGlzY292ZXJ5X3ppcF9yZWdleGVzOgorICAgICAgICB0cnk6CisgICAgICAgICAgaWYgcmUuc2VhcmNoKHJlZ2V4LCBvcHQpOgorICAgICAgICAgICAgZ2V0X21ldHJpY3NfYWdlbnQoKS5yZXBvcnRfdW5vcHRpbWl6ZWRfdGFyZ2V0KHRhcmdldCwgJ1Rlc3QgYXJ0aWZhY3QgdXNlZC4nKQorICAgICAgICAgICAgYnVpbGRfdGFyZ2V0cy5hZGQodGFyZ2V0KQorICAgICAgICAgICAgIyBwcm9jZWVkIHRvIG5leHQgdGFyZ2V0IGV2YWx1YXRpb24KKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgZ2V0X21ldHJpY3NfYWdlbnQoKS5yZXBvcnRfb3B0aW1pemVkX3RhcmdldCh0YXJnZXQpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAjIEluIGNhc2Ugb2YgZXhjZXB0aW9uIHJlcG9ydCBhcyB1bm9wdGltaXplZAorICAgICAgICAgIGJ1aWxkX3RhcmdldHMuYWRkKHRhcmdldCkKKyAgICAgICAgICBnZXRfbWV0cmljc19hZ2VudCgpLnJlcG9ydF91bm9wdGltaXplZF90YXJnZXQodGFyZ2V0LCBmJ0Vycm9yIGluIHBhcnNpbmcgdGVzdCBkaXNjb3Zlcnkgb3V0cHV0IGZvciB7dGFyZ2V0fToge3JlcHIoZSl9JykKKyAgICAgICAgICBsb2dnaW5nLmVycm9yKGYndW5hYmxlIHRvIHBhcnNlIHRlc3QgZGlzY292ZXJ5IG91dHB1dDoge3JlcHIoZSl9JykKKyAgICAgICAgICBicmVhaworICAgICMgSWYgZGlzY292ZXJ5IGlzIG5vdCBlbmFibGVkLCByZXR1cm4gdGhlIG9yaWdpbmFsIGxpc3QKKyAgICBpZiBub3QgZW5hYmxlX2Rpc2NvdmVyeToKKyAgICAgIHJldHVybiBzZWxmLl9sZWdhY3lfY29sbGVjdF9wcmVsaW1pbmFyeV9idWlsZF90YXJnZXRzKCkKKworICAgIHJldHVybiBidWlsZF90YXJnZXRzCisKKyAgZGVmIF9sZWdhY3lfY29sbGVjdF9wcmVsaW1pbmFyeV9idWlsZF90YXJnZXRzKHNlbGYpOgorICAgIGJ1aWxkX3RhcmdldHMgPSBzZXQoKQorICAgIGZvciB0YXJnZXQgaW4gc2VsZi5hcmdzLmV4dHJhX3RhcmdldHM6CisgICAgICBpZiBzZWxmLl91bnVzZWRfdGFyZ2V0X2V4Y2x1c2lvbl9lbmFibGVkKAorICAgICAgICAgIHRhcmdldAorICAgICAgKSBhbmQgbm90IHNlbGYuYnVpbGRfY29udGV4dC5idWlsZF90YXJnZXRfdXNlZCh0YXJnZXQpOgorICAgICAgICBjb250aW51ZQorCisgICAgICBidWlsZF90YXJnZXRzLmFkZCh0YXJnZXQpCisgICAgcmV0dXJuIGJ1aWxkX3RhcmdldHMKKworICBkZWYgX3VudXNlZF90YXJnZXRfZXhjbHVzaW9uX2VuYWJsZWQoc2VsZiwgdGFyZ2V0OiBzdHIpIC0+IGJvb2w6CisgICAgcmV0dXJuICgKKyAgICAgICAgZid7dGFyZ2V0fV91bnVzZWRfZXhjbHVzaW9uJworICAgICAgICBpbiBzZWxmLmJ1aWxkX2NvbnRleHQuZW5hYmxlZF9idWlsZF9mZWF0dXJlcworICAgICkKKworICBkZWYgX2dldF90ZXN0X2Rpc2NvdmVyeV96aXBfcmVnZXhlcyhzZWxmKSAtPiBzZXRbc3RyXToKKyAgICBidWlsZF90YXJnZXRfcmVnZXhlcyA9IHNldCgpCisgICAgZm9yIHRlc3RfaW5mbyBpbiBzZWxmLmJ1aWxkX2NvbnRleHQudGVzdF9pbmZvczoKKyAgICAgIHRmX2NvbW1hbmQgPSBzZWxmLl9idWlsZF90Zl9jb21tYW5kKHRlc3RfaW5mbykKKyAgICAgIGRpc2NvdmVyeV9hZ2VudCA9IHRlc3RfZGlzY292ZXJ5X2FnZW50LlRlc3REaXNjb3ZlcnlBZ2VudCh0cmFkZWZlZF9hcmdzPXRmX2NvbW1hbmQpCisgICAgICBmb3IgcmVnZXggaW4gZGlzY292ZXJ5X2FnZW50LmRpc2NvdmVyX3Rlc3RfemlwX3JlZ2V4ZXMoKToKKyAgICAgICAgYnVpbGRfdGFyZ2V0X3JlZ2V4ZXMuYWRkKHJlZ2V4KQorICAgIHJldHVybiBidWlsZF90YXJnZXRfcmVnZXhlcworCisKKyAgZGVmIF9idWlsZF90Zl9jb21tYW5kKHNlbGYsIHRlc3RfaW5mbykgLT4gbGlzdFtzdHJdOgorICAgIGNvbW1hbmQgPSBbdGVzdF9pbmZvLmNvbW1hbmRdCisgICAgZm9yIGV4dHJhX29wdGlvbiBpbiB0ZXN0X2luZm8uZXh0cmFfb3B0aW9uczoKKyAgICAgIGlmIG5vdCBleHRyYV9vcHRpb24uZ2V0KCdrZXknKToKKyAgICAgICAgY29udGludWUKKyAgICAgIGFyZ19rZXkgPSAnLS0nICsgZXh0cmFfb3B0aW9uLmdldCgna2V5JykKKyAgICAgIGlmIGFyZ19rZXkgPT0gJy0tYnVpbGQtaWQnOgorICAgICAgICBjb21tYW5kLmFwcGVuZChhcmdfa2V5KQorICAgICAgICBjb21tYW5kLmFwcGVuZChvcy5lbnZpcm9uLmdldCgnQlVJTERfTlVNQkVSJykpCisgICAgICAgIGNvbnRpbnVlCisgICAgICBpZiBleHRyYV9vcHRpb24uZ2V0KCd2YWx1ZXMnKToKKyAgICAgICAgZm9yIHZhbHVlIGluIGV4dHJhX29wdGlvbi5nZXQoJ3ZhbHVlcycpOgorICAgICAgICAgIGNvbW1hbmQuYXBwZW5kKGFyZ19rZXkpCisgICAgICAgICAgY29tbWFuZC5hcHBlbmQodmFsdWUpCisgICAgICBlbHNlOgorICAgICAgICBjb21tYW5kLmFwcGVuZChhcmdfa2V5KQorCisgICAgcmV0dXJuIGNvbW1hbmQKKworQGRhdGFjbGFzcyhmcm96ZW49VHJ1ZSkKK2NsYXNzIEJ1aWxkUGxhbjoKKyAgYnVpbGRfdGFyZ2V0czogc2V0W3N0cl0KKyAgcGFja2FnaW5nX2NvbW1hbmRzX2dldHRlcnM6IGxpc3RbQ2FsbGFibGVbW10sIGxpc3RbbGlzdFtzdHJdXV1dCisKKworZGVmIGJ1aWxkX3Rlc3Rfc3VpdGVzKGFyZ3Y6IGxpc3Rbc3RyXSkgLT4gaW50OgorICAiIiJCdWlsZHMgYWxsIHRlc3Qgc3VpdGVzIHBhc3NlZCBpbiwgb3B0aW1pemluZyBiYXNlZCBvbiB0aGUgYnVpbGRfY29udGV4dCBjb250ZW50LgorCisgIEFyZ3M6CisgICAgYXJndjogVGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgcGFzc2VkIGluLgorCisgIFJldHVybnM6CisgICAgVGhlIGV4aXQgY29kZSBvZiB0aGUgYnVpbGQuCisgICIiIgorICBnZXRfbWV0cmljc19hZ2VudCgpLmFuYWx5c2lzX3N0YXJ0KCkKKyAgdHJ5OgorICAgIGFyZ3MgPSBwYXJzZV9hcmdzKGFyZ3YpCisgICAgY2hlY2tfcmVxdWlyZWRfZW52KCkKKyAgICBidWlsZF9jb250ZXh0ID0gQnVpbGRDb250ZXh0KGxvYWRfYnVpbGRfY29udGV4dCgpKQorICAgIGJ1aWxkX3BsYW5uZXIgPSBCdWlsZFBsYW5uZXIoCisgICAgICAgIGJ1aWxkX2NvbnRleHQsIGFyZ3MsIG9wdGltaXplZF90YXJnZXRzLk9QVElNSVpFRF9CVUlMRF9UQVJHRVRTCisgICAgKQorICAgIGJ1aWxkX3BsYW4gPSBidWlsZF9wbGFubmVyLmNyZWF0ZV9idWlsZF9wbGFuKCkKKyAgZXhjZXB0OgorICAgIHJhaXNlCisgIGZpbmFsbHk6CisgICAgZ2V0X21ldHJpY3NfYWdlbnQoKS5hbmFseXNpc19lbmQoKQorCisgIHRyeToKKyAgICBleGVjdXRlX2J1aWxkX3BsYW4oYnVpbGRfcGxhbikKKyAgZXhjZXB0IEJ1aWxkRmFpbHVyZUVycm9yIGFzIGU6CisgICAgbG9nZ2luZy5lcnJvcignQnVpbGQgY29tbWFuZCBmYWlsZWQhIENoZWNrIGJ1aWxkX2xvZyBmb3IgZGV0YWlscy4nKQorICAgIHJldHVybiBlLnJldHVybl9jb2RlCisgIGZpbmFsbHk6CisgICAgZ2V0X21ldHJpY3NfYWdlbnQoKS5lbmRfcmVwb3J0aW5nKCkKKworICByZXR1cm4gMAorCisKK2RlZiBwYXJzZV9hcmdzKGFyZ3Y6IGxpc3Rbc3RyXSkgLT4gYXJncGFyc2UuTmFtZXNwYWNlOgorICBhcmdwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisKKyAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICdleHRyYV90YXJnZXRzJywgbmFyZ3M9JyonLCBoZWxwPSdFeHRyYSB0ZXN0IHN1aXRlcyB0byBidWlsZC4nCisgICkKKyAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICctLWRldmljZS1idWlsZCcsCisgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgaGVscD0nRmxhZyB0byBpbmRpY2F0ZSBydW5uaW5nIGEgZGV2aWNlIGJ1aWxkLicsCisgICkKKworICByZXR1cm4gYXJncGFyc2VyLnBhcnNlX2FyZ3MoYXJndikKKworCitkZWYgY2hlY2tfcmVxdWlyZWRfZW52KCk6CisgICIiIkNoZWNrIGZvciByZXF1aXJlZCBlbnYgdmFycy4KKworICBSYWlzZXM6CisgICAgUnVudGltZUVycm9yOiBJZiBhbnkgcmVxdWlyZWQgZW52IHZhcnMgYXJlIG5vdCBmb3VuZC4KKyAgIiIiCisgIG1pc3NpbmdfZW52X3ZhcnMgPSBzb3J0ZWQodiBmb3IgdiBpbiBSRVFVSVJFRF9FTlZfVkFSUyBpZiB2IG5vdCBpbiBvcy5lbnZpcm9uKQorCisgIGlmIG5vdCBtaXNzaW5nX2Vudl92YXJzOgorICAgIHJldHVybgorCisgIHQgPSAnLCcuam9pbihtaXNzaW5nX2Vudl92YXJzKQorICByYWlzZSBFcnJvcihmJ01pc3NpbmcgcmVxdWlyZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzOiB7dH0nKQorCisKK2RlZiBsb2FkX2J1aWxkX2NvbnRleHQoKToKKyAgYnVpbGRfY29udGV4dF9wYXRoID0gcGF0aGxpYi5QYXRoKG9zLmVudmlyb24uZ2V0KCdCVUlMRF9DT05URVhUJywgJycpKQorICBpZiBidWlsZF9jb250ZXh0X3BhdGguaXNfZmlsZSgpOgorICAgIHRyeToKKyAgICAgIHdpdGggb3BlbihidWlsZF9jb250ZXh0X3BhdGgsICdyJykgYXMgZjoKKyAgICAgICAgcmV0dXJuIGpzb24ubG9hZChmKQorICAgIGV4Y2VwdCBqc29uLmRlY29kZXIuSlNPTkRlY29kZUVycm9yIGFzIGU6CisgICAgICByYWlzZSBFcnJvcihmJ0ZhaWxlZCB0byBsb2FkIEpTT04gZmlsZToge2J1aWxkX2NvbnRleHRfcGF0aH0nKQorCisgIGxvZ2dpbmcuaW5mbygnTm8gQlVJTERfQ09OVEVYVCBmb3VuZCwgc2tpcHBpbmcgb3B0aW1pemF0aW9ucy4nKQorICByZXR1cm4gZW1wdHlfYnVpbGRfY29udGV4dCgpCisKKworZGVmIGVtcHR5X2J1aWxkX2NvbnRleHQoKToKKyAgcmV0dXJuIHsnZW5hYmxlZEJ1aWxkRmVhdHVyZXMnOiBbXX0KKworCitkZWYgZXhlY3V0ZV9idWlsZF9wbGFuKGJ1aWxkX3BsYW46IEJ1aWxkUGxhbik6CisgIGJ1aWxkX2NvbW1hbmQgPSBbXQorICBidWlsZF9jb21tYW5kLmFwcGVuZChnZXRfdG9wKCkuam9pbnBhdGgoU09PTkdfVUlfRVhFX1JFTF9QQVRIKSkKKyAgYnVpbGRfY29tbWFuZC5hcHBlbmQoJy0tbWFrZS1tb2RlJykKKyAgYnVpbGRfY29tbWFuZC5leHRlbmQoYnVpbGRfcGxhbi5idWlsZF90YXJnZXRzKQorCisgIHRyeToKKyAgICBydW5fY29tbWFuZChidWlsZF9jb21tYW5kKQorICBleGNlcHQgc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IgYXMgZToKKyAgICByYWlzZSBCdWlsZEZhaWx1cmVFcnJvcihlLnJldHVybmNvZGUpIGZyb20gZQorCisgIGdldF9tZXRyaWNzX2FnZW50KCkucGFja2FnaW5nX3N0YXJ0KCkKKyAgdHJ5OgorICAgIGZvciBwYWNrYWdpbmdfY29tbWFuZHNfZ2V0dGVyIGluIGJ1aWxkX3BsYW4ucGFja2FnaW5nX2NvbW1hbmRzX2dldHRlcnM6CisgICAgICBmb3IgcGFja2FnaW5nX2NvbW1hbmQgaW4gcGFja2FnaW5nX2NvbW1hbmRzX2dldHRlcigpOgorICAgICAgICBydW5fY29tbWFuZChwYWNrYWdpbmdfY29tbWFuZCkKKyAgZXhjZXB0IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yIGFzIGU6CisgICAgcmFpc2UgQnVpbGRGYWlsdXJlRXJyb3IoZS5yZXR1cm5jb2RlKSBmcm9tIGUKKyAgZmluYWxseToKKyAgICBnZXRfbWV0cmljc19hZ2VudCgpLnBhY2thZ2luZ19lbmQoKQorCisKK2RlZiBnZXRfdG9wKCkgLT4gcGF0aGxpYi5QYXRoOgorICByZXR1cm4gcGF0aGxpYi5QYXRoKG9zLmVudmlyb25bJ1RPUCddKQorCisKK2RlZiBydW5fY29tbWFuZChhcmdzOiBsaXN0W3N0cl0sIHN0ZG91dD1Ob25lKToKKyAgc3VicHJvY2Vzcy5ydW4oYXJncz1hcmdzLCBjaGVjaz1UcnVlLCBzdGRvdXQ9c3Rkb3V0KQorCisKK2RlZiBnZXRfbWV0cmljc19hZ2VudCgpOgorICByZXR1cm4gbWV0cmljc19hZ2VudC5NZXRyaWNzQWdlbnQuaW5zdGFuY2UoKQorCisKK2RlZiBtYWluKGFyZ3YpOgorICBkaXN0X2RpciA9IG9zLmVudmlyb24uZ2V0KCdESVNUX0RJUicpCisgIGlmIGRpc3RfZGlyOgorICAgIGxvZ19maWxlID0gcGF0aGxpYi5QYXRoKGRpc3RfZGlyKSAvIExPR19QQVRICisgICAgbG9nZ2luZy5iYXNpY0NvbmZpZygKKyAgICAgICAgbGV2ZWw9bG9nZ2luZy5ERUJVRywKKyAgICAgICAgZm9ybWF0PSclKGFzY3RpbWUpcyAlKGxldmVsbmFtZSlzICUobWVzc2FnZSlzJywKKyAgICAgICAgZmlsZW5hbWU9bG9nX2ZpbGUsCisgICAgKQorICBzeXMuZXhpdChidWlsZF90ZXN0X3N1aXRlcyhhcmd2KSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBtYWluKHN5cy5hcmd2WzE6XSkKZGlmZiAtLWdpdCBhL2NpL2J1aWxkX3Rlc3Rfc3VpdGVzX2xvY2FsX3Rlc3QucHkgYi9jaS9idWlsZF90ZXN0X3N1aXRlc19sb2NhbF90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZTUyZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jaS9idWlsZF90ZXN0X3N1aXRlc19sb2NhbF90ZXN0LnB5CkBAIC0wLDAgKzEsMTIzIEBACisjIENvcHlyaWdodCAyMDI0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyIiIkludGVncmF0aW9uIHRlc3RzIGZvciBidWlsZF90ZXN0X3N1aXRlcyB0aGF0IHJlcXVpcmUgYSBsb2NhbCBidWlsZCBlbnYuIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHBhdGhsaWIKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBzaWduYWwKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB0aW1lCitpbXBvcnQgY2lfdGVzdF9saWIKKworCitjbGFzcyBCdWlsZFRlc3RTdWl0ZXNMb2NhbFRlc3QoY2lfdGVzdF9saWIuVGVzdENhc2UpOgorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICBzZWxmLnRvcF9kaXIgPSBwYXRobGliLlBhdGgob3MuZW52aXJvblsnQU5EUk9JRF9CVUlMRF9UT1AnXSkucmVzb2x2ZSgpCisgICAgc2VsZi5leGVjdXRhYmxlID0gc2VsZi50b3BfZGlyLmpvaW5wYXRoKCdidWlsZC9tYWtlL2NpL2J1aWxkX3Rlc3Rfc3VpdGVzJykKKyAgICBzZWxmLnByb2Nlc3Nfc2Vzc2lvbiA9IGNpX3Rlc3RfbGliLlRlbXBvcmFyeVByb2Nlc3NTZXNzaW9uKHNlbGYpCisgICAgc2VsZi50ZW1wX2RpciA9IGNpX3Rlc3RfbGliLlRlc3RUZW1wb3JhcnlEaXJlY3RvcnkuY3JlYXRlKHNlbGYpCisKKyAgZGVmIGJ1aWxkX3N1YnByb2Nlc3NfYXJncyhzZWxmLCBidWlsZF9hcmdzOiBsaXN0W3N0cl0pOgorICAgIGVudiA9IG9zLmVudmlyb24uY29weSgpCisgICAgZW52WydUT1AnXSA9IHN0cihzZWxmLnRvcF9kaXIpCisgICAgZW52WydPVVRfRElSJ10gPSBzZWxmLnRlbXBfZGlyCisKKyAgICBhcmdzID0gKFtzZWxmLmV4ZWN1dGFibGVdICsgYnVpbGRfYXJncywpCisgICAga3dhcmdzID0geworICAgICAgICAnY3dkJzogc2VsZi50b3BfZGlyLAorICAgICAgICAnZW52JzogZW52LAorICAgICAgICAndGV4dCc6IFRydWUsCisgICAgfQorCisgICAgcmV0dXJuIChhcmdzLCBrd2FyZ3MpCisKKyAgZGVmIHJ1bl9idWlsZChzZWxmLCBidWlsZF9hcmdzOiBsaXN0W3N0cl0pIC0+IHN1YnByb2Nlc3MuQ29tcGxldGVkUHJvY2VzczoKKyAgICBhcmdzLCBrd2FyZ3MgPSBzZWxmLmJ1aWxkX3N1YnByb2Nlc3NfYXJncyhidWlsZF9hcmdzKQorCisgICAgcmV0dXJuIHN1YnByb2Nlc3MucnVuKAorICAgICAgICAqYXJncywKKyAgICAgICAgKiprd2FyZ3MsCisgICAgICAgIGNoZWNrPVRydWUsCisgICAgICAgIGNhcHR1cmVfb3V0cHV0PVRydWUsCisgICAgICAgIHRpbWVvdXQ9NSAqIDYwLAorICAgICkKKworICBkZWYgYXNzZXJ0X2NoaWxkcmVuX2FsaXZlKHNlbGYsIGNoaWxkcmVuOiBsaXN0W2ludF0pOgorICAgIGZvciBjIGluIGNoaWxkcmVuOgorICAgICAgc2VsZi5hc3NlcnRUcnVlKGNpX3Rlc3RfbGliLnByb2Nlc3NfYWxpdmUoYykpCisKKyAgZGVmIGFzc2VydF9jaGlsZHJlbl9kZWFkKHNlbGYsIGNoaWxkcmVuOiBsaXN0W2ludF0pOgorICAgIGZvciBjIGluIGNoaWxkcmVuOgorICAgICAgc2VsZi5hc3NlcnRGYWxzZShjaV90ZXN0X2xpYi5wcm9jZXNzX2FsaXZlKGMpKQorCisgIGRlZiB0ZXN0X2ZhaWxzX2Zvcl9pbnZhbGlkX2FyZyhzZWxmKToKKyAgICBpbnZhbGlkX2FyZyA9ICctLWludmFsaWQtYXJnJworCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcikgYXMgY206CisgICAgICBzZWxmLnJ1bl9idWlsZChbaW52YWxpZF9hcmddKQorCisgICAgc2VsZi5hc3NlcnRJbihpbnZhbGlkX2FyZywgY20uZXhjZXB0aW9uLnN0ZGVycikKKworICBkZWYgdGVzdF9idWlsZHNfc3VjY2Vzc2Z1bGx5KHNlbGYpOgorICAgIHNlbGYucnVuX2J1aWxkKFsnbm90aGluZyddKQorCisgIGRlZiB0ZXN0X2Nhbl9pbnRlcnJ1cHRfYnVpbGQoc2VsZik6CisgICAgYXJncywga3dhcmdzID0gc2VsZi5idWlsZF9zdWJwcm9jZXNzX2FyZ3MoWydnZW5lcmFsLXRlc3RzJ10pCisgICAgcCA9IHNlbGYucHJvY2Vzc19zZXNzaW9uLmNyZWF0ZShhcmdzLCBrd2FyZ3MpCisKKyAgICAjIFRPRE8obHVjYWZhcnNpKTogUmVwbGFjZSB0aGlzIChhbmQgb3RoZXIgaW5zdGFuY2VzKSB3aXRoIGEgY29uZGl0aW9uLgorICAgIHRpbWUuc2xlZXAoNSkgICMgV2FpdCBmb3IgdGhlIGJ1aWxkIHRvIGdldCBnb2luZy4KKyAgICBzZWxmLmFzc2VydElzTm9uZShwLnBvbGwoKSkgICMgQ2hlY2sgdGhhdCB0aGUgcHJvY2VzcyBpcyBzdGlsbCBhbGl2ZS4KKyAgICBjaGlsZHJlbiA9IHF1ZXJ5X2NoaWxkX3BpZHMocC5waWQpCisgICAgc2VsZi5hc3NlcnRfY2hpbGRyZW5fYWxpdmUoY2hpbGRyZW4pCisKKyAgICBwLnNlbmRfc2lnbmFsKHNpZ25hbC5TSUdJTlQpCisgICAgcC53YWl0KCkKKworICAgIHRpbWUuc2xlZXAoNSkgICMgV2FpdCBmb3IgdGhpbmdzIHRvIGRpZSBvdXQuCisgICAgc2VsZi5hc3NlcnRfY2hpbGRyZW5fZGVhZChjaGlsZHJlbikKKworICBkZWYgdGVzdF9jYW5fa2lsbF9idWlsZF9wcm9jZXNzX2dyb3VwKHNlbGYpOgorICAgIGFyZ3MsIGt3YXJncyA9IHNlbGYuYnVpbGRfc3VicHJvY2Vzc19hcmdzKFsnZ2VuZXJhbC10ZXN0cyddKQorICAgIHAgPSBzZWxmLnByb2Nlc3Nfc2Vzc2lvbi5jcmVhdGUoYXJncywga3dhcmdzKQorCisgICAgdGltZS5zbGVlcCg1KSAgIyBXYWl0IGZvciB0aGUgYnVpbGQgdG8gZ2V0IGdvaW5nLgorICAgIHNlbGYuYXNzZXJ0SXNOb25lKHAucG9sbCgpKSAgIyBDaGVjayB0aGF0IHRoZSBwcm9jZXNzIGlzIHN0aWxsIGFsaXZlLgorICAgIGNoaWxkcmVuID0gcXVlcnlfY2hpbGRfcGlkcyhwLnBpZCkKKyAgICBzZWxmLmFzc2VydF9jaGlsZHJlbl9hbGl2ZShjaGlsZHJlbikKKworICAgIG9zLmtpbGxwZyhvcy5nZXRwZ2lkKHAucGlkKSwgc2lnbmFsLlNJR0tJTEwpCisgICAgcC53YWl0KCkKKworICAgIHRpbWUuc2xlZXAoNSkgICMgV2FpdCBmb3IgdGhpbmdzIHRvIGRpZSBvdXQuCisgICAgc2VsZi5hc3NlcnRfY2hpbGRyZW5fZGVhZChjaGlsZHJlbikKKworCisjIFRPRE8oaHphbGVrKTogUmVwbGFjZSB0aGlzIHdpdGggYHBzdXRpbHNgIG9uY2UgYXZhaWxhYmxlIGluIHRoZSB0cmVlLgorZGVmIHF1ZXJ5X2NoaWxkX3BpZHMocGFyZW50X3BpZDogaW50KSAtPiBzZXRbaW50XToKKyAgcCA9IHN1YnByb2Nlc3MucnVuKAorICAgICAgWydwZ3JlcCcsICctUCcsIHN0cihwYXJlbnRfcGlkKV0sCisgICAgICBjaGVjaz1UcnVlLAorICAgICAgY2FwdHVyZV9vdXRwdXQ9VHJ1ZSwKKyAgICAgIHRleHQ9VHJ1ZSwKKyAgKQorICByZXR1cm4ge2ludChwaWQpIGZvciBwaWQgaW4gcC5zdGRvdXQuc3BsaXRsaW5lcygpfQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIGNpX3Rlc3RfbGliLm1haW4oKQpkaWZmIC0tZ2l0IGEvY2kvYnVpbGRfdGVzdF9zdWl0ZXNfdGVzdC5weSBiL2NpL2J1aWxkX3Rlc3Rfc3VpdGVzX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkwNzQwZgotLS0gL2Rldi9udWxsCisrKyBiL2NpL2J1aWxkX3Rlc3Rfc3VpdGVzX3Rlc3QucHkKQEAgLTAsMCArMSw1NTAgQEAKKyMgQ29weXJpZ2h0IDIwMjQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIiIiVGVzdHMgZm9yIGJ1aWxkX3Rlc3Rfc3VpdGVzLnB5IiIiCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IGZ1bmN0b29scworZnJvbSBpbXBvcnRsaWIgaW1wb3J0IHJlc291cmNlcworaW1wb3J0IGpzb24KK2ltcG9ydCBtdWx0aXByb2Nlc3NpbmcKK2ltcG9ydCBvcworaW1wb3J0IHBhdGhsaWIKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBzaWduYWwKK2ltcG9ydCBzdGF0CitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdGV4dHdyYXAKK2ltcG9ydCB0aW1lCitmcm9tIHR5cGluZyBpbXBvcnQgQ2FsbGFibGUKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB1bml0dGVzdCBpbXBvcnQgbW9jaworZnJvbSBidWlsZF9jb250ZXh0IGltcG9ydCBCdWlsZENvbnRleHQKK2ltcG9ydCBidWlsZF90ZXN0X3N1aXRlcworaW1wb3J0IGNpX3Rlc3RfbGliCitpbXBvcnQgb3B0aW1pemVkX3RhcmdldHMKK2Zyb20gcHlmYWtlZnMgaW1wb3J0IGZha2VfZmlsZXN5c3RlbV91bml0dGVzdAoraW1wb3J0IG1ldHJpY3NfYWdlbnQKK2ltcG9ydCB0ZXN0X2Rpc2NvdmVyeV9hZ2VudAorCisKK2NsYXNzIEJ1aWxkVGVzdFN1aXRlc1Rlc3QoZmFrZV9maWxlc3lzdGVtX3VuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgc2V0VXAoc2VsZik6CisgICAgc2VsZi5zZXRVcFB5ZmFrZWZzKCkKKworICAgIG9zX2Vudmlyb25fcGF0Y2hlciA9IG1vY2sucGF0Y2guZGljdCgnb3MuZW52aXJvbicsIHt9KQorICAgIHNlbGYuYWRkQ2xlYW51cChvc19lbnZpcm9uX3BhdGNoZXIuc3RvcCkKKyAgICBzZWxmLm1vY2tfb3NfZW52aXJvbiA9IG9zX2Vudmlyb25fcGF0Y2hlci5zdGFydCgpCisKKyAgICBzdWJwcm9jZXNzX3J1bl9wYXRjaGVyID0gbW9jay5wYXRjaCgnc3VicHJvY2Vzcy5ydW4nKQorICAgIHNlbGYuYWRkQ2xlYW51cChzdWJwcm9jZXNzX3J1bl9wYXRjaGVyLnN0b3ApCisgICAgc2VsZi5tb2NrX3N1YnByb2Nlc3NfcnVuID0gc3VicHJvY2Vzc19ydW5fcGF0Y2hlci5zdGFydCgpCisKKyAgICBtZXRyaWNzX2FnZW50X2ZpbmFsaXplX3BhdGNoZXIgPSBtb2NrLnBhdGNoKCdtZXRyaWNzX2FnZW50Lk1ldHJpY3NBZ2VudC5lbmRfcmVwb3J0aW5nJykKKyAgICBzZWxmLmFkZENsZWFudXAobWV0cmljc19hZ2VudF9maW5hbGl6ZV9wYXRjaGVyLnN0b3ApCisgICAgc2VsZi5tb2NrX21ldHJpY3NfYWdlbnRfZW5kID0gbWV0cmljc19hZ2VudF9maW5hbGl6ZV9wYXRjaGVyLnN0YXJ0KCkKKworICAgIHNlbGYuX3NldHVwX3dvcmtpbmdfYnVpbGRfZW52KCkKKworICBkZWYgdGVzdF9taXNzaW5nX3RhcmdldF9yZWxlYXNlX2Vudl92YXJfcmFpc2VzKHNlbGYpOgorICAgIGRlbCBvcy5lbnZpcm9uWydUQVJHRVRfUkVMRUFTRSddCisKKyAgICB3aXRoIHNlbGYuYXNzZXJ0X3JhaXNlc193b3JkKGJ1aWxkX3Rlc3Rfc3VpdGVzLkVycm9yLCAnVEFSR0VUX1JFTEVBU0UnKToKKyAgICAgIGJ1aWxkX3Rlc3Rfc3VpdGVzLm1haW4oW10pCisKKyAgZGVmIHRlc3RfbWlzc2luZ190YXJnZXRfcHJvZHVjdF9lbnZfdmFyX3JhaXNlcyhzZWxmKToKKyAgICBkZWwgb3MuZW52aXJvblsnVEFSR0VUX1BST0RVQ1QnXQorCisgICAgd2l0aCBzZWxmLmFzc2VydF9yYWlzZXNfd29yZChidWlsZF90ZXN0X3N1aXRlcy5FcnJvciwgJ1RBUkdFVF9QUk9EVUNUJyk6CisgICAgICBidWlsZF90ZXN0X3N1aXRlcy5tYWluKFtdKQorCisgIGRlZiB0ZXN0X21pc3NpbmdfdG9wX2Vudl92YXJfcmFpc2VzKHNlbGYpOgorICAgIGRlbCBvcy5lbnZpcm9uWydUT1AnXQorCisgICAgd2l0aCBzZWxmLmFzc2VydF9yYWlzZXNfd29yZChidWlsZF90ZXN0X3N1aXRlcy5FcnJvciwgJ1RPUCcpOgorICAgICAgYnVpbGRfdGVzdF9zdWl0ZXMubWFpbihbXSkKKworICBkZWYgdGVzdF9taXNzaW5nX2Rpc3RfZGlyX2Vudl92YXJfcmFpc2VzKHNlbGYpOgorICAgIGRlbCBvcy5lbnZpcm9uWydESVNUX0RJUiddCisKKyAgICB3aXRoIHNlbGYuYXNzZXJ0X3JhaXNlc193b3JkKGJ1aWxkX3Rlc3Rfc3VpdGVzLkVycm9yLCAnRElTVF9ESVInKToKKyAgICAgIGJ1aWxkX3Rlc3Rfc3VpdGVzLm1haW4oW10pCisKKyAgZGVmIHRlc3RfaW52YWxpZF9hcmdfcmFpc2VzKHNlbGYpOgorICAgIGludmFsaWRfYXJncyA9IFsnLS1pbnZhbGlkX2FyZyddCisKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoU3lzdGVtRXhpdCwgJzInKToKKyAgICAgIGJ1aWxkX3Rlc3Rfc3VpdGVzLm1haW4oaW52YWxpZF9hcmdzKQorCisgIGRlZiB0ZXN0X2J1aWxkX2ZhaWx1cmVfcmV0dXJucyhzZWxmKToKKyAgICBzZWxmLm1vY2tfc3VicHJvY2Vzc19ydW4uc2lkZV9lZmZlY3QgPSBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcigKKyAgICAgICAgNDIsIE5vbmUKKyAgICApCisKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoU3lzdGVtRXhpdCwgJzQyJyk6CisgICAgICBidWlsZF90ZXN0X3N1aXRlcy5tYWluKFtdKQorCisgIGRlZiB0ZXN0X2luY29ycmVjdGx5X2Zvcm1hdHRlZF9idWlsZF9jb250ZXh0X3JhaXNlcyhzZWxmKToKKyAgICBidWlsZF9jb250ZXh0ID0gc2VsZi5mYWtlX3RvcC5qb2lucGF0aCgnYnVpbGRfY29udGV4dCcpCisgICAgYnVpbGRfY29udGV4dC50b3VjaCgpCisgICAgb3MuZW52aXJvblsnQlVJTERfQ09OVEVYVCddID0gc3RyKGJ1aWxkX2NvbnRleHQpCisKKyAgICB3aXRoIHNlbGYuYXNzZXJ0X3JhaXNlc193b3JkKGJ1aWxkX3Rlc3Rfc3VpdGVzLkVycm9yLCAnSlNPTicpOgorICAgICAgYnVpbGRfdGVzdF9zdWl0ZXMubWFpbihbXSkKKworICBkZWYgdGVzdF9idWlsZF9zdWNjZXNzX3JldHVybnMoc2VsZik6CisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFN5c3RlbUV4aXQsICcwJyk6CisgICAgICBidWlsZF90ZXN0X3N1aXRlcy5tYWluKFtdKQorCisgIGRlZiBhc3NlcnRfcmFpc2VzX3dvcmQoc2VsZiwgY2xzLCB3b3JkKToKKyAgICByZXR1cm4gc2VsZi5hc3NlcnRSYWlzZXNSZWdleChjbHMsIHJmJ1xie3dvcmR9XGInKQorCisgIGRlZiBfc2V0dXBfd29ya2luZ19idWlsZF9lbnYoc2VsZik6CisgICAgc2VsZi5mYWtlX3RvcCA9IHBhdGhsaWIuUGF0aCgnL2Zha2UvdG9wJykKKyAgICBzZWxmLmZha2VfdG9wLm1rZGlyKHBhcmVudHM9VHJ1ZSkKKworICAgIHNlbGYuc29vbmdfdWlfZGlyID0gc2VsZi5mYWtlX3RvcC5qb2lucGF0aCgnYnVpbGQvc29vbmcnKQorICAgIHNlbGYuc29vbmdfdWlfZGlyLm1rZGlyKHBhcmVudHM9VHJ1ZSwgZXhpc3Rfb2s9VHJ1ZSkKKworICAgIHNlbGYubG9nc19kaXIgPSBzZWxmLmZha2VfdG9wLmpvaW5wYXRoKCdkaXN0L2xvZ3MnKQorICAgIHNlbGYubG9nc19kaXIubWtkaXIocGFyZW50cz1UcnVlLCBleGlzdF9vaz1UcnVlKQorCisgICAgc2VsZi5zb29uZ191aSA9IHNlbGYuc29vbmdfdWlfZGlyLmpvaW5wYXRoKCdzb29uZ191aS5iYXNoJykKKyAgICBzZWxmLnNvb25nX3VpLnRvdWNoKCkKKworICAgIHNlbGYubW9ja19vc19lbnZpcm9uLnVwZGF0ZSh7CisgICAgICAgICdUQVJHRVRfUkVMRUFTRSc6ICdyZWxlYXNlJywKKyAgICAgICAgJ1RBUkdFVF9QUk9EVUNUJzogJ3Byb2R1Y3QnLAorICAgICAgICAnVE9QJzogc3RyKHNlbGYuZmFrZV90b3ApLAorICAgICAgICAnRElTVF9ESVInOiBzdHIoc2VsZi5mYWtlX3RvcC5qb2lucGF0aCgnZGlzdCcpKSwKKyAgICB9KQorCisgICAgc2VsZi5tb2NrX3N1YnByb2Nlc3NfcnVuLnJldHVybl92YWx1ZSA9IDAKKworCitjbGFzcyBSdW5Db21tYW5kSW50ZWdyYXRpb25UZXN0KGNpX3Rlc3RfbGliLlRlc3RDYXNlKToKKworICBkZWYgc2V0VXAoc2VsZik6CisgICAgc2VsZi50ZW1wX2RpciA9IGNpX3Rlc3RfbGliLlRlc3RUZW1wb3JhcnlEaXJlY3RvcnkuY3JlYXRlKHNlbGYpCisKKyAgICAjIENvcHkgdGhlIFB5dGhvbiBleGVjdXRhYmxlIGZyb20gJ25vbi1jb2RlJyByZXNvdXJjZXMgYW5kIG1ha2UgaXQKKyAgICAjIGV4ZWN1dGFibGUgZm9yIHVzZSBieSB0ZXN0cyB0aGF0IGxhdW5jaCBhIHN1YnByb2Nlc3MuIE5vdGUgdGhhdCB3ZSBkb24ndAorICAgICMgdXNlIFB5dGhvbidzIG5hdGl2ZSBgc3lzLmV4ZWN1dGFibGVgIHByb3BlcnR5IHNpbmNlIHRoYXQgaXMgbm90IHNldCB3aGVuCisgICAgIyBydW5uaW5nIHZpYSB0aGUgZW1iZWRkZWQgbGF1bmNoZXIuCisgICAgYmFzZV9uYW1lID0gJ3B5My1jbWQnCisgICAgZGVzdF9maWxlID0gc2VsZi50ZW1wX2Rpci5qb2lucGF0aChiYXNlX25hbWUpCisgICAgd2l0aCByZXNvdXJjZXMuYXNfZmlsZSgKKyAgICAgICAgcmVzb3VyY2VzLmZpbGVzKCd0ZXN0ZGF0YScpLmpvaW5wYXRoKGJhc2VfbmFtZSkKKyAgICApIGFzIHA6CisgICAgICBzaHV0aWwuY29weShwLCBkZXN0X2ZpbGUpCisgICAgZGVzdF9maWxlLmNobW9kKGRlc3RfZmlsZS5zdGF0KCkuc3RfbW9kZSB8IHN0YXQuU19JRVhFQykKKyAgICBzZWxmLnB5dGhvbl9leGVjdXRhYmxlID0gZGVzdF9maWxlCisKKyAgICBzZWxmLl9tYW5hZ2VkX3Byb2Nlc3NlcyA9IFtdCisKKyAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgIHNlbGYuX3Rlcm1pbmF0ZV9tYW5hZ2VkX3Byb2Nlc3NlcygpCisKKyAgZGVmIHRlc3RfcmFpc2VzX29uX25vbnplcm9fZXhpdChzZWxmKToKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbik6CisgICAgICBidWlsZF90ZXN0X3N1aXRlcy5ydW5fY29tbWFuZChbCisgICAgICAgICAgc2VsZi5weXRob25fZXhlY3V0YWJsZSwKKyAgICAgICAgICAnLWMnLAorICAgICAgICAgIHRleHR3cmFwLmRlZGVudChmIiIiXAorICAgICAgICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgICAgICAgICIiIiksCisgICAgICBdKQorCisgIGRlZiB0ZXN0X3N0cmVhbXNfc3Rkb3V0KHNlbGYpOgorCisgICAgZGVmIHJ1bl9zbG93X2NvbW1hbmQoc3Rkb3V0X2ZpbGUsIG1hcmtlcik6CisgICAgICB3aXRoIG9wZW4oc3Rkb3V0X2ZpbGUsICd3JykgYXMgZjoKKyAgICAgICAgYnVpbGRfdGVzdF9zdWl0ZXMucnVuX2NvbW1hbmQoCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgc2VsZi5weXRob25fZXhlY3V0YWJsZSwKKyAgICAgICAgICAgICAgICAnLWMnLAorICAgICAgICAgICAgICAgIHRleHR3cmFwLmRlZGVudChmIiIiXAorICAgICAgICAgICAgICAgICAgaW1wb3J0IHRpbWUKKworICAgICAgICAgICAgICAgICAgcHJpbnQoJ3ttYXJrZXJ9JywgZW5kPScnLCBmbHVzaD1UcnVlKQorCisgICAgICAgICAgICAgICAgICAjIEtlZXAgcHJvY2VzcyBhbGl2ZSB1bnRpbCB3ZSBjaGVjayBzdGRvdXQuCisgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDEwKQorICAgICAgICAgICAgICAgICAgIiIiKSwKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICBzdGRvdXQ9ZiwKKyAgICAgICAgKQorCisgICAgbWFya2VyID0gJ1NwaW5hY2gnCisgICAgc3Rkb3V0X2ZpbGUgPSBzZWxmLnRlbXBfZGlyLmpvaW5wYXRoKCdzdGRvdXQudHh0JykKKworICAgIHAgPSBzZWxmLnN0YXJ0X3Byb2Nlc3ModGFyZ2V0PXJ1bl9zbG93X2NvbW1hbmQsIGFyZ3M9W3N0ZG91dF9maWxlLCBtYXJrZXJdKQorCisgICAgc2VsZi5hc3NlcnRfZmlsZV9ldmVudHVhbGx5X2NvbnRhaW5zKHN0ZG91dF9maWxlLCBtYXJrZXIpCisKKyAgZGVmIHRlc3RfcHJvcGFnYXRlc19pbnRlcnJ1cHRpb25zKHNlbGYpOgorCisgICAgZGVmIHJ1bihwaWRfZmlsZSk6CisgICAgICBidWlsZF90ZXN0X3N1aXRlcy5ydW5fY29tbWFuZChbCisgICAgICAgICAgc2VsZi5weXRob25fZXhlY3V0YWJsZSwKKyAgICAgICAgICAnLWMnLAorICAgICAgICAgIHRleHR3cmFwLmRlZGVudChmIiIiXAorICAgICAgICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgICAgICAgaW1wb3J0IHBhdGhsaWIKKyAgICAgICAgICAgICAgaW1wb3J0IHRpbWUKKworICAgICAgICAgICAgICBwYXRobGliLlBhdGgoJ3twaWRfZmlsZX0nKS53cml0ZV90ZXh0KHN0cihvcy5nZXRwaWQoKSkpCisKKyAgICAgICAgICAgICAgIyBLZWVwIHRoZSBwcm9jZXNzIGFsaXZlIGZvciB1cyB0byBleHBsaWNpdGx5IGludGVycnVwdCBpdC4KKyAgICAgICAgICAgICAgdGltZS5zbGVlcCgxMCkKKyAgICAgICAgICAgICAgIiIiKSwKKyAgICAgIF0pCisKKyAgICBwaWRfZmlsZSA9IHNlbGYudGVtcF9kaXIuam9pbnBhdGgoJ3BpZC50eHQnKQorICAgIHAgPSBzZWxmLnN0YXJ0X3Byb2Nlc3ModGFyZ2V0PXJ1biwgYXJncz1bcGlkX2ZpbGVdKQorICAgIHN1YnByb2Nlc3NfcGlkID0gaW50KHJlYWRfZXZlbnR1YWxfZmlsZV9jb250ZW50cyhwaWRfZmlsZSkpCisKKyAgICBvcy5raWxsKHAucGlkLCBzaWduYWwuU0lHSU5UKQorICAgIHAuam9pbigpCisKKyAgICBzZWxmLmFzc2VydF9wcm9jZXNzX2V2ZW50dWFsbHlfZGllcyhwLnBpZCkKKyAgICBzZWxmLmFzc2VydF9wcm9jZXNzX2V2ZW50dWFsbHlfZGllcyhzdWJwcm9jZXNzX3BpZCkKKworICBkZWYgc3RhcnRfcHJvY2VzcyhzZWxmLCAqYXJncywgKiprd2FyZ3MpIC0+IG11bHRpcHJvY2Vzc2luZy5Qcm9jZXNzOgorICAgIHAgPSBtdWx0aXByb2Nlc3NpbmcuUHJvY2VzcygqYXJncywgKiprd2FyZ3MpCisgICAgc2VsZi5fbWFuYWdlZF9wcm9jZXNzZXMuYXBwZW5kKHApCisgICAgcC5zdGFydCgpCisgICAgcmV0dXJuIHAKKworICBkZWYgYXNzZXJ0X3Byb2Nlc3NfZXZlbnR1YWxseV9kaWVzKHNlbGYsIHBpZDogaW50KToKKyAgICB0cnk6CisgICAgICB3YWl0X3VudGlsKGxhbWJkYTogbm90IGNpX3Rlc3RfbGliLnByb2Nlc3NfYWxpdmUocGlkKSkKKyAgICBleGNlcHQgVGltZW91dEVycm9yIGFzIGU6CisgICAgICBzZWxmLmZhaWwoZidQcm9jZXNzIHtwaWR9IGRpZCBub3QgZGllIGFmdGVyIGEgd2hpbGU6IHtlfScpCisKKyAgZGVmIGFzc2VydF9maWxlX2V2ZW50dWFsbHlfY29udGFpbnMoc2VsZiwgZmlsZTogcGF0aGxpYi5QYXRoLCBzdWJzdHJpbmc6IHN0cik6CisgICAgd2FpdF91bnRpbChsYW1iZGE6IGZpbGUuaXNfZmlsZSgpIGFuZCBmaWxlLnN0YXQoKS5zdF9zaXplID4gMCkKKyAgICBzZWxmLmFzc2VydEluKHN1YnN0cmluZywgcmVhZF9maWxlX2NvbnRlbnRzKGZpbGUpKQorCisgIGRlZiBfdGVybWluYXRlX21hbmFnZWRfcHJvY2Vzc2VzKHNlbGYpOgorICAgIGZvciBwIGluIHNlbGYuX21hbmFnZWRfcHJvY2Vzc2VzOgorICAgICAgaWYgbm90IHAuaXNfYWxpdmUoKToKKyAgICAgICAgY29udGludWUKKworICAgICAgIyBXZSB0ZXJtaW5hdGUgdGhlIHByb2Nlc3Mgd2l0aCBgU0lHSU5UYCBzaW5jZSB1c2luZyBgdGVybWluYXRlYCBvcgorICAgICAgIyBgU0lHS0lMTGAgZG9lc24ndCBraWxsIGFueSBncmFuZGNoaWxkIHByb2Nlc3NlcyBhbmQgd2UgZG9uJ3QgaGF2ZQorICAgICAgIyBgcHN1dGlsYCBhdmFpbGFibGUgdG8gZWFzaWx5IHF1ZXJ5IGFsbCBjaGlsZHJlbi4KKyAgICAgIG9zLmtpbGwocC5waWQsIHNpZ25hbC5TSUdJTlQpCisKKworY2xhc3MgQnVpbGRQbGFubmVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgY2xhc3MgVGVzdE9wdGltaXplZEJ1aWxkVGFyZ2V0KG9wdGltaXplZF90YXJnZXRzLk9wdGltaXplZEJ1aWxkVGFyZ2V0KToKKworICAgIGRlZiBfX2luaXRfXygKKyAgICAgICAgc2VsZiwgdGFyZ2V0LCBidWlsZF9jb250ZXh0LCBhcmdzLCBvdXRwdXRfdGFyZ2V0cywgcGFja2FnaW5nX2NvbW1hbmRzCisgICAgKToKKyAgICAgIHN1cGVyKCkuX19pbml0X18odGFyZ2V0LCBidWlsZF9jb250ZXh0LCBhcmdzKQorICAgICAgc2VsZi5vdXRwdXRfdGFyZ2V0cyA9IG91dHB1dF90YXJnZXRzCisgICAgICBzZWxmLnBhY2thZ2luZ19jb21tYW5kcyA9IHBhY2thZ2luZ19jb21tYW5kcworCisgICAgZGVmIGdldF9idWlsZF90YXJnZXRzX2ltcGwoc2VsZik6CisgICAgICByZXR1cm4gc2VsZi5vdXRwdXRfdGFyZ2V0cworCisgICAgZGVmIGdldF9wYWNrYWdlX291dHB1dHNfY29tbWFuZHNfaW1wbChzZWxmKToKKyAgICAgIHJldHVybiBzZWxmLnBhY2thZ2luZ19jb21tYW5kcworCisgICAgZGVmIGdldF9lbmFibGVkX2ZsYWcoc2VsZik6CisgICAgICByZXR1cm4gZid7c2VsZi50YXJnZXR9X2VuYWJsZWQnCisKKyAgZGVmIHNldFVwKHNlbGYpOgorICAgIHRlc3RfZGlzY292ZXJ5X2FnZW50X3BhdGNoZXIgPSBtb2NrLnBhdGNoKCd0ZXN0X2Rpc2NvdmVyeV9hZ2VudC5UZXN0RGlzY292ZXJ5QWdlbnQuZGlzY292ZXJfdGVzdF96aXBfcmVnZXhlcycpCisgICAgc2VsZi5hZGRDbGVhbnVwKHRlc3RfZGlzY292ZXJ5X2FnZW50X3BhdGNoZXIuc3RvcCkKKyAgICBzZWxmLm1vY2tfdGVzdF9kaXNjb3ZlcnlfYWdlbnRfZW5kID0gdGVzdF9kaXNjb3ZlcnlfYWdlbnRfcGF0Y2hlci5zdGFydCgpCisKKworICBkZWYgdGVzdF9idWlsZF9vcHRpbWl6YXRpb25fb2ZmX2J1aWxkc19ldmVyeXRoaW5nKHNlbGYpOgorICAgIGJ1aWxkX3RhcmdldHMgPSB7J3RhcmdldF8xJywgJ3RhcmdldF8yJ30KKyAgICBidWlsZF9wbGFubmVyID0gc2VsZi5jcmVhdGVfYnVpbGRfcGxhbm5lcigKKyAgICAgICAgYnVpbGRfY29udGV4dD1zZWxmLmNyZWF0ZV9idWlsZF9jb250ZXh0KG9wdGltaXplZF9idWlsZF9lbmFibGVkPUZhbHNlKSwKKyAgICAgICAgYnVpbGRfdGFyZ2V0cz1idWlsZF90YXJnZXRzLAorICAgICkKKworICAgIGJ1aWxkX3BsYW4gPSBidWlsZF9wbGFubmVyLmNyZWF0ZV9idWlsZF9wbGFuKCkKKworICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWwoYnVpbGRfdGFyZ2V0cywgYnVpbGRfcGxhbi5idWlsZF90YXJnZXRzKQorCisgIGRlZiB0ZXN0X2J1aWxkX29wdGltaXphdGlvbl9vZmZfZG9lc250X3BhY2thZ2Uoc2VsZik6CisgICAgYnVpbGRfdGFyZ2V0cyA9IHsndGFyZ2V0XzEnLCAndGFyZ2V0XzInfQorICAgIGJ1aWxkX3BsYW5uZXIgPSBzZWxmLmNyZWF0ZV9idWlsZF9wbGFubmVyKAorICAgICAgICBidWlsZF9jb250ZXh0PXNlbGYuY3JlYXRlX2J1aWxkX2NvbnRleHQob3B0aW1pemVkX2J1aWxkX2VuYWJsZWQ9RmFsc2UpLAorICAgICAgICBidWlsZF90YXJnZXRzPWJ1aWxkX3RhcmdldHMsCisgICAgKQorCisgICAgYnVpbGRfcGxhbiA9IGJ1aWxkX3BsYW5uZXIuY3JlYXRlX2J1aWxkX3BsYW4oKQorCisgICAgZm9yIHBhY2thZ2luZ19jb21tYW5kIGluIHNlbGYucnVuX3BhY2thZ2luZ19jb21tYW5kcyhidWlsZF9wbGFuKToKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBhY2thZ2luZ19jb21tYW5kKSwgMCkKKworICBkZWYgdGVzdF9idWlsZF9vcHRpbWl6YXRpb25fb25fb3B0aW1pemVzX3RhcmdldChzZWxmKToKKyAgICBidWlsZF90YXJnZXRzID0geyd0YXJnZXRfMScsICd0YXJnZXRfMid9CisgICAgYnVpbGRfcGxhbm5lciA9IHNlbGYuY3JlYXRlX2J1aWxkX3BsYW5uZXIoCisgICAgICAgIGJ1aWxkX3RhcmdldHM9YnVpbGRfdGFyZ2V0cywKKyAgICAgICAgYnVpbGRfY29udGV4dD1zZWxmLmNyZWF0ZV9idWlsZF9jb250ZXh0KAorICAgICAgICAgICAgZW5hYmxlZF9idWlsZF9mZWF0dXJlcz1beyduYW1lJzogc2VsZi5nZXRfdGFyZ2V0X2ZsYWcoJ3RhcmdldF8xJyl9XSwKKyAgICAgICAgICAgIHRlc3RfY29udGV4dD1zZWxmLmdldF90ZXN0X2NvbnRleHQoJ3RhcmdldF8xJyksCisgICAgICAgICksCisgICAgKQorCisgICAgYnVpbGRfcGxhbiA9IGJ1aWxkX3BsYW5uZXIuY3JlYXRlX2J1aWxkX3BsYW4oKQorCisgICAgZXhwZWN0ZWRfdGFyZ2V0cyA9IHtzZWxmLmdldF9vcHRpbWl6ZWRfdGFyZ2V0X25hbWUoJ3RhcmdldF8xJyksICd0YXJnZXRfMid9CisgICAgc2VsZi5hc3NlcnRTZXRFcXVhbChleHBlY3RlZF90YXJnZXRzLCBidWlsZF9wbGFuLmJ1aWxkX3RhcmdldHMpCisKKyAgZGVmIHRlc3RfYnVpbGRfb3B0aW1pemF0aW9uX29uX3BhY2thZ2VzX3RhcmdldChzZWxmKToKKyAgICBidWlsZF90YXJnZXRzID0geyd0YXJnZXRfMScsICd0YXJnZXRfMid9CisgICAgb3B0aW1pemVkX3RhcmdldF9uYW1lID0gc2VsZi5nZXRfb3B0aW1pemVkX3RhcmdldF9uYW1lKCd0YXJnZXRfMScpCisgICAgcGFja2FnaW5nX2NvbW1hbmRzID0gW1tmJ3BhY2thZ2luZyB7b3B0aW1pemVkX3RhcmdldF9uYW1lfSddXQorICAgIGJ1aWxkX3BsYW5uZXIgPSBzZWxmLmNyZWF0ZV9idWlsZF9wbGFubmVyKAorICAgICAgICBidWlsZF90YXJnZXRzPWJ1aWxkX3RhcmdldHMsCisgICAgICAgIGJ1aWxkX2NvbnRleHQ9c2VsZi5jcmVhdGVfYnVpbGRfY29udGV4dCgKKyAgICAgICAgICAgIGVuYWJsZWRfYnVpbGRfZmVhdHVyZXM9W3snbmFtZSc6IHNlbGYuZ2V0X3RhcmdldF9mbGFnKCd0YXJnZXRfMScpfV0sCisgICAgICAgICAgICB0ZXN0X2NvbnRleHQ9c2VsZi5nZXRfdGVzdF9jb250ZXh0KCd0YXJnZXRfMScpLAorICAgICAgICApLAorICAgICAgICBwYWNrYWdpbmdfY29tbWFuZHM9cGFja2FnaW5nX2NvbW1hbmRzLAorICAgICkKKworICAgIGJ1aWxkX3BsYW4gPSBidWlsZF9wbGFubmVyLmNyZWF0ZV9idWlsZF9wbGFuKCkKKworICAgIHNlbGYuYXNzZXJ0SW4ocGFja2FnaW5nX2NvbW1hbmRzLCBzZWxmLnJ1bl9wYWNrYWdpbmdfY29tbWFuZHMoYnVpbGRfcGxhbikpCisKKyAgZGVmIHRlc3RfaW5kaXZpZHVhbF9idWlsZF9vcHRpbWl6YXRpb25fb2ZmX2RvZXNudF9vcHRpbWl6ZShzZWxmKToKKyAgICBidWlsZF90YXJnZXRzID0geyd0YXJnZXRfMScsICd0YXJnZXRfMid9CisgICAgYnVpbGRfcGxhbm5lciA9IHNlbGYuY3JlYXRlX2J1aWxkX3BsYW5uZXIoCisgICAgICAgIGJ1aWxkX3RhcmdldHM9YnVpbGRfdGFyZ2V0cywKKyAgICApCisKKyAgICBidWlsZF9wbGFuID0gYnVpbGRfcGxhbm5lci5jcmVhdGVfYnVpbGRfcGxhbigpCisKKyAgICBzZWxmLmFzc2VydFNldEVxdWFsKGJ1aWxkX3RhcmdldHMsIGJ1aWxkX3BsYW4uYnVpbGRfdGFyZ2V0cykKKworICBkZWYgdGVzdF9pbmRpdmlkdWFsX2J1aWxkX29wdGltaXphdGlvbl9vZmZfZG9lc250X3BhY2thZ2Uoc2VsZik6CisgICAgYnVpbGRfdGFyZ2V0cyA9IHsndGFyZ2V0XzEnLCAndGFyZ2V0XzInfQorICAgIHBhY2thZ2luZ19jb21tYW5kcyA9IFtbJ3BhY2thZ2luZyBjb21tYW5kJ11dCisgICAgYnVpbGRfcGxhbm5lciA9IHNlbGYuY3JlYXRlX2J1aWxkX3BsYW5uZXIoCisgICAgICAgIGJ1aWxkX3RhcmdldHM9YnVpbGRfdGFyZ2V0cywKKyAgICAgICAgcGFja2FnaW5nX2NvbW1hbmRzPXBhY2thZ2luZ19jb21tYW5kcywKKyAgICApCisKKyAgICBidWlsZF9wbGFuID0gYnVpbGRfcGxhbm5lci5jcmVhdGVfYnVpbGRfcGxhbigpCisKKyAgICBmb3IgcGFja2FnaW5nX2NvbW1hbmQgaW4gc2VsZi5ydW5fcGFja2FnaW5nX2NvbW1hbmRzKGJ1aWxkX3BsYW4pOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocGFja2FnaW5nX2NvbW1hbmQpLCAwKQorCisgIGRlZiB0ZXN0X3RhcmdldF9vdXRwdXRfdXNlZF90YXJnZXRfYnVpbHQoc2VsZik6CisgICAgYnVpbGRfdGFyZ2V0ID0gJ3Rlc3RfdGFyZ2V0JworICAgIGJ1aWxkX3BsYW5uZXIgPSBzZWxmLmNyZWF0ZV9idWlsZF9wbGFubmVyKAorICAgICAgICBidWlsZF90YXJnZXRzPXtidWlsZF90YXJnZXR9LAorICAgICAgICBidWlsZF9jb250ZXh0PXNlbGYuY3JlYXRlX2J1aWxkX2NvbnRleHQoCisgICAgICAgICAgICB0ZXN0X2NvbnRleHQ9c2VsZi5nZXRfdGVzdF9jb250ZXh0KGJ1aWxkX3RhcmdldCksCisgICAgICAgICAgICBlbmFibGVkX2J1aWxkX2ZlYXR1cmVzPVt7J25hbWUnOiAndGVzdF90YXJnZXRfdW51c2VkX2V4Y2x1c2lvbid9XSwKKyAgICAgICAgKSwKKyAgICApCisKKyAgICBidWlsZF9wbGFuID0gYnVpbGRfcGxhbm5lci5jcmVhdGVfYnVpbGRfcGxhbigpCisKKyAgICBzZWxmLmFzc2VydFNldEVxdWFsKGJ1aWxkX3BsYW4uYnVpbGRfdGFyZ2V0cywge2J1aWxkX3RhcmdldH0pCisKKyAgZGVmIHRlc3RfdGFyZ2V0X3JlZ2V4X3VzZWRfdGFyZ2V0X2J1aWx0KHNlbGYpOgorICAgIGJ1aWxkX3RhcmdldCA9ICd0ZXN0X3RhcmdldCcKKyAgICB0ZXN0X2NvbnRleHQgPSBzZWxmLmdldF90ZXN0X2NvbnRleHQoYnVpbGRfdGFyZ2V0KQorICAgIHRlc3RfY29udGV4dFsndGVzdEluZm9zJ11bMF1bJ2V4dHJhT3B0aW9ucyddID0gW3sKKyAgICAgICAgJ2tleSc6ICdhZGRpdGlvbmFsLWZpbGVzLWZpbHRlcicsCisgICAgICAgICd2YWx1ZXMnOiBbZicuKntidWlsZF90YXJnZXR9LipcLnppcCddLAorICAgIH1dCisgICAgYnVpbGRfcGxhbm5lciA9IHNlbGYuY3JlYXRlX2J1aWxkX3BsYW5uZXIoCisgICAgICAgIGJ1aWxkX3RhcmdldHM9e2J1aWxkX3RhcmdldH0sCisgICAgICAgIGJ1aWxkX2NvbnRleHQ9c2VsZi5jcmVhdGVfYnVpbGRfY29udGV4dCgKKyAgICAgICAgICAgIHRlc3RfY29udGV4dD10ZXN0X2NvbnRleHQsCisgICAgICAgICAgICBlbmFibGVkX2J1aWxkX2ZlYXR1cmVzPVt7J25hbWUnOiAndGVzdF90YXJnZXRfdW51c2VkX2V4Y2x1c2lvbid9XSwKKyAgICAgICAgKSwKKyAgICApCisKKyAgICBidWlsZF9wbGFuID0gYnVpbGRfcGxhbm5lci5jcmVhdGVfYnVpbGRfcGxhbigpCisKKyAgICBzZWxmLmFzc2VydFNldEVxdWFsKGJ1aWxkX3BsYW4uYnVpbGRfdGFyZ2V0cywge2J1aWxkX3RhcmdldH0pCisKKyAgZGVmIHRlc3RfdGFyZ2V0X291dHB1dF9ub3RfdXNlZF90YXJnZXRfbm90X2J1aWx0KHNlbGYpOgorICAgIGJ1aWxkX3RhcmdldCA9ICd0ZXN0X3RhcmdldCcKKyAgICB0ZXN0X2NvbnRleHQgPSBzZWxmLmdldF90ZXN0X2NvbnRleHQoYnVpbGRfdGFyZ2V0KQorICAgIHRlc3RfY29udGV4dFsndGVzdEluZm9zJ11bMF1bJ2V4dHJhT3B0aW9ucyddID0gW10KKyAgICBidWlsZF9wbGFubmVyID0gc2VsZi5jcmVhdGVfYnVpbGRfcGxhbm5lcigKKyAgICAgICAgYnVpbGRfdGFyZ2V0cz17YnVpbGRfdGFyZ2V0fSwKKyAgICAgICAgYnVpbGRfY29udGV4dD1zZWxmLmNyZWF0ZV9idWlsZF9jb250ZXh0KAorICAgICAgICAgICAgdGVzdF9jb250ZXh0PXRlc3RfY29udGV4dCwKKyAgICAgICAgICAgIGVuYWJsZWRfYnVpbGRfZmVhdHVyZXM9W3snbmFtZSc6ICd0ZXN0X3RhcmdldF91bnVzZWRfZXhjbHVzaW9uJ31dLAorICAgICAgICApLAorICAgICkKKworICAgIGJ1aWxkX3BsYW4gPSBidWlsZF9wbGFubmVyLmNyZWF0ZV9idWlsZF9wbGFuKCkKKworICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWwoYnVpbGRfcGxhbi5idWlsZF90YXJnZXRzLCBzZXQoKSkKKworICBkZWYgdGVzdF90YXJnZXRfcmVnZXhfbWF0Y2hpbmdfbm90X3Rvb19icm9hZChzZWxmKToKKyAgICBidWlsZF90YXJnZXQgPSAndGVzdF90YXJnZXQnCisgICAgdGVzdF9jb250ZXh0ID0gc2VsZi5nZXRfdGVzdF9jb250ZXh0KGJ1aWxkX3RhcmdldCkKKyAgICB0ZXN0X2NvbnRleHRbJ3Rlc3RJbmZvcyddWzBdWydleHRyYU9wdGlvbnMnXSA9IFt7CisgICAgICAgICdrZXknOiAnYWRkaXRpb25hbC1maWxlcy1maWx0ZXInLAorICAgICAgICAndmFsdWVzJzogW2YnLiphe2J1aWxkX3RhcmdldH0uKlwuemlwJ10sCisgICAgfV0KKyAgICBidWlsZF9wbGFubmVyID0gc2VsZi5jcmVhdGVfYnVpbGRfcGxhbm5lcigKKyAgICAgICAgYnVpbGRfdGFyZ2V0cz17YnVpbGRfdGFyZ2V0fSwKKyAgICAgICAgYnVpbGRfY29udGV4dD1zZWxmLmNyZWF0ZV9idWlsZF9jb250ZXh0KAorICAgICAgICAgICAgdGVzdF9jb250ZXh0PXRlc3RfY29udGV4dCwKKyAgICAgICAgICAgIGVuYWJsZWRfYnVpbGRfZmVhdHVyZXM9W3snbmFtZSc6ICd0ZXN0X3RhcmdldF91bnVzZWRfZXhjbHVzaW9uJ31dLAorICAgICAgICApLAorICAgICkKKworICAgIGJ1aWxkX3BsYW4gPSBidWlsZF9wbGFubmVyLmNyZWF0ZV9idWlsZF9wbGFuKCkKKworICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWwoYnVpbGRfcGxhbi5idWlsZF90YXJnZXRzLCBzZXQoKSkKKworICBkZWYgY3JlYXRlX2J1aWxkX3BsYW5uZXIoCisgICAgICBzZWxmLAorICAgICAgYnVpbGRfdGFyZ2V0czogc2V0W3N0cl0sCisgICAgICBidWlsZF9jb250ZXh0OiBCdWlsZENvbnRleHQgPSBOb25lLAorICAgICAgYXJnczogYXJncGFyc2UuTmFtZXNwYWNlID0gTm9uZSwKKyAgICAgIHRhcmdldF9vcHRpbWl6YXRpb25zOiBkaWN0WworICAgICAgICAgIHN0ciwgb3B0aW1pemVkX3RhcmdldHMuT3B0aW1pemVkQnVpbGRUYXJnZXQKKyAgICAgIF0gPSBOb25lLAorICAgICAgcGFja2FnaW5nX2NvbW1hbmRzOiBsaXN0W2xpc3Rbc3RyXV0gPSBbXSwKKyAgKSAtPiBidWlsZF90ZXN0X3N1aXRlcy5CdWlsZFBsYW5uZXI6CisgICAgaWYgbm90IGJ1aWxkX2NvbnRleHQ6CisgICAgICBidWlsZF9jb250ZXh0ID0gc2VsZi5jcmVhdGVfYnVpbGRfY29udGV4dCgpCisgICAgaWYgbm90IGFyZ3M6CisgICAgICBhcmdzID0gc2VsZi5jcmVhdGVfYXJncyhleHRyYV9idWlsZF90YXJnZXRzPWJ1aWxkX3RhcmdldHMpCisgICAgaWYgbm90IHRhcmdldF9vcHRpbWl6YXRpb25zOgorICAgICAgdGFyZ2V0X29wdGltaXphdGlvbnMgPSBzZWxmLmNyZWF0ZV90YXJnZXRfb3B0aW1pemF0aW9ucygKKyAgICAgICAgICBidWlsZF9jb250ZXh0LAorICAgICAgICAgIGJ1aWxkX3RhcmdldHMsCisgICAgICAgICAgcGFja2FnaW5nX2NvbW1hbmRzLAorICAgICAgKQorICAgIHJldHVybiBidWlsZF90ZXN0X3N1aXRlcy5CdWlsZFBsYW5uZXIoCisgICAgICAgIGJ1aWxkX2NvbnRleHQsIGFyZ3MsIHRhcmdldF9vcHRpbWl6YXRpb25zCisgICAgKQorCisgIGRlZiBjcmVhdGVfYnVpbGRfY29udGV4dCgKKyAgICAgIHNlbGYsCisgICAgICBvcHRpbWl6ZWRfYnVpbGRfZW5hYmxlZDogYm9vbCA9IFRydWUsCisgICAgICBlbmFibGVkX2J1aWxkX2ZlYXR1cmVzOiBsaXN0W2RpY3Rbc3RyLCBzdHJdXSA9IFtdLAorICAgICAgdGVzdF9jb250ZXh0OiBkaWN0W3N0ciwgYW55XSA9IHt9LAorICApIC0+IEJ1aWxkQ29udGV4dDoKKyAgICBidWlsZF9jb250ZXh0X2RpY3QgPSB7fQorICAgIGJ1aWxkX2NvbnRleHRfZGljdFsnZW5hYmxlZEJ1aWxkRmVhdHVyZXMnXSA9IGVuYWJsZWRfYnVpbGRfZmVhdHVyZXMKKyAgICBpZiBvcHRpbWl6ZWRfYnVpbGRfZW5hYmxlZDoKKyAgICAgIGJ1aWxkX2NvbnRleHRfZGljdFsnZW5hYmxlZEJ1aWxkRmVhdHVyZXMnXS5hcHBlbmQoCisgICAgICAgICAgeyduYW1lJzogJ29wdGltaXplZF9idWlsZCd9CisgICAgICApCisgICAgYnVpbGRfY29udGV4dF9kaWN0Wyd0ZXN0Q29udGV4dCddID0gdGVzdF9jb250ZXh0CisgICAgcmV0dXJuIEJ1aWxkQ29udGV4dChidWlsZF9jb250ZXh0X2RpY3QpCisKKyAgZGVmIGNyZWF0ZV9hcmdzKAorICAgICAgc2VsZiwgZXh0cmFfYnVpbGRfdGFyZ2V0czogc2V0W3N0cl0gPSBzZXQoKQorICApIC0+IGFyZ3BhcnNlLk5hbWVzcGFjZToKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnZXh0cmFfdGFyZ2V0cycsIG5hcmdzPScqJykKKyAgICByZXR1cm4gcGFyc2VyLnBhcnNlX2FyZ3MoZXh0cmFfYnVpbGRfdGFyZ2V0cykKKworICBkZWYgY3JlYXRlX3RhcmdldF9vcHRpbWl6YXRpb25zKAorICAgICAgc2VsZiwKKyAgICAgIGJ1aWxkX2NvbnRleHQ6IEJ1aWxkQ29udGV4dCwKKyAgICAgIGJ1aWxkX3RhcmdldHM6IHNldFtzdHJdLAorICAgICAgcGFja2FnaW5nX2NvbW1hbmRzOiBsaXN0W2xpc3Rbc3RyXV0gPSBbXSwKKyAgKToKKyAgICB0YXJnZXRfb3B0aW1pemF0aW9ucyA9IGRpY3QoKQorICAgIGZvciB0YXJnZXQgaW4gYnVpbGRfdGFyZ2V0czoKKyAgICAgIHRhcmdldF9vcHRpbWl6YXRpb25zW3RhcmdldF0gPSBmdW5jdG9vbHMucGFydGlhbCgKKyAgICAgICAgICBzZWxmLlRlc3RPcHRpbWl6ZWRCdWlsZFRhcmdldCwKKyAgICAgICAgICBvdXRwdXRfdGFyZ2V0cz17c2VsZi5nZXRfb3B0aW1pemVkX3RhcmdldF9uYW1lKHRhcmdldCl9LAorICAgICAgICAgIHBhY2thZ2luZ19jb21tYW5kcz1wYWNrYWdpbmdfY29tbWFuZHMsCisgICAgICApCisKKyAgICByZXR1cm4gdGFyZ2V0X29wdGltaXphdGlvbnMKKworICBkZWYgZ2V0X3RhcmdldF9mbGFnKHNlbGYsIHRhcmdldDogc3RyKToKKyAgICByZXR1cm4gZid7dGFyZ2V0fV9lbmFibGVkJworCisgIGRlZiBnZXRfb3B0aW1pemVkX3RhcmdldF9uYW1lKHNlbGYsIHRhcmdldDogc3RyKToKKyAgICByZXR1cm4gZid7dGFyZ2V0fV9vcHRpbWl6ZWQnCisKKyAgZGVmIGdldF90ZXN0X2NvbnRleHQoc2VsZiwgdGFyZ2V0OiBzdHIpOgorICAgIHJldHVybiB7CisgICAgICAgICd0ZXN0SW5mb3MnOiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJ25hbWUnOiAnYXRwX3Rlc3QnLAorICAgICAgICAgICAgICAgICd0YXJnZXQnOiAndGVzdF90YXJnZXQnLAorICAgICAgICAgICAgICAgICdicmFuY2gnOiAnYnJhbmNoJywKKyAgICAgICAgICAgICAgICAnZXh0cmFPcHRpb25zJzogW3sKKyAgICAgICAgICAgICAgICAgICAgJ2tleSc6ICdhZGRpdGlvbmFsLWZpbGVzLWZpbHRlcicsCisgICAgICAgICAgICAgICAgICAgICd2YWx1ZXMnOiBbZid7dGFyZ2V0fS56aXAnXSwKKyAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgICAgICAnY29tbWFuZCc6ICcvdGYvY29tbWFuZCcsCisgICAgICAgICAgICAgICAgJ2V4dHJhQnVpbGRUYXJnZXRzJzogWworICAgICAgICAgICAgICAgICAgICAnZXh0cmFfYnVpbGRfdGFyZ2V0JywKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgfSwKKyAgICAgICAgXSwKKyAgICB9CisKKyAgZGVmIHJ1bl9wYWNrYWdpbmdfY29tbWFuZHMoc2VsZiwgYnVpbGRfcGxhbjogYnVpbGRfdGVzdF9zdWl0ZXMuQnVpbGRQbGFuKToKKyAgICByZXR1cm4gWworICAgICAgICBwYWNrYWdpbmdfY29tbWFuZF9nZXR0ZXIoKQorICAgICAgICBmb3IgcGFja2FnaW5nX2NvbW1hbmRfZ2V0dGVyIGluIGJ1aWxkX3BsYW4ucGFja2FnaW5nX2NvbW1hbmRzX2dldHRlcnMKKyAgICBdCisKKworZGVmIHdhaXRfdW50aWwoCisgICAgY29uZGl0aW9uX2Z1bmN0aW9uOiBDYWxsYWJsZVtbXSwgYm9vbF0sCisgICAgdGltZW91dF9zZWNzOiBmbG9hdCA9IDMuMCwKKyAgICBwb2xsaW5nX2ludGVydmFsX3NlY3M6IGZsb2F0ID0gMC4xLAorKToKKyAgIiIiV2FpdHMgdW50aWwgYSBjb25kaXRpb24gZnVuY3Rpb24gcmV0dXJucyBUcnVlLiIiIgorCisgIHN0YXJ0X3RpbWVfc2VjcyA9IHRpbWUudGltZSgpCisKKyAgd2hpbGUgbm90IGNvbmRpdGlvbl9mdW5jdGlvbigpOgorICAgIGlmIHRpbWUudGltZSgpIC0gc3RhcnRfdGltZV9zZWNzID4gdGltZW91dF9zZWNzOgorICAgICAgcmFpc2UgVGltZW91dEVycm9yKAorICAgICAgICAgIGYnQ29uZGl0aW9uIG5vdCBtZXQgd2l0aGluIHRpbWVvdXQ6IHt0aW1lb3V0X3NlY3N9IHNlY29uZHMnCisgICAgICApCisKKyAgICB0aW1lLnNsZWVwKHBvbGxpbmdfaW50ZXJ2YWxfc2VjcykKKworCitkZWYgcmVhZF9maWxlX2NvbnRlbnRzKGZpbGU6IHBhdGhsaWIuUGF0aCkgLT4gc3RyOgorICB3aXRoIG9wZW4oZmlsZSwgJ3InKSBhcyBmOgorICAgIHJldHVybiBmLnJlYWQoKQorCisKK2RlZiByZWFkX2V2ZW50dWFsX2ZpbGVfY29udGVudHMoZmlsZTogcGF0aGxpYi5QYXRoKSAtPiBzdHI6CisgIHdhaXRfdW50aWwobGFtYmRhOiBmaWxlLmlzX2ZpbGUoKSBhbmQgZmlsZS5zdGF0KCkuc3Rfc2l6ZSA+IDApCisgIHJldHVybiByZWFkX2ZpbGVfY29udGVudHMoZmlsZSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBjaV90ZXN0X2xpYi5tYWluKCkKZGlmZiAtLWdpdCBhL2NpL2J1aWxkYm90LnB5IGIvY2kvYnVpbGRib3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcwOTdiZQotLS0gL2Rldi9udWxsCisrKyBiL2NpL2J1aWxkYm90LnB5CkBAIC0wLDAgKzEsNDMgQEAKKyMgQ29weXJpZ2h0IDIwMjQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIiIiVXRpbGl0aWVzIGZvciBpbnRlcmFjdGluZyB3aXRoIGJ1aWxkYm90LCB3aXRoIGEgc2ltdWxhdGlvbiBpbiBhIGxvY2FsIGVudmlyb25tZW50IiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCisjIENoZWNrIHRoYXQgdGhlIHNjcmlwdCBpcyBydW5uaW5nIGZyb20gdGhlIHJvb3Qgb2YgdGhlIHRyZWUuIFByZXZlbnRzIHN1YnRsZQorIyBlcnJvcnMgbGF0ZXIsIGFuZCBDSSBhbHdheXMgcnVucyBmcm9tIHRoZSByb290IG9mIHRoZSB0cmVlLgoraWYgbm90IG9zLnBhdGguZXhpc3RzKCJidWlsZC9tYWtlL2NpL2J1aWxkYm90LnB5Iik6CisgICAgcmFpc2UgRXhjZXB0aW9uKCJDSSBzY3JpcHQgbXVzdCBiZSBydW4gZnJvbSB0aGUgcm9vdCBvZiB0aGUgdHJlZSBpbnN0ZWFkIG9mOiAiCisgICAgICAgICAgICAgICAgICAgICsgb3MuZ2V0Y3dkKCkpCisKKyMgQ2hlY2sgdGhhdCB3ZSBhcmUgdXNpbmcgdGhlIGhlcm1ldGljIGludGVycHJldGVyCitpZiAicHJlYnVpbHRzL2J1aWxkLXRvb2xzLyIgbm90IGluIHN5cy5leGVjdXRhYmxlOgorICAgIHJhaXNlIEV4Y2VwdGlvbigiQ0kgc2NyaXB0IG11c3QgYmUgcnVuIHVzaW5nIHRoZSBoZXJtZXRpYyBpbnRlcnByZXRlciBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAgKyAicHJlYnVpbHRzL2J1aWxkLXRvb2xzIGluc3RlYWQgb2Y6ICIgKyBzeXMuZXhlY3V0YWJsZSkKKworCitkZWYgT3V0RGlyKCk6CisgICAgIkdldCB0aGUgb3V0IGRpcmVjdG9yeS4gV2lsbCBjcmVhdGUgaXQgaWYgbmVlZGVkLiIKKyAgICByZXN1bHQgPSBvcy5lbnZpcm9uLmdldCgiT1VUX0RJUiIsICJvdXQiKQorICAgIG9zLm1ha2VkaXJzKHJlc3VsdCwgZXhpc3Rfb2s9VHJ1ZSkKKyAgICByZXR1cm4gcmVzdWx0CisKK2RlZiBEaXN0RGlyKCk6CisgICAgIkdldCB0aGUgZGlzdCBkaXJlY3RvcnkuIFdpbGwgY3JlYXRlIGl0IGlmIG5lZWRlZC4iCisgICAgcmVzdWx0ID0gb3MuZW52aXJvbi5nZXQoIkRJU1RfRElSIiwgb3MucGF0aC5qb2luKE91dERpcigpLCAiZGlzdCIpKQorICAgIG9zLm1ha2VkaXJzKHJlc3VsdCwgZXhpc3Rfb2s9VHJ1ZSkKKyAgICByZXR1cm4gcmVzdWx0CisKZGlmZiAtLWdpdCBhL2NpL2NpX3Rlc3RfbGliLnB5IGIvY2kvY2lfdGVzdF9saWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ3MGQzZgotLS0gL2Rldi9udWxsCisrKyBiL2NpL2NpX3Rlc3RfbGliLnB5CkBAIC0wLDAgKzEsODYgQEAKKyMgQ29weXJpZ2h0IDIwMjQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIiIiVGVzdGluZyB1dGlsaXRpZXMgZm9yIHRlc3RzIGluIHRoZSBDSSBwYWNrYWdlLiIiIgorCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgcGF0aGxpYgoraW1wb3J0IHNodXRpbAoraW1wb3J0IHRlbXBmaWxlCisKKworIyBFeHBvcnQgdGhlIFRlc3RDYXNlIGNsYXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGltcG9ydHMgdGVzdHMgaGF2ZSB0byBsaXN0LgorVGVzdENhc2UgPSB1bml0dGVzdC5UZXN0Q2FzZQorCisKK2RlZiBwcm9jZXNzX2FsaXZlKHBpZCk6CisgICIiIkNoZWNrIEZvciB0aGUgZXhpc3RlbmNlIG9mIGEgcGlkLiIiIgorCisgIHRyeToKKyAgICBvcy5raWxsKHBpZCwgMCkKKyAgZXhjZXB0IE9TRXJyb3I6CisgICAgcmV0dXJuIEZhbHNlCisKKyAgcmV0dXJuIFRydWUKKworCitjbGFzcyBUZW1wb3JhcnlQcm9jZXNzU2Vzc2lvbjoKKworICBkZWYgX19pbml0X18oc2VsZiwgdGVzdF9jYXNlOiBUZXN0Q2FzZSk6CisgICAgc2VsZi5fY3JlYXRlZF9wcm9jZXNzZXMgPSBbXQorICAgIHRlc3RfY2FzZS5hZGRDbGVhbnVwKHNlbGYuY2xlYW51cCkKKworICBkZWYgY3JlYXRlKHNlbGYsIGFyZ3MsIGt3YXJncyk6CisgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oKmFyZ3MsICoqa3dhcmdzLCBzdGFydF9uZXdfc2Vzc2lvbj1UcnVlKQorICAgIHNlbGYuX2NyZWF0ZWRfcHJvY2Vzc2VzLmFwcGVuZChwKQorICAgIHJldHVybiBwCisKKyAgZGVmIGNsZWFudXAoc2VsZik6CisgICAgZm9yIHAgaW4gc2VsZi5fY3JlYXRlZF9wcm9jZXNzZXM6CisgICAgICBpZiBub3QgcHJvY2Vzc19hbGl2ZShwLnBpZCk6CisgICAgICAgIHJldHVybgorICAgICAgb3Mua2lsbHBnKG9zLmdldHBnaWQocC5waWQpLCBzaWduYWwuU0lHS0lMTCkKKworCitjbGFzcyBUZXN0VGVtcG9yYXJ5RGlyZWN0b3J5OgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBkZWxldGU6IGJvb2wsICk6CisgICAgc2VsZi5fZGVsZXRlID0gZGVsZXRlCisKKyAgQGNsYXNzbWV0aG9kCisgIGRlZiBjcmVhdGUoY2xzLCB0ZXN0X2Nhc2U6IFRlc3RDYXNlLCBkZWxldGU6IGJvb2wgPSBUcnVlKToKKyAgICB0ZW1wX2RpciA9IFRlc3RUZW1wb3JhcnlEaXJlY3RvcnkoZGVsZXRlKQorICAgIHRlbXBfZGlyLl9kaXIgPSBwYXRobGliLlBhdGgodGVtcGZpbGUubWtkdGVtcCgpKQorICAgIHRlc3RfY2FzZS5hZGRDbGVhbnVwKHRlbXBfZGlyLmNsZWFudXApCisgICAgcmV0dXJuIHRlbXBfZGlyLl9kaXIKKworICBkZWYgZ2V0X2RpcihzZWxmKToKKyAgICByZXR1cm4gc2VsZi5fZGlyCisKKyAgZGVmIGNsZWFudXAoc2VsZik6CisgICAgaWYgbm90IHNlbGYuX2RlbGV0ZToKKyAgICAgIHJldHVybgorICAgIHNodXRpbC5ybXRyZWUoc2VsZi5fZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpCisKKworZGVmIG1haW4oKToKKworICAjIERpc2FibGUgbG9nZ2luZyBzaW5jZSBpdCBicmVha3MgdGhlIFRGIFB5dGhvbiB0ZXN0IG91dHB1dCBwYXJzZXIuCisgICMgVE9ETyhoemFsZWspOiBVc2UgVEYncyBgdGVzdC1vdXRwdXQtZmlsZWAgb3B0aW9uIHRvIHJlLWVuYWJsZSBsb2dnaW5nLgorICBsb2dnaW5nLmdldExvZ2dlcigpLmRpc2FibGVkID0gVHJ1ZQorCisgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvY2kvZHVtcF9wcm9kdWN0X2NvbmZpZyBiL2NpL2R1bXBfcHJvZHVjdF9jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzdiNTFkZAotLS0gL2Rldi9udWxsCisrKyBiL2NpL2R1bXBfcHJvZHVjdF9jb25maWcKQEAgLTAsMCArMSwzNTMgQEAKKyMhcHJlYnVpbHRzL2J1aWxkLXRvb2xzL2xpbnV4LXg4Ni9iaW4vcHkzLWNtZCAtQgorCisjIENvcHlyaWdodCAyMDI0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyIiIlNjcmlwdCB0byBjb2xsZWN0IGFsbCBvZiB0aGUgbWFrZSB2YXJpYWJsZXMgZnJvbSBhbGwgcHJvZHVjdCBjb25maWcgY29tYm9zLgorCitUaGlzIHNjcmlwdCBtdXN0IGJlIHJ1biBmcm9tIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKworU2VlIEdldEFyZ3MoKSBiZWxvdyBvciBydW4gZHVtcF9wcm9kdWN0X2NvbmZpZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyIiIgorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBhc3luY2lvCitpbXBvcnQgY29udGV4dGxpYgoraW1wb3J0IGNzdgoraW1wb3J0IGRhdGFjbGFzc2VzCitpbXBvcnQganNvbgoraW1wb3J0IG11bHRpcHJvY2Vzc2luZworaW1wb3J0IG9zCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2Zyb20gdHlwaW5nIGltcG9ydCBMaXN0LCBEaWN0LCBUdXBsZSwgT3B0aW9uYWwKKworaW1wb3J0IGJ1aWxkYm90CisKKyMgV2UgaGF2ZSBzb21lIEJJRyB2YXJpYWJsZXMKK2Nzdi5maWVsZF9zaXplX2xpbWl0KHN5cy5tYXhzaXplKQorCisKK2NsYXNzIERhdGFjbGFzc0pTT05FbmNvZGVyKGpzb24uSlNPTkVuY29kZXIpOgorICAgICIiIkpTT05FbmNvZGVyIGZvciBvdXIgY3VzdG9tIHR5cGVzLiIiIgorICAgIGRlZiBkZWZhdWx0KHNlbGYsIG8pOgorICAgICAgICBpZiBkYXRhY2xhc3Nlcy5pc19kYXRhY2xhc3Mobyk6CisgICAgICAgICAgICByZXR1cm4gZGF0YWNsYXNzZXMuYXNkaWN0KG8pCisgICAgICAgIHJldHVybiBzdXBlcigpLmRlZmF1bHQobykKKworCitkZWYgR2V0UHJvZHVjdHMoKToKKyAgICAiIiJHZXQgdGhlIGFsbCBvZiB0aGUgYXZhaWxhYmxlIFRBUkdFVF9QUk9EVUNUIHZhbHVlcy4iIiIKKyAgICB0cnk6CisgICAgICAgIHN0ZG91dCA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KFsiYnVpbGQvc29vbmcvYmluL2xpc3RfcHJvZHVjdHMiXSwgdGV4dD1UcnVlKQorICAgIGV4Y2VwdCBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcjoKKyAgICAgICAgc3lzLmV4aXQoMSkKKyAgICByZXR1cm4gW3Muc3RyaXAoKSBmb3IgcyBpbiBzdGRvdXQuc3BsaXRsaW5lcygpIGlmIHMuc3RyaXAoKV0KKworCitkZWYgR2V0UmVsZWFzZXMocHJvZHVjdCk6CisgICAgIiIiRm9yIGEgZ2l2ZW4gcHJvZHVjdCwgZ2V0IHRoZSByZWxlYXNlIGNvbmZpZ3MgYXZhaWxhYmxlIHRvIGl0LiIiIgorICAgIGlmIFRydWU6CisgICAgICAgICMgSGFyZCBjb2RlIHRoZSBsaXN0CisgICAgICAgIG1haW5saW5lX3Byb2R1Y3RzID0gWworICAgICAgICAgICAgIm1vZHVsZV9hcm0iLAorICAgICAgICAgICAgIm1vZHVsZV94ODYiLAorICAgICAgICAgICAgIm1vZHVsZV9hcm02NCIsCisgICAgICAgICAgICAibW9kdWxlX3Jpc2N2NjQiLAorICAgICAgICAgICAgIm1vZHVsZV94ODZfNjQiLAorICAgICAgICAgICAgIm1vZHVsZV9hcm02NG9ubHkiLAorICAgICAgICAgICAgIm1vZHVsZV94ODZfNjRvbmx5IiwKKyAgICAgICAgXQorICAgICAgICBpZiBwcm9kdWN0IGluIG1haW5saW5lX3Byb2R1Y3RzOgorICAgICAgICAgICAgcmV0dXJuIFsidHJ1bmtfc3RhZ2luZyIsICJ0cnVuayIsICJtYWlubGluZSJdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gWyJ0cnVua19zdGFnaW5nIiwgInRydW5rIiwgIm5leHQiXQorICAgIGVsc2U6CisgICAgICAgICMgR2V0IGl0IGZyb20gdGhlIGJ1aWxkIHN5c3RlbQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzdGRvdXQgPSBzdWJwcm9jZXNzLmNoZWNrX291dHB1dChbImJ1aWxkL3Nvb25nL2Jpbi9saXN0X3JlbGVhc2VzIiwgcHJvZHVjdF0sIHRleHQ9VHJ1ZSkKKyAgICAgICAgZXhjZXB0IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yOgorICAgICAgICAgICAgc3lzLmV4aXQoMSkKKyAgICAgICAgcmV0dXJuIFtzLnN0cmlwKCkgZm9yIHMgaW4gc3Rkb3V0LnNwbGl0bGluZXMoKSBpZiBzLnN0cmlwKCldCisKKworZGVmIEdlbmVyYXRlQWxsTHVuY2hUYXJnZXRzKCk6CisgICAgIiIiR2VuZXJhdGUgdGhlIGZ1bGwgbGlzdCBvZiBsdW5jaCB0YXJnZXRzLiIiIgorICAgIGZvciBwcm9kdWN0IGluIEdldFByb2R1Y3RzKCk6CisgICAgICAgIGZvciByZWxlYXNlIGluIEdldFJlbGVhc2VzKHByb2R1Y3QpOgorICAgICAgICAgICAgZm9yIHZhcmlhbnQgaW4gWyJ1c2VyIiwgInVzZXJkZWJ1ZyIsICJlbmciXToKKyAgICAgICAgICAgICAgICB5aWVsZCAocHJvZHVjdCwgcmVsZWFzZSwgdmFyaWFudCkKKworCithc3luYyBkZWYgUGFyYWxsZWxFeGVjKHBhcmFsbGVsaXNtLCB0YXNrcyk6CisgICAgJycnCisgICAgUGFyYWxsZWxFeGVjIHRha2VzIGEgcGFyYWxsZWxpc20gbnVtYmVyLCBhbmQgYW4gaXRlcmF0b3Igb2YgdGFza3MgdG8gcnVuLgorICAgIFRoZW4gaXQgd2lsbCBydW4gYWxsIHRoZSB0YXNrcywgYnV0IGEgbWF4aW11bSBvZiBwYXJhbGxlbGlzbSB3aWxsIGJlIHJ1biBhdAorICAgIGFueSBnaXZlbiB0aW1lLiBUaGUgdGFza3MgbXVzdCBiZSBhc3luYyBmdW5jdGlvbnMgdGhhdCBhY2NlcHQgb25lIGFyZ3VtZW50LAorICAgIHdoaWNoIHdpbGwgYmUgYW4gaW50ZWdlciBpZCBvZiB0aGUgd29ya2VyIHRoYXQgdGhleSdyZSBydW5uaW5nIG9uLgorICAgICcnJworICAgIHRhc2tzID0gaXRlcih0YXNrcykKKworICAgIG92ZXJhbGxfc3RhcnQgPSB0aW1lLm1vbm90b25pYygpCisgICAgIyBsaXN0cyBzbyB0aGV5IGNhbiBiZSBtb2RpZmllZCBmcm9tIHRoZSBpbm5lciBmdW5jdGlvbgorICAgIHRvdGFsX2R1cmF0aW9uID0gWzBdCisgICAgY291bnQgPSBbMF0KKyAgICBhc3luYyBkZWYgZGlzcGF0Y2god29ya2VyKToKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0YXNrID0gbmV4dCh0YXNrcykKKyAgICAgICAgICAgICAgICBpdGVtX3N0YXJ0ID0gdGltZS5tb25vdG9uaWMoKQorICAgICAgICAgICAgICAgIGF3YWl0IHRhc2sod29ya2VyKQorICAgICAgICAgICAgICAgIG5vdyA9IHRpbWUubW9ub3RvbmljKCkKKyAgICAgICAgICAgICAgICBpdGVtX2R1cmF0aW9uID0gbm93IC0gaXRlbV9zdGFydAorICAgICAgICAgICAgICAgIGNvdW50WzBdICs9IDEKKyAgICAgICAgICAgICAgICB0b3RhbF9kdXJhdGlvblswXSArPSBpdGVtX2R1cmF0aW9uCisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZShmIlRpbWluZzogSXRlbXMgcHJvY2Vzc2VkOiB7Y291bnRbMF19LCBXYWxsIHRpbWU6IHtub3ctb3ZlcmFsbF9zdGFydDowLjFmfSBzZWMsIFRocm91Z2hwdXQ6IHsobm93LW92ZXJhbGxfc3RhcnQpL2NvdW50WzBdOjAuM2Z9IHNlYyBwZXIgaXRlbSwgQXZlcmFnZSBkdXJhdGlvbjoge3RvdGFsX2R1cmF0aW9uWzBdL2NvdW50WzBdOjAuMWZ9IHNlY1xuIikKKyAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgYXdhaXQgYXN5bmNpby5nYXRoZXIoKltkaXNwYXRjaCh3b3JrZXIpIGZvciB3b3JrZXIgaW4gcmFuZ2UocGFyYWxsZWxpc20pXSkKKworCithc3luYyBkZWYgRHVtcFByb2R1Y3RDb25maWdzKG91dCwgZ2VuZXJhdG9yLCBvdXRfZGlyKToKKyAgICAiIiJDb2xsZWN0cyBhbGwgb2YgdGhlIHByb2R1Y3QgY29uZmlnIGRhdGEgYW5kIHN0b3JlIGl0IGluIGZpbGUuIiIiCisgICAgIyBXcml0ZSB0aGUgb3V0ZXIganNvbiBsaXN0IGJ5IGhhbmQgc28gd2UgY2FuIHN0cmVhbSBpdAorICAgIG91dC53cml0ZSgiWyIpCisgICAgdHJ5OgorICAgICAgICBmaXJzdF9yZXN1bHQgPSBbVHJ1ZV0gIyBhIGxpc3Qgc28gaXQgY2FuIGJlIG1vZGlmaWVkIGZyb20gdGhlIGlubmVyIGZ1bmN0aW9uCisgICAgICAgIGRlZiBydW4obHVuY2gpOgorICAgICAgICAgICAgYXN5bmMgZGVmIGN1cnJpZWQod29ya2VyKToKKyAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKGYicnVubmluZzogeyctJy5qb2luKGx1bmNoKX1cbiIpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgRHVtcE9uZVByb2R1Y3RDb25maWcobHVuY2gsIG9zLnBhdGguam9pbihvdXRfZGlyLCBmImx1bmNoYWJsZV97d29ya2VyfSIpKQorICAgICAgICAgICAgICAgIGlmIGZpcnN0X3Jlc3VsdFswXToKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCJcbiIpCisgICAgICAgICAgICAgICAgICAgIGZpcnN0X3Jlc3VsdFswXSA9IEZhbHNlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCIsXG4iKQorICAgICAgICAgICAgICAgIHJlc3VsdC5kdW1wVG9GaWxlKG91dCkKKyAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKGYiZmluaXNoZWQ6IHsnLScuam9pbihsdW5jaCl9XG4iKQorICAgICAgICAgICAgcmV0dXJuIGN1cnJpZWQKKworICAgICAgICBhd2FpdCBQYXJhbGxlbEV4ZWMobXVsdGlwcm9jZXNzaW5nLmNwdV9jb3VudCgpLCAocnVuKGx1bmNoKSBmb3IgbHVuY2ggaW4gZ2VuZXJhdG9yKSkKKyAgICBmaW5hbGx5OgorICAgICAgICAjIENsb3NlIHRoZSBqc29uIHJlZ2FyZGxlc3Mgb2YgaG93IHdlIGV4aXQKKyAgICAgICAgb3V0LndyaXRlKCJcbl1cbiIpCisKKworQGRhdGFjbGFzc2VzLmRhdGFjbGFzcyhmcm96ZW49VHJ1ZSkKK2NsYXNzIFZhcmlhYmxlOgorICAgICIiIkEgdmFyaWFibGUgbmFtZSwgdmFsdWUgYW5kIHdoZXJlIGl0IHdhcyBzZXQuIiIiCisgICAgbmFtZTogc3RyCisgICAgdmFsdWU6IHN0cgorICAgIGxvY2F0aW9uOiBzdHIKKworCitAZGF0YWNsYXNzZXMuZGF0YWNsYXNzKGZyb3plbj1UcnVlKQorY2xhc3MgUHJvZHVjdFJlc3VsdDoKKyAgICBwcm9kdWN0OiBzdHIKKyAgICByZWxlYXNlOiBzdHIKKyAgICB2YXJpYW50OiBzdHIKKyAgICBib2FyZF9pbmNsdWRlczogTGlzdFtzdHJdCisgICAgcHJvZHVjdF9pbmNsdWRlczogRGljdFtzdHIsIExpc3Rbc3RyXV0KKyAgICBwcm9kdWN0X2dyYXBoOiBMaXN0W1R1cGxlW3N0ciwgc3RyXV0KKyAgICBib2FyZF92YXJzOiBMaXN0W1ZhcmlhYmxlXQorICAgIHByb2R1Y3RfdmFyczogTGlzdFtWYXJpYWJsZV0KKworICAgIGRlZiBkdW1wVG9GaWxlKHNlbGYsIGYpOgorICAgICAgICBqc29uLmR1bXAoc2VsZiwgZiwgc29ydF9rZXlzPVRydWUsIGluZGVudD0yLCBjbHM9RGF0YWNsYXNzSlNPTkVuY29kZXIpCisKKworQGRhdGFjbGFzc2VzLmRhdGFjbGFzcyhmcm96ZW49VHJ1ZSkKK2NsYXNzIFByb2R1Y3RFcnJvcjoKKyAgICBwcm9kdWN0OiBzdHIKKyAgICByZWxlYXNlOiBzdHIKKyAgICB2YXJpYW50OiBzdHIKKyAgICBlcnJvcjogc3RyCisKKyAgICBkZWYgZHVtcFRvRmlsZShzZWxmLCBmKToKKyAgICAgICAganNvbi5kdW1wKHNlbGYsIGYsIHNvcnRfa2V5cz1UcnVlLCBpbmRlbnQ9MiwgY2xzPURhdGFjbGFzc0pTT05FbmNvZGVyKQorCisKK2RlZiBOb3JtYWxpemVJbmhlcml0R3JhcGgobGlzdHMpOgorICAgICIiIkZsYXR0ZW4gdGhlIGluaGVyaXRhbmNlIGdyYXBoIHRvIGEgc2ltcGxlIGxpc3QgZm9yIGVhc2llciBxdWVyeWluZy4iIiIKKyAgICByZXN1bHQgPSBzZXQoKQorICAgIGZvciBpdGVtIGluIGxpc3RzOgorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oaXRlbSkpOgorICAgICAgICAgICAgcmVzdWx0LmFkZCgoaXRlbVtpKzFdIGlmIGkgPCBsZW4oaXRlbSktMSBlbHNlICIiLCBpdGVtW2ldKSkKKyAgICByZXR1cm4gc29ydGVkKGxpc3QocmVzdWx0KSkKKworCitkZWYgUGFyc2VEdW1wKGx1bmNoLCBmaWxlbmFtZSkgLT4gUHJvZHVjdFJlc3VsdDoKKyAgICAiIiJQYXJzZXMgdGhlIGNzdiBhbmQgcmV0dXJucyBhIHR1cGxlIG9mIHRoZSBkYXRhLiIiIgorICAgIGRlZiBkaWZmKGluaXRpYWwsIGZpbmFsKToKKyAgICAgICAgcmV0dXJuIFthZnRlciBmb3IgYWZ0ZXIgaW4gZmluYWwudmFsdWVzKCkgaWYKKyAgICAgICAgICAgICAgICBpbml0aWFsLmdldChhZnRlci5uYW1lLCBWYXJpYWJsZShhZnRlci5uYW1lLCAiIiwgIjx1bnNldD4iKSkudmFsdWUgIT0gYWZ0ZXIudmFsdWVdCisgICAgcHJvZHVjdF9pbml0aWFsID0ge30KKyAgICBwcm9kdWN0X2ZpbmFsID0ge30KKyAgICBib2FyZF9pbml0aWFsID0ge30KKyAgICBib2FyZF9maW5hbCA9IHt9CisgICAgaW5oZXJpdF9wcm9kdWN0ID0gW10gIyBUaGUgc3RhY2sgb2YgaW5oZXJpdC1wcm9kdWN0IGNhbGxzCisgICAgcHJvZHVjdF9pbmNsdWRlcyA9IHt9ICMgT3RoZXIgZmlsZXMgaW5jbHVkZWQgYnkgZWFjaCBvZiB0aGUgcHJvcGVybHkgaW1wb3J0ZWQgZmlsZXMKKyAgICBib2FyZF9pbmNsdWRlcyA9IFtdICMgRmlsZXMgaW5jbHVkZWQgYnkgYm9hcmRjb25maWcKKyAgICB3aXRoIG9wZW4oZmlsZW5hbWUpIGFzIGY6CisgICAgICAgIHBoYXNlID0gIiIKKyAgICAgICAgZm9yIGxpbmUgaW4gY3N2LnJlYWRlcihmKToKKyAgICAgICAgICAgIGlmIGxpbmVbMF0gPT0gInBoYXNlIjoKKyAgICAgICAgICAgICAgICBwaGFzZSA9IGxpbmVbMV0KKyAgICAgICAgICAgIGVsaWYgbGluZVswXSA9PSAidmFsIjoKKyAgICAgICAgICAgICAgICAjIFRPT0Q6IFdlIHNob3VsZCBza2lwIHRoZXNlIHNvbWV3aGVyZSBlbHNlLgorICAgICAgICAgICAgICAgIGlmIGxpbmVbM10uc3RhcnRzd2l0aCgiX0FMTF9SRUxFQVNFX0ZMQUdTIik6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgbGluZVszXS5zdGFydHN3aXRoKCJQUk9EVUNUUy4iKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBwaGFzZSA9PSAiUFJPRFVDVFMiOgorICAgICAgICAgICAgICAgICAgICBpZiBsaW5lWzJdID09ICJpbml0aWFsIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RfaW5pdGlhbFtsaW5lWzNdXSA9IFZhcmlhYmxlKGxpbmVbM10sIGxpbmVbNF0sIGxpbmVbNV0pCisgICAgICAgICAgICAgICAgaWYgcGhhc2UgPT0gIlBST0RVQ1QtRVhQQU5EIjoKKyAgICAgICAgICAgICAgICAgICAgaWYgbGluZVsyXSA9PSAiZmluYWwiOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9maW5hbFtsaW5lWzNdXSA9IFZhcmlhYmxlKGxpbmVbM10sIGxpbmVbNF0sIGxpbmVbNV0pCisgICAgICAgICAgICAgICAgaWYgcGhhc2UgPT0gIkJPQVJEIjoKKyAgICAgICAgICAgICAgICAgICAgaWYgbGluZVsyXSA9PSAiaW5pdGlhbCI6CisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZF9pbml0aWFsW2xpbmVbM11dID0gVmFyaWFibGUobGluZVszXSwgbGluZVs0XSwgbGluZVs1XSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbGluZVsyXSA9PSAiZmluYWwiOgorICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRfZmluYWxbbGluZVszXV0gPSBWYXJpYWJsZShsaW5lWzNdLCBsaW5lWzRdLCBsaW5lWzVdKQorICAgICAgICAgICAgZWxpZiBsaW5lWzBdID09ICJpbXBvcnRlZCI6CisgICAgICAgICAgICAgICAgaW1wb3J0cyA9IFtzLnN0cmlwKCkgZm9yIHMgaW4gbGluZVsxXS5zcGxpdCgpXQorICAgICAgICAgICAgICAgIGlmIGltcG9ydHM6CisgICAgICAgICAgICAgICAgICAgIGluaGVyaXRfcHJvZHVjdC5hcHBlbmQoaW1wb3J0cykKKyAgICAgICAgICAgICAgICAgICAgaW5jID0gW3Muc3RyaXAoKSBmb3IgcyBpbiBsaW5lWzJdLnNwbGl0KCldCisgICAgICAgICAgICAgICAgICAgIGZvciBmIGluIGluYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RfaW5jbHVkZXMuc2V0ZGVmYXVsdChpbXBvcnRzWzBdLCBbXSkuYXBwZW5kKGYpCisgICAgICAgICAgICBlbGlmIGxpbmVbMF0gPT0gImJvYXJkX2NvbmZpZ19maWxlcyI6CisgICAgICAgICAgICAgICAgYm9hcmRfaW5jbHVkZXMgKz0gW3Muc3RyaXAoKSBmb3IgcyBpbiBsaW5lWzFdLnNwbGl0KCldCisgICAgcmV0dXJuIFByb2R1Y3RSZXN1bHQoCisgICAgICAgIHByb2R1Y3QgPSBsdW5jaFswXSwKKyAgICAgICAgcmVsZWFzZSA9IGx1bmNoWzFdLAorICAgICAgICB2YXJpYW50ID0gbHVuY2hbMl0sCisgICAgICAgIHByb2R1Y3RfdmFycyA9IGRpZmYocHJvZHVjdF9pbml0aWFsLCBwcm9kdWN0X2ZpbmFsKSwKKyAgICAgICAgYm9hcmRfdmFycyA9IGRpZmYoYm9hcmRfaW5pdGlhbCwgYm9hcmRfZmluYWwpLAorICAgICAgICBwcm9kdWN0X2dyYXBoID0gTm9ybWFsaXplSW5oZXJpdEdyYXBoKGluaGVyaXRfcHJvZHVjdCksCisgICAgICAgIHByb2R1Y3RfaW5jbHVkZXMgPSBwcm9kdWN0X2luY2x1ZGVzLAorICAgICAgICBib2FyZF9pbmNsdWRlcyA9IGJvYXJkX2luY2x1ZGVzCisgICAgKQorCisKK2FzeW5jIGRlZiBEdW1wT25lUHJvZHVjdENvbmZpZyhsdW5jaCwgb3V0X2RpcikgLT4gUHJvZHVjdFJlc3VsdCB8IFByb2R1Y3RFcnJvcjoKKyAgICAiIiJQcmludCBhIHNpbmdsZSBjb25maWcncyBsdW5jaCBpbmZvIHRvIHN0ZG91dC4iIiIKKyAgICBwcm9kdWN0LCByZWxlYXNlLCB2YXJpYW50ID0gbHVuY2gKKworICAgIGR1bXBjb25maWdfZmlsZSA9IG9zLnBhdGguam9pbihvdXRfZGlyLCBmIntwcm9kdWN0fS17cmVsZWFzZX0te3ZhcmlhbnR9LmNzdiIpCisKKyAgICAjIFJ1biBnZXRfYnVpbGRfdmFyIHRvIGJvb3RzdHJhcCBzb29uZ191aSBmb3IgdGhpcyB0YXJnZXQKKyAgICBlbnYgPSBkaWN0KG9zLmVudmlyb24pCisgICAgZW52WyJUQVJHRVRfUFJPRFVDVCJdID0gcHJvZHVjdAorICAgIGVudlsiVEFSR0VUX1JFTEVBU0UiXSA9IHJlbGVhc2UKKyAgICBlbnZbIlRBUkdFVF9CVUlMRF9WQVJJQU5UIl0gPSB2YXJpYW50CisgICAgZW52WyJPVVRfRElSIl0gPSBvdXRfZGlyCisgICAgcHJvY2VzcyA9IGF3YWl0IGFzeW5jaW8uY3JlYXRlX3N1YnByb2Nlc3NfZXhlYygKKyAgICAgICAgImJ1aWxkL3Nvb25nL2Jpbi9nZXRfYnVpbGRfdmFyIiwKKyAgICAgICAgIlRBUkdFVF9QUk9EVUNUIiwKKyAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VULAorICAgICAgICBlbnY9ZW52CisgICAgKQorICAgIHN0ZG91dCwgXyA9IGF3YWl0IHByb2Nlc3MuY29tbXVuaWNhdGUoKQorICAgIHN0ZG91dCA9IHN0ZG91dC5kZWNvZGUoKQorCisgICAgaWYgcHJvY2Vzcy5yZXR1cm5jb2RlICE9IDA6CisgICAgICAgIHJldHVybiBQcm9kdWN0RXJyb3IoCisgICAgICAgICAgICBwcm9kdWN0ID0gcHJvZHVjdCwKKyAgICAgICAgICAgIHJlbGVhc2UgPSByZWxlYXNlLAorICAgICAgICAgICAgdmFyaWFudCA9IHZhcmlhbnQsCisgICAgICAgICAgICBlcnJvciA9IHN0ZG91dAorICAgICAgICApCisgICAgZWxzZToKKyAgICAgICAgIyBSdW4ga2F0aSB0byBleHRyYWN0IHRoZSBkYXRhCisgICAgICAgIHByb2Nlc3MgPSBhd2FpdCBhc3luY2lvLmNyZWF0ZV9zdWJwcm9jZXNzX2V4ZWMoCisgICAgICAgICAgICAicHJlYnVpbHRzL2J1aWxkLXRvb2xzL2xpbnV4LXg4Ni9iaW4vY2thdGkiLAorICAgICAgICAgICAgIi1mIiwKKyAgICAgICAgICAgICJidWlsZC9tYWtlL2NvcmUvZHVtcGNvbmZpZy5tayIsCisgICAgICAgICAgICBmIlRBUkdFVF9QUk9EVUNUPXtwcm9kdWN0fSIsCisgICAgICAgICAgICBmIlRBUkdFVF9SRUxFQVNFPXtyZWxlYXNlfSIsCisgICAgICAgICAgICBmIlRBUkdFVF9CVUlMRF9WQVJJQU5UPXt2YXJpYW50fSIsCisgICAgICAgICAgICBmIkRVTVBDT05GSUdfRklMRT17ZHVtcGNvbmZpZ19maWxlfSIsCisgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VULAorICAgICAgICAgICAgZW52PWVudgorICAgICAgICApCisgICAgICAgIHN0ZG91dCwgXyA9IGF3YWl0IHByb2Nlc3MuY29tbXVuaWNhdGUoKQorICAgICAgICBpZiBwcm9jZXNzLnJldHVybmNvZGUgIT0gMDoKKyAgICAgICAgICAgIHN0ZG91dCA9IHN0ZG91dC5kZWNvZGUoKQorICAgICAgICAgICAgcmV0dXJuIFByb2R1Y3RFcnJvcigKKyAgICAgICAgICAgICAgICBwcm9kdWN0ID0gcHJvZHVjdCwKKyAgICAgICAgICAgICAgICByZWxlYXNlID0gcmVsZWFzZSwKKyAgICAgICAgICAgICAgICB2YXJpYW50ID0gdmFyaWFudCwKKyAgICAgICAgICAgICAgICBlcnJvciA9IHN0ZG91dAorICAgICAgICAgICAgKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBQYXJzZSBhbmQgcmVjb3JkIHRoZSBvdXRwdXQKKyAgICAgICAgICAgIHJldHVybiBQYXJzZUR1bXAobHVuY2gsIGR1bXBjb25maWdfZmlsZSkKKworCitkZWYgR2V0QXJncygpOgorICAgICIiIlBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuIiIiCisgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ29sbGVjdCBhbGwgb2YgdGhlIG1ha2UgdmFyaWFibGVzIGZyb20gcHJvZHVjdCBjb25maWcuIiwKKyAgICAgICAgICAgIGVwaWxvZz0iTk9URTogVGhpcyBzY3JpcHQgbXVzdCBiZSBydW4gZnJvbSB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuIikKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWx1bmNoIiwgbmFyZ3M9IioiKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tZGlzdCIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIpCisKKyAgICByZXR1cm4gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisKK2FzeW5jIGRlZiBtYWluKCk6CisgICAgYXJncyA9IEdldEFyZ3MoKQorCisgICAgb3V0X2RpciA9IGJ1aWxkYm90Lk91dERpcigpCisKKyAgICBpZiBhcmdzLmRpc3Q6CisgICAgICAgIGNtID0gb3Blbihvcy5wYXRoLmpvaW4oYnVpbGRib3QuRGlzdERpcigpLCAiYWxsX3Byb2R1Y3RfY29uZmlnLmpzb24iKSwgInciKQorICAgIGVsc2U6CisgICAgICAgIGNtID0gY29udGV4dGxpYi5udWxsY29udGV4dChzeXMuc3Rkb3V0KQorCisKKyAgICB3aXRoIGNtIGFzIG91dDoKKyAgICAgICAgaWYgYXJncy5sdW5jaDoKKyAgICAgICAgICAgIGx1bmNoZXMgPSBbbHVuY2guc3BsaXQoIi0iKSBmb3IgbHVuY2ggaW4gYXJncy5sdW5jaF0KKyAgICAgICAgICAgIGZhaWwgPSBGYWxzZQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGx1bmNoZXMpKToKKyAgICAgICAgICAgICAgICBpZiBsZW4obHVuY2hlc1tpXSkgIT0gMzoKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZShmIk1hbGZvcm1lZCBsdW5jaCB0YXJnZXRzOiB7YXJncy5sdW5jaFtpXX1cbiIpCisgICAgICAgICAgICAgICAgICAgIGZhaWwgPSBUcnVlCisgICAgICAgICAgICBpZiBmYWlsOgorICAgICAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgICAgICBpZiBsZW4obHVuY2hlcykgPT0gMToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBEdW1wT25lUHJvZHVjdENvbmZpZyhsdW5jaGVzWzBdLCBvdXRfZGlyKQorICAgICAgICAgICAgICAgIHJlc3VsdC5kdW1wVG9GaWxlKG91dCkKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoIlxuIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXdhaXQgRHVtcFByb2R1Y3RDb25maWdzKG91dCwgbHVuY2hlcywgb3V0X2RpcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgQWxsIGNvbmZpZ3MgbW9kZS4gVGhpcyB3aWxsIGV4ZWMgc2luZ2xlIGNvbmZpZyBtb2RlIGluIHBhcmFsbGVsCisgICAgICAgICAgICAjIGZvciBlYWNoIGx1bmNoIGNvbWJvLiBXcml0ZSBvdXRwdXQgdG8gJERJU1RfRElSLgorICAgICAgICAgICAgYXdhaXQgRHVtcFByb2R1Y3RDb25maWdzKG91dCwgR2VuZXJhdGVBbGxMdW5jaFRhcmdldHMoKSwgb3V0X2RpcikKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGFzeW5jaW8ucnVuKG1haW4oKSkKKworCisjIHZpbTogc2V0IHN5bnRheD1weXRob24gdHM9NCBzdz00IHN0cz00OgorCmRpZmYgLS1naXQgYS9jaS9tZXRyaWNzX2FnZW50LnB5IGIvY2kvbWV0cmljc19hZ2VudC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzI0NzllCi0tLSAvZGV2L251bGwKKysrIGIvY2kvbWV0cmljc19hZ2VudC5weQpAQCAtMCwwICsxLDExNiBAQAorIyBDb3B5cmlnaHQgMjAyNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisiIiJNZXRyaWNzQWdlbnQgaXMgYSBzaW5nbGV0b24gY2xhc3MgdGhhdCBjb2xsZWN0cyBtZXRyaWNzIGZvciBvcHRpbWl6ZWQgYnVpbGQuIiIiCisKK2Zyb20gZW51bSBpbXBvcnQgRW51bQoraW1wb3J0IHRpbWUKK2ltcG9ydCBtZXRyaWNzX3BiMgoraW1wb3J0IG9zCitpbXBvcnQgbG9nZ2luZworCisKK2NsYXNzIE1ldHJpY3NBZ2VudDoKKyAgX1NPT05HX01FVFJJQ1NfUEFUSCA9ICdsb2dzL3Nvb25nX21ldHJpY3MnCisgIF9ESVNUX0RJUiA9ICdESVNUX0RJUicKKyAgX2luc3RhbmNlID0gTm9uZQorCisgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICByYWlzZSBSdW50aW1lRXJyb3IoCisgICAgICAgICdNZXRyaWNzQWdlbnQgY2Fubm90IGJlIGluc3RhbnRpYWxpemVkLCB1c2UgaW5zdGFuY2UoKSBpbnN0ZWFkJworICAgICkKKworICBAY2xhc3NtZXRob2QKKyAgZGVmIGluc3RhbmNlKGNscyk6CisgICAgaWYgbm90IGNscy5faW5zdGFuY2U6CisgICAgICBjbHMuX2luc3RhbmNlID0gY2xzLl9fbmV3X18oY2xzKQorICAgICAgY2xzLl9pbnN0YW5jZS5fcHJvdG8gPSBtZXRyaWNzX3BiMi5PcHRpbWl6ZWRCdWlsZE1ldHJpY3MoKQorICAgICAgY2xzLl9pbnN0YW5jZS5faW5pdF9wcm90bygpCisgICAgICBjbHMuX2luc3RhbmNlLl90YXJnZXRfcmVzdWx0cyA9IGRpY3QoKQorCisgICAgcmV0dXJuIGNscy5faW5zdGFuY2UKKworICBkZWYgX2luaXRfcHJvdG8oc2VsZik6CisgICAgc2VsZi5fcHJvdG8uYW5hbHlzaXNfcGVyZi5uYW1lID0gJ09wdGltaXplZCBidWlsZCBhbmFseXNpcyB0aW1lLicKKyAgICBzZWxmLl9wcm90by5wYWNrYWdpbmdfcGVyZi5uYW1lID0gJ09wdGltaXplZCBidWlsZCB0b3RhbCBwYWNrYWdpbmcgdGltZS4nCisKKyAgZGVmIGFuYWx5c2lzX3N0YXJ0KHNlbGYpOgorICAgIHNlbGYuX3Byb3RvLmFuYWx5c2lzX3BlcmYuc3RhcnRfdGltZSA9IHRpbWUudGltZV9ucygpCisKKyAgZGVmIGFuYWx5c2lzX2VuZChzZWxmKToKKyAgICBzZWxmLl9wcm90by5hbmFseXNpc19wZXJmLnJlYWxfdGltZSA9ICgKKyAgICAgICAgdGltZS50aW1lX25zKCkgLSBzZWxmLl9wcm90by5hbmFseXNpc19wZXJmLnN0YXJ0X3RpbWUKKyAgICApCisKKyAgZGVmIHBhY2thZ2luZ19zdGFydChzZWxmKToKKyAgICBzZWxmLl9wcm90by5wYWNrYWdpbmdfcGVyZi5zdGFydF90aW1lID0gdGltZS50aW1lX25zKCkKKworICBkZWYgcGFja2FnaW5nX2VuZChzZWxmKToKKyAgICBzZWxmLl9wcm90by5wYWNrYWdpbmdfcGVyZi5yZWFsX3RpbWUgPSAoCisgICAgICAgIHRpbWUudGltZV9ucygpIC0gc2VsZi5fcHJvdG8ucGFja2FnaW5nX3BlcmYuc3RhcnRfdGltZQorICAgICkKKworICBkZWYgcmVwb3J0X29wdGltaXplZF90YXJnZXQoc2VsZiwgbmFtZTogc3RyKToKKyAgICB0YXJnZXRfcmVzdWx0ID0gbWV0cmljc19wYjIuT3B0aW1pemVkQnVpbGRNZXRyaWNzLlRhcmdldE9wdGltaXphdGlvblJlc3VsdCgpCisgICAgdGFyZ2V0X3Jlc3VsdC5uYW1lID0gbmFtZQorICAgIHRhcmdldF9yZXN1bHQub3B0aW1pemVkID0gVHJ1ZQorICAgIHNlbGYuX3RhcmdldF9yZXN1bHRzW25hbWVdID0gdGFyZ2V0X3Jlc3VsdAorCisgIGRlZiByZXBvcnRfdW5vcHRpbWl6ZWRfdGFyZ2V0KHNlbGYsIG5hbWU6IHN0ciwgb3B0aW1pemF0aW9uX3JhdGlvbmFsZTogc3RyKToKKyAgICB0YXJnZXRfcmVzdWx0ID0gbWV0cmljc19wYjIuT3B0aW1pemVkQnVpbGRNZXRyaWNzLlRhcmdldE9wdGltaXphdGlvblJlc3VsdCgpCisgICAgdGFyZ2V0X3Jlc3VsdC5uYW1lID0gbmFtZQorICAgIHRhcmdldF9yZXN1bHQub3B0aW1pemF0aW9uX3JhdGlvbmFsZSA9IG9wdGltaXphdGlvbl9yYXRpb25hbGUKKyAgICB0YXJnZXRfcmVzdWx0Lm9wdGltaXplZCA9IEZhbHNlCisgICAgc2VsZi5fdGFyZ2V0X3Jlc3VsdHNbbmFtZV0gPSB0YXJnZXRfcmVzdWx0CisKKyAgZGVmIHRhcmdldF9wYWNrYWdpbmdfc3RhcnQoc2VsZiwgbmFtZTogc3RyKToKKyAgICB0YXJnZXRfcmVzdWx0ID0gc2VsZi5fdGFyZ2V0X3Jlc3VsdHMuZ2V0KG5hbWUpCisgICAgdGFyZ2V0X3Jlc3VsdC5wYWNrYWdpbmdfcGVyZi5zdGFydF90aW1lID0gdGltZS50aW1lX25zKCkKKyAgICBzZWxmLl90YXJnZXRfcmVzdWx0c1tuYW1lXSA9IHRhcmdldF9yZXN1bHQKKworICBkZWYgdGFyZ2V0X3BhY2thZ2luZ19lbmQoc2VsZiwgbmFtZTogc3RyKToKKyAgICB0YXJnZXRfcmVzdWx0ID0gc2VsZi5fdGFyZ2V0X3Jlc3VsdHMuZ2V0KG5hbWUpCisgICAgdGFyZ2V0X3Jlc3VsdC5wYWNrYWdpbmdfcGVyZi5yZWFsX3RpbWUgPSAoCisgICAgICAgIHRpbWUudGltZV9ucygpIC0gdGFyZ2V0X3Jlc3VsdC5wYWNrYWdpbmdfcGVyZi5zdGFydF90aW1lCisgICAgKQorCisgIGRlZiBhZGRfdGFyZ2V0X2FydGlmYWN0KAorICAgICAgc2VsZiwKKyAgICAgIHRhcmdldF9uYW1lOiBzdHIsCisgICAgICBhcnRpZmFjdF9uYW1lOiBzdHIsCisgICAgICBzaXplOiBpbnQsCisgICAgICBpbmNsdWRlZF9tb2R1bGVzOiBzZXRbc3RyXSwKKyAgKToKKyAgICB0YXJnZXRfcmVzdWx0ID0gc2VsZi50YXJnZXRfcmVzdWx0cy5nZXQodGFyZ2V0X25hbWUpCisgICAgYXJ0aWZhY3QgPSAoCisgICAgICAgIG1ldHJpY3NfcGIyLk9wdGltaXplZEJ1aWxkTWV0cmljcy5UYXJnZXRPcHRpbWl6YXRpb25SZXN1bHQuT3V0cHV0QXJ0aWZhY3QoKQorICAgICkKKyAgICBhcnRpZmFjdC5uYW1lID0gYXJ0aWZhY3RfbmFtZQorICAgIGFydGlmYWN0LnNpemUgPSBzaXplCisgICAgZm9yIG1vZHVsZSBpbiBpbmNsdWRlZF9tb2R1bGVzOgorICAgICAgYXJ0aWZhY3QuaW5jbHVkZWRfbW9kdWxlcy5hZGQobW9kdWxlKQorICAgIHRhcmdldF9yZXN1bHQub3V0cHV0X2FydGlmYWN0cy5hZGQoYXJ0aWZhY3QpCisKKyAgZGVmIGVuZF9yZXBvcnRpbmcoc2VsZik6CisgICAgZm9yIHRhcmdldF9yZXN1bHQgaW4gc2VsZi5fdGFyZ2V0X3Jlc3VsdHMudmFsdWVzKCk6CisgICAgICBzZWxmLl9wcm90by50YXJnZXRfcmVzdWx0LmFwcGVuZCh0YXJnZXRfcmVzdWx0KQorICAgIHNvb25nX21ldHJpY3NfcHJvdG8gPSBtZXRyaWNzX3BiMi5NZXRyaWNzQmFzZSgpCisgICAgIyBSZWFkIGluIGV4aXN0aW5nIG1ldHJpY3MgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIHdyaXR0ZW4gb3V0IGJ5IHRoZSBzb29uZworICAgICMgYnVpbGQgY29tbWFuZCBzbyB0aGF0IHdlIGRvbid0IG92ZXJ3cml0ZSB0aGVtLgorICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4ob3MuZW52aXJvbltzZWxmLl9ESVNUX0RJUl0sIHNlbGYuX1NPT05HX01FVFJJQ1NfUEFUSCksICdyYicpIGFzIGY6CisgICAgICBzb29uZ19tZXRyaWNzX3Byb3RvLlBhcnNlRnJvbVN0cmluZyhmLnJlYWQoKSkKKyAgICBzb29uZ19tZXRyaWNzX3Byb3RvLm9wdGltaXplZF9idWlsZF9tZXRyaWNzLkNvcHlGcm9tKHNlbGYuX3Byb3RvKQorICAgIGxvZ2dpbmcuaW5mbyhzb29uZ19tZXRyaWNzX3Byb3RvKQorICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4ob3MuZW52aXJvbltzZWxmLl9ESVNUX0RJUl0sIHNlbGYuX1NPT05HX01FVFJJQ1NfUEFUSCksICd3YicpIGFzIGY6CisgICAgICBmLndyaXRlKHNvb25nX21ldHJpY3NfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKSkKZGlmZiAtLWdpdCBhL2NpL29wdGltaXplZF90YXJnZXRzLnB5IGIvY2kvb3B0aW1pemVkX3RhcmdldHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg4YmRkOAotLS0gL2Rldi9udWxsCisrKyBiL2NpL29wdGltaXplZF90YXJnZXRzLnB5CkBAIC0wLDAgKzEsNDgyIEBACisjCisjIENvcHlyaWdodCAyMDI0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2Zyb20gYWJjIGltcG9ydCBBQkMKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IGZ1bmN0b29scworaW1wb3J0IGpzb24KK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBwYXRobGliCitpbXBvcnQgc3VicHJvY2VzcworCitmcm9tIGJ1aWxkX2NvbnRleHQgaW1wb3J0IEJ1aWxkQ29udGV4dAoraW1wb3J0IHRlc3RfbWFwcGluZ19tb2R1bGVfcmV0cmlldmVyCisKKworY2xhc3MgT3B0aW1pemVkQnVpbGRUYXJnZXQoQUJDKToKKyAgIiIiQSByZXByZXNlbnRhdGlvbiBvZiBhbiBvcHRpbWl6ZWQgYnVpbGQgdGFyZ2V0LgorCisgIFRoaXMgY2xhc3Mgd2lsbCBkZXRlcm1pbmUgd2hhdCB0YXJnZXRzIHRvIGJ1aWxkIGdpdmVuIGEgZ2l2ZW4gYnVpbGRfY290ZXh0IGFuZAorICB3aWxsIGhhdmUgYSBwYWNrYWdpbmcgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgYW55IG5lY2Vzc2FyeSBvdXRwdXQgemlwcyBmb3IgdGhlCisgIGJ1aWxkLgorICAiIiIKKworICBfU09PTkdfVUlfQkFTSF9QQVRIID0gJ2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2gnCisgIF9QUkVCVUlMVF9TT09OR19aSVBfUEFUSCA9ICdwcmVidWlsdHMvYnVpbGQtdG9vbHMvbGludXgteDg2L2Jpbi9zb29uZ196aXAnCisKKyAgZGVmIF9faW5pdF9fKAorICAgICAgc2VsZiwKKyAgICAgIHRhcmdldDogc3RyLAorICAgICAgYnVpbGRfY29udGV4dDogQnVpbGRDb250ZXh0LAorICAgICAgYXJnczogYXJncGFyc2UuTmFtZXNwYWNlLAorICApOgorICAgIHNlbGYudGFyZ2V0ID0gdGFyZ2V0CisgICAgc2VsZi5idWlsZF9jb250ZXh0ID0gYnVpbGRfY29udGV4dAorICAgIHNlbGYuYXJncyA9IGFyZ3MKKworICBkZWYgZ2V0X2J1aWxkX3RhcmdldHMoc2VsZikgLT4gc2V0W3N0cl06CisgICAgZmVhdHVyZXMgPSBzZWxmLmJ1aWxkX2NvbnRleHQuZW5hYmxlZF9idWlsZF9mZWF0dXJlcworICAgIGlmIHNlbGYuZ2V0X2VuYWJsZWRfZmxhZygpIGluIGZlYXR1cmVzOgorICAgICAgc2VsZi5tb2R1bGVzX3RvX2J1aWxkID0gc2VsZi5nZXRfYnVpbGRfdGFyZ2V0c19pbXBsKCkKKyAgICAgIHJldHVybiBzZWxmLm1vZHVsZXNfdG9fYnVpbGQKKworICAgIHNlbGYubW9kdWxlc190b19idWlsZCA9IHtzZWxmLnRhcmdldH0KKyAgICByZXR1cm4ge3NlbGYudGFyZ2V0fQorCisgIGRlZiBnZXRfcGFja2FnZV9vdXRwdXRzX2NvbW1hbmRzKHNlbGYpIC0+IGxpc3RbbGlzdFtzdHJdXToKKyAgICBmZWF0dXJlcyA9IHNlbGYuYnVpbGRfY29udGV4dC5lbmFibGVkX2J1aWxkX2ZlYXR1cmVzCisgICAgaWYgc2VsZi5nZXRfZW5hYmxlZF9mbGFnKCkgaW4gZmVhdHVyZXM6CisgICAgICByZXR1cm4gc2VsZi5nZXRfcGFja2FnZV9vdXRwdXRzX2NvbW1hbmRzX2ltcGwoKQorCisgICAgcmV0dXJuIFtdCisKKyAgZGVmIGdldF9wYWNrYWdlX291dHB1dHNfY29tbWFuZHNfaW1wbChzZWxmKSAtPiBsaXN0W2xpc3Rbc3RyXV06CisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKKyAgICAgICAgJ2dldF9wYWNrYWdlX291dHB1dHNfY29tbWFuZHNfaW1wbCBub3QgaW1wbGVtZW50ZWQgaW4nCisgICAgICAgIGYnIHt0eXBlKHNlbGYpLl9fbmFtZV9ffScKKyAgICApCisKKyAgZGVmIGdldF9lbmFibGVkX2ZsYWcoc2VsZik6CisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKKyAgICAgICAgZidnZXRfZW5hYmxlZF9mbGFnIG5vdCBpbXBsZW1lbnRlZCBpbiB7dHlwZShzZWxmKS5fX25hbWVfX30nCisgICAgKQorCisgIGRlZiBnZXRfYnVpbGRfdGFyZ2V0c19pbXBsKHNlbGYpIC0+IHNldFtzdHJdOgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCisgICAgICAgIGYnZ2V0X2J1aWxkX3RhcmdldHNfaW1wbCBub3QgaW1wbGVtZW50ZWQgaW4ge3R5cGUoc2VsZikuX19uYW1lX199JworICAgICkKKworICBkZWYgX2dlbmVyYXRlX3ppcF9vcHRpb25zX2Zvcl9pdGVtcygKKyAgICAgIHNlbGYsCisgICAgICBwcmVmaXg6IHN0ciA9ICcnLAorICAgICAgcmVsYXRpdmVfcm9vdDogc3RyID0gJycsCisgICAgICBsaXN0X2ZpbGVzOiBsaXN0W3N0cl0gfCBOb25lID0gTm9uZSwKKyAgICAgIGZpbGVzOiBsaXN0W3N0cl0gfCBOb25lID0gTm9uZSwKKyAgICAgIGRpcmVjdG9yaWVzOiBsaXN0W3N0cl0gfCBOb25lID0gTm9uZSwKKyAgKSAtPiBsaXN0W3N0cl06CisgICAgaWYgbm90IGxpc3RfZmlsZXMgYW5kIG5vdCBmaWxlcyBhbmQgbm90IGRpcmVjdG9yaWVzOgorICAgICAgcmFpc2UgUnVudGltZUVycm9yKAorICAgICAgICAgIGYnTm8gaXRlbXMgc3BlY2lmaWVkIHRvIGJlIGFkZGVkIHRvIHppcCEgUHJlZml4OiB7cHJlZml4fSwgUmVsYXRpdmUnCisgICAgICAgICAgZicgcm9vdDoge3JlbGF0aXZlX3Jvb3R9JworICAgICAgKQorICAgIGNvbW1hbmRfc2VnbWVudCA9IFtdCisgICAgIyBUaGVzZSBhcmUgYWxsIHNvb25nX3ppcCBvcHRpb25zIHNvIGNvbnN1bHQgc29vbmdfemlwIC0taGVscCBmb3Igc3BlY2lmaWNzLgorICAgIGlmIHByZWZpeDoKKyAgICAgIGNvbW1hbmRfc2VnbWVudC5hcHBlbmQoJy1QJykKKyAgICAgIGNvbW1hbmRfc2VnbWVudC5hcHBlbmQocHJlZml4KQorICAgIGlmIHJlbGF0aXZlX3Jvb3Q6CisgICAgICBjb21tYW5kX3NlZ21lbnQuYXBwZW5kKCctQycpCisgICAgICBjb21tYW5kX3NlZ21lbnQuYXBwZW5kKHJlbGF0aXZlX3Jvb3QpCisgICAgaWYgbGlzdF9maWxlczoKKyAgICAgIGZvciBsaXN0X2ZpbGUgaW4gbGlzdF9maWxlczoKKyAgICAgICAgY29tbWFuZF9zZWdtZW50LmFwcGVuZCgnLWwnKQorICAgICAgICBjb21tYW5kX3NlZ21lbnQuYXBwZW5kKGxpc3RfZmlsZSkKKyAgICBpZiBmaWxlczoKKyAgICAgIGZvciBmaWxlIGluIGZpbGVzOgorICAgICAgICBjb21tYW5kX3NlZ21lbnQuYXBwZW5kKCctZicpCisgICAgICAgIGNvbW1hbmRfc2VnbWVudC5hcHBlbmQoZmlsZSkKKyAgICBpZiBkaXJlY3RvcmllczoKKyAgICAgIGZvciBkaXJlY3RvcnkgaW4gZGlyZWN0b3JpZXM6CisgICAgICAgIGNvbW1hbmRfc2VnbWVudC5hcHBlbmQoJy1EJykKKyAgICAgICAgY29tbWFuZF9zZWdtZW50LmFwcGVuZChkaXJlY3RvcnkpCisKKyAgICByZXR1cm4gY29tbWFuZF9zZWdtZW50CisKKyAgZGVmIF9xdWVyeV9zb29uZ192YXJzKAorICAgICAgc2VsZiwgc3JjX3RvcDogcGF0aGxpYi5QYXRoLCBzb29uZ192YXJzOiBsaXN0W3N0cl0KKyAgKSAtPiBkaWN0W3N0ciwgc3RyXToKKyAgICBwcm9jZXNzX3Jlc3VsdCA9IHN1YnByb2Nlc3MucnVuKAorICAgICAgICBhcmdzPVsKKyAgICAgICAgICAgIGYne3NyY190b3AgLyBzZWxmLl9TT09OR19VSV9CQVNIX1BBVEh9JywKKyAgICAgICAgICAgICctLWR1bXB2YXJzLW1vZGUnLAorICAgICAgICAgICAgZictLWFicy12YXJzPXsiICIuam9pbihzb29uZ192YXJzKX0nLAorICAgICAgICBdLAorICAgICAgICBlbnY9b3MuZW52aXJvbiwKKyAgICAgICAgY2hlY2s9RmFsc2UsCisgICAgICAgIGNhcHR1cmVfb3V0cHV0PVRydWUsCisgICAgICAgIHRleHQ9VHJ1ZSwKKyAgICApCisgICAgaWYgbm90IHByb2Nlc3NfcmVzdWx0LnJldHVybmNvZGUgPT0gMDoKKyAgICAgIGxvZ2dpbmcuZXJyb3IoJ3Nvb25nIGR1bXB2YXJzIGNvbW1hbmQgZmFpbGVkISBzdGRlcnI6JykKKyAgICAgIGxvZ2dpbmcuZXJyb3IocHJvY2Vzc19yZXN1bHQuc3RkZXJyKQorICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdTb29uZyBkdW1wdmFycyBmYWlsZWQhIFNlZSBsb2cgZm9yIHN0ZGVyci4nKQorCisgICAgaWYgbm90IHByb2Nlc3NfcmVzdWx0LnN0ZG91dDoKKyAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKKyAgICAgICAgICAnTmVjZXNzYXJ5IHNvb25nIHZhcmlhYmxlcyAnICsgc29vbmdfdmFycyArICcgbm90IGZvdW5kLicKKyAgICAgICkKKworICAgIHRyeToKKyAgICAgIHJldHVybiB7CisgICAgICAgICAgbGluZS5zcGxpdCgnPScpWzBdOiBsaW5lLnNwbGl0KCc9JylbMV0uc3RyaXAoIiciKQorICAgICAgICAgIGZvciBsaW5lIGluIHByb2Nlc3NfcmVzdWx0LnN0ZG91dC5zdHJpcCgpLnNwbGl0KCdcbicpCisgICAgICB9CisgICAgZXhjZXB0IEluZGV4RXJyb3IgYXMgZToKKyAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKKyAgICAgICAgICAnRXJyb3IgcGFyc2luZyBzb29uZyBkdW1wdmFycyBvdXRwdXQhIFNlZSBvdXRwdXQgaGVyZTonCisgICAgICAgICAgZicge3Byb2Nlc3NfcmVzdWx0LnN0ZG91dH0nLAorICAgICAgICAgIGUsCisgICAgICApCisKKyAgZGVmIF9iYXNlX3ppcF9jb21tYW5kKAorICAgICAgc2VsZiwgc3JjX3RvcDogcGF0aGxpYi5QYXRoLCBkaXN0X2RpcjogcGF0aGxpYi5QYXRoLCBuYW1lOiBzdHIKKyAgKSAtPiBsaXN0W3N0cl06CisgICAgcmV0dXJuIFsKKyAgICAgICAgZid7c3JjX3RvcCAvIHNlbGYuX1BSRUJVSUxUX1NPT05HX1pJUF9QQVRIIH0nLAorICAgICAgICAnLWQnLAorICAgICAgICAnLW8nLAorICAgICAgICBmJ3tkaXN0X2RpciAvIG5hbWV9JywKKyAgICBdCisKKworY2xhc3MgTnVsbE9wdGltaXplcihPcHRpbWl6ZWRCdWlsZFRhcmdldCk6CisgICIiIk5vLW9wIHRhcmdldCBvcHRpbWl6ZXIuCisKKyAgVGhpcyB3aWxsIHNpbXBseSBidWlsZCB0aGUgc2FtZSB0YXJnZXQgaXQgd2FzIGdpdmVuIGFuZCBkbyBub3RoaW5nIGZvciB0aGUKKyAgcGFja2FnaW5nIHN0ZXAuCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXJnZXQpOgorICAgIHNlbGYudGFyZ2V0ID0gdGFyZ2V0CisKKyAgZGVmIGdldF9idWlsZF90YXJnZXRzKHNlbGYpOgorICAgIHJldHVybiB7c2VsZi50YXJnZXR9CisKKyAgZGVmIGdldF9wYWNrYWdlX291dHB1dHNfY29tbWFuZHMoc2VsZik6CisgICAgcmV0dXJuIFtdCisKKworY2xhc3MgQ2hhbmdlSW5mbzoKKworICBkZWYgX19pbml0X18oc2VsZiwgY2hhbmdlX2luZm9fZmlsZV9wYXRoKToKKyAgICB0cnk6CisgICAgICB3aXRoIG9wZW4oY2hhbmdlX2luZm9fZmlsZV9wYXRoKSBhcyBjaGFuZ2VfaW5mb19maWxlOgorICAgICAgICBjaGFuZ2VfaW5mb19jb250ZW50cyA9IGpzb24ubG9hZChjaGFuZ2VfaW5mb19maWxlKQorICAgIGV4Y2VwdCBqc29uLmRlY29kZXIuSlNPTkRlY29kZUVycm9yOgorICAgICAgbG9nZ2luZy5lcnJvcihmJ0ZhaWxlZCB0byBsb2FkIENIQU5HRV9JTkZPOiB7Y2hhbmdlX2luZm9fZmlsZV9wYXRofScpCisgICAgICByYWlzZQorCisgICAgc2VsZi5fY2hhbmdlX2luZm9fY29udGVudHMgPSBjaGFuZ2VfaW5mb19jb250ZW50cworCisgIGRlZiBmaW5kX2NoYW5nZWRfZmlsZXMoc2VsZikgLT4gc2V0W3N0cl06CisgICAgY2hhbmdlZF9maWxlcyA9IHNldCgpCisKKyAgICBmb3IgY2hhbmdlIGluIHNlbGYuX2NoYW5nZV9pbmZvX2NvbnRlbnRzWydjaGFuZ2VzJ106CisgICAgICBwcm9qZWN0X3BhdGggPSBjaGFuZ2UuZ2V0KCdwcm9qZWN0UGF0aCcpICsgJy8nCisKKyAgICAgIGZvciByZXZpc2lvbiBpbiBjaGFuZ2UuZ2V0KCdyZXZpc2lvbnMnKToKKyAgICAgICAgZm9yIGZpbGVfaW5mbyBpbiByZXZpc2lvbi5nZXQoJ2ZpbGVJbmZvcycpOgorICAgICAgICAgIGNoYW5nZWRfZmlsZXMuYWRkKHByb2plY3RfcGF0aCArIGZpbGVfaW5mby5nZXQoJ3BhdGgnKSkKKworICAgIHJldHVybiBjaGFuZ2VkX2ZpbGVzCisKKworY2xhc3MgR2VuZXJhbFRlc3RzT3B0aW1pemVyKE9wdGltaXplZEJ1aWxkVGFyZ2V0KToKKyAgIiIiZ2VuZXJhbC10ZXN0cyBvcHRpbWl6ZXIKKworICBUaGlzIG9wdGltaXplciByZWFkcyBpbiB0aGUgbGlzdCBvZiBjaGFuZ2VkIGZpbGVzIGZyb20gdGhlIGZpbGUgbG9jYXRlZCBpbgorICBlbnZbQ0hBTkdFX0lORk9dIGFuZCB1c2VzIHRoaXMgbGlzdCBhbG9uZ3NpZGUgdGhlIG5vcm1hbCBURVNUIE1BUFBJTkcgbG9naWMgdG8KKyAgZGV0ZXJtaW5lIHdoYXQgdGVzdCBtYXBwaW5nIG1vZHVsZXMgd2lsbCBydW4gZm9yIHRoZSBnaXZlbiBjaGFuZ2VzLiBJdCB0aGVuCisgIGJ1aWxkcyB0aG9zZSBtb2R1bGVzIGFuZCBwYWNrYWdlcyB0aGVtIGluIHRoZSBzYW1lIHdheSBnZW5lcmFsLXRlc3RzLnppcCBpcworICBub3JtYWxseSBidWlsdC4KKyAgIiIiCisKKyAgIyBMaXN0IG9mIG1vZHVsZXMgdGhhdCBhcmUgYnVpbHQgYWxvbmdzaWRlIGdlbmVyYWwtdGVzdHMgYXMgZGVwZW5kZW5jaWVzLgorICBfUkVRVUlSRURfTU9EVUxFUyA9IGZyb3plbnNldChbCisgICAgICAnY3RzLXRyYWRlZmVkJywKKyAgICAgICd2dHMtdHJhZGVmZWQnLAorICAgICAgJ2NvbXBhdGliaWxpdHktaG9zdC11dGlsJywKKyAgICAgICdnZW5lcmFsLXRlc3RzLXNoYXJlZC1saWJzJywKKyAgXSkKKworICBkZWYgZ2V0X2J1aWxkX3RhcmdldHNfaW1wbChzZWxmKSAtPiBzZXRbc3RyXToKKyAgICBjaGFuZ2VfaW5mb19maWxlX3BhdGggPSBvcy5lbnZpcm9uLmdldCgnQ0hBTkdFX0lORk8nKQorICAgIGlmIG5vdCBjaGFuZ2VfaW5mb19maWxlX3BhdGg6CisgICAgICBsb2dnaW5nLmluZm8oCisgICAgICAgICAgJ05vIENIQU5HRV9JTkZPIGVudiB2YXIgZm91bmQsIGdlbmVyYWwtdGVzdHMgb3B0aW1pemF0aW9uIGRpc2FibGVkLicKKyAgICAgICkKKyAgICAgIHJldHVybiB7J2dlbmVyYWwtdGVzdHMnfQorCisgICAgdGVzdF9pbmZvcyA9IHNlbGYuYnVpbGRfY29udGV4dC50ZXN0X2luZm9zCisgICAgdGVzdF9tYXBwaW5nX3Rlc3RfZ3JvdXBzID0gc2V0KCkKKyAgICBmb3IgdGVzdF9pbmZvIGluIHRlc3RfaW5mb3M6CisgICAgICBpc190ZXN0X21hcHBpbmcgPSB0ZXN0X2luZm8uaXNfdGVzdF9tYXBwaW5nCisgICAgICBjdXJyZW50X3Rlc3RfbWFwcGluZ190ZXN0X2dyb3VwcyA9IHRlc3RfaW5mby50ZXN0X21hcHBpbmdfdGVzdF9ncm91cHMKKyAgICAgIHVzZXNfZ2VuZXJhbF90ZXN0cyA9IHRlc3RfaW5mby5idWlsZF90YXJnZXRfdXNlZCgnZ2VuZXJhbC10ZXN0cycpCisKKyAgICAgIGlmIHVzZXNfZ2VuZXJhbF90ZXN0cyBhbmQgbm90IGlzX3Rlc3RfbWFwcGluZzoKKyAgICAgICAgbG9nZ2luZy5pbmZvKAorICAgICAgICAgICAgJ1Rlc3QgdXNlcyBnZW5lcmFsLXRlc3RzLnppcCBidXQgaXMgbm90IHRlc3QtbWFwcGluZywgZ2VuZXJhbC10ZXN0cycKKyAgICAgICAgICAgICcgb3B0aW1pemF0aW9uIGRpc2FibGVkLicKKyAgICAgICAgKQorICAgICAgICByZXR1cm4geydnZW5lcmFsLXRlc3RzJ30KKworICAgICAgaWYgaXNfdGVzdF9tYXBwaW5nOgorICAgICAgICB0ZXN0X21hcHBpbmdfdGVzdF9ncm91cHMudXBkYXRlKGN1cnJlbnRfdGVzdF9tYXBwaW5nX3Rlc3RfZ3JvdXBzKQorCisgICAgY2hhbmdlX2luZm8gPSBDaGFuZ2VJbmZvKGNoYW5nZV9pbmZvX2ZpbGVfcGF0aCkKKyAgICBjaGFuZ2VkX2ZpbGVzID0gY2hhbmdlX2luZm8uZmluZF9jaGFuZ2VkX2ZpbGVzKCkKKworICAgIHRlc3RfbWFwcGluZ3MgPSB0ZXN0X21hcHBpbmdfbW9kdWxlX3JldHJpZXZlci5HZXRUZXN0TWFwcGluZ3MoCisgICAgICAgIGNoYW5nZWRfZmlsZXMsIHNldCgpCisgICAgKQorCisgICAgbW9kdWxlc190b19idWlsZCA9IHNldChzZWxmLl9SRVFVSVJFRF9NT0RVTEVTKQorCisgICAgbW9kdWxlc190b19idWlsZC51cGRhdGUoCisgICAgICAgIHRlc3RfbWFwcGluZ19tb2R1bGVfcmV0cmlldmVyLkZpbmRBZmZlY3RlZE1vZHVsZXMoCisgICAgICAgICAgICB0ZXN0X21hcHBpbmdzLCBjaGFuZ2VkX2ZpbGVzLCB0ZXN0X21hcHBpbmdfdGVzdF9ncm91cHMKKyAgICAgICAgKQorICAgICkKKworICAgIHJldHVybiBtb2R1bGVzX3RvX2J1aWxkCisKKyAgZGVmIGdldF9wYWNrYWdlX291dHB1dHNfY29tbWFuZHNfaW1wbChzZWxmKToKKyAgICBzcmNfdG9wID0gcGF0aGxpYi5QYXRoKG9zLmVudmlyb24uZ2V0KCdUT1AnLCBvcy5nZXRjd2QoKSkpCisgICAgZGlzdF9kaXIgPSBwYXRobGliLlBhdGgob3MuZW52aXJvbi5nZXQoJ0RJU1RfRElSJykpCisKKyAgICBzb29uZ192YXJzID0gc2VsZi5fcXVlcnlfc29vbmdfdmFycygKKyAgICAgICAgc3JjX3RvcCwKKyAgICAgICAgWworICAgICAgICAgICAgJ0hPU1RfT1VUX1RFU1RDQVNFUycsCisgICAgICAgICAgICAnVEFSR0VUX09VVF9URVNUQ0FTRVMnLAorICAgICAgICAgICAgJ1BST0RVQ1RfT1VUJywKKyAgICAgICAgICAgICdTT09OR19IT1NUX09VVCcsCisgICAgICAgICAgICAnSE9TVF9PVVQnLAorICAgICAgICBdLAorICAgICkKKyAgICBob3N0X291dF90ZXN0Y2FzZXMgPSBwYXRobGliLlBhdGgoc29vbmdfdmFycy5nZXQoJ0hPU1RfT1VUX1RFU1RDQVNFUycpKQorICAgIHRhcmdldF9vdXRfdGVzdGNhc2VzID0gcGF0aGxpYi5QYXRoKHNvb25nX3ZhcnMuZ2V0KCdUQVJHRVRfT1VUX1RFU1RDQVNFUycpKQorICAgIHByb2R1Y3Rfb3V0ID0gcGF0aGxpYi5QYXRoKHNvb25nX3ZhcnMuZ2V0KCdQUk9EVUNUX09VVCcpKQorICAgIHNvb25nX2hvc3Rfb3V0ID0gcGF0aGxpYi5QYXRoKHNvb25nX3ZhcnMuZ2V0KCdTT09OR19IT1NUX09VVCcpKQorICAgIGhvc3Rfb3V0ID0gcGF0aGxpYi5QYXRoKHNvb25nX3ZhcnMuZ2V0KCdIT1NUX09VVCcpKQorCisgICAgaG9zdF9wYXRocyA9IFtdCisgICAgdGFyZ2V0X3BhdGhzID0gW10KKyAgICBob3N0X2NvbmZpZ19maWxlcyA9IFtdCisgICAgdGFyZ2V0X2NvbmZpZ19maWxlcyA9IFtdCisgICAgZm9yIG1vZHVsZSBpbiBzZWxmLm1vZHVsZXNfdG9fYnVpbGQ6CisgICAgICAjIFRoZSByZXF1aXJlZCBtb2R1bGVzIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHksIG5vIG5lZWQgdG8gcGFja2FnZS4KKyAgICAgIGlmIG1vZHVsZSBpbiBzZWxmLl9SRVFVSVJFRF9NT0RVTEVTOgorICAgICAgICBjb250aW51ZQorCisgICAgICBob3N0X3BhdGggPSBob3N0X291dF90ZXN0Y2FzZXMgLyBtb2R1bGUKKyAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGhvc3RfcGF0aCk6CisgICAgICAgIGhvc3RfcGF0aHMuYXBwZW5kKGhvc3RfcGF0aCkKKyAgICAgICAgc2VsZi5fY29sbGVjdF9jb25maWdfZmlsZXMoc3JjX3RvcCwgaG9zdF9wYXRoLCBob3N0X2NvbmZpZ19maWxlcykKKworICAgICAgdGFyZ2V0X3BhdGggPSB0YXJnZXRfb3V0X3Rlc3RjYXNlcyAvIG1vZHVsZQorICAgICAgaWYgb3MucGF0aC5leGlzdHModGFyZ2V0X3BhdGgpOgorICAgICAgICB0YXJnZXRfcGF0aHMuYXBwZW5kKHRhcmdldF9wYXRoKQorICAgICAgICBzZWxmLl9jb2xsZWN0X2NvbmZpZ19maWxlcyhzcmNfdG9wLCB0YXJnZXRfcGF0aCwgdGFyZ2V0X2NvbmZpZ19maWxlcykKKworICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGhvc3RfcGF0aCkgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyh0YXJnZXRfcGF0aCk6CisgICAgICAgIGxvZ2dpbmcuaW5mbyhmJ05vIGhvc3Qgb3IgdGFyZ2V0IGJ1aWxkIG91dHB1dHMgZm91bmQgZm9yIHttb2R1bGV9LicpCisKKyAgICB6aXBfY29tbWFuZHMgPSBbXQorCisgICAgemlwX2NvbW1hbmRzLmV4dGVuZCgKKyAgICAgICAgc2VsZi5fZ2V0X3ppcF90ZXN0X2NvbmZpZ3Nfemlwc19jb21tYW5kcygKKyAgICAgICAgICAgIHNyY190b3AsCisgICAgICAgICAgICBkaXN0X2RpciwKKyAgICAgICAgICAgIGhvc3Rfb3V0LAorICAgICAgICAgICAgcHJvZHVjdF9vdXQsCisgICAgICAgICAgICBob3N0X2NvbmZpZ19maWxlcywKKyAgICAgICAgICAgIHRhcmdldF9jb25maWdfZmlsZXMsCisgICAgICAgICkKKyAgICApCisKKyAgICB6aXBfY29tbWFuZCA9IHNlbGYuX2Jhc2VfemlwX2NvbW1hbmQoc3JjX3RvcCwgZGlzdF9kaXIsICdnZW5lcmFsLXRlc3RzLnppcCcpCisKKyAgICAjIEFkZCBob3N0IHRlc3RjYXNlcy4KKyAgICBpZiBob3N0X3BhdGhzOgorICAgICAgemlwX2NvbW1hbmQuZXh0ZW5kKAorICAgICAgICAgIHNlbGYuX2dlbmVyYXRlX3ppcF9vcHRpb25zX2Zvcl9pdGVtcygKKyAgICAgICAgICAgICAgcHJlZml4PSdob3N0JywKKyAgICAgICAgICAgICAgcmVsYXRpdmVfcm9vdD1mJ3tzcmNfdG9wIC8gc29vbmdfaG9zdF9vdXR9JywKKyAgICAgICAgICAgICAgZGlyZWN0b3JpZXM9aG9zdF9wYXRocywKKyAgICAgICAgICApCisgICAgICApCisKKyAgICAjIEFkZCB0YXJnZXQgdGVzdGNhc2VzLgorICAgIGlmIHRhcmdldF9wYXRoczoKKyAgICAgIHppcF9jb21tYW5kLmV4dGVuZCgKKyAgICAgICAgICBzZWxmLl9nZW5lcmF0ZV96aXBfb3B0aW9uc19mb3JfaXRlbXMoCisgICAgICAgICAgICAgIHByZWZpeD0ndGFyZ2V0JywKKyAgICAgICAgICAgICAgcmVsYXRpdmVfcm9vdD1mJ3tzcmNfdG9wIC8gcHJvZHVjdF9vdXR9JywKKyAgICAgICAgICAgICAgZGlyZWN0b3JpZXM9dGFyZ2V0X3BhdGhzLAorICAgICAgICAgICkKKyAgICAgICkKKworICAgICMgVE9ETyhsdWNhZmFyc2kpOiBQdXNoIHRoaXMgbG9naWMgaW50byBhIGdlbmVyYWwtdGVzdHMtbWluaW1hbCBidWlsZCBjb21tYW5kCisgICAgIyBBZGQgbmVjZXNzYXJ5IHRvb2xzLiBUaGVzZSBhcmUgYWxzbyBoYXJkY29kZWQgaW4gZ2VuZXJhbC10ZXN0cy5tay4KKyAgICBmcmFtZXdvcmtfcGF0aCA9IHNvb25nX2hvc3Rfb3V0IC8gJ2ZyYW1ld29yaycKKworICAgIHppcF9jb21tYW5kLmV4dGVuZCgKKyAgICAgICAgc2VsZi5fZ2VuZXJhdGVfemlwX29wdGlvbnNfZm9yX2l0ZW1zKAorICAgICAgICAgICAgcHJlZml4PSdob3N0L3Rvb2xzJywKKyAgICAgICAgICAgIHJlbGF0aXZlX3Jvb3Q9c3RyKGZyYW1ld29ya19wYXRoKSwKKyAgICAgICAgICAgIGZpbGVzPVsKKyAgICAgICAgICAgICAgICBmIntmcmFtZXdvcmtfcGF0aCAvICdjdHMtdHJhZGVmZWQuamFyJ30iLAorICAgICAgICAgICAgICAgIGYie2ZyYW1ld29ya19wYXRoIC8gJ2NvbXBhdGliaWxpdHktaG9zdC11dGlsLmphcid9IiwKKyAgICAgICAgICAgICAgICBmIntmcmFtZXdvcmtfcGF0aCAvICd2dHMtdHJhZGVmZWQuamFyJ30iLAorICAgICAgICAgICAgXSwKKyAgICAgICAgKQorICAgICkKKworICAgIHppcF9jb21tYW5kcy5hcHBlbmQoemlwX2NvbW1hbmQpCisgICAgcmV0dXJuIHppcF9jb21tYW5kcworCisgIGRlZiBfY29sbGVjdF9jb25maWdfZmlsZXMoCisgICAgICBzZWxmLAorICAgICAgc3JjX3RvcDogcGF0aGxpYi5QYXRoLAorICAgICAgcm9vdF9kaXI6IHBhdGhsaWIuUGF0aCwKKyAgICAgIGNvbmZpZ19maWxlczogbGlzdFtzdHJdLAorICApOgorICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHNyY190b3AgLyByb290X2Rpcik6CisgICAgICBmb3IgZmlsZSBpbiBmaWxlczoKKyAgICAgICAgaWYgZmlsZS5lbmRzd2l0aCgnLmNvbmZpZycpOgorICAgICAgICAgIGNvbmZpZ19maWxlcy5hcHBlbmQocm9vdF9kaXIgLyBmaWxlKQorCisgIGRlZiBfZ2V0X3ppcF90ZXN0X2NvbmZpZ3Nfemlwc19jb21tYW5kcygKKyAgICAgIHNlbGYsCisgICAgICBzcmNfdG9wOiBwYXRobGliLlBhdGgsCisgICAgICBkaXN0X2RpcjogcGF0aGxpYi5QYXRoLAorICAgICAgaG9zdF9vdXQ6IHBhdGhsaWIuUGF0aCwKKyAgICAgIHByb2R1Y3Rfb3V0OiBwYXRobGliLlBhdGgsCisgICAgICBob3N0X2NvbmZpZ19maWxlczogbGlzdFtzdHJdLAorICAgICAgdGFyZ2V0X2NvbmZpZ19maWxlczogbGlzdFtzdHJdLAorICApIC0+IHR1cGxlW2xpc3Rbc3RyXSwgbGlzdFtzdHJdXToKKyAgICAiIiJHZW5lcmF0ZSBnZW5lcmFsLXRlc3RzX2NvbmZpZ3MuemlwIGFuZCBnZW5lcmFsLXRlc3RzX2xpc3QuemlwLgorCisgICAgZ2VuZXJhbC10ZXN0c19jb25maWdzLnppcCBjb250YWlucyBhbGwgb2YgdGhlIC5jb25maWcgZmlsZXMgdGhhdCB3ZXJlCisgICAgYnVpbHQgYW5kIGdlbmVyYWwtdGVzdHNfbGlzdC56aXAgY29udGFpbnMgYSB0ZXh0IGZpbGUgd2hpY2ggbGlzdHMKKyAgICBhbGwgb2YgdGhlIC5jb25maWcgZmlsZXMgdGhhdCBhcmUgaW4gZ2VuZXJhbC10ZXN0c19jb25maWdzLnppcC4KKworICAgIGdlbmVyYWwtdGVzdHNfY29uZmlncy56aXAgaXMgb3JnYW5pemVkIGFzIGZvbGxvd3M6CisgICAgLworICAgICAgaG9zdC8KKyAgICAgICAgdGVzdGNhc2VzLworICAgICAgICAgIHRlc3RfMS5jb25maWcKKyAgICAgICAgICB0ZXN0XzIuY29uZmlnCisgICAgICAgICAgLi4uCisgICAgICB0YXJnZXQvCisgICAgICAgIHRlc3RjYXNlcy8KKyAgICAgICAgICB0ZXN0XzEuY29uZmlnCisgICAgICAgICAgdGVzdF8yLmNvbmZpZworICAgICAgICAgIC4uLgorCisgICAgU28gdGhlIHByb2Nlc3MgaXMgd2Ugd3JpdGUgb3V0IHRoZSBwYXRocyB0byBhbGwgdGhlIGhvc3QgY29uZmlnIGZpbGVzIGludG8KKyAgICBvbmUKKyAgICBmaWxlIGFuZCBhbGwgdGhlIHBhdGhzIHRvIHRoZSB0YXJnZXQgY29uZmlnIGZpbGVzIGluIGFub3RoZXIuIFdlIGFsc28gd3JpdGUKKyAgICB0aGUgcGF0aHMgdG8gYWxsIHRoZSBjb25maWcgZmlsZXMgaW50byBhIHRoaXJkIGZpbGUgdG8gdXNlIGZvcgorICAgIGdlbmVyYWwtdGVzdHNfbGlzdC56aXAuCisKKyAgICBBcmdzOgorICAgICAgZGlzdF9kaXI6IGRpc3QgZGlyZWN0b3J5LgorICAgICAgaG9zdF9vdXQ6IGhvc3Qgb3V0IGRpcmVjdG9yeS4KKyAgICAgIHByb2R1Y3Rfb3V0OiBwcm9kdWN0IG91dCBkaXJlY3RvcnkuCisgICAgICBob3N0X2NvbmZpZ19maWxlczogbGlzdCBvZiBhbGwgaG9zdCBjb25maWcgZmlsZXMuCisgICAgICB0YXJnZXRfY29uZmlnX2ZpbGVzOiBsaXN0IG9mIGFsbCB0YXJnZXQgY29uZmlnIGZpbGVzLgorCisgICAgUmV0dXJuczoKKyAgICAgIFRoZSBjb21tYW5kcyB0byBnZW5lcmF0ZSBnZW5lcmFsLXRlc3RzX2NvbmZpZ3MuemlwIGFuZAorICAgICAgZ2VuZXJhbC10ZXN0c19saXN0LnppcAorICAgICIiIgorICAgIHdpdGggb3BlbigKKyAgICAgICAgZiJ7aG9zdF9vdXQgLyAnaG9zdF9nZW5lcmFsLXRlc3RzX2xpc3QnfSIsICd3JworICAgICkgYXMgaG9zdF9saXN0X2ZpbGUsIG9wZW4oCisgICAgICAgIGYie3Byb2R1Y3Rfb3V0IC8gJ3RhcmdldF9nZW5lcmFsLXRlc3RzX2xpc3QnfSIsICd3JworICAgICkgYXMgdGFyZ2V0X2xpc3RfZmlsZSwgb3BlbigKKyAgICAgICAgZiJ7aG9zdF9vdXQgLyAnZ2VuZXJhbC10ZXN0c19saXN0J30iLCAndycKKyAgICApIGFzIGxpc3RfZmlsZToKKworICAgICAgZm9yIGNvbmZpZ19maWxlIGluIGhvc3RfY29uZmlnX2ZpbGVzOgorICAgICAgICBob3N0X2xpc3RfZmlsZS53cml0ZShmJ3tjb25maWdfZmlsZX0nICsgJ1xuJykKKyAgICAgICAgbGlzdF9maWxlLndyaXRlKCdob3N0LycgKyBvcy5wYXRoLnJlbHBhdGgoY29uZmlnX2ZpbGUsIGhvc3Rfb3V0KSArICdcbicpCisKKyAgICAgIGZvciBjb25maWdfZmlsZSBpbiB0YXJnZXRfY29uZmlnX2ZpbGVzOgorICAgICAgICB0YXJnZXRfbGlzdF9maWxlLndyaXRlKGYne2NvbmZpZ19maWxlfScgKyAnXG4nKQorICAgICAgICBsaXN0X2ZpbGUud3JpdGUoCisgICAgICAgICAgICAndGFyZ2V0LycgKyBvcy5wYXRoLnJlbHBhdGgoY29uZmlnX2ZpbGUsIHByb2R1Y3Rfb3V0KSArICdcbicKKyAgICAgICAgKQorCisgICAgemlwX2NvbW1hbmRzID0gW10KKworICAgIHRlc3RzX2NvbmZpZ196aXBfY29tbWFuZCA9IHNlbGYuX2Jhc2VfemlwX2NvbW1hbmQoCisgICAgICAgIHNyY190b3AsIGRpc3RfZGlyLCAnZ2VuZXJhbC10ZXN0c19jb25maWdzLnppcCcKKyAgICApCisgICAgdGVzdHNfY29uZmlnX3ppcF9jb21tYW5kLmV4dGVuZCgKKyAgICAgICAgc2VsZi5fZ2VuZXJhdGVfemlwX29wdGlvbnNfZm9yX2l0ZW1zKAorICAgICAgICAgICAgcHJlZml4PSdob3N0JywKKyAgICAgICAgICAgIHJlbGF0aXZlX3Jvb3Q9c3RyKGhvc3Rfb3V0KSwKKyAgICAgICAgICAgIGxpc3RfZmlsZXM9W2Yie2hvc3Rfb3V0IC8gJ2hvc3RfZ2VuZXJhbC10ZXN0c19saXN0J30iXSwKKyAgICAgICAgKQorICAgICkKKworICAgIHRlc3RzX2NvbmZpZ196aXBfY29tbWFuZC5leHRlbmQoCisgICAgICAgIHNlbGYuX2dlbmVyYXRlX3ppcF9vcHRpb25zX2Zvcl9pdGVtcygKKyAgICAgICAgICAgIHByZWZpeD0ndGFyZ2V0JywKKyAgICAgICAgICAgIHJlbGF0aXZlX3Jvb3Q9c3RyKHByb2R1Y3Rfb3V0KSwKKyAgICAgICAgICAgIGxpc3RfZmlsZXM9W2Yie3Byb2R1Y3Rfb3V0IC8gJ3RhcmdldF9nZW5lcmFsLXRlc3RzX2xpc3QnfSJdLAorICAgICAgICApLAorICAgICkKKworICAgIHppcF9jb21tYW5kcy5hcHBlbmQodGVzdHNfY29uZmlnX3ppcF9jb21tYW5kKQorCisgICAgdGVzdHNfbGlzdF96aXBfY29tbWFuZCA9IHNlbGYuX2Jhc2VfemlwX2NvbW1hbmQoCisgICAgICAgIHNyY190b3AsIGRpc3RfZGlyLCAnZ2VuZXJhbC10ZXN0c19saXN0LnppcCcKKyAgICApCisgICAgdGVzdHNfbGlzdF96aXBfY29tbWFuZC5leHRlbmQoCisgICAgICAgIHNlbGYuX2dlbmVyYXRlX3ppcF9vcHRpb25zX2Zvcl9pdGVtcygKKyAgICAgICAgICAgIHJlbGF0aXZlX3Jvb3Q9c3RyKGhvc3Rfb3V0KSwKKyAgICAgICAgICAgIGZpbGVzPVtmIntob3N0X291dCAvICdnZW5lcmFsLXRlc3RzX2xpc3QnfSJdLAorICAgICAgICApCisgICAgKQorICAgIHppcF9jb21tYW5kcy5hcHBlbmQodGVzdHNfbGlzdF96aXBfY29tbWFuZCkKKworICAgIHJldHVybiB6aXBfY29tbWFuZHMKKworICBkZWYgZ2V0X2VuYWJsZWRfZmxhZyhzZWxmKToKKyAgICByZXR1cm4gJ2dlbmVyYWxfdGVzdHNfb3B0aW1pemVkJworCisgIEBjbGFzc21ldGhvZAorICBkZWYgZ2V0X29wdGltaXplZF90YXJnZXRzKGNscykgLT4gZGljdFtzdHIsIE9wdGltaXplZEJ1aWxkVGFyZ2V0XToKKyAgICByZXR1cm4geydnZW5lcmFsLXRlc3RzJzogZnVuY3Rvb2xzLnBhcnRpYWwoY2xzKX0KKworCitPUFRJTUlaRURfQlVJTERfVEFSR0VUUyA9IHt9CitPUFRJTUlaRURfQlVJTERfVEFSR0VUUy51cGRhdGUoR2VuZXJhbFRlc3RzT3B0aW1pemVyLmdldF9vcHRpbWl6ZWRfdGFyZ2V0cygpKQpkaWZmIC0tZ2l0IGEvY2kvb3B0aW1pemVkX3RhcmdldHNfdGVzdC5weSBiL2NpL29wdGltaXplZF90YXJnZXRzX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIwYzBlYwotLS0gL2Rldi9udWxsCisrKyBiL2NpL29wdGltaXplZF90YXJnZXRzX3Rlc3QucHkKQEAgLTAsMCArMSwzNTAgQEAKKyMgQ29weXJpZ2h0IDIwMjQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIiIiVGVzdHMgZm9yIG9wdGltaXplZF90YXJnZXRzLnB5IiIiCisKK2ltcG9ydCBqc29uCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCitpbXBvcnQgcGF0aGxpYgoraW1wb3J0IHJlCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHRleHR3cmFwCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdW5pdHRlc3QgaW1wb3J0IG1vY2sKK2Zyb20gYnVpbGRfY29udGV4dCBpbXBvcnQgQnVpbGRDb250ZXh0CitpbXBvcnQgb3B0aW1pemVkX3RhcmdldHMKK2Zyb20gcHlmYWtlZnMgaW1wb3J0IGZha2VfZmlsZXN5c3RlbV91bml0dGVzdAorCisKK2NsYXNzIEdlbmVyYWxUZXN0c09wdGltaXplclRlc3QoZmFrZV9maWxlc3lzdGVtX3VuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgc2V0VXAoc2VsZik6CisgICAgc2VsZi5zZXRVcFB5ZmFrZWZzKCkKKworICAgIG9zX2Vudmlyb25fcGF0Y2hlciA9IG1vY2sucGF0Y2guZGljdCgnb3MuZW52aXJvbicsIHt9KQorICAgIHNlbGYuYWRkQ2xlYW51cChvc19lbnZpcm9uX3BhdGNoZXIuc3RvcCkKKyAgICBzZWxmLm1vY2tfb3NfZW52aXJvbiA9IG9zX2Vudmlyb25fcGF0Y2hlci5zdGFydCgpCisKKyAgICBzZWxmLl9zZXR1cF93b3JraW5nX2J1aWxkX2VudigpCisgICAgc2VsZi5fd3JpdGVfY2hhbmdlX2luZm9fZmlsZSgpCisgICAgdGVzdF9tYXBwaW5nX2RpciA9IHBhdGhsaWIuUGF0aCgnL3Byb2plY3QvcGF0aC9maWxlL3BhdGgnKQorICAgIHRlc3RfbWFwcGluZ19kaXIubWtkaXIocGFyZW50cz1UcnVlKQorICAgIHNlbGYuX3dyaXRlX3Rlc3RfbWFwcGluZ19maWxlKCkKKworICBkZWYgX3NldHVwX3dvcmtpbmdfYnVpbGRfZW52KHNlbGYpOgorICAgIHNlbGYuY2hhbmdlX2luZm9fZmlsZSA9IHBhdGhsaWIuUGF0aCgnL3RtcC9jaGFuZ2VfaW5mbycpCisgICAgc2VsZi5fd3JpdGVfc29vbmdfdWlfZmlsZSgpCisgICAgc2VsZi5faG9zdF9vdXRfdGVzdGNhc2VzID0gcGF0aGxpYi5QYXRoKCcvdG1wL3RvcC9ob3N0X291dF90ZXN0Y2FzZXMnKQorICAgIHNlbGYuX2hvc3Rfb3V0X3Rlc3RjYXNlcy5ta2RpcihwYXJlbnRzPVRydWUpCisgICAgc2VsZi5fdGFyZ2V0X291dF90ZXN0Y2FzZXMgPSBwYXRobGliLlBhdGgoJy90bXAvdG9wL3RhcmdldF9vdXRfdGVzdGNhc2VzJykKKyAgICBzZWxmLl90YXJnZXRfb3V0X3Rlc3RjYXNlcy5ta2RpcihwYXJlbnRzPVRydWUpCisgICAgc2VsZi5fcHJvZHVjdF9vdXQgPSBwYXRobGliLlBhdGgoJy90bXAvdG9wL3Byb2R1Y3Rfb3V0JykKKyAgICBzZWxmLl9wcm9kdWN0X291dC5ta2RpcihwYXJlbnRzPVRydWUpCisgICAgc2VsZi5fc29vbmdfaG9zdF9vdXQgPSBwYXRobGliLlBhdGgoJy90bXAvdG9wL3Nvb25nX2hvc3Rfb3V0JykKKyAgICBzZWxmLl9zb29uZ19ob3N0X291dC5ta2RpcihwYXJlbnRzPVRydWUpCisgICAgc2VsZi5faG9zdF9vdXQgPSBwYXRobGliLlBhdGgoJy90bXAvdG9wL2hvc3Rfb3V0JykKKyAgICBzZWxmLl9ob3N0X291dC5ta2RpcihwYXJlbnRzPVRydWUpCisKKyAgICBzZWxmLl9kaXN0X2RpciA9IHBhdGhsaWIuUGF0aCgnL3RtcC90b3Avb3V0L2Rpc3QnKQorICAgIHNlbGYuX2Rpc3RfZGlyLm1rZGlyKHBhcmVudHM9VHJ1ZSkKKworICAgIHNlbGYubW9ja19vc19lbnZpcm9uLnVwZGF0ZSh7CisgICAgICAgICdDSEFOR0VfSU5GTyc6IHN0cihzZWxmLmNoYW5nZV9pbmZvX2ZpbGUpLAorICAgICAgICAnVE9QJzogJy90bXAvdG9wJywKKyAgICAgICAgJ0RJU1RfRElSJzogJy90bXAvdG9wL291dC9kaXN0JywKKyAgICB9KQorCisgIGRlZiBfd3JpdGVfc29vbmdfdWlfZmlsZShzZWxmKToKKyAgICBzb29uZ19wYXRoID0gcGF0aGxpYi5QYXRoKCcvdG1wL3RvcC9idWlsZC9zb29uZycpCisgICAgc29vbmdfcGF0aC5ta2RpcihwYXJlbnRzPVRydWUpCisgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihzb29uZ19wYXRoLCAnc29vbmdfdWkuYmFzaCcpLCAndycpIGFzIGY6CisgICAgICBmLndyaXRlKCIiIgorICAgICAgICAgICAgICAjL2Jpbi9iYXNoCisgICAgICAgICAgICAgIGVjaG8gSE9TVF9PVVRfVEVTVENBU0VTPScvdG1wL3RvcC9ob3N0X291dF90ZXN0Y2FzZXMnCisgICAgICAgICAgICAgIGVjaG8gVEFSR0VUX09VVF9URVNUQ0FTRVM9Jy90bXAvdG9wL3RhcmdldF9vdXRfdGVzdGNhc2VzJworICAgICAgICAgICAgICBlY2hvIFBST0RVQ1RfT1VUPScvdG1wL3RvcC9wcm9kdWN0X291dCcKKyAgICAgICAgICAgICAgZWNobyBTT09OR19IT1NUX09VVD0nL3RtcC90b3Avc29vbmdfaG9zdF9vdXQnCisgICAgICAgICAgICAgIGVjaG8gSE9TVF9PVVQ9Jy90bXAvdG9wL2hvc3Rfb3V0JworICAgICAgICAgICAgICAiIiIpCisgICAgb3MuY2htb2Qob3MucGF0aC5qb2luKHNvb25nX3BhdGgsICdzb29uZ191aS5iYXNoJyksIDBvNjY2KQorCisgIGRlZiBfd3JpdGVfY2hhbmdlX2luZm9fZmlsZShzZWxmKToKKyAgICBjaGFuZ2VfaW5mb19jb250ZW50cyA9IHsKKyAgICAgICAgJ2NoYW5nZXMnOiBbeworICAgICAgICAgICAgJ3Byb2plY3RQYXRoJzogJy9wcm9qZWN0L3BhdGgnLAorICAgICAgICAgICAgJ3JldmlzaW9ucyc6IFt7CisgICAgICAgICAgICAgICAgJ2ZpbGVJbmZvcyc6IFt7CisgICAgICAgICAgICAgICAgICAgICdwYXRoJzogJ2ZpbGUvcGF0aC9maWxlX25hbWUnLAorICAgICAgICAgICAgICAgIH1dLAorICAgICAgICAgICAgfV0sCisgICAgICAgIH1dCisgICAgfQorCisgICAgd2l0aCBvcGVuKHNlbGYuY2hhbmdlX2luZm9fZmlsZSwgJ3cnKSBhcyBmOgorICAgICAganNvbi5kdW1wKGNoYW5nZV9pbmZvX2NvbnRlbnRzLCBmKQorCisgIGRlZiBfd3JpdGVfdGVzdF9tYXBwaW5nX2ZpbGUoc2VsZik6CisgICAgdGVzdF9tYXBwaW5nX2NvbnRlbnRzID0geworICAgICAgICAndGVzdC1tYXBwaW5nLWdyb3VwJzogWworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICduYW1lJzogJ3Rlc3RfbWFwcGluZ19tb2R1bGUnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgXSwKKyAgICB9CisKKyAgICB3aXRoIG9wZW4oJy9wcm9qZWN0L3BhdGgvZmlsZS9wYXRoL1RFU1RfTUFQUElORycsICd3JykgYXMgZjoKKyAgICAgIGpzb24uZHVtcCh0ZXN0X21hcHBpbmdfY29udGVudHMsIGYpCisKKyAgZGVmIHRlc3RfZ2VuZXJhbF90ZXN0c19vcHRpbWl6ZWQoc2VsZik6CisgICAgb3B0aW1pemVyID0gc2VsZi5fY3JlYXRlX2dlbmVyYWxfdGVzdHNfb3B0aW1pemVyKCkKKworICAgIGJ1aWxkX3RhcmdldHMgPSBvcHRpbWl6ZXIuZ2V0X2J1aWxkX3RhcmdldHMoKQorCisgICAgZXhwZWN0ZWRfYnVpbGRfdGFyZ2V0cyA9IHNldCgKKyAgICAgICAgb3B0aW1pemVkX3RhcmdldHMuR2VuZXJhbFRlc3RzT3B0aW1pemVyLl9SRVFVSVJFRF9NT0RVTEVTCisgICAgKQorICAgIGV4cGVjdGVkX2J1aWxkX3RhcmdldHMuYWRkKCd0ZXN0X21hcHBpbmdfbW9kdWxlJykKKworICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWwoYnVpbGRfdGFyZ2V0cywgZXhwZWN0ZWRfYnVpbGRfdGFyZ2V0cykKKworICBkZWYgdGVzdF9ub19jaGFuZ2VfaW5mb19ub19vcHRpbWl6YXRpb24oc2VsZik6CisgICAgZGVsIG9zLmVudmlyb25bJ0NIQU5HRV9JTkZPJ10KKworICAgIG9wdGltaXplciA9IHNlbGYuX2NyZWF0ZV9nZW5lcmFsX3Rlc3RzX29wdGltaXplcigpCisKKyAgICBidWlsZF90YXJnZXRzID0gb3B0aW1pemVyLmdldF9idWlsZF90YXJnZXRzKCkKKworICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWwoYnVpbGRfdGFyZ2V0cywgeydnZW5lcmFsLXRlc3RzJ30pCisKKyAgZGVmIHRlc3RfbWFwcGluZ19ncm91cHNfdW51c2VkX21vZHVsZV9ub3RfYnVpbHQoc2VsZik6CisgICAgdGVzdF9jb250ZXh0ID0gc2VsZi5fY3JlYXRlX3Rlc3RfY29udGV4dCgpCisgICAgdGVzdF9jb250ZXh0Wyd0ZXN0SW5mb3MnXVswXVsnZXh0cmFPcHRpb25zJ10gPSBbCisgICAgICAgIHsKKyAgICAgICAgICAgICdrZXknOiAnYWRkaXRpb25hbC1maWxlcy1maWx0ZXInLAorICAgICAgICAgICAgJ3ZhbHVlcyc6IFsnZ2VuZXJhbC10ZXN0cy56aXAnXSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgJ2tleSc6ICd0ZXN0LW1hcHBpbmctdGVzdC1ncm91cCcsCisgICAgICAgICAgICAndmFsdWVzJzogWyd1bnVzZWQtdGVzdC1tYXBwaW5nLWdyb3VwJ10sCisgICAgICAgIH0sCisgICAgXQorICAgIG9wdGltaXplciA9IHNlbGYuX2NyZWF0ZV9nZW5lcmFsX3Rlc3RzX29wdGltaXplcigKKyAgICAgICAgYnVpbGRfY29udGV4dD1zZWxmLl9jcmVhdGVfYnVpbGRfY29udGV4dCh0ZXN0X2NvbnRleHQ9dGVzdF9jb250ZXh0KQorICAgICkKKworICAgIGJ1aWxkX3RhcmdldHMgPSBvcHRpbWl6ZXIuZ2V0X2J1aWxkX3RhcmdldHMoKQorCisgICAgZXhwZWN0ZWRfYnVpbGRfdGFyZ2V0cyA9IHNldCgKKyAgICAgICAgb3B0aW1pemVkX3RhcmdldHMuR2VuZXJhbFRlc3RzT3B0aW1pemVyLl9SRVFVSVJFRF9NT0RVTEVTCisgICAgKQorICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWwoYnVpbGRfdGFyZ2V0cywgZXhwZWN0ZWRfYnVpbGRfdGFyZ2V0cykKKworICBkZWYgdGVzdF9nZW5lcmFsX3Rlc3RzX3VzZWRfYnlfbm9uX3Rlc3RfbWFwcGluZ190ZXN0X25vX29wdGltaXphdGlvbihzZWxmKToKKyAgICB0ZXN0X2NvbnRleHQgPSBzZWxmLl9jcmVhdGVfdGVzdF9jb250ZXh0KCkKKyAgICB0ZXN0X2NvbnRleHRbJ3Rlc3RJbmZvcyddWzBdWydleHRyYU9wdGlvbnMnXSA9IFt7CisgICAgICAgICdrZXknOiAnYWRkaXRpb25hbC1maWxlcy1maWx0ZXInLAorICAgICAgICAndmFsdWVzJzogWydnZW5lcmFsLXRlc3RzLnppcCddLAorICAgIH1dCisgICAgb3B0aW1pemVyID0gc2VsZi5fY3JlYXRlX2dlbmVyYWxfdGVzdHNfb3B0aW1pemVyKAorICAgICAgICBidWlsZF9jb250ZXh0PXNlbGYuX2NyZWF0ZV9idWlsZF9jb250ZXh0KHRlc3RfY29udGV4dD10ZXN0X2NvbnRleHQpCisgICAgKQorCisgICAgYnVpbGRfdGFyZ2V0cyA9IG9wdGltaXplci5nZXRfYnVpbGRfdGFyZ2V0cygpCisKKyAgICBzZWxmLmFzc2VydFNldEVxdWFsKGJ1aWxkX3RhcmdldHMsIHsnZ2VuZXJhbC10ZXN0cyd9KQorCisgIGRlZiB0ZXN0X21hbGZvcm1lZF9jaGFuZ2VfaW5mb19yYWlzZXMoc2VsZik6CisgICAgd2l0aCBvcGVuKHNlbGYuY2hhbmdlX2luZm9fZmlsZSwgJ3cnKSBhcyBmOgorICAgICAgZi53cml0ZSgnbm90IGNoYW5nZSBpbmZvJykKKworICAgIG9wdGltaXplciA9IHNlbGYuX2NyZWF0ZV9nZW5lcmFsX3Rlc3RzX29wdGltaXplcigpCisKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKGpzb24uZGVjb2Rlci5KU09ORGVjb2RlRXJyb3IpOgorICAgICAgYnVpbGRfdGFyZ2V0cyA9IG9wdGltaXplci5nZXRfYnVpbGRfdGFyZ2V0cygpCisKKyAgZGVmIHRlc3RfbWFsZm9ybWVkX3Rlc3RfbWFwcGluZ19yYWlzZXMoc2VsZik6CisgICAgd2l0aCBvcGVuKCcvcHJvamVjdC9wYXRoL2ZpbGUvcGF0aC9URVNUX01BUFBJTkcnLCAndycpIGFzIGY6CisgICAgICBmLndyaXRlKCdub3QgdGVzdCBtYXBwaW5nJykKKworICAgIG9wdGltaXplciA9IHNlbGYuX2NyZWF0ZV9nZW5lcmFsX3Rlc3RzX29wdGltaXplcigpCisKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKGpzb24uZGVjb2Rlci5KU09ORGVjb2RlRXJyb3IpOgorICAgICAgYnVpbGRfdGFyZ2V0cyA9IG9wdGltaXplci5nZXRfYnVpbGRfdGFyZ2V0cygpCisKKyAgQG1vY2sucGF0Y2goJ3N1YnByb2Nlc3MucnVuJykKKyAgZGVmIHRlc3RfcGFja2FnaW5nX291dHB1dHNfc3VjY2VzcyhzZWxmLCBzdWJwcm9jZXNzX3J1bik6CisgICAgc3VicHJvY2Vzc19ydW4ucmV0dXJuX3ZhbHVlID0gc2VsZi5fZ2V0X3Nvb25nX3ZhcnNfb3V0cHV0KCkKKyAgICBvcHRpbWl6ZXIgPSBzZWxmLl9jcmVhdGVfZ2VuZXJhbF90ZXN0c19vcHRpbWl6ZXIoKQorICAgIHNlbGYuX3NldF91cF9idWlsZF9vdXRwdXRzKFsndGVzdF9tYXBwaW5nX21vZHVsZSddKQorCisgICAgdGFyZ2V0cyA9IG9wdGltaXplci5nZXRfYnVpbGRfdGFyZ2V0cygpCisgICAgcGFja2FnZV9jb21tYW5kcyA9IG9wdGltaXplci5nZXRfcGFja2FnZV9vdXRwdXRzX2NvbW1hbmRzKCkKKworICAgIHNlbGYuX3ZlcmlmeV9zb29uZ196aXBfY29tbWFuZHMocGFja2FnZV9jb21tYW5kcywgWyd0ZXN0X21hcHBpbmdfbW9kdWxlJ10pCisKKyAgQG1vY2sucGF0Y2goJ3N1YnByb2Nlc3MucnVuJykKKyAgZGVmIHRlc3RfZ2V0X3Nvb25nX2R1bXB2YXJzX2ZhaWxzX3JhaXNlcyhzZWxmLCBzdWJwcm9jZXNzX3J1bik6CisgICAgc3VicHJvY2Vzc19ydW4ucmV0dXJuX3ZhbHVlID0gc2VsZi5fZ2V0X3Nvb25nX3ZhcnNfb3V0cHV0KHJldHVybl9jb2RlPS0xKQorICAgIG9wdGltaXplciA9IHNlbGYuX2NyZWF0ZV9nZW5lcmFsX3Rlc3RzX29wdGltaXplcigpCisgICAgc2VsZi5fc2V0X3VwX2J1aWxkX291dHB1dHMoWyd0ZXN0X21hcHBpbmdfbW9kdWxlJ10pCisKKyAgICB0YXJnZXRzID0gb3B0aW1pemVyLmdldF9idWlsZF90YXJnZXRzKCkKKworICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChSdW50aW1lRXJyb3IsICdTb29uZyBkdW1wdmFycyBmYWlsZWQhJyk6CisgICAgICBwYWNrYWdlX2NvbW1hbmRzID0gb3B0aW1pemVyLmdldF9wYWNrYWdlX291dHB1dHNfY29tbWFuZHMoKQorCisgIEBtb2NrLnBhdGNoKCdzdWJwcm9jZXNzLnJ1bicpCisgIGRlZiB0ZXN0X2dldF9zb29uZ19kdW1wdmFyc19iYWRfb3V0cHV0X3JhaXNlcyhzZWxmLCBzdWJwcm9jZXNzX3J1bik6CisgICAgc3VicHJvY2Vzc19ydW4ucmV0dXJuX3ZhbHVlID0gc2VsZi5fZ2V0X3Nvb25nX3ZhcnNfb3V0cHV0KAorICAgICAgICBzdGRvdXQ9J1RoaXMgb3V0cHV0IGlzIGJhZCcKKyAgICApCisgICAgb3B0aW1pemVyID0gc2VsZi5fY3JlYXRlX2dlbmVyYWxfdGVzdHNfb3B0aW1pemVyKCkKKyAgICBzZWxmLl9zZXRfdXBfYnVpbGRfb3V0cHV0cyhbJ3Rlc3RfbWFwcGluZ19tb2R1bGUnXSkKKworICAgIHRhcmdldHMgPSBvcHRpbWl6ZXIuZ2V0X2J1aWxkX3RhcmdldHMoKQorCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KAorICAgICAgICBSdW50aW1lRXJyb3IsICdFcnJvciBwYXJzaW5nIHNvb25nIGR1bXB2YXJzIG91dHB1dCcKKyAgICApOgorICAgICAgcGFja2FnZV9jb21tYW5kcyA9IG9wdGltaXplci5nZXRfcGFja2FnZV9vdXRwdXRzX2NvbW1hbmRzKCkKKworICBkZWYgX2NyZWF0ZV9nZW5lcmFsX3Rlc3RzX29wdGltaXplcihzZWxmLCBidWlsZF9jb250ZXh0OiBCdWlsZENvbnRleHQgPSBOb25lKToKKyAgICBpZiBub3QgYnVpbGRfY29udGV4dDoKKyAgICAgIGJ1aWxkX2NvbnRleHQgPSBzZWxmLl9jcmVhdGVfYnVpbGRfY29udGV4dCgpCisgICAgcmV0dXJuIG9wdGltaXplZF90YXJnZXRzLkdlbmVyYWxUZXN0c09wdGltaXplcigKKyAgICAgICAgJ2dlbmVyYWwtdGVzdHMnLCBidWlsZF9jb250ZXh0LCBOb25lCisgICAgKQorCisgIGRlZiBfY3JlYXRlX2J1aWxkX2NvbnRleHQoCisgICAgICBzZWxmLAorICAgICAgZ2VuZXJhbF90ZXN0c19vcHRpbWl6ZWQ6IGJvb2wgPSBUcnVlLAorICAgICAgdGVzdF9jb250ZXh0OiBkaWN0W3N0ciwgYW55XSA9IE5vbmUsCisgICkgLT4gQnVpbGRDb250ZXh0OgorICAgIGlmIG5vdCB0ZXN0X2NvbnRleHQ6CisgICAgICB0ZXN0X2NvbnRleHQgPSBzZWxmLl9jcmVhdGVfdGVzdF9jb250ZXh0KCkKKyAgICBidWlsZF9jb250ZXh0X2RpY3QgPSB7fQorICAgIGJ1aWxkX2NvbnRleHRfZGljdFsnZW5hYmxlZEJ1aWxkRmVhdHVyZXMnXSA9IFt7J25hbWUnOiAnb3B0aW1pemVkX2J1aWxkJ31dCisgICAgaWYgZ2VuZXJhbF90ZXN0c19vcHRpbWl6ZWQ6CisgICAgICBidWlsZF9jb250ZXh0X2RpY3RbJ2VuYWJsZWRCdWlsZEZlYXR1cmVzJ10uYXBwZW5kKAorICAgICAgICAgIHsnbmFtZSc6ICdnZW5lcmFsX3Rlc3RzX29wdGltaXplZCd9CisgICAgICApCisgICAgYnVpbGRfY29udGV4dF9kaWN0Wyd0ZXN0Q29udGV4dCddID0gdGVzdF9jb250ZXh0CisgICAgcmV0dXJuIEJ1aWxkQ29udGV4dChidWlsZF9jb250ZXh0X2RpY3QpCisKKyAgZGVmIF9jcmVhdGVfdGVzdF9jb250ZXh0KHNlbGYpOgorICAgIHJldHVybiB7CisgICAgICAgICd0ZXN0SW5mb3MnOiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJ25hbWUnOiAnYXRwX3Rlc3QnLAorICAgICAgICAgICAgICAgICd0YXJnZXQnOiAndGVzdF90YXJnZXQnLAorICAgICAgICAgICAgICAgICdicmFuY2gnOiAnYnJhbmNoJywKKyAgICAgICAgICAgICAgICAnZXh0cmFPcHRpb25zJzogWworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAna2V5JzogJ2FkZGl0aW9uYWwtZmlsZXMtZmlsdGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZXMnOiBbJ2dlbmVyYWwtdGVzdHMuemlwJ10sCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICdrZXknOiAndGVzdC1tYXBwaW5nLXRlc3QtZ3JvdXAnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlcyc6IFsndGVzdC1tYXBwaW5nLWdyb3VwJ10sCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAnY29tbWFuZCc6ICcvdGYvY29tbWFuZCcsCisgICAgICAgICAgICAgICAgJ2V4dHJhQnVpbGRUYXJnZXRzJzogWworICAgICAgICAgICAgICAgICAgICAnZXh0cmFfYnVpbGRfdGFyZ2V0JywKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgfSwKKyAgICAgICAgXSwKKyAgICB9CisKKyAgZGVmIF9nZXRfc29vbmdfdmFyc19vdXRwdXQoCisgICAgICBzZWxmLCByZXR1cm5fY29kZTogaW50ID0gMCwgc3Rkb3V0OiBzdHIgPSAnJworICApIC0+IHN1YnByb2Nlc3MuQ29tcGxldGVkUHJvY2VzczoKKyAgICByZXR1cm5fdmFsdWUgPSBzdWJwcm9jZXNzLkNvbXBsZXRlZFByb2Nlc3MoYXJncz1bXSwgcmV0dXJuY29kZT1yZXR1cm5fY29kZSkKKyAgICBpZiBub3Qgc3Rkb3V0OgorICAgICAgc3Rkb3V0ID0gdGV4dHdyYXAuZGVkZW50KGYiIiJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSE9TVF9PVVRfVEVTVENBU0VTPSd7c2VsZi5faG9zdF9vdXRfdGVzdGNhc2VzfScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQVJHRVRfT1VUX1RFU1RDQVNFUz0ne3NlbGYuX3RhcmdldF9vdXRfdGVzdGNhc2VzfScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9EVUNUX09VVD0ne3NlbGYuX3Byb2R1Y3Rfb3V0fScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT09OR19IT1NUX09VVD0ne3NlbGYuX3Nvb25nX2hvc3Rfb3V0fScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIT1NUX09VVD0ne3NlbGYuX2hvc3Rfb3V0fSciIiIpCisKKyAgICByZXR1cm5fdmFsdWUuc3Rkb3V0ID0gc3Rkb3V0CisgICAgcmV0dXJuIHJldHVybl92YWx1ZQorCisgIGRlZiBfc2V0X3VwX2J1aWxkX291dHB1dHMoc2VsZiwgdGFyZ2V0czogbGlzdFtzdHJdKToKKyAgICBmb3IgdGFyZ2V0IGluIHRhcmdldHM6CisgICAgICBob3N0X2RpciA9IHNlbGYuX2hvc3Rfb3V0X3Rlc3RjYXNlcyAvIHRhcmdldAorICAgICAgaG9zdF9kaXIubWtkaXIoKQorICAgICAgKGhvc3RfZGlyIC8gZid7dGFyZ2V0fS5jb25maWcnKS50b3VjaCgpCisgICAgICAoaG9zdF9kaXIgLyBmJ3Rlc3RfZmlsZScpLnRvdWNoKCkKKworICAgICAgdGFyZ2V0X2RpciA9IHNlbGYuX3RhcmdldF9vdXRfdGVzdGNhc2VzIC8gdGFyZ2V0CisgICAgICB0YXJnZXRfZGlyLm1rZGlyKCkKKyAgICAgICh0YXJnZXRfZGlyIC8gZid7dGFyZ2V0fS5jb25maWcnKS50b3VjaCgpCisgICAgICAodGFyZ2V0X2RpciAvIGYndGVzdF9maWxlJykudG91Y2goKQorCisgIGRlZiBfdmVyaWZ5X3Nvb25nX3ppcF9jb21tYW5kcyhzZWxmLCBjb21tYW5kczogbGlzdFtzdHJdLCB0YXJnZXRzOiBsaXN0W3N0cl0pOgorICAgICIiIlZlcmlmeSB0aGUgc3RydWN0dXJlIG9mIHRoZSB6aXAgY29tbWFuZHMuCisKKyAgICBaaXAgY29tbWFuZHMgaGF2ZSB0byBzdGFydCB3aXRoIHRoZSBzb29uZ196aXAgYmluYXJ5IHBhdGgsIHRoZW4gYXJlIGZvbGxvd2VkCisgICAgYnkgYSBjb3VwbGUgb2Ygb3B0aW9ucyBhbmQgdGhlIG5hbWUgb2YgdGhlIGZpbGUgYmVpbmcgemlwcGVkLiBEZXBlbmRpbmcgb24KKyAgICB3aGljaCB6aXAgd2UgYXJlIGNyZWF0aW5nIGxvb2sgZm9yIGEgZmV3IGVzc2VudGlhbCBpdGVtcyBiZWluZyBhZGRlZCBpbgorICAgIHRob3NlIHppcHMuCisKKyAgICBBcmdzOgorICAgICAgY29tbWFuZHM6IGxpc3Qgb2YgY29tbWFuZCBsaXN0cworICAgICAgdGFyZ2V0czogbGlzdCBvZiB0YXJnZXRzIGV4cGVjdGVkIHRvIGJlIGluIGdlbmVyYWwtdGVzdHMuemlwCisgICAgIiIiCisgICAgZm9yIGNvbW1hbmQgaW4gY29tbWFuZHM6CisgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICcvdG1wL3RvcC9wcmVidWlsdHMvYnVpbGQtdG9vbHMvbGludXgteDg2L2Jpbi9zb29uZ196aXAnLAorICAgICAgICAgIGNvbW1hbmRbMF0sCisgICAgICApCisgICAgICBzZWxmLmFzc2VydEVxdWFsKCctZCcsIGNvbW1hbmRbMV0pCisgICAgICBzZWxmLmFzc2VydEVxdWFsKCctbycsIGNvbW1hbmRbMl0pCisgICAgICBtYXRjaCAoY29tbWFuZFszXSk6CisgICAgICAgIGNhc2UgJy90bXAvdG9wL291dC9kaXN0L2dlbmVyYWwtdGVzdHNfY29uZmlncy56aXAnOgorICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZid7c2VsZi5faG9zdF9vdXR9L2hvc3RfZ2VuZXJhbC10ZXN0c19saXN0JywgY29tbWFuZCkKKyAgICAgICAgICBzZWxmLmFzc2VydEluKAorICAgICAgICAgICAgICBmJ3tzZWxmLl9wcm9kdWN0X291dH0vdGFyZ2V0X2dlbmVyYWwtdGVzdHNfbGlzdCcsIGNvbW1hbmQKKyAgICAgICAgICApCisgICAgICAgICAgcmV0dXJuCisgICAgICAgIGNhc2UgJy90bXAvdG9wL291dC9kaXN0L2dlbmVyYWwtdGVzdHNfbGlzdC56aXAnOgorICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJy1mJywgY29tbWFuZCkKKyAgICAgICAgICBzZWxmLmFzc2VydEluKGYne3NlbGYuX2hvc3Rfb3V0fS9nZW5lcmFsLXRlc3RzX2xpc3QnLCBjb21tYW5kKQorICAgICAgICAgIHJldHVybgorICAgICAgICBjYXNlICcvdG1wL3RvcC9vdXQvZGlzdC9nZW5lcmFsLXRlc3RzLnppcCc6CisgICAgICAgICAgZm9yIHRhcmdldCBpbiB0YXJnZXRzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihmJ3tzZWxmLl9ob3N0X291dF90ZXN0Y2FzZXN9L3t0YXJnZXR9JywgY29tbWFuZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZid7c2VsZi5fdGFyZ2V0X291dF90ZXN0Y2FzZXN9L3t0YXJnZXR9JywgY29tbWFuZCkKKyAgICAgICAgICBzZWxmLmFzc2VydEluKAorICAgICAgICAgICAgICBmJ3tzZWxmLl9zb29uZ19ob3N0X291dH0vZnJhbWV3b3JrL2N0cy10cmFkZWZlZC5qYXInLCBjb21tYW5kCisgICAgICAgICAgKQorICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oCisgICAgICAgICAgICAgIGYne3NlbGYuX3Nvb25nX2hvc3Rfb3V0fS9mcmFtZXdvcmsvY29tcGF0aWJpbGl0eS1ob3N0LXV0aWwuamFyJywKKyAgICAgICAgICAgICAgY29tbWFuZCwKKyAgICAgICAgICApCisgICAgICAgICAgc2VsZi5hc3NlcnRJbigKKyAgICAgICAgICAgICAgZid7c2VsZi5fc29vbmdfaG9zdF9vdXR9L2ZyYW1ld29yay92dHMtdHJhZGVmZWQuamFyJywgY29tbWFuZAorICAgICAgICAgICkKKyAgICAgICAgICByZXR1cm4KKyAgICAgICAgY2FzZSBfOgorICAgICAgICAgIHNlbGYuZmFpbChmJ21hbGZvcm1lZCBjb21tYW5kOiB7Y29tbWFuZH0nKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICMgU2V0dXAgbG9nZ2luZyB0byBiZSBzaWxlbnQgc28gdW5pdCB0ZXN0cyBjYW4gcGFzcyB0aHJvdWdoIFRGLgorICBsb2dnaW5nLmRpc2FibGUobG9nZ2luZy5FUlJPUikKKyAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9jaS90ZXN0X2Rpc2NvdmVyeV9hZ2VudC5weSBiL2NpL3Rlc3RfZGlzY292ZXJ5X2FnZW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwOGVlNDcKLS0tIC9kZXYvbnVsbAorKysgYi9jaS90ZXN0X2Rpc2NvdmVyeV9hZ2VudC5weQpAQCAtMCwwICsxLDEyMCBAQAorIyBDb3B5cmlnaHQgMjAyNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIiIiVGVzdCBkaXNjb3ZlcnkgYWdlbnQgdGhhdCB1c2VzIFRyYWRlRmVkIHRvIGRpc2NvdmVyIHRlc3QgYXJ0aWZhY3RzLiIiIgoraW1wb3J0IGdsb2IKK2ltcG9ydCBqc29uCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCitpbXBvcnQgc3VicHJvY2VzcworCisKK2NsYXNzIFRlc3REaXNjb3ZlcnlBZ2VudDoKKyAgIiIiVGVzdCBkaXNjb3ZlcnkgYWdlbnQuIiIiCisKKyAgX1RSQURFRkVEX1BSRUJVSUxUX0pBUl9SRUxBVElWRV9QQVRIID0gKAorICAgICAgInZlbmRvci9nb29nbGVfdHJhZGVmZWRlcmF0aW9uL3ByZWJ1aWx0cy9maWxlZ3JvdXBzL2dvb2dsZS10cmFkZWZlZC8iCisgICkKKworICBfVFJBREVGRURfTk9fUE9TU0lCTEVfVEVTVF9ESVNDT1ZFUllfS0VZID0gIk5vUG9zc2libGVUZXN0RGlzY292ZXJ5IgorCisgIF9UUkFERUZFRF9URVNUX1pJUF9SRUdFWEVTX0xJU1RfS0VZID0gIlRlc3RaaXBSZWdleGVzIgorCisgIF9UUkFERUZFRF9ESVNDT1ZFUllfT1VUUFVUX0ZJTEVfTkFNRSA9ICJ0ZXN0X2Rpc2NvdmVyeV9hZ2VudC50eHQiCisKKyAgZGVmIF9faW5pdF9fKAorICAgICAgc2VsZiwKKyAgICAgIHRyYWRlZmVkX2FyZ3M6IGxpc3Rbc3RyXSwKKyAgICAgIHRlc3RfbWFwcGluZ196aXBfcGF0aDogc3RyID0gIiIsCisgICAgICB0cmFkZWZlZF9qYXJfcmV2ZWxhbnRfZmlsZXNfcGF0aDogc3RyID0gX1RSQURFRkVEX1BSRUJVSUxUX0pBUl9SRUxBVElWRV9QQVRILAorICApOgorICAgIHNlbGYudHJhZGVmZWRfYXJncyA9IHRyYWRlZmVkX2FyZ3MKKyAgICBzZWxmLnRlc3RfbWFwcGluZ196aXBfcGF0aCA9IHRlc3RfbWFwcGluZ196aXBfcGF0aAorICAgIHNlbGYudHJhZGVmZWRfamFyX3JlbGV2YW50X2ZpbGVzX3BhdGggPSB0cmFkZWZlZF9qYXJfcmV2ZWxhbnRfZmlsZXNfcGF0aAorCisgIGRlZiBkaXNjb3Zlcl90ZXN0X3ppcF9yZWdleGVzKHNlbGYpIC0+IGxpc3Rbc3RyXToKKyAgICAiIiJEaXNjb3ZlciB0ZXN0IHppcCByZWdleGVzIGZyb20gVHJhZGVGZWQuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBsaXN0IG9mIHRlc3QgemlwIHJlZ2V4ZXMgdGhhdCBURiBpcyBnb2luZyB0byB0cnkgdG8gcHVsbCBmaWxlcyBmcm9tLgorICAgICIiIgorICAgIHRlc3RfZGlzY292ZXJ5X291dHB1dF9maWxlX25hbWUgPSBvcy5wYXRoLmpvaW4oCisgICAgICAgIG9zLmVudmlyb24uZ2V0KCdUT1AnKSwgJ291dCcsIHNlbGYuX1RSQURFRkVEX0RJU0NPVkVSWV9PVVRQVVRfRklMRV9OQU1FCisgICAgKQorICAgIHdpdGggb3BlbigKKyAgICAgICAgdGVzdF9kaXNjb3Zlcnlfb3V0cHV0X2ZpbGVfbmFtZSwgbW9kZT0idyt0IgorICAgICkgYXMgdGVzdF9kaXNjb3Zlcnlfb3V0cHV0X2ZpbGU6CisgICAgICBqYXZhX2FyZ3MgPSBbXQorICAgICAgamF2YV9hcmdzLmFwcGVuZCgicHJlYnVpbHRzL2pkay9qZGsyMS9saW51eC14ODYvYmluL2phdmEiKQorICAgICAgamF2YV9hcmdzLmFwcGVuZCgiLWNwIikKKyAgICAgIGphdmFfYXJncy5hcHBlbmQoCisgICAgICAgICAgc2VsZi5jcmVhdGVfY2xhc3NwYXRoKHNlbGYudHJhZGVmZWRfamFyX3JlbGV2YW50X2ZpbGVzX3BhdGgpCisgICAgICApCisgICAgICBqYXZhX2FyZ3MuYXBwZW5kKAorICAgICAgICAgICJjb20uYW5kcm9pZC50cmFkZWZlZC5vYnNlcnZhdG9yeS5UZXN0WmlwRGlzY292ZXJ5RXhlY3V0b3IiCisgICAgICApCisgICAgICBqYXZhX2FyZ3MuZXh0ZW5kKHNlbGYudHJhZGVmZWRfYXJncykKKyAgICAgIGVudiA9IG9zLmVudmlyb24uY29weSgpCisgICAgICBlbnYudXBkYXRlKHsiRElTQ09WRVJZX09VVFBVVF9GSUxFIjogdGVzdF9kaXNjb3Zlcnlfb3V0cHV0X2ZpbGUubmFtZX0pCisgICAgICBsb2dnaW5nLmluZm8oZiJDYWxsaW5nIHRlc3QgZGlzY292ZXJ5IHdpdGggYXJnczoge2phdmFfYXJnc30iKQorICAgICAgdHJ5OgorICAgICAgICByZXN1bHQgPSBzdWJwcm9jZXNzLnJ1bihhcmdzPWphdmFfYXJncywgZW52PWVudiwgdGV4dD1UcnVlLCBjaGVjaz1UcnVlKQorICAgICAgICBsb2dnaW5nLmluZm8oZiJUZXN0IHppcCBkaXNjb3Zlcnkgb3V0cHV0OiB7cmVzdWx0LnN0ZG91dH0iKQorICAgICAgZXhjZXB0IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yIGFzIGU6CisgICAgICAgIHJhaXNlIFRlc3REaXNjb3ZlcnlFcnJvcigKKyAgICAgICAgICAgIGYiRmFpbGVkIHRvIHJ1biB0ZXN0IGRpc2NvdmVyeSwgc3Ryb3V0OiB7ZS5zdGRvdXR9LCBzdHJlcnI6IgorICAgICAgICAgICAgZiIge2Uuc3RkZXJyfSwgcmV0dXJuY29kZToge2UucmV0dXJuY29kZX0iCisgICAgICAgICkKKyAgICAgIGRhdGEgPSBqc29uLmxvYWRzKHRlc3RfZGlzY292ZXJ5X291dHB1dF9maWxlLnJlYWQoKSkKKyAgICAgIGxvZ2dpbmcuaW5mbyhmIlRlc3QgZGlzY292ZXJ5IHJlc3VsdCBmaWxlIGNvbnRlbnQ6IHtkYXRhfSIpCisgICAgICBpZiAoCisgICAgICAgICAgc2VsZi5fVFJBREVGRURfTk9fUE9TU0lCTEVfVEVTVF9ESVNDT1ZFUllfS0VZIGluIGRhdGEKKyAgICAgICAgICBhbmQgZGF0YVtzZWxmLl9UUkFERUZFRF9OT19QT1NTSUJMRV9URVNUX0RJU0NPVkVSWV9LRVldCisgICAgICApOgorICAgICAgICByYWlzZSBUZXN0RGlzY292ZXJ5RXJyb3IoIk5vIHBvc3NpYmxlIHRlc3QgZGlzY292ZXJ5IikKKyAgICAgIGlmICgKKyAgICAgICAgICBkYXRhW3NlbGYuX1RSQURFRkVEX1RFU1RfWklQX1JFR0VYRVNfTElTVF9LRVldIGlzIE5vbmUKKyAgICAgICAgICBvciBkYXRhW3NlbGYuX1RSQURFRkVEX1RFU1RfWklQX1JFR0VYRVNfTElTVF9LRVldIGlzIFtdCisgICAgICApOgorICAgICAgICByYWlzZSBUZXN0RGlzY292ZXJ5RXJyb3IoIk5vIHRlc3QgemlwIHJlZ2V4ZXMgcmV0dXJuZWQiKQorICAgICAgcmV0dXJuIGRhdGFbc2VsZi5fVFJBREVGRURfVEVTVF9aSVBfUkVHRVhFU19MSVNUX0tFWV0KKworICBkZWYgZGlzY292ZXJfdGVzdF9tb2R1bGVzKHNlbGYpIC0+IGxpc3Rbc3RyXToKKyAgICAiIiJEaXNjb3ZlciB0ZXN0IG1vZHVsZXMgZnJvbSBUcmFkZUZlZC4KKworICAgIFJldHVybnM6CisgICAgICBBIGxpc3Qgb2YgdGVzdCBtb2R1bGVzIHRoYXQgVHJhZGVGZWQgaXMgZ29pbmcgdG8gZXhlY3V0ZSBiYXNlZCBvbiB0aGUKKyAgICAgIFRyYWRlRmVkIHRlc3QgYXJncy4KKyAgICAiIiIKKyAgICByZXR1cm4gW10KKworICBkZWYgY3JlYXRlX2NsYXNzcGF0aChzZWxmLCBkaXJlY3RvcnkpOgorICAgICIiIkNyZWF0ZXMgYSBjbGFzc3BhdGggc3RyaW5nIGZyb20gYWxsIC5qYXIgZmlsZXMgaW4gdGhlIGdpdmVuIGRpcmVjdG9yeS4KKworICAgIEFyZ3M6CisgICAgICBkaXJlY3Rvcnk6IFRoZSBkaXJlY3RvcnkgdG8gc2VhcmNoIGZvciAuamFyIGZpbGVzLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY2xhc3NwYXRoLCB3aXRoIGphciBmaWxlcyBzZXBhcmF0ZWQgYnkgdGhlCisgICAgICBPUy1zcGVjaWZpYyBwYXRoIHNlcGFyYXRvciAoZS5nLiwgJzonIG9uIExpbnV4L21hY09TLCAnOycgb24gV2luZG93cykuCisgICAgIiIiCisgICAgamFyX2ZpbGVzID0gZ2xvYi5nbG9iKG9zLnBhdGguam9pbihkaXJlY3RvcnksICIqLmphciIpKQorICAgIHJldHVybiBvcy5wYXRoc2VwLmpvaW4oamFyX2ZpbGVzKQorCisKK2NsYXNzIFRlc3REaXNjb3ZlcnlFcnJvcihFeGNlcHRpb24pOgorICAiIiJBIFRlc3REaXNjb3ZlcnlFcnJvcmNsYXNzLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlKToKKyAgICBzdXBlcigpLl9faW5pdF9fKG1lc3NhZ2UpCisgICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQpkaWZmIC0tZ2l0IGEvY2kvdGVzdF9tYXBwaW5nX21vZHVsZV9yZXRyaWV2ZXIucHkgYi9jaS90ZXN0X21hcHBpbmdfbW9kdWxlX3JldHJpZXZlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTNjZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY2kvdGVzdF9tYXBwaW5nX21vZHVsZV9yZXRyaWV2ZXIucHkKQEAgLTAsMCArMSwxOTIgQEAKKyMgQ29weXJpZ2h0IDIwMjQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIiIiCitTaW1wbGUgcGFyc2luZyBjb2RlIHRvIHNjYW4gdGVzdF9tYXBwaW5nIGZpbGVzIGFuZCBkZXRlcm1pbmUgd2hpY2gKK21vZHVsZXMgYXJlIG5lZWRlZCB0byBidWlsZCBmb3IgdGhlIGdpdmVuIGxpc3Qgb2YgY2hhbmdlZCBmaWxlcy4KK1RPRE8obHVjYWZhcnNpKTogRGVkdXBsaWNhdGUgZnJvbSBhcnRpZmFjdF9oZWxwZXIucHkKKyIiIgorIyBUT0RPKGx1Y2FmYXJzaSk6IFNoYXJlIHRoaXMgbG9naWMgd2l0aCB0aGUgb3JpZ2luYWwgbG9naWMgaW4KKyMgdGVzdF9tYXBwaW5nX3Rlc3RfcmV0cmlldmVyLnB5CisKK2ltcG9ydCBqc29uCitpbXBvcnQgb3MKK2ltcG9ydCByZQorZnJvbSB0eXBpbmcgaW1wb3J0IEFueQorCisjIFJlZ2V4IHRvIGV4dHJhIHRlc3QgbmFtZSBmcm9tIHRoZSBwYXRoIG9mIHRlc3QgY29uZmlnIGZpbGUuCitURVNUX05BTUVfUkVHRVggPSByJyg/Ol58LiovKShbXi9dKylcLmNvbmZpZycKKworIyBLZXkgbmFtZSBmb3IgVEVTVF9NQVBQSU5HIGltcG9ydHMKK0tFWV9JTVBPUlRTID0gJ2ltcG9ydHMnCitLRVlfSU1QT1JUX1BBVEggPSAncGF0aCcKKworIyBOYW1lIG9mIFRFU1RfTUFQUElORyBmaWxlLgorVEVTVF9NQVBQSU5HID0gJ1RFU1RfTUFQUElORycKKworIyBQYXR0ZXJuIHVzZWQgdG8gaWRlbnRpZnkgZG91YmxlLXF1b3RlZCBzdHJpbmdzIGFuZCAnLy8nLWZvcm1hdCBjb21tZW50cyBpbgorIyBURVNUX01BUFBJTkcgZmlsZSwgYnV0IG9ubHkgZG91YmxlLXF1b3RlZCBzdHJpbmdzIGFyZSBpbmNsdWRlZCB3aXRoaW4gdGhlCisjIG1hdGNoaW5nIGdyb3VwLgorX0NPTU1FTlRTX1JFID0gcmUuY29tcGlsZShyJyhcIig/OlteXCJcXF18XFwuKSpcInwoPz0vLykpKD86Ly8uKik/JykKKworCitkZWYgRmlsdGVyQ29tbWVudHModGVzdF9tYXBwaW5nX2ZpbGU6IHN0cikgLT4gc3RyOgorICAiIiJSZW1vdmUgY29tbWVudHMgaW4gVEVTVF9NQVBQSU5HIGZpbGUgdG8gdmFsaWQgZm9ybWF0LgorCisgIE9ubHkgJy8vJyBpcyByZWdhcmRlZCBhcyBjb21tZW50cy4KKworICBBcmdzOgorICAgIHRlc3RfbWFwcGluZ19maWxlOiBQYXRoIHRvIGEgVEVTVF9NQVBQSU5HIGZpbGUuCisKKyAgUmV0dXJuczoKKyAgICBWYWxpZCBqc29uIHN0cmluZyB3aXRob3V0IGNvbW1lbnRzLgorICAiIiIKKyAgcmV0dXJuIHJlLnN1YihfQ09NTUVOVFNfUkUsIHInXDEnLCB0ZXN0X21hcHBpbmdfZmlsZSkKKworZGVmIEdldFRlc3RNYXBwaW5ncyhwYXRoczogc2V0W3N0cl0sCisgICAgICAgICAgICAgICAgICAgIGNoZWNrZWRfcGF0aHM6IHNldFtzdHJdKSAtPiBkaWN0W3N0ciwgZGljdFtzdHIsIEFueV1dOgorICAiIiJHZXQgdGhlIGFmZmVjdGVkIFRFU1RfTUFQUElORyBmaWxlcy4KKworICBURVNUX01BUFBJTkcgZmlsZXMgaW4gc291cmNlIGNvZGUgYXJlIHBhY2thZ2VkIGludG8gYSBidWlsZCBhcnRpZmFjdAorICBgdGVzdF9tYXBwaW5ncy56aXBgLiBJbnNpZGUgdGhlIHppcCBmaWxlLCB0aGUgcGF0aCBvZiBlYWNoIFRFU1RfTUFQUElORyBmaWxlCisgIGlzIHByZXNlcnZlZC4gRnJvbSBhbGwgVEVTVF9NQVBQSU5HIGZpbGVzIGluIHRoZSBzb3VyY2UgY29kZSwgdGhpcyBtZXRob2QKKyAgbG9jYXRlcyB0aGUgYWZmZWN0ZWQgVEVTVF9NQVBQSU5HIGZpbGVzIGJhc2VkIG9uIHRoZSBnaXZlbiBwYXRocyBsaXN0LgorCisgIEEgVEVTVF9NQVBQSU5HIGZpbGUgbWF5IGFsc28gY29udGFpbiBgaW1wb3J0c2AgdGhhdCBpbXBvcnQgVEVTVF9NQVBQSU5HIGZpbGVzCisgIGZyb20gYSBkaWZmZXJlbnQgbG9jYXRpb24sIGUuZy4sCisgICAgImltcG9ydHMiOiBbCisgICAgICB7CisgICAgICAgICJwYXRoIjogIi4uL2ZvbGRlcjIiCisgICAgICB9CisgICAgXQorICBJbiB0aGF0IGV4YW1wbGUsIFRFU1RfTUFQUElORyBmaWxlcyBpbnNpZGUgLi4vZm9sZGVyMiAocmVsYXRpdmUgdG8gdGhlCisgIFRFU1RfTUFQUElORyBmaWxlIGNvbnRhaW5pbmcgdGhhdCBpbXBvcnRzIHNlY3Rpb24pIGFuZCBpdHMgcGFyZW50IGRpcmVjdG9yaWVzCisgIHdpbGwgYWxzbyBiZSBpbmNsdWRlZC4KKworICBBcmdzOgorICAgIHBhdGhzOiBBIHNldCBvZiBwYXRocyB3aXRoIHJlbGF0ZWQgVEVTVF9NQVBQSU5HIGZpbGVzIGZvciBnaXZlbiBjaGFuZ2VzLgorICAgIGNoZWNrZWRfcGF0aHM6IEEgc2V0IG9mIHBhdGhzIHRoYXQgaGF2ZSBiZWVuIGNoZWNrZWQgZm9yIFRFU1RfTUFQUElORyBmaWxlCisgICAgICBhbHJlYWR5LiBUaGUgc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgcHJvY2Vzc2luZyBlYWNoIFRFU1RfTUFQUElORyBmaWxlLiBJdCdzCisgICAgICB1c2VkIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcCB3aGVuIHRoZSBtZXRob2QgaXMgY2FsbGVkIHJlY3Vyc2l2ZWx5LgorCisgIFJldHVybnM6CisgICAgQSBkaWN0aW9uYXJ5IG9mIFRlc3QgTWFwcGluZyBjb250YWluaW5nIHRoZSBjb250ZW50IG9mIHRoZSBhZmZlY3RlZAorICAgICAgVEVTVF9NQVBQSU5HIGZpbGVzLCBpbmRleGVkIGJ5IHRoZSBwYXRoIGNvbnRhaW5pbmcgdGhlIFRFU1RfTUFQUElORyBmaWxlLgorICAiIiIKKyAgdGVzdF9tYXBwaW5ncyA9IHt9CisKKyAgIyBTZWFyY2ggZm9yIFRFU1RfTUFQUElORyBmaWxlcyBpbiBlYWNoIG1vZGlmaWVkIHBhdGggYW5kIGl0cyBwYXJlbnQKKyAgIyBkaXJlY3Rvcmllcy4KKyAgYWxsX3BhdGhzID0gc2V0KCkKKyAgZm9yIHBhdGggaW4gcGF0aHM6CisgICAgZGlyX25hbWVzID0gcGF0aC5zcGxpdChvcy5wYXRoLnNlcCkKKyAgICBhbGxfcGF0aHMgfD0gc2V0KAorICAgICAgICBbb3MucGF0aC5zZXAuam9pbihkaXJfbmFtZXNbOmkgKyAxXSkgZm9yIGkgaW4gcmFuZ2UobGVuKGRpcl9uYW1lcykpXSkKKyAgIyBBZGQgcm9vdCBkaXJlY3RvcnkgdG8gdGhlIHBhdGhzIHRvIHNlYXJjaCBmb3IgVEVTVF9NQVBQSU5HIGZpbGUuCisgIGFsbF9wYXRocy5hZGQoJycpCisKKyAgYWxsX3BhdGhzLmRpZmZlcmVuY2VfdXBkYXRlKGNoZWNrZWRfcGF0aHMpCisgIGNoZWNrZWRfcGF0aHMgfD0gYWxsX3BhdGhzCisgICMgVHJ5IHRvIGxvYWQgVEVTVF9NQVBQSU5HIGZpbGUgaW4gZWFjaCBwb3NzaWJsZSBwYXRoLgorICBmb3IgcGF0aCBpbiBhbGxfcGF0aHM6CisgICAgdHJ5OgorICAgICAgdGVzdF9tYXBwaW5nX2ZpbGUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5qb2luKG9zLmdldGN3ZCgpLCBwYXRoKSwgJ1RFU1RfTUFQUElORycpCisgICAgICAjIFJlYWQgY29udGVudCBvZiBURVNUX01BUFBJTkcgZmlsZS4KKyAgICAgIGNvbnRlbnQgPSBGaWx0ZXJDb21tZW50cyhvcGVuKHRlc3RfbWFwcGluZ19maWxlLCAiciIpLnJlYWQoKSkKKyAgICAgIHRlc3RfbWFwcGluZyA9IGpzb24ubG9hZHMoY29udGVudCkKKyAgICAgIHRlc3RfbWFwcGluZ3NbcGF0aF0gPSB0ZXN0X21hcHBpbmcKKworICAgICAgaW1wb3J0X3BhdGhzID0gc2V0KCkKKyAgICAgIGZvciBpbXBvcnRfZGV0YWlsIGluIHRlc3RfbWFwcGluZy5nZXQoS0VZX0lNUE9SVFMsIFtdKToKKyAgICAgICAgaW1wb3J0X3BhdGggPSBpbXBvcnRfZGV0YWlsW0tFWV9JTVBPUlRfUEFUSF0KKyAgICAgICAgIyBUcnkgdGhlIGltcG9ydCBwYXRoIGFzIGFic29sdXRlIHBhdGguCisgICAgICAgIGltcG9ydF9wYXRocy5hZGQoaW1wb3J0X3BhdGgpCisgICAgICAgICMgVHJ5IHRoZSBpbXBvcnQgcGF0aCBhcyByZWxhdGl2ZSBwYXRoIGJhc2VkIG9uIHRoZSB0ZXN0IG1hcHBpbmcgZmlsZQorICAgICAgICAjIGNvbnRhaW5pbmcgdGhlIGltcG9ydC4KKyAgICAgICAgbm9ybV9pbXBvcnRfcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKHBhdGgsIGltcG9ydF9wYXRoKSkKKyAgICAgICAgaW1wb3J0X3BhdGhzLmFkZChub3JtX2ltcG9ydF9wYXRoKQorICAgICAgaW1wb3J0X3BhdGhzLmRpZmZlcmVuY2VfdXBkYXRlKGNoZWNrZWRfcGF0aHMpCisgICAgICBpZiBpbXBvcnRfcGF0aHM6CisgICAgICAgIGltcG9ydF90ZXN0X21hcHBpbmdzID0gR2V0VGVzdE1hcHBpbmdzKGltcG9ydF9wYXRocywgY2hlY2tlZF9wYXRocykKKyAgICAgICAgdGVzdF9tYXBwaW5ncy51cGRhdGUoaW1wb3J0X3Rlc3RfbWFwcGluZ3MpCisgICAgZXhjZXB0IChLZXlFcnJvciwgRmlsZU5vdEZvdW5kRXJyb3IsIE5vdEFEaXJlY3RvcnlFcnJvcik6CisgICAgICAjIFRFU1RfTUFQUElORyBmaWxlIGRvZXNuJ3QgZXhpc3QgaW4gcGF0aAorICAgICAgcGFzcworCisgIHJldHVybiB0ZXN0X21hcHBpbmdzCisKKworZGVmIEZpbmRBZmZlY3RlZE1vZHVsZXMoCisgICAgdGVzdF9tYXBwaW5nczogZGljdFtzdHIsIEFueV0sCisgICAgY2hhbmdlZF9maWxlczogc2V0W3N0cl0sCisgICAgdGVzdF9tYXBwaW5nX3Rlc3RfZ3JvdXBzOiBzZXRbc3RyXSwKKykgLT4gc2V0W3N0cl06CisgICIiIkZpbmQgYWZmZWN0ZWQgdGVzdCBtb2R1bGVzLgorCisgIEZpbmQgdGhlIGFmZmVjdGVkIHNldCBvZiB0ZXN0IG1vZHVsZXMgdGhhdCB3b3VsZCBydW4gaW4gYSB0ZXN0IG1hcHBpbmcgcnVuIGJhc2VkIG9uIHRoZSBnaXZlbiB0ZXN0IG1hcHBpbmdzLCBjaGFuZ2VkIGZpbGVzLCBhbmQgdGVzdCBtYXBwaW5nIHRlc3QgZ3JvdXAuCisKKyAgQXJnczoKKyAgICB0ZXN0X21hcHBpbmdzOiBBIHNldCBvZiB0ZXN0IG1hcHBpbmdzIHJldHVybmVkIGJ5IEdldFRlc3RNYXBwaW5ncyBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKyAgICAgIHsKKyAgICAgICAgJ3Rlc3RfbWFwcGluZ19maWxlX3BhdGgnOiB7CisgICAgICAgICAgJ2dyb3VwX25hbWUnIDogWworICAgICAgICAgICAgJ25hbWUnOiAnbW9kdWxlX25hbWUnLAorICAgICAgICAgIF0sCisgICAgICAgIH0KKyAgICAgIH0KKyAgICBjaGFuZ2VkX2ZpbGVzOiBBIHNldCBvZiBmaWxlcyBjaGFuZ2VkIGZvciB0aGUgZ2l2ZW4gcnVuLgorICAgIHRlc3RfbWFwcGluZ190ZXN0X2dyb3VwczogQSBzZXQgb2YgdGVzdCBtYXBwaW5nIHRlc3QgZ3JvdXBzIHRoYXQgYXJlIGJlaW5nIGNvbnNpZGVyZWQgZm9yIHRoZSBnaXZlbiBydW4uCisKKyAgUmV0dXJuczoKKyAgICBBIHNldCBvZiB0ZXN0IG1vZHVsZSBuYW1lcyB3aGljaCB3b3VsZCBydW4gZm9yIGEgdGVzdCBtYXBwaW5nIHRlc3QgcnVuIHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcnMuCisgICIiIgorCisgIG1vZHVsZXMgPSBzZXQoKQorCisgIGZvciB0ZXN0X21hcHBpbmcgaW4gdGVzdF9tYXBwaW5ncy52YWx1ZXMoKToKKyAgICBmb3IgZ3JvdXBfbmFtZSwgZ3JvdXAgaW4gdGVzdF9tYXBwaW5nLml0ZW1zKCk6CisgICAgICAjIElmIGEgbW9kdWxlIGlzIG5vdCBpbiBhbnkgb2YgdGhlIHRlc3QgbWFwcGluZyBncm91cHMgYmVpbmcgdGVzdGVkIHNraXAKKyAgICAgICMgaXQuCisgICAgICBpZiBncm91cF9uYW1lIG5vdCBpbiB0ZXN0X21hcHBpbmdfdGVzdF9ncm91cHM6CisgICAgICAgIGNvbnRpbnVlCisKKyAgICAgIGZvciBlbnRyeSBpbiBncm91cDoKKyAgICAgICAgbW9kdWxlX25hbWUgPSBlbnRyeS5nZXQoJ25hbWUnKQorCisgICAgICAgIGlmIG5vdCBtb2R1bGVfbmFtZToKKyAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGZpbGVfcGF0dGVybnMgPSBlbnRyeS5nZXQoJ2ZpbGVfcGF0dGVybnMnKQorICAgICAgICBpZiBub3QgZmlsZV9wYXR0ZXJuczoKKyAgICAgICAgICBtb2R1bGVzLmFkZChtb2R1bGVfbmFtZSkKKyAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGlmIG1hdGNoZXNfZmlsZV9wYXR0ZXJucyhmaWxlX3BhdHRlcm5zLCBjaGFuZ2VkX2ZpbGVzKToKKyAgICAgICAgICBtb2R1bGVzLmFkZChtb2R1bGVfbmFtZSkKKworICByZXR1cm4gbW9kdWxlcworCitkZWYgTWF0Y2hlc0ZpbGVQYXR0ZXJucygKKyAgICBmaWxlX3BhdHRlcm5zOiBsaXN0W3NldF0sIGNoYW5nZWRfZmlsZXM6IHNldFtzdHJdCispIC0+IGJvb2w6CisgICIiIkNoZWNrcyBpZiBhbnkgb2YgdGhlIGNoYW5nZWQgZmlsZXMgbWF0Y2ggYW55IG9mIHRoZSBmaWxlIHBhdHRlcm5zLgorCisgIEFyZ3M6CisgICAgZmlsZV9wYXR0ZXJuczogQSBsaXN0IG9mIGZpbGUgcGF0dGVybnMgdG8gbWF0Y2ggYWdhaW5zdC4KKyAgICBjaGFuZ2VkX2ZpbGVzOiBBIHNldCBvZiBmaWxlcyB0byBjaGVjayBhZ2FpbnN0IHRoZSBmaWxlIHBhdHRlcm5zLgorCisgIFJldHVybnM6CisgICAgVHJ1ZSBpZiBhbnkgb2YgdGhlIGNoYW5nZWQgZmlsZXMgbWF0Y2ggYW55IG9mIHRoZSBmaWxlIHBhdHRlcm5zLgorICAiIiIKKyAgcmV0dXJuIGFueShyZS5zZWFyY2gocGF0dGVybiwgInwiLmpvaW4oY2hhbmdlZF9maWxlcykpIGZvciBwYXR0ZXJuIGluIGZpbGVfcGF0dGVybnMpCmRpZmYgLS1naXQgYS9jb21tb24vbWF0aC5tayBiL2NvbW1vbi9tYXRoLm1rCmluZGV4IDAyNzFlYTguLjgyOWNlYjUgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9tYXRoLm1rCisrKyBiL2NvbW1vbi9tYXRoLm1rCkBAIC0yNSw2ICsyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgNjEgNjIgNjMgNjQgNjUgNjYgNjcgNjggNjkgNzAgNzEgNzIgNzMgNzQgNzUgNzYgNzcgNzggNzkgODAgXAogICAgICAgICAgICAgICAgICAgICAgIDgxIDgyIDgzIDg0IDg1IDg2IDg3IDg4IDg5IDkwIDkxIDkyIDkzIDk0IDk1IDk2IDk3IDk4IDk5IDEwMAogX19NQVRIX05VTUJFUlMgOj0gMCAkKF9fTUFUSF9QT1NfTlVNQkVSUykKK19fTUFUSF9PTkVfTlVNQkVSUyA6PSAwIDEgMiAzIDQgNSA2IDcgOCA5CiAKIG1hdGgtZXJyb3IgPSAkKGNhbGwgcHJldHR5LWVycm9yLCQoMSkpCiBtYXRoLWV4cGVjdCA6PQpAQCAtMzYsNiArMzcsMTAgQEAKICMgIG1ha2UgLWYgJHtBTkRST0lEX0JVSUxEX1RPUH0vYnVpbGQvbWFrZS9jb21tb24vbWF0aC5tayBSVU5fTUFUSF9URVNUUz10cnVlCiAjICAkKGdldF9idWlsZF92YXIgQ0tBVEkpIC1mICR7QU5EUk9JRF9CVUlMRF9UT1B9Ly9idWlsZC9tYWtlL2NvbW1vbi9tYXRoLm1rIFJVTl9NQVRIX1RFU1RTPXRydWUKIGlmZGVmIFJVTl9NQVRIX1RFU1RTCisgIGlmbmRlZiBlbXB0eQorICAgIGVtcHR5IDo9CisgICAgc3BhY2UgOj0gJChlbXB0eSkgJChlbXB0eSkKKyAgZW5kaWYKICAgTUFUSF9URVNUX0ZBSUxVUkUgOj0KICAgTUFUSF9URVNUX0VSUk9SIDo9CiAgIG1hdGgtZXJyb3IgPSAkKGlmICQoTUFUSF9URVNUX0VSUk9SKSwsJChldmFsIE1BVEhfVEVTVF9FUlJPUjo9JCgxKSkpCkBAIC02MSwxMyArNjYsMjkgQEAKIGVuZGlmCiAKICMgUmV0dXJucyB0cnVlIGlmICQoMSkgaXMgYSBub24tbmVnYXRpdmUgaW50ZWdlciA8PSAxMDAsIG90aGVyd2lzZSByZXR1cm5zIG5vdGhpbmcuCi1kZWZpbmUgbWF0aF9pc19udW1iZXIKK2RlZmluZSBtYXRoX2lzX251bWJlcl9pbl8xMDAKICQoc3RyaXAgXAogICAkKGlmICQoMSksLCQoY2FsbCBtYXRoLWVycm9yLEFyZ3VtZW50IG1pc3NpbmcpKSBcCiAgICQoaWYgJCh3b3JkIDIsJCgxKSksJChjYWxsIG1hdGgtZXJyb3IsTXVsdGlwbGUgd29yZHMgaW4gYSBzaW5nbGUgYXJndW1lbnQ6ICQoMSkpKSBcCiAgICQoaWYgJChmaWx0ZXIgJCgxKSwkKF9fTUFUSF9OVU1CRVJTKSksdHJ1ZSkpCiBlbmRlZgogCisjIFNhbWUgd2l0aCBtYXRoX2lzX251bWJlcl9pbl8xMDAsIGJ1dCBubyBsaW1pdC4KK2RlZmluZSBfbWF0aF9leHRfaXNfbnVtYmVyCiskKHN0cmlwIFwKKyAgJChpZiAkKDEpLCwkKGNhbGwgbWF0aC1lcnJvcixBcmd1bWVudCBtaXNzaW5nKSkgXAorICAkKGlmICQod29yZCAyLCQoMSkpLCQoY2FsbCBtYXRoLWVycm9yLE11bHRpcGxlIHdvcmRzIGluIGEgc2luZ2xlIGFyZ3VtZW50OiAkKDEpKSkgXAorICAkKGV2YWwgc2hvdWxkX2VtcHR5Oj0kKDEpKSBcCisgICQoZm9yZWFjaCBudW0sJChfX01BVEhfT05FX05VTUJFUlMpLFwKKyAgICAkKGV2YWwgc2hvdWxkX2VtcHR5Oj0kKHN1YnN0ICQobnVtKSwkKGVtcHR5KSwkKHNob3VsZF9lbXB0eSkpKSkgXAorICAkKGlmICQoc2hvdWxkX2VtcHR5KSwsdHJ1ZSkpCitlbmRlZgorCisjIFJldHVybnMgdHJ1ZSBpZiAkKDEpIGlzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuCitkZWZpbmUgbWF0aF9pc19udW1iZXIKKyQoc3RyaXAgJChpZiAkKGNhbGwgbWF0aF9pc19udW1iZXJfaW5fMTAwLCQoMSkpLHRydWUsJChjYWxsIF9tYXRoX2V4dF9pc19udW1iZXIsJCgxKSkpKQorZW5kZWYKKwogZGVmaW5lIG1hdGhfaXNfemVybwogJChzdHJpcCBcCiAgICQoaWYgJCh3b3JkIDIsJCgxKSksJChjYWxsIG1hdGgtZXJyb3IsTXVsdGlwbGUgd29yZHMgaW4gYSBzaW5nbGUgYXJndW1lbnQ6ICQoMSkpKSBcCkBAIC03Niw2ICs5Nyw3IEBACiAKICQoY2FsbCBtYXRoLWV4cGVjdC10cnVlLChjYWxsIG1hdGhfaXNfbnVtYmVyLDApKQogJChjYWxsIG1hdGgtZXhwZWN0LXRydWUsKGNhbGwgbWF0aF9pc19udW1iZXIsMikpCiskKGNhbGwgbWF0aC1leHBlY3QtdHJ1ZSwoY2FsbCBtYXRoX2lzX251bWJlciwyMDI0MTIpKQogJChjYWxsIG1hdGgtZXhwZWN0LWZhbHNlLChjYWxsIG1hdGhfaXNfbnVtYmVyLGZvbykpCiAkKGNhbGwgbWF0aC1leHBlY3QtZmFsc2UsKGNhbGwgbWF0aF9pc19udW1iZXIsLTEpKQogJChjYWxsIG1hdGgtZXhwZWN0LWVycm9yLChjYWxsIG1hdGhfaXNfbnVtYmVyLDEgMiksTXVsdGlwbGUgd29yZHMgaW4gYSBzaW5nbGUgYXJndW1lbnQ6IDEgMikKQEAgLTg4LDcgKzExMCw3IEBACiAkKGNhbGwgbWF0aC1leHBlY3QtZXJyb3IsKGNhbGwgbWF0aF9pc196ZXJvLG5vIDIpLE11bHRpcGxlIHdvcmRzIGluIGEgc2luZ2xlIGFyZ3VtZW50OiBubyAyKQogCiBkZWZpbmUgX21hdGhfY2hlY2tfdmFsaWQKLSQoaWYgJChjYWxsIG1hdGhfaXNfbnVtYmVyLCQoMSkpLCwkKGNhbGwgbWF0aC1lcnJvcixPbmx5IG5vbi1uZWdhdGl2ZSBpbnRlZ2VycyA8PSAxMDAgYXJlIHN1cHBvcnRlZCAobm90ICQoMSkpKSkKKyQoaWYgJChjYWxsIG1hdGhfaXNfbnVtYmVyX2luXzEwMCwkKDEpKSwsJChjYWxsIG1hdGgtZXJyb3IsT25seSBub24tbmVnYXRpdmUgaW50ZWdlcnMgPD0gMTAwIGFyZSBzdXBwb3J0ZWQgKG5vdCAkKDEpKSkpCiBlbmRlZgogCiAkKGNhbGwgbWF0aC1leHBlY3QsKGNhbGwgX21hdGhfY2hlY2tfdmFsaWQsMCkpCkBAIC0xMTMsMTggKzEzNSw4MSBAQAogJChjYWxsIG1hdGgtZXhwZWN0LChjYWxsIGludF9yYW5nZV9saXN0LDIsMSksKQogJChjYWxsIG1hdGgtZXhwZWN0LWVycm9yLChjYWxsIGludF9yYW5nZV9saXN0LDEsMTAxKSxPbmx5IG5vbi1uZWdhdGl2ZSBpbnRlZ2VycyA8PSAxMDAgYXJlIHN1cHBvcnRlZCAobm90IDEwMSkpCiAKKyMgU3BsaXQgYW4gaW50ZWdlciBpbnRvIGEgbGlzdCBvZiBkaWdpdHMKK2RlZmluZSBfbWF0aF9udW1iZXJfdG9fbGlzdAorJChzdHJpcCBcCisgICQoaWYgJChjYWxsIF9tYXRoX2V4dF9pc19udW1iZXIsJCgxKSksLFwKKyAgICAkKGNhbGwgbWF0aC1lcnJvcixPbmx5IG5vbi1uZWdhdGl2ZSBpbnRlZ2VycyBhcmUgc3VwcG9ydGVkIChub3QgJCgxKSkpKSBcCisgICQoZXZhbCBudW1fbGlzdDo9JCgxKSkgXAorICAkKGZvcmVhY2ggbnVtLCQoX19NQVRIX09ORV9OVU1CRVJTKSxcCisgICAgJChldmFsIG51bV9saXN0Oj0kKHN1YnN0ICQobnVtKSwkKHNwYWNlKSQobnVtKSwkKG51bV9saXN0KSkpKSBcCisgICQoaWYgJChmaWx0ZXIgJCh3b3JkcyAkKG51bV9saXN0KSksJChfX01BVEhfT05FX05VTUJFUlMpKSwsXAorICAgICQoY2FsbCBtYXRoLWVycm9yLE9ubHkgbm9uLW5lZ2F0aXZlIGludGVnZXJzIHdpdGggbGVzcyB0aGFuIDkgZGlnaXRzIGFyZSBzdXBwb3J0ZWQgKG5vdCAkKDEpKSkpIFwKKyAgJChpZiAkKGZpbHRlciAwLCQod29yZCAxLCQobnVtX2xpc3QpKSksXAorICAgICQoY2FsbCBtYXRoLWVycm9yLE9ubHkgbm9uLW5lZ2F0aXZlIGludGVnZXJzIHdpdGhvdXQgbGVhZGluZyB6ZXJvcyBhcmUgc3VwcG9ydGVkIChub3QgJCgxKSkpKSBcCisgICQobnVtX2xpc3QpKQorZW5kZWYKKworJChjYWxsIG1hdGgtZXhwZWN0LChjYWxsIF9tYXRoX251bWJlcl90b19saXN0LDEyMyksMSAyIDMpCiskKGNhbGwgbWF0aC1leHBlY3QtZXJyb3IsKGNhbGwgX21hdGhfbnVtYmVyX3RvX2xpc3QsMTIzIDQ1NiksTXVsdGlwbGUgd29yZHMgaW4gYSBzaW5nbGUgYXJndW1lbnQ6IDEyMyA0NTYpCiskKGNhbGwgbWF0aC1leHBlY3QtZXJyb3IsKGNhbGwgX21hdGhfbnVtYmVyX3RvX2xpc3QsLTEyMyksT25seSBub24tbmVnYXRpdmUgaW50ZWdlcnMgYXJlIHN1cHBvcnRlZCAobm90IC0xMjMpKQorJChjYWxsIG1hdGgtZXhwZWN0LWVycm9yLChjYWxsIF9tYXRoX251bWJlcl90b19saXN0LDAwMiksT25seSBub24tbmVnYXRpdmUgaW50ZWdlcnMgd2l0aG91dCBsZWFkaW5nIHplcm9zIGFyZSBzdXBwb3J0ZWQgKG5vdCAwMDIpKQorJChjYWxsIG1hdGgtZXhwZWN0LWVycm9yLChjYWxsIF9tYXRoX251bWJlcl90b19saXN0LDEyMzQ1Njc4OTApLE9ubHkgbm9uLW5lZ2F0aXZlIGludGVnZXJzIHdpdGggbGVzcyB0aGFuIDkgZGlnaXRzIGFyZSBzdXBwb3J0ZWQgKG5vdCAxMjM0NTY3ODkwKSkKKworIyBDb21wYXJlIDEtZGlnaXQgaW50ZWdlciAkKDEpIGFuZCAkKDIpLgorIyBSZXR1cm5zIDEgaWYgJCgxKSA+ICQoMiksIC0xIGlmICQoMSkgPCAkKDIpLCBub3RoaW5nIGlmIGVxdWFscy4KK2RlZmluZSBfbWF0aF8xZGlnaXRfY29tcAorJChzdHJpcCBcCisgICQoaWYgJChmaWx0ZXIgJCgxKSwkKDIpKSwsXAorICAgICQoaWYgJChmaWx0ZXIgJCgxKSwkKGZpcnN0d29yZCAkKGZpbHRlciAkKDEpICQoMiksJChfX01BVEhfT05FX05VTUJFUlMpKSkpLC0xLDEpKSkKK2VuZGVmCisKKyQoY2FsbCBtYXRoLWV4cGVjdCwoY2FsbCBfbWF0aF8xZGlnaXRfY29tcCwxLDEpKQorJChjYWxsIG1hdGgtZXhwZWN0LChjYWxsIF9tYXRoXzFkaWdpdF9jb21wLDAsOSksLTEpCiskKGNhbGwgbWF0aC1leHBlY3QsKGNhbGwgX21hdGhfMWRpZ2l0X2NvbXAsMywxKSwxKQorCisjIENvbXBhcmUgdGhlIHNhbWUgJCgzKS1kaWdpdC1sZW5ndGggaW50ZWdlcnMgJCgxKSBhbmQgJCgyKSB0aGF0IGFyZSBzcGxpdCBpbnRvIGEgbGlzdCBvZiBkaWdpdHMuCisjIFJldHVybnMgMSBpZiAkKDEpID4gJCgyKSwgLTEgaWYgJCgxKSA8ICQoMiksIG5vdGhpbmcgaWYgZXF1YWxzLgorZGVmaW5lIF9tYXRoX2xpc3RfY29tcAorJChzdHJpcCBcCisgICQoZXZhbCBhbnM6PSkgXAorICAkKGZvcmVhY2ggbnVtLCQoY2FsbCBpbnRfcmFuZ2VfbGlzdCwxLCQoMykpLFwKKyAgICAkKGlmICQoYW5zKSwsJChldmFsIGFuczo9JChjYWxsIF9tYXRoXzFkaWdpdF9jb21wLCQod29yZCAkKG51bSksJCgxKSksJCh3b3JkICQobnVtKSwkKDIpKSkpKSkgXAorICAkKGFucykpCitlbmRlZgorCisjIENvbXBhcmUgYW55IHR3byBub24tbmVnYXRpdmUgaW50ZWdlcnMgJCgxKSBhbmQgJCgyKS4KKyMgUmV0dXJucyAxIGlmICQoMSkgPiAkKDIpLCAtMSBpZiAkKDEpIDwgJCgyKSwgbm90aGluZyBpZiBlcXVhbHMuCitkZWZpbmUgX21hdGhfZXh0X2NvbXAKKyQoc3RyaXAgXAorICAkKGV2YWwgbnVtX2xpc3QxOj0kKGNhbGwgX21hdGhfbnVtYmVyX3RvX2xpc3QsJCgxKSkpIFwKKyAgJChldmFsIGxlbjE6PSQod29yZHMgJChudW1fbGlzdDEpKSkgXAorICAkKGV2YWwgbnVtX2xpc3QyOj0kKGNhbGwgX21hdGhfbnVtYmVyX3RvX2xpc3QsJCgyKSkpIFwKKyAgJChldmFsIGxlbjI6PSQod29yZHMgJChudW1fbGlzdDIpKSkgXAorICAkKGV2YWwgY29tcDo9JChjYWxsIF9tYXRoXzFkaWdpdF9jb21wLCQobGVuMSksJChsZW4yKSkpIFwKKyAgJChpZiAkKGNvbXApLCQoY29tcCksJChjYWxsIF9tYXRoX2xpc3RfY29tcCwkKG51bV9saXN0MSksJChudW1fbGlzdDIpLCQobGVuMSkpKSkKK2VuZGVmCisKKyQoY2FsbCBtYXRoLWV4cGVjdCwoY2FsbCBfbWF0aF9leHRfY29tcCw1LDEwKSwtMSkKKyQoY2FsbCBtYXRoLWV4cGVjdCwoY2FsbCBfbWF0aF9leHRfY29tcCwxMjM0NSwxMjM0NSkpCiskKGNhbGwgbWF0aC1leHBlY3QsKGNhbGwgX21hdGhfZXh0X2NvbXAsNTAwLDUpLDEpCiskKGNhbGwgbWF0aC1leHBlY3QsKGNhbGwgX21hdGhfZXh0X2NvbXAsMjAyNDA0LDIwMjUwNCksLTEpCiAKICMgUmV0dXJucyB0aGUgZ3JlYXRlciBvZiAkMSBvciAkMi4KLSMgSWYgJDEgb3IgJDIgaXMgbm90IGEgcG9zaXRpdmUgaW50ZWdlciA8PSAxMDAsIHRoZW4gYW4gZXJyb3IgaXMgZ2VuZXJhdGVkLgorIyBJZiAkMSBvciAkMiBpcyBub3QgYSBwb3NpdGl2ZSBpbnRlZ2VyLCB0aGVuIGFuIGVycm9yIGlzIGdlbmVyYXRlZC4KIGRlZmluZSBtYXRoX21heAotJChzdHJpcCAkKGNhbGwgX21hdGhfY2hlY2tfdmFsaWQsJCgxKSkgJChjYWxsIF9tYXRoX2NoZWNrX3ZhbGlkLCQoMikpIFwKLSAgJChsYXN0d29yZCAkKGZpbHRlciAkKDEpICQoMiksJChfX01BVEhfTlVNQkVSUykpKSkKKyQoc3RyaXAgXAorICAkKGlmICQoZmlsdGVyIHRydWV0cnVlLCQoY2FsbCBtYXRoX2lzX251bWJlcl9pbl8xMDAsJCgxKSkkKGNhbGwgbWF0aF9pc19udW1iZXJfaW5fMTAwLCQoMikpKSxcCisgICAgJChsYXN0d29yZCAkKGZpbHRlciAkKDEpICQoMiksJChfX01BVEhfTlVNQkVSUykpKSxcCisgICAgJChpZiAkKGZpbHRlciAxLCQoY2FsbCBfbWF0aF9leHRfY29tcCwkKDEpLCQoMikpKSwkKDEpLCQoMikpKSkKIGVuZGVmCiAKICMgUmV0dXJucyB0aGUgbGVzc2VyIG9mICQxIG9yICQyLgogZGVmaW5lIG1hdGhfbWluCi0kKHN0cmlwICQoY2FsbCBfbWF0aF9jaGVja192YWxpZCwkKDEpKSAkKGNhbGwgX21hdGhfY2hlY2tfdmFsaWQsJCgyKSkgXAotICAkKGZpcnN0d29yZCAkKGZpbHRlciAkKDEpICQoMiksJChfX01BVEhfTlVNQkVSUykpKSkKKyQoc3RyaXAgXAorICAkKGlmICQoZmlsdGVyIHRydWV0cnVlLCQoY2FsbCBtYXRoX2lzX251bWJlcl9pbl8xMDAsJCgxKSkkKGNhbGwgbWF0aF9pc19udW1iZXJfaW5fMTAwLCQoMikpKSxcCisgICAgJChmaXJzdHdvcmQgJChmaWx0ZXIgJCgxKSAkKDIpLCQoX19NQVRIX05VTUJFUlMpKSksXAorICAgICQoaWYgJChmaWx0ZXIgLTEsJChjYWxsIF9tYXRoX2V4dF9jb21wLCQoMSksJCgyKSkpLCQoMSksJCgyKSkpKQogZW5kZWYKIAogJChjYWxsIG1hdGgtZXhwZWN0LWVycm9yLChjYWxsIG1hdGhfbWF4KSxBcmd1bWVudCBtaXNzaW5nKQpAQCAtMTQyLDYgKzIyNywxNSBAQAogJChjYWxsIG1hdGgtZXhwZWN0LChjYWxsIG1hdGhfbWluLDcsMzIpLDcpCiAkKGNhbGwgbWF0aC1leHBlY3QsKGNhbGwgbWF0aF9taW4sMzIsNyksNykKIAorJChjYWxsIG1hdGgtZXhwZWN0LChjYWxsIG1hdGhfbWF4LDMyNzU5LDcpLDMyNzU5KQorJChjYWxsIG1hdGgtZXhwZWN0LChjYWxsIG1hdGhfbWF4LDcsMzI3NTkpLDMyNzU5KQorJChjYWxsIG1hdGgtZXhwZWN0LChjYWxsIG1hdGhfbWF4LDIwMjQwNCwyMDI1MDUpLDIwMjUwNSkKKyQoY2FsbCBtYXRoLWV4cGVjdCwoY2FsbCBtYXRoX21heCwyMDI0MDQsMjAyNDA0KSwyMDI0MDQpCiskKGNhbGwgbWF0aC1leHBlY3QsKGNhbGwgbWF0aF9taW4sODkwODUyNywzMiksMzIpCiskKGNhbGwgbWF0aC1leHBlY3QsKGNhbGwgbWF0aF9taW4sMzIsODkwODUyNyksMzIpCiskKGNhbGwgbWF0aC1leHBlY3QsKGNhbGwgbWF0aF9taW4sMjAyNDA0LDIwMjUwNSksMjAyNDA0KQorJChjYWxsIG1hdGgtZXhwZWN0LChjYWxsIG1hdGhfbWluLDIwMjQwNCwyMDI0MDQpLDIwMjQwNCkKKwogZGVmaW5lIG1hdGhfZ3Rfb3JfZXEKICQoaWYgJChmaWx0ZXIgJCgxKSwkKGNhbGwgbWF0aF9tYXgsJCgxKSwkKDIpKSksdHJ1ZSkKIGVuZGVmCkBAIC0xNTAsNiArMjQ0LDEwIEBACiAkKGlmICQoY2FsbCBtYXRoX2d0X29yX2VxLCQoMiksJCgxKSksLHRydWUpCiBlbmRlZgogCitkZWZpbmUgbWF0aF9sdF9vcl9lcQorJChpZiAkKGNhbGwgbWF0aF9ndF9vcl9lcSwkKDIpLCQoMSkpLHRydWUpCitlbmRlZgorCiBkZWZpbmUgbWF0aF9sdAogJChpZiAkKGNhbGwgbWF0aF9ndF9vcl9lcSwkKDEpLCQoMikpLCx0cnVlKQogZW5kZWYKQEAgLTE2MCwxMCArMjU4LDE3IEBACiAkKGNhbGwgbWF0aC1leHBlY3QtdHJ1ZSwoY2FsbCBtYXRoX2d0LCA0LCAzKSkKICQoY2FsbCBtYXRoLWV4cGVjdC1mYWxzZSwoY2FsbCBtYXRoX2d0LCA1LCA1KSkKICQoY2FsbCBtYXRoLWV4cGVjdC1mYWxzZSwoY2FsbCBtYXRoX2d0LCA2LCA3KSkKKyQoY2FsbCBtYXRoLWV4cGVjdC10cnVlLChjYWxsIG1hdGhfbHRfb3JfZXEsIDExLCAxMSkpCiskKGNhbGwgbWF0aC1leHBlY3QtZmFsc2UsKGNhbGwgbWF0aF9sdF9vcl9lcSwgMjUsIDE1KSkKKyQoY2FsbCBtYXRoLWV4cGVjdC10cnVlLChjYWxsIG1hdGhfbHRfb3JfZXEsIDksIDE2KSkKICQoY2FsbCBtYXRoLWV4cGVjdC1mYWxzZSwoY2FsbCBtYXRoX2x0LCAxLCAwKSkKICQoY2FsbCBtYXRoLWV4cGVjdC1mYWxzZSwoY2FsbCBtYXRoX2x0LCA4LCA4KSkKICQoY2FsbCBtYXRoLWV4cGVjdC10cnVlLChjYWxsIG1hdGhfbHQsIDEwLCAxMSkpCiAKKyQoY2FsbCBtYXRoLWV4cGVjdC10cnVlLChjYWxsIG1hdGhfZ3Rfb3JfZXEsIDI1NzM5MDQsIDI1NzM5MDApKQorJChjYWxsIG1hdGgtZXhwZWN0LXRydWUsKGNhbGwgbWF0aF9ndF9vcl9lcSwgMTIzNDUsIDEyMzQ1KSkKKyQoY2FsbCBtYXRoLWV4cGVjdC1mYWxzZSwoY2FsbCBtYXRoX2d0X29yX2VxLCA1NiwgMjc4MCkpCisKICMgJDEgaXMgdGhlIHZhcmlhYmxlIG5hbWUgdG8gaW5jcmVtZW50CiBkZWZpbmUgaW5jX2FuZF9wcmludAogJChzdHJpcCAkKGV2YWwgJCgxKSA6PSAkKCQoMSkpIC4pJCh3b3JkcyAkKCQoMSkpKSkKQEAgLTE5Miw2ICsyOTcsNyBAQAogJChjYWxsIG1hdGgtZXhwZWN0LChjYWxsIG51bWJlcnNfbGVzc190aGFuLDMsMCAyIDEgMyksMCAyIDEpCiAkKGNhbGwgbWF0aC1leHBlY3QsKGNhbGwgbnVtYmVyc19sZXNzX3RoYW4sNCwwIDIgMSAzKSwwIDIgMSAzKQogJChjYWxsIG1hdGgtZXhwZWN0LChjYWxsIG51bWJlcnNfbGVzc190aGFuLDMsMCAyIDEgMyAyKSwwIDIgMSAyKQorJChjYWxsIG1hdGgtZXhwZWN0LChjYWxsIG51bWJlcnNfbGVzc190aGFuLDEwMCwwIDEwMDAgNTAgMTAxIDEwMCksMCA1MCkKIAogIyBSZXR1cm5zIHRoZSB3b3JkcyBpbiAkMiB0aGF0IGFyZSBudW1iZXJzIGFuZCBhcmUgZ3JlYXRlciBvciBlcXVhbCB0byAkMQogZGVmaW5lIG51bWJlcnNfZ3JlYXRlcl9vcl9lcXVhbF90bwpAQCAtMjA5LDggKzMxNSw5IEBACiAkKGNhbGwgbWF0aC1leHBlY3QsKGNhbGwgbnVtYmVyc19ncmVhdGVyX29yX2VxdWFsX3RvLDAsMCAyIDEgMyksMCAyIDEgMykKICQoY2FsbCBtYXRoLWV4cGVjdCwoY2FsbCBudW1iZXJzX2dyZWF0ZXJfb3JfZXF1YWxfdG8sMSwwIDIgMSAzIDIpLDIgMSAzIDIpCiAKLV9JTlRfTElNSVRfV09SRFMgOj0gJChmb3JlYWNoIGEseCB4LCQoZm9yZWFjaCBiLHggeCB4IHggeCB4IHggeCB4IHggeCB4IHggeCB4IHgsXAotICAkKGZvcmVhY2ggYyx4IHggeCB4IHggeCB4IHggeCB4IHggeCB4IHggeCB4LHggeCB4IHggeCB4IHggeCB4IHggeCB4IHggeCB4IHgpKSkKKyMgMTAsMDAxID0gMTAgKiogNCArIDEsIGNvbnRhaW5zIDEwLDAwMSB4J3MsIHNvIDEgbW9yZSB0aGFuIDEwLDAwMCAoZnV0dXJlKSBBUEkgbGV2ZWwKK19JTlRfTElNSVRfV09SRFMgOj0geCAkKGZvcmVhY2ggYSwwIDEgMiAzIDQgNSA2IDcgOCA5LCQoZm9yZWFjaCBiLDAgMSAyIDMgNCA1IDYgNyA4IDksXAorICAkKGZvcmVhY2ggYywwIDEgMiAzIDQgNSA2IDcgOCA5LHggeCB4IHggeCB4IHggeCB4IHgpKSkKIAogZGVmaW5lIF9pbnRfZW5jb2RlCiAkKGlmICQoZmlsdGVyICQod29yZHMgeCAkKF9JTlRfTElNSVRfV09SRFMpKSwkKHdvcmRzICQod29yZGxpc3QgMSwkKDEpLHggJChfSU5UX0xJTUlUX1dPUkRTKSkpKSxcCmRpZmYgLS1naXQgYS9jb3JlL0JVSUxELmJhemVsIGIvY29yZS9CVUlMRC5iYXplbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U2OWU2Mi4uMDAwMDAwMAotLS0gYS9jb3JlL0JVSUxELmJhemVsCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIEV4cG9ydCB0cmFkZWZlZCB0ZW1wbGF0ZXMgZm9yIHRlc3RzLgotZXhwb3J0c19maWxlcygKLSAgICBnbG9iKFsiKi54bWwiXSksCi0pCmRpZmYgLS1naXQgYS9jb3JlL01ha2VmaWxlIGIvY29yZS9NYWtlZmlsZQppbmRleCAzOGRjMzdiLi41YTdkZGQyIDEwMDY0NAotLS0gYS9jb3JlL01ha2VmaWxlCisrKyBiL2NvcmUvTWFrZWZpbGUKQEAgLTE2LDYgKzE2LDk0IEBACiBPRE1fRExLTV9OT1RJQ0VfREVQUyA6PQogU1lTVEVNX0RMS01fTk9USUNFX0RFUFMgOj0KIAorCisjIElNQUdFU19UT19CVUlMRCBpcyBhIGxpc3Qgb2YgdGhlIHBhcnRpdGlvbiAuaW1nIGZpbGVzIHRoYXQgd2lsbCBiZSBjcmVhdGVkLgorSU1BR0VTX1RPX0JVSUxEOj0KK2lmbmVxICgkKEJVSUxESU5HX0JPT1RfSU1BR0UpLCkKKyAgSU1BR0VTX1RPX0JVSUxEICs9IGJvb3QKK2VuZGlmCitpZm5lcSAoJChCVUlMRElOR19DQUNIRV9JTUFHRSksKQorICBJTUFHRVNfVE9fQlVJTEQgKz0gY2FjaGUKK2VuZGlmCitpZm5lcSAoJChCVUlMRElOR19ERUJVR19CT09UX0lNQUdFKSwpCisgIElNQUdFU19UT19CVUlMRCArPSBkZWJ1Z19ib290CitlbmRpZgoraWZuZXEgKCQoQlVJTERJTkdfREVCVUdfVkVORE9SX0JPT1RfSU1BR0UpLCkKKyAgSU1BR0VTX1RPX0JVSUxEICs9IGRlYnVnX3ZlbmRvcl9ib290CitlbmRpZgoraWZuZXEgKCQoQlVJTERJTkdfSU5JVF9CT09UX0lNQUdFKSwpCisgIElNQUdFU19UT19CVUlMRCArPSBpbml0X2Jvb3QKK2VuZGlmCitpZm5lcSAoJChCVUlMRElOR19PRE1fRExLTV9JTUFHRSksKQorICBJTUFHRVNfVE9fQlVJTEQgKz0gb2RtX2Rsa20KK2VuZGlmCitpZm5lcSAoJChCVUlMRElOR19PRE1fSU1BR0UpLCkKKyAgSU1BR0VTX1RPX0JVSUxEICs9IG9kbQorZW5kaWYKK2lmbmVxICgkKEJVSUxESU5HX1BST0RVQ1RfSU1BR0UpLCkKKyAgSU1BR0VTX1RPX0JVSUxEICs9IHByb2R1Y3QKK2VuZGlmCitpZm5lcSAoJChCVUlMRElOR19SQU1ESVNLX0lNQUdFKSwpCisgIElNQUdFU19UT19CVUlMRCArPSByYW1kaXNrCitlbmRpZgoraWZuZXEgKCQoQlVJTERJTkdfUkVDT1ZFUllfSU1BR0UpLCkKKyAgSU1BR0VTX1RPX0JVSUxEICs9IHJlY292ZXJ5CitlbmRpZgoraWZuZXEgKCQoQlVJTERJTkdfU1VQRVJfRU1QVFlfSU1BR0UpLCkKKyAgSU1BR0VTX1RPX0JVSUxEICs9IHN1cGVyX2VtcHR5CitlbmRpZgoraWZuZXEgKCQoQlVJTERJTkdfU1lTVEVNX0RMS01fSU1BR0UpLCkKKyAgSU1BR0VTX1RPX0JVSUxEICs9IHN5c3RlbV9kbGttCitlbmRpZgoraWZuZXEgKCQoQlVJTERJTkdfU1lTVEVNX0VYVF9JTUFHRSksKQorICBJTUFHRVNfVE9fQlVJTEQgKz0gc3lzdGVtX2V4dAorZW5kaWYKK2lmbmVxICgkKEJVSUxESU5HX1NZU1RFTV9JTUFHRSksKQorICBJTUFHRVNfVE9fQlVJTEQgKz0gc3lzdGVtCitlbmRpZgoraWZuZXEgKCQoQlVJTERJTkdfU1lTVEVNX09USEVSX0lNQUdFKSwpCisgIElNQUdFU19UT19CVUlMRCArPSBzeXN0ZW1fb3RoZXIKK2VuZGlmCitpZm5lcSAoJChCVUlMRElOR19VU0VSREFUQV9JTUFHRSksKQorICBJTUFHRVNfVE9fQlVJTEQgKz0gdXNlcmRhdGEKK2VuZGlmCitpZm5lcSAoJChCVUlMRElOR19WQk1FVEFfSU1BR0UpLCkKKyAgSU1BR0VTX1RPX0JVSUxEICs9IHZibWV0YQorZW5kaWYKK2lmbmVxICgkKEJVSUxESU5HX1ZFTkRPUl9CT09UX0lNQUdFKSwpCisgIElNQUdFU19UT19CVUlMRCArPSB2ZW5kb3JfYm9vdAorZW5kaWYKK2lmbmVxICgkKEJVSUxESU5HX1ZFTkRPUl9ETEtNX0lNQUdFKSwpCisgIElNQUdFU19UT19CVUlMRCArPSB2ZW5kb3JfZGxrbQorZW5kaWYKK2lmbmVxICgkKEJVSUxESU5HX1ZFTkRPUl9JTUFHRSksKQorICBJTUFHRVNfVE9fQlVJTEQgKz0gdmVuZG9yCitlbmRpZgoraWZuZXEgKCQoQlVJTERJTkdfVkVORE9SX0tFUk5FTF9CT09UX0lNQUdFKSwpCisgIElNQUdFU19UT19CVUlMRCArPSB2ZW5kb3Jfa2VybmVsX2Jvb3QKK2VuZGlmCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgR2V0IHRoZSBtb2R1bGUgbmFtZXMgc3VpdGFibGUgZm9yIEFMTF9NT0RVTEVTLiogdmFyaWFibGVzIHRoYXQgYXJlIGluc3RhbGxlZAorIyBmb3IgYSBnaXZlbiBwYXJ0aXRpb24KKyMKKyMgJCgxKTogUGFydGl0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZGVmaW5lIHJlZ2lzdGVyLW5hbWVzLWZvci1wYXJ0aXRpb24KKyQoc29ydCAkKGZvcmVhY2ggbSwkKHByb2R1Y3RfTU9EVUxFUyksXAorCSQoaWYgJChmaWx0ZXIgJChQUk9EVUNUX09VVCkvJChzdHJpcCAkKDEpKS8lLCAkKEFMTF9NT0RVTEVTLiQobSkuSU5TVEFMTEVEKSksIFwKKwkJJChtKQorCSkgXAorKSkKK2VuZGVmCisKKworIyBSZWxlYXNlICYgQWNvbmZpZyBGbGFncworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvcGFja2FnaW5nL2ZsYWdzLm1rCisKKwogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBEZWZpbmUgcnVsZXMgdG8gY29weSBQUk9EVUNUX0NPUFlfRklMRVMgZGVmaW5lZCBieSB0aGUgcHJvZHVjdC4KICMgUFJPRFVDVF9DT1BZX0ZJTEVTIGNvbnRhaW5zIHdvcmRzIGxpa2UgPHNvdXJjZSBmaWxlPjo8ZGVzdCBmaWxlPls6PG93bmVyPl0uCkBAIC04MSw3ICsxNjksNyBAQAogICAgICAgICAgICAgJChldmFsICQoY2FsbCBjb3B5LXhtbC1maWxlLWNoZWNrZWQsJChfc3JjKSwkKF9mdWxsZGVzdCkpKSxcCiAgICAgICAgICAgICAkKGlmICQoYW5kICQoZmlsdGVyICUuamFyLCQoX2Rlc3QpKSwkKGZpbHRlciAkKGJhc2VuYW1lICQobm90ZGlyICQoX2Rlc3QpKSksJChQUk9EVUNUX0xPQURFRF9CWV9QUklWSUxFR0VEX01PRFVMRVMpKSksXAogICAgICAgICAgICAgICAgICQoZXZhbCAkKGNhbGwgY29weS1hbmQtdW5jb21wcmVzcy1kZXhzLCQoX3NyYyksJChfZnVsbGRlc3QpKSksIFwKLSAgICAgICAgICAgICAgICAkKGlmICQoZmlsdGVyIGluaXQlcmMsJChub3RkaXIgJChfZGVzdCkpKSQoZmlsdGVyICUvZXRjL2luaXQsJChkaXIgJChfZGVzdCkpKSxcCisgICAgICAgICAgICAgICAgJChpZiAkKGZpbHRlciBpbml0JXJjLCQobm90ZGlyICQoX2Rlc3QpKSkkKGZpbHRlciAlL2V0Yy9pbml0LywkKGRpciAkKF9kZXN0KSkpLFwKICAgICAgICAgICAgICAgICAgICAgJChldmFsICQoY2FsbCBjb3B5LWluaXQtc2NyaXB0LWZpbGUtY2hlY2tlZCwkKF9zcmMpLCQoX2Z1bGxkZXN0KSkpLFwKICAgICAgICAgICAgICAgICAgICAgJChpZiAkKGFuZCAkKGZpbHRlciB0cnVlLCQoY2hlY2tfZWxmX3ByZWJ1aWx0X3Byb2R1Y3RfY29weV9maWxlcykpLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChmaWx0ZXIgYmluIGxpYiBsaWI2NCwkKHN1YnN0IC8sJChzcGFjZSksJChfZGVzdCkpKSksIFwKQEAgLTEwNCw2ICsxOTIsMzQgQEAKIHVuaXF1ZV9wcm9kdWN0X2NvcHlfZmlsZXNfcGFpcnMgOj0KIHVuaXF1ZV9wcm9kdWN0X2NvcHlfZmlsZXNfZGVzdGluYXRpb25zIDo9CiAKKworIyBSZXR1cm5zIGEgbGlzdCBvZiBFWFRSQV9JTlNUQUxMX1pJUFMgdHJpb3Mgd2hvc2UgcHJpbWFyeSBmaWxlIGlzIGNvbnRhaW5lZCB3aXRoaW4gJCgxKQorIyBUaGUgdHJpb3Mgd2lsbCBjb250YWluIHRoZSBwcmltYXJ5IGluc3RhbGxlZCBmaWxlIDogdGhlIGRpcmVjdG9yeSB0byB1bnppcCB0aGUgemlwIHRvIDogdGhlIHppcAorZGVmaW5lIHJlbGV2YW50LWV4dHJhLWluc3RhbGwtemlwcworJChzdHJpcCAkKGZvcmVhY2ggcCwkKEVYVFJBX0lOU1RBTExfWklQUyksIFwKKyAgJChpZiAkKGZpbHRlciAkKGNhbGwgd29yZC1jb2xvbiwxLCQocCkpLCQoMSkpLCBcCisgICAgJChwKSkpKQorZW5kZWYKKworIyBXcml0ZXMgYSB0ZXh0IGZpbGUgdGhhdCBjb250YWlucyBhbGwgb2YgdGhlIGZpbGVzIHRoYXQgd2lsbCBiZSBpbnNpZGUgYSBwYXJ0aXRpb24uCisjIEFsbCB0aGUgZmlsZSBwYXRocyB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBwYXJ0aXRpb24ncyBzdGFnaW5nIGRpcmVjdG9yeS4KKyMgSXQgd2lsbCBhbHNvIHRha2UgaW50byBhY2NvdW50IGZpbGVzIGluc2lkZSB6aXBzIGxpc3RlZCBpbiBFWFRSQV9JTlNUQUxMX1pJUFMuCisjCisjIEFyZ3VtZW50czoKKyMgICAkKDEpOiBPdXRwdXQgZmlsZQorIyAgICQoMik6IFRoZSBwYXJ0aXRpb24ncyBzdGFnaW5nIGRpcmVjdG9yeQorIyAgICQoMyk6IEZpbGVzIHRvIGluY2x1ZGUgaW4gdGhlIHBhcnRpdGlvbgorZGVmaW5lIHdyaXRlLXBhcnRpdGlvbi1maWxlLWxpc3QKKyQoMSk6IFBSSVZBVEVfRklMRVMgOj0gJChzdWJzdCAkKDIpLywsJChmaWx0ZXIgJCgyKS8lLCQoMykpKQorJCgxKTogUFJJVkFURV9FWFRSQV9JTlNUQUxMX1pJUFMgOj0gJChjYWxsIHJlbGV2YW50LWV4dHJhLWluc3RhbGwtemlwcywkKGZpbHRlciAkKDIpLyUsJCgzKSkpCiskKDEpOiAkJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZXh0cmFfaW5zdGFsbF96aXBzX2ZpbGVfbGlzdCAkKGZvcmVhY2ggcCwkKGNhbGwgcmVsZXZhbnQtZXh0cmEtaW5zdGFsbC16aXBzLCQoZmlsdGVyICQoMikvJSwkKDMpKSksJChjYWxsIHdvcmQtY29sb24sMywkKHApKSkKKwlAZWNobyBXcml0aW5nICQkQAorCXJtIC1mICQkQAorCWVjaG8gLW4gPiAkJEAKKwkkJChmb3JlYWNoIGYsJCQoUFJJVkFURV9GSUxFUyksZWNobyAiJCQoZikiID4+ICQkQCQkKG5ld2xpbmUpKQorCSQkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9leHRyYV9pbnN0YWxsX3ppcHNfZmlsZV9saXN0ICQoMikgJCQoUFJJVkFURV9FWFRSQV9JTlNUQUxMX1pJUFMpID4+ICQkQAorZW5kZWYKKwogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBSZXR1cm5zIHRoZSBtYXggYWxsb3dlZCBzaXplIGZvciBhbiBpbWFnZSBzdWl0YWJsZSBmb3IgaGFzaCB2ZXJpZmljYXRpb24KICMgKGUuZy4sIGJvb3QuaW1nLCByZWNvdmVyeS5pbWcsIGV0YykuCkBAIC0xOTksNiArMzE1LDExIEBACiBlbmRpZgogZW5kaWYKIAorIyBEbyB0aGlzIGVhcmx5IGJlY2F1c2Ugc3lzcHJvcC5tayBkZXBlbmRzIG9uIEJVSUxUX0tFUk5FTF9WRVJTSU9OX0ZJTEVfRk9SX1VGRkRfR0MuCitpZmVxIChkZWZhdWx0LCQoRU5BQkxFX1VGRkRfR0MpKQorQlVJTFRfS0VSTkVMX1ZFUlNJT05fRklMRV9GT1JfVUZGRF9HQyA6PSAkKE9VVF9ESVIpL3Nvb25nL2RleHByZW9wdC9rZXJuZWxfdmVyc2lvbl9mb3JfdWZmZF9nYy50eHQKK2VuZGlmICMgRU5BQkxFX1VGRkRfR0MKKwogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvc3lzcHJvcC5tawogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTI3NSw2ICszOTYsMTAgQEAKICkKIElOVEVSTkFMX1ZFTkRPUl9SQU1ESVNLX0ZSQUdNRU5UUyArPSAkKEJPQVJEX1ZFTkRPUl9SQU1ESVNLX0ZSQUdNRU5UUykKIAoraWZuZXEgKCQoQk9BUkRfS0VSTkVMX01PRFVMRVNfMTZLKSwpCitJTlRFUk5BTF9WRU5ET1JfUkFNRElTS19GUkFHTUVOVFMgKz0gMTZLCitlbmRpZgorCiAjIFN0cmlwIHRoZSBsaXN0IGluIGNhc2Ugb2YgYW55IHdoaXRlc3BhY2UuCiBJTlRFUk5BTF9WRU5ET1JfUkFNRElTS19GUkFHTUVOVFMgOj0gXAogICAkKHN0cmlwICQoSU5URVJOQUxfVkVORE9SX1JBTURJU0tfRlJBR01FTlRTKSkKQEAgLTM2NCwxMyArNDg5LDExIEBACiAJICB1bnppcCAtcW9ERCAtZCAkJChQUklWQVRFX01PRFVMRV9ESVIpICQkKFBSSVZBVEVfTU9EVUxFX0FSQ0hJVkUpOyBcCiAJICBta2RpciAtcCAkJChQUklWQVRFX09VVFBVVF9ESVIpL2xpYjsgXAogCSAgY3AgLXIgICQoMykvJChERVBNT0RfU1RBR0lOR19TVUJESVIpLyQoMikvbGliL21vZHVsZXMgJCQoUFJJVkFURV9PVVRQVVRfRElSKS9saWIvOyBcCi0JICBmaW5kICQkKFBSSVZBVEVfTU9EVUxFX0RJUikgLXR5cGUgZiAtbmFtZSAqLmtvIHwgeGFyZ3MgYmFzZW5hbWUgLWEgPiAkJChQUklWQVRFX0xPQURfRklMRSk7IFwKKwkgIGZpbmQgJCQoUFJJVkFURV9NT0RVTEVfRElSKSAtdHlwZSBmIC1uYW1lICcqLmtvJyB8IHhhcmdzIGJhc2VuYW1lIC1hID4gJCQoUFJJVkFURV9MT0FEX0ZJTEUpOyBcCiAJKQogCSQoaWYgJCgxKSxcCiAJICBjcCAkJChQUklWQVRFX01PRFVMRVMpICQkKFBSSVZBVEVfTU9EVUxFX0RJUikvOyBcCi0JICBmb3IgTU9EVUxFIGluICQkKFBSSVZBVEVfTE9BRF9NT0RVTEVTKTsgZG8gXAotCSAgICBiYXNlbmFtZSAkJCQkTU9EVUxFID4+ICQkKFBSSVZBVEVfTE9BRF9GSUxFKTsgXAotCSAgZG9uZTsgXAorCSAgaWYgWyAtbiAiJCQoUFJJVkFURV9MT0FEX01PRFVMRVMpIiBdOyB0aGVuIGJhc2VuYW1lIC1hICQkKFBSSVZBVEVfTE9BRF9NT0RVTEVTKTsgZmkgPiAkJChQUklWQVRFX0xPQURfRklMRSk7IFwKIAkpCiAJIyBUaGUgbG4gLXNmICsgZmluZCAtZGVsZXRlIHNlcXVlbmNlIGlzIHRvIHJlbW92ZSBhbnkgbW9kdWxlcyBpbgogCSMgUFJJVkFURV9FWFRSQV9NT0RVTEVTIHdoaWNoIGhhdmUgc2FtZSBiYXNlbmFtZSBhcyBNT0RVTEVTIGluIFBSSVZBVEVfTU9EVUxFUwpAQCAtNTMwLDYgKzY1MywyNCBAQAogICAgICQoY2FsbCBjb3B5LW1hbnktZmlsZXMsJChjYWxsIG1vZHVsZS1sb2FkLWxpc3QtY29weS1wYXRocywkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyx2ZW5kb3JfY2hhcmdlcl9tb2R1bGVfbGlzdCQoX3NlcCkkKF9rdmVyKSksJChCT0FSRF9WRU5ET1JfQ0hBUkdFUl9LRVJORUxfTU9EVUxFUyQoX3NlcCkkKF9rdmVyKSksJChCT0FSRF9WRU5ET1JfQ0hBUkdFUl9LRVJORUxfTU9EVUxFU19MT0FEJChfc2VwKSQoX2t2ZXIpKSxtb2R1bGVzLmxvYWQuY2hhcmdlciwkKFRBUkdFVF9PVVRfVkVORE9SKSkpKQogZW5kZWYKIAorIyAkKDEpOiBrZXJuZWwgbW9kdWxlIGRpcmVjdG9yeSBuYW1lICh0b3AgaXMgYW4gb3V0IG9mIGJhbmQgdmFsdWUgZm9yIG5vIGRpcmVjdG9yeSkKK2RlZmluZSBidWlsZC12ZW5kb3ItcmFtZGlzay1jaGFyZ2VyLWxvYWQKKyQoaWYgJChmaWx0ZXIgdG9wLCQoMSkpLFwKKyAgJChldmFsIF9rdmVyIDo9KSQoZXZhbCBfc2VwIDo9KSxcCisgICQoZXZhbCBfa3ZlciA6PSAkKDEpKSQoZXZhbCBfc2VwIDo9XykpXAorICAkKGlmICQoQk9BUkRfVkVORE9SX1JBTURJU0tfQ0hBUkdFUl9LRVJORUxfTU9EVUxFU19MT0FEJChfc2VwKSQoX2t2ZXIpKSxcCisgICAgJChjYWxsIGNvcHktbWFueS1maWxlcywkKGNhbGwgbW9kdWxlLWxvYWQtbGlzdC1jb3B5LXBhdGhzLCQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHZlbmRvcl9yYW1kaXNrX2NoYXJnZXJfbW9kdWxlX2xpc3QkKF9zZXApJChfa3ZlcikpLCQoQk9BUkRfVkVORE9SX1JBTURJU0tfS0VSTkVMX01PRFVMRVMkKF9zZXApJChfa3ZlcikpLCQoQk9BUkRfVkVORE9SX1JBTURJU0tfQ0hBUkdFUl9LRVJORUxfTU9EVUxFU19MT0FEJChfc2VwKSQoX2t2ZXIpKSxtb2R1bGVzLmxvYWQuY2hhcmdlciwkKFRBUkdFVF9WRU5ET1JfUkFNRElTS19PVVQpKSkpCitlbmRlZgorCisjICQoMSk6IGtlcm5lbCBtb2R1bGUgZGlyZWN0b3J5IG5hbWUgKHRvcCBpcyBhbiBvdXQgb2YgYmFuZCB2YWx1ZSBmb3Igbm8gZGlyZWN0b3J5KQorZGVmaW5lIGJ1aWxkLXZlbmRvci1rZXJuZWwtcmFtZGlzay1jaGFyZ2VyLWxvYWQKKyQoaWYgJChmaWx0ZXIgdG9wLCQoMSkpLFwKKyAgJChldmFsIF9rdmVyIDo9KSQoZXZhbCBfc2VwIDo9KSxcCisgICQoZXZhbCBfa3ZlciA6PSAkKDEpKSQoZXZhbCBfc2VwIDo9XykpXAorICAkKGlmICQoQk9BUkRfVkVORE9SX0tFUk5FTF9SQU1ESVNLX0NIQVJHRVJfS0VSTkVMX01PRFVMRVNfTE9BRCQoX3NlcCkkKF9rdmVyKSksXAorICAgICQoY2FsbCBjb3B5LW1hbnktZmlsZXMsJChjYWxsIG1vZHVsZS1sb2FkLWxpc3QtY29weS1wYXRocywkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyx2ZW5kb3Jfa2VybmVsX3JhbWRpc2tfY2hhcmdlcl9tb2R1bGVfbGlzdCQoX3NlcCkkKF9rdmVyKSksJChCT0FSRF9WRU5ET1JfS0VSTkVMX1JBTURJU0tfS0VSTkVMX01PRFVMRVMkKF9zZXApJChfa3ZlcikpLCQoQk9BUkRfVkVORE9SX0tFUk5FTF9SQU1ESVNLX0NIQVJHRVJfS0VSTkVMX01PRFVMRVNfTE9BRCQoX3NlcCkkKF9rdmVyKSksbW9kdWxlcy5sb2FkLmNoYXJnZXIsJChUQVJHRVRfVkVORE9SX0tFUk5FTF9SQU1ESVNLX09VVCkpKSkKK2VuZGVmCisKIGlmbmVxICgkKEJVSUxESU5HX1ZFTkRPUl9CT09UX0lNQUdFKSx0cnVlKQogICAjIElmIHRoZXJlIGlzIG5vIHZlbmRvciBib290IHBhcnRpdGlvbiwgc3RvcmUgdmVuZG9yIHJhbWRpc2sga2VybmVsIG1vZHVsZXMgaW4gdGhlCiAgICMgYm9vdCByYW1kaXNrLgpAQCAtNTQ3LDYgKzY4OCwxMiBAQAogICBlbmRpZgogZW5kaWYKIAoraWZuZXEgKCQoQk9BUkRfRE9fTk9UX1NUUklQX0dFTkVSSUNfUkFNRElTS19NT0RVTEVTKSx0cnVlKQorICBHRU5FUklDX1JBTURJU0tfU1RSSVBQRURfTU9EVUxFX1NUQUdJTkdfRElSIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLGRlcG1vZF9nZW5lcmljX3JhbWRpc2tfa2VybmVsX3N0cmlwcGVkKQorZWxzZQorICBHRU5FUklDX1JBTURJU0tfU1RSSVBQRURfTU9EVUxFX1NUQUdJTkdfRElSIDo9CitlbmRpZgorCiBpZm5lcSAoJChCT0FSRF9ET19OT1RfU1RSSVBfUkVDT1ZFUllfTU9EVUxFUyksdHJ1ZSkKIAlSRUNPVkVSWV9TVFJJUFBFRF9NT0RVTEVfU1RBR0lOR19ESVIgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsZGVwbW9kX3JlY292ZXJ5X3N0cmlwcGVkKQogZWxzZQpAQCAtNTczLDcgKzcyMCw3IEBACiAKIEJPQVJEX0tFUk5FTF9NT0RVTEVfRElSUyArPSB0b3AKIAotIyBEZWZhdWx0IHRvIG5vdCBnZW5lcmF0aW5nIG1vZHVsZXMuZGVwIGZvciBrZXJuZWwgbW9kdWxlcyBvbiBzeXN0ZW0KKyMgRGVmYXVsdCB0byBub3QgZ2VuZXJhdGluZyBtb2R1bGVzLmxvYWQgZm9yIGtlcm5lbCBtb2R1bGVzIG9uIHN5c3RlbQogIyBzaWRlLiBXZSBzaG91bGQgb25seSBsb2FkIHRoZXNlIG1vZHVsZXMgaWYgdGhleSBhcmUgZGVwZW5kZWQgYnkgdmVuZG9yCiAjIHNpZGUgbW9kdWxlcy4KIGlmZXEgKCQoQk9BUkRfU1lTVEVNX0tFUk5FTF9NT0RVTEVTX0xPQUQpLCkKQEAgLTU5NSwxMSArNzQyLDEzIEBACiAgICQoZXZhbCBBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKGNhbGwgYnVpbGQtdmVuZG9yLWtlcm5lbC1yYW1kaXNrLXJlY292ZXJ5LWxvYWQsJChrbWQpKSkgXAogICAkKGV2YWwgQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChjYWxsIGJ1aWxkLWltYWdlLWtlcm5lbC1tb2R1bGVzLWRpcixWRU5ET1IsJChpZiAkKGZpbHRlciB0cnVlLCQoQk9BUkRfVVNFU19WRU5ET1JfRExLTUlNQUdFKSksJChUQVJHRVRfT1VUX1ZFTkRPUl9ETEtNKSwkKFRBUkdFVF9PVVRfVkVORE9SKSksdmVuZG9yLG1vZHVsZXMubG9hZCwkKFZFTkRPUl9TVFJJUFBFRF9NT0RVTEVfU1RBR0lOR19ESVIpLCQoa21kKSwkKEJPQVJEX1NZU1RFTV9LRVJORUxfTU9EVUxFUyksc3lzdGVtKSkgXAogICAkKGV2YWwgQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChjYWxsIGJ1aWxkLXZlbmRvci1jaGFyZ2VyLWxvYWQsJChrbWQpKSkgXAorICAkKGV2YWwgQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChjYWxsIGJ1aWxkLXZlbmRvci1yYW1kaXNrLWNoYXJnZXItbG9hZCwkKGttZCkpKSBcCisgICQoZXZhbCBBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKGNhbGwgYnVpbGQtdmVuZG9yLWtlcm5lbC1yYW1kaXNrLWNoYXJnZXItbG9hZCwkKGttZCkpKSBcCiAgICQoZXZhbCBBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKGNhbGwgYnVpbGQtaW1hZ2Uta2VybmVsLW1vZHVsZXMtZGlyLE9ETSwkKGlmICQoZmlsdGVyIHRydWUsJChCT0FSRF9VU0VTX09ETV9ETEtNSU1BR0UpKSwkKFRBUkdFVF9PVVRfT0RNX0RMS00pLCQoVEFSR0VUX09VVF9PRE0pKSxvZG0sbW9kdWxlcy5sb2FkLCwkKGttZCkpKSBcCi0gICQoZXZhbCBBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKGNhbGwgYnVpbGQtaW1hZ2Uta2VybmVsLW1vZHVsZXMtZGlyLFNZU1RFTSwkKGlmICQoZmlsdGVyIHRydWUsJChCT0FSRF9VU0VTX1NZU1RFTV9ETEtNSU1BR0UpKSwkKFRBUkdFVF9PVVRfU1lTVEVNX0RMS00pLCQoVEFSR0VUX09VVF9TWVNURU0pKSxzeXN0ZW0sbW9kdWxlcy5sb2FkLCwkKGttZCkpKSBcCisgICQoZXZhbCBBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKGNhbGwgYnVpbGQtaW1hZ2Uta2VybmVsLW1vZHVsZXMtZGlyLFNZU1RFTSwkKGlmICQoZmlsdGVyIHRydWUsJChCT0FSRF9VU0VTX1NZU1RFTV9ETEtNSU1BR0UpKSwkKFRBUkdFVF9PVVRfU1lTVEVNX0RMS00pLCQoVEFSR0VUX09VVCkpLHN5c3RlbSxtb2R1bGVzLmxvYWQsLCQoa21kKSkpIFwKICAgJChpZiAkKGZpbHRlciB0cnVlLCQoQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09UKSksXAogICAgICQoZXZhbCBBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKGNhbGwgYnVpbGQtcmVjb3ZlcnktYXMtYm9vdC1sb2FkLCQoa21kKSkpLFwKLSAgICAkKGV2YWwgQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChjYWxsIGJ1aWxkLWltYWdlLWtlcm5lbC1tb2R1bGVzLWRpcixHRU5FUklDX1JBTURJU0ssJChUQVJHRVRfUkFNRElTS19PVVQpLCxtb2R1bGVzLmxvYWQsLCQoa21kKSkpKSkKKyAgICAkKGV2YWwgQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChjYWxsIGJ1aWxkLWltYWdlLWtlcm5lbC1tb2R1bGVzLWRpcixHRU5FUklDX1JBTURJU0ssJChUQVJHRVRfUkFNRElTS19PVVQpLCxtb2R1bGVzLmxvYWQsJChHRU5FUklDX1JBTURJU0tfU1RSSVBQRURfTU9EVUxFX1NUQUdJTkdfRElSKSwkKGttZCkpKSkpCiAKIGlmZXEgKCQoQk9BUkRfU1lTVEVNX0tFUk5FTF9NT0RVTEVTKSwpCiBpZm5lcSAoJChCT0FSRF9TWVNURU1fRExLTV9TUkMpLCkKQEAgLTY0NSw3ICs3OTQsNyBAQAogaWZlcSAoJChUQVJHRVRfQlVJTERfVFlQRSksZGVidWcpCiAgIG5hbWUgOj0gJChuYW1lKV9kZWJ1ZwogZW5kaWYKLW5hbWUgOj0gJChuYW1lKS1hcGtjZXJ0cy0kKEZJTEVfTkFNRV9UQUcpCituYW1lIDo9ICQobmFtZSktYXBrY2VydHMKIGludGVybWVkaWF0ZXMgOj0gXAogCSQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLGFwa2NlcnRzKQogQVBLQ0VSVFNfRklMRSA6PSAkKGludGVybWVkaWF0ZXMpLyQobmFtZSkudHh0CkBAIC02NzUsOSArODI0LDI1IEBACiAuUEhPTlk6IGFwa2NlcnRzLWxpc3QKIGFwa2NlcnRzLWxpc3Q6ICQoQVBLQ0VSVFNfRklMRSkKIAoraW50ZXJtZWRpYXRlcyA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxhcGV4a2V5cykKK0FQRVhfS0VZU19GSUxFIDo9ICQoaW50ZXJtZWRpYXRlcykvYXBleGtleXMudHh0CisKK2FsbF9hcGV4X2tleXNfZmlsZXMgOj0gJChzb3J0ICQoZm9yZWFjaCBtLCQoY2FsbCBwcm9kdWN0LWluc3RhbGxlZC1tb2R1bGVzLCQoSU5URVJOQUxfUFJPRFVDVCkpLCQoQUxMX01PRFVMRVMuJChtKS5BUEVYX0tFWVNfRklMRSkpKQorJChBUEVYX0tFWVNfRklMRSk6ICQoYWxsX2FwZXhfa2V5c19maWxlcykKKwlAbWtkaXIgLXAgJChkaXIgJEApCisJQHJtIC1mICRACisJJChoaWRlKSB0b3VjaCAkQAorCSQoaGlkZSkgJChmb3JlYWNoIGZpbGUsJF4sY2F0ICQoZmlsZSkgPj4gJEAgJChuZXdsaW5lKSkKK2FsbF9hcGV4X2tleXNfZmlsZXMgOj0KKworJChjYWxsIGRlY2xhcmUtMHAtdGFyZ2V0LCQoQVBFWF9LRVlTX0ZJTEUpKQorCisuUEhPTlk6IGFwZXhrZXlzLnR4dAorYXBleGtleXMudHh0OiAkKEFQRVhfS0VZU19GSUxFKQorCiBpZm5lcSAoLCQoVEFSR0VUX0JVSUxEX0FQUFMpKQogICAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGFwcHNfb25seSwgJChBUEtDRVJUU19GSUxFKTphcGtjZXJ0cy50eHQpCi0gICQoY2FsbCBkaXN0LWZvci1nb2FscywgYXBwc19vbmx5LCAkKFNPT05HX0FQRVhfS0VZU19GSUxFKTphcGV4a2V5cy50eHQpCisgICQoY2FsbCBkaXN0LWZvci1nb2FscywgYXBwc19vbmx5LCAkKEFQRVhfS0VZU19GSUxFKTphcGV4a2V5cy50eHQpCiBlbmRpZgogCiAKQEAgLTcwNyw2ICs4NzIsNyBAQAogU09PTkdfQ09OVl9EQVRBIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHNvb25nX2NvbnZlcnNpb24pL3Nvb25nX2NvbnZfZGF0YQogJChTT09OR19DT05WX0RBVEEpOgogCUBybSAtZiAkQAorCUB0b3VjaCAkQCAjIFRoaXMgZmlsZSBtdXN0IGJlIHByZXNlbnQgZXZlbiBpZiBTT09OR19DT05WIGlzIGVtcHR5LgogCUAkKGZvcmVhY2ggcywkKFNPT05HX0NPTlYpLGVjaG8gIiQocyksJChTT09OR19DT05WLiQocykuVFlQRSksJChzb3J0ICQoU09PTkdfQ09OVi4kKHMpLlBST0JMRU1TKSksJChzb3J0ICQoZmlsdGVyLW91dCAkKFNPT05HX0FMUkVBRFlfQ09OViksJChTT09OR19DT05WLiQocykuREVQUykpKSwkKHNvcnQgJChTT09OR19DT05WLiQocykuTUFLRUZJTEVTKSksJChzb3J0ICQoU09PTkdfQ09OVi4kKHMpLklOU1RBTExFRCkpIiA+PiRAOykKIAogJChjYWxsIGRlY2xhcmUtMXAtdGFyZ2V0LCQoU09PTkdfQ09OVl9EQVRBKSxidWlsZCkKQEAgLTcxOSwxMSArODg1LDYgQEAKICQoY2FsbCBkZWNsYXJlLTFwLXRhcmdldCwkKFNPT05HX1RPX0NPTlZFUlQpLGJ1aWxkKQogJChjYWxsIGRpc3QtZm9yLWdvYWxzLGRyb2lkY29yZS11bmJ1bmRsZWQsJChTT09OR19UT19DT05WRVJUKSkKIAotJChQUk9EVUNUX09VVCkvcHJvZHVjdF9wYWNrYWdlcy50eHQ6Ci0JQHJtIC1mICRACi0JZWNobyAiIiA+ICRACi0JJChmb3JlYWNoIHgsJChQUk9EVUNUX1BBQ0tBR0VTKSxlY2hvICQoeCkgPj4gJEAkKG5ld2xpbmUpKQotCiBNSzJCUF9DQVRBTE9HX1NDUklQVCA6PSBidWlsZC9tYWtlL3Rvb2xzL21rMmJwX2NhdGFsb2cucHkKIFBST0RVQ1RfUEFDS0FHRVNfVFhUIDo9ICQoUFJPRFVDVF9PVVQpL3Byb2R1Y3RfcGFja2FnZXMudHh0CiBNSzJCUF9SRU1BSU5JTkdfSFRNTCA6PSAkKFBST0RVQ1RfT1VUKS9tazJicF9yZW1haW5pbmcuaHRtbApAQCAtNzUzLDYgKzkxNCw5IEBACiAkKGNhbGwgZGVjbGFyZS0xcC10YXJnZXQsJChNSzJCUF9SRU1BSU5JTkdfQ1NWKSkKICQoY2FsbCBkaXN0LWZvci1nb2Fscyxkcm9pZGNvcmUtdW5idW5kbGVkLCQoTUsyQlBfUkVNQUlOSU5HX0NTVikpCiAKKy5QSE9OWTogbWsyYnBfcmVtYWluaW5nCittazJicF9yZW1haW5pbmc6ICQoTUsyQlBfUkVNQUlOSU5HX0hUTUwpICQoTUsyQlBfUkVNQUlOSU5HX0NTVikKKwogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBNb2R1bGVzIHVzZSAtV25vLWVycm9yLCBvciBhZGRlZCBkZWZhdWx0IC1XYWxsIC1XZXJyb3IKIFdBTExfV0VSUk9SIDo9ICQoUFJPRFVDVF9PVVQpL3dhbGxfd2Vycm9yLnR4dApAQCAtODAxLDI3ICs5NjUsMTIgQEAKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0uUEhPTlk6IGV2ZW50LWxvZy10YWdzCi0KLSMgUHJvZHVjZSBhbiBldmVudCBsb2dzIHRhZyBmaWxlIGZvciBldmVyeXRoaW5nIHdlIGtub3cgYWJvdXQsIGluIG9yZGVyCi0jIHRvIHByb3Blcmx5IGFsbG9jYXRlIG51bWJlcnMuICBUaGVuIHByb2R1Y2UgYSBmaWxlIHRoYXQncyBmaWx0ZXJlZAotIyBmb3Igd2hhdCdzIGdvaW5nIHRvIGJlIGluc3RhbGxlZC4KLQotYWxsX2V2ZW50X2xvZ190YWdzX2ZpbGUgOj0gJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS9hbGwtZXZlbnQtbG9nLXRhZ3MudHh0Ci0KIGV2ZW50X2xvZ190YWdzX2ZpbGUgOj0gJChUQVJHRVRfT1VUKS9ldGMvZXZlbnQtbG9nLXRhZ3MKIAogIyBJbmNsdWRlIHRhZ3MgZnJvbSBhbGwgcGFja2FnZXMgdGhhdCB3ZSBrbm93IGFib3V0CiBhbGxfZXZlbnRfbG9nX3RhZ3Nfc3JjIDo9IFwKICAgICAkKHNvcnQgJChmb3JlYWNoIG0sICQoQUxMX01PRFVMRVMpLCAkKEFMTF9NT0RVTEVTLiQobSkuRVZFTlRfTE9HX1RBR1MpKSkKIAotJChhbGxfZXZlbnRfbG9nX3RhZ3NfZmlsZSk6IFBSSVZBVEVfU1JDX0ZJTEVTIDo9ICQoYWxsX2V2ZW50X2xvZ190YWdzX3NyYykKLSQoYWxsX2V2ZW50X2xvZ190YWdzX2ZpbGUpOiAkKGFsbF9ldmVudF9sb2dfdGFnc19zcmMpICQoTUVSR0VUQUdTKSBidWlsZC9tYWtlL3Rvb2xzL2V2ZW50X2xvZ190YWdzLnB5Ci0JJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkKLQkkKGhpZGUpICQoTUVSR0VUQUdTKSAtbyAkQCAkKFBSSVZBVEVfU1JDX0ZJTEVTKQotCi0kKGNhbGwgZGVjbGFyZS0wcC10YXJnZXQsJChhbGxfZXZlbnRfbG9nX3RhZ3NfZmlsZSkpCi0KICMgSW5jbHVkZSB0YWdzIGZyb20gYWxsIHBhY2thZ2VzIGluY2x1ZGVkIGluIHRoaXMgcHJvZHVjdCwgcGx1cyBhbGwKICMgdGFncyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBzeXN0ZW0gKGllLCBub3QgaW4gYSB2ZW5kb3IvIG9yIGRldmljZS8KICMgZGlyZWN0b3J5KS4KQEAgLTgzMywxMyArOTgyLDEzIEBACiAgICAgICAkKGZpbHRlci1vdXQgdmVuZG9yLyUgZGV2aWNlLyUgb3V0LyUsJChhbGxfZXZlbnRfbG9nX3RhZ3Nfc3JjKSkpCiAKICQoZXZlbnRfbG9nX3RhZ3NfZmlsZSk6IFBSSVZBVEVfU1JDX0ZJTEVTIDo9ICQoZXZlbnRfbG9nX3RhZ3Nfc3JjKQotJChldmVudF9sb2dfdGFnc19maWxlKTogUFJJVkFURV9NRVJHRURfRklMRSA6PSAkKGFsbF9ldmVudF9sb2dfdGFnc19maWxlKQotJChldmVudF9sb2dfdGFnc19maWxlKTogJChldmVudF9sb2dfdGFnc19zcmMpICQoYWxsX2V2ZW50X2xvZ190YWdzX2ZpbGUpICQoTUVSR0VUQUdTKSBidWlsZC9tYWtlL3Rvb2xzL2V2ZW50X2xvZ190YWdzLnB5CiskKGV2ZW50X2xvZ190YWdzX2ZpbGUpOiAkKGV2ZW50X2xvZ190YWdzX3NyYykgJChNRVJHRVRBR1MpCiAJJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkKLQkkKGhpZGUpICQoTUVSR0VUQUdTKSAtbyAkQCAtbSAkKFBSSVZBVEVfTUVSR0VEX0ZJTEUpICQoUFJJVkFURV9TUkNfRklMRVMpCisJJChoaWRlKSAkKE1FUkdFVEFHUykgLW8gJEAgJChQUklWQVRFX1NSQ19GSUxFUykKIAogJChldmFsICQoY2FsbCBkZWNsYXJlLTBwLXRhcmdldCwkKGV2ZW50X2xvZ190YWdzX2ZpbGUpKSkKIAorLlBIT05ZOiBldmVudC1sb2ctdGFncwogZXZlbnQtbG9nLXRhZ3M6ICQoZXZlbnRfbG9nX3RhZ3NfZmlsZSkKIAogQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChldmVudF9sb2dfdGFnc19maWxlKQpAQCAtOTEyLDYgKzEwNjEsMzUgQEAKIGVuZGlmCiBlbmRpZgogCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZHRibyBpbWFnZQoraWZkZWYgQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFCitJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9kdGJvLmltZworCitpZmVxICgkKEJPQVJEX0FWQl9FTkFCTEUpLHRydWUpCiskKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKTogJChCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0UpICQoQVZCVE9PTCkgJChCT0FSRF9BVkJfRFRCT19LRVlfUEFUSCkKKwljcCAkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRSkgJEAKKwljaG1vZCArdyAkQAorCSQoQVZCVE9PTCkgYWRkX2hhc2hfZm9vdGVyIFwKKwkgICAgLS1pbWFnZSAkQCBcCisJICAgICQoY2FsbCBnZXQtcGFydGl0aW9uLXNpemUtYXJndW1lbnQsJChCT0FSRF9EVEJPSU1HX1BBUlRJVElPTl9TSVpFKSkgXAorCSAgICAtLXBhcnRpdGlvbl9uYW1lIGR0Ym8gJChJTlRFUk5BTF9BVkJfRFRCT19TSUdOSU5HX0FSR1MpIFwKKwkgICAgJChCT0FSRF9BVkJfRFRCT19BRERfSEFTSF9GT09URVJfQVJHUykKKworJChjYWxsIGRlY2xhcmUtMXAtY29udGFpbmVyLCQoSU5TVEFMTEVEX0RUQk9JTUFHRV9UQVJHRVQpLCkKKyQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJChJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCksJChCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0UpLCQoUFJPRFVDVF9PVVQpLzovKQorCitVTk1PVU5URURfTk9USUNFX1ZFTkRPUl9ERVBTKz0gJChJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCkKK2Vsc2UKKyQoSU5TVEFMTEVEX0RUQk9JTUFHRV9UQVJHRVQpOiAkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRSkKKwljcCAkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRSkgJEAKK2VuZGlmCisKK2VuZGlmICMgQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyB0aGUgcmFtZGlzawogSU5TVEFMTEVEX0ZJTEVTX09VVFNJREVfSU1BR0VTIDo9ICQoZmlsdGVyLW91dCAkKFRBUkdFVF9SQU1ESVNLX09VVCkvJSwgJChJTlNUQUxMRURfRklMRVNfT1VUU0lERV9JTUFHRVMpKQpAQCAtOTQxLDEzICsxMTE5LDE2OSBAQAogQ09NUFJFU1NJT05fQ09NTUFORCA6PSAkKExaNCkgLWwgLTEyIC0tZmF2b3ItZGVjU3BlZWQKIFJBTURJU0tfRVhUIDo9IC5sejQKIGVsc2UKLUNPTVBSRVNTSU9OX0NPTU1BTkRfREVQUyA6PSAkKE1JTklHWklQKQotQ09NUFJFU1NJT05fQ09NTUFORCA6PSAkKE1JTklHWklQKQorQ09NUFJFU1NJT05fQ09NTUFORF9ERVBTIDo9ICQoR1pJUCkKK0NPTVBSRVNTSU9OX0NPTU1BTkQgOj0gJChHWklQKQogUkFNRElTS19FWFQgOj0gLmd6CiBlbmRpZgogCitpZm5lcSAoJChCT0FSRF9LRVJORUxfTU9EVUxFU18xNkspLCkKKworVEFSR0VUX09VVF9SQU1ESVNLXzE2SyA6PSAkKFBST0RVQ1RfT1VUKS9yYW1kaXNrXzE2aworQlVJTFRfUkFNRElTS18xNktfVEFSR0VUIDo9ICQoUFJPRFVDVF9PVVQpL3JhbWRpc2tfMTZrLmltZworUkFNRElTS18xNktfU1RBR0lOR19ESVIgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsZGVwbW9kX3JhbWRpc2tfMTZrKQorCitpZm5lcSAoJChCT0FSRF9TWVNURU1fS0VSTkVMX01PRFVMRVMpLCkKK1NZU1RFTV9ETEtNX01PRFVMRV9QQVRURVJOUyA6PSAkKGZvcmVhY2ggcGF0aCwkKEJPQVJEX1NZU1RFTV9LRVJORUxfTU9EVUxFUyksJS8kKG5vdGRpciAkKHBhdGgpKSkKKworZW5kaWYKKworIyBCT0FSRF9LRVJORUxfTU9EVUxFU18xNksgbWlnaHQgY29udGFpbiBkdXBsaWNhdGUgbW9kdWxlcyB1bmRlciBkaWZmZXJlbnQgcGF0aC4KKyMgZm9yIGV4YW1wbGUsIGZvby9iYXIvd2lmaS5rbyBhbmQgZm9vL3dpZmkua28gLiBUbyBhdm9pZCBidWlsZCBpc3N1ZXMsIGRlLWR1cAorIyBtb2R1bGUgbGlzdCBvbiBiYXNlbmFtZSBmaXJzdC4KK0JPQVJEX0tFUk5FTF9NT0RVTEVTXzE2SyA6PSAkKGZvcmVhY2ggXAorICBwYXR0ZXJuLFwKKyAgJChzb3J0ICQoZm9yZWFjaCBcCisgICAgcGF0aCxcCisgICAgJChCT0FSRF9LRVJORUxfTU9EVUxFU18xNkspLFwKKyAgICAlLyQobm90ZGlyICQocGF0aCkpKVwKKyAgKSxcCisgICQoZmlyc3R3b3JkICQoZmlsdGVyICQocGF0dGVybiksJChCT0FSRF9LRVJORUxfTU9EVUxFU18xNkspKSkgXAorKQorIyBGb3Igbm9uLUdLSSBtb2R1bGVzLCBzdHJpcCB0aGVtIGJlZm9yZSBpbnN0YWxsLiBBcyBkZWJ1ZyBzeW1ib2xzIHRha2UgdXAKKyMgc2lnbmlmaWNhbnQgc3BhY2UuCiskKGZvcmVhY2ggXAorICBmaWxlLFwKKyAgJChmaWx0ZXItb3V0ICQoU1lTVEVNX0RMS01fTU9EVUxFX1BBVFRFUk5TKSwkKEJPQVJEX0tFUk5FTF9NT0RVTEVTXzE2SykpLFwKKyAgJChldmFsIFwKKyAgICAkKGNhbGwgY29weS1hbmQtc3RyaXAta2VybmVsLW1vZHVsZSxcCisgICAgICAkKGZpbGUpLFwKKyAgICAgICQoUkFNRElTS18xNktfU1RBR0lOR19ESVIpL2xpYi9tb2R1bGVzLzAuMC8kKG5vdGRpciAkKGZpbGUpKSBcCisgICAgKSBcCisgICkgXAorKQorCisjIEZvciBHS0kgbW9kdWxlcywgY29weSBhcy1pcyB3aXRob3V0IHN0cmlwcGluZywgYmVjYXVzZSBzdHJpcHBpbmcgd291bGQKKyMgcmVtb3ZlIHRoZSBzaWduYXR1cmUgb2Yga2VybmVsIG1vZHVsZXMsIGFuZCBHS0kgbW9kdWxlcyBtdXN0IGJlIHNpZ25lZAorIyBmb3Iga2VybmVsIHRvIGxvYWQgdGhlbS4KKyQoZm9yZWFjaCBcCisgIGZpbGUsXAorICAkKGZpbHRlciAkKFNZU1RFTV9ETEtNX01PRFVMRV9QQVRURVJOUyksJChCT0FSRF9LRVJORUxfTU9EVUxFU18xNkspKSxcCisgICQoZXZhbCBcCisgICAgJChjYWxsIGNvcHktb25lLWZpbGUsXAorICAgICAgJChmaWxlKSxcCisgICAgICAkKFJBTURJU0tfMTZLX1NUQUdJTkdfRElSKS9saWIvbW9kdWxlcy8wLjAvJChub3RkaXIgJChmaWxlKSkgXAorICAgICkgXAorICApIFwKKykKKworQk9BUkRfVkVORE9SX1JBTURJU0tfRlJBR01FTlQuMTZLLlBSRUJVSUxUIDo9ICQoQlVJTFRfUkFNRElTS18xNktfVEFSR0VUKQorCitpZm5kZWYgQk9BUkRfS0VSTkVMX01PRFVMRVNfTE9BRF8xNksKKyAgQk9BUkRfS0VSTkVMX01PRFVMRVNfTE9BRF8xNksgOj0gJChCT0FSRF9LRVJORUxfTU9EVUxFU18xNkspCitlbmRpZgorCiskKEJVSUxUX1JBTURJU0tfMTZLX1RBUkdFVCk6ICQoREVQTU9EKSAkKE1LQk9PVEZTKSAkKEVYVFJBQ1RfS0VSTkVMKSAkKENPTVBSRVNTSU9OX0NPTU1BTkRfREVQUykKKyQoQlVJTFRfUkFNRElTS18xNktfVEFSR0VUKTogJChmb3JlYWNoIGZpbGUsJChCT0FSRF9LRVJORUxfTU9EVUxFU18xNkspLCQoUkFNRElTS18xNktfU1RBR0lOR19ESVIpL2xpYi9tb2R1bGVzLzAuMC8kKG5vdGRpciAkKGZpbGUpKSkKKwkkKERFUE1PRCkgLWIgJChSQU1ESVNLXzE2S19TVEFHSU5HX0RJUikgMC4wCisJcm0gLWYgJChSQU1ESVNLXzE2S19TVEFHSU5HX0RJUikvbGliL21vZHVsZXMvMC4wL21vZHVsZXMubG9hZAorCWZvciBNT0RVTEUgaW4gJChCT0FSRF9LRVJORUxfTU9EVUxFU19MT0FEXzE2Syk7IGRvIFwKKwkJYmFzZW5hbWUgJCRNT0RVTEUgPj4gJChSQU1ESVNLXzE2S19TVEFHSU5HX0RJUikvbGliL21vZHVsZXMvMC4wL21vZHVsZXMubG9hZCA7IFwKKwlkb25lOworCXJtIC1yZiAkKFRBUkdFVF9PVVRfUkFNRElTS18xNkspL2xpYi9tb2R1bGVzCisJbWtkaXIgLXAgJChUQVJHRVRfT1VUX1JBTURJU0tfMTZLKS9saWIvbW9kdWxlcworCUtFUk5FTF9SRUxFQVNFPWAkKEVYVFJBQ1RfS0VSTkVMKSAtLXRvb2xzIGx6NDokKExaNCkgLS1pbnB1dCAkKEJPQVJEX0tFUk5FTF9QQVRIXzE2SykgLS1vdXRwdXQtcmVsZWFzZWAgO1wKKwlJU18xNktfS0VSTkVMPWAkKEVYVFJBQ1RfS0VSTkVMKSAtLXRvb2xzIGx6NDokKExaNCkgLS1pbnB1dCAkKEJPQVJEX0tFUk5FTF9QQVRIXzE2SykgLS1vdXRwdXQtY29uZmlnYCA7XAorCWlmIFtbICIkJElTXzE2S19LRVJORUwiID09ICoiQ09ORklHX0FSTTY0XzE2S19QQUdFUz15IiogXV07IHRoZW4gU1VGRklYPV8xNms7IGZpIDtcCisJY3AgLXIgJChSQU1ESVNLXzE2S19TVEFHSU5HX0RJUikvbGliL21vZHVsZXMvMC4wICQoVEFSR0VUX09VVF9SQU1ESVNLXzE2SykvbGliL21vZHVsZXMvJCRLRVJORUxfUkVMRUFTRSQkU1VGRklYCisJJChNS0JPT1RGUykgJChUQVJHRVRfT1VUX1JBTURJU0tfMTZLKSB8ICQoQ09NUFJFU1NJT05fQ09NTUFORCkgPiAkQAorCisjIEJ1aWxkcyBhIHJhbWRpc2sgdXNpbmcgbW9kdWxlcyBkZWZpbmVkIGluIEJPQVJEX0tFUk5FTF9NT0RVTEVTXzE2SworcmFtZGlza18xNms6ICQoQlVJTFRfUkFNRElTS18xNktfVEFSR0VUKQorLlBIT05ZOiByYW1kaXNrXzE2aworCitlbmRpZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIDE2S0IgZHRibyBpbWFnZQoraWZkZWYgQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFXzE2S0IKK0lOU1RBTExFRF9EVEJPSU1BR0VfMTZLQl9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvZHRib18xNmsuaW1nCisKK2lmZXEgKCQoQk9BUkRfQVZCX0VOQUJMRSksdHJ1ZSkKKyQoSU5TVEFMTEVEX0RUQk9JTUFHRV8xNktCX1RBUkdFVCk6ICQoQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFXzE2S0IpICQoQVZCVE9PTCkgJChCT0FSRF9BVkJfRFRCT19LRVlfUEFUSCkKKwljcCAkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRV8xNktCKSAkQAorCWNobW9kICt3ICRACisJJChBVkJUT09MKSBhZGRfaGFzaF9mb290ZXIgXAorCSAgICAtLWltYWdlICRAIFwKKwkgICAgJChjYWxsIGdldC1wYXJ0aXRpb24tc2l6ZS1hcmd1bWVudCwkKEJPQVJEX0RUQk9JTUdfUEFSVElUSU9OX1NJWkUpKSBcCisJICAgIC0tcGFydGl0aW9uX25hbWUgZHRibyAkKElOVEVSTkFMX0FWQl9EVEJPX1NJR05JTkdfQVJHUykgXAorCSAgICAkKEJPQVJEX0FWQl9EVEJPX0FERF9IQVNIX0ZPT1RFUl9BUkdTKQorCiskKGNhbGwgZGVjbGFyZS0xcC1jb250YWluZXIsJChJTlNUQUxMRURfRFRCT0lNQUdFXzE2S0JfVEFSR0VUKSwpCiskKGNhbGwgZGVjbGFyZS1jb250YWluZXItbGljZW5zZS1kZXBzLCQoSU5TVEFMTEVEX0RUQk9JTUFHRV8xNktCX1RBUkdFVCksJChCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0VfMTZLQiksJChQUk9EVUNUX09VVCkvOi8pCisKK1VOTU9VTlRFRF9OT1RJQ0VfVkVORE9SX0RFUFMgKz0gJChJTlNUQUxMRURfRFRCT0lNQUdFXzE2S0JfVEFSR0VUKQorZWxzZQorJChJTlNUQUxMRURfRFRCT0lNQUdFXzE2S0JfVEFSR0VUKTogJChCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0VfMTZLQikKKwljcCAkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRV8xNktCKSAkQAorZW5kaWYKKworZW5kaWYgIyBCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0VfMTZLQgorCisKK2lmbmVxICgkKEJPQVJEX0tFUk5FTF9QQVRIXzE2SyksKQorQlVJTFRfS0VSTkVMXzE2S19UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkva2VybmVsXzE2aworCiskKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChCT0FSRF9LRVJORUxfUEFUSF8xNkspLCQoQlVJTFRfS0VSTkVMXzE2S19UQVJHRVQpKSkKKworIyBDb3BpZXMgQk9BUkRfS0VSTkVMX1BBVEhfMTZLIHRvIG91dHB1dCBkaXJlY3RvcnkgYXMgaXMKK2tlcm5lbF8xNms6ICQoQlVJTFRfS0VSTkVMXzE2S19UQVJHRVQpCisuUEhPTlk6IGtlcm5lbF8xNmsKKworQlVJTFRfQk9PVElNQUdFXzE2S19UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvYm9vdF8xNmsuaW1nCisKK0JPQVJEX0tFUk5FTF8xNktfQk9PVElNQUdFX1BBUlRJVElPTl9TSVpFIDo9ICQoQk9BUkRfQk9PVElNQUdFX1BBUlRJVElPTl9TSVpFKQorCiskKEJVSUxUX0JPT1RJTUFHRV8xNktfVEFSR0VUKTogJChNS0JPT1RJTUcpICQoQVZCVE9PTCkgJChJTlRFUk5BTF9CT09USU1BR0VfRklMRVMpICQoQk9BUkRfQVZCX0JPT1RfS0VZX1BBVEgpICQoQlVJTFRfS0VSTkVMXzE2S19UQVJHRVQpCisJJChjYWxsIHByZXR0eSwiVGFyZ2V0IGJvb3QgMTZrIGltYWdlOiAkQCIpCisJJChjYWxsIGJ1aWxkX2Jvb3RfZnJvbV9rZXJuZWxfYXZiX2VuYWJsZWQsJEAsJChCVUlMVF9LRVJORUxfMTZLX1RBUkdFVCkpCisKKworYm9vdGltYWdlXzE2azogJChCVUlMVF9CT09USU1BR0VfMTZLX1RBUkdFVCkKKy5QSE9OWTogYm9vdGltYWdlXzE2aworCitCVUlMVF9CT09UX09UQV9QQUNLQUdFXzE2SyA6PSAkKFBST0RVQ1RfT1VUKS9ib290X290YV8xNmsuemlwCiskKEJVSUxUX0JPT1RfT1RBX1BBQ0tBR0VfMTZLKTogICQoT1RBX0ZST01fUkFXX0lNRykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJVSUxUX0JPT1RJTUFHRV8xNktfVEFSR0VUKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChERUZBVUxUX1NZU1RFTV9ERVZfQ0VSVElGSUNBVEUpLnBrOCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTEVEX0RUQk9JTUFHRV8xNktCX1RBUkdFVCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKQorCSQoT1RBX0ZST01fUkFXX0lNRykgLS1wYWNrYWdlX2tleSAkKERFRkFVTFRfU1lTVEVNX0RFVl9DRVJUSUZJQ0FURSkgXAorICAgICAgICAgICAgICAgICAgICAgIC0tbWF4X3RpbWVzdGFtcCBgY2F0ICQoQlVJTERfREFURVRJTUVfRklMRSlgIFwKKyAgICAgICAgICAgICAgICAgICAgICAtLXBhdGggJChIT1NUX09VVCkgXAorICAgICAgICAgICAgICAgICAgICAgIC0tcGFydGl0aW9uX25hbWUgJChpZiAkKGFuZCAkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTEVEX0RUQk9JTUFHRV8xNktCX1RBUkdFVCkpLFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb3QkKGNvbW1hKWR0Ym8sXAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vdCkgXAorICAgICAgICAgICAgICAgICAgICAgIC0tb3V0cHV0ICRAIFwKKyAgICAgICAgICAgICAgICAgICAgICAkKGlmICQoQk9BUkRfMTZLX09UQV9VU0VfSU5DUkVNRU5UQUwpLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpOiQoQlVJTFRfQk9PVElNQUdFXzE2S19UQVJHRVQpLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICQoQlVJTFRfQk9PVElNQUdFXzE2S19UQVJHRVQpXAorICAgICAgICAgICAgICAgICAgICAgIClcCisgICAgICAgICAgICAgICAgICAgICAgJChpZiAkKGFuZCAkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKSwkKElOU1RBTExFRF9EVEJPSU1BR0VfMTZLQl9UQVJHRVQpKSxcCisgICAgICAgICAgICAgICAgICAgICAgICAkKElOU1RBTExFRF9EVEJPSU1BR0VfMTZLQl9UQVJHRVQpKQorCitib290b3RhcGFja2FnZV8xNms6ICQoQlVJTFRfQk9PVF9PVEFfUEFDS0FHRV8xNkspCisuUEhPTlk6IGJvb3RvdGFwYWNrYWdlXzE2aworCitlbmRpZgorCisKK3JhbWRpc2tfaW50ZXJtZWRpYXRlcyA6PSQ9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHJhbWRpc2spCiskKGV2YWwgJChjYWxsIHdyaXRlLXBhcnRpdGlvbi1maWxlLWxpc3QsJChyYW1kaXNrX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQsJChUQVJHRVRfUkFNRElTS19PVVQpLCQoSU5URVJOQUxfUkFNRElTS19GSUxFUykpKQorCisjIFRoZSB2YWx1ZSBvZiBSQU1ESVNLX05PREVfTElTVCBpcyBkZWZpbmVkIGluIHN5c3RlbS9jb3JlL3Jvb3RkaXIvQW5kcm9pZC5icC4KICMgVGhpcyBmaWxlIGNvbnRhaW5zIC9kZXYgbm9kZXMgZGVzY3JpcHRpb24gYWRkZWQgdG8gdGhlIGdlbmVyaWMgcmFtZGlzawotUkFNRElTS19OT0RFX0xJU1QgOj0gJChQUk9EVUNUX09VVCkvcmFtZGlza19ub2RlX2xpc3QKIAogIyBXZSBqdXN0IGJ1aWxkIHRoaXMgZGlyZWN0bHkgdG8gdGhlIGluc3RhbGwgbG9jYXRpb24uCiBJTlNUQUxMRURfUkFNRElTS19UQVJHRVQgOj0gJChCVUlMVF9SQU1ESVNLX1RBUkdFVCkKQEAgLTEwMjcsMTcgKzEzNjEsMjkgQEAKICAgJChpZiAkKDEpLC0tcGFydGl0aW9uX3NpemUgJCgxKSwtLWR5bmFtaWNfcGFydGl0aW9uX3NpemUpCiBlbmRlZgogCisjICQxOiBvdXRwdXQgYm9vdCBpbWFnZSB0YXJnZXQKKyMgJDI6IGlucHV0IHBhdGggdG8ga2VybmVsIGJpbmFyeQorZGVmaW5lIGJ1aWxkX2Jvb3RfZnJvbV9rZXJuZWxfYXZiX2VuYWJsZWQKKyAgJChldmFsIGtlcm5lbCA6PSAkKDIpKQorICAkKE1LQk9PVElNRykgLS1rZXJuZWwgJChrZXJuZWwpICQoSU5URVJOQUxfQk9PVElNQUdFX0FSR1MpICQoSU5URVJOQUxfTUtCT09USU1HX1ZFUlNJT05fQVJHUykgJChCT0FSRF9NS0JPT1RJTUdfQVJHUykgLS1vdXRwdXQgJCgxKQorICAkKGNhbGwgYXNzZXJ0LW1heC1pbWFnZS1zaXplLCQoMSksJChjYWxsIGdldC1oYXNoLWltYWdlLW1heC1zaXplLCQoY2FsbCBnZXQtYm9vdGltYWdlLXBhcnRpdGlvbi1zaXplLCQoMSksYm9vdCkpKQorICAkKEFWQlRPT0wpIGFkZF9oYXNoX2Zvb3RlciBcCisgICAgICAgICAgLS1pbWFnZSAkKDEpIFwKKyAgICAgICAgICAkKGNhbGwgZ2V0LXBhcnRpdGlvbi1zaXplLWFyZ3VtZW50LCQoY2FsbCBnZXQtYm9vdGltYWdlLXBhcnRpdGlvbi1zaXplLCQoMSksYm9vdCkpIFwKKyAgICAgICAgICAtLXNhbHQgYHNoYTI1NnN1bSAiJChrZXJuZWwpIiB8IGN1dCAtZCAiICIgLWYgMWAgXAorICAgICAgICAgIC0tcGFydGl0aW9uX25hbWUgYm9vdCAkKElOVEVSTkFMX0FWQl9CT09UX1NJR05JTkdfQVJHUykgXAorICAgICAgICAgICQoQk9BUkRfQVZCX0JPT1RfQUREX0hBU0hfRk9PVEVSX0FSR1MpCitlbmRlZgorCisKIGlmbmRlZiBCT0FSRF9QUkVCVUlMVF9CT09USU1BR0UKIAogaWZuZXEgKCQoc3RyaXAgJChUQVJHRVRfTk9fS0VSTkVMKSksdHJ1ZSkKIElOVEVSTkFMX0JPT1RJTUFHRV9BUkdTIDo9IFwKIAkkKGFkZHByZWZpeCAtLXNlY29uZCAsJChJTlNUQUxMRURfMk5EQk9PVExPQURFUl9UQVJHRVQpKQogCi0jIFRPRE8oYi8yMjk3MDEwMzMpOiBjbGVhbiB1cCBCT0FSRF9CVUlMRF9HS0lfQk9PVF9JTUFHRV9XSVRIT1VUX1JBTURJU0suCi1pZm5lcSAoJChCT0FSRF9CVUlMRF9HS0lfQk9PVF9JTUFHRV9XSVRIT1VUX1JBTURJU0spLHRydWUpCi0gIGlmbmVxICgkKEJVSUxESU5HX0lOSVRfQk9PVF9JTUFHRSksdHJ1ZSkKLSAgICBJTlRFUk5BTF9CT09USU1BR0VfQVJHUyArPSAtLXJhbWRpc2sgJChJTlNUQUxMRURfUkFNRElTS19UQVJHRVQpCi0gIGVuZGlmCitpZm5lcSAoJChCVUlMRElOR19JTklUX0JPT1RfSU1BR0UpLHRydWUpCisgIElOVEVSTkFMX0JPT1RJTUFHRV9BUkdTICs9IC0tcmFtZGlzayAkKElOU1RBTExFRF9SQU1ESVNLX1RBUkdFVCkKIGVuZGlmCiAKIGlmbmRlZiBCVUlMRElOR19WRU5ET1JfQk9PVF9JTUFHRQpAQCAtMTA3MCw1MSArMTQxNiw5IEBACiAgIGVuZGlmCiBlbmRpZiAjIEJVSUxESU5HX1ZFTkRPUl9CT09UX0lNQUdFID09ICIiICYmIEJPQVJEX1VTRVNfR0VORVJJQ19LRVJORUxfSU1BR0UgIT0gdHJ1ZQogCi1pZmRlZiBCT0FSRF9HS0lfU0lHTklOR19LRVlfUEFUSAotICAjIEdLSSBib290IGltYWdlcyB3aWxsIG5vdCBzZXQgc3lzdGVtIHZlcnNpb24gJiBTUEwgdmFsdWUgaW4gdGhlIGhlYWRlci4KLSAgIyBUaGV5IGNhbiBiZSBzZXQgYnkgdGhlIGRldmljZSBtYW51ZmFjdHVyZXIgaW4gdGhlIEFWQiBwcm9wZXJ0aWVzIGluc3RlYWQuCi0gIElOVEVSTkFMX01LQk9PVElNR19WRVJTSU9OX0FSR1MgOj0KLWVsc2UKLSAgSU5URVJOQUxfTUtCT09USU1HX1ZFUlNJT05fQVJHUyA6PSBcCi0gICAgLS1vc192ZXJzaW9uICQoUExBVEZPUk1fVkVSU0lPTl9MQVNUX1NUQUJMRSkgXAotICAgIC0tb3NfcGF0Y2hfbGV2ZWwgJChQTEFURk9STV9TRUNVUklUWV9QQVRDSCkKLWVuZGlmICMgQk9BUkRfR0tJX1NJR05JTkdfS0VZX1BBVEgKLQotIyAkKDEpOiBpbWFnZSB0YXJnZXQgdG8gY2VydGlmeQotIyAkKDIpOiBvdXQgY2VydGlmaWNhdGUgdGFyZ2V0Ci0jICQoMyk6IGltYWdlIG5hbWUKLSMgJCg0KTogYWRkaXRpb25hbCBBVkIgYXJndW1lbnRzCi1kZWZpbmUgZ2VuZXJhdGVfZ2VuZXJpY19ib290X2ltYWdlX2NlcnRpZmljYXRlCi0gIHJtIC1yZiAiJCgyKSIKLSAgbWtkaXIgLXAgIiQoZGlyICQoMikpIgotICAkKEdFTkVSQVRFX0dLSV9DRVJUSUZJQ0FURSkgJChJTlRFUk5BTF9HS0lfQ0VSVElGSUNBVEVfQVJHUykgXAotICAgIC0tYWRkaXRpb25hbF9hdmJfYXJncyAiJCg0KSIgXAotICAgIC0tbmFtZSAiJCgzKSIgLS1vdXRwdXQgIiQoMikiICIkKDEpIgotZW5kZWYKLQotSU5URVJOQUxfR0tJX0NFUlRJRklDQVRFX0FSR1MgOj0KLUlOVEVSTkFMX0dLSV9DRVJUSUZJQ0FURV9ERVBTIDo9Ci1pZmRlZiBCT0FSRF9HS0lfU0lHTklOR19LRVlfUEFUSAotICBpZm5kZWYgQk9BUkRfR0tJX1NJR05JTkdfQUxHT1JJVEhNCi0gICAgJChlcnJvciBCT0FSRF9HS0lfU0lHTklOR19BTEdPUklUSE0gc2hvdWxkIGJlIGRlZmluZWQgd2l0aCBCT0FSRF9HS0lfU0lHTklOR19LRVlfUEFUSCkKLSAgZW5kaWYKLQotICBJTlRFUk5BTF9HS0lfQ0VSVElGSUNBVEVfQVJHUyA6PSBcCi0gICAgLS1rZXkgIiQoQk9BUkRfR0tJX1NJR05JTkdfS0VZX1BBVEgpIiBcCi0gICAgLS1hbGdvcml0aG0gIiQoQk9BUkRfR0tJX1NJR05JTkdfQUxHT1JJVEhNKSIgXAotICAgIC0tYXZidG9vbCAiJChBVkJUT09MKSIKLQotICAjIFF1b3RlIGFuZCBwYXNzIEJPQVJEX0dLSV9TSUdOSU5HX1NJR05BVFVSRV9BUkdTIGFzIGEgc2luZ2xlIHN0cmluZyBhcmd1bWVudC4KLSAgaWZkZWYgQk9BUkRfR0tJX1NJR05JTkdfU0lHTkFUVVJFX0FSR1MKLSAgICBJTlRFUk5BTF9HS0lfQ0VSVElGSUNBVEVfQVJHUyArPSAtLWFkZGl0aW9uYWxfYXZiX2FyZ3MgIiQoQk9BUkRfR0tJX1NJR05JTkdfU0lHTkFUVVJFX0FSR1MpIgotICBlbmRpZgotCi0gIElOVEVSTkFMX0dLSV9DRVJUSUZJQ0FURV9ERVBTIDo9IFwKLSAgICAkKEdFTkVSQVRFX0dLSV9DRVJUSUZJQ0FURSkgXAotICAgICQoQk9BUkRfR0tJX1NJR05JTkdfS0VZX1BBVEgpIFwKLSAgICAkKEFWQlRPT0wpCi0KLWVuZGlmCitJTlRFUk5BTF9NS0JPT1RJTUdfVkVSU0lPTl9BUkdTIDo9IFwKKyAgLS1vc192ZXJzaW9uICQoUExBVEZPUk1fVkVSU0lPTl9MQVNUX1NUQUJMRSkgXAorICAtLW9zX3BhdGNoX2xldmVsICQoUExBVEZPUk1fU0VDVVJJVFlfUEFUQ0gpCiAKICMgRGVmaW5lIHRoZXNlIG9ubHkgaWYgd2UgYXJlIGJ1aWxkaW5nIGJvb3QKIGlmZGVmIEJVSUxESU5HX0JPT1RfSU1BR0UKQEAgLTExMzEsNjIgKzE0MzUsMjQgQEAKICMgJDE6IGJvb3QgaW1hZ2UgdGFyZ2V0CiBkZWZpbmUgYnVpbGRfYm9vdF9ib2FyZF9hdmJfZW5hYmxlZAogICAkKGV2YWwga2VybmVsIDo9ICQoY2FsbCBib290aW1hZ2UtdG8ta2VybmVsLCQoMSkpKQotICAkKE1LQk9PVElNRykgLS1rZXJuZWwgJChrZXJuZWwpICQoSU5URVJOQUxfQk9PVElNQUdFX0FSR1MpICQoSU5URVJOQUxfTUtCT09USU1HX1ZFUlNJT05fQVJHUykgJChCT0FSRF9NS0JPT1RJTUdfQVJHUykgLS1vdXRwdXQgJCgxKQotICAkKGlmICQoQk9BUkRfR0tJX1NJR05JTkdfS0VZX1BBVEgpLCBcCi0gICAgJChldmFsIGJvb3Rfc2lnbmF0dXJlIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLGdlbmVyaWNfYm9vdCkvJChub3RkaXIgJCgxKSkuYm9vdF9zaWduYXR1cmUpIFwKLSAgICAkKGV2YWwga2VybmVsX3NpZ25hdHVyZSA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxnZW5lcmljX2tlcm5lbCkvJChub3RkaXIgJChrZXJuZWwpKS5ib290X3NpZ25hdHVyZSkgXAotICAgICQoY2FsbCBnZW5lcmF0ZV9nZW5lcmljX2Jvb3RfaW1hZ2VfY2VydGlmaWNhdGUsJCgxKSwkKGJvb3Rfc2lnbmF0dXJlKSxib290LCQoQk9BUkRfQVZCX0JPT1RfQUREX0hBU0hfRk9PVEVSX0FSR1MpKSAkKG5ld2xpbmUpIFwKLSAgICAkKGNhbGwgZ2VuZXJhdGVfZ2VuZXJpY19ib290X2ltYWdlX2NlcnRpZmljYXRlLCQoa2VybmVsKSwkKGtlcm5lbF9zaWduYXR1cmUpLGdlbmVyaWNfa2VybmVsLCQoQk9BUkRfQVZCX0JPT1RfQUREX0hBU0hfRk9PVEVSX0FSR1MpKSAkKG5ld2xpbmUpIFwKLSAgICBjYXQgJChrZXJuZWxfc2lnbmF0dXJlKSA+PiAkKGJvb3Rfc2lnbmF0dXJlKSAkKG5ld2xpbmUpIFwKLSAgICAkKGNhbGwgYXNzZXJ0LW1heC1pbWFnZS1zaXplLCQoYm9vdF9zaWduYXR1cmUpLDE2IDw8IDEwKSAkKG5ld2xpbmUpIFwKLSAgICB0cnVuY2F0ZSAtcyAkJCgoIDE2IDw8IDEwICkpICQoYm9vdF9zaWduYXR1cmUpICQobmV3bGluZSkgXAotICAgIGNhdCAiJChib290X3NpZ25hdHVyZSkiID4+ICQoMSkpCi0gICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJCgxKSwkKGNhbGwgZ2V0LWhhc2gtaW1hZ2UtbWF4LXNpemUsJChjYWxsIGdldC1ib290aW1hZ2UtcGFydGl0aW9uLXNpemUsJCgxKSxib290KSkpCi0gICQoQVZCVE9PTCkgYWRkX2hhc2hfZm9vdGVyIFwKLSAgICAgICAgICAtLWltYWdlICQoMSkgXAotICAgICAgICAgICQoY2FsbCBnZXQtcGFydGl0aW9uLXNpemUtYXJndW1lbnQsJChjYWxsIGdldC1ib290aW1hZ2UtcGFydGl0aW9uLXNpemUsJCgxKSxib290KSkgXAotICAgICAgICAgIC0tcGFydGl0aW9uX25hbWUgYm9vdCAkKElOVEVSTkFMX0FWQl9CT09UX1NJR05JTkdfQVJHUykgXAotICAgICAgICAgICQoQk9BUkRfQVZCX0JPT1RfQUREX0hBU0hfRk9PVEVSX0FSR1MpCisgICQoY2FsbCBidWlsZF9ib290X2Zyb21fa2VybmVsX2F2Yl9lbmFibGVkLCQoMSksJChrZXJuZWwpKQogZW5kZWYKIAotJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCk6ICQoTUtCT09USU1HKSAkKEFWQlRPT0wpICQoSU5URVJOQUxfQk9PVElNQUdFX0ZJTEVTKSAkKEJPQVJEX0FWQl9CT09UX0tFWV9QQVRIKSAkKElOVEVSTkFMX0dLSV9DRVJUSUZJQ0FURV9ERVBTKQorJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCk6ICQoTUtCT09USU1HKSAkKEFWQlRPT0wpICQoSU5URVJOQUxfQk9PVElNQUdFX0ZJTEVTKSAkKEJPQVJEX0FWQl9CT09UX0tFWV9QQVRIKQogCSQoY2FsbCBwcmV0dHksIlRhcmdldCBib290IGltYWdlOiAkQCIpCiAJJChjYWxsIGJ1aWxkX2Jvb3RfYm9hcmRfYXZiX2VuYWJsZWQsJEApCiAKICQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLW1ldGFkYXRhLCQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUdQTC0yLjAtb25seSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLHJlc3RyaWN0ZWQgbm90aWNlLCQoQlVJTERfU1lTVEVNKS9MSU5VWF9LRVJORUxfQ09QWUlORyBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCJCb290IEltYWdlIixib290KQotJChjYWxsIGRlY2xhcmUtY29udGFpbmVyLWxpY2Vuc2UtZGVwcywkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKSwkKElOVEVSTkFMX0JPT1RJTUFHRV9GSUxFUykgJChJTlRFUk5BTF9HS0lfQ0VSVElGSUNBVEVfREVQUyksJChQUk9EVUNUX09VVCkvOi8pCi0KLVVOTU9VTlRFRF9OT1RJQ0VfVkVORE9SX0RFUFMgKz0gJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCkKLQotLlBIT05ZOiBib290aW1hZ2Utbm9kZXBzCi1ib290aW1hZ2Utbm9kZXBzOiAkKE1LQk9PVElNRykgJChBVkJUT09MKSAkKEJPQVJEX0FWQl9CT09UX0tFWV9QQVRIKSAkKElOVEVSTkFMX0dLSV9DRVJUSUZJQ0FURV9ERVBTKQotCUBlY2hvICJtYWtlICRAOiBpZ25vcmluZyBkZXBlbmRlbmNpZXMiCi0JJChmb3JlYWNoIGIsJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCksJChjYWxsIGJ1aWxkX2Jvb3RfYm9hcmRfYXZiX2VuYWJsZWQsJChiKSkpCi0KLWVsc2UgaWZlcSAodHJ1ZSwkKFBST0RVQ1RfU1VQUE9SVFNfVkJPT1QpKSAjIEJPQVJEX0FWQl9FTkFCTEUgIT0gdHJ1ZQotCi0jICQxOiBib290IGltYWdlIHRhcmdldAotZGVmaW5lIGJ1aWxkX2Jvb3Rfc3VwcG9ydHNfdmJvb3QKLSAgJChNS0JPT1RJTUcpIC0ta2VybmVsICQoY2FsbCBib290aW1hZ2UtdG8ta2VybmVsLCQoMSkpICQoSU5URVJOQUxfQk9PVElNQUdFX0FSR1MpICQoSU5URVJOQUxfTUtCT09USU1HX1ZFUlNJT05fQVJHUykgJChCT0FSRF9NS0JPT1RJTUdfQVJHUykgLS1vdXRwdXQgJCgxKS51bnNpZ25lZAotICAkKFZCT09UX1NJR05FUikgJChGVVRJTElUWSkgJCgxKS51bnNpZ25lZCAkKFBST0RVQ1RfVkJPT1RfU0lHTklOR19LRVkpLnZicHViayAkKFBST0RVQ1RfVkJPT1RfU0lHTklOR19LRVkpLnZicHJpdmsgJChQUk9EVUNUX1ZCT09UX1NJR05JTkdfU1VCS0VZKS52YnByaXZrICQoMSkua2V5YmxvY2sgJCgxKQotICAkKGNhbGwgYXNzZXJ0LW1heC1pbWFnZS1zaXplLCQoMSksJChjYWxsIGdldC1ib290aW1hZ2UtcGFydGl0aW9uLXNpemUsJCgxKSxib290KSkKLWVuZGVmCi0KLSQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpOiAkKE1LQk9PVElNRykgJChJTlRFUk5BTF9CT09USU1BR0VfRklMRVMpICQoVkJPT1RfU0lHTkVSKSAkKEZVVElMSVRZKQotCSQoY2FsbCBwcmV0dHksIlRhcmdldCBib290IGltYWdlOiAkQCIpCi0JJChjYWxsIGJ1aWxkX2Jvb3Rfc3VwcG9ydHNfdmJvb3QsJEApCi0KLSQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLW1ldGFkYXRhLCQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUdQTC0yLjAtb25seSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLHJlc3RyaWN0ZWQgbm90aWNlLCQoQlVJTERfU1lTVEVNKS9MSU5VWF9LRVJORUxfQ09QWUlORyBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCJCb290IEltYWdlIixib290KQogJChjYWxsIGRlY2xhcmUtY29udGFpbmVyLWxpY2Vuc2UtZGVwcywkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKSwkKElOVEVSTkFMX0JPT1RJTUFHRV9GSUxFUyksJChQUk9EVUNUX09VVCkvOi8pCiAKIFVOTU9VTlRFRF9OT1RJQ0VfVkVORE9SX0RFUFMgKz0gJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCkKIAogLlBIT05ZOiBib290aW1hZ2Utbm9kZXBzCi1ib290aW1hZ2Utbm9kZXBzOiAkKE1LQk9PVElNRykgJChWQk9PVF9TSUdORVIpICQoRlVUSUxJVFkpCitib290aW1hZ2Utbm9kZXBzOiAkKE1LQk9PVElNRykgJChBVkJUT09MKSAkKEJPQVJEX0FWQl9CT09UX0tFWV9QQVRIKQogCUBlY2hvICJtYWtlICRAOiBpZ25vcmluZyBkZXBlbmRlbmNpZXMiCi0JJChmb3JlYWNoIGIsJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCksJChjYWxsIGJ1aWxkX2Jvb3Rfc3VwcG9ydHNfdmJvb3QsJChiKSkpCisJJChmb3JlYWNoIGIsJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCksJChjYWxsIGJ1aWxkX2Jvb3RfYm9hcmRfYXZiX2VuYWJsZWQsJChiKSkpCiAKLWVsc2UgIyBQUk9EVUNUX1NVUFBPUlRTX1ZCT09UICE9IHRydWUKK2Vsc2UgIyBCT0FSRF9BVkJfRU5BQkxFICE9IHRydWUKIAogIyAkMTogYm9vdCBpbWFnZSB0YXJnZXQKIGRlZmluZSBidWlsZF9ib290X25vdmJvb3QKQEAgLTEyMjAsMTUgKzE0ODYsMTkgQEAKIElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUIDo9ICQoUFJPRFVDVF9PVVQpL2Jvb3QuaW1nCiAKIGlmZXEgKCQoQk9BUkRfQVZCX0VOQUJMRSksdHJ1ZSkKLSQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpOiAkKElOVEVSTkFMX1BSRUJVSUxUX0JPT1RJTUFHRSkgJChBVkJUT09MKSAkKEJPQVJEX0FWQl9CT09UX0tFWV9QQVRIKQorJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCk6IFBSSVZBVEVfV09SS0lOR19ESVIgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcscHJlYnVpbHRfYm9vdGltZykKKyQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpOiAkKElOVEVSTkFMX1BSRUJVSUxUX0JPT1RJTUFHRSkgJChBVkJUT09MKSAkKEJPQVJEX0FWQl9CT09UX0tFWV9QQVRIKSAkKFVOUEFDS19CT09USU1HKQogCWNwICQoSU5URVJOQUxfUFJFQlVJTFRfQk9PVElNQUdFKSAkQAorCSQoVU5QQUNLX0JPT1RJTUcpIC0tYm9vdF9pbWcgJChJTlRFUk5BTF9QUkVCVUlMVF9CT09USU1BR0UpIC0tb3V0ICQoUFJJVkFURV9XT1JLSU5HX0RJUikKIAljaG1vZCArdyAkQAogCSQoQVZCVE9PTCkgYWRkX2hhc2hfZm9vdGVyIFwKIAkgICAgLS1pbWFnZSAkQCBcCisJICAgIC0tc2FsdCBgc2hhMjU2c3VtICQoUFJJVkFURV9XT1JLSU5HX0RJUikva2VybmVsIHwgY3V0IC1kICIgIiAtZiAxYCBcCiAJICAgICQoY2FsbCBnZXQtcGFydGl0aW9uLXNpemUtYXJndW1lbnQsJChCT0FSRF9CT09USU1BR0VfUEFSVElUSU9OX1NJWkUpKSBcCiAJICAgIC0tcGFydGl0aW9uX25hbWUgYm9vdCAkKElOVEVSTkFMX0FWQl9CT09UX1NJR05JTkdfQVJHUykgXAogCSAgICAkKEJPQVJEX0FWQl9CT09UX0FERF9IQVNIX0ZPT1RFUl9BUkdTKQogCisKICQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLW1ldGFkYXRhLCQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUdQTC0yLjAtb25seSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLHJlc3RyaWN0ZWQgbm90aWNlLCQoQlVJTERfU1lTVEVNKS9MSU5VWF9LRVJORUxfQ09QWUlORyBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCJCb290IEltYWdlIixib29sKQogJChjYWxsIGRlY2xhcmUtY29udGFpbmVyLWxpY2Vuc2UtZGVwcywkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKSwkKElOVEVSTkFMX1BSRUJVSUxUX0JPT1RJTUFHRSksJChQUk9EVUNUX09VVCkvOi8pCiAKQEAgLTEyNDIsNiArMTUxMiw0NyBAQAogCiBlbmRpZiAjIG15X2luc3RhbGxlZF9wcmVidWlsdF9na2lfYXBleCBub3QgZGVmaW5lZAogCitpZm5lcSAoJChCT0FSRF9LRVJORUxfUEFUSF8xNkspLCkKK0JVSUxUX0JPT1RfT1RBX1BBQ0tBR0VfNEsgOj0gJChQUk9EVUNUX09VVCkvYm9vdF9vdGFfNGsuemlwCiskKEJVSUxUX0JPT1RfT1RBX1BBQ0tBR0VfNEspOiAkKE9UQV9GUk9NX1JBV19JTUcpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQlVJTFRfQk9PVElNQUdFXzE2S19UQVJHRVQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoREVGQVVMVF9TWVNURU1fREVWX0NFUlRJRklDQVRFKS5wazggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChJTlNUQUxMRURfRFRCT0lNQUdFXzE2S0JfVEFSR0VUKQorCSQoT1RBX0ZST01fUkFXX0lNRykgLS1wYWNrYWdlX2tleSAkKERFRkFVTFRfU1lTVEVNX0RFVl9DRVJUSUZJQ0FURSkgXAorICAgICAgICAgICAgICAgICAgICAgIC0tbWF4X3RpbWVzdGFtcCBgY2F0ICQoQlVJTERfREFURVRJTUVfRklMRSlgIFwKKyAgICAgICAgICAgICAgICAgICAgICAtLXBhdGggJChIT1NUX09VVCkgXAorICAgICAgICAgICAgICAgICAgICAgIC0tcGFydGl0aW9uX25hbWUgJChpZiAkKGFuZCAkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTEVEX0RUQk9JTUFHRV8xNktCX1RBUkdFVCkpLFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb3QkKGNvbW1hKWR0Ym8sXAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vdCkgXAorICAgICAgICAgICAgICAgICAgICAgIC0tb3V0cHV0ICRAIFwKKyAgICAgICAgICAgICAgICAgICAgICAkKGlmICQoQk9BUkRfMTZLX09UQV9VU0VfSU5DUkVNRU5UQUwpLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICQoQlVJTFRfQk9PVElNQUdFXzE2S19UQVJHRVQpOiQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpXAorICAgICAgICAgICAgICAgICAgICAgIClcCisgICAgICAgICAgICAgICAgICAgICAgJChpZiAkKGFuZCAkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKSwkKElOU1RBTExFRF9EVEJPSU1BR0VfMTZLQl9UQVJHRVQpKSxcCisgICAgICAgICAgICAgICAgICAgICAgICAkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKSkKKworYm9vdG90YXBhY2thZ2VfNGs6ICQoQlVJTFRfQk9PVF9PVEFfUEFDS0FHRV80SykKKy5QSE9OWTogYm9vdG90YXBhY2thZ2VfNGsKKworaWZlcSAoJChCT0FSRF8xNktfT1RBX01PVkVfVkVORE9SKSx0cnVlKQorJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoQlVJTFRfQk9PVF9PVEFfUEFDS0FHRV80SyksJChUQVJHRVRfT1VUX1ZFTkRPUikvYm9vdF9vdGFzL2Jvb3Rfb3RhXzRrLnppcCkpCiskKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChCVUlMVF9CT09UX09UQV9QQUNLQUdFXzE2SyksJChUQVJHRVRfT1VUX1ZFTkRPUikvYm9vdF9vdGFzL2Jvb3Rfb3RhXzE2ay56aXApKQorQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChUQVJHRVRfT1VUX1ZFTkRPUikvYm9vdF9vdGFzL2Jvb3Rfb3RhXzRrLnppcAorQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChUQVJHRVRfT1VUX1ZFTkRPUikvYm9vdF9vdGFzL2Jvb3Rfb3RhXzE2ay56aXAKK2Vsc2UKKyQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKEJVSUxUX0JPT1RfT1RBX1BBQ0tBR0VfNEspLCQoVEFSR0VUX09VVCkvYm9vdF9vdGFzL2Jvb3Rfb3RhXzRrLnppcCkpCiskKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChCVUlMVF9CT09UX09UQV9QQUNLQUdFXzE2SyksJChUQVJHRVRfT1VUKS9ib290X290YXMvYm9vdF9vdGFfMTZrLnppcCkpCitBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKFRBUkdFVF9PVVQpL2Jvb3Rfb3Rhcy9ib290X290YV80ay56aXAKK0FMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTICs9ICQoVEFSR0VUX09VVCkvYm9vdF9vdGFzL2Jvb3Rfb3RhXzE2ay56aXAKK2VuZGlmICMgQk9BUkRfMTZLX09UQV9NT1ZFX1ZFTkRPUiA9PSB0cnVlCisKKworZW5kaWYKKwogbXlfYXBleF9leHRyYWN0ZWRfYm9vdF9pbWFnZSA6PQogbXlfaW5zdGFsbGVkX3ByZWJ1aWx0X2draV9hcGV4IDo9CiAKQEAgLTEyNjYsNiArMTU3Nyw3IEBACiAJJChBVkJUT09MKSBhZGRfaGFzaF9mb290ZXIgXAogICAgICAgICAgICAtLWltYWdlICRAIFwKIAkgICAkKGNhbGwgZ2V0LXBhcnRpdGlvbi1zaXplLWFyZ3VtZW50LCQoQk9BUkRfSU5JVF9CT09UX0lNQUdFX1BBUlRJVElPTl9TSVpFKSkgXAorCSAgIC0tc2FsdCAkJChzaGEyNTZzdW0gJChCVUlMRF9OVU1CRVJfRklMRSkgJChCVUlMRF9EQVRFVElNRV9GSUxFKSB8IGN1dCAtZCAiICIgLWYgMSB8IHRyIC1kICdcbicpIFwKIAkgICAtLXBhcnRpdGlvbl9uYW1lIGluaXRfYm9vdCAkKElOVEVSTkFMX0FWQl9JTklUX0JPT1RfU0lHTklOR19BUkdTKSBcCiAJICAgJChCT0FSRF9BVkJfSU5JVF9CT09UX0FERF9IQVNIX0ZPT1RFUl9BUkdTKQogCkBAIC0xMzI0LDYgKzE2MzYsOCBAQAogICAgICQoQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMpKQogCiBJTlRFUk5BTF9WRU5ET1JfUkFNRElTS19UQVJHRVQgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsdmVuZG9yX2Jvb3QpL3ZlbmRvcl9yYW1kaXNrLmNwaW8kKFJBTURJU0tfRVhUKQordmVuZG9yX3JhbWRpc2tfaW50ZXJtZWRpYXRlcyA6PSQ9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHZlbmRvcl9yYW1kaXNrKQorJChldmFsICQoY2FsbCB3cml0ZS1wYXJ0aXRpb24tZmlsZS1saXN0LCQodmVuZG9yX3JhbWRpc2tfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dCwkKFRBUkdFVF9WRU5ET1JfUkFNRElTS19PVVQpLCQoSU5URVJOQUxfVkVORE9SX1JBTURJU0tfRklMRVMpKSkKIAogIyBFeGNsdWRlIHJlY292ZXJ5IGZpbGVzIGluIHRoZSBkZWZhdWx0IHZlbmRvciByYW1kaXNrIGlmIGluY2x1ZGluZyBhIHN0YW5kYWxvbmUKICMgcmVjb3ZlcnkgcmFtZGlzayBpbiB2ZW5kb3JfYm9vdC4KQEAgLTEzNzgsMTIgKzE2OTIsMTMgQEAKICAgSU5URVJOQUxfVkVORE9SX0JPT1RJTUFHRV9BUkdTICs9IC0tdmVuZG9yX2NtZGxpbmUgIiQoSU5URVJOQUxfS0VSTkVMX0NNRExJTkUpIgogZW5kaWYKIAotaWZkZWYgSU5URVJOQUxfQk9PVENPTkZJRworaWZuZXEgKCwgJChJTlRFUk5BTF9CT09UQ09ORklHKSQoSU5URVJOQUxfQk9PVENPTkZJR19GSUxFKSkKICAgSU5URVJOQUxfVkVORE9SX0JPT1RDT05GSUdfVEFSR0VUIDo9ICQoUFJPRFVDVF9PVVQpL3ZlbmRvci1ib290Y29uZmlnLmltZwogICAkKElOVEVSTkFMX1ZFTkRPUl9CT09UQ09ORklHX1RBUkdFVCk6CiAJcm0gLWYgJEAKIAkkKGZvcmVhY2ggcGFyYW0sJChJTlRFUk5BTF9CT09UQ09ORklHKSwgXAogCSBwcmludGYgIiVzXG4iICQocGFyYW0pID4+ICRAOykKKwljYXQgJChJTlRFUk5BTF9CT09UQ09ORklHX0ZJTEUpID4+ICRACiAgIElOVEVSTkFMX1ZFTkRPUl9CT09USU1BR0VfQVJHUyArPSAtLXZlbmRvcl9ib290Y29uZmlnICQoSU5URVJOQUxfVkVORE9SX0JPT1RDT05GSUdfVEFSR0VUKQogZW5kaWYKIApAQCAtMTQzOCw2ICsxNzUzLDcgQEAKIAkkKEFWQlRPT0wpIGFkZF9oYXNoX2Zvb3RlciBcCiAgICAgICAgICAgIC0taW1hZ2UgJEAgXAogCSAgICQoY2FsbCBnZXQtcGFydGl0aW9uLXNpemUtYXJndW1lbnQsJChCT0FSRF9WRU5ET1JfQk9PVElNQUdFX1BBUlRJVElPTl9TSVpFKSkgXAorCSAgIC0tc2FsdCAkJChzaGEyNTZzdW0gJChCVUlMRF9OVU1CRVJfRklMRSkgJChCVUlMRF9EQVRFVElNRV9GSUxFKSB8IGN1dCAtZCAiICIgLWYgMSB8IHRyIC1kICdcbicpIFwKIAkgICAtLXBhcnRpdGlvbl9uYW1lIHZlbmRvcl9ib290ICQoSU5URVJOQUxfQVZCX1ZFTkRPUl9CT09UX1NJR05JTkdfQVJHUykgXAogCSAgICQoQk9BUkRfQVZCX1ZFTkRPUl9CT09UX0FERF9IQVNIX0ZPT1RFUl9BUkdTKQogZWxzZQpAQCAtMTQ1MCw2ICsxNzY2LDMwIEBACiAkKGNhbGwgZGVjbGFyZS0xcC1jb250YWluZXIsJChJTlNUQUxMRURfVkVORE9SX0JPT1RJTUFHRV9UQVJHRVQpLCkKICQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJChJTlNUQUxMRURfVkVORE9SX0JPT1RJTUFHRV9UQVJHRVQpLCQoSU5URVJOQUxfVkVORE9SX1JBTURJU0tfVEFSR0VUKSAkKElOU1RBTExFRF9EVEJfSU1BR0VfVEFSR0VUKSAkKElOVEVSTkFMX1ZFTkRPUl9SQU1ESVNLX0ZSQUdNRU5UX1RBUkdFVFMpICQoSU5URVJOQUxfVkVORE9SX0JPT1RDT05ESUdfVEFSR0VUKSwkKFBST0RVQ1RfT1VUKS86LykKIFZFTkRPUl9OT1RJQ0VfREVQUyArPSAkKElOU1RBTExFRF9WRU5ET1JfQk9PVElNQUdFX1RBUkdFVCkKKworZWxzZSAjIEJVSUxESU5HX1ZFTkRPUl9CT09UX0lNQUdFIG5vdCBkZWZpbmVkLCB1c2UgcHJlYnVpbHQgaW1hZ2UKKworaWZkZWYgQk9BUkRfUFJFQlVJTFRfVkVORE9SX0JPT1RJTUFHRQorSU5URVJOQUxfUFJFQlVJTFRfVkVORE9SX0JPT1RJTUFHRSA6PSAkKEJPQVJEX1BSRUJVSUxUX1ZFTkRPUl9CT09USU1BR0UpCitJTlNUQUxMRURfVkVORE9SX0JPT1RJTUFHRV9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvdmVuZG9yX2Jvb3QuaW1nCisKK2lmZXEgKCQoQk9BUkRfQVZCX0VOQUJMRSksdHJ1ZSkKKyQoSU5TVEFMTEVEX1ZFTkRPUl9CT09USU1BR0VfVEFSR0VUKTogJChJTlRFUk5BTF9QUkVCVUlMVF9WRU5ET1JfQk9PVElNQUdFKSAkKEFWQlRPT0wpICQoQk9BUkRfQVZCX1ZFTkRPUl9CT09UX0tFWV9QQVRIKQorCWNwICQoSU5URVJOQUxfUFJFQlVJTFRfVkVORE9SX0JPT1RJTUFHRSkgJEAKKwljaG1vZCArdyAkQAorCSQoQVZCVE9PTCkgYWRkX2hhc2hfZm9vdGVyIFwKKwkgICAgLS1pbWFnZSAkQCBcCisJICAgICQoY2FsbCBnZXQtcGFydGl0aW9uLXNpemUtYXJndW1lbnQsJChCT0FSRF9WRU5ET1JfQk9PVElNQUdFX1BBUlRJVElPTl9TSVpFKSkgXAorCSAgICAtLXBhcnRpdGlvbl9uYW1lIHZlbmRvcl9ib290ICQoSU5URVJOQUxfQVZCX1ZFTkRPUl9CT09UX1NJR05JTkdfQVJHUykgXAorCSAgICAkKEJPQVJEX0FWQl9WRU5ET1JfQk9PVF9BRERfSEFTSF9GT09URVJfQVJHUykKK2Vsc2UKKyQoSU5TVEFMTEVEX1ZFTkRPUl9CT09USU1BR0VfVEFSR0VUKTogJChJTlRFUk5BTF9QUkVCVUlMVF9WRU5ET1JfQk9PVElNQUdFKQorCWNwICQoSU5URVJOQUxfUFJFQlVJTFRfVkVORE9SX0JPT1RJTUFHRSkgJEAKKworZW5kaWYgIyBCT0FSRF9BVkJfRU5BQkxFCiskKGNhbGwgZGVjbGFyZS0xcC1jb250YWluZXIsJChJTlNUQUxMRURfVkVORE9SX0JPT1RJTUFHRV9UQVJHRVQpLCkKKyQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJChJTlNUQUxMRURfVkVORE9SX0JPT1RJTUFHRV9UQVJHRVQpLCQoSU5URVJOQUxfUFJFQlVJTFRfVkVORE9SX0JPT1RJTUFHRSksJChQUk9EVUNUX09VVCkvOi8pCitlbmRpZiAjIEJPQVJEX1BSRUJVSUxUX1ZFTkRPUl9CT09USU1BR0UKIGVuZGlmICMgQlVJTERJTkdfVkVORE9SX0JPT1RfSU1BR0UKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTY0Miw3ICsxOTgyLDcgQEAKIGluc3RhbGxlZF9zeXN0ZW1fZGxrbV9ub3RpY2VfeG1sX2d6IDo9ICQoVEFSR0VUX09VVF9TWVNURU1fRExLTSkvZXRjL05PVElDRS54bWwuZ3oKIAogQUxMX0lOU1RBTExFRF9OT1RJQ0VfRklMRVMgOj0gXAotICAkKGluc3RhbGxlZF9ub3RpY2VfaHRtbF9vcl94bWxfZ3opIFwKKyAgJChpZiAkKFVTRV9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSksLCQoaW5zdGFsbGVkX25vdGljZV9odG1sX29yX3htbF9neikpIFwKICAgJChpbnN0YWxsZWRfdmVuZG9yX25vdGljZV94bWxfZ3opIFwKICAgJChpbnN0YWxsZWRfcHJvZHVjdF9ub3RpY2VfeG1sX2d6KSBcCiAgICQoaW5zdGFsbGVkX3N5c3RlbV9leHRfbm90aWNlX3htbF9neikgXApAQCAtMTcyOSw3ICsyMDY5LDkgQEAKIAogZW5kaWYgIyBQUk9EVUNUX05PVElDRV9TUExJVAogCitpZm5lcSAoJChVU0VfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UpLHRydWUpCiBBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKGluc3RhbGxlZF9ub3RpY2VfaHRtbF9vcl94bWxfZ3opCitlbmRpZgogCiBuZWVkX3ZlbmRvcl9ub3RpY2U6PWZhbHNlCiBpZmVxICgkKEJVSUxESU5HX1ZFTkRPUl9CT09UX0lNQUdFKSx0cnVlKQpAQCAtMTg2MSwxMSArMjIwMyw2IEBACiAjIEdldCBhIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIHNlYXJjaCBwYXRocy4KIElOVEVSTkFMX1VTRVJJTUFHRVNfQklOQVJZX1BBVEhTIDo9ICQoc3Vic3QgJChzcGFjZSksOiwkKHNvcnQgJChkaXIgJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpKSkpCiAKLSMgQ29sbGVjdHMgZmlsZV9jb250ZXh0cyBmaWxlcyBmcm9tIG1vZHVsZXMgdG8gYmUgaW5zdGFsbGVkCi0kKGNhbGwgbWVyZ2UtZmMtZmlsZXMsIFwKLSAgJChzb3J0ICQoZm9yZWFjaCBtLCQocHJvZHVjdF9NT0RVTEVTKSwkKEFMTF9NT0RVTEVTLiQobSkuRklMRV9DT05URVhUUykpKSxcCi0gICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsRVRDLGZpbGVfY29udGV4dHMuYmluKS9maWxlX2NvbnRleHRzLm1vZHVsZXMudG1wKQotCiBTRUxJTlVYX0ZDIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsRVRDLGZpbGVfY29udGV4dHMuYmluKS9maWxlX2NvbnRleHRzLmJpbgogCiBJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMgKz0gJChTRUxJTlVYX0ZDKQpAQCAtMTg4NSw5ICsyMjIyLDExIEBACiAkKGlmICQoQk9BUkRfJChfdmFyKUlNQUdFX0VST0ZTX0NPTVBSRVNTT1IpLCQoaGlkZSkgZWNobyAiJCgxKV9lcm9mc19jb21wcmVzc29yPSQoQk9BUkRfJChfdmFyKUlNQUdFX0VST0ZTX0NPTVBSRVNTT1IpIiA+PiAkKDIpKQogJChpZiAkKEJPQVJEXyQoX3ZhcilJTUFHRV9FUk9GU19DT01QUkVTU19ISU5UUyksJChoaWRlKSBlY2hvICIkKDEpX2Vyb2ZzX2NvbXByZXNzX2hpbnRzPSQoQk9BUkRfJChfdmFyKUlNQUdFX0VST0ZTX0NPTVBSRVNTX0hJTlRTKSIgPj4gJCgyKSkKICQoaWYgJChCT0FSRF8kKF92YXIpSU1BR0VfRVJPRlNfUENMVVNURVJfU0laRSksJChoaWRlKSBlY2hvICIkKDEpX2Vyb2ZzX3BjbHVzdGVyX3NpemU9JChCT0FSRF8kKF92YXIpSU1BR0VfRVJPRlNfUENMVVNURVJfU0laRSkiID4+ICQoMikpCiskKGlmICQoQk9BUkRfJChfdmFyKUlNQUdFX0VST0ZTX0JMT0NLU0laRSksJChoaWRlKSBlY2hvICIkKDEpX2Vyb2ZzX2Jsb2Nrc2l6ZT0kKEJPQVJEXyQoX3ZhcilJTUFHRV9FUk9GU19CTE9DS1NJWkUpIiA+PiAkKDIpKQogJChpZiAkKEJPQVJEXyQoX3ZhcilJTUFHRV9FWFRGU19JTk9ERV9DT1VOVCksJChoaWRlKSBlY2hvICIkKDEpX2V4dGZzX2lub2RlX2NvdW50PSQoQk9BUkRfJChfdmFyKUlNQUdFX0VYVEZTX0lOT0RFX0NPVU5UKSIgPj4gJCgyKSkKICQoaWYgJChCT0FSRF8kKF92YXIpSU1BR0VfRVhURlNfUlNWX1BDVCksJChoaWRlKSBlY2hvICIkKDEpX2V4dGZzX3Jzdl9wY3Q9JChCT0FSRF8kKF92YXIpSU1BR0VfRVhURlNfUlNWX1BDVCkiID4+ICQoMikpCiAkKGlmICQoQk9BUkRfJChfdmFyKUlNQUdFX0YyRlNfU0xPQURfQ09NUFJFU1NfRkxBR1MpLCQoaGlkZSkgZWNobyAiJCgxKV9mMmZzX3NsZGNfZmxhZ3M9JChCT0FSRF8kKF92YXIpSU1BR0VfRjJGU19TTE9BRF9DT01QUkVTU19GTEFHUykiID4+ICQoMikpCiskKGlmICQoQk9BUkRfJChfdmFyKUlNQUdFX0YyRlNfQkxPQ0tTSVpFKSwkKGhpZGUpIGVjaG8gIiQoMSlfZjJmc19ibG9ja3NpemU9JChCT0FSRF8kKF92YXIpSU1BR0VfRjJGU19CTE9DS1NJWkUpIiA+PiAkKDIpKQogJChpZiAkKEJPQVJEXyQoX3ZhcilJTUFHRV9GSUxFX1NZU1RFTV9DT01QUkVTUyksJChoaWRlKSBlY2hvICIkKDEpX2YyZnNfY29tcHJlc3M9JChCT0FSRF8kKF92YXIpSU1BR0VfRklMRV9TWVNURU1fQ09NUFJFU1MpIiA+PiAkKDIpKQogJChpZiAkKEJPQVJEXyQoX3ZhcilJTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSwkKGhpZGUpIGVjaG8gIiQoMSlfZnNfdHlwZT0kKEJPQVJEXyQoX3ZhcilJTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSIgPj4gJCgyKSkKICQoaWYgJChCT0FSRF8kKF92YXIpSU1BR0VfSk9VUk5BTF9TSVpFKSwkKGhpZGUpIGVjaG8gIiQoMSlfam91cm5hbF9zaXplPSQoQk9BUkRfJChfdmFyKUlNQUdFX0pPVVJOQUxfU0laRSkiID4+ICQoMikpCkBAIC0xOTc0LDkgKzIzMTMsMTEgQEAKICQoaWYgJChCT0FSRF9FUk9GU19DT01QUkVTU09SKSwkKGhpZGUpIGVjaG8gImVyb2ZzX2RlZmF1bHRfY29tcHJlc3Nvcj0kKEJPQVJEX0VST0ZTX0NPTVBSRVNTT1IpIiA+PiAkKDEpKQogJChpZiAkKEJPQVJEX0VST0ZTX0NPTVBSRVNTX0hJTlRTKSwkKGhpZGUpIGVjaG8gImVyb2ZzX2RlZmF1bHRfY29tcHJlc3NfaGludHM9JChCT0FSRF9FUk9GU19DT01QUkVTU19ISU5UUykiID4+ICQoMSkpCiAkKGlmICQoQk9BUkRfRVJPRlNfUENMVVNURVJfU0laRSksJChoaWRlKSBlY2hvICJlcm9mc19wY2x1c3Rlcl9zaXplPSQoQk9BUkRfRVJPRlNfUENMVVNURVJfU0laRSkiID4+ICQoMSkpCiskKGlmICQoQk9BUkRfRVJPRlNfQkxPQ0tTSVpFKSwkKGhpZGUpIGVjaG8gImVyb2ZzX2Jsb2Nrc2l6ZT0kKEJPQVJEX0VST0ZTX0JMT0NLU0laRSkiID4+ICQoMSkpCiAkKGlmICQoQk9BUkRfRVJPRlNfU0hBUkVfRFVQX0JMT0NLUyksJChoaWRlKSBlY2hvICJlcm9mc19zaGFyZV9kdXBfYmxvY2tzPSQoQk9BUkRfRVJPRlNfU0hBUkVfRFVQX0JMT0NLUykiID4+ICQoMSkpCiAkKGlmICQoQk9BUkRfRVJPRlNfVVNFX0xFR0FDWV9DT01QUkVTU0lPTiksJChoaWRlKSBlY2hvICJlcm9mc191c2VfbGVnYWN5X2NvbXByZXNzaW9uPSQoQk9BUkRfRVJPRlNfVVNFX0xFR0FDWV9DT01QUkVTU0lPTikiID4+ICQoMSkpCiAkKGlmICQoQk9BUkRfRVhUNF9TSEFSRV9EVVBfQkxPQ0tTKSwkKGhpZGUpIGVjaG8gImV4dDRfc2hhcmVfZHVwX2Jsb2Nrcz0kKEJPQVJEX0VYVDRfU0hBUkVfRFVQX0JMT0NLUykiID4+ICQoMSkpCiskKGlmICQoQk9BUkRfRjJGU19CTE9DS1NJWkUpLCQoaGlkZSkgZWNobyAiZjJmc19ibG9ja3NpemU9JChCT0FSRF9GMkZTX0JMT0NLU0laRSkiID4+ICQoMSkpCiAkKGlmICQoQk9BUkRfRkxBU0hfTE9HSUNBTF9CTE9DS19TSVpFKSwgJChoaWRlKSBlY2hvICJmbGFzaF9sb2dpY2FsX2Jsb2NrX3NpemU9JChCT0FSRF9GTEFTSF9MT0dJQ0FMX0JMT0NLX1NJWkUpIiA+PiAkKDEpKQogJChpZiAkKEJPQVJEX0ZMQVNIX0VSQVNFX0JMT0NLX1NJWkUpLCAkKGhpZGUpIGVjaG8gImZsYXNoX2VyYXNlX2Jsb2NrX3NpemU9JChCT0FSRF9GTEFTSF9FUkFTRV9CTE9DS19TSVpFKSIgPj4gJCgxKSkKICQoaWYgJChmaWx0ZXIgZW5nLCAkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSksJChoaWRlKSBlY2hvICJ2ZXJpdHlfZGlzYWJsZT10cnVlIiA+PiAkKDEpKQpAQCAtMTk4Nyw4NiArMjMyOCw4MCBAQAogJChpZiAkKFBST0RVQ1RfVkVORE9SX0RMS01fVkVSSVRZX1BBUlRJVElPTiksJChoaWRlKSBlY2hvICJ2ZW5kb3JfZGxrbV92ZXJpdHlfYmxvY2tfZGV2aWNlPSQoUFJPRFVDVF9WRU5ET1JfRExLTV9WRVJJVFlfUEFSVElUSU9OKSIgPj4gJCgxKSkKICQoaWYgJChQUk9EVUNUX09ETV9ETEtNX1ZFUklUWV9QQVJUSVRJT04pLCQoaGlkZSkgZWNobyAib2RtX2Rsa21fdmVyaXR5X2Jsb2NrX2RldmljZT0kKFBST0RVQ1RfT0RNX0RMS01fVkVSSVRZX1BBUlRJVElPTikiID4+ICQoMSkpCiAkKGlmICQoUFJPRFVDVF9TWVNURU1fRExLTV9WRVJJVFlfUEFSVElUSU9OKSwkKGhpZGUpIGVjaG8gInN5c3RlbV9kbGttX3Zlcml0eV9ibG9ja19kZXZpY2U9JChQUk9EVUNUX1NZU1RFTV9ETEtNX1ZFUklUWV9QQVJUSVRJT04pIiA+PiAkKDEpKQotJChpZiAkKFBST0RVQ1RfU1VQUE9SVFNfVkJPT1QpLCQoaGlkZSkgZWNobyAidmJvb3Q9JChQUk9EVUNUX1NVUFBPUlRTX1ZCT09UKSIgPj4gJCgxKSkKLSQoaWYgJChQUk9EVUNUX1NVUFBPUlRTX1ZCT09UKSwkKGhpZGUpIGVjaG8gInZib290X2tleT0kKFBST0RVQ1RfVkJPT1RfU0lHTklOR19LRVkpIiA+PiAkKDEpKQotJChpZiAkKFBST0RVQ1RfU1VQUE9SVFNfVkJPT1QpLCQoaGlkZSkgZWNobyAidmJvb3Rfc3Via2V5PSQoUFJPRFVDVF9WQk9PVF9TSUdOSU5HX1NVQktFWSkiID4+ICQoMSkpCi0kKGlmICQoUFJPRFVDVF9TVVBQT1JUU19WQk9PVCksJChoaWRlKSBlY2hvICJmdXRpbGl0eT0kKG5vdGRpciAkKEZVVElMSVRZKSkiID4+ICQoMSkpCi0kKGlmICQoUFJPRFVDVF9TVVBQT1JUU19WQk9PVCksJChoaWRlKSBlY2hvICJ2Ym9vdF9zaWduZXJfY21kPSQoVkJPT1RfU0lHTkVSKSIgPj4gJCgxKSkKLSQoaWYgJChCT0FSRF9BVkJfRU5BQkxFKSwkKGhpZGUpIGVjaG8gImF2Yl9hdmJ0b29sPSQobm90ZGlyICQoQVZCVE9PTCkpIiA+PiAkKDEpKQotJChpZiAkKEJPQVJEX0FWQl9FTkFCTEUpLCQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9oYXNodHJlZV9lbmFibGU9JChCT0FSRF9BVkJfRU5BQkxFKSIgPj4gJCgxKSkKLSQoaWYgJChCT0FSRF9BVkJfRU5BQkxFKSwkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fYWRkX2hhc2h0cmVlX2Zvb3Rlcl9hcmdzPSQoQk9BUkRfQVZCX1NZU1RFTV9BRERfSEFTSFRSRUVfRk9PVEVSX0FSR1MpIiA+PiAkKDEpKQotJChpZiAkKEJPQVJEX0FWQl9FTkFCTEUpLFwKLSAgICAkKGlmICQoQk9BUkRfQVZCX1NZU1RFTV9LRVlfUEFUSCksXAotICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fa2V5X3BhdGg9JChCT0FSRF9BVkJfU1lTVEVNX0tFWV9QQVRIKSIgPj4gJCgxKQotICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fYWxnb3JpdGhtPSQoQk9BUkRfQVZCX1NZU1RFTV9BTEdPUklUSE0pIiA+PiAkKDEpCi0gICAgICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9yb2xsYmFja19pbmRleF9sb2NhdGlvbj0kKEJPQVJEX0FWQl9TWVNURU1fUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT04pIiA+PiAkKDEpKSkKLSQoaWYgJChCT0FSRF9BVkJfRU5BQkxFKSwkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fb3RoZXJfaGFzaHRyZWVfZW5hYmxlPSQoQk9BUkRfQVZCX0VOQUJMRSkiID4+ICQoMSkpCi0kKGlmICQoQk9BUkRfQVZCX0VOQUJMRSksJChoaWRlKSBlY2hvICJhdmJfc3lzdGVtX290aGVyX2FkZF9oYXNodHJlZV9mb290ZXJfYXJncz0kKEJPQVJEX0FWQl9TWVNURU1fT1RIRVJfQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTKSIgPj4gJCgxKSkKLSQoaWYgJChCT0FSRF9BVkJfRU5BQkxFKSxcCiskKGlmICQoQk9BUkRfQVZCX0VOQUJMRSksIFwKKyAgJChoaWRlKSBlY2hvICJhdmJfYXZidG9vbD0kKG5vdGRpciAkKEFWQlRPT0wpKSIgPj4gJCgxKSQobmV3bGluZSkgXAorICAkKGlmICQoZmlsdGVyICQoMiksc3lzdGVtKSwgXAorICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9oYXNodHJlZV9lbmFibGU9JChCT0FSRF9BVkJfRU5BQkxFKSIgPj4gJCgxKSQobmV3bGluZSkgXAorICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9hZGRfaGFzaHRyZWVfZm9vdGVyX2FyZ3M9JChCT0FSRF9BVkJfU1lTVEVNX0FERF9IQVNIVFJFRV9GT09URVJfQVJHUykiID4+ICQoMSkkKG5ld2xpbmUpIFwKKyAgICAkKGlmICQoQk9BUkRfQVZCX1NZU1RFTV9LRVlfUEFUSCksIFwKKyAgICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9rZXlfcGF0aD0kKEJPQVJEX0FWQl9TWVNURU1fS0VZX1BBVEgpIiA+PiAkKDEpJChuZXdsaW5lKSBcCisgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fYWxnb3JpdGhtPSQoQk9BUkRfQVZCX1NZU1RFTV9BTEdPUklUSE0pIiA+PiAkKDEpJChuZXdsaW5lKSBcCisgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fcm9sbGJhY2tfaW5kZXhfbG9jYXRpb249JChCT0FSRF9BVkJfU1lTVEVNX1JPTExCQUNLX0lOREVYX0xPQ0FUSU9OKSIgPj4gJCgxKSQobmV3bGluZSkpKSBcCisgICQoaWYgJChmaWx0ZXIgJCgyKSxzeXN0ZW1fb3RoZXIpLCBcCisgICAgJChoaWRlKSBlY2hvICJhdmJfc3lzdGVtX290aGVyX2hhc2h0cmVlX2VuYWJsZT0kKEJPQVJEX0FWQl9FTkFCTEUpIiA+PiAkKDEpJChuZXdsaW5lKSBcCisgICAgJChoaWRlKSBlY2hvICJhdmJfc3lzdGVtX290aGVyX2FkZF9oYXNodHJlZV9mb290ZXJfYXJncz0kKEJPQVJEX0FWQl9TWVNURU1fT1RIRVJfQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTKSIgPj4gJCgxKSQobmV3bGluZSkgXAogICAgICQoaWYgJChCT0FSRF9BVkJfU1lTVEVNX09USEVSX0tFWV9QQVRIKSxcCi0gICAgICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9vdGhlcl9rZXlfcGF0aD0kKEJPQVJEX0FWQl9TWVNURU1fT1RIRVJfS0VZX1BBVEgpIiA+PiAkKDEpCi0gICAgICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9vdGhlcl9hbGdvcml0aG09JChCT0FSRF9BVkJfU1lTVEVNX09USEVSX0FMR09SSVRITSkiID4+ICQoMSkpKQotJChpZiAkKEJPQVJEX0FWQl9FTkFCTEUpLCQoaGlkZSkgZWNobyAiYXZiX3ZlbmRvcl9oYXNodHJlZV9lbmFibGU9JChCT0FSRF9BVkJfRU5BQkxFKSIgPj4gJCgxKSkKLSQoaWYgJChCT0FSRF9BVkJfRU5BQkxFKSwkKGhpZGUpIGVjaG8gImF2Yl92ZW5kb3JfYWRkX2hhc2h0cmVlX2Zvb3Rlcl9hcmdzPSQoQk9BUkRfQVZCX1ZFTkRPUl9BRERfSEFTSFRSRUVfRk9PVEVSX0FSR1MpIiA+PiAkKDEpKQotJChpZiAkKEJPQVJEX0FWQl9FTkFCTEUpLFwKKyAgICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9vdGhlcl9rZXlfcGF0aD0kKEJPQVJEX0FWQl9TWVNURU1fT1RIRVJfS0VZX1BBVEgpIiA+PiAkKDEpJChuZXdsaW5lKSBcCisgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fb3RoZXJfYWxnb3JpdGhtPSQoQk9BUkRfQVZCX1NZU1RFTV9PVEhFUl9BTEdPUklUSE0pIiA+PiAkKDEpJChuZXdsaW5lKSkpIFwKKyAgJChpZiAkKGZpbHRlciAkKDIpLHZlbmRvciksIFwKKyAgICAkKGhpZGUpIGVjaG8gImF2Yl92ZW5kb3JfaGFzaHRyZWVfZW5hYmxlPSQoQk9BUkRfQVZCX0VOQUJMRSkiID4+ICQoMSkkKG5ld2xpbmUpIFwKKyAgICAkKGhpZGUpIGVjaG8gImF2Yl92ZW5kb3JfYWRkX2hhc2h0cmVlX2Zvb3Rlcl9hcmdzPSQoQk9BUkRfQVZCX1ZFTkRPUl9BRERfSEFTSFRSRUVfRk9PVEVSX0FSR1MpIiA+PiAkKDEpJChuZXdsaW5lKSBcCiAgICAgJChpZiAkKEJPQVJEX0FWQl9WRU5ET1JfS0VZX1BBVEgpLFwKLSAgICAgICAgJChoaWRlKSBlY2hvICJhdmJfdmVuZG9yX2tleV9wYXRoPSQoQk9BUkRfQVZCX1ZFTkRPUl9LRVlfUEFUSCkiID4+ICQoMSkKLSAgICAgICAgJChoaWRlKSBlY2hvICJhdmJfdmVuZG9yX2FsZ29yaXRobT0kKEJPQVJEX0FWQl9WRU5ET1JfQUxHT1JJVEhNKSIgPj4gJCgxKQotICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl92ZW5kb3Jfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb249JChCT0FSRF9BVkJfVkVORE9SX1JPTExCQUNLX0lOREVYX0xPQ0FUSU9OKSIgPj4gJCgxKSkpCi0kKGlmICQoQk9BUkRfQVZCX0VOQUJMRSksJChoaWRlKSBlY2hvICJhdmJfcHJvZHVjdF9oYXNodHJlZV9lbmFibGU9JChCT0FSRF9BVkJfRU5BQkxFKSIgPj4gJCgxKSkKLSQoaWYgJChCT0FSRF9BVkJfRU5BQkxFKSwkKGhpZGUpIGVjaG8gImF2Yl9wcm9kdWN0X2FkZF9oYXNodHJlZV9mb290ZXJfYXJncz0kKEJPQVJEX0FWQl9QUk9EVUNUX0FERF9IQVNIVFJFRV9GT09URVJfQVJHUykiID4+ICQoMSkpCi0kKGlmICQoQk9BUkRfQVZCX0VOQUJMRSksXAorICAgICAgJChoaWRlKSBlY2hvICJhdmJfdmVuZG9yX2tleV9wYXRoPSQoQk9BUkRfQVZCX1ZFTkRPUl9LRVlfUEFUSCkiID4+ICQoMSkkKG5ld2xpbmUpIFwKKyAgICAgICQoaGlkZSkgZWNobyAiYXZiX3ZlbmRvcl9hbGdvcml0aG09JChCT0FSRF9BVkJfVkVORE9SX0FMR09SSVRITSkiID4+ICQoMSkkKG5ld2xpbmUpIFwKKyAgICAgICQoaGlkZSkgZWNobyAiYXZiX3ZlbmRvcl9yb2xsYmFja19pbmRleF9sb2NhdGlvbj0kKEJPQVJEX0FWQl9WRU5ET1JfUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT04pIiA+PiAkKDEpJChuZXdsaW5lKSkpIFwKKyAgJChpZiAkKGZpbHRlciAkKDIpLHByb2R1Y3QpLCBcCisgICAgJChoaWRlKSBlY2hvICJhdmJfcHJvZHVjdF9oYXNodHJlZV9lbmFibGU9JChCT0FSRF9BVkJfRU5BQkxFKSIgPj4gJCgxKSQobmV3bGluZSkgXAorICAgICQoaGlkZSkgZWNobyAiYXZiX3Byb2R1Y3RfYWRkX2hhc2h0cmVlX2Zvb3Rlcl9hcmdzPSQoQk9BUkRfQVZCX1BST0RVQ1RfQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTKSIgPj4gJCgxKSQobmV3bGluZSkgXAogICAgICQoaWYgJChCT0FSRF9BVkJfUFJPRFVDVF9LRVlfUEFUSCksXAotICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9wcm9kdWN0X2tleV9wYXRoPSQoQk9BUkRfQVZCX1BST0RVQ1RfS0VZX1BBVEgpIiA+PiAkKDEpCi0gICAgICAgICQoaGlkZSkgZWNobyAiYXZiX3Byb2R1Y3RfYWxnb3JpdGhtPSQoQk9BUkRfQVZCX1BST0RVQ1RfQUxHT1JJVEhNKSIgPj4gJCgxKQotICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9wcm9kdWN0X3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uPSQoQk9BUkRfQVZCX1BST0RVQ1RfUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT04pIiA+PiAkKDEpKSkKLSQoaWYgJChCT0FSRF9BVkJfRU5BQkxFKSwkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fZXh0X2hhc2h0cmVlX2VuYWJsZT0kKEJPQVJEX0FWQl9FTkFCTEUpIiA+PiAkKDEpKQotJChpZiAkKEJPQVJEX0FWQl9FTkFCTEUpLFwKLSAgICAkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fZXh0X2FkZF9oYXNodHJlZV9mb290ZXJfYXJncz0kKEJPQVJEX0FWQl9TWVNURU1fRVhUX0FERF9IQVNIVFJFRV9GT09URVJfQVJHUykiID4+ICQoMSkpCi0kKGlmICQoQk9BUkRfQVZCX0VOQUJMRSksXAorICAgICAgJChoaWRlKSBlY2hvICJhdmJfcHJvZHVjdF9rZXlfcGF0aD0kKEJPQVJEX0FWQl9QUk9EVUNUX0tFWV9QQVRIKSIgPj4gJCgxKSQobmV3bGluZSkgXAorICAgICAgJChoaWRlKSBlY2hvICJhdmJfcHJvZHVjdF9hbGdvcml0aG09JChCT0FSRF9BVkJfUFJPRFVDVF9BTEdPUklUSE0pIiA+PiAkKDEpJChuZXdsaW5lKSBcCisgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9wcm9kdWN0X3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uPSQoQk9BUkRfQVZCX1BST0RVQ1RfUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT04pIiA+PiAkKDEpJChuZXdsaW5lKSkpIFwKKyAgJChpZiAkKGZpbHRlciAkKDIpLHN5c3RlbV9leHQpLCBcCisgICAgJChoaWRlKSBlY2hvICJhdmJfc3lzdGVtX2V4dF9oYXNodHJlZV9lbmFibGU9JChCT0FSRF9BVkJfRU5BQkxFKSIgPj4gJCgxKSQobmV3bGluZSkgXAorICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9leHRfYWRkX2hhc2h0cmVlX2Zvb3Rlcl9hcmdzPSQoQk9BUkRfQVZCX1NZU1RFTV9FWFRfQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTKSIgPj4gJCgxKSQobmV3bGluZSkgXAogICAgICQoaWYgJChCT0FSRF9BVkJfU1lTVEVNX0VYVF9LRVlfUEFUSCksXAotICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fZXh0X2tleV9wYXRoPSQoQk9BUkRfQVZCX1NZU1RFTV9FWFRfS0VZX1BBVEgpIiA+PiAkKDEpCi0gICAgICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9leHRfYWxnb3JpdGhtPSQoQk9BUkRfQVZCX1NZU1RFTV9FWFRfQUxHT1JJVEhNKSIgPj4gJCgxKQotICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fZXh0X3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uPSQoQk9BUkRfQVZCX1NZU1RFTV9FWFRfUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT04pIiA+PiAkKDEpKSkKLSQoaWYgJChCT0FSRF9BVkJfRU5BQkxFKSwkKGhpZGUpIGVjaG8gImF2Yl9vZG1faGFzaHRyZWVfZW5hYmxlPSQoQk9BUkRfQVZCX0VOQUJMRSkiID4+ICQoMSkpCi0kKGlmICQoQk9BUkRfQVZCX0VOQUJMRSksJChoaWRlKSBlY2hvICJhdmJfb2RtX2FkZF9oYXNodHJlZV9mb290ZXJfYXJncz0kKEJPQVJEX0FWQl9PRE1fQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTKSIgPj4gJCgxKSkKLSQoaWYgJChCT0FSRF9BVkJfRU5BQkxFKSxcCisgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fZXh0X2tleV9wYXRoPSQoQk9BUkRfQVZCX1NZU1RFTV9FWFRfS0VZX1BBVEgpIiA+PiAkKDEpJChuZXdsaW5lKSBcCisgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fZXh0X2FsZ29yaXRobT0kKEJPQVJEX0FWQl9TWVNURU1fRVhUX0FMR09SSVRITSkiID4+ICQoMSkkKG5ld2xpbmUpIFwKKyAgICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9leHRfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb249JChCT0FSRF9BVkJfU1lTVEVNX0VYVF9ST0xMQkFDS19JTkRFWF9MT0NBVElPTikiID4+ICQoMSkkKG5ld2xpbmUpKSkgXAorICAkKGlmICQoZmlsdGVyICQoMiksb2RtKSwgXAorICAgICQoaGlkZSkgZWNobyAiYXZiX29kbV9oYXNodHJlZV9lbmFibGU9JChCT0FSRF9BVkJfRU5BQkxFKSIgPj4gJCgxKSQobmV3bGluZSkgXAorICAgICQoaGlkZSkgZWNobyAiYXZiX29kbV9hZGRfaGFzaHRyZWVfZm9vdGVyX2FyZ3M9JChCT0FSRF9BVkJfT0RNX0FERF9IQVNIVFJFRV9GT09URVJfQVJHUykiID4+ICQoMSkkKG5ld2xpbmUpIFwKICAgICAkKGlmICQoQk9BUkRfQVZCX09ETV9LRVlfUEFUSCksXAotICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9vZG1fa2V5X3BhdGg9JChCT0FSRF9BVkJfT0RNX0tFWV9QQVRIKSIgPj4gJCgxKQotICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9vZG1fYWxnb3JpdGhtPSQoQk9BUkRfQVZCX09ETV9BTEdPUklUSE0pIiA+PiAkKDEpCi0gICAgICAgICQoaGlkZSkgZWNobyAiYXZiX29kbV9yb2xsYmFja19pbmRleF9sb2NhdGlvbj0kKEJPQVJEX0FWQl9PRE1fUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT04pIiA+PiAkKDEpKSkKLSQoaWYgJChCT0FSRF9BVkJfRU5BQkxFKSwkKGhpZGUpIGVjaG8gImF2Yl92ZW5kb3JfZGxrbV9oYXNodHJlZV9lbmFibGU9JChCT0FSRF9BVkJfRU5BQkxFKSIgPj4gJCgxKSkKLSQoaWYgJChCT0FSRF9BVkJfRU5BQkxFKSxcCi0gICAgJChoaWRlKSBlY2hvICJhdmJfdmVuZG9yX2Rsa21fYWRkX2hhc2h0cmVlX2Zvb3Rlcl9hcmdzPSQoQk9BUkRfQVZCX1ZFTkRPUl9ETEtNX0FERF9IQVNIVFJFRV9GT09URVJfQVJHUykiID4+ICQoMSkpCi0kKGlmICQoQk9BUkRfQVZCX0VOQUJMRSksXAorICAgICAgJChoaWRlKSBlY2hvICJhdmJfb2RtX2tleV9wYXRoPSQoQk9BUkRfQVZCX09ETV9LRVlfUEFUSCkiID4+ICQoMSkkKG5ld2xpbmUpIFwKKyAgICAgICQoaGlkZSkgZWNobyAiYXZiX29kbV9hbGdvcml0aG09JChCT0FSRF9BVkJfT0RNX0FMR09SSVRITSkiID4+ICQoMSkkKG5ld2xpbmUpIFwKKyAgICAgICQoaGlkZSkgZWNobyAiYXZiX29kbV9yb2xsYmFja19pbmRleF9sb2NhdGlvbj0kKEJPQVJEX0FWQl9PRE1fUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT04pIiA+PiAkKDEpJChuZXdsaW5lKSkpIFwKKyAgJChpZiAkKGZpbHRlciAkKDIpLHZlbmRvcl9kbGttKSwgXAorICAgICQoaGlkZSkgZWNobyAiYXZiX3ZlbmRvcl9kbGttX2hhc2h0cmVlX2VuYWJsZT0kKEJPQVJEX0FWQl9FTkFCTEUpIiA+PiAkKDEpJChuZXdsaW5lKSBcCisgICAgJChoaWRlKSBlY2hvICJhdmJfdmVuZG9yX2Rsa21fYWRkX2hhc2h0cmVlX2Zvb3Rlcl9hcmdzPSQoQk9BUkRfQVZCX1ZFTkRPUl9ETEtNX0FERF9IQVNIVFJFRV9GT09URVJfQVJHUykiID4+ICQoMSkkKG5ld2xpbmUpIFwKICAgICAkKGlmICQoQk9BUkRfQVZCX1ZFTkRPUl9ETEtNX0tFWV9QQVRIKSxcCi0gICAgICAgICQoaGlkZSkgZWNobyAiYXZiX3ZlbmRvcl9kbGttX2tleV9wYXRoPSQoQk9BUkRfQVZCX1ZFTkRPUl9ETEtNX0tFWV9QQVRIKSIgPj4gJCgxKQotICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl92ZW5kb3JfZGxrbV9hbGdvcml0aG09JChCT0FSRF9BVkJfVkVORE9SX0RMS01fQUxHT1JJVEhNKSIgPj4gJCgxKQotICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl92ZW5kb3JfZGxrbV9yb2xsYmFja19pbmRleF9sb2NhdGlvbj0kKEJPQVJEX0FWQl9WRU5ET1JfRExLTV9ST0xMQkFDS19JTkRFWF9MT0NBVElPTikiID4+ICQoMSkpKQotJChpZiAkKEJPQVJEX0FWQl9FTkFCTEUpLCQoaGlkZSkgZWNobyAiYXZiX29kbV9kbGttX2hhc2h0cmVlX2VuYWJsZT0kKEJPQVJEX0FWQl9FTkFCTEUpIiA+PiAkKDEpKQotJChpZiAkKEJPQVJEX0FWQl9FTkFCTEUpLFwKLSAgICAkKGhpZGUpIGVjaG8gImF2Yl9vZG1fZGxrbV9hZGRfaGFzaHRyZWVfZm9vdGVyX2FyZ3M9JChCT0FSRF9BVkJfT0RNX0RMS01fQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTKSIgPj4gJCgxKSkKLSQoaWYgJChCT0FSRF9BVkJfRU5BQkxFKSxcCisgICAgICAkKGhpZGUpIGVjaG8gImF2Yl92ZW5kb3JfZGxrbV9rZXlfcGF0aD0kKEJPQVJEX0FWQl9WRU5ET1JfRExLTV9LRVlfUEFUSCkiID4+ICQoMSkkKG5ld2xpbmUpIFwKKyAgICAgICQoaGlkZSkgZWNobyAiYXZiX3ZlbmRvcl9kbGttX2FsZ29yaXRobT0kKEJPQVJEX0FWQl9WRU5ET1JfRExLTV9BTEdPUklUSE0pIiA+PiAkKDEpJChuZXdsaW5lKSBcCisgICAgICAkKGhpZGUpIGVjaG8gImF2Yl92ZW5kb3JfZGxrbV9yb2xsYmFja19pbmRleF9sb2NhdGlvbj0kKEJPQVJEX0FWQl9WRU5ET1JfRExLTV9ST0xMQkFDS19JTkRFWF9MT0NBVElPTikiID4+ICQoMSkkKG5ld2xpbmUpKSkgXAorICAkKGlmICQoZmlsdGVyICQoMiksb2RtX2Rsa20pLCBcCisgICAgJChoaWRlKSBlY2hvICJhdmJfb2RtX2Rsa21faGFzaHRyZWVfZW5hYmxlPSQoQk9BUkRfQVZCX0VOQUJMRSkiID4+ICQoMSkkKG5ld2xpbmUpIFwKKyAgICAkKGhpZGUpIGVjaG8gImF2Yl9vZG1fZGxrbV9hZGRfaGFzaHRyZWVfZm9vdGVyX2FyZ3M9JChCT0FSRF9BVkJfT0RNX0RMS01fQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTKSIgPj4gJCgxKSQobmV3bGluZSkgXAogICAgICQoaWYgJChCT0FSRF9BVkJfT0RNX0RMS01fS0VZX1BBVEgpLFwKLSAgICAgICAgJChoaWRlKSBlY2hvICJhdmJfb2RtX2Rsa21fa2V5X3BhdGg9JChCT0FSRF9BVkJfT0RNX0RMS01fS0VZX1BBVEgpIiA+PiAkKDEpCi0gICAgICAgICQoaGlkZSkgZWNobyAiYXZiX29kbV9kbGttX2FsZ29yaXRobT0kKEJPQVJEX0FWQl9PRE1fRExLTV9BTEdPUklUSE0pIiA+PiAkKDEpCi0gICAgICAgICQoaGlkZSkgZWNobyAiYXZiX29kbV9kbGttX3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uPSQoQk9BUkRfQVZCX09ETV9ETEtNX1JPTExCQUNLX0lOREVYX0xPQ0FUSU9OKSIgPj4gJCgxKSkpCi0kKGlmICQoQk9BUkRfQVZCX0VOQUJMRSksJChoaWRlKSBlY2hvICJhdmJfc3lzdGVtX2Rsa21faGFzaHRyZWVfZW5hYmxlPSQoQk9BUkRfQVZCX0VOQUJMRSkiID4+ICQoMSkpCi0kKGlmICQoQk9BUkRfQVZCX0VOQUJMRSksXAotICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9kbGttX2FkZF9oYXNodHJlZV9mb290ZXJfYXJncz0kKEJPQVJEX0FWQl9TWVNURU1fRExLTV9BRERfSEFTSFRSRUVfRk9PVEVSX0FSR1MpIiA+PiAkKDEpKQotJChpZiAkKEJPQVJEX0FWQl9FTkFCTEUpLFwKKyAgICAgICQoaGlkZSkgZWNobyAiYXZiX29kbV9kbGttX2tleV9wYXRoPSQoQk9BUkRfQVZCX09ETV9ETEtNX0tFWV9QQVRIKSIgPj4gJCgxKSQobmV3bGluZSkgXAorICAgICAgJChoaWRlKSBlY2hvICJhdmJfb2RtX2Rsa21fYWxnb3JpdGhtPSQoQk9BUkRfQVZCX09ETV9ETEtNX0FMR09SSVRITSkiID4+ICQoMSkkKG5ld2xpbmUpIFwKKyAgICAgICQoaGlkZSkgZWNobyAiYXZiX29kbV9kbGttX3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uPSQoQk9BUkRfQVZCX09ETV9ETEtNX1JPTExCQUNLX0lOREVYX0xPQ0FUSU9OKSIgPj4gJCgxKSQobmV3bGluZSkpKSBcCisgICQoaWYgJChmaWx0ZXIgJCgyKSxzeXN0ZW1fZGxrbSksIFwKKyAgICAkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fZGxrbV9oYXNodHJlZV9lbmFibGU9JChCT0FSRF9BVkJfRU5BQkxFKSIgPj4gJCgxKSQobmV3bGluZSkgXAorICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9kbGttX2FkZF9oYXNodHJlZV9mb290ZXJfYXJncz0kKEJPQVJEX0FWQl9TWVNURU1fRExLTV9BRERfSEFTSFRSRUVfRk9PVEVSX0FSR1MpIiA+PiAkKDEpJChuZXdsaW5lKSBcCiAgICAgJChpZiAkKEJPQVJEX0FWQl9TWVNURU1fRExLTV9LRVlfUEFUSCksXAotICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9zeXN0ZW1fZGxrbV9rZXlfcGF0aD0kKEJPQVJEX0FWQl9TWVNURU1fRExLTV9LRVlfUEFUSCkiID4+ICQoMSkKLSAgICAgICAgJChoaWRlKSBlY2hvICJhdmJfc3lzdGVtX2Rsa21fYWxnb3JpdGhtPSQoQk9BUkRfQVZCX1NZU1RFTV9ETEtNX0FMR09SSVRITSkiID4+ICQoMSkKLSAgICAgICAgJChoaWRlKSBlY2hvICJhdmJfc3lzdGVtX2Rsa21fcm9sbGJhY2tfaW5kZXhfbG9jYXRpb249JChCT0FSRF9TWVNURU1fU1lTVEVNX0RMS01fUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT04pIiA+PiAkKDEpKSkKKyAgICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9kbGttX2tleV9wYXRoPSQoQk9BUkRfQVZCX1NZU1RFTV9ETEtNX0tFWV9QQVRIKSIgPj4gJCgxKSQobmV3bGluZSkgXAorICAgICAgJChoaWRlKSBlY2hvICJhdmJfc3lzdGVtX2Rsa21fYWxnb3JpdGhtPSQoQk9BUkRfQVZCX1NZU1RFTV9ETEtNX0FMR09SSVRITSkiID4+ICQoMSkkKG5ld2xpbmUpIFwKKyAgICAgICQoaGlkZSkgZWNobyAiYXZiX3N5c3RlbV9kbGttX3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uPSQoQk9BUkRfU1lTVEVNX1NZU1RFTV9ETEtNX1JPTExCQUNLX0lOREVYX0xPQ0FUSU9OKSIgPj4gJCgxKSQobmV3bGluZSkpKSBcCispCiAkKGlmICQoZmlsdGVyIHRydWUsJChCT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1QpKSxcCiAgICAgJChoaWRlKSBlY2hvICJyZWNvdmVyeV9hc19ib290PXRydWUiID4+ICQoMSkpCi0kKGlmICQoZmlsdGVyIHRydWUsJChCT0FSRF9CVUlMRF9HS0lfQk9PVF9JTUFHRV9XSVRIT1VUX1JBTURJU0spKSxcCi0gICAgJChoaWRlKSBlY2hvICJna2lfYm9vdF9pbWFnZV93aXRob3V0X3JhbWRpc2s9dHJ1ZSIgPj4gJCgxKSkKICQoaGlkZSkgZWNobyAicm9vdF9kaXI9JChUQVJHRVRfUk9PVF9PVVQpIiA+PiAkKDEpCiAkKGlmICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX1VTRV9EWU5BTUlDX1BBUlRJVElPTl9TSVpFKSksXAogICAgICQoaGlkZSkgZWNobyAidXNlX2R5bmFtaWNfcGFydGl0aW9uX3NpemU9dHJ1ZSIgPj4gJCgxKSkKKyQoaWYgJChVU0VfRklYRURfVElNRVNUQU1QX0lNR19GSUxFUykkKENPUFlfSU1BR0VTX0ZPUl9UQVJHRVRfRklMRVNfWklQKSxcCisgICAgJChoaWRlKSBlY2hvICJ1c2VfZml4ZWRfdGltZXN0YW1wPXRydWUiID4+ICQoMSkpCiAkKGlmICQoMyksJChoaWRlKSAkKGZvcmVhY2gga3YsJCgzKSxlY2hvICIkKGt2KSIgPj4gJCgxKTspKQorJChoaWRlKSBzb3J0IC1vICQoMSkgJCgxKQogZW5kZWYKIAogIyAkKDEpOiB0aGUgcGF0aCBvZiB0aGUgb3V0cHV0IGRpY3Rpb25hcnkgZmlsZQpAQCAtMjMwOSw3ICsyNjQ0LDcgQEAKIFRBUkdFVF9QUklWQVRFX1JFU19ESVJTIDo9ICQod2lsZGNhcmQgJChUQVJHRVRfREVWSUNFX0RJUikvcmVjb3ZlcnkvcmVzKQogZW5kaWYKIHJlY292ZXJ5X3Jlc291cmNlX2RlcHMgOj0gJChzaGVsbCBmaW5kICQocmVjb3ZlcnlfcmVzb3VyY2VzX2NvbW1vbikgXAotICAkKFRBUkdFVF9QUklWQVRFX1JFU19ESVJTKSAtdHlwZSBmKQorICAkKFRBUkdFVF9QUklWQVRFX1JFU19ESVJTKSAtdHlwZSBmIC1ub3QgLW5hbWUgIiouYnAiKQogcmVjb3ZlcnlfcmVzb3VyY2VfZGVwcyArPSAkKGdlbmVyYXRlZF9yZWNvdmVyeV90ZXh0X2ZpbGVzKQogCiAKQEAgLTIzNjcsNyArMjcwMiwxMSBAQAogICAgIFRBUkdFVF9SRUNPVkVSWV9VSV9QUk9HUkVTU19CQVJfQkFTRUxJTkU6cHJvZ3Jlc3NfYmFyX2Jhc2VsaW5lIFwKICAgICBUQVJHRVRfUkVDT1ZFUllfVUlfVE9VQ0hfTE9XX1RIUkVTSE9MRDp0b3VjaF9sb3dfdGhyZXNob2xkIFwKICAgICBUQVJHRVRfUkVDT1ZFUllfVUlfVE9VQ0hfSElHSF9USFJFU0hPTEQ6dG91Y2hfaGlnaF90aHJlc2hvbGQgXAotICAgIFRBUkdFVF9SRUNPVkVSWV9VSV9WUl9TVEVSRU9fT0ZGU0VUOnZyX3N0ZXJlb19vZmZzZXQKKyAgICBUQVJHRVRfUkVDT1ZFUllfVUlfVlJfU1RFUkVPX09GRlNFVDp2cl9zdGVyZW9fb2Zmc2V0IFwKKyAgICBUQVJHRVRfUkVDT1ZFUllfVUlfQlJJR0hUTkVTU19GSUxFOmJyaWdodG5lc3NfZmlsZSBcCisgICAgVEFSR0VUX1JFQ09WRVJZX1VJX01BWF9CUklHSFRORVNTX0ZJTEU6bWF4X2JyaWdodG5lc3NfZmlsZSBcCisgICAgVEFSR0VUX1JFQ09WRVJZX1VJX0JSSUdIVE5FU1NfTk9STUFMOmJyaWdodG5lc3Nfbm9ybWFsX3BlcmNlbnQgXAorICAgIFRBUkdFVF9SRUNPVkVSWV9VSV9CUklHSFRORVNTX0RJTU1FRDpicmlnaHRuZXNzX2RpbW1lZF9wZXJjZW50CiAKICMgUGFyc2VzIHRoZSBnaXZlbiBsaXN0IG9mIGJ1aWxkIHZhcmlhYmxlcyBhbmQgd3JpdGVzIHRoZWlyIHZhbHVlcyBhcyBidWlsZCBwcm9wZXJ0aWVzIGlmIGRlZmluZWQuCiAjIEZvciBleGFtcGxlLCBpZiBhIHRhcmdldCBkZWZpbmVzIGBUQVJHRVRfUkVDT1ZFUllfVUlfTUFSR0lOX0hFSUdIVCA6PSAxMDBgLApAQCAtMjQ4Nyw2ICsyODI2LDggQEAKIAkkKGlmICQoc3RyaXAgJChyZWNvdmVyeV93aXBlKSksIFwKIAkgIGNwIC1mICQocmVjb3Zlcnlfd2lwZSkgJChUQVJHRVRfUkVDT1ZFUllfUk9PVF9PVVQpL3N5c3RlbS9ldGMvcmVjb3Zlcnkud2lwZSkKIAlsbiAtc2YgcHJvcC5kZWZhdWx0ICQoVEFSR0VUX1JFQ09WRVJZX1JPT1RfT1VUKS9kZWZhdWx0LnByb3AKKwkjIFNpbGVuY2Ugd2FybmluZ3MgaW4gZmlyc3Rfc3RhZ2VfY29uc29sZS4KKwl0b3VjaCAkKFRBUkdFVF9SRUNPVkVSWV9ST09UX09VVCkvbGlua2VyY29uZmlnL2xkLmNvbmZpZy50eHQKIAkkKEJPQVJEX1JFQ09WRVJZX0lNQUdFX1BSRVBBUkUpCiAJJChoaWRlKSB0b3VjaCAkQAogCkBAIC0yNDk2LDE1ICsyODM3LDkgQEAKICMgJCgxKTogb3V0cHV0IGZpbGUKICMgJCgyKTogb3B0aW9uYWwga2VybmVsIGZpbGUKIGRlZmluZSBidWlsZC1yZWNvdmVyeWltYWdlLXRhcmdldAotICAkKGlmICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX1NVUFBPUlRTX1ZCT09UKSksIFwKLSAgICAkKE1LQk9PVElNRykgJChpZiAkKHN0cmlwICQoMikpLC0ta2VybmVsICQoc3RyaXAgJCgyKSkpICQoSU5URVJOQUxfUkVDT1ZFUllJTUFHRV9BUkdTKSBcCi0gICAgICAgICAgICAgICAgICQoSU5URVJOQUxfTUtCT09USU1HX1ZFUlNJT05fQVJHUykgJChCT0FSRF9SRUNPVkVSWV9NS0JPT1RJTUdfQVJHUykgXAotICAgICAgICAgICAgICAgICAtLW91dHB1dCAkKDEpLnVuc2lnbmVkLCBcCi0gICAgJChNS0JPT1RJTUcpICQoaWYgJChzdHJpcCAkKDIpKSwtLWtlcm5lbCAkKHN0cmlwICQoMikpKSAkKElOVEVSTkFMX1JFQ09WRVJZSU1BR0VfQVJHUykgXAotICAgICAgICAgICAgICAgICAkKElOVEVSTkFMX01LQk9PVElNR19WRVJTSU9OX0FSR1MpIFwKLSAgICAgICAgICAgICAgICAgJChCT0FSRF9SRUNPVkVSWV9NS0JPT1RJTUdfQVJHUykgLS1vdXRwdXQgJCgxKSkKLSAgJChpZiAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9TVVBQT1JUU19WQk9PVCkpLCBcCi0gICAgJChWQk9PVF9TSUdORVIpICQoRlVUSUxJVFkpICQoMSkudW5zaWduZWQgJChQUk9EVUNUX1ZCT09UX1NJR05JTkdfS0VZKS52YnB1YmsgJChQUk9EVUNUX1ZCT09UX1NJR05JTkdfS0VZKS52YnByaXZrICQoUFJPRFVDVF9WQk9PVF9TSUdOSU5HX1NVQktFWSkudmJwcml2ayAkKDEpLmtleWJsb2NrICQoMSkpCisgICQoTUtCT09USU1HKSAkKGlmICQoc3RyaXAgJCgyKSksLS1rZXJuZWwgJChzdHJpcCAkKDIpKSkgJChJTlRFUk5BTF9SRUNPVkVSWUlNQUdFX0FSR1MpIFwKKyAgICAgICAgICAgICAgICQoSU5URVJOQUxfTUtCT09USU1HX1ZFUlNJT05fQVJHUykgXAorICAgICAgICAgICAgICAgJChCT0FSRF9SRUNPVkVSWV9NS0JPT1RJTUdfQVJHUykgLS1vdXRwdXQgJCgxKQogICAkKGlmICQoZmlsdGVyIHRydWUsJChCT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1QpKSwgXAogICAgICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJCgxKSwkKGNhbGwgZ2V0LWhhc2gtaW1hZ2UtbWF4LXNpemUsJChjYWxsIGdldC1ib290aW1hZ2UtcGFydGl0aW9uLXNpemUsJCgxKSxib290KSkpLCBcCiAgICAgJChjYWxsIGFzc2VydC1tYXgtaW1hZ2Utc2l6ZSwkKDEpLCQoY2FsbCBnZXQtaGFzaC1pbWFnZS1tYXgtc2l6ZSwkKEJPQVJEX1JFQ09WRVJZSU1BR0VfUEFSVElUSU9OX1NJWkUpKSkpCkBAIC0yNTE1LDkgKzI4NTAsNiBAQAogZW5kZWYKIAogcmVjb3ZlcnlpbWFnZS1kZXBzIDo9ICQoTUtCT09USU1HKSAkKHJlY292ZXJ5X3JhbWRpc2spICQocmVjb3Zlcnlfa2VybmVsKQotaWZlcSAodHJ1ZSwkKFBST0RVQ1RfU1VQUE9SVFNfVkJPT1QpKQotICByZWNvdmVyeWltYWdlLWRlcHMgKz0gJChWQk9PVF9TSUdORVIpCi1lbmRpZgogaWZlcSAodHJ1ZSwkKEJPQVJEX0FWQl9FTkFCTEUpKQogICByZWNvdmVyeWltYWdlLWRlcHMgKz0gJChBVkJUT09MKSAkKEJPQVJEX0FWQl9CT09UX0tFWV9QQVRIKQogZW5kaWYKQEAgLTI1ODUsNiArMjkxNyw5IEBACiAkKGVycm9yIE1URCBkZXZpY2UgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBhbmQgdGh1cyBCT0FSRF9OQU5EX1NQQVJFX1NJWkUgaXMgZGVwcmVjYXRlZC4pCiBlbmRpZgogCityZWNvdmVyeV9pbnRlcm1lZGlhdGVzIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHJlY292ZXJ5KQorJChldmFsICQoY2FsbCB3cml0ZS1wYXJ0aXRpb24tZmlsZS1saXN0LCQocmVjb3ZlcnlfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dCwkKFRBUkdFVF9SRUNPVkVSWV9PVVQpLCQoSU5URVJOQUxfUkVDT1ZFUllJTUFHRV9GSUxFUykpKQorCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgQnVpbGQgZGVidWcgcmFtZGlzayBhbmQgZGVidWcgYm9vdCBpbWFnZS4KQEAgLTI5OTcsNyArMzMzMiw2IEBACiAJICBleGl0IDE7IFwKIAlmaQogCWxuIC1zZm4gJDIgJDEKLSQxOiAuS0FUSV9TWU1MSU5LX09VVFBVVFMgOj0gJDEKICkKICQoZXZhbCBQQVJUSVRJT05fQ09NUEFUX1NZTUxJTktTICs9ICQxKQogJDEKQEAgLTMxMDUsOCArMzQzOSwxMCBAQAogIyBzeXN0ZW0gaW1hZ2UKIAogSU5TVEFMTEVEX0ZJTEVTX09VVFNJREVfSU1BR0VTIDo9ICQoZmlsdGVyLW91dCAkKFRBUkdFVF9PVVQpLyUsICQoSU5TVEFMTEVEX0ZJTEVTX09VVFNJREVfSU1BR0VTKSkKK2lmZGVmIEJVSUxESU5HX1NZU1RFTV9JTUFHRQogSU5URVJOQUxfU1lTVEVNSU1BR0VfRklMRVMgOj0gJChzb3J0ICQoZmlsdGVyICQoVEFSR0VUX09VVCkvJSwgXAogICAgICQoQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMpKSkKK2VuZGlmCiAKICMgQ3JlYXRlIHN5bWxpbmsgL3N5c3RlbS92ZW5kb3IgdG8gL3ZlbmRvciBpZiBuZWNlc3NhcnkuCiBpZmRlZiBCT0FSRF9VU0VTX1ZFTkRPUklNQUdFCkBAIC0zMTYzLDE2ICszNDk5LDIwIEBACiAjIENvbGxlY3QgYWxsIGF2YWlsYWJsZSBzdHViIGxpYnJhcmllcyBpbnN0YWxsZWQgaW4gc3lzdGVtIGFuZCBpbnN0YWxsIHdpdGggcHJlZGVmaW5lZCBsaW5rZXIgY29uZmlndXJhdGlvbgogIyBBbHNvIGFwcGVuZCBMTE5ESyBsaWJyYXJpZXMgaW4gdGhlIEFQRVggYXMgcmVxdWlyZWQgbGlicwogU1lTVEVNX0xJTktFUl9DT05GSUcgOj0gJChUQVJHRVRfT1VUKS9ldGMvbGlua2VyLmNvbmZpZy5wYgotU1lTVEVNX0xJTktFUl9DT05GSUdfU09VUkNFIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsRVRDLHN5c3RlbV9saW5rZXJfY29uZmlnKS9zeXN0ZW1fbGlua2VyX2NvbmZpZworU1lTVEVNX0xJTktFUl9DT05GSUdfU09VUkNFIDo9IHN5c3RlbS9jb3JlL3Jvb3RkaXIvZXRjL2xpbmtlci5jb25maWcuanNvbgogJChTWVNURU1fTElOS0VSX0NPTkZJRyk6IFBSSVZBVEVfU1lTVEVNX0xJTktFUl9DT05GSUdfU09VUkNFIDo9ICQoU1lTVEVNX0xJTktFUl9DT05GSUdfU09VUkNFKQogJChTWVNURU1fTElOS0VSX0NPTkZJRyk6ICQoSU5URVJOQUxfU1lTVEVNSU1BR0VfRklMRVMpICQoU1lTVEVNX0xJTktFUl9DT05GSUdfU09VUkNFKSB8IGNvbnZfbGlua2VyX2NvbmZpZwogCUBlY2hvIENyZWF0aW5nIGxpbmtlciBjb25maWc6ICRACiAJQG1rZGlyIC1wICQoZGlyICRAKQotCUBybSAtZiAkQAotCSQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2NvbnZfbGlua2VyX2NvbmZpZyBzeXN0ZW1wcm92aWRlIC0tc291cmNlICQoUFJJVkFURV9TWVNURU1fTElOS0VSX0NPTkZJR19TT1VSQ0UpIFwKKwlAcm0gLWYgJEAgJEAuc3RlcDEKKwkkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9jb252X2xpbmtlcl9jb25maWcgcHJvdG8gLS1mb3JjZSAtcyAkKFBSSVZBVEVfU1lTVEVNX0xJTktFUl9DT05GSUdfU09VUkNFKSAtbyAkQC5zdGVwMQorCSQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2NvbnZfbGlua2VyX2NvbmZpZyBzeXN0ZW1wcm92aWRlIC0tc291cmNlICRALnN0ZXAxIFwKIAkJLS1vdXRwdXQgJEAgLS12YWx1ZSAiJChTVFVCX0xJQlJBUklFUykiIC0tc3lzdGVtICIkKFRBUkdFVF9PVVQpIgogCSQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2NvbnZfbGlua2VyX2NvbmZpZyBhcHBlbmQgLS1zb3VyY2UgJEAgLS1vdXRwdXQgJEAgLS1rZXkgcmVxdWlyZUxpYnMgXAogCQktLXZhbHVlICIkKGZvcmVhY2ggbGliLCQoTExOREtfTU9WRURfVE9fQVBFWF9MSUJSQVJJRVMpLCAkKGxpYikuc28pIgorCSQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2NvbnZfbGlua2VyX2NvbmZpZyBhcHBlbmQgLS1zb3VyY2UgJEAgLS1vdXRwdXQgJEAgLS1rZXkgcHJvdmlkZUxpYnMgXAorCQktLXZhbHVlICIkKGZvcmVhY2ggbGliLCQoUFJPRFVDVF9FWFRSQV9TVFVCX0xJQlJBUklFUyksICQobGliKS5zbykiCisJcm0gLWYgJEAuc3RlcDEKIAogJChjYWxsIGRlY2xhcmUtMXAtdGFyZ2V0LCQoU1lTVEVNX0xJTktFUl9DT05GSUcpLCkKICQoY2FsbCBkZWNsYXJlLWxpY2Vuc2UtZGVwcywkKFNZU1RFTV9MSU5LRVJfQ09ORklHKSwkKElOVEVSTkFMX1NZU1RFTUlNQUdFX0ZJTEVTKSAkKFNZU1RFTV9MSU5LRVJfQ09ORklHX1NPVVJDRSkpCkBAIC0zMjAxLDkgKzM1NDEsOCBAQAogLlBIT05ZOiBpbnN0YWxsZWQtZmlsZS1saXN0CiBpbnN0YWxsZWQtZmlsZS1saXN0OiAkKElOU1RBTExFRF9GSUxFU19GSUxFKQogCi1zeXN0ZW1pbWFnZV9pbnRlcm1lZGlhdGVzIDo9IFwKLSAgICAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxzeXN0ZW1pbWFnZSkKLUJVSUxUX1NZU1RFTUlNQUdFIDo9ICQoc3lzdGVtaW1hZ2VfaW50ZXJtZWRpYXRlcykvc3lzdGVtLmltZworc3lzdGVtaW1hZ2VfaW50ZXJtZWRpYXRlcyA6PSQ9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHN5c3RlbSkKK0JVSUxUX1NZU1RFTUlNQUdFIDo9JD0gJChzeXN0ZW1pbWFnZV9pbnRlcm1lZGlhdGVzKS9zeXN0ZW0uaW1nCiAKICMgJCgxKTogb3V0cHV0IGZpbGUKIGRlZmluZSBidWlsZC1zeXN0ZW1pbWFnZS10YXJnZXQKQEAgLTMyMTMsMTcgKzM1NTIsNjIgQEAKICAgICAgIHNraXBfZnNjaz10cnVlKQogICBQQVRIPSQoSU5URVJOQUxfVVNFUklNQUdFU19CSU5BUllfUEFUSFMpOiQkUEFUSCBcCiAgICAgICAkKEJVSUxEX0lNQUdFKSBcCisgICAgICAgICAgJChpZiAkKEJVSUxEX0JST0tFTl9JTkNPUlJFQ1RfUEFSVElUSU9OX0lNQUdFUyksLC0taW5wdXQtZGlyZWN0b3J5LWZpbHRlci1maWxlICQoc3lzdGVtaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dCkgXAogICAgICAgICAgICQoVEFSR0VUX09VVCkgJChzeXN0ZW1pbWFnZV9pbnRlcm1lZGlhdGVzKS9zeXN0ZW1faW1hZ2VfaW5mby50eHQgJCgxKSAkKFRBUkdFVF9PVVQpIFwKICAgICAgICAgICB8fCAoIG1rZGlyIC1wICQke0RJU1RfRElSfTsgXAogICAgICAgICAgICAgICAgY3AgJChJTlNUQUxMRURfRklMRVNfRklMRSkgJCR7RElTVF9ESVJ9L2luc3RhbGxlZC1maWxlcy1yZXNjdWVkLnR4dDsgXAogICAgICAgICAgICAgICAgZXhpdCAxICkKIGVuZGVmCiAKKyQoZXZhbCAkKGNhbGwgd3JpdGUtcGFydGl0aW9uLWZpbGUtbGlzdCwkKHN5c3RlbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQsJChUQVJHRVRfT1VUKSwkKEZVTExfU1lTVEVNSU1BR0VfREVQUykpKQorCitpZm5lcSAoJChQUk9EVUNUX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFKSwpCitmaWxlX2xpc3RfZGlmZiA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9maWxlX2xpc3RfZGlmZiQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKK3N5c3RlbV9maWxlX2RpZmZfdGltZXN0YW1wIDo9ICQoc3lzdGVtaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9kaWZmLnRpbWVzdGFtcAorCisjIFRoZSBidWlsZCBjb25maWd1cmF0aW9uIHRvIGJ1aWxkIHRoZSBSRUwgdmVyc2lvbiBtYXkgaGF2ZSBtb3JlIGZpbGVzIHRvIGFsbG93LgorIyBVc2UgYWxsb3dsaXN0X25leHQgaW4gYWRkaXRpb24gdG8gdGhlIGFsbG93bGlzdCBpbiB0aGlzIGNhc2UuCitzeXN0ZW1fZmlsZV9kaWZmX2FsbG93bGlzdF9uZXh0IDo9CitpZmVxIChSRUwsJChQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FKSkKK3N5c3RlbV9maWxlX2RpZmZfYWxsb3dsaXN0X25leHQgOj0gJChBTExfTU9EVUxFUy5zeXN0ZW1faW1hZ2VfZGlmZl9hbGxvd2xpc3RfbmV4dC5JTlNUQUxMRUQpCiskKHN5c3RlbV9maWxlX2RpZmZfdGltZXN0YW1wKTogUFJJVkFURV9BTExPV0xJU1RfTkVYVCA6PSAkKHN5c3RlbV9maWxlX2RpZmZfYWxsb3dsaXN0X25leHQpCitlbmRpZgorJChzeXN0ZW1fZmlsZV9kaWZmX3RpbWVzdGFtcCk6IFwKKwkgICAgJChzeXN0ZW1pbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0IFwKKwkgICAgJChBTExfTU9EVUxFUy4kKFBST0RVQ1RfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UpLkZJTEVTWVNURU1fRklMRUxJU1QpIFwKKwkgICAgJChBTExfTU9EVUxFUy5zeXN0ZW1faW1hZ2VfZGlmZl9hbGxvd2xpc3QuSU5TVEFMTEVEKSBcCisJICAgICQoc3lzdGVtX2ZpbGVfZGlmZl9hbGxvd2xpc3RfbmV4dCkgXAorCSAgICAkKGZpbGVfbGlzdF9kaWZmKQorCSQoZmlsZV9saXN0X2RpZmYpICQoc3lzdGVtaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dCBcCisJICAkKEFMTF9NT0RVTEVTLiQoUFJPRFVDVF9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSkuRklMRVNZU1RFTV9GSUxFTElTVCkgXAorCSAgJChQUk9EVUNUX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFKSBcCisJICAtLWFsbG93bGlzdHMgJChBTExfTU9EVUxFUy5zeXN0ZW1faW1hZ2VfZGlmZl9hbGxvd2xpc3QuSU5TVEFMTEVEKSBcCisJICAkKFBSSVZBVEVfQUxMT1dMSVNUX05FWFQpCisJdG91Y2ggJEAKKworJChCVUlMVF9TWVNURU1JTUFHRSk6ICQoc3lzdGVtX2ZpbGVfZGlmZl90aW1lc3RhbXApCitlbmRpZgorCisjIFVzZWQgYnkgc29vbmcgc2FuZHdpY2ggdG8gcmVxdWVzdCB0aGUgc3RhZ2luZyBkaXIgYmUgYnVpbHQKKyQoc3lzdGVtaW1hZ2VfaW50ZXJtZWRpYXRlcykvc3RhZ2luZ19kaXIuc3RhbXA6ICQoZmlsdGVyICQoVEFSR0VUX09VVCkvJSwkKEZVTExfU1lTVEVNSU1BR0VfREVQUykpCisJdG91Y2ggJEAKKwogaWZlcSAoJChCT0FSRF9BVkJfRU5BQkxFKSx0cnVlKQogJChCVUlMVF9TWVNURU1JTUFHRSk6ICQoQk9BUkRfQVZCX1NZU1RFTV9LRVlfUEFUSCkKIGVuZGlmCi0kKEJVSUxUX1NZU1RFTUlNQUdFKTogJChGVUxMX1NZU1RFTUlNQUdFX0RFUFMpICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEUpCisKK2lmZXEgKCQoVVNFX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFKSx0cnVlKQoraWZlcSAoJChQUk9EVUNUX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFKSwpCiskKGVycm9yIFBST0RVQ1RfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UgbXVzdCBiZSBzZXQgaWYgVVNFX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFIGlzIHRydWUpCitlbmRpZgorU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0VfUEFUSCA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEVUQywkKFBST0RVQ1RfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UpKS8kKFBST0RVQ1RfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UpCitTT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRV9CQVNFIDo9ICQoZGlyICQoQUxMX01PRFVMRVMuJChQUk9EVUNUX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFKS5GSUxFU1lTVEVNX0ZJTEVMSVNUKSkKKyQoQlVJTFRfU1lTVEVNSU1BR0UpOiAkKElOU1RBTExFRF9GSUxFU19GSUxFKSAkKHN5c3RlbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQgJChTT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRV9QQVRIKQorJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCAkKFNPT05HX0RFRklORURfU1lTVEVNX0lNQUdFX1BBVEgpLCAkKEJVSUxUX1NZU1RFTUlNQUdFKSkpCitlbHNlCiskKEJVSUxUX1NZU1RFTUlNQUdFKTogJChGVUxMX1NZU1RFTUlNQUdFX0RFUFMpICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEUpICQoc3lzdGVtaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dAogCSQoY2FsbCBidWlsZC1zeXN0ZW1pbWFnZS10YXJnZXQsJEApCitlbmRpZgogCiAkKGNhbGwgZGVjbGFyZS0xcC1jb250YWluZXIsJChCVUlMVF9TWVNURU1JTUFHRSksc3lzdGVtL2V4dHJhcykKICQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJChCVUlMVF9TWVNURU1JTUFHRSksJChGVUxMX1NZU1RFTUlNQUdFX0RFUFMpLCQoUFJPRFVDVF9PVVQpLzovKQpAQCAtMzI3OCw3ICszNjYyLDcgQEAKIAogLlBIT05ZOiBzeXN0ZW1pbWFnZS1ub2RlcHMgc25vZAogc3lzdGVtaW1hZ2Utbm9kZXBzIHNub2Q6ICQoZmlsdGVyLW91dCBzeXN0ZW1pbWFnZS1ub2RlcHMgc25vZCwkKE1BS0VDTURHT0FMUykpIFwKLQkgICAgICAgICAgICB8ICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKQorCSAgICAgICAgICAgIHwgJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpICQoc3lzdGVtaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dAogCUBlY2hvICJtYWtlICRAOiBpZ25vcmluZyBkZXBlbmRlbmNpZXMiCiAJJChjYWxsIGJ1aWxkLXN5c3RlbWltYWdlLXRhcmdldCwkKElOU1RBTExFRF9TWVNURU1JTUFHRV9UQVJHRVQpKQogCSQoaGlkZSkgJChjYWxsIGFzc2VydC1tYXgtaW1hZ2Utc2l6ZSwkKElOU1RBTExFRF9TWVNURU1JTUFHRV9UQVJHRVQpLCQoQk9BUkRfU1lTVEVNSU1BR0VfUEFSVElUSU9OX1NJWkUpKQpAQCAtMzI4OCw4ICszNjcyLDggQEAKIAogZW5kaWYgIyBCVUlMRElOR19TWVNURU1fSU1BR0UKIAotLlBIT05ZOiBzeW5jIHN5bmNzeXMKLXN5bmMgc3luY3N5czogJChJTlRFUk5BTF9TWVNURU1JTUFHRV9GSUxFUykKKy5QSE9OWTogc3luYyBzeW5jc3lzIHN5bmNfc3lzdGVtCitzeW5jIHN5bmNzeXMgc3luY19zeXN0ZW06ICQoSU5URVJOQUxfU1lTVEVNSU1BR0VfRklMRVMpCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgT2xkIFBESyBmdXNpb24gdGFyZ2V0cwpAQCAtMzMwNCwxMCArMzY4OCwxMCBAQAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBkYXRhIHBhcnRpdGlvbiBpbWFnZQogSU5TVEFMTEVEX0ZJTEVTX09VVFNJREVfSU1BR0VTIDo9ICQoZmlsdGVyLW91dCAkKFRBUkdFVF9PVVRfREFUQSkvJSwgJChJTlNUQUxMRURfRklMRVNfT1VUU0lERV9JTUFHRVMpKQoraWZkZWYgQlVJTERJTkdfVVNFUkRBVEFfSU1BR0UKIElOVEVSTkFMX1VTRVJEQVRBSU1BR0VfRklMRVMgOj0gXAogICAgICQoZmlsdGVyICQoVEFSR0VUX09VVF9EQVRBKS8lLCQoQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMpKQogCi1pZmRlZiBCVUlMRElOR19VU0VSREFUQV9JTUFHRQogdXNlcmRhdGFpbWFnZV9pbnRlcm1lZGlhdGVzIDo9IFwKICAgICAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyx1c2VyZGF0YSkKIEJVSUxUX1VTRVJEQVRBSU1BR0VfVEFSR0VUIDo9ICQoUFJPRFVDVF9PVVQpL3VzZXJkYXRhLmltZwpAQCAtMzMxOSw2ICszNzAzLDcgQEAKICAgJChjYWxsIGdlbmVyYXRlLWltYWdlLXByb3AtZGljdGlvbmFyeSwgJCh1c2VyZGF0YWltYWdlX2ludGVybWVkaWF0ZXMpL3VzZXJkYXRhX2ltYWdlX2luZm8udHh0LHVzZXJkYXRhLHNraXBfZnNjaz10cnVlKQogICBQQVRIPSQoSU5URVJOQUxfVVNFUklNQUdFU19CSU5BUllfUEFUSFMpOiQkUEFUSCBcCiAgICAgICAkKEJVSUxEX0lNQUdFKSBcCisgICAgICAgICAgJChpZiAkKEJVSUxEX0JST0tFTl9JTkNPUlJFQ1RfUEFSVElUSU9OX0lNQUdFUyksLC0taW5wdXQtZGlyZWN0b3J5LWZpbHRlci1maWxlICQodXNlcmRhdGFpbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0KSBcCiAgICAgICAgICAgJChUQVJHRVRfT1VUX0RBVEEpICQodXNlcmRhdGFpbWFnZV9pbnRlcm1lZGlhdGVzKS91c2VyZGF0YV9pbWFnZV9pbmZvLnR4dCBcCiAgICAgICAgICAgJChJTlNUQUxMRURfVVNFUkRBVEFJTUFHRV9UQVJHRVQpICQoVEFSR0VUX09VVCkKICAgJChjYWxsIGFzc2VydC1tYXgtaW1hZ2Utc2l6ZSwkKElOU1RBTExFRF9VU0VSREFUQUlNQUdFX1RBUkdFVCksJChCT0FSRF9VU0VSREFUQUlNQUdFX1BBUlRJVElPTl9TSVpFKSkKQEAgLTMzMjksNyArMzcxNCwxMyBAQAogSU5TVEFMTEVEX1VTRVJEQVRBSU1BR0VfVEFSR0VUX0RFUFMgOj0gXAogICAgICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKSBcCiAgICAgJChJTlRFUk5BTF9VU0VSREFUQUlNQUdFX0ZJTEVTKQotJChJTlNUQUxMRURfVVNFUkRBVEFJTUFHRV9UQVJHRVQpOiAkKElOU1RBTExFRF9VU0VSREFUQUlNQUdFX1RBUkdFVF9ERVBTKQorCiskKGV2YWwgJChjYWxsIHdyaXRlLXBhcnRpdGlvbi1maWxlLWxpc3QsJCh1c2VyZGF0YWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQsJChUQVJHRVRfT1VUX0RBVEEpLCQoSU5TVEFMTEVEX1VTRVJEQVRBSU1BR0VfVEFSR0VUX0RFUFMpKSkKKyMgVXNlZCBieSBzb29uZyBzYW5kd2ljaCB0byByZXF1ZXN0IHRoZSBzdGFnaW5nIGRpciBiZSBidWlsdAorJCh1c2VyZGF0YWltYWdlX2ludGVybWVkaWF0ZXMpL3N0YWdpbmdfZGlyLnN0YW1wOiAkKGZpbHRlciAkKFRBUkdFVF9PVVRfREFUQSkvJSwkKElOU1RBTExFRF9VU0VSREFUQUlNQUdFX1RBUkdFVF9ERVBTKSkKKwl0b3VjaCAkQAorCiskKElOU1RBTExFRF9VU0VSREFUQUlNQUdFX1RBUkdFVCk6ICQoSU5TVEFMTEVEX1VTRVJEQVRBSU1BR0VfVEFSR0VUX0RFUFMpICQodXNlcmRhdGFpbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0CiAJJChidWlsZC11c2VyZGF0YWltYWdlLXRhcmdldCkKIAogJChjYWxsIGRlY2xhcmUtMXAtY29udGFpbmVyLCQoSU5TVEFMTEVEX1VTRVJEQVRBSU1BR0VfVEFSR0VUKSwpCkBAIC0zMzM4LDcgKzM3MjksNyBAQAogVU5NT1VOVEVEX05PVElDRV9WRU5ET1JfREVQUys9ICQoSU5TVEFMTEVEX1VTRVJEQVRBSU1BR0VfVEFSR0VUKQogCiAuUEhPTlk6IHVzZXJkYXRhaW1hZ2Utbm9kZXBzCi11c2VyZGF0YWltYWdlLW5vZGVwczogfCAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykKK3VzZXJkYXRhaW1hZ2Utbm9kZXBzOiB8ICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKSAkKHVzZXJkYXRhaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dAogCSQoYnVpbGQtdXNlcmRhdGFpbWFnZS10YXJnZXQpCiAKIGVuZGlmICMgQlVJTERJTkdfVVNFUkRBVEFfSU1BR0UKQEAgLTMzNTcsNDUgKzM3NDgsNiBAQAogCXRhciBjZmogJChBU0FOX0lOX1NZU1RFTV9JTlNUQUxMRUQpICQoQVNBTl9TWVNURU1fSU5TVEFMTF9PUFRJT05TKSAtQyAkKFRBUkdFVF9PVVRfREFUQSkvLi4gJChBU0FOX09VVF9ESVJTX0ZPUl9TWVNURU1fSU5TVEFMTCkgPi9kZXYvbnVsbAogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIHBhcnRpdGlvbiB0YWJsZSBpbWFnZQotaWZkZWYgQk9BUkRfQlBUX0lOUFVUX0ZJTEVTCi0KLUJVSUxUX0JQVElNQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9wYXJ0aXRpb24tdGFibGUuaW1nCi1CVUlMVF9CUFRKU09OX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9wYXJ0aXRpb24tdGFibGUuYnB0Ci0KLUlOVEVSTkFMX0JWQlRPT0xfTUFLRV9UQUJMRV9BUkdTIDo9IFwKLQktLW91dHB1dF9ncHQgJChCVUlMVF9CUFRJTUFHRV9UQVJHRVQpIFwKLQktLW91dHB1dF9qc29uICQoQlVJTFRfQlBUSlNPTl9UQVJHRVQpIFwKLQkkKGZvcmVhY2ggZmlsZSwgJChCT0FSRF9CUFRfSU5QVVRfRklMRVMpLCAtLWlucHV0ICQoZmlsZSkpCi0KLWlmZGVmIEJPQVJEX0JQVF9ESVNLX1NJWkUKLUlOVEVSTkFMX0JWQlRPT0xfTUFLRV9UQUJMRV9BUkdTICs9IC0tZGlza19zaXplICQoQk9BUkRfQlBUX0RJU0tfU0laRSkKLWVuZGlmCi0KLWRlZmluZSBidWlsZC1icHRpbWFnZS10YXJnZXQKLSAgJChjYWxsIHByZXR0eSwiVGFyZ2V0IHBhcnRpdGlvbiB0YWJsZSBpbWFnZTogJChJTlNUQUxMRURfQlBUSU1BR0VfVEFSR0VUKSIpCi0gICQoaGlkZSkgJChCUFRUT09MKSBtYWtlX3RhYmxlICQoSU5URVJOQUxfQlZCVE9PTF9NQUtFX1RBQkxFX0FSR1MpICQoQk9BUkRfQlBUX01BS0VfVEFCTEVfQVJHUykKLWVuZGVmCi0KLUlOU1RBTExFRF9CUFRJTUFHRV9UQVJHRVQgOj0gJChCVUlMVF9CUFRJTUFHRV9UQVJHRVQpCi0kKEJVSUxUX0JQVEpTT05fVEFSR0VUKTogJChJTlNUQUxMRURfQlBUSU1BR0VfVEFSR0VUKQotCSQoaGlkZSkgdG91Y2ggLWMgJChCVUlMVF9CUFRKU09OX1RBUkdFVCkKLQotJChJTlNUQUxMRURfQlBUSU1BR0VfVEFSR0VUKTogJChCUFRUT09MKSAkKEJPQVJEX0JQVF9JTlBVVF9GSUxFUykKLQkkKGJ1aWxkLWJwdGltYWdlLXRhcmdldCkKLQotJChjYWxsIGRlY2xhcmUtMXAtY29udGFpbmVyLCQoSU5TVEFMTEVEX0JQVElNQUdFX1RBUkdFVCksKQotJChjYWxsIGRlY2xhcmUtY29udGFpbmVyLWxpY2Vuc2UtZGVwcywkKElOU1RBTExFRF9CUFRJTUFHRV9UQVJHRVQpLCQoQk9BUkRfQlBUX0lOUFVUX0ZJTEVTKSwkKFBST0RVQ1RfT1VUKS86LykKLQotVU5NT1VOVEVEX05PVElDRV9WRU5ET1JfREVQUys9ICQoSU5TVEFMTEVEX0JQVElNQUdFX1RBUkdFVCkKLQotLlBIT05ZOiBicHRpbWFnZS1ub2RlcHMKLWJwdGltYWdlLW5vZGVwczoKLQkkKGJ1aWxkLWJwdGltYWdlLXRhcmdldCkKLQotZW5kaWYgIyBCT0FSRF9CUFRfSU5QVVRfRklMRVMKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBjYWNoZSBwYXJ0aXRpb24gaW1hZ2UKIElOU1RBTExFRF9GSUxFU19PVVRTSURFX0lNQUdFUyA6PSAkKGZpbHRlci1vdXQgJChUQVJHRVRfT1VUX0NBQ0hFKS8lLCAkKElOU1RBTExFRF9GSUxFU19PVVRTSURFX0lNQUdFUykpCiBpZmRlZiBCVUlMRElOR19DQUNIRV9JTUFHRQpAQCAtMzQxMywxNCArMzc2NSwyMCBAQAogICAkKGNhbGwgZ2VuZXJhdGUtaW1hZ2UtcHJvcC1kaWN0aW9uYXJ5LCAkKGNhY2hlaW1hZ2VfaW50ZXJtZWRpYXRlcykvY2FjaGVfaW1hZ2VfaW5mby50eHQsY2FjaGUsc2tpcF9mc2NrPXRydWUpCiAgIFBBVEg9JChJTlRFUk5BTF9VU0VSSU1BR0VTX0JJTkFSWV9QQVRIUyk6JCRQQVRIIFwKICAgICAgICQoQlVJTERfSU1BR0UpIFwKKyAgICAgICAgICAkKGlmICQoQlVJTERfQlJPS0VOX0lOQ09SUkVDVF9QQVJUSVRJT05fSU1BR0VTKSwsLS1pbnB1dC1kaXJlY3RvcnktZmlsdGVyLWZpbGUgJChjYWNoZWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQpIFwKICAgICAgICAgICAkKFRBUkdFVF9PVVRfQ0FDSEUpICQoY2FjaGVpbWFnZV9pbnRlcm1lZGlhdGVzKS9jYWNoZV9pbWFnZV9pbmZvLnR4dCBcCiAgICAgICAgICAgJChJTlNUQUxMRURfQ0FDSEVJTUFHRV9UQVJHRVQpICQoVEFSR0VUX09VVCkKICAgJChjYWxsIGFzc2VydC1tYXgtaW1hZ2Utc2l6ZSwkKElOU1RBTExFRF9DQUNIRUlNQUdFX1RBUkdFVCksJChCT0FSRF9DQUNIRUlNQUdFX1BBUlRJVElPTl9TSVpFKSkKIGVuZGVmCiAKKyQoZXZhbCAkKGNhbGwgd3JpdGUtcGFydGl0aW9uLWZpbGUtbGlzdCwkKGNhY2hlaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dCwkKFRBUkdFVF9PVVRfQ0FDSEUpLCQoSU5URVJOQUxfQ0FDSEVJTUFHRV9GSUxFUykpKQorIyBVc2VkIGJ5IHNvb25nIHNhbmR3aWNoIHRvIHJlcXVlc3QgdGhlIHN0YWdpbmcgZGlyIGJlIGJ1aWx0CiskKGNhY2hlaW1hZ2VfaW50ZXJtZWRpYXRlcykvc3RhZ2luZ19kaXIuc3RhbXA6ICQoZmlsdGVyICQoVEFSR0VUX09VVF9DQUNIRSkvJSwkKElOVEVSTkFMX0NBQ0hFSU1BR0VfRklMRVMpKQorCXRvdWNoICRACisKICMgV2UganVzdCBidWlsZCB0aGlzIGRpcmVjdGx5IHRvIHRoZSBpbnN0YWxsIGxvY2F0aW9uLgogSU5TVEFMTEVEX0NBQ0hFSU1BR0VfVEFSR0VUIDo9ICQoQlVJTFRfQ0FDSEVJTUFHRV9UQVJHRVQpCi0kKElOU1RBTExFRF9DQUNIRUlNQUdFX1RBUkdFVCk6ICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKSAkKElOVEVSTkFMX0NBQ0hFSU1BR0VfRklMRVMpCiskKElOU1RBTExFRF9DQUNIRUlNQUdFX1RBUkdFVCk6ICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKSAkKElOVEVSTkFMX0NBQ0hFSU1BR0VfRklMRVMpICQoY2FjaGVpbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0CiAJJChidWlsZC1jYWNoZWltYWdlLXRhcmdldCkKIAogJChjYWxsIGRlY2xhcmUtMXAtY29udGFpbmVyLCQoSU5TVEFMTEVEX0NBQ0hFSU1BR0VfVEFSR0VUKSwpCkBAIC0zNDI5LDcgKzM3ODcsNyBAQAogVU5NT1VOVEVEX05PVElDRV9WRU5ET1JfREVQUys9ICQoSU5TVEFMTEVEX0NBQ0hFSU1BR0VfVEFSR0VUKQogCiAuUEhPTlk6IGNhY2hlaW1hZ2Utbm9kZXBzCi1jYWNoZWltYWdlLW5vZGVwczogfCAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykKK2NhY2hlaW1hZ2Utbm9kZXBzOiB8ICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKSAkKGNhY2hlaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dAogCSQoYnVpbGQtY2FjaGVpbWFnZS10YXJnZXQpCiAKIGVsc2UgIyBCVUlMRElOR19DQUNIRV9JTUFHRQpAQCAtMzQ5NCwxNiArMzg1MiwyMiBAQAogICAkKGNhbGwgZ2VuZXJhdGUtaW1hZ2UtcHJvcC1kaWN0aW9uYXJ5LCAkKHN5c3RlbW90aGVyaW1hZ2VfaW50ZXJtZWRpYXRlcykvc3lzdGVtX290aGVyX2ltYWdlX2luZm8udHh0LHN5c3RlbSxza2lwX2ZzY2s9dHJ1ZSkKICAgUEFUSD0kKElOVEVSTkFMX1VTRVJJTUFHRVNfQklOQVJZX1BBVEhTKTokJFBBVEggXAogICAgICAgJChCVUlMRF9JTUFHRSkgXAorICAgICAgICAgICQoaWYgJChCVUlMRF9CUk9LRU5fSU5DT1JSRUNUX1BBUlRJVElPTl9JTUFHRVMpLCwtLWlucHV0LWRpcmVjdG9yeS1maWx0ZXItZmlsZSAkKHN5c3RlbW90aGVyaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dCkgXAogICAgICAgICAgICQoVEFSR0VUX09VVF9TWVNURU1fT1RIRVIpICQoc3lzdGVtb3RoZXJpbWFnZV9pbnRlcm1lZGlhdGVzKS9zeXN0ZW1fb3RoZXJfaW1hZ2VfaW5mby50eHQgXAogICAgICAgICAgICQoSU5TVEFMTEVEX1NZU1RFTU9USEVSSU1BR0VfVEFSR0VUKSAkKFRBUkdFVF9PVVQpCiAgICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJChJTlNUQUxMRURfU1lTVEVNT1RIRVJJTUFHRV9UQVJHRVQpLCQoQk9BUkRfU1lTVEVNSU1BR0VfUEFSVElUSU9OX1NJWkUpKQogZW5kZWYKIAorJChldmFsICQoY2FsbCB3cml0ZS1wYXJ0aXRpb24tZmlsZS1saXN0LCQoc3lzdGVtb3RoZXJpbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0LCQoVEFSR0VUX09VVF9TWVNURU1fT1RIRVIpLCQoSU5URVJOQUxfU1lTVEVNT1RIRVJJTUFHRV9GSUxFUykpKQorIyBVc2VkIGJ5IHNvb25nIHNhbmR3aWNoIHRvIHJlcXVlc3QgdGhlIHN0YWdpbmcgZGlyIGJlIGJ1aWx0CiskKHN5c3RlbW90aGVyaW1hZ2VfaW50ZXJtZWRpYXRlcykvc3RhZ2luZ19kaXIuc3RhbXA6ICQoZmlsdGVyICQoVEFSR0VUX09VVF9TWVNURU1fT1RIRVIpLyUsJChJTlRFUk5BTF9TWVNURU1PVEhFUklNQUdFX0ZJTEVTKSkKKwl0b3VjaCAkQAorCiAjIFdlIGp1c3QgYnVpbGQgdGhpcyBkaXJlY3RseSB0byB0aGUgaW5zdGFsbCBsb2NhdGlvbi4KIElOU1RBTExFRF9TWVNURU1PVEhFUklNQUdFX1RBUkdFVCA6PSAkKEJVSUxUX1NZU1RFTU9USEVSSU1BR0VfVEFSR0VUKQogaWZuZXEgKHRydWUsJChTQU5JVElaRV9MSVRFKSkKICMgT25seSBjcmVhdGUgc3lzdGVtX290aGVyIHdoZW4gbm90IGJ1aWxkaW5nIHRoZSBzZWNvbmQgc3RhZ2Ugb2YgYSBTQU5JVElaRV9MSVRFIGJ1aWxkLgotJChJTlNUQUxMRURfU1lTVEVNT1RIRVJJTUFHRV9UQVJHRVQpOiAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykgJChJTlRFUk5BTF9TWVNURU1PVEhFUklNQUdFX0ZJTEVTKSAkKElOU1RBTExFRF9GSUxFU19GSUxFX1NZU1RFTU9USEVSKQorJChJTlNUQUxMRURfU1lTVEVNT1RIRVJJTUFHRV9UQVJHRVQpOiAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykgJChJTlRFUk5BTF9TWVNURU1PVEhFUklNQUdFX0ZJTEVTKSAkKElOU1RBTExFRF9GSUxFU19GSUxFX1NZU1RFTU9USEVSKSAkKHN5c3RlbW90aGVyaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dAogCSQoYnVpbGQtc3lzdGVtb3RoZXJpbWFnZS10YXJnZXQpCiAKICQoY2FsbCBkZWNsYXJlLTFwLWNvbnRhaW5lciwkKElOU1RBTExFRF9TWVNURU1PVEhFUklNQUdFX1RBUkdFVCksKQpAQCAtMzUxMyw3ICszODc3LDcgQEAKIGVuZGlmCiAKIC5QSE9OWTogc3lzdGVtb3RoZXJpbWFnZS1ub2RlcHMKLXN5c3RlbW90aGVyaW1hZ2Utbm9kZXBzOiB8ICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKQorc3lzdGVtb3RoZXJpbWFnZS1ub2RlcHM6IHwgJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpICQoc3lzdGVtb3RoZXJpbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0CiAJJChidWlsZC1zeXN0ZW1vdGhlcmltYWdlLXRhcmdldCkKIAogZW5kaWYgIyBCVUlMRElOR19TWVNURU1fT1RIRVJfSU1BR0UKQEAgLTM1NTUsNyArMzkxOSw3IEBACiAgIEFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTICs9ICQoX3ZlbmRvcl9kbGttX2xpYl9tb2R1bGVzX3N5bWxpbmspCiBlbmRpZgogCi0jIEluc3RhbGwgdmVuZG9yL2V0Yy9saW5rZXIuY29uZmlnLnBiIHdpdGggUFJPRFVDVF9WRU5ET1JfTElOS0VSX0NPTkZJR19GUkFHTUVOVFMgYW5kIFNUVUJfTElCUkFSSUVTCisjIEluc3RhbGwgdmVuZG9yL2V0Yy9saW5rZXIuY29uZmlnLnBiIHdpdGggUFJPRFVDVF9WRU5ET1JfTElOS0VSX0NPTkZJR19GUkFHTUVOVFMgYW5kIFNPT05HX1NUVUJfVkVORE9SX0xJQlJBUklFUwogdmVuZG9yX2xpbmtlcl9jb25maWdfZmlsZSA6PSAkKFRBUkdFVF9PVVRfVkVORE9SKS9ldGMvbGlua2VyLmNvbmZpZy5wYgogJCh2ZW5kb3JfbGlua2VyX2NvbmZpZ19maWxlKTogcHJpdmF0ZV9saW5rZXJfY29uZmlnX2ZyYWdtZW50cyA6PSAkKFBST0RVQ1RfVkVORE9SX0xJTktFUl9DT05GSUdfRlJBR01FTlRTKQogJCh2ZW5kb3JfbGlua2VyX2NvbmZpZ19maWxlKTogJChJTlRFUk5BTF9WRU5ET1JJTUFHRV9GSUxFUykgJChQUk9EVUNUX1ZFTkRPUl9MSU5LRVJfQ09ORklHX0ZSQUdNRU5UUykgfCAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9jb252X2xpbmtlcl9jb25maWcKQEAgLTM1NjYsNyArMzkzMCw3IEBACiAJCS0tc291cmNlICQoY2FsbCBub3JtYWxpemUtcGF0aC1saXN0LCQocHJpdmF0ZV9saW5rZXJfY29uZmlnX2ZyYWdtZW50cykpIFwKIAkJLS1vdXRwdXQgJEAKIAkkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9jb252X2xpbmtlcl9jb25maWcgc3lzdGVtcHJvdmlkZSAtLXNvdXJjZSAkQCBcCi0JCS0tb3V0cHV0ICRAIC0tdmFsdWUgIiQoU1RVQl9MSUJSQVJJRVMpIiAtLXN5c3RlbSAiJChUQVJHRVRfT1VUX1ZFTkRPUikiCisJCS0tb3V0cHV0ICRAIC0tdmFsdWUgIiQoU09PTkdfU1RVQl9WRU5ET1JfTElCUkFSSUVTKSIgLS1zeXN0ZW0gIiQoVEFSR0VUX09VVF9WRU5ET1IpIgogJChjYWxsIGRlZmluZSBkZWNsYXJlLTBwLXRhcmdldCwkKHZlbmRvcl9saW5rZXJfY29uZmlnX2ZpbGUpLCkKIElOVEVSTkFMX1ZFTkRPUklNQUdFX0ZJTEVTICs9ICQodmVuZG9yX2xpbmtlcl9jb25maWdfZmlsZSkKIEFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTICs9ICQodmVuZG9yX2xpbmtlcl9jb25maWdfZmlsZSkKQEAgLTM1OTQsMTggKzM5NTgsMjUgQEAKICAgJChjYWxsIGdlbmVyYXRlLWltYWdlLXByb3AtZGljdGlvbmFyeSwgJCh2ZW5kb3JpbWFnZV9pbnRlcm1lZGlhdGVzKS92ZW5kb3JfaW1hZ2VfaW5mby50eHQsdmVuZG9yLHNraXBfZnNjaz10cnVlKQogICBQQVRIPSQoSU5URVJOQUxfVVNFUklNQUdFU19CSU5BUllfUEFUSFMpOiQkUEFUSCBcCiAgICAgICAkKEJVSUxEX0lNQUdFKSBcCisgICAgICAgICAgJChpZiAkKEJVSUxEX0JST0tFTl9JTkNPUlJFQ1RfUEFSVElUSU9OX0lNQUdFUyksLC0taW5wdXQtZGlyZWN0b3J5LWZpbHRlci1maWxlICQodmVuZG9yaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dCkgXAogICAgICAgICAgICQoVEFSR0VUX09VVF9WRU5ET1IpICQodmVuZG9yaW1hZ2VfaW50ZXJtZWRpYXRlcykvdmVuZG9yX2ltYWdlX2luZm8udHh0IFwKICAgICAgICAgICAkKElOU1RBTExFRF9WRU5ET1JJTUFHRV9UQVJHRVQpICQoVEFSR0VUX09VVCkKICAgJChjYWxsIGFzc2VydC1tYXgtaW1hZ2Utc2l6ZSwkKElOU1RBTExFRF9WRU5ET1JJTUFHRV9UQVJHRVQpICQoUkVDT1ZFUllfRlJPTV9CT09UX1BBVENIKSwkKEJPQVJEX1ZFTkRPUklNQUdFX1BBUlRJVElPTl9TSVpFKSkKIGVuZGVmCiAKKyQoZXZhbCAkKGNhbGwgd3JpdGUtcGFydGl0aW9uLWZpbGUtbGlzdCwkKHZlbmRvcmltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQsJChUQVJHRVRfT1VUX1ZFTkRPUiksJChJTlRFUk5BTF9WRU5ET1JJTUFHRV9GSUxFUykpKQorIyBVc2VkIGJ5IHNvb25nIHNhbmR3aWNoIHRvIHJlcXVlc3QgdGhlIHN0YWdpbmcgZGlyIGJlIGJ1aWx0CiskKHZlbmRvcmltYWdlX2ludGVybWVkaWF0ZXMpL3N0YWdpbmdfZGlyLnN0YW1wOiAkKGZpbHRlciAkKFRBUkdFVF9PVVRfVkVORE9SKS8lLCQoSU5URVJOQUxfVkVORE9SSU1BR0VfRklMRVMpKQorCXRvdWNoICRACisKICMgV2UganVzdCBidWlsZCB0aGlzIGRpcmVjdGx5IHRvIHRoZSBpbnN0YWxsIGxvY2F0aW9uLgogSU5TVEFMTEVEX1ZFTkRPUklNQUdFX1RBUkdFVCA6PSAkKEJVSUxUX1ZFTkRPUklNQUdFX1RBUkdFVCkKICQoSU5TVEFMTEVEX1ZFTkRPUklNQUdFX1RBUkdFVCk6IFwKICAgICAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykgXAogICAgICQoSU5URVJOQUxfVkVORE9SSU1BR0VfRklMRVMpIFwKICAgICAkKElOU1RBTExFRF9GSUxFU19GSUxFX1ZFTkRPUikgXAotICAgICQoUkVDT1ZFUllfRlJPTV9CT09UX1BBVENIKQorICAgICQoUkVDT1ZFUllfRlJPTV9CT09UX1BBVENIKSBcCisgICAgJCh2ZW5kb3JpbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0CiAJJChidWlsZC12ZW5kb3JpbWFnZS10YXJnZXQpCiAKIFZFTkRPUl9OT1RJQ0VfREVQUyArPSAkKElOU1RBTExFRF9WRU5ET1JJTUFHRV9UQVJHRVQpCkBAIC0zNjE0LDEwICszOTg1LDExIEBACiAkKGNhbGwgZGVjbGFyZS1jb250YWluZXItbGljZW5zZS1kZXBzLCQoSU5TVEFMTEVEX1ZFTkRPUklNQUdFX1RBUkdFVCksJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpICQoSU5URVJOQUxfVkVORE9SSU1BR0VfRklMRVMpICQoUkVDT1ZFUllfRlJPTV9CT09UX1BBVEgpLCQoUFJPRFVDVF9PVVQpLzovKQogCiAuUEhPTlk6IHZlbmRvcmltYWdlLW5vZGVwcyB2bm9kCi12ZW5kb3JpbWFnZS1ub2RlcHMgdm5vZDogfCAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykKK3ZlbmRvcmltYWdlLW5vZGVwcyB2bm9kOiB8ICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKSAkKHZlbmRvcmltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQKIAkkKGJ1aWxkLXZlbmRvcmltYWdlLXRhcmdldCkKIAotc3luYzogJChJTlRFUk5BTF9WRU5ET1JJTUFHRV9GSUxFUykKKy5QSE9OWTogc3luY192ZW5kb3IKK3N5bmMgc3luY192ZW5kb3I6ICQoSU5URVJOQUxfVkVORE9SSU1BR0VfRklMRVMpCiAKIGVsc2UgaWZkZWYgQk9BUkRfUFJFQlVJTFRfVkVORE9SSU1BR0UKIElOU1RBTExFRF9WRU5ET1JJTUFHRV9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvdmVuZG9yLmltZwpAQCAtMzYzNiw2ICs0MDA4LDIxIEBACiAgICAgJChmaWx0ZXIgJChUQVJHRVRfT1VUX1BST0RVQ1QpLyUsXAogICAgICAgJChBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUykpCiAKKyMgSW5zdGFsbCBwcm9kdWN0L2V0Yy9saW5rZXIuY29uZmlnLnBiIHdpdGggUFJPRFVDVF9QUk9EVUNUX0xJTktFUl9DT05GSUdfRlJBR01FTlRTCitwcm9kdWN0X2xpbmtlcl9jb25maWdfZmlsZSA6PSAkKFRBUkdFVF9PVVRfUFJPRFVDVCkvZXRjL2xpbmtlci5jb25maWcucGIKKyQocHJvZHVjdF9saW5rZXJfY29uZmlnX2ZpbGUpOiBwcml2YXRlX2xpbmtlcl9jb25maWdfZnJhZ21lbnRzIDo9ICQoUFJPRFVDVF9QUk9EVUNUX0xJTktFUl9DT05GSUdfRlJBR01FTlRTKQorJChwcm9kdWN0X2xpbmtlcl9jb25maWdfZmlsZSk6ICQoSU5URVJOQUxfUFJPRFVDVElNQUdFX0ZJTEVTKSB8ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2NvbnZfbGlua2VyX2NvbmZpZworCUBlY2hvIENyZWF0aW5nIGxpbmtlciBjb25maWc6ICRACisJQG1rZGlyIC1wICQoZGlyICRAKQorCUBybSAtZiAkQAorCSQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2NvbnZfbGlua2VyX2NvbmZpZyBwcm90byBcCisJCS0tc291cmNlICQoY2FsbCBub3JtYWxpemUtcGF0aC1saXN0LCQocHJpdmF0ZV9saW5rZXJfY29uZmlnX2ZyYWdtZW50cykpIFwKKwkJLS1vdXRwdXQgJEAKKyQoY2FsbCBkZWZpbmUgZGVjbGFyZS0xcC10YXJnZXQsJChwcm9kdWN0X2xpbmtlcl9jb25maWdfZmlsZSksKQorSU5URVJOQUxfUFJPRFVDVElNQUdFX0ZJTEVTICs9ICQocHJvZHVjdF9saW5rZXJfY29uZmlnX2ZpbGUpCitBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKHByb2R1Y3RfbGlua2VyX2NvbmZpZ19maWxlKQorCisKIElOU1RBTExFRF9GSUxFU19GSUxFX1BST0RVQ1QgOj0gJChQUk9EVUNUX09VVCkvaW5zdGFsbGVkLWZpbGVzLXByb2R1Y3QudHh0CiBJTlNUQUxMRURfRklMRVNfSlNPTl9QUk9EVUNUIDo9ICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEVfUFJPRFVDVDoudHh0PS5qc29uKQogJChJTlNUQUxMRURfRklMRVNfRklMRV9QUk9EVUNUKTogLktBVElfSU1QTElDSVRfT1VUUFVUUyA6PSAkKElOU1RBTExFRF9GSUxFU19KU09OX1BST0RVQ1QpCkBAIC0zNjU5LDE3ICs0MDQ2LDI0IEBACiAgICQoY2FsbCBnZW5lcmF0ZS1pbWFnZS1wcm9wLWRpY3Rpb25hcnksICQocHJvZHVjdGltYWdlX2ludGVybWVkaWF0ZXMpL3Byb2R1Y3RfaW1hZ2VfaW5mby50eHQscHJvZHVjdCxza2lwX2ZzY2s9dHJ1ZSkKICAgUEFUSD0kKElOVEVSTkFMX1VTRVJJTUFHRVNfQklOQVJZX1BBVEhTKTokJFBBVEggXAogICAgICAgJChCVUlMRF9JTUFHRSkgXAorICAgICAgICAgICQoaWYgJChCVUlMRF9CUk9LRU5fSU5DT1JSRUNUX1BBUlRJVElPTl9JTUFHRVMpLCwtLWlucHV0LWRpcmVjdG9yeS1maWx0ZXItZmlsZSAkKHByb2R1Y3RpbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0KSBcCiAgICAgICAgICAgJChUQVJHRVRfT1VUX1BST0RVQ1QpICQocHJvZHVjdGltYWdlX2ludGVybWVkaWF0ZXMpL3Byb2R1Y3RfaW1hZ2VfaW5mby50eHQgXAogICAgICAgICAgICQoSU5TVEFMTEVEX1BST0RVQ1RJTUFHRV9UQVJHRVQpICQoVEFSR0VUX09VVCkKICAgJChjYWxsIGFzc2VydC1tYXgtaW1hZ2Utc2l6ZSwkKElOU1RBTExFRF9QUk9EVUNUSU1BR0VfVEFSR0VUKSwkKEJPQVJEX1BST0RVQ1RJTUFHRV9QQVJUSVRJT05fU0laRSkpCiBlbmRlZgogCiskKGV2YWwgJChjYWxsIHdyaXRlLXBhcnRpdGlvbi1maWxlLWxpc3QsJChwcm9kdWN0aW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dCwkKFRBUkdFVF9PVVRfUFJPRFVDVCksJChJTlRFUk5BTF9QUk9EVUNUSU1BR0VfRklMRVMpKSkKKyMgVXNlZCBieSBzb29uZyBzYW5kd2ljaCB0byByZXF1ZXN0IHRoZSBzdGFnaW5nIGRpciBiZSBidWlsdAorJChwcm9kdWN0aW1hZ2VfaW50ZXJtZWRpYXRlcykvc3RhZ2luZ19kaXIuc3RhbXA6ICQoZmlsdGVyICQoVEFSR0VUX09VVF9QUk9EVUNUKS8lLCQoSU5URVJOQUxfUFJPRFVDVElNQUdFX0ZJTEVTKSkKKwl0b3VjaCAkQAorCiAjIFdlIGp1c3QgYnVpbGQgdGhpcyBkaXJlY3RseSB0byB0aGUgaW5zdGFsbCBsb2NhdGlvbi4KIElOU1RBTExFRF9QUk9EVUNUSU1BR0VfVEFSR0VUIDo9ICQoQlVJTFRfUFJPRFVDVElNQUdFX1RBUkdFVCkKICQoSU5TVEFMTEVEX1BST0RVQ1RJTUFHRV9UQVJHRVQpOiBcCiAgICAgJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpIFwKICAgICAkKElOVEVSTkFMX1BST0RVQ1RJTUFHRV9GSUxFUykgXAotICAgICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEVfUFJPRFVDVCkKKyAgICAkKElOU1RBTExFRF9GSUxFU19GSUxFX1BST0RVQ1QpIFwKKyAgICAkKHByb2R1Y3RpbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0CiAJJChidWlsZC1wcm9kdWN0aW1hZ2UtdGFyZ2V0KQogCiBQUk9EVUNUX05PVElDRV9ERVBTICs9ICQoSU5TVEFMTEVEX1BST0RVQ1RJTUFHRV9UQVJHRVQpCkBAIC0zNjc4LDEwICs0MDcyLDExIEBACiAkKGNhbGwgZGVjbGFyZS1jb250YWluZXItbGljZW5zZS1kZXBzLCQoSU5TVEFMTEVEX1BST0RVQ1RJTUFHRV9UQVJHRVQpLCQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKSAkKElOVEVSTkFMX1BST0RVQ1RJTUFHRV9GSUxFUykgJChJTlNUQUxMRURfRklMRVNfRklMRV9QUk9EVUNUKSwkKFBST0RVQ1RfT1VUKS86LykKIAogLlBIT05ZOiBwcm9kdWN0aW1hZ2Utbm9kZXBzIHBub2QKLXByb2R1Y3RpbWFnZS1ub2RlcHMgcG5vZDogfCAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykKK3Byb2R1Y3RpbWFnZS1ub2RlcHMgcG5vZDogfCAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykgJChwcm9kdWN0aW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dAogCSQoYnVpbGQtcHJvZHVjdGltYWdlLXRhcmdldCkKIAotc3luYzogJChJTlRFUk5BTF9QUk9EVUNUSU1BR0VfRklMRVMpCisuUEhPTlk6IHN5bmNfcHJvZHVjdAorc3luYyBzeW5jX3Byb2R1Y3Q6ICQoSU5URVJOQUxfUFJPRFVDVElNQUdFX0ZJTEVTKQogCiBlbHNlIGlmZGVmIEJPQVJEX1BSRUJVSUxUX1BST0RVQ1RJTUFHRQogSU5TVEFMTEVEX1BST0RVQ1RJTUFHRV9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvcHJvZHVjdC5pbWcKQEAgLTM3MTksNiArNDExNCw3IEBACiAgICQoY2FsbCBnZW5lcmF0ZS1pbWFnZS1wcm9wLWRpY3Rpb25hcnksICQoc3lzdGVtX2V4dGltYWdlX2ludGVybWVkaWF0ZXMpL3N5c3RlbV9leHRfaW1hZ2VfaW5mby50eHQsc3lzdGVtX2V4dCwgc2tpcF9mc2NrPXRydWUpCiAgIFBBVEg9JChJTlRFUk5BTF9VU0VSSU1BR0VTX0JJTkFSWV9QQVRIUyk6JCRQQVRIIFwKICAgICAgICQoQlVJTERfSU1BR0UpIFwKKyAgICAgICAgICAkKGlmICQoQlVJTERfQlJPS0VOX0lOQ09SUkVDVF9QQVJUSVRJT05fSU1BR0VTKSwsLS1pbnB1dC1kaXJlY3RvcnktZmlsdGVyLWZpbGUgJChzeXN0ZW1fZXh0aW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dCkgXAogICAgICAgICAgICQoVEFSR0VUX09VVF9TWVNURU1fRVhUKSBcCiAgICAgICAgICAgJChzeXN0ZW1fZXh0aW1hZ2VfaW50ZXJtZWRpYXRlcykvc3lzdGVtX2V4dF9pbWFnZV9pbmZvLnR4dCBcCiAgICAgICAgICAgJChJTlNUQUxMRURfU1lTVEVNX0VYVElNQUdFX1RBUkdFVCkgXApAQCAtMzcyNiwxMiArNDEyMiwxOCBAQAogICAkKGNhbGwgYXNzZXJ0LW1heC1pbWFnZS1zaXplLCQoSU5TVEFMTEVEX1BST0RVQ1RfU0VSVklDRVNJTUFHRV9UQVJHRVQpLCQoQk9BUkRfUFJPRFVDVF9TRVJWSUNFU0lNQUdFX1BBUlRJVElPTl9TSVpFKSkKIGVuZGVmCiAKKyQoZXZhbCAkKGNhbGwgd3JpdGUtcGFydGl0aW9uLWZpbGUtbGlzdCwkKHN5c3RlbV9leHRpbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0LCQoVEFSR0VUX09VVF9TWVNURU1fRVhUKSwkKElOVEVSTkFMX1NZU1RFTV9FWFRJTUFHRV9GSUxFUykpKQorIyBVc2VkIGJ5IHNvb25nIHNhbmR3aWNoIHRvIHJlcXVlc3QgdGhlIHN0YWdpbmcgZGlyIGJlIGJ1aWx0CiskKHN5c3RlbV9leHRpbWFnZV9pbnRlcm1lZGlhdGVzKS9zdGFnaW5nX2Rpci5zdGFtcDogJChmaWx0ZXIgJChUQVJHRVRfT1VUX1NZU1RFTV9FWFQpLyUsJChJTlRFUk5BTF9TWVNURU1fRVhUSU1BR0VfRklMRVMpKQorCXRvdWNoICRACisKICMgV2UganVzdCBidWlsZCB0aGlzIGRpcmVjdGx5IHRvIHRoZSBpbnN0YWxsIGxvY2F0aW9uLgogSU5TVEFMTEVEX1NZU1RFTV9FWFRJTUFHRV9UQVJHRVQgOj0gJChCVUlMVF9TWVNURU1fRVhUSU1BR0VfVEFSR0VUKQogJChJTlNUQUxMRURfU1lTVEVNX0VYVElNQUdFX1RBUkdFVCk6IFwKICAgICAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykgXAogICAgICQoSU5URVJOQUxfU1lTVEVNX0VYVElNQUdFX0ZJTEVTKSBcCi0gICAgJChJTlNUQUxMRURfRklMRVNfRklMRV9TWVNURU1fRVhUKQorICAgICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEVfU1lTVEVNX0VYVCkgXAorICAgICQoc3lzdGVtX2V4dGltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQKIAkkKGJ1aWxkLXN5c3RlbV9leHRpbWFnZS10YXJnZXQpCiAKIFNZU1RFTV9FWFRfTk9USUNFX0RFUFMgKz0gJChJTlNUQUxMRURfU1lTVEVNX0VYVElNQUdFX1RBUkdFVCkKQEAgLTM3NDAsMTAgKzQxNDIsMTEgQEAKICQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJChJTlNUQUxMRURfU1lTVEVNX0VYVElNQUdFX1RBUkdFVCksJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpICQoSU5URVJOQUxfU1lTVEVNX0VYVElNQUdFX0ZJTEVTKSAkKElOU1RBTExFRF9GSUxFU19GSUxFX1NZU1RFTV9FWFQpLCQoUFJPRFVDVF9PVVQpLzovKQogCiAuUEhPTlk6IHN5c3RlbWV4dGltYWdlLW5vZGVwcyBzZW5vZAotc3lzdGVtZXh0aW1hZ2Utbm9kZXBzIHNlbm9kOiB8ICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKQorc3lzdGVtZXh0aW1hZ2Utbm9kZXBzIHNlbm9kOiB8ICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKSAkKHN5c3RlbV9leHRpbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0CiAJJChidWlsZC1zeXN0ZW1fZXh0aW1hZ2UtdGFyZ2V0KQogCi1zeW5jOiAkKElOVEVSTkFMX1NZU1RFTV9FWFRJTUFHRV9GSUxFUykKKy5QSE9OWTogc3luY19zeXN0ZW1fZXh0CitzeW5jIHN5bmNfc3lzdGVtX2V4dDogJChJTlRFUk5BTF9TWVNURU1fRVhUSU1BR0VfRklMRVMpCiAKIGVsc2UgaWZkZWYgQk9BUkRfUFJFQlVJTFRfU1lTVEVNX0VYVElNQUdFCiBJTlNUQUxMRURfU1lTVEVNX0VYVElNQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9zeXN0ZW1fZXh0LmltZwpAQCAtMzgwMiwxNyArNDIwNSwyNCBAQAogCSAgc2tpcF9mc2NrPXRydWUpCiAgIFBBVEg9JChJTlRFUk5BTF9VU0VSSU1BR0VTX0JJTkFSWV9QQVRIUyk6JCRQQVRIIFwKICAgICAgICQoQlVJTERfSU1BR0UpIFwKKyAgICAgICAgICAkKGlmICQoQlVJTERfQlJPS0VOX0lOQ09SUkVDVF9QQVJUSVRJT05fSU1BR0VTKSwsLS1pbnB1dC1kaXJlY3RvcnktZmlsdGVyLWZpbGUgJChvZG1pbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0KSBcCiAgICAgICAgICAgJChUQVJHRVRfT1VUX09ETSkgJChvZG1pbWFnZV9pbnRlcm1lZGlhdGVzKS9vZG1faW1hZ2VfaW5mby50eHQgXAogICAgICAgICAgICQoSU5TVEFMTEVEX09ETUlNQUdFX1RBUkdFVCkgJChUQVJHRVRfT1VUKQogICAkKGNhbGwgYXNzZXJ0LW1heC1pbWFnZS1zaXplLCQoSU5TVEFMTEVEX09ETUlNQUdFX1RBUkdFVCksJChCT0FSRF9PRE1JTUFHRV9QQVJUSVRJT05fU0laRSkpCiBlbmRlZgogCiskKGV2YWwgJChjYWxsIHdyaXRlLXBhcnRpdGlvbi1maWxlLWxpc3QsJChvZG1pbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0LCQoVEFSR0VUX09VVF9PRE0pLCQoSU5URVJOQUxfT0RNSU1BR0VfRklMRVMpKSkKKyMgVXNlZCBieSBzb29uZyBzYW5kd2ljaCB0byByZXF1ZXN0IHRoZSBzdGFnaW5nIGRpciBiZSBidWlsdAorJChvZG1pbWFnZV9pbnRlcm1lZGlhdGVzKS9zdGFnaW5nX2Rpci5zdGFtcDogJChmaWx0ZXIgJChUQVJHRVRfT1VUX09ETSkvJSwkKElOVEVSTkFMX09ETUlNQUdFX0ZJTEVTKSkKKwl0b3VjaCAkQAorCiAjIFdlIGp1c3QgYnVpbGQgdGhpcyBkaXJlY3RseSB0byB0aGUgaW5zdGFsbCBsb2NhdGlvbi4KIElOU1RBTExFRF9PRE1JTUFHRV9UQVJHRVQgOj0gJChCVUlMVF9PRE1JTUFHRV9UQVJHRVQpCiAkKElOU1RBTExFRF9PRE1JTUFHRV9UQVJHRVQpOiBcCiAgICAgJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpIFwKICAgICAkKElOVEVSTkFMX09ETUlNQUdFX0ZJTEVTKSBcCi0gICAgJChJTlNUQUxMRURfRklMRVNfRklMRV9PRE0pCisgICAgJChJTlNUQUxMRURfRklMRVNfRklMRV9PRE0pIFwKKyAgICAkKG9kbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQKIAkkKGJ1aWxkLW9kbWltYWdlLXRhcmdldCkKIAogT0RNX05PVElDRV9ERVBTICs9ICQoSU5TVEFMTEVEX09ETUlNQUdFX1RBUkdFVCkKQEAgLTM4MjEsMTAgKzQyMzEsMTEgQEAKICQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJChJTlNUQUxMRURfT0RNSU1BR0VfVEFSR0VUKSwkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykgJChJTlRFUk5BTF9PRE1JTUFHRV9GSUxFUykgJChJTlNUQUxMRURfRklMRVNfRklMRV9PRE0pLCQoUFJPRFVDVF9PVVQpLzovKQogCiAuUEhPTlk6IG9kbWltYWdlLW5vZGVwcyBvbm9kCi1vZG1pbWFnZS1ub2RlcHMgb25vZDogfCAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykKK29kbWltYWdlLW5vZGVwcyBvbm9kOiB8ICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKSAkKG9kbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQKIAkkKGJ1aWxkLW9kbWltYWdlLXRhcmdldCkKIAotc3luYzogJChJTlRFUk5BTF9PRE1JTUFHRV9GSUxFUykKKy5QSE9OWTogc3luY19vZG0KK3N5bmMgc3luY19vZG06ICQoSU5URVJOQUxfT0RNSU1BR0VfRklMRVMpCiAKIGVsc2UgaWZkZWYgQk9BUkRfUFJFQlVJTFRfT0RNSU1BR0UKIElOU1RBTExFRF9PRE1JTUFHRV9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvb2RtLmltZwpAQCAtMzg2MywxNyArNDI3NCwyNCBAQAogCSAgdmVuZG9yX2Rsa20sIHNraXBfZnNjaz10cnVlKQogICBQQVRIPSQoSU5URVJOQUxfVVNFUklNQUdFU19CSU5BUllfUEFUSFMpOiQkUEFUSCBcCiAgICAgICAkKEJVSUxEX0lNQUdFKSBcCisgICAgICAgICAgJChpZiAkKEJVSUxEX0JST0tFTl9JTkNPUlJFQ1RfUEFSVElUSU9OX0lNQUdFUyksLC0taW5wdXQtZGlyZWN0b3J5LWZpbHRlci1maWxlICQodmVuZG9yX2Rsa21pbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0KSBcCiAgICAgICAgICAgJChUQVJHRVRfT1VUX1ZFTkRPUl9ETEtNKSAkKHZlbmRvcl9kbGttaW1hZ2VfaW50ZXJtZWRpYXRlcykvdmVuZG9yX2Rsa21faW1hZ2VfaW5mby50eHQgXAogICAgICAgICAgICQoSU5TVEFMTEVEX1ZFTkRPUl9ETEtNSU1BR0VfVEFSR0VUKSAkKFRBUkdFVF9PVVQpCiAgICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJChJTlNUQUxMRURfVkVORE9SX0RMS01JTUFHRV9UQVJHRVQpLCQoQk9BUkRfVkVORE9SX0RMS01JTUFHRV9QQVJUSVRJT05fU0laRSkpCiBlbmRlZgogCiskKGV2YWwgJChjYWxsIHdyaXRlLXBhcnRpdGlvbi1maWxlLWxpc3QsJCh2ZW5kb3JfZGxrbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQsJChUQVJHRVRfT1VUX1ZFTkRPUl9ETEtNKSwkKElOVEVSTkFMX1ZFTkRPUl9ETEtNSU1BR0VfRklMRVMpKSkKKyMgVXNlZCBieSBzb29uZyBzYW5kd2ljaCB0byByZXF1ZXN0IHRoZSBzdGFnaW5nIGRpciBiZSBidWlsdAorJCh2ZW5kb3JfZGxrbWltYWdlX2ludGVybWVkaWF0ZXMpL3N0YWdpbmdfZGlyLnN0YW1wOiAkKGZpbHRlciAkKFRBUkdFVF9PVVRfVkVORE9SX0RMS00pLyUsJChJTlRFUk5BTF9WRU5ET1JfRExLTUlNQUdFX0ZJTEVTKSkKKwl0b3VjaCAkQAorCiAjIFdlIGp1c3QgYnVpbGQgdGhpcyBkaXJlY3RseSB0byB0aGUgaW5zdGFsbCBsb2NhdGlvbi4KIElOU1RBTExFRF9WRU5ET1JfRExLTUlNQUdFX1RBUkdFVCA6PSAkKEJVSUxUX1ZFTkRPUl9ETEtNSU1BR0VfVEFSR0VUKQogJChJTlNUQUxMRURfVkVORE9SX0RMS01JTUFHRV9UQVJHRVQpOiBcCiAgICAgJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpIFwKICAgICAkKElOVEVSTkFMX1ZFTkRPUl9ETEtNSU1BR0VfRklMRVMpIFwKLSAgICAkKElOU1RBTExFRF9GSUxFU19GSUxFX1ZFTkRPUl9ETEtNKQorICAgICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEVfVkVORE9SX0RMS00pIFwKKyAgICAkKHZlbmRvcl9kbGttaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dAogCSQoYnVpbGQtdmVuZG9yX2Rsa21pbWFnZS10YXJnZXQpCiAKIFZFTkRPUl9ETEtNX05PVElDRV9ERVBTICs9ICQoSU5TVEFMTEVEX1ZFTkRPUl9ETEtNSU1BR0VfVEFSR0VUKQpAQCAtMzg4MiwxMCArNDMwMCwxMSBAQAogJChjYWxsIGRlY2xhcmUtY29udGFpbmVyLWxpY2Vuc2UtZGVwcywkKElOU1RBTExFRF9WRU5ET1JfRExLTUlNQUdFX1RBUkdFVCksJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpICQoSU5URVJOQUxfVkVORE9SX0RMS01JTUFHRV9GSUxFUykgJChJTlNUQUxMRURfRklMRVNfRklMRV9WRU5ET1JfRExLTSksJChQUk9EVUNUX09VVCkvOi8pCiAKIC5QSE9OWTogdmVuZG9yX2Rsa21pbWFnZS1ub2RlcHMgdmRub2QKLXZlbmRvcl9kbGttaW1hZ2Utbm9kZXBzIHZkbm9kOiB8ICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKQordmVuZG9yX2Rsa21pbWFnZS1ub2RlcHMgdmRub2Q6IHwgJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpICQodmVuZG9yX2Rsa21pbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0CiAJJChidWlsZC12ZW5kb3JfZGxrbWltYWdlLXRhcmdldCkKIAotc3luYzogJChJTlRFUk5BTF9WRU5ET1JfRExLTUlNQUdFX0ZJTEVTKQorLlBIT05ZOiBzeW5jX3ZlbmRvcl9kbGttCitzeW5jIHN5bmNfdmVuZG9yX2Rsa206ICQoSU5URVJOQUxfVkVORE9SX0RMS01JTUFHRV9GSUxFUykKIAogZWxzZSBpZmRlZiBCT0FSRF9QUkVCVUlMVF9WRU5ET1JfRExLTUlNQUdFCiBJTlNUQUxMRURfVkVORE9SX0RMS01JTUFHRV9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvdmVuZG9yX2Rsa20uaW1nCkBAIC0zOTI0LDE3ICs0MzQzLDI0IEBACiAJICBvZG1fZGxrbSwgc2tpcF9mc2NrPXRydWUpCiAgIFBBVEg9JChJTlRFUk5BTF9VU0VSSU1BR0VTX0JJTkFSWV9QQVRIUyk6JCRQQVRIIFwKICAgICAgICQoQlVJTERfSU1BR0UpIFwKKyAgICAgICAgICAkKGlmICQoQlVJTERfQlJPS0VOX0lOQ09SUkVDVF9QQVJUSVRJT05fSU1BR0VTKSwsLS1pbnB1dC1kaXJlY3RvcnktZmlsdGVyLWZpbGUgJChvZG1fZGxrbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQpIFwKICAgICAgICAgICAkKFRBUkdFVF9PVVRfT0RNX0RMS00pICQob2RtX2Rsa21pbWFnZV9pbnRlcm1lZGlhdGVzKS9vZG1fZGxrbV9pbWFnZV9pbmZvLnR4dCBcCiAgICAgICAgICAgJChJTlNUQUxMRURfT0RNX0RMS01JTUFHRV9UQVJHRVQpICQoVEFSR0VUX09VVCkKICAgJChjYWxsIGFzc2VydC1tYXgtaW1hZ2Utc2l6ZSwkKElOU1RBTExFRF9PRE1fRExLTUlNQUdFX1RBUkdFVCksJChCT0FSRF9PRE1fRExLTUlNQUdFX1BBUlRJVElPTl9TSVpFKSkKIGVuZGVmCiAKKyQoZXZhbCAkKGNhbGwgd3JpdGUtcGFydGl0aW9uLWZpbGUtbGlzdCwkKG9kbV9kbGttaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dCwkKFRBUkdFVF9PVVRfT0RNX0RMS00pLCQoSU5URVJOQUxfT0RNX0RMS01JTUFHRV9GSUxFUykpKQorIyBVc2VkIGJ5IHNvb25nIHNhbmR3aWNoIHRvIHJlcXVlc3QgdGhlIHN0YWdpbmcgZGlyIGJlIGJ1aWx0CiskKG9kbV9kbGttaW1hZ2VfaW50ZXJtZWRpYXRlcykvc3RhZ2luZ19kaXIuc3RhbXA6ICQoZmlsdGVyICQoVEFSR0VUX09VVF9PRE1fRExLTSkvJSwkKElOVEVSTkFMX09ETV9ETEtNSU1BR0VfRklMRVMpKQorCXRvdWNoICRACisKICMgV2UganVzdCBidWlsZCB0aGlzIGRpcmVjdGx5IHRvIHRoZSBpbnN0YWxsIGxvY2F0aW9uLgogSU5TVEFMTEVEX09ETV9ETEtNSU1BR0VfVEFSR0VUIDo9ICQoQlVJTFRfT0RNX0RMS01JTUFHRV9UQVJHRVQpCiAkKElOU1RBTExFRF9PRE1fRExLTUlNQUdFX1RBUkdFVCk6IFwKICAgICAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykgXAogICAgICQoSU5URVJOQUxfT0RNX0RMS01JTUFHRV9GSUxFUykgXAotICAgICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEVfT0RNX0RMS00pCisgICAgJChJTlNUQUxMRURfRklMRVNfRklMRV9PRE1fRExLTSkgXAorICAgICQob2RtX2Rsa21pbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0CiAJJChidWlsZC1vZG1fZGxrbWltYWdlLXRhcmdldCkKIAogT0RNX0RMS01fTk9USUNFX0RFUFMgKz0gJChJTlNUQUxMRURfT0RNX0RMS01JTUFHRV9UQVJHRVQpCkBAIC0zOTQzLDEwICs0MzY5LDExIEBACiAkKGNhbGwgZGVjbGFyZS1jb250YWluZXItbGljZW5zZS1kZXBzLCQoSU5TVEFMTEVEX09ETV9ETEtNSU1BR0VfVEFSR0VUKSwkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykgJChJTlRFUk5BTF9PRE1fRExLTUlNQUdFX0ZJTEVTKSAkKElOU1RBTExFRF9GSUxFU19GSUxFX09ETV9ETEtNKSwkKFBST0RVQ1RfT1VUKS86LykKIAogLlBIT05ZOiBvZG1fZGxrbWltYWdlLW5vZGVwcyBvZG5vZAotb2RtX2Rsa21pbWFnZS1ub2RlcHMgb2Rub2Q6IHwgJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpCitvZG1fZGxrbWltYWdlLW5vZGVwcyBvZG5vZDogfCAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykgJChvZG1fZGxrbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQKIAkkKGJ1aWxkLW9kbV9kbGttaW1hZ2UtdGFyZ2V0KQogCi1zeW5jOiAkKElOVEVSTkFMX09ETV9ETEtNSU1BR0VfRklMRVMpCisuUEhPTlk6IHN5bmNfb2RtX2Rsa20KK3N5bmMgc3luY19vZG1fZGxrbTogJChJTlRFUk5BTF9PRE1fRExLTUlNQUdFX0ZJTEVTKQogCiBlbHNlIGlmZGVmIEJPQVJEX1BSRUJVSUxUX09ETV9ETEtNSU1BR0UKIElOU1RBTExFRF9PRE1fRExLTUlNQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9vZG1fZGxrbS5pbWcKQEAgLTM5ODcsMTcgKzQ0MTQsMjQgQEAKIAkgIHN5c3RlbV9kbGttLCBza2lwX2ZzY2s9dHJ1ZSkKICAgUEFUSD0kKElOVEVSTkFMX1VTRVJJTUFHRVNfQklOQVJZX1BBVEhTKTokJFBBVEggXAogICAgICAgJChCVUlMRF9JTUFHRSkgXAorICAgICAgICAgICQoaWYgJChCVUlMRF9CUk9LRU5fSU5DT1JSRUNUX1BBUlRJVElPTl9JTUFHRVMpLCwtLWlucHV0LWRpcmVjdG9yeS1maWx0ZXItZmlsZSAkKHN5c3RlbV9kbGttaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dCkgXAogICAgICAgICAgICQoVEFSR0VUX09VVF9TWVNURU1fRExLTSkgJChzeXN0ZW1fZGxrbWltYWdlX2ludGVybWVkaWF0ZXMpL3N5c3RlbV9kbGttX2ltYWdlX2luZm8udHh0IFwKICAgICAgICAgICAkKElOU1RBTExFRF9TWVNURU1fRExLTUlNQUdFX1RBUkdFVCkgJChUQVJHRVRfT1VUKQogICAkKGNhbGwgYXNzZXJ0LW1heC1pbWFnZS1zaXplLCQoSU5TVEFMTEVEX1NZU1RFTV9ETEtNSU1BR0VfVEFSR0VUKSwkKEJPQVJEX1NZU1RFTV9ETEtNSU1BR0VfUEFSVElUSU9OX1NJWkUpKQogZW5kZWYKIAorJChldmFsICQoY2FsbCB3cml0ZS1wYXJ0aXRpb24tZmlsZS1saXN0LCQoc3lzdGVtX2Rsa21pbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0LCQoVEFSR0VUX09VVF9TWVNURU1fRExLTSksJChJTlRFUk5BTF9TWVNURU1fRExLTUlNQUdFX0ZJTEVTKSkpCisjIFVzZWQgYnkgc29vbmcgc2FuZHdpY2ggdG8gcmVxdWVzdCB0aGUgc3RhZ2luZyBkaXIgYmUgYnVpbHQKKyQoc3lzdGVtX2Rsa21pbWFnZV9pbnRlcm1lZGlhdGVzKS9zdGFnaW5nX2Rpci5zdGFtcDogJChmaWx0ZXIgJChUQVJHRVRfT1VUX1NZU1RFTV9ETEtNKS8lLCQoSU5URVJOQUxfU1lTVEVNX0RMS01JTUFHRV9GSUxFUykpCisJdG91Y2ggJEAKKwogIyBXZSBqdXN0IGJ1aWxkIHRoaXMgZGlyZWN0bHkgdG8gdGhlIGluc3RhbGwgbG9jYXRpb24uCiBJTlNUQUxMRURfU1lTVEVNX0RMS01JTUFHRV9UQVJHRVQgOj0gJChCVUlMVF9TWVNURU1fRExLTUlNQUdFX1RBUkdFVCkKICQoSU5TVEFMTEVEX1NZU1RFTV9ETEtNSU1BR0VfVEFSR0VUKTogXAogICAgICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKSBcCiAgICAgJChJTlRFUk5BTF9TWVNURU1fRExLTUlNQUdFX0ZJTEVTKSBcCi0gICAgJChJTlNUQUxMRURfRklMRVNfRklMRV9TWVNURU1fRExLTSkKKyAgICAkKElOU1RBTExFRF9GSUxFU19GSUxFX1NZU1RFTV9ETEtNKSBcCisgICAgJChzeXN0ZW1fZGxrbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQKIAkkKGJ1aWxkLXN5c3RlbV9kbGttaW1hZ2UtdGFyZ2V0KQogCiBTWVNURU1fRExLTV9OT1RJQ0VfREVQUyArPSAkKElOU1RBTExFRF9TWVNURU1fRExLTUlNQUdFX1RBUkdFVCkKQEAgLTQwMDYsNDMgKzQ0NDAsMTcgQEAKICQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJChJTlNUQUxMRURfU1lTVEVNX0RMS01JTUFHRV9UQVJHRVQpLCQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKSAkKElOVEVSTkFMX1NZU1RFTV9ETEtNSU1BR0VfRklMRVMpICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEVfU1lTVEVNX0RMS00pLCQoUFJPRFVDVF9PVVQpLzovKQogCiAuUEhPTlk6IHN5c3RlbV9kbGttaW1hZ2Utbm9kZXBzIHNkbm9kCi1zeXN0ZW1fZGxrbWltYWdlLW5vZGVwcyBzZG5vZDogfCAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykKK3N5c3RlbV9kbGttaW1hZ2Utbm9kZXBzIHNkbm9kOiB8ICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKSAkKHN5c3RlbV9kbGttaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dAogCSQoYnVpbGQtc3lzdGVtX2Rsa21pbWFnZS10YXJnZXQpCiAKLXN5bmM6ICQoSU5URVJOQUxfU1lTVEVNX0RMS01JTUFHRV9GSUxFUykKKy5QSE9OWTogc3luY19zeXN0ZW1fZGxrbQorc3luYyBzeW5jX3N5c3RlbV9kbGttOiAkKElOVEVSTkFMX1NZU1RFTV9ETEtNSU1BR0VfRklMRVMpCiAKIGVsc2UgaWZkZWYgQk9BUkRfUFJFQlVJTFRfU1lTVEVNX0RMS01JTUFHRQogSU5TVEFMTEVEX1NZU1RFTV9ETEtNSU1BR0VfVEFSR0VUIDo9ICQoUFJPRFVDVF9PVVQpL3N5c3RlbV9kbGttLmltZwogJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoQk9BUkRfUFJFQlVJTFRfU1lTVEVNX0RMS01JTUFHRSksJChJTlNUQUxMRURfU1lTVEVNX0RMS01JTUFHRV9UQVJHRVQpKSkKIGVuZGlmCiAKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgZHRibyBpbWFnZQotaWZkZWYgQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFCi1JTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9kdGJvLmltZwotCi1pZmVxICgkKEJPQVJEX0FWQl9FTkFCTEUpLHRydWUpCi0kKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKTogJChCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0UpICQoQVZCVE9PTCkgJChCT0FSRF9BVkJfRFRCT19LRVlfUEFUSCkKLQljcCAkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRSkgJEAKLQljaG1vZCArdyAkQAotCSQoQVZCVE9PTCkgYWRkX2hhc2hfZm9vdGVyIFwKLQkgICAgLS1pbWFnZSAkQCBcCi0JICAgICQoY2FsbCBnZXQtcGFydGl0aW9uLXNpemUtYXJndW1lbnQsJChCT0FSRF9EVEJPSU1HX1BBUlRJVElPTl9TSVpFKSkgXAotCSAgICAtLXBhcnRpdGlvbl9uYW1lIGR0Ym8gJChJTlRFUk5BTF9BVkJfRFRCT19TSUdOSU5HX0FSR1MpIFwKLQkgICAgJChCT0FSRF9BVkJfRFRCT19BRERfSEFTSF9GT09URVJfQVJHUykKLQotJChjYWxsIGRlY2xhcmUtMXAtY29udGFpbmVyLCQoSU5TVEFMTEVEX0RUQk9JTUFHRV9UQVJHRVQpLCkKLSQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJChJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCksJChCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0UpLCQoUFJPRFVDVF9PVVQpLzovKQotCi1VTk1PVU5URURfTk9USUNFX1ZFTkRPUl9ERVBTKz0gJChJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCkKLWVsc2UKLSQoSU5TVEFMTEVEX0RUQk9JTUFHRV9UQVJHRVQpOiAkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRSkKLQljcCAkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRSkgJEAKLWVuZGlmCi0KLWVuZGlmICMgQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgUHJvdGVjdGVkIFZNIGZpcm13YXJlIGltYWdlCiBpZmVxICgkKEJPQVJEX1VTRVNfUFZNRldJTUFHRSksdHJ1ZSkKIApAQCAtNDA1MSw5ICs0NDU5LDkgQEAKIAogSU5TVEFMTEVEX1BWTUZXSU1BR0VfVEFSR0VUIDo9ICQoUFJPRFVDVF9PVVQpL3B2bWZ3LmltZwogSU5TVEFMTEVEX1BWTUZXX0VNQkVEREVEX0FWQktFWV9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvcHZtZndfZW1iZWRkZWQuYXZicHVia2V5Ci1JTlNUQUxMRURfUFZNRldfQklOQVJZX1RBUkdFVCA6PSAkKGNhbGwgbW9kdWxlLWluc3RhbGxlZC1maWxlcyxwdm1md19iaW4pCitJTlNUQUxMRURfUFZNRldfQklOQVJZX1RBUkdFVCA6PSAkKGNhbGwgbW9kdWxlLXRhcmdldC1idWlsdC1maWxlcyxwdm1md19iaW4pCiBJTlRFUk5BTF9QVk1GV0lNQUdFX0ZJTEVTIDo9ICQoY2FsbCBtb2R1bGUtdGFyZ2V0LWJ1aWx0LWZpbGVzLHB2bWZ3X2ltZykKLUlOVEVSTkFMX1BWTUZXX0VNQkVEREVEX0FWQktFWSA6PSAkKGNhbGwgbW9kdWxlLXRhcmdldC1idWlsdC1maWxlcyxwdm1md19lbWJlZGRlZF9rZXkpCitJTlRFUk5BTF9QVk1GV19FTUJFRERFRF9BVkJLRVkgOj0gJChjYWxsIG1vZHVsZS10YXJnZXQtYnVpbHQtZmlsZXMscHZtZndfZW1iZWRkZWRfa2V5X3B1Yl9iaW4pCiBJTlRFUk5BTF9QVk1GV19TWU1CT0wgOj0gJChUQVJHRVRfT1VUX0VYRUNVVEFCTEVTX1VOU1RSSVBQRUQpL3B2bWZ3CiAKICQoY2FsbCBkZWNsYXJlLTFwLWNvbnRhaW5lciwkKElOU1RBTExFRF9QVk1GV0lNQUdFX1RBUkdFVCksKQpAQCAtNDA4OSw2ICs0NDk3LDEzIEBACiAKIGlmbmVxICgkKHN0cmlwICQoQk9BUkRfQ1VTVE9NSU1BR0VTX1BBUlRJVElPTl9MSVNUKSksKQogSU5URVJOQUxfQVZCX0NVU1RPTUlNQUdFU19TSUdOSU5HX0FSR1MgOj0KK0JPQVJEX0FWQl9DVVNUT01JTUFHRVNfUEFSVElUSU9OX0xJU1QgOj0KKyMgSWYgQk9BUkRfQVZCXyQoY2FsbCB0by11cHBlciwkKHBhcnRpdGlvbikpX0tFWV9QQVRIIGlzIHNldCwgdGhlIGltYWdlIHdpbGwgYmUgaW5jbHVkZWQgaW4KKyMgQk9BUkRfQVZCX0NVU1RPTUlNQUdFU19QQVJUSVRJT05fTElTVCwgb3RoZXJ3aXNlIHRoZSBpbWFnZSB3b24ndCBiZSBBVkIgc2lnbmVkLgorJChmb3JlYWNoIHBhcnRpdGlvbiwkKEJPQVJEX0NVU1RPTUlNQUdFU19QQVJUSVRJT05fTElTVCksIFwKKwkkKGlmICQoQk9BUkRfQVZCXyQoY2FsbCB0by11cHBlciwkKHBhcnRpdGlvbikpX0tFWV9QQVRIKSwgXAorCSQoZXZhbCBCT0FSRF9BVkJfQ1VTVE9NSU1BR0VTX1BBUlRJVElPTl9MSVNUICs9ICQocGFydGl0aW9uKSkgXAorCSQoZXZhbCBCT0FSRF8kKGNhbGwgdG8tdXBwZXIsJChwYXJ0aXRpb24pKV9JTUFHRV9MSVNUIDo9ICQoQk9BUkRfQVZCXyQoY2FsbCB0by11cHBlciwkKHBhcnRpdGlvbikpX0lNQUdFX0xJU1QpKSkpCiAKICMgU2lnbiBjdXN0b20gaW1hZ2UuCiAjICQoMSk6IHRoZSBwcmVidWlsdCBjdXN0b20gaW1hZ2UuCkBAIC00MTEzLDkgKzQ1MjgsMjYgQEAKIElOU1RBTExFRF9DVVNUT01JTUFHRVNfVEFSR0VUICs9ICQoMykKIGVuZGVmCiAKLSQoZm9yZWFjaCBwYXJ0aXRpb24sJChCT0FSRF9DVVNUT01JTUFHRVNfUEFSVElUSU9OX0xJU1QpLCBcCisjIENvcHkgdW5zaWduZWQgY3VzdG9tIGltYWdlLgorIyAkKDEpOiB0aGUgcHJlYnVpbHQgY3VzdG9tIGltYWdlLgorIyAkKDIpOiB0aGUgc2lnbmVkIGN1c3RvbSBpbWFnZSB0YXJnZXQuCitkZWZpbmUgY29weV9jdXN0b21faW1hZ2UKKyQoMik6ICQoMSkgJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpCisJQGVjaG8gVGFyZ2V0IGN1c3RvbSBpbWFnZTogJCgyKQorCW1rZGlyIC1wICQoZGlyICQoMikpCisJY3AgJCgxKSAkKDIpCitJTlNUQUxMRURfQ1VTVE9NSU1BR0VTX1RBUkdFVCArPSAkKDIpCitlbmRlZgorCisjIEFkZCBBVkIgY3VzdG9tIGltYWdlIHRvIGRyb2lkIHRhcmdldAorJChmb3JlYWNoIHBhcnRpdGlvbiwkKEJPQVJEX0FWQl9DVVNUT01JTUFHRVNfUEFSVElUSU9OX0xJU1QpLCBcCiAgICQoZm9yZWFjaCBpbWFnZSwkKEJPQVJEX0FWQl8kKGNhbGwgdG8tdXBwZXIsJChwYXJ0aXRpb24pKV9JTUFHRV9MSVNUKSwgXAogICAgICAkKGV2YWwgJChjYWxsIHNpZ25fY3VzdG9tX2ltYWdlLCQoaW1hZ2UpLCQocGFydGl0aW9uKSwkKFBST0RVQ1RfT1VUKS8kKG5vdGRpciAkKGltYWdlKSkpKSkpCisKKyMgQWRkIHVuc2lnbmVkIGN1c3RvbSBpbWFnZSB0byBkcm9pZCB0YXJnZXQKKyQoZm9yZWFjaCBwYXJ0aXRpb24sJChmaWx0ZXItb3V0ICQoQk9BUkRfQVZCX0NVU1RPTUlNQUdFU19QQVJUSVRJT05fTElTVCksICQoQk9BUkRfQ1VTVE9NSU1BR0VTX1BBUlRJVElPTl9MSVNUKSksIFwKKyAgJChmb3JlYWNoIGltYWdlLCQoQk9BUkRfJChjYWxsIHRvLXVwcGVyLCQocGFydGl0aW9uKSlfSU1BR0VfTElTVCksIFwKKyAgICAgJChldmFsICQoY2FsbCBjb3B5X2N1c3RvbV9pbWFnZSwkKGltYWdlKSwkKFBST0RVQ1RfT1VUKS8kKG5vdGRpciAkKGltYWdlKSkpKSkpCiBlbmRpZgogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00MzE1LDYgKzQ3NDcsMjAgQEAKICAgICAtLXByb3AgY29tLmFuZHJvaWQuYnVpbGQucHZtZncuc2VjdXJpdHlfcGF0Y2g6JChQVk1GV19TRUNVUklUWV9QQVRDSCkKIGVuZGlmCiAKKyMgQXBwZW5kIHJvb3QgZGlnZXN0IG9mIG1pY3JvZHJvaWQtdmVuZG9yIHBhcnRpdGlvbidzIGhhc2h0cmVlIGRlc2NyaXB0b3IgaW50byB2ZW5kb3IgcGFydGl0aW9uLgoraWZkZWYgTUlDUk9EUk9JRF9WRU5ET1JfSU1BR0VfTU9EVUxFCitNSUNST0RST0lEX1ZFTkRPUl9JTUFHRSA6PSBcCisgICAgJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixFVEMsJChNSUNST0RST0lEX1ZFTkRPUl9JTUFHRV9NT0RVTEUpKS8kKE1JQ1JPRFJPSURfVkVORE9SX0lNQUdFX01PRFVMRSkKK01JQ1JPRFJPSURfVkVORE9SX1JPT1RfRElHRVNUIDo9ICQoUFJPRFVDVF9PVVQpL21pY3JvZHJvaWRfdmVuZG9yX3Jvb3RfZGlnZXN0CitCT0FSRF9BVkJfVkVORE9SX0FERF9IQVNIVFJFRV9GT09URVJfQVJHUyArPSBcCisgICAgLS1wcm9wX2Zyb21fZmlsZSBjb20uYW5kcm9pZC5idWlsZC5taWNyb2Ryb2lkLXZlbmRvci5yb290X2RpZ2VzdDokKE1JQ1JPRFJPSURfVkVORE9SX1JPT1RfRElHRVNUKQorJChNSUNST0RST0lEX1ZFTkRPUl9ST09UX0RJR0VTVCk6ICQoQVZCVE9PTCkgJChNSUNST0RST0lEX1ZFTkRPUl9JTUFHRSkKKwkkKEFWQlRPT0wpIHByaW50X3BhcnRpdGlvbl9kaWdlc3RzIFwKKyAgICAgIC0taW1hZ2UgJChNSUNST0RST0lEX1ZFTkRPUl9JTUFHRSkgXAorICAgICAgfCB0ciAtZCAnXG4nIHwgc2VkIC1FICdzLy4qOiAvL2cnID4gJEAKKyQoSU5TVEFMTEVEX1ZFTkRPUklNQUdFX1RBUkdFVCk6ICQoTUlDUk9EUk9JRF9WRU5ET1JfUk9PVF9ESUdFU1QpCitlbmRpZgorCiBCT09UX0ZPT1RFUl9BUkdTIDo9IEJPQVJEX0FWQl9CT09UX0FERF9IQVNIX0ZPT1RFUl9BUkdTCiBJTklUX0JPT1RfRk9PVEVSX0FSR1MgOj0gQk9BUkRfQVZCX0lOSVRfQk9PVF9BRERfSEFTSF9GT09URVJfQVJHUwogVkVORE9SX0JPT1RfRk9PVEVSX0FSR1MgOj0gQk9BUkRfQVZCX1ZFTkRPUl9CT09UX0FERF9IQVNIX0ZPT1RFUl9BUkdTCkBAIC00MzkyLDcgKzQ4MzgsOSBAQAogJChldmFsIHBhcnQgOj0gJCgxKSkKICQoZXZhbCBQQVJUPSQoY2FsbCB0by11cHBlciwkKHBhcnQpKSkKICQoZXZhbCBfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb24gOj0gQk9BUkRfQVZCXyQoUEFSVClfUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT04pCiskKGV2YWwgX2tleV9wYXRoIDo9IEJPQVJEX0FWQl8kKFBBUlQpX0tFWV9QQVRIKQogJChpZiAkKCQoX3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uKSksLCQoZXJyb3IgJChfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb24pIGlzIG5vdCBkZWZpbmVkKSkKKyQoaWYgJCgkKF9rZXlfcGF0aCkpLCwkKGVycm9yICQoX2tleV9wYXRoKSBpcyBub3QgZGVmaW5lZCkpCiAKIElOVEVSTkFMX0FWQl9NQUtFX1ZCTUVUQV9JTUFHRV9BUkdTICs9IFwKICAgICAtLWNoYWluX3BhcnRpdGlvbiAkKHBhcnQpOiQoJChfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb24pKTokKEFWQl9DSEFJTl9LRVlfRElSKS8kKHBhcnQpLmF2YnB1YmtleQpAQCAtNDQ3Miw4ICs0OTIwLDggQEAKICQoZm9yZWFjaCBwYXJ0aXRpb24sJChCT0FSRF9BVkJfVkJNRVRBX0NVU1RPTV9QQVJUSVRJT05TKSwkKGV2YWwgQk9BUkRfQVZCX01BS0VfVkJNRVRBXyQoY2FsbCB0by11cHBlciwkKHBhcnRpdGlvbikpX0lNQUdFX0FSR1MgKz0gLS1wYWRkaW5nX3NpemUgNDA5NikpCiBlbmRpZgogCi1pZm5lcSAoJChzdHJpcCAkKEJPQVJEX0NVU1RPTUlNQUdFU19QQVJUSVRJT05fTElTVCkpLCkKLSQoZm9yZWFjaCBwYXJ0aXRpb24sJChCT0FSRF9DVVNUT01JTUFHRVNfUEFSVElUSU9OX0xJU1QpLCBcCitpZm5lcSAoJChzdHJpcCAkKEJPQVJEX0FWQl9DVVNUT01JTUFHRVNfUEFSVElUSU9OX0xJU1QpKSwpCiskKGZvcmVhY2ggcGFydGl0aW9uLCQoQk9BUkRfQVZCX0NVU1RPTUlNQUdFU19QQVJUSVRJT05fTElTVCksIFwKICAgICAkKGV2YWwgJChjYWxsIGNoZWNrLWFuZC1zZXQtY3VzdG9tLWF2Yi1jaGFpbi1hcmdzLCQocGFydGl0aW9uKSkpKQogZW5kaWYKIApAQCAtNDU2MCwxMCArNTAwOCwxMCBAQAogICAkKGlmICQoQk9BUkRfQVZCX1ZCTUVUQV9WRU5ET1JfS0VZX1BBVEgpLFwKICAgICAkKGhpZGUpICQoQVZCVE9PTCkgZXh0cmFjdF9wdWJsaWNfa2V5IC0ta2V5ICQoQk9BUkRfQVZCX1ZCTUVUQV9WRU5ET1JfS0VZX1BBVEgpIFwKICAgICAgICAgLS1vdXRwdXQgJCgxKS92Ym1ldGFfdmVuZG9yLmF2YnB1YmtleSkKLSAgJChpZiAkKEJPQVJEX0NVU1RPTUlNQUdFU19QQVJUSVRJT05fTElTVCksXAotICAgICQoaGlkZSkgJChmb3JlYWNoIHBhcnRpdGlvbiwkKEJPQVJEX0NVU1RPTUlNQUdFU19QQVJUSVRJT05fTElTVCksIFwKKyAgJChpZiAkKEJPQVJEX0FWQl9DVVNUT01JTUFHRVNfUEFSVElUSU9OX0xJU1QpLFwKKyAgICAkKGhpZGUpICQoZm9yZWFjaCBwYXJ0aXRpb24sJChCT0FSRF9BVkJfQ1VTVE9NSU1BR0VTX1BBUlRJVElPTl9MSVNUKSwgXAogICAgICAgICAkKEFWQlRPT0wpIGV4dHJhY3RfcHVibGljX2tleSAtLWtleSAkKEJPQVJEX0FWQl8kKGNhbGwgdG8tdXBwZXIsJChwYXJ0aXRpb24pKV9LRVlfUEFUSCkgXAotICAgICAgICAgICAgLS1vdXRwdXQgJCgxKS8kKHBhcnRpdGlvbikuYXZicHVia2V5OykpIFwKKyAgICAgICAgICAgIC0tb3V0cHV0ICQoMSkvJChwYXJ0aXRpb24pLmF2YnB1YmtleTspKQogICAkKGlmICQoQk9BUkRfQVZCX1ZCTUVUQV9DVVNUT01fUEFSVElUSU9OUyksXAogICAgICQoaGlkZSkgJChmb3JlYWNoIHBhcnRpdGlvbiwkKEJPQVJEX0FWQl9WQk1FVEFfQ1VTVE9NX1BBUlRJVElPTlMpLCBcCiAgICAgICAgICQoQVZCVE9PTCkgZXh0cmFjdF9wdWJsaWNfa2V5IC0ta2V5ICQoQk9BUkRfQVZCX1ZCTUVUQV8kKGNhbGwgdG8tdXBwZXIsJChwYXJ0aXRpb24pKV9LRVlfUEFUSCkgXApAQCAtNDcwOCwxOCArNTE1NiwxMiBAQAogICAgICQoSU5URVJOQUxfUFZNRldJTUFHRV9GSUxFUykgXAogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENoZWNrIFZJTlRGIG9mIGJ1aWxkCisjIFJ1biBhcGV4X3NlcG9saWN5X3Rlc3RzIGZvciBhbGwgaW5zdGFsbGVkIEFQRVhlcwogCi0jIE5vdGU6IHZlbmRvcl9kbGttLCBvZG1fZGxrbSwgYW5kIHN5c3RlbV9kbGttIGRvZXMgbm90IGhhdmUgVklOVEYgZmlsZXMuCiBpZmVxICgsJChUQVJHRVRfQlVJTERfVU5CVU5ETEVEKSkKLQotaW50ZXJtZWRpYXRlcyA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxjaGVja192aW50Zl9hbGwpCi1jaGVja192aW50Zl9hbGxfZGVwcyA6PQotCi1BUEVYX09VVCA6PSAkKFBST0RVQ1RfT1VUKS9hcGV4Ci0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENyZWF0ZSBhcGV4LWluZm8tZmlsZS54bWwKLQorIyBUT0RPKGIvMzUzODk2ODE3KSBhcGV4X3NlcG9saWN5X3Rlc3RzIHN1cHBvcnRzIG9ubHkgZXh0NAoraWZlcSAoZXh0NCwkKFBST0RVQ1RfREVGQVVMVF9BUEVYX1BBWUxPQURfVFlQRSkpCitpbnRlcm1lZGlhdGUgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsYXBleF9zZXBvbGljeV90ZXN0cykKIGFwZXhfZGlycyA6PSBcCiAgICQoVEFSR0VUX09VVCkvYXBleC8lIFwKICAgJChUQVJHRVRfT1VUX1NZU1RFTV9FWFQpL2FwZXgvJSBcCkBAIC00NzI4LDI3ICs1MTcwLDkxIEBACiAgICQoVEFSR0VUX09VVF9QUk9EVUNUKS9hcGV4LyUgXAogCiBhcGV4X2ZpbGVzIDo9ICQoc29ydCAkKGZpbHRlciAkKGFwZXhfZGlycyksICQoSU5URVJOQUxfQUxMSU1BR0VTX0ZJTEVTKSkpCithcGV4X2RpcnMgOj0KKworIyAkMTogYXBleCBmaWxlCisjICQyOiBvdXRwdXQgZmlsZQorZGVmaW5lIF9ydW5fYXBleF9zZXBvbGljeV90ZXN0cworJDI6ICQxIFwKKyAgICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hcGV4X3NlcG9saWN5X3Rlc3RzIFwKKyAgICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9kZWFwZXhlciBcCisgICAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZGVidWdmc19zdGF0aWMKKwlAcm0gLXJmICQkQAorCUBta2RpciAtcCAkKGRpciAkJEApCisJJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYXBleF9zZXBvbGljeV90ZXN0cyAtLWFsbCAtZiA8KCQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2RlYXBleGVyIC0tZGVidWdmc19wYXRoICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2RlYnVnZnNfc3RhdGljIGxpc3QgLVogJCQ8KQorCUB0b3VjaCAkJEAKK2VuZGVmCisKKyMgJDE6IGFwZXggZmlsZSBsaXN0CitkZWZpbmUgcnVuX2FwZXhfc2Vwb2xpY3lfdGVzdHMKKyQoZm9yZWFjaCBhcGV4X2ZpbGUsJDEsIFwKKyAgJChldmFsIHBhc3NmaWxlIDo9ICQocGF0c3Vic3QgJChQUk9EVUNUX09VVCkvJSwkKGludGVybWVkaWF0ZSkvJS5wYXNzLCQoYXBleF9maWxlKSkpIFwKKyAgJChldmFsICQoY2FsbCBfcnVuX2FwZXhfc2Vwb2xpY3lfdGVzdHMsJChhcGV4X2ZpbGUpLCQocGFzc2ZpbGUpKSkgXAorICAkKHBhc3NmaWxlKSkKK2VuZGVmCisKKy5QSE9OWTogcnVuX2FwZXhfc2Vwb2xpY3lfdGVzdHMKK3J1bl9hcGV4X3NlcG9saWN5X3Rlc3RzOiAkKGNhbGwgcnVuX2FwZXhfc2Vwb2xpY3lfdGVzdHMsJChhcGV4X2ZpbGVzKSkKKworZHJvaWRfdGFyZ2V0czogcnVuX2FwZXhfc2Vwb2xpY3lfdGVzdHMKKworYXBleF9maWxlcyA6PQoraW50ZXJtZWRpYXRlIDo9CitlbmRpZiAjIFBST0RVQ1RfREVGQVVMVF9BUEVYX1BBWUxPQURfVFlQRQorZW5kaWYgIyBUQVJHRVRfQlVJTERfVU5CVU5ETEVECisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgVklOVEYgb2YgYnVpbGQKKworIyBOb3RlOiB2ZW5kb3JfZGxrbSwgb2RtX2Rsa20sIGFuZCBzeXN0ZW1fZGxrbSBkb2VzIG5vdCBoYXZlIFZJTlRGIGZpbGVzLgoraWZlcSAoLCQoVEFSR0VUX0JVSUxEX1VOQlVORExFRCkpCisKK2ludGVybWVkaWF0ZXMgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsY2hlY2tfdmludGZfYWxsKQorY2hlY2tfdmludGZfYWxsX2RlcHMgOj0KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBY3RpdmF0ZSBBUEVYZXMgZm9yIGNoZWNrdmludGYKKworYXBleF9kaXJzIDo9IFwKKyAgJChUQVJHRVRfT1VUKS9hcGV4LyUgXAorICAkKFRBUkdFVF9PVVRfUFJPRFVDVCkvYXBleC8lIFwKKyAgJChUQVJHRVRfT1VUX1NZU1RFTV9FWFQpL2FwZXgvJSBcCisgICQoVEFSR0VUX09VVF9WRU5ET1IpL2FwZXgvJSBcCisgICQoVEFSR0VUX09VVF9PRE0pL2FwZXgvJSBcCisKK2FwZXhfZmlsZXMgOj0gJChzb3J0ICQoZmlsdGVyICQoYXBleF9kaXJzKSwgJChJTlRFUk5BTF9BTExJTUFHRVNfRklMRVMpKSkKKworQVBFWF9PVVQgOj0gJChpbnRlcm1lZGlhdGVzKS9hcGV4CiBBUEVYX0lORk9fRklMRSA6PSAkKEFQRVhfT1VUKS9hcGV4LWluZm8tbGlzdC54bWwKIAotIyBkdW1wX2FwZXhfaW5mbyBzY2FucyAkKFBST0RVQ1RfT1VUKS9hcGV4IGFuZCB3cml0ZXMgYXBleC1pbmZvLWxpc3QueG1sIHRoZXJlLgotIyBUaGlzIHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IHJ1bGVzIGZvciAuYXBleCBmaWxlcyBpbnN0YWxsIHRoZSBjb250ZW50cyBpbiAkKFBST0RVQ1RfT1VUKS9hcGV4LgotJChBUEVYX0lORk9fRklMRSk6ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2R1bXBfYXBleF9pbmZvICQoYXBleF9maWxlcykKLQlAZWNobyAiQ3JlYXRpbmcgYXBleC1pbmZvLWZpbGUgaW4gJChQUk9EVUNUX09VVCkgIgotCSQ8IC0tcm9vdF9kaXIgJChQUk9EVUNUX09VVCkKKyMgYXBleGRfaG9zdCBzY2Fucy9hY3RpdmF0ZXMgQVBFWCBmaWxlcyBhbmQgd3JpdGVzIC9hcGV4L2FwZXgtaW5mby1saXN0LnhtbAorIyBOb3RlIHRoYXQgYEBlY2hvICQoUFJJVkFURV9BUEVYX0ZJTEVTKWAgbGluZSBpcyBhZGRlZCB0byB0cmlnZ2VyIHRoZSBydWxlIHdoZW4gdGhlIEFQRVggbGlzdCBpcyBjaGFuZ2VkLgorJChBUEVYX0lORk9fRklMRSk6IFBSSVZBVEVfQVBFWF9GSUxFUyA6PSAkKGFwZXhfZmlsZXMpCiskKEFQRVhfSU5GT19GSUxFKTogJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYXBleGRfaG9zdCAkKGFwZXhfZmlsZXMpCisJQGVjaG8gIkV4dHJhY3RpbmcgYXBleGVzLi4uIgorCUBlY2hvICQoUFJJVkFURV9BUEVYX0ZJTEVTKSA+IC9kZXYvbnVsbAorCUBybSAtcmYgJChBUEVYX09VVCkKKwlAbWtkaXIgLXAgJChBUEVYX09VVCkKKwkkPCAtLXN5c3RlbV9wYXRoICQoVEFSR0VUX09VVCkgXAorCSAgIC0tc3lzdGVtX2V4dF9wYXRoICQoVEFSR0VUX09VVF9TWVNURU1fRVhUKSBcCisJICAgLS1wcm9kdWN0X3BhdGggJChUQVJHRVRfT1VUX1BST0RVQ1QpIFwKKwkgICAtLXZlbmRvcl9wYXRoICQoVEFSR0VUX09VVF9WRU5ET1IpIFwKKwkgICAtLW9kbV9wYXRoICQoVEFSR0VUX09VVF9PRE0pIFwKKwkgICAtLWFwZXhfcGF0aCAkKEFQRVhfT1VUKQogCiBhcGV4X2ZpbGVzIDo9CiBhcGV4X2RpcnMgOj0KIAogIyBUaGUgYnVpbGQgc3lzdGVtIG9ubHkgd3JpdGVzIFZJTlRGIG1ldGFkYXRhIHRvICovZXRjL3ZpbnRmIHBhdGhzLiBMZWdhY3kgcGF0aHMgYXJlbid0IG5lZWRlZCBoZXJlCiAjIGJlY2F1c2UgdGhleSBhcmUgb25seSB1c2VkIGZvciBwcmVidWlsdCBpbWFnZXMuCi0jIEFQRVggZmlsZXMgaW4gL3ZlbmRvci9hcGV4IGNhbiBoYXZlIFZJTlRGIGZyYWdtZW50cyBhcyB3ZWxsLgorIyBBUEVYIGZpbGVzIGluIC8kcGFydGl0aW9uL2FwZXggY2FuIGhhdmUgVklOVEYgZnJhZ21lbnRzIGFzIHdlbGwuCiBjaGVja192aW50Zl9jb21tb25fc3Jjc19wYXR0ZXJucyA6PSBcCiAgICQoVEFSR0VUX09VVCkvZXRjL3ZpbnRmLyUgXAogICAkKFRBUkdFVF9PVVRfVkVORE9SKS9ldGMvdmludGYvJSBcCiAgICQoVEFSR0VUX09VVF9PRE0pL2V0Yy92aW50Zi8lIFwKICAgJChUQVJHRVRfT1VUX1BST0RVQ1QpL2V0Yy92aW50Zi8lIFwKICAgJChUQVJHRVRfT1VUX1NZU1RFTV9FWFQpL2V0Yy92aW50Zi8lIFwKLSAgJChUQVJHRVRfT1VUX1ZFTkRPUikvYXBleC8lIFwKKyAgJChhcGV4X2RpcnMpCiAKIGNoZWNrX3ZpbnRmX2NvbW1vbl9zcmNzIDo9ICQoc29ydCAkKGZpbHRlciAkKGNoZWNrX3ZpbnRmX2NvbW1vbl9zcmNzX3BhdHRlcm5zKSwkKElOVEVSTkFMX0FMTElNQUdFU19GSUxFUykpKQogY2hlY2tfdmludGZfY29tbW9uX3NyY3NfcGF0dGVybnMgOj0KQEAgLTQ3NjMsMTUgKzUyNjksMjAgQEAKICQoZXJyb3IgRU1QVFlfVkVORE9SX1NLVV9QTEFDRUhPTERFUiBpcyBhbiBpbnRlcm5hbCB2YXJpYWJsZSBhbmQgY2Fubm90IGJlIHVzZWQgZm9yIERFSVZDRV9NQU5JRkVTVF9TS1VTKQogZW5kaWYKIAotIyAtLSBDaGVjayBzeXN0ZW0gbWFuaWZlc3QgLyBtYXRyaXggaW5jbHVkaW5nIGZyYWdtZW50cyAoZXhjbHVkaW5nIG90aGVyIGZyYW1ld29yayBtYW5pZmVzdHMgLyBtYXRyaWNlcywgZS5nLiBwcm9kdWN0KTsKLWNoZWNrX3ZpbnRmX3N5c3RlbV9kZXBzIDo9ICQoZmlsdGVyICQoVEFSR0VUX09VVCkvZXRjL3ZpbnRmLyUsICQoY2hlY2tfdmludGZfY29tbW9uX3NyY3MpKQorIyAtLSBDaGVjayBzeXN0ZW0gYW5kIHN5c3RlbV9leHQgbWFuaWZlc3RzIC8gbWF0cmljZXMgaW5jbHVkaW5nIGZyYWdtZW50cyAoZXhjbHVkaW5nIG90aGVyIGZyYW1ld29yayBtYW5pZmVzdHMgLyBtYXRyaWNlcywgZS5nLiBwcm9kdWN0KTsKK2lmZGVmIEJVSUxESU5HX1NZU1RFTV9JTUFHRQorY2hlY2tfdmludGZfc3lzdGVtX2RlcHMgOj0gJChmaWx0ZXIgJChUQVJHRVRfT1VUKS9ldGMvdmludGYvJSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKFRBUkdFVF9PVVRfU1lTVEVNX0VYVCkvZXRjL3ZpbnRmLyUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfT1VUKS9hcGV4LyUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfT1VUX1NZU1RFTV9FWFQpL2FwZXgvJSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChjaGVja192aW50Zl9jb21tb25fc3JjcykpCiBpZm5lcSAoJChjaGVja192aW50Zl9zeXN0ZW1fZGVwcyksKQogY2hlY2tfdmludGZfaGFzX3N5c3RlbSA6PSB0cnVlCiAKIGNoZWNrX3ZpbnRmX3N5c3RlbV9sb2cgOj0gJChpbnRlcm1lZGlhdGVzKS9jaGVja192aW50Zl9zeXN0ZW0ubG9nCiBjaGVja192aW50Zl9hbGxfZGVwcyArPSAkKGNoZWNrX3ZpbnRmX3N5c3RlbV9sb2cpCi0kKGNoZWNrX3ZpbnRmX3N5c3RlbV9sb2cpOiAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9jaGVja3ZpbnRmICQoY2hlY2tfdmludGZfc3lzdGVtX2RlcHMpCi0JQCggJDwgLS1jaGVjay1vbmUgLS1kaXJtYXAgL3N5c3RlbTokKFRBUkdFVF9PVVQpID4gJEAgMj4mMSApIHx8ICggY2F0ICRAICYmIGV4aXQgMSApCiskKGNoZWNrX3ZpbnRmX3N5c3RlbV9sb2cpOiAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9jaGVja3ZpbnRmICQoY2hlY2tfdmludGZfc3lzdGVtX2RlcHMpICQoQVBFWF9JTkZPX0ZJTEUpCisJQCggJDwgLS1jaGVjay1vbmUgLS1kaXJtYXAgL3N5c3RlbTokKFRBUkdFVF9PVVQpIC0tZGlybWFwIC9hcGV4OiQoQVBFWF9PVVQpID4gJEAgMj4mMSApIHx8ICggY2F0ICRAICYmIGV4aXQgMSApCiAkKGNhbGwgZGVjbGFyZS0xcC10YXJnZXQsJChjaGVja192aW50Zl9zeXN0ZW1fbG9nKSkKIGNoZWNrX3ZpbnRmX3N5c3RlbV9sb2cgOj0KIApAQCAtNDc4MCwxOCArNTI5MSwyNCBAQAogICAgIHZpbnRmZm1fbG9nIDo9ICQoaW50ZXJtZWRpYXRlcykvdmludGZmbS5sb2cKIGVuZGlmCiBjaGVja192aW50Zl9hbGxfZGVwcyArPSAkKHZpbnRmZm1fbG9nKQotJCh2aW50ZmZtX2xvZyk6ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3ZpbnRmZm0gJChjaGVja192aW50Zl9zeXN0ZW1fZGVwcykKKyQodmludGZmbV9sb2cpOiAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS92aW50ZmZtICQoY2hlY2tfdmludGZfc3lzdGVtX2RlcHMpICQoQVBFWF9JTkZPX0ZJTEUpCiAJQCggJDwgLS1jaGVjayAtLWRpcm1hcCAvc3lzdGVtOiQoVEFSR0VUX09VVCkgXAotCSAgJChWSU5URl9GUkFNRVdPUktfTUFOSUZFU1RfRlJPWkVOX0RJUikgPiAkQCAyPiYxICkgfHwgKCBjYXQgJEAgJiYgZXhpdCAxICkKKwkgIC0tZGlybWFwIC9zeXN0ZW1fZXh0OiQoVEFSR0VUX09VVF9TWVNURU1fRVhUKSBcCisJICAtLWRpcm1hcCAvcHJvZHVjdDokKFRBUkdFVF9PVVRfUFJPRFVDVCkgXAorCSAgLS1kaXJtYXAgL2FwZXg6JChBUEVYX09VVCkgXAorCSAgc3lzdGVtL2xpYmhpZGwvdmludGZkYXRhL2Zyb3plbiA+ICRAIDI+JjEgKSB8fCAoIGNhdCAkQCAmJiBleGl0IDEgKQogCiAkKGNhbGwgZGVjbGFyZS0xcC10YXJnZXQsJCh2aW50ZmZtX2xvZykpCiAKIGVuZGlmICMgY2hlY2tfdmludGZfc3lzdGVtX2RlcHMKIGNoZWNrX3ZpbnRmX3N5c3RlbV9kZXBzIDo9CiAKK2VuZGlmICMgQlVJTERJTkdfU1lTVEVNX0lNQUdFCisKICMgLS0gQ2hlY2sgdmVuZG9yIG1hbmlmZXN0IC8gbWF0cml4IGluY2x1ZGluZyBmcmFnbWVudHMgKGV4Y2x1ZGluZyBvdGhlciBkZXZpY2UgbWFuaWZlc3RzIC8gbWF0cmljZXMpCi1jaGVja192aW50Zl92ZW5kb3JfZGVwcyA6PSAkKGZpbHRlciAkKFRBUkdFVF9PVVRfVkVORE9SKS9ldGMvdmludGYvJSwgJChjaGVja192aW50Zl9jb21tb25fc3JjcykpCi1jaGVja192aW50Zl92ZW5kb3JfZGVwcyArPSAkKGZpbHRlciAkKFRBUkdFVF9PVVRfVkVORE9SKS9hcGV4LyUsICQoY2hlY2tfdmludGZfY29tbW9uX3NyY3MpKQorY2hlY2tfdmludGZfdmVuZG9yX2RlcHMgOj0gJChmaWx0ZXIgJChUQVJHRVRfT1VUX1ZFTkRPUikvZXRjL3ZpbnRmLyUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfT1VUX1ZFTkRPUikvYXBleC8lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGNoZWNrX3ZpbnRmX2NvbW1vbl9zcmNzKSkKIGlmbmVxICgkKHN0cmlwICQoY2hlY2tfdmludGZfdmVuZG9yX2RlcHMpKSwpCiBjaGVja192aW50Zl9oYXNfdmVuZG9yIDo9IHRydWUKIGNoZWNrX3ZpbnRmX3ZlbmRvcl9sb2cgOj0gJChpbnRlcm1lZGlhdGVzKS9jaGVja192aW50Zl92ZW5kb3IubG9nCkBAIC00ODIxLDQwICs1MzM4LDQ4IEBACiAKIG15X2JvYXJkX2V4dHJhY3RlZF9rZXJuZWwgOj0KIAotIyBCT0FSRF9LRVJORUxfQ09ORklHX0ZJTEUgYW5kIEJPQVJEX0tFUk5FTF9WRVJTSU9OIGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSB2YWx1ZXMgZXh0cmFjdGVkCi0jIGZyb20gSU5TVEFMTEVEX0tFUk5FTF9UQVJHRVQuCi1pZmRlZiBCT0FSRF9LRVJORUxfQ09ORklHX0ZJTEUKLWlmZGVmIEJPQVJEX0tFUk5FTF9WRVJTSU9OCi0kKEJVSUxUX0tFUk5FTF9DT05GSUdTX0ZJTEUpOiAkKEJPQVJEX0tFUk5FTF9DT05GSUdfRklMRSkKLQljcCAkPCAkQAotJChCVUlMVF9LRVJORUxfVkVSU0lPTl9GSUxFKToKLQllY2hvICQoQk9BUkRfS0VSTkVMX1ZFUlNJT04pID4gJEAKLQotJChjYWxsIGRlY2xhcmUtbGljZW5zZS1tZXRhZGF0YSwkKEJVSUxUX0tFUk5FTF9DT05GSUdTX0ZJTEUpLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUdQTC0yLjAtb25seSxyZXN0cmljdGVkLCQoQlVJTERfU1lTVEVNKS9MSU5VWF9LRVJORUxfQ09QWUlORywiS2VybmVsIixrZXJuZWwpCi0kKGNhbGwgZGVjbGFyZS1saWNlbnNlLW1ldGFkYXRhLCQoQlVJTFRfS0VSTkVMX1ZFUlNJT05fRklMRSksU1BEWC1saWNlbnNlLWlkZW50aWZpZXItR1BMLTIuMC1vbmx5LHJlc3RyaWN0ZWQsJChCVUlMRF9TWVNURU0pL0xJTlVYX0tFUk5FTF9DT1BZSU5HLCJLZXJuZWwiLGtlcm5lbCkKLQotbXlfYm9hcmRfZXh0cmFjdGVkX2tlcm5lbCA6PSB0cnVlCi1lbmRpZiAjIEJPQVJEX0tFUk5FTF9WRVJTSU9OCi1lbmRpZiAjIEJPQVJEX0tFUk5FTF9DT05GSUdfRklMRQotCi1pZm5lcSAoJChteV9ib2FyZF9leHRyYWN0ZWRfa2VybmVsKSx0cnVlKQogIyBUb29scyBmb3IgZGVjb21wcmVzc2lvbiB0aGF0IGlzIG5vdCBpbiBQQVRILgogIyBDaGVjayAkKEVYVFJBQ1RfS0VSTkVMKSBmb3IgZGVjb21wcmVzc2lvbiBhbGdvcml0aG1zIHN1cHBvcnRlZCBieSB0aGUgc2NyaXB0LgogIyBBbGdvcml0aG1zIHRoYXQgYXJlIGluIHRoZSBzY3JpcHQgYnV0IG5vdCBpbiB0aGlzIGxpc3Qgd2lsbCBiZSBmb3VuZCBpbiBQQVRILgogbXlfZGVjb21wcmVzc190b29scyA6PSBcCiAgICAgbHo0OiQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2x6NCBcCiAKLWVuZGlmICMgbXlfYm9hcmRfZXh0cmFjdGVkX2tlcm5lbAorCisjIEJPQVJEX0tFUk5FTF9DT05GSUdfRklMRSBhbmQgQk9BUkRfS0VSTkVMX1ZFUlNJT04gY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIHZhbHVlcyBleHRyYWN0ZWQKKyMgZnJvbSBJTlNUQUxMRURfS0VSTkVMX1RBUkdFVC4KK2lmZGVmIEJPQVJEX0tFUk5FTF9WRVJTSU9OCiskKEJVSUxUX0tFUk5FTF9WRVJTSU9OX0ZJTEUpOiBQUklWQVRFX0RFQ09NUFJFU1NfVE9PTFMgOj0gJChteV9kZWNvbXByZXNzX3Rvb2xzKQorJChCVUlMVF9LRVJORUxfVkVSU0lPTl9GSUxFKTogJChmb3JlYWNoIHBhaXIsJChteV9kZWNvbXByZXNzX3Rvb2xzKSwkKGNhbGwgd29yZC1jb2xvbiwyLCQocGFpcikpKQorJChCVUlMVF9LRVJORUxfVkVSU0lPTl9GSUxFKTogJChFWFRSQUNUX0tFUk5FTCkgJChmaXJzdHdvcmQgJChJTlNUQUxMRURfS0VSTkVMX1RBUkdFVCkpCisJS0VSTkVMX1JFTEVBU0U9YCQoRVhUUkFDVF9LRVJORUwpIC0tdG9vbHMgJChQUklWQVRFX0RFQ09NUFJFU1NfVE9PTFMpIC0taW5wdXQgJChmaXJzdHdvcmQgJChJTlNUQUxMRURfS0VSTkVMX1RBUkdFVCkpIFwKKwkgIC0tb3V0cHV0LXJlbGVhc2VgIDtcCisgIGlmIFsgIiQkS0VSTkVMX1JFTEVBU0UiICE9ICckKEJPQVJEX0tFUk5FTF9WRVJTSU9OKScgXTsgdGhlbiBcCisgICAgZWNobyAiU3BlY2lmaWVkIGtlcm5lbCB2ZXJzaW9uICckKEJPQVJEX0tFUk5FTF9WRVJTSU9OKScgZG9lcyBub3QgbWF0Y2ggYWN0dWFsIGtlcm5lbCB2ZXJzaW9uICckJEtFUk5FTF9SRUxFQVNFJyAiIDsgZXhpdCAxOyBmaTsKKwllY2hvICckKEJPQVJEX0tFUk5FTF9WRVJTSU9OKScgPiAkQAorCitpZmRlZiBCT0FSRF9LRVJORUxfQ09ORklHX0ZJTEUKKyQoQlVJTFRfS0VSTkVMX0NPTkZJR1NfRklMRSk6ICQoQk9BUkRfS0VSTkVMX0NPTkZJR19GSUxFKQorCWNwICQ8ICRACisKKyQoY2FsbCBkZWNsYXJlLWxpY2Vuc2UtbWV0YWRhdGEsJChCVUlMVF9LRVJORUxfQ09ORklHU19GSUxFKSxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1HUEwtMi4wLW9ubHkscmVzdHJpY3RlZCwkKEJVSUxEX1NZU1RFTSkvTElOVVhfS0VSTkVMX0NPUFlJTkcsIktlcm5lbCIsa2VybmVsKQorJChjYWxsIGRlY2xhcmUtbGljZW5zZS1tZXRhZGF0YSwkKEJVSUxUX0tFUk5FTF9WRVJTSU9OX0ZJTEUpLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUdQTC0yLjAtb25seSxyZXN0cmljdGVkLCQoQlVJTERfU1lTVEVNKS9MSU5VWF9LRVJORUxfQ09QWUlORywiS2VybmVsIixrZXJuZWwpCisKK215X2JvYXJkX2V4dHJhY3RlZF9rZXJuZWwgOj0gdHJ1ZQorZW5kaWYgIyBCT0FSRF9LRVJORUxfQ09ORklHX0ZJTEUKK2VuZGlmICMgQk9BUkRfS0VSTkVMX1ZFUlNJT04KKwogCiBpZm5lcSAoJChteV9ib2FyZF9leHRyYWN0ZWRfa2VybmVsKSx0cnVlKQogaWZkZWYgSU5TVEFMTEVEX0tFUk5FTF9UQVJHRVQKK2lmbmRlZiBCT0FSRF9LRVJORUxfVkVSU0lPTgogJChCVUlMVF9LRVJORUxfQ09ORklHU19GSUxFKTogLktBVElfSU1QTElDSVRfT1VUUFVUUyA6PSAkKEJVSUxUX0tFUk5FTF9WRVJTSU9OX0ZJTEUpCitlbmRpZgogJChCVUlMVF9LRVJORUxfQ09ORklHU19GSUxFKTogUFJJVkFURV9ERUNPTVBSRVNTX1RPT0xTIDo9ICQobXlfZGVjb21wcmVzc190b29scykKICQoQlVJTFRfS0VSTkVMX0NPTkZJR1NfRklMRSk6ICQoZm9yZWFjaCBwYWlyLCQobXlfZGVjb21wcmVzc190b29scyksJChjYWxsIHdvcmQtY29sb24sMiwkKHBhaXIpKSkKICQoQlVJTFRfS0VSTkVMX0NPTkZJR1NfRklMRSk6ICQoRVhUUkFDVF9LRVJORUwpICQoZmlyc3R3b3JkICQoSU5TVEFMTEVEX0tFUk5FTF9UQVJHRVQpKQogCSQ8IC0tdG9vbHMgJChQUklWQVRFX0RFQ09NUFJFU1NfVE9PTFMpIC0taW5wdXQgJChmaXJzdHdvcmQgJChJTlNUQUxMRURfS0VSTkVMX1RBUkdFVCkpIFwKIAkgIC0tb3V0cHV0LWNvbmZpZ3MgJEAgXAotCSAgLS1vdXRwdXQtcmVsZWFzZSAkKEJVSUxUX0tFUk5FTF9WRVJTSU9OX0ZJTEUpCisJICAkKGlmICQoQk9BUkRfS0VSTkVMX1ZFUlNJT04pLCwtLW91dHB1dC1yZWxlYXNlICQoQlVJTFRfS0VSTkVMX1ZFUlNJT05fRklMRSkpCiAKICQoY2FsbCBkZWNsYXJlLWxpY2Vuc2UtbWV0YWRhdGEsJChCVUlMVF9LRVJORUxfQ09ORklHU19GSUxFKSxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1HUEwtMi4wLW9ubHkscmVzdHJpY3RlZCwkKEJVSUxEX1NZU1RFTSkvTElOVVhfS0VSTkVMX0NPUFlJTkcsIktlcm5lbCIsa2VybmVsKQogCkBAIC00OTA1LDYgKzU0MzAsMzQgQEAKIAogZW5kaWYgIyBQUk9EVUNUX09UQV9FTkZPUkNFX1ZJTlRGX0tFUk5FTF9SRVFVSVJFTUVOVFMKIAoraWZlcSAoZGVmYXVsdCwkKEVOQUJMRV9VRkZEX0dDKSkKKworaWZuZXEgKCwkKEJVSUxUX0tFUk5FTF9WRVJTSU9OX0ZJTEUpKQorJChCVUlMVF9LRVJORUxfVkVSU0lPTl9GSUxFX0ZPUl9VRkZEX0dDKTogJChCVUlMVF9LRVJORUxfVkVSU0lPTl9GSUxFKQorJChCVUlMVF9LRVJORUxfVkVSU0lPTl9GSUxFX0ZPUl9VRkZEX0dDKToKKwljcCAkKEJVSUxUX0tFUk5FTF9WRVJTSU9OX0ZJTEUpICQoQlVJTFRfS0VSTkVMX1ZFUlNJT05fRklMRV9GT1JfVUZGRF9HQykKK2Vsc2UKKyMgV2UgbWFrZSB0aGlzIGEgd2FybmluZyByYXRoZXIgdGhhbiBhbiBlcnJvciB0byBhdm9pZCBicmVha2luZyB0b28gbWFueSBidWlsZHMuIFdoZW4gaXQgaGFwcGVucywKKyMgd2UgdXNlIGEgcGxhY2Vob2xkZXIgYXMgdGhlIGtlcm5lbCB2ZXJzaW9uLCB3aGljaCBpcyBjb25zdW1lZCBieSB1ZmZkX2djX3V0aWxzLnB5LgorJChCVUlMVF9LRVJORUxfVkVSU0lPTl9GSUxFX0ZPUl9VRkZEX0dDKToKKwllY2hvICQkJ1wKK1VuYWJsZSB0byBkZXRlcm1pbmUgVUZGRCBHQyBmbGFnIGJlY2F1c2UgdGhlIGtlcm5lbCB2ZXJzaW9uIGlzIG5vdCBhdmFpbGFibGUgYW5kXG5cCitQUk9EVUNUX0VOQUJMRV9VRkZEX0dDIGlzICJkZWZhdWx0Ii5cblwKK1lvdSBjYW4gZml4IHRoaXMgYnk6XG5cCisgIDEuIFtSZWNvbW1lbmRlZF0gTWFraW5nIHRoZSBrZXJuZWwgdmVyc2lvbiBhdmFpbGFibGUuXG5cCisgICAgKDEpLiBTZXQgUFJPRFVDVF9PVEFfRU5GT1JDRV9WSU5URl9LRVJORUxfUkVRVUlSRU1FTlRTIHRvICJ0cnVlIi5cblwKKyAgICAoMikuIElmIHlvdSBhcmUgc3RpbGwgZ2V0dGluZyB0aGlzIG1lc3NhZ2UgYWZ0ZXIgZG9pbmcgc28sIHNlZSB0aGUgd2FybmluZyBhYm91dFxuXAorICAgICAgICAgUFJPRFVDVF9PVEFfRU5GT1JDRV9WSU5URl9LRVJORUxfUkVRVUlSRU1FTlRTIGluIHRoZSBidWlsZCBsb2dzLlxuXAorICBvclxuXAorICAyLiBFeHBsaWNpdGx5IHNldHRpbmcgUFJPRFVDVF9FTkFCTEVfVUZGRF9HQyB0byAidHJ1ZSIgb3IgImZhbHNlIiBiYXNlZCBvbiB0aGUga2VybmVsIHZlcnNpb24uXG5cCisgICAgKDEpLiBTZXQgUFJPRFVDVF9FTkFCTEVfVUZGRF9HQyB0byAidHJ1ZSIgaWYgdGhlIGtlcm5lbCBpcyBhIEdLSSBrZXJuZWwgYW5kIGlzIGFuZHJvaWQxMi01LjRcblwKKyAgICAgICAgIG9yIGFib3ZlLCBvciBhIG5vbi1HS0kga2VybmVsIHRoYXQgc3VwcG9ydHMgdXNlcmZhdWx0ZmQoMikgYW5kIE1SRU1BUF9ET05UVU5NQVAuXG5cCisgICAgKDIpLiBTZXQgUFJPRFVDVF9FTkFCTEVfVUZGRF9HQyB0byAiZmFsc2UiIG90aGVyd2lzZS4nXAorCSAgJiYgZWNobyAnPHVua25vd24ta2VybmVsPicgPiAkQAorZW5kaWYgIyBCVUlMVF9LRVJORUxfVkVSU0lPTl9GSUxFCisKK2VuZGlmICMgRU5BQkxFX1VGRkRfR0MgPT0gImRlZmF1bHQiCisKICMgLS0gQ2hlY2sgVklOVEYgY29tcGF0aWJpbGl0eSBvZiBidWlsZC4KICMgU2tpcCBwYXJ0aWFsIGJ1aWxkczsgb25seSBjaGVjayBmdWxsIGJ1aWxkcy4gT25seSBjaGVjayBpZjoKICMgLSBQUk9EVUNUX0VORk9SQ0VfVklOVEZfTUFOSUZFU1QgaXMgdHJ1ZQpAQCAtNTExNiw2ICs1NjY5LDcgQEAKICAgYnJvdGxpIFwKICAgYnNkaWZmIFwKICAgYnVpbGRfaW1hZ2UgXAorICBidWlsZF9taXhlZF9rZXJuZWxzX3JhbWRpc2tfaG9zdCBcCiAgIGJ1aWxkX3N1cGVyX2ltYWdlIFwKICAgYnVpbGRfdmVyaXR5X21ldGFkYXRhIFwKICAgYnVpbGRfdmVyaXR5X3RyZWUgXApAQCAtNTEzMyw3ICs1Njg3LDYgQEAKICAgZnNjay5lcm9mcyBcCiAgIGZzY2suZjJmcyBcCiAgIGZzX2NvbmZpZyBcCi0gIGdlbmVyYXRlX2draV9jZXJ0aWZpY2F0ZSBcCiAgIGdlbmVyYXRlX3Zlcml0eV9rZXkgXAogICBob3N0X2luaXRfdmVyaWZpZXIgXAogICBpbWcyc2ltZyBcCkBAIC01MTQ4LDcgKzU3MDEsNiBAQAogICBtYWtlX2YyZnNfY2FzZWZvbGQgXAogICBtZXJnZV9vdGEgXAogICBtZXJnZV90YXJnZXRfZmlsZXMgXAotICBtaW5pZ3ppcCBcCiAgIG1rX2NvbWJpbmVkX2ltZyBcCiAgIG1rYm9vdGZzIFwKICAgbWtib290aW1nIFwKQEAgLTUxNzUsNiArNTcyNyw3IEBACiAgIHRveWJveCBcCiAgIHR1bmUyZnMgXAogICB1bnBhY2tfYm9vdGltZyBcCisgIHVwZGF0ZV9kZXZpY2UgXAogICB1cGRhdGVfaG9zdF9zaW11bGF0b3IgXAogICB2YWxpZGF0ZV90YXJnZXRfZmlsZXMgXAogICB2ZXJpdHlfc2lnbmVyIFwKQEAgLTUxODYsMjQgKzU3MzksMTcgQEAKIAogIyBBZGRpdGlvbmFsIHRvb2xzIHRvIHVucGFjayBhbmQgcmVwYWNrIHRoZSBhcGV4IGZpbGUuCiBJTlRFUk5BTF9PVEFUT09MU19NT0RVTEVTICs9IFwKKyAgYXBleGRfaG9zdCBcCiAgIGFwZXhlciBcCiAgIGFwZXhfY29tcHJlc3Npb25fdG9vbCBcCi0gIGJsa2lkX3N0YXRpYyBcCiAgIGRlYXBleGVyIFwKICAgZGVidWdmc19zdGF0aWMgXAotICBkdW1wX2FwZXhfaW5mbyBcCiAgIGZzY2suZXJvZnMgXAogICBtYWtlX2Vyb2ZzIFwKICAgbWVyZ2VfemlwcyBcCiAgIHJlc2l6ZTJmcyBcCiAgIHNvb25nX3ppcCBcCiAKLWlmZXEgKHRydWUsJChQUk9EVUNUX1NVUFBPUlRTX1ZCT09UKSkKLUlOVEVSTkFMX09UQVRPT0xTX01PRFVMRVMgKz0gXAotICBmdXRpbGl0eS1ob3N0IFwKLSAgdmJvb3Rfc2lnbmVyCi1lbmRpZgotCiBJTlRFUk5BTF9PVEFUT09MU19GSUxFUyA6PSBcCiAgICQoZmlsdGVyICQoSE9TVF9PVVQpLyUsJChjYWxsIG1vZHVsZS1pbnN0YWxsZWQtZmlsZXMsJChJTlRFUk5BTF9PVEFUT09MU19NT0RVTEVTKSkpCiAKQEAgLTUyMzksMTAgKzU3ODUsNiBAQAogICAkKHNvcnQgJChzaGVsbCBmaW5kIGV4dGVybmFsL2F2Yi90ZXN0L2RhdGEgLXR5cGUgZiAtbmFtZSAidGVzdGtleV8qLnBlbSIgLW8gXAogICAgICAgLW5hbWUgImF0eF9tZXRhZGF0YS5iaW4iKSkKIGVuZGlmCi1pZmVxICh0cnVlLCQoUFJPRFVDVF9TVVBQT1JUU19WQk9PVCkpCi1JTlRFUk5BTF9PVEFUT09MU19QQUNLQUdFX0ZJTEVTICs9IFwKLSAgJChzb3J0ICQoc2hlbGwgZmluZCBleHRlcm5hbC92Ym9vdF9yZWZlcmVuY2UvdGVzdHMvZGV2a2V5cyAtdHlwZSBmKSkKLWVuZGlmCiAKIElOVEVSTkFMX09UQVRPT0xTX1JFTEVBU0VUT09MUyA6PSBcCiAgICQoc2hlbGwgZmluZCBidWlsZC9tYWtlL3Rvb2xzL3JlbGVhc2V0b29scyAtbmFtZSAiKi5weWMiIC1wcnVuZSAtbyBcCkBAIC01Mjc1LDYgKzU4MTcsODEgQEAKIGVuZGlmICMgYnVpbGRfb3RhdG9vbHNfcGFja2FnZQogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICBmYXN0Ym9vdC1pbmZvLnR4dAorRkFTVEJPT1RfSU5GT19WRVJTSU9OID0gMQorCitJTlNUQUxMRURfRkFTVEJPT1RfSU5GT19UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvZmFzdGJvb3QtaW5mby50eHQKK2lmZGVmIFRBUkdFVF9CT0FSRF9GQVNUQk9PVF9JTkZPX0ZJTEUKKyQoSU5TVEFMTEVEX0ZBU1RCT09UX0lORk9fVEFSR0VUKTogJChUQVJHRVRfQk9BUkRfRkFTVEJPT1RfSU5GT19GSUxFKQorCXJtIC1mICRACisJJChjYWxsIHByZXR0eSwiVGFyZ2V0IGZhc3Rib290LWluZm8udHh0OiAkQCIpCisJJChoaWRlKSBjcCAkPCAkQAorZWxzZQorJChJTlNUQUxMRURfRkFTVEJPT1RfSU5GT19UQVJHRVQpOgorCXJtIC1mICRACisJJChjYWxsIHByZXR0eSwiVGFyZ2V0IGZhc3Rib290LWluZm8udHh0OiAkQCIpCisJJChoaWRlKSBlY2hvICIjIGZhc3Rib290LWluZm8gZm9yICQoVEFSR0VUX1BST0RVQ1QpIiA+PiAkQAorCSQoaGlkZSkgZWNobyAidmVyc2lvbiAkKEZBU1RCT09UX0lORk9fVkVSU0lPTikiID4+ICRACitpZm5lcSAoJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCksKQorCSQoaGlkZSkgZWNobyAiZmxhc2ggYm9vdCIgPj4gJEAKK2VuZGlmCitpZm5lcSAoJChJTlNUQUxMRURfSU5JVF9CT09UX0lNQUdFX1RBUkdFVCksKQorCSQoaGlkZSkgZWNobyAiZmxhc2ggaW5pdF9ib290IiA+PiAkQAorZW5kaWYKK2lmZGVmIEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRQorCSQoaGlkZSkgZWNobyAiZmxhc2ggZHRibyIgPj4gJEAKK2VuZGlmCitpZm5lcSAoJChJTlNUQUxMRURfRFRJTUFHRV9UQVJHRVQpLCkKKwkkKGhpZGUpIGVjaG8gImZsYXNoIGR0cyBkdC5pbWciID4+ICRACitlbmRpZgoraWZuZXEgKCQoSU5TVEFMTEVEX1ZFTkRPUl9LRVJORUxfQk9PVElNQUdFX1RBUkdFVCksKQorCSQoaGlkZSkgZWNobyAiZmxhc2ggdmVuZG9yX2tlcm5lbF9ib290IiA+PiAkQAorZW5kaWYKK2lmbmVxICgkKElOU1RBTExFRF9SRUNPVkVSWUlNQUdFX1RBUkdFVCksKQorCSQoaGlkZSkgZWNobyAiZmxhc2ggcmVjb3ZlcnkiID4+ICRACitlbmRpZgoraWZlcSAoJChCT0FSRF9VU0VTX1BWTUZXSU1BR0UpLHRydWUpCisJJChoaWRlKSBlY2hvICJmbGFzaCBwdm1mdyIgPj4gJEAKK2VuZGlmCitpZm5lcSAoJChJTlNUQUxMRURfVkVORE9SX0JPT1RJTUFHRV9UQVJHRVQpLCkKKwkkKGhpZGUpIGVjaG8gImZsYXNoIHZlbmRvcl9ib290IiA+PiAkQAorZW5kaWYKK2lmZXEgKCQoQk9BUkRfQVZCX0VOQUJMRSksdHJ1ZSkKK2lmZXEgKCQoQlVJTERJTkdfVkJNRVRBX0lNQUdFKSx0cnVlKQorCSQoaGlkZSkgZWNobyAiZmxhc2ggLS1hcHBseS12Ym1ldGEgdmJtZXRhIiA+PiAkQAorZW5kaWYKK2lmbmVxICgsJChzdHJpcCAkKEJPQVJEX0FWQl9WQk1FVEFfU1lTVEVNKSkpCisJJChoaWRlKSBlY2hvICJmbGFzaCB2Ym1ldGFfc3lzdGVtIiA+PiAkQAorZW5kaWYKK2lmbmVxICgsJChzdHJpcCAkKEJPQVJEX0FWQl9WQk1FVEFfVkVORE9SKSkpCisJJChoaWRlKSBlY2hvICJmbGFzaCB2Ym1ldGFfdmVuZG9yIiA+PiAkQAorZW5kaWYKK2lmbmVxICgsJChzdHJpcCAkKEJPQVJEX0FWQl9WQk1FVEFfQ1VTVE9NX1BBUlRJVElPTlMpKSkKKwkkKGhpZGUpICQoZm9yZWFjaCBwYXJ0aXRpb24sJChCT0FSRF9BVkJfVkJNRVRBX0NVU1RPTV9QQVJUSVRJT05TKSwgXAorCSAgZWNobyAiZmxhc2ggdmJtZXRhXyQocGFydGl0aW9uKSIgPj4gJEA7KQorZW5kaWYKK2VuZGlmICMgQk9BUkRfQVZCX0VOQUJMRQoraWZuZXEgKCwkKHN0cmlwICQoQk9BUkRfQ1VTVE9NSU1BR0VTX1BBUlRJVElPTl9MSVNUKSkpCisJJChoaWRlKSAkKGZvcmVhY2ggcGFydGl0aW9uLCQoQk9BUkRfQ1VTVE9NSU1BR0VTX1BBUlRJVElPTl9MSVNUKSwgXAorCSAgZWNobyAiZmxhc2ggJChwYXJ0aXRpb24pIiA+PiAkQDspCitlbmRpZgorCSQoaGlkZSkgZWNobyAicmVib290IGZhc3Rib290IiA+PiAkQAorCSQoaGlkZSkgZWNobyAidXBkYXRlLXN1cGVyIiA+PiAkQAorCSQoaGlkZSkgJChmb3JlYWNoIHBhcnRpdGlvbiwkKEJPQVJEX1NVUEVSX1BBUlRJVElPTl9QQVJUSVRJT05fTElTVCksIFwKKwkgIGVjaG8gImZsYXNoICQocGFydGl0aW9uKSIgPj4gJEA7KQoraWZkZWYgQlVJTERJTkdfU1lTVEVNX09USEVSX0lNQUdFCisJJChoaWRlKSBlY2hvICJmbGFzaCAtLXNsb3Qtb3RoZXIgc3lzdGVtIHN5c3RlbV9vdGhlci5pbWciID4+ICRACitlbmRpZgoraWZkZWYgQlVJTERJTkdfQ0FDSEVfSU1BR0UKKwkkKGhpZGUpIGVjaG8gImlmLXdpcGUgZXJhc2UgY2FjaGUiID4+ICRACitlbmRpZgorCSQoaGlkZSkgZWNobyAiaWYtd2lwZSBlcmFzZSB1c2VyZGF0YSIgPj4gJEAKK2lmZXEgKCQoQk9BUkRfVVNFU19NRVRBREFUQV9QQVJUSVRJT04pLHRydWUpCisJJChoaWRlKSBlY2hvICJpZi13aXBlIGVyYXNlIG1ldGFkYXRhIiA+PiAkQAorZW5kaWYKK2VuZGlmCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgIG1pc2NfaW5mby50eHQKIAogSU5TVEFMTEVEX01JU0NfSU5GT19UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvbWlzY19pbmZvLnR4dApAQCAtNTM1NCwxMSArNTk3MSw2IEBACiAJJChoaWRlKSBlY2hvICdyZWNvdmVyeV9ta2Jvb3RpbWdfYXJncz0kKEJPQVJEX1JFQ09WRVJZX01LQk9PVElNR19BUkdTKScgPj4gJEAKIAkkKGhpZGUpIGVjaG8gJ21rYm9vdGltZ192ZXJzaW9uX2FyZ3M9JChJTlRFUk5BTF9NS0JPT1RJTUdfVkVSU0lPTl9BUkdTKScgPj4gJEAKIAkkKGhpZGUpIGVjaG8gJ21rYm9vdGltZ19pbml0X2FyZ3M9JChCT0FSRF9NS0JPT1RJTUdfSU5JVF9BUkdTKScgPj4gJEAKLWlmZGVmIEJPQVJEX0dLSV9TSUdOSU5HX0tFWV9QQVRICi0JJChoaWRlKSBlY2hvICdna2lfc2lnbmluZ19rZXlfcGF0aD0kKEJPQVJEX0dLSV9TSUdOSU5HX0tFWV9QQVRIKScgPj4gJEAKLQkkKGhpZGUpIGVjaG8gJ2draV9zaWduaW5nX2FsZ29yaXRobT0kKEJPQVJEX0dLSV9TSUdOSU5HX0FMR09SSVRITSknID4+ICRACi0JJChoaWRlKSBlY2hvICdna2lfc2lnbmluZ19zaWduYXR1cmVfYXJncz0kKEJPQVJEX0dLSV9TSUdOSU5HX1NJR05BVFVSRV9BUkdTKScgPj4gJEAKLWVuZGlmCiAJJChoaWRlKSBlY2hvICJtdWx0aXN0YWdlX3N1cHBvcnQ9MSIgPj4gJEAKIAkkKGhpZGUpIGVjaG8gImJsb2NraW1nZGlmZl92ZXJzaW9ucz0zLDQiID4+ICRACiBpZmVxICgkKFBST0RVQ1RfQlVJTERfR0VORVJJQ19PVEFfUEFDS0FHRSksdHJ1ZSkKQEAgLTU0MTcsMTUgKzYwMjksMjAgQEAKIAkkKGhpZGUpIGVjaG8gImF2Yl9yZWNvdmVyeV9yb2xsYmFja19pbmRleF9sb2NhdGlvbj0kKEJPQVJEX0FWQl9SRUNPVkVSWV9ST0xMQkFDS19JTkRFWF9MT0NBVElPTikiID4+ICRACiBlbmRpZiAjIEJPQVJEX0FWQl9SRUNPVkVSWV9LRVlfUEFUSAogaWZuZXEgKCwkKHN0cmlwICQoQk9BUkRfQ1VTVE9NSU1BR0VTX1BBUlRJVElPTl9MSVNUKSkpCi0JJChoaWRlKSBlY2hvICJhdmJfY3VzdG9tX2ltYWdlc19wYXJ0aXRpb25fbGlzdD0kKEJPQVJEX0NVU1RPTUlNQUdFU19QQVJUSVRJT05fTElTVCkiID4+ICRACi0JJChoaWRlKSAkKGZvcmVhY2ggcGFydGl0aW9uLCQoQk9BUkRfQ1VTVE9NSU1BR0VTX1BBUlRJVElPTl9MSVNUKSwgXAorCSQoaGlkZSkgZWNobyAiY3VzdG9tX2ltYWdlc19wYXJ0aXRpb25fbGlzdD0kKGZpbHRlci1vdXQgJChCT0FSRF9BVkJfQ1VTVE9NSU1BR0VTX1BBUlRJVElPTl9MSVNUKSwgJChCT0FSRF9DVVNUT01JTUFHRVNfUEFSVElUSU9OX0xJU1QpKSIgPj4gJEAKKwkkKGhpZGUpICQoZm9yZWFjaCBwYXJ0aXRpb24sJChmaWx0ZXItb3V0ICQoQk9BUkRfQVZCX0NVU1RPTUlNQUdFU19QQVJUSVRJT05fTElTVCksICQoQk9BUkRfQ1VTVE9NSU1BR0VTX1BBUlRJVElPTl9MSVNUKSksIFwKKwkgICAgZWNobyAiJChwYXJ0aXRpb24pX2ltYWdlX2xpc3Q9JChmb3JlYWNoIGltYWdlLCQoQk9BUkRfJChjYWxsIHRvLXVwcGVyLCQocGFydGl0aW9uKSlfSU1BR0VfTElTVCksJChub3RkaXIgJChpbWFnZSkpKSIgPj4gJEA7KQorZW5kaWYgIyBCT0FSRF9DVVNUT01JTUFHRVNfUEFSVElUSU9OX0xJU1QKK2lmbmVxICgsJChzdHJpcCAkKEJPQVJEX0FWQl9DVVNUT01JTUFHRVNfUEFSVElUSU9OX0xJU1QpKSkKKwkkKGhpZGUpIGVjaG8gImF2Yl9jdXN0b21faW1hZ2VzX3BhcnRpdGlvbl9saXN0PSQoQk9BUkRfQVZCX0NVU1RPTUlNQUdFU19QQVJUSVRJT05fTElTVCkiID4+ICRACisJJChoaWRlKSAkKGZvcmVhY2ggcGFydGl0aW9uLCQoQk9BUkRfQVZCX0NVU1RPTUlNQUdFU19QQVJUSVRJT05fTElTVCksIFwKIAkgICAgZWNobyAiYXZiXyQocGFydGl0aW9uKV9rZXlfcGF0aD0kKEJPQVJEX0FWQl8kKGNhbGwgdG8tdXBwZXIsJChwYXJ0aXRpb24pKV9LRVlfUEFUSCkiICA+PiAkQDsgXAogCSAgICBlY2hvICJhdmJfJChwYXJ0aXRpb24pX2FsZ29yaXRobT0kKEJPQVJEX0FWQl8kKGNhbGwgdG8tdXBwZXIsJChwYXJ0aXRpb24pKV9BTEdPUklUSE0pIiAgPj4gJEA7IFwKIAkgICAgZWNobyAiYXZiXyQocGFydGl0aW9uKV9hZGRfaGFzaHRyZWVfZm9vdGVyX2FyZ3M9JChCT0FSRF9BVkJfJChjYWxsIHRvLXVwcGVyLCQocGFydGl0aW9uKSlfQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTKSIgID4+ICRAOyBcCiAJICAgIGVjaG8gImF2Yl8kKHBhcnRpdGlvbilfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb249JChCT0FSRF9BVkJfJChjYWxsIHRvLXVwcGVyLCQocGFydGl0aW9uKSlfUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT04pIiAgPj4gJEA7IFwKIAkgICAgZWNobyAiYXZiXyQocGFydGl0aW9uKV9wYXJ0aXRpb25fc2l6ZT0kKEJPQVJEX0FWQl8kKGNhbGwgdG8tdXBwZXIsJChwYXJ0aXRpb24pKV9QQVJUSVRJT05fU0laRSkiICA+PiAkQDsgXAogCSAgICBlY2hvICJhdmJfJChwYXJ0aXRpb24pX2ltYWdlX2xpc3Q9JChmb3JlYWNoIGltYWdlLCQoQk9BUkRfQVZCXyQoY2FsbCB0by11cHBlciwkKHBhcnRpdGlvbikpX0lNQUdFX0xJU1QpLCQobm90ZGlyICQoaW1hZ2UpKSkiID4+ICRAOykKLWVuZGlmICMgQk9BUkRfQ1VTVE9NSU1BR0VTX1BBUlRJVElPTl9MSVNUCitlbmRpZiAjIEJPQVJEX0FWQl9DVVNUT01JTUFHRVNfUEFSVElUSU9OX0xJU1QKIGlmbmVxICgsJChzdHJpcCAkKEJPQVJEX0FWQl9WQk1FVEFfU1lTVEVNKSkpCiAJJChoaWRlKSBlY2hvICJhdmJfdmJtZXRhX3N5c3RlbT0kKEJPQVJEX0FWQl9WQk1FVEFfU1lTVEVNKSIgPj4gJEAKIAkkKGhpZGUpIGVjaG8gImF2Yl92Ym1ldGFfc3lzdGVtX2FyZ3M9JChCT0FSRF9BVkJfTUFLRV9WQk1FVEFfU1lTVEVNX0lNQUdFX0FSR1MpIiA+PiAkQApAQCAtNTQ1MCwxNCArNjA2Nyw2IEBACiAJZWNobyAiYXZiX3ZibWV0YV8kKHBhcnRpdGlvbilfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb249JChCT0FSRF9BVkJfVkJNRVRBXyQoY2FsbCB0by11cHBlciwkKHBhcnRpdGlvbikpX1JPTExCQUNLX0lOREVYX0xPQ0FUSU9OKSIgPj4gJEAgOykKIGVuZGlmICMgQk9BUkRfQVZCX1ZCTUVUQV9DVVNUT01fUEFSVElUSU9OUwogZW5kaWYgIyBCT0FSRF9BVkJfRU5BQkxFCi1pZmRlZiBCT0FSRF9CUFRfSU5QVVRfRklMRVMKLQkkKGhpZGUpIGVjaG8gImJvYXJkX2JwdF9lbmFibGU9dHJ1ZSIgPj4gJEAKLQkkKGhpZGUpIGVjaG8gImJvYXJkX2JwdF9tYWtlX3RhYmxlX2FyZ3M9JChCT0FSRF9CUFRfTUFLRV9UQUJMRV9BUkdTKSIgPj4gJEAKLQkkKGhpZGUpIGVjaG8gImJvYXJkX2JwdF9pbnB1dF9maWxlcz0kKEJPQVJEX0JQVF9JTlBVVF9GSUxFUykiID4+ICRACi1lbmRpZgotaWZkZWYgQk9BUkRfQlBUX0RJU0tfU0laRQotCSQoaGlkZSkgZWNobyAiYm9hcmRfYnB0X2Rpc2tfc2l6ZT0kKEJPQVJEX0JQVF9ESVNLX1NJWkUpIiA+PiAkQAotZW5kaWYKIAkkKGNhbGwgZ2VuZXJhdGUtdXNlcmltYWdlLXByb3AtZGljdGlvbmFyeSwgJEApCiBpZmVxICgkKEFCX09UQV9VUERBVEVSKSx0cnVlKQogCUAjIEluY2x1ZGUgdGhlIGJ1aWxkIHR5cGUgaW4gTUVUQS9taXNjX2luZm8udHh0IHNvIHRoZSBzZXJ2ZXIgY2FuIGVhc2lseSBkaWZmZXJlbnRpYXRlIHByb2R1Y3Rpb24gYnVpbGRzLgpAQCAtNTQ2Nyw2ICs2MDc2LDkgQEAKIGlmZXEgKCQoVEFSR0VUX09UQV9BTExPV19OT05fQUIpLHRydWUpCiAJJChoaWRlKSBlY2hvICJhbGxvd19ub25fYWI9dHJ1ZSIgPj4gJEAKIGVuZGlmCitpZmVxICgkKEJPQVJEX05PTl9BQl9PVEFfRElTQUJMRV9DT01QUkVTU0lPTiksdHJ1ZSkKKwkkKGhpZGUpIGVjaG8gImJvYXJkX25vbl9hYl9vdGFfZGlzYWJsZV9jb21wcmVzc2lvbj10cnVlIiA+PiAkQAorZW5kaWYKIGlmZGVmIEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRQogCSQoaGlkZSkgZWNobyAiaGFzX2R0Ym89dHJ1ZSIgPj4gJEAKIGlmZXEgKCQoQk9BUkRfQVZCX0VOQUJMRSksdHJ1ZSkKQEAgLTU1MjAsOSArNjEzMiwxMyBAQAogaWZlcSAoJChCVUlMRElOR19XSVRIX1ZTREspLHRydWUpCiAJJChoaWRlKSBlY2hvICJidWlsZGluZ193aXRoX3ZzZGs9dHJ1ZSIgPj4gJEAKIGVuZGlmCi1pZmVxICgkKFRBUkdFVF9GTEFUVEVOX0FQRVgpLGZhbHNlKQotCSQoaGlkZSkgZWNobyAidGFyZ2V0X2ZsYXR0ZW5fYXBleD1mYWxzZSIgPj4gJEAKLWVuZGlmCisKKyQoY2FsbCBkZWNsYXJlLTBwLXRhcmdldCwkKElOU1RBTExFRF9GQVNUQk9PVF9JTkZPX1RBUkdFVCkpCisKKy5QSE9OWTogZmFzdGJvb3RfaW5mbworZmFzdGJvb3RfaW5mbzogJChJTlNUQUxMRURfRkFTVEJPT1RfSU5GT19UQVJHRVQpCisKK2Ryb2lkY29yZS11bmJ1bmRsZWQ6ICQoSU5TVEFMTEVEX0ZBU1RCT09UX0lORk9fVEFSR0VUKQogCiAkKGNhbGwgZGVjbGFyZS0wcC10YXJnZXQsJChJTlNUQUxMRURfTUlTQ19JTkZPX1RBUkdFVCkpCiAKQEAgLTU1NDAsMjEgKzYxNTYsMjYgQEAKIGlmZXEgKCQoVEFSR0VUX0JVSUxEX1RZUEUpLGRlYnVnKQogICBuYW1lIDo9ICQobmFtZSlfZGVidWcKIGVuZGlmCi1uYW1lIDo9ICQobmFtZSktdGFyZ2V0X2ZpbGVzLSQoRklMRV9OQU1FX1RBRykKK25hbWUgOj0gJChuYW1lKS10YXJnZXRfZmlsZXMKIAogaW50ZXJtZWRpYXRlcyA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyx0YXJnZXRfZmlsZXMpCitCVUlMVF9UQVJHRVRfRklMRVNfRElSIDo9ICQoaW50ZXJtZWRpYXRlcykvJChuYW1lKS56aXAubGlzdAogQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UgOj0gJChpbnRlcm1lZGlhdGVzKS8kKG5hbWUpLnppcAotJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6IGludGVybWVkaWF0ZXMgOj0gJChpbnRlcm1lZGlhdGVzKQotJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6IFwKLQkgICAgemlwX3Jvb3QgOj0gJChpbnRlcm1lZGlhdGVzKS8kKG5hbWUpCiskKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogemlwX3Jvb3QgOj0gJChpbnRlcm1lZGlhdGVzKS8kKG5hbWUpCiskKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiB6aXBfcm9vdCA6PSAkKGludGVybWVkaWF0ZXMpLyQobmFtZSkKKyQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6IGludGVybWVkaWF0ZXMgOj0gJChpbnRlcm1lZGlhdGVzKQorCitpZm5lcSAoJChTT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRV9QQVRIKSwpCisgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0VfUEFUSCkKK2VuZGlmCiAKICMgJCgxKTogRGlyZWN0b3J5IHRvIGNvcHkKICMgJCgyKTogTG9jYXRpb24gdG8gY29weSBpdCB0bwotIyBUaGUgImxzIC1BIiBpcyB0byBwcmV2ZW50ICJhY3Agcy8qIGQiIGZyb20gZmFpbGluZyBpZiBzIGlzIGVtcHR5LgorIyBUaGUgImxzIC1BIiBpcyB0byBza2lwIGlmICQoMSkgaXMgZW1wdHkuCiBkZWZpbmUgcGFja2FnZV9maWxlcy1jb3B5LXJvb3QKICAgaWYgWyAtZCAiJChzdHJpcCAkKDEpKSIgLWEgIiQkKGxzIC1BICQoMSkpIiBdOyB0aGVuIFwKICAgICBta2RpciAtcCAkKDIpICYmIFwKLSAgICAkKEFDUCkgLXJkICQoc3RyaXAgJCgxKSkvKiAkKDIpOyBcCisgICAgJChBQ1ApIC1yZCAkKHN0cmlwICQoMSkpLy4gJChzdHJpcCAkKDIpKS87IFwKICAgZmkKIGVuZGVmCiAKQEAgLTU1NjYsMTAgKzYxODcsMTAgQEAKICAgICAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEVYRUNVVEFCTEVTLHVwZGF0ZXIpL3VwZGF0ZXIKIGVuZGlmCiAKLSQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOiBQUklWQVRFX09UQV9UT09MUyA6PSAkKGJ1aWx0X290YV90b29scykKKyQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6IFBSSVZBVEVfT1RBX1RPT0xTIDo9ICQoYnVpbHRfb3RhX3Rvb2xzKQogCiB0b29sX2V4dGVuc2lvbiA6PSAkKHdpbGRjYXJkICQodG9vbF9leHRlbnNpb25zKS9yZWxlYXNldG9vbHMucHkpCi0kKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogUFJJVkFURV9UT09MX0VYVEVOU0lPTiA6PSAkKHRvb2xfZXh0ZW5zaW9uKQorJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogUFJJVkFURV9UT09MX0VYVEVOU0lPTiA6PSAkKHRvb2xfZXh0ZW5zaW9uKQogCiB1cGRhdGVyX2RlcCA6PQogaWZlcSAoJChBQl9PVEFfVVBEQVRFUiksdHJ1ZSkKQEAgLTU1ODUsMjkgKzYyMDYsMjMgQEAKIHVwZGF0ZXJfZGVwICs9ICQoYnVpbHRfb3RhX3Rvb2xzKQogZW5kaWYKIAotJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6ICQodXBkYXRlcl9kZXApCiskKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKHVwZGF0ZXJfZGVwKQogCiAjIElmIHdlIGFyZSB1c2luZyByZWNvdmVyeSBhcyBib290LCBvdXRwdXQgcmVjb3ZlcnkgZmlsZXMgdG8gQk9PVC8uCiAjIElmIHdlIGFyZSBtb3ZpbmcgcmVjb3ZlcnkgcmVzb3VyY2VzIHRvIHZlbmRvcl9ib290LCBvdXRwdXQgcmVjb3ZlcnkgZmlsZXMgdG8gVkVORE9SX0JPT1QvLgogaWZlcSAoJChCT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1QpLHRydWUpCi0kKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogUFJJVkFURV9SRUNPVkVSWV9PVVQgOj0gQk9PVAorJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogUFJJVkFURV9SRUNPVkVSWV9PVVQgOj0gQk9PVAogZWxzZSBpZmVxICgkKEJPQVJEX01PVkVfUkVDT1ZFUllfUkVTT1VSQ0VTX1RPX1ZFTkRPUl9CT09UKSx0cnVlKQotJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6IFBSSVZBVEVfUkVDT1ZFUllfT1VUIDo9IFZFTkRPUl9CT09UCiskKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiBQUklWQVRFX1JFQ09WRVJZX09VVCA6PSBWRU5ET1JfQk9PVAogZWxzZQotJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6IFBSSVZBVEVfUkVDT1ZFUllfT1VUIDo9IFJFQ09WRVJZCiskKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiBQUklWQVRFX1JFQ09WRVJZX09VVCA6PSBSRUNPVkVSWQogZW5kaWYKIAogaWZlcSAoJChBQl9PVEFfVVBEQVRFUiksdHJ1ZSkKICAgaWZkZWYgT1NSRUxFQVNFRF9ESVJFQ1RPUlkKLSAgICAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogJChUQVJHRVRfT1VUX09FTSkvJChPU1JFTEVBU0VEX0RJUkVDVE9SWSkvcHJvZHVjdF9pZAotICAgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOiAkKFRBUkdFVF9PVVRfT0VNKS8kKE9TUkVMRUFTRURfRElSRUNUT1JZKS9wcm9kdWN0X3ZlcnNpb24KLSAgICAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogJChUQVJHRVRfT1VUX0VUQykvJChPU1JFTEVBU0VEX0RJUkVDVE9SWSkvc3lzdGVtX3ZlcnNpb24KLSAgZW5kaWYKLQotICAjIE5vdCBjaGVja2luZyBpbiBib2FyZF9jb25maWcubWssIHNpbmNlIEFCX09UQV9QQVJUSVRJT05TIG1heSBiZSB1cGRhdGVkIGluIEFuZHJvaWQubWsgKGUuZy4gdG8KLSAgIyBhZGRpdGlvbmFsbHkgaW5jbHVkZSByYWRpbyBvciBib290bG9hZGVyIHBhcnRpdGlvbnMpLgotICBpZmVxICgkKEFCX09UQV9QQVJUSVRJT05TKSwpCi0gICAgJChlcnJvciBBQl9PVEFfUEFSVElUSU9OUyBtdXN0IGJlIGRlZmluZWQgd2hlbiB1c2luZyBBQl9PVEFfVVBEQVRFUikKKyAgICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKFRBUkdFVF9PVVRfT0VNKS8kKE9TUkVMRUFTRURfRElSRUNUT1JZKS9wcm9kdWN0X2lkCisgICAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChUQVJHRVRfT1VUX09FTSkvJChPU1JFTEVBU0VEX0RJUkVDVE9SWSkvcHJvZHVjdF92ZXJzaW9uCisgICAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChUQVJHRVRfT1VUX0VUQykvJChPU1JFTEVBU0VEX0RJUkVDVE9SWSkvc3lzdGVtX3ZlcnNpb24KICAgZW5kaWYKIGVuZGlmCiAKQEAgLTU2MjEsNyArNjIzNiw3IEBACiAjICQxOiByb290IGRpcmVjdG9yeQogIyAkMjogYWRkIHByZWZpeAogZGVmaW5lIGZzX2NvbmZpZwotKGNkICQoMSk7IGZpbmQgLiAtdHlwZSBkIHwgc2VkICdzLCQkLC8sJzsgZmluZCAuIFwhIC10eXBlIGQpIHwgY3V0IC1jIDMtIHwgc29ydCB8IHNlZCAncyxeLCQoMiksJyB8ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2ZzX2NvbmZpZyAtQyAtRCAkKFRBUkdFVF9PVVQpIC1TICQoU0VMSU5VWF9GQykgLVIgIiQoMikiCisoY2QgJCgxKTsgZmluZCAuIC10eXBlIGQgfCBzZWQgJ3MsJCQsLywnOyBmaW5kIC4gXCEgLXR5cGUgZCkgfCBjdXQgLWMgMy0gfCBzb3J0IHwgc2VkICdzLF4sJCgyKSwnIHwgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZnNfY29uZmlnIC1DIC1EICQoVEFSR0VUX09VVCkgLVIgIiQoMikiCiBlbmRlZgogCiBkZWZpbmUgZmlsdGVyLW91dC1taXNzaW5nLXZlbmRvcgpAQCAtNTcwMyw0OCArNjMxOCw4NSBAQAogICAgIGVjaG8gInZpcnR1YWxfYWJfY29tcHJlc3Npb25fbWV0aG9kPSQoUFJPRFVDVF9WSVJUVUFMX0FCX0NPTVBSRVNTSU9OX01FVEhPRCkiID4+ICQoMSkpCiAgICQoaWYgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfVklSVFVBTF9BQl9PVEFfUkVUUk9GSVQpKSwgXAogICAgIGVjaG8gInZpcnR1YWxfYWJfcmV0cm9maXQ9dHJ1ZSIgPj4gJCgxKSkKKyAgJChpZiAkKFBST0RVQ1RfVklSVFVBTF9BQl9DT1dfVkVSU0lPTiksIFwKKyAgICBlY2hvICJ2aXJ0dWFsX2FiX2Nvd192ZXJzaW9uPSQoUFJPRFVDVF9WSVJUVUFMX0FCX0NPV19WRVJTSU9OKSIgPj4gJCgxKSkKKyAgJChpZiAkKFBST0RVQ1RfVklSVFVBTF9BQl9DT01QUkVTU0lPTl9GQUNUT1IpLCBcCisgICAgZWNobyAidmlydHVhbF9hYl9jb21wcmVzc2lvbl9mYWN0b3I9JChQUk9EVUNUX1ZJUlRVQUxfQUJfQ09NUFJFU1NJT05fRkFDVE9SKSIgPj4gJCgxKSkKK2VuZGVmCisKKyMgQ29weSBhbiBpbWFnZSBmaWxlIHRvIGEgZGlyZWN0b3J5IGFuZCBnZW5lcmF0ZSBhIGJsb2NrIGxpc3QgbWFwIGZpbGUgZnJvbSB0aGUgaW1hZ2UsCisjIG9ubHkgaWYgdGhlIG1hcF9maWxlX2dlbmVyYXRvciBzdXBwb3J0cyB0aGUgZmlsZSBzeXN0ZW0uCisjIE90aGVyd2lzZSwgc2tpcCBnZW5lcmF0aW5nIG1hcCBmaWxlcyBhcyB3ZWxsIGFzIGNvcHlpbmcgaW1hZ2VzLiBUaGUgaW1hZ2Ugd2lsbCBiZQorIyBnZW5lcmF0ZWQgZnJvbSB0aGUgJChBRERfSU1HX1RPX1RBUkdFVF9GSUxFUykgdG8gZ2VuZXJhdGUgdGhlIG1hcCBmaWxlIHdpdGggaXQuCisjICQoMSk6IHBhdGggb2YgdGhlIGltYWdlIGZpbGUKKyMgJCgyKTogdGFyZ2V0IG91dCBkaXJlY3RvcnkKKyMgJCgzKTogaW1hZ2UgbmFtZSB0byBnZW5lcmF0ZSBhIG1hcCBmaWxlLiBza2lwIGdlbmVyYXRpbmcgbWFwIGZpbGUgaWYgZW1wdHkKK2RlZmluZSBjb3B5LWltYWdlLWFuZC1nZW5lcmF0ZS1tYXAKKyAgJChpZiAkKENPUFlfSU1BR0VTX0ZPUl9UQVJHRVRfRklMRVNfWklQKSwgXAorICAgICQoZXZhbCBfc3VwcG9ydGVkX2ZzX2Zvcl9tYXBfZmlsZV9nZW5lcmF0b3IgOj0gZXJvZnMgZXh0JSkgXAorICAgICQoZXZhbCBfaW1nIDo9ICQoY2FsbCB0by11cHBlciwkKDMpKSkgXAorICAgICQoaWYgJCgzKSwkKGV2YWwgX21hcF9mc190eXBlIDo9ICQoQk9BUkRfJChfaW1nKUlNQUdFX0ZJTEVfU1lTVEVNX1RZUEUpKSxcCisgICAgICAkKGV2YWwgX25vX21hcF9maWxlIDo9ICJ0cnVlIikpIFwKKyAgICAkKGlmICQoZmlsdGVyICQoX3N1cHBvcnRlZF9mc19mb3JfbWFwX2ZpbGVfZ2VuZXJhdG9yKSwkKF9tYXBfZnNfdHlwZSkpJChfbm9fbWFwX2ZpbGUpLFwKKyAgICAgIG1rZGlyIC1wICQoMik7IFwKKyAgICAgIGNwICQoMSkgJCgyKTsgXAorICAgICAgJChpZiAkKDMpLCQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL21hcF9maWxlX2dlbmVyYXRvciAkKDEpICQoMikvJCgzKS5tYXApKSBcCisgICAgJChldmFsIF9pbWcgOj0pIFwKKyAgICAkKGV2YWwgX21hcF9mc190eXBlIDo9KSBcCisgICAgJChldmFsIF9ub19tYXBfZmlsZSA6PSkgXAorICApCiBlbmRlZgogCiAjIEJ5IGNvbmRpdGlvbmFsbHkgaW5jbHVkaW5nIHRoZSBkZXBlbmRlbmN5IG9mIHRoZSB0YXJnZXQgZmlsZXMgcGFja2FnZSBvbiB0aGUKICMgZnVsbCBzeXN0ZW0gaW1hZ2UgZGVwcywgd2Ugc3BlZWQgdXAgYnVpbGRzIHRoYXQgZG8gbm90IGJ1aWxkIHRoZSBzeXN0ZW0KICMgaW1hZ2UuCiBpZmRlZiBCVUlMRElOR19TWVNURU1fSU1BR0UKLSAgJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6ICQoRlVMTF9TWVNURU1JTUFHRV9ERVBTKQorICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKEZVTExfU1lTVEVNSU1BR0VfREVQUykKKyAgaWZkZWYgQ09QWV9JTUFHRVNfRk9SX1RBUkdFVF9GSUxFU19aSVAKKyAgICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKEJVSUxUX1NZU1RFTUlNQUdFKQorICBlbmRpZgogZWxzZQogICAjIHJlbGVhc2V0b29scyBtYXkgbmVlZCB0aGUgc3lzdGVtIGJ1aWxkLnByb3AgZXZlbiB3aGVuIGJ1aWxkaW5nIGEKICAgIyBzeXN0ZW0taW1hZ2UtbGVzcyBwcm9kdWN0LgotICAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogJChJTlNUQUxMRURfQlVJTERfUFJPUF9UQVJHRVQpCisgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoSU5TVEFMTEVEX0JVSUxEX1BST1BfVEFSR0VUKQogZW5kaWYKIAogaWZkZWYgQlVJTERJTkdfVVNFUkRBVEFfSU1BR0UKLSAgJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6ICQoSU5URVJOQUxfVVNFUkRBVEFJTUFHRV9GSUxFUykKKyAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChJTlRFUk5BTF9VU0VSREFUQUlNQUdFX0ZJTEVTKQogZW5kaWYKIAogaWZkZWYgQlVJTERJTkdfU1lTVEVNX09USEVSX0lNQUdFCi0gICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOiAkKElOVEVSTkFMX1NZU1RFTU9USEVSSU1BR0VfRklMRVMpCisgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoSU5URVJOQUxfU1lTVEVNT1RIRVJJTUFHRV9GSUxFUykKKyAgaWZkZWYgQ09QWV9JTUFHRVNfRk9SX1RBUkdFVF9GSUxFU19aSVAKKyAgICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKEJVSUxUX1NZU1RFTU9USEVSSU1BR0VfVEFSR0VUKQorICBlbmRpZgogZW5kaWYKIAogaWZkZWYgQlVJTERJTkdfVkVORE9SX0JPT1RfSU1BR0UKLSAgJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6ICQoSU5URVJOQUxfVkVORE9SX1JBTURJU0tfRklMRVMpCi0gICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOiAkKElOVEVSTkFMX1ZFTkRPUl9SQU1ESVNLX0ZSQUdNRU5UX1RBUkdFVFMpCi0gICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOiAkKElOVEVSTkFMX1ZFTkRPUl9CT09UQ09ORklHX1RBUkdFVCkKKyAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChJTlRFUk5BTF9WRU5ET1JfUkFNRElTS19GSUxFUykKKyAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChJTlRFUk5BTF9WRU5ET1JfUkFNRElTS19GUkFHTUVOVF9UQVJHRVRTKQorICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKElOVEVSTkFMX1ZFTkRPUl9CT09UQ09ORklHX1RBUkdFVCkKICAgIyBUaGUgdmVuZG9yIHJhbWRpc2sgbWF5IGJlIGJ1aWx0IGZyb20gdGhlIHJlY292ZXJ5IHJhbWRpc2suCiAgIGlmZXEgKHRydWUsJChCT0FSRF9NT1ZFX1JFQ09WRVJZX1JFU09VUkNFU19UT19WRU5ET1JfQk9PVCkpCi0gICAgJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6ICQoSU5URVJOQUxfUkVDT1ZFUllfUkFNRElTS19GSUxFU19USU1FU1RBTVApCisgICAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChJTlRFUk5BTF9SRUNPVkVSWV9SQU1ESVNLX0ZJTEVTX1RJTUVTVEFNUCkKICAgZW5kaWYKIGVuZGlmCiAKK2lmZGVmIEJVSUxESU5HX1ZFTkRPUl9LRVJORUxfQk9PVF9JTUFHRQorICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKElOVEVSTkFMX1ZFTkRPUl9LRVJORUxfUkFNRElTS19GSUxFUykKK2VuZGlmCisKIGlmZGVmIEJVSUxESU5HX1JFQ09WRVJZX0lNQUdFCiAgICMgVE9ETyhiLzMwNDE0NDI4KTogQ2FuJ3QgZGVwZW5kIG9uIElOVEVSTkFMX1JFQ09WRVJZSU1BR0VfRklMRVMgYWxvbmUgbGlrZSBvdGhlcgogICAjIEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFIGRlcGVuZGVuY2llcyBiZWNhdXNlIGN1cnJlbnRseSB0aGVyZSdyZSBjcC9yc3luYy9ybQogICAjIGNvbW1hbmRzIGluIGJ1aWxkLXJlY292ZXJ5aW1hZ2UtdGFyZ2V0LCB3aGljaCB3b3VsZCB0b3VjaCB0aGUgZmlsZXMgdW5kZXIKICAgIyBUQVJHRVRfUkVDT1ZFUllfT1VUIGFuZCByYWNlIHdpdGggcGFja2FnaW5nIHRhcmdldC1maWxlcy56aXAuCiAgIGlmZXEgKCQoQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09UKSx0cnVlKQotICAgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOiAkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKQorICAgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpCiAgIGVsc2UKLSAgICAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogJChJTlNUQUxMRURfUkVDT1ZFUllJTUFHRV9UQVJHRVQpCisgICAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChJTlNUQUxMRURfUkVDT1ZFUllJTUFHRV9UQVJHRVQpCiAgIGVuZGlmCi0gICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOiAkKElOVEVSTkFMX1JFQ09WRVJZSU1BR0VfRklMRVMpCisgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoSU5URVJOQUxfUkVDT1ZFUllJTUFHRV9GSUxFUykKIGVuZGlmCiAKICMgQ29uZGl0aW9uYWxseSBkZXBlbmQgb24gdGhlIGltYWdlIGZpbGVzIGlmIHRoZSBpbWFnZSBpcyBiZWluZyBidWlsdCBzbyB0aGUKQEAgLTU3NTIsNjggKzY0MDQsODkgQEAKICMgaWYgaXQgaXMgY29taW5nIGZyb20gYSBwcmVidWlsdC4KIAogaWZkZWYgQlVJTERJTkdfVkVORE9SX0lNQUdFCi0gICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOiAkKElOVEVSTkFMX1ZFTkRPUklNQUdFX0ZJTEVTKQorICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKElOVEVSTkFMX1ZFTkRPUklNQUdFX0ZJTEVTKQorICBpZmRlZiBDT1BZX0lNQUdFU19GT1JfVEFSR0VUX0ZJTEVTX1pJUAorICAgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoQlVJTFRfVkVORE9SSU1BR0VfVEFSR0VUKQorICBlbmRpZgogZWxzZSBpZmRlZiBCT0FSRF9QUkVCVUlMVF9WRU5ET1JJTUFHRQotICAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogJChJTlNUQUxMRURfVkVORE9SSU1BR0VfVEFSR0VUKQorICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKElOU1RBTExFRF9WRU5ET1JJTUFHRV9UQVJHRVQpCiBlbmRpZgogCiBpZmRlZiBCVUlMRElOR19QUk9EVUNUX0lNQUdFCi0gICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOiAkKElOVEVSTkFMX1BST0RVQ1RJTUFHRV9GSUxFUykKKyAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChJTlRFUk5BTF9QUk9EVUNUSU1BR0VfRklMRVMpCisgIGlmZGVmIENPUFlfSU1BR0VTX0ZPUl9UQVJHRVRfRklMRVNfWklQCisgICAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChCVUlMVF9QUk9EVUNUSU1BR0VfVEFSR0VUKQorICBlbmRpZgogZWxzZSBpZmRlZiBCT0FSRF9QUkVCVUlMVF9QUk9EVUNUSU1BR0UKLSAgJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6ICQoSU5TVEFMTEVEX1BST0RVQ1RJTUFHRV9UQVJHRVQpCisgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoSU5TVEFMTEVEX1BST0RVQ1RJTUFHRV9UQVJHRVQpCiBlbmRpZgogCiBpZmRlZiBCVUlMRElOR19TWVNURU1fRVhUX0lNQUdFCi0gICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOiAkKElOVEVSTkFMX1NZU1RFTV9FWFRJTUFHRV9GSUxFUykKKyAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChJTlRFUk5BTF9TWVNURU1fRVhUSU1BR0VfRklMRVMpCisgIGlmZGVmIENPUFlfSU1BR0VTX0ZPUl9UQVJHRVRfRklMRVNfWklQCisgICAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChCVUlMVF9TWVNURU1fRVhUSU1BR0VfVEFSR0VUKQorICBlbmRpZgogZWxzZSBpZmRlZiBCT0FSRF9QUkVCVUlMVF9TWVNURU1fRVhUSU1BR0UKLSAgJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6ICQoSU5TVEFMTEVEX1NZU1RFTV9FWFRJTUFHRV9UQVJHRVQpCisgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoSU5TVEFMTEVEX1NZU1RFTV9FWFRJTUFHRV9UQVJHRVQpCiBlbmRpZgogCiBpZm5lcSAoLCQoQlVJTERJTkdfQk9PVF9JTUFHRSkkKEJVSUxESU5HX0lOSVRfQk9PVF9JTUFHRSkpCi0gICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOiAkKElOVEVSTkFMX1JBTURJU0tfRklMRVMpCisgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoSU5URVJOQUxfUkFNRElTS19GSUxFUykKIGVuZGlmICAjIEJVSUxESU5HX0JPT1RfSU1BR0UgIT0gIiIgfHwgQlVJTERJTkdfSU5JVF9CT09UX0lNQUdFICE9ICIiCiAKIGlmbmVxICgsJChJTlRFUk5BTF9QUkVCVUlMVF9CT09USU1BR0UpICQoZmlsdGVyIHRydWUsJChCT0FSRF9DT1BZX0JPT1RfSU1BR0VfVE9fVEFSR0VUX0ZJTEVTKSkpCi0gICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOiAkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKQorICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKQogZW5kaWYKIAogaWZkZWYgQlVJTERJTkdfT0RNX0lNQUdFCi0gICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOiAkKElOVEVSTkFMX09ETUlNQUdFX0ZJTEVTKQorICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKElOVEVSTkFMX09ETUlNQUdFX0ZJTEVTKQorICBpZmRlZiBDT1BZX0lNQUdFU19GT1JfVEFSR0VUX0ZJTEVTX1pJUAorICAgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoQlVJTFRfT0RNSU1BR0VfVEFSR0VUKQorICBlbmRpZgogZWxzZSBpZmRlZiBCT0FSRF9QUkVCVUlMVF9PRE1JTUFHRQotICAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogJChJTlNUQUxMRURfT0RNSU1BR0VfVEFSR0VUKQorICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKElOU1RBTExFRF9PRE1JTUFHRV9UQVJHRVQpCiBlbmRpZgogCiBpZmRlZiBCVUlMRElOR19WRU5ET1JfRExLTV9JTUFHRQotICAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogJChJTlRFUk5BTF9WRU5ET1JfRExLTUlNQUdFX0ZJTEVTKQorICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKElOVEVSTkFMX1ZFTkRPUl9ETEtNSU1BR0VfRklMRVMpCisgIGlmZGVmIENPUFlfSU1BR0VTX0ZPUl9UQVJHRVRfRklMRVNfWklQCisgICAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChCVUlMVF9WRU5ET1JfRExLTUlNQUdFX1RBUkdFVCkKKyAgZW5kaWYKIGVsc2UgaWZkZWYgQk9BUkRfUFJFQlVJTFRfVkVORE9SX0RMS01JTUFHRQotICAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogJChJTlNUQUxMRURfVkVORE9SX0RMS01JTUFHRV9UQVJHRVQpCisgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoSU5TVEFMTEVEX1ZFTkRPUl9ETEtNSU1BR0VfVEFSR0VUKQogZW5kaWYKIAogaWZkZWYgQlVJTERJTkdfT0RNX0RMS01fSU1BR0UKLSAgJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6ICQoSU5URVJOQUxfT0RNX0RMS01JTUFHRV9GSUxFUykKKyAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChJTlRFUk5BTF9PRE1fRExLTUlNQUdFX0ZJTEVTKQorICBpZmRlZiBDT1BZX0lNQUdFU19GT1JfVEFSR0VUX0ZJTEVTX1pJUAorICAgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoQlVJTFRfT0RNX0RMS01JTUFHRV9UQVJHRVQpCisgIGVuZGlmCiBlbHNlIGlmZGVmIEJPQVJEX1BSRUJVSUxUX09ETV9ETEtNSU1BR0UKLSAgJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6ICQoSU5TVEFMTEVEX09ETV9ETEtNSU1BR0VfVEFSR0VUKQorICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKElOU1RBTExFRF9PRE1fRExLTUlNQUdFX1RBUkdFVCkKIGVuZGlmCiAKIGlmZGVmIEJVSUxESU5HX1NZU1RFTV9ETEtNX0lNQUdFCi0gICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOiAkKElOVEVSTkFMX1NZU1RFTV9ETEtNSU1BR0VfRklMRVMpCisgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoSU5URVJOQUxfU1lTVEVNX0RMS01JTUFHRV9GSUxFUykKKyAgaWZkZWYgQ09QWV9JTUFHRVNfRk9SX1RBUkdFVF9GSUxFU19aSVAKKyAgICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKEJVSUxUX1NZU1RFTV9ETEtNSU1BR0VfVEFSR0VUKQorICBlbmRpZgogZWxzZSBpZmRlZiBCT0FSRF9QUkVCVUlMVF9TWVNURU1fRExLTUlNQUdFCi0gICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOiAkKElOU1RBTExFRF9TWVNURU1fRExLTUlNQUdFX1RBUkdFVCkKKyAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChJTlNUQUxMRURfU1lTVEVNX0RMS01JTUFHRV9UQVJHRVQpCiBlbmRpZgogCiBpZmVxICgkKEJVSUxEX1FFTVVfSU1BR0VTKSx0cnVlKQogICBNS19WQk1FVEFfQk9PVF9LRVJORUxfQ01ETElORV9TSCA6PSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC90b29scy9ta192Ym1ldGFfYm9vdF9wYXJhbXMuc2gKLSAgJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSk6ICQoTUtfVkJNRVRBX0JPT1RfS0VSTkVMX0NNRExJTkVfU0gpCisgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6ICQoTUtfVkJNRVRBX0JPT1RfS0VSTkVMX0NNRExJTkVfU0gpCiBlbmRpZgogCiBpZmRlZiBCT0FSRF9QUkVCVUlMVF9CT09UTE9BREVSCi0kKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogJChJTlNUQUxMRURfQk9PVExPQURFUl9NT0RVTEUpCiskKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKElOU1RBTExFRF9CT09UTE9BREVSX01PRFVMRSkKIGRyb2lkY29yZS11bmJ1bmRsZWQ6ICQoSU5TVEFMTEVEX0JPT1RMT0FERVJfTU9EVUxFKQogZW5kaWYKIAogIyBEZXBlbmRpbmcgb24gdGhlIHZhcmlvdXMgaW1hZ2VzIGd1YXJhbnRlZXMgdGhhdCB0aGUgdW5kZXJseWluZwogIyBkaXJlY3RvcmllcyBhcmUgdXAtdG8tZGF0ZS4KLSQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOiBcCiskKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiBcCiAJICAgICQoSU5TVEFMTEVEX1JBRElPSU1BR0VfVEFSR0VUKSBcCiAJICAgICQoSU5TVEFMTEVEX1JFQ09WRVJZSU1BR0VfVEFSR0VUKSBcCiAJICAgICQoSU5TVEFMTEVEX0NBQ0hFSU1BR0VfVEFSR0VUKSBcCkBAIC01ODI3LDYgKzY1MDAsMTEgQEAKIAkgICAgJChJTlNUQUxMRURfUkFNRElTS19UQVJHRVQpIFwKIAkgICAgJChJTlNUQUxMRURfRFRCSU1BR0VfVEFSR0VUKSBcCiAJICAgICQoSU5TVEFMTEVEXzJOREJPT1RMT0FERVJfVEFSR0VUKSBcCisJICAgICQoSU5TVEFMTEVEX1ZFTkRPUl9LRVJORUxfUkFNRElTS19UQVJHRVQpIFwKKwkgICAgJChCVUlMVF9SQU1ESVNLXzE2S19UQVJHRVQpIFwKKwkgICAgJChCVUlMVF9LRVJORUxfMTZLX1RBUkdFVCkgXAorCSAgICAkKEJVSUxUX0JPT1RJTUFHRV8xNktfVEFSR0VUKSBcCisJICAgICQoSU5TVEFMTEVEX0RUQk9JTUFHRV8xNktCX1RBUkdFVCkgXAogCSAgICAkKEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRSkgXAogCSAgICAkKEJPQVJEX1BSRUJVSUxUX1JFQ09WRVJZX0RUQk9JTUFHRSkgXAogCSAgICAkKEJPQVJEX1JFQ09WRVJZX0FDUElPKSBcCkBAIC01ODQxLDE2ICs2NTE5LDE4IEBACiAJICAgICQoTFBNQUtFKSBcCiAJICAgICQoU0VMSU5VWF9GQykgXAogCSAgICAkKElOU1RBTExFRF9NSVNDX0lORk9fVEFSR0VUKSBcCisJICAgICQoSU5TVEFMTEVEX0ZBU1RCT09UX0lORk9fVEFSR0VUKSBcCiAJICAgICQoQVBLQ0VSVFNfRklMRSkgXAotCSAgICAkKFNPT05HX0FQRVhfS0VZU19GSUxFKSBcCisJICAgICQoQVBFWF9LRVlTX0ZJTEUpIFwKIAkgICAgJChTT09OR19aSVApIFwKIAkgICAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZnNfY29uZmlnIFwKKwkgICAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWFwX2ZpbGVfZ2VuZXJhdG9yIFwKIAkgICAgJChBRERfSU1HX1RPX1RBUkdFVF9GSUxFUykgXAogCSAgICAkKE1BS0VfUkVDT1ZFUllfUEFUQ0gpIFwKIAkgICAgJChCVUlMVF9LRVJORUxfQ09ORklHU19GSUxFKSBcCiAJICAgICQoQlVJTFRfS0VSTkVMX1ZFUlNJT05fRklMRSkgXAogCSAgICB8ICQoQUNQKQotCUBlY2hvICJQYWNrYWdlIHRhcmdldCBmaWxlczogJEAiCisJQGVjaG8gIkJ1aWxkaW5nIHRhcmdldCBmaWxlczogJEAiCiAJJChoaWRlKSBybSAtcmYgJEAgJEAubGlzdCAkKHppcF9yb290KQogCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApICQoemlwX3Jvb3QpCiBpZm5lcSAoLCQoSU5TVEFMTEVEX1JFQ09WRVJZSU1BR0VfVEFSR0VUKSQoZmlsdGVyIHRydWUsJChCT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1QpKSQoZmlsdGVyIHRydWUsJChCT0FSRF9NT1ZFX1JFQ09WRVJZX1JFU09VUkNFU19UT19WRU5ET1JfQk9PVCkpKQpAQCAtNTk3OCw4ICs2NjU4LDEzIEBACiBlbmRpZiAjIElOU1RBTExFRF9WRU5ET1JfQk9PVElNQUdFX1RBUkdFVAogaWZkZWYgQlVJTERJTkdfU1lTVEVNX0lNQUdFCiAJQCMgQ29udGVudHMgb2YgdGhlIHN5c3RlbSBpbWFnZQoraWZuZXEgKCQoU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0VfUEFUSCksKQorCSQoaGlkZSkgJChjYWxsIHBhY2thZ2VfZmlsZXMtY29weS1yb290LCBcCisJICAgICQoU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0VfQkFTRSkvc3lzdGVtL3N5c3RlbSwkKHppcF9yb290KS9TWVNURU0pCitlbHNlCiAJJChoaWRlKSAkKGNhbGwgcGFja2FnZV9maWxlcy1jb3B5LXJvb3QsIFwKIAkgICAgJChTWVNURU1JTUFHRV9TT1VSQ0VfRElSKSwkKHppcF9yb290KS9TWVNURU0pCitlbmRpZgogZWxzZSBpZmRlZiBJTlNUQUxMRURfQlVJTERfUFJPUF9UQVJHRVQKIAlAIyBDb3B5IHRoZSBzeXN0ZW0gYnVpbGQucHJvcCBldmVuIGlmIG5vdCBidWlsZGluZyBhIHN5c3RlbSBpbWFnZQogCUAjIGJlY2F1c2UgYWRkX2ltZ190b190YXJnZXRfZmlsZXMgbWF5IG5lZWQgaXQgdG8gYnVpbGQgb3RoZXIgcGFydGl0aW9uCkBAIC02MDUyLDEzICs2NzM3LDE2IEBACiAJQCMgYnVpbGQgdGhlbS4KIAkkKGhpZGUpIG1rZGlyIC1wICQoemlwX3Jvb3QpL01FVEEKIAkkKGhpZGUpIGNwICQoQVBLQ0VSVFNfRklMRSkgJCh6aXBfcm9vdCkvTUVUQS9hcGtjZXJ0cy50eHQKLQkkKGhpZGUpIGNwICQoU09PTkdfQVBFWF9LRVlTX0ZJTEUpICQoemlwX3Jvb3QpL01FVEEvYXBleGtleXMudHh0CisJJChoaWRlKSBjcCAkKEFQRVhfS0VZU19GSUxFKSAkKHppcF9yb290KS9NRVRBL2FwZXhrZXlzLnR4dAogaWZuZXEgKCQodG9vbF9leHRlbnNpb24pLCkKIAkkKGhpZGUpIGNwICQoUFJJVkFURV9UT09MX0VYVEVOU0lPTikgJCh6aXBfcm9vdCkvTUVUQS8KIGVuZGlmCiAJJChoaWRlKSBlY2hvICIkKFBST0RVQ1RfT1RBX1BVQkxJQ19LRVlTKSIgPiAkKHppcF9yb290KS9NRVRBL290YWtleXMudHh0CiAJJChoaWRlKSBjcCAkKFNFTElOVVhfRkMpICQoemlwX3Jvb3QpL01FVEEvZmlsZV9jb250ZXh0cy5iaW4KIAkkKGhpZGUpIGNwICQoSU5TVEFMTEVEX01JU0NfSU5GT19UQVJHRVQpICQoemlwX3Jvb3QpL01FVEEvbWlzY19pbmZvLnR4dAoraWZuZXEgKCQoSU5TVEFMTEVEX0ZBU1RCT09UX0lORk9fVEFSR0VUKSwpCisJJChoaWRlKSBjcCAkKElOU1RBTExFRF9GQVNUQk9PVF9JTkZPX1RBUkdFVCkgJCh6aXBfcm9vdCkvTUVUQS9mYXN0Ym9vdC1pbmZvLnR4dAorZW5kaWYKIGlmbmVxICgkKFBST0RVQ1RfU1lTVEVNX0JBU0VfRlNfUEFUSCksKQogCSQoaGlkZSkgY3AgJChQUk9EVUNUX1NZU1RFTV9CQVNFX0ZTX1BBVEgpIFwKIAkgICQoemlwX3Jvb3QpL01FVEEvJChub3RkaXIgJChQUk9EVUNUX1NZU1RFTV9CQVNFX0ZTX1BBVEgpKQpAQCAtNjExOCw2ICs2ODA2LDEwIEBACiAJQCMgSWYgYnJlYWtwYWQgc3ltYm9scyBoYXZlIGJlZW4gZ2VuZXJhdGVkLCBhZGQgdGhlbSB0byB0aGUgemlwLgogCSQoaGlkZSkgY3AgLVIgJChUQVJHRVRfT1VUX0JSRUFLUEFEKSAkKHppcF9yb290KS9CUkVBS1BBRAogZW5kaWYKK2lmZGVmIEJPQVJEX1BSRUJVSUxUX1ZFTkRPUl9CT09USU1BR0UKKwkkKGhpZGUpIG1rZGlyIC1wICQoemlwX3Jvb3QpL0lNQUdFUworCSQoaGlkZSkgY3AgJChJTlNUQUxMRURfVkVORE9SX0JPT1RJTUFHRV9UQVJHRVQpICQoemlwX3Jvb3QpL0lNQUdFUy8KK2VuZGlmCiBpZmRlZiBCT0FSRF9QUkVCVUlMVF9WRU5ET1JJTUFHRQogCSQoaGlkZSkgbWtkaXIgLXAgJCh6aXBfcm9vdCkvSU1BR0VTCiAJJChoaWRlKSBjcCAkKElOU1RBTExFRF9WRU5ET1JJTUFHRV9UQVJHRVQpICQoemlwX3Jvb3QpL0lNQUdFUy8KQEAgLTYxNjYsNiArNjg1OCwyMiBAQAogCSQoaGlkZSkgbWtkaXIgLXAgJCh6aXBfcm9vdCkvUFJFQlVJTFRfSU1BR0VTCiAJJChoaWRlKSBjcCAkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKSAkKHppcF9yb290KS9QUkVCVUlMVF9JTUFHRVMvCiBlbmRpZiAjIEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRQoraWZkZWYgQk9BUkRfS0VSTkVMX1BBVEhfMTZLCisJJChoaWRlKSBta2RpciAtcCAkKHppcF9yb290KS9QUkVCVUlMVF9JTUFHRVMKKwkkKGhpZGUpIGNwICQoQlVJTFRfS0VSTkVMXzE2S19UQVJHRVQpICQoemlwX3Jvb3QpL1BSRUJVSUxUX0lNQUdFUy8KK2VuZGlmICMgQk9BUkRfS0VSTkVMX1BBVEhfMTZLCitpZmRlZiBCT0FSRF9LRVJORUxfTU9EVUxFU18xNksKKwkkKGhpZGUpIG1rZGlyIC1wICQoemlwX3Jvb3QpL1BSRUJVSUxUX0lNQUdFUworCSQoaGlkZSkgY3AgJChCVUlMVF9SQU1ESVNLXzE2S19UQVJHRVQpICQoemlwX3Jvb3QpL1BSRUJVSUxUX0lNQUdFUy8KK2VuZGlmICMgQk9BUkRfS0VSTkVMX01PRFVMRVNfMTZLCitpZmRlZiBCVUlMVF9CT09USU1BR0VfMTZLX1RBUkdFVAorCSQoaGlkZSkgbWtkaXIgLXAgJCh6aXBfcm9vdCkvSU1BR0VTCisJJChoaWRlKSBjcCAkKEJVSUxUX0JPT1RJTUFHRV8xNktfVEFSR0VUKSAkKHppcF9yb290KS9JTUFHRVMvCitlbmRpZiAjIEJVSUxUX0JPT1RJTUFHRV8xNktfVEFSR0VUCitpZmRlZiBJTlNUQUxMRURfRFRCT0lNQUdFXzE2S0JfVEFSR0VUCisJJChoaWRlKSBta2RpciAtcCAkKHppcF9yb290KS9JTUFHRVMKKwkkKGhpZGUpIGNwICQoSU5TVEFMTEVEX0RUQk9JTUFHRV8xNktCX1RBUkdFVCkgJCh6aXBfcm9vdCkvSU1BR0VTLworZW5kaWYgIyBJTlNUQUxMRURfRFRCT0lNQUdFXzE2S0JfVEFSR0VUCiBpZmVxICgkKEJPQVJEX1VTRVNfUFZNRldJTUFHRSksdHJ1ZSkKIAkkKGhpZGUpIG1rZGlyIC1wICQoemlwX3Jvb3QpL1BSRUJVSUxUX0lNQUdFUwogCSQoaGlkZSkgY3AgJChJTlNUQUxMRURfUFZNRldJTUFHRV9UQVJHRVQpICQoemlwX3Jvb3QpL1BSRUJVSUxUX0lNQUdFUy8KQEAgLTYxODAsNyArNjg4OCw3IEBACiBpZm5lcSAoJChzdHJpcCAkKEJPQVJEX0NVU1RPTUlNQUdFU19QQVJUSVRJT05fTElTVCkpLCkKIAkkKGhpZGUpIG1rZGlyIC1wICQoemlwX3Jvb3QpL1BSRUJVSUxUX0lNQUdFUwogCSQoaGlkZSkgJChmb3JlYWNoIHBhcnRpdGlvbiwkKEJPQVJEX0NVU1RPTUlNQUdFU19QQVJUSVRJT05fTElTVCksIFwKLQkgICAgJChmb3JlYWNoIGltYWdlLCQoQk9BUkRfQVZCXyQoY2FsbCB0by11cHBlciwkKHBhcnRpdGlvbikpX0lNQUdFX0xJU1QpLGNwICQoaW1hZ2UpICQoemlwX3Jvb3QpL1BSRUJVSUxUX0lNQUdFUy87KSkKKwkgICAgJChmb3JlYWNoIGltYWdlLCQoQk9BUkRfJChjYWxsIHRvLXVwcGVyLCQocGFydGl0aW9uKSlfSU1BR0VfTElTVCksY3AgJChpbWFnZSkgJCh6aXBfcm9vdCkvUFJFQlVJTFRfSU1BR0VTLzspKQogZW5kaWYgIyBCT0FSRF9DVVNUT01JTUFHRVNfUEFSVElUSU9OX0xJU1QKIAlAIyBUaGUgcmFkaW8gaW1hZ2VzIGluIEJPQVJEX1BBQ0tfUkFESU9JTUFHRVMgd2lsbCBiZSBhZGRpdGlvbmFsbHkgY29waWVkIGZyb20gUkFESU8vIGludG8KIAlAIyBJTUFHRVMvLCB3aGljaCB0aGVuIHdpbGwgYmUgYWRkZWQgaW50byA8cHJvZHVjdD4taW1nLnppcC4gU3VjaCBpbWFnZXMgbXVzdCBiZSBsaXN0ZWQgaW4KQEAgLTYxOTAsMjcgKzY4OTgsMzUgQEAKIAlAIyBSdW4gZnNfY29uZmlnIG9uIGFsbCB0aGUgc3lzdGVtLCB2ZW5kb3IsIGJvb3QgcmFtZGlzaywKIAlAIyBhbmQgcmVjb3ZlcnkgcmFtZGlzayBmaWxlcyBpbiB0aGUgemlwLCBhbmQgc2F2ZSB0aGUgb3V0cHV0CiBpZmRlZiBCVUlMRElOR19TWVNURU1fSU1BR0UKKwkkKGhpZGUpICQoY2FsbCBjb3B5LWltYWdlLWFuZC1nZW5lcmF0ZS1tYXAsJChCVUlMVF9TWVNURU1JTUFHRSksJCh6aXBfcm9vdCkvSU1BR0VTLHN5c3RlbSkKIAkkKGhpZGUpICQoY2FsbCBmc19jb25maWcsJCh6aXBfcm9vdCkvU1lTVEVNLHN5c3RlbS8pID4gJCh6aXBfcm9vdCkvTUVUQS9maWxlc3lzdGVtX2NvbmZpZy50eHQKIGVuZGlmCiBpZmRlZiBCVUlMRElOR19WRU5ET1JfSU1BR0UKKwkkKGhpZGUpICQoY2FsbCBjb3B5LWltYWdlLWFuZC1nZW5lcmF0ZS1tYXAsJChCVUlMVF9WRU5ET1JJTUFHRV9UQVJHRVQpLCQoemlwX3Jvb3QpL0lNQUdFUyx2ZW5kb3IpCiAJJChoaWRlKSAkKGNhbGwgZnNfY29uZmlnLCQoemlwX3Jvb3QpL1ZFTkRPUix2ZW5kb3IvKSA+ICQoemlwX3Jvb3QpL01FVEEvdmVuZG9yX2ZpbGVzeXN0ZW1fY29uZmlnLnR4dAogZW5kaWYKIGlmZGVmIEJVSUxESU5HX1BST0RVQ1RfSU1BR0UKKwkkKGhpZGUpICQoY2FsbCBjb3B5LWltYWdlLWFuZC1nZW5lcmF0ZS1tYXAsJChCVUlMVF9QUk9EVUNUSU1BR0VfVEFSR0VUKSwkKHppcF9yb290KS9JTUFHRVMscHJvZHVjdCkKIAkkKGhpZGUpICQoY2FsbCBmc19jb25maWcsJCh6aXBfcm9vdCkvUFJPRFVDVCxwcm9kdWN0LykgPiAkKHppcF9yb290KS9NRVRBL3Byb2R1Y3RfZmlsZXN5c3RlbV9jb25maWcudHh0CiBlbmRpZgogaWZkZWYgQlVJTERJTkdfU1lTVEVNX0VYVF9JTUFHRQorCSQoaGlkZSkgJChjYWxsIGNvcHktaW1hZ2UtYW5kLWdlbmVyYXRlLW1hcCwkKEJVSUxUX1NZU1RFTV9FWFRJTUFHRV9UQVJHRVQpLCQoemlwX3Jvb3QpL0lNQUdFUyxzeXN0ZW1fZXh0KQogCSQoaGlkZSkgJChjYWxsIGZzX2NvbmZpZywkKHppcF9yb290KS9TWVNURU1fRVhULHN5c3RlbV9leHQvKSA+ICQoemlwX3Jvb3QpL01FVEEvc3lzdGVtX2V4dF9maWxlc3lzdGVtX2NvbmZpZy50eHQKIGVuZGlmCiBpZmRlZiBCVUlMRElOR19PRE1fSU1BR0UKKwkkKGhpZGUpICQoY2FsbCBjb3B5LWltYWdlLWFuZC1nZW5lcmF0ZS1tYXAsJChCVUlMVF9PRE1JTUFHRV9UQVJHRVQpLCQoemlwX3Jvb3QpL0lNQUdFUyxvZG0pCiAJJChoaWRlKSAkKGNhbGwgZnNfY29uZmlnLCQoemlwX3Jvb3QpL09ETSxvZG0vKSA+ICQoemlwX3Jvb3QpL01FVEEvb2RtX2ZpbGVzeXN0ZW1fY29uZmlnLnR4dAogZW5kaWYKIGlmZGVmIEJVSUxESU5HX1ZFTkRPUl9ETEtNX0lNQUdFCisJJChoaWRlKSQoY2FsbCBjb3B5LWltYWdlLWFuZC1nZW5lcmF0ZS1tYXAsJChCVUlMVF9WRU5ET1JfRExLTUlNQUdFX1RBUkdFVCksJCh6aXBfcm9vdCkvSU1BR0VTLHZlbmRvcl9kbGttKQogCSQoaGlkZSkgJChjYWxsIGZzX2NvbmZpZywkKHppcF9yb290KS9WRU5ET1JfRExLTSx2ZW5kb3JfZGxrbS8pID4gJCh6aXBfcm9vdCkvTUVUQS92ZW5kb3JfZGxrbV9maWxlc3lzdGVtX2NvbmZpZy50eHQKIGVuZGlmCiBpZmRlZiBCVUlMRElOR19PRE1fRExLTV9JTUFHRQorCSQoaGlkZSkgJChjYWxsIGNvcHktaW1hZ2UtYW5kLWdlbmVyYXRlLW1hcCwkKEJVSUxUX09ETV9ETEtNSU1BR0VfVEFSR0VUKSwkKHppcF9yb290KS9JTUFHRVMsb2RtX2Rsa20pCiAJJChoaWRlKSAkKGNhbGwgZnNfY29uZmlnLCQoemlwX3Jvb3QpL09ETV9ETEtNLG9kbV9kbGttLykgPiAkKHppcF9yb290KS9NRVRBL29kbV9kbGttX2ZpbGVzeXN0ZW1fY29uZmlnLnR4dAogZW5kaWYKIGlmZGVmIEJVSUxESU5HX1NZU1RFTV9ETEtNX0lNQUdFCisJJChoaWRlKSAkKGNhbGwgY29weS1pbWFnZS1hbmQtZ2VuZXJhdGUtbWFwLCQoQlVJTFRfU1lTVEVNX0RMS01JTUFHRV9UQVJHRVQpLCQoemlwX3Jvb3QpL0lNQUdFUyxzeXN0ZW1fZGxrbSkKIAkkKGhpZGUpICQoY2FsbCBmc19jb25maWcsJCh6aXBfcm9vdCkvU1lTVEVNX0RMS00sc3lzdGVtX2Rsa20vKSA+ICQoemlwX3Jvb3QpL01FVEEvc3lzdGVtX2Rsa21fZmlsZXN5c3RlbV9jb25maWcudHh0CiBlbmRpZgogCUAjIFJPT1QgYWx3YXlzIGNvbnRhaW5zIHRoZSBmaWxlcyBmb3IgdGhlIHJvb3QgdW5kZXIgbm9ybWFsIGJvb3QuCkBAIC02MjI1LDYgKzY5NDEsMzMgQEAKIAkkKGhpZGUpIGVjaG8gIiQoQk9BUkRfS0VSTkVMX1BBR0VTSVpFKSIgPiAkKHppcF9yb290KS9JTklUX0JPT1QvcGFnZXNpemUKIGVuZGlmICMgQk9BUkRfS0VSTkVMX1BBR0VTSVpFCiBlbmRpZiAjIEJVSUxESU5HX0lOSVRfQk9PVF9JTUFHRQoraWZkZWYgQk9BUkRfRVJPRlNfQ09NUFJFU1NfSElOVFMKKwkkKGhpZGUpIGNwICQoQk9BUkRfRVJPRlNfQ09NUFJFU1NfSElOVFMpICQoemlwX3Jvb3QpL01FVEEvZXJvZnNfZGVmYXVsdF9jb21wcmVzc19oaW50cy50eHQKK2VuZGlmCitpZmRlZiBCT0FSRF9TWVNURU1JTUFHRV9FUk9GU19DT01QUkVTU19ISU5UUworCSQoaGlkZSkgY3AgJChCT0FSRF9TWVNURU1JTUFHRV9FUk9GU19DT01QUkVTU19ISU5UUykgJCh6aXBfcm9vdCkvTUVUQS9zeXN0ZW1fZXJvZnNfY29tcHJlc3NfaGludHMudHh0CitlbmRpZgoraWZkZWYgQk9BUkRfU1lTVEVNX0VYVElNQUdFX0VST0ZTX0NPTVBSRVNTX0hJTlRTCisJJChoaWRlKSBjcCAkKEJPQVJEX1NZU1RFTV9FWFRJTUFHRV9FUk9GU19DT01QUkVTU19ISU5UUykgJCh6aXBfcm9vdCkvTUVUQS9zeXN0ZW1fZXh0X2Vyb2ZzX2NvbXByZXNzX2hpbnRzLnR4dAorZW5kaWYKK2lmZGVmIEJPQVJEX1BST0RVQ1RJTUFHRV9FUk9GU19DT01QUkVTU19ISU5UUworCSQoaGlkZSkgY3AgJChCT0FSRF9QUk9EVUNUSU1BR0VfRVJPRlNfQ09NUFJFU1NfSElOVFMpICQoemlwX3Jvb3QpL01FVEEvcHJvZHVjdF9lcm9mc19jb21wcmVzc19oaW50cy50eHQKK2VuZGlmCitpZmRlZiBCT0FSRF9WRU5ET1JJTUFHRV9FUk9GU19DT01QUkVTU19ISU5UUworCSQoaGlkZSkgY3AgJChCT0FSRF9WRU5ET1JJTUFHRV9FUk9GU19DT01QUkVTU19ISU5UUykgJCh6aXBfcm9vdCkvTUVUQS92ZW5kb3JfZXJvZnNfY29tcHJlc3NfaGludHMudHh0CitlbmRpZgoraWZkZWYgQk9BUkRfT0RNSU1BR0VfRVJPRlNfQ09NUFJFU1NfSElOVFMKKwkkKGhpZGUpIGNwICQoQk9BUkRfT0RNSU1BR0VfRVJPRlNfQ09NUFJFU1NfSElOVFMpICQoemlwX3Jvb3QpL01FVEEvb2RtX2Vyb2ZzX2NvbXByZXNzX2hpbnRzLnR4dAorZW5kaWYKK2lmZGVmIEJPQVJEX1ZFTkRPUl9ETEtNSU1BR0VfRVJPRlNfQ09NUFJFU1NfSElOVFMKKwkkKGhpZGUpIGNwICQoQk9BUkRfVkVORE9SX0RMS01JTUFHRV9FUk9GU19DT01QUkVTU19ISU5UUykgJCh6aXBfcm9vdCkvTUVUQS92ZW5kb3JfZGxrbV9lcm9mc19jb21wcmVzc19oaW50cy50eHQKK2VuZGlmCitpZmRlZiBCT0FSRF9PRE1fRExLTUlNQUdFX0VST0ZTX0NPTVBSRVNTX0hJTlRTCisJJChoaWRlKSBjcCAkKEJPQVJEX09ETV9ETEtNSU1BR0VfRVJPRlNfQ09NUFJFU1NfSElOVFMpICQoemlwX3Jvb3QpL01FVEEvb2RtX2Rsa21fZXJvZnNfY29tcHJlc3NfaGludHMudHh0CitlbmRpZgoraWZkZWYgQk9BUkRfU1lTVEVNX0RMS01JTUFHRV9FUk9GU19DT01QUkVTU19ISU5UUworCSQoaGlkZSkgY3AgJChCT0FSRF9TWVNURU1fRExLTUlNQUdFX0VST0ZTX0NPTVBSRVNTX0hJTlRTKSAkKHppcF9yb290KS9NRVRBL3N5c3RlbV9kbGttX2Vyb2ZzX2NvbXByZXNzX2hpbnRzLnR4dAorZW5kaWYKIGlmbmVxICgkKElOU1RBTExFRF9WRU5ET1JfQk9PVElNQUdFX1RBUkdFVCksKQogCSQoY2FsbCBmc19jb25maWcsJCh6aXBfcm9vdCkvVkVORE9SX0JPT1QvUkFNRElTSywpID4gJCh6aXBfcm9vdCkvTUVUQS92ZW5kb3JfYm9vdF9maWxlc3lzdGVtX2NvbmZpZy50eHQKIGVuZGlmCkBAIC02MjMyLDYgKzY5NzUsNyBAQAogCSQoaGlkZSkgJChjYWxsIGZzX2NvbmZpZywkKHppcF9yb290KS9SRUNPVkVSWS9SQU1ESVNLLCkgPiAkKHppcF9yb290KS9NRVRBL3JlY292ZXJ5X2ZpbGVzeXN0ZW1fY29uZmlnLnR4dAogZW5kaWYKIGlmZGVmIEJVSUxESU5HX1NZU1RFTV9PVEhFUl9JTUFHRQorCSQoaGlkZSkgJChjYWxsIGNvcHktaW1hZ2UtYW5kLWdlbmVyYXRlLW1hcCwkKEJVSUxUX1NZU1RFTU9USEVSSU1BR0VfVEFSR0VUKSwkKHppcF9yb290KS9JTUFHRVMpCiAJJChoaWRlKSAkKGNhbGwgZnNfY29uZmlnLCQoemlwX3Jvb3QpL1NZU1RFTV9PVEhFUixzeXN0ZW0vKSA+ICQoemlwX3Jvb3QpL01FVEEvc3lzdGVtX290aGVyX2ZpbGVzeXN0ZW1fY29uZmlnLnR4dAogZW5kaWYKIAlAIyBNZXRhZGF0YSBmb3IgY29tcGF0aWJpbGl0eSB2ZXJpZmljYXRpb24uCkBAIC02MjUzLDEzICs2OTk3LDE5IEBACiBlbmRpZgogCUAjIFppcCBldmVyeXRoaW5nIHVwLCBwcmVzZXJ2aW5nIHN5bWxpbmtzIGFuZCBwbGFjaW5nIE1FVEEvIGZpbGVzIGZpcnN0IHRvCiAJQCMgaGVscCBlYXJseSB2YWxpZGF0aW9uIG9mIHRoZSAuemlwIGZpbGUgd2hpbGUgdXBsb2FkaW5nIGl0LgotCSQoaGlkZSkgZmluZCAkKHppcF9yb290KS9NRVRBIHwgc29ydCA+JEAubGlzdAotCSQoaGlkZSkgZmluZCAkKHppcF9yb290KSAtcGF0aCAkKHppcF9yb290KS9NRVRBIC1wcnVuZSAtbyAtcHJpbnQgfCBzb3J0ID4+JEAubGlzdAotCSQoaGlkZSkgJChTT09OR19aSVApIC1kIC1vICRAIC1DICQoemlwX3Jvb3QpIC1yICRALmxpc3QKKwkkKGhpZGUpIGZpbmQgJCh6aXBfcm9vdCkvTUVUQSB8IHNvcnQgPiRACisJJChoaWRlKSBmaW5kICQoemlwX3Jvb3QpIC1wYXRoICQoemlwX3Jvb3QpL01FVEEgLXBydW5lIC1vIC1wcmludCB8IHNvcnQgPj4kQAorCiskKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKQorCUBlY2hvICJQYWNrYWdpbmcgdGFyZ2V0IGZpbGVzOiAkQCIKKwkkKGhpZGUpICQoU09PTkdfWklQKSAtZCAtbyAkQCAtQyAkKHppcF9yb290KSAtciAkQC5saXN0IC1zaGEyNTYKIAogLlBIT05ZOiB0YXJnZXQtZmlsZXMtcGFja2FnZQogdGFyZ2V0LWZpbGVzLXBhY2thZ2U6ICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpCiAKKy5QSE9OWTogdGFyZ2V0LWZpbGVzLWRpcgordGFyZ2V0LWZpbGVzLWRpcjogJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKQorCiAkKGNhbGwgZGVjbGFyZS0xcC1jb250YWluZXIsJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSksKQogJChjYWxsIGRlY2xhcmUtY29udGFpbmVyLWxpY2Vuc2UtZGVwcywkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKSwgJChJTlNUQUxMRURfUkFESU9JTUFHRV9UQVJHRVQpIFwKICAgICAgICAgICAgICQoSU5TVEFMTEVEX1JFQ09WRVJZSU1BR0VfVEFSR0VUKSBcCkBAIC02Mjg3LDE1ICs3MDM3LDE3IEBACiAgICAgICAgICAgICAkKExQTUFLRSkgXAogICAgICAgICAgICAgJChTRUxJTlVYX0ZDKSBcCiAgICAgICAgICAgICAkKElOU1RBTExFRF9NSVNDX0lORk9fVEFSR0VUKSBcCisgICAgICAgICAgICAkKElOU1RBTExFRF9GQVNUQk9PVF9JTkZPX1RBUkdFVCkgXAogICAgICAgICAgICAgJChBUEtDRVJUU19GSUxFKSBcCi0gICAgICAgICAgICAkKFNPT05HX0FQRVhfS0VZU19GSUxFKSBcCisgICAgICAgICAgICAkKEFQRVhfS0VZU19GSUxFKSBcCiAgICAgICAgICAgICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9mc19jb25maWcgXAorICAgICAgICAgICAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWFwX2ZpbGVfZ2VuZXJhdG9yIFwKICAgICAgICAgICAgICQoQUREX0lNR19UT19UQVJHRVRfRklMRVMpIFwKICAgICAgICAgICAgICQoTUFLRV9SRUNPVkVSWV9QQVRDSCkgXAogICAgICAgICAgICAgJChCVUlMVF9LRVJORUxfQ09ORklHU19GSUxFKSBcCiAgICAgICAgICAgICAkKEJVSUxUX0tFUk5FTF9WRVJTSU9OX0ZJTEUpLCQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpOikKIAotJChjYWxsIGRpc3QtZm9yLWdvYWxzLCB0YXJnZXQtZmlsZXMtcGFja2FnZSwgJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSkpCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMtd2l0aC1maWxlbmFtZXRhZywgdGFyZ2V0LWZpbGVzLXBhY2thZ2UsICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpKQogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIE5ESyBTeXNyb290IFBhY2thZ2UKQEAgLTYzMjAsMTggKzcwNzIsMTggQEAKIFBBVEg9JChJTlRFUk5BTF9VU0VSSU1BR0VTX0JJTkFSWV9QQVRIUyk6JChkaXIgJChaSVAyWklQKSk6JCRQQVRIIFwKICAgICAkKE9UQV9GUk9NX1RBUkdFVF9GSUxFUykgXAogICAgICAgICAtLXZlcmJvc2UgXAotICAgICAgICAtLWV4dHJhY3RlZF9pbnB1dF90YXJnZXRfZmlsZXMgJChwYXRzdWJzdCAlLnppcCwlLCQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpKSBcCiAgICAgICAgIC0tcGF0aCAkKEhPU1RfT1VUKSBcCiAgICAgICAgICQoaWYgJChPRU1fT1RBX0NPTkZJRyksIC0tb2VtX3NldHRpbmdzICQoT0VNX09UQV9DT05GSUcpKSBcCisgICAgICAgICQoaWYgJChCT09UX1ZBUl9PVEFfQ09ORklHKSwgLS1ib290X3ZhcmlhYmxlX2ZpbGUgJChCT09UX1ZBUl9PVEFfQ09ORklHKSkgXAogICAgICAgICAkKDIpIFwKLSAgICAgICAgJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSkgJCgxKQorICAgICAgICAkKHBhdHN1YnN0ICUuemlwLCUsJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSkpICQoMSkKIGVuZGVmCiAKIHByb2R1Y3RfbmFtZSA6PSAkKFRBUkdFVF9QUk9EVUNUKQogaWZlcSAoJChUQVJHRVRfQlVJTERfVFlQRSksZGVidWcpCiAgIHByb2R1Y3RfbmFtZSA6PSAkKHByb2R1Y3RfbmFtZSlfZGVidWcKIGVuZGlmCi1uYW1lIDo9ICQocHJvZHVjdF9uYW1lKS1vdGEtJChGSUxFX05BTUVfVEFHKQorbmFtZSA6PSAkKHByb2R1Y3RfbmFtZSktb3RhCiAKIElOVEVSTkFMX09UQV9QQUNLQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS8kKG5hbWUpLnppcAogSU5URVJOQUxfT1RBX01FVEFEQVRBIDo9ICQoUFJPRFVDVF9PVVQpL290YV9tZXRhZGF0YQpAQCAtNjM0MCw3ICs3MDkyLDcgQEAKIAogJChJTlRFUk5BTF9PVEFfUEFDS0FHRV9UQVJHRVQpOiBLRVlfQ0VSVF9QQUlSIDo9ICQoREVGQVVMVF9LRVlfQ0VSVF9QQUlSKQogJChJTlRFUk5BTF9PVEFfUEFDS0FHRV9UQVJHRVQpOiAuS0FUSV9JTVBMSUNJVF9PVVRQVVRTIDo9ICQoSU5URVJOQUxfT1RBX01FVEFEQVRBKQotJChJTlRFUk5BTF9PVEFfUEFDS0FHRV9UQVJHRVQpOiAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKSAkKE9UQV9GUk9NX1RBUkdFVF9GSUxFUykgJChJTlRFUk5BTF9PVEFUT09MU19GSUxFUykKKyQoSU5URVJOQUxfT1RBX1BBQ0tBR0VfVEFSR0VUKTogJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKSAkKE9UQV9GUk9NX1RBUkdFVF9GSUxFUykgJChJTlRFUk5BTF9PVEFUT09MU19GSUxFUykKIAlAZWNobyAiUGFja2FnZSBPVEE6ICRAIgogCSQoY2FsbCBidWlsZC1vdGEtcGFja2FnZS10YXJnZXQsJEAsLWsgJChLRVlfQ0VSVF9QQUlSKSAtLW91dHB1dF9tZXRhZGF0YV9wYXRoICQoSU5URVJOQUxfT1RBX01FVEFEQVRBKSkKIApAQCAtNjM1MSw3ICs3MTAzLDcgQEAKIG90YXBhY2thZ2U6ICQoSU5URVJOQUxfT1RBX1BBQ0tBR0VfVEFSR0VUKQogCiBpZmVxICgkKEJPQVJEX0JVSUxEX1JFVFJPRklUX0RZTkFNSUNfUEFSVElUSU9OU19PVEFfUEFDS0FHRSksdHJ1ZSkKLW5hbWUgOj0gJChwcm9kdWN0X25hbWUpLW90YS1yZXRyb2ZpdC0kKEZJTEVfTkFNRV9UQUcpCituYW1lIDo9ICQocHJvZHVjdF9uYW1lKS1vdGEtcmV0cm9maXQKIAogSU5URVJOQUxfT1RBX1JFVFJPRklUX0RZTkFNSUNfUEFSVElUSU9OU19QQUNLQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS8kKG5hbWUpLnppcAogJChJTlRFUk5BTF9PVEFfUkVUUk9GSVRfRFlOQU1JQ19QQVJUSVRJT05TX1BBQ0tBR0VfVEFSR0VUKTogS0VZX0NFUlRfUEFJUiA6PSAkKERFRkFVTFRfS0VZX0NFUlRfUEFJUikKQEAgLTYzNzIsMTEgKzcxMjQsMTEgQEAKIGVuZGlmICMgQk9BUkRfQlVJTERfUkVUUk9GSVRfRFlOQU1JQ19QQVJUSVRJT05TX09UQV9QQUNLQUdFCiAKIGlmbmVxICgkKEJPQVJEX1BBUlRJQUxfT1RBX1VQREFURV9QQVJUSVRJT05TX0xJU1QpLCkKLW5hbWUgOj0gJChwcm9kdWN0X25hbWUpLXBhcnRpYWwtb3RhLSQoRklMRV9OQU1FX1RBRykKK25hbWUgOj0gJChwcm9kdWN0X25hbWUpLXBhcnRpYWwtb3RhCiAKIElOVEVSTkFMX09UQV9QQVJUSUFMX1BBQ0tBR0VfVEFSR0VUIDo9ICQoUFJPRFVDVF9PVVQpLyQobmFtZSkuemlwCiAkKElOVEVSTkFMX09UQV9QQVJUSUFMX1BBQ0tBR0VfVEFSR0VUKTogS0VZX0NFUlRfUEFJUiA6PSAkKERFRkFVTFRfS0VZX0NFUlRfUEFJUikKLSQoSU5URVJOQUxfT1RBX1BBUlRJQUxfUEFDS0FHRV9UQVJHRVQpOiAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKSAkKE9UQV9GUk9NX1RBUkdFVF9GSUxFUykgJChJTlRFUk5BTF9PVEFUT09MU19GSUxFUykKKyQoSU5URVJOQUxfT1RBX1BBUlRJQUxfUEFDS0FHRV9UQVJHRVQpOiAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpICQoT1RBX0ZST01fVEFSR0VUX0ZJTEVTKSAkKElOVEVSTkFMX09UQVRPT0xTX0ZJTEVTKQogCUBlY2hvICJQYWNrYWdlIHBhcnRpYWwgT1RBOiAkQCIKIAkkKGNhbGwgYnVpbGQtb3RhLXBhY2thZ2UtdGFyZ2V0LCRALC1rICQoS0VZX0NFUlRfUEFJUikgLS1wYXJ0aWFsICIkKEJPQVJEX1BBUlRJQUxfT1RBX1VQREFURV9QQVJUSVRJT05TX0xJU1QpIikKIApAQCAtNjQ0MCwxOCArNzE5MiwxOSBAQAogCiBlbmRpZgogCi0kKERFWFBSRU9QVF9DT05GSUdfWklQKTogJChTT09OR19aSVApCi0JJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkgJChQUk9EVUNUX09VVCkvZGV4cHJlb3B0X2NvbmZpZwotCiskKERFWFBSRU9QVF9DT05GSUdfWklQKTogUFJJVkFURV9ERVhQUkVPUFRfQ09ORklHX1pJUF9QQVJBTVMgOj0KIGlmZXEgKCwkKFRBUkdFVF9CVUlMRF9VTkJVTkRMRUQpKQogaWZuZXEgKCwkKERFWF9QUkVPUFRfQ09ORklHX0ZPUl9NQUtFKSkKLQkkKGhpZGUpIGNwICQoREVYX1BSRU9QVF9DT05GSUdfRk9SX01BS0UpICQoUFJPRFVDVF9PVVQpL2RleHByZW9wdF9jb25maWcKKyQoREVYUFJFT1BUX0NPTkZJR19aSVApOiBQUklWQVRFX0RFWFBSRU9QVF9DT05GSUdfWklQX1BBUkFNUyArPSAtZSAkKG5vdGRpciAkKERFWF9QUkVPUFRfQ09ORklHX0ZPUl9NQUtFKSkgLWYgJChERVhfUFJFT1BUX0NPTkZJR19GT1JfTUFLRSkKIGVuZGlmCiBpZm5lcSAoLCQoREVYX1BSRU9QVF9TT09OR19DT05GSUdfRk9SX01BS0UpKQotCSQoaGlkZSkgY3AgJChERVhfUFJFT1BUX1NPT05HX0NPTkZJR19GT1JfTUFLRSkgJChQUk9EVUNUX09VVCkvZGV4cHJlb3B0X2NvbmZpZworJChERVhQUkVPUFRfQ09ORklHX1pJUCk6IFBSSVZBVEVfREVYUFJFT1BUX0NPTkZJR19aSVBfUEFSQU1TICs9IC1lICQobm90ZGlyICQoREVYX1BSRU9QVF9TT09OR19DT05GSUdfRk9SX01BS0UpKSAtZiAkKERFWF9QUkVPUFRfU09PTkdfQ09ORklHX0ZPUl9NQUtFKQogZW5kaWYKIGVuZGlmICMhVEFSR0VUX0JVSUxEX1VOQlVORExFRAotCSQoaGlkZSkgJChTT09OR19aSVApIC1kIC1vICRAIC1DICQoUFJPRFVDVF9PVVQpL2RleHByZW9wdF9jb25maWcgLUQgJChQUk9EVUNUX09VVCkvZGV4cHJlb3B0X2NvbmZpZworCiskKERFWFBSRU9QVF9DT05GSUdfWklQKTogJChTT09OR19aSVApCisJJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkgJChQUk9EVUNUX09VVCkvZGV4cHJlb3B0X2NvbmZpZworCSQoaGlkZSkgJChTT09OR19aSVApIC1kIC1vICRAIC1DICQoUFJPRFVDVF9PVVQpL2RleHByZW9wdF9jb25maWcgLUQgJChQUk9EVUNUX09VVCkvZGV4cHJlb3B0X2NvbmZpZyAkKFBSSVZBVEVfREVYUFJFT1BUX0NPTkZJR19aSVBfUEFSQU1TKQogCiAuUEhPTlk6IGRleHByZW9wdF9jb25maWdfemlwCiBkZXhwcmVvcHRfY29uZmlnX3ppcDogJChERVhQUkVPUFRfQ09ORklHX1pJUCkKQEAgLTY0NzIsOSArNzIyNSw5IEBACiBlbmRpZgogCiAjIFRoZSBwYXRoIHRvIHRoZSB6aXAgZmlsZSBjb250YWluaW5nIGJpbmFyaWVzIHdpdGggc3ltYm9scy4KLVNZTUJPTFNfWklQIDo9ICQoUFJPRFVDVF9PVVQpLyQobmFtZSktc3ltYm9scy0kKEZJTEVfTkFNRV9UQUcpLnppcAorU1lNQk9MU19aSVAgOj0gJChQUk9EVUNUX09VVCkvJChuYW1lKS1zeW1ib2xzLnppcAogIyBUaGUgcGF0aCB0byBhIGZpbGUgY29udGFpbmluZyBtYXBwaW5ncyBmcm9tIGVsZiBJRHMgdG8gZmlsZW5hbWVzLgotU1lNQk9MU19NQVBQSU5HIDo9ICQoUFJPRFVDVF9PVVQpLyQobmFtZSktc3ltYm9scy1tYXBwaW5nLSQoRklMRV9OQU1FX1RBRykudGV4dHByb3RvCitTWU1CT0xTX01BUFBJTkcgOj0gJChQUk9EVUNUX09VVCkvJChuYW1lKS1zeW1ib2xzLW1hcHBpbmcudGV4dHByb3RvCiAuS0FUSV9SRUFET05MWSA6PSBTWU1CT0xTX1pJUCBTWU1CT0xTX01BUFBJTkcKICMgRm9yIGFwcHNfb25seSBidWlsZCB3ZSdsbCBlc3RhYmxpc2ggdGhlIGRlcGVuZGVuY3kgbGF0ZXIgaW4gYnVpbGQvbWFrZS9jb3JlL21haW4ubWsuCiBpZmVxICgsJChUQVJHRVRfQlVJTERfVU5CVU5ETEVEKSkKQEAgLTY1MzEsNyArNzI4NCw3IEBACiBpZmVxICh0cnVlLCQoQ0xBTkdfQ09WRVJBR0UpKQogICBMTFZNX1BST0ZEQVRBIDo9ICQoTExWTV9QUkVCVUlMVFNfQkFTRSkvbGludXgteDg2LyQoTExWTV9QUkVCVUlMVFNfVkVSU0lPTikvYmluL2xsdm0tcHJvZmRhdGEKICAgTExWTV9DT1YgOj0gJChMTFZNX1BSRUJVSUxUU19CQVNFKS9saW51eC14ODYvJChMTFZNX1BSRUJVSUxUU19WRVJTSU9OKS9iaW4vbGx2bS1jb3YKLSAgTElCQ1hYIDo9ICQoTExWTV9QUkVCVUlMVFNfQkFTRSkvbGludXgteDg2LyQoTExWTV9QUkVCVUlMVFNfVkVSU0lPTikvbGliL3g4Nl82NC11bmtub3duLWxpbnV4LWdudS9saWJjKysuc28uMQorICBMSUJDWFggOj0gJChMTFZNX1BSRUJVSUxUU19CQVNFKS9saW51eC14ODYvJChMTFZNX1BSRUJVSUxUU19WRVJTSU9OKS9saWIveDg2XzY0LXVua25vd24tbGludXgtZ251L2xpYmMrKy5zbwogICAjIFVzZSBsbHZtLXByb2ZkYXRhLnppcCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCB0cmFkZWZlZCBjb2RlLgogICBMTFZNX0NPVkVSQUdFX1RPT0xTX1pJUCA6PSAkKFBST0RVQ1RfT1VUKS9sbHZtLXByb2ZkYXRhLnppcAogCkBAIC02NTQ5LDcgKzczMDIsNyBAQAogaWZlcSAoJChUQVJHRVRfQlVJTERfVFlQRSksZGVidWcpCiAgIG5hbWUgOj0gJChuYW1lKV9kZWJ1ZwogZW5kaWYKLW5hbWUgOj0gJChuYW1lKS1hcHBzLSQoRklMRV9OQU1FX1RBRykKK25hbWUgOj0gJChuYW1lKS1hcHBzCiAKIEFQUFNfWklQIDo9ICQoUFJPRFVDVF9PVVQpLyQobmFtZSkuemlwCiAkKEFQUFNfWklQKTogJChGVUxMX1NZU1RFTUlNQUdFX0RFUFMpCkBAIC02NjA3LDI5ICs3MzYwLDM0IEBACiAjIGZpbmRpbmcgdGhlIGFwcHJvcHJpYXRlIGRpY3Rpb25hcnkgdG8gZGVvYmZ1c2NhdGUgYSBzdGFjayB0cmFjZSBmcmFtZS4KICMKIAotIyBUaGUgcGF0aCB0byB0aGUgemlwIGZpbGUgY29udGFpbmluZyBwcm9ndWFyZCBkaWN0aW9uYXJpZXMuCi1QUk9HVUFSRF9ESUNUX1pJUCA6PSAkKFBST0RVQ1RfT1VUKS8kKFRBUkdFVF9QUk9EVUNUKS1wcm9ndWFyZC1kaWN0LSQoRklMRV9OQU1FX1RBRykuemlwCi0jIFRoZSBwYXRoIHRvIHRoZSB6aXAgZmlsZSBjb250YWluaW5nIG1hcHBpbmdzIGZyb20gZGljdGlvbmFyeSBoYXNoZXMgdG8gZmlsZW5hbWVzLgotUFJPR1VBUkRfRElDVF9NQVBQSU5HIDo9ICQoUFJPRFVDVF9PVVQpLyQoVEFSR0VUX1BST0RVQ1QpLXByb2d1YXJkLWRpY3QtbWFwcGluZy0kKEZJTEVfTkFNRV9UQUcpLnRleHRwcm90bwotLktBVElfUkVBRE9OTFkgOj0gUFJPR1VBUkRfRElDVF9aSVAgUFJPR1VBUkRfRElDVF9NQVBQSU5HCi0jIEZvciBhcHBzX29ubHkgYnVpbGQgd2UnbGwgZXN0YWJsaXNoIHRoZSBkZXBlbmRlbmN5IGxhdGVyIGluIGJ1aWxkL21ha2UvY29yZS9tYWluLm1rLgogaWZlcSAoLCQoVEFSR0VUX0JVSUxEX1VOQlVORExFRCkpCi0kKFBST0dVQVJEX0RJQ1RfWklQKTogJChJTlRFUk5BTF9BTExJTUFHRVNfRklMRVMpICQodXBkYXRlcl9kZXApCisgIF9wcm9ndWFyZF9kaWN0X3ppcF9tb2R1bGVzIDo9ICQoY2FsbCBwcm9kdWN0LWluc3RhbGxlZC1tb2R1bGVzLCQoSU5URVJOQUxfUFJPRFVDVCkpCitlbHNlCisgIF9wcm9ndWFyZF9kaWN0X3ppcF9tb2R1bGVzIDo9ICQodW5idW5kbGVkX2J1aWxkX21vZHVsZXMpCiBlbmRpZgotJChQUk9HVUFSRF9ESUNUX1pJUCk6IFBSSVZBVEVfUEFDS0FHSU5HX0RJUiA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxwcm9ndWFyZF9kaWN0aW9uYXJ5KQotJChQUk9HVUFSRF9ESUNUX1pJUCk6IFBSSVZBVEVfTUFQUElOR19QQUNLQUdJTkdfRElSIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHByb2d1YXJkX2RpY3Rpb25hcnlfbWFwcGluZykKLSQoUFJPR1VBUkRfRElDVF9aSVApOiBQUklWQVRFX0xJU1RfRklMRSA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxwcm9ndWFyZF9kaWN0aW9uYXJ5X2ZpbGVsaXN0KS9maWxlbGlzdAotJChQUk9HVUFSRF9ESUNUX1pJUCk6ICQoU09PTkdfWklQKSAkKFNZTUJPTFNfTUFQKQorCisjIFRoZSBwYXRoIHRvIHRoZSB6aXAgZmlsZSBjb250YWluaW5nIHByb2d1YXJkIGRpY3Rpb25hcmllcy4KK1BST0dVQVJEX0RJQ1RfWklQIDo9JD0gJChQUk9EVUNUX09VVCkvJChUQVJHRVRfUFJPRFVDVCktcHJvZ3VhcmQtZGljdC56aXAKKyQoUFJPR1VBUkRfRElDVF9aSVApOiBQUklWQVRFX1NPT05HX1pJUF9BUkdVTUVOVFMgOj0gJChmb3JlYWNoIG0sJChfcHJvZ3VhcmRfZGljdF96aXBfbW9kdWxlcyksJChBTExfTU9EVUxFUy4kKG0pLlBST0dVQVJEX0RJQ1RJT05BUllfU09PTkdfWklQX0FSR1VNRU5UUykpCiskKFBST0dVQVJEX0RJQ1RfWklQKTogJChTT09OR19aSVApICQoZm9yZWFjaCBtLCQoX3Byb2d1YXJkX2RpY3RfemlwX21vZHVsZXMpLCQoQUxMX01PRFVMRVMuJChtKS5QUk9HVUFSRF9ESUNUSU9OQVJZX0ZJTEVTKSkKIAlAZWNobyAiUGFja2FnaW5nIFByb2d1YXJkIG9iZnVzY2F0aW9uIGRpY3Rpb25hcnkgZmlsZXMuIgotCXJtIC1yZiAkQCAkKFBSSVZBVEVfTElTVF9GSUxFKQotCW1rZGlyIC1wICQoUFJJVkFURV9QQUNLQUdJTkdfRElSKSAkKFBSSVZBVEVfTUFQUElOR19QQUNLQUdJTkdfRElSKSAkKGRpciAkKFBSSVZBVEVfTElTVF9GSUxFKSkKLQkjIFppcCBhbGwgb2YgdGhlIGZpbGVzIGluIHRoZSBwcm9ndWFyZCBkaWN0aW9uYXJ5IGRpcmVjdG9yeS4KLQkkKFNPT05HX1pJUCkgLS1pZ25vcmVfbWlzc2luZ19maWxlcyAtZCAtbyAkQCAtQyAkKFBSSVZBVEVfUEFDS0FHSU5HX0RJUikgLUQgJChQUklWQVRFX1BBQ0tBR0lOR19ESVIpCi0JIyBGaW5kIGFsbCBvZiB0aGUgZmlsZXMgaW4gdGhlIHByb2d1YXJkIGRpY3Rpb25hcnkgbWFwcGluZyBkaXJlY3RvcnkgYW5kIG1lcmdlIHRoZW0gaW50byB0aGUgbWFwcGluZyB0ZXh0cHJvdG8uCi0JIyBTdHJpcCB0aGUgUFJJVkFURV9QQUNLQUdJTkdfRElSIG9mZiB0aGUgZmlsZW5hbWVzIHRvIG1hdGNoIHNvb25nX3ppcCdzIC1DIGFyZ3VtZW50LgotCSQoaGlkZSkgZmluZCAtTCAkKFBSSVZBVEVfTUFQUElOR19QQUNLQUdJTkdfRElSKSAtdHlwZSBmIHwgc29ydCA+JChQUklWQVRFX0xJU1RfRklMRSkKLQkkKFNZTUJPTFNfTUFQKSAtbWVyZ2UgJChQUk9HVUFSRF9ESUNUX01BUFBJTkcpIC1zdHJpcF9wcmVmaXggJChQUklWQVRFX1BBQ0tBR0lOR19ESVIpLyAtaWdub3JlX21pc3NpbmdfZmlsZXMgQCQoUFJJVkFURV9MSVNUX0ZJTEUpCi0kKFBST0dVQVJEX0RJQ1RfWklQKTogLktBVElfSU1QTElDSVRfT1VUUFVUUyA6PSAkKFBST0dVQVJEX0RJQ1RfTUFQUElORykKKwkjIFppcCBhbGwgb2YgdGhlIGZpbGVzIGluIFBST0dVQVJEX0RJQ1RJT05BUllfRklMRVMuCisJZWNobyAtbiA+ICRALnRtcGFyZ2xpc3QKKwkkKGZvcmVhY2ggYXJnLCQoUFJJVkFURV9TT09OR19aSVBfQVJHVU1FTlRTKSxwcmludGYgIiVzXG4iICIkKGFyZykiID4+ICRALnRtcGFyZ2xpc3QkKG5ld2xpbmUpKQorCSQoU09PTkdfWklQKSAtZCAtbyAkQCBAJEAudG1wYXJnbGlzdAorCXJtIC1mICRALnRtcGFyZ2xpc3QKKworIyBUaGUgcGF0aCB0byB0aGUgemlwIGZpbGUgY29udGFpbmluZyBtYXBwaW5ncyBmcm9tIGRpY3Rpb25hcnkgaGFzaGVzIHRvIGZpbGVuYW1lcy4KK1BST0dVQVJEX0RJQ1RfTUFQUElORyA6PSQ9ICQoUFJPRFVDVF9PVVQpLyQoVEFSR0VUX1BST0RVQ1QpLXByb2d1YXJkLWRpY3QtbWFwcGluZy50ZXh0cHJvdG8KK19wcm9ndWFyZF9kaWN0X21hcHBpbmdfZmlsZXMgOj0gJChmb3JlYWNoIG0sJChfcHJvZ3VhcmRfZGljdF96aXBfbW9kdWxlcyksJChBTExfTU9EVUxFUy4kKG0pLlBST0dVQVJEX0RJQ1RJT05BUllfTUFQUElORykpCiskKFBST0dVQVJEX0RJQ1RfTUFQUElORyk6IFBSSVZBVEVfTUFQUElOR19GSUxFUyA6PSAkKF9wcm9ndWFyZF9kaWN0X21hcHBpbmdfZmlsZXMpCiskKFBST0dVQVJEX0RJQ1RfTUFQUElORyk6ICQoU1lNQk9MU19NQVApICQoX3Byb2d1YXJkX2RpY3RfbWFwcGluZ19maWxlcykKKwlAZWNobyAiUGFja2FnaW5nIFByb2d1YXJkIG9iZnVzY2F0aW9uIGRpY3Rpb25hcnkgbWFwcGluZyBmaWxlcy4iCisJIyBNZXJnZSBhbGwgdGhlIG1hcHBpbmcgZmlsZXMgdG9nZXRoZXIKKwllY2hvIC1uID4gJEAudG1wYXJnbGlzdAorCSQoZm9yZWFjaCBtZiwkKFBSSVZBVEVfTUFQUElOR19GSUxFUyksZWNobyAiJChtZikiID4+ICRALnRtcGFyZ2xpc3QkKG5ld2xpbmUpKQorCSQoU1lNQk9MU19NQVApIC1tZXJnZSAkKFBST0dVQVJEX0RJQ1RfTUFQUElORykgQCRALnRtcGFyZ2xpc3QKKwlybSAtZiAkQC50bXBhcmdsaXN0CiAKICQoY2FsbCBkZWNsYXJlLTFwLWNvbnRhaW5lciwkKFBST0dVQVJEX0RJQ1RfWklQKSwpCiBpZmVxICgsJChUQVJHRVRfQlVJTERfVU5CVU5ETEVEKSkKQEAgLTY2MzksMzEgKzczOTcsMTkgQEAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgQSB6aXAgb2YgUHJvZ3VhcmQgdXNhZ2UgZmlsZXMuCiAjCi1QUk9HVUFSRF9VU0FHRV9aSVAgOj0gJChQUk9EVUNUX09VVCkvJChUQVJHRVRfUFJPRFVDVCktcHJvZ3VhcmQtdXNhZ2UtJChGSUxFX05BTUVfVEFHKS56aXAKLSMgRm9yIGFwcHNfb25seSBidWlsZCB3ZSdsbCBlc3RhYmxpc2ggdGhlIGRlcGVuZGVuY3kgbGF0ZXIgaW4gYnVpbGQvbWFrZS9jb3JlL21haW4ubWsuCi1pZmVxICgsJChUQVJHRVRfQlVJTERfVU5CVU5ETEVEKSkKLSQoUFJPR1VBUkRfVVNBR0VfWklQKTogXAotICAgICQoSU5TVEFMTEVEX1NZU1RFTUlNQUdFX1RBUkdFVCkgXAotICAgICQoSU5TVEFMTEVEX1JBTURJU0tfVEFSR0VUKSBcCi0gICAgJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCkgXAotICAgICQoSU5TVEFMTEVEX0lOSVRfQk9PVF9JTUFHRV9UQVJHRVQpIFwKLSAgICAkKElOU1RBTExFRF9VU0VSREFUQUlNQUdFX1RBUkdFVCkgXAotICAgICQoSU5TVEFMTEVEX1ZFTkRPUklNQUdFX1RBUkdFVCkgXAotICAgICQoSU5TVEFMTEVEX1BST0RVQ1RJTUFHRV9UQVJHRVQpIFwKLSAgICAkKElOU1RBTExFRF9TWVNURU1fRVhUSU1BR0VfVEFSR0VUKSBcCi0gICAgJChJTlNUQUxMRURfT0RNSU1BR0VfVEFSR0VUKSBcCi0gICAgJChJTlNUQUxMRURfVkVORE9SX0RMS01JTUFHRV9UQVJHRVQpIFwKLSAgICAkKElOU1RBTExFRF9PRE1fRExLTUlNQUdFX1RBUkdFVCkgXAotICAgICQoSU5TVEFMTEVEX1NZU1RFTV9ETEtNSU1BR0VfVEFSR0VUKSBcCi0gICAgJCh1cGRhdGVyX2RlcCkKLWVuZGlmCi0kKFBST0dVQVJEX1VTQUdFX1pJUCk6IFBSSVZBVEVfTElTVF9GSUxFIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHByb2d1YXJkX3VzYWdlLnppcCkvZmlsZWxpc3QKLSQoUFJPR1VBUkRfVVNBR0VfWklQKTogUFJJVkFURV9QQUNLQUdJTkdfRElSIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHByb2d1YXJkX3VzYWdlKQotJChQUk9HVUFSRF9VU0FHRV9aSVApOiAkKE1FUkdFX1pJUFMpCitQUk9HVUFSRF9VU0FHRV9aSVAgOj0kPSAkKFBST0RVQ1RfT1VUKS8kKFRBUkdFVF9QUk9EVUNUKS1wcm9ndWFyZC11c2FnZS56aXAKK19wcm9ndWFyZF91c2FnZV96aXBzIDo9ICQoZm9yZWFjaCBtLCQoX3Byb2d1YXJkX2RpY3RfemlwX21vZHVsZXMpLCQoQUxMX01PRFVMRVMuJChtKS5QUk9HVUFSRF9VU0FHRV9aSVApKQorJChQUk9HVUFSRF9VU0FHRV9aSVApOiBQUklWQVRFX1pJUFMgOj0gJChfcHJvZ3VhcmRfdXNhZ2VfemlwcykKKyQoUFJPR1VBUkRfVVNBR0VfWklQKTogJChNRVJHRV9aSVBTKSAkKF9wcm9ndWFyZF91c2FnZV96aXBzKQogCUBlY2hvICJQYWNrYWdpbmcgUHJvZ3VhcmQgdXNhZ2UgZmlsZXMuIgotCW1rZGlyIC1wICQoZGlyICRAKSAkKFBSSVZBVEVfUEFDS0FHSU5HX0RJUikgJChkaXIgJChQUklWQVRFX0xJU1RfRklMRSkpCi0JZmluZCAkKFBSSVZBVEVfUEFDS0FHSU5HX0RJUikgLW5hbWUgcHJvZ3VhcmRfdXNhZ2UuemlwID4gJChQUklWQVRFX0xJU1RfRklMRSkKLQkkKE1FUkdFX1pJUFMpICRAIEAkKFBSSVZBVEVfTElTVF9GSUxFKQorCWVjaG8gLW4gPiAkQC50bXBhcmdsaXN0CisJJChmb3JlYWNoIHosJChQUklWQVRFX1pJUFMpLGVjaG8gIiQoeikiID4+ICRALnRtcGFyZ2xpc3QkKG5ld2xpbmUpKQorCSQoTUVSR0VfWklQUykgJEAgQCRALnRtcGFyZ2xpc3QKKwlybSAtcmYgJEAudG1wYXJnbGlzdAorCitfcHJvZ3VhcmRfZGljdF9tYXBwaW5nX2ZpbGVzIDo9CitfcHJvZ3VhcmRfdXNhZ2VfemlwcyA6PQorX3Byb2d1YXJkX2RpY3RfemlwX21vZHVsZXMgOj0KIAogJChjYWxsIGRlY2xhcmUtMXAtY29udGFpbmVyLCQoUFJPR1VBUkRfVVNBR0VfWklQKSwpCiBpZmVxICgsJChUQVJHRVRfQlVJTERfVU5CVU5ETEVEKSkKQEAgLTY3MDcsNyArNzQ1Myw3IEBACiAjIEZvciByZWFsIGRldmljZXMgYW5kIGZvciBkaXN0IGJ1aWxkcywgYnVpbGQgc3VwZXIgaW1hZ2UgZnJvbSB0YXJnZXQgZmlsZXMgdG8gYW4gaW50ZXJtZWRpYXRlIGRpcmVjdG9yeS4KIElOVEVSTkFMX1NVUEVSSU1BR0VfRElTVF9UQVJHRVQgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsc3VwZXIuaW1nKS9zdXBlci5pbWcKICQoSU5URVJOQUxfU1VQRVJJTUFHRV9ESVNUX1RBUkdFVCk6IGV4dHJhY3RlZF9pbnB1dF90YXJnZXRfZmlsZXMgOj0gJChwYXRzdWJzdCAlLnppcCwlLCQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpKQotJChJTlRFUk5BTF9TVVBFUklNQUdFX0RJU1RfVEFSR0VUKTogJChMUE1BS0UpICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpICQoQlVJTERfU1VQRVJfSU1BR0UpCiskKElOVEVSTkFMX1NVUEVSSU1BR0VfRElTVF9UQVJHRVQpOiAkKExQTUFLRSkgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKSAkKEJVSUxEX1NVUEVSX0lNQUdFKQogCSQoY2FsbCBwcmV0dHksIlRhcmdldCBzdXBlciBmcyBpbWFnZSBmcm9tIHRhcmdldCBmaWxlczogJEAiKQogCVBBVEg9JChkaXIgJChMUE1BS0UpKTokJFBBVEggXAogCSAgICAkKEJVSUxEX1NVUEVSX0lNQUdFKSAtdiAkKGV4dHJhY3RlZF9pbnB1dF90YXJnZXRfZmlsZXMpICRACkBAIC02ODE2LDcgKzc1NjIsNyBAQAogaWZlcSAoJChUQVJHRVRfQlVJTERfVFlQRSksZGVidWcpCiAgIG5hbWUgOj0gJChuYW1lKV9kZWJ1ZwogZW5kaWYKLW5hbWUgOj0gJChuYW1lKS1pbWctJChGSUxFX05BTUVfVEFHKQorbmFtZSA6PSAkKG5hbWUpLWltZwogCiBJTlRFUk5BTF9VUERBVEVfUEFDS0FHRV9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvJChuYW1lKS56aXAKIApAQCAtNjgyNSw2ICs3NTcxLDcgQEAKIAlQQVRIPSQoSU5URVJOQUxfVVNFUklNQUdFU19CSU5BUllfUEFUSFMpOiQoZGlyICQoWklQMlpJUCkpOiQkUEFUSCBcCiAJICAgICQoSU1HX0ZST01fVEFSR0VUX0ZJTEVTKSBcCiAJICAgICAgICAtLWFkZGl0aW9uYWwgSU1BR0VTL1ZlcmlmaWVkQm9vdFBhcmFtcy50ZXh0cHJvdG86VmVyaWZpZWRCb290UGFyYW1zLnRleHRwcm90byBcCisJICAgICAgICAtLWJ1aWxkX3N1cGVyX2ltYWdlICQoQlVJTERfU1VQRVJfSU1BR0UpIFwKIAkgICAgICAgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpICRACiAKICQoY2FsbCBkZWNsYXJlLTFwLWNvbnRhaW5lciwkKElOVEVSTkFMX1VQREFURV9QQUNLQUdFX1RBUkdFVCksKQpAQCAtNjgzMiw3ICs3NTc5LDcgQEAKIAogLlBIT05ZOiB1cGRhdGVwYWNrYWdlCiB1cGRhdGVwYWNrYWdlOiAkKElOVEVSTkFMX1VQREFURV9QQUNLQUdFX1RBUkdFVCkKLSQoY2FsbCBkaXN0LWZvci1nb2Fscyx1cGRhdGVwYWNrYWdlLCQoSU5URVJOQUxfVVBEQVRFX1BBQ0tBR0VfVEFSR0VUKSkKKyQoY2FsbCBkaXN0LWZvci1nb2Fscy13aXRoLWZpbGVuYW1ldGFnLHVwZGF0ZXBhY2thZ2UsJChJTlRFUk5BTF9VUERBVEVfUEFDS0FHRV9UQVJHRVQpKQogCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTY5NTIsNiArNzY5OSwxMCBAQAogZHJvaWRjb3JlLXVuYnVuZGxlZDogJChRRU1VX1ZFUklGSUVEX0JPT1RfUEFSQU1TKQogCiBlbmRpZgorCisjIFByZXByb2Nlc3MgZmlsZXMgZm9yIGVtdWxhdG9yIGFuZCBzZGsuCistaW5jbHVkZSBkZXZlbG9wbWVudC9idWlsZC90b29scy9zZGstcHJlcHJvY2Vzcy1maWxlcy5taworCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIFRoZSBlbXVsYXRvciBwYWNrYWdlCiBpZmVxICgkKEJVSUxEX0VNVUxBVE9SKSx0cnVlKQpAQCAtNjk2MSw3ICs3NzEyLDcgQEAKICAgICAgICAgJChJTlNUQUxMRURfU1lTVEVNSU1BR0VfVEFSR0VUKSBcCiAgICAgICAgICQoSU5TVEFMTEVEX1VTRVJEQVRBSU1BR0VfVEFSR0VUKQogCi1uYW1lIDo9ICQoVEFSR0VUX1BST0RVQ1QpLWVtdWxhdG9yLSQoRklMRV9OQU1FX1RBRykKK25hbWUgOj0gJChUQVJHRVRfUFJPRFVDVCktZW11bGF0b3IKIAogSU5URVJOQUxfRU1VTEFUT1JfUEFDS0FHRV9UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvJChuYW1lKS56aXAKIApAQCAtNjk4OSw3ICs3NzQwLDcgQEAKIGlmbmVxICgkKEhPU1RfT1MpLGxpbnV4KQogICAkKGVycm9yIEJ1aWxkaW5nIHRoZSBtb25vbGl0aGljIFNESyBpcyBvbmx5IHN1cHBvcnRlZCBvbiBMaW51eCkKIGVuZGlmCi1zZGtfbmFtZSA6PSBhbmRyb2lkLXNka18kKEZJTEVfTkFNRV9UQUcpCitzZGtfbmFtZSA6PSBhbmRyb2lkLXNkawogSU5URVJOQUxfU0RLX0hPU1RfT1NfTkFNRSA6PSBsaW51eC0kKFNES19IT1NUX0FSQ0gpCiBzZGtfbmFtZSA6PSAkKHNka19uYW1lKV8kKElOVEVSTkFMX1NES19IT1NUX09TX05BTUUpCiAKQEAgLTcwMjQsNiArNzc3NSwyNCBAQAogc2RrX2F0cmVlX2ZpbGVzICs9ICQoYXRyZWVfZGlyKS9zZGsuYXRyZWUKIGVuZGlmCiAKK1NES19NRVRBREFUQV9ESVIgOj0kPSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxmcmFtZXdvcmstZG9jLXN0dWJzLW1ldGFkYXRhLCxDT01NT04pCitTREtfTUVUQURBVEFfRklMRVMgOj0kPSAkKGFkZHByZWZpeCAkKFNES19NRVRBREFUQV9ESVIpLyxcCisgICAgYWN0aXZpdHlfYWN0aW9ucy50eHQgXAorICAgIGJyb2FkY2FzdF9hY3Rpb25zLnR4dCBcCisgICAgY2F0ZWdvcmllcy50eHQgXAorICAgIGZlYXR1cmVzLnR4dCBcCisgICAgc2VydmljZV9hY3Rpb25zLnR4dCBcCisgICAgd2lkZ2V0cy50eHQpCitTREtfTUVUQURBVEEgOj0kPSAkKGZpcnN0d29yZCAkKFNES19NRVRBREFUQV9GSUxFUykpCiskKFNES19NRVRBREFUQSk6IC5LQVRJX0lNUExJQ0lUX09VVFBVVFMgOj0gJChmaWx0ZXItb3V0ICQoU0RLX01FVEFEQVRBKSwkKFNES19NRVRBREFUQV9GSUxFUykpCiskKFNES19NRVRBREFUQSk6ICQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvUEFDS0FHSU5HL2ZyYW1ld29yay1kb2Mtc3R1YnMtbWV0YWRhdGEuemlwCisJcm0gLXJmICQoU0RLX01FVEFEQVRBX0RJUikKKwlta2RpciAtcCAkKFNES19NRVRBREFUQV9ESVIpCisJdW56aXAgLUREcW8gJDwgLWQgJChTREtfTUVUQURBVEFfRElSKQorCisuUEhPTlk6IGZyYW1ld29yay1kb2Mtc3R1YnMKK2ZyYW1ld29yay1kb2Mtc3R1YnM6ICQoU0RLX01FVEFEQVRBKQorCiBkZXBzIDo9IFwKIAkkKE9VVF9ET0NTKS9vZmZsaW5lLXNkay10aW1lc3RhbXAgXAogCSQoU0RLX01FVEFEQVRBX0ZJTEVTKSBcCkBAIC03MTcwLDExICs3OTM5LDExNSBAQAogaGFpa3UtcnVzdDogJChTT09OR19SVVNUX0ZVWlpfUEFDS0FHSU5HX0FSQ0hfTU9EVUxFUykgJChBTExfUlVTVF9GVVpaX1RBUkdFVFMpCiAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsaGFpa3UtcnVzdCwkKFNPT05HX1JVU1RfRlVaWl9QQUNLQUdJTkdfQVJDSF9NT0RVTEVTKSkKICQoY2FsbCBkaXN0LWZvci1nb2FscyxoYWlrdS1ydXN0LCQoUFJPRFVDVF9PVVQpL21vZHVsZS1pbmZvLmpzb24pCisuUEhPTlk6IGhhaWt1LXByZXN1Ym1pdAoraGFpa3UtcHJlc3VibWl0OiAkKFNPT05HX1BSRVNVQk1JVF9GVVpaX1BBQ0tBR0lOR19BUkNIX01PRFVMRVMpICQoQUxMX1BSRVNVQk1JVF9GVVpaX1RBUkdFVFMpCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsaGFpa3UtcHJlc3VibWl0LCQoU09PTkdfUFJFU1VCTUlUX0ZVWlpfUEFDS0FHSU5HX0FSQ0hfTU9EVUxFUykpCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRXh0cmFjdCBwbGF0Zm9ybSBmb250cyB1c2VkIGluIExheW91dGxpYgotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvbGF5b3V0bGliX2ZvbnRzLm1rCisjIEV4dHJhY3QgYWRkaXRpb25hbCBkYXRhIGZpbGVzIHVzZWQgaW4gTGF5b3V0bGliCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9sYXlvdXRsaWJfZGF0YS5tawogCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlc2t0b3AgcGFjayBjb21tb24gdmFyaWFibGVzLgorUEFDS19JTUFHRV9TQ1JJUFQgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvcGFja19pbWFnZQorSU1BR0VTIDo9ICQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpIFwKKwkkKElOU1RBTExFRF9TVVBFUklNQUdFX1RBUkdFVCkgXAorCSQoSU5TVEFMTEVEX0lOSVRfQk9PVF9JTUFHRV9UQVJHRVQpIFwKKwkkKElOU1RBTExFRF9WRU5ET1JfQk9PVElNQUdFX1RBUkdFVCkgXAorCSQoSU5TVEFMTEVEX1ZCTUVUQUlNQUdFX1RBUkdFVCkgXAorCSQoSU5TVEFMTEVEX1VTRVJEQVRBSU1BR0VfVEFSR0VUKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlc2t0b3AgcGFjayBpbWFnZSBob29rLgoraWZuZXEgKCwkKHN0cmlwICQoUEFDS19ERVNLVE9QX0ZJTEVTWVNURU1fSU1BR0VTKSkpCitQQUNLX0lNQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9hbmRyb2lkLWRlc2t0b3BfaW1hZ2UuYmluCisKKyQoUEFDS19JTUFHRV9UQVJHRVQpOiAkKElNQUdFUykgJChQQUNLX0lNQUdFX1NDUklQVCkKKwkkKFBBQ0tfSU1BR0VfU0NSSVBUKSAtLW91dF9kaXIgJChQUk9EVUNUX09VVCkgLS1ub2FyY2hpdmUKKworUEFDS0VEX0lNQUdFX0FSQ0hJVkVfVEFSR0VUIDo9ICQoUEFDS19JTUFHRV9UQVJHRVQpLmd6CisKKyQoUEFDS0VEX0lNQUdFX0FSQ0hJVkVfVEFSR0VUKTogJChQQUNLX0lNQUdFX1RBUkdFVCkgfCAkKEdaSVApCisJJChHWklQKSAtZmsgJChQQUNLX0lNQUdFX1RBUkdFVCkKKworJChjYWxsIGRpc3QtZm9yLWdvYWxzLGRpc3RfZmlsZXMsJChQQUNLRURfSU1BR0VfQVJDSElWRV9UQVJHRVQpKQorCisuUEhPTlk6IHBhY2staW1hZ2UKK3BhY2staW1hZ2U6ICQoUEFDS19JTUFHRV9UQVJHRVQpCisKK2VuZGlmICMgUEFDS19ERVNLVE9QX0ZJTEVTWVNURU1fSU1BR0VTCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVza3RvcCBwYWNrIHJlY292ZXJ5IGltYWdlIGhvb2suCitpZmVxICgkKEJPQVJEX1VTRVNfREVTS1RPUF9SRUNPVkVSWV9JTUFHRSksdHJ1ZSkKK1BBQ0tfUkVDT1ZFUllfSU1BR0VfVEFSR0VUIDo9ICQoUFJPRFVDVF9PVVQpL2FuZHJvaWQtZGVza3RvcF9yZWNvdmVyeV9pbWFnZS5iaW4KK1BBQ0tfUkVDT1ZFUllfSU1BR0VfQVJHUyA6PSAtLW5vYXJjaGl2ZSAtLXJlY292ZXJ5CisKK2lmbmVxICgsJChzdHJpcCAkKFBBQ0tfUkVDT1ZFUllfSU1BR0VfRVhQRVJJTUVOVEFMKSkpCitQQUNLX1JFQ09WRVJZX0lNQUdFX0FSR1MgKz0gLS1leHBlcmltZW50YWwKK2VuZGlmICMgUEFDS19SRUNPVkVSWV9JTUFHRV9FWFBFUklNRU5UQUwKKworJChQQUNLX1JFQ09WRVJZX0lNQUdFX1RBUkdFVCk6ICQoSU1BR0VTKSAkKFBBQ0tfSU1BR0VfU0NSSVBUKQorCSQoUEFDS19JTUFHRV9TQ1JJUFQpIC0tb3V0X2RpciAkKFBST0RVQ1RfT1VUKSAkKFBBQ0tfUkVDT1ZFUllfSU1BR0VfQVJHUykKKworUEFDS0VEX1JFQ09WRVJZX0lNQUdFX0FSQ0hJVkVfVEFSR0VUIDo9ICQoUEFDS19SRUNPVkVSWV9JTUFHRV9UQVJHRVQpLmd6CisKKyQoUEFDS0VEX1JFQ09WRVJZX0lNQUdFX0FSQ0hJVkVfVEFSR0VUKTogJChQQUNLX1JFQ09WRVJZX0lNQUdFX1RBUkdFVCkgfCAkKEdaSVApCisJJChHWklQKSAtZmsgJChQQUNLX1JFQ09WRVJZX0lNQUdFX1RBUkdFVCkKKworJChjYWxsIGRpc3QtZm9yLWdvYWxzLGRpc3RfZmlsZXMsJChQQUNLRURfUkVDT1ZFUllfSU1BR0VfQVJDSElWRV9UQVJHRVQpKQorCisuUEhPTlk6IHBhY2stcmVjb3ZlcnktaW1hZ2UKK3BhY2stcmVjb3ZlcnktaW1hZ2U6ICQoUEFDS19SRUNPVkVSWV9JTUFHRV9UQVJHRVQpCisKK2VuZGlmICMgQk9BUkRfVVNFU19ERVNLVE9QX1JFQ09WRVJZX0lNQUdFCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVza3RvcCBwYWNrIHVwZGF0ZSBpbWFnZSBob29rLgoraWZlcSAoJChCT0FSRF9VU0VTX0RFU0tUT1BfVVBEQVRFX0lNQUdFKSx0cnVlKQorUEFDS19VUERBVEVfSU1BR0VfVEFSR0VUIDo9ICQoUFJPRFVDVF9PVVQpL2FuZHJvaWQtZGVza3RvcF91cGRhdGVfaW1hZ2UuYmluCitQQUNLX1VQREFURV9JTUFHRV9BUkdTIDo9IC0tbm9hcmNoaXZlIC0tdXBkYXRlCisKK2lmbmVxICgsJChzdHJpcCAkKFBBQ0tfVVBEQVRFX0lNQUdFX0VYUEVSSU1FTlRBTCkpKQorUEFDS19VUERBVEVfSU1BR0VfQVJHUyArPSAtLWV4cGVyaW1lbnRhbAorZW5kaWYgIyBQQUNLX1VQREFURV9JTUFHRV9FWFBFUklNRU5UQUwKKworJChQQUNLX1VQREFURV9JTUFHRV9UQVJHRVQpOiAkKElNQUdFUykgJChQQUNLX0lNQUdFX1NDUklQVCkKKwkkKFBBQ0tfSU1BR0VfU0NSSVBUKSAtLW91dF9kaXIgJChQUk9EVUNUX09VVCkgJChQQUNLX1VQREFURV9JTUFHRV9BUkdTKQorCitQQUNLRURfVVBEQVRFX0lNQUdFX0FSQ0hJVkVfVEFSR0VUIDo9ICQoUEFDS19VUERBVEVfSU1BR0VfVEFSR0VUKS5negorCiskKFBBQ0tFRF9VUERBVEVfSU1BR0VfQVJDSElWRV9UQVJHRVQpOiAkKFBBQ0tfVVBEQVRFX0lNQUdFX1RBUkdFVCkgfCAkKEdaSVApCisJJChHWklQKSAtZmsgJChQQUNLX1VQREFURV9JTUFHRV9UQVJHRVQpCisKKyQoY2FsbCBkaXN0LWZvci1nb2FscyxkaXN0X2ZpbGVzLCQoUEFDS0VEX1VQREFURV9JTUFHRV9BUkNISVZFX1RBUkdFVCkpCisKKy5QSE9OWTogcGFjay11cGRhdGUtaW1hZ2UKK3BhY2stdXBkYXRlLWltYWdlOiAkKFBBQ0tfVVBEQVRFX0lNQUdFX1RBUkdFVCkKKworZW5kaWYgIyBCT0FSRF9VU0VTX0RFU0tUT1BfVVBEQVRFX0lNQUdFCisKK1BBQ0tfTUlHUkFUSU9OX0lNQUdFX1NDUklQVCA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9wYWNrX21pZ3JhdGlvbl9pbWFnZQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlc2t0b3AgcGFjayBtaWdyYXRpb24gaW1hZ2UgaG9vay4KK2lmZXEgKCQoQU5EUk9JRF9ERVNLVE9QX01JR1JBVElPTl9JTUFHRSksdHJ1ZSkKK1BBQ0tfTUlHUkFUSU9OX0lNQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9hbmRyb2lkLWRlc2t0b3BfbWlncmF0aW9uX2ltYWdlLmJpbgorCiskKFBBQ0tfTUlHUkFUSU9OX0lNQUdFX1RBUkdFVCk6ICQoSU1BR0VTKSAkKFBBQ0tfTUlHUkFUSU9OX0lNQUdFX1NDUklQVCkKKwkkKFBBQ0tfTUlHUkFUSU9OX0lNQUdFX1NDUklQVCkgLS1vdXRfZGlyICQoUFJPRFVDVF9PVVQpIC0tbm9hcmNoaXZlCisKK1BBQ0tFRF9NSUdSQVRJT05fSU1BR0VfQVJDSElWRV9UQVJHRVQgOj0gJChQQUNLX01JR1JBVElPTl9JTUFHRV9UQVJHRVQpLmd6CisKKyQoUEFDS0VEX01JR1JBVElPTl9JTUFHRV9BUkNISVZFX1RBUkdFVCk6ICQoUEFDS19NSUdSQVRJT05fSU1BR0VfVEFSR0VUKSB8ICQoR1pJUCkKKwkkKEdaSVApIC1mayAkKFBBQ0tfTUlHUkFUSU9OX0lNQUdFX1RBUkdFVCkKKworJChjYWxsIGRpc3QtZm9yLWdvYWxzLGRpc3RfZmlsZXMsJChQQUNLRURfTUlHUkFUSU9OX0lNQUdFX0FSQ0hJVkVfVEFSR0VUKSkKKworLlBIT05ZOiBwYWNrLW1pZ3JhdGlvbi1pbWFnZQorcGFjay1taWdyYXRpb24taW1hZ2U6ICQoUEFDS19NSUdSQVRJT05fSU1BR0VfVEFSR0VUKQorCitlbmRpZiAjIEFORFJPSURfREVTS1RPUF9NSUdSQVRJT05fSU1BR0UKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBPUyBMaWNlbnNpbmcKZGlmZiAtLWdpdCBhL2NvcmUvT1dORVJTIGIvY29yZS9PV05FUlMKaW5kZXggZGJkNzA2Ni4uMzVlYTgzZCAxMDA2NDQKLS0tIGEvY29yZS9PV05FUlMKKysrIGIvY29yZS9PV05FUlMKQEAgLTUsMyArNSw5IEBACiAjIEZvciB2ZXJzaW9uIHVwZGF0ZXMKIHBlci1maWxlIHZlcnNpb25fZGVmYXVsdHMubWsgPSBhbmt1cmJha3NoaUBnb29nbGUuY29tLGJraGFsaWZlQGdvb2dsZS5jb20samFpbm5lQGdvb2dsZS5jb20sbG9rZXNoZ29lbEBnb29nbGUuY29tLGx1Ym9taXJAZ29vZ2xlLmNvbSxwc2NvdmFubmVyQGdvb2dsZS5jb20KIAorIyBGb3Igc2RrIGV4dGVuc2lvbnMgdmVyc2lvbiB1cGRhdGVzCitwZXItZmlsZSB2ZXJzaW9uX2RlZmF1bHRzLm1rID0gYW1oa0Bnb29nbGUuY29tLGd1cnByZWV0Z3NAZ29vZ2xlLmNvbSxta2hva2hsb3ZhQGdvb2dsZS5jb20scm9iZXJ0b2dpbEBnb29nbGUuY29tCisKKyMgRm9yIFJhdmVud29vZCB0ZXN0IGNvbmZpZ3MKK3Blci1maWxlIHJhdmVud29vZF90ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwgPSBqc2hhcmtleUBnb29nbGUuY29tLG9tYWtvdG9AZ29vZ2xlLmNvbQorCmRpZmYgLS1naXQgYS9jb3JlL2FhcHQyLm1rIGIvY29yZS9hYXB0Mi5tawppbmRleCA3YjE3ZGY0Li4wZTIzNDc3IDEwMDY0NAotLS0gYS9jb3JlL2FhcHQyLm1rCisrKyBiL2NvcmUvYWFwdDIubWsKQEAgLTY4LDYgKzY4LDggQEAKICMgc3VwcG9ydCBmb3IgaXQuCiBteV9zdGF0aWNfbGlicmFyeV9yZXNvdXJjZXMgOj0gJChmb3JlYWNoIGwsICQoY2FsbCByZXZlcnNlLWxpc3QsJChMT0NBTF9TVEFUSUNfQU5EUk9JRF9MSUJSQVJJRVMpICQoTE9DQUxfU1RBVElDX0pBVkFfQUFSX0xJQlJBUklFUykpLFwKICAgJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixKQVZBX0xJQlJBUklFUywkKGwpLCxDT01NT04pL3BhY2thZ2UtcmVzLmFwaykKK215X3N0YXRpY19saWJyYXJ5X3RyYW5zaXRpdmVfcmVzb3VyY2VfcGFja2FnZXNfbGlzdHMgOj0gJChmb3JlYWNoIGwsICQoY2FsbCByZXZlcnNlLWxpc3QsJChMT0NBTF9TVEFUSUNfQU5EUk9JRF9MSUJSQVJJRVMpICQoTE9DQUxfU1RBVElDX0pBVkFfQUFSX0xJQlJBUklFUykpLFwKKyAgJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixKQVZBX0xJQlJBUklFUywkKGwpLCxDT01NT04pL3RyYW5zaXRpdmUtcmVzLXBhY2thZ2VzKQogbXlfc3RhdGljX2xpYnJhcnlfZXh0cmFfcGFja2FnZXMgOj0gJChmb3JlYWNoIGwsICQoY2FsbCByZXZlcnNlLWxpc3QsJChMT0NBTF9TVEFUSUNfQU5EUk9JRF9MSUJSQVJJRVMpICQoTE9DQUxfU1RBVElDX0pBVkFfQUFSX0xJQlJBUklFUykpLFwKICAgJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixKQVZBX0xJQlJBUklFUywkKGwpLCxDT01NT04pL2V4dHJhX3BhY2thZ2VzKQogbXlfc2hhcmVkX2xpYnJhcnlfcmVzb3VyY2VzIDo9ICQoZm9yZWFjaCBsLCAkKExPQ0FMX1NIQVJFRF9BTkRST0lEX0xJQlJBUklFUyksXApAQCAtOTUsNiArOTcsNyBAQAogJChteV9yZXNfcGFja2FnZSk6IFBSSVZBVEVfSkFWQV9HRU5fRElSIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2FhcHQyCiAkKG15X3Jlc19wYWNrYWdlKTogUFJJVkFURV9TUkNKQVIgOj0gJChteV9zcmNqYXIpCiAkKG15X3Jlc19wYWNrYWdlKTogUFJJVkFURV9TVEFUSUNfTElCUkFSWV9FWFRSQV9QQUNLQUdFUyA6PSAkKG15X3N0YXRpY19saWJyYXJ5X2V4dHJhX3BhY2thZ2VzKQorJChteV9yZXNfcGFja2FnZSk6IFBSSVZBVEVfU1RBVElDX0xJQlJBUllfVFJBTlNJVElWRV9SRVNfUEFDS0FHRVNfTElTVFMgOj0gJChteV9zdGF0aWNfbGlicmFyeV90cmFuc2l0aXZlX3Jlc291cmNlX3BhY2thZ2VzX2xpc3RzKQogJChteV9yZXNfcGFja2FnZSk6IFBSSVZBVEVfQUFQVF9FWFRSQV9QQUNLQUdFUyA6PSAkKGFhcHRfZXh0cmFfcGFja2FnZXMpCiAkKG15X3Jlc19wYWNrYWdlKTogLktBVElfSU1QTElDSVRfT1VUUFVUUyA6PSAkKG15X3NyY2phcikgJChhYXB0X2V4dHJhX3BhY2thZ2VzKQogCkBAIC0xMTcsNyArMTIwLDcgQEAKICQobXlfcmVzX3BhY2thZ2UpOiAuS0FUSV9JTVBMSUNJVF9PVVRQVVRTICs9ICQocHJvZ3VhcmRfb3B0aW9uc19maWxlKQogZW5kaWYKIAotJChteV9yZXNfcGFja2FnZSk6ICQoZnVsbF9hbmRyb2lkX21hbmlmZXN0KSAkKG15X3N0YXRpY19saWJyYXJ5X3Jlc291cmNlcykgJChteV9zaGFyZWRfbGlicmFyeV9yZXNvdXJjZXMpCiskKG15X3Jlc19wYWNrYWdlKTogJChmdWxsX2FuZHJvaWRfbWFuaWZlc3QpICQobXlfc3RhdGljX2xpYnJhcnlfcmVzb3VyY2VzKSAkKG15X3N0YXRpY19saWJyYXJ5X3RyYW5zaXRpdmVfcmVzb3VyY2VfcGFja2FnZXNfbGlzdHMpICQobXlfc2hhcmVkX2xpYnJhcnlfcmVzb3VyY2VzKQogJChteV9yZXNfcGFja2FnZSk6ICQobXlfZnVsbF9hc3NldF9wYXRocykKICQobXlfcmVzX3BhY2thZ2UpOiAkKG15X3Jlc19yZXNvdXJjZXNfZmxhdCkgJChteV9vdmVybGF5X3Jlc291cmNlc19mbGF0KSBcCiAgICQobXlfcmVzb3VyY2VzX2ZsYXRhKSAkKG15X3N0YXRpY19saWJyYXJ5X3Jlc291cmNlcykgJChteV9zdGF0aWNfbGlicmFyeV9leHRyYV9wYWNrYWdlcykgXApkaWZmIC0tZ2l0IGEvY29yZS9hbmRyb2lkX21hbmlmZXN0Lm1rIGIvY29yZS9hbmRyb2lkX21hbmlmZXN0Lm1rCmluZGV4IGZmNDkyNjIuLjdmNDY5MDMgMTAwNjQ0Ci0tLSBhL2NvcmUvYW5kcm9pZF9tYW5pZmVzdC5taworKysgYi9jb3JlL2FuZHJvaWRfbWFuaWZlc3QubWsKQEAgLTUxLDYgKzUxLDkgQEAKICAgICAgICAgbXlfdGFyZ2V0X3Nka192ZXJzaW9uIDo9ICQobXlfdGFyZ2V0X3Nka192ZXJzaW9uKS4kJChjYXQgJChBUElfRklOR0VSUFJJTlQpKQogICAgICAgICBteV9taW5fc2RrX3ZlcnNpb24gOj0gJChteV9taW5fc2RrX3ZlcnNpb24pLiQkKGNhdCAkKEFQSV9GSU5HRVJQUklOVCkpCiAgICAgICAgICQoZml4ZWRfYW5kcm9pZF9tYW5pZmVzdCk6ICQoQVBJX0ZJTkdFUlBSSU5UKQorICAgICAgZWxzZSBpZmRlZiBVTkJVTkRMRURfQlVJTERfVEFSR0VUX1NES19XSVRIX0RFU1NFUlRfU0hBCisgICAgICAgIG15X3RhcmdldF9zZGtfdmVyc2lvbiA6PSAkKFVOQlVORExFRF9CVUlMRF9UQVJHRVRfU0RLX1dJVEhfREVTU0VSVF9TSEEpCisgICAgICAgIG15X21pbl9zZGtfdmVyc2lvbiA6PSAkKFVOQlVORExFRF9CVUlMRF9UQVJHRVRfU0RLX1dJVEhfREVTU0VSVF9TSEEpCiAgICAgICBlbmRpZgogICAgIGVuZGlmCiAgIGVuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2FuZHJvaWRfc29vbmdfY29uZmlnX3ZhcnMubWsgYi9jb3JlL2FuZHJvaWRfc29vbmdfY29uZmlnX3ZhcnMubWsKaW5kZXggNmJhYzUyYi4uZmVkOWJjZiAxMDA2NDQKLS0tIGEvY29yZS9hbmRyb2lkX3Nvb25nX2NvbmZpZ192YXJzLm1rCisrKyBiL2NvcmUvYW5kcm9pZF9zb29uZ19jb25maWdfdmFycy5tawpAQCAtMjYsMTEzICsyNiw2OCBAQAogCiAjIEFkZCB2YXJpYWJsZXMgdG8gdGhlIG5hbWVzcGFjZSBiZWxvdzoKIAotJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsVEFSR0VUX0RZTkFNSUNfNjRfMzJfTUVESUFTRVJWRVIpCiskKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXIsQU5EUk9JRCxCT0FSRF9VU0VTX09ETUlNQUdFKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxBTkRST0lELEJPQVJEX1VTRVNfUkVDT1ZFUllfQVNfQk9PVCwkKEJPQVJEX1VTRVNfUkVDT1ZFUllfQVNfQk9PVCkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLEFORFJPSUQsQk9BUkRfTU9WRV9HU0lfQVZCX0tFWVNfVE9fVkVORE9SX0JPT1QsJChCT0FSRF9NT1ZFX0dTSV9BVkJfS0VZU19UT19WRU5ET1JfQk9PVCkpCiskKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXIsQU5EUk9JRCxDSEVDS19ERVZfVFlQRV9WSU9MQVRJT05TKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxBTkRST0lELEhBU19CT0FSRF9TWVNURU1fRVhUX1BSRUJVSUxUX0RJUiwkKGlmICQoQk9BUkRfU1lTVEVNX0VYVF9QUkVCVUlMVF9ESVIpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxBTkRST0lELEhBU19CT0FSRF9QUk9EVUNUX1BSRUJVSUxUX0RJUiwkKGlmICQoQk9BUkRfUFJPRFVDVF9QUkVCVUlMVF9ESVIpLHRydWUsZmFsc2UpKQorJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsUExBVEZPUk1fU0VQT0xJQ1lfVkVSU0lPTikKKyQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3ZhcixBTkRST0lELFBMQVRGT1JNX1NFUE9MSUNZX0NPTVBBVF9WRVJTSU9OUykKKyQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3ZhcixBTkRST0lELFBST0RVQ1RfSU5TVEFMTF9ERUJVR19QT0xJQ1lfVE9fU1lTVEVNX0VYVCkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsQU5EUk9JRCxSRUxFQVNFX0JPQVJEX0FQSV9MRVZFTF9GUk9aRU4sJChSRUxFQVNFX0JPQVJEX0FQSV9MRVZFTF9GUk9aRU4pKQogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsVEFSR0VUX0RZTkFNSUNfNjRfMzJfRFJNU0VSVkVSKQogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsVEFSR0VUX0VOQUJMRV9NRURJQURSTV82NCkKLSQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3ZhcixBTkRST0lELElTX1RBUkdFVF9NSVhFRF9TRVBPTElDWSkKLWlmZXEgKCQoSVNfVEFSR0VUX01JWEVEX1NFUE9MSUNZKSx0cnVlKQotJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQsTUlYRURfU0VQT0xJQ1lfVkVSU0lPTiwkKEJPQVJEX1NFUE9MSUNZX1ZFUlMpKQotZW5kaWYKLSQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3ZhcixBTkRST0lELEJPQVJEX1VTRVNfT0RNSU1BR0UpCi0kKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXIsQU5EUk9JRCxCT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1QpCi0kKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXIsQU5EUk9JRCxQUk9EVUNUX0lOU1RBTExfREVCVUdfUE9MSUNZX1RPX1NZU1RFTV9FWFQpCiskKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXIsQU5EUk9JRCxUQVJHRVRfRFlOQU1JQ182NF8zMl9NRURJQVNFUlZFUikKKyQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3ZhcixBTkRST0lELEJPQVJEX0dFTkZTX0xBQkVMU19WRVJTSU9OKQogCi0jIERlZmF1bHQgYmVoYXZpb3IgZm9yIHRoZSB0cmVlIHdydCBidWlsZGluZyBtb2R1bGVzIG9yIHVzaW5nIHByZWJ1aWx0cy4gVGhpcwotIyBjYW4gYWx3YXlzIGJlIG92ZXJyaWRkZW4gYnkgc2V0dGluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLSMgTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFLgotQlJBTkNIX0RFRkFVTFRfTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFIDo9IGZhbHNlCiskKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXIsQU5EUk9JRCxBRERJVElPTkFMX000REVGUywkKGlmICQoQk9BUkRfU0VQT0xJQ1lfTTRERUZTKSwkKGFkZHByZWZpeCAtRCwkKEJPQVJEX1NFUE9MSUNZX000REVGUykpKSkKIAotaWZuZXEgKCQoU0FOSVRJWkVfVEFSR0VUKSQoRU1NQV9JTlNUUlVNRU5UX0ZSQU1FV09SSyksKQotICAjIEFsd2F5cyB1c2Ugc291cmNlcyB3aGVuIGJ1aWxkaW5nIHRoZSBmcmFtZXdvcmsgd2l0aCBKYXZhIGNvdmVyYWdlIG9yCi0gICMgc2FuaXRpemVkIGJ1aWxkcyBhcyB0aGV5IGJvdGggcmVxdWlyZSBwdXJwb3NlIGJ1aWx0IHByZWJ1aWx0cyB3aGljaCB3ZSBkbwotICAjIG5vdCBwcm92aWRlLgotICBCUkFOQ0hfREVGQVVMVF9NT0RVTEVfQlVJTERfRlJPTV9TT1VSQ0UgOj0gdHJ1ZQorIyBGb3IgYm9vdGFibGUvcmVjb3ZlcnkKK1JFQ09WRVJZX0FQSV9WRVJTSU9OIDo9IDMKK1JFQ09WRVJZX0ZTVEFCX1ZFUlNJT04gOj0gMgorJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsIHJlY292ZXJ5LCByZWNvdmVyeV9hcGlfdmVyc2lvbiwgJChSRUNPVkVSWV9BUElfVkVSU0lPTikpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldCwgcmVjb3ZlcnksIHJlY292ZXJ5X2ZzdGFiX3ZlcnNpb24sICQoUkVDT1ZFUllfRlNUQUJfVkVSU0lPTikpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLCByZWNvdmVyeSAsdGFyZ2V0X3VzZXJpbWFnZXNfdXNlX2YyZnMgLCQoaWYgJChUQVJHRVRfVVNFUklNQUdFU19VU0VfRjJGUyksdHJ1ZSxmYWxzZSkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLCByZWNvdmVyeSAsaGFzX2JvYXJkX2NhY2hlaW1hZ2VfcGFydGl0aW9uX3NpemUgLCQoaWYgJChCT0FSRF9DQUNIRUlNQUdFX1BBUlRJVElPTl9TSVpFKSx0cnVlLGZhbHNlKSkKK2lmZGVmIFRBUkdFVF9SRUNPVkVSWV9VSV9MSUIKKyAgJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfc3RyaW5nX2xpc3QsIHJlY292ZXJ5LCB0YXJnZXRfcmVjb3ZlcnlfdWlfbGliLCAkKFRBUkdFVF9SRUNPVkVSWV9VSV9MSUIpKQogZW5kaWYKIAotaWZuZXEgKCQoQ0xBTkdfQ09WRVJBR0UpJChOQVRJVkVfQ09WRVJBR0VfUEFUSFMpLCkKLSAgIyBBbHdheXMgdXNlIHNvdXJjZXMgd2hlbiBidWlsZGluZyB3aXRoIGNsYW5nIGNvdmVyYWdlIGFuZCBuYXRpdmUgY292ZXJhZ2UuCi0gICMgSXQgaXMgcG9zc2libGUgdGhhdCB0aGVyZSBhcmUgY2VydGFpbiBzaXR1YXRpb25zIHdoZW4gYnVpbGRpbmcgd2l0aCBjb3ZlcmFnZQotICAjIHdvdWxkIHdvcmsgd2l0aCBwcmVidWlsdHMsIGUuZy4gd2hlbiB0aGUgY292ZXJhZ2UgaXMgbm90IGJlaW5nIGFwcGxpZWQgdG8KLSAgIyBtb2R1bGVzIGZvciB3aGljaCB3ZSBwcm92aWRlIHByZWJ1aWx0cy4gVW5mb3J0dW5hdGVseSwgZGV0ZXJtaW5pbmcgdGhhdAotICAjIHdvdWxkIHJlcXVpcmUgZW1iZWRkaW5nIGtub3dsZWRnZSBvZiB3aGljaCBjb3ZlcmFnZSBwYXRocyBhZmZlY3Qgd2hpY2gKLSAgIyBtb2R1bGVzIGhlcmUuIFRoYXQgd291bGQgZHVwbGljYXRlIGEgbG90IG9mIGluZm9ybWF0aW9uLCBhZGQgeWV0IGFub3RoZXIKLSAgIyBsb2NhdGlvbiAgbW9kdWxlIGF1dGhvcnMgaGF2ZSB0byB1cGRhdGUgYW5kIGNvbXBsaWNhdGUgdGhlIGxvZ2ljIGhlcmUuCi0gICMgRm9yIG5vd2Ugd2Ugd2lsbCBqdXN0IGFsd2F5cyBidWlsZCBmcm9tIHNvdXJjZXMgd2hlbiBkb2luZyBjb3ZlcmFnZSBidWlsZHMuCi0gIEJSQU5DSF9ERUZBVUxUX01PRFVMRV9CVUlMRF9GUk9NX1NPVVJDRSA6PSB0cnVlCi1lbmRpZgorIyBGb3IgU2FuaXRpemVycworJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxBTkRST0lELEFTQU5fRU5BQkxFRCwkKGlmICQoZmlsdGVyIGFkZHJlc3MsJChTQU5JVElaRV9UQVJHRVQpKSx0cnVlLGZhbHNlKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsQU5EUk9JRCxIV0FTQU5fRU5BQkxFRCwkKGlmICQoZmlsdGVyIGh3YWRkcmVzcywkKFNBTklUSVpFX1RBUkdFVCkpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxBTkRST0lELFNBTklUSVpFX1RBUkdFVF9TWVNURU1fRU5BQkxFRCwkKGlmICQoZmlsdGVyIHRydWUsJChTQU5JVElaRV9UQVJHRVRfU1lTVEVNKSksdHJ1ZSxmYWxzZSkpCiAKLSMgQVJUIGRvZXMgbm90IHByb3ZpZGUgbGludXhfYmlvbmljIHZhcmlhbnRzIG5lZWRlZCBmb3IgcHJvZHVjdHMgdGhhdAotIyBzZXQgSE9TVF9DUk9TU19PUz1saW51eF9iaW9uaWMuCi1pZmVxIChsaW51eF9iaW9uaWMsJHtIT1NUX0NST1NTX09TfSkKLSAgQlJBTkNIX0RFRkFVTFRfTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFIDo9IHRydWUKLWVuZGlmCisjIEZvciBpbml0LmVudmlyb24ucmMKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsQU5EUk9JRCxHQ09WX0NPVkVSQUdFLCQoTkFUSVZFX0NPVkVSQUdFKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsQU5EUk9JRCxDTEFOR19DT1ZFUkFHRSwkKENMQU5HX0NPVkVSQUdFKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LEFORFJPSUQsU0NVRE9fQUxMT0NBVElPTl9SSU5HX0JVRkZFUl9TSVpFLCQoUFJPRFVDVF9TQ1VET19BTExPQ0FUSU9OX1JJTkdfQlVGRkVSX1NJWkUpKQogCi0jIEFSVCBkb2VzIG5vdCBwcm92aWRlIGhvc3Qgc2lkZSBhcm02NCB2YXJpYW50cyBuZWVkZWQgZm9yIHByb2R1Y3RzIHRoYXQKLSMgc2V0IEhPU1RfQ1JPU1NfQVJDSD1hcm02NC4KLWlmZXEgKGFybTY0LCR7SE9TVF9DUk9TU19BUkNIfSkKLSAgQlJBTkNIX0RFRkFVTFRfTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFIDo9IHRydWUKLWVuZGlmCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLEFORFJPSUQsRU1NQV9JTlNUUlVNRU5ULCQoaWYgJChmaWx0ZXIgdHJ1ZSwkKEVNTUFfSU5TVFJVTUVOVCkpLHRydWUsZmFsc2UpKQogCi0jIFRWIGJhc2VkIGRldmljZXMgZG8gbm90IHNlZW0gdG8gd29yayB3aXRoIHByZWJ1aWx0cywgc28gYnVpbGQgZnJvbSBzb3VyY2UKLSMgZm9yIG5vdyBhbmQgZml4IGluIGEgZm9sbG93IHVwLgotaWZuZXEgKCwkKGZpbHRlciB0diwkKHN1YnN0ICQoY29tbWEpLCQoc3BhY2UpLCR7UFJPRFVDVF9DSEFSQUNURVJJU1RJQ1N9KSkpCi0gIEJSQU5DSF9ERUZBVUxUX01PRFVMRV9CVUlMRF9GUk9NX1NPVVJDRSA6PSB0cnVlCi1lbmRpZgorIyBQUk9EVUNUX1BSRUNPTVBJTEVEX1NFUE9MSUNZIGRlZmF1bHRzIHRvIHRydWUuIEV4cGxpY2l0bHkgY2hlY2sgaWYgaXQncyAiZmFsc2UiIG9yIG5vdC4KKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsQU5EUk9JRCxQUk9EVUNUX1BSRUNPTVBJTEVEX1NFUE9MSUNZLCQoaWYgJChmaWx0ZXIgZmFsc2UsJChQUk9EVUNUX1BSRUNPTVBJTEVEX1NFUE9MSUNZKSksZmFsc2UsdHJ1ZSkpCiAKLSMgQVRWIGJhc2VkIGRldmljZXMgZG8gbm90IHNlZW0gdG8gd29yayB3aXRoIHByZWJ1aWx0cywgc28gYnVpbGQgZnJvbSBzb3VyY2UKLSMgZm9yIG5vdyBhbmQgZml4IGluIGEgZm9sbG93IHVwLgotaWZuZXEgKCwke1BST0RVQ1RfSVNfQVRWfSkKLSAgQlJBTkNIX0RFRkFVTFRfTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFIDo9IHRydWUKKyMgRm9yIGFydCBtb2R1bGVzCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGFydF9tb2R1bGUsaG9zdF9wcmVmZXJfMzJfYml0LCQoaWYgJChmaWx0ZXIgdHJ1ZSwkKEhPU1RfUFJFRkVSXzMyX0JJVCkpLHRydWUsZmFsc2UpKQoraWZkZWYgQVJUX0RFQlVHX09QVF9GTEFHCiskKGNhbGwgc29vbmdfY29uZmlnX3NldCxhcnRfbW9kdWxlLGFydF9kZWJ1Z19vcHRfZmxhZywkKEFSVF9ERUJVR19PUFRfRkxBRykpCiBlbmRpZgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBBUlRfQlVJTERfSE9TVF9ERUJVRyBpcyB0cnVlCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGFydF9tb2R1bGUsYXJ0X2J1aWxkX2hvc3RfZGVidWcsJChpZiAkKGZpbHRlciBmYWxzZSwkKEFSVF9CVUlMRF9IT1NUX0RFQlVHKSksZmFsc2UsdHJ1ZSkpCiAKLWlmbmVxICgsJChNT0RVTEVfQlVJTERfRlJPTV9TT1VSQ0UpKQotICAjIEtlZXAgYW4gZXhwbGljaXQgc2V0dGluZy4KLWVsc2UgaWZlcSAoLCQoZmlsdGVyIGRvY3Mgc2RrIHdpbl9zZGsgc2RrX2FkZG9uLCQoTUFLRUNNREdPQUxTKSkkKGZpbmRzdHJpbmcgY29tLmdvb2dsZS5hbmRyb2lkLmNvbnNjcnlwdCwkKFBST0RVQ1RfUEFDS0FHRVMpKSQoZmluZHN0cmluZyBjb20uZ29vZ2xlLmFuZHJvaWQuZ28uY29uc2NyeXB0LCQoUFJPRFVDVF9QQUNLQUdFUykpKQotICAjIFByZWJ1aWx0IG1vZHVsZSBTREtzIHJlcXVpcmUgcHJlYnVpbHQgbW9kdWxlcyB0byB3b3JrLCBhbmQgY3VycmVudGx5Ci0gICMgcHJlYnVpbHQgbW9kdWxlcyBhcmUgb25seSBwcm92aWRlZCBmb3IgY29tLmdvb2dsZS5hbmRyb2lkKC5nbyk/Lnh4eC4gSWYgd2UgY2FuJ3QKLSAgIyBmaW5kIG9uZSBvZiB0aGVtIGluIFBST0RVQ1RfUEFDS0FHRVMgdGhlbiBhc3N1bWUgY29tLmFuZHJvaWQueHh4IGFyZSBpbiB1c2UsCi0gICMgYW5kIGRpc2FibGUgcHJlYnVpbHQgU0RLcy4gSW4gcGFydGljdWxhciB0aGlzIGFwcGxpZXMgdG8gQU9TUCBidWlsZHMuCi0gICMKLSAgIyBIb3dldmVyLCBkb2NzL3Nkay93aW5fc2RrL3Nka19hZGRvbiBidWlsZHMgbWlnaHQgbm90IGluY2x1ZGUgY29tLmdvb2dsZS5hbmRyb2lkLnh4eAotICAjIHBhY2thZ2VzLCBzbyBmb3IgdGhvc2Ugd2UgcmVzcGVjdCB0aGUgZGVmYXVsdCBiZWhhdmlvci4KLSAgTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFIDo9IHRydWUKLWVsc2UgaWZuZXEgKCwkKFBST0RVQ1RfTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFKSkKLSAgIyBMZXQgcHJvZHVjdHMgb3ZlcnJpZGUgdGhlIGJyYW5jaCBkZWZhdWx0LgotICBNT0RVTEVfQlVJTERfRlJPTV9TT1VSQ0UgOj0gJChQUk9EVUNUX01PRFVMRV9CVUlMRF9GUk9NX1NPVVJDRSkKLWVsc2UKLSAgTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFIDo9ICQoQlJBTkNIX0RFRkFVTFRfTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFKQotZW5kaWYKLQotaWZuZXEgKCwkKEFSVF9NT0RVTEVfQlVJTERfRlJPTV9TT1VSQ0UpKQotICAjIEtlZXAgYW4gZXhwbGljaXQgc2V0dGluZy4KLWVsc2UgaWZuZXEgKCwkKGZpbmRzdHJpbmcgLmFuZHJvaWQuYXJ0LCQoVEFSR0VUX0JVSUxEX0FQUFMpKSkKLSAgIyBCdWlsZCBBUlQgbW9kdWxlcyBmcm9tIHNvdXJjZSBpZiB0aGV5IGFyZSBsaXN0ZWQgaW4gVEFSR0VUX0JVSUxEX0FQUFMuCi0gIEFSVF9NT0RVTEVfQlVJTERfRlJPTV9TT1VSQ0UgOj0gdHJ1ZQotZWxzZQotICAjIERvIHRoZSBzYW1lIGFzIG90aGVyIG1vZHVsZXMgYnkgZGVmYXVsdC4KLSAgQVJUX01PRFVMRV9CVUlMRF9GUk9NX1NPVVJDRSA6PSAkKE1PRFVMRV9CVUlMRF9GUk9NX1NPVVJDRSkKLWVuZGlmCi0KLSQoY2FsbCBzb29uZ19jb25maWdfc2V0LGFydF9tb2R1bGUsc291cmNlX2J1aWxkLCQoQVJUX01PRFVMRV9CVUlMRF9GUk9NX1NPVVJDRSkpCisjIEZvciBjaHJlCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGNocmUsY2hyZV9kYWVtb25fbHBtYV9lbmFibGVkLCQoaWYgJChmaWx0ZXIgdHJ1ZSwkKENIUkVfREFFTU9OX0xQTUFfRU5BQkxFRCkpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxjaHJlLGNocmVfZGVkaWNhdGVkX3RyYW5zcG9ydF9jaGFubmVsX2VuYWJsZWQsJChpZiAkKGZpbHRlciB0cnVlLCQoQ0hSRV9ERURJQ0FURURfVFJBTlNQT1JUX0NIQU5ORUxfRU5BQkxFRCkpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxjaHJlLGNocmVfbG9nX2F0b21fZXh0ZW5zaW9uX2VuYWJsZWQsJChpZiAkKGZpbHRlciB0cnVlLCQoQ0hSRV9MT0dfQVRPTV9FWFRFTlNJT05fRU5BQkxFRCkpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxjaHJlLGJ1aWxkaW5nX3ZlbmRvcl9pbWFnZSwkKGlmICQoZmlsdGVyIHRydWUsJChCVUlMRElOR19WRU5ET1JfSU1BR0UpKSx0cnVlLGZhbHNlKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsY2hyZSxjaHJlX3VzZl9kYWVtb25fZW5hYmxlZCwkKGlmICQoZmlsdGVyIHRydWUsJChDSFJFX1VTRl9EQUVNT05fRU5BQkxFRCkpLHRydWUsZmFsc2UpKQogCiBpZmRlZiBUQVJHRVRfQk9BUkRfQVVUTwogICAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsIEFORFJPSUQsIHRhcmdldF9ib2FyZF9hdXRvLCAkKFRBUkdFVF9CT0FSRF9BVVRPKSkKIGVuZGlmCiAKLSMgRW5zdXJlIHRoYXQgdGhvc2UgbWFpbmxpbmUgbW9kdWxlcyB3aG8gaGF2ZSBpbmRpdmlkdWFsbHkgdG9nZ2xlYWJsZSBwcmVidWlsdHMKLSMgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIE1PRFVMRV9CVUlMRF9GUk9NX1NPVVJDRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBieQotIyBkZWZhdWx0LgotSU5ESVZJRFVBTExZX1RPR0dMRUFCTEVfUFJFQlVJTFRfTU9EVUxFUyA6PSBcCi0gIGJ0c2VydmljZXMgXAotICBwZXJtaXNzaW9uIFwKLSAgcmtwZCBcCi0gIHV3YiBcCi0gIHdpZmkgXAotCi0kKGZvcmVhY2ggbSwgJChJTkRJVklEVUFMTFlfVE9HR0xFQUJMRV9QUkVCVUlMVF9NT0RVTEVTKSxcCi0gICQoaWYgJChjYWxsIHNvb25nX2NvbmZpZ19nZXQsJChtKV9tb2R1bGUsc291cmNlX2J1aWxkKSwsXAotICAgICQoY2FsbCBzb29uZ19jb25maWdfc2V0LCQobSlfbW9kdWxlLHNvdXJjZV9idWlsZCwkKE1PRFVMRV9CVUlMRF9GUk9NX1NPVVJDRSkpKSkKLQogIyBBcGV4IGJ1aWxkIG1vZGUgdmFyaWFibGVzCiBpZmRlZiBBUEVYX0JVSUxEX0ZPUl9QUkVfU19ERVZJQ0VTCiAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxsaWJyYXJ5X2xpbmtpbmdfc3RyYXRlZ3kscHJlZmVyX3N0YXRpYykKQEAgLTE0MiwyNyArOTcsNzEgQEAKIGVuZGlmCiBlbmRpZgogCi1pZmVxICh0cnVlLCQoTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFKSkKLSQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSxBTkRST0lELG1vZHVsZV9idWlsZF9mcm9tX3NvdXJjZSx0cnVlKQotZW5kaWYKLQotIyBNZXNzYWdpbmcgYXBwIHZhcnMKLWlmZXEgKGVuZywkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkKLSQoY2FsbCBzb29uZ19jb25maWdfc2V0LG1lc3NhZ2luZyxidWlsZF92YXJpYW50X2VuZyx0cnVlKQotZW5kaWYKLQogIyBFbmFibGUgU3lzdGVtVUkgb3B0aW1pemF0aW9ucyBieSBkZWZhdWx0IHVubGVzcyBleHBsaWNpdGx5IHNldC4KIFNZU1RFTVVJX09QVElNSVpFX0pBVkEgPz0gdHJ1ZQogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsU1lTVEVNVUlfT1BUSU1JWkVfSkFWQSkKIAotIyBEaXNhYmxlIENvbXBvc2UgaW4gU3lzdGVtVUkgYnkgZGVmYXVsdC4KLVNZU1RFTVVJX1VTRV9DT01QT1NFID89IGZhbHNlCi0kKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXIsQU5EUk9JRCxTWVNURU1VSV9VU0VfQ09NUE9TRSkKKyMgRmxhZyB0byB1c2UgYmFzZWxpbmUgcHJvZmlsZSBmb3IgU3lzdGVtVUkuCiskKGNhbGwgc29vbmdfY29uZmlnX3NldCxBTkRST0lELHJlbGVhc2Vfc3lzdGVtdWlfdXNlX3NwZWVkX3Byb2ZpbGUsJChSRUxFQVNFX1NZU1RFTVVJX1VTRV9TUEVFRF9QUk9GSUxFKSkKKworIyBGbGFnIGZvciBlbmFibGluZyBjb21wb3NlIGZvciBMYXVuY2hlci4KKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LEFORFJPSUQscmVsZWFzZV9lbmFibGVfY29tcG9zZV9pbl9sYXVuY2hlciwkKFJFTEVBU0VfRU5BQkxFX0NPTVBPU0VfSU5fTEFVTkNIRVIpKQogCiBpZmRlZiBQUk9EVUNUX0FWRl9FTkFCTEVECiAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxhdmZfZW5hYmxlZCwkKFBST0RVQ1RfQVZGX0VOQUJMRUQpKQogZW5kaWYKIAorIyBFbmFibGUgQVZGIHJlbW90ZSBhdHRlc3RhdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGZsYWcgdmFsdWUgaWYgUFJPRFVDVF9BVkZfUkVNT1RFX0FUVEVTVEFUSU9OX0RJU0FCTEVEIGlzIG5vdAorIyBzZXQgdG8gdHJ1ZSBleHBsaWNpdGx5LgoraWZuZXEgKHRydWUsJChQUk9EVUNUX0FWRl9SRU1PVEVfQVRURVNUQVRJT05fRElTQUJMRUQpKQorICAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxhdmZfcmVtb3RlX2F0dGVzdGF0aW9uX2VuYWJsZWQsJChSRUxFQVNFX0FWRl9FTkFCTEVfUkVNT1RFX0FUVEVTVEFUSU9OKSkKK2VuZGlmCisKK2lmZGVmIFBST0RVQ1RfQVZGX01JQ1JPRFJPSURfR1VFU1RfR0tJX1ZFUlNJT04KKyQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSxBTkRST0lELGF2Zl9taWNyb2Ryb2lkX2d1ZXN0X2draV92ZXJzaW9uLCQoUFJPRFVDVF9BVkZfTUlDUk9EUk9JRF9HVUVTVF9HS0lfVkVSU0lPTikpCitlbmRpZgorCitpZmRlZiBUQVJHRVRfQk9PVFNfMTZLCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLEFORFJPSUQsdGFyZ2V0X2Jvb3RzXzE2aywkKGZpbHRlciB0cnVlLCQoVEFSR0VUX0JPT1RTXzE2SykpKQorZW5kaWYKKworaWZkZWYgUFJPRFVDVF9NRU1DR19WMl9GT1JDRV9FTkFCTEVECiskKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxtZW1jZ192Ml9mb3JjZV9lbmFibGVkLCQoUFJPRFVDVF9NRU1DR19WMl9GT1JDRV9FTkFCTEVEKSkKK2VuZGlmCisKK2lmZGVmIFBST0RVQ1RfQ0dST1VQX1YyX1NZU19BUFBfSVNPTEFUSU9OX0VOQUJMRUQKKyQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSxBTkRST0lELGNncm91cF92Ml9zeXNfYXBwX2lzb2xhdGlvbiwkKFBST0RVQ1RfQ0dST1VQX1YyX1NZU19BUFBfSVNPTEFUSU9OX0VOQUJMRUQpKQorZWxzZQorJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQsY2dyb3VwX3YyX3N5c19hcHBfaXNvbGF0aW9uLHRydWUpCitlbmRpZgorCiskKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxyZWxlYXNlX2F2Zl9hbGxvd19wcmVpbnN0YWxsZWRfYXBwcywkKFJFTEVBU0VfQVZGX0FMTE9XX1BSRUlOU1RBTExFRF9BUFBTKSkKKyQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSxBTkRST0lELHJlbGVhc2VfYXZmX2VuYWJsZV9kZXZpY2VfYXNzaWdubWVudCwkKFJFTEVBU0VfQVZGX0VOQUJMRV9ERVZJQ0VfQVNTSUdOTUVOVCkpCiskKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxyZWxlYXNlX2F2Zl9lbmFibGVfZGljZV9jaGFuZ2VzLCQoUkVMRUFTRV9BVkZfRU5BQkxFX0RJQ0VfQ0hBTkdFUykpCiskKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxyZWxlYXNlX2F2Zl9lbmFibGVfZWFybHlfdm0sJChSRUxFQVNFX0FWRl9FTkFCTEVfRUFSTFlfVk0pKQorJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQscmVsZWFzZV9hdmZfZW5hYmxlX2xscHZtX2NoYW5nZXMsJChSRUxFQVNFX0FWRl9FTkFCTEVfTExQVk1fQ0hBTkdFUykpCiskKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxyZWxlYXNlX2F2Zl9lbmFibGVfbXVsdGlfdGVuYW50X21pY3JvZHJvaWRfdm0sJChSRUxFQVNFX0FWRl9FTkFCTEVfTVVMVElfVEVOQU5UX01JQ1JPRFJPSURfVk0pKQorJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQscmVsZWFzZV9hdmZfZW5hYmxlX25ldHdvcmssJChSRUxFQVNFX0FWRl9FTkFCTEVfTkVUV09SSykpCisjIFRPRE8oYi8zNDEyOTI2MDEpOiBUaGlzIGZsYWcgaXMgbmVlZGVkIHVudGlsIHRoZSBWIHJlbGVhc2UuIFdlIHdpdGggY2xlYW4gaXQgdXAgYWZ0ZXIgViB0b2dldGhlcgorIyB3aXRoIG1vc3Qgb2YgdGhlIHJlbGVhc2VfYXZmXyBmbGFncyBoZXJlLgorJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQscmVsZWFzZV9hdmZfZW5hYmxlX3JlbW90ZV9hdHRlc3RhdGlvbiwkKFJFTEVBU0VfQVZGX0VOQUJMRV9SRU1PVEVfQVRURVNUQVRJT04pKQorJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQscmVsZWFzZV9hdmZfZW5hYmxlX3ZlbmRvcl9tb2R1bGVzLCQoUkVMRUFTRV9BVkZfRU5BQkxFX1ZFTkRPUl9NT0RVTEVTKSkKKyQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSxBTkRST0lELHJlbGVhc2VfYXZmX2VuYWJsZV92aXJ0X2NwdWZyZXEsJChSRUxFQVNFX0FWRl9FTkFCTEVfVklSVF9DUFVGUkVRKSkKKyQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSxBTkRST0lELHJlbGVhc2VfYXZmX21pY3JvZHJvaWRfa2VybmVsX3ZlcnNpb24sJChSRUxFQVNFX0FWRl9NSUNST0RST0lEX0tFUk5FTF9WRVJTSU9OKSkKKyQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSxBTkRST0lELHJlbGVhc2VfYXZmX3N1cHBvcnRfY3VzdG9tX3ZtX3dpdGhfcGFyYXZpcnR1YWxpemVkX2RldmljZXMsJChSRUxFQVNFX0FWRl9TVVBQT1JUX0NVU1RPTV9WTV9XSVRIX1BBUkFWSVJUVUFMSVpFRF9ERVZJQ0VTKSkKKworJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQscmVsZWFzZV9iaW5kZXJfZGVhdGhfcmVjaXBpZW50X3dlYWtfZnJvbV9qbmksJChSRUxFQVNFX0JJTkRFUl9ERUFUSF9SRUNJUElFTlRfV0VBS19GUk9NX0pOSSkpCisKKyQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSxBTkRST0lELHJlbGVhc2VfbGlicG93ZXJfbm9fbG9ja19iaW5kZXJfdHhuLCQoUkVMRUFTRV9MSUJQT1dFUl9OT19MT0NLX0JJTkRFUl9UWE4pKQorCiskKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxyZWxlYXNlX3BhY2thZ2VfbGliYW5kcm9pZF9ydW50aW1lX3B1bmNoX2hvbGVzLCQoUkVMRUFTRV9QQUNLQUdFX0xJQkFORFJPSURfUlVOVElNRV9QVU5DSF9IT0xFUykpCisKKyQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSxBTkRST0lELHJlbGVhc2Vfc2VsaW51eF9kYXRhX2RhdGFfaWdub3JlLCQoUkVMRUFTRV9TRUxJTlVYX0RBVEFfREFUQV9JR05PUkUpKQoraWZuZXEgKCwkKGZpbHRlciBlbmcgdXNlcmRlYnVnLCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpKSkKKyAgICAjIHdyaXRlIGFwcGNvbXBhdCBzeXN0ZW0gcHJvcGVydGllcyBvbiB1c2VyZGVidWcgYW5kIGVuZyBidWlsZHMKKyAgICAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxyZWxlYXNlX3dyaXRlX2FwcGNvbXBhdF9vdmVycmlkZV9zeXN0ZW1fcHJvcGVydGllcyx0cnVlKQorZW5kaWYKKwogIyBFbmFibGUgc3lzdGVtX3NlcnZlciBvcHRpbWl6YXRpb25zIGJ5IGRlZmF1bHQgdW5sZXNzIGV4cGxpY2l0bHkgc2V0IG9yIGlmCiAjIHRoZXJlIG1heSBiZSBkZXBlbmRlbnQgcnVudGltZSBqYXJzLgogIyBUT0RPKGIvMjQwNTg4MjI2KTogUmVtb3ZlIHRoZSBvZmYtYnktZGVmYXVsdCBleGNlcHRpb25zIGFmdGVyIGhhbmRsaW5nCkBAIC0xNzgsNyArMTc3LDE2IEBACiBlbHNlCiAgIFNZU1RFTV9PUFRJTUlaRV9KQVZBID89IHRydWUKIGVuZGlmCisKK2lmZXEgKHRydWUsJChGVUxMX1NZU1RFTV9PUFRJTUlaRV9KQVZBKSkKKyAgU1lTVEVNX09QVElNSVpFX0pBVkEgOj0gdHJ1ZQorZW5kaWYKKwogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsU1lTVEVNX09QVElNSVpFX0pBVkEpCiskKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXIsQU5EUk9JRCxGVUxMX1NZU1RFTV9PUFRJTUlaRV9KQVZBKQorCisjIFRPRE8oYi8zMTk2OTc5NjgpOiBSZW1vdmUgdGhpcyBidWlsZCBmbGFnIHN1cHBvcnQgd2hlbiBtZXRhbGF2YSBmdWxseSBzdXBwb3J0cyBmbGFnZ2VkIGFwaQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsQU5EUk9JRCxyZWxlYXNlX2hpZGRlbl9hcGlfZXhwb3J0YWJsZV9zdHVicywkKFJFTEVBU0VfSElEREVOX0FQSV9FWFBPUlRBQkxFX1NUVUJTKSkKIAogIyBDaGVjayBmb3IgU3VwcGxlbWVudGFsQXBpIG1vZHVsZS4KIGlmZXEgKCQod2lsZGNhcmQgcGFja2FnZXMvbW9kdWxlcy9TdXBwbGVtZW50YWxBcGkpLCkKQEAgLTE4NywzICsxOTUsMTI3IEBACiAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxpbmNsdWRlX25vbnB1YmxpY19mcmFtZXdvcmtfYXBpLHRydWUpCiBlbmRpZgogCisjIEFkZCBjcmFzaHJlY292ZXJ5IGJ1aWxkIGZsYWcgdG8gc29vbmcKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LEFORFJPSUQscmVsZWFzZV9jcmFzaHJlY292ZXJ5X21vZHVsZSwkKFJFTEVBU0VfQ1JBU0hSRUNPVkVSWV9NT0RVTEUpKQorIyBBZGQgY3Jhc2hyZWNvdmVyeSBmaWxlIG1vdmUgZmxhZ3MgdG8gc29vbmcsIGZvciBib3RoIHBsYXRmb3JtIGFuZCBtb2R1bGUKK2lmZXEgKHRydWUsJChSRUxFQVNFX0NSQVNIUkVDT1ZFUllfRklMRV9NT1ZFKSkKKyAgJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsQU5EUk9JRCxjcmFzaHJlY292ZXJ5X2ZpbGVzX2luX21vZHVsZSx0cnVlKQorICAkKGNhbGwgc29vbmdfY29uZmlnX3NldCxBTkRST0lELGNyYXNocmVjb3ZlcnlfZmlsZXNfaW5fcGxhdGZvcm0sZmFsc2UpCitlbHNlCisgICQoY2FsbCBzb29uZ19jb25maWdfc2V0LEFORFJPSUQsY3Jhc2hyZWNvdmVyeV9maWxlc19pbl9tb2R1bGUsZmFsc2UpCisgICQoY2FsbCBzb29uZ19jb25maWdfc2V0LEFORFJPSUQsY3Jhc2hyZWNvdmVyeV9maWxlc19pbl9wbGF0Zm9ybSx0cnVlKQorZW5kaWYKKyMgUmVxdWlyZWQgYXMgcGxhdGZvcm1fYm9vdGNsYXNzcGF0aCBpcyB1c2luZyB0aGlzIG5hbWVzcGFjZQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsYm9vdGNsYXNzcGF0aCxyZWxlYXNlX2NyYXNocmVjb3ZlcnlfbW9kdWxlLCQoUkVMRUFTRV9DUkFTSFJFQ09WRVJZX01PRFVMRSkpCisKKworIyBBZGQgb25kZXZpY2VpbnRlbGxpZ2VuY2UgbW9kdWxlIGJ1aWxkIGZsYWcgdG8gc29vbmcKK2lmZXEgKHRydWUsJChSRUxFQVNFX09OREVWSUNFX0lOVEVMTElHRU5DRV9NT0RVTEUpKQorICAgICQoY2FsbCBzb29uZ19jb25maWdfc2V0LEFORFJPSUQscmVsZWFzZV9vbmRldmljZV9pbnRlbGxpZ2VuY2VfbW9kdWxlLHRydWUpCisgICAgIyBSZXF1aXJlZCBhcyBwbGF0Zm9ybV9ib290Y2xhc3NwYXRoIGlzIHVzaW5nIHRoaXMgbmFtZXNwYWNlCisgICAgJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsYm9vdGNsYXNzcGF0aCxyZWxlYXNlX29uZGV2aWNlX2ludGVsbGlnZW5jZV9tb2R1bGUsdHJ1ZSkKKworZWxzZQorICAgICQoY2FsbCBzb29uZ19jb25maWdfc2V0LEFORFJPSUQscmVsZWFzZV9vbmRldmljZV9pbnRlbGxpZ2VuY2VfcGxhdGZvcm0sdHJ1ZSkKKyAgICAkKGNhbGwgc29vbmdfY29uZmlnX3NldCxib290Y2xhc3NwYXRoLHJlbGVhc2Vfb25kZXZpY2VfaW50ZWxsaWdlbmNlX3BsYXRmb3JtLHRydWUpCisKK2VuZGlmCisKKyMgQWRkIHVwcm9iZXN0YXRzIGJ1aWxkIGZsYWcgdG8gc29vbmcKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LEFORFJPSUQscmVsZWFzZV91cHJvYmVzdGF0c19tb2R1bGUsJChSRUxFQVNFX1VQUk9CRVNUQVRTX01PRFVMRSkpCisjIEFkZCB1cHJvYmVzdGF0cyBmaWxlIG1vdmUgZmxhZ3MgdG8gc29vbmcsIGZvciBib3RoIHBsYXRmb3JtIGFuZCBtb2R1bGUKK2lmZXEgKHRydWUsJChSRUxFQVNFX1VQUk9CRVNUQVRTX0ZJTEVfTU9WRSkpCisgICQoY2FsbCBzb29uZ19jb25maWdfc2V0LEFORFJPSUQsdXByb2Jlc3RhdHNfZmlsZXNfaW5fbW9kdWxlLHRydWUpCisgICQoY2FsbCBzb29uZ19jb25maWdfc2V0LEFORFJPSUQsdXByb2Jlc3RhdHNfZmlsZXNfaW5fcGxhdGZvcm0sZmFsc2UpCitlbHNlCisgICQoY2FsbCBzb29uZ19jb25maWdfc2V0LEFORFJPSUQsdXByb2Jlc3RhdHNfZmlsZXNfaW5fbW9kdWxlLGZhbHNlKQorICAkKGNhbGwgc29vbmdfY29uZmlnX3NldCxBTkRST0lELHVwcm9iZXN0YXRzX2ZpbGVzX2luX3BsYXRmb3JtLHRydWUpCitlbmRpZgorCisjIEVuYWJsZSBQcm9maWxpbmcgbW9kdWxlLiBBbHNvIHVzZWQgYnkgcGxhdGZvcm1fYm9vdGNsYXNzcGF0aC4KKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LEFORFJPSUQscmVsZWFzZV9wYWNrYWdlX3Byb2ZpbGluZ19tb2R1bGUsJChSRUxFQVNFX1BBQ0tBR0VfUFJPRklMSU5HX01PRFVMRSkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldCxib290Y2xhc3NwYXRoLHJlbGVhc2VfcGFja2FnZV9wcm9maWxpbmdfbW9kdWxlLCQoUkVMRUFTRV9QQUNLQUdFX1BST0ZJTElOR19NT0RVTEUpKQorCisjIE1vdmUgVkNOIGZyb20gcGxhdGZvcm0gdG8gdGhlIFRldGhlcmluZyBtb2R1bGU7IHVzZWQgYnkgYm90aCBwbGF0Zm9ybSBhbmQgbW9kdWxlCiskKGNhbGwgc29vbmdfY29uZmlnX3NldCxBTkRST0lELGlzX3Zjbl9pbl9tYWlubGluZSwkKFJFTEVBU0VfTU9WRV9WQ05fVE9fTUFJTkxJTkUpKQorCisjIEFkZCBwZXJmLXNldHVwIGJ1aWxkIGZsYWcgdG8gc29vbmcKKyMgTm90ZTogQk9BUkRfUEVSRlNFVFVQX1NDUklQVCBsb2NhdGlvbiBtdXN0IGJlIHVuZGVyIHBsYXRmb3JtX3Rlc3Rpbmcvc2NyaXB0cy9wZXJmLXNldHVwLy4KK2lmZGVmIEJPQVJEX1BFUkZTRVRVUF9TQ1JJUFQKKyAgJChjYWxsIHNvb25nX2NvbmZpZ19zZXQscGVyZixib2FyZF9wZXJmc2V0dXBfc2NyaXB0LCQobm90ZGlyICQoQk9BUkRfUEVSRlNFVFVQX1NDUklQVCkpKQorZW5kaWYKKworIyBBZGQgdGFyZ2V0X3VzZV9wYW5fZGlzcGxheSBmbGFnIGZvciBoYXJkd2FyZS9saWJoYXJkd2FyZTpncmFsbG9jLmRlZmF1bHQKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsZ3JhbGxvYyx0YXJnZXRfdXNlX3Bhbl9kaXNwbGF5LCQoaWYgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9VU0VfUEFOX0RJU1BMQVkpKSx0cnVlLGZhbHNlKSkKKworIyBBZGQgdXNlX2NhbWVyYV92NGwyX2hhbCBmbGFnIGZvciBoYXJkd2FyZS9saWJoYXJkd2FyZS9tb2R1bGVzL2NhbWVyYS8zXzQ6Y2FtZXJhLnY0bDIKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsY2FtZXJhLHVzZV9jYW1lcmFfdjRsMl9oYWwsJChpZiAkKGZpbHRlciB0cnVlLCQoVVNFX0NBTUVSQV9WNEwyX0hBTCkpLHRydWUsZmFsc2UpKQorCisjIEFkZCBhdWRpb3NlcnZlcl9tdWx0aWxpYiBmbGFnIGZvciBoYXJkd2FyZS9pbnRlcmZhY2VzL3NvdW5kdHJpZ2dlci8yLjAvZGVmYXVsdDphbmRyb2lkLmhhcmR3YXJlLnNvdW5kdHJpZ2dlckAyLjAtaW1wbAoraWZuZXEgKCQoc3RyaXAgJChBVURJT1NFUlZFUl9NVUxUSUxJQikpLCkKKyAgJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsc291bmR0cmlnZ2VyLGF1ZGlvc2VydmVyX211bHRpbGliLCQoQVVESU9TRVJWRVJfTVVMVElMSUIpKQorZW5kaWYKKworIyBBZGQgc2ltX2NvdW50LCBkaXNhYmxlX3JpbGRfb2VtX2hvb2ssIGFuZCB1c2VfYW9zcF9yaWxkIGZsYWcgZm9yIHJpbCByZWxhdGVkIG1vZHVsZXMKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LHJpbCxzaW1fY291bnQsJChTSU1fQ09VTlQpKQoraWZuZXEgKCQoRElTQUJMRV9SSUxEX09FTV9IT09LKSwgZmFsc2UpCisgICQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wscmlsLGRpc2FibGVfcmlsZF9vZW1faG9vayx0cnVlKQorZW5kaWYKK2lmbmVxICgkKEVOQUJMRV9WRU5ET1JfUklMX1NFUlZJQ0UpLCB0cnVlKQorICAkKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLHJpbCx1c2VfYW9zcF9yaWxkLHRydWUpCitlbmRpZgorCisjIEV4cG9ydCB0YXJnZXRfYm9hcmRfcGxhdGZvcm0gdG8gc29vbmcgZm9yIGhhcmR3YXJlL2dvb2dsZS9ncmFwaGljcy9jb21tb24vbGlibWVtdHJhY2s6bWVtdHJhY2suJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pCiskKGNhbGwgc29vbmdfY29uZmlnX3NldCxBTkRST0lELHRhcmdldF9ib2FyZF9wbGF0Zm9ybSwkKFRBUkdFVF9CT0FSRF9QTEFURk9STSkpCisKKyMgRXhwb3J0IGJvYXJkX3VzZXNfc2NhbGVyX20ybTFzaG90IGFuZCBib2FyZF91c2VzX2FsaWduX3Jlc3RyaWN0aW9uIHRvIHNvb25nIGZvciBoYXJkd2FyZS9nb29nbGUvZ3JhcGhpY3MvY29tbW9uL2xpYnNjYWxlcjpsaWJleHlub3NzY2FsZXIKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsZ29vZ2xlX2dyYXBoaWNzLGJvYXJkX3VzZXNfc2NhbGVyX20ybTFzaG90LCQoaWYgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX1VTRVNfU0NBTEVSX00yTTFTSE9UKSksdHJ1ZSxmYWxzZSkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGdvb2dsZV9ncmFwaGljcyxib2FyZF91c2VzX2FsaWduX3Jlc3RyaWN0aW9uLCQoaWYgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX1VTRVNfQUxJR05fUkVTVFJJQ1RJT04pKSx0cnVlLGZhbHNlKSkKKworIyBFeHBvcnQgcmVsYXRlZCB2YXJpYWJsZXMgdG8gc29vbmcgZm9yIGhhcmR3YXJlL2dvb2dsZS9ncmFwaGljcy9jb21tb24vbGliYWNyeWw6bGliYWNyeWwKK2lmZGVmIEJPQVJEX0xJQkFDUllMX0RFRkFVTFRfQ09NUE9TSVRPUgorICAkKGNhbGwgc29vbmdfY29uZmlnX3NldCxhY3J5bCxsaWJhY3J5bF9kZWZhdWx0X2NvbXBvc2l0b3IsJChCT0FSRF9MSUJBQ1JZTF9ERUZBVUxUX0NPTVBPU0lUT1IpKQorZW5kaWYKK2lmZGVmIEJPQVJEX0xJQkFDUllMX0RFRkFVTFRfU0NBTEVSCisgICQoY2FsbCBzb29uZ19jb25maWdfc2V0LGFjcnlsLGxpYmFjcnlsX2RlZmF1bHRfc2NhbGVyLCQoQk9BUkRfTElCQUNSWUxfREVGQVVMVF9TQ0FMRVIpKQorZW5kaWYKK2lmZGVmIEJPQVJEX0xJQkFDUllMX0RFRkFVTFRfQkxURVIKKyAgJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsYWNyeWwsbGliYWNyeWxfZGVmYXVsdF9ibHRlciwkKEJPQVJEX0xJQkFDUllMX0RFRkFVTFRfQkxURVIpKQorZW5kaWYKK2lmZGVmIEJPQVJEX0xJQkFDUllMX0cyRF9IRFJfUExVR0lOCisgICNCT0FSRF9MSUJBQ1JZTF9HMkRfSERSX1BMVUdJTiBpcyBzZXQgaW4gZWFjaCBib2FyZCBjb25maWcKKyAgJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxhY3J5bCxsaWJhY3J5bF91c2VfZzJkX2hkcl9wbHVnaW4sdHJ1ZSkKK2VuZGlmCisKKyMgRXhwb3J0IHJlbGF0ZWQgdmFyaWFibGVzIHRvIHNvb25nIGZvciBoYXJkd2FyZS9nb29nbGUvZ3JhcGhpY3MvY29tbW9uL0JvYXJkQ29uZmlnQ0ZsYWdzLm1rCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGdvb2dsZV9ncmFwaGljcyxod2Nfbm9fc3VwcG9ydF9za2lwX3ZhbGlkYXRlLCQoaWYgJChmaWx0ZXIgdHJ1ZSwkKEhXQ19OT19TVVBQT1JUX1NLSVBfVkFMSURBVEUpKSx0cnVlLGZhbHNlKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsZ29vZ2xlX2dyYXBoaWNzLGh3Y19zdXBwb3J0X2NvbG9yX3RyYW5zZm9ybSwkKGlmICQoZmlsdGVyIHRydWUsJChIV0NfU1VQUE9SVF9DT0xPUl9UUkFOU0ZPUk0pKSx0cnVlLGZhbHNlKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsZ29vZ2xlX2dyYXBoaWNzLGh3Y19zdXBwb3J0X3JlbmRlcl9pbnRlbnQsJChpZiAkKGZpbHRlciB0cnVlLCQoSFdDX1NVUFBPUlRfUkVOREVSX0lOVEVOVCkpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxnb29nbGVfZ3JhcGhpY3MsYm9hcmRfdXNlc192aXJ0dWFsX2Rpc3BsYXksJChpZiAkKGZpbHRlciB0cnVlLCQoQk9BUkRfVVNFU19WSVJUVUFMX0RJU1BMQVkpKSx0cnVlLGZhbHNlKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsZ29vZ2xlX2dyYXBoaWNzLGJvYXJkX3VzZXNfZHQsJChpZiAkKGZpbHRlciB0cnVlLCQoQk9BUkRfVVNFU19EVCkpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxnb29nbGVfZ3JhcGhpY3MsYm9hcmRfdXNlc19kZWNvbl82NGJpdF9hZGRyZXNzLCQoaWYgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX1VTRVNfREVDT05fNjRCSVRfQUREUkVTUykpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxnb29nbGVfZ3JhcGhpY3MsYm9hcmRfdXNlc19oZHJ1aV9nbGVzX2NvbnZlcnNpb24sJChpZiAkKGZpbHRlciB0cnVlLCQoQk9BUkRfVVNFU19IRFJVSV9HTEVTX0NPTlZFUlNJT04pKSx0cnVlLGZhbHNlKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsZ29vZ2xlX2dyYXBoaWNzLHVzZXNfaWRpc3BsYXlfaW50Zl9zZWMsJChpZiAkKGZpbHRlciB0cnVlLCQoVVNFU19JRElTUExBWV9JTlRGX1NFQykpLHRydWUsZmFsc2UpKQorCisjIFZhcmlhYmxlcyBmb3IgZnNfY29uZmlnCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGZzX2NvbmZpZyx2ZW5kb3IsJChpZiAkKEJPQVJEX1VTRVNfVkVORE9SSU1BR0UpJChCT0FSRF9WRU5ET1JJTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSx0cnVlLGZhbHNlKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsZnNfY29uZmlnLG9lbSwkKGlmICQoQk9BUkRfVVNFU19PRU1JTUFHRSkkKEJPQVJEX09FTUlNQUdFX0ZJTEVfU1lTVEVNX1RZUEUpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxmc19jb25maWcsb2RtLCQoaWYgJChCT0FSRF9VU0VTX09ETUlNQUdFKSQoQk9BUkRfT0RNSU1BR0VfRklMRV9TWVNURU1fVFlQRSksdHJ1ZSxmYWxzZSkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGZzX2NvbmZpZyx2ZW5kb3JfZGxrbSwkKGlmICQoQk9BUkRfVVNFU19WRU5ET1JfRExLTUlNQUdFKSQoQk9BUkRfVkVORE9SX0RMS01JTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSx0cnVlLGZhbHNlKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsZnNfY29uZmlnLG9kbV9kbGttLCQoaWYgJChCT0FSRF9VU0VTX09ETV9ETEtNSU1BR0UpJChCT0FSRF9PRE1fRExLTUlNQUdFX0ZJTEVfU1lTVEVNX1RZUEUpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxmc19jb25maWcsc3lzdGVtX2Rsa20sJChpZiAkKEJPQVJEX1VTRVNfU1lTVEVNX0RMS01JTUFHRSkkKEJPQVJEX1NZU1RFTV9ETEtNSU1BR0VfRklMRV9TWVNURU1fVFlQRSksdHJ1ZSxmYWxzZSkpCisKKyMgVmFyaWFibGVzIGZvciB0ZWxlcGhvbnkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsdGVsZXBob255LHNlY19jcF9zZWN1cmVfYm9vdCwkKGlmICQoZmlsdGVyIHRydWUsJChTRUNfQ1BfU0VDVVJFX0JPT1QpKSx0cnVlLGZhbHNlKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsdGVsZXBob255LGNiZF9wcm90b2NvbF9zaXQsJChpZiAkKGZpbHRlciB0cnVlLCQoQ0JEX1BST1RPQ09MX1NJVCkpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCx0ZWxlcGhvbnksdXNlX3JhZGlvZXh0ZXJuYWxfaGFsX2FpZGwsJChpZiAkKGZpbHRlciB0cnVlLCQoVVNFX1JBRElPRVhURVJOQUxfSEFMX0FJREwpKSx0cnVlLGZhbHNlKSkKKworIyBWYXJpYWJsZXMgZm9yIGh3Y29tcG9zZXIuJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGdvb2dsZV9ncmFwaGljcyxib2FyZF91c2VzX2h3Y19zZXJ2aWNlcywkKGlmICQoZmlsdGVyIHRydWUsJChCT0FSRF9VU0VTX0hXQ19TRVJWSUNFUykpLHRydWUsZmFsc2UpKQorCisjIFZhcmlhYmxlcyBmb3IgY29udHJvbGxpbmcgYW5kcm9pZC5oYXJkd2FyZS5jb21wb3Nlci5od2MzLXNlcnZpY2UucGl4ZWwKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LGdvb2dsZV9ncmFwaGljcyxib2FyZF9od2NfdmVyc2lvbiwkKEJPQVJEX0hXQ19WRVJTSU9OKSkKKworIyBWYXJpYWJsZXMgZm9yIGV4dHJhIGJyYW5jaGVzCisjIFRPRE8oYi8zODMyMzgzOTcpOiBVc2UgYm9vdHN0cmFwX2dvX3BhY2thZ2UgdG8gZW5hYmxlIGV4dHJhIGZsYWdzLgorLWluY2x1ZGUgdmVuZG9yL2dvb2dsZS9idWlsZC9leHRyYV9zb29uZ19jb25maWdfdmFycy5tawpkaWZmIC0tZ2l0IGEvY29yZS9hcHBfcHJlYnVpbHRfaW50ZXJuYWwubWsgYi9jb3JlL2FwcF9wcmVidWlsdF9pbnRlcm5hbC5tawppbmRleCA5ZmFiNDRkLi4yNjcxOTU2IDEwMDY0NAotLS0gYS9jb3JlL2FwcF9wcmVidWlsdF9pbnRlcm5hbC5taworKysgYi9jb3JlL2FwcF9wcmVidWlsdF9pbnRlcm5hbC5tawpAQCAtODUsMTEgKzg1LDYgQEAKIG15X3ByZWJ1aWx0X3NyY19maWxlIDo9ICQobXlfZXh0cmFjdGVkX2FwaykKIG15X2V4dHJhY3RlZF9hcGsgOj0KIG15X2V4dHJhY3RfYXBrIDo9Ci1pZmVxICgkKFBST0RVQ1RfQUxXQVlTX1BSRU9QVF9FWFRSQUNURURfQVBLKSx0cnVlKQotIyBJZiB0aGUgcHJvZHVjdCBwcm9wZXJ0eSBpcyBzZXQsIGFsd2F5cyBwcmVvcHQgZm9yIGV4dHJhY3RlZCBtb2R1bGVzIHRvIHByZXZlbnQgZXhlY3V0aW5nIG91dCBvZgotIyB0aGUgQVBLLgotbXlfcHJlb3B0X2Zvcl9leHRyYWN0ZWRfYXBrIDo9IHRydWUKLWVuZGlmCiBlbmRpZgogCiByc19jb21wYXRpYmlsaXR5X2puaV9saWJzIDo9CkBAIC0yMjcsNyArMjIyLDcgQEAKICQoYnVpbHRfbW9kdWxlKTogUFJJVkFURV9FTUJFRERFRF9KTklfTElCUyA6PSAkKGVtYmVkZGVkX3ByZWJ1aWx0X2puaV9saWJzKQogCiBpZmRlZiBMT0NBTF9DT01QUkVTU0VEX01PRFVMRQotJChidWlsdF9tb2R1bGUpIDogJChNSU5JR1pJUCkKKyQoYnVpbHRfbW9kdWxlKSA6ICQoR1pJUCkKIGVuZGlmCiAKIGlmZXEgKCQobW9kdWxlX3J1bl9hcHBjb21wYXQpLHRydWUpCkBAIC0zMDUsNCArMzAwLDQgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBTQk9NIGdlbmVyYXRpb24KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1pbmNsdWRlICQoQlVJTERfU0JPTV9HRU4pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQoraW5jbHVkZSAkKEJVSUxEX1NCT01fR0VOKQpkaWZmIC0tZ2l0IGEvY29yZS9hcnRfY29uZmlnLm1rIGIvY29yZS9hcnRfY29uZmlnLm1rCmluZGV4IDFlYTA1ZGIuLjllODdhN2IgMTAwNjQ0Ci0tLSBhL2NvcmUvYXJ0X2NvbmZpZy5taworKysgYi9jb3JlL2FydF9jb25maWcubWsKQEAgLTEyLDM1ICsxMiwyNiBAQAogIyBFTkFCTEVfVUZGRF9HQzogV2hldGhlciB0byB1c2UgdXNlcmZhdWx0ZmQgR0MuCiAKIGNvbmZpZ19lbmFibGVfdWZmZF9nYyA6PSBcCi0gICQoZmlyc3R3b3JkICQoT1ZFUlJJREVfRU5BQkxFX1VGRkRfR0MpICQoUFJPRFVDVF9FTkFCTEVfVUZGRF9HQykpCisgICQoZmlyc3R3b3JkICQoT1ZFUlJJREVfRU5BQkxFX1VGRkRfR0MpICQoUFJPRFVDVF9FTkFCTEVfVUZGRF9HQykgZGVmYXVsdCkKIAotaWZlcSAoLCQoZmlsdGVyLW91dCBkZWZhdWx0LCQoY29uZmlnX2VuYWJsZV91ZmZkX2djKSkpCi0gIEVOQUJMRV9VRkZEX0dDIDo9IHRydWUKLQotICAjIERpc2FibGUgdXNlcmZhdWx0ZmQgR0MgaWYgdGhlIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgaXQgKGkuZS4sIGlmCi0gICMgYG1pbihyby5ib2FyZC5hcGlfbGV2ZWwgPz8gcm8uYm9hcmQuZmlyc3RfYXBpX2xldmVsID8/IE1BWF9WQUxVRSwKLSAgIyAgICAgIHJvLnByb2R1Y3QuZmlyc3RfYXBpX2xldmVsID8/IHJvLmJ1aWxkLnZlcnNpb24uc2RrID8/IE1BWF9WQUxVRSkgPCAzMWApCi0gICMgVGhpcyBsb2dpYyBhbGlnbnMgd2l0aCBob3cgYHJvLnZlbmRvci5hcGlfbGV2ZWxgIGlzIGNhbGN1bGF0ZWQgaW4KLSAgIyBgc3lzdGVtL2NvcmUvaW5pdC9wcm9wZXJ0eV9zZXJ2aWNlLmNwcGAuCi0gICMgV2Ugb21pdCB0aGUgY2hlY2sgb24gYHJvLmJ1aWxkLnZlcnNpb24uc2RrYCBoZXJlIGJlY2F1c2Ugd2UgYXJlIG9uIHRoZSBsYXRlc3QgYnVpbGQgc3lzdGVtLgotICBib2FyZF9hcGlfbGV2ZWwgOj0gJChmaXJzdHdvcmQgJChCT0FSRF9BUElfTEVWRUwpICQoQk9BUkRfU0hJUFBJTkdfQVBJX0xFVkVMKSkKLSAgaWZuZXEgKCwkKGJvYXJkX2FwaV9sZXZlbCkpCi0gICAgaWZlcSAodHJ1ZSwkKGNhbGwgbWF0aF9sdCwkKGJvYXJkX2FwaV9sZXZlbCksMzEpKQotICAgICAgRU5BQkxFX1VGRkRfR0MgOj0gZmFsc2UKLSAgICBlbmRpZgotICBlbmRpZgotCi0gIGlmbmVxICgsJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCkpCi0gICAgaWZlcSAodHJ1ZSwkKGNhbGwgbWF0aF9sdCwkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSwzMSkpCi0gICAgICBFTkFCTEVfVUZGRF9HQyA6PSBmYWxzZQotICAgIGVuZGlmCi0gIGVuZGlmCi1lbHNlIGlmZXEgKHRydWUsJChjb25maWdfZW5hYmxlX3VmZmRfZ2MpKQotICBFTkFCTEVfVUZGRF9HQyA6PSB0cnVlCi1lbHNlIGlmZXEgKGZhbHNlLCQoY29uZmlnX2VuYWJsZV91ZmZkX2djKSkKLSAgRU5BQkxFX1VGRkRfR0MgOj0gZmFsc2UKLWVsc2UKK2lmZXEgKCwkKGZpbHRlciBkZWZhdWx0IHRydWUgZmFsc2UsJChjb25maWdfZW5hYmxlX3VmZmRfZ2MpKSkKICAgJChlcnJvciBVbmtub3duIFBST0RVQ1RfRU5BQkxFX1VGRkRfR0MgdmFsdWU6ICQoY29uZmlnX2VuYWJsZV91ZmZkX2djKSkKIGVuZGlmCiAKLUFERElUSU9OQUxfUFJPRFVDVF9QUk9QRVJUSUVTICs9IHJvLmRhbHZpay52bS5lbmFibGVfdWZmZF9nYz0kKEVOQUJMRV9VRkZEX0dDKQorRU5BQkxFX1VGRkRfR0MgOj0gJChjb25maWdfZW5hYmxlX3VmZmRfZ2MpCisKKyMgQ3JlYXRlIEFQRVhfQk9PVF9KQVJTX0VYQ0xVREVEIHdoaWNoIGlzIGEgbGlzdCBvZiBqYXJzIHRvIGJlIHJlbW92ZWQgZnJvbQorIyBBcGV4Qm9vckphcnMgd2hlbiBidWlsdCBmcm9tIG1haW5saW5lIHByZWJ1aWx0cy4KKyMgTm90ZSB0aGF0IFJFTEVBU0VfQVBFWF9CT09UX0pBUlNfUFJFQlVJTFRfRVhDTFVERURfTElTVCBpcyB0aGUgbGlzdCBvZiBtb2R1bGUgbmFtZXMKKyMgYW5kIGxpYnJhcnkgbmFtZXMgb2YgamFycyB0aGF0IG5lZWQgdG8gYmUgcmVtb3ZlZC4gV2UgaGF2ZSB0byBrZWVwIHNlcGFyYXRlZCBsaXN0IHBlcgorIyByZWxlYXNlIGNvbmZpZyBkdWUgdG8gcG9zc2liaWxpdHkgb2YgZGlmZmVyZW50IHByZWJ1aWx0IGNvbnRlbnQuCisjCisjIElmIGEgZGV2aWNlIGhhcyBvcHRlZCB0byBub3QgdXNlIGdvb2dsZSBwcmVidWlsdHMgKGRldGVybWluZWQgdXNpbmcKKyMgUFJPRFVDVF9CVUlMRF9JR05PUkVfQVBFWF9DT05UUklCVVRJT05fQ09OVEVOVFMpLCB0aGVuIG5vIGphcnMgbmVlZCB0byBiZSByZW1vdmVkLgorIyBFeGFtcGxlIG9mIHByb2R1Y3RzIHdoZXJlIFBST0RVQ1RfQlVJTERfSUdOT1JFX0FQRVhfQ09OVFJJQlVUSU9OX0NPTlRFTlRTIGlzIHRydWUgYXJlCisjIDEuIGFvc3AgZGV2aWNlcyAodGhleSBkbyBub3QgdXNlIGdvb2dsZSBhcGV4ZXMpCisjIDIuIGh3YXNhbiBkZXZpY2VzIChhcGV4IHByZWJ1aWx0cyBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCB0aGVzZSBkZXZpY2VzKQorIyAzLiBjb3ZlcmFnZSBidWlsZHMKK2lmbmVxICh0cnVlLCAkKFBST0RVQ1RfQlVJTERfSUdOT1JFX0FQRVhfQ09OVFJJQlVUSU9OX0NPTlRFTlRTKSkKKyAgQVBFWF9CT09UX0pBUlNfRVhDTFVERUQgKz0gJChSRUxFQVNFX0FQRVhfQk9PVF9KQVJTX1BSRUJVSUxUX0VYQ0xVREVEX0xJU1QpCitlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9hcnRpZmFjdF9wYXRoX3JlcXVpcmVtZW50cy5tayBiL2NvcmUvYXJ0aWZhY3RfcGF0aF9yZXF1aXJlbWVudHMubWsKaW5kZXggNTY2YjlmNy4uYzk0OWNjNCAxMDA2NDQKLS0tIGEvY29yZS9hcnRpZmFjdF9wYXRoX3JlcXVpcmVtZW50cy5taworKysgYi9jb3JlL2FydGlmYWN0X3BhdGhfcmVxdWlyZW1lbnRzLm1rCkBAIC00LDYgKzQsNyBAQAogIyBGYWtlcyBkb24ndCBnZXQgaW5zdGFsbGVkLCBhbmQgTkRLIHN0dWJzIGFyZW4ndCBpbnN0YWxsZWQgdG8gZGV2aWNlLgogc3RhdGljX2FsbG93ZWRfcGF0dGVybnMgOj0gJChUQVJHRVRfT1VUX0ZBS0UpLyUgJChTT09OR19PVVRfRElSKS9uZGsvJQogIyBSUk9zIGJlY29tZSBSRVFVSVJFRCBieSB0aGUgc291cmNlIG1vZHVsZSwgYnV0IGFyZSBhbHdheXMgcGxhY2VkIG9uIHRoZSB2ZW5kb3IgcGFydGl0aW9uLgorc3RhdGljX2FsbG93ZWRfcGF0dGVybnMgKz0gJV9fYXV0b19nZW5lcmF0ZWRfY2hhcmFjdGVyaXN0aWNzX3Jyby5hcGsKIHN0YXRpY19hbGxvd2VkX3BhdHRlcm5zICs9ICVfX2F1dG9fZ2VuZXJhdGVkX3Jyb19wcm9kdWN0LmFwawogc3RhdGljX2FsbG93ZWRfcGF0dGVybnMgKz0gJV9fYXV0b19nZW5lcmF0ZWRfcnJvX3ZlbmRvci5hcGsKICMgQXV0by1pbmNsdWRlZCB0YXJnZXRzIGFyZSBub3QgY29uc2lkZXJlZApkaWZmIC0tZ2l0IGEvY29yZS9hdXRvZ2VuX3Rlc3RfY29uZmlnLm1rIGIvY29yZS9hdXRvZ2VuX3Rlc3RfY29uZmlnLm1rCmluZGV4IDEzN2IxMTguLmI2OWY2OTQgMTAwNjQ0Ci0tLSBhL2NvcmUvYXV0b2dlbl90ZXN0X2NvbmZpZy5taworKysgYi9jb3JlL2F1dG9nZW5fdGVzdF9jb25maWcubWsKQEAgLTI5LDcgKzI5LDcgQEAKICAgaWZlcSAodHJ1ZSwkKExPQ0FMX1ZFTkRPUl9NT0RVTEUpKQogICAgIGF1dG9nZW5fdGVzdF9pbnN0YWxsX2Jhc2UgPSAvZGF0YS9sb2NhbC90ZXN0cy92ZW5kb3IKICAgZW5kaWYKLSAgaWZlcSAodHJ1ZSwkKExPQ0FMX1VTRV9WTkRLKSkKKyAgaWZlcSAodHJ1ZSwkKGNhbGwgbW9kdWxlLWluLXZlbmRvci1vci1wcm9kdWN0KSkKICAgICBhdXRvZ2VuX3Rlc3RfaW5zdGFsbF9iYXNlID0gL2RhdGEvbG9jYWwvdGVzdHMvdmVuZG9yCiAgIGVuZGlmCiBlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9iYXNlX3J1bGVzLm1rIGIvY29yZS9iYXNlX3J1bGVzLm1rCmluZGV4IDg5MzA5MWEuLjUzNjNlMGYgMTAwNjQ0Ci0tLSBhL2NvcmUvYmFzZV9ydWxlcy5taworKysgYi9jb3JlL2Jhc2VfcnVsZXMubWsKQEAgLTEyMCwxMyArMTIwLDE2IEBACiAgICAkKExPQ0FMX1ZFTkRPUl9NT0RVTEUpIFwKICAgICQoTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFKSkKIAotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvbG9jYWxfdm5kay5tawotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvbG9jYWxfc3lzdGVtc2RrLm1rCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9sb2NhbF92ZW5kb3JfcHJvZHVjdC5taworCisjIGxvY2FsX2N1cnJlbnRfc2RrIG5lZWRzIHRvIHJ1biBiZWZvcmUgbG9jYWxfc3lzdGVtc2RrIGJlY2F1c2UgdGhlIGZvcm1lciBtYXkgb3ZlcnJpZGUKKyMgTE9DQUxfU0RLX1ZFUlNJT04gd2hpY2ggaXMgdXNlZCBieSB0aGUgbGF0dGVyLgogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvbG9jYWxfY3VycmVudF9zZGsubWsKIAotbXlfbW9kdWxlX3RhZ3MgOj0gJChMT0NBTF9NT0RVTEVfVEFHUykKLWlmZXEgKCQobXlfaG9zdF9jcm9zcyksdHJ1ZSkKLSAgbXlfbW9kdWxlX3RhZ3MgOj0KKyMgQ2hlY2sgaWYgdGhlIHVzZSBvZiBTeXN0ZW0gU0RLIGlzIGNvcnJlY3QuIE5vdGUgdGhhdCwgZm9yIFNvb25nIG1vZHVsZXMsIHRoZSBzeXN0ZW0gc2RrIHZlcnNpb24KKyMgY2hlY2sgaXMgZG9uZSBpbiBTb29uZy4gTm8gbmVlZCB0byBkbyBpdCB0d2ljZS4KK2lmbmVxICgkKExPQ0FMX01PRFVMRV9NQUtFRklMRSksJChTT09OR19BTkRST0lEX01LKSkKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL2xvY2FsX3N5c3RlbXNkay5tawogZW5kaWYKIAogIyBOaW5qYSBoYXMgYW4gaW1wbGljaXQgZGVwZW5kZW5jeSBvbiB0aGUgY29tbWFuZCBiZWluZyBydW4sIGFuZCBrYXRpIHdpbGwKQEAgLTE0OCw1OCArMTUxLDEzIEBACiAjIyBWYWxpZGF0ZSBhbmQgZGVmaW5lIGZhbGxiYWNrcyBmb3IgaW5wdXQgTE9DQUxfKiB2YXJpYWJsZXMuCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi0jIyBEdW1wIGEgLmNzdiBmaWxlIG9mIGFsbCBtb2R1bGVzIGFuZCB0aGVpciB0YWdzCi0jaWZuZXEgKCQodGFnLWxpc3QtZmlyc3QtdGltZSksZmFsc2UpCi0jJChzaGVsbCBybSAtZiB0YWctbGlzdC5jc3YpCi0jdGFnLWxpc3QtZmlyc3QtdGltZSA6PSBmYWxzZQotI2VuZGlmCi0jJChzaGVsbCBlY2hvICQobGFzdHdvcmQgJChmaWx0ZXItb3V0IGNvbmZpZy8lIG91dC8lLCQoTUFLRUZJTEVfTElTVCkpKSwkKExPQ0FMX01PRFVMRSksJChzdHJpcCAkKExPQ0FMX01PRFVMRV9DTEFTUykpLCQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJChzb3J0ICQobXlfbW9kdWxlX3RhZ3MpKSkgPj4gdGFnLWxpc3QuY3N2KQotCiBMT0NBTF9VTklOU1RBTExBQkxFX01PRFVMRSA6PSAkKHN0cmlwICQoTE9DQUxfVU5JTlNUQUxMQUJMRV9NT0RVTEUpKQotbXlfbW9kdWxlX3RhZ3MgOj0gJChzb3J0ICQobXlfbW9kdWxlX3RhZ3MpKQotaWZlcSAoLCQobXlfbW9kdWxlX3RhZ3MpKQotICBteV9tb2R1bGVfdGFncyA6PSBvcHRpb25hbAotZW5kaWYKLQotIyBVc2VyIHRhZ3MgYXJlIG5vdCBhbGxvd2VkIGFueW1vcmUuICBGYWlsIGVhcmx5IGJlY2F1c2UgaXQgd2lsbCBub3QgYmUgaW5zdGFsbGVkCi0jIGxpa2UgaXQgdXNlZCB0byBiZS4KLWlmbmVxICgkKGZpbHRlciAkKG15X21vZHVsZV90YWdzKSx1c2VyKSwpCi0gICQod2FybmluZyAqKiogTW9kdWxlIG5hbWU6ICQoTE9DQUxfTU9EVUxFKSkKLSAgJCh3YXJuaW5nICoqKiBNYWtlZmlsZSBsb2NhdGlvbjogJChMT0NBTF9NT0RVTEVfTUFLRUZJTEUpKQotICAkKHdhcm5pbmcgKiApCi0gICQod2FybmluZyAqIE1vZHVsZSBpcyBhdHRlbXB0aW5nIHRvIHVzZSB0aGUgJ3VzZXInIHRhZy4gIFRoaXMpCi0gICQod2FybmluZyAqIHVzZWQgdG8gY2F1c2UgdGhlIG1vZHVsZSB0byBiZSBpbnN0YWxsZWQgYXV0b21hdGljYWxseS4pCi0gICQod2FybmluZyAqIE5vdywgdGhlIG1vZHVsZSBtdXN0IGJlIGxpc3RlZCBpbiB0aGUgUFJPRFVDVF9QQUNLQUdFUykKLSAgJCh3YXJuaW5nICogc2VjdGlvbiBvZiBhIHByb2R1Y3QgbWFrZWZpbGUgdG8gaGF2ZSBpdCBpbnN0YWxsZWQuKQotICAkKHdhcm5pbmcgKiApCi0gICQoZXJyb3IgdXNlciB0YWcgZGV0ZWN0ZWQgb24gbW9kdWxlLikKLWVuZGlmCi0KLW15X2JhZF9tb2R1bGVfdGFncyA6PSAkKGZpbHRlciBlbmcgZGVidWcsJChteV9tb2R1bGVfdGFncykpCi1pZmRlZiBteV9iYWRfbW9kdWxlX3RhZ3MKLSAgaWZlcSAodHJ1ZSwkKExPQ0FMX1VOSU5TVEFMTEFCTEVfTU9EVUxFKSkKLSAgICAkKGNhbGwgcHJldHR5LXdhcm5pbmcsTE9DQUxfTU9EVUxFX1RBR1MgOj0gJChteV9iYWRfbW9kdWxlX3RhZ3MpIGRvZXMgbm90IGRvIGFueXRoaW5nIGZvciB1bmluc3RhbGxhYmxlIG1vZHVsZXMpCi0gIGVuZGlmCi0gICQoY2FsbCBwcmV0dHktZXJyb3IsTE9DQUxfTU9EVUxFX1RBR1MgOj0gJChteV9iYWRfbW9kdWxlX3RhZ3MpIGlzIG9ic29sZXRlLiBTZWUgJChDSEFOR0VTX1VSTCkjTE9DQUxfTU9EVUxFX1RBR1MpCi1lbmRpZgogCiAjIE9ubHkgdGhlIHRhZ3MgbWVudGlvbmVkIGluIHRoaXMgdGVzdCBhcmUgZXhwZWN0ZWQgdG8gYmUgc2V0IGJ5IG1vZHVsZQogIyBtYWtlZmlsZXMuIEFueXRoaW5nIGVsc2UgaXMgZWl0aGVyIGEgdHlwbyBvciBhIHNvdXJjZSBvZiB1bmV4cGVjdGVkCiAjIGJlaGF2aW9ycy4KLWlmbmVxICgkKGZpbHRlci1vdXQgdGVzdHMgb3B0aW9uYWwgc2FtcGxlcywkKG15X21vZHVsZV90YWdzKSksKQotJChjYWxsIHByZXR0eS1lcnJvcix1bnVzdWFsIHRhZ3M6ICQoZmlsdGVyLW91dCB0ZXN0cyBvcHRpb25hbCBzYW1wbGVzLCQobXlfbW9kdWxlX3RhZ3MpKSkKLWVuZGlmCi0KLSMgQWRkIGltcGxpY2l0IHRhZ3MuCi0jCi0jIElmIHRoZSBsb2NhbCBkaXJlY3Rvcnkgb3Igb25lIG9mIGl0cyBwYXJlbnRzIGNvbnRhaW5zIGEgTU9EVUxFX0xJQ0VOU0VfR1BMCi0jIGZpbGUsIHRhZyB0aGUgbW9kdWxlIGFzICJnbnUiLiAgU2VhcmNoIGZvciAiKl9HUEwqIiwgIipfTEdQTCoiIGFuZCAiKl9NUEwqIgotIyBzbyB0aGF0IHdlIGNhbiBhbHNvIGZpbmQgZmlsZXMgbGlrZSBNT0RVTEVfTElDRU5TRV9HUExfQU5EX0FGTAotIwotZ3BsX2xpY2Vuc2VfZmlsZSA6PSAkKGNhbGwgZmluZC1wYXJlbnQtZmlsZSwkKExPQ0FMX1BBVEgpLE1PRFVMRV9MSUNFTlNFKl9HUEwqIE1PRFVMRV9MSUNFTlNFKl9NUEwqIE1PRFVMRV9MSUNFTlNFKl9MR1BMKikKLWlmbmVxICgkKGdwbF9saWNlbnNlX2ZpbGUpLCkKLSAgbXlfbW9kdWxlX3RhZ3MgKz0gZ251Ci0gIEFMTF9HUExfTU9EVUxFX0xJQ0VOU0VfRklMRVMgKz0gJChncGxfbGljZW5zZV9maWxlKQoraWZuZXEgKCQoZmlsdGVyLW91dCB0ZXN0cyBvcHRpb25hbCBzYW1wbGVzLCQoTE9DQUxfTU9EVUxFX1RBR1MpKSwpCiskKGNhbGwgcHJldHR5LWVycm9yLHVudXN1YWwgdGFnczogJChmaWx0ZXItb3V0IHRlc3RzIG9wdGlvbmFsIHNhbXBsZXMsJChMT0NBTF9NT0RVTEVfVEFHUykpKQogZW5kaWYKIAogTE9DQUxfTU9EVUxFX0NMQVNTIDo9ICQoc3RyaXAgJChMT0NBTF9NT0RVTEVfQ0xBU1MpKQpAQCAtMjUyLDcgKzIxMCw3IEBACiBlbHNlCiAgICMgVGhlIGRlZmluaXRpb24gb2Ygc2hvdWxkLWluc3RhbGwtdG8tc3lzdGVtIHdpbGwgYmUgZGlmZmVyZW50IGRlcGVuZGluZwogICAjIG9uIHdoaWNoIGdvYWwgKGUuZy4sIHNkayBvciBqdXN0IGRyb2lkKSBpcyBiZWluZyBidWlsdC4KLSAgcGFydGl0aW9uX3RhZyA6PSAkKGlmICQoY2FsbCBzaG91bGQtaW5zdGFsbC10by1zeXN0ZW0sJChteV9tb2R1bGVfdGFncykpLCxfREFUQSkKKyAgcGFydGl0aW9uX3RhZyA6PSAkKGlmICQoY2FsbCBzaG91bGQtaW5zdGFsbC10by1zeXN0ZW0sJChMT0NBTF9NT0RVTEVfVEFHUykpLCxfREFUQSkKICAgYWN0dWFsX3BhcnRpdGlvbl90YWcgOj0gJChpZiAkKHBhcnRpdGlvbl90YWcpLGRhdGEsc3lzdGVtKQogZW5kaWYKIGVuZGlmCkBAIC0yNjQsNyArMjIyLDcgQEAKICAgICBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IG51bGwtc3VpdGUKICAgZW5kaWYKICAgaWZuZXEgKCQoZmlsdGVyIEFQUFMsICQoTE9DQUxfTU9EVUxFX0NMQVNTKSksKQotICAgIGlmbmVxICgkKGZpbHRlciAkKG15X21vZHVsZV90YWdzKSx0ZXN0cyksKQorICAgIGlmbmVxICgkKGZpbHRlciAkKExPQ0FMX01PRFVMRV9UQUdTKSx0ZXN0cyksKQogICAgICAgTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBudWxsLXN1aXRlCiAgICAgZW5kaWYKICAgZW5kaWYKQEAgLTM4Miw3ICszNDAsNyBAQAogCiBpZm5lcSAoLCQoTE9DQUxfU09PTkdfSU5TVEFMTEVEX01PRFVMRSkpCiAgIGlmbmVxICgkKExPQ0FMX01PRFVMRV9NQUtFRklMRSksJChTT09OR19BTkRST0lEX01LKSkKLSAgICAkKGNhbGwgcHJldHR5LWVycm9yLCBMT0NBTF9TT09OR19JTlNUQUxMRURfTU9EVUxFIGNhbiBvbmx5IGJlIHVzZWQgZnJvbSAkKFNPT05HX0FORFJPSURfTUspKQorICAgICQoY2FsbCBwcmV0dHktZXJyb3IsIExPQ0FMX01PRFVMRV9NQUtFRklMRSBjYW4gb25seSBiZSB1c2VkIGZyb20gJChTT09OR19BTkRST0lEX01LKSkKICAgZW5kaWYKICAgIyBVc2UgdGhlIGluc3RhbGwgcGF0aCByZXF1ZXN0ZWQgYnkgU29vbmcuCiAgIExPQ0FMX0lOU1RBTExFRF9NT0RVTEUgOj0gJChMT0NBTF9TT09OR19JTlNUQUxMRURfTU9EVUxFKQpAQCAtNDM1LDggKzM5Myw4IEBACiAKIGxvZ3RhZ3Nfc291cmNlcyA6PSAkKGZpbHRlciAlLmxvZ3RhZ3MsJChMT0NBTF9TUkNfRklMRVMpKSAkKExPQ0FMX0xPR1RBR1NfRklMRVMpCiAKLWlmbmVxICgkKHN0cmlwICQobG9ndGFnc19zb3VyY2VzKSksKQotZXZlbnRfbG9nX3RhZ3MgOj0gJChmb3JlYWNoIGYsJChhZGRwcmVmaXggJChMT0NBTF9QQVRIKS8sJChsb2d0YWdzX3NvdXJjZXMpKSwkKGNhbGwgY2xlYW4tcGF0aCwkKGYpKSkKK2lmbmVxICgkKHN0cmlwICQobG9ndGFnc19zb3VyY2VzKSAkKExPQ0FMX1NPT05HX0xPR1RBR1NfRklMRVMpKSwpCitldmVudF9sb2dfdGFncyA6PSAkKGZvcmVhY2ggZiwkKExPQ0FMX1NPT05HX0xPR1RBR1NfRklMRVMpICQoYWRkcHJlZml4ICQoTE9DQUxfUEFUSCkvLCQobG9ndGFnc19zb3VyY2VzKSksJChjYWxsIGNsZWFuLXBhdGgsJChmKSkpCiBlbHNlCiBldmVudF9sb2dfdGFncyA6PQogZW5kaWYKQEAgLTQ2Miw2ICs0MjAsMTIgQEAKICQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpIDogUFJJVkFURV9JU19IT1NUX01PRFVMRSA6PSAkKExPQ0FMX0lTX0hPU1RfTU9EVUxFKQogJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUykgOiBQUklWQVRFX0hPU1Q6PSAkKG15X2hvc3QpCiAkKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKSA6IFBSSVZBVEVfUFJFRklYIDo9ICQobXlfcHJlZml4KQorJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUykgOiAuS0FUSV9UQUdTICs9IDttb2R1bGVfbmFtZT0kKExPQ0FMX01PRFVMRSkKK2lmZXEgKCQoTE9DQUxfTU9EVUxFX0NMQVNTKSwpCiskKGVycm9yICIkKExPQ0FMX01PRFVMRSkgaW4gJChMT0NBTF9QQVRIKSBkb2VzIG5vdCBzZXQgJChMT0NBTF9NT0RVTEVfQ0xBU1MpIikKK2Vsc2UKKyQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpIDogLktBVElfVEFHUyArPSA7bW9kdWxlX3R5cGU9JChMT0NBTF9NT0RVTEVfQ0xBU1MpCitlbmRpZgogCiAkKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKSA6IFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVI6PSAkKGludGVybWVkaWF0ZXMpCiAkKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKSA6IFBSSVZBVEVfMk5EX0FSQ0hfVkFSX1BSRUZJWCA6PSAkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpCkBAIC01MjcsMTAgKzQ5MSw2IEBACiAgICMgY29weSBvZiB0aGUgaW50ZXJtZWRpYXRlcyBmb3Igbm93LCBhcyBzb21lIHJ1bGVzIHRoYXQgY29sbGVjdCBpbnRlcm1lZGlhdGVzIG1heSBleHBlY3QKICAgIyB0aGVtIHRvIGV4aXN0LgogICAkKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpOiAkKExPQ0FMX0JVSUxUX01PRFVMRSkKLQotICAkKGZvcmVhY2ggc3ltbGluaywgJChMT0NBTF9TT09OR19JTlNUQUxMX1NZTUxJTktTKSwgXAotICAgICQoY2FsbCBkZWNsYXJlLTBwLXRhcmdldCwkKHN5bWxpbmspKSkKLSAgJChteV9hbGxfdGFyZ2V0cykgOiB8ICQoTE9DQUxfU09PTkdfSU5TVEFMTF9TWU1MSU5LUykKIGVsc2UgaWZuZXEgKHRydWUsJChMT0NBTF9VTklOU1RBTExBQkxFX01PRFVMRSkpCiAgICQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSk6IFBSSVZBVEVfUE9TVF9JTlNUQUxMX0NNRCA6PSAkKExPQ0FMX1BPU1RfSU5TVEFMTF9DTUQpCiAgICQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSk6ICQoTE9DQUxfQlVJTFRfTU9EVUxFKQpAQCAtNTUyLDYgKzUxMiwxNSBAQAogCiBlbmRpZiAjICFMT0NBTF9VTklOU1RBTExBQkxFX01PRFVMRQogCisjIEFkZCBkZXBlbmRlbmNpZXMgb24gTE9DQUxfU09PTkdfSU5TVEFMTF9TWU1MSU5LUyBpZiB3ZSdyZSBpbnN0YWxsaW5nIGFueSBraW5kIG9mIG1vZHVsZSwgbm90IGp1c3QKKyMgb25lcyB0aGF0IHNldCBMT0NBTF9TT09OR19JTlNUQUxMRURfTU9EVUxFLiBUaGlzIGlzIHNvIHdlIGNhbiBoYXZlIGEgc29vbmcgbW9kdWxlIHRoYXQgb25seQorIyBpbnN0YWxscyBzeW1saW5rcyAoZS5nLiBpbnN0YWxsX3N5bWxpbmspLiBXZSBjYW4ndCBzZXQgTE9DQUxfU09PTkdfSU5TVEFMTEVEX01PRFVMRSB0byBhIHN5bWxpbmsKKyMgYmVjYXVzZSBjcCBjb21tYW5kcyB3aWxsIGZhaWwgb24gc3ltbGlua3MuCitpZm5lcSAoLCQob3IgJChMT0NBTF9TT09OR19JTlNUQUxMRURfTU9EVUxFKSwkKGNhbGwgYm9vbGVhbi1ub3QsJChMT0NBTF9VTklOU1RBTExBQkxFX01PRFVMRSkpKSkKKyAgJChmb3JlYWNoIHN5bWxpbmssICQoTE9DQUxfU09PTkdfSU5TVEFMTF9TWU1MSU5LUyksICQoY2FsbCBkZWNsYXJlLTBwLXRhcmdldCwkKHN5bWxpbmspKSkKKyAgJChteV9hbGxfdGFyZ2V0cykgOiB8ICQoTE9DQUxfU09PTkdfSU5TVEFMTF9TWU1MSU5LUykKK2VuZGlmCisKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBWSU5URiBtYW5pZmVzdCBmcmFnbWVudCBhbmQgaW5pdC5yYyBnb2FscwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTU4MCwxMSArNTQ5LDE0IEBACiAKICAgICAgICMgT25seSBzZXQgdXAgY29weSBydWxlcyBvbmNlLCBldmVuIGlmIGFub3RoZXIgYXJjaCB2YXJpYW50IHNoYXJlcyBpdAogICAgICAgbXlfdmludGZfbmV3X3BhaXJzIDo9ICQoZmlsdGVyLW91dCAkKEFMTF9WSU5URl9NQU5JRkVTVF9GUkFHTUVOVFNfTElTVCksJChteV92aW50Zl9wYWlycykpCi0gICAgICBteV92aW50Zl9uZXdfaW5zdGFsbGVkIDo9ICQoY2FsbCBjb3B5LW1hbnktdmludGYtbWFuaWZlc3QtZmlsZXMtY2hlY2tlZCwkKG15X3ZpbnRmX25ld19wYWlycykpCi0KICAgICAgIEFMTF9WSU5URl9NQU5JRkVTVF9GUkFHTUVOVFNfTElTVCArPSAkKG15X3ZpbnRmX25ld19wYWlycykKIAotICAgICAgJChteV9hbGxfdGFyZ2V0cykgOiAkKG15X3ZpbnRmX25ld19pbnN0YWxsZWQpCisgICAgICBpZm5lcSAoJChMT0NBTF9NT0RVTEVfTUFLRUZJTEUpLCQoU09PTkdfQU5EUk9JRF9NSykpCisgICAgICAgICQoY2FsbCBjb3B5LW1hbnktdmludGYtbWFuaWZlc3QtZmlsZXMtY2hlY2tlZCwkKG15X3ZpbnRmX25ld19wYWlycykpCisgICAgICAgICQobXlfYWxsX3RhcmdldHMpIDogJChteV92aW50Zl9pbnN0YWxsZWQpCisgICAgICAgICMgSW5zdGFsbCBmcmFnbWVudHMgdG9nZXRoZXIgd2l0aCB0aGUgdGFyZ2V0CisgICAgICAgICQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSkgOiB8ICQobXlfdmludGZfaW5zdGFsbGVkKQorICAgICBlbmRpZgogICAgIGVuZGlmICMgbXlfdmludGZfZnJhZ21lbnRzCiAKICAgICAjIFJ1bGUgdG8gaW5zdGFsbCB0aGUgbW9kdWxlJ3MgY29tcGFuaW9uIGluaXQucmMuCkBAIC02MTYsMTEgKzU4OCwxNCBAQAogICAgICAgIyBNYWtlIHN1cmUgd2Ugb25seSBzZXQgdXAgdGhlIGNvcHkgcnVsZXMgb25jZSwgZXZlbiBpZiBhbm90aGVyIGFyY2ggdmFyaWFudAogICAgICAgIyBzaGFyZXMgYSBjb21tb24gTE9DQUxfSU5JVF9SQy4KICAgICAgIG15X2luaXRfcmNfbmV3X3BhaXJzIDo9ICQoZmlsdGVyLW91dCAkKEFMTF9JTklUX1JDX0lOU1RBTExFRF9QQUlSUyksJChteV9pbml0X3JjX3BhaXJzKSkKLSAgICAgIG15X2luaXRfcmNfbmV3X2luc3RhbGxlZCA6PSAkKGNhbGwgY29weS1tYW55LWluaXQtc2NyaXB0LWZpbGVzLWNoZWNrZWQsJChteV9pbml0X3JjX25ld19wYWlycykpCi0KICAgICAgIEFMTF9JTklUX1JDX0lOU1RBTExFRF9QQUlSUyArPSAkKG15X2luaXRfcmNfbmV3X3BhaXJzKQogCi0gICAgICAkKG15X2FsbF90YXJnZXRzKSA6ICQobXlfaW5pdF9yY19pbnN0YWxsZWQpCisgICAgICBpZm5lcSAoJChMT0NBTF9NT0RVTEVfTUFLRUZJTEUpLCQoU09PTkdfQU5EUk9JRF9NSykpCisgICAgICAgICQoY2FsbCBjb3B5LW1hbnktaW5pdC1zY3JpcHQtZmlsZXMtY2hlY2tlZCwkKG15X2luaXRfcmNfbmV3X3BhaXJzKSkKKyAgICAgICAgJChteV9hbGxfdGFyZ2V0cykgOiAkKG15X2luaXRfcmNfaW5zdGFsbGVkKQorICAgICAgICAjIEluc3RhbGwgaW5pdF9yYyB0b2dldGhlciB3aXRoIHRoZSB0YXJnZXQKKyAgICAgICAgJChMT0NBTF9JTlNUQUxMRURfTU9EVUxFKSA6IHwgJChteV9pbml0X3JjX2luc3RhbGxlZCkKKyAgICAgIGVuZGlmCiAgICAgZW5kaWYgIyBteV9pbml0X3JjCiAKICAgZW5kaWYgIyAhTE9DQUxfSVNfSE9TVF9NT0RVTEUKQEAgLTcwNSwxNCArNjgwLDMwIEBACiAKIGNvcHlfdGVzdF9kYXRhX3BhaXJzIDo9CiAKLW15X2luc3RhbGxlZF90ZXN0X2RhdGEgOj0gJChjYWxsIGNvcHktbWFueS1maWxlcywkKG15X3Rlc3RfZGF0YV9wYWlycykpCi0kKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpOiAkKG15X2luc3RhbGxlZF90ZXN0X2RhdGEpCitpZm5lcSAoJChMT0NBTF9NT0RVTEVfTUFLRUZJTEUpLCQoU09PTkdfQU5EUk9JRF9NSykpCisgIG15X2luc3RhbGxlZF90ZXN0X2RhdGEgOj0gJChjYWxsIGNvcHktbWFueS1maWxlcywkKG15X3Rlc3RfZGF0YV9wYWlycykpCisgICQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSk6ICQobXlfaW5zdGFsbGVkX3Rlc3RfZGF0YSkKK2Vsc2UKKyAgIyBTa2lwIGluc3RhbGxpbmcgdGVzdCBkYXRhIGZvciBTb29uZyBtb2R1bGVzLCBpdCdzIGFscmVhZHkgYmVlbiBoYW5kbGVkLgorICAjIEp1c3QgY29tcHV0ZSBteV9pbnN0YWxsZWRfdGVzdF9kYXRhLgorICBteV9pbnN0YWxsZWRfdGVzdF9kYXRhIDo9ICQoZm9yZWFjaCBmLCAkKG15X3Rlc3RfZGF0YV9wYWlycyksICQoY2FsbCB3b3JkLWNvbG9uLDIsJChmKSkpCitlbmRpZgogCiBlbmRpZgogZW5kaWYKIGVuZGlmCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBTT09ORyBJTlNUQUxMIFBBSVJTCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBEZWNsYXJlIGRlcGVuZGVuY2llcyBmb3IgTE9DQUxfU09PTkdfSU5TVEFMTF9QQUlSUyBpbiBzb29uZyB0byB0aGUgbW9kdWxlIGl0IHJlbGllcyBvbi4KK2lmbmVxICgsJChMT0NBTF9TT09OR19JTlNUQUxMRURfTU9EVUxFKSkKKyQobXlfYWxsX3RhcmdldHMpOiBcCisgICAgJChmb3JlYWNoIGYsICQoTE9DQUxfU09PTkdfSU5TVEFMTF9QQUlSUyksXAorICAgICAgJCh3b3JkIDIsJChzdWJzdCA6LCQoc3BhY2UpLCQoZikpKSkKK2VuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBDb21wYXRpYmlsaXR5IHN1aXRlIGZpbGVzLgogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIGlmZGVmIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUKQEAgLTcyNiwxMiArNzE3LDE0IEBACiBlbmRpZgogCiBpZmVxICgkKEVYQ0xVREVfTUNUUyksdHJ1ZSkKK2lmZXEgKCwkKGZpbHRlciAkKExPQ0FMX01PRFVMRSksJChtY3RzX3doaXRlbGlzdCkpKQogICBpZm5lcSAoLCQodGVzdF9jb25maWcpKQogICAgIGlmbmVxICgsJChmaWx0ZXIgbWN0cy0lLCQoTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSkpKQogICAgICAgTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSAkKGZpbHRlci1vdXQgY3RzLCQoTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSkpCiAgICAgZW5kaWYKICAgZW5kaWYKIGVuZGlmCitlbmRpZgogCiBpZm5lcSAodHJ1ZSwkKExPQ0FMX1VOSU5TVEFMTEFCTEVfTU9EVUxFKSkKIApAQCAtNzgzLDggKzc3NiwxNCBAQAogICAkKGV2YWwgbXlfY29tcGF0X2Rpc3RfJChzdWl0ZSkgOj0gJChwYXRzdWJzdCAlOiQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSksJChMT0NBTF9JTlNUQUxMRURfTU9EVUxFKTokKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpLFwKICAgICAkKGZvcmVhY2ggZGlyLCAkKGNhbGwgY29tcGF0aWJpbGl0eV9zdWl0ZV9kaXJzLCQoc3VpdGUpLCQoYXJjaF9kaXIpKSwgXAogICAgICAgJChMT0NBTF9CVUlMVF9NT0RVTEUpOiQoZGlyKS8kKG15X2luc3RhbGxlZF9tb2R1bGVfc3RlbSkpKSkgXAorICAkKGV2YWwgbXlfY29tcGF0X21vZHVsZV9hcmNoX2Rpcl8kKHN1aXRlKS4kKG15X3JlZ2lzdGVyX25hbWUpIDo9KSBcCisgICQoZm9yZWFjaCBkaXIsJChjYWxsIGNvbXBhdGliaWxpdHlfc3VpdGVfZGlycywkKHN1aXRlKSwkKGFyY2hfZGlyKSksJChldmFsIG15X2NvbXBhdF9tb2R1bGVfYXJjaF9kaXJfJChzdWl0ZSkuJChteV9yZWdpc3Rlcl9uYW1lKSArPSAkKGRpcikpKSBcCiAgICQoZXZhbCBteV9jb21wYXRfZGlzdF9jb25maWdfJChzdWl0ZSkgOj0gKSkKIAoraWZuZXEgKCwkKExPQ0FMX1NPT05HX0NMQVNTRVNfSkFSKSkKKyAgICAkKGZvcmVhY2ggc3VpdGUsICQoTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSksIFwKKyAgICAgICQoZXZhbCBteV9jb21wYXRfYXBpX21hcF8kKHN1aXRlKSArPSAkKExPQ0FMX1NPT05HX0NMQVNTRVNfSkFSKSkpCitlbmRpZgogCiAjIEF1dG8tZ2VuZXJhdGUgYnVpbGQgY29uZmlnLgogaWZlcSAoLCQodGVzdF9jb25maWcpKQpAQCAtODM4LDEwICs4MzcsMTYgQEAKICAgICAgICQoZm9yZWFjaCBkaXIsICQoY2FsbCBjb21wYXRpYmlsaXR5X3N1aXRlX2RpcnMsJChzdWl0ZSkpLCBcCiAgICAgICAgICQocyk6JChkaXIpLyQobikpKSkpCiAKKyAgJChmb3JlYWNoIHN1aXRlLCAkKExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUpLCBcCisgICAgICQoZXZhbCBteV9jb21wYXRfYXBpX21hcF8kKHN1aXRlKSArPSAkKGZvcmVhY2ggZiwgJChMT0NBTF9DT01QQVRJQklMSVRZX1NVUFBPUlRfRklMRVMpLCBcCisgICAgICAgJChldmFsIHAgOj0gJChzdWJzdCA6LCQoc3BhY2UpLCQoZikpKSBcCisgICAgICAgJChldmFsIHMgOj0gJCh3b3JkIDEsJChwKSkpIFwKKyAgICAgICAkKGlmICQoZmlsdGVyICUuYXBrLCQocykpICQoZmlsdGVyICUuamFyLCQocykpLCQocyksKSkpKQorCiAgIGlmbmVxICgsJCh0ZXN0X2NvbmZpZykpCiAgICAgJChmb3JlYWNoIHN1aXRlLCAkKExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUpLCBcCiAgICAgICAkKGV2YWwgbXlfY29tcGF0X2Rpc3RfY29uZmlnXyQoc3VpdGUpICs9ICQoZm9yZWFjaCBkaXIsICQoY2FsbCBjb21wYXRpYmlsaXR5X3N1aXRlX2RpcnMsJChzdWl0ZSkpLCBcCi0gICAgICAgICQodGVzdF9jb25maWcpOiQoZGlyKS8kKExPQ0FMX01PRFVMRSkuY29uZmlnKSkpCisgICAgICAgICQodGVzdF9jb25maWcpOiQoZGlyKS8kKExPQ0FMX01PRFVMRSkuY29uZmlnJChMT0NBTF9URVNUX0NPTkZJR19TVUZGSVgpKSkpCiAgIGVuZGlmCiAKICAgaWZuZXEgKCwkKExPQ0FMX0VYVFJBX0ZVTExfVEVTVF9DT05GSUdTKSkKQEAgLTg4MCw3ICs4ODUsOSBAQAogICAgICAgJChjYWxsIGZpbHRlci1jb3B5LXBhaXIsJChzcmNfcGF0aCksJChjYWxsIGFwcGVuZC1wYXRoLCQoZGlyKSwkKGZpbGUpKSwkKG15X2luc3RhbGxlZF90ZXN0X2RhdGEpKSkpIFwKICAgICAkKGV2YWwgbXlfY29tcGF0X2Rpc3RfdGVzdF9kYXRhXyQoc3VpdGUpICs9IFwKICAgICAgICQoZm9yZWFjaCBkaXIsICQoY2FsbCBjb21wYXRpYmlsaXR5X3N1aXRlX2RpcnMsJChzdWl0ZSksJChhcmNoX2RpcikpLCBcCi0gICAgICAgICQoZmlsdGVyICQobXlfaW5zdGFsbGVkX3Rlc3RfZGF0YSksJChjYWxsIGFwcGVuZC1wYXRoLCQoZGlyKSwkKGZpbGUpKSkpKSkpCisgICAgICAgICQoZmlsdGVyICQobXlfaW5zdGFsbGVkX3Rlc3RfZGF0YSksJChjYWxsIGFwcGVuZC1wYXRoLCQoZGlyKSwkKGZpbGUpKSkpKSBcCisgICAgJChldmFsIG15X2NvbXBhdF9hcGlfbWFwXyQoc3VpdGUpICs9IFwKKyAgICAgICQoaWYgJChmaWx0ZXIgJS5hcGssJChzcmNfcGF0aCkpICQoZmlsdGVyICUuamFyLCQoc3JjX3BhdGgpKSwkKHNyY19wYXRoKSwpKSkpCiBlbmRpZgogZWxzZQogaWZuZXEgKCQobXlfdGVzdF9kYXRhX2ZpbGVfcGFpcnMpLCkKQEAgLTg5MCw3ICs4OTcsOSBAQAogICAkKGV2YWwgZmlsZSA6PSAkKHdvcmQgMiwkKHBhcnRzKSkpIFwKICAgJChmb3JlYWNoIHN1aXRlLCAkKExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUpLCBcCiAgICAgJChldmFsIG15X2NvbXBhdF9kaXN0XyQoc3VpdGUpICs9ICQoZm9yZWFjaCBkaXIsICQoY2FsbCBjb21wYXRpYmlsaXR5X3N1aXRlX2RpcnMsJChzdWl0ZSksJChhcmNoX2RpcikpLCBcCi0gICAgICAkKHNyY19wYXRoKTokKGNhbGwgYXBwZW5kLXBhdGgsJChkaXIpLCQoZmlsZSkpKSkpKQorICAgICAgJChzcmNfcGF0aCk6JChjYWxsIGFwcGVuZC1wYXRoLCQoZGlyKSwkKGZpbGUpKSkpIFwKKyAgICAkKGV2YWwgbXlfY29tcGF0X2FwaV9tYXBfJChzdWl0ZSkgKz0gXAorICAgICAgJChpZiAkKGZpbHRlciAlLmFwaywkKHNyY19wYXRoKSkgJChmaWx0ZXIgJS5qYXIsJChzcmNfcGF0aCkpLCQoc3JjX3BhdGgpLCkpKSkKIGVuZGlmCiBlbmRpZgogCkBAIC05MDIsNyArOTExLDggQEAKICQoY2FsbCBjcmVhdGUtc3VpdGUtZGVwZW5kZW5jaWVzKQogJChmb3JlYWNoIHN1aXRlLCAkKExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUpLCBcCiAgICQoZXZhbCBteV9jb21wYXRfZGlzdF9jb25maWdfJChzdWl0ZSkgOj0gKSBcCi0gICQoZXZhbCBteV9jb21wYXRfZGlzdF90ZXN0X2RhdGFfJChzdWl0ZSkgOj0gKSkKKyAgJChldmFsIG15X2NvbXBhdF9kaXN0X3Rlc3RfZGF0YV8kKHN1aXRlKSA6PSApIFwKKyAgJChldmFsIG15X2NvbXBhdF9hcGlfbWFwXyQoc3VpdGUpIDo9ICkpCiAKIGVuZGlmICAjIExPQ0FMX1VOSU5TVEFMTEFCTEVfTU9EVUxFCiAKQEAgLTk2MCwxMyArOTcwLDE1IEBACiBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlBBVEggOj0gXAogICAgICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5QQVRIKSAkKExPQ0FMX1BBVEgpCiBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlRBR1MgOj0gXAotICAgICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5UQUdTKSAkKG15X21vZHVsZV90YWdzKQorICAgICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5UQUdTKSAkKExPQ0FMX01PRFVMRV9UQUdTKQogQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5DSEVDS0VEIDo9IFwKICAgICAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQ0hFQ0tFRCkgJChteV9jaGVja2VkX21vZHVsZSkKIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQlVJTFQgOj0gXAogICAgICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5CVUlMVCkgJChMT0NBTF9CVUlMVF9NT0RVTEUpCiBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlNPT05HX01PRFVMRV9UWVBFIDo9IFwKICAgICAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuU09PTkdfTU9EVUxFX1RZUEUpICQoTE9DQUxfU09PTkdfTU9EVUxFX1RZUEUpCitBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLklTX1NPT05HX01PRFVMRSA6PSBcCisgICAgJChpZiAkKGZpbHRlciAkKExPQ0FMX01PRFVMRV9NQUtFRklMRSksJChTT09OR19BTkRST0lEX01LKSksdHJ1ZSkKIGlmbmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQogQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5UQVJHRVRfQlVJTFQgOj0gXAogICAgICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5UQVJHRVRfQlVJTFQpICQoTE9DQUxfQlVJTFRfTU9EVUxFKQpAQCAtOTgzLDYgKzk5NSw5IEBACiAgICAgICAkKG15X2luaXRfcmNfaW5zdGFsbGVkKSBcCiAgICAgICAkKG15X2luc3RhbGxlZF90ZXN0X2RhdGEpIFwKICAgICAgICQobXlfdmludGZfaW5zdGFsbGVkKSkKKworICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLklOU1RBTExFRF9TWU1MSU5LUyA6PSAkKExPQ0FMX1NPT05HX0lOU1RBTExfU1lNTElOS1MpCisKICAgIyBTdG9yZSB0aGUgbGlzdCBvZiBjb2xvbi1zZXBhcmF0ZWQgcGFpcnMgb2YgdGhlIGJ1aWx0IGFuZCBpbnN0YWxsZWQgbG9jYXRpb25zCiAgICMgb2YgZmlsZXMgcHJvdmlkZWQgYnkgdGhpcyBtb2R1bGUuICBVc2VkIGJ5IGN1c3RvbSBwYWNrYWdpbmcgcnVsZXMgbGlrZQogICAjIHBhY2thZ2UtbW9kdWxlcy5tayB0aGF0IG5lZWQgdG8gY29weSB0aGUgYnVpbHQgZmlsZXMgdG8gYSBjdXN0b20gaW5zdGFsbApAQCAtOTk3LDYgKzEwMTIsMTEgQEAKICAgICAgICQobXlfaW5pdF9yY19wYWlycykgXAogICAgICAgJChteV90ZXN0X2RhdGFfcGFpcnMpIFwKICAgICAgICQobXlfdmludGZfcGFpcnMpKQorICAjIFN0b3JlIHRoZSBsaXN0IG9mIHZpbnRmL2luaXRfcmMgYXMgb3JkZXItb25seSBkZXBlbmRlbmNpZXMKKyAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5PUkRFUk9OTFlfSU5TVEFMTEVEIDo9IFwKKyAgICAkKHN0cmlwICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5PUkRFUk9OTFlfSU5TVEFMTEVEKSBcCisgICAgICAkKG15X2luaXRfcmNfaW5zdGFsbGVkKSBcCisgICAgICAkKG15X3ZpbnRmX2luc3RhbGxlZCkpCiBlbHNlIGlmbmVxICh0cnVlLCQoTE9DQUxfVU5JTlNUQUxMQUJMRV9NT0RVTEUpKQogICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLklOU1RBTExFRCA6PSBcCiAgICAgJChzdHJpcCAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuSU5TVEFMTEVEKSBcCkBAIC0xMDA2LDcgKzEwMjYsMjEgQEAKICAgICAkKHN0cmlwICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5CVUlMVF9JTlNUQUxMRUQpIFwKICAgICAkKExPQ0FMX0JVSUxUX01PRFVMRSk6JChMT0NBTF9JTlNUQUxMRURfTU9EVUxFKSBcCiAgICAgJChteV9pbml0X3JjX3BhaXJzKSAkKG15X3Rlc3RfZGF0YV9wYWlycykgJChteV92aW50Zl9wYWlycykpCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuT1JERVJPTkxZX0lOU1RBTExFRCA6PSBcCisgICAgJChzdHJpcCAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuT1JERVJPTkxZX0lOU1RBTExFRCkgXAorICAgICAgJChteV9pbml0X3JjX2luc3RhbGxlZCkgXAorICAgICAgJChteV92aW50Zl9pbnN0YWxsZWQpKQogZW5kaWYKKworIyBNYXJrIExPQ0FMX1NPT05HX0lOU1RBTExfU1lNTElOS1MgYXMgaW5zdGFsbGVkIGlmIHdlJ3JlIGluc3RhbGxpbmcgYW55IGtpbmQgb2YgbW9kdWxlLCBub3QganVzdAorIyBvbmVzIHRoYXQgc2V0IExPQ0FMX1NPT05HX0lOU1RBTExFRF9NT0RVTEUuIFRoaXMgaXMgc28gd2UgY2FuIGhhdmUgYSBzb29uZyBtb2R1bGUgdGhhdCBvbmx5CisjIGluc3RhbGxzIHN5bWxpbmtzIChlLmcuIGluc3RhbGxlZF9zeW1saW5rKS4gV2UgY2FuJ3Qgc2V0IExPQ0FMX1NPT05HX0lOU1RBTExFRF9NT0RVTEUgdG8gYSBzeW1saW5rCisjIGJlY2F1c2UgY3AgY29tbWFuZHMgd2lsbCBmYWlsIG9uIHN5bWxpbmtzLgoraWZuZXEgKCwkKG9yICQoTE9DQUxfU09PTkdfSU5TVEFMTEVEX01PRFVMRSksJChjYWxsIGJvb2xlYW4tbm90LCQoTE9DQUxfVU5JTlNUQUxMQUJMRV9NT0RVTEUpKSkpCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuSU5TVEFMTEVEICs9ICQoTE9DQUxfU09PTkdfSU5TVEFMTF9TWU1MSU5LUykKKyAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5JTlNUQUxMRURfU1lNTElOS1MgOj0gJChMT0NBTF9TT09OR19JTlNUQUxMX1NZTUxJTktTKQorZW5kaWYKKwogaWZkZWYgTE9DQUxfUElDS1VQX0ZJTEVTCiAjIEZpbGVzIG9yIGRpcmVjdG9yaWVzIHJlYWR5IHRvIHBpY2sgdXAgYnkgdGhlIGJ1aWxkIHN5c3RlbQogIyB3aGVuICQoTE9DQUxfQlVJTFRfTU9EVUxFKSBpcyBkb25lLgpAQCAtMTAzMCw0OCArMTA2NCw5NCBAQAogbXlfcmVxdWlyZWRfbW9kdWxlcyArPSAkKExPQ0FMX1JFUVVJUkVEX01PRFVMRVNfJCgkKG15X3ByZWZpeClPUykpCiBlbmRpZgogCi1BTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlNIQVJFRF9MSUJTIDo9IFwKLSAgICAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuU0hBUkVEX0xJQlMpICQoTE9DQUxfU0hBUkVEX0xJQlJBUklFUykKLQotQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5TWVNURU1fU0hBUkVEX0xJQlMgOj0gXAotICAgICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5TWVNURU1fU0hBUkVEX0xJQlMpICQoTE9DQUxfU1lTVEVNX1NIQVJFRF9MSUJSQVJJRVMpCi0KLUFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTE9DQUxfUlVOVElNRV9MSUJSQVJJRVMgOj0gXAotICAgICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5MT0NBTF9SVU5USU1FX0xJQlJBUklFUykgJChMT0NBTF9SVU5USU1FX0xJQlJBUklFUykgXAotICAgICQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpCi0KLUFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMpICQoTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTKQotCi1pZmRlZiBMT0NBTF9URVNUX0RBVEEKLSAgIyBFeHBvcnQgdGhlIGxpc3Qgb2YgdGFyZ2V0cyB0aGF0IGFyZSBoYW5kbGVkIGFzIGRhdGEgaW5wdXRzIGFuZCByZXF1aXJlZAotICAjIGJ5IHRlc3RzIGF0IHJ1bnRpbWUuIFRoZSBMT0NBTF9URVNUX0RBVEEgZm9ybWF0IGlzIGdlbmVyYXRlZCBmcm9tIGJlbG93Ci0gICMgaHR0cHM6Ly9jcy5hbmRyb2lkLmNvbS9hbmRyb2lkL3BsYXRmb3JtL3N1cGVycHJvamVjdC8rL21hc3RlcjpidWlsZC9zb29uZy9hbmRyb2lkL2FuZHJvaWRtay5nbztsPTkyNS05NDQ7ZHJjPW1hc3RlcgotICAjIHdoaWNoIGZvcm1hdCBpcyBsaWtlICQocGF0aCk6JChyZWxhdGl2ZV9maWxlKSBidXQgZm9yIG1vZHVsZS1pbmZvLCBvbmx5Ci0gICMgdGhlIHN0cmluZyBhZnRlciAiOiIgaXMgbmVlZGVkLgotICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlRFU1RfREFUQSA6PSBcCi0gICAgJChzdHJpcCAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuVEVTVF9EQVRBKSBcCi0gICAgICAkKGZvcmVhY2ggZiwgJChMT0NBTF9URVNUX0RBVEEpLFwKLSAgICAgICAgJChjYWxsIHdvcmQtY29sb24sMiwkKGYpKSkpCitpZmRlZiBMT0NBTF9BQ09ORklHX0ZJTEVTCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQUNPTkZJR19GSUxFUyA6PSBcCisgICAgICAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQUNPTkZJR19GSUxFUykgJChMT0NBTF9BQ09ORklHX0ZJTEVTKQogZW5kaWYKIAotaWZkZWYgTE9DQUxfVEVTVF9EQVRBX0JJTlMKLSAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5URVNUX0RBVEFfQklOUyA6PSBcCi0gICAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlRFU1RfREFUQV9CSU5TKSAkKExPQ0FMX1RFU1RfREFUQV9CSU5TKQoraWZkZWYgTE9DQUxfRklMRVNZU1RFTV9GSUxFTElTVAorICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkZJTEVTWVNURU1fRklMRUxJU1QgOj0gXAorICAgICAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkZJTEVTWVNURU1fRklMRUxJU1QpICQoTE9DQUxfRklMRVNZU1RFTV9GSUxFTElTVCkKIGVuZGlmCiAKLUFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuU1VQUE9SVEVEX1ZBUklBTlRTIDo9IFwKLSAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlNVUFBPUlRFRF9WQVJJQU5UUykgXAotICAkKGZpbHRlci1vdXQgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlNVUFBPUlRFRF9WQVJJQU5UUyksJChteV9zdXBwb3J0ZWRfdmFyaWFudCkpCitpZm5kZWYgTE9DQUxfU09PTkdfTU9EVUxFX0lORk9fSlNPTgorICBBTExfTUFLRV9NT0RVTEVfSU5GT19KU09OX01PRFVMRVMgKz0gJChteV9yZWdpc3Rlcl9uYW1lKQorICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlNIQVJFRF9MSUJTIDo9IFwKKyAgICAgICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5TSEFSRURfTElCUykgJChMT0NBTF9TSEFSRURfTElCUkFSSUVTKQorCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuU1RBVElDX0xJQlMgOj0gXAorICAgICAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlNUQVRJQ19MSUJTKSAkKExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMpCisKKyAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5TWVNURU1fU0hBUkVEX0xJQlMgOj0gXAorICAgICAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlNZU1RFTV9TSEFSRURfTElCUykgJChMT0NBTF9TWVNURU1fU0hBUkVEX0xJQlJBUklFUykKKworICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkxPQ0FMX1JVTlRJTUVfTElCUkFSSUVTIDo9IFwKKyAgICAgICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5MT0NBTF9SVU5USU1FX0xJQlJBUklFUykgJChMT0NBTF9SVU5USU1FX0xJQlJBUklFUykgXAorICAgICAgJChMT0NBTF9KQVZBX0xJQlJBUklFUykKKworICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgICAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMpICQoTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTKQorCisgIGlmbmVxICgkKG15X3Rlc3RfZGF0YV9maWxlX3BhaXJzKSwpCisgICAgIyBFeHBvcnQgdGhlIGxpc3Qgb2YgdGFyZ2V0cyB0aGF0IGFyZSBoYW5kbGVkIGFzIGRhdGEgaW5wdXRzIGFuZCByZXF1aXJlZAorICAgICMgYnkgdGVzdHMgYXQgcnVudGltZS4gVGhlIGZvcm1hdCBvZiBteV90ZXN0X2RhdGFfZmlsZV9wYWlycyBpcworICAgICMgaXMgJChwYXRoKTokKHJlbGF0aXZlX2ZpbGUpIGJ1dCBmb3IgbW9kdWxlLWluZm8sIG9ubHkgdGhlIHN0cmluZyBhZnRlcgorICAgICMgIjoiIGlzIG5lZWRlZC4KKyAgICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlRFU1RfREFUQSA6PSBcCisgICAgICAkKHN0cmlwICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5URVNUX0RBVEEpIFwKKyAgICAgICAgJChmb3JlYWNoIGYsICQobXlfdGVzdF9kYXRhX2ZpbGVfcGFpcnMpLFwKKyAgICAgICAgICAkKGNhbGwgd29yZC1jb2xvbiwyLCQoZikpKSkKKyAgZW5kaWYKKworICBpZmRlZiBMT0NBTF9URVNUX0RBVEFfQklOUworICAgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuVEVTVF9EQVRBX0JJTlMgOj0gXAorICAgICAgICAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuVEVTVF9EQVRBX0JJTlMpICQoTE9DQUxfVEVTVF9EQVRBX0JJTlMpCisgIGVuZGlmCisKKyAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5TVVBQT1JURURfVkFSSUFOVFMgOj0gXAorICAgICAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlNVUFBPUlRFRF9WQVJJQU5UUykgXAorICAgICAgJChmaWx0ZXItb3V0ICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5TVVBQT1JURURfVkFSSUFOVFMpLCQobXlfc3VwcG9ydGVkX3ZhcmlhbnQpKQorCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQ09NUEFUSUJJTElUWV9TVUlURVMgOj0gXAorICAgICAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkNPTVBBVElCSUxJVFlfU1VJVEVTKSAkKExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUpCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTU9EVUxFX05BTUUgOj0gJChMT0NBTF9NT0RVTEUpCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuVEVTVF9DT05GSUcgOj0gJCh0ZXN0X2NvbmZpZykKKyAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5FWFRSQV9URVNUX0NPTkZJR1MgOj0gJChMT0NBTF9FWFRSQV9GVUxMX1RFU1RfQ09ORklHUykKKyAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5URVNUX01BSU5MSU5FX01PRFVMRVMgOj0gJChMT0NBTF9URVNUX01BSU5MSU5FX01PRFVMRVMpCisgIGlmZGVmIExPQ0FMX0lTX1VOSVRfVEVTVAorICAgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuSVNfVU5JVF9URVNUIDo9ICQoTE9DQUxfSVNfVU5JVF9URVNUKQorICBlbmRpZgorICBpZmRlZiBMT0NBTF9URVNUX09QVElPTlNfVEFHUworICAgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuVEVTVF9PUFRJT05TX1RBR1MgOj0gJChMT0NBTF9URVNUX09QVElPTlNfVEFHUykKKyAgZW5kaWYKKworICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICMgVHJhY2sgbW9kdWxlLWxldmVsIGRlcGVuZGVuY2llcy4KKyAgIyAoYi8yMDQzOTcxODApIFVubG9jayBSRUNPUkRfQUxMX0RFUFMgd2FzIGFja25vd2xlZGdlZCByZWFzb25hYmxlIGZvciBiZXR0ZXIgQXRlc3QgcGVyZm9ybWFuY2UuCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQUxMX0RFUFMgOj0gXAorICAgICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5BTExfREVQUykgXAorICAgICQoTE9DQUxfU1RBVElDX0xJQlJBUklFUykgXAorICAgICQoTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUykgXAorICAgICQoTE9DQUxfU0hBUkVEX0xJQlJBUklFUykgXAorICAgICQoTE9DQUxfRFlMSUJfTElCUkFSSUVTKSBcCisgICAgJChMT0NBTF9STElCX0xJQlJBUklFUykgXAorICAgICQoTE9DQUxfUFJPQ19NQUNST19MSUJSQVJJRVMpIFwKKyAgICAkKExPQ0FMX0hFQURFUl9MSUJSQVJJRVMpIFwKKyAgICAkKExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUykgXAorICAgICQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpIFwKKyAgICAkKExPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTKQorCitlbmRpZgorQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5URVNUX01PRFVMRV9DT05GSUdfQkFTRSA6PSAkKExPQ0FMX1RFU1RfTU9EVUxFX0NPTkZJR19CQVNFKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgV2hlbiBjb21waWxpbmcgYWdhaW5zdCBBUEkgaW1wb3J0ZWQgbW9kdWxlLCB1c2UgQVBJIGltcG9ydCBzdHViCiAjIyBsaWJyYXJpZXMuCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotaWZuZXEgKCQoTE9DQUxfVVNFX1ZOREspLCkKK2lmbmVxICgkKGNhbGwgbW9kdWxlLWluLXZlbmRvci1vci1wcm9kdWN0KSwpCiAgIGlmbmVxICgkKExPQ0FMX01PRFVMRV9NQUtFRklMRSksJChTT09OR19BTkRST0lEX01LKSkKICAgICBhcGlpbXBvcnRfcG9zdGZpeCA6PSAuYXBpaW1wb3J0Ci0gICAgaWZlcSAoJChMT0NBTF9VU0VfVk5ES19QUk9EVUNUKSx0cnVlKQorICAgIGlmZXEgKCQoTE9DQUxfSU5fUFJPRFVDVCksdHJ1ZSkKICAgICAgIGFwaWltcG9ydF9wb3N0Zml4IDo9IC5hcGlpbXBvcnQucHJvZHVjdAogICAgIGVsc2UKICAgICAgIGFwaWltcG9ydF9wb3N0Zml4IDo9IC5hcGlpbXBvcnQudmVuZG9yCkBAIC0xMDg2LDcgKzExNjYsNyBAQAogIyMgV2hlbiBjb21waWxpbmcgYWdhaW5zdCB0aGUgVk5ESywgYWRkIHRoZSAudmVuZG9yIG9yIC5wcm9kdWN0IHN1ZmZpeCB0bwogIyMgcmVxdWlyZWQgbW9kdWxlcy4KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1pZm5lcSAoJChMT0NBTF9VU0VfVk5ESyksKQoraWZuZXEgKCQoY2FsbCBtb2R1bGUtaW4tdmVuZG9yLW9yLXByb2R1Y3QpLCkKICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgIyMgU29vbmcgbW9kdWxlcyBtYXkgYmUgYnVpbHQgdGhyZWUgdGltZXMsIG9uY2UgZm9yCiAgICMjIC9zeXN0ZW0sIG9uY2UgZm9yIC92ZW5kb3IgYW5kIG9uY2UgZm9yIC9wcm9kdWN0LgpAQCAtMTA5Nyw3ICsxMTc3LDcgQEAKICAgICAjIFdlIGRvbid0IGRvIHRoaXMgcmVuYW1pbmcgZm9yIHNvb25nLWRlZmluZWQgbW9kdWxlcyBzaW5jZSB0aGV5IGFscmVhZHkKICAgICAjIGhhdmUgY29ycmVjdCBuYW1lcyAod2l0aCAudmVuZG9yIG9yIC5wcm9kdWN0IHN1ZmZpeCB3aGVuIG5lY2Vzc2FyeSkgaW4KICAgICAjIHRoZWlyIExPQ0FMXypfTElCUkFSSUVTLgotICAgIGlmZXEgKCQoTE9DQUxfVVNFX1ZOREtfUFJPRFVDVCksdHJ1ZSkKKyAgICBpZmVxICgkKExPQ0FMX0lOX1BST0RVQ1QpLHRydWUpCiAgICAgICBteV9yZXF1aXJlZF9tb2R1bGVzIDo9ICQoZm9yZWFjaCBsLCQobXlfcmVxdWlyZWRfbW9kdWxlcyksXAogICAgICAgICAkKGlmICQoU1BMSVRfUFJPRFVDVC5TSEFSRURfTElCUkFSSUVTLiQobCkpLCQobCkucHJvZHVjdCwkKGwpKSkKICAgICBlbHNlCkBAIC0xMTQzLDcwICsxMjIzLDMxIEBACiAgICAgICAgICQoY2FsbCBwcmV0dHktZXJyb3IsTE9DQUxfVEFSR0VUX1JFUVVJUkVEX01PRFVMRVMgbWF5IG5vdCBiZSB1c2VkIGZyb20gdGFyZ2V0IG1vZHVsZXMuIFVzZSBMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIGluc3RlYWQpCiAgICAgZW5kaWYKIGVuZGlmCi1BTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkVWRU5UX0xPR19UQUdTIDo9IFwKLSAgICAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuRVZFTlRfTE9HX1RBR1MpICQoZXZlbnRfbG9nX3RhZ3MpCisKK2lmZGVmIGV2ZW50X2xvZ190YWdzCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuRVZFTlRfTE9HX1RBR1MgOj0gXAorICAgICAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkVWRU5UX0xPR19UQUdTKSAkKGV2ZW50X2xvZ190YWdzKQorZW5kaWYKKwogQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NQUtFRklMRSA6PSBcCiAgICAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk1BS0VGSUxFKSAkKExPQ0FMX01PRFVMRV9NQUtFRklMRSkKKwogaWZkZWYgTE9DQUxfTU9EVUxFX09XTkVSCi1BTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk9XTkVSIDo9IFwKLSAgICAkKHNvcnQgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk9XTkVSKSAkKExPQ0FMX01PRFVMRV9PV05FUikpCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuT1dORVIgOj0gXAorICAgICAgJChzb3J0ICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5PV05FUikgJChMT0NBTF9NT0RVTEVfT1dORVIpKQogZW5kaWYKKwogaWZkZWYgTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWAogQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5GT1JfMk5EX0FSQ0ggOj0gdHJ1ZQogZW5kaWYKIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuRk9SX0hPU1RfQ1JPU1MgOj0gJChteV9ob3N0X2Nyb3NzKQotQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NT0RVTEVfTkFNRSA6PSAkKExPQ0FMX01PRFVMRSkKLUFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQ09NUEFUSUJJTElUWV9TVUlURVMgOj0gXAotICAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQ09NUEFUSUJJTElUWV9TVUlURVMpIFwKLSAgJChmaWx0ZXItb3V0ICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5DT01QQVRJQklMSVRZX1NVSVRFUyksJChMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFKSkKLUFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuVEVTVF9DT05GSUcgOj0gJCh0ZXN0X2NvbmZpZykKLUFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuRVhUUkFfVEVTVF9DT05GSUdTIDo9ICQoTE9DQUxfRVhUUkFfRlVMTF9URVNUX0NPTkZJR1MpCi1BTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlRFU1RfTUFJTkxJTkVfTU9EVUxFUyA6PSAkKExPQ0FMX1RFU1RfTUFJTkxJTkVfTU9EVUxFUykKIGlmbmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQotQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5GSUxFX0NPTlRFWFRTIDo9ICQoTE9DQUxfRklMRV9DT05URVhUUykKLWVuZGlmCi1pZmRlZiBMT0NBTF9JU19VTklUX1RFU1QKLUFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuSVNfVU5JVF9URVNUIDo9ICQoTE9DQUxfSVNfVU5JVF9URVNUKQotZW5kaWYKLWlmZGVmIExPQ0FMX1RFU1RfT1BUSU9OU19UQUdTCi1BTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlRFU1RfT1BUSU9OU19UQUdTIDo9ICQoTE9DQUxfVEVTVF9PUFRJT05TX1RBR1MpCitBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkFQRVhfS0VZU19GSUxFIDo9ICQoTE9DQUxfQVBFWF9LRVlfUEFUSCkKIGVuZGlmCiB0ZXN0X2NvbmZpZyA6PQogCiBJTlNUQUxMQUJMRV9GSUxFUy4kKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpLk1PRFVMRSA6PSAkKG15X3JlZ2lzdGVyX25hbWUpCiAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVHJhY2sgbW9kdWxlLWxldmVsIGRlcGVuZGVuY2llcy4KLSMgVXNlICQoTE9DQUxfTU9EVUxFKSBpbnN0ZWFkIG9mICQobXlfcmVnaXN0ZXJfbmFtZSkgdG8gaWdub3JlIG1vZHVsZSdzIGJpdG5lc3MuCi0jIChiLzIwNDM5NzE4MCkgVW5sb2NrIFJFQ09SRF9BTExfREVQUyB3YXMgYWNrbm93bGVkZ2VkIHJlYXNvbmFibGUgZm9yIGJldHRlciBBdGVzdCBwZXJmb3JtYW5jZS4KLUFMTF9ERVBTLk1PRFVMRVMgKz0gJChMT0NBTF9NT0RVTEUpCi1BTExfREVQUy4kKExPQ0FMX01PRFVMRSkuQUxMX0RFUFMgOj0gJChzb3J0IFwKLSAgJChBTExfREVQUy4kKExPQ0FMX01PRFVMRSkuQUxMX0RFUFMpIFwKLSAgJChMT0NBTF9TVEFUSUNfTElCUkFSSUVTKSBcCi0gICQoTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUykgXAotICAkKExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMpIFwKLSAgJChMT0NBTF9EWUxJQl9MSUJSQVJJRVMpIFwKLSAgJChMT0NBTF9STElCX0xJQlJBUklFUykgXAotICAkKExPQ0FMX1BST0NfTUFDUk9fTElCUkFSSUVTKSBcCi0gICQoTE9DQUxfSEVBREVSX0xJQlJBUklFUykgXAotICAkKExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUykgXAotICAkKExPQ0FMX0pBVkFfTElCUkFSSUVTKSBcCi0gICQoTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMpKQotCi1saWNlbnNlX2ZpbGVzIDo9ICQoY2FsbCBmaW5kLXBhcmVudC1maWxlLCQoTE9DQUxfUEFUSCksTU9EVUxFX0xJQ0VOU0UqKQotQUxMX0RFUFMuJChMT0NBTF9NT0RVTEUpLkxJQ0VOU0UgOj0gJChzb3J0ICQoQUxMX0RFUFMuJChMT0NBTF9NT0RVTEUpLkxJQ0VOU0UpICQobGljZW5zZV9maWxlcykpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyBUYWtlIGNhcmUgb2YgbXlfbW9kdWxlX3RhZ3MKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgS2VlcCB0cmFjayBvZiBhbGwgdGhlIHRhZ3Mgd2UndmUgc2Vlbi4KLUFMTF9NT0RVTEVfVEFHUyA6PSAkKHNvcnQgJChBTExfTU9EVUxFX1RBR1MpICQobXlfbW9kdWxlX3RhZ3MpKQotCi0jIEFkZCB0aGlzIG1vZHVsZSBuYW1lIHRvIHRoZSB0YWcgbGlzdCBvZiBlYWNoIHNwZWNpZmllZCB0YWcuCi0kKGZvcmVhY2ggdGFnLCQoZmlsdGVyLW91dCBvcHRpb25hbCwkKG15X21vZHVsZV90YWdzKSksXAotICAgICQoZXZhbCBBTExfTU9EVUxFX05BTUVfVEFHUy4kKHRhZykgOj0gJCQoQUxMX01PRFVMRV9OQU1FX1RBR1MuJCh0YWcpKSAkKG15X3JlZ2lzdGVyX25hbWUpKSkKLQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIHVtYnJlbGxhIHRhcmdldHMgdXNlZCB0byB2ZXJpZnkgYnVpbGRzCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMTIzMyw3ICsxMjc0LDcgQEAKIAogaWZkZWYgal9vcl9uCiAkKGpfb3JfbikgJChoX29yX3QpICQoal9vcl9uKS0kKGhfb3JfaGNfb3JfdCkgOiAkKG15X2NoZWNrZWRfbW9kdWxlKQotaWZuZXEgKCwkKGZpbHRlciAkKG15X21vZHVsZV90YWdzKSx0ZXN0cykpCitpZm5lcSAoLCQoZmlsdGVyICQoTE9DQUxfTU9EVUxFX1RBR1MpLHRlc3RzKSkKICQoal9vcl9uKS0kKGhfb3JfdCktdGVzdHMgJChqX29yX24pLXRlc3RzICQoaF9vcl90KS10ZXN0cyA6ICQobXlfY2hlY2tlZF9tb2R1bGUpCiBlbmRpZgogJChMT0NBTF9NT0RVTEUpLSQoaF9vcl9oY19vcl90KSA6ICQobXlfYWxsX3RhcmdldHMpCkBAIC0xMjQ0LDYgKzEyODUsOCBAQAogZW5kaWYKIGVuZGlmCiAKKyQoaWYgJChteV9yZWdpc3Rlcl9uYW1lKSwkKGV2YWwgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NQUtFX01PRFVMRV9UWVBFOj1iYXNlX3J1bGVzKSkKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgRW5zdXJlIHByaXZpbGVnZWQgYXBwbGljYXRpb25zIGFsd2F5cyBoYXZlIExPQ0FMX1BSSVZJTEVHRURfTU9EVUxFCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMTI2Miw0ICsxMzA1LDQgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBTQk9NIGdlbmVyYXRpb24KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1pbmNsdWRlICQoQlVJTERfU0JPTV9HRU4pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQoraW5jbHVkZSAkKEJVSUxEX1NCT01fR0VOKQpkaWZmIC0tZ2l0IGEvY29yZS9iaW5hcnkubWsgYi9jb3JlL2JpbmFyeS5tawppbmRleCA1NzllNmI1Li5lYTg2MmJlIDEwMDY0NAotLS0gYS9jb3JlL2JpbmFyeS5taworKysgYi9jb3JlL2JpbmFyeS5tawpAQCAtMTQ1LDE1ICsxNDUsMjEgQEAKIGlmbmVxICgsJChzdHJpcCAkKGZvcmVhY2ggZGlyLCQoTkFUSVZFX0NPVkVSQUdFX1BBVEhTKSwkKGZpbHRlciAkKGRpciklLCQoTE9DQUxfUEFUSCkpKSkpCiBpZmVxICgsJChzdHJpcCAkKGZvcmVhY2ggZGlyLCQoTkFUSVZFX0NPVkVSQUdFX0VYQ0xVREVfUEFUSFMpLCQoZmlsdGVyICQoZGlyKSUsJChMT0NBTF9QQVRIKSkpKSkKICAgbXlfbmF0aXZlX2NvdmVyYWdlIDo9IHRydWUKKyAgbXlfY2xhbmdfY292ZXJhZ2UgOj0gdHJ1ZQogZWxzZQogICBteV9uYXRpdmVfY292ZXJhZ2UgOj0gZmFsc2UKKyAgbXlfY2xhbmdfY292ZXJhZ2UgOj0gZmFsc2UKIGVuZGlmCiBlbHNlCiAgIG15X25hdGl2ZV9jb3ZlcmFnZSA6PSBmYWxzZQorICBteV9jbGFuZ19jb3ZlcmFnZSA6PSBmYWxzZQogZW5kaWYKIGlmbmVxICgkKE5BVElWRV9DT1ZFUkFHRSksdHJ1ZSkKICAgbXlfbmF0aXZlX2NvdmVyYWdlIDo9IGZhbHNlCiBlbmRpZgoraWZuZXEgKCQoQ0xBTkdfQ09WRVJBR0UpLHRydWUpCisgIG15X2NsYW5nX2NvdmVyYWdlIDo9IGZhbHNlCitlbmRpZgogCiAjIEV4Y2x1ZGUgZGlyZWN0b3JpZXMgZnJvbSBjaGVja2luZyBhbGxvd2VkIG1hbnVhbCBiaW5kZXIgaW50ZXJmYWNlIGxpc3RzLgogIyBUT0RPKGIvMTQ1NjIxNDc0KTogTW92ZSB0aGlzIGNoZWNrIGludG8gSUludGVyZmFjZS5oIHdoZW4gY2xhbmctdGlkeSBubyBsb25nZXIgdXNlcyBhYnNvbHV0ZSBwYXRocy4KQEAgLTE2OCw3ICsxNzQsNyBAQAogZW5kaWYKIGVuZGlmCiAKLW15X25ka19zeXNyb290X2luY2x1ZGUgOj0KK215X25ka19zeXNyb290IDo9CiBteV9uZGtfc3lzcm9vdF9saWIgOj0KIG15X2FwaV9sZXZlbCA6PSAxMDAwMAogCkBAIC0xOTksMTUgKzIwNSwxMSBAQAogICAgIG15X2FwaV9sZXZlbCA6PSAkKG15X25ka19hcGkpCiAgIGVuZGlmCiAKLSAgbXlfbmRrX3NvdXJjZV9yb290IDo9IFwKLSAgICAgICQoSElTVE9SSUNBTF9OREtfVkVSU0lPTlNfUk9PVCkvJChMT0NBTF9OREtfVkVSU0lPTikvc291cmNlcwogICBteV9idWlsdF9uZGsgOj0gJChTT09OR19PVVRfRElSKS9uZGsKICAgbXlfbmRrX3RyaXBsZSA6PSAkKCQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClUQVJHRVRfTkRLX1RSSVBMRSkKLSAgbXlfbmRrX3N5c3Jvb3RfaW5jbHVkZSA6PSBcCi0gICAgICAkKG15X2J1aWx0X25kaykvc3lzcm9vdC91c3IvaW5jbHVkZSBcCi0gICAgICAkKG15X2J1aWx0X25kaykvc3lzcm9vdC91c3IvaW5jbHVkZS8kKG15X25ka190cmlwbGUpIFwKKyAgbXlfbmRrX3N5c3Jvb3QgOj0gJChteV9idWlsdF9uZGspL3N5c3Jvb3QKIAotICBteV9uZGtfc3lzcm9vdF9saWIgOj0gJChteV9idWlsdF9uZGspL3N5c3Jvb3QvdXNyL2xpYi8kKG15X25ka190cmlwbGUpLyQobXlfbmRrX2FwaSkKKyAgbXlfbmRrX3N5c3Jvb3RfbGliIDo9ICQobXlfbmRrX3N5c3Jvb3QpL3Vzci9saWIvJChteV9uZGtfdHJpcGxlKS8kKG15X25ka19hcGkpCiAKICAgIyBUaGUgYmlvbmljIGxpbmtlciBub3cgaGFzIHN1cHBvcnQgZm9yIHBhY2tlZCByZWxvY2F0aW9ucyBhbmQgZ251IHN0eWxlCiAgICMgaGFzaGVzICh3aGljaCBhcmUgbXVjaCBmYXN0ZXIhKSwgYnV0IHNoaXBwaW5nIHRvIG9sZGVyIGRldmljZXMgcmVxdWlyZXMKQEAgLTIzMywxNiArMjM1LDE4IEBACiAgIGVuZGlmCiAKICAgaWZlcSAoc3lzdGVtLCQoTE9DQUxfTkRLX1NUTF9WQVJJQU5UKSkKKyAgICBteV9uZGtfc291cmNlX3Jvb3QgOj0gXAorICAgICAgICAkKEhJU1RPUklDQUxfTkRLX1ZFUlNJT05TX1JPT1QpLyQoTE9DQUxfTkRLX1ZFUlNJT04pL3NvdXJjZXMKICAgICBteV9uZGtfc3RsX2luY2x1ZGVfcGF0aCA6PSAkKG15X25ka19zb3VyY2Vfcm9vdCkvY3h4LXN0bC9zeXN0ZW0vaW5jbHVkZQogICAgIG15X3N5c3RlbV9zaGFyZWRfbGlicmFyaWVzICs9IGxpYnN0ZGMrKwogICBlbHNlIGlmbmVxICgsJChmaWx0ZXIgYysrXyUsICQoTE9DQUxfTkRLX1NUTF9WQVJJQU5UKSkpCi0gICAgbXlfbmRrX3N0bF9pbmNsdWRlX3BhdGggOj0gXAotICAgICAgJChteV9uZGtfc291cmNlX3Jvb3QpL2N4eC1zdGwvbGx2bS1saWJjKysvaW5jbHVkZQotICAgIG15X25ka19zdGxfaW5jbHVkZV9wYXRoICs9IFwKLSAgICAgICQobXlfbmRrX3NvdXJjZV9yb290KS9jeHgtc3RsL2xsdm0tbGliYysrYWJpL2luY2x1ZGUKKyAgICBteV9sbHZtX2RpciA6PSAkKExMVk1fUFJFQlVJTFRTX0JBU0UpLyQoQlVJTERfT1MpLXg4Ni8kKExMVk1fUFJFQlVJTFRTX1ZFUlNJT04pCisgICAgbXlfbGliY3h4X2FyY2hfZGlyIDo9ICQobXlfbGx2bV9kaXIpL2FuZHJvaWRfbGliYysrL25kay8kKCQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClQUkVCVUlMVF9MSUJDWFhfQVJDSF9ESVIpCiAKLSAgICBteV9saWJjeHhfbGliZGlyIDo9IFwKLSAgICAgICQobXlfbmRrX3NvdXJjZV9yb290KS9jeHgtc3RsL2xsdm0tbGliYysrL2xpYnMvJChteV9jcHVfdmFyaWFudCkKKyAgICAjIEluY2x1ZGUgdGhlIHRhcmdldC1zcGVjaWZpYyBfX2NvbmZpZ19zaXRlIGZpbGUgZm9sbG93ZWQgYnkgdGhlIGdlbmVyaWMgbGliYysrIGhlYWRlcnMuCisgICAgbXlfbmRrX3N0bF9pbmNsdWRlX3BhdGggOj0gJChteV9saWJjeHhfYXJjaF9kaXIpL2luY2x1ZGUvYysrL3YxCisgICAgbXlfbmRrX3N0bF9pbmNsdWRlX3BhdGggKz0gJChteV9sbHZtX2RpcikvaW5jbHVkZS9jKysvdjEKKyAgICBteV9saWJjeHhfbGliZGlyIDo9ICQobXlfbGliY3h4X2FyY2hfZGlyKS9saWIKIAogICAgIGlmZXEgKGMrK19zdGF0aWMsJChMT0NBTF9OREtfU1RMX1ZBUklBTlQpKQogICAgICAgbXlfbmRrX3N0bF9zdGF0aWNfbGliIDo9IFwKQEAgLTI1MiwxNCArMjU2LDcgQEAKICAgICAgIG15X25ka19zdGxfc2hhcmVkX2xpYl9mdWxscGF0aCA6PSAkKG15X2xpYmN4eF9saWJkaXIpL2xpYmMrK19zaGFyZWQuc28KICAgICBlbmRpZgogCi0gICAgaWZuZXEgKCQobXlfbmRrX2FwaSksY3VycmVudCkKLSAgICAgIGlmZXEgKCQoY2FsbCBtYXRoX2x0LCQobXlfbmRrX2FwaSksMjEpLHRydWUpCi0gICAgICAgIG15X25ka19zdGxfaW5jbHVkZV9wYXRoICs9ICQobXlfbmRrX3NvdXJjZV9yb290KS9hbmRyb2lkL3N1cHBvcnQvaW5jbHVkZQotICAgICAgICBteV9uZGtfc3RsX3N0YXRpY19saWIgKz0gJChteV9saWJjeHhfbGliZGlyKS9saWJhbmRyb2lkX3N1cHBvcnQuYQotICAgICAgZW5kaWYKLSAgICBlbmRpZgotCi0gICAgbXlfbmRrX3N0bF9zdGF0aWNfbGliICs9ICQobXlfbGliY3h4X2xpYmRpcikvbGlidW53aW5kLmEKKyAgICBteV9uZGtfc3RsX3N0YXRpY19saWIgKz0gJCgkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpVEFSR0VUX0xJQlVOV0lORCkKICAgICBteV9sZGxpYnMgKz0gLWxkbAogICBlbHNlICMgTE9DQUxfTkRLX1NUTF9WQVJJQU5UIG11c3QgYmUgbm9uZQogICAgICMgRG8gbm90aGluZy4KQEAgLTI3MCwxMCArMjY3LDE4IEBACiAgIGlmbmVxICgkKG15X25ka19hcGkpLGN1cnJlbnQpCiAgICAgaWZlcSAoJChjYWxsIG1hdGhfbHQsICQobXlfbmRrX2FwaSksMjMpLHRydWUpCiAgICAgICBteV9uYXRpdmVfY292ZXJhZ2UgOj0gZmFsc2UKKyAgICAgIG15X2NsYW5nX2NvdmVyYWdlIDo9IGZhbHNlCiAgICAgZW5kaWYKICAgZW5kaWYKIGVuZGlmCiAKK2lmbmVxICgkKExPQ0FMX01JTl9TREtfVkVSU0lPTiksKQorICBpZmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQorICAgICQoZXJyb3IgJChMT0NBTF9QQVRIKTogTE9DQUxfTUlOX1NES19WRVJTSU9OIGNhbm5vdCBiZSB1c2VkIGluIGhvc3QgbW9kdWxlKQorICBlbmRpZgorICBteV9hcGlfbGV2ZWwgOj0gJChMT0NBTF9NSU5fU0RLX1ZFUlNJT04pCitlbmRpZgorCiBpZmVxICgkKE5BVElWRV9DT1ZFUkFHRSksdHJ1ZSkKICAgaWZuZGVmIExPQ0FMX0lTX0hPU1RfTU9EVUxFCiAgICAgbXlfbGRmbGFncyArPSAtV2wsLS13cmFwLGdldGVudgpAQCAtMjg4LDI4ICsyOTMsNTUgQEAKICAgZW5kaWYKIGVuZGlmCiAKLWlmbmVxICgkKExPQ0FMX1VTRV9WTkRLKSwpCi0gICMgUmVxdWlyZWQgVk5ESyB2ZXJzaW9uIGZvciB2ZW5kb3IgbW9kdWxlcyBpcyBCT0FSRF9WTkRLX1ZFUlNJT04uCi0gIG15X2FwaV9sZXZlbCA6PSAkKEJPQVJEX1ZOREtfVkVSU0lPTikKLSAgaWZlcSAoJChteV9hcGlfbGV2ZWwpLGN1cnJlbnQpCi0gICAgIyBCdWlsZCB3aXRoIGN1cnJlbnQgUExBVEZPUk1fVk5ES19WRVJTSU9OLgotICAgICMgSWYgUExBVEZPUk1fVk5ES19WRVJTSU9OIGhhcyBhIENPREVOQU1FLCBpdCB3aWxsIHJldHVybgotICAgICMgX19BTkRST0lEX0FQSV9GVVRVUkVfXy4KLSAgICBteV9hcGlfbGV2ZWwgOj0gJChjYWxsIGNvZGVuYW1lLW9yLXNkay10by1zZGssJChQTEFURk9STV9WTkRLX1ZFUlNJT04pKQotICBlbHNlCi0gICAgIyBCdWlsZCB3aXRoIGN1cnJlbnQgQk9BUkRfVk5ES19WRVJTSU9OLgotICAgIG15X2FwaV9sZXZlbCA6PSAkKGNhbGwgY29kZW5hbWUtb3Itc2RrLXRvLXNkaywkKEJPQVJEX1ZOREtfVkVSU0lPTikpCitpZmVxICgkKENMQU5HX0NPVkVSQUdFKSx0cnVlKQorICBpZm5kZWYgTE9DQUxfSVNfSE9TVF9NT0RVTEUKKyAgICBteV9sZGZsYWdzICs9ICQoQ0xBTkdfQ09WRVJBR0VfSE9TVF9MREZMQUdTKQorICAgIGlmbmVxICgkKExPQ0FMX01PRFVMRV9DTEFTUyksU1RBVElDX0xJQlJBUklFUykKKyAgICAgIG15X3dob2xlX3N0YXRpY19saWJyYXJpZXMgKz0gbGliY2xhbmdfcnQucHJvZmlsZQorICAgICAgaWZlcSAoJChMT0NBTF9TREtfVkVSU0lPTiksKQorICAgICAgICBteV93aG9sZV9zdGF0aWNfbGlicmFyaWVzICs9IGxpYnByb2ZpbGUtY2xhbmctZXh0cmFzCisgICAgICBlbHNlCisgICAgICAgIG15X3dob2xlX3N0YXRpY19saWJyYXJpZXMgKz0gbGlicHJvZmlsZS1jbGFuZy1leHRyYXNfbmRrCisgICAgICBlbmRpZgorICAgIGVuZGlmCiAgIGVuZGlmCisgIGlmZXEgKCQobXlfY2xhbmdfY292ZXJhZ2UpLHRydWUpCisgICAgbXlfcHJvZmlsZV9pbnN0cl9nZW5lcmF0ZSA6PSAkKENMQU5HX0NPVkVSQUdFX0lOU1RSX1BST0ZJTEUpCisgICAgaWZlcSAoJChDTEFOR19DT1ZFUkFHRV9DT05USU5VT1VTX01PREUpLHRydWUpCisgICAgICBteV9jZmxhZ3MgKz0gJChDTEFOR19DT1ZFUkFHRV9DT05USU5VT1VTX0ZMQUdTKQorICAgICAgbXlfbGRmbGFncyArPSAkKENMQU5HX0NPVkVSQUdFX0NPTlRJTlVPVVNfRkxBR1MpCisgICAgZW5kaWYKKworICAgIG15X3Byb2ZpbGVfaW5zdHJfZ2VuZXJhdGUgKz0gJChDTEFOR19DT1ZFUkFHRV9DT05GSUdfQ09NTUZMQUdTKQorICAgIG15X2NmbGFncyArPSAkKENMQU5HX0NPVkVSQUdFX0lOU1RSX1BST0ZJTEUpICQoQ0xBTkdfQ09WRVJBR0VfQ09ORklHX0NGTEFHUykgJChDTEFOR19DT1ZFUkFHRV9DT05GSUdfQ09NTUZMQUdTKQorICAgIG15X2xkZmxhZ3MgKz0gJChDTEFOR19DT1ZFUkFHRV9DT05GSUdfQ09NTUZMQUdTKQorCisgICAgaWZuZXEgKCQoZmlsdGVyIGh3YWRkcmVzcywkKG15X3Nhbml0aXplKSksKQorICAgICAgbXlfY2ZsYWdzICs9ICQoQ0xBTkdfQ09WRVJBR0VfSFdBU0FOX0ZMQUdTKQorICAgICAgbXlfbGRmbGFncyArPSAkKENMQU5HX0NPVkVSQUdFX0hXQVNBTl9GTEFHUykKKyAgICBlbmRpZgorICBlbmRpZgorZW5kaWYKKworaWZuZXEgKCQoY2FsbCBtb2R1bGUtaW4tdmVuZG9yLW9yLXByb2R1Y3QpLCkKICAgbXlfY2ZsYWdzICs9IC1EX19BTkRST0lEX1ZOREtfXwotICBpZm5lcSAoJChMT0NBTF9VU0VfVk5ES19WRU5ET1IpLCkKLSAgICAjIFZlbmRvciBtb2R1bGVzIGhhdmUgTE9DQUxfVVNFX1ZOREtfVkVORE9SIHdoZW4KLSAgICAjIEJPQVJEX1ZOREtfVkVSU0lPTiBpcyBkZWZpbmVkLgorICBpZm5lcSAoJChMT0NBTF9JTl9WRU5ET1IpLCkKKyAgICAjIFZlbmRvciBtb2R1bGVzIGhhdmUgTE9DQUxfSU5fVkVORE9SCiAgICAgbXlfY2ZsYWdzICs9IC1EX19BTkRST0lEX1ZFTkRPUl9fCi0gIGVsc2UgaWZuZXEgKCQoTE9DQUxfVVNFX1ZOREtfUFJPRFVDVCksKQotICAgICMgUHJvZHVjdCBtb2R1bGVzIGhhdmUgTE9DQUxfVVNFX1ZOREtfUFJPRFVDVCB3aGVuCi0gICAgIyBQUk9EVUNUX1BST0RVQ1RfVk5ES19WRVJTSU9OIGlzIGRlZmluZWQuCisgIGVsc2UgaWZuZXEgKCQoTE9DQUxfSU5fUFJPRFVDVCksKQorICAgICMgUHJvZHVjdCBtb2R1bGVzIGhhdmUgTE9DQUxfSU5fUFJPRFVDVAogICAgIG15X2NmbGFncyArPSAtRF9fQU5EUk9JRF9QUk9EVUNUX18KICAgZW5kaWYKKworICAjIERlZmluZSBfX0FORFJPSURfVkVORE9SX0FQSV9fIGZvciBib3RoIHByb2R1Y3QgYW5kIHZlbmRvciB2YXJpYW50cyBiZWNhdXNlCisgICMgdGhleSBib3RoIHVzZSB0aGUgc2FtZSBMTE5ESyBsaWJyYXJpZXMuCisgIGlmZXEgKCQoQk9BUkRfQVBJX0xFVkVMKSwpCisgICAgIyBUT0RPKGIvMzE0MDM2ODQ3KTogVGhpcyBpcyBhIGZhbGxiYWNrIGZvciBVREMgdGFyZ2V0cy4KKyAgICAjIFRoaXMgbXVzdCBiZSBhIGJ1aWxkIGZhaWx1cmUgd2hlbiBVREMgaXMgbm8gbG9uZ2VyIGJ1aWx0IGZyb20gdGhpcyBzb3VyY2UgdHJlZS4KKyAgICBteV9jZmxhZ3MgKz0gLURfX0FORFJPSURfVkVORE9SX0FQSV9fPSQoUExBVEZPUk1fU0RLX1ZFUlNJT04pCisgIGVsc2UKKyAgICBteV9jZmxhZ3MgKz0gLURfX0FORFJPSURfVkVORE9SX0FQSV9fPSQoQk9BUkRfQVBJX0xFVkVMKQorICBlbmRpZgogZW5kaWYKIAogaWZuZGVmIExPQ0FMX0lTX0hPU1RfTU9EVUxFCkBAIC0zNTQsMTcgKzM4NiwxNSBAQAogIyBNaW5HVyBzcGl0cyBvdXQgd2FybmluZ3MgYWJvdXQgLWZQSUMgZXZlbiBmb3IgLWZwaWU/ISkgYmVpbmcgaWdub3JlZCBiZWNhdXNlCiAjIGFsbCBjb2RlIGlzIHBvc2l0aW9uIGluZGVwZW5kZW50LCBhbmQgdGhlbiB0aG9zZSB3YXJuaW5ncyBnZXQgcHJvbW90ZWQgdG8KICMgZXJyb3JzLgotaWZuZXEgKCQoTE9DQUxfTk9fUElDKSx0cnVlKQotICBpZm5lcSAoJChmaWx0ZXIgRVhFQ1VUQUJMRVMgTkFUSVZFX1RFU1RTLCQoTE9DQUxfTU9EVUxFX0NMQVNTKSksKQotICAgIG15X2NmbGFncyArPSAtZlBJRQotICAgIGlmbmRlZiBCVUlMRF9IT1NUX3N0YXRpYwotICAgICAgaWZuZXEgKCQoTE9DQUxfRk9SQ0VfU1RBVElDX0VYRUNVVEFCTEUpLHRydWUpCi0gICAgICAgIG15X2xkZmxhZ3MgKz0gLXBpZQotICAgICAgZW5kaWYKK2lmbmVxICgkKGZpbHRlciBFWEVDVVRBQkxFUyBOQVRJVkVfVEVTVFMsJChMT0NBTF9NT0RVTEVfQ0xBU1MpKSwpCisgIG15X2NmbGFncyArPSAtZlBJRQorICBpZm5kZWYgQlVJTERfSE9TVF9zdGF0aWMKKyAgICBpZm5lcSAoJChMT0NBTF9GT1JDRV9TVEFUSUNfRVhFQ1VUQUJMRSksdHJ1ZSkKKyAgICAgIG15X2xkZmxhZ3MgKz0gLXBpZQogICAgIGVuZGlmCi0gIGVsc2UKLSAgICBteV9jZmxhZ3MgKz0gLWZQSUMKICAgZW5kaWYKK2Vsc2UKKyAgbXlfY2ZsYWdzICs9IC1mUElDCiBlbmRpZgogCiBpZmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQpAQCAtNDQ0LDYgKzQ3NCwzNCBAQAogICAgIG15X2NmbGFncyArPSAkKENMQU5HX0VYVEVSTkFMX0NGTEFHUykKIGVuZGlmCiAKKyMgRXh0cmEgY2ZsYWdzIGZvciBwcm9qZWN0cyB1bmRlciBoYXJkd2FyZS8gZGlyZWN0b3J5LgorIyBUaGlzIHNob3VsZCBtYXRjaCB0aGUgZGVmaW5pdGlvbiBvZiBgdGhpcmRQYXJ0eURpclByZWZpeEV4Y2VwdGlvbnNgCisjIGluIGJ1aWxkL3Nvb25nL2FuZHJvaWQvcGF0aHMuZ28uCisjIEdldCB0aGUgc2Vjb25kIGVsZW1lbnQgb2YgTE9DQUxfUEFUSAoraWZuZXEgKCQoZmlsdGVyIGhhcmR3YXJlLyUsJChMT0NBTF9QQVRIKSksKQorICBteV9zdWJkaXIgOj0gJCh3b3JkIDIsJChzdWJzdCAvLCQoc3BhY2UpLCQoTE9DQUxfUEFUSCkpKQorICBtdXN0X2NvbXBpbGVfaGFyZHdhcmVfc3ViZGlycyA6PSBcCisgICAgICAgICAgICAgICAgICBoYXJkd2FyZS9nb29nbGUvJSBcCisgICAgICAgICAgICAgICAgICBoYXJkd2FyZS9pbnRlcmZhY2VzLyUgXAorICAgICAgICAgICAgICAgICAgaGFyZHdhcmUvbGliaGFyZHdhcmUvJSBcCisgICAgICAgICAgICAgICAgICBoYXJkd2FyZS9saWJoYXJkd2FyZV9sZWdhY3kvJSBcCisgICAgICAgICAgICAgICAgICBoYXJkd2FyZS9yaWwvJQorICBpZmVxICgkKGZpbHRlciAkKG11c3RfY29tcGlsZV9oYXJkd2FyZV9zdWJkaXJzKSwkKG15X3N1YmRpcikpLCkKKyAgICBteV9jZmxhZ3MgKz0gJChDTEFOR19FWFRFUk5BTF9DRkxBR1MpCisgIGVuZGlmCitlbmRpZgorCisjIEV4dHJhIGNmbGFncyBmb3IgcHJvamVjdHMgdW5kZXIgdmVuZG9yLyBkaXJlY3RvcnkuCisjIFRoaXMgc2hvdWxkIG1hdGNoIHRoZSBkZWZpbml0aW9uIG9mIGB0aGlyZFBhcnR5RGlyUHJlZml4RXhjZXB0aW9uc2AKKyMgaW4gYnVpbGQvc29vbmcvYW5kcm9pZC9wYXRocy5nby4KK2lmbmVxICgkKGZpbHRlciB2ZW5kb3IvJSwkKExPQ0FMX1BBVEgpKSwpCisgIG15X3N1YmRpciA6PSAkKHdvcmQgMiwkKHN1YnN0IC8sJChzcGFjZSksJChMT0NBTF9QQVRIKSkpCisgICMgRG8gbm90IGFkZCB0aGUgZmxhZ3MgZm9yIGFueSBzdWJkaXIgdGhhdCBjb250YWlucyB0aGUgc3RyaW5nICJnb29nbGUiLgorICBpZm5lcSAoJChmaW5kc3RyaW5nIGdvb2dsZSwkKG15X3N1YmRpcikpLCkKKyAgICBteV9jZmxhZ3MgKz0gJChDTEFOR19FWFRFUk5BTF9DRkxBR1MpCisgIGVuZGlmCitlbmRpZgorCiAjIGFyY2gtc3BlY2lmaWMgc3RhdGljIGxpYnJhcmllcyBnbyBmaXJzdCBzbyB0aGF0IGdlbmVyaWMgb25lcyBjYW4gZGVwZW5kIG9uIHRoZW0KIG15X3N0YXRpY19saWJyYXJpZXMgOj0gJChMT0NBTF9TVEFUSUNfTElCUkFSSUVTXyQoJChteV9wcmVmaXgpJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKUFSQ0gpKSAkKExPQ0FMX1NUQVRJQ19MSUJSQVJJRVNfJChteV8zMl82NF9iaXRfc3VmZml4KSkgJChteV9zdGF0aWNfbGlicmFyaWVzKQogbXlfd2hvbGVfc3RhdGljX2xpYnJhcmllcyA6PSAkKExPQ0FMX1dIT0xFX1NUQVRJQ19MSUJSQVJJRVNfJCgkKG15X3ByZWZpeCkkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpQVJDSCkpICQoTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFU18kKG15XzMyXzY0X2JpdF9zdWZmaXgpKSAkKG15X3dob2xlX3N0YXRpY19saWJyYXJpZXMpCkBAIC0xMTMxLDE0ICsxMTg5LDI1IEBACiBlbmRpZgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBXaGVuIGNvbXBpbGluZyBhIG1lbXRhZ19zdGFjayBlbmFibGVkIHRhcmdldCwgdXNlIHRoZSAubWVtdGFnX3N0YWNrIHZhcmlhbnQKKyMjIG9mIGFueSBzdGF0aWMgZGVwZW5kZW5jaWVzICh3aGVyZSB0aGV5IGV4aXN0KS4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWZuZXEgKCQoZmlsdGVyIG1lbXRhZ19zdGFjaywkKG15X3Nhbml0aXplKSksKQorICBteV93aG9sZV9zdGF0aWNfbGlicmFyaWVzIDo9ICQoY2FsbCB1c2Vfc29vbmdfc2FuaXRpemVkX3N0YXRpY19saWJyYXJpZXMsXAorICAgICQobXlfd2hvbGVfc3RhdGljX2xpYnJhcmllcyksbWVtdGFnX3N0YWNrKQorICBteV9zdGF0aWNfbGlicmFyaWVzIDo9ICQoY2FsbCB1c2Vfc29vbmdfc2FuaXRpemVkX3N0YXRpY19saWJyYXJpZXMsXAorICAgICQobXlfc3RhdGljX2xpYnJhcmllcyksbWVtdGFnX3N0YWNrKQorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgV2hlbiBjb21waWxpbmcgYWdhaW5zdCBBUEkgaW1wb3J0ZWQgbW9kdWxlLCB1c2UgQVBJIGltcG9ydCBzdHViCiAjIyBsaWJyYXJpZXMuCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogYXBpaW1wb3J0X3Bvc3RmaXggOj0gLmFwaWltcG9ydAogCi1pZm5lcSAoJChMT0NBTF9VU0VfVk5ESyksKQotICBpZmVxICgkKExPQ0FMX1VTRV9WTkRLX1BST0RVQ1QpLHRydWUpCitpZm5lcSAoJChjYWxsIG1vZHVsZS1pbi12ZW5kb3Itb3ItcHJvZHVjdCksKQorICBpZmVxICgkKExPQ0FMX0lOX1BST0RVQ1QpLHRydWUpCiAgICAgYXBpaW1wb3J0X3Bvc3RmaXggOj0gLmFwaWltcG9ydC5wcm9kdWN0CiAgIGVsc2UKICAgICBhcGlpbXBvcnRfcG9zdGZpeCA6PSAuYXBpaW1wb3J0LnZlbmRvcgpAQCAtMTE1NSwxNCArMTIyNCwxNCBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIFdoZW4gY29tcGlsaW5nIGFnYWluc3QgdGhlIFZOREssIHVzZSBMTC1OREsgbGlicmFyaWVzCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotaWZuZXEgKCQoTE9DQUxfVVNFX1ZOREspLCkKK2lmbmVxICgkKGNhbGwgbW9kdWxlLWluLXZlbmRvci1vci1wcm9kdWN0KSwpCiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICMjIFNvb25nIG1vZHVsZXMgbWF5IGJlIGJ1aWx0IHRocmVlIHRpbWVzLCBvbmNlIGZvcgogICAjIyAvc3lzdGVtLCBvbmNlIGZvciAvdmVuZG9yIGFuZCBvbmNlIGZvciAvcHJvZHVjdC4KICAgIyMgSWYgd2UncmUgdXNpbmcgdGhlIFZOREssIHN3aXRjaCBhbGwgc29vbmcKICAgIyMgbGlicmFyaWVzIG92ZXIgdG8gdGhlIC92ZW5kb3Igb3IgL3Byb2R1Y3QgdmFyaWFudC4KICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgaWZlcSAoJChMT0NBTF9VU0VfVk5ES19QUk9EVUNUKSx0cnVlKQorICBpZmVxICgkKExPQ0FMX0lOX1BST0RVQ1QpLHRydWUpCiAgICAgbXlfd2hvbGVfc3RhdGljX2xpYnJhcmllcyA6PSAkKGZvcmVhY2ggbCwkKG15X3dob2xlX3N0YXRpY19saWJyYXJpZXMpLFwKICAgICAgICQoaWYgJChTUExJVF9QUk9EVUNULlNUQVRJQ19MSUJSQVJJRVMuJChsKSksJChsKS5wcm9kdWN0LCQobCkpKQogICAgIG15X3N0YXRpY19saWJyYXJpZXMgOj0gJChmb3JlYWNoIGwsJChteV9zdGF0aWNfbGlicmFyaWVzKSxcCkBAIC0xMTg5LDcgKzEyNTgsNyBAQAogCiAjIFBsYXRmb3JtIGNhbiB1c2UgdmVuZG9yIHB1YmxpYyBsaWJyYXJpZXMuIElmIGEgcmVxdWlyZWQgc2hhcmVkIGxpYiBpcyBvbmUgb2YKICMgdGhlIHZlbmRvciBwdWJsaWMgbGlicmFyaWVzLCB0aGUgbGliIGlzIHN3aXRjaGVkIHRvIHRoZSBzdHViIHZlcnNpb24gb2YgdGhlIGxpYi4KLWlmZXEgKCQoTE9DQUxfVVNFX1ZOREspLCkKK2lmZXEgKCQoY2FsbCBtb2R1bGUtaW4tdmVuZG9yLW9yLXByb2R1Y3QpLCkKICAgbXlfc2hhcmVkX2xpYnJhcmllcyA6PSAkKGZvcmVhY2ggbCwkKG15X3NoYXJlZF9saWJyYXJpZXMpLFwKICAgICAkKGlmICQoZmlsdGVyICQobCksJChWRU5ET1JfUFVCTElDX0xJQlJBUklFUykpLCQobCkudmVuZG9ycHVibGljLCQobCkpKQogZW5kaWYKQEAgLTEyNDEsNyArMTMxMCw3IEBACiBteV9saW5rX3R5cGUgOj0gbmF0aXZlOm5kazokKG15X25ka19zdGxfZmFtaWx5KTokKG15X25ka19zdGxfbGlua190eXBlKQogbXlfd2Fybl90eXBlcyA6PSAkKG15X3dhcm5fbmRrX3R5cGVzKQogbXlfYWxsb3dlZF90eXBlcyA6PSAkKG15X2FsbG93ZWRfbmRrX3R5cGVzKQotZWxzZSBpZmRlZiBMT0NBTF9VU0VfVk5ESworZWxzZSBpZmVxICgkKGNhbGwgbW9kdWxlLWluLXZlbmRvci1vci1wcm9kdWN0KSx0cnVlKQogICAgIF9uYW1lIDo9ICQocGF0c3Vic3QgJS52ZW5kb3IsJSwkKExPQ0FMX01PRFVMRSkpCiAgICAgX25hbWUgOj0gJChwYXRzdWJzdCAlLnByb2R1Y3QsJSwkKExPQ0FMX01PRFVMRSkpCiAgICAgaWZuZXEgKCQoZmlsdGVyICQoX25hbWUpLCQoVk5ES19DT1JFX0xJQlJBUklFUykgJChWTkRLX1NBTUVQUk9DRVNTX0xJQlJBUklFUykgJChMTE5ES19MSUJSQVJJRVMpKSwpCkBAIC0xMjUyLDcgKzEzMjEsNyBAQAogICAgICAgICBlbmRpZgogICAgICAgICBteV93YXJuX3R5cGVzIDo9CiAgICAgICAgIG15X2FsbG93ZWRfdHlwZXMgOj0gbmF0aXZlOnZuZGsgbmF0aXZlOnZuZGtfcHJpdmF0ZQotICAgIGVsc2UgaWZlcSAoJChMT0NBTF9VU0VfVk5ES19QUk9EVUNUKSx0cnVlKQorICAgIGVsc2UgaWZlcSAoJChMT0NBTF9JTl9QUk9EVUNUKSx0cnVlKQogICAgICAgICAjIE1vZHVsZXMgaW5zdGFsbGVkIHRvIC9wcm9kdWN0IGNhbm5vdCBkaXJlY3RseSBkZXBlbmQgb24gbW9kdWxlcyBtYXJrZWQKICAgICAgICAgIyB3aXRoIHZlbmRvcl9hdmFpbGFibGU6IGZhbHNlCiAgICAgICAgIG15X2xpbmtfdHlwZSA6PSBuYXRpdmU6cHJvZHVjdApAQCAtMTI3Niw2ICsxMzQ1LDggQEAKIG15X2FsbG93ZWRfdHlwZXMgOj0gJChteV9hbGxvd2VkX25ka190eXBlcykgbmF0aXZlOnBsYXRmb3JtIG5hdGl2ZTpwbGF0Zm9ybV92bmRrCiBlbmRpZgogCitBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLldIT0xFX1NUQVRJQ19MSUJTIDo9ICQobXlfd2hvbGVfc3RhdGljX2xpYnJhcmllcykKKwogbXlfbGlua19kZXBzIDo9ICQoYWRkcHJlZml4IFNUQVRJQ19MSUJSQVJJRVM6LCQobXlfd2hvbGVfc3RhdGljX2xpYnJhcmllcykgJChteV9zdGF0aWNfbGlicmFyaWVzKSkKIGlmbmVxICgkKGZpbHRlci1vdXQgU1RBVElDX0xJQlJBUklFUyBIRUFERVJfTElCUkFSSUVTLCQoTE9DQUxfTU9EVUxFX0NMQVNTKSksKQogbXlfbGlua19kZXBzICs9ICQoYWRkcHJlZml4IFNIQVJFRF9MSUJSQVJJRVM6LCQobXlfc2hhcmVkX2xpYnJhcmllcykpCkBAIC0xNDM3LDE3ICsxNTA4LDYgQEAKICAgICAgICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsIFwKICAgICAgICAgU1RBVElDX0xJQlJBUklFUywkKGxpYiksJChteV9raW5kKSwsJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKSwkKG15X2hvc3RfY3Jvc3MpKS8kKGxpYikkKGFfc3VmZml4KSkKIAotIyBXZSBkb24ndCBjYXJlIGFib3V0IGluc3RhbGxlZCBzdGF0aWMgbGlicmFyaWVzLCBzaW5jZSB0aGUKLSMgbGlicmFyaWVzIGhhdmUgYWxyZWFkeSBiZWVuIGxpbmtlZCBpbnRvIHRoZSBtb2R1bGUgYXQgdGhhdCBwb2ludC4KLSMgV2UgZG8sIGhvd2V2ZXIsIGNhcmUgYWJvdXQgdGhlIE5PVElDRSBmaWxlcyBmb3IgYW55IHN0YXRpYwotIyBsaWJyYXJpZXMgdGhhdCB3ZSB1c2UuIChzZWUgbm90aWNlX2ZpbGVzLm1rKQotaW5zdGFsbGVkX3N0YXRpY19saWJyYXJ5X25vdGljZV9maWxlX3RhcmdldHMgOj0gXAotICAgICQoZm9yZWFjaCBsaWIsJChteV9zdGF0aWNfbGlicmFyaWVzKSAkKG15X3dob2xlX3N0YXRpY19saWJyYXJpZXMpLCBcCi0gICAgICBOT1RJQ0UtJChpZiAkKExPQ0FMX0lTX0hPU1RfTU9EVUxFKSxIT1NUJChpZiAkKG15X2hvc3RfY3Jvc3MpLF9DUk9TUywpLFRBUkdFVCktU1RBVElDX0xJQlJBUklFUy0kKGxpYikpCi0KLSQobm90aWNlX3RhcmdldCk6IHwgJChpbnN0YWxsZWRfc3RhdGljX2xpYnJhcnlfbm90aWNlX2ZpbGVfdGFyZ2V0cykKLSQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSk6IHwgJChub3RpY2VfdGFyZ2V0KQotCiAjIERlZmF1bHQgaXMgLWZuby1ydHRpLgogaWZlcSAoJChzdHJpcCAkKExPQ0FMX1JUVElfRkxBRykpLCkKIExPQ0FMX1JUVElfRkxBRyA6PSAtZm5vLXJ0dGkKQEAgLTE1NjYsMjQgKzE2MjYsNiBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIGlmbmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQogCi1pZmRlZiBMT0NBTF9VU0VfVk5ESwotICBteV90YXJnZXRfZ2xvYmFsX2NfaW5jbHVkZXMgOj0KLSAgbXlfdGFyZ2V0X2dsb2JhbF9jX3N5c3RlbV9pbmNsdWRlcyA6PSAkKFRBUkdFVF9PVVRfSEVBREVSUykKLWVsc2UgaWZkZWYgTE9DQUxfU0RLX1ZFUlNJT04KLSAgbXlfdGFyZ2V0X2dsb2JhbF9jX2luY2x1ZGVzIDo9Ci0gIG15X3RhcmdldF9nbG9iYWxfY19zeXN0ZW1faW5jbHVkZXMgOj0gJChteV9uZGtfc3RsX2luY2x1ZGVfcGF0aCkgJChteV9uZGtfc3lzcm9vdF9pbmNsdWRlKQotZWxzZSBpZmRlZiBCT0FSRF9WTkRLX1ZFUlNJT04KLSAgbXlfdGFyZ2V0X2dsb2JhbF9jX2luY2x1ZGVzIDo9ICQoU1JDX0hFQURFUlMpIFwKLSAgICAkKCQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWCkkKG15X3ByZWZpeClDX0lOQ0xVREVTKQotICBteV90YXJnZXRfZ2xvYmFsX2Nfc3lzdGVtX2luY2x1ZGVzIDo9ICQoU1JDX1NZU1RFTV9IRUFERVJTKSBcCi0gICAgJCgkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpJChteV9wcmVmaXgpQ19TWVNURU1fSU5DTFVERVMpCi1lbHNlCi0gIG15X3RhcmdldF9nbG9iYWxfY19pbmNsdWRlcyA6PSAkKFNSQ19IRUFERVJTKSBcCi0gICAgJCgkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpJChteV9wcmVmaXgpQ19JTkNMVURFUykKLSAgbXlfdGFyZ2V0X2dsb2JhbF9jX3N5c3RlbV9pbmNsdWRlcyA6PSAkKFNSQ19TWVNURU1fSEVBREVSUykgJChUQVJHRVRfT1VUX0hFQURFUlMpIFwKLSAgICAkKCQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWCkkKG15X3ByZWZpeClDX1NZU1RFTV9JTkNMVURFUykKLWVuZGlmCi0KIG15X3RhcmdldF9nbG9iYWxfY2ZsYWdzIDo9ICQoJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKUNMQU5HXyQobXlfcHJlZml4KUdMT0JBTF9DRkxBR1MpCiBteV90YXJnZXRfZ2xvYmFsX2Nvbmx5ZmxhZ3MgOj0gJCgkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpQ0xBTkdfJChteV9wcmVmaXgpR0xPQkFMX0NPTkxZRkxBR1MpICQobXlfY19zdGRfY29ubHlmbGFncykKIG15X3RhcmdldF9nbG9iYWxfY3BwZmxhZ3MgOj0gJCgkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpQ0xBTkdfJChteV9wcmVmaXgpR0xPQkFMX0NQUEZMQUdTKSAkKG15X2NwcF9zdGRfY3BwZmxhZ3MpCkBAIC0xNTk5LDYgKzE2NDEsMjIgQEAKICAgbXlfdGFyZ2V0X2dsb2JhbF9sZGZsYWdzIDo9ICQoJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKUNMQU5HXyQobXlfcHJlZml4KUdMT0JBTF9MREZMQUdTKQogZW5kaWYgIyBteV91c2VfY2xhbmdfbGxkCiAKK2lmZXEgKCQoY2FsbCBtb2R1bGUtaW4tdmVuZG9yLW9yLXByb2R1Y3QpLHRydWUpCisgIG15X3RhcmdldF9nbG9iYWxfY19pbmNsdWRlcyA6PQorICBteV90YXJnZXRfZ2xvYmFsX2Nfc3lzdGVtX2luY2x1ZGVzIDo9ICQoVEFSR0VUX09VVF9IRUFERVJTKQorICBteV90YXJnZXRfZ2xvYmFsX2NmbGFncyArPSAtbm9zdGRsaWJpbmMKK2Vsc2UgaWZkZWYgTE9DQUxfU0RLX1ZFUlNJT04KKyAgbXlfdGFyZ2V0X2dsb2JhbF9jX2luY2x1ZGVzIDo9CisgIG15X3RhcmdldF9nbG9iYWxfY19zeXN0ZW1faW5jbHVkZXMgOj0gJChteV9uZGtfc3RsX2luY2x1ZGVfcGF0aCkKKyAgbXlfdGFyZ2V0X2dsb2JhbF9jZmxhZ3MgKz0gLS1zeXNyb290ICQobXlfbmRrX3N5c3Jvb3QpCitlbHNlCisgIG15X3RhcmdldF9nbG9iYWxfY19pbmNsdWRlcyA6PSAkKFNSQ19IRUFERVJTKSBcCisgICAgJCgkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpJChteV9wcmVmaXgpQ19JTkNMVURFUykKKyAgbXlfdGFyZ2V0X2dsb2JhbF9jX3N5c3RlbV9pbmNsdWRlcyA6PSAkKFNSQ19TWVNURU1fSEVBREVSUykgXAorICAgICQoJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKSQobXlfcHJlZml4KUNfU1lTVEVNX0lOQ0xVREVTKQorICBteV90YXJnZXRfZ2xvYmFsX2NmbGFncyArPSAtbm9zdGRsaWJpbmMKK2VuZGlmCisKIG15X3RhcmdldF90cmlwbGUgOj0gJCgkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpQ0xBTkdfJChteV9wcmVmaXgpVFJJUExFKQogaWZuZGVmIExPQ0FMX0lTX0hPU1RfTU9EVUxFCiAgIG15X3RhcmdldF90cmlwbGVfZmxhZyA6PSAtdGFyZ2V0ICQobXlfdGFyZ2V0X3RyaXBsZSkkKG15X2FwaV9sZXZlbCkKQEAgLTE2NjUsMTYgKzE3MjMsMTAgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIGltcG9ydGVkX2luY2x1ZGVzIDo9CiAKLWlmZGVmIExPQ0FMX1VTRV9WTkRLCitpZmVxICh0cnVlLCQoY2FsbCBtb2R1bGUtaW4tdmVuZG9yLW9yLXByb2R1Y3QpKQogICBpbXBvcnRlZF9pbmNsdWRlcyArPSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEhFQURFUl9MSUJSQVJJRVMsZGV2aWNlX2tlcm5lbF9oZWFkZXJzLCQobXlfa2luZCksLCQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWCksJChteV9ob3N0X2Nyb3NzKSkKLWVsc2UgaWZkZWYgTE9DQUxfU0RLX1ZFUlNJT04KLSAgIyBBcHBzIHNob3VsZG4ndCBuZWVkIGRldmljZS1zcGVjaWZpYyBrZXJuZWwgaGVhZGVycwotZWxzZSBpZmRlZiBCT0FSRF9WTkRLX1ZFUlNJT04KLSAgIyBGb3IgZGV2aWNlcyBidWlsZGluZyB3aXRoIHRoZSBWTkRLLCBvbmx5IHRoZSBWTkRLIGdldHMgZGV2aWNlLXNwZWNpZmljIGtlcm5lbCBoZWFkZXJzIGJ5IGRlZmF1bHQKLSAgIyBJbiBzb29uZywgaXQncyBlbnRpcmVseSBvcHQtaW4KIGVsc2UKLSAgIyBGb3Igb2xkZXIgbm9uLVZOREsgYnVpbGRzLCBjb250aW51ZSBhZGRpbmcgaW4ga2VybmVsIGhlYWRlcnMgdG8gZXZlcnl0aGluZyBsaWtlIHdlIHVzZWQgdG8KLSAgaW1wb3J0ZWRfaW5jbHVkZXMgKz0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixIRUFERVJfTElCUkFSSUVTLGRldmljZV9rZXJuZWxfaGVhZGVycywkKG15X2tpbmQpLCwkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpLCQobXlfaG9zdF9jcm9zcykpCisgICMgZXZlcnl0aGluZyBlbHNlIHNob3VsZCBtYW51YWxseSBzcGVjaWZ5IGhlYWRlcnMKIGVuZGlmCiAKIGltcG9ydGVkX2luY2x1ZGVzIDo9ICQoc3RyaXAgXApkaWZmIC0tZ2l0IGEvY29yZS9ib2FyZF9jb25maWcubWsgYi9jb3JlL2JvYXJkX2NvbmZpZy5tawppbmRleCBmYWU3YWFhLi4xNmNmODYzIDEwMDY0NAotLS0gYS9jb3JlL2JvYXJkX2NvbmZpZy5taworKysgYi9jb3JlL2JvYXJkX2NvbmZpZy5tawpAQCAtMjcsNiArMjcsNyBAQAogX2JvYXJkX3N0cmlwX3JlYWRvbmx5X2xpc3QgKz0gQk9BUkRfS0VSTkVMX0NNRExJTkUKIF9ib2FyZF9zdHJpcF9yZWFkb25seV9saXN0ICs9IEJPQVJEX0JPT1RfSEVBREVSX1ZFUlNJT04KIF9ib2FyZF9zdHJpcF9yZWFkb25seV9saXN0ICs9IEJPQVJEX0JPT1RDT05GSUcKK19ib2FyZF9zdHJpcF9yZWFkb25seV9saXN0ICs9IEJPQVJEX0JPT1RDT05GSUdfRklMRQogX2JvYXJkX3N0cmlwX3JlYWRvbmx5X2xpc3QgKz0gQk9BUkRfS0VSTkVMX0JBU0UKIF9ib2FyZF9zdHJpcF9yZWFkb25seV9saXN0ICs9IEJPQVJEX1VTRVNfR0VORVJJQ19BVURJTwogX2JvYXJkX3N0cmlwX3JlYWRvbmx5X2xpc3QgKz0gQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09UCkBAIC0xNDQsOSArMTQ1LDYgQEAKIF9ib2FyZF9zdHJpcF9saXN0ICs9IEJPQVJEX0FWQl9QVk1GV19BTEdPUklUSE0KIF9ib2FyZF9zdHJpcF9saXN0ICs9IEJPQVJEX0FWQl9QVk1GV19ST0xMQkFDS19JTkRFWF9MT0NBVElPTgogX2JvYXJkX3N0cmlwX2xpc3QgKz0gQk9BUkRfUEFSVElBTF9PVEFfVVBEQVRFX1BBUlRJVElPTlNfTElTVAotX2JvYXJkX3N0cmlwX2xpc3QgKz0gQk9BUkRfQlBUX0RJU0tfU0laRQotX2JvYXJkX3N0cmlwX2xpc3QgKz0gQk9BUkRfQlBUX0lOUFVUX0ZJTEVTCi1fYm9hcmRfc3RyaXBfbGlzdCArPSBCT0FSRF9CUFRfTUFLRV9UQUJMRV9BUkdTCiBfYm9hcmRfc3RyaXBfbGlzdCArPSBCT0FSRF9BVkJfVkJNRVRBX1ZFTkRPUl9ST0xMQkFDS19JTkRFWF9MT0NBVElPTgogX2JvYXJkX3N0cmlwX2xpc3QgKz0gQk9BUkRfQVZCX1ZCTUVUQV9WRU5ET1JfQUxHT1JJVEhNCiBfYm9hcmRfc3RyaXBfbGlzdCArPSBCT0FSRF9BVkJfVkJNRVRBX1ZFTkRPUl9LRVlfUEFUSApAQCAtMTY0LDkgKzE2Miw2IEBACiBfYm9hcmRfc3RyaXBfbGlzdCArPSBCT0FSRF9BVkJfVkVORE9SX0tFUk5FTF9CT09UX0tFWV9QQVRICiBfYm9hcmRfc3RyaXBfbGlzdCArPSBCT0FSRF9BVkJfVkVORE9SX0tFUk5FTF9CT09UX0FMR09SSVRITQogX2JvYXJkX3N0cmlwX2xpc3QgKz0gQk9BUkRfQVZCX1ZFTkRPUl9LRVJORUxfQk9PVF9ST0xMQkFDS19JTkRFWF9MT0NBVElPTgotX2JvYXJkX3N0cmlwX2xpc3QgKz0gQk9BUkRfR0tJX1NJR05JTkdfU0lHTkFUVVJFX0FSR1MKLV9ib2FyZF9zdHJpcF9saXN0ICs9IEJPQVJEX0dLSV9TSUdOSU5HX0FMR09SSVRITQotX2JvYXJkX3N0cmlwX2xpc3QgKz0gQk9BUkRfR0tJX1NJR05JTkdfS0VZX1BBVEgKIF9ib2FyZF9zdHJpcF9saXN0ICs9IEJPQVJEX01LQk9PVElNR19BUkdTCiBfYm9hcmRfc3RyaXBfbGlzdCArPSBCT0FSRF9WRU5ET1JfQk9PVElNQUdFX1BBUlRJVElPTl9TSVpFCiBfYm9hcmRfc3RyaXBfbGlzdCArPSBCT0FSRF9WRU5ET1JfS0VSTkVMX0JPT1RJTUFHRV9QQVJUSVRJT05fU0laRQpAQCAtMTg4LDkgKzE4MywxMSBAQAogICBCVUlMRF9CUk9LRU5fUFJFQlVJTFRfRUxGX0ZJTEVTIFwKICAgQlVJTERfQlJPS0VOX1RSRUJMRV9TWVNQUk9QX05FVkVSQUxMT1cgXAogICBCVUlMRF9CUk9LRU5fVVNFU19ORVRXT1JLIFwKLSAgQlVJTERfQlJPS0VOX1VTRVNfU09PTkdfUFlUSE9OMl9NT0RVTEVTIFwKICAgQlVJTERfQlJPS0VOX1ZFTkRPUl9QUk9QRVJUWV9OQU1FU1BBQ0UgXAogICBCVUlMRF9CUk9LRU5fVklOVEZfUFJPRFVDVF9DT1BZX0ZJTEVTIFwKKyAgQlVJTERfQlJPS0VOX0lOQ09SUkVDVF9QQVJUSVRJT05fSU1BR0VTIFwKKyAgQlVJTERfQlJPS0VOX0dFTlJVTEVfU0FOREJPWElORyBcCisgIEJVSUxEX0JST0tFTl9ET05UX0NIRUNLX1NZU1RFTVNESyBcCiAKIF9idWlsZF9icm9rZW5fdmFyX2xpc3QgKz0gXAogICAkKGZvcmVhY2ggbSwkKEFWQUlMQUJMRV9CVUlMRF9NT0RVTEVfVFlQRVMpIFwKQEAgLTIwNCw3ICsyMDEsNyBAQAogCiAjIENvbmRpdGlvbmFsIHRvIGJ1aWxkaW5nIG9uIGxpbnV4LCBhcyBkZXgyb2F0IGN1cnJlbnRseSBkb2VzIG5vdCB3b3JrIG9uIGRhcndpbi4KIGlmZXEgKCQoSE9TVF9PUyksbGludXgpCi0gIFdJVEhfREVYUFJFT1BUIDo9IHRydWUKKyAgV0lUSF9ERVhQUkVPUFQgPz0gdHJ1ZQogZW5kaWYKIAogIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTIyNiw2ICsyMjMsOSBAQAogICBib2FyZF9jb25maWdfbWsgOj0gXAogICAgICQoc3RyaXAgJChzb3J0ICQod2lsZGNhcmQgXAogICAgICAgJChTUkNfVEFSR0VUX0RJUikvYm9hcmQvJChUQVJHRVRfREVWSUNFKS9Cb2FyZENvbmZpZy5tayBcCisgICAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9ib2FyZC8kKFRBUkdFVF9ERVZJQ0UpL0JvYXJkQ29uZmlnLm1rIFwKKyAgICAgIGRldmljZS9nb29nbGUvY3V0dGxlZmlzaC9ib2FyZC8kKFRBUkdFVF9ERVZJQ0UpL0JvYXJkQ29uZmlnLm1rIFwKKyAgICAgIHZlbmRvci9nb29nbGUvcHJvZHVjdHMvY3V0dGxlZmlzaC9waXhlbF93YXRjaC9ib2FyZC8kKFRBUkdFVF9ERVZJQ0UpL0JvYXJkQ29uZmlnLm1rIFwKICAgICAgICQoc2hlbGwgdGVzdCAtZCBkZXZpY2UgJiYgZmluZCAtTCBkZXZpY2UgLW1heGRlcHRoIDQgLXBhdGggJyovJChUQVJHRVRfREVWSUNFKS9Cb2FyZENvbmZpZy5taycpIFwKICAgICAgICQoc2hlbGwgdGVzdCAtZCB2ZW5kb3IgJiYgZmluZCAtTCB2ZW5kb3IgLW1heGRlcHRoIDQgLXBhdGggJyovJChUQVJHRVRfREVWSUNFKS9Cb2FyZENvbmZpZy5taycpIFwKICAgICApKSkKQEAgLTIzOSw2ICsyMzksNyBAQAogICAuS0FUSV9SRUFET05MWSA6PSBUQVJHRVRfREVWSUNFX0RJUgogZW5kaWYKIAorJChjYWxsIGR1bXAtcGhhc2Utc3RhcnQsQk9BUkQsLCwsIGJ1aWxkL21ha2UvY29yZS9ib2FyZF9jb25maWcubWspCiBpZm5kZWYgUkJDX1BST0RVQ1RfQ09ORklHCiBpbmNsdWRlICQoYm9hcmRfY29uZmlnX21rKQogZWxzZQpAQCAtMjU2LDEzICsyNTcsMTQgQEAKICAgZW5kaWYKIAogICAkKHNoZWxsIGJ1aWxkL3Nvb25nL3NjcmlwdHMvdXBkYXRlX291dCAkKE9VVF9ESVIpL3JiYy9yYmNfYm9hcmRfY29uZmlnX3Jlc3VsdHMubWsgXAotICAgICQoT1VUX0RJUikvcmJjcnVuIFJCQ19PVVQ9Im1ha2UiICQoT1VUX0RJUikvcmJjL2JvYXJkbGF1bmNoZXIucmJjKQorICAgICQoT1VUX0RJUikvcmJjcnVuIC0tbW9kZT1yYmMgJChPVVRfRElSKS9yYmMvYm9hcmRsYXVuY2hlci5yYmMpCiAgIGlmbmVxICgkKC5TSEVMTFNUQVRVUyksMCkKICAgICAkKGVycm9yIGJvYXJkIGNvbmZpZ3VyYXRpb24gcnVubmVyIGZhaWxlZDogJCguU0hFTExTVEFUVVMpKQogICBlbmRpZgogCiAgIGluY2x1ZGUgJChPVVRfRElSKS9yYmMvcmJjX2JvYXJkX2NvbmZpZ19yZXN1bHRzLm1rCiBlbmRpZgorJChjYWxsIGR1bXAtcGhhc2UtZW5kLCBidWlsZC9tYWtlL2NvcmUvYm9hcmRfY29uZmlnLm1rKQogCiBpZm5lcSAoLCQoYW5kICQoVEFSR0VUX0FSQ0gpLCQoVEFSR0VUX0FSQ0hfU1VJVEUpKSkKICAgJChlcnJvciAkKGJvYXJkX2NvbmZpZ19taykgZXJyb25lb3VzbHkgc2V0cyBib3RoIFRBUkdFVF9BUkNIIGFuZCBUQVJHRVRfQVJDSF9TVUlURSkKQEAgLTI3Niw3ICsyNzgsNyBAQAogCiBpZm5lcSAoJChNQUxMT0NfSU1QTCksKQogICAkKHdhcm5pbmcgKioqIFVuc3VwcG9ydGVkIG9wdGlvbiBNQUxMT0NfSU1QTCBkZWZpbmVkIGJ5IGJvYXJkIGNvbmZpZzogJChib2FyZF9jb25maWdfbWspLikKLSAgJChlcnJvciBVc2UgYE1BTExPQ19TVkVMVEUgOj0gdHJ1ZWAgdG8gY29uZmlndXJlIGplbWFsbG9jIGZvciBsb3ctbWVtb3J5KQorICAkKGVycm9yIFVzZSBgTUFMTE9DX0xPV19NRU1PUlkgOj0gdHJ1ZWAgdG8gdXNlIGxvdy1tZW1vcnkgYWxsb2NhdG9yIGNvbmZpZykKIGVuZGlmCiBib2FyZF9jb25maWdfbWsgOj0KIApAQCAtMjg4LDYgKzI5MCwxMSBAQAogICAgICQoZXJyb3IgVmFsaWQgdmFsdWVzIG9mICQodmFyKSBhcmUgInRydWUiLCAiZmFsc2UiLCBhbmQgIiIuIE5vdCAiJCgkKHZhcikpIikpKQogCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9ib2FyZF9jb25maWdfd2lmaS5taworaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYm9hcmRfY29uZmlnX3dwYV9zdXBwbGljYW50Lm1rCisKKyMgU2V0IHVwIHNvb25nIGNvbmZpZyBmb3IgInNvb25nX2NvbmZpZ192YWx1ZV92YXJpYWJsZSIuCistaW5jbHVkZSBoYXJkd2FyZS9pbnRlcmZhY2VzL2NvbmZpZ3N0b3JlLzEuMS9kZWZhdWx0L3N1cmZhY2VmbGluZ2VyLm1rCistaW5jbHVkZSB2ZW5kb3IvZ29vZ2xlL2J1aWxkL3Nvb25nL3Nvb25nX2NvbmZpZ19uYW1lc3BhY2UvY2FtZXJhLm1rCiAKICMgRGVmYXVsdCAqX0NQVV9WQVJJQU5UX1JVTlRJTUUgdG8gQ1BVX1ZBUklBTlQgaWYgdW5zcGVjaWZpZWQuCiBUQVJHRVRfQ1BVX1ZBUklBTlRfUlVOVElNRSA6PSAkKG9yICQoVEFSR0VUX0NQVV9WQVJJQU5UX1JVTlRJTUUpLCQoVEFSR0VUX0NQVV9WQVJJQU5UKSkKQEAgLTMwOCw5ICszMTUsMTAgQEAKIC5LQVRJX1JFQURPTkxZIDo9ICQoX2JvYXJkX3N0cmlwX3JlYWRvbmx5X2xpc3QpCiAKIElOVEVSTkFMX0tFUk5FTF9DTURMSU5FIDo9ICQoQk9BUkRfS0VSTkVMX0NNRExJTkUpCi1pZm5lcSAoLCQoQk9BUkRfQk9PVENPTkZJRykpCitpZm5lcSAoLCQoQk9BUkRfQk9PVENPTkZJRykkKEJPQVJEX0JPT1RDT05GSUdfRklMRSkpCiAgIElOVEVSTkFMX0tFUk5FTF9DTURMSU5FICs9IGJvb3Rjb25maWcKICAgSU5URVJOQUxfQk9PVENPTkZJRyA6PSAkKEJPQVJEX0JPT1RDT05GSUcpCisgIElOVEVSTkFMX0JPT1RDT05GSUdfRklMRSA6PSAkKEJPQVJEX0JPT1RDT05GSUdfRklMRSkKIGVuZGlmCiAKIGlmbmVxICgkKGZpbHRlciAlNjQsJChUQVJHRVRfQVJDSCkpLCkKQEAgLTkxOSwxMCArOTI3LDI0IEBACiBlbmRpZgogLktBVElfUkVBRE9OTFkgOj0gQk9BUkRfVVNFU19QVk1GV0lNQUdFCiAKK0JPQVJEX1VTRVNfREVTS1RPUF9SRUNPVkVSWV9JTUFHRSA6PQoraWZlcSAoJChQUk9EVUNUX0JVSUxEX0RFU0tUT1BfUkVDT1ZFUllfSU1BR0UpLHRydWUpCisgIEJPQVJEX1VTRVNfREVTS1RPUF9SRUNPVkVSWV9JTUFHRSA6PSB0cnVlCitlbmRpZgorLktBVElfUkVBRE9OTFkgOj0gQk9BUkRfVVNFU19ERVNLVE9QX1JFQ09WRVJZX0lNQUdFCisKK0JPQVJEX1VTRVNfREVTS1RPUF9VUERBVEVfSU1BR0UgOj0KK2lmZXEgKCQoUFJPRFVDVF9CVUlMRF9ERVNLVE9QX1VQREFURV9JTUFHRSksdHJ1ZSkKKyAgQk9BUkRfVVNFU19ERVNLVE9QX1VQREFURV9JTUFHRSA6PSB0cnVlCitlbmRpZgorLktBVElfUkVBRE9OTFkgOj0gQk9BUkRfVVNFU19ERVNLVE9QX1VQREFURV9JTUFHRQorCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIEVuc3VyZSBjb25zaXN0ZW5jeSBhbW9uZyBUQVJHRVRfUkVDT1ZFUllfVVBEQVRFUl9MSUJTLCBBQl9PVEFfVVBEQVRFUiwgYW5kIFBST0RVQ1RfT1RBX0ZPUkNFX05PTl9BQl9QQUNLQUdFLgogVEFSR0VUX1JFQ09WRVJZX1VQREFURVJfTElCUyA/PQotQUJfT1RBX1VQREFURVIgPz0KK2lmZXEgKCQoQUJfT1RBX1VQREFURVIpLCkKK0FCX09UQV9VUERBVEVSIDo9IHRydWUKK2VuZGlmCiAuS0FUSV9SRUFET05MWSA6PSBUQVJHRVRfUkVDT1ZFUllfVVBEQVRFUl9MSUJTIEFCX09UQV9VUERBVEVSCiAKICMgRW5zdXJlIHRoYXQgaWYgUFJPRFVDVF9PVEFfRk9SQ0VfTk9OX0FCX1BBQ0tBR0UgPT0gdHJ1ZSwgdGhlbiBBQl9PVEFfVVBEQVRFUiBtdXN0IGJlIHRydWUKQEAgLTk0OCw2ICs5NzAsMTEgQEAKICAgZW5kaWYKIGVuZGlmCiAKKyMgRm9yIE5vbiBBL0IgZnVsbCBPVEEsIGRpc2FibGUgYnJvdGxpIGNvbXByZXNzaW9uLgoraWZlcSAoJChUQVJHRVRfT1RBX0FMTE9XX05PTl9BQiksdHJ1ZSkKKyAgQk9BUkRfTk9OX0FCX09UQV9ESVNBQkxFX0NPTVBSRVNTSU9OIDo9IHRydWUKK2VuZGlmCisKICMgUXVpY2sgY2hlY2sgZm9yIGJ1aWxkaW5nIGdlbmVyaWMgT1RBIHBhY2thZ2VzLiBDdXJyZW50bHkgaXQgb25seSBzdXBwb3J0cyBBL0IgT1RBcy4KIGlmZXEgKCQoUFJPRFVDVF9CVUlMRF9HRU5FUklDX09UQV9QQUNLQUdFKSx0cnVlKQogICBpZm5lcSAoJChBQl9PVEFfVVBEQVRFUiksdHJ1ZSkKQEAgLTk2NywzNyArOTk0LDcgQEAKICAgJChpZiAkKHdpbGRjYXJkICQodm5ka19wYXRoKS8qL0FuZHJvaWQuYnApLCwkKGVycm9yIFZOREsgdmVyc2lvbiAkKDEpIG5vdCBmb3VuZCkpCiBlbmRlZgogCi1pZmRlZiBCT0FSRF9WTkRLX1ZFUlNJT04KLSAgaWZlcSAoJChCT0FSRF9WTkRLX1ZFUlNJT04pLCQoUExBVEZPUk1fVk5ES19WRVJTSU9OKSkKLSAgICAkKGVycm9yIEJPQVJEX1ZOREtfVkVSU0lPTiBpcyBlcXVhbCB0byBQTEFURk9STV9WTkRLX1ZFUlNJT047IHVzZSBCT0FSRF9WTkRLX1ZFUlNJT04gOj0gY3VycmVudCkKLSAgZW5kaWYKLSAgaWZuZXEgKCQoQk9BUkRfVk5ES19WRVJTSU9OKSxjdXJyZW50KQotICAgICQoY2FsbCBjaGVja192bmRrX3ZlcnNpb24sJChCT0FSRF9WTkRLX1ZFUlNJT04pKQotICBlbmRpZgotICBUQVJHRVRfVkVORE9SX1RFU1RfU1VGRklYIDo9IC92ZW5kb3IKLWVsc2UKLSAgVEFSR0VUX1ZFTkRPUl9URVNUX1NVRkZJWCA6PQotZW5kaWYKLQotIyBJZiBQUk9EVUNUX0VORk9SQ0VfSU5URVJfUEFSVElUSU9OX0pBVkFfU0RLX0xJQlJBUlkgaXMgc2V0LAotIyBCT0FSRF9WTkRLX1ZFUlNJT04gbXVzdCBiZSBzZXQgYmVjYXVzZSBQUk9EVUNUX0VORk9SQ0VfSU5URVJfUEFSVElUSU9OX0pBVkFfU0RLX0xJQlJBUlkKLSMgaXMgYSBlbmZvcmNlbWVudCBvZiBpbnRlci1wYXJ0aXRpb24gZGVwZW5kZW5jeSwgYW5kIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgbWVhbmluZwotIyB3aGVuIEJPQVJEX1ZOREtfVkVSU0lPTiBpc24ndCBzZXQuCi1pZmVxICgkKFBST0RVQ1RfRU5GT1JDRV9JTlRFUl9QQVJUSVRJT05fSkFWQV9TREtfTElCUkFSWSksdHJ1ZSkKLSAgaWZlcSAoJChCT0FSRF9WTkRLX1ZFUlNJT04pLCkKLSAgICAkKGVycm9yIEJPQVJEX1ZOREtfVkVSU0lPTiBtdXN0IGJlIHNldCB3aGVuIFBST0RVQ1RfRU5GT1JDRV9JTlRFUl9QQVJUSVRJT05fSkFWQV9TREtfTElCUkFSWSBpcyB0cnVlKQotICBlbmRpZgotZW5kaWYKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBBUEVYZXMgYXJlIGJ5IGRlZmF1bHQgbm90IGZsYXR0ZW5lZCwgaS5lLiB1cGRhdGFibGUuCi0jCi0jIEFQRVggZmxhdHRlbmluZyBjYW4gYWxzbyBiZSBmb3JjaWJseSBlbmFibGVkIChyZXNwLiBkaXNhYmxlZCkgYnkKLSMgc2V0dGluZyBPVkVSUklERV9UQVJHRVRfRkxBVFRFTl9BUEVYIHRvIHRydWUgKHJlc3AuIGZhbHNlKSwgZS5nLiBieQotIyBzZXR0aW5nIHRoZSBPVkVSUklERV9UQVJHRVRfRkxBVFRFTl9BUEVYIGVudmlyb25tZW50IHZhcmlhYmxlLgotaWZkZWYgT1ZFUlJJREVfVEFSR0VUX0ZMQVRURU5fQVBFWAotICBUQVJHRVRfRkxBVFRFTl9BUEVYIDo9ICQoT1ZFUlJJREVfVEFSR0VUX0ZMQVRURU5fQVBFWCkKLWVuZGlmCitUQVJHRVRfVkVORE9SX1RFU1RfU1VGRklYIDo9IC92ZW5kb3IKIAogaWZlcSAoLCQoVEFSR0VUX0JVSUxEX1VOQlVORExFRCkpCiBpZmRlZiBQUk9EVUNUX0VYVFJBX1ZOREtfVkVSU0lPTlMKQEAgLTEwMTMsNiArMTAxMCwxNiBAQAogZW5kaWYKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCT0FSRF9BUElfTEVWRUwgZm9yIHZlbmRvciBBUEkgc3VyZmFjZQoraWZkZWYgUkVMRUFTRV9CT0FSRF9BUElfTEVWRUwKKyAgaWZkZWYgQk9BUkRfQVBJX0xFVkVMCisgICAgJChlcnJvciBCT0FSRF9BUElfTEVWRUwgbXVzdCBub3QgYmUgc2V0IG1hbnVhbGx5LiBUaGUgYnVpbGQgc3lzdGVtIGF1dG9tYXRpY2FsbHkgc2V0cyB0aGlzIHZhbHVlLikKKyAgZW5kaWYKKyAgQk9BUkRfQVBJX0xFVkVMIDo9ICQoUkVMRUFTRV9CT0FSRF9BUElfTEVWRUwpCisgIC5LQVRJX1JFQURPTkxZIDo9IEJPQVJEX0FQSV9MRVZFTAorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBIYW5kbGUgQlVJTERfQlJPS0VOX1VTRVNfQlVJTERfKgogCiAkKGZvcmVhY2ggbSwkKERFRkFVTFRfV0FSTklOR19CVUlMRF9NT0RVTEVfVFlQRVMpLFwKZGlmZiAtLWdpdCBhL2NvcmUvYm9hcmRfY29uZmlnX3dwYV9zdXBwbGljYW50Lm1rIGIvY29yZS9ib2FyZF9jb25maWdfd3BhX3N1cHBsaWNhbnQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVmNDM4ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvYm9hcmRfY29uZmlnX3dwYV9zdXBwbGljYW50Lm1rCkBAIC0wLDAgKzEsODggQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRoaXMgZmlsZSBhZGRzIHdwYV9zdXBwbGljYW50XzggdmFyaWFibGVzIGludG8gc29vbmcgY29uZmlnIG5hbWVzcGFjZSAoYHdwYV9zdXBwbGljYW50XzhgKQorIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaWZkZWYgQk9BUkRfSE9TVEFQRF9EUklWRVIKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsd3BhX3N1cHBsaWNhbnRfOCx3cGFfYnVpbGRfaG9zdGFwZCx0cnVlKQoraWZuZXEgKCQoQk9BUkRfSE9TVEFQRF9EUklWRVIpLE5MODAyMTEpCisgICAgJChlcnJvciBCT0FSRF9IT1NUQVBEX0RSSVZFUiBzZXQgdG8gJChCT0FSRF9IT1NUQVBEX0RSSVZFUikgYnV0IGN1cnJlbnQgc29vbmcgZXhwZWN0ZWQgaXQgc2hvdWxkIGJlIE5MODAyMTEgb25seSEpCitlbmRpZgorZW5kaWYKKworaWZkZWYgQk9BUkRfV1BBX1NVUFBMSUNBTlRfRFJJVkVSCitpZm5lcSAoJChCT0FSRF9XUEFfU1VQUExJQ0FOVF9EUklWRVIpLE5MODAyMTEpCisgICAgJChlcnJvciBCT0FSRF9XUEFfU1VQUExJQ0FOVF9EUklWRVIgc2V0IHRvICQoQk9BUkRfV1BBX1NVUFBMSUNBTlRfRFJJVkVSKSBidXQgY3VycmVudCBzb29uZyBleHBlY3RlZCBpdCBzaG91bGQgYmUgTkw4MDIxMSBvbmx5ISkKK2VuZGlmCitlbmRpZgorCisjIFRoaXMgaXMgZm9yIENPTkZJR19EUklWRVJfTkw4MDIxMV9CUkNNLCBDT05GSUdfRFJJVkVSX05MODAyMTFfU1lOQSwgQ09ORklHX0RSSVZFUl9OTDgwMjExX1FDQQorIyBBbmQgaXQgaXMgb25seSB1c2VkIGZvciBhIGNmbGFncyBzZXR0aW5nIGluIGRyaXZlci4KKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LHdwYV9zdXBwbGljYW50XzgsYm9hcmRfd2xhbl9kZXZpY2UsJChCT0FSRF9XTEFOX0RFVklDRSkpCisKKyMgQmVsb25nIHRvIENPTkZJR19JRUVFODAyMTFBWCBkZWZpbml0aW9uCitpZmVxICgkKFdJRklfRkVBVFVSRV9IT1NUQVBEXzExQVgpLHRydWUpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLHdwYV9zdXBwbGljYW50XzgsaG9zdGFwZF8xMWF4LHRydWUpCitlbmRpZgorCisjIEJlbG9uZyB0byBDT05GSUdfSUVFRTgwMjExQkUgZGVmaW5pdGlvbgoraWZlcSAoJChXSUZJX0ZFQVRVUkVfSE9TVEFQRF8xMUJFKSx0cnVlKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCx3cGFfc3VwcGxpY2FudF84LGhvc3RhcGRfMTFiZSx0cnVlKQorZW5kaWYKKworIyBQTEFURk9STV9WRVJTSU9OCiskKGNhbGwgc29vbmdfY29uZmlnX3NldCx3cGFfc3VwcGxpY2FudF84LHBsYXRmb3JtX3ZlcnNpb24sJChQTEFURk9STV9WRVJTSU9OKSkKKworIyBCT0FSRF9IT1NUQVBEX1BSSVZBVEVfTElCCitpZmVxICgkKEJPQVJEX0hPU1RBUERfUFJJVkFURV9MSUIpLCkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsd3BhX3N1cHBsaWNhbnRfOCxob3N0YXBkX3VzZV9zdHViX2xpYix0cnVlKQorZWxzZQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsd3BhX3N1cHBsaWNhbnRfOCxib2FyZF9ob3N0YXBkX3ByaXZhdGVfbGliLCQoQk9BUkRfSE9TVEFQRF9QUklWQVRFX0xJQikpCitlbmRpZgorCitpZmVxICgkKEJPQVJEX0hPU1RBUERfQ09ORklHXzgwMjExV19NRlBfT1BUSU9OQUwpLHRydWUpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLHdwYV9zdXBwbGljYW50XzgsYm9hcmRfaG9zdGFwZF9jb25maWdfODAyMTF3X21mcF9vcHRpb25hbCx0cnVlKQorZW5kaWYKKworaWZuZXEgKCQoQk9BUkRfSE9TVEFQRF9QUklWQVRFX0xJQl9FVkVOVCksKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCx3cGFfc3VwcGxpY2FudF84LGJvYXJkX2hvc3RhcGRfcHJpdmF0ZV9saWJfZXZlbnQsdHJ1ZSkKK2VuZGlmCisKKyMgQk9BUkRfV1BBX1NVUFBMSUNBTlRfUFJJVkFURV9MSUIKK2lmZXEgKCQoQk9BUkRfV1BBX1NVUFBMSUNBTlRfUFJJVkFURV9MSUIpLCkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsd3BhX3N1cHBsaWNhbnRfOCx3cGFfc3VwcGxpY2FudF91c2Vfc3R1Yl9saWIsdHJ1ZSkKK2Vsc2UKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LHdwYV9zdXBwbGljYW50XzgsYm9hcmRfd3BhX3N1cHBsaWNhbnRfcHJpdmF0ZV9saWIsJChCT0FSRF9XUEFfU1VQUExJQ0FOVF9QUklWQVRFX0xJQikpCitlbmRpZgorCitpZm5lcSAoJChCT0FSRF9XUEFfU1VQUExJQ0FOVF9QUklWQVRFX0xJQl9FVkVOVCksKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCx3cGFfc3VwcGxpY2FudF84LGJvYXJkX3dwYV9zdXBwbGljYW50X3ByaXZhdGVfbGliX2V2ZW50LHRydWUpCitlbmRpZgorCitpZmVxICgkKFdJRklfUFJJVl9DTURfVVBEQVRFX01CT19DRUxMX1NUQVRVUyksIGVuYWJsZWQpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLHdwYV9zdXBwbGljYW50Xzgsd2lmaV9wcml2X2NtZF91cGRhdGVfbWJvX2NlbGxfc3RhdHVzLHRydWUpCitlbmRpZgorCitpZmVxICgkKFdJRklfSElETF9VTklGSUVEX1NVUFBMSUNBTlRfU0VSVklDRV9SQ19FTlRSWSksIHRydWUpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLHdwYV9zdXBwbGljYW50Xzgsd2lmaV9oaWRsX3VuaWZpZWRfc3VwcGxpY2FudF9zZXJ2aWNlX3JjX2VudHJ5LHRydWUpCitlbmRpZgorCisjIE5ldyBhZGRlZCBpbiBpbnRlcm5hbCBtYWluCitpZmVxICgkKFdJRklfQlJDTV9PUEVOX1NPVVJDRV9NVUxUSV9BS00pLCBlbmFibGVkKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCx3cGFfc3VwcGxpY2FudF84LHdpZmlfYnJjbV9vcGVuX3NvdXJjZV9tdWx0aV9ha20sdHJ1ZSkKK2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2J1aWxkX2lkLm1rIGIvY29yZS9idWlsZF9pZC5tawppbmRleCA4YTY4MDU2Li5iZWQ4MzlmIDEwMDY0NAotLS0gYS9jb3JlL2J1aWxkX2lkLm1rCisrKyBiL2NvcmUvYnVpbGRfaWQubWsKQEAgLTE4LDQgKzE4LDQgQEAKICMgKGxpa2UgIkNSQjAxIikuICBJdCBtdXN0IGJlIGEgc2luZ2xlIHdvcmQsIGFuZCBpcwogIyBjYXBpdGFsaXplZCBieSBjb252ZW50aW9uLgogCi1CVUlMRF9JRD1VREMKK0JVSUxEX0lEPU1BSU4KZGlmZiAtLWdpdCBhL2NvcmUvY2NfcHJlYnVpbHRfaW50ZXJuYWwubWsgYi9jb3JlL2NjX3ByZWJ1aWx0X2ludGVybmFsLm1rCmluZGV4IDJkZTQxMTUuLmUzNGUxMTAgMTAwNjQ0Ci0tLSBhL2NvcmUvY2NfcHJlYnVpbHRfaW50ZXJuYWwubWsKKysrIGIvY29yZS9jY19wcmVidWlsdF9pbnRlcm5hbC5tawpAQCAtNTYsOSArNTYsNiBAQAogICBpZmVxICgkKGZpbHRlciBTSEFSRURfTElCUkFSSUVTIEVYRUNVVEFCTEVTIE5BVElWRV9URVNUUywkKExPQ0FMX01PRFVMRV9DTEFTUykpLCkKICAgICAkKGNhbGwgcHJldHR5LWVycm9yLENhbiBzdHJpcC9wYWNrIG9ubHkgc2hhcmVkIGxpYnJhcmllcyBvciBleGVjdXRhYmxlcykKICAgZW5kaWYKLSAgaWZuZXEgKCQoTE9DQUxfUFJFQlVJTFRfU1RSSVBfQ09NTUVOVFMpLCkKLSAgICAkKGNhbGwgcHJldHR5LWVycm9yLENhbm5vdCBzdHJpcC9wYWNrIHNjcmlwdHMpCi0gIGVuZGlmCiAgICMgU2V0IHRoZSBhcmNoLXNwZWNpZmljIHZhcmlhYmxlcyB0byBzZXQgdXAgdGhlIHN0cmlwIHJ1bGVzCiAgIExPQ0FMX1NUUklQX01PRFVMRV8kKCQobXlfcHJlZml4KSQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClBUkNIKSA6PSAkKG15X3N0cmlwX21vZHVsZSkKICAgaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvZHluYW1pY19iaW5hcnkubWsKQEAgLTgzLDcgKzgwLDcgQEAKIAogaWZkZWYgTE9DQUxfU0RLX1ZFUlNJT04KIG15X2xpbmtfdHlwZSA6PSBuYXRpdmU6bmRrOiQobXlfbmRrX3N0bF9mYW1pbHkpOiQobXlfbmRrX3N0bF9saW5rX3R5cGUpCi1lbHNlIGlmZGVmIExPQ0FMX1VTRV9WTkRLCitlbHNlIGlmZXEgKCQoY2FsbCBtb2R1bGUtaW4tdmVuZG9yLW9yLXByb2R1Y3QpLHRydWUpCiAgICAgX25hbWUgOj0gJChwYXRzdWJzdCAlLnZlbmRvciwlLCQoTE9DQUxfTU9EVUxFKSkKICAgICBfbmFtZSA6PSAkKHBhdHN1YnN0ICUucHJvZHVjdCwlLCQoTE9DQUxfTU9EVUxFKSkKICAgICBpZm5lcSAoJChmaWx0ZXIgJChfbmFtZSksJChWTkRLX0NPUkVfTElCUkFSSUVTKSAkKFZOREtfU0FNRVBST0NFU1NfTElCUkFSSUVTKSAkKExMTkRLX0xJQlJBUklFUykpLCkKQEAgLTkzLDcgKzkwLDcgQEAKICAgICAgICAgICAgIG15X2xpbmtfdHlwZSA6PSBuYXRpdmU6dm5ka19wcml2YXRlCiAgICAgICAgIGVuZGlmCiAgICAgZWxzZQotICAgICAgICBpZmVxICgkKExPQ0FMX1VTRV9WTkRLX1BST0RVQ1QpLHRydWUpCisgICAgICAgIGlmZXEgKCQoTE9DQUxfSU5fUFJPRFVDVCksdHJ1ZSkKICAgICAgICAgICAgIG15X2xpbmtfdHlwZSA6PSBuYXRpdmU6cHJvZHVjdAogICAgICAgICBlbHNlCiAgICAgICAgICAgICBteV9saW5rX3R5cGUgOj0gbmF0aXZlOnZlbmRvcgpAQCAtMTQyLDggKzEzOSw4IEBACiAjIFdoZW4gY29tcGlsaW5nIGFnYWluc3QgQVBJIGltcG9ydGVkIG1vZHVsZSwgdXNlIEFQSSBpbXBvcnQgc3R1YiBsaWJyYXJpZXMuCiBhcGlpbXBvcnRfcG9zdGZpeCA6PSAuYXBpaW1wb3J0CiAKLWlmbmVxICgkKExPQ0FMX1VTRV9WTkRLKSwpCi0gIGlmZXEgKCQoTE9DQUxfVVNFX1ZOREtfUFJPRFVDVCksdHJ1ZSkKK2lmZXEgKCQoY2FsbCBtb2R1bGUtaW4tdmVuZG9yLW9yLXByb2R1Y3QpLHRydWUpCisgIGlmZXEgKCQoTE9DQUxfSU5fUFJPRFVDVCksdHJ1ZSkKICAgICBhcGlpbXBvcnRfcG9zdGZpeCA6PSAuYXBpaW1wb3J0LnByb2R1Y3QKICAgZWxzZQogICAgIGFwaWltcG9ydF9wb3N0Zml4IDo9IC5hcGlpbXBvcnQudmVuZG9yCkBAIC0xNjEsOCArMTU4LDggQEAKIGVuZGlmICNteV9zeXN0ZW1fc2hhcmVkX2xpYnJhcmllcwogCiBpZmRlZiBteV9zaGFyZWRfbGlicmFyaWVzCi1pZmRlZiBMT0NBTF9VU0VfVk5ESwotICBpZmVxICgkKExPQ0FMX1VTRV9WTkRLX1BST0RVQ1QpLHRydWUpCitpZmVxICgkKGNhbGwgbW9kdWxlLWluLXZlbmRvci1vci1wcm9kdWN0KSx0cnVlKQorICBpZmVxICgkKExPQ0FMX0lOX1BST0RVQ1QpLHRydWUpCiAgICAgbXlfc2hhcmVkX2xpYnJhcmllcyA6PSAkKGZvcmVhY2ggbCwkKG15X3NoYXJlZF9saWJyYXJpZXMpLFwKICAgICAgICQoaWYgJChTUExJVF9QUk9EVUNULlNIQVJFRF9MSUJSQVJJRVMuJChsKSksJChsKS5wcm9kdWN0LCQobCkpKQogICBlbHNlCmRpZmYgLS1naXQgYS9jb3JlL2NoZWNrX2VsZl9maWxlLm1rIGIvY29yZS9jaGVja19lbGZfZmlsZS5tawppbmRleCBiNWJlODFmLi5lYzNjNGIwIDEwMDY0NAotLS0gYS9jb3JlL2NoZWNrX2VsZl9maWxlLm1rCisrKyBiL2NvcmUvY2hlY2tfZWxmX2ZpbGUubWsKQEAgLTcsOSArNywxMiBAQAogIwogIyBJbnB1dHM6CiAjIC0gTE9DQUxfQUxMT1dfVU5ERUZJTkVEX1NZTUJPTFMKKyMgLSBMT0NBTF9JR05PUkVfTUFYX1BBR0VfU0laRQogIyAtIExPQ0FMX0JVSUxUX01PRFVMRQogIyAtIExPQ0FMX0lTX0hPU1RfTU9EVUxFCiAjIC0gTE9DQUxfTU9EVUxFX0NMQVNTCisjIC0gVEFSR0VUX0NIRUNLX1BSRUJVSUxUX01BWF9QQUdFX1NJWkUKKyMgLSBUQVJHRVRfTUFYX1BBR0VfU0laRV9TVVBQT1JURUQKICMgLSBpbnRlcm1lZGlhdGVzCiAjIC0gbXlfaW5zdGFsbGVkX21vZHVsZV9zdGVtCiAjIC0gbXlfcHJlYnVpbHRfc3JjX2ZpbGUKQEAgLTI2LDYgKzI5LDIxIEBACiAjIEluIGFkZGl0aW9uIHRvICQobXlfY2hlY2tfZWxmX2ZpbGVfc2hhcmVkX2xpYl9maWxlcyksIHNvbWUgZmlsZSBwYXRocyBhcmUKICMgYWRkZWQgYnkgYHJlc29sdmUtc2hhcmVkLWxpYnMtZm9yLWVsZi1maWxlLWNoZWNrYCBmcm9tIGBjb3JlL21haW4ubWtgLgogJChjaGVja19lbGZfZmlsZXNfc3RhbXApOiBQUklWQVRFX1NIQVJFRF9MSUJSQVJZX0ZJTEVTIDo9ICQobXlfY2hlY2tfZWxmX2ZpbGVfc2hhcmVkX2xpYl9maWxlcykKKworIyBGb3IgZGlmZmVyZW50IHBhZ2Ugc2l6ZXMgdG8gd29yaywgd2UgbXVzdCBzdXBwb3J0IGEgbGFyZ2VyIG1heCBwYWdlIHNpemUKKyMgYXMgd2VsbCBhcyBwcm9wZXJseSByZWZsZWN0IHBhZ2Ugc2l6ZSBhdCBydW50aW1lLiBMaW1pdCB0aGlzIGNoZWNrLCBzaW5jZSBtYW55CisjIGRldmljZXMgc2V0IHRoZSBtYXggcGFnZSBzaXplIChmb3IgZnV0dXJlIHByb29mKSB0aGFuIGFjdHVhbGx5IHVzZSB0aGUKKyMgbGFyZ2VyIHBhZ2Ugc2l6ZS4KK2lmZXEgKCQoc3RyaXAgJChUQVJHRVRfQ0hFQ0tfUFJFQlVJTFRfTUFYX1BBR0VfU0laRSkpLHRydWUpCitpZmVxICgkKHN0cmlwICQoTE9DQUxfSUdOT1JFX01BWF9QQUdFX1NJWkUpKSx0cnVlKQorJChjaGVja19lbGZfZmlsZXNfc3RhbXApOiBQUklWQVRFX01BWF9QQUdFX1NJWkUgOj0KK2Vsc2UKKyQoY2hlY2tfZWxmX2ZpbGVzX3N0YW1wKTogUFJJVkFURV9NQVhfUEFHRV9TSVpFIDo9ICQoVEFSR0VUX01BWF9QQUdFX1NJWkVfU1VQUE9SVEVEKQorZW5kaWYKK2Vsc2UKKyQoY2hlY2tfZWxmX2ZpbGVzX3N0YW1wKTogUFJJVkFURV9NQVhfUEFHRV9TSVpFIDo9CitlbmRpZgorCiAkKGNoZWNrX2VsZl9maWxlc19zdGFtcCk6ICQobXlfcHJlYnVpbHRfc3JjX2ZpbGUpICQobXlfY2hlY2tfZWxmX2ZpbGVfc2hhcmVkX2xpYl9maWxlcykgJChDSEVDS19FTEZfRklMRSkgJChMTFZNX1JFQURPQkopCiAJQGVjaG8gQ2hlY2sgcHJlYnVpbHQgRUxGIGJpbmFyeTogJDwKIAkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQpAQCAtMzMsNiArNTEsNyBAQAogCSQoaGlkZSkgJChDSEVDS19FTEZfRklMRSkgXAogCSAgICAtLXNraXAtYmFkLWVsZi1tYWdpYyBcCiAJICAgIC0tc2tpcC11bmtub3duLWVsZi1tYWNoaW5lIFwKKwkgICAgJChpZiAkKFBSSVZBVEVfTUFYX1BBR0VfU0laRSksLS1tYXgtcGFnZS1zaXplPSQoUFJJVkFURV9NQVhfUEFHRV9TSVpFKSkgXAogCSAgICAkKGlmICQoUFJJVkFURV9TT05BTUUpLC0tc29uYW1lICQoUFJJVkFURV9TT05BTUUpKSBcCiAJICAgICQoZm9yZWFjaCBsLCQoUFJJVkFURV9TSEFSRURfTElCUkFSWV9GSUxFUyksLS1zaGFyZWQtbGliICQobCkpIFwKIAkgICAgJChmb3JlYWNoIGwsJChQUklWQVRFX1NZU1RFTV9TSEFSRURfTElCUkFSSUVTKSwtLXN5c3RlbS1zaGFyZWQtbGliICQobCkpIFwKZGlmZiAtLWdpdCBhL2NvcmUvY2xhbmcvVEFSR0VUX2FybS5tayBiL2NvcmUvY2xhbmcvVEFSR0VUX2FybS5tawppbmRleCBmMTg3NDdhLi4xMjY0ODJmIDEwMDY0NAotLS0gYS9jb3JlL2NsYW5nL1RBUkdFVF9hcm0ubWsKKysrIGIvY29yZS9jbGFuZy9UQVJHRVRfYXJtLm1rCkBAIC00LDcgKzQsMTAgQEAKIAogJChjbGFuZ18ybmRfYXJjaF9wcmVmaXgpVEFSR0VUX0xJQlBST0ZJTEVfUlQgOj0gJChMTFZNX1JUTElCX1BBVEgpL2xpYmNsYW5nX3J0LnByb2ZpbGUtYXJtLWFuZHJvaWQuYQogJChjbGFuZ18ybmRfYXJjaF9wcmVmaXgpVEFSR0VUX0xJQkNSVF9CVUlMVElOUyA6PSAkKExMVk1fUlRMSUJfUEFUSCkvbGliY2xhbmdfcnQuYnVpbHRpbnMtYXJtLWFuZHJvaWQuYQorJChjbGFuZ18ybmRfYXJjaF9wcmVmaXgpVEFSR0VUX0xJQlVOV0lORCA6PSAkKExMVk1fUlRMSUJfUEFUSCkvYXJtL2xpYnVud2luZC5hCiAKICMgQWRkcmVzcyBzYW5pdGl6ZXIgY2xhbmcgY29uZmlnCiAkKGNsYW5nXzJuZF9hcmNoX3ByZWZpeClBRERSRVNTX1NBTklUSVpFUl9MSU5LRVIgOj0gL3N5c3RlbS9iaW4vbGlua2VyX2FzYW4KICQoY2xhbmdfMm5kX2FyY2hfcHJlZml4KUFERFJFU1NfU0FOSVRJWkVSX0xJTktFUl9GSUxFIDo9IC9zeXN0ZW0vYmluL2Jvb3RzdHJhcC9saW5rZXJfYXNhbgorCiskKGNsYW5nXzJuZF9hcmNoX3ByZWZpeClQUkVCVUlMVF9MSUJDWFhfQVJDSF9ESVIgOj0gYXJtCmRpZmYgLS1naXQgYS9jb3JlL2NsYW5nL1RBUkdFVF9hcm02NC5tayBiL2NvcmUvY2xhbmcvVEFSR0VUX2FybTY0Lm1rCmluZGV4IDQyYmVkMGEuLmU3YWI2Y2IgMTAwNjQ0Ci0tLSBhL2NvcmUvY2xhbmcvVEFSR0VUX2FybTY0Lm1rCisrKyBiL2NvcmUvY2xhbmcvVEFSR0VUX2FybTY0Lm1rCkBAIC00LDcgKzQsMTAgQEAKIAogVEFSR0VUX0xJQlBST0ZJTEVfUlQgOj0gJChMTFZNX1JUTElCX1BBVEgpL2xpYmNsYW5nX3J0LnByb2ZpbGUtYWFyY2g2NC1hbmRyb2lkLmEKIFRBUkdFVF9MSUJDUlRfQlVJTFRJTlMgOj0gJChMTFZNX1JUTElCX1BBVEgpL2xpYmNsYW5nX3J0LmJ1aWx0aW5zLWFhcmNoNjQtYW5kcm9pZC5hCitUQVJHRVRfTElCVU5XSU5EIDo9ICQoTExWTV9SVExJQl9QQVRIKS9hYXJjaDY0L2xpYnVud2luZC5hCiAKICMgQWRkcmVzcyBzYW5pdGl6ZXIgY2xhbmcgY29uZmlnCiBBRERSRVNTX1NBTklUSVpFUl9MSU5LRVIgOj0gL3N5c3RlbS9iaW4vbGlua2VyX2FzYW42NAogQUREUkVTU19TQU5JVElaRVJfTElOS0VSX0ZJTEUgOj0gL3N5c3RlbS9iaW4vYm9vdHN0cmFwL2xpbmtlcl9hc2FuNjQKKworUFJFQlVJTFRfTElCQ1hYX0FSQ0hfRElSIDo9IGFhcmNoNjQKZGlmZiAtLWdpdCBhL2NvcmUvY2xhbmcvVEFSR0VUX3Jpc2N2NjQubWsgYi9jb3JlL2NsYW5nL1RBUkdFVF9yaXNjdjY0Lm1rCmluZGV4IGNmYjVjN2QuLjU4YzljN2IgMTAwNjQ0Ci0tLSBhL2NvcmUvY2xhbmcvVEFSR0VUX3Jpc2N2NjQubWsKKysrIGIvY29yZS9jbGFuZy9UQVJHRVRfcmlzY3Y2NC5tawpAQCAtNCw3ICs0LDEwIEBACiAKIFRBUkdFVF9MSUJQUk9GSUxFX1JUIDo9ICQoTExWTV9SVExJQl9QQVRIKS9saWJjbGFuZ19ydC5wcm9maWxlLXJpc2N2NjQtYW5kcm9pZC5hCiBUQVJHRVRfTElCQ1JUX0JVSUxUSU5TIDo9ICQoTExWTV9SVExJQl9QQVRIKS9saWJjbGFuZ19ydC5idWlsdGlucy1yaXNjdjY0LWFuZHJvaWQuYQorVEFSR0VUX0xJQlVOV0lORCA6PSAkKExMVk1fUlRMSUJfUEFUSCkvcmlzY3Y2NC9saWJ1bndpbmQuYQogCiAjIEFkZHJlc3Mgc2FuaXRpemVyIGNsYW5nIGNvbmZpZwogQUREUkVTU19TQU5JVElaRVJfTElOS0VSIDo9IC9zeXN0ZW0vYmluL2xpbmtlcl9hc2FuNjQKIEFERFJFU1NfU0FOSVRJWkVSX0xJTktFUl9GSUxFIDo9IC9zeXN0ZW0vYmluL2Jvb3RzdHJhcC9saW5rZXJfYXNhbjY0CisKK1BSRUJVSUxUX0xJQkNYWF9BUkNIX0RJUiA6PSByaXNjdjY0CmRpZmYgLS1naXQgYS9jb3JlL2NsYW5nL1RBUkdFVF94ODYubWsgYi9jb3JlL2NsYW5nL1RBUkdFVF94ODYubWsKaW5kZXggNTQ5MWEwNS4uMWEwOGM3OSAxMDA2NDQKLS0tIGEvY29yZS9jbGFuZy9UQVJHRVRfeDg2Lm1rCisrKyBiL2NvcmUvY2xhbmcvVEFSR0VUX3g4Ni5tawpAQCAtNCw3ICs0LDEwIEBACiAKICQoY2xhbmdfMm5kX2FyY2hfcHJlZml4KVRBUkdFVF9MSUJQUk9GSUxFX1JUIDo9ICQoTExWTV9SVExJQl9QQVRIKS9saWJjbGFuZ19ydC5wcm9maWxlLWk2ODYtYW5kcm9pZC5hCiAkKGNsYW5nXzJuZF9hcmNoX3ByZWZpeClUQVJHRVRfTElCQ1JUX0JVSUxUSU5TIDo9ICQoTExWTV9SVExJQl9QQVRIKS9saWJjbGFuZ19ydC5idWlsdGlucy1pNjg2LWFuZHJvaWQuYQorJChjbGFuZ18ybmRfYXJjaF9wcmVmaXgpVEFSR0VUX0xJQlVOV0lORCA6PSAkKExMVk1fUlRMSUJfUEFUSCkvaTM4Ni9saWJ1bndpbmQuYQogCiAjIEFkZHJlc3Mgc2FuaXRpemVyIGNsYW5nIGNvbmZpZwogJChjbGFuZ18ybmRfYXJjaF9wcmVmaXgpQUREUkVTU19TQU5JVElaRVJfTElOS0VSIDo9IC9zeXN0ZW0vYmluL2xpbmtlcl9hc2FuCiAkKGNsYW5nXzJuZF9hcmNoX3ByZWZpeClBRERSRVNTX1NBTklUSVpFUl9MSU5LRVJfRklMRSA6PSAvc3lzdGVtL2Jpbi9ib290c3RyYXAvbGlua2VyX2FzYW4KKworJChjbGFuZ18ybmRfYXJjaF9wcmVmaXgpUFJFQlVJTFRfTElCQ1hYX0FSQ0hfRElSIDo9IGkzODYKZGlmZiAtLWdpdCBhL2NvcmUvY2xhbmcvVEFSR0VUX3g4Nl82NC5tayBiL2NvcmUvY2xhbmcvVEFSR0VUX3g4Nl82NC5tawppbmRleCAxNjdkYjcyLi5mMzliNDFlIDEwMDY0NAotLS0gYS9jb3JlL2NsYW5nL1RBUkdFVF94ODZfNjQubWsKKysrIGIvY29yZS9jbGFuZy9UQVJHRVRfeDg2XzY0Lm1rCkBAIC00LDcgKzQsMTAgQEAKIAogVEFSR0VUX0xJQlBST0ZJTEVfUlQgOj0gJChMTFZNX1JUTElCX1BBVEgpL2xpYmNsYW5nX3J0LnByb2ZpbGUteDg2XzY0LWFuZHJvaWQuYQogVEFSR0VUX0xJQkNSVF9CVUlMVElOUyA6PSAkKExMVk1fUlRMSUJfUEFUSCkvbGliY2xhbmdfcnQuYnVpbHRpbnMteDg2XzY0LWFuZHJvaWQuYQorVEFSR0VUX0xJQlVOV0lORCA6PSAkKExMVk1fUlRMSUJfUEFUSCkveDg2XzY0L2xpYnVud2luZC5hCiAKICMgQWRkcmVzcyBzYW5pdGl6ZXIgY2xhbmcgY29uZmlnCiBBRERSRVNTX1NBTklUSVpFUl9MSU5LRVIgOj0gL3N5c3RlbS9iaW4vbGlua2VyX2FzYW42NAogQUREUkVTU19TQU5JVElaRVJfTElOS0VSX0ZJTEUgOj0gL3N5c3RlbS9iaW4vYm9vdHN0cmFwL2xpbmtlcl9hc2FuNjQKKworUFJFQlVJTFRfTElCQ1hYX0FSQ0hfRElSIDo9IHg4Nl82NApkaWZmIC0tZ2l0IGEvY29yZS9jbGVhcl92YXJzLm1rIGIvY29yZS9jbGVhcl92YXJzLm1rCmluZGV4IGJiN2JhMWIuLmZlZDE5ZTYgMTAwNjQ0Ci0tLSBhL2NvcmUvY2xlYXJfdmFycy5taworKysgYi9jb3JlL2NsZWFyX3ZhcnMubWsKQEAgLTUsMjEgKzUsMTggQEAKICMgJycsdHJ1ZQogTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWDo9CiBMT0NBTF8zMl9CSVRfT05MWTo9Ci1MT0NBTF9BQVBUMl9PTkxZOj0KIExPQ0FMX0FBUFRfRkxBR1M6PQogTE9DQUxfQUFQVF9JTkNMVURFX0FMTF9SRVNPVVJDRVM6PQogTE9DQUxfQUFQVF9OQU1FU1BBQ0VTOj0KK0xPQ0FMX0FDT05GSUdfRklMRVM6PQogTE9DQUxfQURESVRJT05BTF9DRVJUSUZJQ0FURVM6PQogTE9DQUxfQURESVRJT05BTF9DSEVDS0VEX01PRFVMRTo9CiBMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUzo9Ci1MT0NBTF9BRERJVElPTkFMX0hUTUxfRElSOj0KLUxPQ0FMX0FERElUSU9OQUxfSkFWQV9ESVI6PQogTE9DQUxfQUlETF9JTkNMVURFUzo9CiBMT0NBTF9BTExPV19VTkRFRklORURfU1lNQk9MUzo9CiBMT0NBTF9BTk5PVEFUSU9OX1BST0NFU1NPUlM6PQogTE9DQUxfQU5OT1RBVElPTl9QUk9DRVNTT1JfQ0xBU1NFUzo9Ci1MT0NBTF9BUElESUZGX05FV0FQSTo9Ci1MT0NBTF9BUElESUZGX09MREFQSTo9CitMT0NBTF9BUEVYX0tFWV9QQVRIOj0KIExPQ0FMX0FQS19MSUJSQVJJRVM6PQogTE9DQUxfQVBLX1NFVF9JTlNUQUxMX0ZJTEU6PQogTE9DQUxfQVBLQ0VSVFNfRklMRTo9CkBAIC01Miw4ICs0OSw2IEBACiBMT0NBTF9DUFBGTEFHUzo9CiBMT0NBTF9DUFBfU1REOj0KIExPQ0FMX0NfU1REOj0KLUxPQ0FMX0NUU19URVNUX1BBQ0tBR0U6PQotTE9DQUxfQ1RTX1RFU1RfUlVOTkVSOj0KIExPQ0FMX0NYWDo9CiBMT0NBTF9DWFhfU1RMIDo9IGRlZmF1bHQKIExPQ0FMX0RFWF9QUkVPUFRfQVBQX0lNQUdFOj0KQEAgLTcyLDIxICs2NywxMSBAQAogTE9DQUxfRFBJX1ZBUklBTlRTOj0KIExPQ0FMX0RST0lERE9DX0FOTk9UQVRJT05TX1pJUCA6PQogTE9DQUxfRFJPSURET0NfQVBJX1ZFUlNJT05TX1hNTCA6PQotTE9DQUxfRFJPSURET0NfQVNTRVRfRElSOj0KLUxPQ0FMX0RST0lERE9DX0NVU1RPTV9BU1NFVF9ESVI6PQotTE9DQUxfRFJPSURET0NfQ1VTVE9NX1RFTVBMQVRFX0RJUjo9CiBMT0NBTF9EUk9JRERPQ19ET0NfWklQIDo9Ci1MT0NBTF9EUk9JRERPQ19IVE1MX0RJUjo9CiBMT0NBTF9EUk9JRERPQ19NRVRBREFUQV9aSVA6PQotTE9DQUxfRFJPSURET0NfT1BUSU9OUzo9Ci1MT0NBTF9EUk9JRERPQ19TT1VSQ0VfUEFUSDo9Ci1MT0NBTF9EUk9JRERPQ19TVFVCX09VVF9ESVI6PQogTE9DQUxfRFJPSURET0NfU1RVQlNfU1JDSkFSIDo9Ci1MT0NBTF9EUk9JRERPQ19URU1QTEFURV9ESVI6PQotTE9DQUxfRFJPSURET0NfVVNFX1NUQU5EQVJEX0RPQ0xFVDo9CiBMT0NBTF9EWF9GTEFHUzo9CiBMT0NBTF9EWUxJQl9MSUJSQVJJRVM6PQotTE9DQUxfRU1NQV9DT1ZFUkFHRV9GSUxURVI6PQogTE9DQUxfRU1NQV9JTlNUUlVNRU5UOj0KIExPQ0FMX0VORk9SQ0VfVVNFU19MSUJSQVJJRVM6PQogTE9DQUxfRVJST1JfUFJPTkVfRkxBR1M6PQpAQCAtMTAyLDcgKzg3LDcgQEAKIExPQ0FMX0VYVFJBX0ZVTExfVEVTVF9DT05GSUdTOj0KIExPQ0FMX0VYVFJBQ1RfQVBLOj0KIExPQ0FMX0VYVFJBQ1RfRFBJX0FQSzo9Ci1MT0NBTF9GSUxFX0NPTlRFWFRTOj0KK0xPQ0FMX0ZJTEVTWVNURU1fRklMRUxJU1Q6PQogTE9DQUxfRklOREJVR1NfRkxBR1M6PQogTE9DQUxfRk9SQ0VfU1RBVElDX0VYRUNVVEFCTEU6PQogTE9DQUxfRlVMTF9DTEFTU0VTX0pBQ09DT19KQVI6PQpAQCAtMTIyLDEyICsxMDcsMTIgQEAKIExPQ0FMX0hFQURFUl9MSUJSQVJJRVM6PQogTE9DQUxfSE9TVF9QUkVGSVg6PQogTE9DQUxfSE9TVF9SRVFVSVJFRF9NT0RVTEVTOj0KK0xPQ0FMX0lHTk9SRV9NQVhfUEFHRV9TSVpFOj0KIExPQ0FMX0lOSVRfUkM6PQogTE9DQUxfSU5KRUNUX0JTU0xfSEFTSDo9CiBMT0NBTF9JTlNUQUxMRURfTU9EVUxFOj0KIExPQ0FMX0lOU1RBTExFRF9NT0RVTEVfU1RFTTo9CiBMT0NBTF9JTlNUUlVNRU5UQVRJT05fRk9SOj0KLUxPQ0FMX0lOVEVSTUVESUFURV9TT1VSQ0VfRElSOj0KIExPQ0FMX0lOVEVSTUVESUFURV9TT1VSQ0VTOj0KIExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTOj0KIExPQ0FMX0lTX0ZVWlpfVEFSR0VUOj0KQEAgLTEzNSwxNSArMTIwLDggQEAKIExPQ0FMX0lTX1JVTlRJTUVfUkVTT1VSQ0VfT1ZFUkxBWTo9CiBMT0NBTF9JU19VTklUX1RFU1Q6PQogTE9DQUxfVEVTVF9PUFRJT05TX1RBR1M6PQotTE9DQUxfSkFDS19DTEFTU1BBVEg6PQogTE9DQUxfSkFDS19DT1ZFUkFHRV9FWENMVURFX0ZJTFRFUjo9CiBMT0NBTF9KQUNLX0NPVkVSQUdFX0lOQ0xVREVfRklMVEVSOj0KLSMgJycgKGllIGRpc2FibGVkKSwgZGlzYWJsZWQsIGZ1bGwsIGluY3JlbWVudGFsLCBqYXZhY19mcm9udGVuZAotTE9DQUxfSkFDS19FTkFCTEVEOj0kKERFRkFVTFRfSkFDS19FTkFCTEVEKQotTE9DQUxfSkFDS19GTEFHUzo9Ci1MT0NBTF9KQUNLX1BMVUdJTjo9Ci1MT0NBTF9KQUNLX1BMVUdJTl9QQVRIOj0KLUxPQ0FMX0pBQ0tfUFJPR1VBUkRfRkxBR1M6PQogTE9DQUxfSkFSX0VYQ0xVREVfRklMRVM6PQogTE9DQUxfSkFSX0VYQ0xVREVfUEFDS0FHRVM6PQogTE9DQUxfSkFSSkFSX1JVTEVTOj0KQEAgLTE1Niw3ICsxMzQsNiBAQAogTE9DQUxfSkFWQV9MSUJSQVJJRVM6PQogTE9DQUxfSkFWQV9SRVNPVVJDRV9ESVJTOj0KIExPQ0FMX0pBVkFfUkVTT1VSQ0VfRklMRVM6PQotTE9DQUxfSkVUSUZJRVJfRU5BQkxFRDo9CiBMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUzo9CiBMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFU19BQkk6PQogTE9DQUxfQ0VSVElGSUNBVEVfTElORUFHRTo9CkBAIC0xOTgsMTAgKzE3NSw4IEBACiBMT0NBTF9OREtfVkVSU0lPTjo9Y3VycmVudAogTE9DQUxfTk9fQ1JUOj0KIExPQ0FMX05PX0RFRkFVTFRfQ09NUElMRVJfRkxBR1M6PQotTE9DQUxfTk9fRlBJRSA6PQogTE9DQUxfTk9fTElCQ1JUX0JVSUxUSU5TOj0KIExPQ0FMX05PX05PVElDRV9GSUxFOj0KLUxPQ0FMX05PX1BJQzo9CiBMT0NBTF9OT1NBTklUSVpFOj0KIExPQ0FMX05PX1NUQU5EQVJEX0xJQlJBUklFUzo9CiBMT0NBTF9OT19TVEFUSUNfQU5BTFlaRVI6PQpAQCAtMjI3LDcgKzIwMiw2IEBACiBMT0NBTF9QUkVCVUlMVF9NT0RVTEVfRklMRTo9CiBMT0NBTF9QUkVCVUlMVF9PQkpfRklMRVM6PQogTE9DQUxfUFJFQlVJTFRfU1RBVElDX0pBVkFfTElCUkFSSUVTOj0KLUxPQ0FMX1BSRUJVSUxUX1NUUklQX0NPTU1FTlRTOj0KIExPQ0FMX1VTRV9FTUJFRERFRF9ERVg6PQogTE9DQUxfVVNFX0VNQkVEREVEX05BVElWRV9MSUJTOj0KIExPQ0FMX1BSRVNVQk1JVF9ESVNBQkxFRDo9CkBAIC0yNjMsNyArMjM3LDYgQEAKIExPQ0FMX1JFU19MSUJSQVJJRVM6PQogTE9DQUxfUkVTT1VSQ0VfRElSOj0KIExPQ0FMX1JMSUJfTElCUkFSSUVTOj0KLUxPQ0FMX1JNVFlQRURFRlM6PQogTE9DQUxfUk9UQVRJT05fTUlOX1NES19WRVJTSU9OOj0KIExPQ0FMX1JVTlRJTUVfTElCUkFSSUVTOj0KIExPQ0FMX1JST19USEVNRTo9CkBAIC0yODgsMTUgKzI2MSwxOSBAQAogTE9DQUxfU09PTkdfSEVBREVSX0pBUiA6PQogTE9DQUxfU09PTkdfSU5TVEFMTF9QQUlSUyA6PQogTE9DQUxfU09PTkdfSU5TVEFMTF9TWU1MSU5LUyA6PQorTE9DQUxfU09PTkdfSU5TVEFMTEVEX0NPTVBBVElCSUxJVFlfU1VQUE9SVF9GSUxFUzo9CiBMT0NBTF9TT09OR19JTlNUQUxMRURfTU9EVUxFIDo9CiBMT0NBTF9TT09OR19KQUNPQ09fUkVQT1JUX0NMQVNTRVNfSkFSIDo9CiBMT0NBTF9TT09OR19MSUNFTlNFX01FVEFEQVRBIDo9CiBMT0NBTF9TT09OR19MSU5LX1RZUEUgOj0KIExPQ0FMX1NPT05HX0xJTlRfUkVQT1JUUyA6PQorTE9DQUxfU09PTkdfTE9HVEFHU19GSUxFUyA6PQorTE9DQUxfU09PTkdfTU9EVUxFX0lORk9fSlNPTiA6PQogTE9DQUxfU09PTkdfTU9EVUxFX1RZUEUgOj0KIExPQ0FMX1NPT05HX1BST0dVQVJEX0RJQ1QgOj0KIExPQ0FMX1NPT05HX1BST0dVQVJEX1VTQUdFX1pJUCA6PQogTE9DQUxfU09PTkdfUkVTT1VSQ0VfRVhQT1JUX1BBQ0tBR0UgOj0KK0xPQ0FMX1NPT05HX1RSQU5TSVRJVkVfUkVTX1BBQ0tBR0VTIDo9CiBMT0NBTF9TT09OR19ERVZJQ0VfUlJPX0RJUlMgOj0KIExPQ0FMX1NPT05HX1BST0RVQ1RfUlJPX0RJUlMgOj0KIExPQ0FMX1NPT05HX1NUQVRJQ19MSUJSQVJZX0VYVFJBX1BBQ0tBR0VTIDo9CkBAIC0zMTgsMTAgKzI5NSwxMiBAQAogTE9DQUxfU1lTVEVNX1NIQVJFRF9MSUJSQVJJRVM6PW5vbmUKIExPQ0FMX1RBUkdFVF9SRVFVSVJFRF9NT0RVTEVTOj0KIExPQ0FMX1RFU1RfQ09ORklHOj0KK0xPQ0FMX1RFU1RfQ09ORklHX1NVRkZJWDo9CiBMT0NBTF9URVNUX0RBVEE6PQogTE9DQUxfVEVTVF9EQVRBX0JJTlM6PQogTE9DQUxfVEVTVF9NQUlOTElORV9NT0RVTEVTOj0KIExPQ0FMX1RFU1RfTU9EVUxFX1RPX1BST0dVQVJEX1dJVEg6PQorTE9DQUxfVEVTVF9NT0RVTEVfQ09ORklHX0JBU0U6PQogTE9DQUxfVElEWTo9CiBMT0NBTF9USURZX0NIRUNLUzo9CiBMT0NBTF9USURZX0ZMQUdTOj0KQEAgLTMzMSwyMSArMzEwLDE2IEBACiBMT0NBTF9VU0VfQUFQVDI6PQogTE9DQUxfVVNFX0NMQU5HX0xMRDo9CiBMT0NBTF9VU0VfVk5ESzo9Ci1MT0NBTF9VU0VfVk5ES19QUk9EVUNUOj0KK0xPQ0FMX0lOX1ZFTkRPUjo9CitMT0NBTF9JTl9QUk9EVUNUOj0KIExPQ0FMX1VTRVNfTElCUkFSSUVTOj0KIExPQ0FMX1ZFTkRPUl9NT0RVTEU6PQogTE9DQUxfVklOVEZfRlJBR01FTlRTOj0KIExPQ0FMX1ZOREtfREVQRU5EX09OX0NPUkVfVkFSSUFOVDo9Ci1MT0NBTF9WVFNDX0ZMQUdTOj0KLUxPQ0FMX1ZUU19JTkNMVURFUzo9Ci1MT0NBTF9WVFNfTU9ERTo9CiBMT0NBTF9XQVJOSU5HU19FTkFCTEU6PQogTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUzo9CiBMT0NBTF9ZQUNDRkxBR1M6PQogTE9DQUxfQ0hFQ0tfRUxGX0ZJTEVTOj0KLSMgVE9ETzogZGVwcmVjYXRlLCBpdCBkb2VzIG5vdGhpbmcKLU9WRVJSSURFX0JVSUxUX01PRFVMRV9QQVRIOj0KLQogIyBhcmNoIHNwZWNpZmljIHZhcmlhYmxlcwogTE9DQUxfQVNGTEFHU18kKFRBUkdFVF9BUkNIKTo9CiBMT0NBTF9DRkxBR1NfJChUQVJHRVRfQVJDSCk6PQpkaWZmIC0tZ2l0IGEvY29yZS9jb21iby9IT1NUX2Rhcndpbi14ODZfNjQubWsgYi9jb3JlL2NvbWJvL0hPU1RfZGFyd2luLm1rCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGNvcmUvY29tYm8vSE9TVF9kYXJ3aW4teDg2XzY0Lm1rCnJlbmFtZSB0byBjb3JlL2NvbWJvL0hPU1RfZGFyd2luLm1rCmluZGV4IGRhYzNiYmYuLjExMDYzZTYgMTAwNjQ0Ci0tLSBhL2NvcmUvY29tYm8vSE9TVF9kYXJ3aW4teDg2XzY0Lm1rCisrKyBiL2NvcmUvY29tYm8vSE9TVF9kYXJ3aW4ubWsKQEAgLTE0LDcgKzE0LDcgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLSMgQ29uZmlndXJhdGlvbiBmb3IgRGFyd2luIChNYWMgT1MgWCkgb24geDg2XzY0LgorIyBDb25maWd1cmF0aW9uIGZvciBEYXJ3aW4gKE1hYyBPUyBYKS4KICMgSW5jbHVkZWQgYnkgY29tYm8vc2VsZWN0Lm1rCiAKIGRlZmluZSAkKGNvbWJvX3Zhcl9wcmVmaXgpdHJhbnNmb3JtLXNoYXJlZC1saWItdG8tdG9jCmRpZmYgLS1naXQgYS9jb3JlL2NvbWJvL0hPU1RfbGludXgteDg2XzY0Lm1rIGIvY29yZS9jb21iby9IT1NUX2xpbnV4LXg4Nl82NC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ1NzMzZi4uMDAwMDAwMAotLS0gYS9jb3JlL2NvbWJvL0hPU1RfbGludXgteDg2XzY0Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBDb25maWd1cmF0aW9uIGZvciBidWlsZHMgaG9zdGVkIG9uIGxpbnV4LXg4Nl82NC4KLSMgSW5jbHVkZWQgYnkgY29tYm8vc2VsZWN0Lm1rCi0KLWRlZmluZSAkKGNvbWJvX3Zhcl9wcmVmaXgpdHJhbnNmb3JtLXNoYXJlZC1saWItdG8tdG9jCi0kKGNhbGwgX2dlbl90b2NfY29tbWFuZF9mb3JfZWxmLCQoMSksJCgyKSkKLWVuZGVmCmRpZmYgLS1naXQgYS9jb3JlL2NvbWJvL0hPU1RfbGludXgteDg2Lm1rIGIvY29yZS9jb21iby9IT1NUX2xpbnV4Lm1rCnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIGNvcmUvY29tYm8vSE9TVF9saW51eC14ODYubWsKcmVuYW1lIHRvIGNvcmUvY29tYm8vSE9TVF9saW51eC5tawppbmRleCAzZjRlYzBhLi5iZmRkM2ViIDEwMDY0NAotLS0gYS9jb3JlL2NvbWJvL0hPU1RfbGludXgteDg2Lm1rCisrKyBiL2NvcmUvY29tYm8vSE9TVF9saW51eC5tawpAQCAtMTQsNyArMTQsNyBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotIyBDb25maWd1cmF0aW9uIGZvciBidWlsZHMgaG9zdGVkIG9uIGxpbnV4LXg4Ni4KKyMgQ29uZmlndXJhdGlvbiBmb3IgYnVpbGRzIGhvc3RlZCBvbiBsaW51eC4KICMgSW5jbHVkZWQgYnkgY29tYm8vc2VsZWN0Lm1rCiAKIGRlZmluZSAkKGNvbWJvX3Zhcl9wcmVmaXgpdHJhbnNmb3JtLXNoYXJlZC1saWItdG8tdG9jCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9zZGtfeDg2Lm1rIGIvY29yZS9jb21iby9hcmNoL2FybTY0L2FybXY5LTJhLm1rCnNpbWlsYXJpdHkgaW5kZXggNzMlCnJlbmFtZSBmcm9tIHRhcmdldC9wcm9kdWN0L3Nka194ODYubWsKcmVuYW1lIHRvIGNvcmUvY29tYm8vYXJjaC9hcm02NC9hcm12OS0yYS5tawppbmRleCAxM2VlNTdkLi42OWZmZGUwIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9zZGtfeDg2Lm1rCisrKyBiL2NvcmUvY29tYm8vYXJjaC9hcm02NC9hcm12OS0yYS5tawpAQCAtMSw1ICsxLDUgQEAKICMKLSMgQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMgQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICMKICMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDggKzE0LDUgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLSMgRG9uJ3QgbW9kaWZ5IHRoaXMgZmlsZSAtIEl0J3MganVzdCBhbiBhbGlhcyEKLQotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9zZGtfcGhvbmVfeDg2Lm1rKQotCi1QUk9EVUNUX05BTUUgOj0gc2RrX3g4NgorIyAubWsgZmlsZSByZXF1aXJlZCB0byBzdXBwb3J0IGJ1aWxkIGZvciB0aGUgQVJNdjkuMi1BIGFyY2ggdmFyaWFudC4KKyMgVGhlIGZpbGUganVzdCBuZWVkcyB0byBiZSBwcmVzZW50LCBpdCBkb2VzIG5vdCBuZWVkIHRvIGNvbnRhaW4gYW55dGhpbmcuCmRpZmYgLS1naXQgYS9jb3JlL2NvbWJvL2FyY2gveDg2L2FsZGVybGFrZS5tayBiL2NvcmUvY29tYm8vYXJjaC94ODYvYWxkZXJsYWtlLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YWU2ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2NvbWJvL2FyY2gveDg2L2FsZGVybGFrZS5tawpAQCAtMCwwICsxLDYgQEAKKyMgQ29uZmlndXJhdGlvbiBmb3IgTGludXggb24geDg2LgorIyBHZW5lcmF0aW5nIGJpbmFyaWVzIGZvciBwcm9jZXNzb3JzCisjIHRoYXQgaGF2ZSBBVlgyIGZlYXR1cmUgZmxhZworIworCitBUkNIX1g4Nl9IQVZFX1NTRTRfMSA6PSB0cnVlCmRpZmYgLS1naXQgYS9jb3JlL2NvbWJvL2FyY2gveDg2L2dvbGRtb250LXdpdGhvdXQtc2hhLXhzYXZlcy5tayBiL2NvcmUvY29tYm8vYXJjaC94ODYvZ29sZG1vbnQtd2l0aG91dC1zaGEteHNhdmVzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOTNjMTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2NvbWJvL2FyY2gveDg2L2dvbGRtb250LXdpdGhvdXQtc2hhLXhzYXZlcy5tawpAQCAtMCwwICsxLDcgQEAKKyMgVGhpcyBmaWxlIGNvbnRhaW5zIGZlYXR1cmUgbWFjcm8gZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlCisjIGdvbGRtb250LXdpdGhvdXQteHNhdmVzIGFyY2ggdmFyaWFudC4KKyMKKyMgU2VlIGJ1aWxkL21ha2UvY29yZS9jb21iby9hcmNoL3g4Ni94ODYtYXRvbS5tayBmb3IgZGlmZmVyZW5jZXMuCisjCisKK0FSQ0hfWDg2X0hBVkVfU1NFNF8xIDo9IHRydWUKZGlmZiAtLWdpdCBhL2NvcmUvY29tYm8vYXJjaC94ODZfNjQvYWxkZXJsYWtlLm1rIGIvY29yZS9jb21iby9hcmNoL3g4Nl82NC9hbGRlcmxha2UubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdhZTZlZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY29tYm8vYXJjaC94ODZfNjQvYWxkZXJsYWtlLm1rCkBAIC0wLDAgKzEsNiBAQAorIyBDb25maWd1cmF0aW9uIGZvciBMaW51eCBvbiB4ODYuCisjIEdlbmVyYXRpbmcgYmluYXJpZXMgZm9yIHByb2Nlc3NvcnMKKyMgdGhhdCBoYXZlIEFWWDIgZmVhdHVyZSBmbGFnCisjCisKK0FSQ0hfWDg2X0hBVkVfU1NFNF8xIDo9IHRydWUKZGlmZiAtLWdpdCBhL2NvcmUvY29tYm8vYXJjaC94ODZfNjQvZ29sZG1vbnQtd2l0aG91dC1zaGEteHNhdmVzLm1rIGIvY29yZS9jb21iby9hcmNoL3g4Nl82NC9nb2xkbW9udC13aXRob3V0LXNoYS14c2F2ZXMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI5M2MxNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY29tYm8vYXJjaC94ODZfNjQvZ29sZG1vbnQtd2l0aG91dC1zaGEteHNhdmVzLm1rCkBAIC0wLDAgKzEsNyBAQAorIyBUaGlzIGZpbGUgY29udGFpbnMgZmVhdHVyZSBtYWNybyBkZWZpbml0aW9ucyBzcGVjaWZpYyB0byB0aGUKKyMgZ29sZG1vbnQtd2l0aG91dC14c2F2ZXMgYXJjaCB2YXJpYW50LgorIworIyBTZWUgYnVpbGQvbWFrZS9jb3JlL2NvbWJvL2FyY2gveDg2L3g4Ni1hdG9tLm1rIGZvciBkaWZmZXJlbmNlcy4KKyMKKworQVJDSF9YODZfSEFWRV9TU0U0XzEgOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29yZS9jb21iby9zZWxlY3QubWsgYi9jb3JlL2NvbWJvL3NlbGVjdC5tawppbmRleCA5YzdlNjllLi5hODM2ZWQ4IDEwMDY0NAotLS0gYS9jb3JlL2NvbWJvL3NlbGVjdC5taworKysgYi9jb3JlL2NvbWJvL3NlbGVjdC5tawpAQCAtMjEsOCArMjEsMTIgQEAKICMJY29tYm9fMm5kX2FyY2hfcHJlZml4IC0tIGl0J3MgZGVmaW5lZCBpZiB0aGlzIGlzIGxvYWRlZCBmb3IgdGhlIDJuZCBhcmNoLgogIwogCi0jIEJ1aWxkIGEgdGFyZ2V0IHN0cmluZyBsaWtlICJsaW51eC1hcm0iIG9yICJkYXJ3aW4teDg2Ii4KLWNvbWJvX29zX2FyY2ggOj0gJCgkKGNvbWJvX3RhcmdldClPUyktJCgkKGNvbWJvX3RhcmdldCkkKGNvbWJvXzJuZF9hcmNoX3ByZWZpeClBUkNIKQoraWZlcSAoJChjb21ib190YXJnZXQpLEhPU1RfKQorICBjb21ib19vc19hcmNoIDo9ICQoSE9TVF9PUykKK2Vsc2UKKyAgIyBCdWlsZCBhIHRhcmdldCBzdHJpbmcgbGlrZSAibGludXgtYXJtIiBvciAiZGFyd2luLXg4NiIuCisgIGNvbWJvX29zX2FyY2ggOj0gJCgkKGNvbWJvX3RhcmdldClPUyktJCgkKGNvbWJvX3RhcmdldCkkKGNvbWJvXzJuZF9hcmNoX3ByZWZpeClBUkNIKQorZW5kaWYKIAogY29tYm9fdmFyX3ByZWZpeCA6PSAkKGNvbWJvXzJuZF9hcmNoX3ByZWZpeCkkKGNvbWJvX3RhcmdldCkKIApkaWZmIC0tZ2l0IGEvY29yZS9jb25maWcubWsgYi9jb3JlL2NvbmZpZy5tawppbmRleCAwYzA4NmVlLi40NTRjMGU1IDEwMDY0NAotLS0gYS9jb3JlL2NvbmZpZy5taworKysgYi9jb3JlL2NvbmZpZy5tawpAQCAtNDIsNiArNDIsOSBAQAogIyBNYXJrIHZhcmlhYmxlcyBkZXByZWNhdGVkL29ic29sZXRlCiBDSEFOR0VTX1VSTCA6PSBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9idWlsZC8rL21hc3Rlci9DaGFuZ2VzLm1kCiAuS0FUSV9SRUFET05MWSA6PSBDSEFOR0VTX1VSTAorJChLQVRJX2RlcHJlY2F0ZWRfdmFyIFRBUkdFVF9VU0VTXzY0X0JJVF9CSU5ERVIsQWxsIGRldmljZXMgdXNlIDY0LWJpdCBiaW5kZXIgYnkgZGVmYXVsdCBub3cuIFVzZXMgb2YgVEFSR0VUX1VTRVNfNjRfQklUX0JJTkRFUiBzaG91bGQgYmUgcmVtb3ZlZC4pCiskKEtBVElfZGVwcmVjYXRlZF92YXIgUFJPRFVDVF9TRVBPTElDWV9TUExJVCxBbGwgZGV2aWNlcyBhcmUgYnVpbHQgd2l0aCBzcGxpdCBzZXBvbGljeS4pCiskKEtBVElfZGVwcmVjYXRlZF92YXIgUFJPRFVDVF9TRVBPTElDWV9TUExJVF9PVkVSUklERSxBbGwgZGV2aWNlcyBhcmUgYnVpbHQgd2l0aCBzcGxpdCBzZXBvbGljeS4pCiAkKEtBVElfb2Jzb2xldGVfdmFyIFBBVEgsRG8gbm90IHVzZSBQQVRIIGRpcmVjdGx5LiBTZWUgJChDSEFOR0VTX1VSTCkjUEFUSCkKICQoS0FUSV9vYnNvbGV0ZV92YXIgUFlUSE9OUEFUSCxEbyBub3QgdXNlIFBZVEhPTlBBVEggZGlyZWN0bHkuIFNlZSAkKENIQU5HRVNfVVJMKSNQWVRIT05QQVRIKQogJChLQVRJX29ic29sZXRlX3ZhciBPVVQsVXNlIE9VVF9ESVIgaW5zdGVhZC4gU2VlICQoQ0hBTkdFU19VUkwpI09VVCkKQEAgLTEwNyw2ICsxMTAsNyBAQAogJChLQVRJX29ic29sZXRlX3ZhciBCVUlMRF9CUk9LRU5fRU5HX0RFQlVHX1RBR1MpCiAkKEtBVElfb2Jzb2xldGVfZXhwb3J0IEl0IGlzIGEgZ2xvYmFsIHNldHRpbmcuIFNlZSAkKENIQU5HRVNfVVJMKSNleHBvcnRfa2V5d29yZCkKICQoS0FUSV9vYnNvbGV0ZV92YXIgQlVJTERfQlJPS0VOX0FORFJPSURNS19FWFBPUlRTKQorJChLQVRJX29ic29sZXRlX3ZhciBQUk9EVUNUX05PVElDRV9TUExJVF9PVkVSUklERSxTdG9wIHVzaW5nIHRoaXMsIGtlZXAgY2FsbSwgYW5kIGNhcnJ5IG9uLikKICQoS0FUSV9vYnNvbGV0ZV92YXIgUFJPRFVDVF9TVEFUSUNfQk9PVF9DT05UUk9MX0hBTCxVc2Ugc2hhcmVkIGxpYnJhcnkgbW9kdWxlIGluc3RlYWQuIFNlZSAkKENIQU5HRVNfVVJMKSNQUk9EVUNUX1NUQVRJQ19CT09UX0NPTlRST0xfSEFMKQogJChLQVRJX29ic29sZXRlX3ZhciBcCiAgIEFSQ0hfQVJNX0hBVkVfQVJNVjdBIFwKQEAgLTE2OCw2ICsxNzIsOCBAQAogJChLQVRJX29ic29sZXRlX3ZhciBCT0FSRF9QUkVCVUlMVF9QVk1GV0lNQUdFLHB2bWZ3LmJpbiBpcyBub3cgYnVpbHQgaW4gQU9TUCBhbmQgY3VzdG9tIHZlcnNpb25zIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkKQogJChLQVRJX29ic29sZXRlX3ZhciBCVUlMRElOR19QVk1GV19JTUFHRSxCVUlMRElOR19QVk1GV19JTUFHRSBpcyBubyBsb25nZXIgdXNlZCkKICQoS0FUSV9vYnNvbGV0ZV92YXIgQk9BUkRfQlVJTERfU1lTVEVNX1JPT1RfSU1BR0UpCiskKEtBVElfb2Jzb2xldGVfdmFyIEZTX0dFVF9TVEFUUykKKyQoS0FUSV9vYnNvbGV0ZV92YXIgQlVJTERfQlJPS0VOX1VTRVNfU09PTkdfUFlUSE9OMl9NT0RVTEVTKQogCiAjIFVzZWQgdG8gZm9yY2UgZ29hbHMgdG8gYnVpbGQuICBPbmx5IHVzZSBmb3IgY29uZGl0aW9uYWxseSBkZWZpbmVkIGdvYWxzLgogLlBIT05ZOiBGT1JDRQpAQCAtMjcwLDcgKzI3Niw3IEBACiAjIEV4OiAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ19uYW1lc3BhY2UsYWNtZSkKIAogZGVmaW5lIGFkZF9zb29uZ19jb25maWdfbmFtZXNwYWNlCi0kKGV2YWwgU09PTkdfQ09ORklHX05BTUVTUEFDRVMgKz0gJDEpIFwKKyQoZXZhbCBTT09OR19DT05GSUdfTkFNRVNQQUNFUyArPSAkKHN0cmlwICQxKSkgXAogJChldmFsIFNPT05HX0NPTkZJR18kKHN0cmlwICQxKSA6PSkKIGVuZGVmCiAKQEAgLTI4MCw4ICsyODYsOCBAQAogIyAkMSBpcyB0aGUgbmFtZXNwYWNlLiAkMiBpcyB0aGUgbGlzdCBvZiB2YXJpYWJsZXMuCiAjIEV4OiAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXIsYWNtZSxDT09MX0ZFQVRVUkVfQSBDT09MX0ZFQVRVUkVfQikKIGRlZmluZSBhZGRfc29vbmdfY29uZmlnX3ZhcgotJChldmFsIFNPT05HX0NPTkZJR18kKHN0cmlwICQxKSArPSAkMikgXAotJChmb3JlYWNoIHYsJChzdHJpcCAkMiksJChldmFsIFNPT05HX0NPTkZJR18kKHN0cmlwICQxKV8kdiA6PSAkKCR2KSkpCiskKGV2YWwgU09PTkdfQ09ORklHXyQoc3RyaXAgJDEpICs9ICQoc3RyaXAgJDIpKSBcCiskKGZvcmVhY2ggdiwkKHN0cmlwICQyKSwkKGV2YWwgU09PTkdfQ09ORklHXyQoc3RyaXAgJDEpXyR2IDo9ICQoc3RyaXAgJCgkdikpKSkKIGVuZGVmCiAKICMgVGhlIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlIGZ1bmN0aW9uIGRlZmluZXMgYSBtYWtlIHZhcmlhYmxlIGFuZCBhbHNvIGFkZHMKQEAgLTI5MCw3ICsyOTYsNyBAQAogIyBFeDogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLGFjbWUsQ09PTF9GRUFUVVJFLHRydWUpCiAKIGRlZmluZSBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZQotJChldmFsICQyIDo9ICQzKSBcCiskKGV2YWwgJChzdHJpcCAkMikgOj0gJChzdHJpcCAkMykpIFwKICQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3ZhciwkMSwkMikKIGVuZGVmCiAKQEAgLTI5OCw4ICszMDQsOCBAQAogIwogIyBpbnRlcm5hbCB1dGlsaXR5IHRvIGRlZmluZSBhIG5hbWVzcGFjZSBhbmQgYSB2YXJpYWJsZSBpbiBpdC4KIGRlZmluZSBzb29uZ19jb25maWdfZGVmaW5lX2ludGVybmFsCi0kKGlmICQoZmlsdGVyICQxLCQoU09PTkdfQ09ORklHX05BTUVTUEFDRVMpKSwsJChldmFsIFNPT05HX0NPTkZJR19OQU1FU1BBQ0VTOj0kKFNPT05HX0NPTkZJR19OQU1FU1BBQ0VTKSAkMSkpIFwKLSQoaWYgJChmaWx0ZXIgJDIsJChTT09OR19DT05GSUdfJChzdHJpcCAkMSkpKSwsJChldmFsIFNPT05HX0NPTkZJR18kKHN0cmlwICQxKTo9JChTT09OR19DT05GSUdfJChzdHJpcCAkMSkpICQyKSkKKyQoaWYgJChmaWx0ZXIgJDEsJChTT09OR19DT05GSUdfTkFNRVNQQUNFUykpLCwkKGV2YWwgU09PTkdfQ09ORklHX05BTUVTUEFDRVM6PSQoU09PTkdfQ09ORklHX05BTUVTUEFDRVMpICQoc3RyaXAgJDEpKSkgXAorJChpZiAkKGZpbHRlciAkMiwkKFNPT05HX0NPTkZJR18kKHN0cmlwICQxKSkpLCwkKGV2YWwgU09PTkdfQ09ORklHXyQoc3RyaXAgJDEpOj0kKFNPT05HX0NPTkZJR18kKHN0cmlwICQxKSkgJChzdHJpcCAkMikpKQogZW5kZWYKIAogIyBzb29uZ19jb25maWdfc2V0IGRlZmluZXMgdGhlIHZhcmlhYmxlIGluIHRoZSBnaXZlbiBTb29uZyBjb25maWcgbmFtZXNwYWNlCkBAIC0zMDgsNyArMzE0LDMyIEBACiAjIEV4OiAkKGNhbGwgc29vbmdfY29uZmlnX3NldCxhY21lLENPT0xfRkVBVFVSRSx0cnVlKQogZGVmaW5lIHNvb25nX2NvbmZpZ19zZXQKICQoY2FsbCBzb29uZ19jb25maWdfZGVmaW5lX2ludGVybmFsLCQxLCQyKSBcCi0kKGV2YWwgU09PTkdfQ09ORklHXyQoc3RyaXAgJDEpXyQoc3RyaXAgJDIpOj0kMykKKyQoZXZhbCBTT09OR19DT05GSUdfJChzdHJpcCAkMSlfJChzdHJpcCAkMik6PSQoc3RyaXAgJDMpKQorZW5kZWYKKworIyBzb29uZ19jb25maWdfc2V0X2Jvb2wgaXMgdGhlIHNhbWUgYXMgc29vbmdfY29uZmlnX3NldCwgYnV0IGl0IHdpbGwKKyMgYWxzbyB0eXBlIHRoZSB2YXJpYWJsZSBhcyBhIGJvb2wsIHNvIHRoYXQgd2hlbiB1c2luZyBzZWxlY3QoKSBleHByZXNzaW9ucworIyBpbiBibHVlcHJpbnQgZmlsZXMgdGhleSBjYW4gdXNlIGJvb2xlYW4gdmFsdWVzIGluc3RlYWQgb2Ygc3RyaW5ncy4KKyMgSXQgd2lsbCBvbmx5IGFjY2VwdCAidHJ1ZSIgZm9yIGl0cyB2YWx1ZSwgYW55IG90aGVyIHZhbHVlIHdpbGwgYmUKKyMgdHJlYXRlZCBhcyBmYWxzZS4KKyMgJDEgaXMgdGhlIG5hbWVzcGFjZS4gJDIgaXMgdGhlIHZhcmlhYmxlIG5hbWUuICQzIGlzIHRoZSB2YXJpYWJsZSB2YWx1ZS4KKyMgRXg6ICQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsYWNtZSxDT09MX0ZFQVRVUkUsdHJ1ZSkKK2RlZmluZSBzb29uZ19jb25maWdfc2V0X2Jvb2wKKyQoY2FsbCBzb29uZ19jb25maWdfZGVmaW5lX2ludGVybmFsLCQxLCQyKSBcCiskKGV2YWwgU09PTkdfQ09ORklHXyQoc3RyaXAgJDEpXyQoc3RyaXAgJDIpOj0kKGZpbHRlciB0cnVlLCQzKSkKKyQoZXZhbCBTT09OR19DT05GSUdfVFlQRV8kKHN0cmlwICQxKV8kKHN0cmlwICQyKTo9Ym9vbCkKK2VuZGVmCisKKyMgc29vbmdfY29uZmlnX3NldF9zdHJpbmdfbGlzdCBpcyB0aGUgc2FtZSBhcyBzb29uZ19jb25maWdfc2V0LCBidXQgaXQgd2lsbAorIyBhbHNvIHR5cGUgdGhlIHZhcmlhYmxlIGFzIGEgbGlzdCBvZiBzdHJpbmdzLCBzbyB0aGF0IHdoZW4gdXNpbmcgc2VsZWN0KCkgZXhwcmVzc2lvbnMKKyMgaW4gYmx1ZXByaW50IGZpbGVzIHRoZXkgY2FuIHVzZSBsaXN0IHZhbHVlcyBpbnN0ZWFkIG9mIHN0cmluZ3MuCisjIFRoZSB2YWx1ZXMgb2YgdGhlIGxpc3QgbXVzdCBiZSBzcGFjZS1zZXBhcmF0ZWQuCisjICQxIGlzIHRoZSBuYW1lc3BhY2UuICQyIGlzIHRoZSB2YXJpYWJsZSBuYW1lLiAkMyBpcyB0aGUgdmFyaWFibGUgdmFsdWUuCisjIEV4OiAkKGNhbGwgc29vbmdfY29uZmlnX3NldF9zdHJpbmdfbGlzdCxhY21lLENPT0xfTElCUyxhIGIpCitkZWZpbmUgc29vbmdfY29uZmlnX3NldF9zdHJpbmdfbGlzdAorJChjYWxsIHNvb25nX2NvbmZpZ19kZWZpbmVfaW50ZXJuYWwsJDEsJDIpIFwKKyQoZXZhbCBTT09OR19DT05GSUdfJChzdHJpcCAkMSlfJChzdHJpcCAkMik6PSQoc3RyaXAgJDMpKQorJChldmFsIFNPT05HX0NPTkZJR19UWVBFXyQoc3RyaXAgJDEpXyQoc3RyaXAgJDIpOj1zdHJpbmdfbGlzdCkKIGVuZGVmCiAKICMgc29vbmdfY29uZmlnX2FwcGVuZCBhcHBlbmRzIHRvIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgaW4gdGhlIGdpdmVuIFNvb25nCkBAIC0zMTcsNyArMzQ4LDcgQEAKICMgJDEgaXMgdGhlIG5hbWVzcGFjZSwgJDIgaXMgdGhlIHZhcmlhYmxlIG5hbWUsICQzIGlzIHRoZSB2YWx1ZQogZGVmaW5lIHNvb25nX2NvbmZpZ19hcHBlbmQKICQoY2FsbCBzb29uZ19jb25maWdfZGVmaW5lX2ludGVybmFsLCQxLCQyKSBcCi0kKGV2YWwgU09PTkdfQ09ORklHXyQoc3RyaXAgJDEpXyQoc3RyaXAgJDIpOj0kKFNPT05HX0NPTkZJR18kKHN0cmlwICQxKV8kKHN0cmlwICQyKSkgJDMpCiskKGV2YWwgU09PTkdfQ09ORklHXyQoc3RyaXAgJDEpXyQoc3RyaXAgJDIpOj0kKFNPT05HX0NPTkZJR18kKHN0cmlwICQxKV8kKHN0cmlwICQyKSkgJChzdHJpcCAkMykpCiBlbmRlZgogCiAjIHNvb25nX2NvbmZpZ19hcHBlbmQgZ2V0cyB0byB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIGluIHRoZSBnaXZlbiBTb29uZwpAQCAtMzM5LDYgKzM3MCwyMiBAQAogSkFWQV9UTVBESVJfQVJHIDo9CiBlbmRpZgogCisjIFRoZXNlIGJ1aWxkIGJyb2tlbiB2YXJpYWJsZXMgYXJlIGludGVuZGVkIHRvIGJlIHNldCBpbiBhIGJ1aWxkc3BlYyBmaWxlLAorIyB3aGlsZSBvdGhlciBidWlsZCBicm9rZW4gZmxhZ3MgYXJlIGV4cGVjdGVkIHRvIGJlIHNldCBpbiBhIGJvYXJkIGNvbmZpZy4KKyMgVGhlc2UgYXJlIGJ1aWxkIGJyb2tlbiB2YXJpYWJsZXMgdGhhdCBhcmUgZXhwZWN0ZWQgdG8gYXBwbHkgYWNyb3NzIGJvYXJkCisjIGNvbmZpZ3MsIGdlbmVyYWxseSBmb3IgY3Jvc3MtY3V0dGluZyBmZWF0dXJlcy4KKworIyBCdWlsZCBicm9rZW4gdmFyaWFibGVzIHRoYXQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYm9vbGVhbnMKK19idWlsZF9icm9rZW5fYm9vbF92YXJzIDo9CisKKyMgQnVpbGQgYnJva2VuIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGxpc3RzCitfYnVpbGRfYnJva2VuX2xpc3RfdmFycyA6PSBcCisgIEJVSUxEX0JST0tFTl9QTFVHSU5fVkFMSURBVElPTiBcCisKK19idWlsZF9icm9rZW5fdmFyX25hbWVzIDo9ICQoX2J1aWxkX2Jyb2tlbl9ib29sX3ZhcnMpCitfYnVpbGRfYnJva2VuX3Zhcl9uYW1lcyArPSAkKF9idWlsZF9icm9rZW5fbGlzdF92YXJzKQorJChmb3JlYWNoIHYsJChfYnVpbGRfYnJva2VuX3Zhcl9uYW1lcyksJChldmFsICQodikgOj0pKQorCiAjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBJbmNsdWRlIHN1Yi1jb25maWd1cmF0aW9uIGZpbGVzCiAjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMzU4LDYgKzQwNSwxMyBAQAogIyBhcmUgc3BlY2lmaWMgdG8gdGhlIHVzZXIncyBidWlsZCBjb25maWd1cmF0aW9uLgogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvZW52c2V0dXAubWsKIAorCiskKGZvcmVhY2ggdmFyLCQoX2J1aWxkX2Jyb2tlbl9ib29sX3ZhcnMpLCBcCisgICQoaWYgJChmaWx0ZXItb3V0IHRydWUgZmFsc2UsJCgkKHZhcikpKSwgXAorICAgICQoZXJyb3IgVmFsaWQgdmFsdWVzIG9mICQodmFyKSBhcmUgInRydWUiLCAiZmFsc2UiLCBhbmQgIiIuIE5vdCAiJCgkKHZhcikpIikpKQorCisuS0FUSV9SRUFET05MWSA6PSAkKF9idWlsZF9icm9rZW5fdmFyX25hbWVzKQorCiAjIFJldHVybnMgdHJ1ZSBpZiBpdCBpcyBhIGxvdyBtZW1vcnkgZGV2aWNlLCBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KIGRlZmluZSBpcy1sb3ctbWVtLWRldmljZQogJChpZiAkKGZpbmRzdHJpbmcgcm8uY29uZmlnLmxvd19yYW09dHJ1ZSwkKFBST0RVQ1RfUFJPUEVSVFlfT1ZFUlJJREVTKSksdHJ1ZSxcCkBAIC0zNzEsMzggKzQyNSwzNSBAQAogJChpZiAkKGZpbmRzdHJpbmcgcm8uY29uZmlnLmxvd19yYW09dHJ1ZSwkKFBST0RVQ1RfT0RNX1BST1BFUlRJRVMpKSx0cnVlLGZhbHNlKSkpKSkpKSkpCiBlbmRlZgogCi0jIEdldCB0aGUgYm9hcmQgQVBJIGxldmVsLgotYm9hcmRfYXBpX2xldmVsIDo9ICQoUExBVEZPUk1fU0RLX1ZFUlNJT04pCi1pZmRlZiBCT0FSRF9BUElfTEVWRUwKLSAgYm9hcmRfYXBpX2xldmVsIDo9ICQoQk9BUkRfQVBJX0xFVkVMKQotZWxzZSBpZmRlZiBCT0FSRF9TSElQUElOR19BUElfTEVWRUwKLSAgIyBWZW5kb3JzIHdpdGggR1JGIG11c3QgZGVmaW5lIEJPQVJEX1NISVBQSU5HX0FQSV9MRVZFTCBmb3IgdGhlIHZlbmRvciBBUEkgbGV2ZWwuCi0gIGJvYXJkX2FwaV9sZXZlbCA6PSAkKEJPQVJEX1NISVBQSU5HX0FQSV9MRVZFTCkKLWVuZGlmCi0KLSMgQ2FsY3VsYXRlIHRoZSBWU1IgdmVuZG9yIEFQSSBsZXZlbC4KLXZzcl92ZW5kb3JfYXBpX2xldmVsIDo9ICQoYm9hcmRfYXBpX2xldmVsKQotCi1pZmRlZiBQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTAotICB2c3JfdmVuZG9yX2FwaV9sZXZlbCA6PSAkKGNhbGwgbWF0aF9taW4sJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCksJChib2FyZF9hcGlfbGV2ZWwpKQotZW5kaWYKLQogIyBTZXQgVEFSR0VUX01BWF9QQUdFX1NJWkVfU1VQUE9SVEVELgorIyBUQVJHRVRfTUFYX1BBR0VfU0laRV9TVVBQT1JURUQgaW5kaWNhdGVzIHRoZSBhbGlnbm1lbnQgb2YgdGhlIEVMRiBzZWdtZW50cy4KIGlmZGVmIFBST0RVQ1RfTUFYX1BBR0VfU0laRV9TVVBQT1JURUQKICAgVEFSR0VUX01BWF9QQUdFX1NJWkVfU1VQUE9SVEVEIDo9ICQoUFJPRFVDVF9NQVhfUEFHRV9TSVpFX1NVUFBPUlRFRCkKIGVsc2UgaWZlcSAoJChzdHJpcCAkKGNhbGwgaXMtbG93LW1lbS1kZXZpY2UpKSx0cnVlKQogICAjIExvdyBtZW1vcnkgZGV2aWNlIHdpbGwgaGF2ZSA0MDk2IGJpbmFyeSBhbGlnbm1lbnQuCiAgIFRBUkdFVF9NQVhfUEFHRV9TSVpFX1NVUFBPUlRFRCA6PSA0MDk2Ci1lbHNlCi0gICMgVGhlIGRlZmF1bHQgYmluYXJ5IGFsaWdubWVudCBmb3IgdXNlcnNwYWNlIGlzIDQwOTYuCitlbHNlIGlmZXEgKCQoY2FsbCBtYXRoX2x0LCQoVlNSX1ZFTkRPUl9BUElfTEVWRUwpLDM0KSx0cnVlKQogICBUQVJHRVRfTUFYX1BBR0VfU0laRV9TVVBQT1JURUQgOj0gNDA5NgotICAjIFdoZW4gVlNSIHZlbmRvciBBUEkgbGV2ZWwgPj0gMzQsIGJpbmFyeSBhbGlnbm1lbnQgd2lsbCBiZSA2NTUzNi4KLSAgaWZlcSAoJChjYWxsIG1hdGhfZ3Rfb3JfZXEsJCh2c3JfdmVuZG9yX2FwaV9sZXZlbCksMzQpLHRydWUpCi0gICAgICBUQVJHRVRfTUFYX1BBR0VfU0laRV9TVVBQT1JURUQgOj0gNjU1MzYKLSAgZW5kaWYKK2Vsc2UgaWZlcSAoLCQoZmlsdGVyIGFybTY0IHg4Nl82NCwkKFRBUkdFVF9BUkNIKSkpCisgICMgVEFSR0VUX01BWF9QQUdFX1NJWkVfU1VQUE9SVEVEID4gNDA5NiBpcyBvbmx5IHN1cHBvcnRlZCBpbiBhcm02NCBhbmQKKyAgIyB4ODZfNjQgdGFyZ2V0cy4KKyAgVEFSR0VUX01BWF9QQUdFX1NJWkVfU1VQUE9SVEVEIDo9IDQwOTYKK2Vsc2UKKyAgIyBUaGUgZGVmYXVsdCBiaW5hcnkgYWxpZ25tZW50IGZvciB1c2Vyc3BhY2UgaXMgMTYzODQuCisgIFRBUkdFVF9NQVhfUEFHRV9TSVpFX1NVUFBPUlRFRCA6PSAxNjM4NAogZW5kaWYKIC5LQVRJX1JFQURPTkxZIDo9IFRBUkdFVF9NQVhfUEFHRV9TSVpFX1NVUFBPUlRFRAogCisjIEJvb2xlYW4gdmFyaWFibGUgZGV0ZXJtaW5pbmcgaWYgQU9TUCByZWxpZXMgb24gYmlvbmljJ3MgUEFHRV9TSVpFIG1hY3JvLgoraWZkZWYgUFJPRFVDVF9OT19CSU9OSUNfUEFHRV9TSVpFX01BQ1JPCisgIFRBUkdFVF9OT19CSU9OSUNfUEFHRV9TSVpFX01BQ1JPIDo9ICQoUFJPRFVDVF9OT19CSU9OSUNfUEFHRV9TSVpFX01BQ1JPKQorZWxzZSBpZmVxICgkKGNhbGwgbWF0aF9sdCwkKFZTUl9WRU5ET1JfQVBJX0xFVkVMKSwzNSksdHJ1ZSkKKyAgVEFSR0VUX05PX0JJT05JQ19QQUdFX1NJWkVfTUFDUk8gOj0gZmFsc2UKK2Vsc2UKKyAgVEFSR0VUX05PX0JJT05JQ19QQUdFX1NJWkVfTUFDUk8gOj0gdHJ1ZQorZW5kaWYKKy5LQVRJX1JFQURPTkxZIDo9IFRBUkdFVF9OT19CSU9OSUNfUEFHRV9TSVpFX01BQ1JPCisKICMgUHJ1bmVkIGRpcmVjdG9yeSBvcHRpb25zIHVzZWQgd2hlbiB1c2luZyBmaW5kbGVhdmVzLnB5CiAjIFNlZSBlbnZzZXR1cC5tayBmb3IgYSBkZXNjcmlwdGlvbiBvZiBTQ0FOX0VYQ0xVREVfRElSUwogRklORF9MRUFWRVNfRVhDTFVERVMgOj0gJChhZGRwcmVmaXggLS1wcnVuZT0sICQoU0NBTl9FWENMVURFX0RJUlMpIC5yZXBvIC5naXQpCkBAIC00ODMsNyArNTM0LDYgQEAKIAogaWZlcSAoJChDQUxMRURfRlJPTV9TRVRVUCksdHJ1ZSkKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2NjYWNoZS5tawotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvZ29tYS5tawogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvcmJlLm1rCiBlbmRpZgogCkBAIC01NDgsNyArNTk4LDEwIEBACiBESVNBQkxFX1BSRU9QVF9CT09UX0lNQUdFUyA6PQogaWZuZXEgKCwkKFRBUkdFVF9CVUlMRF9BUFBTKSQoVEFSR0VUX0JVSUxEX1VOQlVORExFRF9JTUFHRSkpCiAgIERJU0FCTEVfUFJFT1BUIDo9IHRydWUKLSAgRElTQUJMRV9QUkVPUFRfQk9PVF9JTUFHRVMgOj0gdHJ1ZQorICAjIFZTREsgYnVpbGRzIHBlcmZvcm0gZGV4cHJlb3B0IGR1cmluZyBtZXJnZV90YXJnZXRfZmlsZXMgYnVpbGQgc3RlcC4KKyAgaWZuZXEgKHRydWUsJChCVUlMRElOR19XSVRIX1ZTREspKQorICAgIERJU0FCTEVfUFJFT1BUX0JPT1RfSU1BR0VTIDo9IHRydWUKKyAgZW5kaWYKIGVuZGlmCiBpZmVxICh0cnVlLCQoVEFSR0VUX0JVSUxEX1VOQlVORExFRCkpCiAgIGlmbmVxICh0cnVlLCQoVU5CVU5ETEVEX0JVSUxEX1NES1NfRlJPTV9TT1VSQ0UpKQpAQCAtNTc0LDggKzYyNyw2IEBACiBwcmVidWlsdF9idWlsZF90b29sc19iaW4gOj0gJChwcmVidWlsdF9idWlsZF90b29scykvJChIT1NUX1BSRUJVSUxUX1RBRykvYXNhbi9iaW4KIGVuZGlmCiAKLVVTRV9QUkVCVUlMVF9TREtfVE9PTFNfSU5fUExBQ0UgOj0gdHJ1ZQotCiAjIFdvcmsgYXJvdW5kIGZvciBiLzY4NDA2MjIwCiAjIFRoaXMgc2hvdWxkIG1hdGNoIHRoZSBzb29uZyB2ZXJzaW9uLgogVVNFX0Q4IDo9IHRydWUKQEAgLTYwOSw2ICs2NjAsNyBAQAogRklMRVNMSVNUX1VUSUwgOj0kPSBidWlsZC9tYWtlL3Rvb2xzL2ZpbGVzbGlzdF91dGlsLnB5CiBIT1NUX0lOSVRfVkVSSUZJRVIgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvaG9zdF9pbml0X3ZlcmlmaWVyCiBYTUxMSU5UIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3htbGxpbnQKK0FDT05GSUcgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYWNvbmZpZwogCiAjIFNPT05HX1pJUCBpcyBleHBvcnRlZCBieSBTb29uZywgYnV0IG5lZWRzIHRvIGJlIGRlZmluZWQgZWFybHkgZm9yCiAjICRPVVQvZGV4cHJlb3B0Lmdsb2JhbC4gIEl0IHdpbGwgYmUgdmVyaWZpZWQgYWdhaW5zdCB0aGUgU29vbmcgdmVyc2lvbi4KQEAgLTYyOSwyOSArNjgxLDIzIEBACiAjIEZvciBub24tc3VwcG9ydGVkIGhvc3RzLCBkbyBub3QgZ2VuZXJhdGUgYnJlYWtwYWQgc3ltYm9scy4KIEJSRUFLUEFEX0dFTkVSQVRFX1NZTUJPTFMgOj0gZmFsc2UKIGVuZGlmCitHWklQIDo9IHByZWJ1aWx0cy9idWlsZC10b29scy9wYXRoLyQoQlVJTERfT1MpLSQoSE9TVF9QUkVCVUlMVF9BUkNIKS9nemlwCiBQUk9UT0MgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYXByb3RvYyQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKIE5BTk9QQl9TUkNTIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3Byb3RvYy1nZW4tbmFub3BiCiBNS0JPT1RGUyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9ta2Jvb3RmcyQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKLU1JTklHWklQIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL21pbmlnemlwJChIT1NUX0VYRUNVVEFCTEVfU1VGRklYKQorTUlOSUdaSVAgOj0gJChHWklQKQogTFo0IDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2x6NCQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKLUdFTkVSQVRFX0dLSV9DRVJUSUZJQ0FURSA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9nZW5lcmF0ZV9na2lfY2VydGlmaWNhdGUkKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCiBpZmVxICgsJChzdHJpcCAkKEJPQVJEX0NVU1RPTV9NS0JPT1RJTUcpKSkKIE1LQk9PVElNRyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9ta2Jvb3RpbWckKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCiBlbHNlCiBNS0JPT1RJTUcgOj0gJChCT0FSRF9DVVNUT01fTUtCT09USU1HKQogZW5kaWYKLWlmZXEgKCwkKHN0cmlwICQoQk9BUkRfQ1VTVE9NX0JQVFRPT0wpKSkKLUJQVFRPT0wgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYnB0dG9vbCQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKLWVsc2UKLUJQVFRPT0wgOj0gJChCT0FSRF9DVVNUT01fQlBUVE9PTCkKLWVuZGlmCiBpZmVxICgsJChzdHJpcCAkKEJPQVJEX0NVU1RPTV9BVkJUT09MKSkpCiBBVkJUT09MIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2F2YnRvb2wkKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCiBlbHNlCiBBVkJUT09MIDo9ICQoQk9BUkRfQ1VTVE9NX0FWQlRPT0wpCiBlbmRpZgogQVBJQ0hFQ0sgOj0gJChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvbWV0YWxhdmEkKENPTU1PTl9KQVZBX1BBQ0tBR0VfU1VGRklYKQotRlNfR0VUX1NUQVRTIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2ZzX2dldF9zdGF0cyQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKIE1LRVhUVVNFUklNRyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9ta3VzZXJpbWdfbWtlMmZzCiBNS0UyRlNfQ09ORiA6PSBzeXN0ZW0vZXh0cmFzL2V4dDRfdXRpbHMvbWtlMmZzLmNvbmYKIE1LRVJPRlMgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWtmcy5lcm9mcwpAQCAtNjczLDggKzcxOSwxMCBAQAogQlVJTERfU1VQRVJfSU1BR0UgOj0gJChCT0FSRF9DVVNUT01fQlVJTERfU1VQRVJfSU1BR0UpCiBlbmRpZgogSU1HX0ZST01fVEFSR0VUX0ZJTEVTIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2ltZ19mcm9tX3RhcmdldF9maWxlcyQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKK1VOUEFDS19CT09USU1HIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3VucGFja19ib290aW1nCiBNQUtFX1JFQ09WRVJZX1BBVENIIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL21ha2VfcmVjb3ZlcnlfcGF0Y2gkKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCiBPVEFfRlJPTV9UQVJHRVRfRklMRVMgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvb3RhX2Zyb21fdGFyZ2V0X2ZpbGVzJChIT1NUX0VYRUNVVEFCTEVfU1VGRklYKQorT1RBX0ZST01fUkFXX0lNRyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9vdGFfZnJvbV9yYXdfaW1nJChIT1NUX0VYRUNVVEFCTEVfU1VGRklYKQogU1BBUlNFX0lNRyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9zcGFyc2VfaW1nJChIT1NUX0VYRUNVVEFCTEVfU1VGRklYKQogQ0hFQ0tfUEFSVElUSU9OX1NJWkVTIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2NoZWNrX3BhcnRpdGlvbl9zaXplcyQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKIFNZTUJPTFNfTUFQIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3N5bWJvbHNfbWFwCkBAIC02ODIsMTQgKzczMCwxMiBAQAogUFJPR1VBUkRfSE9NRSA6PSBleHRlcm5hbC9wcm9ndWFyZAogUFJPR1VBUkQgOj0gJChQUk9HVUFSRF9IT01FKS9iaW4vcHJvZ3VhcmQuc2gKIFBST0dVQVJEX0RFUFMgOj0gJChQUk9HVUFSRCkgJChQUk9HVUFSRF9IT01FKS9saWIvcHJvZ3VhcmQuamFyCi1KQVZBVEFHUyA6PSBidWlsZC9tYWtlL3Rvb2xzL2phdmEtZXZlbnQtbG9nLXRhZ3MucHkKLU1FUkdFVEFHUyA6PSBidWlsZC9tYWtlL3Rvb2xzL21lcmdlLWV2ZW50LWxvZy10YWdzLnB5CitKQVZBVEFHUyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9qYXZhLWV2ZW50LWxvZy10YWdzCitNRVJHRVRBR1MgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWVyZ2UtZXZlbnQtbG9nLXRhZ3MKIEFQUEVORDJTSU1HIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2FwcGVuZDJzaW1nCiBWRVJJVFlfU0lHTkVSIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3Zlcml0eV9zaWduZXIKIEJVSUxEX1ZFUklUWV9NRVRBREFUQSA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9idWlsZF92ZXJpdHlfbWV0YWRhdGEKIEJVSUxEX1ZFUklUWV9UUkVFIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2J1aWxkX3Zlcml0eV90cmVlCi1GVVRJTElUWSA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9mdXRpbGl0eS1ob3N0Ci1WQk9PVF9TSUdORVIgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvdmJvb3Rfc2lnbmVyCiAKIERFWERVTVAgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZGV4ZHVtcCQoQlVJTERfRVhFQ1VUQUJMRV9TVUZGSVgpCiBQUk9GTUFOIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3Byb2ZtYW4KQEAgLTcwNiw3ICs3NTIsNyBAQAogIyBQYXRoIHRvIHRvb2xzLmphcgogSE9TVF9KREtfVE9PTFNfSkFSIDo9ICQoQU5EUk9JRF9KQVZBOF9IT01FKS9saWIvdG9vbHMuamFyCiAKLUFQSUNIRUNLX0NPTU1BTkQgOj0gJChKQVZBKSAtWG14NGcgLWphciAkKEFQSUNIRUNLKSAtLW5vLWJhbm5lcgorQVBJQ0hFQ0tfQ09NTUFORCA6PSAkKEpBVkEpIC1YbXg0ZyAtamFyICQoQVBJQ0hFQ0spCiAKICMgQm9vbGVhbiB2YXJpYWJsZSBkZXRlcm1pbmluZyBpZiB0aGUgYWxsb3cgbGlzdCBmb3IgY29tcGF0aWJsZSBwcm9wZXJ0aWVzIGlzIGVuYWJsZWQKIFBST0RVQ1RfQ09NUEFUSUJMRV9QUk9QRVJUWSA6PSB0cnVlCkBAIC03MjcsMTcgKzc3Myw5IEBACiAgIFBST0RVQ1RfRlVMTF9UUkVCTEUgOj0gdHJ1ZQogZW5kaWYKIAotIyBUT0RPKGIvNjk4NjUwMzIpOiBNYWtlIFBST0RVQ1RfTk9USUNFX1NQTElUIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGFuZCByZW1vdmUKLSMgICAgcmVmZXJlbmNlcyB0byBpdCBoZXJlIGFuZCBiZWxvdy4KLWlmZGVmIFBST0RVQ1RfTk9USUNFX1NQTElUX09WRVJSSURFCi0gICAkKGVycm9yIFBST0RVQ1RfTk9USUNFX1NQTElUX09WRVJSSURFIGNhbm5vdCBiZSBzZXQuKQotZW5kaWYKLQogcmVxdWlyZW1lbnRzIDo9IFwKICAgICBQUk9EVUNUX1RSRUJMRV9MSU5LRVJfTkFNRVNQQUNFUyBcCi0gICAgUFJPRFVDVF9TRVBPTElDWV9TUExJVCBcCi0gICAgUFJPRFVDVF9FTkZPUkNFX1ZJTlRGX01BTklGRVNUIFwKLSAgICBQUk9EVUNUX05PVElDRV9TUExJVAorICAgIFBST0RVQ1RfRU5GT1JDRV9WSU5URl9NQU5JRkVTVAogCiAjIElmIGl0IGlzIG92ZXJyaWRlbiwgdGhlbiB0aGUgcmVxdWlyZW1lbnQgb3ZlcnJpZGUgaXMgdGFrZW4sIG90aGVyd2lzZSBpdCdzCiAjIFBST0RVQ1RfRlVMTF9UUkVCTEUKQEAgLTc1MCwxMyArNzg4LDggQEAKIFBST0RVQ1RfRlVMTF9UUkVCTEVfT1ZFUlJJREUgPz0KICQoZm9yZWFjaCByZXEsJChyZXF1aXJlbWVudHMpLCQoZXZhbCAkKHJlcSlfT1ZFUlJJREUgPz0pKQogCi1pZm5lcSAoJChQUk9EVUNUX1NFUE9MSUNZX1NQTElUKSx0cnVlKQotIyBXQVJOSU5HOiBETyBOT1QgQ0hBTkdFOiBpZiB5b3UgYXJlIGRvd25zdHJlYW0gb2YgQU9TUCwgYW5kIHlvdSBjaGFuZ2UgdGhpcywgd2l0aG91dAotIyBsZXR0aW5nIHVwc3RyZWFtIGtub3cgaXQncyBpbXBvcnRhbnQgdG8geW91LCB3ZSBtYXkgZG8gY2xlYW51cCB3aGljaCBicmVha3MgdGhpcwotIyBzaWduaWZpY2FudGx5LiBQbGVhc2UgbGV0IHVzIGtub3cgaWYgeW91IGFyZSBjaGFuZ2luZyB0aGlzLgotIyBUT0RPKGIvMjU3MTc2MDE3KSAtIHVuc3BsaXQgc2Vwb2xpY3kgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZAotUFJPRFVDVF9TRVBPTElDWV9TUExJVCA6PSB0cnVlCi1lbmRpZgorIyB1c2VkIHRvIGJlIGEgcGFydCBvZiBQUk9EVUNUX0ZVTExfVFJFQkxFLCBidXQgbm93IGFsd2F5cyBzZXQgaXQKK1BST0RVQ1RfTk9USUNFX1NQTElUIDo9IHRydWUKIAogIyBUT0RPKGIvMTE0NDg4ODcwKTogZGlzYWxsb3cgUFJPRFVDVF9GVUxMX1RSRUJMRV9PVkVSUklERSBmcm9tIGJlaW5nIHVzZWQuCiAuS0FUSV9SRUFET05MWSA6PSBcCkBAIC03NjQsNiArNzk3LDExIEBACiAgICAgJChmb3JlYWNoIHJlcSwkKHJlcXVpcmVtZW50cyksJChyZXEpX09WRVJSSURFKSBcCiAgICAgJChyZXF1aXJlbWVudHMpIFwKICAgICBQUk9EVUNUX0ZVTExfVFJFQkxFIFwKKyAgICBQUk9EVUNUX05PVElDRV9TUExJVCBcCisKK2lmbmVxICgkKFBST0RVQ1RfRlVMTF9UUkVCTEUpLHRydWUpCisgICAgJCh3YXJuaW5nIFRoaXMgZGV2aWNlIGRvZXMgbm90IGhhdmUgVHJlYmxlIGVuYWJsZWQuIFRoaXMgaXMgdW5zYWZlLikKK2VuZGlmCiAKICQoS0FUSV9vYnNvbGV0ZV92YXIgJChmb3JlYWNoIHJlcSwkKHJlcXVpcmVtZW50cyksJChyZXEpX09WRVJSSURFKSBcCiAgICAgLFRoaXMgc2hvdWxkIGJlIHJlZmVyZW5jZWQgd2l0aG91dCB0aGUgX09WRVJSSURFIHN1ZmZpeC4pCkBAIC03NzgsMzUgKzgxNiwzMSBAQAogICBCT0FSRF9QUk9QRVJUWV9PVkVSUklERVNfU1BMSVRfRU5BQkxFRCA/PSB0cnVlCiBlbmRpZgogCi0jIFN0YXJ0aW5nIGluIEFuZHJvaWQgVSwgbm9uLVZOREsgZGV2aWNlcyBub3Qgc3VwcG9ydGVkCi0jIFdBUk5JTkc6IERPIE5PVCBDSEFOR0U6IGlmIHlvdSBhcmUgZG93bnN0cmVhbSBvZiBBT1NQLCBhbmQgeW91IGNoYW5nZSB0aGlzLCB3aXRob3V0Ci0jIGxldHRpbmcgdXBzdHJlYW0ga25vdyBpdCdzIGltcG9ydGFudCB0byB5b3UsIHdlIG1heSBkbyBjbGVhbnVwIHdoaWNoIGJyZWFrcyB0aGlzCi0jIHNpZ25pZmljYW50bHkuIFBsZWFzZSBsZXQgdXMga25vdyBpZiB5b3UgYXJlIGNoYW5naW5nIHRoaXMuCi1pZm5kZWYgQk9BUkRfVk5ES19WRVJTSU9OCi0jIFJFQUQgV0FSTklORyAtIERPIE5PVCBDSEFOR0UKLUJPQVJEX1ZOREtfVkVSU0lPTiA6PSBjdXJyZW50Ci0jIFJFQUQgV0FSTklORyAtIERPIE5PVCBDSEFOR0UKLWVuZGlmCi0KLWlmZGVmIFBST0RVQ1RfUFJPRFVDVF9WTkRLX1ZFUlNJT04KLSAgaWZuZGVmIEJPQVJEX1ZOREtfVkVSU0lPTgotICAgICMgVk5ESyBmb3IgcHJvZHVjdCBwYXJ0aXRpb24gaXMgbm90IGF2YWlsYWJsZSB1bmxlc3MgQk9BUkRfVk5ES19WRVJTSU9OCi0gICAgIyBkZWZpbmVkLgotICAgICQoZXJyb3IgUFJPRFVDVF9QUk9EVUNUX1ZOREtfVkVSU0lPTiBjYW5ub3QgYmUgZGVmaW5lZCB3aXRob3V0IGRlZmluaW5nIEJPQVJEX1ZOREtfVkVSU0lPTikKK2lmbmVxICgkKGNhbGwgbWF0aF9ndF9vcl9lcSwkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSwzNiksKQorICBpZm5lcSAoJChORUVEX0FJRExfTkRLX1BMQVRGT1JNX0JBQ0tFTkQpLCkKKyAgICAkKGVycm9yIE11c3Qgbm90IHNldCBORUVEX0FJRExfTkRLX1BMQVRGT1JNX0JBQ0tFTkQsIGJ1dCBpdCBpcyBzZXQgdG86ICQoTkVFRF9BSURMX05ES19QTEFURk9STV9CQUNLRU5EKS4gU3VwcG9ydCB3aWxsIGJlIHJlbW92ZWQuKQogICBlbmRpZgogZW5kaWYKIAoraWZkZWYgUFJPRFVDVF9DSEVDS19QUkVCVUlMVF9NQVhfUEFHRV9TSVpFCisgIFRBUkdFVF9DSEVDS19QUkVCVUlMVF9NQVhfUEFHRV9TSVpFIDo9ICQoUFJPRFVDVF9DSEVDS19QUkVCVUlMVF9NQVhfUEFHRV9TSVpFKQorZWxzZSBpZmVxICh0cnVlLCQoVEFSR0VUX0JVSUxEX1VOQlVORExFRCkpCisgICMgdW5idW5kbGVkIGJ1aWxkcyBtYXkgbm90IGhhdmUgdXBkYXRlZCBidWlsZCBzb3VyY2VzCisgIFRBUkdFVF9DSEVDS19QUkVCVUlMVF9NQVhfUEFHRV9TSVpFIDo9IGZhbHNlCitlbHNlIGlmbmVxICgkKGNhbGwgbWF0aF9ndF9vcl9lcSwkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSwzNiksKQorICBUQVJHRVRfQ0hFQ0tfUFJFQlVJTFRfTUFYX1BBR0VfU0laRSA6PSB0cnVlCitlbHNlCisgIFRBUkdFVF9DSEVDS19QUkVCVUlMVF9NQVhfUEFHRV9TSVpFIDo9IGZhbHNlCitlbmRpZgorLktBVElfUkVBRE9OTFkgOj0gVEFSR0VUX0NIRUNLX1BSRUJVSUxUX01BWF9QQUdFX1NJWkUKKwogIyBTZXQgQk9BUkRfU1lTVEVNU0RLX1ZFUlNJT05TIHRvIHRoZSBsYXRlc3QgU3lzdGVtU0RLIHZlcnNpb24gc3RhcnRpbmcgZnJvbSBQLWxhdW5jaGluZwogIyBkZXZpY2VzIGlmIHVuc2V0LgogaWZuZGVmIEJPQVJEX1NZU1RFTVNES19WRVJTSU9OUwotICBpZmRlZiBQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTAotICBpZm5lcSAoJChjYWxsIG1hdGhfZ3Rfb3JfZXEsJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCksMjgpLCkKLSAgICBpZmVxIChSRUwsJChQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FKSkKLSAgICAgIEJPQVJEX1NZU1RFTVNES19WRVJTSU9OUyA6PSAkKFBMQVRGT1JNX1NES19WRVJTSU9OKQotICAgIGVsc2UKLSAgICAgIEJPQVJEX1NZU1RFTVNES19WRVJTSU9OUyA6PSAkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUpCi0gICAgZW5kaWYKLSAgZW5kaWYKKyAgaWZlcSAoUkVMLCQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkpCisgICAgQk9BUkRfU1lTVEVNU0RLX1ZFUlNJT05TIDo9ICQoUExBVEZPUk1fU0RLX1ZFUlNJT04pCisgIGVsc2UKKyAgICBCT0FSRF9TWVNURU1TREtfVkVSU0lPTlMgOj0gJChQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FKQogICBlbmRpZgogZW5kaWYKIApAQCAtODIyLDIyICs4NTYsNiBAQAogLktBVElfUkVBRE9OTFkgOj0gQk9BUkRfQ1VSUkVOVF9BUElfTEVWRUxfRk9SX1ZFTkRPUl9NT0RVTEVTCiAKIGlmZGVmIFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMCi0gIGJvYXJkX2FwaV9sZXZlbCA6PSAkKGZpcnN0d29yZCAkKEJPQVJEX0FQSV9MRVZFTCkgJChCT0FSRF9TSElQUElOR19BUElfTEVWRUwpKQotICBpZm5lcSAoLCQoYm9hcmRfYXBpX2xldmVsKSkKLSAgICBtaW5fc3lzdGVtc2RrX3ZlcnNpb24gOj0gJChjYWxsIG1hdGhfbWluLCQoYm9hcmRfYXBpX2xldmVsKSwkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSkKLSAgZWxzZQotICAgIG1pbl9zeXN0ZW1zZGtfdmVyc2lvbiA6PSAkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKQotICBlbmRpZgotICBpZm5lcSAoJChjYWxsIG51bWJlcnNfbGVzc190aGFuLCQobWluX3N5c3RlbXNka192ZXJzaW9uKSwkKEJPQVJEX1NZU1RFTVNES19WRVJTSU9OUykpLCkKLSAgICAkKGVycm9yIEJPQVJEX1NZU1RFTVNES19WRVJTSU9OUyAoJChCT0FSRF9TWVNURU1TREtfVkVSU0lPTlMpKSBtdXN0IGFsbCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gQk9BUkRfQVBJX0xFVkVMLCBCT0FSRF9TSElQUElOR19BUElfTEVWRUwgb3IgUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwgKCQobWluX3N5c3RlbXNka192ZXJzaW9uKSkpCi0gIGVuZGlmCi0gIGlmbmVxICgkKGNhbGwgbWF0aF9ndF9vcl9lcSwkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSwyOCksKQotICAgIGlmbmVxICgkKFRBUkdFVF9JU182NF9CSVQpLCB0cnVlKQotICAgICAgaWZuZXEgKCQoVEFSR0VUX1VTRVNfNjRfQklUX0JJTkRFUiksIHRydWUpCi0gICAgICAgICQoZXJyb3IgV2hlbiBQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCA+PSAyOCwgVEFSR0VUX1VTRVNfNjRfQklUX0JJTkRFUiBtdXN0IGJlIHRydWUpCi0gICAgICBlbmRpZgotICAgIGVuZGlmCi0gIGVuZGlmCiAgIGlmbmVxICgkKGNhbGwgbWF0aF9ndF9vcl9lcSwkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSwyOSksKQogICAgIGlmbmVxICgkKEJPQVJEX09UQV9GUkFNRVdPUktfVkJNRVRBX1ZFUlNJT05fT1ZFUlJJREUpLCkKICAgICAgICQoZXJyb3IgV2hlbiBQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCA+PSAyOSwgQk9BUkRfT1RBX0ZSQU1FV09SS19WQk1FVEFfVkVSU0lPTl9PVkVSUklERSBjYW5ub3QgYmUgc2V0KQpAQCAtODYyLDY1ICs4ODAsMzYgQEAKIC5LQVRJX1JFQURPTkxZIDo9IE1BSU5MSU5FX1NFUE9MSUNZX0RFVl9DRVJUSUZJQ0FURVMKIAogQlVJTERfTlVNQkVSX0ZST01fRklMRSA6PSAkJChjYXQgJChTT09OR19PVVRfRElSKS9idWlsZF9udW1iZXIudHh0KQorQlVJTERfSE9TVE5BTUVfRlJPTV9GSUxFIDo9ICQkKGNhdCAkKFNPT05HX09VVF9ESVIpL2J1aWxkX2hvc3RuYW1lLnR4dCkKIEJVSUxEX0RBVEVUSU1FX0ZST01fRklMRSA6PSAkJChjYXQgJChCVUlMRF9EQVRFVElNRV9GSUxFKSkKIAogIyBTRVBvbGljeSB2ZXJzaW9ucwogCi0jIFBMQVRGT1JNX1NFUE9MSUNZX1ZFUlNJT04gaXMgYSBudW1iZXIgb2YgdGhlIGZvcm0gIk5OLm0iIHdpdGggIk5OIiBtYXBwaW5nIHRvCi0jIFBMQVRGT1JNX1NES19WRVJTSU9OIGFuZCAibSIgYXMgYSBtaW5vciBudW1iZXIgd2hpY2ggYWxsb3dzIGZvciBTRUxpbnV4Ci0jIGNoYW5nZXMgaW5kZXBlbmRlbnQgb2YgUExBVEZPUk1fU0RLX1ZFUlNJT04uICBUaGlzIHZhbHVlIHdpbGwgYmUgc2V0IHRvCi0jIDEwMDAwLjAgdG8gcmVwcmVzZW50IHRpcC1vZi10cmVlIGRldmVsb3BtZW50IHRoYXQgaXMgaW5oZXJlbnRseSB1bnN0YWJsZSBhbmQKLSMgdGh1cyBkZXNpZ25lZCBub3QgdG8gd29yayB3aXRoIGFueSBzaGlwcGluZyB2ZW5kb3IgcG9saWN5LiAgVGhpcyBpcyBzaW1pbGFyIGluCi0jIHNwaXJpdCB0byBob3cgREVGQVVMVF9BUFBfVEFSR0VUX1NESyBpcyBzZXQuCi0jIFRoZSBtaW5vciB2ZXJzaW9uICgnbScgY29tcG9uZW50KSBtdXN0IGJlIHVwZGF0ZWQgZXZlcnkgdGltZSBhIHBsYXRmb3JtIHJlbGVhc2UKLSMgaXMgbWFkZSB3aGljaCBicmVha3MgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBwcmV2aW91cyBwbGF0Zm9ybSBzZXBvbGljeSB2ZXJzaW9uLAotIyBub3QganVzdCBvbiBldmVyeSBpbmNyZWFzZSBpbiBQTEFURk9STV9TREtfVkVSU0lPTi4gIFRoZSBtaW5vciB2ZXJzaW9uIHNob3VsZAotIyBiZSByZXNldCB0byAwIG9uIGV2ZXJ5IGJ1bXAgb2YgdGhlIFBMQVRGT1JNX1NES19WRVJTSU9OLgotc2Vwb2xpY3lfbWFqb3JfdmVycyA6PSAzNAotc2Vwb2xpY3lfbWlub3JfdmVycyA6PSAwCi0KLWlmbmVxICgkKHNlcG9saWN5X21ham9yX3ZlcnMpLCAkKFBMQVRGT1JNX1NES19WRVJTSU9OKSkKLSQoZXJyb3Igc2Vwb2xpY3lfbWFqb3JfdmVyc2lvbiBkb2VzIG5vdCBtYXRjaCBQTEFURk9STV9TREtfVkVSU0lPTiwgcGxlYXNlIHVwZGF0ZS4pCi1lbmRpZgotCi1UT1RfU0VQT0xJQ1lfVkVSU0lPTiA6PSAxMDAwMC4wCi1pZm5lcSAoUkVMLCQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkpCi0gICAgUExBVEZPUk1fU0VQT0xJQ1lfVkVSU0lPTiA6PSAkKFRPVF9TRVBPTElDWV9WRVJTSU9OKQotZWxzZQotICAgIFBMQVRGT1JNX1NFUE9MSUNZX1ZFUlNJT04gOj0gJChqb2luICQoYWRkc3VmZml4IC4sJChzZXBvbGljeV9tYWpvcl92ZXJzKSksICQoc2Vwb2xpY3lfbWlub3JfdmVycykpCi1lbmRpZgotc2Vwb2xpY3lfbWFqb3JfdmVycyA6PQotc2Vwb2xpY3lfbWlub3JfdmVycyA6PQotCi0jIEJPQVJEX1NFUE9MSUNZX1ZFUlMgbXVzdCB0YWtlIHRoZSBmb3JtYXQgIk5OLm0iIGFuZCBjb250YWluIHRoZSBzZXBvbGljeQotIyB2ZXJzaW9uIGlkZW50aWZpZXIgY29ycmVzcG9uZGluZyB0byB0aGUgc2Vwb2xpY3kgb24gd2hpY2ggdGhlIG5vbi1wbGF0Zm9ybQotIyBwb2xpY3kgaXMgdG8gYmUgYmFzZWQuIElmIHVuc3BlY2lmaWVkLCB0aGlzIHdpbGwgYnVpbGQgYWdhaW5zdCB0aGUgY3VycmVudAotIyBwdWJsaWMgcGxhdGZvcm0gcG9saWN5IGluIHRyZWUKLWlmbmRlZiBCT0FSRF9TRVBPTElDWV9WRVJTCi0jIFRoZSBkZWZhdWx0IHBsYXRmb3JtIHBvbGljeSB2ZXJzaW9uLgorIyBQTEFURk9STV9TRVBPTElDWV9WRVJTSU9OIGlzIGEgbnVtYmVyIG9mIHRoZSBmb3JtICJZWVlZTU0iIHdpdGggIllZWVlNTSIKKyMgbWFwcGluZyB0byB2RlJDIHZlcnNpb24uCitQTEFURk9STV9TRVBPTElDWV9WRVJTSU9OIDo9ICQoQk9BUkRfQVBJX0xFVkVMKQogQk9BUkRfU0VQT0xJQ1lfVkVSUyA6PSAkKFBMQVRGT1JNX1NFUE9MSUNZX1ZFUlNJT04pCi1lbmRpZgotCi1pZmVxICgkKEJPQVJEX1NFUE9MSUNZX1ZFUlMpLCQoUExBVEZPUk1fU0VQT0xJQ1lfVkVSU0lPTikpCi1JU19UQVJHRVRfTUlYRURfU0VQT0xJQ1kgOj0KLWVsc2UKLUlTX1RBUkdFVF9NSVhFRF9TRVBPTElDWSA6PSB0cnVlCi1lbmRpZgotCi0uS0FUSV9SRUFET05MWSA6PSBJU19UQVJHRVRfTUlYRURfU0VQT0xJQ1kKKy5LQVRJX1JFQURPTkxZIDo9IFBMQVRGT1JNX1NFUE9MSUNZX1ZFUlNJT04gQk9BUkRfU0VQT0xJQ1lfVkVSUwogCiAjIEEgbGlzdCBvZiBTRVBvbGljeSB2ZXJzaW9ucywgYmVzaWRlcyBQTEFURk9STV9TRVBPTElDWV9WRVJTSU9OLCB0aGF0IHRoZSBmcmFtZXdvcmsgc3VwcG9ydHMuCi1QTEFURk9STV9TRVBPTElDWV9DT01QQVRfVkVSU0lPTlMgOj0gXAorUExBVEZPUk1fU0VQT0xJQ1lfQ09NUEFUX1ZFUlNJT05TIDo9ICQoZmlsdGVyLW91dCAkKFBMQVRGT1JNX1NFUE9MSUNZX1ZFUlNJT04pLCBcCiAgICAgMjkuMCBcCiAgICAgMzAuMCBcCiAgICAgMzEuMCBcCiAgICAgMzIuMCBcCiAgICAgMzMuMCBcCisgICAgMzQuMCBcCisgICAgMjAyNDA0IFwKKyAgICApCiAKIC5LQVRJX1JFQURPTkxZIDo9IFwKICAgICBQTEFURk9STV9TRVBPTElDWV9DT01QQVRfVkVSU0lPTlMgXAogICAgIFBMQVRGT1JNX1NFUE9MSUNZX1ZFUlNJT04gXAotICAgIFRPVF9TRVBPTElDWV9WRVJTSU9OIFwKKworQk9BUkRfR0VORlNfTEFCRUxTX1ZFUlNJT04gPz0gJChCT0FSRF9BUElfTEVWRUwpCitpZmVxICgkKGNhbGwgbWF0aF9ndCwkKEJPQVJEX0FQSV9MRVZFTCksJChCT0FSRF9HRU5GU19MQUJFTFNfVkVSU0lPTikpLHRydWUpCisgICQoZXJyb3IgQk9BUkRfR0VORlNfTEFCRUxTX1ZFUlNJT04gKCQoQk9BUkRfR0VORlNfTEFCRUxTX1ZFUlNJT04pKSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBCT0FSRF9BUElfTEVWRUwgKCQoQk9BUkRfQVBJX0xFVkVMKSkpCitlbmRpZgogCiBpZmVxICgkKFBST0RVQ1RfUkVUUk9GSVRfRFlOQU1JQ19QQVJUSVRJT05TKSx0cnVlKQogICBpZm5lcSAoJChQUk9EVUNUX1VTRV9EWU5BTUlDX1BBUlRJVElPTlMpLHRydWUpCkBAIC0xMjEwLDE1ICsxMTk5LDExIEBACiBUQVJHRVRfQVZBSUxBQkxFX1NES19WRVJTSU9OUyA6PSAkKGZpbHRlci1vdXQgJS9tb2R1bGUtbGliICUvc3lzdGVtLXNlcnZlciwkKFRBUkdFVF9BVkFJTEFCTEVfU0RLX1ZFUlNJT05TKSkKIFRBUkdFVF9BVkFJQUxCTEVfU0RLX1ZFUlNJT05TIDo9ICQoY2FsbCBudW1lcmljYWxseV9zb3J0LCQoVEFSR0VUX0FWQUlMQUJMRV9TREtfVkVSU0lPTlMpKQogCi1UQVJHRVRfU0RLX1ZFUlNJT05TX1dJVEhPVVRfSkFWQV8xOF9TVVBQT1JUIDo9ICQoY2FsbCBudW1iZXJzX2xlc3NfdGhhbiwyNCwkKFRBUkdFVF9BVkFJTEFCTEVfU0RLX1ZFUlNJT05TKSkKLVRBUkdFVF9TREtfVkVSU0lPTlNfV0lUSE9VVF9KQVZBXzE5X1NVUFBPUlQgOj0gJChjYWxsIG51bWJlcnNfbGVzc190aGFuLDMwLCQoVEFSR0VUX0FWQUlMQUJMRV9TREtfVkVSU0lPTlMpKQorVEFSR0VUX1NES19WRVJTSU9OU19XSVRIT1VUX0pBVkFfMV85X1NVUFBPUlQgOj0gJChjYWxsIG51bWJlcnNfbGVzc190aGFuLDMwLCQoVEFSR0VUX0FWQUlMQUJMRV9TREtfVkVSU0lPTlMpKQorVEFSR0VUX1NES19WRVJTSU9OU19XSVRIT1VUX0pBVkFfMTFfU1VQUE9SVCA6PSAkKGNhbGwgbnVtYmVyc19sZXNzX3RoYW4sMzIsJChUQVJHRVRfQVZBSUxBQkxFX1NES19WRVJTSU9OUykpCitUQVJHRVRfU0RLX1ZFUlNJT05TX1dJVEhPVVRfSkFWQV8xN19TVVBQT1JUIDo9ICQoY2FsbCBudW1iZXJzX2xlc3NfdGhhbiwzNCwkKFRBUkdFVF9BVkFJTEFCTEVfU0RLX1ZFUlNJT05TKSkKIAotIyBNaXNzaW5nIG9wdGlvbmFsIHVzZXMtbGlicmFyaWVzIHNvIHRoYXQgdGhlIHBsYXRmb3JtIGRvZXNuJ3QgY3JlYXRlIGJ1aWxkIHJ1bGVzIHRoYXQgZGVwZW5kIG9uCi0jIHRoZW0uCi1JTlRFUk5BTF9QTEFURk9STV9NSVNTSU5HX1VTRVNfTElCUkFSSUVTIDo9IFwKLSAgY29tLmdvb2dsZS5hbmRyb2lkLmJsZSBcCi0gIGNvbS5nb29nbGUuYW5kcm9pZC5tZWRpYS5lZmZlY3RzIFwKLSAgY29tLmdvb2dsZS5hbmRyb2lkLndlYXJhYmxlIFwKK0pBVkFfTEFOR1VBR0VfVkVSU0lPTlNfV0lUSE9VVF9TWVNURU1fTU9EVUxFUyA6PSAxLjcgMS44CiAKICMgVGhpcyBpcyB0aGUgc3RhbmRhcmQgd2F5IHRvIG5hbWUgYSBkaXJlY3RvcnkgY29udGFpbmluZyBwcmVidWlsdCB0YXJnZXQKICMgb2JqZWN0cy4gRS5nLiwgcHJlYnVpbHQvJChUQVJHRVRfUFJFQlVJTFRfVEFHKS9saWJjLnNvCkBAIC0xMjM2LDE1ICsxMjIxLDExIEBACiBSU0NPTVBBVF8zMkJJVF9PTkxZX0FQSV9MRVZFTFMgOj0gOCA5IDEwIDExIDEyIDEzIDE0IDE1IDE2IDE3IDE4IDE5IDIwCiBSU0NPTVBBVF9OT19VU0FHRUlPX0FQSV9MRVZFTFMgOj0gOCA5IDEwIDExIDEyIDEzCiAKLSMgQWRkIEJVSUxEX05VTUJFUiB0byBhcHBzIGRlZmF1bHQgdmVyc2lvbiBuYW1lIGlmIGl0J3MgdW5idW5kbGVkIGJ1aWxkLgotaWZkZWYgVEFSR0VUX0JVSUxEX0FQUFMKLVRBUkdFVF9CVUlMRF9XSVRIX0FQUFNfVkVSU0lPTl9OQU1FIDo9IHRydWUKLWVuZGlmCi0KLWlmZGVmIFRBUkdFVF9CVUlMRF9XSVRIX0FQUFNfVkVSU0lPTl9OQU1FCi1BUFBTX0RFRkFVTFRfVkVSU0lPTl9OQU1FIDo9ICQoUExBVEZPUk1fVkVSU0lPTiktJChCVUlMRF9OVU1CRVJfRlJPTV9GSUxFKQotZWxzZQogQVBQU19ERUZBVUxUX1ZFUlNJT05fTkFNRSA6PSAkKFBMQVRGT1JNX1ZFUlNJT04pCisKKyMgQWRkIEJVSUxEX05VTUJFUiB0byBhcHBzIGlmIFBST0RVQ1RfQlVJTERfQVBQU19XSVRIX0JVSUxEX05VTUJFUiBpcyBkZWZpbmVkLgoraWZlcSAoJChQUk9EVUNUX0JVSUxEX0FQUFNfV0lUSF9CVUlMRF9OVU1CRVIpLHRydWUpCisgIEFQUFNfREVGQVVMVF9WRVJTSU9OX05BTUUgOj0gJChQTEFURk9STV9WRVJTSU9OKS0kKEJVSUxEX05VTUJFUl9GUk9NX0ZJTEUpCiBlbmRpZgogCiAjIEFORFJPSURfV0FSTklOR19BTExPV0VEX1BST0pFQ1RTIGlzIGdlbmVyYXRlZCBieSBidWlsZC9zb29uZy4KQEAgLTEyODUsMjIgKzEyNjYsMTI1IEBACiAKIC5LQVRJX1JFQURPTkxZIDo9IEpBVkFDX05JTkpBX1BPT0wgUjhfTklOSkFfUE9PTCBEOF9OSU5KQV9QT09MCiAKKyMgU29vbmcgbW9kdWxlcyB0aGF0IGFyZSBrbm93biB0byBoYXZlIGJyb2tlbiBvcHRpb25hbF91c2VzX2xpYnMgZGVwZW5kZW5jaWVzLgorQlVJTERfV0FSTklOR19CQURfT1BUSU9OQUxfVVNFU19MSUJTX0FMTE9XTElTVCA6PSBMZWdhY3lDYW1lcmEgR2FsbGVyeTIKKwogIyBUaGVzZSBnb2FscyBkb24ndCBuZWVkIHRvIGNvbGxlY3QgYW5kIGluY2x1ZGUgQW5kcm9pZC5ta3MvQ2xlYW5TcGVjLm1rcwogIyBpbiB0aGUgc291cmNlIHRyZWUuCiBkb250X2JvdGhlcl9nb2FscyA6PSBvdXQgcHJvZHVjdC1ncmFwaAogCitpZmVxICgkKFRBUkdFVF9TWVNURU1fUFJPUCksKQorVEFSR0VUX1NZU1RFTV9QUk9QIDo9ICQod2lsZGNhcmQgJChUQVJHRVRfREVWSUNFX0RJUikvc3lzdGVtLnByb3ApCitlbmRpZgorCitpZmVxICgkKFRBUkdFVF9TWVNURU1fRVhUX1BST1ApLCkKK1RBUkdFVF9TWVNURU1fRVhUX1BST1AgOj0gJCh3aWxkY2FyZCAkKFRBUkdFVF9ERVZJQ0VfRElSKS9zeXN0ZW1fZXh0LnByb3ApCitlbmRpZgorCitpZmVxICgkKFRBUkdFVF9QUk9EVUNUX1BST1ApLCkKK1RBUkdFVF9QUk9EVUNUX1BST1AgOj0gJCh3aWxkY2FyZCAkKFRBUkdFVF9ERVZJQ0VfRElSKS9wcm9kdWN0LnByb3ApCitlbmRpZgorCitpZmVxICgkKFRBUkdFVF9PRE1fUFJPUCksKQorVEFSR0VUX09ETV9QUk9QIDo9ICQod2lsZGNhcmQgJChUQVJHRVRfREVWSUNFX0RJUikvb2RtLnByb3ApCitlbmRpZgorCisuS0FUSV9SRUFET05MWSA6PSBcCisgICAgVEFSR0VUX1NZU1RFTV9QUk9QIFwKKyAgICBUQVJHRVRfU1lTVEVNX0VYVF9QUk9QIFwKKyAgICBUQVJHRVRfUFJPRFVDVF9QUk9QIFwKKyAgICBUQVJHRVRfT0RNX1BST1AgXAorCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9zeXNwcm9wX2NvbmZpZy5taworCiAjIE1ha2UgQU5EUk9JRCBTb29uZyBjb25maWcgdmFyaWFibGVzIHZpc2libGUgdG8gQW5kcm9pZC5tayBmaWxlcywgZm9yCiAjIGNvbnNpc3RlbmN5IHdpdGggdGhvc2UgZGVmaW5lZCBpbiBCb2FyZENvbmZpZy5tayBmaWxlcy4KIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2FuZHJvaWRfc29vbmdfY29uZmlnX3ZhcnMubWsKIAorIyBFTU1BX0lOU1RSVU1FTlQgaXMgc2V0IHRvIHRydWUgd2hlbiBjb3ZlcmFnZSBpcyBlbmFibGVkLiBDcmVhdGVzIGEgc3VmZml4IHRvCisjIGRpZmZlcmVjaWF0ZSB0aGUgY292ZXJhZ2UgdmVyc2lvbiBvZiBuaW5qYSBmaWxlcy4gVGhpcyB3aWxsIHNhdmUgNSBtaW51dGVzIG9mCisjIGJ1aWxkIHRpbWUgdXNlZCB0byByZWdlbmVyYXRlIG5pbmphLgoraWZlcSAodHJ1ZSwkKEVNTUFfSU5TVFJVTUVOVCkpCitDT1ZFUkFHRV9TVUZGSVggOj0gLmNvdmVyYWdlCitlbmRpZgorCitTT09OR19WQVJJQUJMRVMgOj0gJChTT09OR19PVVRfRElSKS9zb29uZy4kKFRBUkdFVF9QUk9EVUNUKSQoQ09WRVJBR0VfU1VGRklYKS52YXJpYWJsZXMKK1NPT05HX0VYVFJBX1ZBUklBQkxFUyA6PSAkKFNPT05HX09VVF9ESVIpL3Nvb25nLiQoVEFSR0VUX1BST0RVQ1QpJChDT1ZFUkFHRV9TVUZGSVgpLmV4dHJhLnZhcmlhYmxlcworCiBpZmVxICgkKENBTExFRF9GUk9NX1NFVFVQKSx0cnVlKQogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvbmluamFfY29uZmlnLm1rCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9zb29uZ19jb25maWcubWsKIGVuZGlmCiAKLS1pbmNsdWRlIGV4dGVybmFsL2xpbnV4LWtzZWxmdGVzdC9hbmRyb2lkL2tzZWxmdGVzdF90ZXN0X2xpc3QubWsKLS1pbmNsdWRlIGV4dGVybmFsL2x0cC9hbmRyb2lkL2x0cF9wYWNrYWdlX2xpc3QubWsKLURFRkFVTFRfREFUQV9PVVRfTU9EVUxFUyA6PSBsdHAgJChsdHBfcGFja2FnZXMpICQoa3NlbGZ0ZXN0X21vZHVsZXMpCi0uS0FUSV9SRUFET05MWSA6PSBERUZBVUxUX0RBVEFfT1VUX01PRFVMRVMKK1NPT05HX1ZBUklBQkxFUyA6PQorU09PTkdfRVhUUkFfVkFSSUFCTEVTIDo9CiAKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2R1bXB2YXIubWsKKworaWZkZWYgQk9BUkRfVk5ES19WRVJTSU9OCitCT0FSRF9WTkRLX1ZFUlNJT049CitlbmRpZgoraWZkZWYgUExBVEZPUk1fVk5ES19WRVJTSU9OCitQTEFURk9STV9WTkRLX1ZFUlNJT049CitlbmRpZgorCitpZmVxICh0cnVlLCQoRlVMTF9TWVNURU1fT1BUSU1JWkVfSkFWQSkpCitpZmVxIChmYWxzZSwkKFNZU1RFTV9PUFRJTUlaRV9KQVZBKSkKKyQoZXJyb3IgU1lTVEVNX09QVElNSVpFX0pBVkEgbXVzdCBiZSBlbmFibGVkIHdoZW4gRlVMTF9TWVNURU1fT1BUSU1JWkVfSkFWQSBpcyBlbmFibGVkKQorZW5kaWYKK2VuZGlmCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVmaW5lIGZpbmdlcnByaW50LCB0aHVtYnByaW50LCBhbmQgdmVyc2lvbiB0YWdzIGZvciB0aGUgY3VycmVudCBidWlsZAorIworIyBCVUlMRF9WRVJTSU9OX1RBR1MgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0YWdzIGNob3NlbiBieSB0aGUgZGV2aWNlCisjIGltcGxlbWVudGVyIHRoYXQgZnVydGhlciBkaXN0aW5ndWlzaGVzIHRoZSBidWlsZC4gSXQncyBiYXNpY2FsbHkgZGVmaW5lZAorIyBieSB0aGUgZGV2aWNlIGltcGxlbWVudGVyLiBIZXJlLCB3ZSBhcmUgYWRkaW5nIGEgbWFuZGF0b3J5IHRhZyB0aGF0CisjIGlkZW50aWZpZXMgdGhlIHNpZ25pbmcgY29uZmlnIG9mIHRoZSBidWlsZC4KK0JVSUxEX1ZFUlNJT05fVEFHUyA6PSAkKEJVSUxEX1ZFUlNJT05fVEFHUykKK2lmZXEgKCQoVEFSR0VUX0JVSUxEX1RZUEUpLGRlYnVnKQorICBCVUlMRF9WRVJTSU9OX1RBR1MgKz0gZGVidWcKK2VuZGlmCisjIFRoZSAidGVzdC1rZXlzIiB0YWcgbWFya3MgYnVpbGRzIHNpZ25lZCB3aXRoIHRoZSBvbGQgdGVzdCBrZXlzLAorIyB3aGljaCBhcmUgYXZhaWxhYmxlIGluIHRoZSBTREsuICAiZGV2LWtleXMiIG1hcmtzIGJ1aWxkcyBzaWduZWQgd2l0aAorIyBub24tZGVmYXVsdCBkZXYga2V5cyAodXN1YWxseSBwcml2YXRlIGtleXMgZnJvbSBhIHZlbmRvciBkaXJlY3RvcnkpLgorIyBCb3RoIG9mIHRoZXNlIHRhZ3Mgd2lsbCBiZSByZW1vdmVkIGFuZCByZXBsYWNlZCB3aXRoICJyZWxlYXNlLWtleXMiCisjIHdoZW4gdGhlIHRhcmdldC1maWxlcyBpcyBzaWduZWQgaW4gYSBwb3N0LWJ1aWxkIHN0ZXAuCitpZmVxICgkKERFRkFVTFRfU1lTVEVNX0RFVl9DRVJUSUZJQ0FURSksYnVpbGQvbWFrZS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS90ZXN0a2V5KQorQlVJTERfS0VZUyA6PSB0ZXN0LWtleXMKK2Vsc2UKK0JVSUxEX0tFWVMgOj0gZGV2LWtleXMKK2VuZGlmCitCVUlMRF9WRVJTSU9OX1RBR1MgKz0gJChCVUlMRF9LRVlTKQorQlVJTERfVkVSU0lPTl9UQUdTIDo9ICQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJChzb3J0ICQoQlVJTERfVkVSU0lPTl9UQUdTKSkpCisKKyMgQlVJTERfRklOR0VSUFJJTlQgaXMgdXNlZCB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBjb21iaW5lZCBidWlsZCBhbmQKKyMgcHJvZHVjdDsgdXNlZCBieSB0aGUgT1RBIHNlcnZlci4KK2lmZXEgKCwkKHN0cmlwICQoQlVJTERfRklOR0VSUFJJTlQpKSkKKyAgQlVJTERfRklOR0VSUFJJTlQgOj0gJChQUk9EVUNUX0JSQU5EKS8kKFRBUkdFVF9QUk9EVUNUKS8kKFRBUkdFVF9ERVZJQ0UpOiQoUExBVEZPUk1fVkVSU0lPTikvJChCVUlMRF9JRCkvJChCVUlMRF9OVU1CRVJfRlJPTV9GSUxFKTokKFRBUkdFVF9CVUlMRF9WQVJJQU5UKS8kKEJVSUxEX1ZFUlNJT05fVEFHUykKK2VuZGlmCisKK0JVSUxEX0ZJTkdFUlBSSU5UX0ZJTEUgOj0gJChQUk9EVUNUX09VVCkvYnVpbGRfZmluZ2VycHJpbnQudHh0CitpZm5lcSAoLCQoc2hlbGwgbWtkaXIgLXAgJChQUk9EVUNUX09VVCkgJiYgZWNobyAkKEJVSUxEX0ZJTkdFUlBSSU5UKSA+JChCVUlMRF9GSU5HRVJQUklOVF9GSUxFKS50bXAgJiYgKGlmICEgY21wIC1zICQoQlVJTERfRklOR0VSUFJJTlRfRklMRSkudG1wICQoQlVJTERfRklOR0VSUFJJTlRfRklMRSk7IHRoZW4gbXYgJChCVUlMRF9GSU5HRVJQUklOVF9GSUxFKS50bXAgJChCVUlMRF9GSU5HRVJQUklOVF9GSUxFKTsgZWxzZSBybSAkKEJVSUxEX0ZJTkdFUlBSSU5UX0ZJTEUpLnRtcDsgZmkpICYmIGdyZXAgIiAiICQoQlVJTERfRklOR0VSUFJJTlRfRklMRSkpKQorICAkKGVycm9yIEJVSUxEX0ZJTkdFUlBSSU5UIGNhbm5vdCBjb250YWluIHNwYWNlczogIiQoZmlsZSA8JChCVUlMRF9GSU5HRVJQUklOVF9GSUxFKSkiKQorZW5kaWYKK0JVSUxEX0ZJTkdFUlBSSU5UX0ZST01fRklMRSA6PSAkJChjYXQgJChCVUlMRF9GSU5HRVJQUklOVF9GSUxFKSkKKyMgdW5zZXQgaXQgZm9yIHNhZmV0eS4KK0JVSUxEX0ZJTkdFUlBSSU5UIDo9CisKKyMgQlVJTERfVEhVTUJQUklOVCBpcyB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBzeXN0ZW0gYnVpbGQ7IHVzZWQgYnkgdGhlCisjIE9UQSBzZXJ2ZXIuIFRoaXMgcHVycG9zZWZ1bGx5IGV4Y2x1ZGVzIGFueSBwcm9kdWN0LXNwZWNpZmljIHZhcmlhYmxlcy4KK2lmZXEgKCwkKHN0cmlwICQoQlVJTERfVEhVTUJQUklOVCkpKQorICBCVUlMRF9USFVNQlBSSU5UIDo9ICQoUExBVEZPUk1fVkVSU0lPTikvJChCVUlMRF9JRCkvJChCVUlMRF9OVU1CRVJfRlJPTV9GSUxFKTokKFRBUkdFVF9CVUlMRF9WQVJJQU5UKS8kKEJVSUxEX1ZFUlNJT05fVEFHUykKK2VuZGlmCisKK0JVSUxEX1RIVU1CUFJJTlRfRklMRSA6PSAkKFBST0RVQ1RfT1VUKS9idWlsZF90aHVtYnByaW50LnR4dAoraWZlcSAoJChzdHJpcCAkKEhBU19CVUlMRF9OVU1CRVIpKSx0cnVlKQorJChCVUlMRF9USFVNQlBSSU5UX0ZJTEUpOiAkKEJVSUxEX05VTUJFUl9GSUxFKQorZW5kaWYKK2lmbmVxICgsJChzaGVsbCBta2RpciAtcCAkKFBST0RVQ1RfT1VUKSAmJiBlY2hvICQoQlVJTERfVEhVTUJQUklOVCkgPiQoQlVJTERfVEhVTUJQUklOVF9GSUxFKSAmJiBncmVwICIgIiAkKEJVSUxEX1RIVU1CUFJJTlRfRklMRSkpKQorICAkKGVycm9yIEJVSUxEX1RIVU1CUFJJTlQgY2Fubm90IGNvbnRhaW4gc3BhY2VzOiAiJChmaWxlIDwkKEJVSUxEX1RIVU1CUFJJTlRfRklMRSkpIikKK2VuZGlmCisjIHVuc2V0IGl0IGZvciBzYWZldHkuCitCVUlMRF9USFVNQlBSSU5UX0ZJTEUgOj0KK0JVSUxEX1RIVU1CUFJJTlQgOj0KZGlmZiAtLWdpdCBhL2NvcmUvY29uZmlnX3Nhbml0aXplcnMubWsgYi9jb3JlL2NvbmZpZ19zYW5pdGl6ZXJzLm1rCmluZGV4IGIxZDc5N2UuLmFiMmQ1YzEgMTAwNjQ0Ci0tLSBhL2NvcmUvY29uZmlnX3Nhbml0aXplcnMubWsKKysrIGIvY29yZS9jb25maWdfc2FuaXRpemVycy5tawpAQCAtNjUsNiArNjUsMTggQEAKICAgZW5kaWYKIGVuZGlmCiAKKyMgRGlzYWJsZSBnbG9iYWwgSFdBU2FuIGluIGV4Y2x1ZGVkIHBhdGhzCitpZm5lcSAoJChmaWx0ZXIgaHdhZGRyZXNzLCAkKG15X2dsb2JhbF9zYW5pdGl6ZSkpLCkKKyAgY29tYmluZWRfZXhjbHVkZV9wYXRocyA6PSAkKEhXQVNBTl9FWENMVURFX1BBVEhTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChQUk9EVUNUX0hXQVNBTl9FWENMVURFX1BBVEhTKQorCisgIGlmbmVxICgkKHN0cmlwICQoZm9yZWFjaCBkaXIsJChzdWJzdCAkKGNvbW1hKSwkKHNwYWNlKSwkKGNvbWJpbmVkX2V4Y2x1ZGVfcGF0aHMpKSxcCisgICAgICAgICAkKGZpbHRlciAkKGRpciklLCQoTE9DQUxfUEFUSCkpKSksKQorICAgIG15X2dsb2JhbF9zYW5pdGl6ZSA6PSAkKGZpbHRlci1vdXQgaHdhZGRyZXNzLCQobXlfZ2xvYmFsX3Nhbml0aXplKSkKKyAgICBteV9nbG9iYWxfc2FuaXRpemVfZGlhZyA6PSAkKGZpbHRlci1vdXQgaHdhZGRyZXNzLCQobXlfZ2xvYmFsX3Nhbml0aXplX2RpYWcpKQorICBlbmRpZgorZW5kaWYKKwogaWZuZXEgKCQobXlfZ2xvYmFsX3Nhbml0aXplKSwpCiAgIG15X3Nhbml0aXplIDo9ICQobXlfZ2xvYmFsX3Nhbml0aXplKSAkKG15X3Nhbml0aXplKQogZW5kaWYKQEAgLTE4MCw2ICsxOTIsNyBAQAogaWZuZXEgKCQoZmlsdGVyIGFkZHJlc3MsJChteV9zYW5pdGl6ZSkpLCkKICAgbXlfc2FuaXRpemUgOj0gJChmaWx0ZXItb3V0IGNmaSwkKG15X3Nhbml0aXplKSkKICAgbXlfc2FuaXRpemUgOj0gJChmaWx0ZXItb3V0IG1lbXRhZ19zdGFjaywkKG15X3Nhbml0aXplKSkKKyAgbXlfc2FuaXRpemUgOj0gJChmaWx0ZXItb3V0IG1lbXRhZ19nbG9iYWxzLCQobXlfc2FuaXRpemUpKQogICBteV9zYW5pdGl6ZSA6PSAkKGZpbHRlci1vdXQgbWVtdGFnX2hlYXAsJChteV9zYW5pdGl6ZSkpCiAgIG15X3Nhbml0aXplX2RpYWcgOj0gJChmaWx0ZXItb3V0IGNmaSwkKG15X3Nhbml0aXplX2RpYWcpKQogZW5kaWYKQEAgLTE4Nyw4ICsyMDAsOCBAQAogIyBEaXNhYmxlIG1lbXRhZyBmb3IgaG9zdCB0YXJnZXRzLiBIb3N0IGV4ZWN1dGFibGVzIGluIEFuZHJvaWRNayBmaWxlcyBhcmUKICMgZGVwcmVjYXRlZCwgYnV0IHNvbWUgcGFydG5lcnMgc3RpbGwgaGF2ZSB0aGVtIGZsb2F0aW5nIGFyb3VuZC4KIGlmZGVmIExPQ0FMX0lTX0hPU1RfTU9EVUxFCi0gIG15X3Nhbml0aXplIDo9ICQoZmlsdGVyLW91dCBtZW10YWdfaGVhcCBtZW10YWdfc3RhY2ssJChteV9zYW5pdGl6ZSkpCi0gIG15X3Nhbml0aXplX2RpYWcgOj0gJChmaWx0ZXItb3V0IG1lbXRhZ19oZWFwIG1lbXRhZ19zdGFjaywkKG15X3Nhbml0aXplX2RpYWcpKQorICBteV9zYW5pdGl6ZSA6PSAkKGZpbHRlci1vdXQgbWVtdGFnX2hlYXAgbWVtdGFnX3N0YWNrIG1lbXRhZ19nbG9iYWxzLCQobXlfc2FuaXRpemUpKQorICBteV9zYW5pdGl6ZV9kaWFnIDo9ICQoZmlsdGVyLW91dCBtZW10YWdfaGVhcCBtZW10YWdfc3RhY2sgbWVtdGFnX2dsb2JhbHMsJChteV9zYW5pdGl6ZV9kaWFnKSkKIGVuZGlmCiAKICMgRGlzYWJsZSBzYW5pdGl6ZXJzIHdoaWNoIG5lZWQgdGhlIFVCU2FuIHJ1bnRpbWUgZm9yIGhvc3QgdGFyZ2V0cy4KQEAgLTIyMywxMSArMjM2LDEzIEBACiAgIG15X3Nhbml0aXplIDo9ICQoZmlsdGVyLW91dCBod2FkZHJlc3MsJChteV9zYW5pdGl6ZSkpCiAgIG15X3Nhbml0aXplIDo9ICQoZmlsdGVyLW91dCBtZW10YWdfaGVhcCwkKG15X3Nhbml0aXplKSkKICAgbXlfc2FuaXRpemUgOj0gJChmaWx0ZXItb3V0IG1lbXRhZ19zdGFjaywkKG15X3Nhbml0aXplKSkKKyAgbXlfc2FuaXRpemUgOj0gJChmaWx0ZXItb3V0IG1lbXRhZ19nbG9iYWxzLCQobXlfc2FuaXRpemUpKQogZW5kaWYKIAogaWZuZXEgKCQoZmlsdGVyIGh3YWRkcmVzcywkKG15X3Nhbml0aXplKSksKQogICBteV9zYW5pdGl6ZSA6PSAkKGZpbHRlci1vdXQgYWRkcmVzcywkKG15X3Nhbml0aXplKSkKICAgbXlfc2FuaXRpemUgOj0gJChmaWx0ZXItb3V0IG1lbXRhZ19zdGFjaywkKG15X3Nhbml0aXplKSkKKyAgbXlfc2FuaXRpemUgOj0gJChmaWx0ZXItb3V0IG1lbXRhZ19nbG9iYWxzLCQobXlfc2FuaXRpemUpKQogICBteV9zYW5pdGl6ZSA6PSAkKGZpbHRlci1vdXQgbWVtdGFnX2hlYXAsJChteV9zYW5pdGl6ZSkpCiAgIG15X3Nhbml0aXplIDo9ICQoZmlsdGVyLW91dCB0aHJlYWQsJChteV9zYW5pdGl6ZSkpCiAgIG15X3Nhbml0aXplIDo9ICQoZmlsdGVyLW91dCBjZmksJChteV9zYW5pdGl6ZSkpCkBAIC0yNDQsMTIgKzI1OSwxMiBAQAogICBlbmRpZgogZW5kaWYKIAotaWZuZXEgKCQoZmlsdGVyIG1lbXRhZ19oZWFwIG1lbXRhZ19zdGFjaywkKG15X3Nhbml0aXplKSksKQoraWZuZXEgKCQoZmlsdGVyIG1lbXRhZ19oZWFwIG1lbXRhZ19zdGFjayBtZW10YWdfZ2xvYmFscywkKG15X3Nhbml0aXplKSksKQogICBpZm5lcSAoJChmaWx0ZXIgbWVtdGFnX2hlYXAsJChteV9zYW5pdGl6ZV9kaWFnKSksKQotICAgIG15X2NmbGFncyArPSAtZnNhbml0aXplLW1lbXRhZy1tb2RlPXN5bmMKKyAgICBteV9sZGZsYWdzICs9IC1mc2FuaXRpemUtbWVtdGFnLW1vZGU9c3luYwogICAgIG15X3Nhbml0aXplX2RpYWcgOj0gJChmaWx0ZXItb3V0IG1lbXRhZ19oZWFwLCQobXlfc2FuaXRpemVfZGlhZykpCiAgIGVsc2UKLSAgICBteV9jZmxhZ3MgKz0gLWZzYW5pdGl6ZS1tZW10YWctbW9kZT1hc3luYworICAgIG15X2xkZmxhZ3MgKz0gLWZzYW5pdGl6ZS1tZW10YWctbW9kZT1hc3luYwogICBlbmRpZgogZW5kaWYKIApAQCAtMjYyLDE3ICsyNzcsMjggQEAKIAogaWZuZXEgKCQoZmlsdGVyIG1lbXRhZ19oZWFwLCQobXlfc2FuaXRpemUpKSwpCiAgIG15X2NmbGFncyArPSAtZnNhbml0aXplPW1lbXRhZy1oZWFwCisgIG15X2xkZmxhZ3MgKz0gLWZzYW5pdGl6ZT1tZW10YWctaGVhcAogICBteV9zYW5pdGl6ZSA6PSAkKGZpbHRlci1vdXQgbWVtdGFnX2hlYXAsJChteV9zYW5pdGl6ZSkpCiBlbmRpZgogCiBpZm5lcSAoJChmaWx0ZXIgbWVtdGFnX3N0YWNrLCQobXlfc2FuaXRpemUpKSwpCiAgIG15X2NmbGFncyArPSAtZnNhbml0aXplPW1lbXRhZy1zdGFjaworICBteV9sZGZsYWdzICs9IC1mc2FuaXRpemU9bWVtdGFnLXN0YWNrCiAgIG15X2NmbGFncyArPSAtbWFyY2g9YXJtdjhhK21lbXRhZwogICBteV9sZGZsYWdzICs9IC1tYXJjaD1hcm12OGErbWVtdGFnCiAgIG15X2FzZmxhZ3MgKz0gLW1hcmNoPWFybXY4YSttZW10YWcKICAgbXlfc2FuaXRpemUgOj0gJChmaWx0ZXItb3V0IG1lbXRhZ19zdGFjaywkKG15X3Nhbml0aXplKSkKIGVuZGlmCiAKK2lmbmVxICgkKGZpbHRlciBtZW10YWdfZ2xvYmFscywkKG15X3Nhbml0aXplKSksKQorICBteV9jZmxhZ3MgKz0gLWZzYW5pdGl6ZT1tZW10YWctZ2xvYmFscworICBteV9sZGZsYWdzICs9IC1mc2FuaXRpemU9bWVtdGFnLWdsb2JhbHMKKyAgIyBUT0RPKG1pdGNocCk6IEZvciBub3csIGVuYWJsZSBtZW10YWctaGVhcCB3aXRoIG1lbXRhZy1nbG9iYWxzIGJlY2F1c2UgdGhlCisgICMgbGlua2VyIGlzbid0IG5ldyBlbm91Z2gKKyAgIyAoaHR0cHM6Ly9yZXZpZXdzLmxsdm0ub3JnL2RpZmZlcmVudGlhbC9jaGFuZ2VzZXQvP3JlZj00MjQzNTY2KS4KKyAgbXlfc2FuaXRpemUgOj0gJChmaWx0ZXItb3V0IG1lbXRhZ19nbG9iYWxzLCQobXlfc2FuaXRpemUpKQorZW5kaWYKKwogIyBUU0FOIGlzIG5vdCBzdXBwb3J0ZWQgb24gMzItYml0IGFyY2hpdGVjdHVyZXMuIEZvciBub24tbXVsdGlsaWIgY2FzZXMsIG1ha2UKICMgaXRzIHVzZSBhbiBlcnJvci4gRm9yIG11bHRpbGliIGNhc2VzLCBkb24ndCB1c2UgaXQgZm9yIHRoZSAzMi1iaXQgY2FzZS4KIGlmbmVxICgkKGZpbHRlciB0aHJlYWQsJChteV9zYW5pdGl6ZSkpLCkKQEAgLTMzMiw2ICszNTgsMTIgQEAKICAgbXlfc2FuaXRpemUgOj0gJChmaWx0ZXItb3V0IGNmaSwkKG15X3Nhbml0aXplKSkKICAgbXlfY2ZsYWdzICs9IC1mbm8tbHRvCiAgIG15X2xkZmxhZ3MgKz0gLWZuby1sdG8KKworICAjIFRPRE8oYi8xNDI0MzA1OTIpOiBVcHN0cmVhbSBsaW5rZXIgc2NyaXB0cyBmb3Igc2FuaXRpemVyIHJ1bnRpbWUgbGlicmFyaWVzCisgICMgZGlzY2FyZCB0aGUgc2FuY292X2xvd2VzdF9zdGFjayBzeW1ib2wsIGJlY2F1c2UgaXQncyBlbXVsYXRlZCBUTFMgKGFuZCB0aHVzCisgICMgZG9lc24ndCBtYXRjaCB0aGUgbGlua2VyIHNjcmlwdCBkdWUgdG8gdGhlICJfX2VtdXRsc192LiIgcHJlZml4KS4KKyAgbXlfY2ZsYWdzICs9IC1mbm8tc2FuaXRpemUtY292ZXJhZ2U9c3RhY2stZGVwdGgKKyAgbXlfbGRmbGFncyArPSAtZm5vLXNhbml0aXplLWNvdmVyYWdlPXN0YWNrLWRlcHRoCiBlbmRpZgogCiBpZm5lcSAoJChmaWx0ZXIgaW50ZWdlcl9vdmVyZmxvdywkKG15X3Nhbml0aXplKSksKQpAQCAtMzgxLDcgKzQxMyw2IEBACiAgICAgbXlfbGRmbGFncyArPSAtZnNhbml0aXplPSQoZnNhbml0aXplX2FyZykKICAgZWxzZQogICAgIG15X2NmbGFncyArPSAtZnNhbml0aXplLXRyYXA9YWxsCi0gICAgbXlfY2ZsYWdzICs9IC1mdHJhcC1mdW5jdGlvbj1hYm9ydAogICAgIGlmbmVxICgkKGZpbHRlciBhZGRyZXNzIHRocmVhZCwkKG15X3Nhbml0aXplKSksKQogICAgICAgbXlfY2ZsYWdzICs9IC1mbm8tc2FuaXRpemUtdHJhcD1hZGRyZXNzLHRocmVhZAogICAgICAgbXlfc2hhcmVkX2xpYnJhcmllcyArPSBsaWJkbApAQCAtNDAyLDcgKzQzMyw2IEBACiAgICAgbXlfY2ZsYWdzICs9IC1mdmlzaWJpbGl0eT1kZWZhdWx0CiAgIGVuZGlmCiAgIG15X2xkZmxhZ3MgKz0gJChDRklfRVhUUkFfTERGTEFHUykKLSAgbXlfYXJmbGFncyArPSAtLXBsdWdpbiAkKExMVk1fUFJFQlVJTFRTX1BBVEgpLy4uL2xpYjY0L0xMVk1nb2xkLnNvCiAKICAgaWZlcSAoJChMT0NBTF9GT1JDRV9TVEFUSUNfRVhFQ1VUQUJMRSksdHJ1ZSkKICAgICAgICAgbXlfbGRmbGFncyA6PSAkKGZpbHRlci1vdXQgLWZzYW5pdGl6ZS1jZmktY3Jvc3MtZHNvLCQobXlfbGRmbGFncykpCkBAIC00NTcsNiArNDg3LDEzIEBACiAjIElmIGxvY2FsIG1vZHVsZSBuZWVkcyBIV0FTQU4sIGFkZCBjb21waWxlciBmbGFncy4KIGlmbmVxICgkKGZpbHRlciBod2FkZHJlc3MsJChteV9zYW5pdGl6ZSkpLCkKICAgbXlfY2ZsYWdzICs9ICQoSFdBRERSRVNTX1NBTklUSVpFUl9DT05GSUdfRVhUUkFfQ0ZMQUdTKQorCisgIGlmbmVxICgkKGZpbHRlciBFWEVDVVRBQkxFUyBOQVRJVkVfVEVTVFMsJChMT0NBTF9NT0RVTEVfQ0xBU1MpKSwpCisgICAgaWZuZXEgKCQoTE9DQUxfRk9SQ0VfU1RBVElDX0VYRUNVVEFCTEUpLHRydWUpCisgICAgICBteV9saW5rZXIgOj0gL3N5c3RlbS9iaW4vbGlua2VyX2h3YXNhbjY0CisgICAgZW5kaWYKKyAgZW5kaWYKKwogZW5kaWYKIAogIyBVc2UgbWluaW1hbCBkaWFnbm9zdGljcyB3aGVuIGludGVnZXIgb3ZlcmZsb3cgaXMgZW5hYmxlZDsgbmV2ZXIgZG8gaXQgZm9yIEhPU1QgbW9kdWxlcwpkaWZmIC0tZ2l0IGEvY29yZS9jb3B5X2hlYWRlcnMubWsgYi9jb3JlL2NvcHlfaGVhZGVycy5tawppbmRleCAwNTRkMjcxLi4yZTgyZGI3IDEwMDY0NAotLS0gYS9jb3JlL2NvcHlfaGVhZGVycy5taworKysgYi9jb3JlL2NvcHlfaGVhZGVycy5tawpAQCAtMTMsMTUgKzEzLDEyIEBACiAgICQoY2FsbCBwcmV0dHktZXJyb3IsTW9kdWxlcyB1c2luZyBMT0NBTF9TREtfVkVSU0lPTiBtYXkgbm90IHVzZSBMT0NBTF9DT1BZX0hFQURFUlMpCiBlbmRpZgogCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9sb2NhbF92bmRrLm1rCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9sb2NhbF92ZW5kb3JfcHJvZHVjdC5tawogCi0jIElmIHdlJ3JlIHVzaW5nIHRoZSBWTkRLLCBvbmx5IHZlbmRvciBtb2R1bGVzIHVzaW5nIHRoZSBWTkRLIG1heSB1c2UKLSMgTE9DQUxfQ09QWV9IRUFERVJTLiBQbGF0Zm9ybSBsaWJyYXJpZXMgd2lsbCBub3QgaGF2ZSB0aGUgaW5jbHVkZSBwYXRoCi0jIHByZXNlbnQuCi1pZmRlZiBCT0FSRF9WTkRLX1ZFUlNJT04KLWlmbmRlZiBMT0NBTF9VU0VfVk5ESwotICAkKGNhbGwgcHJldHR5LWVycm9yLE9ubHkgdmVuZG9yIG1vZHVsZXMgdXNpbmcgTE9DQUxfVVNFX1ZOREsgbWF5IHVzZSBMT0NBTF9DT1BZX0hFQURFUlMpCi1lbmRpZgorIyBNb2R1bGVzIGluIHZlbmRvciBvciBwcm9kdWN0IG1heSB1c2UgTE9DQUxfQ09QWV9IRUFERVJTLgorIyBQbGF0Zm9ybSBsaWJyYXJpZXMgd2lsbCBub3QgaGF2ZSB0aGUgaW5jbHVkZSBwYXRoIHByZXNlbnQuCitpZmVxICgkKGNhbGwgbW9kdWxlLWluLXZlbmRvci1vci1wcm9kdWN0KSwpCisgICQoY2FsbCBwcmV0dHktZXJyb3IsT25seSBtb2R1bGVzIGluIHZlbmRvciBvciBwcm9kdWN0IG1heSB1c2UgTE9DQUxfQ09QWV9IRUFERVJTKQogZW5kaWYKIAogIyBDbGVhbiB1cCBMT0NBTF9DT1BZX0hFQURFUlNfVE8sIHNpbmNlIHNvb25nX3VpIHdpbGwgYmUgY29tcGFyaW5nIGNsZWFuZWQKQEAgLTUzLDQgKzUwLDUgQEAKIF9jaEZyb20gOj0KIF9jaFRvIDo9CiAKKyQoaWYgJChteV9yZWdpc3Rlcl9uYW1lKSwkKGV2YWwgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NQUtFX01PRFVMRV9UWVBFOj1DT1BZX0hFQURFUlMpKQogZW5kaWYgIyBMT0NBTF9DT1BZX0hFQURFUlMKZGlmZiAtLWdpdCBhL2NvcmUvZGVmaW5pdGlvbnMubWsgYi9jb3JlL2RlZmluaXRpb25zLm1rCmluZGV4IGU0Y2VlN2EuLjFhYjYzODggMTAwNjQ0Ci0tLSBhL2NvcmUvZGVmaW5pdGlvbnMubWsKKysrIGIvY29yZS9kZWZpbml0aW9ucy5tawpAQCAtMzcsNiArMzcsOCBAQAogIyBzdWItdmFyaWFibGVzLgogQUxMX01PRFVMRVM6PQogCitBTExfTUFLRV9NT0RVTEVfSU5GT19KU09OX01PRFVMRVM6PQorCiAjIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgbm9uLW1vZHVsZSB0YXJnZXRzIGluIHRoZSBzeXN0ZW0uCiBBTExfTk9OX01PRFVMRVM6PQogTk9OX01PRFVMRVNfV0lUSE9VVF9MSUNFTlNFX01FVEFEQVRBOj0KQEAgLTQ4LDIwICs1MCw2IEBACiAjIHNldCBvZiBpbnN0YWxsZWQgdGFyZ2V0cy4KIEFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTOj0KIAotIyBUaGUgbGlzdCBvZiB0YWdzIHRoYXQgaGF2ZSBiZWVuIGRlZmluZWQgYnkKLSMgTE9DQUxfTU9EVUxFX1RBR1MuICBFYWNoIHdvcmQgaW4gdGhpcyB2YXJpYWJsZSBtYXBzCi0jIHRvIGEgY29ycmVzcG9uZGluZyBBTExfTU9EVUxFX1RBR1MuPHRhZ25hbWU+IHZhcmlhYmxlCi0jIHRoYXQgY29udGFpbnMgYWxsIG9mIHRoZSBJTlNUQUxMRURfTU9EVUxFcyB3aXRoIHRoYXQgdGFnLgotQUxMX01PRFVMRV9UQUdTOj0KLQotIyBTaW1pbGFyIHRvIEFMTF9NT0RVTEVfVEFHUywgYnV0IGNvbnRhaW5zIHRoZSBzaG9ydCBuYW1lcwotIyBvZiBhbGwgdGFyZ2V0cyBmb3IgYSBwYXJ0aWN1bGFyIHRhZy4gIFRoZSB0b3AtbGV2ZWwgdmFyaWFibGUKLSMgd29uJ3QgaGF2ZSB0aGUgbGlzdCBvZiB0YWdzOyAgdXN0IEFMTF9NT0RVTEVfVEFHUyB0byBnZXQKLSMgdGhlIGxpc3Qgb2YgYWxsIGtub3duIHRhZ3MuICAoVGhpcyBtZWFucyB0aGF0IHRoaXMgdmFyaWFibGUKLSMgd2lsbCBhbHdheXMgYmUgZW1wdHk7IGl0J3MganVzdCBoZXJlIGFzIGEgcGxhY2Vob2xkZXIgZm9yCi0jIGl0cyBzdWItdmFyaWFibGVzLikKLUFMTF9NT0RVTEVfTkFNRV9UQUdTOj0KLQogIyBGdWxsIHBhdGggdG8gYWxsIGFzbSwgQywgQysrLCBsZXggYW5kIHlhY2MgZ2VuZXJhdGVkIEMgZmlsZXMuCiAjIFRoZXNlIGFsbCBoYXZlIGFuIG9yZGVyLW9ubHkgZGVwZW5kZW5jeSBvbiB0aGUgY29waWVkIGhlYWRlcnMKIEFMTF9DX0NQUF9FVENfT0JKRUNUUzo9CkBAIC03NSw5ICs2Myw2IEBACiAjIEFsbCBmaW5kYnVncyB4bWwgZmlsZXMKIEFMTF9GSU5EQlVHU19GSUxFUzo9CiAKLSMgR1BMIG1vZHVsZSBsaWNlbnNlIGZpbGVzCi1BTExfR1BMX01PRFVMRV9MSUNFTlNFX0ZJTEVTOj0KLQogIyBQYWNrYWdlcyB3aXRoIGNlcnRpZmljYXRlIHZpb2xhdGlvbgogQ0VSVElGSUNBVEVfVklPTEFUSU9OX01PRFVMRVMgOj0KIApAQCAtMTIzLDkgKzEwOCw2IEBACiAjIEFsbCBtb2R1bGVzIGFscmVhZHkgY29udmVydGVkIHRvIFNvb25nCiBTT09OR19BTFJFQURZX0NPTlYgOj0KIAotIyBBTExfREVQUy4qLkFMTF9ERVBTIGtleXMKLUFMTF9ERVBTLk1PRFVMRVMgOj0KLQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIERlYnVnZ2luZzsgcHJpbnRzIGEgdmFyaWFibGUgbGlzdCB0byBzdGRvdXQKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0xNTAsNiArMTMyLDEwIEBACiAkKGZpbHRlciB0cnVlLCAkKDEpKQogZW5kZWYKIAorZGVmaW5lIGJvb2xlYW4tbm90CiskKGlmICQoZmlsdGVyIHRydWUsJCgxKSksLHRydWUpCitlbmRlZgorCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgUnVsZSBmb3IgdG91Y2hpbmcgR0NOTyBmaWxlcy4KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC04OTcsNyArODgzLDggQEAKIGVuZGVmCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyBEZWNsYXJlIGxpY2Vuc2UgZGVwZW5kZW5jaWVzICQoMikgZm9yIG5vbi1tb2R1bGUgdGFyZ2V0ICQoMSkKKyMjIERlY2xhcmUgbGljZW5zZSBkZXBlbmRlbmNpZXMgJCgyKSB3aXRoIG9wdGlvbmFsIGNvbG9uLXNlcGFyYXRlZAorIyMgYW5ub3RhdGlvbnMgZm9yIG5vbi1tb2R1bGUgdGFyZ2V0ICQoMSkKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiBkZWZpbmUgZGVjbGFyZS1saWNlbnNlLWRlcHMKICQoc3RyaXAgXApAQCAtOTA5LDcgKzg5Niw4IEBACiBlbmRlZgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMgRGVjbGFyZSBsaWNlbnNlIGRlcGVuZGVuY2llcyAkKDIpIGZvciBub24tbW9kdWxlIGNvbnRhaW5lci10eXBlIHRhcmdldCAkKDEpCisjIyBEZWNsYXJlIGxpY2Vuc2UgZGVwZW5kZW5jaWVzICQoMikgd2l0aCBvcHRpb25hbCBjb2xvbi1zZXBhcmF0ZWQKKyMjIGFubm90YXRpb25zIGZvciBub24tbW9kdWxlIGNvbnRhaW5lci10eXBlIHRhcmdldCAkKDEpCiAjIwogIyMgQ29udGFpbmVyLXR5cGUgdGFyZ2V0cyBhcmUgdGFyZ2V0cyBsaWtlIC56aXAgZmlsZXMgdGhhdAogIyMgbWVyZWx5IGFnZ3JlZ2F0ZSBvdGhlciBmaWxlcy4KQEAgLTEyOTIsMzggKzEyODAsNiBAQAogZW5kZWYKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIE1PRFVMRV9UQUcgc2V0IG9wZXJhdGlvbnMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgR2l2ZW4gYSBsaXN0IG9mIHRhZ3MsIHJldHVybiB0aGUgdGFyZ2V0cyB0aGF0IHNwZWNpZnkKLSMgYW55IG9mIHRob3NlIHRhZ3MuCi0jICQoMSk6IHRhZyBsaXN0Ci1kZWZpbmUgbW9kdWxlcy1mb3ItdGFnLWxpc3QKLSQoc29ydCAkKGZvcmVhY2ggdGFnLCQoMSksJChmb3JlYWNoIG0sJChBTExfTU9EVUxFX05BTUVfVEFHUy4kKHRhZykpLCQoQUxMX01PRFVMRVMuJChtKS5JTlNUQUxMRUQpKSkpCi1lbmRlZgotCi0jIFNhbWUgYXMgbW9kdWxlcy1mb3ItdGFnLWxpc3QsIGJ1dCBvcGVyYXRlcyBvbgotIyBBTExfTU9EVUxFX05BTUVfVEFHUy4KLSMgJCgxKTogdGFnIGxpc3QKLWRlZmluZSBtb2R1bGUtbmFtZXMtZm9yLXRhZy1saXN0Ci0kKHNvcnQgJChmb3JlYWNoIHRhZywkKDEpLCQoQUxMX01PRFVMRV9OQU1FX1RBR1MuJCh0YWcpKSkpCi1lbmRlZgotCi0jIEdpdmVuIGFuIGFjY2VwdCBhbmQgcmVqZWN0IGxpc3QsIGZpbmQgdGhlIG1hdGNoaW5nCi0jIHNldCBvZiB0YXJnZXRzLiAgSWYgYSB0YXJnZXQgaGFzIG11bHRpcGxlIHRhZ3MgYW5kCi0jIGFueSBvZiB0aGVtIGFyZSByZWplY3RlZCwgdGhlIHRhcmdldCBpcyByZWplY3RlZC4KLSMgUmVqZWN0IG92ZXJyaWRlcyBhY2NlcHQuCi0jICQoMSk6IGxpc3Qgb2YgdGFncyB0byBhY2NlcHQKLSMgJCgyKTogbGlzdCBvZiB0YWdzIHRvIHJlamVjdAotI1RPRE8oZGJvcnQpOiBkbyAkKGlmICQoc3RyaXAgJCgxKSksJCgxKSwkKEFMTF9NT0RVTEVfVEFHUykpCi0jVE9ETyhqYnEpOiBhcyBvZiAyMDEwMDEwNiBub2JvZHkgdXNlcyB0aGUgc2Vjb25kIHBhcmFtZXRlcgotZGVmaW5lIGdldC10YWdnZWQtbW9kdWxlcwotJChmaWx0ZXItb3V0IFwKLSAgJChjYWxsIG1vZHVsZXMtZm9yLXRhZy1saXN0LCQoMikpLCBcCi0gICAgJChjYWxsIG1vZHVsZXMtZm9yLXRhZy1saXN0LCQoMSkpKQotZW5kZWYKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIEFwcGVuZCBhIGxlYWYgdG8gYSBiYXNlIHBhdGguICBQcm9wZXJseSBkZWFscyB3aXRoCiAjIyBiYXNlIHBhdGhzIGVuZGluZyBpbiAvLgogIyMKQEAgLTE1NDgsMTAgKzE1MDQsMTAgQEAKICMKICMgWW91IG11c3QgY2FsbCB0aGlzIHdpdGggJChldmFsKS4KIGRlZmluZSBkZWZpbmUtYWlkbC1qYXZhLXJ1bGUKLWRlZmluZS1haWRsLWphdmEtcnVsZS1zcmMgOj0gJChwYXRzdWJzdCAlLmFpZGwsJS5qYXZhLCQoc3Vic3QgLi4vLGRvdGRvdC8sJChhZGRwcmVmaXggJCgyKS8sJCgxKSkpKQotJCQoZGVmaW5lLWFpZGwtamF2YS1ydWxlLXNyYykgOiAkKGNhbGwgY2xlYW4tcGF0aCwkKExPQ0FMX1BBVEgpLyQoMSkpICQoQUlETCkKK2RlZmluZV9haWRsX2phdmFfcnVsZV9zcmMgOj0gJChwYXRzdWJzdCAlLmFpZGwsJS5qYXZhLCQoc3Vic3QgLi4vLGRvdGRvdC8sJChhZGRwcmVmaXggJCgyKS8sJCgxKSkpKQorJCQoZGVmaW5lX2FpZGxfamF2YV9ydWxlX3NyYykgOiAkKGNhbGwgY2xlYW4tcGF0aCwkKExPQ0FMX1BBVEgpLyQoMSkpICQoQUlETCkKIAkkJCh0cmFuc2Zvcm0tYWlkbC10by1qYXZhKQotJCgzKSArPSAkJChkZWZpbmUtYWlkbC1qYXZhLXJ1bGUtc3JjKQorJCgzKSArPSAkJChkZWZpbmVfYWlkbF9qYXZhX3J1bGVfc3JjKQogZW5kZWYKIAogIyMgR2l2ZW4gYSAuYWlkbCBmaWxlIHBhdGggZ2VuZXJhdGUgdGhlIHJ1bGUgdG8gY29tcGlsZSBpdCBhIC5jcHAgZmlsZS4KQEAgLTE1NjEsMTAgKzE1MTcsMTAgQEAKICMKICMgWW91IG11c3QgY2FsbCB0aGlzIHdpdGggJChldmFsKS4KIGRlZmluZSBkZWZpbmUtYWlkbC1jcHAtcnVsZQotZGVmaW5lLWFpZGwtY3BwLXJ1bGUtc3JjIDo9ICQocGF0c3Vic3QgJS5haWRsLCUkKExPQ0FMX0NQUF9FWFRFTlNJT04pLCQoc3Vic3QgLi4vLGRvdGRvdC8sJChhZGRwcmVmaXggJCgyKS8sJCgxKSkpKQotJCQoZGVmaW5lLWFpZGwtY3BwLXJ1bGUtc3JjKSA6ICQoY2FsbCBjbGVhbi1wYXRoLCQoTE9DQUxfUEFUSCkvJCgxKSkgJChBSURMX0NQUCkKK2RlZmluZV9haWRsX2NwcF9ydWxlX3NyYyA6PSAkKHBhdHN1YnN0ICUuYWlkbCwlJChMT0NBTF9DUFBfRVhURU5TSU9OKSwkKHN1YnN0IC4uLyxkb3Rkb3QvLCQoYWRkcHJlZml4ICQoMikvLCQoMSkpKSkKKyQkKGRlZmluZV9haWRsX2NwcF9ydWxlX3NyYykgOiAkKGNhbGwgY2xlYW4tcGF0aCwkKExPQ0FMX1BBVEgpLyQoMSkpICQoQUlETF9DUFApCiAJJCQodHJhbnNmb3JtLWFpZGwtdG8tY3BwKQotJCgzKSArPSAkJChkZWZpbmUtYWlkbC1jcHAtcnVsZS1zcmMpCiskKDMpICs9ICQkKGRlZmluZV9haWRsX2NwcF9ydWxlX3NyYykKIGVuZGVmCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0xNTg2LDEwICsxNTQyLDEwIEBACiAjCiAjIFlvdSBtdXN0IGNhbGwgdGhpcyB3aXRoICQoZXZhbCkuCiBkZWZpbmUgZGVmaW5lLXZ0cy1jcHAtcnVsZQotZGVmaW5lLXZ0cy1jcHAtcnVsZS1zcmMgOj0gJChwYXRzdWJzdCAlLnZ0cywlJChMT0NBTF9DUFBfRVhURU5TSU9OKSwkKHN1YnN0IC4uLyxkb3Rkb3QvLCQoYWRkcHJlZml4ICQoMikvLCQoMSkpKSkKLSQkKGRlZmluZS12dHMtY3BwLXJ1bGUtc3JjKSA6ICQoTE9DQUxfUEFUSCkvJCgxKSAkKFZUU0MpCitkZWZpbmVfdnRzX2NwcF9ydWxlX3NyYyA6PSAkKHBhdHN1YnN0ICUudnRzLCUkKExPQ0FMX0NQUF9FWFRFTlNJT04pLCQoc3Vic3QgLi4vLGRvdGRvdC8sJChhZGRwcmVmaXggJCgyKS8sJCgxKSkpKQorJCQoZGVmaW5lX3Z0c19jcHBfcnVsZV9zcmMpIDogJChMT0NBTF9QQVRIKS8kKDEpICQoVlRTQykKIAkkJCh0cmFuc2Zvcm0tdnRzLXRvLWNwcCkKLSQoMykgKz0gJCQoZGVmaW5lLXZ0cy1jcHAtcnVsZS1zcmMpCiskKDMpICs9ICQkKGRlZmluZV92dHNfY3BwX3J1bGVfc3JjKQogZW5kZWYKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTE1OTksNyArMTU1NSw3IEBACiBkZWZpbmUgdHJhbnNmb3JtLWxvZ3RhZ3MtdG8tamF2YQogQG1rZGlyIC1wICQoZGlyICRAKQogQGVjaG8gImxvZ3RhZ3M6ICRAIDw9ICQ8IgotJChoaWRlKSAkKEpBVkFUQUdTKSAtbyAkQCAkPCAkKFBSSVZBVEVfTUVSR0VEX1RBRykKKyQoaGlkZSkgJChKQVZBVEFHUykgLW8gJEAgJDwKIGVuZGVmCiAKIApAQCAtMjM3OCw2ICsyMzM0LDcgQEAKIG1rZGlyIC1wICQoUFJJVkFURV9KQVZBX0dFTl9ESVIpCiAkKGNhbGwgZHVtcC13b3Jkcy10by1maWxlLCQoUFJJVkFURV9SRVNfRkxBVCksJChkaXIgJEApYWFwdDItZmxhdC1saXN0KQogJChjYWxsIGR1bXAtd29yZHMtdG8tZmlsZSwkKFBSSVZBVEVfT1ZFUkxBWV9GTEFUKSwkKGRpciAkQClhYXB0Mi1mbGF0LW92ZXJsYXktbGlzdCkKK2NhdCAkKFBSSVZBVEVfU1RBVElDX0xJQlJBUllfVFJBTlNJVElWRV9SRVNfUEFDS0FHRVNfTElTVFMpIHwgc29ydCAtdSB8IHRyICdcbicgJyAnID4gJChkaXIgJEApYWFwdDItdHJhbnNpdGl2ZS1vdmVybGF5LWxpc3QKICQoaGlkZSkgJChBQVBUMikgbGluayAtbyAkQCBcCiAgICQoUFJJVkFURV9BQVBUX0ZMQUdTKSBcCiAgICQoaWYgJChQUklWQVRFX1NUQVRJQ19MSUJSQVJZX0VYVFJBX1BBQ0tBR0VTKSwkJChjYXQgJChQUklWQVRFX1NUQVRJQ19MSUJSQVJZX0VYVFJBX1BBQ0tBR0VTKSkpIFwKQEAgLTIzOTcsNiArMjM1NCw3IEBACiAgICQoYWRkcHJlZml4IC0tcmVuYW1lLW1hbmlmZXN0LXBhY2thZ2UgLCQoUFJJVkFURV9NQU5JRkVTVF9QQUNLQUdFX05BTUUpKSBcCiAgICQoYWRkcHJlZml4IC0tcmVuYW1lLWluc3RydW1lbnRhdGlvbi10YXJnZXQtcGFja2FnZSAsJChQUklWQVRFX01BTklGRVNUX0lOU1RSVU1FTlRBVElPTl9GT1IpKSBcCiAgIC1SIFxAJChkaXIgJEApYWFwdDItZmxhdC1vdmVybGF5LWxpc3QgXAorICAtUiBcQCQoZGlyICRAKWFhcHQyLXRyYW5zaXRpdmUtb3ZlcmxheS1saXN0IFwKICAgXEAkKGRpciAkQClhYXB0Mi1mbGF0LWxpc3QKICQoU09PTkdfWklQKSAtbyAkKFBSSVZBVEVfU1JDSkFSKSAtQyAkKFBSSVZBVEVfSkFWQV9HRU5fRElSKSAtRCAkKFBSSVZBVEVfSkFWQV9HRU5fRElSKQogJChFWFRSQUNUX0pBUl9QQUNLQUdFUykgLWkgJChQUklWQVRFX1NSQ0pBUikgLW8gJChQUklWQVRFX0FBUFRfRVhUUkFfUEFDS0FHRVMpIC0tcHJlZml4ICctLWV4dHJhLXBhY2thZ2VzICcKQEAgLTI2MjYsNyArMjU4NCwxMDggQEAKICAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCA5ODAwMSw5ODUwMCwkKDEpKSwkKDIpKQogICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDk4NTAxLDk5MDAwLCQoMSkpLCQoMikpCiAgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgOTkwMDEsOTk1MDAsJCgxKSksJCgyKSkKLSAgICAgICAgQCQoaWYgJCh3b3JkbGlzdCA5OTUwMSw5OTUwMiwkKDEpKSwkKGVycm9yIGR1bXAtd29yZHMtdG8tZmlsZTogVG9vIG1hbnkgd29yZHMgKCQod29yZHMgJCgxKSkpKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCA5OTUwMSwxMDAwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDAwMDEsMTAwNTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTAwNTAxLDEwMTAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwMTAwMSwxMDE1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDE1MDEsMTAyMDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTAyMDAxLDEwMjUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwMjUwMSwxMDMwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDMwMDEsMTAzNTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTAzNTAxLDEwNDAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwNDAwMSwxMDQ1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDQ1MDEsMTA1MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTA1MDAxLDEwNTUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwNTUwMSwxMDYwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDYwMDEsMTA2NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTA2NTAxLDEwNzAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwNzAwMSwxMDc1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDc1MDEsMTA4MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTA4MDAxLDEwODUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwODUwMSwxMDkwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDkwMDEsMTA5NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTA5NTAxLDExMDAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDExMDAwMSwxMTA1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMTA1MDEsMTExMDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTExMDAxLDExMTUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDExMTUwMSwxMTIwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMTIwMDEsMTEyNTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTEyNTAxLDExMzAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDExMzAwMSwxMTM1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMTM1MDEsMTE0MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTE0MDAxLDExNDUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDExNDUwMSwxMTUwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMTUwMDEsMTE1NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTE1NTAxLDExNjAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDExNjAwMSwxMTY1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMTY1MDEsMTE3MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTE3MDAxLDExNzUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDExNzUwMSwxMTgwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMTgwMDEsMTE4NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTE4NTAxLDExOTAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDExOTAwMSwxMTk1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMTk1MDEsMTIwMDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTIwMDAxLDEyMDUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEyMDUwMSwxMjEwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMjEwMDEsMTIxNTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTIxNTAxLDEyMjAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEyMjAwMSwxMjI1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMjI1MDEsMTIzMDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTIzMDAxLDEyMzUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEyMzUwMSwxMjQwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMjQwMDEsMTI0NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTI0NTAxLDEyNTAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEyNTAwMSwxMjU1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMjU1MDEsMTI2MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTI2MDAxLDEyNjUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEyNjUwMSwxMjcwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMjcwMDEsMTI3NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTI3NTAxLDEyODAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEyODAwMSwxMjg1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMjg1MDEsMTI5MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTI5MDAxLDEyOTUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEyOTUwMSwxMzAwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMzAwMDEsMTMwNTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTMwNTAxLDEzMTAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEzMTAwMSwxMzE1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMzE1MDEsMTMyMDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTMyMDAxLDEzMjUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEzMjUwMSwxMzMwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMzMwMDEsMTMzNTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTMzNTAxLDEzNDAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEzNDAwMSwxMzQ1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMzQ1MDEsMTM1MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTM1MDAxLDEzNTUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEzNTUwMSwxMzYwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMzYwMDEsMTM2NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTM2NTAxLDEzNzAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEzNzAwMSwxMzc1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMzc1MDEsMTM4MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTM4MDAxLDEzODUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEzODUwMSwxMzkwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMzkwMDEsMTM5NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTM5NTAxLDE0MDAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDE0MDAwMSwxNDA1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxNDA1MDEsMTQxMDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTQxMDAxLDE0MTUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDE0MTUwMSwxNDIwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxNDIwMDEsMTQyNTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTQyNTAxLDE0MzAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDE0MzAwMSwxNDM1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxNDM1MDEsMTQ0MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTQ0MDAxLDE0NDUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDE0NDUwMSwxNDUwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxNDUwMDEsMTQ1NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTQ1NTAxLDE0NjAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDE0NjAwMSwxNDY1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxNDY1MDEsMTQ3MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTQ3MDAxLDE0NzUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDE0NzUwMSwxNDgwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxNDgwMDEsMTQ4NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTQ4NTAxLDE0OTAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDE0OTAwMSwxNDk1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxNDk1MDEsMTUwMDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGlmICQod29yZGxpc3QgMTUwMDAxLDE1MDAwMiwkKDEpKSwkKGVycm9yIGR1bXAtd29yZHMtdG8tZmlsZTogVG9vIG1hbnkgd29yZHMgKCQod29yZHMgJCgxKSkpKSkKIGVuZGVmCiAjIFJldHVybiBqYXIgYXJndW1lbnRzIHRvIGNvbXByZXNzIGZpbGVzIGluIGEgZ2l2ZW4gZGlyZWN0b3J5CiAjICQoMSk6IGRpcmVjdG9yeQpAQCAtMjgxNiw2ICsyODc1LDEwIEBACiAkKGlmICQoTE9DQUxfTUlOX1NES19WRVJTSU9OKSwkKExPQ0FMX01JTl9TREtfVkVSU0lPTiksJChjYWxsIG1vZHVsZS10YXJnZXQtc2RrLXZlcnNpb24pKQogZW5kZWYKIAorIyBDaGVja3MgaWYgbW9kdWxlIGlzIGluIHZlbmRvciBvciBwcm9kdWN0CitkZWZpbmUgbW9kdWxlLWluLXZlbmRvci1vci1wcm9kdWN0CiskKGlmICQoZmlsdGVyIHRydWUsJChMT0NBTF9JTl9WRU5ET1IpICQoTE9DQUxfSU5fUFJPRFVDVCkpLHRydWUpCitlbmRlZgogCiBkZWZpbmUgdHJhbnNmb3JtLWNsYXNzZXMuamFyLXRvLWRleAogQGVjaG8gInRhcmdldCBEZXg6ICQoUFJJVkFURV9NT0RVTEUpIgpAQCAtMjk0Miw3ICszMDA1LDcgQEAKIGRlZmluZSBjb21wcmVzcy1wYWNrYWdlCiAkKGhpZGUpIFwKICAgbXYgJEAgJEAudW5jb21wcmVzc2VkOyBcCi0gICQoTUlOSUdaSVApIC1jICRALnVuY29tcHJlc3NlZCA+ICRALmNvbXByZXNzZWQ7IFwKKyAgJChHWklQKSAtOSAtYyAkQC51bmNvbXByZXNzZWQgPiAkQC5jb21wcmVzc2VkOyBcCiAgIHJtIC1mICRALnVuY29tcHJlc3NlZDsgXAogICBtdiAkQC5jb21wcmVzc2VkICRAOwogZW5kZWYKQEAgLTI5NTAsNyArMzAxMyw3IEBACiBpZmVxICgkKEhPU1RfT1MpLGxpbnV4KQogIyBSdW5zIGFwcGNvbXBhdCBhbmQgc3RvcmUgbG9ncyBpbiAkKFBST0RVQ1RfT1VUKS9hcHBjb21wYXQKIGRlZmluZSBleHRyYWN0LXBhY2thZ2UKLSQoQUFQVDIpIGR1bXAgcmVzb3VyY2VzICRAIHwgYXdrIC1GICcgfD0nICcvXlBhY2thZ2Uve3ByaW50ICQkM30nID4+ICQoUFJPRFVDVF9PVVQpL2FwcGNvbXBhdC8kKFBSSVZBVEVfTU9EVUxFKS5sb2cgJiYKKyQoQUFQVDIpIGR1bXAgcmVzb3VyY2VzICRAIHwgYXdrIC1GICcgfD0nICcvXlBhY2thZ2Uve3ByaW50ICQkMzsgZXhpdH0nID4+ICQoUFJPRFVDVF9PVVQpL2FwcGNvbXBhdC8kKFBSSVZBVEVfTU9EVUxFKS5sb2cgJiYKIGVuZGVmCiBkZWZpbmUgYXBwY29tcGF0LWhlYWRlcgogJChoaWRlKSBcCkBAIC0yOTYzLDE5ICszMDI2LDE1IEBACiAgIGVjaG8gIkluc3RhbGwgcGF0aDogJChwYXRzdWJzdCAkKFBST0RVQ1RfT1VUKS8lLCUsJChQUklWQVRFX0lOU1RBTExFRF9NT0RVTEUpKSIgPj4gJChQUk9EVUNUX09VVCkvYXBwY29tcGF0LyQoUFJJVkFURV9NT0RVTEUpLmxvZyAmJiBcCiAgIGVjaG8gPj4gJChQUk9EVUNUX09VVCkvYXBwY29tcGF0LyQoUFJJVkFURV9NT0RVTEUpLmxvZwogZW5kZWYKLUFSVF9WRVJJREVYX0FQUENPTVBBVF9TQ1JJUFQ6PSQoSE9TVF9PVVQpL2Jpbi9hcHBjb21wYXQuc2gKK0FSVF9WRVJJREVYX0FQUENPTVBBVDo9JChIT1NUX09VVCkvYmluL2FwcGNvbXBhdAogZGVmaW5lIHJ1bi1hcHBjb21wYXQKICQoaGlkZSkgXAotICBlY2hvICJhcHBjb21wYXQuc2ggb3V0cHV0OiIgPj4gJChQUk9EVUNUX09VVCkvYXBwY29tcGF0LyQoUFJJVkFURV9NT0RVTEUpLmxvZyAmJiBcCi0gIFBBQ0tBR0lORz0kKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL1BBQ0tBR0lORyBBTkRST0lEX0xPR19UQUdTPSIqOmUiICQoQVJUX1ZFUklERVhfQVBQQ09NUEFUX1NDUklQVCkgLS1kZXgtZmlsZT0kQCAtLWFwaS1mbGFncz0kKElOVEVSTkFMX1BMQVRGT1JNX0hJRERFTkFQSV9GTEFHUykgMj4mMSA+PiAkKFBST0RVQ1RfT1VUKS9hcHBjb21wYXQvJChQUklWQVRFX01PRFVMRSkubG9nCisgIGVjaG8gImFwcGNvbXBhdCBvdXRwdXQ6IiA+PiAkKFBST0RVQ1RfT1VUKS9hcHBjb21wYXQvJChQUklWQVRFX01PRFVMRSkubG9nICYmIFwKKyAgQU5EUk9JRF9MT0dfVEFHUz0iKjplIiAkKEFSVF9WRVJJREVYX0FQUENPTVBBVCkgLS1kZXgtZmlsZT0kQCAyPiYxID4+ICQoUFJPRFVDVF9PVVQpL2FwcGNvbXBhdC8kKFBSSVZBVEVfTU9EVUxFKS5sb2cKIGVuZGVmCiBhcHBjb21wYXQtZmlsZXMgPSBcCiAgICQoQUFQVDIpIFwKLSAgJChBUlRfVkVSSURFWF9BUFBDT01QQVRfU0NSSVBUKSBcCi0gICQoSU5URVJOQUxfUExBVEZPUk1fSElEREVOQVBJX0ZMQUdTKSBcCi0gICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3ZlcmlkZXggXAotICAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL1BBQ0tBR0lORy9jb3JlX2RleF9pbnRlcm1lZGlhdGVzL2NsYXNzZXMuZGV4IFwKLSAgJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS9QQUNLQUdJTkcvb2FobF9kZXhfaW50ZXJtZWRpYXRlcy9jbGFzc2VzLmRleAorICAkKEFSVF9WRVJJREVYX0FQUENPTVBBVCkgXAogZWxzZQogYXBwY29tcGF0LWhlYWRlciA9CiBydW4tYXBwY29tcGF0ID0KQEAgLTMxNjQsMTQgKzMyMjMsMTIgQEAKIAogIyBDb3BpZXMgbWFueSBpbml0IHNjcmlwdCBmaWxlcyBhbmQgY2hlY2sgdGhleSBhcmUgd2VsbC1mb3JtZWQuCiAjICQoMSk6IFRoZSBpbml0IHNjcmlwdCBmaWxlcyB0byBjb3B5LiAgRWFjaCBlbnRyeSBpcyBhICc6JyBzZXBhcmF0ZWQgc3JjOmRzdCBwYWlyLgotIyBFdmFsdWF0ZXMgdG8gdGhlIGxpc3Qgb2YgdGhlIGRzdCBmaWxlcy4gKGllIHN1aXRhYmxlIGZvciBhIGRlcGVuZGVuY3kgbGlzdC4pCiBkZWZpbmUgY29weS1tYW55LWluaXQtc2NyaXB0LWZpbGVzLWNoZWNrZWQKICQoZm9yZWFjaCBmLCAkKDEpLCAkKHN0cmlwIFwKICAgICAkKGV2YWwgX2NtZl90dXBsZSA6PSAkKHN1YnN0IDosICwkKGYpKSkgXAogICAgICQoZXZhbCBfY21mX3NyYyA6PSAkKHdvcmQgMSwkKF9jbWZfdHVwbGUpKSkgXAogICAgICQoZXZhbCBfY21mX2Rlc3QgOj0gJCh3b3JkIDIsJChfY21mX3R1cGxlKSkpIFwKLSAgICAkKGV2YWwgJChjYWxsIGNvcHktaW5pdC1zY3JpcHQtZmlsZS1jaGVja2VkLCQoX2NtZl9zcmMpLCQoX2NtZl9kZXN0KSkpIFwKLSAgICAkKF9jbWZfZGVzdCkpKQorICAgICQoZXZhbCAkKGNhbGwgY29weS1pbml0LXNjcmlwdC1maWxlLWNoZWNrZWQsJChfY21mX3NyYyksJChfY21mX2Rlc3QpKSkpKQogZW5kZWYKIAogIyBDb3B5IHRoZSBmaWxlIG9ubHkgaWYgaXQncyBhIHdlbGwtZm9ybWVkIHhtbCBmaWxlLiBGb3IgdXNlIHZpYSAkKGV2YWwpLgpAQCAtMzIwMiwyMCArMzI1OSwxOSBAQAogZGVmaW5lIGNvcHktdmludGYtbWFuaWZlc3QtY2hlY2tlZAogJCgyKTogJCgxKSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hc3NlbWJsZV92aW50ZgogCUBlY2hvICJDb3B5IHhtbDogJCRAIgotCSQoaGlkZSkgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYXNzZW1ibGVfdmludGYgLWkgJCQ8ID4vZGV2L251bGwgICMgRG9uJ3QgcHJpbnQgdGhlIHhtbCBmaWxlIHRvIHN0ZG91dC4KLQkkJChjb3B5LWZpbGUtdG8tdGFyZ2V0KQorCSQoaGlkZSkgbWtkaXIgLXAgIiQkKGRpciAkJEApIgorCSQoaGlkZSkgVklOVEZfSUdOT1JFX1RBUkdFVF9GQ01fVkVSU0lPTj10cnVlXAorCQkkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hc3NlbWJsZV92aW50ZiAtaSAkJDwgLW8gJCRACiBlbmRlZgogCiAjIENvcGllcyBtYW55IHZpbnRmIG1hbmlmZXN0IGZpbGVzIGNoZWNrZWQuCiAjICQoMSk6IFRoZSBmaWxlcyB0byBjb3B5LiAgRWFjaCBlbnRyeSBpcyBhICc6JyBzZXBhcmF0ZWQgc3JjOmRzdCBwYWlyCi0jIEV2YWx1YXRlcyB0byB0aGUgbGlzdCBvZiB0aGUgZHN0IGZpbGVzIChpZSBzdWl0YWJsZSBmb3IgYSBkZXBlbmRlbmN5IGxpc3QpCiBkZWZpbmUgY29weS1tYW55LXZpbnRmLW1hbmlmZXN0LWZpbGVzLWNoZWNrZWQKICQoZm9yZWFjaCBmLCAkKDEpLCAkKHN0cmlwIFwKICAgICAkKGV2YWwgX2NtZl90dXBsZSA6PSAkKHN1YnN0IDosICwkKGYpKSkgXAogICAgICQoZXZhbCBfY21mX3NyYyA6PSAkKHdvcmQgMSwkKF9jbWZfdHVwbGUpKSkgXAogICAgICQoZXZhbCBfY21mX2Rlc3QgOj0gJCh3b3JkIDIsJChfY21mX3R1cGxlKSkpIFwKLSAgICAkKGV2YWwgJChjYWxsIGNvcHktdmludGYtbWFuaWZlc3QtY2hlY2tlZCwkKF9jbWZfc3JjKSwkKF9jbWZfZGVzdCkpKSBcCi0gICAgJChfY21mX2Rlc3QpKSkKKyAgICAkKGV2YWwgJChjYWxsIGNvcHktdmludGYtbWFuaWZlc3QtY2hlY2tlZCwkKF9jbWZfc3JjKSwkKF9jbWZfZGVzdCkpKSkpCiBlbmRlZgogCiAjIENvcHkgdGhlIGZpbGUgb25seSBpZiBpdCdzIG5vdCBhbiBFTEYgZmlsZS4gRm9yIHVzZSB2aWEgJChldmFsKS4KQEAgLTMyODMsMTQgKzMzMzksNiBAQAogJChoaWRlKSBjcCAtcCAiJDwiICIkQCIKIGVuZGVmCiAKLSMgVGhlIHNhbWUgYXMgY29weS1maWxlLXRvLXRhcmdldCwgYnV0IHN0cmlwIG91dCAiIyBjb21tZW50Ii1zdHlsZQotIyBjb21tZW50cyAoZm9yIGNvbmZpZyBmaWxlcyBhbmQgc3VjaCkuCi1kZWZpbmUgY29weS1maWxlLXRvLXRhcmdldC1zdHJpcC1jb21tZW50cwotQG1rZGlyIC1wICQoZGlyICRAKQotJChoaWRlKSBybSAtZiAkQAotJChoaWRlKSBzZWQgLWUgJ3MvIy4qJCQvLycgLWUgJ3MvWyBcdF0qJCQvLycgLWUgJy9eJCQvZCcgPCAkPCA+ICRACi1lbmRlZgotCiAjIFRoZSBzYW1lIGFzIGNvcHktZmlsZS10by10YXJnZXQsIGJ1dCBkb24ndCBwcmVzZXJ2ZQogIyB0aGUgb2xkIG1vZGlmaWNhdGlvbiB0aW1lLgogZGVmaW5lIGNvcHktZmlsZS10by1uZXctdGFyZ2V0CkBAIC0zMzI1LDEyICszMzczLDYgQEAKICQoY29weS1maWxlLXRvLXRhcmdldCkKIGVuZGVmCiAKLSMgQ29weSBhIHByZWJ1aWx0IGZpbGUgdG8gYSB0YXJnZXQgbG9jYXRpb24sIHN0cmlwcGluZyAiIyBjb21tZW50IiBjb21tZW50cy4KLWRlZmluZSB0cmFuc2Zvcm0tcHJlYnVpbHQtdG8tdGFyZ2V0LXN0cmlwLWNvbW1lbnRzCi1AZWNobyAiJCgkKFBSSVZBVEVfUFJFRklYKURJU1BMQVkpIFByZWJ1aWx0OiAkKFBSSVZBVEVfTU9EVUxFKSAoJEApIgotJChjb3B5LWZpbGUtdG8tdGFyZ2V0LXN0cmlwLWNvbW1lbnRzKQotZW5kZWYKLQogIyBDb3B5IGEgcHJlYnVpbHQgZmlsZSB0byBhIHRhcmdldCBsb2NhdGlvbiwgYnV0IHByZXNlcnZlIHN5bWxpbmtzIHJhdGhlciB0aGFuCiAjIGRlcmVmZXJlbmNlIHRoZW0uCiBkZWZpbmUgY29weS1vci1saW5rLXByZWJ1aWx0LXRvLXRhcmdldApAQCAtMzM2NSw3ICszNDA3LDYgQEAKIAlAbWtkaXIgLXAgJCQoZGlyICQkQCkKIAlAcm0gLXJmICQkQAogCSQoaGlkZSkgbG4gLXNmICQoMikgJCRACi0kKDMpOiAuS0FUSV9TWU1MSU5LX09VVFBVVFMgOj0gJCgzKQogZW5kZWYKIAogIyBDb3B5IGFuIGFwayB0byBhIHRhcmdldCBsb2NhdGlvbiB3aGlsZSByZW1vdmluZyBjbGFzc2VzKi5kZXgKQEAgLTM0MTYsNiArMzQ1NywxMCBAQAogIyAkKDIpOiBwYXRoIGluIHN5bWJvbHMgZGlyZWN0b3J5CiAjICQoMyk6IGZpbGUgdHlwZSAoZWxmIG9yIHI4KQogIyAkKDQpOiBwYXRoIGluIHRoZSBtYXBwaW5ncyBkaXJlY3RvcnkKKyMKKyMgUmVnYXJkaW5nIHRoZSByZXN0YXRzIGF0IHRoZSBlbmQ6IEkgdGhpbmsgeW91IHNob3VsZCBvbmx5IG5lZWQgdG8gdXNlIEtBVElfUkVTVEFUIG9uICQoMiksIGJ1dAorIyB0aGVyZSBhcHBlYXJzIHRvIGJlIGEgYnVnIGluIGthdGkgd2hlcmUgaXQgd2FzIG5vdCBhZGRpbmcgcmVzdGF0PXRydWUgaW4gdGhlIG5pbmphIGZpbGUgdW5sZXNzIHdlCisjIGFsc28gYWRkZWQgNCB0byBLQVRJX1JFU1RBVC4KIGRlZmluZSBfY29weS1zeW1ib2xzLWZpbGUtd2l0aC1tYXBwaW5nCiAkKDIpOiAuS0FUSV9JTVBMSUNJVF9PVVRQVVRTIDo9ICQoNCkKICQoMik6ICQoU1lNQk9MU19NQVApCkBAIC0zNDI0LDE2ICszNDY5LDcgQEAKIAkkJChjb3B5LWZpbGUtdG8tdGFyZ2V0KQogCSQoU1lNQk9MU19NQVApIC0kKHN0cmlwICQoMykpICQoMikgLXdyaXRlX2lmX2NoYW5nZWQgJCg0KQogLktBVElfUkVTVEFUOiAkKDIpCi1lbmRlZgotCi0jIFJldHVybnMgdGhlIGRpcmVjdG9yeSB0byBjb3B5IHByb2d1YXJkIGRpY3Rpb25hcmllcyBpbnRvCi1kZWZpbmUgbG9jYWwtcHJvZ3VhcmQtZGljdGlvbmFyeS1kaXJlY3RvcnkKLSQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHByb2d1YXJkX2RpY3Rpb25hcnkpL291dC90YXJnZXQvY29tbW9uL29iai8kKExPQ0FMX01PRFVMRV9DTEFTUykvJChMT0NBTF9NT0RVTEUpX2ludGVybWVkaWF0ZXMKLWVuZGVmCi0KLSMgUmV0dXJucyB0aGUgZGlyZWN0b3J5IHRvIGNvcHkgcHJvZ3VhcmQgZGljdGlvbmFyeSBtYXBwaW5ncyBpbnRvCi1kZWZpbmUgbG9jYWwtcHJvZ3VhcmQtZGljdGlvbmFyeS1tYXBwaW5nLWRpcmVjdG9yeQotJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcscHJvZ3VhcmRfZGljdGlvbmFyeV9tYXBwaW5nKS9vdXQvdGFyZ2V0L2NvbW1vbi9vYmovJChMT0NBTF9NT0RVTEVfQ0xBU1MpLyQoTE9DQUxfTU9EVUxFKV9pbnRlcm1lZGlhdGVzCisuS0FUSV9SRVNUQVQ6ICQoNCkKIGVuZGVmCiAKIApAQCAtMzY1MCwxMSArMzY4NiwxNSBAQAogICAkKGlmICQoZmlsdGVyICQoc3VpdGUpLCQoQUxMX0NPTVBBVElCSUxJVFlfU1VJVEVTKSksLFwKICAgICAkKGV2YWwgQUxMX0NPTVBBVElCSUxJVFlfU1VJVEVTICs9ICQoc3VpdGUpKSBcCiAgICAgJChldmFsIENPTVBBVElCSUxJVFkuJChzdWl0ZSkuRklMRVMgOj0pIFwKLSAgICAkKGV2YWwgQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5NT0RVTEVTIDo9KSkgXAorICAgICQoZXZhbCBDT01QQVRJQklMSVRZLiQoc3VpdGUpLk1PRFVMRVMgOj0pIFwKKyAgICAkKGV2YWwgQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5BUElfTUFQX0ZJTEVTIDo9KSkgXAogICAkKGV2YWwgQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5GSUxFUyArPSBcCiAgICAgJCQoZm9yZWFjaCBmLCQkKG15X2NvbXBhdF9kaXN0XyQoc3VpdGUpKSwkJChjYWxsIHdvcmQtY29sb24sMiwkJChmKSkpIFwKICAgICAkJChmb3JlYWNoIGYsJCQobXlfY29tcGF0X2Rpc3RfY29uZmlnXyQoc3VpdGUpKSwkJChjYWxsIHdvcmQtY29sb24sMiwkJChmKSkpIFwKICAgICAkJChteV9jb21wYXRfZGlzdF90ZXN0X2RhdGFfJChzdWl0ZSkpKSBcCisgICQoZXZhbCBDT01QQVRJQklMSVRZLiQoc3VpdGUpLkFSQ0hfRElSUy4kKG15X3JlZ2lzdGVyX25hbWUpIDo9ICQobXlfY29tcGF0X21vZHVsZV9hcmNoX2Rpcl8kKHN1aXRlKS4kKG15X3JlZ2lzdGVyX25hbWUpKSkgXAorICAkKGV2YWwgQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5BUElfTUFQX0ZJTEVTICs9ICQkKG15X2NvbXBhdF9hcGlfbWFwXyQoc3VpdGUpKSkgXAorICAkKGV2YWwgQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5TT09OR19JTlNUQUxMRURfQ09NUEFUSUJJTElUWV9TVVBQT1JUX0ZJTEVTICs9ICQoTE9DQUxfU09PTkdfSU5TVEFMTEVEX0NPTVBBVElCSUxJVFlfU1VQUE9SVF9GSUxFUykpIFwKICAgJChldmFsIEFMTF9DT01QQVRJQklMSVRZX0RJU1RfRklMRVMgKz0gJCQobXlfY29tcGF0X2Rpc3RfJChzdWl0ZSkpKSBcCiAgICQoZXZhbCBDT01QQVRJQklMSVRZLiQoc3VpdGUpLk1PRFVMRVMgKz0gJCQobXlfcmVnaXN0ZXJfbmFtZSkpKSBcCiAkKGV2YWwgJChteV9hbGxfdGFyZ2V0cykgOiBcCmRpZmYgLS1naXQgYS9jb3JlL2RleF9wcmVvcHQubWsgYi9jb3JlL2RleF9wcmVvcHQubWsKaW5kZXggODZjYTcyOS4uODhlMGNjNyAxMDA2NDQKLS0tIGEvY29yZS9kZXhfcHJlb3B0Lm1rCisrKyBiL2NvcmUvZGV4X3ByZW9wdC5tawpAQCAtMTMsNTEgKzEzLDEyIEBACiBpbnN0YWxsLW9uLXN5c3RlbS1vdGhlciA9ICQoZmlsdGVyLW91dCAkKFBST0RVQ1RfREVYUFJFT1BUX1NQRUVEX0FQUFMpICQoUFJPRFVDVF9TWVNURU1fU0VSVkVSX0FQUFMpLCQoYmFzZW5hbWUgJChub3RkaXIgJChmaWx0ZXIgJChmb3JlYWNoIGYsJChTWVNURU1fT1RIRVJfT0RFWF9GSUxURVIpLCQoVEFSR0VUX09VVCkvJChmKSksJCgxKSkpKSkKIGVuZGlmCiAKLSMgV2Ugd2FudCB0byBpbnN0YWxsIHRoZSBwcm9maWxlIGV2ZW4gaWYgd2UgYXJlIG5vdCB1c2luZyBwcmVvcHQgc2luY2UgaXQgaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUKLSMgdGhlIGltYWdlIG9uIHRoZSBkZXZpY2UuCi1BTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKGNhbGwgY29weS1tYW55LWZpbGVzLCQoREVYUFJFT1BUX0lNQUdFX1BST0ZJTEVfQlVJTFRfSU5TVEFMTEVEKSwkKFBST0RVQ1RfT1VUKSkKLQotIyBJbnN0YWxsIGJvb3QgaW1hZ2VzLiBOb3RlIHRoYXQgdGhlcmUgY2FuIGJlIG11bHRpcGxlLgotbXlfYm9vdF9pbWFnZV9hcmNoIDo9IFRBUkdFVF9BUkNICi1teV9ib290X2ltYWdlX291dCA6PSAkKFBST0RVQ1RfT1VUKQotbXlfYm9vdF9pbWFnZV9zeW1zIDo9ICQoVEFSR0VUX09VVF9VTlNUUklQUEVEKQotREVGQVVMVF9ERVhfUFJFT1BUX0lOU1RBTExFRF9JTUFHRV9NT0RVTEUgOj0gXAotICAkKGZvcmVhY2ggbXlfYm9vdF9pbWFnZV9uYW1lLCQoREVYUFJFT1BUX0lNQUdFX05BTUVTKSwkKHN0cmlwIFwKLSAgICAkKGV2YWwgaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvZGV4X3ByZW9wdF9saWJhcnQubWspIFwKLSAgICAkKG15X2Jvb3RfaW1hZ2VfbW9kdWxlKSkpCi1pZmRlZiBUQVJHRVRfMk5EX0FSQ0gKLSAgbXlfYm9vdF9pbWFnZV9hcmNoIDo9IFRBUkdFVF8yTkRfQVJDSAotICAyTkRfREVGQVVMVF9ERVhfUFJFT1BUX0lOU1RBTExFRF9JTUFHRV9NT0RVTEUgOj0gXAotICAgICQoZm9yZWFjaCBteV9ib290X2ltYWdlX25hbWUsJChERVhQUkVPUFRfSU1BR0VfTkFNRVMpLCQoc3RyaXAgXAotICAgICAgJChldmFsIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2RleF9wcmVvcHRfbGliYXJ0Lm1rKSBcCi0gICAgICAkKG15X2Jvb3RfaW1hZ2VfbW9kdWxlKSkpCi1lbmRpZgotIyBJbnN0YWxsIGJvb3QgaW1hZ2VzIGZvciB0ZXN0aW5nIG9uIGhvc3QuIFdlIGV4Y2x1ZGUgZnJhbWV3b3JrIGltYWdlIGFzIGl0IGlzIG5vdCBwYXJ0IG9mIGFydCBtYW5pZmVzdC4KLW15X2Jvb3RfaW1hZ2VfYXJjaCA6PSBIT1NUX0FSQ0gKLW15X2Jvb3RfaW1hZ2Vfb3V0IDo9ICQoSE9TVF9PVVQpCi1teV9ib290X2ltYWdlX3N5bXMgOj0gJChIT1NUX09VVCkvc3ltYm9scwotSE9TVF9CT09UX0lNQUdFX01PRFVMRSA6PSBcCi0gICQoZm9yZWFjaCBteV9ib290X2ltYWdlX25hbWUsYXJ0X2hvc3QsJChzdHJpcCBcCi0gICAgJChldmFsIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2RleF9wcmVvcHRfbGliYXJ0Lm1rKSBcCi0gICAgJChteV9ib290X2ltYWdlX21vZHVsZSkpKQotSE9TVF9CT09UX0lNQUdFIDo9ICQoY2FsbCBtb2R1bGUtaW5zdGFsbGVkLWZpbGVzLCQoSE9TVF9CT09UX0lNQUdFX01PRFVMRSkpCi1pZmRlZiBIT1NUXzJORF9BUkNICi0gIG15X2Jvb3RfaW1hZ2VfYXJjaCA6PSBIT1NUXzJORF9BUkNICi0gIDJORF9IT1NUX0JPT1RfSU1BR0VfTU9EVUxFIDo9IFwKLSAgICAkKGZvcmVhY2ggbXlfYm9vdF9pbWFnZV9uYW1lLGFydF9ob3N0LCQoc3RyaXAgXAotICAgICAgJChldmFsIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2RleF9wcmVvcHRfbGliYXJ0Lm1rKSBcCi0gICAgICAkKG15X2Jvb3RfaW1hZ2VfbW9kdWxlKSkpCi0gIDJORF9IT1NUX0JPT1RfSU1BR0UgOj0gJChjYWxsIG1vZHVsZS1pbnN0YWxsZWQtZmlsZXMsJCgyTkRfSE9TVF9CT09UX0lNQUdFX01PRFVMRSkpCi1lbmRpZgotbXlfYm9vdF9pbWFnZV9hcmNoIDo9Ci1teV9ib290X2ltYWdlX291dCA6PQotbXlfYm9vdF9pbWFnZV9zeW1zIDo9Ci1teV9ib290X2ltYWdlX21vZHVsZSA6PQotCiAjIEJ1aWxkIHRoZSBib290LnppcCB3aGljaCBjb250YWlucyB0aGUgYm9vdCBqYXJzIGFuZCB0aGVpciBjb21waWxhdGlvbiBvdXRwdXQKICMgV2UgY2FuIGRvIHRoaXMgb25seSBpZiBwcmVvcHQgaXMgZW5hYmxlZCBhbmQgaWYgdGhlIHByb2R1Y3QgdXNlcyBsaWJhcnQgY29uZmlnICh3aGljaCBzZXRzIHRoZQogIyBkZWZhdWx0IHByb3BlcnRpZXMgZm9yIHByZW9wdGluZykuCisjIEF0IHRoZSB0aW1lIG9mIHdyaXRpbmcsIHRoaXMgaXMgb25seSBmb3IgQVJUIENsb3VkLgogaWZlcSAoJChXSVRIX0RFWFBSRU9QVCksIHRydWUpCitpZm5lcSAoJChXSVRIX0RFWFBSRU9QVF9BUlRfQk9PVF9JTUdfT05MWSksIHRydWUpCiBpZmVxICgkKFBST0RVQ1RfVVNFU19ERUZBVUxUX0FSVF9DT05GSUcpLCB0cnVlKQogCiBib290X3ppcCA6PSAkKFBST0RVQ1RfT1VUKS9ib290LnppcApAQCAtOTAsMTcgKzUxLDIwIEBACiAjIFRoZSBpbnB1dCB2YXJpYWJsZXMgYXJlIHdyaXR0ZW4gYnkgYnVpbGQvc29vbmcvamF2YS9kZXhwcmVvcHRfYm9vdGphcnMuZ28uIEV4YW1wbGVzIGNhbiBiZSBmb3VuZAogIyBhdCB0aGUgYm90dG9tIG9mIGJ1aWxkL3Nvb25nL2phdmEvZGV4cHJlb3B0X2NvbmZpZ190ZXN0aW5nLmdvLgogZGV4cHJlb3B0X3Jvb3RfZGlyIDo9ICQoZGlyICQocGF0c3Vic3QgJS8sJSwkKGRpciAkKGZpcnN0d29yZCAkKGJvb3RjbGFzc3BhdGhfamFycykpKSkpCi1ib29jbGFzc3BhdGhfYXJnIDo9ICQoc3Vic3QgJChzcGFjZSksOiwkKHBhdHN1YnN0ICQoZGV4cHJlb3B0X3Jvb3RfZGlyKSUsJSwkKERFWFBSRU9QVF9CT09UQ0xBU1NQQVRIX0RFWF9GSUxFUykpKQotYm9vY2xhc3NwYXRoX2xvY2F0aW9uc19hcmcgOj0gJChzdWJzdCAkKHNwYWNlKSw6LCQoREVYUFJFT1BUX0JPT1RDTEFTU1BBVEhfREVYX0xPQ0FUSU9OUykpCitib290Y2xhc3NwYXRoX2FyZyA6PSAkKHN1YnN0ICQoc3BhY2UpLDosJChwYXRzdWJzdCAkKGRleHByZW9wdF9yb290X2RpciklLCUsJChERVhQUkVPUFRfQk9PVENMQVNTUEFUSF9ERVhfRklMRVMpKSkKK2Jvb3RjbGFzc3BhdGhfbG9jYXRpb25zX2FyZyA6PSAkKHN1YnN0ICQoc3BhY2UpLDosJChERVhQUkVPUFRfQk9PVENMQVNTUEFUSF9ERVhfTE9DQVRJT05TKSkKIGJvb3RfaW1hZ2VzIDo9ICQoc3Vic3QgOiwkKHNwYWNlKSwkKERFWFBSRU9QVF9JTUFHRV9MT0NBVElPTlNfT05fREVWSUNFJChERVhQUkVPUFRfSU5GSVgpKSkKIGJvb3RfaW1hZ2VfYXJnIDo9ICQoc3Vic3QgJChzcGFjZSksOiwkKHBhdHN1YnN0IC8lLCUsJChib290X2ltYWdlcykpKQordWZmZF9nY19mbGFnX3R4dCA6PSAkKE9VVF9ESVIpL3Nvb25nL2RleHByZW9wdC91ZmZkX2djX2ZsYWcudHh0CiAKIGJvb3RfemlwX21ldGFkYXRhX3R4dCA6PSAkKGRpciAkKGJvb3RfemlwKSlib290X3ppcC9NRVRBREFUQS50eHQKKyQoYm9vdF96aXBfbWV0YWRhdGFfdHh0KTogJCh1ZmZkX2djX2ZsYWdfdHh0KQogJChib290X3ppcF9tZXRhZGF0YV90eHQpOgogCXJtIC1mICRACi0JZWNobyAiYm9vY2xhc3NwYXRoID0gJChib29jbGFzc3BhdGhfYXJnKSIgPj4gJEAKLQllY2hvICJib29jbGFzc3BhdGgtbG9jYXRpb25zID0gJChib29jbGFzc3BhdGhfbG9jYXRpb25zX2FyZykiID4+ICRACisJZWNobyAiYm9vdGNsYXNzcGF0aCA9ICQoYm9vdGNsYXNzcGF0aF9hcmcpIiA+PiAkQAorCWVjaG8gImJvb3RjbGFzc3BhdGgtbG9jYXRpb25zID0gJChib290Y2xhc3NwYXRoX2xvY2F0aW9uc19hcmcpIiA+PiAkQAogCWVjaG8gImJvb3QtaW1hZ2UgPSAkKGJvb3RfaW1hZ2VfYXJnKSIgPj4gJEAKKwllY2hvICJleHRyYS1hcmdzID0gYGNhdCAkKHVmZmRfZ2NfZmxhZ190eHQpYCIgPj4gJEAKIAogJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBkcm9pZGNvcmUsICQoYm9vdF96aXBfbWV0YWRhdGFfdHh0KSkKIApAQCAtMTE4LDIyICs4MiwyOCBAQAogCiAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGRyb2lkY29yZSwgJChib290X3ppcCkpCiAKLWlmbmVxICgsJChmaWx0ZXIgdHJ1ZSwkKEFSVF9NT0RVTEVfQlVJTERfRlJPTV9TT1VSQ0UpICQoTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFKSkpCiAjIEJ1aWxkIHRoZSBzeXN0ZW1fc2VydmVyLnppcCB3aGljaCBjb250YWlucyB0aGUgQXBleCBzeXN0ZW0gc2VydmVyIGphcnMgYW5kIHN0YW5kYWxvbmUgc3lzdGVtIHNlcnZlciBqYXJzCitzeXN0ZW1fc2VydmVyX2RleDJvYXRfZGlyIDo9ICQoU09PTkdfT1VUX0RJUikvc3lzdGVtX3NlcnZlcl9kZXhqYXJzCiBzeXN0ZW1fc2VydmVyX3ppcCA6PSAkKFBST0RVQ1RfT1VUKS9zeXN0ZW1fc2VydmVyLnppcAorIyBub25fdXBkYXRhYmxlX3N5c3RlbV9zZXJ2ZXJfamFycyBjb250YWlucyBqYXJzIGluIC9zeXN0ZW0gYW5kIC9zeXN0ZW1fZXh0IHRoYXQgYXJlIG5vdCBwYXJ0IG9mIGFuIGFwZXguCitub25fdXBkYXRhYmxlX3N5c3RlbV9zZXJ2ZXJfamFycyA6PSBcCisgICQoZm9yZWFjaCBtLCQoUFJPRFVDVF9TWVNURU1fU0VSVkVSX0pBUlMpLFwKKyAgICAkKHN5c3RlbV9zZXJ2ZXJfZGV4Mm9hdF9kaXIpLyQoY2FsbCB3b3JkLWNvbG9uLDIsJChtKSkuamFyKQorCiBhcGV4X3N5c3RlbV9zZXJ2ZXJfamFycyA6PSBcCiAgICQoZm9yZWFjaCBtLCQoUFJPRFVDVF9BUEVYX1NZU1RFTV9TRVJWRVJfSkFSUyksXAotICAgICQoUFJPRFVDVF9PVVQpL2FwZXgvJChjYWxsIHdvcmQtY29sb24sMSwkKG0pKS9qYXZhbGliLyQoY2FsbCB3b3JkLWNvbG9uLDIsJChtKSkuamFyKQorICAgICQoc3lzdGVtX3NlcnZlcl9kZXgyb2F0X2RpcikvJChjYWxsIHdvcmQtY29sb24sMiwkKG0pKS5qYXIpCiAKIGFwZXhfc3RhbmRhbG9uZV9zeXN0ZW1fc2VydmVyX2phcnMgOj0gXAogICAkKGZvcmVhY2ggbSwkKFBST0RVQ1RfQVBFWF9TVEFOREFMT05FX1NZU1RFTV9TRVJWRVJfSkFSUyksXAotICAgICQoUFJPRFVDVF9PVVQpL2FwZXgvJChjYWxsIHdvcmQtY29sb24sMSwkKG0pKS9qYXZhbGliLyQoY2FsbCB3b3JkLWNvbG9uLDIsJChtKSkuamFyKQorICAgICQoc3lzdGVtX3NlcnZlcl9kZXgyb2F0X2RpcikvJChjYWxsIHdvcmQtY29sb24sMiwkKG0pKS5qYXIpCiAKIHN0YW5kYWxvbmVfc3lzdGVtX3NlcnZlcl9qYXJzIDo9IFwKICAgJChmb3JlYWNoIG0sJChQUk9EVUNUX1NUQU5EQUxPTkVfU1lTVEVNX1NFUlZFUl9KQVJTKSxcCi0gICAgJChQUk9EVUNUX09VVCkvYXBleC8kKGNhbGwgd29yZC1jb2xvbiwxLCQobSkpL2phdmFsaWIvJChjYWxsIHdvcmQtY29sb24sMiwkKG0pKS5qYXIpCisgICAgJChzeXN0ZW1fc2VydmVyX2RleDJvYXRfZGlyKS8kKGNhbGwgd29yZC1jb2xvbiwyLCQobSkpLmphcikKIAotJChzeXN0ZW1fc2VydmVyX3ppcCk6IFBSSVZBVEVfU1lTVEVNX1NFUlZFUl9KQVJTIDo9ICQoc3lzdGVtX3NlcnZlcl9qYXJzKQorJChzeXN0ZW1fc2VydmVyX3ppcCk6IFBSSVZBVEVfU1lTVEVNX1NFUlZFUl9ERVgyT0FUX0RJUiA6PSAkKHN5c3RlbV9zZXJ2ZXJfZGV4Mm9hdF9kaXIpCiskKHN5c3RlbV9zZXJ2ZXJfemlwKTogUFJJVkFURV9TWVNURU1fU0VSVkVSX0pBUlMgOj0gJChub25fdXBkYXRhYmxlX3N5c3RlbV9zZXJ2ZXJfamFycykKICQoc3lzdGVtX3NlcnZlcl96aXApOiBQUklWQVRFX0FQRVhfU1lTVEVNX1NFUlZFUl9KQVJTIDo9ICQoYXBleF9zeXN0ZW1fc2VydmVyX2phcnMpCiAkKHN5c3RlbV9zZXJ2ZXJfemlwKTogUFJJVkFURV9BUEVYX1NUQU5EQUxPTkVfU1lTVEVNX1NFUlZFUl9KQVJTIDo9ICQoYXBleF9zdGFuZGFsb25lX3N5c3RlbV9zZXJ2ZXJfamFycykKICQoc3lzdGVtX3NlcnZlcl96aXApOiBQUklWQVRFX1NUQU5EQUxPTkVfU1lTVEVNX1NFUlZFUl9KQVJTIDo9ICQoc3RhbmRhbG9uZV9zeXN0ZW1fc2VydmVyX2phcnMpCkBAIC0xNDEsMTMgKzExMSwxMyBAQAogCUBlY2hvICJDcmVhdGUgc3lzdGVtIHNlcnZlciBwYWNrYWdlOiAkQCIKIAlybSAtZiAkQAogCSQoU09PTkdfWklQKSAtbyAkQCBcCi0JICAtQyAkKFBST0RVQ1RfT1VUKSAkKGFkZHByZWZpeCAtZiAsJChQUklWQVRFX1NZU1RFTV9TRVJWRVJfSkFSUykpIFwKLQkgIC1DICQoUFJPRFVDVF9PVVQpICQoYWRkcHJlZml4IC1mICwkKFBSSVZBVEVfQVBFWF9TWVNURU1fU0VSVkVSX0pBUlMpKSBcCi0gICAgICAgICAgLUMgJChQUk9EVUNUX09VVCkgJChhZGRwcmVmaXggLWYgLCQoUFJJVkFURV9BUEVYX1NUQU5EQUxPTkVfU1lTVEVNX1NFUlZFUl9KQVJTKSkgXAotCSAgLUMgJChQUk9EVUNUX09VVCkgJChhZGRwcmVmaXggLWYgLCQoUFJJVkFURV9TVEFOREFMT05FX1NZU1RFTV9TRVJWRVJfSkFSUykpCisJICAtQyAkKFBSSVZBVEVfU1lTVEVNX1NFUlZFUl9ERVgyT0FUX0RJUikgJChhZGRwcmVmaXggLWYgLCQoUFJJVkFURV9TWVNURU1fU0VSVkVSX0pBUlMpKSBcCisJICAtQyAkKFBSSVZBVEVfU1lTVEVNX1NFUlZFUl9ERVgyT0FUX0RJUikgJChhZGRwcmVmaXggLWYgLCQoUFJJVkFURV9BUEVYX1NZU1RFTV9TRVJWRVJfSkFSUykpIFwKKwkgIC1DICQoUFJJVkFURV9TWVNURU1fU0VSVkVSX0RFWDJPQVRfRElSKSAkKGFkZHByZWZpeCAtZiAsJChQUklWQVRFX0FQRVhfU1RBTkRBTE9ORV9TWVNURU1fU0VSVkVSX0pBUlMpKSBcCisJICAtQyAkKFBSSVZBVEVfU1lTVEVNX1NFUlZFUl9ERVgyT0FUX0RJUikgJChhZGRwcmVmaXggLWYgLCQoUFJJVkFURV9TVEFOREFMT05FX1NZU1RFTV9TRVJWRVJfSkFSUykpCiAKICQoY2FsbCBkaXN0LWZvci1nb2FscywgZHJvaWRjb3JlLCAkKHN5c3RlbV9zZXJ2ZXJfemlwKSkKIAotZW5kaWYgICNBUlRfTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFIHx8IE1PRFVMRV9CVUlMRF9GUk9NX1NPVVJDRQogZW5kaWYgICNQUk9EVUNUX1VTRVNfREVGQVVMVF9BUlRfQ09ORklHCitlbmRpZiAgI1dJVEhfREVYUFJFT1BUX0FSVF9CT09UX0lNR19PTkxZCiBlbmRpZiAgI1dJVEhfREVYUFJFT1BUCmRpZmYgLS1naXQgYS9jb3JlL2RleF9wcmVvcHRfY29uZmlnLm1rIGIvY29yZS9kZXhfcHJlb3B0X2NvbmZpZy5tawppbmRleCA3YjljNGRiLi5mMWU5ZmI1IDEwMDY0NAotLS0gYS9jb3JlL2RleF9wcmVvcHRfY29uZmlnLm1rCisrKyBiL2NvcmUvZGV4X3ByZW9wdF9jb25maWcubWsKQEAgLTEsNCArMSw0IEBACi1ERVhfUFJFT1BUX0NPTkZJRyA6PSAkKFNPT05HX09VVF9ESVIpL2RleHByZW9wdC5jb25maWcKK0RFWF9QUkVPUFRfQ09ORklHIDo9ICQoU09PTkdfT1VUX0RJUikvZGV4cHJlb3B0JHtDT1ZFUkFHRV9TVUZGSVh9LmNvbmZpZwogCiBFTkFCTEVfUFJFT1BUIDo9IHRydWUKIEVOQUJMRV9QUkVPUFRfQk9PVF9JTUFHRVMgOj0gdHJ1ZQpAQCAtNTgsMjUgKzU4LDEwIEBACiAKICMgQ29uZGl0aW9uYWwgdG8gYnVpbGRpbmcgb24gbGludXgsIGFzIGRleDJvYXQgY3VycmVudGx5IGRvZXMgbm90IHdvcmsgb24gZGFyd2luLgogaWZlcSAoJChIT1NUX09TKSxsaW51eCkKLSAgaWZlcSAoZW5nLCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpKQotICAgICMgRm9yIGFuIGVuZyBidWlsZCBvbmx5IHByZS1vcHQgdGhlIGJvb3QgaW1hZ2UgYW5kIHN5c3RlbSBzZXJ2ZXIuIFRoaXMgZ2l2ZXMgcmVhc29uYWJsZSBwZXJmb3JtYW5jZQotICAgICMgYW5kIHN0aWxsIGFsbG93cyBhIHNpbXBsZSB3b3JrZmxvdzogYnVpbGRpbmcgaW4gZnJhbWV3b3Jrcy9iYXNlIGFuZCBzeW5jaW5nLgotICAgIFdJVEhfREVYUFJFT1BUX0JPT1RfSU1HX0FORF9TWVNURU1fU0VSVkVSX09OTFkgPz0gdHJ1ZQotICBlbmRpZgogICAjIEFkZCBtaW5pLWRlYnVnLWluZm8gdG8gdGhlIGJvb3QgY2xhc3NwYXRoIHVubGVzcyBleHBsaWNpdGx5IGFza2VkIG5vdCB0by4KICAgaWZuZXEgKGZhbHNlLCQoV0lUSF9ERVhQUkVPUFRfREVCVUdfSU5GTykpCiAgICAgUFJPRFVDVF9ERVhfUFJFT1BUX0JPT1RfRkxBR1MgKz0gLS1nZW5lcmF0ZS1taW5pLWRlYnVnLWluZm8KICAgZW5kaWYKLQotICAjIE5vbiBlbmcgbGludXggYnVpbGRzIG11c3QgaGF2ZSBwcmVvcHQgZW5hYmxlZCBzbyB0aGF0IHN5c3RlbSBzZXJ2ZXIgZG9lc24ndCBydW4gYXMgaW50ZXJwcmV0ZXIKLSAgIyBvbmx5LiBiLzc0MjA5MzI5Ci0gIGlmZXEgKCwkKGZpbHRlciBlbmcsICQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpKSkKLSAgICBpZm5lcSAodHJ1ZSwkKFdJVEhfREVYUFJFT1BUKSkKLSAgICAgIGlmbmVxICh0cnVlLCQoV0lUSF9ERVhQUkVPUFRfQk9PVF9JTUdfQU5EX1NZU1RFTV9TRVJWRVJfT05MWSkpCi0gICAgICAgICQoY2FsbCBwcmV0dHktZXJyb3IsIERFWFBSRU9QVCBtdXN0IGJlIGVuYWJsZWQgZm9yIHVzZXIgYW5kIHVzZXJkZWJ1ZyBidWlsZHMpCi0gICAgICBlbmRpZgotICAgIGVuZGlmCi0gIGVuZGlmCiBlbmRpZgogCiAjIEdldCB2YWx1ZSBvZiBhIHByb3BlcnR5LiBJdCBpcyBmaXJzdCBzZWFyY2hlZCBmcm9tIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMKQEAgLTEwMCw3ICs4NSw3IEBACiAgICQoY2FsbCBhZGRfanNvbl9ib29sLCBEaXNhYmxlUHJlb3B0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICQoY2FsbCBpbnZlcnRfYm9vbCwkKEVOQUJMRV9QUkVPUFQpKSkKICAgJChjYWxsIGFkZF9qc29uX2Jvb2wsIERpc2FibGVQcmVvcHRCb290SW1hZ2VzLCAgICAgICAgICAgICAgICAgJChjYWxsIGludmVydF9ib29sLCQoRU5BQkxFX1BSRU9QVF9CT09UX0lNQUdFUykpKQogICAkKGNhbGwgYWRkX2pzb25fbGlzdCwgRGlzYWJsZVByZW9wdE1vZHVsZXMsICAgICAgICAgICAgICAgICAgICAkKERFWFBSRU9QVF9ESVNBQkxFRF9NT0RVTEVTKSkKLSAgJChjYWxsIGFkZF9qc29uX2Jvb2wsIE9ubHlQcmVvcHRCb290SW1hZ2VBbmRTeXN0ZW1TZXJ2ZXIsICAgICAgJChmaWx0ZXIgdHJ1ZSwkKFdJVEhfREVYUFJFT1BUX0JPT1RfSU1HX0FORF9TWVNURU1fU0VSVkVSX09OTFkpKSkKKyAgJChjYWxsIGFkZF9qc29uX2Jvb2wsIE9ubHlQcmVvcHRBcnRCb290SW1hZ2UgICAgICAgICAgICAsICAgICAgJChmaWx0ZXIgdHJ1ZSwkKFdJVEhfREVYUFJFT1BUX0FSVF9CT09UX0lNR19PTkxZKSkpCiAgICQoY2FsbCBhZGRfanNvbl9ib29sLCBQcmVvcHRXaXRoVXBkYXRhYmxlQmNwLCAgICAgICAgICAgICAgICAgICQoZmlsdGVyIHRydWUsJChERVhfUFJFT1BUX1dJVEhfVVBEQVRBQkxFX0JDUCkpKQogICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgRG9udFVuY29tcHJlc3NQcml2QXBwc0RleCwgICAgICAgICAgICAgICAkKGZpbHRlciB0cnVlLCQoRE9OVF9VTkNPTVBSRVNTX1BSSVZfQVBQU19ERVhTKSkpCiAgICQoY2FsbCBhZGRfanNvbl9saXN0LCBNb2R1bGVzTG9hZGVkQnlQcml2aWxlZ2VkTW9kdWxlcywgICAgICAgICQoUFJPRFVDVF9MT0FERURfQllfUFJJVklMRUdFRF9NT0RVTEVTKSkKQEAgLTEwOSw4ICs5NCw5IEBACiAgICQoY2FsbCBhZGRfanNvbl9ib29sLCBEaXNhYmxlR2VuZXJhdGVQcm9maWxlLCAgICAgICAgICAgICAgICAgICQoZmlsdGVyIGZhbHNlLCQoV0lUSF9ERVhfUFJFT1BUX0dFTkVSQVRFX1BST0ZJTEUpKSkKICAgJChjYWxsIGFkZF9qc29uX3N0ciwgIFByb2ZpbGVEaXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChQUk9EVUNUX0RFWF9QUkVPUFRfUFJPRklMRV9ESVIpKQogICAkKGNhbGwgYWRkX2pzb25fbGlzdCwgQm9vdEphcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKFBST0RVQ1RfQk9PVF9KQVJTKSkKLSAgJChjYWxsIGFkZF9qc29uX2xpc3QsIEFwZXhCb290SmFycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChQUk9EVUNUX0FQRVhfQk9PVF9KQVJTKSkKKyAgJChjYWxsIGFkZF9qc29uX2xpc3QsIEFwZXhCb290SmFycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChmaWx0ZXItb3V0ICQoQVBFWF9CT09UX0pBUlNfRVhDTFVERUQpLCAkKFBST0RVQ1RfQVBFWF9CT09UX0pBUlMpKSkKICAgJChjYWxsIGFkZF9qc29uX2xpc3QsIEFydEFwZXhKYXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChmaWx0ZXIgJChQUk9EVUNUX0JPT1RfSkFSUyksJChBUlRfQVBFWF9KQVJTKSkpCisgICQoY2FsbCBhZGRfanNvbl9saXN0LCBUZXN0T25seUFydEJvb3RJbWFnZUphcnMsICAgICAgICAgICAgICAgICQoUFJPRFVDVF9URVNUX09OTFlfQVJUX0JPT1RfSU1BR0VfSkFSUykpCiAgICQoY2FsbCBhZGRfanNvbl9saXN0LCBTeXN0ZW1TZXJ2ZXJKYXJzLCAgICAgICAgICAgICAgICAgICAgICAgICQoUFJPRFVDVF9TWVNURU1fU0VSVkVSX0pBUlMpKQogICAkKGNhbGwgYWRkX2pzb25fbGlzdCwgU3lzdGVtU2VydmVyQXBwcywgICAgICAgICAgICAgICAgICAgICAgICAkKFBST0RVQ1RfU1lTVEVNX1NFUlZFUl9BUFBTKSkKICAgJChjYWxsIGFkZF9qc29uX2xpc3QsIEFwZXhTeXN0ZW1TZXJ2ZXJKYXJzLCAgICAgICAgICAgICAgICAgICAgJChQUk9EVUNUX0FQRVhfU1lTVEVNX1NFUlZFUl9KQVJTKSkKQEAgLTEzNiw3ICsxMjIsNyBAQAogICAkKGNhbGwgYWRkX2pzb25fc3RyLCAgRGV4Mm9hdFhteCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKERFWDJPQVRfWE1YKSkKICAgJChjYWxsIGFkZF9qc29uX3N0ciwgIERleDJvYXRYbXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChERVgyT0FUX1hNUykpCiAgICQoY2FsbCBhZGRfanNvbl9zdHIsICBFbXB0eURpcmVjdG9yeSwgICAgICAgICAgICAgICAgICAgICAgICAgICQoT1VUX0RJUikvZW1wdHkpCi0gICQoY2FsbCBhZGRfanNvbl9ib29sLCBFbmFibGVVZmZkR2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZmlsdGVyIHRydWUsJChFTkFCTEVfVUZGRF9HQykpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCAgRW5hYmxlVWZmZEdjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEVOQUJMRV9VRkZEX0dDKSkKIAogaWZkZWYgVEFSR0VUX0FSQ0gKICAgJChjYWxsIGFkZF9qc29uX21hcCwgIENwdVZhcmlhbnQpCmRpZmYgLS1naXQgYS9jb3JlL2RleF9wcmVvcHRfbGliYXJ0Lm1rIGIvY29yZS9kZXhfcHJlb3B0X2xpYmFydC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJjOTk0Mi4uMDAwMDAwMAotLS0gYS9jb3JlL2RleF9wcmVvcHRfbGliYXJ0Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBBUlQgYm9vdCBpbWFnZSBpbnN0YWxsYXRpb24KLSMgSW5wdXQgdmFyaWFibGVzOgotIyAgIG15X2Jvb3RfaW1hZ2VfbmFtZTogdGhlIGJvb3QgaW1hZ2UgdG8gaW5zdGFsbAotIyAgIG15X2Jvb3RfaW1hZ2VfYXJjaDogdGhlIGFyY2hpdGVjdHVyZSB0byBpbnN0YWxsIChlLmcuIFRBUkdFVF9BUkNILCBub3QgZXhwYW5kZWQpCi0jICAgbXlfYm9vdF9pbWFnZV9vdXQ6ICB0aGUgaW5zdGFsbCBkaXJlY3RvcnkgKGUuZy4gJChQUk9EVUNUX09VVCkpCi0jICAgbXlfYm9vdF9pbWFnZV9zeW1zOiB0aGUgc3ltYm9scyBkaXJlY3RvciAoZS5nLiAkKFRBUkdFVF9PVVRfVU5TVFJJUFBFRCkpCi0jCi0jIE91dHB1dCB2YXJpYWJsZXM6Ci0jICAgbXlfYm9vdF9pbWFnZV9tb2R1bGU6IHRoZSBjcmVhdGVkIG1vZHVsZSBuYW1lLiBFbXB0eSBpZiBubyBtb2R1bGUgaXMgY3JlYXRlZC4KLSMKLSMgSW5zdGFsbCB0aGUgYm9vdCBpbWFnZXMgY29tcGlsZWQgYnkgU29vbmcuCi0jIENyZWF0ZSBhIG1vZHVsZSBuYW1lZCBkZXhwcmVvcHRfYm9vdGphci4kKG15X2Jvb3RfaW1hZ2VfbmFtZSlfJCgkKG15X2Jvb3RfaW1hZ2VfYXJjaCkpCi0jIHRoYXQgaW5zdGFsbHMgYWxsIG9mIGJvb3QgaW1hZ2UgZmlsZXMuCi0jIElmIHRoZXJlIGlzIG5vIGZpbGUgdG8gaW5zdGFsbCBmb3IgJChteV9ib290X2ltYWdlX25hbWUpLCBmb3IgZXhhbXBsZSB3aGVuCi0jIGJ1aWxkaW5nIGFuIHVuYnVuZGxlZCBidWlsZCwgdGhlbiBubyBtb2R1bGUgaXMgY3JlYXRlZC4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2VzIGEgbGlzdCBvZiBzcmM6ZGVzdCBpbnN0YWxsIHBhaXJzIGFuZCByZXR1cm5zIGEgbmV3IGxpc3Qgd2l0aCBhIHBhdGgKLSMgcHJlZml4ZWQgdG8gZWFjaCBkZXN0IHZhbHVlLgotIyAkKDEpOiBsaXN0IG9mIHNyYzpkZXN0IGluc3RhbGwgcGFpcnMKLSMgJCgyKTogcGF0aCB0byBwcmVmaXggdG8gZWFjaCBkZXN0IHZhbHVlCi1kZWZpbmUgcHJlZml4LWNvcHktbWFueS1maWxlcy1kZXN0Ci0kKGZvcmVhY2ggdiwkKDEpLCQoY2FsbCB3b3JkLWNvbG9uLDEsJCh2KSk6JCgyKSQoY2FsbCB3b3JkLWNvbG9uLDIsJCh2KSkpCi1lbmRlZgotCi0jIENvbnZlcnRzIGFuIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyB2ZGV4IHBhdGggaW50byBhIGxvY2F0aW9uIHRoYXQgY2FuIGJlIHNoYXJlZAotIyBiZXR3ZWVuIGFyY2hpdGVjdHVyZXMuCi1kZWZpbmUgdmRleC1zaGFyZWQtaW5zdGFsbC1wYXRoCi0kKGRpciAkKHBhdHN1YnN0ICUvLCUsJChkaXIgJCgxKSkpKSQobm90ZGlyICQoMSkpCi1lbmRlZgotCi0jIFRha2VzIGEgbGlzdCBvZiBzcmM6ZGVzdCBpbnN0YWxsIHBhaXJzIG9mIHZkZXggZmlsZXMgYW5kIHJldHVybnMgYSBuZXcgbGlzdAotIyB3aGVyZSBlYWNoIGRlc3QgaGFzIGJlZW4gcmV3cml0dGVuIHRvIHRoZSBzaGFyZWQgbG9jYXRpb24gZm9yIHZkZXggZmlsZXMuCi1kZWZpbmUgdmRleC1jb3B5LW1hbnktZmlsZXMtc2hhcmVkLWRlc3QKLSQoZm9yZWFjaCB2LCQoMSksJChjYWxsIHdvcmQtY29sb24sMSwkKHYpKTokKGNhbGwgdmRleC1zaGFyZWQtaW5zdGFsbC1wYXRoLCQoY2FsbCB3b3JkLWNvbG9uLDIsJCh2KSkpKQotZW5kZWYKLQotIyBDcmVhdGVzIGEgcnVsZSB0byBzeW1saW5rIGFuIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyB2ZGV4IGZpbGUgdG8gdGhlIHNoYXJlZAotIyBsb2NhdGlvbiBmb3IgdGhhdCB2ZGV4IGZpbGUuCi1kZWZpbmUgc3ltbGluay12ZGV4LWZpbGUKLSQoc3RyaXAgXAotICAkKGNhbGwgc3ltbGluay1maWxlLFwKLSAgICAkKGNhbGwgdmRleC1zaGFyZWQtaW5zdGFsbC1wYXRoLCQoMSkpLFwKLSAgICAuLi8kKG5vdGRpciAkKDEpKSxcCi0gICAgJCgxKSlcCi0gICQoMSkpCi1lbmRlZgotCi0jIFRha2VzIGEgbGlzdCBvZiBzcmM6ZGVzdCBpbnN0YWxsIHBhaXJzIG9mIHZkZXggZmlsZXMgYW5kIGNyZWF0ZXMgcnVsZXMgdG8KLSMgc3ltbGluayBlYWNoIGRlc3QgdG8gdGhlIHNoYXJlZCBsb2NhdGlvbiBmb3IgdGhhdCB2ZGV4IGZpbGUuCi1kZWZpbmUgc3ltbGluay12ZGV4LWZpbGVzCi0kKGZvcmVhY2ggdiwkKDEpLCQoY2FsbCBzeW1saW5rLXZkZXgtZmlsZSwkKGNhbGwgd29yZC1jb2xvbiwyLCQodikpKSkKLWVuZGVmCi0KLW15X2Jvb3RfaW1hZ2VfbW9kdWxlIDo9Ci0KLW15X3N1ZmZpeCA6PSAkKG15X2Jvb3RfaW1hZ2VfbmFtZSlfJCgkKG15X2Jvb3RfaW1hZ2VfYXJjaCkpCi1teV9jb3B5X3BhaXJzIDo9ICQoY2FsbCBwcmVmaXgtY29weS1tYW55LWZpbGVzLWRlc3QsJChERVhQUkVPUFRfSU1BR0VfQlVJTFRfSU5TVEFMTEVEXyQobXlfc3VmZml4KSksJChteV9ib290X2ltYWdlX291dCkpCi1teV92ZGV4X2NvcHlfcGFpcnMgOj0gJChjYWxsIHByZWZpeC1jb3B5LW1hbnktZmlsZXMtZGVzdCwkKERFWFBSRU9QVF9JTUFHRV9WREVYX0JVSUxUX0lOU1RBTExFRF8kKG15X3N1ZmZpeCkpLCQobXlfYm9vdF9pbWFnZV9vdXQpKQotbXlfdmRleF9jb3B5X3NoYXJlZF9wYWlycyA6PSAkKGNhbGwgdmRleC1jb3B5LW1hbnktZmlsZXMtc2hhcmVkLWRlc3QsJChteV92ZGV4X2NvcHlfcGFpcnMpKQotaWZlcSAoLCQoZmlsdGVyICVfMk5EX0FSQ0gsJChteV9ib290X2ltYWdlX2FyY2gpKSkKLSAgIyBPbmx5IGluc3RhbGwgdGhlIHZkZXggdG8gdGhlIHNoYXJlZCBsb2NhdGlvbiBmb3IgdGhlIHByaW1hcnkgYXJjaGl0ZWN0dXJlLgotICBteV9jb3B5X3BhaXJzICs9ICQobXlfdmRleF9jb3B5X3NoYXJlZF9wYWlycykKLWVuZGlmCi0KLW15X3Vuc3RyaXBwZWRfY29weV9wYWlycyA6PSAkKGNhbGwgcHJlZml4LWNvcHktbWFueS1maWxlcy1kZXN0LCQoREVYUFJFT1BUX0lNQUdFX1VOU1RSSVBQRURfQlVJTFRfSU5TVEFMTEVEXyQobXlfc3VmZml4KSksJChteV9ib290X2ltYWdlX3N5bXMpKQotCi0jIEdlbmVyYXRlIHRoZSBib290IGltYWdlIG1vZHVsZSBvbmx5IGlmIHRoZXJlIGlzIGFueSBmaWxlIHRvIGluc3RhbGwuCi1pZm5lcSAoLCQoc3RyaXAgJChteV9jb3B5X3BhaXJzKSkpCi0gIG15X2ZpcnN0X3BhaXIgOj0gJChmaXJzdHdvcmQgJChteV9jb3B5X3BhaXJzKSkKLSAgbXlfcmVzdF9wYWlycyA6PSAkKHdvcmRsaXN0IDIsJCh3b3JkcyAkKG15X2NvcHlfcGFpcnMpKSwkKG15X2NvcHlfcGFpcnMpKQotCi0gIG15X2ZpcnN0X3NyYyA6PSAkKGNhbGwgd29yZC1jb2xvbiwxLCQobXlfZmlyc3RfcGFpcikpCi0gIG15X2ZpcnN0X2Rlc3QgOj0gJChjYWxsIHdvcmQtY29sb24sMiwkKG15X2ZpcnN0X3BhaXIpKQotCi0gIG15X2luc3RhbGxlZCA6PSAkKGNhbGwgY29weS1tYW55LWZpbGVzLCQobXlfY29weV9wYWlycykpCi0gIG15X3Vuc3RyaXBwZWRfaW5zdGFsbGVkIDo9ICQoY2FsbCBjb3B5LW1hbnktZmlsZXMsJChteV91bnN0cmlwcGVkX2NvcHlfcGFpcnMpKQotCi0gIG15X3N5bWxpbmtzIDo9ICQoY2FsbCBzeW1saW5rLXZkZXgtZmlsZXMsJChteV92ZGV4X2NvcHlfcGFpcnMpKQotCi0gICMgV2UgZG9uJ3QgaGF2ZSBhIExPQ0FMX1BBVEggZm9yIHRoZSBhdXRvLWdlbmVyYXRlZCBtb2R1bGVzLCBzbyBsZXQgaXQgYmUgdGhlICQoQlVJTERfU1lTVEVNKS4KLSAgTE9DQUxfUEFUSCA6PSAkKEJVSUxEX1NZU1RFTSkKLSAgIyBIYWNrIHRvIGxldCB0aGVzZSBwc2V1ZG8tbW9kdWxlcyB3cmFwcGVkIGFyb3VuZCBTb29uZyBtb2R1bGVzIHVzZSBMT0NBTF9TT09OR19JTlNUQUxMRURfTU9EVUxFLgotICBMT0NBTF9NT0RVTEVfTUFLRUZJTEUgOj0gJChTT09OR19BTkRST0lEX01LKQotCi0gIGluY2x1ZGUgJChDTEVBUl9WQVJTKQotICBMT0NBTF9NT0RVTEUgOj0gZGV4cHJlb3B0X2Jvb3RqYXIuJChteV9zdWZmaXgpCi0gIExPQ0FMX1BSRUJVSUxUX01PRFVMRV9GSUxFIDo9ICQobXlfZmlyc3Rfc3JjKQotICBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKGRpciAkKG15X2ZpcnN0X2Rlc3QpKQotICBMT0NBTF9NT0RVTEVfU1RFTSA6PSAkKG5vdGRpciAkKG15X2ZpcnN0X2Rlc3QpKQotICBMT0NBTF9TT09OR19JTlNUQUxMX1BBSVJTIDo9ICQobXlfY29weV9wYWlycykKLSAgTE9DQUxfU09PTkdfSU5TVEFMTF9TWU1MSU5LUyA6PSAkKG15X3N5bWxpbmtzKQotICBMT0NBTF9TT09OR19JTlNUQUxMRURfTU9EVUxFIDo9ICQobXlfZmlyc3RfZGVzdCkKLSAgTE9DQUxfU09PTkdfTElDRU5TRV9NRVRBREFUQSA6PSAkKERFWFBSRU9QVF9JTUFHRV9MSUNFTlNFX01FVEFEQVRBXyQobXlfc3VmZml4KSkKLSAgaWZuZXEgKCwkKHN0cmlwICQoZmlsdGVyIEhPU1RfJSwkKG15X2Jvb3RfaW1hZ2VfYXJjaCkpKSkKLSAgICBMT0NBTF9JU19IT1NUX01PRFVMRSA6PSB0cnVlCi0gIGVuZGlmCi0gIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLSAgaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQotICAkKExPQ0FMX0JVSUxUX01PRFVMRSk6IHwgJChteV91bnN0cmlwcGVkX2luc3RhbGxlZCkKLSAgIyBJbnN0YWxsaW5nIGJvb3QuYXJ0IGNhdXNlcyBhbGwgYm9vdCBpbWFnZSBiaXRzIHRvIGJlIGluc3RhbGxlZC4KLSAgIyBLZWVwIHRoaXMgb2xkIGJlaGF2aW9yIGluIGNhc2UgYW55b25lIHN0aWxsIG5lZWRzIGl0LgotICAkKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpOiAkKHdvcmRsaXN0IDIsJCh3b3JkcyAkKG15X2luc3RhbGxlZCkpLCQobXlfaW5zdGFsbGVkKSkgJChteV9zeW1saW5rcykKLSAgJChteV9hbGxfdGFyZ2V0cyk6ICQobXlfaW5zdGFsbGVkKSAkKG15X3N5bWxpbmtzKQotCi0gIG15X2Jvb3RfaW1hZ2VfbW9kdWxlIDo9ICQoTE9DQUxfTU9EVUxFKQotZW5kaWYgICMgbXlfY29weV9wYWlycyAhPSBlbXB0eQpkaWZmIC0tZ2l0IGEvY29yZS9kZXhfcHJlb3B0X29kZXhfaW5zdGFsbC5tayBiL2NvcmUvZGV4X3ByZW9wdF9vZGV4X2luc3RhbGwubWsKaW5kZXggOGViZjM0ZS4uZTcwODZiNyAxMDA2NDQKLS0tIGEvY29yZS9kZXhfcHJlb3B0X29kZXhfaW5zdGFsbC5taworKysgYi9jb3JlL2RleF9wcmVvcHRfb2RleF9pbnN0YWxsLm1rCkBAIC02MCwxOCArNjAsOCBAQAogICBMT0NBTF9ERVhfUFJFT1BUIDo9CiBlbmRpZgogCi0jIGlmIFdJVEhfREVYUFJFT1BUX0JPT1RfSU1HX0FORF9TWVNURU1fU0VSVkVSX09OTFk9dHJ1ZSBhbmQgbW9kdWxlIGlzIG5vdCBpbiBib290IGNsYXNzIHBhdGggc2tpcAotIyBBbHNvIHByZW9wdCBzeXN0ZW0gc2VydmVyIGphcnMgc2luY2Ugc2VsaW51eCBwcmV2ZW50cyBzeXN0ZW0gc2VydmVyIGZyb20gbG9hZGluZyBhbnl0aGluZyBmcm9tCi0jIC9kYXRhLiBJZiB3ZSBkb24ndCBkbyB0aGlzIHRoZXkgd2lsbCBuZWVkIHRvIGJlIGV4dHJhY3RlZCB3aGljaCBpcyBub3QgZmF2b3JhYmxlIGZvciBSQU0gdXNhZ2UKLSMgb3IgcGVyZm9ybWFuY2UuIElmIG15X3ByZW9wdF9mb3JfZXh0cmFjdGVkX2FwayBpcyB0cnVlLCB3ZSBpZ25vcmUgdGhlIG9ubHkgcHJlb3B0IGJvb3QgaW1hZ2UKLSMgb3B0aW9ucy4KLXN5c3RlbV9zZXJ2ZXJfamFycyA6PSAkKGZvcmVhY2ggbSwkKFBST0RVQ1RfU1lTVEVNX1NFUlZFUl9KQVJTKSwkKGNhbGwgd29yZC1jb2xvbiwyLCQobSkpKQotaWZuZXEgKHRydWUsJChteV9wcmVvcHRfZm9yX2V4dHJhY3RlZF9hcGspKQotICBpZmVxICh0cnVlLCQoV0lUSF9ERVhQUkVPUFRfQk9PVF9JTUdfQU5EX1NZU1RFTV9TRVJWRVJfT05MWSkpCi0gICAgaWZlcSAoJChmaWx0ZXIgJChzeXN0ZW1fc2VydmVyX2phcnMpICQoREVYUFJFT1BUX0JPT1RfSkFSU19NT0RVTEVTKSwkKExPQ0FMX01PRFVMRSkpLCkKLSAgICAgIExPQ0FMX0RFWF9QUkVPUFQgOj0KLSAgICBlbmRpZgotICBlbmRpZgoraWZlcSAodHJ1ZSwkKFdJVEhfREVYUFJFT1BUX0FSVF9CT09UX0lNR19PTkxZKSkKKyAgTE9DQUxfREVYX1BSRU9QVCA6PQogZW5kaWYKIAogbXlfcHJvY2Vzc19wcm9maWxlIDo9CkBAIC04NCwxMiArNzQsMTMgQEAKIGlmbmRlZiBMT0NBTF9ERVhfUFJFT1BUX0dFTkVSQVRFX1BST0ZJTEUKICAgIyBJZiBMT0NBTF9ERVhfUFJFT1BUX0dFTkVSQVRFX1BST0ZJTEUgaXMgbm90IGRlZmluZWQsIGRlZmF1bHQgaXQgYmFzZWQgb24gdGhlIGV4aXN0ZW5jZSBvZiB0aGUKICAgIyBwcm9maWxlIGNsYXNzIGxpc3RpbmcuIFRPRE86IFVzZSBwcm9kdWN0IHNwZWNpZmljIGRpcmVjdG9yeSBoZXJlLgotICBteV9jbGFzc2VzX2RpcmVjdG9yeSA6PSAkKFBST0RVQ1RfREVYX1BSRU9QVF9QUk9GSUxFX0RJUikKLSAgTE9DQUxfREVYX1BSRU9QVF9QUk9GSUxFIDo9ICQobXlfY2xhc3Nlc19kaXJlY3RvcnkpLyQoTE9DQUxfTU9EVUxFKS5wcm9mCisgIGlmZGVmIFBST0RVQ1RfREVYX1BSRU9QVF9QUk9GSUxFX0RJUgorICAgIExPQ0FMX0RFWF9QUkVPUFRfUFJPRklMRSA6PSAkKFBST0RVQ1RfREVYX1BSRU9QVF9QUk9GSUxFX0RJUikvJChMT0NBTF9NT0RVTEUpLnByb2YKIAotICBpZm5lcSAoLCQod2lsZGNhcmQgJChMT0NBTF9ERVhfUFJFT1BUX1BST0ZJTEUpKSkKLSAgICBteV9wcm9jZXNzX3Byb2ZpbGUgOj0gdHJ1ZQotICAgIG15X3Byb2ZpbGVfaXNfdGV4dF9saXN0aW5nIDo9CisgICAgaWZuZXEgKCwkKHdpbGRjYXJkICQoTE9DQUxfREVYX1BSRU9QVF9QUk9GSUxFKSkpCisgICAgICBteV9wcm9jZXNzX3Byb2ZpbGUgOj0gdHJ1ZQorICAgICAgbXlfcHJvZmlsZV9pc190ZXh0X2xpc3RpbmcgOj0KKyAgICBlbmRpZgogICBlbmRpZgogZWxzZQogICBteV9wcm9jZXNzX3Byb2ZpbGUgOj0gJChMT0NBTF9ERVhfUFJFT1BUX0dFTkVSQVRFX1BST0ZJTEUpCkBAIC0xMTAsMTggKzEwMSwxOSBAQAogIyBMb2NhbCBtb2R1bGUgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgdXNlZCBpbiBkZXhwcmVvcHQgYW5kIG1hbmlmZXN0X2NoZWNrLgogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotbXlfZmlsdGVyZWRfb3B0aW9uYWxfdXNlc19saWJyYXJpZXMgOj0gJChmaWx0ZXItb3V0ICQoSU5URVJOQUxfUExBVEZPUk1fTUlTU0lOR19VU0VTX0xJQlJBUklFUyksIFwKLSAgJChMT0NBTF9PUFRJT05BTF9VU0VTX0xJQlJBUklFUykpCi0KICMgVE9ETyhiLzEzMjM1NzMwMCk6IFRoaXMgbWF5IGZpbHRlciBvdXQgdG9vIG11Y2gsIGFzIFBST0RVQ1RfUEFDS0FHRVMgZG9lc24ndAogIyBpbmNsdWRlIGFsbCBwYWNrYWdlcyAodGhlIGZ1bGwgbGlzdCBpcyB1bmtub3duIHVudGlsIHJlYWRpbmcgYWxsIEFuZHJvaWQubWsKICMgbWFrZWZpbGVzKS4gQXMgYSBjb25zZXF1ZW5jZSwgYSBsaWJyYXJ5IG1heSBiZSBwcmVzZW50IGJ1dCBub3QgaW5jbHVkZWQgaW4KICMgZGV4cHJlb3B0LCB3aGljaCB3aWxsIHJlc3VsdCBpbiBjbGFzcyBsb2FkZXIgY29udGV4dCBtaXNtYXRjaCBhbmQgYSBmYWlsdXJlCi0jIHRvIGxvYWQgZGV4cHJlb3B0IGNvZGUgb24gZGV2aWNlLiBXZSBzaG91bGQgZml4IHRoaXMsIGVpdGhlciBieSBkZWZlcnJpbmcKLSMgZGVwZW5kZW5jeSBjb21wdXRhdGlvbiB1bnRpbCB0aGUgZnVsbCBsaXN0IG9mIHByb2R1Y3QgcGFja2FnZXMgaXMga25vd24sIG9yCi0jIGJ5IGFkZGluZyBwcm9kdWN0LXNwZWNpZmljIGxpc3RzIG9mIG1pc3NpbmcgbGlicmFyaWVzLgorIyB0byBsb2FkIGRleHByZW9wdCBjb2RlIG9uIGRldmljZS4KKyMgSG93ZXZlciwgd2UgaGF2ZSB0byBkbyBmaWx0ZXJpbmcgaGVyZS4gT3RoZXJ3aXNlLCB3ZSBtYXkgaW5jbHVkZSBleHRyYQorIyBsaWJyYXJpZXMgdGhhdCBTb29uZyBhbmQgTWFrZSBkb24ndCBnZW5lcmF0ZSBidWlsZCBydWxlcyBmb3IgKGUuZy4sIGEgbGlicmFyeQorIyB0aGF0IGV4aXN0cyBpbiB0aGUgc291cmNlIHRyZWUgYnV0IG5vdCBpbnN0YWxsYWJsZSksIGFuZCB0aGVyZWZvcmUgZ2V0IE5pbmphCisjIGVycm9ycy4KKyMgV2UgaGF2ZSBkZWZlcnJlZCBDTEMgY29tcHV0YXRpb24gdG8gdGhlIE5pbmphIHBoYXNlLCBidXQgdGhlIGRlcGVuZGVuY3kKKyMgY29tcHV0YXRpb24gc3RpbGwgbmVlZHMgdG8gYmUgZG9uZSBlYXJseS4gRm9yIG5vdywgdGhpcyBpcyB0aGUgYmVzdCB3ZSBjYW4gZG8uCiBteV9maWx0ZXJlZF9vcHRpb25hbF91c2VzX2xpYnJhcmllcyA6PSAkKGZpbHRlciAkKFBST0RVQ1RfUEFDS0FHRVMpLCBcCi0gICQobXlfZmlsdGVyZWRfb3B0aW9uYWxfdXNlc19saWJyYXJpZXMpKQorICAkKExPQ0FMX09QVElPTkFMX1VTRVNfTElCUkFSSUVTKSkKIAogaWZlcSAoJChMT0NBTF9NT0RVTEVfQ0xBU1MpLEFQUFMpCiAgICMgY29tcGF0aWJpbGl0eSBsaWJyYXJpZXMgYXJlIGFkZGVkIHRvIGNsYXNzIGxvYWRlciBjb250ZXh0IG9mIGFuIGFwcCBvbmx5IGlmCkBAIC0xNTAsNiArMTQyLDkgQEAKICAgJChMT0NBTF9VU0VTX0xJQlJBUklFUykgXAogICAkKG15X2ZpbHRlcmVkX29wdGlvbmFsX3VzZXNfbGlicmFyaWVzKQogCisjIFRoZSBvcmRlciBuZWVkcyB0byBiZSBkZXRlcm1pbmlzdGljLgorbXlfZGV4cHJlb3B0X2xpYnNfYWxsIDo9ICQoc29ydCAkKG15X2RleHByZW9wdF9saWJzKSAkKG15X2RleHByZW9wdF9saWJzX2NvbXBhdCkpCisKICMgTW9kdWxlIGRleHByZW9wdC5jb25maWcgZGVwZW5kcyBvbiBkZXhwcmVvcHQuY29uZmlnIGZpbGVzIG9mIGVhY2gKICMgPHVzZXMtbGlicmFyeT4gZGVwZW5kZW5jeSwgYmVjYXVzZSB0aGVzZSBsaWJyYXJpZXMgbWF5IGJlIHByb2Nlc3NlZCBhZnRlcgogIyB0aGUgY3VycmVudCBtb2R1bGUgYnkgTWFrZSAodGhlcmUncyBubyB0b3BvbG9naWNhbCBvcmRlciksIHNvIHRoZSBkZXBlbmRlbmN5CkBAIC0yMDcsNiArMjAyLDEyIEBACiBlbmRpZgogaWZuZXEgKCwkKExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUpKQogICBMT0NBTF9FTkZPUkNFX1VTRVNfTElCUkFSSUVTIDo9IGZhbHNlCisKKyAgIyBFbmFibGUgdGhlIGNoZWNrIGZvciBXVFMKKyAgaWZuZXEgKCQoZmlsdGVyIHd0cywkKExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUpKSwpCisgICAgTE9DQUxfRU5GT1JDRV9VU0VTX0xJQlJBUklFUyA6PSB0cnVlCisgIGVuZGlmCisKIGVuZGlmCiAKICMgRGlzYWJsZSB0aGUgY2hlY2sgaWYgdGhlIGFwcCBjb250YWlucyBubyBqYXZhIGNvZGUuCkBAIC0yMjEsNyArMjIyLDcgQEAKICMgYXMgYSBmYWlsdXJlIHRvIGdldCBtYW5pZmVzdCBmcm9tIGFuIEFQSykuCiBpZm5lcSAodHJ1ZSwkKFdJVEhfREVYUFJFT1BUKSkKICAgTE9DQUxfRU5GT1JDRV9VU0VTX0xJQlJBUklFUyA6PSBmYWxzZQotZWxzZSBpZmVxICh0cnVlLCQoV0lUSF9ERVhQUkVPUFRfQk9PVF9JTUdfQU5EX1NZU1RFTV9TRVJWRVJfT05MWSkpCitlbHNlIGlmZXEgKHRydWUsJChXSVRIX0RFWFBSRU9QVF9BUlRfQk9PVF9JTUdfT05MWSkpCiAgIExPQ0FMX0VORk9SQ0VfVVNFU19MSUJSQVJJRVMgOj0gZmFsc2UKIGVuZGlmCiAKQEAgLTI0MCw3ICsyNDEsNyBAQAogICAgIC0tZW5mb3JjZS11c2VzLWxpYnJhcmllcy1yZWxheCwpCiAgIG15X2RleHByZW9wdF9jb25maWdfYXJncyA6PSAkKHBhdHN1YnN0ICUsLS1kZXhwcmVvcHQtY29uZmlnICUsJChteV9kZXhwcmVvcHRfZGVwX2NvbmZpZ3MpKQogCi0gIG15X2VuZm9yY2VkX3VzZXNfbGlicmFyaWVzIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2VuZm9yY2VfdXNlc19saWJyYXJpZXMuc3RhdHVzCisgIG15X2VuZm9yY2VkX3VzZXNfbGlicmFyaWVzIDo9ICQoaW50ZXJtZWRpYXRlcykvZW5mb3JjZV91c2VzX2xpYnJhcmllcy5zdGF0dXMKICAgJChteV9lbmZvcmNlZF91c2VzX2xpYnJhcmllcyk6IFBSSVZBVEVfVVNFU19MSUJSQVJJRVMgOj0gJChteV91c2VzX2xpYnNfYXJncykKICAgJChteV9lbmZvcmNlZF91c2VzX2xpYnJhcmllcyk6IFBSSVZBVEVfT1BUSU9OQUxfVVNFU19MSUJSQVJJRVMgOj0gJChteV9vcHRpb25hbF91c2VzX2xpYnNfYXJncykKICAgJChteV9lbmZvcmNlZF91c2VzX2xpYnJhcmllcyk6IFBSSVZBVEVfREVYUFJFT1BUX0NPTkZJR1MgOj0gJChteV9kZXhwcmVvcHRfY29uZmlnX2FyZ3MpCkBAIC0zOTUsNyArMzk2LDYgQEAKICAgJChjYWxsIGFkZF9qc29uX2xpc3QsIERleFByZW9wdEltYWdlTG9jYXRpb25zT25EZXZpY2UsJChteV9kZXhwcmVvcHRfaW1hZ2VfbG9jYXRpb25zX29uX2RldmljZSkpCiAgICQoY2FsbCBhZGRfanNvbl9saXN0LCBQcmVvcHRCb290Q2xhc3NQYXRoRGV4RmlsZXMsICAgICQoREVYUFJFT1BUX0JPT1RDTEFTU1BBVEhfREVYX0ZJTEVTKSkKICAgJChjYWxsIGFkZF9qc29uX2xpc3QsIFByZW9wdEJvb3RDbGFzc1BhdGhEZXhMb2NhdGlvbnMsJChERVhQUkVPUFRfQk9PVENMQVNTUEFUSF9ERVhfTE9DQVRJT05TKSkKLSAgJChjYWxsIGFkZF9qc29uX2Jvb2wsIFByZW9wdEV4dHJhY3RlZEFwaywgICAgICAgICAgICAgJChteV9wcmVvcHRfZm9yX2V4dHJhY3RlZF9hcGspKQogICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgTm9DcmVhdGVBcHBJbWFnZSwgICAgICAgICAgICAgICAkKGZpbHRlciBmYWxzZSwkKExPQ0FMX0RFWF9QUkVPUFRfQVBQX0lNQUdFKSkpCiAgICQoY2FsbCBhZGRfanNvbl9ib29sLCBGb3JjZUNyZWF0ZUFwcEltYWdlLCAgICAgICAgICAgICQoZmlsdGVyIHRydWUsJChMT0NBTF9ERVhfUFJFT1BUX0FQUF9JTUFHRSkpKQogICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgUHJlc2lnbmVkUHJlYnVpbHQsICAgICAgICAgICAgICAkKGZpbHRlciBQUkVTSUdORUQsJChMT0NBTF9DRVJUSUZJQ0FURSkpKQpAQCAtNDQwLDY2ICs0NDAsMTI0IEBACiAJICBAY3AgJChQUklWQVRFX0JVSUxUX01PRFVMRSkgJEAKICAgZW5kaWYKIAorICAjIFRoZSByb290ICJwcm9kdWN0X3BhY2thZ2VzLnR4dCIgaXMgZ2VuZXJhdGVkIGJ5IGBidWlsZC9tYWtlL2NvcmUvTWFrZWZpbGVgLiBJdCBjb250YWlucyBhIGxpc3QKKyAgIyBvZiBhbGwgcGFja2FnZXMgdGhhdCBhcmUgaW5zdGFsbGVkIG9uIHRoZSBkZXZpY2UuIFdlIHVzZSBgZ3JlcGAgdG8gZmlsdGVyIHRoZSBsaXN0IGJ5IHRoZSBhcHAncworICAjIGRlcGVuZGVuY2llcyB0byBjcmVhdGUgYSBwZXItYXBwIGxpc3QsIGFuZCB1c2UgYHJzeW5jIC0tY2hlY2tzdW1gIHRvIHByZXZlbnQgdGhlIGZpbGUncyBtdGltZQorICAjIGZyb20gYmVpbmcgY2hhbmdlZCBpZiB0aGUgY29udGVudHMgZG9uJ3QgY2hhbmdlLiBUaGlzIGF2b2lkcyB1bm5lY2Vzc2FyeSBkZXhwcmVvcHQgcmVydW5zLgorICBteV9kZXhwcmVvcHRfcHJvZHVjdF9wYWNrYWdlcyA6PSAkKGludGVybWVkaWF0ZXMpL3Byb2R1Y3RfcGFja2FnZXMudHh0CisgIC5LQVRJX1JFU1RBVDogJChteV9kZXhwcmVvcHRfcHJvZHVjdF9wYWNrYWdlcykKKyAgJChteV9kZXhwcmVvcHRfcHJvZHVjdF9wYWNrYWdlcyk6IFBSSVZBVEVfTU9EVUxFIDo9ICQoTE9DQUxfTU9EVUxFKQorICAkKG15X2RleHByZW9wdF9wcm9kdWN0X3BhY2thZ2VzKTogUFJJVkFURV9MSUJTIDo9ICQobXlfZGV4cHJlb3B0X2xpYnNfYWxsKQorICAkKG15X2RleHByZW9wdF9wcm9kdWN0X3BhY2thZ2VzKTogUFJJVkFURV9TVEFHSU5HIDo9ICQobXlfZGV4cHJlb3B0X3Byb2R1Y3RfcGFja2FnZXMpLnRtcAorICAkKG15X2RleHByZW9wdF9wcm9kdWN0X3BhY2thZ2VzKTogJChQUk9EVUNUX09VVCkvcHJvZHVjdF9wYWNrYWdlcy50eHQKKwlAZWNobyAiJChQUklWQVRFX01PRFVMRSkgZGV4cHJlb3B0IHByb2R1Y3RfcGFja2FnZXMiCisgIGlmbmVxICgsJChteV9kZXhwcmVvcHRfbGlic19hbGwpKQorCQlncmVwIC1GIC14IFwKKwkJCSQoYWRkcHJlZml4IC1lICwkKFBSSVZBVEVfTElCUykpIFwKKwkJCSQoUFJPRFVDVF9PVVQpL3Byb2R1Y3RfcGFja2FnZXMudHh0IFwKKwkJCT4gJChQUklWQVRFX1NUQUdJTkcpIFwKKwkJCXx8IHRydWUKKyAgZWxzZQorCQlybSAtZiAkKFBSSVZBVEVfU1RBR0lORykgJiYgdG91Y2ggJChQUklWQVRFX1NUQUdJTkcpCisgIGVuZGlmCisJcnN5bmMgLS1jaGVja3N1bSAkKFBSSVZBVEVfU1RBR0lORykgJEAKKwogICBteV9kZXhwcmVvcHRfc2NyaXB0IDo9ICQoaW50ZXJtZWRpYXRlcykvZGV4cHJlb3B0LnNoCi0gIG15X2RleHByZW9wdF96aXAgOj0gJChpbnRlcm1lZGlhdGVzKS9kZXhwcmVvcHQuemlwCi0gIERFWFBSRU9QVC4kKExPQ0FMX01PRFVMRSkuUE9TVF9JTlNUQUxMRURfREVYUFJFT1BUX1pJUCA6PSAkKG15X2RleHByZW9wdF96aXApCiAgIC5LQVRJX1JFU1RBVDogJChteV9kZXhwcmVvcHRfc2NyaXB0KQogICAkKG15X2RleHByZW9wdF9zY3JpcHQpOiBQUklWQVRFX01PRFVMRSA6PSAkKExPQ0FMX01PRFVMRSkKICAgJChteV9kZXhwcmVvcHRfc2NyaXB0KTogUFJJVkFURV9HTE9CQUxfU09PTkdfQ09ORklHIDo9ICQoREVYX1BSRU9QVF9TT09OR19DT05GSUdfRk9SX01BS0UpCiAgICQobXlfZGV4cHJlb3B0X3NjcmlwdCk6IFBSSVZBVEVfR0xPQkFMX0NPTkZJRyA6PSAkKERFWF9QUkVPUFRfQ09ORklHX0ZPUl9NQUtFKQogICAkKG15X2RleHByZW9wdF9zY3JpcHQpOiBQUklWQVRFX01PRFVMRV9DT05GSUcgOj0gJChteV9kZXhwcmVvcHRfY29uZmlnKQorICAkKG15X2RleHByZW9wdF9zY3JpcHQpOiBQUklWQVRFX1BST0RVQ1RfUEFDS0FHRVMgOj0gJChteV9kZXhwcmVvcHRfcHJvZHVjdF9wYWNrYWdlcykKICAgJChteV9kZXhwcmVvcHRfc2NyaXB0KTogJChERVhQUkVPUFRfR0VOKQogICAkKG15X2RleHByZW9wdF9zY3JpcHQpOiAkKG15X2RleHByZW9wdF9qYXJfY29weSkKLSAgJChteV9kZXhwcmVvcHRfc2NyaXB0KTogJChteV9kZXhwcmVvcHRfY29uZmlnKSAkKERFWF9QUkVPUFRfU09PTkdfQ09ORklHX0ZPUl9NQUtFKSAkKERFWF9QUkVPUFRfQ09ORklHX0ZPUl9NQUtFKQorICAkKG15X2RleHByZW9wdF9zY3JpcHQpOiAkKG15X2RleHByZW9wdF9jb25maWcpICQoREVYX1BSRU9QVF9TT09OR19DT05GSUdfRk9SX01BS0UpICQoREVYX1BSRU9QVF9DT05GSUdfRk9SX01BS0UpICQobXlfZGV4cHJlb3B0X3Byb2R1Y3RfcGFja2FnZXMpCiAJQGVjaG8gIiQoUFJJVkFURV9NT0RVTEUpIGRleHByZW9wdCBnZW4iCiAJJChERVhQUkVPUFRfR0VOKSBcCiAJLWdsb2JhbF9zb29uZyAkKFBSSVZBVEVfR0xPQkFMX1NPT05HX0NPTkZJRykgXAogCS1nbG9iYWwgJChQUklWQVRFX0dMT0JBTF9DT05GSUcpIFwKIAktbW9kdWxlICQoUFJJVkFURV9NT0RVTEVfQ09ORklHKSBcCiAJLWRleHByZW9wdF9zY3JpcHQgJEAgXAotCS1vdXRfZGlyICQoT1VUX0RJUikKKwktb3V0X2RpciAkKE9VVF9ESVIpIFwKKwktcHJvZHVjdF9wYWNrYWdlcyAkKFBSSVZBVEVfUFJPRFVDVF9QQUNLQUdFUykKIAogICBteV9kZXhwcmVvcHRfZGVwcyA6PSAkKG15X2RleF9qYXIpCiAgIG15X2RleHByZW9wdF9kZXBzICs9ICQoaWYgJChteV9wcm9jZXNzX3Byb2ZpbGUpLCQoTE9DQUxfREVYX1BSRU9QVF9QUk9GSUxFKSkKICAgbXlfZGV4cHJlb3B0X2RlcHMgKz0gXAotICAgICQoZm9yZWFjaCBsaWIsICQobXlfZGV4cHJlb3B0X2xpYnMpICQobXlfZGV4cHJlb3B0X2xpYnNfY29tcGF0KSwgXAorICAgICQoZm9yZWFjaCBsaWIsICQobXlfZGV4cHJlb3B0X2xpYnNfYWxsKSwgXAogICAgICAgJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixKQVZBX0xJQlJBUklFUywkKGxpYiksLENPTU1PTikvamF2YWxpYi5qYXIpCiAgIG15X2RleHByZW9wdF9kZXBzICs9ICQobXlfZGV4cHJlb3B0X2ltYWdlc19kZXBzKQogICBteV9kZXhwcmVvcHRfZGVwcyArPSAkKERFWFBSRU9QVF9CT09UQ0xBU1NQQVRIX0RFWF9GSUxFUykKICAgaWZlcSAoJChMT0NBTF9FTkZPUkNFX1VTRVNfTElCUkFSSUVTKSx0cnVlKQotICAgIG15X2RleHByZW9wdF9kZXBzICs9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2VuZm9yY2VfdXNlc19saWJyYXJpZXMuc3RhdHVzCisgICAgbXlfZGV4cHJlb3B0X2RlcHMgKz0gJChpbnRlcm1lZGlhdGVzKS9lbmZvcmNlX3VzZXNfbGlicmFyaWVzLnN0YXR1cwogICBlbmRpZgogCisgICMgV2UgbmVlZCB0byBhZGQgYWxsIHRoZSBpbnN0YWxsZWQgZmlsZXMgdG8gQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5JTlNUQUxMRUQgaW4gb3JkZXIKKyAgIyBmb3IgdGhlIGJ1aWxkIHN5c3RlbSB0byBwcm9wZXJseSB0cmFjayBpbnN0YWxsZWQgZmlsZXMuIChmb3Igc2JvbSwgaW5zdGFsbGNsZWFuLCBldGMpCisgICMgV2UgaW5zdGFsbCBhbGwgdGhlIGZpbGVzIGluIGEgemlwIGZpbGUgZ2VuZXJhdGVkIGF0IGV4ZWN1dGlvbiB0aW1lLCB3aGljaCBtZWFucyB3ZSBoYXZlIHRvIGd1ZXNzCisgICMgd2hhdCdzIGdvaW5nIHRvIGJlIGluIHRoYXQgemlwIGZpbGUgYmVmb3JlIGl0J3MgY3JlYXRlZC4gV2UgdGhlbiBjaGVjayBhdCBleGVjdXRhdGlvbiB0aW1lIHRoYXQKKyAgIyBvdXIgZ3Vlc3MgaXMgY29ycmVjdC4KKyAgIyBfc3lzdGVtX290aGVyIGNvcnJlc3BvbmRzIHRvIE9kZXhPblN5c3RlbU90aGVyQnlOYW1lKCkgaW4gc29vbmcuCisgICMgVGhlIG90aGVyIHBhdGhzIGNvcnJlc3BvbmQgdG8gZGV4cHJlb3B0Q29tbWFuZCgpCisgIF9kZXhsb2NhdGlvbiA6PSAkKHBhdHN1YnN0ICQoUFJPRFVDVF9PVVQpLyUsJSwkKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpKQorICBfZGV4bmFtZSA6PSAkKGJhc2VuYW1lICQobm90ZGlyICQoX2RleGxvY2F0aW9uKSkpCisgIF9zeXN0ZW1fb3RoZXIgOj0gJChzdHJpcCAkKGlmICQoc3RyaXAgJChCT0FSRF9VU0VTX1NZU1RFTV9PVEhFUl9PREVYKSksIFwKKyAgICAkKGlmICQoc3RyaXAgJChTQU5JVElaRV9MSVRFKSksLCBcCisgICAgICAkKGlmICQoZmlsdGVyICQoX2RleG5hbWUpLCQoUFJPRFVDVF9ERVhQUkVPUFRfU1BFRURfQVBQUykpJChmaWx0ZXIgJChfZGV4bmFtZSksJChQUk9EVUNUX1NZU1RFTV9TRVJWRVJfQVBQUykpLCwgXAorICAgICAgICAkKGlmICQoc3RyaXAgJChmb3JlYWNoIG15ZmlsdGVyLCQoU1lTVEVNX09USEVSX09ERVhfRklMVEVSKSwkKGZpbHRlciBzeXN0ZW0vJChteWZpbHRlciksJChfZGV4bG9jYXRpb24pKSQoZmlsdGVyICQobXlmaWx0ZXIpLCQoX2RleGxvY2F0aW9uKSkpKSwgXAorICAgICAgICAgICAgc3lzdGVtX290aGVyLykpKSkpCisgICMgX2RleGRpciBoYXMgYSB0cmFpbGluZyAvCisgIF9kZXhkaXIgOj0gJChfc3lzdGVtX290aGVyKSQoZGlyICQoX2RleGxvY2F0aW9uKSkKKyAgbXlfZGV4cHJlb3B0X3ppcF9jb250ZW50cyA6PSAkKHNvcnQgXAorICAgICQoZm9yZWFjaCBhcmNoLCQobXlfZGV4cHJlb3B0X2FyY2hzKSwgXAorICAgICAgJChfZGV4ZGlyKW9hdC8kKGFyY2gpLyQoX2RleG5hbWUpLm9kZXggXAorICAgICAgJChfZGV4ZGlyKW9hdC8kKGFyY2gpLyQoX2RleG5hbWUpLnZkZXggXAorICAgICAgJChpZiAkKGZpbHRlciBmYWxzZSwkKExPQ0FMX0RFWF9QUkVPUFRfQVBQX0lNQUdFKSksLCBcCisgICAgICAgICQoaWYgJChteV9wcm9jZXNzX3Byb2ZpbGUpJChmaWx0ZXIgdHJ1ZSwkKExPQ0FMX0RFWF9QUkVPUFRfQVBQX0lNQUdFKSksIFwKKyAgICAgICAgICAkKF9kZXhkaXIpb2F0LyQoYXJjaCkvJChfZGV4bmFtZSkuYXJ0KSkpIFwKKyAgICAkKGlmICQobXlfcHJvY2Vzc19wcm9maWxlKSwkKF9kZXhsb2NhdGlvbikucHJvZikpCisgIF9kZXhsb2NhdGlvbiA6PQorICBfZGV4ZGlyIDo9CisgIF9kZXhuYW1lIDo9CisgIF9zeXN0ZW1fb3RoZXIgOj0KKworICBteV9kZXhwcmVvcHRfemlwIDo9ICQoaW50ZXJtZWRpYXRlcykvZGV4cHJlb3B0LnppcAogICAkKG15X2RleHByZW9wdF96aXApOiBQUklWQVRFX01PRFVMRSA6PSAkKExPQ0FMX01PRFVMRSkKICAgJChteV9kZXhwcmVvcHRfemlwKTogJChteV9kZXhwcmVvcHRfZGVwcykKICAgJChteV9kZXhwcmVvcHRfemlwKTogfCAkKERFWFBSRU9QVF9HRU5fREVQUykKICAgJChteV9kZXhwcmVvcHRfemlwKTogLktBVElfREVQRklMRSA6PSAkKG15X2RleHByZW9wdF96aXApLmQKICAgJChteV9kZXhwcmVvcHRfemlwKTogUFJJVkFURV9ERVggOj0gJChteV9kZXhfamFyKQogICAkKG15X2RleHByZW9wdF96aXApOiBQUklWQVRFX1NDUklQVCA6PSAkKG15X2RleHByZW9wdF9zY3JpcHQpCisgICQobXlfZGV4cHJlb3B0X3ppcCk6IFBSSVZBVEVfWklQX0NPTlRFTlRTIDo9ICQobXlfZGV4cHJlb3B0X3ppcF9jb250ZW50cykKICAgJChteV9kZXhwcmVvcHRfemlwKTogJChteV9kZXhwcmVvcHRfc2NyaXB0KQogCUBlY2hvICIkKFBSSVZBVEVfTU9EVUxFKSBkZXhwcmVvcHQiCisJcm0gLWYgJEAKKwllY2hvIC1uID4gJEAuY29udGVudHMKKwkkKGZvcmVhY2ggZiwkKFBSSVZBVEVfWklQX0NPTlRFTlRTKSxlY2hvICIkKGYpIiA+PiAkQC5jb250ZW50cyQobmV3bGluZSkpCiAJYmFzaCAkKFBSSVZBVEVfU0NSSVBUKSAkKFBSSVZBVEVfREVYKSAkQAorCWlmICEgZGlmZiA8KHppcGluZm8gLTEgJEAgfCBzb3J0KSAkQC5jb250ZW50cyA+JjI7IHRoZW4gXAorCSAgZWNobyAiQ29udGVudHMgb2YgJEAgZGlkIG5vdCBtYXRjaCB3aGF0IG1ha2Ugd2FzIGV4cGVjdGluZy4iID4mMiAmJiBleGl0IDE7IFwKKwlmaQogCi0gIGlmZGVmIExPQ0FMX1BPU1RfSU5TVEFMTF9DTUQKLSAgICAjIEFkZCBhIHNoZWxsIGNvbW1hbmQgc2VwYXJhdG9yCi0gICAgTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSAmJgotICBlbmRpZgorICAkKGZvcmVhY2ggaW5zdGFsbGVkX2RleF9maWxlLCQobXlfZGV4cHJlb3B0X3ppcF9jb250ZW50cyksXAorICAgICQoZXZhbCAkKFBST0RVQ1RfT1VUKS8kKGluc3RhbGxlZF9kZXhfZmlsZSk6ICQobXlfZGV4cHJlb3B0X3ppcCkgXAorJChuZXdsaW5lKQl1bnppcCAtcW9ERCAtZCAkKFBST0RVQ1RfT1VUKSAkKG15X2RleHByZW9wdF96aXApICQoaW5zdGFsbGVkX2RleF9maWxlKSkpCiAKLSAgTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSBcCi0gICAgZm9yIGkgaW4gJCQoemlwaW5mbyAtMSAkKG15X2RleHByZW9wdF96aXApKTsgXAotICAgICAgZG8gbWtkaXIgLXAgJChQUk9EVUNUX09VVCkvJCQoZGlybmFtZSAkJGkpOyBcCi0gICAgZG9uZSAmJiBcCi0gICAgKCB1bnppcCAtcW9ERCAtZCAkKFBST0RVQ1RfT1VUKSAkKG15X2RleHByZW9wdF96aXApIDI+JjEgfCBncmVwIC12ICJ6aXBmaWxlIGlzIGVtcHR5IjsgZXhpdCAkJHtQSVBFU1RBVFVTWzBdfSApIHx8IFwKLSAgICAgICggY29kZT0kJD87IGlmIFsgJCRjb2RlIC1uZSAwIC1hICQkY29kZSAtbmUgMSBdOyB0aGVuIGV4aXQgJCRjb2RlOyBmaSApCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuSU5TVEFMTEVEICs9ICQoYWRkcHJlZml4ICQoUFJPRFVDVF9PVVQpLywkKG15X2RleHByZW9wdF96aXBfY29udGVudHMpKQogCi0gICQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSk6IFBSSVZBVEVfUE9TVF9JTlNUQUxMX0NNRCA6PSAkKExPQ0FMX1BPU1RfSU5TVEFMTF9DTUQpCi0gICQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSk6ICQobXlfZGV4cHJlb3B0X3ppcCkKLQotICAkKG15X2FsbF90YXJnZXRzKTogJChteV9kZXhwcmVvcHRfemlwKQorICAjIE5vcm1hbGx5IHRoaXMgaGFwcGVucyBpbiBzYm9tLm1rLCB3aGljaCBpcyBpbmNsdWRlZCBmcm9tIGJhc2VfcnVsZXMubWsuIEJ1dCBzaW5jZQorICAjIGRleF9wcmVvcHRfb2RleF9pbnN0YWxsLm1rIGlzIGluY2x1ZGVkIGFmdGVyIGJhc2VfcnVsZXMubWssIGl0IG1pc3NlcyB0aGVzZSBvZGV4IGZpbGVzLgorICAkKGZvcmVhY2ggaW5zdGFsbGVkX2ZpbGUsJChhZGRwcmVmaXggJChQUk9EVUNUX09VVCkvLCQobXlfZGV4cHJlb3B0X3ppcF9jb250ZW50cykpLCBcCisgICAgJChldmFsIEFMTF9JTlNUQUxMRURfRklMRVMuJChpbnN0YWxsZWRfZmlsZSkgOj0gJChteV9yZWdpc3Rlcl9uYW1lKSkpCiAKICAgbXlfZGV4cHJlb3B0X2NvbmZpZyA6PQorICBteV9kZXhwcmVvcHRfY29uZmlnX2Zvcl9wb3N0cHJvY2Vzc2luZyA6PQorICBteV9kZXhwcmVvcHRfamFyX2NvcHkgOj0KKyAgbXlfZGV4cHJlb3B0X3Byb2R1Y3RfcGFja2FnZXMgOj0KICAgbXlfZGV4cHJlb3B0X3NjcmlwdCA6PQogICBteV9kZXhwcmVvcHRfemlwIDo9Ci0gIG15X2RleHByZW9wdF9jb25maWdfZm9yX3Bvc3Rwcm9jZXNzaW5nIDo9CisgIG15X2RleHByZW9wdF96aXBfY29udGVudHMgOj0KIGVuZGlmICMgTE9DQUxfREVYX1BSRU9QVAogZW5kaWYgIyBteV9jcmVhdGVfZGV4cHJlb3B0X2NvbmZpZworCitteV9kZXhwcmVvcHRfbGlic19hbGwgOj0KZGlmZiAtLWdpdCBhL2NvcmUvZGlzdGRpci5tayBiL2NvcmUvZGlzdGRpci5tawppbmRleCBiY2U4ZTdmLi4wMzJkMWI3IDEwMDY0NAotLS0gYS9jb3JlL2Rpc3RkaXIubWsKKysrIGIvY29yZS9kaXN0ZGlyLm1rCkBAIC00NSw2ICs0NSwxOCBAQAogICAgICQoZXZhbCBfYWxsX2Rpc3RfZ29hbF9vdXRwdXRfcGFpcnMgKz0gJCQoZ29hbCk6JCQoZHN0KSkpKQogZW5kZWYKIAorZGVmaW5lIGFkZF9maWxlX25hbWVfdGFnX3N1ZmZpeAorJChiYXNlbmFtZSAkKG5vdGRpciAkMSkpLUZJTEVfTkFNRV9UQUdfUExBQ0VIT0xERVIkKHN1ZmZpeCAkMSkKK2VuZGVmCisKKyMgVGhpcyBmdW5jdGlvbiBhcHBlbmRzIHN1ZmZpeCBGSUxFX05BTUVfVEFHX1BMQUNFSE9MREVSIGZyb20gdGhlIGlucHV0IGZpbGUKKyMgJCgxKTogYSBsaXN0IG9mIGdvYWxzICAoZS5nLiBkcm9pZCwgc2RrLCBuZGspLiBUaGVzZSBtdXN0IGJlIFBIT05ZCisjICQoMik6IHRoZSBkaXN0IGZpbGVzIHRvIGFkZCB0byB0aG9zZSBnb2Fscy4KK2RlZmluZSBkaXN0LWZvci1nb2Fscy13aXRoLWZpbGVuYW1ldGFnCiskKGlmICQoc3RyaXAgJCgyKSksIFwKKyAgJChmb3JlYWNoIGZpbGUsJCgyKSwgXAorICAgICQoY2FsbCBkaXN0LWZvci1nb2FscywkKDEpLCQoZmlsZSk6JChjYWxsIGFkZF9maWxlX25hbWVfdGFnX3N1ZmZpeCwkKGZpbGUpKSkpKQorZW5kZWYKIC5QSE9OWTogc2hhcmVwcm9qZWN0cwogCiBkZWZpbmUgX19zaGFyZS1wcm9qZWN0cy1ydWxlCkBAIC0yMDksNCArMjIxLDQgQEAKICAgICAgICAgICBmaSkpCiBlbmRlZgogCi0uS0FUSV9SRUFET05MWSA6PSBkaXN0LWZvci1nb2FscyBkaXN0LXdyaXRlLWZpbGUKKy5LQVRJX1JFQURPTkxZIDo9IGRpc3QtZm9yLWdvYWxzIGRpc3Qtd3JpdGUtZmlsZSBkaXN0LWZvci1nb2Fscy13aXRoLWZpbGVuYW1ldGFnCmRpZmYgLS1naXQgYS9jb3JlL2R1bXBjb25maWcubWsgYi9jb3JlL2R1bXBjb25maWcubWsKaW5kZXggNjQwZmUxMC4uZWI0YzgyMiAxMDA2NDQKLS0tIGEvY29yZS9kdW1wY29uZmlnLm1rCisrKyBiL2NvcmUvZHVtcGNvbmZpZy5tawpAQCAtNTYsNyArNTYsNyBAQAogCiAjIEVzY2FwZSBxdW90YXRpb24gbWFya3MgZm9yIENTViwgYW5kIHdyYXBzIGluIHF1b3RhdGlvbiBtYXJrcy4KIGRlZmluZSBlc2NhcGUtZm9yLWNzdgotIiQoc3Vic3QgIiwiIiwkMSkiCisiJChzdWJzdCAiLCIiLCQoc3Vic3QgJChuZXdsaW5lKSwgLCQxKSkiCiBlbmRlZgogCiAjIEFyZ3M6CkBAIC02OCw3ICs2OCw3IEBACiAjIEFyZ3M6CiAjICAgJCgxKTogaW5jbHVkZSBzdGFjawogZGVmaW5lIGR1bXAtaW1wb3J0LWRvbmUKLSQoZXZhbCAkKGZpbGUgPj4gJChEVU1QQ09ORklHX0ZJTEUpLGltcG9ydGVkLCQoc3RyaXAgJCgxKSkpKQorJChldmFsICQoZmlsZSA+PiAkKERVTVBDT05GSUdfRklMRSksaW1wb3J0ZWQsJChzdHJpcCAkKDEpKSwkKGZpbHRlci1vdXQgJCgxKSwkKE1BS0VGSUxFX0xJU1QpKSkpCiBlbmRlZgogCiAjIEFyZ3M6CmRpZmYgLS1naXQgYS9jb3JlL2R1cGNoZWNrLnNoIGIvY29yZS9kdXBjaGVjay5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xM2FiNzgyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9kdXBjaGVjay5zaApAQCAtMCwwICsxLDExOCBAQAorIyEvYmluL2Jhc2gKKworIyBGaW5kIGR1cGxpY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGJ5IG1kNSBjaGVja3N1bSBhbmQgcG9zc2libGUgZHVwbGljYXRlcyBieSBzaXplLgorIyBSZXN1bHRzIHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSBvdXQgZGlyZWN0b3J5IG9mIHRoZSBidWlsZC4KKyMgVXNhZ2U6CisjIC4vZHVwY2hlY2suc2ggPG91dF9kaXI+IDxpbWFnZT4KKworT1VUX0RJUj0iJDEiCitJTUc9IiQyIgorVE1QX01ENT0iJHtPVVRfRElSfS9fZHVwX21kNSIKK1RNUF9TSVpFPSIke09VVF9ESVJ9L19kdXBfc2l6ZSIKK1RNUF9DSEVDSz0iJHtPVVRfRElSfS9fZHVwX3RtcF9jaGVjayIKK1RNUF9TSVpFX1JFQUw9IiR7T1VUX0RJUn0vX2R1cF9zaXplX3JlYWwiCitUTVBfRklMRTE9IiR7T1VUX0RJUn0vX2R1cF9mMSIKK1RNUF9GSUxFMj0iJHtPVVRfRElSfS9fZHVwX2YyIgorTUQ1X0RVUExJQ0FURVM9IiR7T1VUX0RJUn0vZHVwbGljYXRlLWxpYnMtbWQ1LSR7SU1HfS50eHQiCitTSVpFX0RVUExJQ0FURVM9IiR7T1VUX0RJUn0vZHVwbGljYXRlLWxpYnMtc2l6ZS0ke0lNR30udHh0IgorCisjIENoZWNrIGFyZ3VtZW50cworaWYgWyAiJCMiIC1uZSAyIF07IHRoZW4KKwllY2hvICJVc2FnZTogLi9kdXBjaGVjay5zaCA8b3V0X2Rpcj4gPGltYWdlPiIKKwlleGl0IDEKK2ZpCisKKyMgQ2hlY2sgaG9zdCBhbmQgdG9vbGNoYWluIHZlcnNpb24KK0NIRUNLX0hPU1Q9JCh1bmFtZSkKK2lmIFsgIiR7Q0hFQ0tfSE9TVH0iID09ICJMaW51eCIgXTsgdGhlbgorCUFSQ0g9ImxpbnV4LXg4NiIKK2Vsc2UKKwlBUkNIPSJkYXJ3aW4teDg2IgorZmkKK0JJTlVUSUxTX1BBVEg9Ii4vcHJlYnVpbHRzL2NsYW5nL2hvc3QvJHtBUkNIfS9sbHZtLWJpbnV0aWxzLXN0YWJsZSIKKworIyBSZW1vdmUgYW55IG9sZCBmaWxlcyBpZiB0aGV5IGV4aXN0LgoraWYgWyAtZiAiJHtNRDVfRFVQTElDQVRFU30iIF07IHRoZW4KKwlybSAiJHtNRDVfRFVQTElDQVRFU30iCitmaQorCitpZiBbIC1mICIke1NJWkVfRFVQTElDQVRFU30iIF07IHRoZW4KKwlybSAiJHtTSVpFX0RVUExJQ0FURVN9IgorZmkKKworIyBGaW5kIGFsbCAuc28gZmlsZXMgYW5kIGNhbGN1bGF0ZSB0aGVpciBtZDUuCitmaW5kIC4vIiR7T1VUX0RJUn0iLyR7SU1HfS8gLW5hbWUgImxpYiouc28iIC10eXBlIGYgLXByaW50MCB8IHhhcmdzIC0wIG1kNXN1bSB8IHNlZCAtZSAicyMgLiovIyAjIiB8IHNvcnQgfCB1bmlxIC1jIHwgc29ydCAtZyB8IHNlZCAiL14uKjEgL2QiIHwgc2VkICJzL14uICpbMC05XSAvLyIgPiAiJHtUTVBfTUQ1fSIgMj4mMQorCitpZiBbIC1zICIke1RNUF9NRDV9IiBdOyB0aGVuCisJd2hpbGUgcmVhZCAtciBsaXN0OyBkbworCQljaGVja3N1bT0kKGVjaG8gIiR7bGlzdH0iIHwgY3V0IC1mMSAtZCAnICcpCisJCWZpbGVuYW1lPSQoZWNobyAiJHtsaXN0fSIgfCBjdXQgLWYyIC1kICcgJykKKwkJIyBGb3IgZWFjaCBtZDUsIGxpc3QgdGhlIGZpbGUgcGF0aHMgdGhhdCBtYXRjaC4KKwkJeworCQkJZWNobyAiTUQ1OiAke2NoZWNrc3VtfSI7CQkJCQkJCQkJCQkgICAgICAgICAgICAgICAgXAorCQkJZmluZCAuLyIke09VVF9ESVJ9Ii8ke0lNR30vIC1uYW1lICIke2ZpbGVuYW1lfSIgLXR5cGUgZiAtcHJpbnQwIHwgeGFyZ3MgLTAgbWQ1c3VtIHwgZ3JlcCAiJHtjaGVja3N1bX0iIHwgc2VkICdzL14uKiAvLyc7CVwKKwkJCWVjaG8gIiI7CQkJCQkJCQkJCQkJCSAgICAgICAgICAgICAgICBcCisJCX0gPj4gIiR7TUQ1X0RVUExJQ0FURVN9IgorCWRvbmUgPCIke1RNUF9NRDV9IgorZWxzZQorCWVjaG8gIk5vIGR1cGxpY2F0ZSBmaWxlcyBieSBtZDUgZm91bmQuIiA+PiAiJHtNRDVfRFVQTElDQVRFU30iCitmaQorCisjIENsZWFudXAKK3JtICIke1RNUF9NRDV9IgorCisjIEZpbmQgcG9zc2libGUgZHVwbGljYXRlIC5zbyBmaWxlcyBieSBzaXplLgorZmluZCAuLyIke09VVF9ESVJ9Ii8ke0lNR30vIC1uYW1lICIqLnNvIiAtdHlwZSBmIC1wcmludDAgfCB4YXJncyAtMCBzdGF0IC0tZm9ybWF0PSIlcyAlbiIgMj4vZGV2L251bGwgfCBzZWQgLWUgInMjIC4qLyMgIyIgfCBzb3J0IHwgdW5pcSAtYyB8IHNvcnQgLWcgfCBzZWQgIi9eLioxIC9kIiA+ICIke1RNUF9TSVpFfSIgMj4mMQoraWYgWyAtcyAiJHtUTVBfU0laRX0iIF07IHRoZW4KKwl3aGlsZSByZWFkIC1yIGxpc3Q7IGRvCisJCXNpemU9JChlY2hvICIke2xpc3R9IiB8IGN1dCAtZjIgLWQgJyAnKQorCQlmaWxlbmFtZT0kKGVjaG8gIiR7bGlzdH0iIHwgY3V0IC1mMyAtZCAnICcpCisJCSMgQ2hlY2sgaWYgdGhlIGZpbGVzIGFyZSBub3QgaW4gdGhlIG1kNXN1bSBsaXN0IGFuZCBkbyBub3RoaW5nIGlmIHRoYXQgaXMgdGhlIGNhc2UuCisJCWZpbmQgLi8iJHtPVVRfRElSfSIvJHtJTUd9LyAtbmFtZSAiJHtmaWxlbmFtZX0iIC10eXBlIGYgLXByaW50MCB8IHhhcmdzIC0wIHN0YXQgLS1mb3JtYXQ9IiVzICVuIiAyPi9kZXYvbnVsbCB8IGdyZXAgIiR7c2l6ZX0iIHwgc2VkICJzL14uKiAvLyIgfCBzb3J0ID4gIiR7VE1QX0NIRUNLfSIgMj4mMQorCQl3aGlsZSByZWFkIC1yIGZpbGVwYXRoOyBkbworCQkJZm91bmQ9JChncmVwIC1GICIke2ZpbGVwYXRofSIgIiR7TUQ1X0RVUExJQ0FURVN9IikKKwkJCWlmIFsgLXogIiR7Zm91bmR9IiBdOyB0aGVuCisJCQkJZWNobyAiJHtmaWxlcGF0aH0iID4+ICIke1RNUF9TSVpFX1JFQUx9IgorCQkJZmkKKwkJZG9uZTwiJHtUTVBfQ0hFQ0t9IgorCQkjIEZvciBldmVyeSBkdXBsaWNhdGlvbiBmb3VuZCwgZGlmZiB0aGUgLm5vdGUgYW5kIC50ZXh0IHNlY3Rpb25zLgorCQlpZiBbIC1zICIke1RNUF9TSVpFX1JFQUx9IiBdOyB0aGVuCisJCQl7CisJCQkJZWNobyAiRmlsZTogJHtmaWxlbmFtZX0sIFNpemU6ICR7c2l6ZX0iOwlcCisJCQkJY2F0ICIke1RNUF9TSVpFX1JFQUx9IjsJCQkJXAorCQkJCWVjaG8gIiI7CQkJCQlcCisJCQl9ID4+ICIke1NJWkVfRFVQTElDQVRFU30iCisJCQljb3VudD0kKHdjIC1sICIke1RNUF9TSVpFX1JFQUx9IiB8IGN1dCAtZjEgLWQgJyAnKQorCQkJIyBMaW1pdGF0aW9uOiB0aGlzIG9ubHkgd29ya3MgZm9yIGZpbGUgcGFpcnMuIElmIG1vcmUgdGhhbiB0d28gcG9zc2libGUgZHVwbGljYXRpb25zIGFyZSBmb3VuZCwgdGhlIHVzZXIgbmVlZCB0byBjaGVjayBtYW51YWxseQorCQkJIyBhbGwgdGhlIHBvc3NpYmxlIGNvbWJpbmF0aW9ucyB1c2luZyB0aGUgbGx2bS1yZWFkZWxmIGFuZCBsbHZtLW9iamR1bXAgY29tbWFuZHMgYmVsb3cuCisJCQlpZiBbICIke2NvdW50fSIgPSAyIF07IHRoZW4KKwkJCQlmaWxlMT0kKGhlYWQgLW4gMSAiJHtUTVBfU0laRV9SRUFMfSIpCisJCQkJZmlsZTI9JCh0YWlsIC1uIDEgIiR7VE1QX1NJWkVfUkVBTH0iKQorCQkJCSMgQ2hlY2sgLm5vdGUgc2VjdGlvbgorCQkJCSR7QklOVVRJTFNfUEFUSH0vbGx2bS1yZWFkZWxmIC0td2lkZSAtLW5vdGVzICIke2ZpbGUxfSIgPiAiJHtUTVBfRklMRTF9IiAyPiYxCisJCQkJJHtCSU5VVElMU19QQVRIfS9sbHZtLXJlYWRlbGYgLS13aWRlIC0tbm90ZXMgIiR7ZmlsZTJ9IiA+ICIke1RNUF9GSUxFMn0iIDI+JjEKKwkJCQl7CisJCQkJCWRpZmYgLXUgIiR7VE1QX0ZJTEUxfSIgIiR7VE1QX0ZJTEUyfSIgfCBzZWQgIjFkOzJkOzNkIjsJXAorCQkJCQllY2hvICIiOworCQkJCX0gPj4gIiR7U0laRV9EVVBMSUNBVEVTfSIKKwkJCQkjIENoZWNrIC50ZXh0IHNlY3Rpb24KKwkJCQkke0JJTlVUSUxTX1BBVEh9L2xsdm0tb2JqZHVtcCAtLWxpbmUtbnVtYmVycyAtLWRpc2Fzc2VtYmxlIC0tZGVtYW5nbGUgLS1yZWxvYyAtLW5vLXNob3ctcmF3LWluc24gLS1zZWN0aW9uPS50ZXh0ICIke2ZpbGUxfSIgfCBzZWQgIjFkOzJkIj4gIiR7VE1QX0ZJTEUxfSIgMj4mMQorCQkJCSR7QklOVVRJTFNfUEFUSH0vbGx2bS1vYmpkdW1wIC0tbGluZS1udW1iZXJzIC0tZGlzYXNzZW1ibGUgLS1kZW1hbmdsZSAtLXJlbG9jIC0tbm8tc2hvdy1yYXctaW5zbiAtLXNlY3Rpb249LnRleHQgIiR7ZmlsZTJ9IiB8IHNlZCAiMWQ7MmQiPiAiJHtUTVBfRklMRTJ9IiAyPiYxCisJCQkJeworCQkJCQlkaWZmIC11ICIke1RNUF9GSUxFMX0iICIke1RNUF9GSUxFMn0iIHwgc2VkICIxZDsyZDszZCI7CVwKKwkJCQkJZWNobyAiIjsKKwkJCQl9ID4+ICIke1NJWkVfRFVQTElDQVRFU30iCisJCQkJIyBDbGVhbnVwCisJCQkJcm0gIiR7VE1QX0ZJTEUxfSIgIiR7VE1QX0ZJTEUyfSIKKwkJCWVsc2UKKwkJCQllY2hvICIqTm90ZTogbW9yZSB0aGFuIG9uZSBkdXBsaWNhdGUuIE1hbnVhbGx5IHZlcmlmeSBhbGwgcG9zc2libGUgY29tYmluYXRpb25zLiIgPj4gIiR7U0laRV9EVVBMSUNBVEVTfSIKKwkJCWZpCisJCQlybSAiJHtUTVBfU0laRV9SRUFMfSIKKwkJCWVjaG8gIiIgPj4gIiR7U0laRV9EVVBMSUNBVEVTfSIKKwkJZmkKKwlkb25lIDwiJHtUTVBfU0laRX0iCisJIyBDbGVhbnVwCisJcm0gIiR7VE1QX1NJWkV9IiAiJHtUTVBfQ0hFQ0t9IgorZWxzZQorCWVjaG8gIk5vIGR1cGxpY2F0ZSBmaWxlcyBieSBzaXplIGZvdW5kLiIgPj4gIiR7U0laRV9EVVBMSUNBVEVTfSIKK2ZpCmRpZmYgLS1naXQgYS9jb3JlL2VudnNldHVwLm1rIGIvY29yZS9lbnZzZXR1cC5tawppbmRleCA3ZGQ5YjEyLi5mODJlODYxIDEwMDY0NAotLS0gYS9jb3JlL2VudnNldHVwLm1rCisrKyBiL2NvcmUvZW52c2V0dXAubWsKQEAgLTI0LDUwICsyNCw0MiBAQAogIyQod2FybmluZyAkKGNhbGwgZmluZF9hbmRfZWFybGllcixBIEIgQyxDKSkKICMkKHdhcm5pbmcgJChjYWxsIGZpbmRfYW5kX2VhcmxpZXIsQSBCIEMsRCkpCiAKLWRlZmluZSB2ZXJzaW9uLWxpc3QKLSQoMSlQMUEgJCgxKVAxQiAkKDEpUDJBICQoMSlQMkIgJCgxKUQxQSAkKDEpRDFCICQoMSlEMkEgJCgxKUQyQiAkKDEpUTFBICQoMSlRMUIgJCgxKVEyQSAkKDEpUTJCICQoMSlRM0EgJCgxKVEzQgorIyBSdW5zIGEgc3RhcmxhcmsgZmlsZSwgYW5kIHNldHMgYWxsIHRoZSB2YXJpYWJsZXMgaW4gaXRzIHRvcC1sZXZlbAorIyB2YXJpYWJsZXNfdG9fZXhwb3J0X3RvX21ha2UgdmFyaWFibGUgYXMgbWFrZSB2YXJpYWJsZXMuCisjCisjIEluIG9yZGVyIHRvIGF2b2lkIHJ1bm5pbmcgc3RhcmxhcmsgZXZlcnkgdGltZSB0aGUgc3RhbXAgZmlsZSBpcyBjaGVja2VkLCB3ZSB1c2UKKyMgJChLQVRJX3NoZWxsX25vX3JlcnVuKS4gVGhlbiwgdG8gbWFrZSBzdXJlIHRoYXQgd2UgYWN0dWFsbHkgZG8gcmVydW4ga2F0aSB3aGVuCisjIG1vZGlmeWluZyB0aGUgc3RhcmxhcmsgZmlsZXMsIHdlIGFkZCB0aGUgc3RhcmxhcmsgZmlsZXMgdG8gdGhlIGthdGkgc3RhbXAgZmlsZSB3aXRoCisjICQoS0FUSV9leHRyYV9maWxlX2RlcHMpLgorIworIyBBcmd1bWVudHM6CisjICAkKDEpOiBBIHNpbmdsZSBzdGFybGFyayBmaWxlIHRvIHVzZSBhcyB0aGUgZW50cnlwb2ludAorIyAgJCgyKTogQW4gb3B0aW9uYWwgbGlzdCBvZiBzdGFybGFyayBmaWxlcyB0byBOT1QgaW5jbHVkZSBhcyBrYXRpIGRlcGVuZGVuY2llcy4KKyMgICQoMyk6IEFuIG9wdGlvbmFsIGxpc3Qgb2YgZXh0cmEgZmxhZ3MgdG8gcGFzcyB0byByYmNydW4KK2RlZmluZSBydW4tc3RhcmxhcmsKKyQoZXZhbCBfc3RhcmxhcmtfcmVzdWx0cyA6PSAkKE9VVF9ESVIpL3N0YXJsYXJrX3Jlc3VsdHMvJChzdWJzdCAvLF8sJCgxKSkubWspCiskKEtBVElfc2hlbGxfbm9fcmVydW4gbWtkaXIgLXAgJChPVVRfRElSKS9zdGFybGFya19yZXN1bHRzICYmICQoT1VUX0RJUikvcmJjcnVuIC0tbW9kZT1tYWtlICQoMykgJCgxKSA+JChfc3RhcmxhcmtfcmVzdWx0cykgJiYgdG91Y2ggLXQgMjAwMDAxMDEwMDAwICQoX3N0YXJsYXJrX3Jlc3VsdHMpKQorJChpZiAkKGZpbHRlci1vdXQgMCwkKC5TSEVMTFNUQVRVUykpLCQoZXJyb3IgU3RhcmxhcmsgZmFpbGVkIHRvIHJ1bikpCiskKGV2YWwgaW5jbHVkZSAkKF9zdGFybGFya19yZXN1bHRzKSkKKyQoS0FUSV9leHRyYV9maWxlX2RlcHMgJChmaWx0ZXItb3V0ICQoMiksJChMT0FERURfU1RBUkxBUktfRklMRVMpKSkKKyQoZXZhbCBMT0FERURfU1RBUkxBUktfRklMRVMgOj0pCiskKGV2YWwgX3N0YXJsYXJrX3Jlc3VsdHMgOj0pCiBlbmRlZgogCi1QUkVWX1ZFUlNJT05TIDo9IE9QUjEgT1BEMSBPUEQyIE9QTTEgT1BNMiBQUFIxIFBQRDEgUFBEMiBQUE0xIFBQTTIgUVBSMQotQUxMX1ZFUlNJT05TIDo9IFEgUiBTIFQgVSBWIFcgWCBZIFoKLUFMTF9WRVJTSU9OUyA6PSAkKFBSRVZfVkVSU0lPTlMpICQoZm9yZWFjaCB2LCQoQUxMX1ZFUlNJT05TKSwkKGNhbGwgdmVyc2lvbi1saXN0LCQodikpKQotUFJFVl9WRVJTSU9OUyA6PQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmVsZWFzZSBjb25maWcKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL3JlbGVhc2VfY29uZmlnLm1rCiAKLSMgRmlsdGVycyBBTExfVkVSU0lPTlMgZG93biB0byB0aGUgcmFuZ2UgWyQxLCAkMl0sIGFuZCBlcnJvcnMgaWYgJDEgPiAkMiBvciAkMyBpcwotIyBub3QgaW4gWyQxLCAkMl0KLSMgJCgxKTogbWluIHBsYXRmb3JtIHZlcnNpb24KLSMgJCgyKTogbWF4IHBsYXRmb3JtIHZlcnNpb24KLSMgJCgzKTogZGVmYXVsdCBwbGF0Zm9ybSB2ZXJzaW9uCi1kZWZpbmUgYWxsb3dlZC1wbGF0Zm9ybS12ZXJzaW9ucwotJChzdHJpcCBcCi0gICQoaWYgJChmaWx0ZXIgJChBTExfVkVSU0lPTlMpLCQoMSkpLCwKLSAgICAkKGVycm9yIEludmFsaWQgTUlOX1BMQVRGT1JNX1ZFUlNJT04gJyQoMSknKSkKLSAgJChpZiAkKGZpbHRlciAkKEFMTF9WRVJTSU9OUyksJCgyKSksLAotICAgICQoZXJyb3IgSW52YWxpZCBNQVhfUExBVEZPUk1fVkVSU0lPTiAnJCgyKScpKQotICAkKGlmICQoZmlsdGVyICQoQUxMX1ZFUlNJT05TKSwkKDMpKSwsCi0gICAgJChlcnJvciBJbnZhbGlkIERFRkFVTFRfUExBVEZPUk1fVkVSU0lPTiAnJCgzKScpKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2V0IHVwIHZlcnNpb24gaW5mb3JtYXRpb24KK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL3ZlcnNpb25fdXRpbC5tawogCi0gICQoZXZhbCBhbGxvd2VkX3ZlcnNpb25zXyA6PSAkKGNhbGwgZmluZF9hbmRfZWFybGllciwkKEFMTF9WRVJTSU9OUyksJCgyKSkpCisjIFRoaXMgdXNlZCB0byBiZSBjYWxjdWxhdGVkLCBidXQgaXMgbm93IGZpeGVkIGFuZCBub3QgZXhwZWN0ZWQKKyMgdG8gY2hhbmdlIG92ZXIgdGltZSBhbnltb3JlLiBOZXcgY29kZSBhdHRlbXB0aW5nIHRvIHVzZSBhCisjIHZhcmlhYmxlIGxpa2UgSVNfQVRfTEFTVF8qIHNob3VsZCBpbnN0ZWFkIHVzZSBhCisjIGJ1aWxkIHN5c3RlbSBmbGFnLgogCi0gICQoaWYgJChmaWx0ZXIgJChhbGxvd2VkX3ZlcnNpb25zXyksJCgxKSksLAotICAgICQoZXJyb3IgTUlOX1BMQVRGT1JNX1ZFUlNJT04gJyQoMSknIG11c3QgYmUgYmVmb3JlIE1BWF9QTEFURk9STV9WRVJTSU9OICckKDIpJykpCi0KLSAgJChldmFsIGFsbG93ZWRfdmVyc2lvbnNfIDo9ICQoMSkgXAotICAgICQoZmlsdGVyLW91dCAkKGNhbGwgZmluZF9hbmRfZWFybGllciwkKGFsbG93ZWRfdmVyc2lvbnNfKSwkKDEpKSwkKGFsbG93ZWRfdmVyc2lvbnNfKSkpCi0KLSAgJChpZiAkKGZpbHRlciAkKGFsbG93ZWRfdmVyc2lvbnNfKSwkKDMpKSwsCi0gICAgJChlcnJvciBERUZBVUxUX1BMQVRGT1JNX1ZFUlNJT04gJyQoMyknIG11c3QgYmUgYmV0d2VlbiBNSU5fUExBVEZPUk1fVkVSU0lPTiAnJCgxKScgYW5kIE1BWF9QTEFURk9STV9WRVJTSU9OICckKDIpJykpCi0KLSAgJChhbGxvd2VkX3ZlcnNpb25zXykpCi1lbmRlZgotCi0jJCh3YXJuaW5nICQoY2FsbCBhbGxvd2VkLXBsYXRmb3JtLXZlcnNpb25zLE9QUjEsUFBSMSxPUFIxKSkKLSMkKHdhcm5pbmcgJChjYWxsIGFsbG93ZWQtcGxhdGZvcm0tdmVyc2lvbnMsT1BNMSxQUFIxLE9QUjEpKQotCi0jIFNldCB1cCB2ZXJzaW9uIGluZm9ybWF0aW9uLgotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvdmVyc2lvbl9kZWZhdWx0cy5tawotCi1FTkFCTEVEX1ZFUlNJT05TIDo9ICQoY2FsbCBmaW5kX2FuZF9lYXJsaWVyLCQoQUxMX1ZFUlNJT05TKSwkKFRBUkdFVF9QTEFURk9STV9WRVJTSU9OKSkKK0VOQUJMRURfVkVSU0lPTlMgOj0gIk9QUjEgT1BEMSBPUEQyIE9QTTEgT1BNMiBQUFIxIFBQRDEgUFBEMiBQUE0xIFBQTTIgUVBSMSBRUDFBIFFQMUIgUVAyQSBRUDJCIFFEMUEgUUQxQiBRRDJBIFFEMkIgUVExQSBRUTFCIFFRMkEgUVEyQiBRUTNBIFFRM0IgUlAxQSBSUDFCIFJQMkEgUlAyQiBSRDFBIFJEMUIgUkQyQSBSRDJCIFJRMUEgUlExQiBSUTJBIFJRMkIgUlEzQSBSUTNCIFNQMUEgU1AxQiBTUDJBIFNQMkIgU0QxQSBTRDFCIFNEMkEgU0QyQiBTUTFBIFNRMUIgU1EyQSBTUTJCIFNRM0EgU1EzQiBUUDFBIFRQMUIgVFAyQSBUUDJCIFREMUEgVEQxQiBURDJBIFREMkIgVFExQSBUUTFCIFRRMkEgVFEyQiBUUTNBIFRRM0IgVVAxQSBVUDFCIFVQMkEgVVAyQiBVRDFBIFVEMUIgVUQyQSBVRDJCIFVRMUEgVVExQiBVUTJBIFVRMkIgVVEzQSBVUTNCIgogCiAkKGZvcmVhY2ggdiwkKEVOQUJMRURfVkVSU0lPTlMpLCBcCiAgICQoZXZhbCBJU19BVF9MRUFTVF8kKHYpIDo9IHRydWUpKQpAQCAtODMsNyArNzUsNyBAQAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgVGhlIHByb2R1Y3QgZGVmYXVsdHMgdG8gZ2VuZXJpYyBvbiBoYXJkd2FyZQogaWZlcSAoJChUQVJHRVRfUFJPRFVDVCksKQotVEFSR0VUX1BST0RVQ1QgOj0gYW9zcF9hcm0KK1RBUkdFVF9QUk9EVUNUIDo9IGFvc3BfYXJtNjQKIGVuZGlmCiAKIApAQCAtMjU2LDYgKzI0OCw3IEBACiBIT1NUX1BSRUJVSUxUX0FSQ0ggOj0geDg2CiAjIFRoaXMgaXMgdGhlIHN0YW5kYXJkIHdheSB0byBuYW1lIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgcHJlYnVpbHQgaG9zdAogIyBvYmplY3RzLiBFLmcuLCBwcmVidWlsdC8kKEhPU1RfUFJFQlVJTFRfVEFHKS9jYworIyBUaGlzIG11c3QgbWF0Y2ggdGhlIGxvZ2ljIGluIGdldF9ob3N0X3ByZWJ1aWx0X3ByZWZpeCBpbiBlbnZzZXR1cC5zaAogSE9TVF9QUkVCVUlMVF9UQUcgOj0gJChCVUlMRF9PUyktJChIT1NUX1BSRUJVSUxUX0FSQ0gpCiAKICMgVEFSR0VUX0NPUFlfT1VUXyogYXJlIGFsbCByZWxhdGl2ZSB0byB0aGUgc3RhZ2luZyBkaXJlY3RvcnksIGllIFBST0RVQ1RfT1VULgpAQCAtMzM5LDYgKzMzMiw3IEBACiAgIFJCQ19QUk9EVUNUX0NPTkZJRyBcCiAgIFJCQ19CT0FSRF9DT05GSUcgXAogICBTT09OR18lIFwKKyAgVEFSR0VUX1JFTEVBU0UgXAogICBUT1BESVIgXAogICBUUkFDRV9CRUdJTl9TT09ORyBcCiAgIFVTRVIpCkBAIC0zNzgsNiArMzcyLDggQEAKIFRBUkdFVF9CVUlMRF9UWVBFIDo9IHJlbGVhc2UKIGVuZGlmCiAKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Byb2R1Y3RfdmFsaWRhdGlvbl9jaGVja3MubWsKKwogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgZmlndXJlIG91dCB0aGUgb3V0cHV0IGRpcmVjdG9yaWVzCiAKQEAgLTQyMSw2ICs0MTcsNyBAQAogSE9TVF9PVVRfTkFUSVZFX1RFU1RTIDo9ICQoSE9TVF9PVVQpL25hdGl2ZXRlc3Q2NAogSE9TVF9PVVRfQ09WRVJBR0UgOj0gJChIT1NUX09VVCkvY292ZXJhZ2UKIEhPU1RfT1VUX1RFU1RDQVNFUyA6PSAkKEhPU1RfT1VUKS90ZXN0Y2FzZXMKK0hPU1RfT1VUX0VUQyA6PSAkKEhPU1RfT1VUKS9ldGMKIC5LQVRJX1JFQURPTkxZIDo9IFwKICAgSE9TVF9PVVRfRVhFQ1VUQUJMRVMgXAogICBIT1NUX09VVF9TSEFSRURfTElCUkFSSUVTIFwKQEAgLTQyOSw3ICs0MjYsOCBAQAogICBIT1NUX09VVF9TREtfQURET04gXAogICBIT1NUX09VVF9OQVRJVkVfVEVTVFMgXAogICBIT1NUX09VVF9DT1ZFUkFHRSBcCi0gIEhPU1RfT1VUX1RFU1RDQVNFUworICBIT1NUX09VVF9URVNUQ0FTRVMgXAorICBIT1NUX09VVF9FVEMKIAogSE9TVF9DUk9TU19PVVRfRVhFQ1VUQUJMRVMgOj0gJChIT1NUX0NST1NTX09VVCkvYmluCiBIT1NUX0NST1NTX09VVF9TSEFSRURfTElCUkFSSUVTIDo9ICQoSE9TVF9DUk9TU19PVVQpL2xpYgpAQCAtNTUzLDYgKzU1MSw4IEBACiBUQVJHRVRfT1VUX05PVElDRV9GSUxFUyA6PSAkKFRBUkdFVF9PVVRfSU5URVJNRURJQVRFUykvTk9USUNFX0ZJTEVTCiBUQVJHRVRfT1VUX0ZBS0UgOj0gJChQUk9EVUNUX09VVCkvZmFrZV9wYWNrYWdlcwogVEFSR0VUX09VVF9URVNUQ0FTRVMgOj0gJChQUk9EVUNUX09VVCkvdGVzdGNhc2VzCitUQVJHRVRfT1VUX0ZMQUdTIDo9ICQoVEFSR0VUX09VVF9JTlRFUk1FRElBVEVTKS9GTEFHUworCiAuS0FUSV9SRUFET05MWSA6PSBcCiAgIFRBUkdFVF9PVVRfRVhFQ1VUQUJMRVMgXAogICBUQVJHRVRfT1VUX09QVElPTkFMX0VYRUNVVEFCTEVTIFwKQEAgLTU2Niw3ICs1NjYsOCBAQAogICBUQVJHRVRfT1VUX0VUQyBcCiAgIFRBUkdFVF9PVVRfTk9USUNFX0ZJTEVTIFwKICAgVEFSR0VUX09VVF9GQUtFIFwKLSAgVEFSR0VUX09VVF9URVNUQ0FTRVMKKyAgVEFSR0VUX09VVF9URVNUQ0FTRVMgXAorICBUQVJHRVRfT1VUX0ZMQUdTCiAKIGlmZXEgKCQoU0FOSVRJWkVfTElURSksdHJ1ZSkKICMgV2hlbiB1c2luZyBTQU5JVElaRV9MSVRFLCBBUEtzIG11c3Qgbm90IGJlIHBhY2thZ2VkIHdpdGggc2FuaXRpemVkIGxpYnJhcmllcywgYXMgdGhleSB3aWxsIG5vdApAQCAtNjk1LDYgKzY5Niw3IEBACiBUQVJHRVRfT1VUX1ZFTkRPUl9BUFBTIDo9ICQodGFyZ2V0X291dF92ZW5kb3JfYXBwX2Jhc2UpL2FwcAogVEFSR0VUX09VVF9WRU5ET1JfQVBQU19QUklWSUxFR0VEIDo9ICQodGFyZ2V0X291dF92ZW5kb3JfYXBwX2Jhc2UpL3ByaXYtYXBwCiBUQVJHRVRfT1VUX1ZFTkRPUl9FVEMgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUikvZXRjCitUQVJHRVRfT1VUX1ZFTkRPUl9GQUtFIDo9ICQoUFJPRFVDVF9PVVQpL3ZlbmRvcl9mYWtlX3BhY2thZ2VzCiAuS0FUSV9SRUFET05MWSA6PSBcCiAgIFRBUkdFVF9PVVRfVkVORE9SX0VYRUNVVEFCTEVTIFwKICAgVEFSR0VUX09VVF9WRU5ET1JfT1BUSU9OQUxfRVhFQ1VUQUJMRVMgXApAQCAtNzAzLDcgKzcwNSw4IEBACiAgIFRBUkdFVF9PVVRfVkVORE9SX0pBVkFfTElCUkFSSUVTIFwKICAgVEFSR0VUX09VVF9WRU5ET1JfQVBQUyBcCiAgIFRBUkdFVF9PVVRfVkVORE9SX0FQUFNfUFJJVklMRUdFRCBcCi0gIFRBUkdFVF9PVVRfVkVORE9SX0VUQworICBUQVJHRVRfT1VUX1ZFTkRPUl9FVEMgXAorICBUQVJHRVRfT1VUX1ZFTkRPUl9GQUtFCiAKICQoVEFSR0VUXzJORF9BUkNIX1ZBUl9QUkVGSVgpVEFSR0VUX09VVF9WRU5ET1JfRVhFQ1VUQUJMRVMgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9FWEVDVVRBQkxFUykKICQoVEFSR0VUXzJORF9BUkNIX1ZBUl9QUkVGSVgpVEFSR0VUX09VVF9WRU5ET1JfU0hBUkVEX0xJQlJBUklFUyA6PSAkKHRhcmdldF9vdXRfdmVuZG9yX3NoYXJlZF9saWJyYXJpZXNfYmFzZSkvbGliCkBAIC03NzAsNiArNzczLDcgQEAKIFRBUkdFVF9PVVRfT0RNX0FQUFMgOj0gJCh0YXJnZXRfb3V0X29kbV9hcHBfYmFzZSkvYXBwCiBUQVJHRVRfT1VUX09ETV9BUFBTX1BSSVZJTEVHRUQgOj0gJCh0YXJnZXRfb3V0X29kbV9hcHBfYmFzZSkvcHJpdi1hcHAKIFRBUkdFVF9PVVRfT0RNX0VUQyA6PSAkKFRBUkdFVF9PVVRfT0RNKS9ldGMKK1RBUkdFVF9PVVRfT0RNX0ZBS0UgOj0gJChQUk9EVUNUX09VVCkvb2RtX2Zha2VfcGFja2FnZXMKIC5LQVRJX1JFQURPTkxZIDo9IFwKICAgVEFSR0VUX09VVF9PRE0gXAogICBUQVJHRVRfT1VUX09ETV9FWEVDVVRBQkxFUyBcCkBAIC03NzksNyArNzgzLDggQEAKICAgVEFSR0VUX09VVF9PRE1fSkFWQV9MSUJSQVJJRVMgXAogICBUQVJHRVRfT1VUX09ETV9BUFBTIFwKICAgVEFSR0VUX09VVF9PRE1fQVBQU19QUklWSUxFR0VEIFwKLSAgVEFSR0VUX09VVF9PRE1fRVRDCisgIFRBUkdFVF9PVVRfT0RNX0VUQyBcCisgIFRBUkdFVF9PVVRfT0RNX0ZBS0UKIAogJChUQVJHRVRfMk5EX0FSQ0hfVkFSX1BSRUZJWClUQVJHRVRfT1VUX09ETV9FWEVDVVRBQkxFUyA6PSAkKFRBUkdFVF9PVVRfT0RNX0VYRUNVVEFCTEVTKQogJChUQVJHRVRfMk5EX0FSQ0hfVkFSX1BSRUZJWClUQVJHRVRfT1VUX09ETV9TSEFSRURfTElCUkFSSUVTIDo9ICQodGFyZ2V0X291dF9vZG1fc2hhcmVkX2xpYnJhcmllc19iYXNlKS9saWIKQEAgLTkxNywxMyArOTIyLDE1IEBACiBUQVJHRVRfT1VUX1BST0RVQ1RfQVBQUyA6PSAkKHRhcmdldF9vdXRfcHJvZHVjdF9hcHBfYmFzZSkvYXBwCiBUQVJHRVRfT1VUX1BST0RVQ1RfQVBQU19QUklWSUxFR0VEIDo9ICQodGFyZ2V0X291dF9wcm9kdWN0X2FwcF9iYXNlKS9wcml2LWFwcAogVEFSR0VUX09VVF9QUk9EVUNUX0VUQyA6PSAkKFRBUkdFVF9PVVRfUFJPRFVDVCkvZXRjCitUQVJHRVRfT1VUX1BST0RVQ1RfRkFLRSA6PSAkKFRBUkdFVF9PVVRfUFJPRFVDVCkvcHJvZHVjdF9mYWtlX3BhY2thZ2VzCiAuS0FUSV9SRUFET05MWSA6PSBcCiAgIFRBUkdFVF9PVVRfUFJPRFVDVF9FWEVDVVRBQkxFUyBcCiAgIFRBUkdFVF9PVVRfUFJPRFVDVF9TSEFSRURfTElCUkFSSUVTIFwKICAgVEFSR0VUX09VVF9QUk9EVUNUX0pBVkFfTElCUkFSSUVTIFwKICAgVEFSR0VUX09VVF9QUk9EVUNUX0FQUFMgXAogICBUQVJHRVRfT1VUX1BST0RVQ1RfQVBQU19QUklWSUxFR0VEIFwKLSAgVEFSR0VUX09VVF9QUk9EVUNUX0VUQworICBUQVJHRVRfT1VUX1BST0RVQ1RfRVRDIFwKKyAgVEFSR0VUX09VVF9QUk9EVUNUX0ZBS0UKIAogJChUQVJHRVRfMk5EX0FSQ0hfVkFSX1BSRUZJWClUQVJHRVRfT1VUX1BST0RVQ1RfRVhFQ1VUQUJMRVMgOj0gJChUQVJHRVRfT1VUX1BST0RVQ1RfRVhFQ1VUQUJMRVMpCiAkKFRBUkdFVF8yTkRfQVJDSF9WQVJfUFJFRklYKVRBUkdFVF9PVVRfUFJPRFVDVF9TSEFSRURfTElCUkFSSUVTIDo9ICQodGFyZ2V0X291dF9wcm9kdWN0X3NoYXJlZF9saWJyYXJpZXNfYmFzZSkvbGliCkBAIC05NjAsMTMgKzk2NywxNSBAQAogVEFSR0VUX09VVF9TWVNURU1fRVhUX0FQUFNfUFJJVklMRUdFRCA6PSAkKHRhcmdldF9vdXRfc3lzdGVtX2V4dF9hcHBfYmFzZSkvcHJpdi1hcHAKIFRBUkdFVF9PVVRfU1lTVEVNX0VYVF9FVEMgOj0gJChUQVJHRVRfT1VUX1NZU1RFTV9FWFQpL2V0YwogVEFSR0VUX09VVF9TWVNURU1fRVhUX0VYRUNVVEFCTEVTIDo9ICQoVEFSR0VUX09VVF9TWVNURU1fRVhUKS9iaW4KK1RBUkdFVF9PVVRfU1lTVEVNX0VYVF9GQUtFIDo9ICQoUFJPRFVDVF9PVVQpL3N5c3RlbV9leHRfZmFrZV9wYWNrYWdlcwogLktBVElfUkVBRE9OTFkgOj0gXAogICBUQVJHRVRfT1VUX1NZU1RFTV9FWFRfRVhFQ1VUQUJMRVMgXAogICBUQVJHRVRfT1VUX1NZU1RFTV9FWFRfU0hBUkVEX0xJQlJBUklFUyBcCiAgIFRBUkdFVF9PVVRfU1lTVEVNX0VYVF9KQVZBX0xJQlJBUklFUyBcCiAgIFRBUkdFVF9PVVRfU1lTVEVNX0VYVF9BUFBTIFwKICAgVEFSR0VUX09VVF9TWVNURU1fRVhUX0FQUFNfUFJJVklMRUdFRCBcCi0gIFRBUkdFVF9PVVRfU1lTVEVNX0VYVF9FVEMKKyAgVEFSR0VUX09VVF9TWVNURU1fRVhUX0VUQyBcCisgIFRBUkdFVF9PVVRfU1lTVEVNX0VYVF9GQUtFCiAKICQoVEFSR0VUXzJORF9BUkNIX1ZBUl9QUkVGSVgpVEFSR0VUX09VVF9TWVNURU1fRVhUX0VYRUNVVEFCTEVTIDo9ICQoVEFSR0VUX09VVF9TWVNURU1fRVhUX0VYRUNVVEFCTEVTKQogJChUQVJHRVRfMk5EX0FSQ0hfVkFSX1BSRUZJWClUQVJHRVRfT1VUX1NZU1RFTV9FWFRfU0hBUkVEX0xJQlJBUklFUyA6PSAkKHRhcmdldF9vdXRfc3lzdGVtX2V4dF9zaGFyZWRfbGlicmFyaWVzX2Jhc2UpL2xpYgpkaWZmIC0tZ2l0IGEvY29yZS9leGVjdXRhYmxlX2ludGVybmFsLm1rIGIvY29yZS9leGVjdXRhYmxlX2ludGVybmFsLm1rCmluZGV4IGZiMTRjY2UuLjJhNzZjOWQgMTAwNjQ0Ci0tLSBhL2NvcmUvZXhlY3V0YWJsZV9pbnRlcm5hbC5taworKysgYi9jb3JlL2V4ZWN1dGFibGVfaW50ZXJuYWwubWsKQEAgLTQ1LDcgKzQ1LDcgQEAKIG15X3RhcmdldF9jcnRiZWdpbl9keW5hbWljX28gOj0KIG15X3RhcmdldF9jcnRiZWdpbl9zdGF0aWNfbyA6PQogbXlfdGFyZ2V0X2NydGVuZF9vIDo9Ci1lbHNlIGlmZGVmIExPQ0FMX1VTRV9WTkRLCitlbHNlIGlmZXEgKHRydWUsJChjYWxsIG1vZHVsZS1pbi12ZW5kb3Itb3ItcHJvZHVjdCkpCiBteV90YXJnZXRfY3J0YmVnaW5fZHluYW1pY19vIDo9ICQoU09PTkdfJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKVRBUkdFVF9PQkpFQ1RfY3J0YmVnaW5fZHluYW1pYy52ZW5kb3IpCiBteV90YXJnZXRfY3J0YmVnaW5fc3RhdGljX28gOj0gJChTT09OR18kKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpVEFSR0VUX09CSkVDVF9jcnRiZWdpbl9zdGF0aWMudmVuZG9yKQogbXlfdGFyZ2V0X2NydGVuZF9vIDo9ICQoU09PTkdfJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKVRBUkdFVF9PQkpFQ1RfY3J0ZW5kX2FuZHJvaWQudmVuZG9yKQpAQCAtMTEwLDQgKzExMCw2IEBACiAkKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQobXlfY292ZXJhZ2VfcGF0aCkvJChHQ05PX0FSQ0hJVkUpCiBlbmRpZgogCiskKGlmICQobXlfcmVnaXN0ZXJfbmFtZSksJChldmFsIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUFLRV9NT0RVTEVfVFlQRTo9RVhFQ1VUQUJMRSkpCisKIGVuZGlmICAjIHNraXBfYnVpbGRfZnJvbV9zb3VyY2UKZGlmZiAtLWdpdCBhL2NvcmUvZnV6el90ZXN0Lm1rIGIvY29yZS9mdXp6X3Rlc3QubWsKaW5kZXggOGE0YjhjMy4uMTE4MWM2NiAxMDA2NDQKLS0tIGEvY29yZS9mdXp6X3Rlc3QubWsKKysrIGIvY29yZS9mdXp6X3Rlc3QubWsKQEAgLTQzLDMgKzQzLDUgQEAKIGVuZGlmCiAKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCiskKGlmICQobXlfcmVnaXN0ZXJfbmFtZSksJChldmFsIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUFLRV9NT0RVTEVfVFlQRTo9RlVaWl9URVNUKSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2dlbmVyYXRlX2VuZm9yY2VfcnJvLm1rIGIvY29yZS9nZW5lcmF0ZV9lbmZvcmNlX3Jyby5tawppbmRleCBlZDI1OGNjLi5iMDAyNDY5IDEwMDY0NAotLS0gYS9jb3JlL2dlbmVyYXRlX2VuZm9yY2VfcnJvLm1rCisrKyBiL2NvcmUvZ2VuZXJhdGVfZW5mb3JjZV9ycm8ubWsKQEAgLTEsNiArMSw2IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAotZW5mb3JjZV9ycm9fbW9kdWxlIDo9ICQoZW5mb3JjZV9ycm9fc291cmNlX21vZHVsZSlfX2F1dG9fZ2VuZXJhdGVkX3Jyb18kKGVuZm9yY2VfcnJvX3BhcnRpdGlvbikKK2VuZm9yY2VfcnJvX21vZHVsZSA6PSAkKGVuZm9yY2VfcnJvX3NvdXJjZV9tb2R1bGUpX18kKFBST0RVQ1RfTkFNRSlfX2F1dG9fZ2VuZXJhdGVkX3Jyb18kKGVuZm9yY2VfcnJvX3BhcnRpdGlvbikKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSAkKGVuZm9yY2VfcnJvX21vZHVsZSkKIAogaW50ZXJtZWRpYXRlcyA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEFQUFMsJChMT0NBTF9QQUNLQUdFX05BTUUpLCxDT01NT04pCmRpZmYgLS1naXQgYS9jb3JlL2dvbWEubWsgYi9jb3JlL2dvbWEubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNTFkOGIuLjAwMDAwMDAKLS0tIGEvY29yZS9nb21hLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBOb3RpY2U6IHRoaXMgd29ya3Mgb25seSB3aXRoIEdvb2dsZSdzIEdvbWEgYnVpbGQgaW5mcmFzdHJ1Y3R1cmUuCi1pZm5lcSAoJChmaWx0ZXItb3V0IGZhbHNlLCQoVVNFX0dPTUEpKSwpCi0gIGlmZGVmIEdPTUFfRElSCi0gICAgZ29tYV9kaXIgOj0gJChHT01BX0RJUikKLSAgZWxzZQotICAgIGdvbWFfZGlyIDo9ICQoSE9NRSkvZ29tYQotICBlbmRpZgotICBHT01BX0NDIDo9ICQoZ29tYV9kaXIpL2dvbWFjYwotCi0gICMgQXBwZW5kIGdvbWFjYyB0byBleGlzdGluZyAqX1dSQVBQRVIgdmFyaWFibGVzIHNvIGl0J3MgcG9zc2libGUgdG8KLSAgIyB1c2UgYm90aCBjY2FjaGUgYW5kIGdvbWFjYy4KLSAgQ0NfV1JBUFBFUiA6PSAkKHN0cmlwICQoQ0NfV1JBUFBFUikgJChHT01BX0NDKSkKLSAgQ1hYX1dSQVBQRVIgOj0gJChzdHJpcCAkKENYWF9XUkFQUEVSKSAkKEdPTUFfQ0MpKQotICAjIGIvMTQzNjU4OTg0OiBnb21hIGNhbid0IGhhbmRsZSB0aGUgLS1zeXN0ZW0gYXJndW1lbnQgdG8gamF2YWMKLSAgI0pBVkFDX1dSQVBQRVIgOj0gJChzdHJpcCAkKEpBVkFDX1dSQVBQRVIpICQoR09NQV9DQykpCi0KLSAgZ29tYV9kaXIgOj0KLWVuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2hlYWRlcl9saWJyYXJ5X2ludGVybmFsLm1rIGIvY29yZS9oZWFkZXJfbGlicmFyeV9pbnRlcm5hbC5tawppbmRleCAzNWVlMWJjLi5hMjFjODUzIDEwMDY0NAotLS0gYS9jb3JlL2hlYWRlcl9saWJyYXJ5X2ludGVybmFsLm1rCisrKyBiL2NvcmUvaGVhZGVyX2xpYnJhcnlfaW50ZXJuYWwubWsKQEAgLTE5LDMgKzE5LDUgQEAKIAogJChMT0NBTF9CVUlMVF9NT0RVTEUpOgogCSQoaGlkZSkgdG91Y2ggJEAKKworJChpZiAkKG15X3JlZ2lzdGVyX25hbWUpLCQoZXZhbCBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk1BS0VfTU9EVUxFX1RZUEU6PUhFQURFUl9MSUJSQVJZKSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2hvc3RfZXhlY3V0YWJsZV9pbnRlcm5hbC5tayBiL2NvcmUvaG9zdF9leGVjdXRhYmxlX2ludGVybmFsLm1rCmluZGV4IDJmZjlmZjIuLjdjNzlhMWUgMTAwNjQ0Ci0tLSBhL2NvcmUvaG9zdF9leGVjdXRhYmxlX2ludGVybmFsLm1rCisrKyBiL2NvcmUvaG9zdF9leGVjdXRhYmxlX2ludGVybmFsLm1rCkBAIC01Nyw0ICs1Nyw2IEBACiAkKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoYWxsX29iamVjdHMpICQoYWxsX2xpYnJhcmllcykgJChDTEFOR19DWFgpCiAJJCh0cmFuc2Zvcm0taG9zdC1vLXRvLWV4ZWN1dGFibGUpCiAKKyQoaWYgJChteV9yZWdpc3Rlcl9uYW1lKSwkKGV2YWwgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NQUtFX01PRFVMRV9UWVBFOj1IT1NUX0VYRUNVVEFCTEUpKQorCiBlbmRpZiAgIyBza2lwX2J1aWxkX2Zyb21fc291cmNlCmRpZmYgLS1naXQgYS9jb3JlL2hvc3RfamF2YV9saWJyYXJ5Lm1rIGIvY29yZS9ob3N0X2phdmFfbGlicmFyeS5tawppbmRleCA4OWFhNTNjLi42NTJlYjBlIDEwMDY0NAotLS0gYS9jb3JlL2hvc3RfamF2YV9saWJyYXJ5Lm1rCisrKyBiL2NvcmUvaG9zdF9qYXZhX2xpYnJhcnkubWsKQEAgLTk4LDkgKzk4LDcgQEAKICQoZnVsbF9jbGFzc2VzX2NvbWJpbmVkX2phcik6ICQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcikgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChqYXJfbWFuaWZlc3RfZmlsZSkgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChmdWxsX3N0YXRpY19qYXZhX2xpYnMpIHwgJChNRVJHRV9aSVBTKQotCSQoaWYgJChQUklWQVRFX0pBUl9NQU5JRkVTVCksICQoaGlkZSkgc2VkIC1lICJzLyVCVUlMRF9OVU1CRVIlLyQoQlVJTERfTlVNQkVSX0ZST01fRklMRSkvIiBcCi0gICAgICAgICAgICAkKFBSSVZBVEVfSkFSX01BTklGRVNUKSA+ICQoZGlyICRAKS9tYW5pZmVzdC5tZikKLQkkKE1FUkdFX1pJUFMpIC1qIC0taWdub3JlLWR1cGxpY2F0ZXMgJChpZiAkKFBSSVZBVEVfSkFSX01BTklGRVNUKSwtbSAkKGRpciAkQCkvbWFuaWZlc3QubWYpIFwKKwkkKE1FUkdFX1pJUFMpIC1qIC0taWdub3JlLWR1cGxpY2F0ZXMgJChpZiAkKFBSSVZBVEVfSkFSX01BTklGRVNUKSwtbSAkKFBSSVZBVEVfSkFSX01BTklGRVNUKSkgXAogICAgICAgICAgICAgJChpZiAkKFBSSVZBVEVfRE9OVF9ERUxFVEVfSkFSX01FVEFfSU5GKSwsLXN0cmlwRGlyIE1FVEEtSU5GIC16aXBUb05vdFN0cmlwICQ8KSBcCiAgICAgICAgICAgICAkQCAkPCAkKFBSSVZBVEVfU1RBVElDX0pBVkFfTElCUkFSSUVTKQogCkBAIC0xMjYsMyArMTI0LDUgQEAKIGlmZXEgKCQoVFVSQklORV9FTkFCTEVEKSxmYWxzZSkKICQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKExPQ0FMX0ZVTExfQ0xBU1NFU19KQUNPQ09fSkFSKSwkKGZ1bGxfY2xhc3Nlc19oZWFkZXJfamFyKSkpCiBlbmRpZgorCiskKGlmICQobXlfcmVnaXN0ZXJfbmFtZSksJChldmFsIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUFLRV9NT0RVTEVfVFlQRTo9SE9TVF9KQVZBX0xJQlJBUlkpKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvaG9zdF9qYXZhX2xpYnJhcnlfY29tbW9uLm1rIGIvY29yZS9ob3N0X2phdmFfbGlicmFyeV9jb21tb24ubWsKaW5kZXggMGU2MmY2MC4uMDA2ZTZlYyAxMDA2NDQKLS0tIGEvY29yZS9ob3N0X2phdmFfbGlicmFyeV9jb21tb24ubWsKKysrIGIvY29yZS9ob3N0X2phdmFfbGlicmFyeV9jb21tb24ubWsKQEAgLTQ2LDUgKzQ2LDQgQEAKIGVuZGlmCiBlbmRpZgogCi1MT0NBTF9JTlRFUk1FRElBVEVfU09VUkNFX0RJUiA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9zcmMKIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9ICQoc29ydCAkKExPQ0FMX0pBVkFfTElCUkFSSUVTKSkKZGlmZiAtLWdpdCBhL2NvcmUvaG9zdF9wcmVidWlsdC5tayBiL2NvcmUvaG9zdF9wcmVidWlsdC5tawppbmRleCA3OWYzZmZhLi43ZGM2NzA0IDEwMDY0NAotLS0gYS9jb3JlL2hvc3RfcHJlYnVpbHQubWsKKysrIGIvY29yZS9ob3N0X3ByZWJ1aWx0Lm1rCkBAIC0xNywzICsxNyw1IEBACiAkKGNhbGwgcmVjb3JkLW1vZHVsZS10eXBlLEhPU1RfUFJFQlVJTFQpCiBMT0NBTF9JU19IT1NUX01PRFVMRSA6PSB0cnVlCiBpbmNsdWRlICQoQlVJTERfTVVMVElfUFJFQlVJTFQpCisKKyQoaWYgJChteV9yZWdpc3Rlcl9uYW1lKSwkKGV2YWwgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NQUtFX01PRFVMRV9UWVBFOj1IT1NUX1BSRUJVSUxUKSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2hvc3Rfc2hhcmVkX2xpYnJhcnlfaW50ZXJuYWwubWsgYi9jb3JlL2hvc3Rfc2hhcmVkX2xpYnJhcnlfaW50ZXJuYWwubWsKaW5kZXggYWU4Yjc5OC4uMjJhMDJkNCAxMDA2NDQKLS0tIGEvY29yZS9ob3N0X3NoYXJlZF9saWJyYXJ5X2ludGVybmFsLm1rCisrKyBiL2NvcmUvaG9zdF9zaGFyZWRfbGlicmFyeV9pbnRlcm5hbC5tawpAQCAtNTMsNCArNTMsNiBAQAogICAgICAgICAkKExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTKQogCSQodHJhbnNmb3JtLWhvc3Qtby10by1zaGFyZWQtbGliKQogCiskKGlmICQobXlfcmVnaXN0ZXJfbmFtZSksJChldmFsIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUFLRV9NT0RVTEVfVFlQRTo9SE9TVF9TSEFSRURfTElCUkFSWSkpCisKIGVuZGlmICAjIHNraXBfYnVpbGRfZnJvbV9zb3VyY2UKZGlmZiAtLWdpdCBhL2NvcmUvaG9zdF9zdGF0aWNfbGlicmFyeV9pbnRlcm5hbC5tayBiL2NvcmUvaG9zdF9zdGF0aWNfbGlicmFyeV9pbnRlcm5hbC5tawppbmRleCAzOTQ2YWE3Li4wNzljNDVlIDEwMDY0NAotLS0gYS9jb3JlL2hvc3Rfc3RhdGljX2xpYnJhcnlfaW50ZXJuYWwubWsKKysrIGIvY29yZS9ob3N0X3N0YXRpY19saWJyYXJ5X2ludGVybmFsLm1rCkBAIC0yMywzICsyMyw1IEBACiAkKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoYnVpbHRfd2hvbGVfbGlicmFyaWVzKQogJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKGFsbF9vYmplY3RzKQogCSQodHJhbnNmb3JtLWhvc3Qtby10by1zdGF0aWMtbGliKQorCiskKGlmICQobXlfcmVnaXN0ZXJfbmFtZSksJChldmFsIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUFLRV9NT0RVTEVfVFlQRTo9SE9TVF9TVEFUSUNfTElCUkFSWSkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9pbnN0YWxsX2puaV9saWJzX2ludGVybmFsLm1rIGIvY29yZS9pbnN0YWxsX2puaV9saWJzX2ludGVybmFsLm1rCmluZGV4IDU0OTEyNDcuLjQ5NTllZGQgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5zdGFsbF9qbmlfbGlic19pbnRlcm5hbC5taworKysgYi9jb3JlL2luc3RhbGxfam5pX2xpYnNfaW50ZXJuYWwubWsKQEAgLTM4LDggKzM4LDkgQEAKICAgICAgICQoZXJyb3IgTE9DQUxfU0RLX1ZFUlNJT04gbXVzdCBiZSBkZWZpbmVkIHdpdGggTE9DQUxfTkRLX1NUTF9WQVJJQU5ULCBcCiAgICAgICAgICAgTE9DQUxfUEFDS0FHRV9OQU1FPSQoTE9DQUxfUEFDS0FHRV9OQU1FKSkKICAgICBlbmRpZgorICAgIG15X2xpYmN4eF9hcmNoIDo9ICQoJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKVBSRUJVSUxUX0xJQkNYWF9BUkNIX0RJUikKICAgICBteV9qbmlfc2hhcmVkX2xpYnJhcmllcyArPSBcCi0gICAgICAgICQoSElTVE9SSUNBTF9OREtfVkVSU0lPTlNfUk9PVCkvJChMT0NBTF9OREtfVkVSU0lPTikvc291cmNlcy9jeHgtc3RsL2xsdm0tbGliYysrL2xpYnMvJChUQVJHRVRfJChteV8ybmRfYXJjaF9wcmVmaXgpQ1BVX0FCSSkvbGliYysrX3NoYXJlZC5zbworICAgICAgICAkKExMVk1fUFJFQlVJTFRTX0JBU0UpLyQoQlVJTERfT1MpLXg4Ni8kKExMVk1fUFJFQlVJTFRTX1ZFUlNJT04pL2FuZHJvaWRfbGliYysrL25kay8kKG15X2xpYmN4eF9hcmNoKS9saWIvbGliYysrX3NoYXJlZC5zbwogICBlbmRpZgogCiAgICMgU2V0IHRoZSBhYmkgZGlyZWN0b3J5IHVzZWQgYnkgdGhlIGxvY2FsIEpOSSBzaGFyZWQgbGlicmFyaWVzLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhLm1rIGIvY29yZS9qYXZhLm1rCmluZGV4IGIxM2VmNGQuLjQxYTFiMWIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS5taworKysgYi9jb3JlL2phdmEubWsKQEAgLTgzLDggKzgzLDYgQEAKICAgICAkKGZ1bGxfY2xhc3Nlc19zdHVic19qYXIpIFwKICAgICAkKGphdmFfc291cmNlX2xpc3RfZmlsZSkKIAotTE9DQUxfSU5URVJNRURJQVRFX1NPVVJDRV9ESVIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvc3JjCi0KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBBSURMOiBDb21waWxlIC5haWRsIGZpbGVzIHRvIC5qYXZhCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMTQyLDggKzE0MCw3IEBACiBsb2d0YWdzX2phdmFfc291cmNlcyA6PSAkKHBhdHN1YnN0ICUubG9ndGFncywlLmphdmEsJChhZGRwcmVmaXggJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvbG9ndGFncy8sICQobG9ndGFnc19zb3VyY2VzKSkpCiBsb2d0YWdzX3NvdXJjZXMgOj0gJChhZGRwcmVmaXggJChMT0NBTF9QQVRIKS8sICQobG9ndGFnc19zb3VyY2VzKSkKIAotJChsb2d0YWdzX2phdmFfc291cmNlcyk6IFBSSVZBVEVfTUVSR0VEX1RBRyA6PSAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL2FsbC1ldmVudC1sb2ctdGFncy50eHQKLSQobG9ndGFnc19qYXZhX3NvdXJjZXMpOiAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9sb2d0YWdzLyUuamF2YTogJChMT0NBTF9QQVRIKS8lLmxvZ3RhZ3MgJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS9hbGwtZXZlbnQtbG9nLXRhZ3MudHh0ICQoSkFWQVRBR1MpIGJ1aWxkL21ha2UvdG9vbHMvZXZlbnRfbG9nX3RhZ3MucHkKKyQobG9ndGFnc19qYXZhX3NvdXJjZXMpOiAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9sb2d0YWdzLyUuamF2YTogJChMT0NBTF9QQVRIKS8lLmxvZ3RhZ3MgJChKQVZBVEFHUykKIAkkKHRyYW5zZm9ybS1sb2d0YWdzLXRvLWphdmEpCiAKIGVsc2UKQEAgLTI5Niw5ICsyOTMsNyBAQAogJChmdWxsX2NsYXNzZXNfY29tYmluZWRfamFyKTogJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGphcl9tYW5pZmVzdF9maWxlKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZ1bGxfc3RhdGljX2phdmFfbGlicykgfCAkKE1FUkdFX1pJUFMpCi0JJChpZiAkKFBSSVZBVEVfSkFSX01BTklGRVNUKSwgJChoaWRlKSBzZWQgLWUgInMvJUJVSUxEX05VTUJFUiUvJChCVUlMRF9OVU1CRVJfRlJPTV9GSUxFKS8iIFwKLSAgICAgICAgICAgICQoUFJJVkFURV9KQVJfTUFOSUZFU1QpID4gJChkaXIgJEApL21hbmlmZXN0Lm1mKQotCSQoTUVSR0VfWklQUykgLWogLS1pZ25vcmUtZHVwbGljYXRlcyAkKGlmICQoUFJJVkFURV9KQVJfTUFOSUZFU1QpLC1tICQoZGlyICRAKS9tYW5pZmVzdC5tZikgXAorCSQoTUVSR0VfWklQUykgLWogLS1pZ25vcmUtZHVwbGljYXRlcyAkKGlmICQoUFJJVkFURV9KQVJfTUFOSUZFU1QpLC1tICQoUFJJVkFURV9KQVJfTUFOSUZFU1QpKSBcCiAgICAgICAgICAgICAkKGlmICQoUFJJVkFURV9ET05UX0RFTEVURV9KQVJfTUVUQV9JTkYpLCwtc3RyaXBEaXIgTUVUQS1JTkYgLXppcFRvTm90U3RyaXAgJDwpIFwKICAgICAgICAgICAgICRAICQ8ICQoUFJJVkFURV9TVEFUSUNfSkFWQV9MSUJSQVJJRVMpCiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YV9jb21tb24ubWsgYi9jb3JlL2phdmFfY29tbW9uLm1rCmluZGV4IDBlMDNkMGIuLmY1NzRiNzYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YV9jb21tb24ubWsKKysrIGIvY29yZS9qYXZhX2NvbW1vbi5tawpAQCAtMTAsOSArMTAsNyBAQAogIyMgSmF2YSB2ZXJzaW9uCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBVc2UgdGhlIExPQ0FMX0pBVkFfTEFOR1VBR0VfVkVSU0lPTiBpZiBpdCBpcyBzZXQsIG90aGVyd2lzZQotIyB1c2Ugb25lIGJhc2VkIG9uIHRoZSBMT0NBTF9TREtfVkVSU0lPTi4gSWYgaXQgaXMgPCAyNAotIyBwYXNzICIxLjciIHRvIHRoZSB0b29scywgaWYgaXQgaXMgdW5zZXQsID49IDI0IG9yICJjdXJyZW50IgotIyBwYXNzICIxLjgiLgorIyB1c2Ugb25lIGJhc2VkIG9uIHRoZSBMT0NBTF9TREtfVkVSU0lPTi4KICMKICMgVGhlIExPQ0FMX1NES19WRVJTSU9OIGJlaGF2aW9yIGlzIHRvIGVuc3VyZSB0aGF0LCBieSBkZWZhdWx0LAogIyBjb2RlIHRoYXQgaXMgZXhwZWN0ZWQgdG8gcnVuIG9uIG9sZGVyIHJlbGVhc2VzIG9mIEFuZHJvaWQKQEAgLTI1LDE1ICsyMywxOSBAQAogICAgICMgSG9zdCBtb2R1bGVzIGFsd2F5cyBkZWZhdWx0IHRvIDEuOQogICAgIExPQ0FMX0pBVkFfTEFOR1VBR0VfVkVSU0lPTiA6PSAxLjkKICAgZWxzZQotICAgIGlmbmVxICgsJChmaWx0ZXIgJChMT0NBTF9TREtfVkVSU0lPTiksICQoVEFSR0VUX1NES19WRVJTSU9OU19XSVRIT1VUX0pBVkFfMThfU1VQUE9SVCkpKQotICAgICAgTE9DQUxfSkFWQV9MQU5HVUFHRV9WRVJTSU9OIDo9IDEuNwotICAgIGVsc2UgaWZuZXEgKCwkKGZpbHRlciAkKExPQ0FMX1NES19WRVJTSU9OKSwgJChUQVJHRVRfU0RLX1ZFUlNJT05TX1dJVEhPVVRfSkFWQV8xOV9TVVBQT1JUKSkpCisgICAgaWZuZXEgKCwkKGZpbHRlciAkKExPQ0FMX1NES19WRVJTSU9OKSwgJChUQVJHRVRfU0RLX1ZFUlNJT05TX1dJVEhPVVRfSkFWQV8xXzlfU1VQUE9SVCkpKQogICAgICAgTE9DQUxfSkFWQV9MQU5HVUFHRV9WRVJTSU9OIDo9IDEuOAorICAgIGVsc2UgaWZuZXEgKCwkKGZpbHRlciAkKExPQ0FMX1NES19WRVJTSU9OKSwgJChUQVJHRVRfU0RLX1ZFUlNJT05TX1dJVEhPVVRfSkFWQV8xMV9TVVBQT1JUKSkpCisgICAgICBMT0NBTF9KQVZBX0xBTkdVQUdFX1ZFUlNJT04gOj0gMS45CisgICAgZWxzZSBpZm5lcSAoLCQoZmlsdGVyICQoTE9DQUxfU0RLX1ZFUlNJT04pLCAkKFRBUkdFVF9TREtfVkVSU0lPTlNfV0lUSE9VVF9KQVZBXzE3X1NVUFBPUlQpKSkKKyAgICAgIExPQ0FMX0pBVkFfTEFOR1VBR0VfVkVSU0lPTiA6PSAxMQogICAgIGVsc2UgaWZuZXEgKCwkKExPQ0FMX1NES19WRVJTSU9OKSQoVEFSR0VUX0JVSUxEX1VTRV9QUkVCVUlMVF9TREtTKSkKICAgICAgICMgVE9ETyhjY3Jvc3MpOiBhbGxvdyAxLjkgZm9yIGN1cnJlbnQgYW5kIHVuYnVuZGxlZCBvbmNlIHdlIGhhdmUgU0RLIHN5c3RlbSBtb2R1bGVzCiAgICAgICBMT0NBTF9KQVZBX0xBTkdVQUdFX1ZFUlNJT04gOj0gMS44CisgICAgZWxzZSBpZmVxICgkKFJFTEVBU0VfVEFSR0VUX0pBVkFfMjEpLHRydWUpCisgICAgICBMT0NBTF9KQVZBX0xBTkdVQUdFX1ZFUlNJT04gOj0gMjEKICAgICBlbHNlCi0gICAgICBMT0NBTF9KQVZBX0xBTkdVQUdFX1ZFUlNJT04gOj0gMS45CisgICAgICBMT0NBTF9KQVZBX0xBTkdVQUdFX1ZFUlNJT04gOj0gMTcKICAgICBlbmRpZgogICBlbmRpZgogZW5kaWYKQEAgLTE5MCw3ICsxOTIsNyBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIFBSSVZBVEUgamF2YSB2YXJzCiAjIExPQ0FMX1NPVVJDRV9GSUxFU19BTExfR0VORVJBVEVEIGlzIHNldCBvbmx5IGlmIHRoZSBtb2R1bGUgZG9lcyBub3QgaGF2ZSBzdGF0aWMgc291cmNlIGZpbGVzLAotIyBidXQgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcyBpbiBpdHMgTE9DQUxfSU5URVJNRURJQVRFX1NPVVJDRV9ESVIuCisjIGJ1dCBnZW5lcmF0ZWQgc291cmNlIGZpbGVzLgogIyBZb3UgaGF2ZSB0byBzZXQgdXAgdGhlIGRlcGVuZGVuY3kgaW4gc29tZSBvdGhlciB3YXkuCiBuZWVkX2NvbXBpbGVfamF2YSA6PSAkKHN0cmlwICQoYWxsX2phdmFfc291cmNlcykkKExPQ0FMX1NSQ0pBUlMpJChhbGxfcmVzX2Fzc2V0cykkKGphdmFfcmVzb3VyY2Vfc291cmNlcykpJChMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMpJChmaWx0ZXIgdHJ1ZSwkKExPQ0FMX1NPVVJDRV9GSUxFU19BTExfR0VORVJBVEVEKSkKIGlmZGVmIG5lZWRfY29tcGlsZV9qYXZhCkBAIC0yMzQsOCArMjM2LDYgQEAKICQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX0pBVkFfU09VUkNFUyA6PSAkKGFsbF9qYXZhX3NvdXJjZXMpCiAkKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9KQVZBX1NPVVJDRV9MSVNUIDo9ICQoamF2YV9zb3VyY2VfbGlzdF9maWxlKQogCi0kKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9STVRZUEVERUZTIDo9ICQoTE9DQUxfUk1UWVBFREVGUykKLQogIyBRdWlja2x5IGNoZWNrIGNsYXNzIHBhdGggdmFycy4KIGRpc2FsbG93ZWRfZGVwcyA6PSAkKGZvcmVhY2ggc2RrLCQoVEFSR0VUX0FWQUlMQUJMRV9TREtfVkVSU0lPTlMpLCQoY2FsbCByZXNvbHZlLXByZWJ1aWx0LXNkay1tb2R1bGUsJChzZGspKSkKIGRpc2FsbG93ZWRfZGVwcyArPSAkKGZvcmVhY2ggc2RrLCQoVEFSR0VUX0FWQUlMQUJMRV9TREtfVkVSU0lPTlMpLFwKQEAgLTM4NCw3ICszODQsNyBAQAogZW5kaWYgIyAhTE9DQUxfSVNfSE9TVF9NT0RVTEUKIAogIyAoYi8yMDQzOTcxODApIFJlY29yZCBBTExfREVQUyBieSBkZWZhdWx0LgotQUxMX0RFUFMuJChMT0NBTF9NT0RVTEUpLkFMTF9ERVBTIDo9ICQoQUxMX0RFUFMuJChMT0NBTF9NT0RVTEUpLkFMTF9ERVBTKSAkKGZ1bGxfamF2YV9ib290Y2xhc3NwYXRoX2xpYnMpCitBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkFMTF9ERVBTIDo9ICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5BTExfREVQUykgJChmdWxsX2phdmFfYm9vdGNsYXNzcGF0aF9saWJzKQogCiAjIEV4cG9ydCB0aGUgU0RLIGxpYnMuIFRoZSBzZGsgbGlicmFyeSBuYW1lcyBsaXN0ZWQgaW4gTE9DQUxfU0RLX0xJQlJBUklFUyBhcmUgZmlyc3QgZXhwb3J0ZWQuCiAjIFRoZW4gc2RrIGxpYnJhcnkgbmFtZXMgZXhwb3J0ZWQgZnJvbSBkZXBlbmRlbmNpZXMgYXJlIGFsbCByZS1leHBvcnRlZC4KQEAgLTQxMCw3ICs0MTAsNyBAQAogZnVsbF9qYXZhX3N5c3RlbV9tb2R1bGVzX2RlcHMgOj0KIG15X3N5c3RlbV9tb2R1bGVzX2RpciA6PQogJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfVVNFX1NZU1RFTV9NT0RVTEVTIDo9Ci1pZmVxICgkKExPQ0FMX0pBVkFfTEFOR1VBR0VfVkVSU0lPTiksMS45KQoraWZlcSAoLCQoZmlsdGVyICQoTE9DQUxfSkFWQV9MQU5HVUFHRV9WRVJTSU9OKSwkKEpBVkFfTEFOR1VBR0VfVkVSU0lPTlNfV0lUSE9VVF9TWVNURU1fTU9EVUxFUykpKQogICAkKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9VU0VfU1lTVEVNX01PRFVMRVMgOj0gdHJ1ZQogICBpZmRlZiBteV9zeXN0ZW1fbW9kdWxlcwogICAgIGlmbmVxICgkKG15X3N5c3RlbV9tb2R1bGVzKSxub25lKQpAQCAtNDg4LDIwICs0ODgsNiBAQAogJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfQUxMX0pBVkFfSEVBREVSX0xJQlJBUklFUyA6PSAkKGZ1bGxfamF2YV9oZWFkZXJfbGlicykKICQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX1NIQVJFRF9KQVZBX0hFQURFUl9MSUJSQVJJRVMgOj0gJChmdWxsX3NoYXJlZF9qYXZhX2hlYWRlcl9saWJzKQogCi1BTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLklOVEVSTUVESUFURV9TT1VSQ0VfRElSIDo9IFwKLSAgICAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuSU5URVJNRURJQVRFX1NPVVJDRV9ESVIpICQoTE9DQUxfSU5URVJNRURJQVRFX1NPVVJDRV9ESVIpCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5IE5PVElDRSBmaWxlcyBvZiB0cmFuc2l0aXZlIHN0YXRpYyBkZXBlbmRlbmNpZXMKLSMgRG9uJ3QgZG8gdGhpcyBpbiBtbSwgc2luY2UgbWFueSBvZiB0aGUgdGFyZ2V0cyB3b24ndCBleGlzdC4KLWluc3RhbGxlZF9zdGF0aWNfbGlicmFyeV9ub3RpY2VfZmlsZV90YXJnZXRzIDo9IFwKLSAgICAkKGZvcmVhY2ggbGliLCQoTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTKSwgXAotICAgICAgTk9USUNFLSQoaWYgJChMT0NBTF9JU19IT1NUX01PRFVMRSksSE9TVCQoaWYgJChteV9ob3N0X2Nyb3NzKSxfQ1JPU1MsKSxUQVJHRVQpLUpBVkFfTElCUkFSSUVTLSQobGliKSkKLQotJChub3RpY2VfdGFyZ2V0KTogfCAkKGluc3RhbGxlZF9zdGF0aWNfbGlicmFyeV9ub3RpY2VfZmlsZV90YXJnZXRzKQotJChMT0NBTF9JTlNUQUxMRURfTU9EVUxFKTogfCAkKG5vdGljZV90YXJnZXQpCi0KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIFZlcmlmeSB0aGF0IGFsbCBsaWJyYXJpZXMgYXJlIHNhZmUgdG8gdXNlCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhX2xpYnJhcnkubWsgYi9jb3JlL2phdmFfbGlicmFyeS5tawppbmRleCAzYWMwM2RjLi45N2NlOTJjIDEwMDY0NAotLS0gYS9jb3JlL2phdmFfbGlicmFyeS5taworKysgYi9jb3JlL2phdmFfbGlicmFyeS5tawpAQCAtODgsMyArODgsNSBAQAogJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoY29tbW9uX2phdmFsaWIuamFyKSwkKExPQ0FMX0JVSUxUX01PRFVMRSkpKQogCiBlbmRpZiAjICFMT0NBTF9JU19TVEFUSUNfSkFWQV9MSUJSQVJZCisKKyQoaWYgJChteV9yZWdpc3Rlcl9uYW1lKSwkKGV2YWwgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NQUtFX01PRFVMRV9UWVBFOj1KQVZBX0xJQlJBUlkpKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YV9wcmVidWlsdF9pbnRlcm5hbC5tayBiL2NvcmUvamF2YV9wcmVidWlsdF9pbnRlcm5hbC5tawppbmRleCBiZTczM2ZmLi40YjZlZWE3IDEwMDY0NAotLS0gYS9jb3JlL2phdmFfcHJlYnVpbHRfaW50ZXJuYWwubWsKKysrIGIvY29yZS9qYXZhX3ByZWJ1aWx0X2ludGVybmFsLm1rCkBAIC0xMTUsMTEgKzExNSw2IEBACiBpZm5lcSAoJChteV9zcmNfYWFyKSwpCiAjIFRoaXMgaXMgLmFhciBmaWxlLCBhcmNoaXZlIG9mIGNsYXNzZXMuamFyIGFuZCBBbmRyb2lkIHJlc291cmNlcy4KIAotIyBydW4gSmV0aWZpZXIgaWYgbmVlZGVkCi1MT0NBTF9KRVRJRklFUl9JTlBVVF9GSUxFIDo9ICQobXlfc3JjX2FhcikKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2pldGlmaWVyLm1rCi1teV9zcmNfYWFyIDo9ICQoTE9DQUxfSkVUSUZJRVJfT1VUUFVUX0ZJTEUpCi0KIG15X3NyY19qYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvYWFyL2NsYXNzZXMuamFyCiBteV9zcmNfcHJvZ3VhcmRfb3B0aW9ucyA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9hYXIvcHJvZ3VhcmQudHh0CiBteV9zcmNfYW5kcm9pZF9tYW5pZmVzdCA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9hYXIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTM3LDEzICsxMzIsNiBAQAogJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQobXlfc3JjX2FuZHJvaWRfbWFuaWZlc3QpLCQobXlfcHJlYnVpbHRfYW5kcm9pZF9tYW5pZmVzdCkpKQogJChjYWxsIGFkZC1kZXBlbmRlbmN5LCQoTE9DQUxfQlVJTFRfTU9EVUxFKSwkKG15X3ByZWJ1aWx0X2FuZHJvaWRfbWFuaWZlc3QpKQogCi1lbHNlCi0KLSMgcnVuIEpldGlmaWVyIGlmIG5lZWRlZAotTE9DQUxfSkVUSUZJRVJfSU5QVVRfRklMRSA6PSAkKG15X3NyY19qYXIpCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9qZXRpZmllci5tawotbXlfc3JjX2phciA6PSAkKExPQ0FMX0pFVElGSUVSX09VVFBVVF9GSUxFKQotCiBlbmRpZgogCiAkKGNvbW1vbl9jbGFzc2VzX2phcikgOiAkKG15X3NyY19qYXIpCkBAIC0xODQsNiArMTcyLDEyIEBACiBlbmRpZgogZW5kaWYKIAorIyB0cmFuc2l0aXZlLXJlcy1wYWNrYWdlcyBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgU29vbmcgbW9kdWxlcyBmb3Igbm93LCBidXQgbmVlZHMKKyMgdG8gZXhpc3Qgc28gdGhhdCBvdGhlciBNYWtlIG1vZHVsZXMgY2FuIGRlcGVuZCBvbiBpdC4gIENyZWF0ZSBhbiBlbXB0eSBmaWxlLgorbXlfdHJhbnNpdGl2ZV9yZXNfcGFja2FnZXMgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvdHJhbnNpdGl2ZS1yZXMtcGFja2FnZXMKKyQobXlfdHJhbnNpdGl2ZV9yZXNfcGFja2FnZXMpOgorCXRvdWNoICRACisKIG15X3Jlc19wYWNrYWdlIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL3BhY2thZ2UtcmVzLmFwawogCiAjIFdlIG5lZWRlZCBvbmx5IHZlcnkgZmV3IFBSSVZBVEUgdmFyaWFibGVzIGFuZCBhYXB0Mi5tayBpbnB1dCB2YXJpYWJsZXMuIFJlc2V0IHRoZSB1bm5lY2Vzc2FyeSBvbmVzLgpkaWZmIC0tZ2l0IGEvY29yZS9qZXRpZmllci5tayBiL2NvcmUvamV0aWZpZXIubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZjQyMzAuLjAwMDAwMDAKLS0tIGEvY29yZS9qZXRpZmllci5taworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgVGhpcyBmaWxlIHNldHMgdXAgdGhlIHJ1bm5pbmcgb2YgSmV0aWZpZXIKLQotIyBub3cgYWRkIHRoZSBydWxlIHRvIHJ1biBqZXRpZmllcgotaWZlcSAoJChzdHJpcCAkKExPQ0FMX0pFVElGSUVSX0VOQUJMRUQpKSx0cnVlKQotICBteV9qZXRpZmllcl9pbnB1dF9wYXRoIDo9ICQoTE9DQUxfSkVUSUZJRVJfSU5QVVRfRklMRSkKLSAgbXlfZmlsZXMgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvamV0aWZpZXIKLSAgbXlfamV0aWZpZXJfb3V0cHV0X3BhdGggOj0gJChteV9maWxlcykvamV0aWZpZWQtJChub3RkaXIgJChteV9qZXRpZmllcl9pbnB1dF9wYXRoKSkKLQotJChteV9qZXRpZmllcl9vdXRwdXRfcGF0aCkgOiAkKG15X2pldGlmaWVyX2lucHV0X3BhdGgpICQoSkVUSUZJRVIpCi0Jcm0gLXJmICRACi0JJChKRVRJRklFUikgLWwgZXJyb3IgLW8gJEAgLWkgJDwKLQotICBMT0NBTF9KRVRJRklFUl9PVVRQVVRfRklMRSA6PSAkKG15X2pldGlmaWVyX291dHB1dF9wYXRoKQotICBMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyArPSAkKExPQ0FMX0pFVElGSUVSX09VVFBVVF9GSUxFKQotZWxzZQotICBMT0NBTF9KRVRJRklFUl9PVVRQVVRfRklMRSA6PSAkKExPQ0FMX0pFVElGSUVSX0lOUFVUX0ZJTEUpCi1lbmRpZgotCmRpZmYgLS1naXQgYS9jb3JlL2xheW91dGxpYl9kYXRhLm1rIGIvY29yZS9sYXlvdXRsaWJfZGF0YS5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjI4ZWY2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sYXlvdXRsaWJfZGF0YS5tawpAQCAtMCwwICsxLDE4OSBAQAorIyBEYXRhIGZpbGVzIGZvciBsYXlvdXRsaWIKKworRk9OVF9URU1QIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLGZvbnRzLEhPU1QsQ09NTU9OKQorCisjIFRoZSBmb250IGNvbmZpZ3VyYXRpb24gZmlsZXMgLSBzeXN0ZW1fZm9udHMueG1sLCBmYWxsYmFja19mb250cy54bWwgZXRjLgorZm9udF9jb25maWcgOj0gJChmaWx0ZXIgJChUQVJHRVRfT1VUKS9ldGMvZm9udCUueG1sLCAkKElOVEVSTkFMX1NZU1RFTUlNQUdFX0ZJTEVTKSkKK2ZvbnRfY29uZmlnIDo9ICQoYWRkcHJlZml4ICQoRk9OVF9URU1QKS8sICQobm90ZGlyICQoZm9udF9jb25maWcpKSkKKworJChmb250X2NvbmZpZyk6ICQoRk9OVF9URU1QKS8lOiAkKFRBUkdFVF9PVVQpL2V0Yy8lCisJJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkKKwkkKGhpZGUpIGNwIC12ZiAkPCAkQAorCisjIExpc3Qgb2YgZm9udHMgb24gdGhlIGRldmljZSB0aGF0IHdlIHdhbnQgdG8gc2hpcC4gVGhpcyBpcyBhbGwgLnR0ZiwgLnR0YyBhbmQgLm90ZiBmb250cy4KK2ZvbnRzX2RldmljZSA6PSAkKGZpbHRlciAkKFRBUkdFVF9PVVQpL2ZvbnRzLyUudHRmICQoVEFSR0VUX09VVCkvZm9udHMvJS50dGMgJChUQVJHRVRfT1VUKS9mb250cy8lLm90ZiwgJChJTlRFUk5BTF9TWVNURU1JTUFHRV9GSUxFUykpCitmb250c19kZXZpY2UgOj0gJChhZGRwcmVmaXggJChGT05UX1RFTVApLywgJChub3RkaXIgJChmb250c19kZXZpY2UpKSkKKworIyBUT0RPOiBJZiB0aGUgZm9udCBmaWxlIGlzIGEgc3ltbGluaywgcmV1c2UgdGhlIGZvbnQgcmVuYW1lZCBmcm9tIHRoZSBzeW1saW5rCisjIHRhcmdldC4KKyQoZm9udHNfZGV2aWNlKTogJChGT05UX1RFTVApLyU6ICQoVEFSR0VUX09VVCkvZm9udHMvJQorCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCisJJChoaWRlKSBjcCAtdmYgJDwgJEAKKworS0VZQk9BUkRfVEVNUCA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxrZXlib2FyZHMsSE9TVCxDT01NT04pCisKKyMgVGhlIGtleSBjaGFyYWN0ZXIgbWFwIGZpbGVzIG5lZWRlZCBmb3Igc3VwcG9ydGluZyBLZXlFdmVudAora2V5Ym9hcmRzIDo9ICQoc29ydCAkKHdpbGRjYXJkIGZyYW1ld29ya3MvYmFzZS9kYXRhL2tleWJvYXJkcy8qLmtjbSkpCitrZXlib2FyZHMgOj0gJChhZGRwcmVmaXggJChLRVlCT0FSRF9URU1QKS8sICQobm90ZGlyICQoa2V5Ym9hcmRzKSkpCisKKyQoa2V5Ym9hcmRzKTogJChLRVlCT0FSRF9URU1QKS8lLmtjbTogZnJhbWV3b3Jrcy9iYXNlL2RhdGEva2V5Ym9hcmRzLyUua2NtCisJJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkKKwkkKGhpZGUpIGNwIC12ZiAkPCAkQAorCitIWVBIRU5fVEVNUCA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxoeXBoZW4sSE9TVCxDT01NT04pCisKKyMgVGhlIGh5cGhlbmF0aW9uIHBhdHRlcm4gZmlsZXMgbmVlZGVkIHRvIHN1cHBvcnQgdGV4dCBoeXBoZW5hdGlvbgoraHlwaGVuIDo9ICQoZmlsdGVyICQoVEFSR0VUX09VVCkvdXNyL2h5cGhlbi1kYXRhLyUuaHliLCAkKElOVEVSTkFMX1NZU1RFTUlNQUdFX0ZJTEVTKSkKK2h5cGhlbiA6PSAkKGFkZHByZWZpeCAkKEhZUEhFTl9URU1QKS8sICQobm90ZGlyICQoaHlwaGVuKSkpCisKKyQoaHlwaGVuKTogJChIWVBIRU5fVEVNUCkvJTogJChUQVJHRVRfT1VUKS91c3IvaHlwaGVuLWRhdGEvJQorCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCisJJChoaWRlKSBjcCAtdmYgJDwgJEAKKworIyBMaXN0IG9mIGFsbCBkYXRhIGZpbGVzIC0gZm9udCBmaWxlcywgZm9udCBjb25maWd1cmF0aW9uIGZpbGVzLCBrZXkgY2hhcmFjdGVyIG1hcCBmaWxlcywgaHlwaGVuYXRpb24gcGF0dGVybiBmaWxlcworTEFZT1VUTElCX0ZJTEVTIDo9ICQoZm9udHNfZGV2aWNlKSAkKGZvbnRfY29uZmlnKSAkKGtleWJvYXJkcykgJChoeXBoZW4pCisKKy5QSE9OWTogbGF5b3V0bGliIGxheW91dGxpYi10ZXN0cworbGF5b3V0bGliIGxheW91dGxpYi10ZXN0czogJChMQVlPVVRMSUJfRklMRVMpCisKKyQoY2FsbCBkaXN0LWZvci1nb2FscywgbGF5b3V0bGliLCAkKGZvcmVhY2ggbSwkKGZvbnRzX2RldmljZSksICQobSk6bGF5b3V0bGliX25hdGl2ZS9mb250cy8kKG5vdGRpciAkKG0pKSkpCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGxheW91dGxpYiwgJChmb3JlYWNoIG0sJChmb250X2NvbmZpZyksICQobSk6bGF5b3V0bGliX25hdGl2ZS9mb250cy8kKG5vdGRpciAkKG0pKSkpCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGxheW91dGxpYiwgJChmb3JlYWNoIG0sJChrZXlib2FyZHMpLCAkKG0pOmxheW91dGxpYl9uYXRpdmUva2V5Ym9hcmRzLyQobm90ZGlyICQobSkpKSkKKyQoY2FsbCBkaXN0LWZvci1nb2FscywgbGF5b3V0bGliLCAkKGZvcmVhY2ggbSwkKGh5cGhlbiksICQobSk6bGF5b3V0bGliX25hdGl2ZS9oeXBoZW4tZGF0YS8kKG5vdGRpciAkKG0pKSkpCisKK0ZPTlRfVEVNUCA6PQorZm9udF9jb25maWcgOj0KK2ZvbnRzX2RldmljZSA6PQorRk9OVF9GSUxFUyA6PQorCisjIFRoZSBmb2xsb3dpbmcgYnVpbGQgcHJvY2VzcyBvZiBidWlsZC5wcm9wLCBsYXlvdXRsaWItcmVzLnppcCBpcyBtb3ZlZCBoZXJlIGZyb20gcmVsZWFzZV9sYXlvdXRsaWIuc2gKKyMgc28gdGhlIFNCT00gb2YgYWxsIHBsYXRmb3JtIG5ldXRyYWwgYXJ0aWZhY3RzIGFuZCBMaW51eC9XaW5kb3dzIGFydGlmYWN0cyBvZiBsYXlvdXRsaWIgY2FuIGJlIGJ1aWx0IGluIE1ha2UvU29vbmcuCisjIFNlZSBnby9sYXlvdXRsaWItc2JvbS4KKworIyBidWlsZC5wcm9wIHNoaXBwZWQgd2l0aCBsYXlvdXRsaWIKK0xBWU9VVExJQl9CVUlMRF9QUk9QIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLGxheW91dGxpYi1idWlsZC1wcm9wLEhPU1QsQ09NTU9OKQorJChMQVlPVVRMSUJfQlVJTERfUFJPUCkvbGF5b3V0bGliLWJ1aWxkLnByb3A6ICQoSU5TVEFMTEVEX1NES19CVUlMRF9QUk9QX1RBUkdFVCkKKwlybSAtcmYgJEAKKwljcCAkPCAkQAorCSMgUmVtb3ZlIGFsbCB0aGUgdW5jb21tb24gYnVpbGQgcHJvcGVydGllcworCXNlZCAtaSAnL15yb1wuXChidWlsZFx8cHJvZHVjdFx8Y29uZmlnXHxzeXN0ZW1cKS8hZCcgJEAKKwkjIE1hcmsgdGhlIGJ1aWxkIGFzIGxheW91dGxpYi4gVGhpcyBjYW4gYmUgcmVhZCBhdCBydW50aW1lIGJ5IGFwcHMKKwlzZWQgLWkgJ3N8cm8ucHJvZHVjdC5icmFuZD1nZW5lcmljfHJvLnByb2R1Y3QuYnJhbmQ9c3R1ZGlvfCcgJEAKKwlzZWQgLWkgJ3N8cm8ucHJvZHVjdC5kZXZpY2U9Z2VuZXJpY3xyby5wcm9kdWN0LmRldmljZT1sYXlvdXRsaWJ8JyAkQAorCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsbGF5b3V0bGliLCQoTEFZT1VUTElCX0JVSUxEX1BST1ApL2xheW91dGxpYi1idWlsZC5wcm9wOmxheW91dGxpYl9uYXRpdmUvYnVpbGQucHJvcCkKKworIyBSZXNvdXJjZSBmaWxlcyBmcm9tIGZyYW1ld29ya3MvYmFzZS9jb3JlL3Jlcy9yZXMKK0xBWU9VVExJQl9SRVMgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsbGF5b3V0bGliLXJlcyxIT1NULENPTU1PTikKK0xBWU9VVExJQl9SRVNfRklMRVMgOj0gJChzaGVsbCBmaW5kIGZyYW1ld29ya3MvYmFzZS9jb3JlL3Jlcy9yZXMgLXR5cGUgZiAtbm90IC1wYXRoICdmcmFtZXdvcmtzL2Jhc2UvY29yZS9yZXMvcmVzL3ZhbHVlcy1tW25jXWMqJyB8IHNvcnQpCitFTVVMQVRFRF9PVkVSTEFZU19GSUxFUyA6PSAkKHNoZWxsIGZpbmQgZnJhbWV3b3Jrcy9iYXNlL3BhY2thZ2VzL292ZXJsYXlzLyovcmVzLyB8IHNvcnQpCitERVZJQ0VfT1ZFUkxBWVNfRklMRVMgOj0gJChzaGVsbCBmaW5kIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL3Bob25lL292ZXJsYXkvZnJhbWV3b3Jrcy9iYXNlL3BhY2thZ2VzL292ZXJsYXlzLyovQW5kcm9pZE92ZXJsYXkvcmVzLyB8IHNvcnQpCiskKExBWU9VVExJQl9SRVMpL2xheW91dGxpYi1yZXMuemlwOiAkKFNPT05HX1pJUCkgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYWFwdDIgJChMQVlPVVRMSUJfUkVTX0ZJTEVTKSAkKEVNVUxBVEVEX09WRVJMQVlTX0ZJTEVTKSAkKERFVklDRV9PVkVSTEFZU19GSUxFUykKKwlybSAtcmYgJEAKKwllY2hvICQoTEFZT1VUTElCX1JFU19GSUxFUykgPiAkKExBWU9VVExJQl9SRVMpL2ZpbGVsaXN0X3Jlcy50eHQKKwkkKFNPT05HX1pJUCkgLUMgZnJhbWV3b3Jrcy9iYXNlL2NvcmUvcmVzIC1sICQoTEFZT1VUTElCX1JFUykvZmlsZWxpc3RfcmVzLnR4dCAtbyAkKExBWU9VVExJQl9SRVMpL3RlbXBfcmVzLnppcAorCWVjaG8gJChFTVVMQVRFRF9PVkVSTEFZU19GSUxFUykgPiAkKExBWU9VVExJQl9SRVMpL2ZpbGVsaXN0X2VtdWxhdGVkX292ZXJsYXlzLnR4dAorCSQoU09PTkdfWklQKSAtQyBmcmFtZXdvcmtzL2Jhc2UvcGFja2FnZXMgLWwgJChMQVlPVVRMSUJfUkVTKS9maWxlbGlzdF9lbXVsYXRlZF9vdmVybGF5cy50eHQgLW8gJChMQVlPVVRMSUJfUkVTKS90ZW1wX2VtdWxhdGVkX292ZXJsYXlzLnppcAorCWVjaG8gJChERVZJQ0VfT1ZFUkxBWVNfRklMRVMpID4gJChMQVlPVVRMSUJfUkVTKS9maWxlbGlzdF9kZXZpY2Vfb3ZlcmxheXMudHh0CisJJChTT09OR19aSVApIC1DIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL3Bob25lL292ZXJsYXkvZnJhbWV3b3Jrcy9iYXNlL3BhY2thZ2VzIC1sICQoTEFZT1VUTElCX1JFUykvZmlsZWxpc3RfZGV2aWNlX292ZXJsYXlzLnR4dCAtbyAkKExBWU9VVExJQl9SRVMpL3RlbXBfZGV2aWNlX292ZXJsYXlzLnppcAorCXJtIC1yZiAkKExBWU9VVExJQl9SRVMpL2RhdGEgJiYgdW56aXAgLXEgLWQgJChMQVlPVVRMSUJfUkVTKS9kYXRhICQoTEFZT1VUTElCX1JFUykvdGVtcF9yZXMuemlwCisJdW56aXAgLXEgLWQgJChMQVlPVVRMSUJfUkVTKS9kYXRhICQoTEFZT1VUTElCX1JFUykvdGVtcF9lbXVsYXRlZF9vdmVybGF5cy56aXAKKwl1bnppcCAtcSAtZCAkKExBWU9VVExJQl9SRVMpL2RhdGEgJChMQVlPVVRMSUJfUkVTKS90ZW1wX2RldmljZV9vdmVybGF5cy56aXAKKwlybSAtcmYgJChMQVlPVVRMSUJfUkVTKS9jb21waWxlZCAmJiBta2RpciAkKExBWU9VVExJQl9SRVMpL2NvbXBpbGVkICYmICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2FhcHQyIGNvbXBpbGUgJChMQVlPVVRMSUJfUkVTKS9kYXRhL3Jlcy8qKi8qLjkucG5nIC1vICQoTEFZT1VUTElCX1JFUykvY29tcGlsZWQKKwlwcmludGYgJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+XG48bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiBwYWNrYWdlPSJjb20uZ29vZ2xlLmFuZHJvaWQubGF5b3V0bGliIiAvPicgPiAkKExBWU9VVExJQl9SRVMpL0FuZHJvaWRNYW5pZmVzdC54bWwKKwkkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hYXB0MiBsaW5rIC1SICQoTEFZT1VUTElCX1JFUykvY29tcGlsZWQvKiAtbyAkKExBWU9VVExJQl9SRVMpL2NvbXBpbGVkLmFwayAtLW1hbmlmZXN0ICQoTEFZT1VUTElCX1JFUykvQW5kcm9pZE1hbmlmZXN0LnhtbAorCXJtIC1yZiAkKExBWU9VVExJQl9SRVMpL2NvbXBpbGVkX2FwayAmJiB1bnppcCAtcSAtZCAkKExBWU9VVExJQl9SRVMpL2NvbXBpbGVkX2FwayAkKExBWU9VVExJQl9SRVMpL2NvbXBpbGVkLmFwaworCWZvciBmIGluICQoTEFZT1VUTElCX1JFUykvY29tcGlsZWRfYXBrL3Jlcy8qOyBkbyBtdiAiJCRmIiAiJCR7Zi8tdjQvfSI7ZG9uZQorCWZvciBmIGluICQoTEFZT1VUTElCX1JFUykvY29tcGlsZWRfYXBrL3Jlcy8qKi8qLjkucG5nOyBkbyBtdiAiJCRmIiAiJCR7Zi8uOS5wbmcvLmNvbXBpbGVkLjkucG5nfSI7ZG9uZQorCWNwIC1yICQoTEFZT1VUTElCX1JFUykvY29tcGlsZWRfYXBrL3JlcyAkKExBWU9VVExJQl9SRVMpL2RhdGEKKwkkKFNPT05HX1pJUCkgLUMgJChMQVlPVVRMSUJfUkVTKS9kYXRhIC1EICQoTEFZT1VUTElCX1JFUykvZGF0YS8gLW8gJEAKKworJChjYWxsIGRpc3QtZm9yLWdvYWxzLGxheW91dGxpYiwkKExBWU9VVExJQl9SRVMpL2xheW91dGxpYi1yZXMuemlwOmxheW91dGxpYl9uYXRpdmUvcmVzLnppcCkKKworIyBTQk9NIG9mIGxheW91dGxpYiBhcnRpZmFjdHMKK0xBWU9VVExJQl9TQk9NIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLGxheW91dGxpYi1zYm9tLEhPU1QpCitfbGF5b3V0bGliX2ZvbnRfY29uZmlnX2ZpbGVzIDo9ICQoc29ydCAkKHdpbGRjYXJkIGZyYW1ld29ya3MvYmFzZS9kYXRhL2ZvbnRzLyoueG1sKSkKK19sYXlvdXRsaWJfZm9udHNfZmlsZXMgOj0gJChmaWx0ZXIgJChUQVJHRVRfT1VUKS9mb250cy8lLnR0ZiAkKFRBUkdFVF9PVVQpL2ZvbnRzLyUudHRjICQoVEFSR0VUX09VVCkvZm9udHMvJS5vdGYsICQoSU5URVJOQUxfU1lTVEVNSU1BR0VfRklMRVMpKQorX2xheW91dGxpYl9rZXlib2FyZF9maWxlcyA6PSAkKHNvcnQgJCh3aWxkY2FyZCBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9rZXlib2FyZHMvKi5rY20pKQorX2xheW91dGxpYl9oeXBoZW5fZmlsZXMgOj0gJChmaWx0ZXIgJChUQVJHRVRfT1VUKS91c3IvaHlwaGVuLWRhdGEvJS5oeWIsICQoSU5URVJOQUxfU1lTVEVNSU1BR0VfRklMRVMpKQorCisjIEZpbmQgb3V0IGZpbGVzIGRpc3RlZCB3aXRoIGxheW91dGxpYiBpbiBTb29uZy4KKyMjIyBGaWx0ZXIgb3V0IHN0YXRpYyBsaWJyYXJpZXMgZm9yIFdpbmRvd3MgYW5kIGZpbGVzIGFscmVhZHkgaGFuZGxlZCBpbiBtYWtlLgorX2xheW91dGxpYl9maWx0ZXJfb3V0X2Rpc3RlZCA6PSAkKGFkZHByZWZpeCBsYXlvdXRsaWJfbmF0aXZlLyxmb250cy8lIGtleWJvYXJkcy8lIGJ1aWxkLnByb3AgcmVzLnppcCB3aW5kb3dzLyUuYSkKK19sYXlvdXRsaWJfZmlsZXNfZGlzdGVkX2J5X3Nvb25nIDo9IFwKKyAgJChzdHJpcCBcCisgICAgJChmb3JlYWNoIHAsJChfYWxsX2Rpc3Rfc3JjX2RzdF9wYWlycyksIFwKKyAgICAgICQoaWYgJChmaWx0ZXItb3V0ICQoX2xheW91dGxpYl9maWx0ZXJfb3V0X2Rpc3RlZCksJChmaWx0ZXIgbGF5b3V0bGliX25hdGl2ZS8lIGxheW91dGxpYi5qYXIsJChjYWxsIHdvcmQtY29sb24sMiwkcCkpKSwkcCkpKQorCiskKExBWU9VVExJQl9TQk9NKS9zYm9tLW1ldGFkYXRhLmNzdjoKKwlybSAtcmYgJEAKKwllY2hvIGluc3RhbGxlZF9maWxlLG1vZHVsZV9wYXRoLHNvb25nX21vZHVsZV90eXBlLGlzX3ByZWJ1aWx0X21ha2VfbW9kdWxlLHByb2R1Y3RfY29weV9maWxlcyxrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMsaXNfcGxhdGZvcm1fZ2VuZXJhdGVkLGJ1aWxkX291dHB1dF9wYXRoLHN0YXRpY19saWJyYXJpZXMsd2hvbGVfc3RhdGljX2xpYnJhcmllcyxpc19zdGF0aWNfbGliID4+ICRACisJZWNobyBidWlsZC5wcm9wLCwsLCwsWSwkKExBWU9VVExJQl9CVUlMRF9QUk9QKS9sYXlvdXRsaWItYnVpbGQucHJvcCwsLCA+PiAkQAorCisJJChmb3JlYWNoIGYsJChfbGF5b3V0bGliX2ZvbnRfY29uZmlnX2ZpbGVzKSxcCisJICBlY2hvIGRhdGEvZm9udHMvJChub3RkaXIgJGYpLGZyYW1ld29ya3MvYmFzZS9kYXRhL2ZvbnRzLHByZWJ1aWx0X2V0YywsLCwsJGYsLCwgPj4gJEA7IFwKKwkpCisKKwkkKGZvcmVhY2ggZiwkKF9sYXlvdXRsaWJfZm9udHNfZmlsZXMpLCBcCisJICAkKGV2YWwgX21vZHVsZV9uYW1lIDo9ICQoQUxMX0lOU1RBTExFRF9GSUxFUy4kZikpIFwKKwkgICQoZXZhbCBfbW9kdWxlX3BhdGggOj0gJChzdHJpcCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKF9tb2R1bGVfbmFtZSkuUEFUSCkpKSkgXAorCSAgJChldmFsIF9zb29uZ19tb2R1bGVfdHlwZSA6PSAkKHN0cmlwICQoc29ydCAkKEFMTF9NT0RVTEVTLiQoX21vZHVsZV9uYW1lKS5TT09OR19NT0RVTEVfVFlQRSkpKSkgXAorCSAgZWNobyBkYXRhL2ZvbnRzLyQobm90ZGlyICRmKSwkKF9tb2R1bGVfcGF0aCksJChfc29vbmdfbW9kdWxlX3R5cGUpLCwsLCwkZiwsLCA+PiAkQDsgXAorCSkKKworCSQoZm9yZWFjaCBmLCQoX2xheW91dGxpYl9rZXlib2FyZF9maWxlcyksIFwKKwkgIGVjaG8gZGF0YS9rZXlib2FyZHMvJChub3RkaXIgJGYpLGZyYW1ld29ya3MvYmFzZS9kYXRhL2tleWJvYXJkcyxwcmVidWlsdF9ldGMsLCwsLCRmLCwsID4+ICRAOyBcCisJKQorCisJJChmb3JlYWNoIGYsJChfbGF5b3V0bGliX2h5cGhlbl9maWxlcyksIFwKKwkgICQoZXZhbCBfbW9kdWxlX25hbWUgOj0gJChBTExfSU5TVEFMTEVEX0ZJTEVTLiRmKSkgXAorCSAgJChldmFsIF9tb2R1bGVfcGF0aCA6PSAkKHN0cmlwICQoc29ydCAkKEFMTF9NT0RVTEVTLiQoX21vZHVsZV9uYW1lKS5QQVRIKSkpKSBcCisJICAkKGV2YWwgX3Nvb25nX21vZHVsZV90eXBlIDo9ICQoc3RyaXAgJChzb3J0ICQoQUxMX01PRFVMRVMuJChfbW9kdWxlX25hbWUpLlNPT05HX01PRFVMRV9UWVBFKSkpKSBcCisJICBlY2hvIGRhdGEvaHlwaGVuLWRhdGEvJChub3RkaXIgJGYpLCQoX21vZHVsZV9wYXRoKSwkKF9zb29uZ19tb2R1bGVfdHlwZSksLCwsLCRmLCwsID4+ICRAOyBcCisJKQorCisJJChmb3JlYWNoIGYsJChfbGF5b3V0bGliX2ZpbGVzX2Rpc3RlZF9ieV9zb29uZyksIFwKKwkgICQoZXZhbCBfcHJlYnVpbHRfbW9kdWxlX2ZpbGUgOj0gJChjYWxsIHdvcmQtY29sb24sMSwkZikpIFwKKwkgICQoZXZhbCBfZGlzdF9maWxlIDo9ICQoY2FsbCB3b3JkLWNvbG9uLDIsJGYpKSBcCisJICAkKGV2YWwgX2Rpc3RfZmlsZSA6PSAkKHBhdHN1YnN0IGRhdGEvd2luZG93cy8lLGRhdGEvd2luL2xpYjY0LyUsJChwYXRzdWJzdCBsYXlvdXRsaWJfbmF0aXZlLyUsZGF0YS8lLCQoX2Rpc3RfZmlsZSkpKSkgXAorCSAgJChldmFsIF9kaXN0X2ZpbGUgOj0gJChzdWJzdCBsYXlvdXRsaWIuamFyLGRhdGEvbGF5b3V0bGliLmphciwkKF9kaXN0X2ZpbGUpKSkgXAorCSAgJChldmFsIF9tb2R1bGVfbmFtZSA6PSAkKHN0cmlwICQoZm9yZWFjaCBtLCQoQUxMX01PRFVMRVMpLCQoaWYgJChmaWx0ZXIgJChfcHJlYnVpbHRfbW9kdWxlX2ZpbGUpLCQoQUxMX01PRFVMRVMuJG0uQ0hFQ0tFRCkpLCRtKSkpKSBcCisJICAkKGV2YWwgX21vZHVsZV9wYXRoIDo9ICQoc3RyaXAgJChzb3J0ICQoQUxMX01PRFVMRVMuJChfbW9kdWxlX25hbWUpLlBBVEgpKSkpIFwKKwkgICQoZXZhbCBfc29vbmdfbW9kdWxlX3R5cGUgOj0gJChzdHJpcCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKF9tb2R1bGVfbmFtZSkuU09PTkdfTU9EVUxFX1RZUEUpKSkpIFwKKwkgIGVjaG8gJChwYXRzdWJzdCBsYXlvdXRsaWJfbmF0aXZlLyUsJSwkKF9kaXN0X2ZpbGUpKSwkKF9tb2R1bGVfcGF0aCksJChfc29vbmdfbW9kdWxlX3R5cGUpLCwsLCwkKF9wcmVidWlsdF9tb2R1bGVfZmlsZSksLCwgPj4gJEA7IFwKKwkpCisKKwkkKGZvcmVhY2ggZiwkKExBWU9VVExJQl9SRVNfRklMRVMpLCBcCisJICAkKGV2YWwgX3BhdGggOj0gJChzdWJzdCBmcmFtZXdvcmtzL2Jhc2UvY29yZS9yZXMsZGF0YSwkZikpIFwKKwkgIGVjaG8gJChfcGF0aCksLCwsLCxZLCRmLCwsID4+ICRAOyBcCisJKQorCisJJChmb3JlYWNoIGYsJChFTVVMQVRFRF9PVkVSTEFZU19GSUxFUyksIFwKKwkgICQoZXZhbCBfcGF0aCA6PSAkKHN1YnN0IGZyYW1ld29ya3MvYmFzZS9wYWNrYWdlcyxkYXRhLCRmKSkgXAorCSAgZWNobyAkKF9wYXRoKSwsLCwsLFksJGYsLCwgPj4gJEA7IFwKKwkpCisKKwkkKGZvcmVhY2ggZiwkKERFVklDRV9PVkVSTEFZU19GSUxFUyksIFwKKwkgICQoZXZhbCBfcGF0aCA6PSAkKHN1YnN0IGRldmljZS9nZW5lcmljL2dvbGRmaXNoL3Bob25lL292ZXJsYXkvZnJhbWV3b3Jrcy9iYXNlL3BhY2thZ2VzLGRhdGEsJGYpKSBcCisJICBlY2hvICQoX3BhdGgpLCwsLCwsWSwkZiwsLCA+PiAkQDsgXAorCSkKKworLlBIT05ZOiBsYXlvdXRsaWItc2JvbQorbGF5b3V0bGliLXNib206ICQoTEFZT1VUTElCX1NCT00pL2xheW91dGxpYi5zcGR4Lmpzb24KKyQoTEFZT1VUTElCX1NCT00pL2xheW91dGxpYi5zcGR4Lmpzb246ICQoUFJPRFVDVF9PVVQpL2Fsd2F5c19kaXJ0eV9maWxlLnR4dCAkKEdFTl9TQk9NKSAkKExBWU9VVExJQl9TQk9NKS9zYm9tLW1ldGFkYXRhLmNzdiAkKF9sYXlvdXRsaWJfZm9udF9jb25maWdfZmlsZXMpICQoX2xheW91dGxpYl9mb250c19maWxlcykgJChMQVlPVVRMSUJfQlVJTERfUFJPUCkvbGF5b3V0bGliLWJ1aWxkLnByb3AgJChfbGF5b3V0bGliX2tleWJvYXJkX2ZpbGVzKSAkKF9sYXlvdXRsaWJfaHlwaGVuX2ZpbGVzKSAkKExBWU9VVExJQl9SRVNfRklMRVMpICQoRU1VTEFURURfT1ZFUkxBWVNfRklMRVMpICQoREVWSUNFX09WRVJMQVlTX0ZJTEVTKQorCXJtIC1yZiAkQAorCSQoR0VOX1NCT00pIC0tb3V0cHV0X2ZpbGUgJEAgLS1tZXRhZGF0YSAkKExBWU9VVExJQl9TQk9NKS9zYm9tLW1ldGFkYXRhLmNzdiAtLWJ1aWxkX3ZlcnNpb24gJChCVUlMRF9GSU5HRVJQUklOVF9GUk9NX0ZJTEUpIC0tcHJvZHVjdF9tZnIgIiQoUFJPRFVDVF9NQU5VRkFDVFVSRVIpIiAtLW1vZHVsZV9uYW1lICJsYXlvdXRsaWIiIC0tanNvbgorCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsbGF5b3V0bGliLCQoTEFZT1VUTElCX1NCT00pL2xheW91dGxpYi5zcGR4Lmpzb246bGF5b3V0bGliX25hdGl2ZS9zYm9tL2xheW91dGxpYi5zcGR4Lmpzb24pCisKKyMgR2VuZXJhdGUgU0JPTSBvZiBmcmFtZXdvcmtfcmVzLmphciB0aGF0IGlzIGNyZWF0ZWQgaW4gcmVsZWFzZV9sYXlvdXRsaWIuc2guCisjIFRoZSBnZW5lcmF0ZWQgU0JPTSBjb250YWlucyBwbGFjZWhvbGRlcnMgZm9yIHJlbGVhc2VfbGF5b3V0bGliLnNoIHRvIHN1YnN0aXR1dGUsIGFuZCB0aGUgcGxhY2Vob2xkZXJzIGluY2x1ZGU6CisjIGRvY3VtZW50IG5hbWUsIGRvY3VtZW50IG5hbWVzcGFjZSwgZG9jdW1lbnQgY3JlYXRpb24gaW5mbywgb3JnYW5pemF0aW9uIGFuZCBTSEExIHZhbHVlIG9mIGZyYW1ld29ya19yZXMuamFyLgorR0VOX1NCT01fRlJBTUVXT1JLX1JFUyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9nZW5lcmF0ZS1zYm9tLWZyYW1ld29ya19yZXMKKy5QSE9OWTogbGF5b3V0bGliLWZyYW1ld29ya19yZXMtc2JvbQorbGF5b3V0bGliLWZyYW1ld29ya19yZXMtc2JvbTogJChMQVlPVVRMSUJfU0JPTSkvZnJhbWV3b3JrX3Jlcy5qYXIuc3BkeC5qc29uCiskKExBWU9VVExJQl9TQk9NKS9mcmFtZXdvcmtfcmVzLmphci5zcGR4Lmpzb246ICQoTEFZT1VUTElCX1NCT00pL2xheW91dGxpYi5zcGR4Lmpzb24gJChHRU5fU0JPTV9GUkFNRVdPUktfUkVTKQorCXJtIC1yZiAkQAorCSQoR0VOX1NCT01fRlJBTUVXT1JLX1JFUykgLS1vdXRwdXRfZmlsZSAkKExBWU9VVExJQl9TQk9NKS9mcmFtZXdvcmtfcmVzLmphci5zcGR4Lmpzb24gLS1sYXlvdXRsaWJfc2JvbSAkKExBWU9VVExJQl9TQk9NKS9sYXlvdXRsaWIuc3BkeC5qc29uCisKKyQoY2FsbCBkaXN0LWZvci1nb2FscyxsYXlvdXRsaWIsJChMQVlPVVRMSUJfU0JPTSkvZnJhbWV3b3JrX3Jlcy5qYXIuc3BkeC5qc29uOmxheW91dGxpYl9uYXRpdmUvc2JvbS9mcmFtZXdvcmtfcmVzLmphci5zcGR4Lmpzb24pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9sYXlvdXRsaWJfZm9udHMubWsgYi9jb3JlL2xheW91dGxpYl9mb250cy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJhODE0Zi4uMDAwMDAwMAotLS0gYS9jb3JlL2xheW91dGxpYl9mb250cy5taworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMgRm9udHMgZm9yIGxheW91dGxpYgotCi1GT05UX1RFTVAgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsZm9udHMsSE9TVCxDT01NT04pCi0KLSMgVGhlIGZvbnQgY29uZmlndXJhdGlvbiBmaWxlcyAtIHN5c3RlbV9mb250cy54bWwsIGZhbGxiYWNrX2ZvbnRzLnhtbCBldGMuCi1mb250X2NvbmZpZyA6PSAkKHNvcnQgJCh3aWxkY2FyZCBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9mb250cy8qLnhtbCkpCi1mb250X2NvbmZpZyA6PSAkKGFkZHByZWZpeCAkKEZPTlRfVEVNUCkvLCAkKG5vdGRpciAkKGZvbnRfY29uZmlnKSkpCi0KLSQoZm9udF9jb25maWcpOiAkKEZPTlRfVEVNUCkvJS54bWw6IFwKLQkJCWZyYW1ld29ya3MvYmFzZS9kYXRhL2ZvbnRzLyUueG1sCi0JJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkKLQkkKGhpZGUpIGNwIC12ZiAkPCAkQAotCi0jIExpc3Qgb2YgZm9udHMgb24gdGhlIGRldmljZSB0aGF0IHdlIHdhbnQgdG8gc2hpcC4gVGhpcyBpcyBhbGwgLnR0ZiwgLnR0YyBhbmQgLm90ZiBmb250cy4KLWZvbnRzX2RldmljZSA6PSAkKGZpbHRlciAkKFRBUkdFVF9PVVQpL2ZvbnRzLyUudHRmICQoVEFSR0VUX09VVCkvZm9udHMvJS50dGMgJChUQVJHRVRfT1VUKS9mb250cy8lLm90ZiwgJChJTlRFUk5BTF9TWVNURU1JTUFHRV9GSUxFUykpCi1mb250c19kZXZpY2UgOj0gJChhZGRwcmVmaXggJChGT05UX1RFTVApLywgJChub3RkaXIgJChmb250c19kZXZpY2UpKSkKLQotIyBUT0RPOiBJZiB0aGUgZm9udCBmaWxlIGlzIGEgc3ltbGluaywgcmV1c2UgdGhlIGZvbnQgcmVuYW1lZCBmcm9tIHRoZSBzeW1saW5rCi0jIHRhcmdldC4KLSQoZm9udHNfZGV2aWNlKTogJChGT05UX1RFTVApLyU6ICQoVEFSR0VUX09VVCkvZm9udHMvJQotCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCi0JJChoaWRlKSBjcCAtdmYgJDwgJEAKLQotIyBMaXN0IG9mIGFsbCBkZXBlbmRlbmNpZXMgLSBhbGwgZm9udHMgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi1GT05UX0ZJTEVTIDo9ICQoZm9udHNfZGV2aWNlKSAkKGZvbnRfY29uZmlnKQotCi0uUEhPTlk6IGxheW91dGxpYiBsYXlvdXRsaWItdGVzdHMKLWxheW91dGxpYiBsYXlvdXRsaWItdGVzdHM6ICQoRk9OVF9GSUxFUykKLQotJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBsYXlvdXRsaWIsICQoZm9yZWFjaCBtLCQoRk9OVF9GSUxFUyksICQobSk6bGF5b3V0bGliX25hdGl2ZS9mb250cy8kKG5vdGRpciAkKG0pKSkpCi0KLUZPTlRfVEVNUCA6PQotZm9udF9jb25maWcgOj0KLWZvbnRzX2RldmljZSA6PQotRk9OVF9GSUxFUyA6PQpkaWZmIC0tZ2l0IGEvY29yZS9sb2NhbF9jdXJyZW50X3Nkay5tayBiL2NvcmUvbG9jYWxfY3VycmVudF9zZGsubWsKaW5kZXggZWE3ZGE4YS4uY2NkYmY3NyAxMDA2NDQKLS0tIGEvY29yZS9sb2NhbF9jdXJyZW50X3Nkay5taworKysgYi9jb3JlL2xvY2FsX2N1cnJlbnRfc2RrLm1rCkBAIC0xNCwxMyArMTQsMjQgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiBpZmRlZiBCT0FSRF9DVVJSRU5UX0FQSV9MRVZFTF9GT1JfVkVORE9SX01PRFVMRVMKLSAgaWZuZXEgKGN1cnJlbnQsJChCT0FSRF9DVVJSRU5UX0FQSV9MRVZFTF9GT1JfVkVORE9SX01PRFVMRVMpKQorICBfb3ZlcnJpZGVfdG8gOj0gJChCT0FSRF9DVVJSRU5UX0FQSV9MRVZFTF9GT1JfVkVORE9SX01PRFVMRVMpCisKKyAgIyBiLzMxNDAxMTA3NTogYXBrcyBhbmQgamFycyBpbiB0aGUgdmVuZG9yIG9yIG9kbSBwYXJ0aXRpb25zIGNhbm5vdCB1c2UKKyAgIyBzeXN0ZW0gU0RLIDM1IGFuZCBiZXlvbmQuIEluIG9yZGVyIG5vdCB0byBzdWRkZW5seSBicmVhayB0aG9zZSB2ZW5kb3IKKyAgIyBtb2R1bGVzIHVzaW5nIGN1cnJlbnQgb3Igc3lzdGVtX2N1cnJlbnQgYXMgdGhlaXIgTE9DQUxfU0RLX1ZFUlNJT04sCisgICMgb3ZlcnJpZGUgaXQgdG8gMzQsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIEFQSSBsZXZlbCBhbGxvd2VkIGZvciB0aGVtLgorICBpZm5lcSAoLCQoZmlsdGVyIEpBVkFfTElCUkFSSUVTIEFQUFMsJChMT0NBTF9NT0RVTEVfQ0xBU1MpKSkKKyAgICBfb3ZlcnJpZGVfdG8gOj0gMzQKKyAgZW5kaWYKKworICBpZm5lcSAoY3VycmVudCwkKF9vdmVycmlkZV90bykpCiAgICAgaWZuZXEgKCwkKGZpbHRlciB0cnVlLCQoTE9DQUxfVkVORE9SX01PRFVMRSkgJChMT0NBTF9PRE1fTU9EVUxFKSAkKExPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSkpKQogICAgICAgaWZlcSAoY3VycmVudCwkKExPQ0FMX1NES19WRVJTSU9OKSkKLSAgICAgICAgTE9DQUxfU0RLX1ZFUlNJT04gOj0gJChCT0FSRF9DVVJSRU5UX0FQSV9MRVZFTF9GT1JfVkVORE9SX01PRFVMRVMpCisgICAgICAgIExPQ0FMX1NES19WRVJTSU9OIDo9ICQoX292ZXJyaWRlX3RvKQogICAgICAgZWxzZSBpZmVxIChzeXN0ZW1fY3VycmVudCwkKExPQ0FMX1NES19WRVJTSU9OKSkKLSAgICAgICAgTE9DQUxfU0RLX1ZFUlNJT04gOj0gc3lzdGVtXyQoQk9BUkRfQ1VSUkVOVF9BUElfTEVWRUxfRk9SX1ZFTkRPUl9NT0RVTEVTKQorICAgICAgICBMT0NBTF9TREtfVkVSU0lPTiA6PSBzeXN0ZW1fJChfb3ZlcnJpZGVfdG8pCiAgICAgICBlbmRpZgogICAgIGVuZGlmCiAgIGVuZGlmCisgIF9vdmVycmlkZV90byA6PQogZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvbG9jYWxfc3lzdGVtc2RrLm1rIGIvY29yZS9sb2NhbF9zeXN0ZW1zZGsubWsKaW5kZXggNDYwMDczZC4uMzMwN2U3MiAxMDA2NDQKLS0tIGEvY29yZS9sb2NhbF9zeXN0ZW1zZGsubWsKKysrIGIvY29yZS9sb2NhbF9zeXN0ZW1zZGsubWsKQEAgLTMzLDYgKzMzLDkgQEAKICAgICAgICAgICAjIFJ1bnRpbWUgcmVzb3VyY2Ugb3ZlcmxheXMgYXJlIGV4ZW1wdGVkIGZyb20gYnVpbGRpbmcgYWdhaW5zdCBTeXN0ZW0gU0RLLgogICAgICAgICAgICMgVE9ETyhiLzE1NTAyNzAxOSk6IHJlbW92ZSB0aGlzLCBhZnRlciBubyBwcm9kdWN0L3ZlbmRvciBhcHBzIHJlbHkgb24gdGhpcyBiZWhhdmlvci4KICAgICAgICAgICBMT0NBTF9TREtfVkVSU0lPTiA6PSBzeXN0ZW1fY3VycmVudAorICAgICAgICAgICMgV2UgaGF2ZSBydW4gYmVsb3cgYWdhaW4gc2luY2UgTE9DQUxfU0RLX1ZFUlNJT04gaXMgbmV3bHkgc2V0IGFuZCB0aGUgIl9jdXJyZW50IgorICAgICAgICAgICMgbWF5IGhhdmUgdG8gYmUgdXBkYXRlZAorICAgICAgICAgIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2xvY2FsX2N1cnJlbnRfc2RrLm1rCiAgICAgICAgIGVuZGlmCiAgICAgICBlbmRpZgogICAgIGVuZGlmCkBAIC01NCwxMCArNTcsMzUgQEAKICAgICAjIElmIG5vdCwgdmVuZG9yIGFwa3MgYXJlIHRyZWF0ZWQgZXF1YWxseSB0byBzeXN0ZW0gYXBwcwogICAgIF9zdXBwb3J0ZWRfc3lzdGVtc2RrX3ZlcnNpb25zIDo9ICQoUExBVEZPUk1fU1lTVEVNU0RLX1ZFUlNJT05TKQogICBlbmRpZgorCisgICMgYi8zMTQwMTEwNzU6IGFwa3MgYW5kIGphcnMgaW4gdGhlIHZlbmRvciBvciBvZG0gcGFydGl0aW9ucyBjYW5ub3QgdXNlIHN5c3RlbSBTREsgMzUgYW5kIGJleW9uZC4KKyAgIyBUaGlzIGlzIHRvIGRpc2NvdXJhZ2UgdGhlIHVzZSBvZiBKYXZhIEFQSXMgaW4gdGhlIHBhcnRpdGlvbnMsIHdoaWNoIGhhc24ndCBiZWVuIHN1cHBvcnRlZCBzaW5jZQorICAjIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHByb2plY3QgVHJlYmxlIGJhY2sgaW4gQW5kcm9pZCAxMC4gVWx0aW1hdGVseSwgd2UnZCBsaWtlIHRvIGNvbXBsZXRlbHkKKyAgIyBkaXNhbGxvdyBhbnkgSmF2YSBBUEkgaW4gdGhlIHBhcnRpdGlvbnMsIGJ1dCBpdCBzaGFsbCBiZSBkb25lIHByb2dyZXNzaXZlbHkuCisgIGlmbmVxICgsJChmaWx0ZXIgdHJ1ZSwkKExPQ0FMX1ZFTkRPUl9NT0RVTEUpICQoTE9DQUxfT0RNX01PRFVMRSkgJChMT0NBTF9QUk9QUklFVEFSWV9NT0RVTEUpKSkKKyAgICAjIDI4IGlzIHRoZSBBUEkgbGV2ZWwgd2hlbiBCT0FSRF9TWVNURU1TREtfVkVSU0lPTlMgd2FzIGludHJvZHVjZWQuIFNvLCBpdCdzIHRoZSBvbGRzZXQgQVBJCisgICAgIyB3ZSBhbGxvdy4KKyAgICBfc3VwcG9ydGVkX3N5c3RlbXNka192ZXJzaW9ucyA6PSAkKGNhbGwgaW50X3JhbmdlX2xpc3QsIDI4LCAzNCkKKyAgZW5kaWYKKworICAjIEV4dHJhY3QgdmVyc2lvbiBudW1iZXIgZnJvbSBMT0NBTF9TREtfVkVSU0lPTiAoZXg6IHN5c3RlbV8zNCAtPiAzNCkKICAgX3N5c3RlbV9zZGtfdmVyc2lvbiA6PSAkKGNhbGwgZ2V0LW51bWVyaWMtc2RrLXZlcnNpb24sJChMT0NBTF9TREtfVkVSU0lPTikpCisgICMgSG93ZXZlciwgdGhlIGV4dHJhY3Rpb24gbWF5IGZhaWwgaWYgaXQgZG9lc24ndCBoYXZlIGFueSBudW1iZXIgKGkuZS4gY3VycmVudCwgY29yZV9jdXJyZW50LAorICAjIHN5c3RlbV9jdXJyZW50LCBvciBzaW1pbGFyKSBUaGVuIHVzZSB0aGUgbGF0ZXN0IHBsYXRmb3JtIFNESyB2ZXJzaW9uIG51bWJlciBvciB0aGUgYWN0dWFsCisgICMgY29kZW5hbWUuCisgIGlmZXEgKCwkKF9zeXN0ZW1fc2RrX3ZlcnNpb24pCisgICAgaWZlcSAoUkVMLCQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkpCisgICAgICBfc3lzdGVtX3Nka192ZXJzaW9uIDo9ICQoUExBVEZPUk1fU0RLX1ZFUlNJT04pCisgICAgZWxzZQorICAgICAgX3N5c3RlbV9zZGtfdmVyc2lvbiA6PSAkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUpCisgICAgZW5kaWYKKyAgZW5kaWYKKwogICBpZm5lcSAoJChfc3lzdGVtX3Nka192ZXJzaW9uKSwkKGZpbHRlciAkKF9zeXN0ZW1fc2RrX3ZlcnNpb24pLCQoX3N1cHBvcnRlZF9zeXN0ZW1zZGtfdmVyc2lvbnMpKSkKLSAgICAkKGNhbGwgcHJldHR5LWVycm9yLEluY29tcGF0aWJsZSBMT0NBTF9TREtfVkVSU0lPTiAnJChMT0NBTF9TREtfVkVSU0lPTiknLiBcCi0gICAgICAgICAgIFN5c3RlbSBTREsgdmVyc2lvbiAnJChfc3lzdGVtX3Nka192ZXJzaW9uKScgaXMgbm90IHN1cHBvcnRlZC4gU3VwcG9ydGVkIHZlcnNpb25zIGFyZTogJChfc3VwcG9ydGVkX3N5c3RlbXNka192ZXJzaW9ucykpCisgICAgaWZuZXEgKHRydWUsJChCVUlMRF9CUk9LRU5fRE9OVF9DSEVDS19TWVNURU1TREspCisgICAgICAkKGNhbGwgcHJldHR5LWVycm9yLEluY29tcGF0aWJsZSBMT0NBTF9TREtfVkVSU0lPTiAnJChMT0NBTF9TREtfVkVSU0lPTiknLiBcCisgICAgICAgICAgICAgU3lzdGVtIFNESyB2ZXJzaW9uICckKF9zeXN0ZW1fc2RrX3ZlcnNpb24pJyBpcyBub3Qgc3VwcG9ydGVkLiBTdXBwb3J0ZWQgdmVyc2lvbnMgYXJlOiAkKF9zdXBwb3J0ZWRfc3lzdGVtc2RrX3ZlcnNpb25zKSkKKyAgICBlbmRpZgogICBlbmRpZgogICBfc3lzdGVtX3Nka192ZXJzaW9uIDo9CiAgIF9zdXBwb3J0ZWRfc3lzdGVtc2RrX3ZlcnNpb25zIDo9CmRpZmYgLS1naXQgYS9jb3JlL2xvY2FsX3ZlbmRvcl9wcm9kdWN0Lm1rIGIvY29yZS9sb2NhbF92ZW5kb3JfcHJvZHVjdC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTk4MmNkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sb2NhbF92ZW5kb3JfcHJvZHVjdC5tawpAQCAtMCwwICsxLDIyIEBACisjIExPQ0FMX1VTRV9WTkRLIGlzIG5vdCB0aGUgdmFyaWFibGUgd2hpY2ggc2V0IGJ5IG1vZHVsZSBkaXJlY3RseSwgYnV0IHRoZXJlIGFyZSBzb21lIG1vZHVsZXMgZG8gc28uCisjIFNldCB0aG9zZSBhcyBMT0NBTF9JTl9WRU5ET1IgdG8gbWFrZSB0aG9zZSBtb2R1bGVzIHdvcmsgYXMgZXhwZWN0ZWQuCitpZmVxICh0cnVlLCQoTE9DQUxfVVNFX1ZOREspKQorICAkKHdhcm5pbmcgTE9DQUxfVVNFX1ZOREsgbXVzdCBub3QgYmUgdXNlZC4gUGxlYXNlIHVzZSBMT0NBTF9WRU5ET1JfTU9EVUxFIG9yIExPQ0FMX1BST0RVQ1RfTU9EVUxFIGluc3RlYWQuKQorICBMT0NBTF9JTl9WRU5ET1I6PXRydWUKK2VuZGlmCisKKyMgU2V0IExPQ0FMX0lOX1ZFTkRPUiBmb3IgbW9kdWxlcyBnb2luZyBpbnRvIHZlbmRvciBvciBvZG0gcGFydGl0aW9uIGFuZCBMT0NBTF9JTl9QUk9EVUNUIGZvciBwcm9kdWN0CisjIGV4Y2VwdCBmb3IgaG9zdCBtb2R1bGVzLiBJZiBMT0NBTF9TREtfVkVSU0lPTiBpcyBzZXQsIHRoYXRzIGEgbW9yZSByZXN0cmljdGl2ZSBzZXQsIHNvIHRoZXkgZG9uJ3QgbmVlZAorIyBMT0NBTF9JTl9WRU5ET1Igb3IgTE9DQUxfSU5fUFJPRFVDVAoraWZuZGVmIExPQ0FMX0lTX0hPU1RfTU9EVUxFCitpZm5kZWYgTE9DQUxfU0RLX1ZFUlNJT04KKyAgaWZuZXEgKCwkKGZpbHRlciB0cnVlLCQoTE9DQUxfVkVORE9SX01PRFVMRSkgJChMT0NBTF9PRE1fTU9EVUxFKSAkKExPQ0FMX09FTV9NT0RVTEUpICQoTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFKSkpCisgICAgTE9DQUxfSU5fVkVORE9SOj10cnVlCisgICAgIyBOb3RlOiBubyBuZWVkIHRvIGNoZWNrIExPQ0FMX01PRFVMRV9QQVRIKiBzaW5jZSBMT0NBTF9bVkVORE9SfE9ETXxPRU1dX01PRFVMRSBpcyBhbHJlYWR5CisgICAgIyBzZXQgY29ycmVjdGx5IGJlZm9yZSB0aGlzIGlzIGluY2x1ZGVkLgorICBlbmRpZgorICBpZmVxICh0cnVlLCQoTE9DQUxfUFJPRFVDVF9NT0RVTEUpKQorICAgIExPQ0FMX0lOX1BST0RVQ1Q6PXRydWUKKyAgZW5kaWYKK2VuZGlmCitlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9sb2NhbF92bmRrLm1rIGIvY29yZS9sb2NhbF92bmRrLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWZiYzU5Li4wMDAwMDAwCi0tLSBhL2NvcmUvbG9jYWxfdm5kay5taworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLQotI1NldCBMT0NBTF9VU0VfVk5ESyBmb3IgbW9kdWxlcyBnb2luZyBpbnRvIHByb2R1Y3QsIHZlbmRvciBvciBvZG0gcGFydGl0aW9uLCBleGNlcHQgZm9yIGhvc3QgbW9kdWxlcwotI0lmIExPQ0FMX1NES19WRVJTSU9OIGlzIHNldCwgdGhhdHMgYSBtb3JlIHJlc3RyaWN0aXZlIHNldCwgc28gdGhleSBkb250IG5lZWQgTE9DQUxfVVNFX1ZOREsKLWlmbmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQotaWZuZGVmIExPQ0FMX1NES19WRVJTSU9OCi0gIGlmbmVxICgsJChmaWx0ZXIgdHJ1ZSwkKExPQ0FMX1ZFTkRPUl9NT0RVTEUpICQoTE9DQUxfT0RNX01PRFVMRSkgJChMT0NBTF9PRU1fTU9EVUxFKSAkKExPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSkpKQotICAgIExPQ0FMX1VTRV9WTkRLOj10cnVlCi0gICAgTE9DQUxfVVNFX1ZOREtfVkVORE9SOj10cnVlCi0gICAgIyBOb3RlOiBubyBuZWVkIHRvIGNoZWNrIExPQ0FMX01PRFVMRV9QQVRIKiBzaW5jZSBMT0NBTF9bVkVORE9SfE9ETXxPRU1dX01PRFVMRSBpcyBhbHJlYWR5Ci0gICAgIyBzZXQgY29ycmVjdGx5IGJlZm9yZSB0aGlzIGlzIGluY2x1ZGVkLgotICBlbmRpZgotICBpZmRlZiBQUk9EVUNUX1BST0RVQ1RfVk5ES19WRVJTSU9OCi0gICAgIyBQcm9kdWN0IG1vZHVsZXMgYWxzbyB1c2UgVk5ESyB3aGVuIFBST0RVQ1RfUFJPRFVDVF9WTkRLX1ZFUlNJT04gaXMgZGVmaW5lZC4KLSAgICBpZmVxICh0cnVlLCQoTE9DQUxfUFJPRFVDVF9NT0RVTEUpKQotICAgICAgTE9DQUxfVVNFX1ZOREs6PXRydWUKLSAgICAgIExPQ0FMX1VTRV9WTkRLX1BST0RVQ1Q6PXRydWUKLSAgICBlbmRpZgotICBlbmRpZgotZW5kaWYKLWVuZGlmCi0KLSMgVmVyaWZ5IExPQ0FMX1VTRV9WTkRLIHVzYWdlLCBhbmQgc2V0IExPQ0FMX1NES19WRVJTSU9OIGlmIG5lY2Vzc2FyeQotCi1pZmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQotICBpZmRlZiBMT0NBTF9VU0VfVk5ESwotICAgICQoc2hlbGwgZWNobyAkKExPQ0FMX01PRFVMRV9NQUtFRklMRSk6ICQoTE9DQUxfTU9EVUxFKTogRG8gbm90IHVzZSBMT0NBTF9VU0VfVk5ESyB3aXRoIGhvc3QgbW9kdWxlcyA+JjIpCi0gICAgJChlcnJvciBkb25lKQotICBlbmRpZgotZW5kaWYKLWlmZGVmIExPQ0FMX1VTRV9WTkRLCi0gIGlmbmVxICgkKExPQ0FMX1VTRV9WTkRLKSx0cnVlKQotICAgICQoc2hlbGwgZWNobyAnJChMT0NBTF9NT0RVTEVfTUFLRUZJTEUpOiAkKExPQ0FMX01PRFVMRSk6IExPQ0FMX1VTRV9WTkRLIG11c3QgYmUgInRydWUiIG9yIGVtcHR5LCBub3QgIiQoTE9DQUxfVVNFX1ZOREspIicgPiYyKQotICAgICQoZXJyb3IgZG9uZSkKLSAgZW5kaWYKLQotICBpZmRlZiBMT0NBTF9TREtfVkVSU0lPTgotICAgICQoc2hlbGwgZWNobyAkKExPQ0FMX01PRFVMRV9NQUtFRklMRSk6ICQoTE9DQUxfTU9EVUxFKTogTE9DQUxfVVNFX1ZOREsgbXVzdCBub3QgYmUgdXNlZCB3aXRoIExPQ0FMX1NES19WRVJTSU9OID4mMikKLSAgICAkKGVycm9yIGRvbmUpCi0gIGVuZGlmCi0KLSAgIyBJZiB3ZSdyZSBub3QgdXNpbmcgdGhlIFZOREssIGRyb3AgYWxsIHJlc3RyaWN0aW9ucwotICBpZm5kZWYgQk9BUkRfVk5ES19WRVJTSU9OCi0gICAgTE9DQUxfVVNFX1ZOREs6PQotICAgIExPQ0FMX1VTRV9WTkRLX1ZFTkRPUjo9Ci0gICAgTE9DQUxfVVNFX1ZOREtfUFJPRFVDVDo9Ci0gIGVuZGlmCi1lbmRpZgotCmRpZmYgLS1naXQgYS9jb3JlL21haW4ubWsgYi9jb3JlL21haW4ubWsKaW5kZXggMDRiNmIzMy4uMjU1ODBlMiAxMDA2NDQKLS0tIGEvY29yZS9tYWluLm1rCisrKyBiL2NvcmUvbWFpbi5tawpAQCAtNCw3ICs0LDcgQEAKICQoZXJyb3IgZG9uZSkKIGVuZGlmCiAKLSQoaW5mbyBbMS8xXSBpbml0aWFsaXppbmcgYnVpbGQgc3lzdGVtIC4uLikKKyQoaW5mbyBbMS8xXSBpbml0aWFsaXppbmcgbGVnYWN5IE1ha2UgbW9kdWxlIHBhcnNlciAuLi4pCiAKICMgQWJzb2x1dGUgcGF0aCBvZiB0aGUgcHJlc2VudCB3b3JraW5nIGRpcmVjb3RyeS4KICMgVGhpcyBvdmVycmlkZXMgdGhlIHNoZWxsIHZhcmlhYmxlICRQV0QsIHdoaWNoIGRvZXMgbm90IG5lY2Vzc2FyaWx5IHBvaW50cyB0bwpAQCAtMzEsOCArMzEsNyBAQAogLktBVElfUkVBRE9OTFkgOj0gJChmb3JlYWNoIG4sJChTT09OR19DT05GSUdfTkFNRVNQQUNFUyksU09PTkdfQ09ORklHXyQobikpCiAuS0FUSV9SRUFET05MWSA6PSAkKGZvcmVhY2ggbiwkKFNPT05HX0NPTkZJR19OQU1FU1BBQ0VTKSwkKGZvcmVhY2ggaywkKFNPT05HX0NPTkZJR18kKG4pKSxTT09OR19DT05GSUdfJChuKV8kKGspKSkKIAotaW5jbHVkZSAkKFNPT05HX01BS0VWQVJTX01LKQotCitpbmNsdWRlICQoU09PTkdfT1VUX0RJUikvbWFrZV92YXJzLSQoVEFSR0VUX1BST0RVQ1QpJChDT1ZFUkFHRV9TVUZGSVgpLm1rCiBZQUNDIDo9JD0gJChCSVNPTikgLWQKIAogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvY2xhbmcvY29uZmlnLm1rCkBAIC00MCwzMSArMzksMjMgQEAKICMgV3JpdGUgdGhlIGJ1aWxkIG51bWJlciB0byBhIGZpbGUgc28gaXQgY2FuIGJlIHJlYWQgYmFjayBpbgogIyB3aXRob3V0IGNoYW5naW5nIHRoZSBjb21tYW5kIGxpbmUgZXZlcnkgdGltZS4gIEF2b2lkcyByZWJ1aWxkcwogIyB3aGVuIHVzaW5nIG5pbmphLgotJChzaGVsbCBta2RpciAtcCAkKFNPT05HX09VVF9ESVIpICYmIFwKLSAgICBlY2hvIC1uICQoQlVJTERfTlVNQkVSKSA+ICQoU09PTkdfT1VUX0RJUikvYnVpbGRfbnVtYmVyLnRtcDsgXAotICAgIGlmICEgY21wIC1zICQoU09PTkdfT1VUX0RJUikvYnVpbGRfbnVtYmVyLnRtcCAkKFNPT05HX09VVF9ESVIpL2J1aWxkX251bWJlci50eHQ7IHRoZW4gXAotICAgICAgICBtdiAkKFNPT05HX09VVF9ESVIpL2J1aWxkX251bWJlci50bXAgJChTT09OR19PVVRfRElSKS9idWlsZF9udW1iZXIudHh0OyBcCi0gICAgZWxzZSBcCi0gICAgICAgIHJtICQoU09PTkdfT1VUX0RJUikvYnVpbGRfbnVtYmVyLnRtcDsgXAotICAgIGZpKQogQlVJTERfTlVNQkVSX0ZJTEUgOj0gJChTT09OR19PVVRfRElSKS9idWlsZF9udW1iZXIudHh0Ci0uS0FUSV9SRUFET05MWSA6PSBCVUlMRF9OVU1CRVJfRklMRQogJChLQVRJX29ic29sZXRlX3ZhciBCVUlMRF9OVU1CRVIsU2VlIGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2J1aWxkLysvbWFzdGVyL0NoYW5nZXMubWQjQlVJTERfTlVNQkVSKQorQlVJTERfSE9TVE5BTUVfRklMRSA6PSAkKFNPT05HX09VVF9ESVIpL2J1aWxkX2hvc3RuYW1lLnR4dAorJChLQVRJX29ic29sZXRlX3ZhciBCVUlMRF9IT1NUTkFNRSxVc2UgQlVJTERfSE9TVE5BTUVfRlJPTV9GSUxFIGluc3RlYWQpCiskKEtBVElfb2Jzb2xldGVfdmFyIEZJTEVfTkFNRV9UQUcsaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vYnVpbGQvKy9tYXN0ZXIvQ2hhbmdlcy5tZCNGSUxFX05BTUVfVEFHKQorCiAkKEJVSUxEX05VTUJFUl9GSUxFKToKLQl0b3VjaCAkQAorCSMgZW1wdHkgcnVsZSB0byBwcmV2ZW50IGRhbmdsaW5nIHJ1bGUgZXJyb3IgZm9yIGEgZmlsZSB0aGF0IGlzIHdyaXR0ZW4gYnkgc29vbmdfdWkKKyQoQlVJTERfSE9TVE5BTUVfRklMRSk6CisJIyBlbXB0eSBydWxlIHRvIHByZXZlbnQgZGFuZ2xpbmcgcnVsZSBlcnJvciBmb3IgYSBmaWxlIHRoYXQgaXMgd3JpdHRlbiBieSBzb29uZ191aQorCisuS0FUSV9SRVNUQVQ6ICQoQlVJTERfTlVNQkVSX0ZJTEUpCisuS0FUSV9SRVNUQVQ6ICQoQlVJTERfSE9TVE5BTUVfRklMRSkKIAogREFURV9GUk9NX0ZJTEUgOj0gZGF0ZSAtZCBAJChCVUlMRF9EQVRFVElNRV9GUk9NX0ZJTEUpCiAuS0FUSV9SRUFET05MWSA6PSBEQVRFX0ZST01fRklMRQogCi0jIFBpY2sgYSByZWFzb25hYmxlIHN0cmluZyB0byB1c2UgdG8gaWRlbnRpZnkgZmlsZXMuCi1pZmVxICgkKHN0cmlwICQoSEFTX0JVSUxEX05VTUJFUikpLGZhbHNlKQotICAjIEJVSUxEX05VTUJFUiBoYXMgYSB0aW1lc3RhbXAgaW4gaXQsIHdoaWNoIG1lYW5zIHRoYXQKLSAgIyBpdCB3aWxsIGNoYW5nZSBldmVyeSB0aW1lLiAgUGljayBhIHN0YWJsZSB2YWx1ZS4KLSAgRklMRV9OQU1FX1RBRyA6PSBlbmcuJChCVUlMRF9VU0VSTkFNRSkKLWVsc2UKLSAgRklMRV9OQU1FX1RBRyA6PSAkKGZpbGUgPCQoQlVJTERfTlVNQkVSX0ZJTEUpKQotZW5kaWYKLS5LQVRJX1JFQURPTkxZIDo9IEZJTEVfTkFNRV9UQUcKIAogIyBNYWtlIGFuIGVtcHR5IGRpcmVjdG9yeSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gbWFrZSBlbXB0eSBqYXJzCiBFTVBUWV9ESVJFQ1RPUlkgOj0gJChPVVRfRElSKS9lbXB0eQpAQCAtOTIsNiArODMsOCBAQAogLWluY2x1ZGUgdGVzdC9jdHMtcm9vdC90b29scy9idWlsZC9jb25maWcubWsKICMgV1ZUUy1zcGVjaWZpYyBjb25maWcuCiAtaW5jbHVkZSB0ZXN0L3d2dHMvdG9vbHMvYnVpbGQvY29uZmlnLm1rCisjIERUUy1zcGVjaWZpYyBjb25maWcuCistaW5jbHVkZSB0ZXN0L2R0cy90b29scy9idWlsZC9jb25maWcubWsKIAogCiAjIENsZWFuIHJ1bGVzCkBAIC0xMjEsMzcgKzExNCw4IEBACiAgICMgJChlcnJvciBUQVJHRVRfQVJDSF9TVUlURSBpcyBub3Qgc3VwcG9ydGVkIGluIGthdGkvbWFrZSBidWlsZHMpCiBlbmRpZgogCi0jIEFERElUSU9OQUxfPHBhcnRpdGlvbj5fUFJPUEVSVElFUyBhcmUgcHJvcGVydGllcyB0aGF0IGFyZSBkZXRlcm1pbmVkIGJ5IHRoZQotIyBidWlsZCBzeXN0ZW0gaXRzZWxmLiBEb24ndCBsZXQgaXQgYmUgZGVmaW5lZCBmcm9tIG91dHNpZGUgb2YgdGhlIGNvcmUgYnVpbGQKLSMgc3lzdGVtIGxpa2UgQW5kcm9pZC5tayBvciA8cHJvZHVjdD4ubWsgZmlsZXMuCi1fYWRkaXRpb25hbF9wcm9wX3Zhcl9uYW1lcyA6PSBcCi0gICAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyBcCi0gICAgQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyBcCi0gICAgQURESVRJT05BTF9PRE1fUFJPUEVSVElFUyBcCi0gICAgQURESVRJT05BTF9QUk9EVUNUX1BST1BFUlRJRVMKLQotJChmb3JlYWNoIG5hbWUsICQoX2FkZGl0aW9uYWxfcHJvcF92YXJfbmFtZXMpLFwKLSAgJChpZiAkKCQobmFtZSkpLFwKLSAgICAkKGVycm9yICQobmFtZSkgbXVzdCBub3Qgc2V0IGJlZm9yZSBoZXJlLiAkKCQobmFtZSkpKVwKLSAgLClcCi0gICQoZXZhbCAkKG5hbWUpIDo9KVwKLSkKLV9hZGRpdGlvbmFsX3Byb3BfdmFyX25hbWVzIDo9Ci0KICQoS0FUSV9vYnNvbGV0ZV92YXIgQURESVRJT05BTF9CVUlMRF9QUk9QRVJUSUVTLCBQbGVhc2UgdXNlIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMpCiAKLSMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQWRkIHRoZSBwcm9kdWN0LWRlZmluZWQgcHJvcGVydGllcyB0byB0aGUgYnVpbGQgcHJvcGVydGllcy4KLWlmbmVxICgkKEJPQVJEX1BST1BFUlRZX09WRVJSSURFU19TUExJVF9FTkFCTEVEKSwgdHJ1ZSkKLSAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSAkKFBST0RVQ1RfUFJPUEVSVFlfT1ZFUlJJREVTKQotZWxzZQotICBpZm5kZWYgQk9BUkRfVkVORE9SSU1BR0VfRklMRV9TWVNURU1fVFlQRQotICAgIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gJChQUk9EVUNUX1BST1BFUlRZX09WRVJSSURFUykKLSAgZW5kaWYKLWVuZGlmCi0KLQogIyBCcmluZyBpbiBzdGFuZGFyZCBidWlsZCBzeXN0ZW0gZGVmaW5pdGlvbnMuCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9kZWZpbml0aW9ucy5tawogCkBAIC0xODMsMTc0ICsxNDcsOCBAQAogIyBQREsgYnVpbGRzIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkLCB0aGlzIGlzIGFsd2F5cyBwbGF0Zm9ybQogVEFSR0VUX0JVSUxEX0pBVkFfU1VQUE9SVF9MRVZFTCA6PSQ9IHBsYXRmb3JtCiAKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSByby50cmVibGUuZW5hYmxlZD0ke1BST0RVQ1RfRlVMTF9UUkVCTEV9Ci0KICQoS0FUSV9vYnNvbGV0ZV92YXIgUFJPRFVDVF9GVUxMX1RSRUJMRSxcCi0JQ29kZSBzaG91bGQgYmUgd3JpdHRlbiB0byB3b3JrIHJlZ2FyZGxlc3Mgb2YgYSBkZXZpY2UgYmVpbmcgVHJlYmxlIG9yIFwKLQl2YXJpYWJsZXMgbGlrZSBQUk9EVUNUX1NFUE9MSUNZX1NQTElUIHNob3VsZCBiZSB1c2VkIHVudGlsIHRoYXQgaXMgXAotCXBvc3NpYmxlLikKLQotIyBTZXRzIHJvLmFjdGlvbmFibGVfY29tcGF0aWJsZV9wcm9wZXJ0eS5lbmFibGVkIHRvIGtub3cgb24gcnVudGltZSB3aGV0aGVyIHRoZQotIyBhbGxvd2VkIGxpc3Qgb2YgYWN0aW9uYWJsZSBjb21wYXRpYmxlIHByb3BlcnRpZXMgaXMgZW5hYmxlZCBvciBub3QuCi1BRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9IHJvLmFjdGlvbmFibGVfY29tcGF0aWJsZV9wcm9wZXJ0eS5lbmFibGVkPXRydWUKLQotIyBBZGQgdGhlIHN5c3RlbSBzZXJ2ZXIgY29tcGlsZXIgZmlsdGVyIGlmIHRoZXkgYXJlIHNwZWNpZmllZCBmb3IgdGhlIHByb2R1Y3QuCi1pZm5lcSAoLCQoUFJPRFVDVF9TWVNURU1fU0VSVkVSX0NPTVBJTEVSX0ZJTFRFUikpCi1BRERJVElPTkFMX1BST0RVQ1RfUFJPUEVSVElFUyArPSBkYWx2aWsudm0uc3lzdGVtc2VydmVyY29tcGlsZXJmaWx0ZXI9JChQUk9EVUNUX1NZU1RFTV9TRVJWRVJfQ09NUElMRVJfRklMVEVSKQotZW5kaWYKLQotIyBFbmFibGUgY29yZSBwbGF0Zm9ybSBBUEkgdmlvbGF0aW9uIHdhcm5pbmdzIG9uIHVzZXJkZWJ1ZyBhbmQgZW5nIGJ1aWxkcy4KLWlmbmVxICgkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSx1c2VyKQotQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSBwZXJzaXN0LmRlYnVnLmRhbHZpay52bS5jb3JlX3BsYXRmb3JtX2FwaV9wb2xpY3k9anVzdC13YXJuCi1lbmRpZgotCi0jIERlZmluZSByby5zYW5pdGl6ZS48bmFtZT4gcHJvcGVydGllcyBmb3IgYWxsIGdsb2JhbCBzYW5pdGl6ZXJzLgotQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSAkKGZvcmVhY2ggcywkKFNBTklUSVpFX1RBUkdFVCkscm8uc2FuaXRpemUuJChzKT10cnVlKQotCi0jIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgb2Ygcm8ucG9zdGluc3RhbGwuZnN0YWIucHJlZml4IHRvIC9zeXN0ZW0uCi0jIERldmljZSBib2FyZCBjb25maWcgc2hvdWxkIG92ZXJyaWRlIHRoZSB2YWx1ZSB0byAvcHJvZHVjdCB3aGVuIG5lZWRlZCBieToKLSMKLSMgICAgIFBST0RVQ1RfUFJPRFVDVF9QUk9QRVJUSUVTICs9IHJvLnBvc3RpbnN0YWxsLmZzdGFiLnByZWZpeD0vcHJvZHVjdAotIwotIyBJdCB0aGVuIHVzZXMgJHtyby5wb3N0aW5zdGFsbC5mc3RhYi5wcmVmaXh9L2V0Yy9mc3RhYi5wb3N0aW5zdGFsbCB0bwotIyBtb3VudCBzeXN0ZW1fb3RoZXIgcGFydGl0aW9uLgotQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSByby5wb3N0aW5zdGFsbC5mc3RhYi5wcmVmaXg9L3N5c3RlbQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgd2lsbCBiZSBpbnN0YWxsZWQgaW4gdmVuZG9yL2J1aWxkLnByb3AgaWYKLSMgcHJvcGVydHlfb3ZlcnJpZGVzX3NwbGl0X2VuYWJsZWQgaXMgdHJ1ZS4gT3RoZXJ3aXNlIGl0IHdpbGwgYmUgaW5zdGFsbGVkIGluCi0jIC9zeXN0ZW0vYnVpbGQucHJvcAotaWZkZWYgQk9BUkRfVk5ES19WRVJTSU9OCi0gIGlmZXEgKCQoQk9BUkRfVk5ES19WRVJTSU9OKSxjdXJyZW50KQotICAgIEFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgOj0gcm8udm5kay52ZXJzaW9uPSQoUExBVEZPUk1fVk5ES19WRVJTSU9OKQotICBlbHNlCi0gICAgQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyA6PSByby52bmRrLnZlcnNpb249JChCT0FSRF9WTkRLX1ZFUlNJT04pCi0gIGVuZGlmCi1lbmRpZgotCi0jIEFkZCBjcHUgcHJvcGVydGllcyBmb3IgYmlvbmljIGFuZCBBUlQuCi1BRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLmJpb25pYy5hcmNoPSQoVEFSR0VUX0FSQ0gpCi1BRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLmJpb25pYy5jcHVfdmFyaWFudD0kKFRBUkdFVF9DUFVfVkFSSUFOVF9SVU5USU1FKQotQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSByby5iaW9uaWMuMm5kX2FyY2g9JChUQVJHRVRfMk5EX0FSQ0gpCi1BRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLmJpb25pYy4ybmRfY3B1X3ZhcmlhbnQ9JChUQVJHRVRfMk5EX0NQVV9WQVJJQU5UX1JVTlRJTUUpCi0KLUFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gcGVyc2lzdC5zeXMuZGFsdmlrLnZtLmxpYi4yPWxpYmFydC5zbwotQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBkYWx2aWsudm0uaXNhLiQoVEFSR0VUX0FSQ0gpLnZhcmlhbnQ9JChERVgyT0FUX1RBUkdFVF9DUFVfVkFSSUFOVF9SVU5USU1FKQotaWZuZXEgKCQoREVYMk9BVF9UQVJHRVRfSU5TVFJVQ1RJT05fU0VUX0ZFQVRVUkVTKSwpCi0gIEFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gZGFsdmlrLnZtLmlzYS4kKFRBUkdFVF9BUkNIKS5mZWF0dXJlcz0kKERFWDJPQVRfVEFSR0VUX0lOU1RSVUNUSU9OX1NFVF9GRUFUVVJFUykKLWVuZGlmCi0KLWlmZGVmIFRBUkdFVF8yTkRfQVJDSAotICBBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IGRhbHZpay52bS5pc2EuJChUQVJHRVRfMk5EX0FSQ0gpLnZhcmlhbnQ9JCgkKFRBUkdFVF8yTkRfQVJDSF9WQVJfUFJFRklYKURFWDJPQVRfVEFSR0VUX0NQVV9WQVJJQU5UX1JVTlRJTUUpCi0gIGlmbmVxICgkKCQoVEFSR0VUXzJORF9BUkNIX1ZBUl9QUkVGSVgpREVYMk9BVF9UQVJHRVRfSU5TVFJVQ1RJT05fU0VUX0ZFQVRVUkVTKSwpCi0gICAgQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBkYWx2aWsudm0uaXNhLiQoVEFSR0VUXzJORF9BUkNIKS5mZWF0dXJlcz0kKCQoVEFSR0VUXzJORF9BUkNIX1ZBUl9QUkVGSVgpREVYMk9BVF9UQVJHRVRfSU5TVFJVQ1RJT05fU0VUX0ZFQVRVUkVTKQotICBlbmRpZgotZW5kaWYKLQotIyBBbHRob3VnaCB0aGVzZSB2YXJpYWJsZXMgYXJlIHByZWZpeGVkIHdpdGggVEFSR0VUX1JFQ09WRVJZXywgdGhleSBhcmUgYWxzbyBuZWVkZWQgdW5kZXIgY2hhcmdlcgotIyBtb2RlICh2aWEgbGlibWludWkpLgotaWZkZWYgVEFSR0VUX1JFQ09WRVJZX0RFRkFVTFRfUk9UQVRJT04KLUFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAotICAgIHJvLm1pbnVpLmRlZmF1bHRfcm90YXRpb249JChUQVJHRVRfUkVDT1ZFUllfREVGQVVMVF9ST1RBVElPTikKLWVuZGlmCi1pZmRlZiBUQVJHRVRfUkVDT1ZFUllfT1ZFUlNDQU5fUEVSQ0VOVAotQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCi0gICAgcm8ubWludWkub3ZlcnNjYW5fcGVyY2VudD0kKFRBUkdFVF9SRUNPVkVSWV9PVkVSU0NBTl9QRVJDRU5UKQotZW5kaWYKLWlmZGVmIFRBUkdFVF9SRUNPVkVSWV9QSVhFTF9GT1JNQVQKLUFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAotICAgIHJvLm1pbnVpLnBpeGVsX2Zvcm1hdD0kKFRBUkdFVF9SRUNPVkVSWV9QSVhFTF9GT1JNQVQpCi1lbmRpZgotCi1pZmRlZiBQUk9EVUNUX1VTRV9EWU5BTUlDX1BBUlRJVElPTlMKLUFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAotICAgIHJvLmJvb3QuZHluYW1pY19wYXJ0aXRpb25zPSQoUFJPRFVDVF9VU0VfRFlOQU1JQ19QQVJUSVRJT05TKQotZW5kaWYKLQotaWZkZWYgUFJPRFVDVF9SRVRST0ZJVF9EWU5BTUlDX1BBUlRJVElPTlMKLUFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAotICAgIHJvLmJvb3QuZHluYW1pY19wYXJ0aXRpb25zX3JldHJvZml0PSQoUFJPRFVDVF9SRVRST0ZJVF9EWU5BTUlDX1BBUlRJVElPTlMpCi1lbmRpZgotCi1pZmRlZiBQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTAotQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCi0gICAgcm8ucHJvZHVjdC5maXJzdF9hcGlfbGV2ZWw9JChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCkKLWVuZGlmCi0KLWlmbmVxICgkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSx1c2VyKQotICBpZmRlZiBQUk9EVUNUX1NFVF9ERUJVR0ZTX1JFU1RSSUNUSU9OUwotICAgIEFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAotICAgICAgcm8ucHJvZHVjdC5kZWJ1Z2ZzX3Jlc3RyaWN0aW9ucy5lbmFibGVkPSQoUFJPRFVDVF9TRVRfREVCVUdGU19SRVNUUklDVElPTlMpCi0gIGVuZGlmCi1lbmRpZgotCi0jIFZlbmRvcnMgd2l0aCBHUkYgbXVzdCBkZWZpbmUgQk9BUkRfU0hJUFBJTkdfQVBJX0xFVkVMIGZvciB0aGUgdmVuZG9yIEFQSSBsZXZlbC4KLSMgVGhpcyBtdXN0IG5vdCBiZSBkZWZpbmVkIGZvciB0aGUgbm9uLUdSRiBkZXZpY2VzLgotaWZkZWYgQk9BUkRfU0hJUFBJTkdfQVBJX0xFVkVMCi1BRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IFwKLSAgICByby5ib2FyZC5maXJzdF9hcGlfbGV2ZWw9JChCT0FSRF9TSElQUElOR19BUElfTEVWRUwpCi0KLSMgVG8gbWFudWFsbHkgc2V0IHRoZSB2ZW5kb3IgQVBJIGxldmVsIG9mIHRoZSB2ZW5kb3IgbW9kdWxlcywgQk9BUkRfQVBJX0xFVkVMIGNhbiBiZSB1c2VkLgotIyBUaGUgdmFsdWVzIG9mIHRoZSBHUkYgcHJvcGVydGllcyB3aWxsIGJlIHZlcmlmaWVkIGJ5IHBvc3RfcHJvY2Vzc19wcm9wcy5weQotaWZkZWYgQk9BUkRfQVBJX0xFVkVMCi1BRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IFwKLSAgICByby5ib2FyZC5hcGlfbGV2ZWw9JChCT0FSRF9BUElfTEVWRUwpCi1lbmRpZgotZW5kaWYKLQotIyBTZXQgYnVpbGQgcHJvcC4gVGhpcyBwcm9wIGlzIHJlYWQgYnkgb3RhX2Zyb21fdGFyZ2V0X2ZpbGVzIHdoZW4gZ2VuZXJhdGluZyBPVEEsCi0jIHRvIGRlY2lkZSBpZiBWQUJDIHNob3VsZCBiZSBkaXNhYmxlZC4KLWlmZXEgKCQoQk9BUkRfRE9OVF9VU0VfVkFCQ19PVEEpLHRydWUpCi1BRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IFwKLSAgICByby52ZW5kb3IuYnVpbGQuZG9udF91c2VfdmFiYz10cnVlCi1lbmRpZgotCi0jIFNldCB0aGUgZmxhZyBpbiB2ZW5kb3IuIFNvIFZUUyB3b3VsZCBrbm93IGlmIHRoZSBuZXcgZmluZ2VycHJpbnQgZm9ybWF0IGlzIGluIHVzZSB3aGVuCi0jIHRoZSBzeXN0ZW0gaW1hZ2VzIGFyZSByZXBsYWNlZCBieSBHU0kuCi1pZmVxICgkKEJPQVJEX1VTRV9WQk1FVEFfRElHVEVTVF9JTl9GSU5HRVJQUklOVCksdHJ1ZSkKLUFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAotICAgIHJvLnZlbmRvci5idWlsZC5maW5nZXJwcmludF9oYXNfZGlnZXN0PTEKLWVuZGlmCi0KLUFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAotICAgIHJvLnZlbmRvci5idWlsZC5zZWN1cml0eV9wYXRjaD0kKFZFTkRPUl9TRUNVUklUWV9QQVRDSCkgXAotICAgIHJvLnByb2R1Y3QuYm9hcmQ9JChUQVJHRVRfQk9PVExPQURFUl9CT0FSRF9OQU1FKSBcCi0gICAgcm8uYm9hcmQucGxhdGZvcm09JChUQVJHRVRfQk9BUkRfUExBVEZPUk0pIFwKLSAgICByby5od3VpLnVzZV92dWxrYW49JChUQVJHRVRfVVNFU19WVUxLQU4pCi0KLWlmZGVmIFRBUkdFVF9TQ1JFRU5fREVOU0lUWQotQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCi0gICAgcm8uc2YubGNkX2RlbnNpdHk9JChUQVJHRVRfU0NSRUVOX0RFTlNJVFkpCi1lbmRpZgotCi1pZmRlZiBBQl9PVEFfVVBEQVRFUgotQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCi0gICAgcm8uYnVpbGQuYWJfdXBkYXRlPSQoQUJfT1RBX1VQREFURVIpCi1lbmRpZgotCi0jIFNldCByby5wcm9kdWN0LnZuZGsudmVyc2lvbiB0byBrbm93IHRoZSBWTkRLIHZlcnNpb24gcmVxdWlyZWQgYnkgcHJvZHVjdAotIyBtb2R1bGVzLiBJdCB1c2VzIHRoZSB2ZXJzaW9uIGluIFBST0RVQ1RfUFJPRFVDVF9WTkRLX1ZFUlNJT04uIElmIHRoZSB2YWx1ZQotIyBpcyAiY3VycmVudCIsIHVzZSBQTEFURk9STV9WTkRLX1ZFUlNJT04uCi1pZmRlZiBQUk9EVUNUX1BST0RVQ1RfVk5ES19WRVJTSU9OCi1pZmVxICgkKFBST0RVQ1RfUFJPRFVDVF9WTkRLX1ZFUlNJT04pLGN1cnJlbnQpCi1BRERJVElPTkFMX1BST0RVQ1RfUFJPUEVSVElFUyArPSByby5wcm9kdWN0LnZuZGsudmVyc2lvbj0kKFBMQVRGT1JNX1ZOREtfVkVSU0lPTikKLWVsc2UKLUFERElUSU9OQUxfUFJPRFVDVF9QUk9QRVJUSUVTICs9IHJvLnByb2R1Y3Qudm5kay52ZXJzaW9uPSQoUFJPRFVDVF9QUk9EVUNUX1ZOREtfVkVSU0lPTikKLWVuZGlmCi1lbmRpZgotCi1BRERJVElPTkFMX1BST0RVQ1RfUFJPUEVSVElFUyArPSByby5idWlsZC5jaGFyYWN0ZXJpc3RpY3M9JChUQVJHRVRfQUFQVF9DSEFSQUNURVJJU1RJQ1MpCi0KLWlmZXEgKCQoQUJfT1RBX1VQREFURVIpLHRydWUpCi1BRERJVElPTkFMX1BST0RVQ1RfUFJPUEVSVElFUyArPSByby5wcm9kdWN0LmFiX290YV9wYXJ0aXRpb25zPSQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJChzb3J0ICQoQUJfT1RBX1BBUlRJVElPTlMpKSkKLWVuZGlmCi0KLSMgU2V0IHRoaXMgcHJvcGVydHkgZm9yIFZUUyB0byBza2lwIGxhcmdlIHBhZ2Ugc2l6ZSB0ZXN0cyBvbiB1bnN1cHBvcnRlZCBkZXZpY2VzLgotQURESVRJT05BTF9QUk9EVUNUX1BST1BFUlRJRVMgKz0gXAotICAgIHJvLnByb2R1Y3QuY3B1LnBhZ2VzaXplLm1heD0kKFRBUkdFVF9NQVhfUEFHRV9TSVpFX1NVUFBPUlRFRCkKLQorCUNvZGUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gd29yayByZWdhcmRsZXNzIG9mIGEgZGV2aWNlIGJlaW5nIFRyZWJsZSkKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMjIwogIyMjIEluIHRoaXMgc2VjdGlvbiB3ZSBzZXQgdXAgdGhlIHRoaW5ncyB0aGF0IGFyZSBkaWZmZXJlbnQKQEAgLTM2Myw2NCArMTYxLDE1IEBACiBpc19zZGtfYnVpbGQgOj0gdHJ1ZQogZW5kaWYKIAotIyMgdXNlci91c2VyZGVidWcgIyMKLQotdXNlcl92YXJpYW50IDo9ICQoZmlsdGVyIHVzZXIgdXNlcmRlYnVnLCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpKQotZW5hYmxlX3RhcmdldF9kZWJ1Z2dpbmcgOj0gdHJ1ZQogdGFnc190b19pbnN0YWxsIDo9Ci1pZm5lcSAoLCQodXNlcl92YXJpYW50KSkKLSAgIyBUYXJnZXQgaXMgc2VjdXJlIGluIHVzZXIgYnVpbGRzLgotICBBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9IHJvLnNlY3VyZT0xCi0gIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gc2VjdXJpdHkucGVyZl9oYXJkZW49MQogCi0gIGlmZXEgKCQodXNlcl92YXJpYW50KSx1c2VyKQotICAgIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uYWRiLnNlY3VyZT0xCi0gIGVuZGlmCi0KLSAgaWZlcSAoJCh1c2VyX3ZhcmlhbnQpLHVzZXJkZWJ1ZykKLSAgICAjIFBpY2sgdXAgc29tZSBleHRyYSB1c2VmdWwgdG9vbHMKLSAgICB0YWdzX3RvX2luc3RhbGwgKz0gZGVidWcKLSAgZWxzZQotICAgICMgRGlzYWJsZSBkZWJ1Z2dpbmcgaW4gcGxhaW4gdXNlciBidWlsZHMuCi0gICAgZW5hYmxlX3RhcmdldF9kZWJ1Z2dpbmcgOj0KLSAgZW5kaWYKLQotICAjIERpc2FsbG93IG1vY2sgbG9jYXRpb25zIGJ5IGRlZmF1bHQgZm9yIHVzZXIgYnVpbGRzCi0gIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uYWxsb3cubW9jay5sb2NhdGlvbj0wCi0KLWVsc2UgIyAhdXNlcl92YXJpYW50Ci0gICMgVHVybiBvbiBjaGVja2puaSBmb3Igbm9uLXVzZXIgYnVpbGRzLgotICBBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9IHJvLmtlcm5lbC5hbmRyb2lkLmNoZWNram5pPTEKLSAgIyBTZXQgZGV2aWNlIGluc2VjdXJlIGZvciBub24tdXNlciBidWlsZHMuCi0gIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uc2VjdXJlPTAKLSAgIyBBbGxvdyBtb2NrIGxvY2F0aW9ucyBieSBkZWZhdWx0IGZvciBub24gdXNlciBidWlsZHMKLSAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyArPSByby5hbGxvdy5tb2NrLmxvY2F0aW9uPTEKLWVuZGlmICMgIXVzZXJfdmFyaWFudAotCi1pZmVxICh0cnVlLCQoc3RyaXAgJChlbmFibGVfdGFyZ2V0X2RlYnVnZ2luZykpKQotICAjIFRhcmdldCBpcyBtb3JlIGRlYnVnZ2FibGUgYW5kIGFkYmQgaXMgb24gYnkgZGVmYXVsdAotICBBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9IHJvLmRlYnVnZ2FibGU9MQotICAjIEVuYWJsZSBEYWx2aWsgbG9jayBjb250ZW50aW9uIGxvZ2dpbmcuCi0gIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gZGFsdmlrLnZtLmxvY2twcm9mLnRocmVzaG9sZD01MDAKLWVsc2UgIyAhZW5hYmxlX3RhcmdldF9kZWJ1Z2dpbmcKLSAgIyBUYXJnZXQgaXMgbGVzcyBkZWJ1Z2dhYmxlIGFuZCBhZGJkIGlzIG9mZiBieSBkZWZhdWx0Ci0gIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uZGVidWdnYWJsZT0wCi1lbmRpZiAjICFlbmFibGVfdGFyZ2V0X2RlYnVnZ2luZwotCi0jIyBlbmcgIyMKK2lmZXEgKCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpLHVzZXJkZWJ1ZykKKyMgUGljayB1cCBzb21lIGV4dHJhIHVzZWZ1bCB0b29scwordGFnc190b19pbnN0YWxsIDo9IGRlYnVnCitlbmRpZgogCiBpZmVxICgkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSxlbmcpCiB0YWdzX3RvX2luc3RhbGwgOj0gZGVidWcgZW5nCi1pZm5lcSAoJChmaWx0ZXIgcm8uc2V0dXB3aXphcmQubW9kZT1FTkFCTEVELCAkKGNhbGwgY29sbGFwc2UtcGFpcnMsICQoQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUykpKSwpCi0gICMgRG9uJ3QgcmVxdWlyZSB0aGUgc2V0dXAgd2l6YXJkIG9uIGVuZyBidWlsZHMKLSAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyA6PSAkKGZpbHRlci1vdXQgcm8uc2V0dXB3aXphcmQubW9kZT0lLFwKLSAgICAgICAgICAkKGNhbGwgY29sbGFwc2UtcGFpcnMsICQoQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUykpKSBcCi0gICAgICAgICAgcm8uc2V0dXB3aXphcmQubW9kZT1PUFRJT05BTAotZW5kaWYKLWlmbmRlZiBpc19zZGtfYnVpbGQKLSAgIyBUbyBzcGVlZHVwIHN0YXJ0dXAgb2Ygbm9uLXByZW9wdGVkIGJ1aWxkcywgZG9uJ3QgdmVyaWZ5IG9yIGNvbXBpbGUgdGhlIGJvb3QgaW1hZ2UuCi0gIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gZGFsdmlrLnZtLmltYWdlLWRleDJvYXQtZmlsdGVyPWV4dHJhY3QKLWVuZGlmCiBlbmRpZgogCiAjIyBhc2FuICMjCkBAIC00NTYsMTggKzIwNSwxMSBAQAogIyBUT0RPOiB0aGlzIHNob3VsZCBiZSBlbmcgSSB0aGluay4gIFNpbmNlIHRoZSBzZGsgaXMgYnVpbHQgZnJvbSB0aGUgZW5nCiAjIHZhcmlhbnQuCiB0YWdzX3RvX2luc3RhbGwgOj0gZGVidWcgZW5nCi1BRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9IHhtcHAuYXV0by1wcmVzZW5jZT10cnVlCi1BRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9IHJvLmNvbmZpZy5ub2NoZWNraW49eWVzCiBlbHNlICMgIXNkawogZW5kaWYKIAogQlVJTERfV0lUSE9VVF9QViA6PSB0cnVlCiAKLUFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgKz0gbmV0LmJ0Lm5hbWU9QW5kcm9pZAotCi0jIFRoaXMgcHJvcGVydHkgaXMgc2V0IGJ5IGZsYXNoaW5nIGRlYnVnIGJvb3QgaW1hZ2UsIHNvIGRlZmF1bHQgdG8gZmFsc2UuCi1BRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTICs9IHJvLmZvcmNlLmRlYnVnZ2FibGU9MAotCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBEZWZpbmUgYSBmdW5jdGlvbiB0aGF0LCBnaXZlbiBhIGxpc3Qgb2YgbW9kdWxlIHRhZ3MsIHJldHVybnMKICMgbm9uLWVtcHR5IGlmIHRoYXQgbW9kdWxlIHNob3VsZCBiZSBpbnN0YWxsZWQgaW4gL3N5c3RlbS4KQEAgLTUwOCwxMCArMjUwLDYgQEAKIAogIyBTdHJpcCBhbmQgcmVhZG9ubHkgYSBmZXcgbW9yZSB2YXJpYWJsZXMgc28gdGhleSB3b24ndCBiZSBtb2RpZmllZC4KICQocmVhZG9ubHktZmluYWwtcHJvZHVjdC12YXJzKQotQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyA6PSAkKHN0cmlwICQoQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUykpCi0uS0FUSV9SRUFET05MWSA6PSBBRERJVElPTkFMX1NZU1RFTV9QUk9QRVJUSUVTCi1BRERJVElPTkFMX1BST0RVQ1RfUFJPUEVSVElFUyA6PSAkKHN0cmlwICQoQURESVRJT05BTF9QUk9EVUNUX1BST1BFUlRJRVMpKQotLktBVElfUkVBRE9OTFkgOj0gQURESVRJT05BTF9QUk9EVUNUX1BST1BFUlRJRVMKIAogaWZuZXEgKCQoUFJPRFVDVF9FTkZPUkNFX1JST19UQVJHRVRTKSwpCiBFTkZPUkNFX1JST19TT1VSQ0VTIDo9CkBAIC01MzksMzEgKzI3Nyw1NCBAQAogIyBJbmNsdWRlIGFsbCBvZiB0aGUgbWFrZWZpbGVzIGluIHRoZSBzeXN0ZW0KICMKIAotc3ViZGlyX21ha2VmaWxlcyA6PSAkKFNPT05HX09VVF9ESVIpL2luc3RhbGxzLSQoVEFSR0VUX1BST0RVQ1QpLm1rICQoU09PTkdfQU5EUk9JRF9NSykKK3N1YmRpcl9tYWtlZmlsZXMgOj0gXAorICAgICQoU09PTkdfT1VUX0RJUikvaW5zdGFsbHMtJChUQVJHRVRfUFJPRFVDVCkkKENPVkVSQUdFX1NVRkZJWCkubWsgXAorICAgICQoU09PTkdfQU5EUk9JRF9NSykgXAorICAgIGJ1aWxkL21ha2UvdGFyZ2V0L2JvYXJkL2FuZHJvaWQtaW5mby5taworCiAjIEFuZHJvaWQubWsgZmlsZXMgYXJlIG9ubHkgdXNlZCBvbiBMaW51eCBidWlsZHMsIE1hYyBvbmx5IHN1cHBvcnRzIEFuZHJvaWQuYnAKIGlmZXEgKCQoSE9TVF9PUyksbGludXgpCi0gIHN1YmRpcl9tYWtlZmlsZXMgKz0gJChmaWxlIDwkKE9VVF9ESVIpLy5tb2R1bGVfcGF0aHMvQW5kcm9pZC5tay5saXN0KQorICBpZmVxICgkKFBST0RVQ1RfSUdOT1JFX0FMTF9BTkRST0lETUspLHRydWUpCisgICAgYWxsb3dlZF9hbmRyb2lkbWtfZmlsZXMgOj0KKyAgICBpZmRlZiBQUk9EVUNUX0FORFJPSURNS19BTExPV0xJU1RfRklMRQorICAgICAgLWluY2x1ZGUgJChQUk9EVUNUX0FORFJPSURNS19BTExPV0xJU1RfRklMRSkKKyAgICBlbmRpZgorICAgIGFsbG93ZWRfYW5kcm9pZG1rX2ZpbGVzICs9ICQoUFJPRFVDVF9BTExPV0VEX0FORFJPSURNS19GSUxFUykKKyAgICBzdWJkaXJfbWFrZWZpbGVzICs9ICQoZmlsdGVyICQoYWxsb3dlZF9hbmRyb2lkbWtfZmlsZXMpLCQoZmlsZSA8JChPVVRfRElSKS8ubW9kdWxlX3BhdGhzL0FuZHJvaWQubWsubGlzdCkpCisgICAgYWxsb3dlZF9hbmRyb2lkbWtfZmlsZXMgOj0KKyAgZWxzZQorICAgIHN1YmRpcl9tYWtlZmlsZXMgKz0gJChmaWxlIDwkKE9VVF9ESVIpLy5tb2R1bGVfcGF0aHMvQW5kcm9pZC5tay5saXN0KQorICBlbmRpZgogZW5kaWYKLXN1YmRpcl9tYWtlZmlsZXMgKz0gJChTT09OR19PVVRfRElSKS9sYXRlLSQoVEFSR0VUX1BST0RVQ1QpLm1rCisKK3N1YmRpcl9tYWtlZmlsZXMgKz0gJChTT09OR19PVVRfRElSKS9sYXRlLSQoVEFSR0VUX1BST0RVQ1QpJChDT1ZFUkFHRV9TVUZGSVgpLm1rCisKIHN1YmRpcl9tYWtlZmlsZXNfdG90YWwgOj0gJCh3b3JkcyBpbnQgJChzdWJkaXJfbWFrZWZpbGVzKSBwb3N0IGZpbmlzaCkKIC5LQVRJX1JFQURPTkxZIDo9IHN1YmRpcl9tYWtlZmlsZXNfdG90YWwKIAogJChmb3JlYWNoIG1rLCQoc3ViZGlyX21ha2VmaWxlcyksJChpbmZvIFskKGNhbGwgaW5jX2FuZF9wcmludCxzdWJkaXJfbWFrZWZpbGVzX2luYykvJChzdWJkaXJfbWFrZWZpbGVzX3RvdGFsKV0gaW5jbHVkaW5nICQobWspIC4uLikkKGV2YWwgaW5jbHVkZSAkKG1rKSkpCiAKKyMgQnVpbGQgYm9vdGxvYWRlci5pbWcvcmFkaW8uaW1nLCBhbmQgdW5wYWNrIHRoZSBwYXJ0aXRpb25zLgorLWluY2x1ZGUgdmVuZG9yL2dvb2dsZS9idWlsZC90YXNrcy90b29scy91cGRhdGVfYm9vdGxvYWRlcl9yYWRpb19pbWFnZS5taworCiAjIEZvciBhbiB1bmJ1bmRsZWQgaW1hZ2UsIHdlIGNhbiBza2lwIGJsdWVwcmludF90b29scyBiZWNhdXNlIHVuYnVuZGxlZCBpbWFnZQogIyBhaW1zIHRvIHJlbW92ZSBhIGxhcmdlIG51bWJlciBmcmFtZXdvcmsgcHJvamVjdHMgZnJvbSB0aGUgbWFuaWZlc3QsIHRoZQogIyBzb3VyY2VzIG9yIGRlcGVuZGVuY2llcyBmb3IgdGhlc2UgdG9vbHMgbWF5IGJlIG1pc3NpbmcgZnJvbSB0aGUgdHJlZS4KIGlmZXEgKCwkKFRBUkdFVF9CVUlMRF9VTkJVTkRMRURfSU1BR0UpKQogZHJvaWRfdGFyZ2V0cyA6IGJsdWVwcmludF90b29scworY2hlY2tidWlsZDogYmx1ZXByaW50X3Rlc3RzCiBlbmRpZgogCisjIENyZWF0ZSBuZWNlc3NhcnkgZGlyZWN0b3JpZXMgYW5kIHN5bWxpbmtzIGluIHRoZSByb290IGZpbGVzeXN0ZW0KK2luY2x1ZGUgc3lzdGVtL2NvcmUvcm9vdGRpci9jcmVhdGVfcm9vdF9zdHJ1Y3R1cmUubWsKKwogZW5kaWYgIyBkb250X2JvdGhlcgogCiBpZm5kZWYgc3ViZGlyX21ha2VmaWxlc190b3RhbAogc3ViZGlyX21ha2VmaWxlc190b3RhbCA6PSAkKHdvcmRzIGluaXQgcG9zdCBmaW5pc2gpCiBlbmRpZgogCi0kKGluZm8gWyQoY2FsbCBpbmNfYW5kX3ByaW50LHN1YmRpcl9tYWtlZmlsZXNfaW5jKS8kKHN1YmRpcl9tYWtlZmlsZXNfdG90YWwpXSBmaW5pc2hpbmcgYnVpbGQgcnVsZXMgLi4uKQorJChpbmZvIFskKGNhbGwgaW5jX2FuZF9wcmludCxzdWJkaXJfbWFrZWZpbGVzX2luYykvJChzdWJkaXJfbWFrZWZpbGVzX3RvdGFsKV0gZmluaXNoaW5nIGxlZ2FjeSBNYWtlIG1vZHVsZSBwYXJzaW5nIC4uLikKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIEFsbCBtb2R1bGUgbWFrZWZpbGVzIGhhdmUgYmVlbiBpbmNsdWRlZCBhdCB0aGlzIHBvaW50LgpAQCAtODE5LDEyICs1ODAsMTQgQEAKIAogIyBTZXRzIHVwIGRlcGVuZGVuY2llcyBzdWNoIHRoYXQgd2hlbmV2ZXIgYSB0YXJnZXQgbW9kdWxlIGlzIGluc3RhbGxlZCwKICMgYW55IG90aGVyIHRhcmdldCBtb2R1bGVzIGxpc3RlZCBpbiAkKEFMTF9NT0RVTEVTLiQobSkuUkVRVUlSRURfRlJPTV9UQVJHRVQpIHdpbGwgYWxzbyBiZSBpbnN0YWxsZWQKKyMgVGhpcyBkb2Vzbid0IGFwcGx5IHRvIE9SREVST05MWV9JTlNUQUxMRUQgaXRlbXMuCiBkZWZpbmUgYWRkLWFsbC10YXJnZXQtdG8tdGFyZ2V0LXJlcXVpcmVkLW1vZHVsZXMtZGVwcwogJChmb3JlYWNoIG0sJChBTExfTU9EVUxFUyksIFwKICAgJChldmFsIHIgOj0gJChBTExfTU9EVUxFUy4kKG0pLlJFUVVJUkVEX0ZST01fVEFSR0VUKSkgXAogICAkKGlmICQociksIFwKICAgICAkKGV2YWwgciA6PSAkKGNhbGwgbW9kdWxlLWluc3RhbGxlZC1maWxlcywkKHIpKSkgXAogICAgICQoZXZhbCB0X20gOj0gJChmaWx0ZXIgJChUQVJHRVRfT1VUX1JPT1QpLyUsICQoQUxMX01PRFVMRVMuJChtKS5JTlNUQUxMRUQpKSkgXAorICAgICQoZXZhbCB0X20gOj0gJChmaWx0ZXItb3V0ICQoQUxMX01PRFVMRVMuJChtKS5PUkRFUk9OTFlfSU5TVEFMTEVEKSwgJChBTExfTU9EVUxFUy4kKG0pLklOU1RBTExFRCkpKSBcCiAgICAgJChldmFsIHRfciA6PSAkKGZpbHRlciAkKFRBUkdFVF9PVVRfUk9PVCkvJSwgJChyKSkpIFwKICAgICAkKGV2YWwgdF9yIDo9ICQoZmlsdGVyLW91dCAkKHRfbSksICQodF9yKSkpIFwKICAgICAkKGlmICQodF9tKSwgJChldmFsICQoY2FsbCBhZGQtcmVxdWlyZWQtZGVwcywgJCh0X20pLCQodF9yKSkpKSBcCkBAIC05MzksMjAgKzcwMiwyOCBAQAogIyBTY2FuIGFsbCBtb2R1bGVzIGluIGdlbmVyYWwtdGVzdHMsIGRldmljZS10ZXN0cyBhbmQgb3RoZXIgc2VsZWN0ZWQgc3VpdGVzIGFuZAogIyBmbGF0dGVuIHRoZSBzaGFyZWQgbGlicmFyeSBkZXBlbmRlbmNpZXMuCiBkZWZpbmUgdXBkYXRlLWhvc3Qtc2hhcmVkLWxpYnMtZGVwcy1mb3Itc3VpdGVzCi0kKGZvcmVhY2ggc3VpdGUsZ2VuZXJhbC10ZXN0cyBkZXZpY2UtdGVzdHMgdnRzIHR2dHMgYXJ0LWhvc3QtdGVzdHMgaG9zdC11bml0LXRlc3RzLFwKKyQoZm9yZWFjaCBzdWl0ZSxnZW5lcmFsLXRlc3RzIGRldmljZS10ZXN0cyB2dHMgdHZ0cyBhcnQtaG9zdC10ZXN0cyBob3N0LXVuaXQtdGVzdHMgY2FtZXJhLWhhbC10ZXN0cyxcCiAgICQoZm9yZWFjaCBtLCQoQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5NT0RVTEVTKSxcCiAgICAgJChldmFsIG15X2RlcHMgOj0gJChjYWxsIGdldC1hbGwtc2hhcmVkLWxpYnMtZGVwcywkKG0pKSlcCiAgICAgJChmb3JlYWNoIGRlcCwkKG15X2RlcHMpLFwKICAgICAgICQoZm9yZWFjaCBmLCQoQUxMX01PRFVMRVMuJChkZXApLkhPU1RfU0hBUkVEX0xJQlJBUllfRklMRVMpLFwKLSAgICAgICAgJChpZiAkKGZpbHRlciAkKHN1aXRlKSxkZXZpY2UtdGVzdHMgZ2VuZXJhbC10ZXN0cyBhcnQtaG9zdC10ZXN0cyBob3N0LXVuaXQtdGVzdHMpLFwKKyAgICAgICAgJChpZiAkKGZpbHRlciAkKHN1aXRlKSxkZXZpY2UtdGVzdHMgZ2VuZXJhbC10ZXN0cyBhcnQtaG9zdC10ZXN0cyBob3N0LXVuaXQtdGVzdHMgY2FtZXJhLWhhbC10ZXN0cyksXAogICAgICAgICAgICQoZXZhbCBteV90ZXN0Y2FzZXMgOj0gJChIT1NUX09VVF9URVNUQ0FTRVMpKSxcCiAgICAgICAgICAgJChldmFsIG15X3Rlc3RjYXNlcyA6PSAkJChDT01QQVRJQklMSVRZX1RFU1RDQVNFU19PVVRfJChzdWl0ZSkpKSlcCiAgICAgICAgICQoZXZhbCB0YXJnZXQgOj0gJChteV90ZXN0Y2FzZXMpLyQobGFzdHdvcmQgJChzdWJzdCAvLCAsJChkaXIgJChmKSkpKS8kKG5vdGRpciAkKGYpKSlcCisgICAgICAgICQoZXZhbCBwcmVmaXggOj0gLi4vLi4vLi4pCisgICAgICAgICQoaWYgJChzdHJpcCAkKHBhdHN1YnN0ICV4ODYsLCQoQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5BUkNIX0RJUlMuJChtKSkpKSwgXAorICAgICAgICAgICQoaWYgJChzdHJpcCAkKHBhdHN1YnN0ICV4ODZfNjQsLCQoQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5BUkNIX0RJUlMuJChtKSkpKSwkKGV2YWwgcHJlZml4IDo9IC4uLy4uKSwpLCkgXAorICAgICAgICAkKGV2YWwgbGlua190YXJnZXQgOj0gJChwcmVmaXgpLyQobGFzdHdvcmQgJChzdWJzdCAvLCAsJChkaXIgJChmKSkpKS8kKG5vdGRpciAkKGYpKSlcCisgICAgICAgICQoZXZhbCBzeW1saW5rIDo9ICQoQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5BUkNIX0RJUlMuJChtKSkvc2hhcmVkX2xpYnMvJChub3RkaXIgJChmKSkpXAorICAgICAgICAkKGV2YWwgQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5TWU1MSU5LUyA6PSBcCisgICAgICAgICAgJCQoQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5TWU1MSU5LUykgJChmKTokKGxpbmtfdGFyZ2V0KTokKHN5bWxpbmspKVwKICAgICAgICAgJChpZiAkKHN0cmlwICQoQUxMX1RBUkdFVFMuJCh0YXJnZXQpLk1FVEFfTElDKSksLCQoY2FsbCBkZWNsYXJlLWNvcHktdGFyZ2V0LWxpY2Vuc2UtbWV0YWRhdGEsJCh0YXJnZXQpLCQoZikpKVwKICAgICAgICAgJChldmFsIENPTVBBVElCSUxJVFkuJChzdWl0ZSkuSE9TVF9TSEFSRURfTElCUkFSWS5GSUxFUyA6PSBcCiAgICAgICAgICAgJCQoQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5IT1NUX1NIQVJFRF9MSUJSQVJZLkZJTEVTKSAkKGYpOiQodGFyZ2V0KSlcCiAgICAgICAgICQoZXZhbCBDT01QQVRJQklMSVRZLiQoc3VpdGUpLkhPU1RfU0hBUkVEX0xJQlJBUlkuRklMRVMgOj0gXAotICAgICAgICAgICQoc29ydCAkKENPTVBBVElCSUxJVFkuJChzdWl0ZSkuSE9TVF9TSEFSRURfTElCUkFSWS5GSUxFUykpKSkpKSkKKyAgICAgICAgICAkKHNvcnQgJChDT01QQVRJQklMSVRZLiQoc3VpdGUpLkhPU1RfU0hBUkVEX0xJQlJBUlkuRklMRVMpKSkpKSlcCisgICQoZXZhbCBDT01QQVRJQklMSVRZLiQoc3VpdGUpLlNZTUxJTktTIDo9ICQoc29ydCAkKENPTVBBVElCSUxJVFkuJChzdWl0ZSkuU1lNTElOS1MpKSkpCiBlbmRlZgogCiAkKGNhbGwgcmVzb2x2ZS1zaGFyZWQtbGlicy1kZXBlcyxUQVJHRVRfKQpAQCAtMTIyNSwxNyArOTk2LDE1IEBACiAjIFJldHVybnMgbW9kdWxlcyBpbmNsdWRlZCBhdXRvbWF0aWNhbGx5IGFzIGEgcmVzdWx0IG9mIGNlcnRhaW4gQm9hcmRDb25maWcKICMgdmFyaWFibGVzIGJlaW5nIHNldC4KIGRlZmluZSBhdXRvLWluY2x1ZGVkLW1vZHVsZXMKLSAgJChpZiAkKEJPQVJEX1ZOREtfVkVSU0lPTiksdm5ka19wYWNrYWdlKSBcCi0gICQoaWYgJChERVZJQ0VfTUFOSUZFU1RfRklMRSksdmVuZG9yX21hbmlmZXN0LnhtbCkgXAorICAkKGZvcmVhY2ggdm5ka192ZXIsJChQUk9EVUNUX0VYVFJBX1ZOREtfVkVSU0lPTlMpLGNvbS5hbmRyb2lkLnZuZGsudiQodm5ka192ZXIpKSBcCisgIGxsbmRrLmxpYnJhcmllcy50eHQgXAogICAkKGlmICQoREVWSUNFX01BTklGRVNUX1NLVVMpLCQoZm9yZWFjaCBza3UsICQoREVWSUNFX01BTklGRVNUX1NLVVMpLHZlbmRvcl9tYW5pZmVzdF8kKHNrdSkueG1sKSkgXAogICAkKGlmICQoT0RNX01BTklGRVNUX0ZJTEVTKSxvZG1fbWFuaWZlc3QueG1sKSBcCiAgICQoaWYgJChPRE1fTUFOSUZFU1RfU0tVUyksJChmb3JlYWNoIHNrdSwgJChPRE1fTUFOSUZFU1RfU0tVUyksb2RtX21hbmlmZXN0XyQoc2t1KS54bWwpKSBcCiAKIGVuZGVmCiAKLSMgTGlzdHMgbW9zdCBvZiB0aGUgZmlsZXMgYSBwYXJ0aWN1bGFyIHByb2R1Y3QgaW5zdGFsbHMsIGluY2x1ZGluZzoKLSMgLSBQUk9EVUNUX1BBQ0tBR0VTLCBhbmQgdGhlaXIgTE9DQUxfUkVRVUlSRURfTU9EVUxFUwotIyAtIFBST0RVQ1RfQ09QWV9GSUxFUworIyBMaXN0cyB0aGUgbW9kdWxlcyBwYXJ0aWN1bGFyIHByb2R1Y3QgaW5zdGFsbHMuCiAjIFRoZSBiYXNlIGxpc3Qgb2YgbW9kdWxlcyB0byBidWlsZCBmb3IgdGhpcyBwcm9kdWN0IGlzIHNwZWNpZmllZAogIyBieSB0aGUgYXBwcm9wcmlhdGUgcHJvZHVjdCBkZWZpbml0aW9uIGZpbGUsIHdoaWNoIHdhcyBpbmNsdWRlZAogIyBieSBwcm9kdWN0X2NvbmZpZy5tay4KQEAgLTEyNDcsOCArMTAxNiw3IEBACiAjIE5hbWUgcmVzb2x1dGlvbiBmb3IgTE9DQUxfUkVRVUlSRURfTU9EVUxFUzoKICMgICBTZWUgdGhlIHNlbGVjdC1iaXRuZXNzLW9mLXJlcXVpcmVkLW1vZHVsZXMgZGVmaW5pdGlvbi4KICMgJCgxKTogcHJvZHVjdCBtYWtlZmlsZQotCi1kZWZpbmUgcHJvZHVjdC1pbnN0YWxsZWQtZmlsZXMKK2RlZmluZSBwcm9kdWN0LWluc3RhbGxlZC1tb2R1bGVzCiAgICQoZXZhbCBfcGlmX21vZHVsZXMgOj0gXAogICAgICQoY2FsbCBnZXQtcHJvZHVjdC12YXIsJCgxKSxQUk9EVUNUX1BBQ0tBR0VTKSBcCiAgICAgJChpZiAkKGZpbHRlciBlbmcsJCh0YWdzX3RvX2luc3RhbGwpKSwkKGNhbGwgZ2V0LXByb2R1Y3QtdmFyLCQoMSksUFJPRFVDVF9QQUNLQUdFU19FTkcpKSBcCkBAIC0xMjU3LDYgKzEwMjUsMTEgQEAKICAgICAkKGlmICQoZmlsdGVyIGFzYW4sJCh0YWdzX3RvX2luc3RhbGwpKSwkKGNhbGwgZ2V0LXByb2R1Y3QtdmFyLCQoMSksUFJPRFVDVF9QQUNLQUdFU19ERUJVR19BU0FOKSkgXAogICAgICQoaWYgJChmaWx0ZXIgamF2YV9jb3ZlcmFnZSwkKHRhZ3NfdG9faW5zdGFsbCkpLCQoY2FsbCBnZXQtcHJvZHVjdC12YXIsJCgxKSxQUk9EVUNUX1BBQ0tBR0VTX0RFQlVHX0pBVkFfQ09WRVJBR0UpKSBcCiAgICAgJChpZiAkKGZpbHRlciBhcm02NCwkKFRBUkdFVF9BUkNIKSAkKFRBUkdFVF8yTkRfQVJDSCkpLCQoY2FsbCBnZXQtcHJvZHVjdC12YXIsJCgxKSxQUk9EVUNUX1BBQ0tBR0VTX0FSTTY0KSkgXAorICAgICQoaWYgJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCksIFwKKyAgICAgICQoaWYgJChjYWxsIG1hdGhfZ3Rfb3JfZXEsMjksJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCkpLCQoY2FsbCBnZXQtcHJvZHVjdC12YXIsJCgxKSxQUk9EVUNUX1BBQ0tBR0VTX1NISVBQSU5HX0FQSV9MRVZFTF8yOSkpIFwKKyAgICAgICQoaWYgJChjYWxsIG1hdGhfZ3Rfb3JfZXEsMzMsJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCkpLCQoY2FsbCBnZXQtcHJvZHVjdC12YXIsJCgxKSxQUk9EVUNUX1BBQ0tBR0VTX1NISVBQSU5HX0FQSV9MRVZFTF8zMykpIFwKKyAgICAgICQoaWYgJChjYWxsIG1hdGhfZ3Rfb3JfZXEsMzQsJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCkpLCQoY2FsbCBnZXQtcHJvZHVjdC12YXIsJCgxKSxQUk9EVUNUX1BBQ0tBR0VTX1NISVBQSU5HX0FQSV9MRVZFTF8zNCkpIFwKKyAgICApIFwKICAgICAkKGNhbGwgYXV0by1pbmNsdWRlZC1tb2R1bGVzKSBcCiAgICkgXAogICAkKGV2YWwgIyMjIEZpbHRlciBvdXQgdGhlIG92ZXJyaWRkZW4gcGFja2FnZXMgYW5kIGV4ZWN1dGFibGVzIGJlZm9yZSBkb2luZyBleHBhbnNpb24pIFwKQEAgLTEyNjUsNyArMTAzOCwxNCBAQAogICAkKGV2YWwgIyMjIFJlc29sdmUgdGhlIDozMiA6NjQgbW9kdWxlIG5hbWUpIFwKICAgJChldmFsIF9waWZfbW9kdWxlcyA6PSAkKHNvcnQgJChjYWxsIHJlc29sdmUtYml0bmVzcy1mb3ItbW9kdWxlcyxUQVJHRVQsJChfcGlmX21vZHVsZXMpKSkpIFwKICAgJChjYWxsIGV4cGFuZC1yZXF1aXJlZC1tb2R1bGVzLF9waWZfbW9kdWxlcywkKF9waWZfbW9kdWxlcyksJChfcGlmX292ZXJyaWRlcykpIFwKLSAgJChmaWx0ZXItb3V0ICQoSE9TVF9PVVRfUk9PVCkvJSwkKGNhbGwgbW9kdWxlLWluc3RhbGxlZC1maWxlcywgJChfcGlmX21vZHVsZXMpKSkgXAorICAkKF9waWZfbW9kdWxlcykKK2VuZGVmCisKKyMgTGlzdHMgbW9zdCBvZiB0aGUgZmlsZXMgYSBwYXJ0aWN1bGFyIHByb2R1Y3QgaW5zdGFsbHMuCisjIEl0IGdpdmVzIGFsbCB0aGUgaW5zdGFsbGVkIGZpbGVzIGZvciBhbGwgbW9kdWxlcyByZXR1cm5lZCBieSBwcm9kdWN0LWluc3RhbGxlZC1tb2R1bGVzLAorIyBhbmQgYWxzbyBpbmNsdWRlcyBQUk9EVUNUX0NPUFlfRklMRVMuCitkZWZpbmUgcHJvZHVjdC1pbnN0YWxsZWQtZmlsZXMKKyAgJChmaWx0ZXItb3V0ICQoSE9TVF9PVVRfUk9PVCkvJSwkKGNhbGwgbW9kdWxlLWluc3RhbGxlZC1maWxlcywgJChjYWxsIHByb2R1Y3QtaW5zdGFsbGVkLW1vZHVsZXMsJCgxKSkpKSBcCiAgICQoY2FsbCByZXNvbHZlLXByb2R1Y3QtcmVsYXRpdmUtcGF0aHMsXAogICAgICQoZm9yZWFjaCBjZiwkKGNhbGwgZ2V0LXByb2R1Y3QtdmFyLCQoMSksUFJPRFVDVF9DT1BZX0ZJTEVTKSwkKGNhbGwgd29yZC1jb2xvbiwyLCQoY2YpKSkpCiBlbmRlZgpAQCAtMTM2NSw2ICsxMTQ1LDcgQEAKICAgcHJvZHVjdF9ob3N0X0ZJTEVTIDo9ICQoY2FsbCBob3N0LWluc3RhbGxlZC1maWxlcywkKElOVEVSTkFMX1BST0RVQ1QpKQogICBwcm9kdWN0X3RhcmdldF9GSUxFUyA6PSAkKGNhbGwgcHJvZHVjdC1pbnN0YWxsZWQtZmlsZXMsICQoSU5URVJOQUxfUFJPRFVDVCkpCiAgICMgV0FSTklORzogVGhlIHByb2R1Y3RfTU9EVUxFUyB2YXJpYWJsZSBpcyBkZXBlbmRlZCBvbiBieSBleHRlcm5hbCBmaWxlcy4KKyAgIyBJdCBjb250YWlucyB0aGUgbGlzdCBvZiByZWdpc3RlciBuYW1lcyB0aGF0IHdpbGwgYmUgaW5zdGFsbGVkIG9uIHRoZSBkZXZpY2UKICAgcHJvZHVjdF9NT0RVTEVTIDo9ICQoX3BpZl9tb2R1bGVzKQogCiAgICMgVmVyaWZ5IHRoZSBhcnRpZmFjdCBwYXRoIHJlcXVpcmVtZW50cyBtYWRlIGJ5IGluY2x1ZGVkIHByb2R1Y3RzLgpAQCAtMTM5MCwzMyArMTE3MSwxMiBAQAogICAgICQoQ1VTVE9NX01PRFVMRVMpIFwKICAgKQogCi0jIERlZHB1bGljYXRlIGNvbXBhdGliaWxpdHkgc3VpdGUgZGlzdCBmaWxlcyBhY3Jvc3MgbW9kdWxlcyBhbmQgcGFja2FnZXMgYmVmb3JlCisjIERlZHVwbGljYXRlIGNvbXBhdGliaWxpdHkgc3VpdGUgZGlzdCBmaWxlcyBhY3Jvc3MgbW9kdWxlcyBhbmQgcGFja2FnZXMgYmVmb3JlCiAjIGNvcHlpbmcgdGhlbSB0byB0aGVpciByZXF1ZXN0ZWQgbG9jYXRpb25zLiBBc3NpZ24gdGhlIGV2YWwgcmVzdWx0IHRvIGFuIHVudXNlZAogIyB2YXIgdG8gcHJldmVudCBNYWtlIGZyb20gdHJ5aW5nIHRvIG1ha2UgYSBzZW5zZSBvZiBpdC4KIF91bnVzZWQgOj0gJChjYWxsIGNvcHktbWFueS1maWxlcywgJChzb3J0ICQoQUxMX0NPTVBBVElCSUxJVFlfRElTVF9GSUxFUykpKQogCi0jIERvbid0IGluY2x1ZGUgYW55IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHNoYXJlZCBvYmplY3RzIG9yIHN0YXRpYwotIyBsaWJyYXJpZXMgaW4gU0RLIGltYWdlcy4gIEdQTCBleGVjdXRhYmxlcyAobm90IHN0YXRpYy9keW5hbWljIGxpYnJhcmllcykKLSMgYXJlIG9rYXkgaWYgdGhleSBkb24ndCBsaW5rIGFnYWluc3QgYW55IGNsb3NlZCBzb3VyY2UgbGlicmFyaWVzIChkaXJlY3RseQotIyBvciBpbmRpcmVjdGx5KQotCi0jIEl0J3Mgb2sgKGFuZCBuZWNlc3NhcnkpIHRvIGJ1aWxkIHRoZSBob3N0IHRvb2xzLCBidXQgbm90aGluZyB0aGF0J3MKLSMgZ29pbmcgdG8gYmUgaW5zdGFsbGVkIG9uIHRoZSB0YXJnZXQgKGluY2x1ZGluZyBzdGF0aWMgbGlicmFyaWVzKS4KLQogaWZkZWYgaXNfc2RrX2J1aWxkCi0gIHRhcmdldF9nbnVfTU9EVUxFUyA6PSBcCi0gICAgICAgICAgICAgICQoZmlsdGVyIFwKLSAgICAgICAgICAgICAgICAgICAgICAkKFRBUkdFVF9PVVRfSU5URVJNRURJQVRFUykvJSBcCi0gICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfT1VUKS8lIFwKLSAgICAgICAgICAgICAgICAgICAgICAkKFRBUkdFVF9PVVRfREFUQSkvJSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChzb3J0ICQoY2FsbCBnZXQtdGFnZ2VkLW1vZHVsZXMsZ251KSkpCi0gIHRhcmdldF9nbnVfTU9EVUxFUyA6PSAkKGZpbHRlci1vdXQgJChUQVJHRVRfT1VUX0VYRUNVVEFCTEVTKS8lLCQodGFyZ2V0X2dudV9NT0RVTEVTKSkKLSAgdGFyZ2V0X2dudV9NT0RVTEVTIDo9ICQoZmlsdGVyLW91dCAlL2xpYm9wZW5qZGtqdm10aS5zbywkKHRhcmdldF9nbnVfTU9EVUxFUykpCi0gIHRhcmdldF9nbnVfTU9EVUxFUyA6PSAkKGZpbHRlci1vdXQgJS9saWJvcGVuamRranZtdGlkLnNvLCQodGFyZ2V0X2dudV9NT0RVTEVTKSkKLSAgJChpbmZvIFJlbW92aW5nIGZyb20gc2RrOikkKGZvcmVhY2ggZCwkKHRhcmdldF9nbnVfTU9EVUxFUyksJChpbmZvIDogJChkKSkpCi0gIG1vZHVsZXNfdG9faW5zdGFsbCA6PSBcCi0gICAgICAgICAgICAgICQoZmlsdGVyLW91dCAkKHRhcmdldF9nbnVfTU9EVUxFUyksJChtb2R1bGVzX3RvX2luc3RhbGwpKQotCiAgICMgRW5zdXJlIGV2ZXJ5IG1vZHVsZSBsaXN0ZWQgaW4gUFJPRFVDVF9QQUNLQUdFUyogZ2V0cyBzb21ldGhpbmcgaW5zdGFsbGVkCiAgICMgVE9ETzogU2hvdWxkIHdlIGRvIHRoaXMgZm9yIGFsbCBidWlsZHMgYW5kIG5vdCBqdXN0IHRoZSBzZGs/CiAgIGRhbmdsaW5nX21vZHVsZXMgOj0KQEAgLTE0MzcsNiArMTE5NywxNiBAQAogICAgICAgJCh3YXJuaW5nICQoQUxMX01PRFVMRVMuJChtKS5NQUtFRklMRSk6IE1vZHVsZSAnJChtKScgaW4gUFJPRFVDVF9QQUNLQUdFU19URVNUUyBoYXMgbm90aGluZyB0byBpbnN0YWxsISkpKQogZW5kaWYKIAoraWZuZXEgKCQoVEFSR0VUX0JVSUxEX0FQUFMpLCkKKyAgIyBJZiB0aGlzIGJ1aWxkIGlzIGp1c3QgZm9yIGFwcHMsIG9ubHkgYnVpbGQgYXBwcyBhbmQgbm90IHRoZSBmdWxsIHN5c3RlbSBieSBkZWZhdWx0LgorICBpZm5lcSAoJChmaWx0ZXIgYWxsLCQoVEFSR0VUX0JVSUxEX0FQUFMpKSwpCisgICAgIyBJZiB0aGV5IHVzZWQgdGhlIG1hZ2ljIGdvYWwgImFsbCIgdGhlbiBidWlsZCBhbGwgYXBwcyBpbiB0aGUgc291cmNlIHRyZWUuCisgICAgdW5idW5kbGVkX2J1aWxkX21vZHVsZXMgOj0gJChmb3JlYWNoIG0sJChzb3J0ICQoQUxMX01PRFVMRVMpKSwkKGlmICQoZmlsdGVyIEFQUFMsJChBTExfTU9EVUxFUy4kKG0pLkNMQVNTKSksJChtKSkpCisgIGVsc2UKKyAgICB1bmJ1bmRsZWRfYnVpbGRfbW9kdWxlcyA6PSAkKHNvcnQgJChUQVJHRVRfQlVJTERfQVBQUykpCisgIGVuZGlmCitlbmRpZgorCiAjIGJ1aWxkL21ha2UvY29yZS9NYWtlZmlsZSBjb250YWlucyBleHRyYSBzdHVmZiB0aGF0IHdlIGRvbid0IHdhbnQgdG8gcG9sbHV0ZSB0aGlzCiAjIHRvcC1sZXZlbCBtYWtlZmlsZSB3aXRoLiAgSXQgZXhwZWN0cyB0aGF0IEFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTCiAjIGNvbnRhaW5zIGV2ZXJ5dGhpbmcgdGhhdCdzIGJ1aWx0IGR1cmluZyB0aGUgY3VycmVudCBtYWtlLCBidXQgaXQgYWxzbyBmdXJ0aGVyCkBAIC0xNjI5LDYgKzEzOTksNyBAQAogICAgICQoSU5TVEFMTEVEX1JBTURJU0tfVEFSR0VUKSBcCiAgICAgJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCkgXAogICAgICQoSU5TVEFMTEVEX0lOSVRfQk9PVF9JTUFHRV9UQVJHRVQpIFwKKyAgICAkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKSBcCiAgICAgJChJTlNUQUxMRURfUkFESU9JTUFHRV9UQVJHRVQpIFwKICAgICAkKElOU1RBTExFRF9ERUJVR19SQU1ESVNLX1RBUkdFVCkgXAogICAgICQoSU5TVEFMTEVEX0RFQlVHX0JPT1RJTUFHRV9UQVJHRVQpIFwKQEAgLTE2NTQsNiArMTQyNSw3IEBACiAgICAgJChJTlNUQUxMRURfU1lTVEVNX0RMS01JTUFHRV9UQVJHRVQpIFwKICAgICAkKElOU1RBTExFRF9TVVBFUklNQUdFX0VNUFRZX1RBUkdFVCkgXAogICAgICQoSU5TVEFMTEVEX1BST0RVQ1RJTUFHRV9UQVJHRVQpIFwKKyAgICAkKElOU1RBTExFRF9TWVNURU1fRVhUSU1BR0VfVEFSR0VUKSBcCiAgICAgJChJTlNUQUxMRURfU1lTVEVNT1RIRVJJTUFHRV9UQVJHRVQpIFwKICAgICAkKElOU1RBTExFRF9URVNUX0hBUk5FU1NfUkFNRElTS19UQVJHRVQpIFwKICAgICAkKElOU1RBTExFRF9URVNUX0hBUk5FU1NfQk9PVElNQUdFX1RBUkdFVCkgXApAQCAtMTY5OSwxMCArMTQ3MSw4IEBACiAjIGRpc3RfZmlsZXMgb25seSBmb3IgcHV0dGluZyB5b3VyIGxpYnJhcnkgaW50byB0aGUgZGlzdCBkaXJlY3Rvcnkgd2l0aCBhIGZ1bGwgYnVpbGQuCiAuUEhPTlk6IGRpc3RfZmlsZXMKIAotaWZlcSAoJChTT09OR19DT0xMRUNUX0pBVkFfREVQUyksIHRydWUpCi0gICQoY2FsbCBkaXN0LWZvci1nb2FscywgZGlzdF9maWxlcywgJChTT09OR19PVVRfRElSKS9tb2R1bGVfYnBfamF2YV9kZXBzLmpzb24pCi0gICQoY2FsbCBkaXN0LWZvci1nb2FscywgZGlzdF9maWxlcywgJChQUk9EVUNUX09VVCkvbW9kdWxlLWluZm8uanNvbikKLWVuZGlmCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGRpc3RfZmlsZXMsICQoU09PTkdfT1VUX0RJUikvbW9kdWxlX2JwX2phdmFfZGVwcy5qc29uKQorJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBkaXN0X2ZpbGVzLCAkKFBST0RVQ1RfT1VUKS9tb2R1bGUtaW5mby5qc29uKQogCiAuUEhPTlk6IGFwcHNfb25seQogaWZlcSAoJChIT1NUX09TKSxkYXJ3aW4pCkBAIC0xNzEyLDE2ICsxNDgyLDEwIEBACiBlbHNlIGlmbmVxICgkKFRBUkdFVF9CVUlMRF9BUFBTKSwpCiAgICMgSWYgdGhpcyBidWlsZCBpcyBqdXN0IGZvciBhcHBzLCBvbmx5IGJ1aWxkIGFwcHMgYW5kIG5vdCB0aGUgZnVsbCBzeXN0ZW0gYnkgZGVmYXVsdC4KIAotICB1bmJ1bmRsZWRfYnVpbGRfbW9kdWxlcyA6PQotICBpZm5lcSAoJChmaWx0ZXIgYWxsLCQoVEFSR0VUX0JVSUxEX0FQUFMpKSwpCi0gICAgIyBJZiB0aGV5IHVzZWQgdGhlIG1hZ2ljIGdvYWwgImFsbCIgdGhlbiBidWlsZCBhbGwgYXBwcyBpbiB0aGUgc291cmNlIHRyZWUuCi0gICAgdW5idW5kbGVkX2J1aWxkX21vZHVsZXMgOj0gJChmb3JlYWNoIG0sJChzb3J0ICQoQUxMX01PRFVMRVMpKSwkKGlmICQoZmlsdGVyIEFQUFMsJChBTExfTU9EVUxFUy4kKG0pLkNMQVNTKSksJChtKSkpCi0gIGVsc2UKLSAgICB1bmJ1bmRsZWRfYnVpbGRfbW9kdWxlcyA6PSAkKFRBUkdFVF9CVUlMRF9BUFBTKQotICBlbmRpZgotCi0gICMgRGlzdCB0aGUgaW5zdGFsbGVkIGZpbGVzIGlmIHRoZXkgZXhpc3QuCi0gIGFwcHNfb25seV9pbnN0YWxsZWRfZmlsZXMgOj0gJChmb3JlYWNoIG0sJCh1bmJ1bmRsZWRfYnVpbGRfbW9kdWxlcyksJChBTExfTU9EVUxFUy4kKG0pLklOU1RBTExFRCkpCisgICMgRGlzdCB0aGUgaW5zdGFsbGVkIGZpbGVzIGlmIHRoZXkgZXhpc3QsIGV4Y2VwdCB0aGUgaW5zdGFsbGVkIHN5bWxpbmtzLiBkaXN0LWZvci1nb2FscyBlbWl0cworICAjIGBjcCBzcmMgZGVzdGAgY29tbWFuZHMsIHdoaWNoIHdpbGwgZmFpbCB0byBjb3B5IGRhbmdsaW5nIHN5bWxpbmtzLgorICBhcHBzX29ubHlfaW5zdGFsbGVkX2ZpbGVzIDo9ICQoZm9yZWFjaCBtLCQodW5idW5kbGVkX2J1aWxkX21vZHVsZXMpLFwKKyAgICAkKGZpbHRlci1vdXQgJChBTExfTU9EVUxFUy4kKG0pLklOU1RBTExFRF9TWU1MSU5LUyksJChBTExfTU9EVUxFUy4kKG0pLklOU1RBTExFRCkpKQogICAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsYXBwc19vbmx5LCAkKGFwcHNfb25seV9pbnN0YWxsZWRfZmlsZXMpKQogCiAgICMgRGlzdCB0aGUgYnVuZGxlIGZpbGVzIGlmIHRoZXkgZXhpc3QuCkBAIC0xNzUxLDE1ICsxNTE1LDE1IEBACiAgIGVuZGlmCiAKICAgJChQUk9HVUFSRF9ESUNUX1pJUCkgOiAkKGFwcHNfb25seV9pbnN0YWxsZWRfZmlsZXMpCi0gICQoY2FsbCBkaXN0LWZvci1nb2FscyxhcHBzX29ubHksICQoUFJPR1VBUkRfRElDVF9aSVApICQoUFJPR1VBUkRfRElDVF9NQVBQSU5HKSkKKyAgJChjYWxsIGRpc3QtZm9yLWdvYWxzLXdpdGgtZmlsZW5hbWV0YWcsYXBwc19vbmx5LCAkKFBST0dVQVJEX0RJQ1RfWklQKSAkKFBST0dVQVJEX0RJQ1RfWklQKSAkKFBST0dVQVJEX0RJQ1RfTUFQUElORykpCiAgICQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJChQUk9HVUFSRF9ESUNUX1pJUCksJChhcHBzX29ubHlfaW5zdGFsbGVkX2ZpbGVzKSwkKFBST0RVQ1RfT1VUKS86LykKIAogICAkKFBST0dVQVJEX1VTQUdFX1pJUCkgOiAkKGFwcHNfb25seV9pbnN0YWxsZWRfZmlsZXMpCi0gICQoY2FsbCBkaXN0LWZvci1nb2FscyxhcHBzX29ubHksICQoUFJPR1VBUkRfVVNBR0VfWklQKSkKKyAgJChjYWxsIGRpc3QtZm9yLWdvYWxzLXdpdGgtZmlsZW5hbWV0YWcsYXBwc19vbmx5LCAkKFBST0dVQVJEX1VTQUdFX1pJUCkpCiAgICQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJChQUk9HVUFSRF9VU0FHRV9aSVApLCQoYXBwc19vbmx5X2luc3RhbGxlZF9maWxlcyksJChQUk9EVUNUX09VVCkvOi8pCiAKICAgJChTWU1CT0xTX1pJUCkgOiAkKGFwcHNfb25seV9pbnN0YWxsZWRfZmlsZXMpCi0gICQoY2FsbCBkaXN0LWZvci1nb2FscyxhcHBzX29ubHksICQoU1lNQk9MU19aSVApICQoU1lNQk9MU19NQVBQSU5HKSkKKyAgJChjYWxsIGRpc3QtZm9yLWdvYWxzLXdpdGgtZmlsZW5hbWV0YWcsYXBwc19vbmx5LCAkKFNZTUJPTFNfWklQKSAkKFNZTUJPTFNfTUFQUElORykpCiAgICQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJChTWU1CT0xTX1pJUCksJChhcHBzX29ubHlfaW5zdGFsbGVkX2ZpbGVzKSwkKFBST0RVQ1RfT1VUKS86LykKIAogICAkKENPVkVSQUdFX1pJUCkgOiAkKGFwcHNfb25seV9pbnN0YWxsZWRfZmlsZXMpCkBAIC0xODA1LDE3ICsxNTY5LDIzIEBACiAgICMgYXZvaWQgZGlzdGluZyB0YXJnZXRzIHRoYXQgd291bGQgY2F1c2UgYnVpbGRpbmcgZnJhbWV3b3JrIGphdmEgc291cmNlcywKICAgIyB3aGljaCB3ZSB3YW50IHRvIGF2b2lkIGluIGFuIHVuYnVuZGxlZCBidWlsZC4KIAotICAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGRyb2lkY29yZS11bmJ1bmRsZWQsIFwKKyAgJChjYWxsIGRpc3QtZm9yLWdvYWxzLXdpdGgtZmlsZW5hbWV0YWcsIGRyb2lkY29yZS11bmJ1bmRsZWQsIFwKICAgICAkKElOVEVSTkFMX1VQREFURV9QQUNLQUdFX1RBUkdFVCkgXAogICAgICQoSU5URVJOQUxfT1RBX1BBQ0tBR0VfVEFSR0VUKSBcCi0gICAgJChJTlRFUk5BTF9PVEFfTUVUQURBVEEpIFwKICAgICAkKElOVEVSTkFMX09UQV9QQVJUSUFMX1BBQ0tBR0VfVEFSR0VUKSBcCisgICAgJChCVUlMVF9SQU1ESVNLXzE2S19UQVJHRVQpIFwKKyAgICAkKEJVSUxUX0tFUk5FTF8xNktfVEFSR0VUKSBcCiAgICAgJChJTlRFUk5BTF9PVEFfUkVUUk9GSVRfRFlOQU1JQ19QQVJUSVRJT05TX1BBQ0tBR0VfVEFSR0VUKSBcCiAgICAgJChTWU1CT0xTX1pJUCkgXAogICAgICQoU1lNQk9MU19NQVBQSU5HKSBcCiAgICAgJChQUk9HVUFSRF9ESUNUX1pJUCkgXAogICAgICQoUFJPR1VBUkRfRElDVF9NQVBQSU5HKSBcCiAgICAgJChQUk9HVUFSRF9VU0FHRV9aSVApIFwKKyAgICAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKSBcCisgICkKKworICAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGRyb2lkY29yZS11bmJ1bmRsZWQsIFwKKyAgICAkKElOVEVSTkFMX09UQV9NRVRBREFUQSkgXAogICAgICQoQ09WRVJBR0VfWklQKSBcCiAgICAgJChJTlNUQUxMRURfRklMRVNfRklMRSkgXAogICAgICQoSU5TVEFMTEVEX0ZJTEVTX0pTT04pIFwKQEAgLTE4MzcsMTMgKzE2MDcsMTIgQEAKICAgICAkKElOU1RBTExFRF9GSUxFU19KU09OX1NZU1RFTU9USEVSKSBcCiAgICAgJChJTlNUQUxMRURfRklMRVNfRklMRV9SRUNPVkVSWSkgXAogICAgICQoSU5TVEFMTEVEX0ZJTEVTX0pTT05fUkVDT1ZFUlkpIFwKLSAgICAkKElOU1RBTExFRF9CVUlMRF9QUk9QX1RBUkdFVCk6YnVpbGQucHJvcCBcCi0gICAgJChJTlNUQUxMRURfVkVORE9SX0JVSUxEX1BST1BfVEFSR0VUKTpidWlsZC5wcm9wLXZlbmRvciBcCi0gICAgJChJTlNUQUxMRURfUFJPRFVDVF9CVUlMRF9QUk9QX1RBUkdFVCk6YnVpbGQucHJvcC1wcm9kdWN0IFwKLSAgICAkKElOU1RBTExFRF9PRE1fQlVJTERfUFJPUF9UQVJHRVQpOmJ1aWxkLnByb3Atb2RtIFwKLSAgICAkKElOU1RBTExFRF9TWVNURU1fRVhUX0JVSUxEX1BST1BfVEFSR0VUKTpidWlsZC5wcm9wLXN5c3RlbV9leHQgXAotICAgICQoSU5TVEFMTEVEX1JBTURJU0tfQlVJTERfUFJPUF9UQVJHRVQpOmJ1aWxkLnByb3AtcmFtZGlzayBcCi0gICAgJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSkgXAorICAgICQoaWYgJChCVUlMRElOR19TWVNURU1fSU1BR0UpLCAkKElOU1RBTExFRF9CVUlMRF9QUk9QX1RBUkdFVCk6YnVpbGQucHJvcCkgXAorICAgICQoaWYgJChCVUlMRElOR19WRU5ET1JfSU1BR0UpLCAkKElOU1RBTExFRF9WRU5ET1JfQlVJTERfUFJPUF9UQVJHRVQpOmJ1aWxkLnByb3AtdmVuZG9yKSBcCisgICAgJChpZiAkKEJVSUxESU5HX1BST0RVQ1RfSU1BR0UpLCAkKElOU1RBTExFRF9QUk9EVUNUX0JVSUxEX1BST1BfVEFSR0VUKTpidWlsZC5wcm9wLXByb2R1Y3QpIFwKKyAgICAkKGlmICQoQlVJTERJTkdfT0RNX0lNQUdFKSwgJChJTlNUQUxMRURfT0RNX0JVSUxEX1BST1BfVEFSR0VUKTpidWlsZC5wcm9wLW9kbSkgXAorICAgICQoaWYgJChCVUlMRElOR19TWVNURU1fRVhUX0lNQUdFKSwgJChJTlNUQUxMRURfU1lTVEVNX0VYVF9CVUlMRF9QUk9QX1RBUkdFVCk6YnVpbGQucHJvcC1zeXN0ZW1fZXh0KSBcCisgICAgJChpZiAkKEJVSUxESU5HX1JBTURJU0tfSU1BR0UpLCAkKElOU1RBTExFRF9SQU1ESVNLX0JVSUxEX1BST1BfVEFSR0VUKTpidWlsZC5wcm9wLXJhbWRpc2spIFwKICAgICAkKElOU1RBTExFRF9BTkRST0lEX0lORk9fVFhUX1RBUkdFVCkgXAogICAgICQoSU5TVEFMTEVEX01JU0NfSU5GT19UQVJHRVQpIFwKICAgICAkKElOU1RBTExFRF9SQU1ESVNLX1RBUkdFVCkgXApAQCAtMTg1NSw3ICsxNjI0LDcgQEAKICAgICAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGRyb2lkY29yZS11bmJ1bmRsZWQsICQoZikpKQogCiAgIGlmbmVxICgkKEFORFJPSURfQlVJTERfRU1CRURERUQpLHRydWUpCi0gICAgJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBkcm9pZGNvcmUsIFwKKyAgICAkKGNhbGwgZGlzdC1mb3ItZ29hbHMtd2l0aC1maWxlbmFtZXRhZywgZHJvaWRjb3JlLCBcCiAgICAgICAkKEFQUFNfWklQKSBcCiAgICAgICAkKElOVEVSTkFMX0VNVUxBVE9SX1BBQ0tBR0VfVEFSR0VUKSBcCiAgICAgKQpAQCAtMTkxNCw3ICsxNjgzLDcgQEAKICAgJChhcGlfeG1scyk6CiAJJChoaWRlKSBlY2hvICJDb252ZXJ0aW5nIEFQSSBmaWxlIHRvIFhNTDogJEAiCiAJJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkKLQkkKGhpZGUpICQoQVBJQ0hFQ0tfQ09NTUFORCkgLS1pbnB1dC1hcGktamFyICQ8IC0tYXBpLXhtbCAkQAorCSQoaGlkZSkgJChBUElDSEVDS19DT01NQU5EKSBqYXItdG8tamRpZmYgJDwgJEAKIAogICAkKGZvcmVhY2ggeG1sLCQoc29ydCAkKGFwaV94bWxzKSksJChjYWxsIGRlY2xhcmUtMXAtdGFyZ2V0LCQoeG1sKSwpKQogCkBAIC0xOTU1LDEwICsxNzI0LDggQEAKIGlmZXEgKCQoSE9TVF9PUyksbGludXgpCiBBTExfU0RLX1RBUkdFVFMgOj0gJChJTlRFUk5BTF9TREtfVEFSR0VUKQogc2RrOiAkKEFMTF9TREtfVEFSR0VUUykKLSQoY2FsbCBkaXN0LWZvci1nb2FscyxzZGssIFwKLSAgICAkKEFMTF9TREtfVEFSR0VUUykgXAotICAgICQoSU5TVEFMTEVEX0JVSUxEX1BST1BfVEFSR0VUKSBcCi0pCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMtd2l0aC1maWxlbmFtZXRhZyxzZGssJChBTExfU0RLX1RBUkdFVFMpKQorJChjYWxsIGRpc3QtZm9yLWdvYWxzLHNkaywkKElOU1RBTExFRF9CVUlMRF9QUk9QX1RBUkdFVCkpCiBlbmRpZgogCiAjIHVtYnJlbGxhIHRhcmdldHMgdG8gYXNzaXQgZW5naW5lZXJzIGluIHZlcmlmeWluZyBidWlsZHMKQEAgLTE5ODMsMzcgKzE3NTAsMTUgQEAKIC5QSE9OWTogZmluZGJ1Z3MKIGZpbmRidWdzOiAkKElOVEVSTkFMX0ZJTkRCVUdTX0hUTUxfVEFSR0VUKSAkKElOVEVSTkFMX0ZJTkRCVUdTX1hNTF9UQVJHRVQpCiAKLUxTRFVNUF9QQVRIU19GSUxFIDo9ICQoUFJPRFVDVF9PVVQpL2xzZHVtcF9wYXRocy50eHQKLQotLlBIT05ZOiBmaW5kbHNkdW1wcwotIyBMU0RVTVBfUEFUSFMgaXMgYSBsaXN0IG9mIHRhZzpwYXRoLgotZmluZGxzZHVtcHM6ICQoTFNEVU1QX1BBVEhTX0ZJTEUpICQoZm9yZWFjaCBwLCQoTFNEVU1QX1BBVEhTKSwkKGNhbGwgd29yZC1jb2xvbiwyLCQocCkpKQotCi0kKExTRFVNUF9QQVRIU19GSUxFKTogUFJJVkFURV9MU0RVTVBfUEFUSFMgOj0gJChMU0RVTVBfUEFUSFMpCi0kKExTRFVNUF9QQVRIU19GSUxFKToKLQlAZWNobyAiR2VuZXJhdGUgJEAiCi0JQHJtIC1yZiAkQCAmJiBlY2hvIC1lICIkKHN1YnN0IDosOiQoc3BhY2UpLCQoc3Vic3QgJChzcGFjZSksXG4sJChQUklWQVRFX0xTRFVNUF9QQVRIUykpKSIgPiAkQAotCiAuUEhPTlk6IGNoZWNrLWVsZi1maWxlcwogY2hlY2stZWxmLWZpbGVzOgogCi0jeHh4IHNjcmFwZSB0aGlzIGZyb20gQUxMX01PRFVMRV9OQU1FX1RBR1MKLS5QSE9OWTogbW9kdWxlcwotbW9kdWxlczoKLQlAZWNobyAiQXZhaWxhYmxlIHN1Yi1tb2R1bGVzOiIKLQlAZWNobyAiJChjYWxsIG1vZHVsZS1uYW1lcy1mb3ItdGFnLWxpc3QsJChBTExfTU9EVUxFX1RBR1MpKSIgfCBcCi0JICAgICAgdHIgLXMgJyAnICdcbicgfCBzb3J0IC11Ci0KIC5QSE9OWTogZHVtcC1maWxlcwogZHVtcC1maWxlczoKIAlAZWNobyAiVGFyZ2V0IGZpbGVzIGZvciAkKFRBUkdFVF9QUk9EVUNUKS0kKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSAoJChJTlRFUk5BTF9QUk9EVUNUKSk6IgogCUBlY2hvICQoc29ydCAkKHBhdHN1YnN0ICQoUFJPRFVDVF9PVVQpLyUsJSwkKGZpbHRlciAkKFBST0RVQ1RfT1VUKS8lLCQobW9kdWxlc190b19pbnN0YWxsKSkpKSB8IHRyIC1zICcgJyAnXG4nCiAJQGVjaG8gU3VjY2Vzc2Z1bGx5IGR1bXBlZCBwcm9kdWN0IHRhcmdldCBmaWxlIGxpc3QuCiAKLS5QSE9OWTogbm90aGluZwotbm90aGluZzoKLQlAZWNobyBTdWNjZXNzZnVsbHkgcmVhZCB0aGUgbWFrZWZpbGVzLgotCiAuUEhPTlk6IHRpZHlfb25seQogdGlkeV9vbmx5OgogCUBlY2hvIFN1Y2Nlc3NmdWxseSBtYWtlIHRpZHlfb25seS4KQEAgLTIxMzMsNTggKzE4NzgsMzkgQEAKIGZpbHRlcl9vdXRfZmlsZXMgKz0gJChQUk9EVUNUX09VVCkvcmVjb3ZlcnkvJQogZW5kaWYKIAorIyB1c2VyZGF0YS5pbWcKK2lmbmRlZiBCVUlMRElOR19VU0VSREFUQV9JTUFHRQorZmlsdGVyX291dF9maWxlcyArPSAkKFBST0RVQ1RfT1VUKS9kYXRhLyUKK2VuZGlmCisKIGluc3RhbGxlZF9maWxlcyA6PSAkKHNvcnQgJChmaWx0ZXItb3V0ICQoZmlsdGVyX291dF9maWxlcyksJChmaWx0ZXIgJChQUk9EVUNUX09VVCkvJSwkKG1vZHVsZXNfdG9faW5zdGFsbCkpKSkKIGVsc2UKIGluc3RhbGxlZF9maWxlcyA6PSAkKGFwcHNfb25seV9pbnN0YWxsZWRfZmlsZXMpCiBlbmRpZiAgIyBUQVJHRVRfQlVJTERfQVBQUwogCi0jIHNib20tbWV0YWRhdGEuY3N2IGNvbnRhaW5zIGFsbCByYXcgZGF0YSBjb2xsZWN0ZWQgaW4gTWFrZSBmb3IgZ2VuZXJhdGluZyBTQk9NIGluIGdlbmVyYXRlLXNib20ucHkuCi0jIFRoZXJlIGFyZSBtdWx0aXBsZSBjb2x1bW5zIGFuZCBlYWNoIGlkZW50aWZpZXMgdGhlIHNvdXJjZSBvZiBhbiBpbnN0YWxsZWQgZmlsZSBmb3IgYSBzcGVjaWZpYyBjYXNlLgotIyBUaGUgY29sdW1ucyBhbmQgdGhlaXIgdXNlcyBhcmUgZGVzY3JpYmVkIGFzIGJlbG93OgotIyAgIGluc3RhbGxlZF9maWxlOiB0aGUgZmlsZSBwYXRoIG9uIGRldmljZSwgZS5nLiAvcHJvZHVjdC9hcHAvQnJvd3NlcjIvQnJvd3NlcjIuYXBrCi0jICAgbW9kdWxlX3BhdGg6IHRoZSBwYXRoIG9mIHRoZSBtb2R1bGUgdGhhdCBnZW5lcmF0ZXMgdGhlIGluc3RhbGxlZCBmaWxlLCBlLmcuIHBhY2thZ2VzL2FwcHMvQnJvd3NlcjIKLSMgICBzb29uZ19tb2R1bGVfdHlwZTogU29vbmcgbW9kdWxlIHR5cGUsIGUuZy4gYW5kcm9pZF9hcHAsIGNjX2JpbmFyeQotIyAgIGlzX3ByZWJ1aWx0X21ha2VfbW9kdWxlOiBZLCBpZiB0aGUgaW5zdGFsbGVkIGZpbGUgaXMgZnJvbSBhIHByZWJ1aWx0IE1ha2UgbW9kdWxlLCBzZWUgcHJlYnVpbHRfaW50ZXJuYWwubWsKLSMgICBwcm9kdWN0X2NvcHlfZmlsZXM6IHRoZSBpbnN0YWxsZWQgZmlsZSBpcyBmcm9tIHZhcmlhYmxlIFBST0RVQ1RfQ09QWV9GSUxFUywgZS5nLiBkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gvc2hhcmVkL2NvbmZpZy9pbml0LnByb2R1Y3QucmM6cHJvZHVjdC9ldGMvaW5pdC9pbml0LnJjCi0jICAga2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzOiB0aGUgaW5zdGFsbGVkIGZpbGUgaXMgZnJvbSB2YXJpYWJsZSBLRVJORUxfTU9EVUxFX0NPUFlfRklMRVMsIHNpbWlsYXIgdG8gcHJvZHVjdF9jb3B5X2ZpbGVzCi0jICAgaXNfcGxhdGZvcm1fZ2VuZXJhdGVkOiB0aGlzIGlzIGFuIGFnZ3JlZ2F0ZWQgdmFsdWUgaW5jbHVkaW5nIHNvbWUgc21hbGwgY2FzZXMgaW5zdGVhZCBvZiBhZGRpbmcgbW9yZSBjb2x1bW5zLiBJdCBpcyBzZXQgdG8gWSBpZiBhbnkgY2FzZSBpcyBZCi0jICAgICAgIGlzX2J1aWxkX3Byb3A6IGJ1aWxkLnByb3AgaW4gZWFjaCBwYXJ0aXRpb24sIHNlZSBzeXNwcm9wLm1rLgotIyAgICAgICBpc19ub3RpY2VfZmlsZTogTk9USUNFLnhtbC5neiBpbiBlYWNoIHBhcnRpdGlvbiwgc2VlIE1ha2VmaWxlLgotIyAgICAgICBpc19kZXhwcmVvcHRfaW1hZ2VfcHJvZmlsZTogc2VlIHRoZSB1c2FnZSBvZiBERVhQUkVPUFRfSU1BR0VfUFJPRklMRV9CVUlMVF9JTlNUQUxMRUQgaW4gU29vbmcgYW5kIE1ha2UKLSMgICAgICAgaXNfcHJvZHVjdF9zeXN0ZW1fb3RoZXJfYXZia2V5OiBzZWUgSU5TVEFMTEVEX1BST0RVQ1RfU1lTVEVNX09USEVSX0FWQktFWV9UQVJHRVQKLSMgICAgICAgaXNfc3lzdGVtX290aGVyX29kZXhfbWFya2VyOiBzZWUgSU5TVEFMTEVEX1NZU1RFTV9PVEhFUl9PREVYX01BUktFUgotIyAgICAgICBpc19ldmVudF9sb2dfdGFnc19maWxlOiBzZWUgdmFyaWFibGUgZXZlbnRfbG9nX3RhZ3NfZmlsZSBpbiBNYWtlZmlsZQotIyAgICAgICBpc19rZXJuZWxfbW9kdWxlc19ibG9ja2xpc3Q6IG1vZHVsZXMuYmxvY2tsaXN0IGNyZWF0ZWQgZm9yIF9kbGttIHBhcnRpdGlvbnMsIHNlZSBtYWNybyBidWlsZC1pbWFnZS1rZXJuZWwtbW9kdWxlcy1kaXIgaW4gTWFrZWZpbGUuCi0jICAgICAgIGlzX2ZzdmVyaXR5X2J1aWxkX21hbmlmZXN0X2FwazogQnVpbGRNYW5pZmVzdDxwYXJ0Pi5hcGsgZmlsZXMgZm9yIHN5c3RlbSBhbmQgc3lzdGVtX2V4dCBwYXJ0aXRpb24sIHNlZSBBTExfRlNWRVJJVFlfQlVJTERfTUFOSUZFU1RfQVBLIGluIE1ha2VmaWxlLgotIyAgICAgICBpc19saW5rZXJfY29uZmlnOiBzZWUgU1lTVEVNX0xJTktFUl9DT05GSUcgYW5kIHZlbmRvcl9saW5rZXJfY29uZmlnX2ZpbGUgaW4gTWFrZWZpbGUuCi0jICAgYnVpbGRfb3V0cHV0X3BhdGg6IHRoZSBwYXRoIG9mIHRoZSBidWlsdCBmaWxlLCB1c2VkIHRvIGNhbGN1bGF0ZSBjaGVja3N1bQotIyAgIHN0YXRpY19saWJyYXJpZXMvd2hvbGVfc3RhdGljX2xpYnJhcmllczogbGlzdCBvZiBtb2R1bGUgbmFtZSBvZiB0aGUgc3RhdGljIGxpYnJhcmllcyB0aGUgZmlsZSBsaW5rcyBhZ2FpbnN0LCBlLmcuIGxpYmNsYW5nX3J0LmJ1aWx0aW5zIG9yIGxpYmNsYW5nX3J0LmJ1aWx0aW5zXzMyCi0jICAgICAgIEluZm8gb2YgYWxsIHN0YXRpYyBsaWJyYXJpZXMgb2YgYWxsIGluc3RhbGxlZCBmaWxlcyBhcmUgY29sbGVjdGVkIGluIHZhcmlhYmxlIF9hbGxfc3RhdGljX2xpYnMgdGhhdCBpcyB1c2VkIHRvIGxpc3QgYWxsIHRoZSBzdGF0aWMgbGlicmFyeSBmaWxlcyBpbiBzYm9tLW1ldGFkYXRhLmNzdi4KLSMgICAgICAgU2VlIHRoZSBzZWNvbmQgZm9yZWFjaCBsb29wIGluIHRoZSBydWxlIG9mIHNib20tbWV0YWRhdGEuY3N2IGZvciB0aGUgZGV0YWlsZWQgaW5mbyBvZiBzdGF0aWMgbGlicmFyaWVzIGNvbGxlY3RlZCBpbiBfYWxsX3N0YXRpY19saWJzLgotIyAgIGlzX3N0YXRpY19saWI6IHdoZXRoZXIgdGhlIGZpbGUgaXMgYSBzdGF0aWMgbGlicmFyeQotCiBtZXRhZGF0YV9saXN0IDo9ICQoT1VUX0RJUikvLm1vZHVsZV9wYXRocy9NRVRBREFUQS5saXN0CiBtZXRhZGF0YV9maWxlcyA6PSAkKHN1YnN0ICQobmV3bGluZSksJChzcGFjZSksJChmaWxlIDwkKG1ldGFkYXRhX2xpc3QpKSkKLSMgKFRPRE86IGIvMjcyMzU4NTgzIGZpbmQgYW5vdGhlciB3YXkgb2YgYWx3YXlzIHJlYnVpbGRpbmcgdGhpcyB0YXJnZXQpCi0jIFJlbW92ZSB0aGUgc2JvbS1tZXRhZGF0YS5jc3Ygd2hlbmV2ZXIgbWFrZWZpbGUgaXMgZXZhbHVhdGVkCi0kKHNoZWxsIHJtICQoUFJPRFVDVF9PVVQpL3Nib20tbWV0YWRhdGEuY3N2ID4vZGV2L251bGwgMj4mMSkKLSQoUFJPRFVDVF9PVVQpL3Nib20tbWV0YWRhdGEuY3N2OiAkKGluc3RhbGxlZF9maWxlcykgJChtZXRhZGF0YV9saXN0KSAkKG1ldGFkYXRhX2ZpbGVzKQorCisjIENyZWF0ZSBtZXRhZGF0YSBmb3IgY29tcGxpYW5jZSBzdXBwb3J0IGluIFNvb25nCisuUEhPTlk6IG1ha2UtY29tcGxpYW5jZS1tZXRhZGF0YQorbWFrZS1jb21wbGlhbmNlLW1ldGFkYXRhOiBcCisgICAgJChTT09OR19PVVRfRElSKS9jb21wbGlhbmNlLW1ldGFkYXRhLyQoVEFSR0VUX1BST0RVQ1QpL21ha2UtbWV0YWRhdGEuY3N2IFwKKyAgICAkKFNPT05HX09VVF9ESVIpL2NvbXBsaWFuY2UtbWV0YWRhdGEvJChUQVJHRVRfUFJPRFVDVCkvbWFrZS1tb2R1bGVzLmNzdgorCiskKFNPT05HX09VVF9ESVIpL2NvbXBsaWFuY2UtbWV0YWRhdGEvJChUQVJHRVRfUFJPRFVDVCkvbWFrZS1tZXRhZGF0YS5jc3Y6CiAJcm0gLWYgJEAKLQllY2hvIGluc3RhbGxlZF9maWxlLG1vZHVsZV9wYXRoLHNvb25nX21vZHVsZV90eXBlLGlzX3ByZWJ1aWx0X21ha2VfbW9kdWxlLHByb2R1Y3RfY29weV9maWxlcyxrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMsaXNfcGxhdGZvcm1fZ2VuZXJhdGVkLGJ1aWxkX291dHB1dF9wYXRoLHN0YXRpY19saWJyYXJpZXMsd2hvbGVfc3RhdGljX2xpYnJhcmllcyxpc19zdGF0aWNfbGliID4+ICRACi0JJChldmFsIF9hbGxfc3RhdGljX2xpYnMgOj0pCisJZWNobyAnaW5zdGFsbGVkX2ZpbGUsbW9kdWxlX3BhdGgsaXNfc29vbmdfbW9kdWxlLGlzX3ByZWJ1aWx0X21ha2VfbW9kdWxlLHByb2R1Y3RfY29weV9maWxlcyxrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMsaXNfcGxhdGZvcm1fZ2VuZXJhdGVkLHN0YXRpY19saWJzLHdob2xlX3N0YXRpY19saWJzLGxpY2Vuc2VfdGV4dCcgPj4gJEAKIAkkKGZvcmVhY2ggZiwkKGluc3RhbGxlZF9maWxlcyksXAogCSAgJChldmFsIF9tb2R1bGVfbmFtZSA6PSAkKEFMTF9JTlNUQUxMRURfRklMRVMuJGYpKSBcCiAJICAkKGV2YWwgX3BhdGhfb25fZGV2aWNlIDo9ICQocGF0c3Vic3QgJChQUk9EVUNUX09VVCkvJSwlLCRmKSkgXAogCSAgJChldmFsIF9idWlsZF9vdXRwdXRfcGF0aCA6PSAkKFBST0RVQ1RfT1VUKS8kKF9wYXRoX29uX2RldmljZSkpIFwKIAkgICQoZXZhbCBfbW9kdWxlX3BhdGggOj0gJChzdHJpcCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKF9tb2R1bGVfbmFtZSkuUEFUSCkpKSkgXAotCSAgJChldmFsIF9zb29uZ19tb2R1bGVfdHlwZSA6PSAkKHN0cmlwICQoc29ydCAkKEFMTF9NT0RVTEVTLiQoX21vZHVsZV9uYW1lKS5TT09OR19NT0RVTEVfVFlQRSkpKSkgXAorCSAgJChldmFsIF9pc19zb29uZ19tb2R1bGUgOj0gJChBTExfTU9EVUxFUy4kKF9tb2R1bGVfbmFtZSkuSVNfU09PTkdfTU9EVUxFKSkgXAogCSAgJChldmFsIF9pc19wcmVidWlsdF9tYWtlX21vZHVsZSA6PSAkKEFMTF9NT0RVTEVTLiQoX21vZHVsZV9uYW1lKS5JU19QUkVCVUlMVF9NQUtFX01PRFVMRSkpIFwKLQkgICQoZXZhbCBfcG9zdF9pbnN0YWxsZWRfZGV4cHJlb3B0X3ppcCA6PSAkKERFWFBSRU9QVC4kKF9tb2R1bGVfbmFtZSkuUE9TVF9JTlNUQUxMRURfREVYUFJFT1BUX1pJUCkpIFwKIAkgICQoZXZhbCBfcHJvZHVjdF9jb3B5X2ZpbGVzIDo9ICQoc29ydCAkKGZpbHRlciAlOiQoX3BhdGhfb25fZGV2aWNlKSwkKHByb2R1Y3RfY29weV9maWxlc193aXRob3V0X293bmVyKSkpKSBcCiAJICAkKGV2YWwgX2tlcm5lbF9tb2R1bGVfY29weV9maWxlcyA6PSAkKHNvcnQgJChmaWx0ZXIgJSQoX3BhdGhfb25fZGV2aWNlKSwkKEtFUk5FTF9NT0RVTEVfQ09QWV9GSUxFUykpKSkgXAogCSAgJChldmFsIF9pc19idWlsZF9wcm9wIDo9ICQoY2FsbCBpcy1idWlsZC1wcm9wLCRmKSkgXAogCSAgJChldmFsIF9pc19ub3RpY2VfZmlsZSA6PSAkKGNhbGwgaXMtbm90aWNlLWZpbGUsJGYpKSBcCi0JICAkKGV2YWwgX2lzX2RleHByZW9wdF9pbWFnZV9wcm9maWxlIDo9ICQoaWYgJChmaWx0ZXIgJTovJChfcGF0aF9vbl9kZXZpY2UpLCQoREVYUFJFT1BUX0lNQUdFX1BST0ZJTEVfQlVJTFRfSU5TVEFMTEVEKSksWSkpIFwKIAkgICQoZXZhbCBfaXNfcHJvZHVjdF9zeXN0ZW1fb3RoZXJfYXZia2V5IDo9ICQoaWYgJChmaW5kc3RyaW5nICRmLCQoSU5TVEFMTEVEX1BST0RVQ1RfU1lTVEVNX09USEVSX0FWQktFWV9UQVJHRVQpKSxZKSkgXAogCSAgJChldmFsIF9pc19ldmVudF9sb2dfdGFnc19maWxlIDo9ICQoaWYgJChmaW5kc3RyaW5nICRmLCQoZXZlbnRfbG9nX3RhZ3NfZmlsZSkpLFkpKSBcCiAJICAkKGV2YWwgX2lzX3N5c3RlbV9vdGhlcl9vZGV4X21hcmtlciA6PSAkKGlmICQoZmluZHN0cmluZyAkZiwkKElOU1RBTExFRF9TWVNURU1fT1RIRVJfT0RFWF9NQVJLRVIpKSxZKSkgXApAQCAtMjE5MiwzNyArMTkxOCw0MyBAQAogCSAgJChldmFsIF9pc19mc3Zlcml0eV9idWlsZF9tYW5pZmVzdF9hcGsgOj0gJChpZiAkKGZpbmRzdHJpbmcgJGYsJChBTExfRlNWRVJJVFlfQlVJTERfTUFOSUZFU1RfQVBLKSksWSkpIFwKIAkgICQoZXZhbCBfaXNfbGlua2VyX2NvbmZpZyA6PSAkKGlmICQoZmluZHN0cmluZyAkZiwkKFNZU1RFTV9MSU5LRVJfQ09ORklHKSAkKHZlbmRvcl9saW5rZXJfY29uZmlnX2ZpbGUpKSxZKSkgXAogCSAgJChldmFsIF9pc19wYXJ0aXRpb25fY29tcGF0X3N5bWxpbmsgOj0gJChpZiAkKGZpbmRzdHJpbmcgJGYsJChQQVJUSVRJT05fQ09NUEFUX1NZTUxJTktTKSksWSkpIFwKLQkgICQoZXZhbCBfaXNfcGxhdGZvcm1fZ2VuZXJhdGVkIDo9ICQoX2lzX2J1aWxkX3Byb3ApJChfaXNfbm90aWNlX2ZpbGUpJChfaXNfZGV4cHJlb3B0X2ltYWdlX3Byb2ZpbGUpJChfaXNfcHJvZHVjdF9zeXN0ZW1fb3RoZXJfYXZia2V5KSQoX2lzX2V2ZW50X2xvZ190YWdzX2ZpbGUpJChfaXNfc3lzdGVtX290aGVyX29kZXhfbWFya2VyKSQoX2lzX2tlcm5lbF9tb2R1bGVzX2Jsb2NrbGlzdCkkKF9pc19mc3Zlcml0eV9idWlsZF9tYW5pZmVzdF9hcGspJChfaXNfbGlua2VyX2NvbmZpZykkKF9pc19wYXJ0aXRpb25fY29tcGF0X3N5bWxpbmspKSBcCi0JICAkKGV2YWwgX3N0YXRpY19saWJzIDo9ICQoQUxMX0lOU1RBTExFRF9GSUxFUy4kZi5TVEFUSUNfTElCUkFSSUVTKSkgXAotCSAgJChldmFsIF93aG9sZV9zdGF0aWNfbGlicyA6PSAkKEFMTF9JTlNUQUxMRURfRklMRVMuJGYuV0hPTEVfU1RBVElDX0xJQlJBUklFUykpIFwKLQkgICQoZm9yZWFjaCBsLCQoX3N0YXRpY19saWJzKSwkKGV2YWwgX2FsbF9zdGF0aWNfbGlicyArPSAkbDokKHN0cmlwICQoc29ydCAkKEFMTF9NT0RVTEVTLiRsLlBBVEgpKSk6JChzdHJpcCAkKHNvcnQgJChBTExfTU9EVUxFUy4kbC5TT09OR19NT0RVTEVfVFlQRSkpKTokKEFMTF9TVEFUSUNfTElCUkFSSUVTLiRsLkJVSUxUX0ZJTEUpKSkgXAotCSAgJChmb3JlYWNoIGwsJChfd2hvbGVfc3RhdGljX2xpYnMpLCQoZXZhbCBfYWxsX3N0YXRpY19saWJzICs9ICRsOiQoc3RyaXAgJChzb3J0ICQoQUxMX01PRFVMRVMuJGwuUEFUSCkpKTokKHN0cmlwICQoc29ydCAkKEFMTF9NT0RVTEVTLiRsLlNPT05HX01PRFVMRV9UWVBFKSkpOiQoQUxMX1NUQVRJQ19MSUJSQVJJRVMuJGwuQlVJTFRfRklMRSkpKSBcCi0JICBlY2hvIC8kKF9wYXRoX29uX2RldmljZSksJChfbW9kdWxlX3BhdGgpLCQoX3Nvb25nX21vZHVsZV90eXBlKSwkKF9pc19wcmVidWlsdF9tYWtlX21vZHVsZSksJChfcHJvZHVjdF9jb3B5X2ZpbGVzKSwkKF9rZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMpLCQoX2lzX3BsYXRmb3JtX2dlbmVyYXRlZCksJChfYnVpbGRfb3V0cHV0X3BhdGgpLCQoX3N0YXRpY19saWJzKSwkKF93aG9sZV9zdGF0aWNfbGlicyksID4+ICRAOyBcCi0JICAkKGlmICQoX3Bvc3RfaW5zdGFsbGVkX2RleHByZW9wdF96aXApLCBcCi0JICBmb3IgaSBpbiAkJCh6aXBpbmZvIC0xICQoX3Bvc3RfaW5zdGFsbGVkX2RleHByZW9wdF96aXApKTsgZG8gZWNobyAvJCRpJChjb21tYSkkKF9tb2R1bGVfcGF0aCkkKGNvbW1hKSQoX3Nvb25nX21vZHVsZV90eXBlKSQoY29tbWEpJChfaXNfcHJlYnVpbHRfbWFrZV9tb2R1bGUpJChjb21tYSkkKF9wcm9kdWN0X2NvcHlfZmlsZXMpJChjb21tYSkkKF9rZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMpJChjb21tYSkkKF9pc19wbGF0Zm9ybV9nZW5lcmF0ZWQpJChjb21tYSkkKFBST0RVQ1RfT1VUKS8kJGkkKGNvbW1hKSQoX3N0YXRpY19saWJzKSQoY29tbWEpJChfd2hvbGVfc3RhdGljX2xpYnMpJChjb21tYSkgPj4gJEAgOyBkb25lIDsgXAorCSAgJChldmFsIF9pc19mbGFnc19maWxlIDo9ICQoaWYgJChmaW5kc3RyaW5nICRmLCAkKEFMTF9GTEFHU19GSUxFUykpLFkpKSBcCisJICAkKGV2YWwgX2lzX3Jvb3RkaXJfc3ltbGluayA6PSAkKGlmICQoZmluZHN0cmluZyAkZiwgJChBTExfUk9PVERJUl9TWU1MSU5LUykpLFkpKSBcCisJICAkKGV2YWwgX2lzX3BsYXRmb3JtX2dlbmVyYXRlZCA6PSAkKF9pc19idWlsZF9wcm9wKSQoX2lzX25vdGljZV9maWxlKSQoX2lzX3Byb2R1Y3Rfc3lzdGVtX290aGVyX2F2YmtleSkkKF9pc19ldmVudF9sb2dfdGFnc19maWxlKSQoX2lzX3N5c3RlbV9vdGhlcl9vZGV4X21hcmtlcikkKF9pc19rZXJuZWxfbW9kdWxlc19ibG9ja2xpc3QpJChfaXNfZnN2ZXJpdHlfYnVpbGRfbWFuaWZlc3RfYXBrKSQoX2lzX2xpbmtlcl9jb25maWcpJChfaXNfcGFydGl0aW9uX2NvbXBhdF9zeW1saW5rKSQoX2lzX2ZsYWdzX2ZpbGUpJChfaXNfcm9vdGRpcl9zeW1saW5rKSkgXAorCSAgJChldmFsIF9zdGF0aWNfbGlicyA6PSAkKGlmICQoX2lzX3Nvb25nX21vZHVsZSksLCQoQUxMX0lOU1RBTExFRF9GSUxFUy4kZi5TVEFUSUNfTElCUkFSSUVTKSkpIFwKKwkgICQoZXZhbCBfd2hvbGVfc3RhdGljX2xpYnMgOj0gJChpZiAkKF9pc19zb29uZ19tb2R1bGUpLCwkKEFMTF9JTlNUQUxMRURfRklMRVMuJGYuV0hPTEVfU1RBVElDX0xJQlJBUklFUykpKSBcCisJICAkKGV2YWwgX2xpY2Vuc2VfdGV4dCA6PSAkKGlmICQoZmlsdGVyICQoX2J1aWxkX291dHB1dF9wYXRoKSwkKEFMTF9OT05fTU9EVUxFUykpLCQoQUxMX05PTl9NT0RVTEVTLiQoX2J1aWxkX291dHB1dF9wYXRoKS5OT1RJQ0VTKSkpIFwKKwkgIGVjaG8gJyQoX2J1aWxkX291dHB1dF9wYXRoKSwkKF9tb2R1bGVfcGF0aCksJChfaXNfc29vbmdfbW9kdWxlKSwkKF9pc19wcmVidWlsdF9tYWtlX21vZHVsZSksJChfcHJvZHVjdF9jb3B5X2ZpbGVzKSwkKF9rZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMpLCQoX2lzX3BsYXRmb3JtX2dlbmVyYXRlZCksJChfc3RhdGljX2xpYnMpLCQoX3dob2xlX3N0YXRpY19saWJzKSwkKF9saWNlbnNlX3RleHQpJyA+PiAkQDsgXAorCSkKKworJChTT09OR19PVVRfRElSKS9jb21wbGlhbmNlLW1ldGFkYXRhLyQoVEFSR0VUX1BST0RVQ1QpL21ha2UtbW9kdWxlcy5jc3Y6CisJcm0gLWYgJEAKKwllY2hvICduYW1lLG1vZHVsZV9wYXRoLG1vZHVsZV9jbGFzcyxtb2R1bGVfdHlwZSxzdGF0aWNfbGlicyx3aG9sZV9zdGF0aWNfbGlicyxidWlsdF9maWxlcyxpbnN0YWxsZWRfZmlsZXMnID4+ICRACisJJChmb3JlYWNoIG0sJChBTExfTU9EVUxFUyksIFwKKwkgICQoZXZhbCBfbW9kdWxlX25hbWUgOj0gJG0pIFwKKwkgICQoZXZhbCBfbW9kdWxlX3BhdGggOj0gJChzdHJpcCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKF9tb2R1bGVfbmFtZSkuUEFUSCkpKSkgXAorCSAgJChldmFsIF9tYWtlX21vZHVsZV9jbGFzcyA6PSAkKEFMTF9NT0RVTEVTLiQoX21vZHVsZV9uYW1lKS5DTEFTUykpIFwKKwkgICQoZXZhbCBfbWFrZV9tb2R1bGVfdHlwZSA6PSAkKEFMTF9NT0RVTEVTLiQoX21vZHVsZV9uYW1lKS5NQUtFX01PRFVMRV9UWVBFKSkgXAorCSAgJChldmFsIF9zdGF0aWNfbGlicyA6PSAkKHN0cmlwICQoc29ydCAkKEFMTF9NT0RVTEVTLiQoX21vZHVsZV9uYW1lKS5TVEFUSUNfTElCUykpKSkgXAorCSAgJChldmFsIF93aG9sZV9zdGF0aWNfbGlicyA6PSAkKHN0cmlwICQoc29ydCAkKEFMTF9NT0RVTEVTLiQoX21vZHVsZV9uYW1lKS5XSE9MRV9TVEFUSUNfTElCUykpKSkgXAorCSAgJChldmFsIF9idWlsdF9maWxlcyA6PSAkKHN0cmlwICQoc29ydCAkKEFMTF9NT0RVTEVTLiQoX21vZHVsZV9uYW1lKS5CVUlMVCkpKSkgXAorCSAgJChldmFsIF9pbnN0YWxsZWRfZmlsZXMgOj0gJChzdHJpcCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKF9tb2R1bGVfbmFtZSkuSU5TVEFMTEVEKSkpKSBcCisJICAkKGV2YWwgX2lzX3Nvb25nX21vZHVsZSA6PSAkKEFMTF9NT0RVTEVTLiQoX21vZHVsZV9uYW1lKS5JU19TT09OR19NT0RVTEUpKSBcCisJICAkKGlmICQoX2lzX3Nvb25nX21vZHVsZSksLCBcCisJCWVjaG8gJyQoX21vZHVsZV9uYW1lKSwkKF9tb2R1bGVfcGF0aCksJChfbWFrZV9tb2R1bGVfY2xhc3MpLCQoX21ha2VfbW9kdWxlX3R5cGUpLCQoX3N0YXRpY19saWJzKSwkKF93aG9sZV9zdGF0aWNfbGlicyksJChfYnVpbHRfZmlsZXMpLCQoX2luc3RhbGxlZF9maWxlcyknID4+ICRAOyBcCiAJICApIFwKIAkpCi0JJChmb3JlYWNoIGwsJChzb3J0ICQoX2FsbF9zdGF0aWNfbGlicykpLCBcCi0JICAkKGV2YWwgX2xpYl9zdGVtIDo9ICQoY2FsbCB3b3JkLWNvbG9uLDEsJGwpKSBcCi0JICAkKGV2YWwgX21vZHVsZV9wYXRoIDo9ICQoY2FsbCB3b3JkLWNvbG9uLDIsJGwpKSBcCi0JICAkKGV2YWwgX3Nvb25nX21vZHVsZV90eXBlIDo9ICQoY2FsbCB3b3JkLWNvbG9uLDMsJGwpKSBcCi0JICAkKGV2YWwgX2J1aWx0X2ZpbGUgOj0gJChjYWxsIHdvcmQtY29sb24sNCwkbCkpIFwKLQkgICQoZXZhbCBfc3RhdGljX2xpYnMgOj0gJChBTExfU1RBVElDX0xJQlJBUklFUy4kbC5TVEFUSUNfTElCUkFSSUVTKSkgXAotCSAgJChldmFsIF93aG9sZV9zdGF0aWNfbGlicyA6PSAkKEFMTF9TVEFUSUNfTElCUkFSSUVTLiRsLldIT0xFX1NUQVRJQ19MSUJSQVJJRVMpKSBcCi0JICAkKGV2YWwgX2lzX3N0YXRpY19saWIgOj0gWSkgXAotCSAgZWNobyAkKF9saWJfc3RlbSkuYSwkKF9tb2R1bGVfcGF0aCksJChfc29vbmdfbW9kdWxlX3R5cGUpLCwsLCwkKF9idWlsdF9maWxlKSwkKF9zdGF0aWNfbGlicyksJChfd2hvbGVfc3RhdGljX2xpYnMpLCQoX2lzX3N0YXRpY19saWIpID4+ICRAOyBcCi0JKQorCiskKFNPT05HX09VVF9ESVIpL2NvbXBsaWFuY2UtbWV0YWRhdGEvJChUQVJHRVRfUFJPRFVDVCkvaW5zdGFsbGVkX2ZpbGVzLnN0YW1wOiAkKGluc3RhbGxlZF9maWxlcykKKwl0b3VjaCAkQAorCisjIFJlbW92ZSB0aGUgYWx3YXlzX2RpcnR5X2ZpbGUudHh0IHdoZW5ldmVyIHRoZSBtYWtlZmlsZSBpcyBldmFsdWF0ZWQKKyQoc2hlbGwgcm0gLWYgJChQUk9EVUNUX09VVCkvYWx3YXlzX2RpcnR5X2ZpbGUudHh0KQorJChQUk9EVUNUX09VVCkvYWx3YXlzX2RpcnR5X2ZpbGUudHh0OgorCXRvdWNoICRACiAKIC5QSE9OWTogc2JvbQotaWZlcSAoJChUQVJHRVRfQlVJTERfQVBQUyksKQotc2JvbTogJChQUk9EVUNUX09VVCkvc2JvbS5zcGR4Lmpzb24KLSQoUFJPRFVDVF9PVVQpL3Nib20uc3BkeC5qc29uOiAkKFBST0RVQ1RfT1VUKS9zYm9tLnNwZHgKLSQoUFJPRFVDVF9PVVQpL3Nib20uc3BkeDogJChQUk9EVUNUX09VVCkvc2JvbS1tZXRhZGF0YS5jc3YgJChHRU5fU0JPTSkKLQlybSAtcmYgJEAKLQkkKEdFTl9TQk9NKSAtLW91dHB1dF9maWxlICRAIC0tbWV0YWRhdGEgJChQUk9EVUNUX09VVCkvc2JvbS1tZXRhZGF0YS5jc3YgLS1idWlsZF92ZXJzaW9uICQoQlVJTERfRklOR0VSUFJJTlRfRlJPTV9GSUxFKSAtLXByb2R1Y3RfbWZyICIkKFBST0RVQ1RfTUFOVUZBQ1RVUkVSKSIgLS1qc29uCi0KLSQoY2FsbCBkaXN0LWZvci1nb2Fscyxkcm9pZCwkKFBST0RVQ1RfT1VUKS9zYm9tLnNwZHguanNvbjpzYm9tL3Nib20uc3BkeC5qc29uKQotZWxzZQoraWZuZXEgKCQoVEFSR0VUX0JVSUxEX0FQUFMpLCkKICMgQ3JlYXRlIGJ1aWxkIHJ1bGVzIGZvciBnZW5lcmF0aW5nIFNCT01zIG9mIHVuYnVuZGxlZCBBUEtzIGFuZCBBUEVYcwogIyAkMTogc2JvbSBmaWxlCiAjICQyOiBzYm9tIGZyYWdtZW50IGZpbGUKQEAgLTIyMzYsNyArMTk2OCw3IEBACiAkKGV2YWwgX2RlcF9tb2R1bGVzIDo9ICQoZmlsdGVyICUuJChfbW9kdWxlX25hbWUpLCQoQUxMX01PRFVMRVMpKSAkKGZpbHRlciAlLiQoX21vZHVsZV9uYW1lKSQoVEFSR0VUXzJORF9BUkNIX01PRFVMRV9TVUZGSVgpLCQoQUxMX01PRFVMRVMpKSkKICQoZXZhbCBfaXNfYXBleCA6PSAkKGZpbHRlciAlLmFwZXgsJCgzKSkpCiAKLSQoNCk6ICQoMykgJChtZXRhZGF0YV9saXN0KSAkKG1ldGFkYXRhX2ZpbGVzKQorJCg0KToKIAlybSAtcmYgJCRACiAJZWNobyBpbnN0YWxsZWRfZmlsZSxtb2R1bGVfcGF0aCxzb29uZ19tb2R1bGVfdHlwZSxpc19wcmVidWlsdF9tYWtlX21vZHVsZSxwcm9kdWN0X2NvcHlfZmlsZXMsa2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzLGlzX3BsYXRmb3JtX2dlbmVyYXRlZCxidWlsZF9vdXRwdXRfcGF0aCxzdGF0aWNfbGlicmFyaWVzLHdob2xlX3N0YXRpY19saWJyYXJpZXMsaXNfc3RhdGljX2xpYiA+PiAkJEAKIAllY2hvIC8kKF9wYXRoX29uX2RldmljZSksJChfbW9kdWxlX3BhdGgpLCQoX3Nvb25nX21vZHVsZV90eXBlKSwsLCwsJCgzKSwsLCA+PiAkJEAKQEAgLTIyNDUsNyArMTk3Nyw3IEBACiAJICAgIGVjaG8gJChwYXRzdWJzdCAkKFBST0RVQ1RfT1VUKS9hcGV4LyQoX21vZHVsZV9uYW1lKS8lLCUsJChBTExfTU9EVUxFUy4kbS5JTlNUQUxMRUQpKSwkKHNvcnQgJChBTExfTU9EVUxFUy4kbS5QQVRIKSksJChzb3J0ICQoQUxMX01PRFVMRVMuJG0uU09PTkdfTU9EVUxFX1RZUEUpKSwsLCwsJChzdHJpcCAkKEFMTF9NT0RVTEVTLiRtLkJVSUxUKSksLCwgPj4gJCRAOykpCiAKICQoMik6ICQoMSkKLSQoMSk6ICQoNCkgJChHRU5fU0JPTSkKKyQoMSk6ICQoNCkgJCgzKSAkKEdFTl9TQk9NKSAkKGluc3RhbGxlZF9maWxlcykgJChtZXRhZGF0YV9saXN0KSAkKG1ldGFkYXRhX2ZpbGVzKQogCXJtIC1yZiAkJEAKIAkkKEdFTl9TQk9NKSAtLW91dHB1dF9maWxlICQkQCAtLW1ldGFkYXRhICQoNCkgLS1idWlsZF92ZXJzaW9uICQkKEJVSUxEX0ZJTkdFUlBSSU5UX0ZST01fRklMRSkgLS1wcm9kdWN0X21mciAiJChQUk9EVUNUX01BTlVGQUNUVVJFUikiIC0tanNvbiAkKGlmICQoZmlsdGVyICUuYXBrLCQoMykpLC0tdW5idW5kbGVkX2FwaywtLXVuYnVuZGxlZF9hcGV4KQogZW5kZWYKQEAgLTIyNzAsNCArMjAwMiw0IEBACiAKICQoY2FsbCBkaXN0LXdyaXRlLWZpbGUsJChLQVRJX1BBQ0tBR0VfTUtfRElSKS9kaXN0Lm1rKQogCi0kKGluZm8gWyQoY2FsbCBpbmNfYW5kX3ByaW50LHN1YmRpcl9tYWtlZmlsZXNfaW5jKS8kKHN1YmRpcl9tYWtlZmlsZXNfdG90YWwpXSB3cml0aW5nIGJ1aWxkIHJ1bGVzIC4uLikKKyQoaW5mbyBbJChjYWxsIGluY19hbmRfcHJpbnQsc3ViZGlyX21ha2VmaWxlc19pbmMpLyQoc3ViZGlyX21ha2VmaWxlc190b3RhbCldIHdyaXRpbmcgbGVnYWN5IE1ha2UgbW9kdWxlIHJ1bGVzIC4uLikKZGlmZiAtLWdpdCBhL2NvcmUvbWlzY19wcmVidWlsdF9pbnRlcm5hbC5tayBiL2NvcmUvbWlzY19wcmVidWlsdF9pbnRlcm5hbC5tawppbmRleCA5MjFlYTUyLi5iMTRiOWNlIDEwMDY0NAotLS0gYS9jb3JlL21pc2NfcHJlYnVpbHRfaW50ZXJuYWwubWsKKysrIGIvY29yZS9taXNjX3ByZWJ1aWx0X2ludGVybmFsLm1rCkBAIC0yNSwxMSArMjUsOCBAQAogCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCiAKLWlmbmVxICgkKGZpbHRlciBpbml0JXJjLCQobm90ZGlyICQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSkpKSQoZmlsdGVyICUvZXRjL2luaXQsJChkaXIgJChMT0NBTF9JTlNUQUxMRURfTU9EVUxFKSkpLCkKK2lmbmVxICgkKGZpbHRlciBpbml0JXJjLCQobm90ZGlyICQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSkpKSQoZmlsdGVyICUvZXRjL2luaXQvLCQoZGlyICQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSkpKSwpCiAgICQoZXZhbCAkKGNhbGwgY29weS1pbml0LXNjcmlwdC1maWxlLWNoZWNrZWQsJChteV9wcmVidWlsdF9zcmNfZmlsZSksJChMT0NBTF9CVUlMVF9NT0RVTEUpKSkKLWVsc2UgaWZuZXEgKCQoTE9DQUxfUFJFQlVJTFRfU1RSSVBfQ09NTUVOVFMpLCkKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKSA6ICQobXlfcHJlYnVpbHRfc3JjX2ZpbGUpCi0JJCh0cmFuc2Zvcm0tcHJlYnVpbHQtdG8tdGFyZ2V0LXN0cmlwLWNvbW1lbnRzKQogZWxzZQogJChMT0NBTF9CVUlMVF9NT0RVTEUpIDogJChteV9wcmVidWlsdF9zcmNfZmlsZSkKIAkkKHRyYW5zZm9ybS1wcmVidWlsdC10by10YXJnZXQpCmRpZmYgLS1naXQgYS9jb3JlL211bHRpX3ByZWJ1aWx0Lm1rIGIvY29yZS9tdWx0aV9wcmVidWlsdC5tawppbmRleCBjOTdkNDgxLi40MTU0MDFiIDEwMDY0NAotLS0gYS9jb3JlL211bHRpX3ByZWJ1aWx0Lm1rCisrKyBiL2NvcmUvbXVsdGlfcHJlYnVpbHQubWsKQEAgLTEzMiwzICsxMzIsNSBAQAogcHJlYnVpbHRfc3RhdGljX2phdmFfbGlicmFyaWVzIDo9CiBwcmVidWlsdF9pc19ob3N0IDo9CiBwcmVidWlsdF9tb2R1bGVfdGFncyA6PQorCiskKGlmICQobXlfcmVnaXN0ZXJfbmFtZSksJChldmFsIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUFLRV9NT0RVTEVfVFlQRTo9TVVMVElfUFJFQlVJTFQpKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvbmF0aXZlX3Rlc3QubWsgYi9jb3JlL25hdGl2ZV90ZXN0Lm1rCmluZGV4IDhiNDlmYmQuLmMxMmIyMTEgMTAwNjQ0Ci0tLSBhL2NvcmUvbmF0aXZlX3Rlc3QubWsKKysrIGIvY29yZS9uYXRpdmVfdGVzdC5tawpAQCAtMjEsMyArMjEsNSBAQAogZW5kaWYKIAogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKKyQoaWYgJChteV9yZWdpc3Rlcl9uYW1lKSwkKGV2YWwgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NQUtFX01PRFVMRV9UWVBFOj1OQVRJVkVfVEVTVCkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9uaW5qYV9jb25maWcubWsgYi9jb3JlL25pbmphX2NvbmZpZy5tawppbmRleCAyYjVjZWVlLi5kNGI3YzZkIDEwMDY0NAotLS0gYS9jb3JlL25pbmphX2NvbmZpZy5taworKysgYi9jb3JlL25pbmphX2NvbmZpZy5tawpAQCAtMTQsNyArMTQsNiBAQAogCSQoUEFSU0VfVElNRV9NQUtFX0dPQUxTKSBcCiAJJChkb250X2JvdGhlcl9nb2FscykgXAogCWFsbCBcCi0JRUNMSVBTRS0lIFwKIAlicmlsbG9fdGVzdHMgXAogCWJ0bm9kIFwKIAlidWlsZC1hcnQlIFwKZGlmZiAtLWdpdCBhL2NvcmUvbm9kZV9mbnMubWsgYi9jb3JlL25vZGVfZm5zLm1rCmluZGV4IDE0NGViOGIuLmQyY2VlOWUgMTAwNjQ0Ci0tLSBhL2NvcmUvbm9kZV9mbnMubWsKKysrIGIvY29yZS9ub2RlX2Zucy5tawpAQCAtMjAzLDcgKzIwMyw3IEBACiAgICQoY2FsbCBfZXhwYW5kLWluaGVyaXRlZC12YWx1ZXMsJCgxKSwkKDIpLCQoMyksJCg0KSkKIAogICAkKGV2YWwgJCgxKS4kKDIpLmluaGVyaXRlZCA6PSkKLSAgJChldmFsIF9pbmNsdWRlX3N0YWNrIDo9ICQod29yZGxpc3QgMiw5OTk5LCQkKF9pbmNsdWRlX3N0YWNrKSkpCisgICQoZXZhbCBfaW5jbHVkZV9zdGFjayA6PSAkKHdvcmRsaXN0IDIsOTk5OSwkKF9pbmNsdWRlX3N0YWNrKSkpCiBlbmRlZgogCiAjCmRpZmYgLS1naXQgYS9jb3JlL25vdGljZV9maWxlcy5tayBiL2NvcmUvbm90aWNlX2ZpbGVzLm1rCmluZGV4IGE1ODUyY2MuLjY5MzUxMTUgMTAwNjQ0Ci0tLSBhL2NvcmUvbm90aWNlX2ZpbGVzLm1rCisrKyBiL2NvcmUvbm90aWNlX2ZpbGVzLm1rCkBAIC0xLDE2NyArMSwxNDQgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBUcmFjayBOT1RJQ0UgZmlsZXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0kKGNhbGwgcmVjb3JkLW1vZHVsZS10eXBlLE5PVElDRV9GSUxFKQogCi1pZm5lcSAoJChMT0NBTF9OT1RJQ0VfRklMRSksKQotbm90aWNlX2ZpbGU6PSQoc3RyaXAgJChMT0NBTF9OT1RJQ0VfRklMRSkpCittb2R1bGVfbGljZW5zZV9tZXRhZGF0YSA6PSAkKGNhbGwgbG9jYWwtbWV0YS1pbnRlcm1lZGlhdGVzLWRpcikvJChteV9yZWdpc3Rlcl9uYW1lKS5tZXRhX2xpYworCiskKGZvcmVhY2ggdGFyZ2V0LCQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5CVUlMVCkgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLklOU1RBTExFRCkgJChmb3JlYWNoIGJpLCQoTE9DQUxfU09PTkdfQlVJTFRfSU5TVEFMTEVEKSwkKGNhbGwgd29yZC1jb2xvbiwxLCQoYmkpKSksXAorICAkKGV2YWwgQUxMX1RBUkdFVFMuJCh0YXJnZXQpLk1FVEFfTElDIDo9ICQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpKSkKKworJChmb3JlYWNoIGYsJChteV90ZXN0X2RhdGEpICQobXlfdGVzdF9jb25maWcpLFwKKyAgJChpZiAkKHN0cmlwICQoQUxMX1RBUkdFVFMuJChjYWxsIHdvcmQtY29sb24sMSwkKGYpKS5NRVRBX0xJQykpLCBcCisgICAgJChjYWxsIGRlY2xhcmUtY29weS10YXJnZXQtbGljZW5zZS1tZXRhZGF0YSwkKGNhbGwgd29yZC1jb2xvbiwyLCQoZikpLCQoY2FsbCB3b3JkLWNvbG9uLDEsJChmKSkpLCBcCisgICAgJChldmFsIEFMTF9UQVJHRVRTLiQoY2FsbCB3b3JkLWNvbG9uLDIsJChmKSkuTUVUQV9MSUMgOj0gJChtb2R1bGVfbGljZW5zZV9tZXRhZGF0YSkpKSkKKworQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NRVRBX0xJQyA6PSAkKHN0cmlwICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NRVRBX0xJQykgJChtb2R1bGVfbGljZW5zZV9tZXRhZGF0YSkpCisKK2lmZGVmIExPQ0FMX1NPT05HX0xJQ0VOU0VfTUVUQURBVEEKKyAgIyBTb29uZyBtb2R1bGVzIGhhdmUgYWxyZWFkeSBwcm9kdWNlZCBhIGxpY2Vuc2UgbWV0YWRhdGEgZmlsZSwgY29weSBpdCB0byB3aGVyZSBNYWtlIGV4cGVjdHMgaXQuCisgICQoZXZhbCAkKGNhbGwgY29weS1vbmUtbGljZW5zZS1tZXRhZGF0YS1maWxlLCAkKExPQ0FMX1NPT05HX0xJQ0VOU0VfTUVUQURBVEEpLCAkKG1vZHVsZV9saWNlbnNlX21ldGFkYXRhKSwkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQlVJTFQpLCQoQUxMX01PRFVFUy4kKG15X3JlZ2lzdGVyX25hbWUpLklOU1RBTExFRCkpKQogZWxzZQotbm90aWNlX2ZpbGU6PSQoc3RyaXAgJCh3aWxkY2FyZCAkKExPQ0FMX1BBVEgpL0xJQ0VOU0UgJChMT0NBTF9QQVRIKS9MSUNFTkNFICQoTE9DQUxfUEFUSCkvTk9USUNFKSkKLWVuZGlmCisgICMgTWFrZSBtb2R1bGVzIGRvbid0IGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHByb2R1Y2UgYSBsaWNlbnNlIG1ldGFkYXRhIHJ1bGUgdW50aWwgYWZ0ZXIgZml4LW5vdGljZS1kZXBzCisgICMgaGFzIGJlZW4gY2FsbGVkLCBzdG9yZSB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHVudGlsIGxhdGVyLgogCi1pZm5lcSAoLCQoc3RyaXAgJChMT0NBTF9MSUNFTlNFX1BBQ0tBR0VfTkFNRSkpKQotbGljZW5zZV9wYWNrYWdlX25hbWU6PSQoc3RyaXAgJChMT0NBTF9MSUNFTlNFX1BBQ0tBR0VfTkFNRSkpCi1lbHNlCi1saWNlbnNlX3BhY2thZ2VfbmFtZTo9Ci1lbmRpZgotCi1pZm5lcSAoLCQoc3RyaXAgJChMT0NBTF9MSUNFTlNFX0lOU1RBTExfTUFQKSkpCi1pbnN0YWxsX21hcDo9JChzdHJpcCAkKExPQ0FMX0xJQ0VOU0VfSU5TVEFMTF9NQVApKQotZWxzZQotaW5zdGFsbF9tYXA6PQotZW5kaWYKLQotaWZuZXEgKCwkKHN0cmlwICQoTE9DQUxfTElDRU5TRV9LSU5EUykpKQotbGljZW5zZV9raW5kczo9JChzdHJpcCAkKExPQ0FMX0xJQ0VOU0VfS0lORFMpKQotZWxzZQotbGljZW5zZV9raW5kczo9bGVnYWN5X2J5X2V4Y2VwdGlvbl9vbmx5Ci1lbmRpZgotCi1pZm5lcSAoLCQoc3RyaXAgJChMT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMpKSkKLWxpY2Vuc2VfY29uZGl0aW9uczo9JChzdHJpcCAkKExPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUykpCi1lbHNlCi1saWNlbnNlX2NvbmRpdGlvbnM6PWJ5X2V4Y2VwdGlvbl9vbmx5Ci1lbmRpZgotCi1pZmVxICgkKExPQ0FMX01PRFVMRV9DTEFTUyksR1lQKQotICAjIFdlIGlnbm9yZSBOT1RJQ0UgZmlsZXMgZm9yIG1vZHVsZXMgb2YgdHlwZSBHWVAuCi0gIG5vdGljZV9maWxlIDo9Ci1lbmRpZgotCi1pZmVxICgkKExPQ0FMX01PRFVMRV9DTEFTUyksRkFLRSkKLSAgIyBXZSBpZ25vcmUgTk9USUNFIGZpbGVzIGZvciBtb2R1bGVzIG9mIHR5cGUgRkFLRS4KLSAgbm90aWNlX2ZpbGUgOj0KLWVuZGlmCi0KLSMgU29vbmcgZ2VuZXJhdGVzIHN0dWIgbGlicmFyaWVzIHRoYXQgZG9uJ3QgbmVlZCBOT1RJQ0UgZmlsZXMKLWlmZGVmIExPQ0FMX05PX05PVElDRV9GSUxFCi0gIGlmbmVxICgkKExPQ0FMX01PRFVMRV9NQUtFRklMRSksJChTT09OR19BTkRST0lEX01LKSkKLSAgICAkKGNhbGwgcHJldHR5LWVycm9yLExPQ0FMX05PX05PVElDRV9GSUxFIHNob3VsZCBub3QgYmUgdXNlZCBieSBBbmRyb2lkLm1rIGZpbGVzKQotICBlbmRpZgotICBub3RpY2VfZmlsZSA6PQotZW5kaWYKLQotaWZlcSAoJChMT0NBTF9NT0RVTEVfQ0xBU1MpLE5PVElDRV9GSUxFUykKLSMgSWYgdGhpcyBpcyBhIE5PVElDRS1vbmx5IG1vZHVsZSwgd2UgZG9uJ3QgaW5jbHVkZSBiYXNlX3J1bGUubWssCi0jIHNvIG15X3ByZWZpeCBpcyBub3Qgc2V0IGF0IHRoaXMgcG9pbnQuCi1pZmVxICgkKExPQ0FMX0lTX0hPU1RfTU9EVUxFKSx0cnVlKQotICBteV9wcmVmaXggOj0gSE9TVF8KLSAgTE9DQUxfSE9TVF9QUkVGSVggOj0KLWVsc2UKLSAgbXlfcHJlZml4IDo9IFRBUkdFVF8KLWVuZGlmCi1lbmRpZgotCi1pbnN0YWxsZWRfbm90aWNlX2ZpbGUgOj0KLQotaXNfY29udGFpbmVyOj0kKHN0cmlwICQoTE9DQUxfTU9EVUxFX0lTX0NPTlRBSU5FUikpCi1pZmVxICgsJChpc19jb250YWluZXIpKQotaWZuZXEgKCwkKHN0cmlwICQoZmlsdGVyICUuemlwICUudGFyICUudGd6ICUudGFyLmd6ICUuYXBrICUuaW1nICUuc3Jjc3ppcCAlLmFwZXgsICQoTE9DQUxfQlVJTFRfTU9EVUxFKSkpKQotaXNfY29udGFpbmVyOj10cnVlCi1lbHNlCi1pc19jb250YWluZXI6PWZhbHNlCi1lbmRpZgotZWxzZSBpZm5lcSAoLCQoc3RyaXAgJChmaWx0ZXItb3V0IHRydWUgZmFsc2UsJChpc19jb250YWluZXIpKSkpCi0kKGVycm9yIFVucmVjb2duaXplZCB2YWx1ZSAnJChpc19jb250YWluZXIpJyBmb3IgTE9DQUxfTU9EVUxFX0lTX0NPTlRBSU5FUikKLWVuZGlmCi0KLWlmZXEgKHRydWUsJChpc19jb250YWluZXIpKQotIyBJbmNsdWRlIHNoYXJlZCBsaWJyYXJpZXMnIG5vdGljZXMgZm9yICJjb250YWluZXIiIHR5cGVzLCBidXQgbm90IGZvciBiaW5hcmllcyBldGMuCi1ub3RpY2VfZGVwcyA6PSBcCi0gICAgJChzdHJpcCBcCi0gICAgICAgICQoZm9yZWFjaCBkLCBcCi0gICAgICAgICAgICAkKExPQ0FMX1JFUVVJUkVEX01PRFVMRVMpIFwKLSAgICAgICAgICAgICQoTE9DQUxfU1RBVElDX0xJQlJBUklFUykgXAotICAgICAgICAgICAgJChMT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSSUVTKSBcCi0gICAgICAgICAgICAkKExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMpIFwKLSAgICAgICAgICAgICQoTE9DQUxfRFlMSUJfTElCUkFSSUVTKSBcCi0gICAgICAgICAgICAkKExPQ0FMX1JMSUJfTElCUkFSSUVTKSBcCi0gICAgICAgICAgICAkKExPQ0FMX1BST0NfTUFDUk9fTElCUkFSSUVTKSBcCi0gICAgICAgICAgICAkKExPQ0FMX0hFQURFUl9MSUJSQVJJRVMpIFwKLSAgICAgICAgICAgICQoTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTKSBcCi0gICAgICAgICAgICAkKExPQ0FMX0pBVkFfTElCUkFSSUVTKSBcCi0gICAgICAgICAgICAkKExPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTKSBcCi0gICAgICAgICAgICAsJChzdWJzdCA6LF8sJChkKSk6c3RhdGljIFwKLSAgICAgICAgKSBcCi0gICAgKQotZWxzZQotbm90aWNlX2RlcHMgOj0gXAotICAgICQoc3RyaXAgXAotICAgICAgICAkKGZvcmVhY2ggZCwgXAotICAgICAgICAgICAgJChMT0NBTF9SRVFVSVJFRF9NT0RVTEVTKSBcCi0gICAgICAgICAgICAkKExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMpIFwKLSAgICAgICAgICAgICQoTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUykgXAotICAgICAgICAgICAgJChMT0NBTF9STElCX0xJQlJBUklFUykgXAotICAgICAgICAgICAgJChMT0NBTF9QUk9DX01BQ1JPX0xJQlJBUklFUykgXAotICAgICAgICAgICAgJChMT0NBTF9IRUFERVJfTElCUkFSSUVTKSBcCi0gICAgICAgICAgICAkKExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUykgXAotICAgICAgICAgICAgLCQoc3Vic3QgOixfLCQoZCkpOnN0YXRpYyBcCi0gICAgICAgICkkKGZvcmVhY2ggZCwgXAotICAgICAgICAgICAgJChMT0NBTF9TSEFSRURfTElCUkFSSUVTKSBcCi0gICAgICAgICAgICAkKExPQ0FMX0RZTElCX0xJQlJBUklFUykgXAotICAgICAgICAgICAgJChMT0NBTF9KQVZBX0xJQlJBUklFUykgXAotICAgICAgICAgICAgJChMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUykgXAotICAgICAgICAgICAgLCQoc3Vic3QgOixfLCQoZCkpOmR5bmFtaWMgXAotICAgICAgICApIFwKLSAgICApCi1lbmRpZgotaWZlcSAoJChMT0NBTF9JU19IT1NUX01PRFVMRSksdHJ1ZSkKLW5vdGljZV9kZXBzIDo9ICQoc3RyaXAgJChub3RpY2VfZGVwcykgJChmb3JlYWNoIGQsJChMT0NBTF9IT1NUX1JFUVVJUkVEX01PRFVMRVMpLCQoc3Vic3QgOixfLCQoZCkpOnN0YXRpYykpCi1lbHNlCi1ub3RpY2VfZGVwcyA6PSAkKHN0cmlwICQobm90aWNlX2RlcHMpICQoZm9yZWFjaCBkLCQoTE9DQUxfVEFSR0VUX1JFUVVJUkVEX01PRFVMRVMpLCQoc3Vic3QgOixfLCQoZCkpOnN0YXRpYykpCi1lbmRpZgotCi1sb2NhbF9wYXRoIDo9ICQoTE9DQUxfUEFUSCkKLQotCi1tb2R1bGVfbGljZW5zZV9tZXRhZGF0YSA6PQotCi1pZmRlZiBteV9yZWdpc3Rlcl9uYW1lCi0gIG1vZHVsZV9saWNlbnNlX21ldGFkYXRhIDo9ICQoY2FsbCBsb2NhbC1tZXRhLWludGVybWVkaWF0ZXMtZGlyKS8kKG15X3JlZ2lzdGVyX25hbWUpLm1ldGFfbGljCi0KLSAgJChmb3JlYWNoIHRhcmdldCwkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQlVJTFQpICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5JTlNUQUxMRUQpICQoZm9yZWFjaCBiaSwkKExPQ0FMX1NPT05HX0JVSUxUX0lOU1RBTExFRCksJChjYWxsIHdvcmQtY29sb24sMSwkKGJpKSkpLFwKLSAgICAkKGV2YWwgQUxMX1RBUkdFVFMuJCh0YXJnZXQpLk1FVEFfTElDIDo9ICQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpKSkKLQotICAkKGZvcmVhY2ggZiwkKG15X3Rlc3RfZGF0YSkgJChteV90ZXN0X2NvbmZpZyksXAotICAgICQoaWYgJChzdHJpcCAkKEFMTF9UQVJHRVRTLiQoY2FsbCB3b3JkLWNvbG9uLDEsJChmKSkuTUVUQV9MSUMpKSwgXAotICAgICAgJChjYWxsIGRlY2xhcmUtY29weS10YXJnZXQtbGljZW5zZS1tZXRhZGF0YSwkKGNhbGwgd29yZC1jb2xvbiwyLCQoZikpLCQoY2FsbCB3b3JkLWNvbG9uLDEsJChmKSkpLCBcCi0gICAgICAkKGV2YWwgQUxMX1RBUkdFVFMuJChjYWxsIHdvcmQtY29sb24sMiwkKGYpKS5NRVRBX0xJQyA6PSAkKG1vZHVsZV9saWNlbnNlX21ldGFkYXRhKSkpKQotCi0gIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUVUQV9MSUMgOj0gJChzdHJpcCAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUVUQV9MSUMpICQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpKQotCi0gIGlmZGVmIExPQ0FMX1NPT05HX0xJQ0VOU0VfTUVUQURBVEEKLSAgICAjIFNvb25nIG1vZHVsZXMgaGF2ZSBhbHJlYWR5IHByb2R1Y2VkIGEgbGljZW5zZSBtZXRhZGF0YSBmaWxlLCBjb3B5IGl0IHRvIHdoZXJlIE1ha2UgZXhwZWN0cyBpdC4KLSAgICAkKGV2YWwgJChjYWxsIGNvcHktb25lLWxpY2Vuc2UtbWV0YWRhdGEtZmlsZSwgJChMT0NBTF9TT09OR19MSUNFTlNFX01FVEFEQVRBKSwgJChtb2R1bGVfbGljZW5zZV9tZXRhZGF0YSksJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkJVSUxUKSwkKEFMTF9NT0RVRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5JTlNUQUxMRUQpKSkKKyAgaWZuZXEgKCQoTE9DQUxfTk9USUNFX0ZJTEUpLCkKKyAgICBub3RpY2VfZmlsZTo9JChzdHJpcCAkKExPQ0FMX05PVElDRV9GSUxFKSkKICAgZWxzZQotICAgICMgTWFrZSBtb2R1bGVzIGRvbid0IGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHByb2R1Y2UgYSBsaWNlbnNlIG1ldGFkYXRhIHJ1bGUgdW50aWwgYWZ0ZXIgZml4LW5vdGljZS1kZXBzCi0gICAgIyBoYXMgYmVlbiBjYWxsZWQsIHN0b3JlIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gdW50aWwgbGF0ZXIuCi0gICAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5ERUxBWUVEX01FVEFfTElDIDo9ICQoc3RyaXAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkRFTEFZRURfTUVUQV9MSUMpICQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpKQotICAgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTElDRU5TRV9QQUNLQUdFX05BTUUgOj0gJChzdHJpcCAkKGxpY2Vuc2VfcGFja2FnZV9uYW1lKSkKLSAgICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk1PRFVMRV9UWVBFIDo9ICQoc3RyaXAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk1PRFVMRV9UWVBFKSAkKExPQ0FMX01PRFVMRV9UWVBFKSkKLSAgICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk1PRFVMRV9DTEFTUyA6PSAkKHN0cmlwICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NT0RVTEVfQ0xBU1MpICQoTE9DQUxfTU9EVUxFX0NMQVNTKSkKLSAgICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkxJQ0VOU0VfS0lORFMgOj0gJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkxJQ0VOU0VfS0lORFMpICQobGljZW5zZV9raW5kcykKLSAgICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkxJQ0VOU0VfQ09ORElUSU9OUyA6PSAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTElDRU5TRV9DT05ESVRJT05TKSAkKGxpY2Vuc2VfY29uZGl0aW9ucykKLSAgICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkxJQ0VOU0VfSU5TVEFMTF9NQVAgOj0gJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkxJQ0VOU0VfSU5TVEFMTF9NQVApICQoaW5zdGFsbF9tYXApCi0gICAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5OT1RJQ0VfREVQUyA6PSAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTk9USUNFX0RFUFMpICQobm90aWNlX2RlcHMpCi0gICAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5JU19DT05UQUlORVIgOj0gJChzdHJpcCAkKGZpbHRlci1vdXQgZmFsc2UsJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLklTX0NPTlRBSU5FUikgJChpc19jb250YWluZXIpKSkKLSAgICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlBBVEggOj0gJChzdHJpcCAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuUEFUSCkgJChsb2NhbF9wYXRoKSkKKyAgICBub3RpY2VfZmlsZTo9JChzdHJpcCAkKHdpbGRjYXJkICQoTE9DQUxfUEFUSCkvTElDRU5TRSAkKExPQ0FMX1BBVEgpL0xJQ0VOQ0UgJChMT0NBTF9QQVRIKS9OT1RJQ0UpKQogICBlbmRpZgorCisgIGlmZXEgKCQoTE9DQUxfTU9EVUxFX0NMQVNTKSxHWVApCisgICAgIyBXZSBpZ25vcmUgTk9USUNFIGZpbGVzIGZvciBtb2R1bGVzIG9mIHR5cGUgR1lQLgorICAgIG5vdGljZV9maWxlIDo9CisgIGVuZGlmCisKKyAgaWZlcSAoJChMT0NBTF9NT0RVTEVfQ0xBU1MpLEZBS0UpCisgICAgIyBXZSBpZ25vcmUgTk9USUNFIGZpbGVzIGZvciBtb2R1bGVzIG9mIHR5cGUgRkFLRS4KKyAgICBub3RpY2VfZmlsZSA6PQorICBlbmRpZgorCisgICMgU29vbmcgZ2VuZXJhdGVzIHN0dWIgbGlicmFyaWVzIHRoYXQgZG9uJ3QgbmVlZCBOT1RJQ0UgZmlsZXMKKyAgaWZkZWYgTE9DQUxfTk9fTk9USUNFX0ZJTEUKKyAgICBpZm5lcSAoJChMT0NBTF9NT0RVTEVfTUFLRUZJTEUpLCQoU09PTkdfQU5EUk9JRF9NSykpCisgICAgICAkKGNhbGwgcHJldHR5LWVycm9yLExPQ0FMX05PX05PVElDRV9GSUxFIHNob3VsZCBub3QgYmUgdXNlZCBieSBBbmRyb2lkLm1rIGZpbGVzKQorICAgIGVuZGlmCisgICAgbm90aWNlX2ZpbGUgOj0KKyAgZW5kaWYKKworICBpZm5lcSAoLCQoc3RyaXAgJChMT0NBTF9MSUNFTlNFX1BBQ0tBR0VfTkFNRSkpKQorICAgIGxpY2Vuc2VfcGFja2FnZV9uYW1lOj0kKHN0cmlwICQoTE9DQUxfTElDRU5TRV9QQUNLQUdFX05BTUUpKQorICBlbHNlCisgICAgbGljZW5zZV9wYWNrYWdlX25hbWU6PQorICBlbmRpZgorCisgIGlmbmVxICgsJChzdHJpcCAkKExPQ0FMX0xJQ0VOU0VfSU5TVEFMTF9NQVApKSkKKyAgICBpbnN0YWxsX21hcDo9JChzdHJpcCAkKExPQ0FMX0xJQ0VOU0VfSU5TVEFMTF9NQVApKQorICBlbHNlCisgICAgaW5zdGFsbF9tYXA6PQorICBlbmRpZgorCisgIGlmbmVxICgsJChzdHJpcCAkKExPQ0FMX0xJQ0VOU0VfS0lORFMpKSkKKyAgICBsaWNlbnNlX2tpbmRzOj0kKHN0cmlwICQoTE9DQUxfTElDRU5TRV9LSU5EUykpCisgIGVsc2UKKyAgICBsaWNlbnNlX2tpbmRzOj1sZWdhY3lfYnlfZXhjZXB0aW9uX29ubHkKKyAgZW5kaWYKKworICBpZm5lcSAoLCQoc3RyaXAgJChMT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMpKSkKKyAgICBsaWNlbnNlX2NvbmRpdGlvbnM6PSQoc3RyaXAgJChMT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMpKQorICBlbHNlCisgICAgbGljZW5zZV9jb25kaXRpb25zOj1ieV9leGNlcHRpb25fb25seQorICBlbmRpZgorCisgIGlzX2NvbnRhaW5lcjo9JChzdHJpcCAkKExPQ0FMX01PRFVMRV9JU19DT05UQUlORVIpKQorICBpZmVxICgsJChpc19jb250YWluZXIpKQorICAgIGlmbmVxICgsJChzdHJpcCAkKGZpbHRlciAlLnppcCAlLnRhciAlLnRneiAlLnRhci5neiAlLmFwayAlLmltZyAlLnNyY3N6aXAgJS5hcGV4LCAkKExPQ0FMX0JVSUxUX01PRFVMRSkpKSkKKyAgICAgIGlzX2NvbnRhaW5lcjo9dHJ1ZQorICAgIGVsc2UKKyAgICAgIGlzX2NvbnRhaW5lcjo9ZmFsc2UKKyAgICBlbmRpZgorICBlbHNlIGlmbmVxICgsJChzdHJpcCAkKGZpbHRlci1vdXQgdHJ1ZSBmYWxzZSwkKGlzX2NvbnRhaW5lcikpKSkKKyAgICAkKGVycm9yIFVucmVjb2duaXplZCB2YWx1ZSAnJChpc19jb250YWluZXIpJyBmb3IgTE9DQUxfTU9EVUxFX0lTX0NPTlRBSU5FUikKKyAgZW5kaWYKKworICBpZmVxICh0cnVlLCQoaXNfY29udGFpbmVyKSkKKyAgICAjIEluY2x1ZGUgc2hhcmVkIGxpYnJhcmllcycgbm90aWNlcyBmb3IgImNvbnRhaW5lciIgdHlwZXMsIGJ1dCBub3QgZm9yIGJpbmFyaWVzIGV0Yy4KKyAgICBub3RpY2VfZGVwcyA6PSBcCisgICAgICAgICQoc3RyaXAgXAorICAgICAgICAgICAgJChmb3JlYWNoIGQsIFwKKyAgICAgICAgICAgICAgICAkKExPQ0FMX1JFUVVJUkVEX01PRFVMRVMpIFwKKyAgICAgICAgICAgICAgICAkKExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMpIFwKKyAgICAgICAgICAgICAgICAkKExPQ0FMX1dIT0xFX1NUQVRJQ19MSUJSQVJJRVMpIFwKKyAgICAgICAgICAgICAgICAkKExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMpIFwKKyAgICAgICAgICAgICAgICAkKExPQ0FMX0RZTElCX0xJQlJBUklFUykgXAorICAgICAgICAgICAgICAgICQoTE9DQUxfUkxJQl9MSUJSQVJJRVMpIFwKKyAgICAgICAgICAgICAgICAkKExPQ0FMX1BST0NfTUFDUk9fTElCUkFSSUVTKSBcCisgICAgICAgICAgICAgICAgJChMT0NBTF9IRUFERVJfTElCUkFSSUVTKSBcCisgICAgICAgICAgICAgICAgJChMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMpIFwKKyAgICAgICAgICAgICAgICAkKExPQ0FMX0pBVkFfTElCUkFSSUVTKSBcCisgICAgICAgICAgICAgICAgJChMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUykgXAorICAgICAgICAgICAgICAgICwkKHN1YnN0IDosXywkKGQpKTpzdGF0aWMgXAorICAgICAgICAgICAgKSBcCisgICAgICAgICkKKyAgZWxzZQorICAgIG5vdGljZV9kZXBzIDo9IFwKKyAgICAgICAgJChzdHJpcCBcCisgICAgICAgICAgICAkKGZvcmVhY2ggZCwgXAorICAgICAgICAgICAgICAgICQoTE9DQUxfUkVRVUlSRURfTU9EVUxFUykgXAorICAgICAgICAgICAgICAgICQoTE9DQUxfU1RBVElDX0xJQlJBUklFUykgXAorICAgICAgICAgICAgICAgICQoTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUykgXAorICAgICAgICAgICAgICAgICQoTE9DQUxfUkxJQl9MSUJSQVJJRVMpIFwKKyAgICAgICAgICAgICAgICAkKExPQ0FMX1BST0NfTUFDUk9fTElCUkFSSUVTKSBcCisgICAgICAgICAgICAgICAgJChMT0NBTF9IRUFERVJfTElCUkFSSUVTKSBcCisgICAgICAgICAgICAgICAgJChMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMpIFwKKyAgICAgICAgICAgICAgICAsJChzdWJzdCA6LF8sJChkKSk6c3RhdGljIFwKKyAgICAgICAgICAgICkkKGZvcmVhY2ggZCwgXAorICAgICAgICAgICAgICAgICQoTE9DQUxfU0hBUkVEX0xJQlJBUklFUykgXAorICAgICAgICAgICAgICAgICQoTE9DQUxfRFlMSUJfTElCUkFSSUVTKSBcCisgICAgICAgICAgICAgICAgJChMT0NBTF9KQVZBX0xJQlJBUklFUykgXAorICAgICAgICAgICAgICAgICQoTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMpIFwKKyAgICAgICAgICAgICAgICAsJChzdWJzdCA6LF8sJChkKSk6ZHluYW1pYyBcCisgICAgICAgICAgICApIFwKKyAgICAgICAgKQorICBlbmRpZgorICBpZmVxICgkKExPQ0FMX0lTX0hPU1RfTU9EVUxFKSx0cnVlKQorICAgIG5vdGljZV9kZXBzIDo9ICQoc3RyaXAgJChub3RpY2VfZGVwcykgJChmb3JlYWNoIGQsJChMT0NBTF9IT1NUX1JFUVVJUkVEX01PRFVMRVMpLCQoc3Vic3QgOixfLCQoZCkpOnN0YXRpYykpCisgIGVsc2UKKyAgICBub3RpY2VfZGVwcyA6PSAkKHN0cmlwICQobm90aWNlX2RlcHMpICQoZm9yZWFjaCBkLCQoTE9DQUxfVEFSR0VUX1JFUVVJUkVEX01PRFVMRVMpLCQoc3Vic3QgOixfLCQoZCkpOnN0YXRpYykpCisgIGVuZGlmCisKKyAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5ERUxBWUVEX01FVEFfTElDIDo9ICQoc3RyaXAgJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkRFTEFZRURfTUVUQV9MSUMpICQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpKQorICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkxJQ0VOU0VfUEFDS0FHRV9OQU1FIDo9ICQoc3RyaXAgJChsaWNlbnNlX3BhY2thZ2VfbmFtZSkpCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTU9EVUxFX1RZUEUgOj0gJChzdHJpcCAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTU9EVUxFX1RZUEUpICQoTE9DQUxfTU9EVUxFX1RZUEUpKQorICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk1PRFVMRV9DTEFTUyA6PSAkKHN0cmlwICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NT0RVTEVfQ0xBU1MpICQoTE9DQUxfTU9EVUxFX0NMQVNTKSkKKyAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5MSUNFTlNFX0tJTkRTIDo9ICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5MSUNFTlNFX0tJTkRTKSAkKGxpY2Vuc2Vfa2luZHMpCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTElDRU5TRV9DT05ESVRJT05TIDo9ICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5MSUNFTlNFX0NPTkRJVElPTlMpICQobGljZW5zZV9jb25kaXRpb25zKQorICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkxJQ0VOU0VfSU5TVEFMTF9NQVAgOj0gJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkxJQ0VOU0VfSU5TVEFMTF9NQVApICQoaW5zdGFsbF9tYXApCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTk9USUNFX0RFUFMgOj0gJChBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLk5PVElDRV9ERVBTKSAkKG5vdGljZV9kZXBzKQorICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLklTX0NPTlRBSU5FUiA6PSAkKHN0cmlwICQoZmlsdGVyLW91dCBmYWxzZSwkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuSVNfQ09OVEFJTkVSKSAkKGlzX2NvbnRhaW5lcikpKQorICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlBBVEggOj0gJChzdHJpcCAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuUEFUSCkgJChsb2NhbF9wYXRoKSkKKworICBpZmRlZiBub3RpY2VfZmlsZQorICAgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTk9USUNFUyA6PSAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTk9USUNFUykgJChub3RpY2VfZmlsZSkKKyAgZW5kaWYgICMgbm90aWNlX2ZpbGUKIGVuZGlmCiAKLWlmZGVmIG5vdGljZV9maWxlCi0KLWlmZGVmIG15X3JlZ2lzdGVyX25hbWUKLUFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTk9USUNFUyA6PSAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTk9USUNFUykgJChub3RpY2VfZmlsZSkKLWVuZGlmCi0KLWVuZGlmICAjIG5vdGljZV9maWxlCmRpZmYgLS1naXQgYS9jb3JlL29zX2xpY2Vuc2luZy5tayBiL2NvcmUvb3NfbGljZW5zaW5nLm1rCmluZGV4IDFlMWI3ZGYuLmQxNWEzZDAgMTAwNjQ0Ci0tLSBhL2NvcmUvb3NfbGljZW5zaW5nLm1rCisrKyBiL2NvcmUvb3NfbGljZW5zaW5nLm1rCkBAIC0xNywxMyArMTcsMTcgQEAKIAogJChldmFsICQoY2FsbCB0ZXh0LW5vdGljZS1ydWxlLCQodGFyZ2V0X25vdGljZV9maWxlX3R4dCksIlN5c3RlbSBpbWFnZSIsJChzeXN0ZW1fbm90aWNlX2ZpbGVfbWVzc2FnZSksJChTWVNURU1fTk9USUNFX0RFUFMpLCQoU1lTVEVNX05PVElDRV9ERVBTKSkpCiAKK2lmbmVxICgkKFVTRV9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSksdHJ1ZSkKICQoaW5zdGFsbGVkX25vdGljZV9odG1sX29yX3htbF9neik6ICQodGFyZ2V0X25vdGljZV9maWxlX3htbF9neikKIAkkKGNvcHktZmlsZS10by10YXJnZXQpCiBlbmRpZgorZW5kaWYKIAogJChjYWxsIGRlY2xhcmUtMXAtdGFyZ2V0LCQodGFyZ2V0X25vdGljZV9maWxlX3htbF9neikpCitpZm5lcSAoJChVU0VfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UpLHRydWUpCiAkKGNhbGwgZGVjbGFyZS0xcC10YXJnZXQsJChpbnN0YWxsZWRfbm90aWNlX2h0bWxfb3JfeG1sX2d6KSkKIGVuZGlmCitlbmRpZgogCiAuUEhPTlk6IHZlbmRvcmxpY2Vuc2UKIHZlbmRvcmxpY2Vuc2U6ICQoY2FsbCBjb3JyZXNwb25kaW5nLWxpY2Vuc2UtbWV0YWRhdGEsICQoVkVORE9SX05PVElDRV9ERVBTKSkgcmVwb3J0bWlzc2luZ2xpY2Vuc2VzCmRpZmYgLS1naXQgYS9jb3JlL3BhY2thZ2VfaW50ZXJuYWwubWsgYi9jb3JlL3BhY2thZ2VfaW50ZXJuYWwubWsKaW5kZXggM2U5MTA2Yi4uYTdlYjU3MiAxMDA2NDQKLS0tIGEvY29yZS9wYWNrYWdlX2ludGVybmFsLm1rCisrKyBiL2NvcmUvcGFja2FnZV9pbnRlcm5hbC5tawpAQCAtMjAzLDEwICsyMDMsMTAgQEAKIGFsbF9yZXNvdXJjZXMgOj0gJChzdHJpcCAkKG15X3Jlc19yZXNvdXJjZXMpICQobXlfb3ZlcmxheV9yZXNvdXJjZXMpKQogCiAjIFRoZSBsaW5rZWQgcmVzb3VyY2UgcGFja2FnZS4KLW15X3Jlc19wYWNrYWdlIDo9ICQoaW50ZXJtZWRpYXRlcykvcGFja2FnZS1yZXMuYXBrCitteV9yZXNfcGFja2FnZSA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9wYWNrYWdlLXJlcy5hcGsKIExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTICs9ICQobXlfcmVzX3BhY2thZ2UpCiAKLW15X2J1bmRsZV9tb2R1bGUgOj0gJChpbnRlcm1lZGlhdGVzKS9iYXNlLnppcAorbXlfYnVuZGxlX21vZHVsZSA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9iYXNlLnppcAogTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMgKz0gJChteV9idW5kbGVfbW9kdWxlKQogCiAjIEFsd2F5cyBydW4gYWFwdDIsIGJlY2F1c2Ugd2UgbmVlZCB0byBhdCBsZWFzdCBjb21waWxlIHRoZSBBbmRyb2lkTWFuaWZlc3QueG1sLgpAQCAtNTMxLDcgKzUzMSw3IEBACiAkKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfUkVTX1BBQ0tBR0UgOj0gJChteV9yZXNfcGFja2FnZSkKICQoTE9DQUxfQlVJTFRfTU9EVUxFKSA6ICQobXlfcmVzX3BhY2thZ2UpICQoQUFQVDIpCiBpZmRlZiBMT0NBTF9DT01QUkVTU0VEX01PRFVMRQotJChMT0NBTF9CVUlMVF9NT0RVTEUpIDogJChNSU5JR1pJUCkKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKSA6ICQoR1pJUCkKIGVuZGlmCiBpZmVxICh0cnVlLCAkKExPQ0FMX1VOQ09NUFJFU1NfREVYKSkKICQoTE9DQUxfQlVJTFRfTU9EVUxFKSA6ICQoWklQMlpJUCkKQEAgLTU3Miw3ICs1NzIsNyBAQAogCSQoY29tcHJlc3MtcGFja2FnZSkKIGVuZGlmICAjIExPQ0FMX0NPTVBSRVNTRURfTU9EVUxFCiAKLW15X3BhY2thZ2VfcmVzX3BiIDo9ICQoaW50ZXJtZWRpYXRlcykvcGFja2FnZS1yZXMucGIuYXBrCitteV9wYWNrYWdlX3Jlc19wYiA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9wYWNrYWdlLXJlcy5wYi5hcGsKICQobXlfcGFja2FnZV9yZXNfcGIpOiAkKG15X3Jlc19wYWNrYWdlKSAkKEFBUFQyKQogCSQoQUFQVDIpIGNvbnZlcnQgLS1vdXRwdXQtZm9ybWF0IHByb3RvICQ8IC1vICRACiAKQEAgLTczMSwzICs3MzEsNSBAQAogICAgICkKICAgZW5kaWYKIGVuZGlmCisKKyQoaWYgJChteV9yZWdpc3Rlcl9uYW1lKSwkKGV2YWwgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NQUtFX01PRFVMRV9UWVBFOj1QQUNLQUdFKSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3BhY2thZ2luZy9mbGFncy5tayBiL2NvcmUvcGFja2FnaW5nL2ZsYWdzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNzFhMDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3BhY2thZ2luZy9mbGFncy5tawpAQCAtMCwwICsxLDIxMCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIworIyBUaGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgYnVpbGQvbWFrZS9jb3JlL01ha2VmaWxlLCBhbmQgY29udGFpbnMgdGhlIGxvZ2ljIGZvcgorIyB0aGUgY29tYmluZWQgZmxhZ3MgZmlsZXMuCisjCisKKyMgVE9ETzogU2hvdWxkIHdlIGRvIGFsbCBvZiB0aGUgaW1hZ2VzIGluICQoSU1BR0VTX1RPX0JVSUxEKT8KK19GTEFHX1BBUlRJVElPTlMgOj0gcHJvZHVjdCBzeXN0ZW0gdmVuZG9yCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBY29uZmlnIEZsYWdzCisKKyMgQ3JlYXRlIGEgc3VtbWFyeSBmaWxlIG9mIGJ1aWxkIGZsYWdzIGZvciBhIHNpbmdsZSBwYXJ0aXRpb24KKyMgJCgxKTogYnVpbHQgYWNvbmZpZyBmbGFncyBmaWxlIChvdXQpCisjICQoMik6IGluc3RhbGxlZCBhY29uZmlnIGZsYWdzIGZpbGUgKG91dCkKKyMgJCgzKTogdGhlIHBhcnRpdGlvbiAoaW4pCisjICQoNCk6IGlucHV0IGFjb25maWcgZmlsZXMgZm9yIHRoZSBwYXJ0aXRpb24gKGluKQorZGVmaW5lIGdlbmVyYXRlLXBhcnRpdGlvbi1hY29uZmlnLWZsYWctZmlsZQorJChldmFsICQoc3RyaXAgJCgxKSk6IFBSSVZBVEVfT1VUIDo9ICQoc3RyaXAgJCgxKSkpCiskKGV2YWwgJChzdHJpcCAkKDEpKTogUFJJVkFURV9JTiA6PSAkKHN0cmlwICQoNCkpKQorJChzdHJpcCAkKDEpKTogJChBQ09ORklHKSAkKHN0cmlwICQoNCkpCisJbWtkaXIgLXAgJCQoZGlyICQkKFBSSVZBVEVfT1VUKSkKKwkkJChpZiAkJChQUklWQVRFX0lOKSwgXAorCQkkJChBQ09ORklHKSBkdW1wIC0tZGVkdXAgLS1mb3JtYXQgcHJvdG9idWYgLS1vdXQgJCQoUFJJVkFURV9PVVQpIFwKKwkJCS0tZmlsdGVyIGNvbnRhaW5lcjokKHN0cmlwICQoMykpK3N0YXRlOkVOQUJMRUQgXAorCQkJLS1maWx0ZXIgY29udGFpbmVyOiQoc3RyaXAgJCgzKSkrcGVybWlzc2lvbjpSRUFEX1dSSVRFIFwKKwkJCSQkKGFkZHByZWZpeCAtLWNhY2hlICwkJChQUklWQVRFX0lOKSksIFwKKwkJZWNobyAtbiA+ICQkKFBSSVZBVEVfT1VUKSBcCisJKQorJChjYWxsIGNvcHktb25lLWZpbGUsICQoMSksICQoMikpCitlbmRlZgorCisKKyMgQ3JlYXRlIGEgc3VtbWFyeSBmaWxlIG9mIGJ1aWxkIGZsYWdzIGZvciBlYWNoIHBhcnRpdGlvbgorIyAkKDEpOiBidWlsdCBhY29uZmlnIGZsYWdzIGZpbGUgKG91dCkKKyMgJCgyKTogaW5zdGFsbGVkIGFjb25maWcgZmxhZ3MgZmlsZSAob3V0KQorIyAkKDMpOiBpbnB1dCBhY29uZmlnIGZpbGVzIGZvciB0aGUgcGFydGl0aW9uIChpbikKK2RlZmluZSBnZW5lcmF0ZS1nbG9iYWwtYWNvbmZpZy1mbGFnLWZpbGUKKyQoZXZhbCAkKHN0cmlwICQoMSkpOiBQUklWQVRFX09VVCA6PSAkKHN0cmlwICQoMSkpKQorJChldmFsICQoc3RyaXAgJCgxKSk6IFBSSVZBVEVfSU4gOj0gJChzdHJpcCAkKDMpKSkKKyQoc3RyaXAgJCgxKSk6ICQoQUNPTkZJRykgJChzdHJpcCAkKDMpKQorCW1rZGlyIC1wICQkKGRpciAkJChQUklWQVRFX09VVCkpCisJJCQoaWYgJCQoUFJJVkFURV9JTiksIFwKKwkJJCQoQUNPTkZJRykgZHVtcCAtLWRlZHVwIC0tZm9ybWF0IHByb3RvYnVmIC0tb3V0ICQkKFBSSVZBVEVfT1VUKSBcCisJCQkkJChhZGRwcmVmaXggLS1jYWNoZSAsJCQoUFJJVkFURV9JTikpLCBcCisJCWVjaG8gLW4gPiAkJChQUklWQVRFX09VVCkgXAorCSkKKyQoY2FsbCBjb3B5LW9uZS1maWxlLCAkKDEpLCAkKDIpKQorZW5kZWYKKworJChmb3JlYWNoIHBhcnRpdGlvbiwgJChfRkxBR19QQVJUSVRJT05TKSwgXAorCSQoZXZhbCBhY29uZmlnX2ZsYWdfc3VtbWFyaWVzX3Byb3RvYnVmLiQocGFydGl0aW9uKSA6PSAkKFBST0RVQ1RfT1VUKS8kKHBhcnRpdGlvbikvZXRjL2Fjb25maWdfZmxhZ3MucGIpIFwKKwkkKGV2YWwgJChjYWxsIGdlbmVyYXRlLXBhcnRpdGlvbi1hY29uZmlnLWZsYWctZmlsZSwgXAorCQkJJChUQVJHRVRfT1VUX0ZMQUdTKS8kKHBhcnRpdGlvbikvYWNvbmZpZ19mbGFncy5wYiwgXAorCQkJJChhY29uZmlnX2ZsYWdfc3VtbWFyaWVzX3Byb3RvYnVmLiQocGFydGl0aW9uKSksIFwKKwkJCSQocGFydGl0aW9uKSwgXAorCQkJJChzb3J0IFwKKwkJCQkkKGZvcmVhY2ggbSwgJChjYWxsIHJlZ2lzdGVyLW5hbWVzLWZvci1wYXJ0aXRpb24sICQocGFydGl0aW9uKSksIFwKKwkJCQkJJChBTExfTU9EVUxFUy4kKG0pLkFDT05GSUdfRklMRVMpIFwKKwkJCQkpIFwKKwkJCQkkKGlmICQoZmlsdGVyIHN5c3RlbSwgJChwYXJ0aXRpb24pKSwgXAorCQkJCQkkKGZvcmVhY2ggbSwgJChjYWxsIHJlZ2lzdGVyLW5hbWVzLWZvci1wYXJ0aXRpb24sIHN5c3RlbV9leHQpLCBcCisJCQkJCQkkKEFMTF9NT0RVTEVTLiQobSkuQUNPTkZJR19GSUxFUykgXAorCQkJCQkpIFwKKwkJCQkpIFwKKwkJCSkgXAorCSkpIFwKKykKKworIyBDb2xsZWN0IHRoZSBvbi1kZXZpY2UgZmxhZ3MgaW50byBhIHNpbmdsZSBmaWxlLCBzaW1pbGFyIHRvIGFsbF9hY29uZmlnX2RlY2xhcmF0aW9ucy4KK3JlcXVpcmVkX2Fjb25maWdfZmxhZ3NfZmlsZXMgOj0gXAorCQkkKHNvcnQgJChmb3JlYWNoIHBhcnRpdGlvbiwgJChmaWx0ZXIgJChJTUFHRVNfVE9fQlVJTEQpLCAkKF9GTEFHX1BBUlRJVElPTlMpKSwgXAorCQkJJChhY29uZmlnX2ZsYWdfc3VtbWFyaWVzX3Byb3RvYnVmLiQocGFydGl0aW9uKSkgXAorCQkpKQorCisuUEhPTlk6IGRldmljZV9hY29uZmlnX2RlY2xhcmF0aW9ucworZGV2aWNlX2Fjb25maWdfZGVjbGFyYXRpb25zOiAkKFBST0RVQ1RfT1VUKS9kZXZpY2VfYWNvbmZpZ19kZWNsYXJhdGlvbnMucGIKKyQoZXZhbCAkKGNhbGwgZ2VuZXJhdGUtZ2xvYmFsLWFjb25maWctZmxhZy1maWxlLCBcCisJCQkkKFRBUkdFVF9PVVRfRkxBR1MpL2RldmljZV9hY29uZmlnX2RlY2xhcmF0aW9ucy5wYiwgXAorCQkJJChQUk9EVUNUX09VVCkvZGV2aWNlX2Fjb25maWdfZGVjbGFyYXRpb25zLnBiLCBcCisJCQkkKHNvcnQgJChyZXF1aXJlZF9hY29uZmlnX2ZsYWdzX2ZpbGVzKSkgXAorKSkgXAorCisjIENyZWF0ZSBhIHNldCBvZiBzdG9yYWdlIGZpbGUgZm9yIGVhY2ggcGFydGl0aW9uCisjICQoMSk6IGJ1aWx0IGFjb25maWcgZmxhZ3Mgc3RvcmFnZSBwYWNrYWdlIG1hcCBmaWxlIChvdXQpCisjICQoMik6IGJ1aWx0IGFjb25maWcgZmxhZ3Mgc3RvcmFnZSBmbGFnIG1hcCBmaWxlIChvdXQpCisjICQoMyk6IGJ1aWx0IGFjb25maWcgZmxhZ3Mgc3RvcmFnZSBmbGFnIHZhbCBmaWxlIChvdXQpCisjICQoNCk6IGJ1aWx0IGFjb25maWcgZmxhZ3Mgc3RvcmFnZSBmbGFnIGluZm8gZmlsZSAob3V0KQorIyAkKDUpOiBpbnN0YWxsZWQgYWNvbmZpZyBmbGFncyBzdG9yYWdlIHBhY2thZ2UgbWFwIGZpbGUgKG91dCkKKyMgJCg2KTogaW5zdGFsbGVkIGFjb25maWcgZmxhZ3Mgc3RvcmFnZSBmbGFnIG1hcCBmaWxlIChvdXQpCisjICQoNyk6IGluc3RhbGxlZCBhY29uZmlnIGZsYWdzIHN0b3JhZ2UgZmxhZyB2YWx1ZSBmaWxlIChvdXQpCisjICQoOCk6IGluc3RhbGxlZCBhY29uZmlnIGZsYWdzIHN0b3JhZ2UgZmxhZyBpbmZvIGZpbGUgKG91dCkKKyMgJCg5KTogaW5wdXQgYWNvbmZpZyBmaWxlcyBmb3IgdGhlIHBhcnRpdGlvbiAoaW4pCisjICQoMTApOiBwYXJ0aXRpb24gbmFtZQorZGVmaW5lIGdlbmVyYXRlLXBhcnRpdGlvbi1hY29uZmlnLXN0b3JhZ2UtZmlsZQorJChldmFsICQoc3RyaXAgJCgxKSk6IFBSSVZBVEVfT1VUIDo9ICQoc3RyaXAgJCgxKSkpCiskKGV2YWwgJChzdHJpcCAkKDEpKTogUFJJVkFURV9JTiA6PSAkKHN0cmlwICQoOSkpKQorCitpZm5lcSAoLCQoUkVMRUFTRV9GSU5HRVJQUklOVF9BQ09ORklHX1BBQ0tBR0VTKSkKK1NUT1JBR0VfRklMRV9WRVJTSU9OIDo9IDIKK2Vsc2UKK1NUT1JBR0VfRklMRV9WRVJTSU9OIDo9IDEKK2VuZGlmCisKKyQoc3RyaXAgJCgxKSk6ICQoQUNPTkZJRykgJChzdHJpcCAkKDkpKQorCW1rZGlyIC1wICQkKGRpciAkJChQUklWQVRFX09VVCkpCisJJCQoaWYgJCQoUFJJVkFURV9JTiksIFwKKwkJJCQoQUNPTkZJRykgY3JlYXRlLXN0b3JhZ2UgLS1jb250YWluZXIgJCgxMCkgLS1maWxlIHBhY2thZ2VfbWFwIC0tb3V0ICQkKFBSSVZBVEVfT1VUKSAtLXZlcnNpb24gJCQoU1RPUkFHRV9GSUxFX1ZFUlNJT04pIFwKKwkJCSQkKGFkZHByZWZpeCAtLWNhY2hlICwkJChQUklWQVRFX0lOKSksIFwKKwkpCisJdG91Y2ggJCQoUFJJVkFURV9PVVQpCiskKGV2YWwgJChzdHJpcCAkKDIpKTogUFJJVkFURV9PVVQgOj0gJChzdHJpcCAkKDIpKSkKKyQoZXZhbCAkKHN0cmlwICQoMikpOiBQUklWQVRFX0lOIDo9ICQoc3RyaXAgJCg5KSkpCiskKHN0cmlwICQoMikpOiAkKEFDT05GSUcpICQoc3RyaXAgJCg5KSkKKwlta2RpciAtcCAkJChkaXIgJCQoUFJJVkFURV9PVVQpKQorCSQkKGlmICQkKFBSSVZBVEVfSU4pLCBcCisJCSQkKEFDT05GSUcpIGNyZWF0ZS1zdG9yYWdlIC0tY29udGFpbmVyICQoMTApIC0tZmlsZSBmbGFnX21hcCAtLW91dCAkJChQUklWQVRFX09VVCkgLS12ZXJzaW9uICQkKFNUT1JBR0VfRklMRV9WRVJTSU9OKSBcCisJCQkkJChhZGRwcmVmaXggLS1jYWNoZSAsJCQoUFJJVkFURV9JTikpLCBcCisJKQorCXRvdWNoICQkKFBSSVZBVEVfT1VUKQorJChldmFsICQoc3RyaXAgJCgzKSk6IFBSSVZBVEVfT1VUIDo9ICQoc3RyaXAgJCgzKSkpCiskKGV2YWwgJChzdHJpcCAkKDMpKTogUFJJVkFURV9JTiA6PSAkKHN0cmlwICQoOSkpKQorJChzdHJpcCAkKDMpKTogJChBQ09ORklHKSAkKHN0cmlwICQoOSkpCisJbWtkaXIgLXAgJCQoZGlyICQkKFBSSVZBVEVfT1VUKSkKKwkkJChpZiAkJChQUklWQVRFX0lOKSwgXAorCQkkJChBQ09ORklHKSBjcmVhdGUtc3RvcmFnZSAtLWNvbnRhaW5lciAkKDEwKSAtLWZpbGUgZmxhZ192YWwgLS1vdXQgJCQoUFJJVkFURV9PVVQpIC0tdmVyc2lvbiAkJChTVE9SQUdFX0ZJTEVfVkVSU0lPTikgXAorCQkkJChhZGRwcmVmaXggLS1jYWNoZSAsJCQoUFJJVkFURV9JTikpLCBcCisJKQorCXRvdWNoICQkKFBSSVZBVEVfT1VUKQorJChldmFsICQoc3RyaXAgJCg0KSk6IFBSSVZBVEVfT1VUIDo9ICQoc3RyaXAgJCg0KSkpCiskKGV2YWwgJChzdHJpcCAkKDQpKTogUFJJVkFURV9JTiA6PSAkKHN0cmlwICQoOSkpKQorJChzdHJpcCAkKDQpKTogJChBQ09ORklHKSAkKHN0cmlwICQoOSkpCisJbWtkaXIgLXAgJCQoZGlyICQkKFBSSVZBVEVfT1VUKSkKKwkkJChpZiAkJChQUklWQVRFX0lOKSwgXAorCQkkJChBQ09ORklHKSBjcmVhdGUtc3RvcmFnZSAtLWNvbnRhaW5lciAkKDEwKSAtLWZpbGUgZmxhZ19pbmZvIC0tb3V0ICQkKFBSSVZBVEVfT1VUKSAtLXZlcnNpb24gJCQoU1RPUkFHRV9GSUxFX1ZFUlNJT04pIFwKKwkJJCQoYWRkcHJlZml4IC0tY2FjaGUgLCQkKFBSSVZBVEVfSU4pKSwgXAorCSkKKwl0b3VjaCAkJChQUklWQVRFX09VVCkKKyQoY2FsbCBjb3B5LW9uZS1maWxlLCAkKHN0cmlwICQoMSkpLCAkKDUpKQorJChjYWxsIGNvcHktb25lLWZpbGUsICQoc3RyaXAgJCgyKSksICQoNikpCiskKGNhbGwgY29weS1vbmUtZmlsZSwgJChzdHJpcCAkKDMpKSwgJCg3KSkKKyQoY2FsbCBjb3B5LW9uZS1maWxlLCAkKHN0cmlwICQoNCkpLCAkKDgpKQorZW5kZWYKKworaWZlcSAoJChSRUxFQVNFX0NSRUFURV9BQ09ORklHX1NUT1JBR0VfRklMRSksdHJ1ZSkKKyQoZm9yZWFjaCBwYXJ0aXRpb24sICQoX0ZMQUdfUEFSVElUSU9OUyksIFwKKwkkKGV2YWwgYWNvbmZpZ19zdG9yYWdlX3BhY2thZ2VfbWFwLiQocGFydGl0aW9uKSA6PSAkKFBST0RVQ1RfT1VUKS8kKHBhcnRpdGlvbikvZXRjL2Fjb25maWcvcGFja2FnZS5tYXApIFwKKwkkKGV2YWwgYWNvbmZpZ19zdG9yYWdlX2ZsYWdfbWFwLiQocGFydGl0aW9uKSA6PSAkKFBST0RVQ1RfT1VUKS8kKHBhcnRpdGlvbikvZXRjL2Fjb25maWcvZmxhZy5tYXApIFwKKwkkKGV2YWwgYWNvbmZpZ19zdG9yYWdlX2ZsYWdfdmFsLiQocGFydGl0aW9uKSA6PSAkKFBST0RVQ1RfT1VUKS8kKHBhcnRpdGlvbikvZXRjL2Fjb25maWcvZmxhZy52YWwpIFwKKwkkKGV2YWwgYWNvbmZpZ19zdG9yYWdlX2ZsYWdfaW5mby4kKHBhcnRpdGlvbikgOj0gJChQUk9EVUNUX09VVCkvJChwYXJ0aXRpb24pL2V0Yy9hY29uZmlnL2ZsYWcuaW5mbykgXAorCSQoZXZhbCAkKGNhbGwgZ2VuZXJhdGUtcGFydGl0aW9uLWFjb25maWctc3RvcmFnZS1maWxlLCBcCisJCQkJJChUQVJHRVRfT1VUX0ZMQUdTKS8kKHBhcnRpdGlvbikvcGFja2FnZS5tYXAsIFwKKwkJCQkkKFRBUkdFVF9PVVRfRkxBR1MpLyQocGFydGl0aW9uKS9mbGFnLm1hcCwgXAorCQkJCSQoVEFSR0VUX09VVF9GTEFHUykvJChwYXJ0aXRpb24pL2ZsYWcudmFsLCBcCisJCQkJJChUQVJHRVRfT1VUX0ZMQUdTKS8kKHBhcnRpdGlvbikvZmxhZy5pbmZvLCBcCisJCQkJJChhY29uZmlnX3N0b3JhZ2VfcGFja2FnZV9tYXAuJChwYXJ0aXRpb24pKSwgXAorCQkJCSQoYWNvbmZpZ19zdG9yYWdlX2ZsYWdfbWFwLiQocGFydGl0aW9uKSksIFwKKwkJCQkkKGFjb25maWdfc3RvcmFnZV9mbGFnX3ZhbC4kKHBhcnRpdGlvbikpLCBcCisJCQkJJChhY29uZmlnX3N0b3JhZ2VfZmxhZ19pbmZvLiQocGFydGl0aW9uKSksIFwKKwkJCQkkKGFjb25maWdfZmxhZ19zdW1tYXJpZXNfcHJvdG9idWYuJChwYXJ0aXRpb24pKSwgXAorCQkJCSQocGFydGl0aW9uKSwgXAorCSkpIFwKKykKK2VuZGlmCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSW5zdGFsbCB0aGUgb25lcyB3ZSBuZWVkIGZvciB0aGUgY29uZmlndXJlZCBwcm9kdWN0CityZXF1aXJlZF9mbGFnc19maWxlcyA6PSBcCisJCSQoc29ydCAkKGZvcmVhY2ggcGFydGl0aW9uLCAkKGZpbHRlciAkKElNQUdFU19UT19CVUlMRCksICQoX0ZMQUdfUEFSVElUSU9OUykpLCBcCisJCQkkKGJ1aWxkX2ZsYWdfc3VtbWFyaWVzLiQocGFydGl0aW9uKSkgXAorCQkJJChhY29uZmlnX2ZsYWdfc3VtbWFyaWVzX3Byb3RvYnVmLiQocGFydGl0aW9uKSkgXAorCQkJJChhY29uZmlnX3N0b3JhZ2VfcGFja2FnZV9tYXAuJChwYXJ0aXRpb24pKSBcCisJCQkkKGFjb25maWdfc3RvcmFnZV9mbGFnX21hcC4kKHBhcnRpdGlvbikpIFwKKwkJCSQoYWNvbmZpZ19zdG9yYWdlX2ZsYWdfdmFsLiQocGFydGl0aW9uKSkgXAorCQkJJChhY29uZmlnX3N0b3JhZ2VfZmxhZ19pbmZvLiQocGFydGl0aW9uKSkgXAorCQkpKQorCitBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKHJlcXVpcmVkX2ZsYWdzX2ZpbGVzKQorQUxMX0ZMQUdTX0ZJTEVTIDo9ICQocmVxdWlyZWRfZmxhZ3NfZmlsZXMpCisKKyMgVE9ETzogUmVtb3ZlCisuUEhPTlk6IGZsYWctZmlsZXMKK2ZsYWctZmlsZXM6ICQocmVxdWlyZWRfZmxhZ3NfZmlsZXMpCisKKworIyBDbGVhbiB1cAorcmVxdWlyZWRfZmxhZ3NfZmlsZXM6PQorcmVxdWlyZWRfYWNvbmZpZ19mbGFnc19maWxlczo9CiskKGZvcmVhY2ggcGFydGl0aW9uLCAkKF9GTEFHX1BBUlRJVElPTlMpLCBcCisJJChldmFsIGJ1aWxkX2ZsYWdfc3VtbWFyaWVzLiQocGFydGl0aW9uKTo9KSBcCisJJChldmFsIGFjb25maWdfZmxhZ19zdW1tYXJpZXNfcHJvdG9idWYuJChwYXJ0aXRpb24pOj0pIFwKKwkkKGV2YWwgYWNvbmZpZ19zdG9yYWdlX3BhY2thZ2VfbWFwLiQocGFydGl0aW9uKTo9KSBcCisJJChldmFsIGFjb25maWdfc3RvcmFnZV9mbGFnX21hcC4kKHBhcnRpdGlvbik6PSkgXAorCSQoZXZhbCBhY29uZmlnX3N0b3JhZ2VfZmxhZ192YWwuJChwYXJ0aXRpb24pOj0pIFwKKwkkKGV2YWwgYWNvbmZpZ19zdG9yYWdlX2ZsYWdfaW5mby4kKHBhcnRpdGlvbik6PSkgXAorKQpkaWZmIC0tZ2l0IGEvY29yZS9waG9ueV9wYWNrYWdlLm1rIGIvY29yZS9waG9ueV9wYWNrYWdlLm1rCmluZGV4IDU3OGQ2MjkuLmM5Nzg3OTMgMTAwNjQ0Ci0tLSBhL2NvcmUvcGhvbnlfcGFja2FnZS5taworKysgYi9jb3JlL3Bob255X3BhY2thZ2UubWsKQEAgLTEyLDMgKzEyLDUgQEAKIAkkKGhpZGUpIGVjaG8gIkZha2U6ICRAIgogCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCiAJJChoaWRlKSB0b3VjaCAkQAorCiskKGlmICQobXlfcmVnaXN0ZXJfbmFtZSksJChldmFsIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUFLRV9NT0RVTEVfVFlQRTo9UEhPTllfUEFDS0FHRSkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9wcmVidWlsdF9pbnRlcm5hbC5tayBiL2NvcmUvcHJlYnVpbHRfaW50ZXJuYWwubWsKaW5kZXggNWJlYTliNi4uZDUyNjFmNCAxMDA2NDQKLS0tIGEvY29yZS9wcmVidWlsdF9pbnRlcm5hbC5taworKysgYi9jb3JlL3ByZWJ1aWx0X2ludGVybmFsLm1rCkBAIC02Myw0ICs2Myw1IEBACiAkKGJ1aWx0X21vZHVsZSkgOiAkKExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTKQogCiBteV9wcmVidWlsdF9zcmNfZmlsZSA6PQotbXlfcHJlb3B0X2Zvcl9leHRyYWN0ZWRfYXBrIDo9CisKKyQoaWYgJChteV9yZWdpc3Rlcl9uYW1lKSwkKGV2YWwgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NQUtFX01PRFVMRV9UWVBFOj1QUkVCVUlMVCkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9wcm9kdWN0Lm1rIGIvY29yZS9wcm9kdWN0Lm1rCmluZGV4IDMwZDdkY2QuLjFiMzM2YjAgMTAwNjQ0Ci0tLSBhL2NvcmUvcHJvZHVjdC5taworKysgYi9jb3JlL3Byb2R1Y3QubWsKQEAgLTI2LDEyICsyNiwxNyBAQAogX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9NT0RFTAogX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9OQU1FX0ZPUl9BVFRFU1RBVElPTgogX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9NT0RFTF9GT1JfQVRURVNUQVRJT04KK19wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfQkFTRV9PUwogCiAjIERlZmluZXMgdGhlIEVMRiBzZWdtZW50IGFsaWdubWVudCBmb3IgYmluYXJpZXMgKGV4ZWN1dGFibGVzIGFuZCBzaGFyZWQgbGlicmFyaWVzKS4KICMgVGhlIEVMRiBzZWdtZW50IGFsaWdubWVudCBoYXMgdG8gYmUgYSBQQUdFX1NJWkUgbXVsdGlwbGUuIEZvciBleGFtcGxlLCBpZgogIyBQUk9EVUNUX01BWF9QQUdFX1NJWkVfU1VQUE9SVEVEPTY1NTM2LCB0aGUgcG9zc2libGUgdmFsdWVzIGZvciBQQUdFX1NJWkUgY291bGQgYmUKICMgNDA5NiwgMTYzODQgYW5kIDY1NTM2LgogX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9NQVhfUEFHRV9TSVpFX1NVUFBPUlRFRAorX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9DSEVDS19QUkVCVUlMVF9NQVhfUEFHRV9TSVpFCisKKyMgQm9vbGVhbiB2YXJpYWJsZSBkZXRlcm1pbmluZyBpZiBBT1NQIHJlbGllcyBvbiBiaW9uaWMncyBQQUdFX1NJWkUgbWFjcm8uCitfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX05PX0JJT05JQ19QQUdFX1NJWkVfTUFDUk8KIAogIyBUaGUgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBwcm9kdWN0LgogX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfTE9DQUxFUwpAQCAtNDMsNiArNDgsMTMgQEAKIF9wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX1BBQ0tBR0VTX0RFQlVHCiBfcHJvZHVjdF9saXN0X3ZhcnMgKz0gUFJPRFVDVF9QQUNLQUdFU19ERUJVR19BU0FOCiBfcHJvZHVjdF9saXN0X3ZhcnMgKz0gUFJPRFVDVF9QQUNLQUdFU19BUk02NAorCisjIHBhY2thZ2VzIHRoYXQgYXJlIGFkZGVkIHRvIFBST0RVQ1RfUEFDS0FHRVMgYmFzZWQgb24gdGhlIFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMCisjIFRoZXNlIGFyZSBvbmx5IGFkZGVkIGlmIHRoZSBzaGlwcGluZyBBUEkgbGV2ZWwgaXMgdGhhdCBsZXZlbCBvciBsb3dlcgorX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfUEFDS0FHRVNfU0hJUFBJTkdfQVBJX0xFVkVMXzI5CitfcHJvZHVjdF9saXN0X3ZhcnMgKz0gUFJPRFVDVF9QQUNLQUdFU19TSElQUElOR19BUElfTEVWRUxfMzMKK19wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX1BBQ0tBR0VTX1NISVBQSU5HX0FQSV9MRVZFTF8zNAorCiAjIFBhY2thZ2VzIGluY2x1ZGVkIG9ubHkgZm9yIGVuZy91c2VyZGVidWcgYnVpbGRzLCB3aGVuIGJ1aWxkaW5nIHdpdGggRU1NQV9JTlNUUlVNRU5UPXRydWUKIF9wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX1BBQ0tBR0VTX0RFQlVHX0pBVkFfQ09WRVJBR0UKIF9wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX1BBQ0tBR0VTX0VORwpAQCAtMTQ2LDcgKzE1OCw5IEBACiAjIFBST0RVQ1RfQk9PVF9KQVJTLCBzbyB0aGF0IGRldmljZS1zcGVjaWZpYyBqYXJzIGdvIGFmdGVyIGNvbW1vbiBqYXJzLgogX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfQk9PVF9KQVJTX0VYVFJBCiAKLV9wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfU1VQUE9SVFNfVkJPT1QKKyMgTGlzdCBvZiBqYXJzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBBUlQgYm9vdCBpbWFnZSBmb3IgdGVzdGluZy4KK19wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX1RFU1RfT05MWV9BUlRfQk9PVF9JTUFHRV9KQVJTCisKIF9wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX1NZU1RFTV9TRVJWRVJfQVBQUwogIyBMaXN0IG9mIHN5c3RlbV9zZXJ2ZXIgY2xhc3NwYXRoIGphcnMgb24gdGhlIHBsYXRmb3JtLgogX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfU1lTVEVNX1NFUlZFUl9KQVJTCkBAIC0xNjksOCArMTgzLDYgQEAKICMgU2V0IHRvIHRydWUgdG8gZGlzYWJsZSA8dXNlcy1saWJyYXJ5PiBjaGVja3MgZm9yIGEgcHJvZHVjdC4KIF9wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX0JST0tFTl9WRVJJRllfVVNFU19MSUJSQVJJRVMKIAotIyBBbGwgb2YgdGhlIGFwcHMgdGhhdCB3ZSBmb3JjZSBwcmVvcHQsIHRoaXMgb3ZlcnJpZGVzIFdJVEhfREVYUFJFT1BULgotX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfQUxXQVlTX1BSRU9QVF9FWFRSQUNURURfQVBLCiBfcHJvZHVjdF9saXN0X3ZhcnMgKz0gUFJPRFVDVF9ERVhQUkVPUFRfU1BFRURfQVBQUwogX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfTE9BREVEX0JZX1BSSVZJTEVHRURfTU9EVUxFUwogX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9WQk9PVF9TSUdOSU5HX0tFWQpAQCAtMjE4LDYgKzIzMCw5IEBACiAjIFRoZSBmaXJzdCBBUEkgbGV2ZWwgdGhpcyBwcm9kdWN0IHNoaXBwZWQgd2l0aAogX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwKIAorIyBUaGUgZmlyc3QgdmVuZG9yIEFQSSBsZXZlbCB0aGlzIHByb2R1Y3Qgc2hpcHBlZCB3aXRoCitfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX1NISVBQSU5HX1ZFTkRPUl9BUElfTEVWRUwKKwogX3Byb2R1Y3RfbGlzdF92YXJzICs9IFZFTkRPUl9QUk9EVUNUX1JFU1RSSUNUX1ZFTkRPUl9GSUxFUwogX3Byb2R1Y3RfbGlzdF92YXJzICs9IFZFTkRPUl9FWENFUFRJT05fTU9EVUxFUwogX3Byb2R1Y3RfbGlzdF92YXJzICs9IFZFTkRPUl9FWENFUFRJT05fUEFUSFMKQEAgLTI0Nyw2ICsyNjIsOSBAQAogIyBXaGV0aGVyIGFueSBwYXRocyBzaG91bGQgaGF2ZSBIV0FTYW4gZW5hYmxlZCBmb3IgY29tcG9uZW50cwogX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfSFdBU0FOX0lOQ0xVREVfUEFUSFMKIAorIyBXaGV0aGVyIGFueSBwYXRocyBhcmUgZXhjbHVkZWQgZnJvbSBzYW5pdGl6YXRpb24gd2hlbiBTQU5JVElaRV9UQVJHRVQ9aHdhZGRyZXNzCitfcHJvZHVjdF9saXN0X3ZhcnMgKz0gUFJPRFVDVF9IV0FTQU5fRVhDTFVERV9QQVRIUworCiAjIFdoZXRoZXIgYW55IHBhdGhzIHNob3VsZCBoYXZlIE1lbXRhZ19oZWFwIGVuYWJsZWQgZm9yIGNvbXBvbmVudHMKIF9wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX01FTVRBR19IRUFQX0FTWU5DX0lOQ0xVREVfUEFUSFMKIF9wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX01FTVRBR19IRUFQX0FTWU5DX0RFRkFVTFRfSU5DTFVERV9QQVRIUwpAQCAtMjY2LDYgKzI4NCw5IEBACiAjIFdoZXRoZXIgQVBFWCBzaG91bGQgYmUgY29tcHJlc3NlZCBvciBub3QKIF9wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfQ09NUFJFU1NFRF9BUEVYCiAKKyMgRGVmYXVsdCBmcyB0eXBlIGZvciBBUEVYIHBheWxvYWQgaW1hZ2UgKGFwZXhfcGF5bG9hZC5pbWcpCitfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX0RFRkFVTFRfQVBFWF9QQVlMT0FEX1RZUEUKKwogIyBWTkRLIHZlcnNpb24gb2YgcHJvZHVjdCBwYXJ0aXRpb24uIEl0IGNhbiBiZSAnY3VycmVudCcgaWYgdGhlIHByb2R1Y3QKICMgcGFydGl0aW9ucyB1c2VzIFBMQVRGT1JNX1ZOREtfVkVSU0lPTi4KIF9wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfUFJPRFVDVF9WTkRLX1ZFUlNJT04KQEAgLTI4Niw5ICszMDcsNiBAQAogIyBUaGlzIGZsYWcgaW1wbGllcyBQUk9EVUNUX1VTRV9EWU5BTUlDX1BBUlRJVElPTlMuCiBfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX1JFVFJPRklUX0RZTkFNSUNfUEFSVElUSU9OUwogCi0jIExpc3Qgb2YgdGFncyB0aGF0IHdpbGwgYmUgdXNlZCB0byBnYXRlIGJsdWVwcmludCBtb2R1bGVzIGZyb20gdGhlIGJ1aWxkIGdyYXBoCi1fcHJvZHVjdF9saXN0X3ZhcnMgKz0gUFJPRFVDVF9JTkNMVURFX1RBR1MKLQogIyBMaXN0IG9mIGRpcmVjdG9yaWVzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGdhdGUgYmx1ZXByaW50IG1vZHVsZXMgZnJvbSB0aGUgYnVpbGQgZ3JhcGgKIF9wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX1NPVVJDRV9ST09UX0RJUlMKIApAQCAtMzA4LDYgKzMyNiwxMyBAQAogIyBzZXQgdGhpcyB2YXJpYWJsZSB0byBwcmV2ZW50IE9UQSBmYWlsdXJlcy4KIF9wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX09UQV9FTkZPUkNFX1ZJTlRGX0tFUk5FTF9SRVFVSVJFTUVOVFMKIAorIyBJZiBzZXQgdG8gdHJ1ZSwgdGhpcyBwcm9kdWN0IGZvcmNlcyBISURMIHRvIGJlIGVuYWJsZWQgYnkgZGVjbGFyaW5nIGFuZHJvaWQuaGlkbC5tYW5hZ2VyCisjIGFuZCBhbmRyb2lkLmhpZGwudG9rZW4gaW4gdGhlIGZyYW1ld29yayBtYW5pZmVzdC4gVGhlIHByb2R1Y3Qgd2lsbCBhbHNvIG5lZWQgdG8gYWRkIHRoZQorIyAnaHdzZXJ2aWNlbWFuYWdlcicgc2VydmljZSB0byBQUk9EVUNUX1BBQ0tBR0VTIGlmIGl0cyBTSElQUElOR19BUElfTEVWRUwgaXMgZ3JlYXRlciB0aGFuIDM0LgorIyBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZHVyaW5nIGJyaW5ndXAgZm9yIGRldmljZXMgdGhhdCBhcmUgdGFyZ2V0aW5nIEZDTSAyMDI0MDQgYW5kIHN0aWxsCisjIGhhdmUgcGFydG5lci1vd25lZCBISURMIGludGVyZmFjZXMgdGhhdCBhcmUgYmVpbmcgY29udmVydGVkIHRvIEFJREwuCitfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX0hJRExfRU5BQkxFRAorCiAjIElmIHNldCB0byB0cnVlLCB0aGlzIHByb2R1Y3QgYnVpbGRzIGEgZ2VuZXJpYyBPVEEgcGFja2FnZSwgd2hpY2ggaW5zdGFsbHMgZ2VuZXJpYyBzeXN0ZW0gaW1hZ2VzCiAjIG9udG8gbWF0Y2hpbmcgZGV2aWNlcy4gVGhlIHByb2R1Y3QgbWF5IG9ubHkgYnVpbGQgYSBzdWJzZXQgb2Ygc3lzdGVtIGltYWdlcyAoZS5nLiBvbmx5CiAjIHN5c3RlbS5pbWcpLCBzbyBkZXZpY2VzIG5lZWQgdG8gaW5zdGFsbCB0aGUgcGFja2FnZSBpbiBhIHN5c3RlbS1vbmx5IE9UQSBtYW5uZXIuCkBAIC0zMTcsNiArMzQyLDEwIEBACiBfcHJvZHVjdF9saXN0X3ZhcnMgKz0gUFJPRFVDVF9QQUNLQUdFX05BTUVfT1ZFUlJJREVTCiBfcHJvZHVjdF9saXN0X3ZhcnMgKz0gUFJPRFVDVF9DRVJUSUZJQ0FURV9PVkVSUklERVMKIAorIyBPdmVycmlkZXMgdGhlIChhcGV4LCBqYXIpIHBhaXJzIGFib3ZlIHdoZW4gZGV0ZXJtaW5pbmcgdGhlIG9uLWRldmljZSBsb2NhdGlvbi4gVGhlIGZvcm1hdCBpczoKKyMgPG9sZF9hcGV4Pjo8b2xkX2phcj46PG5ld19hcGV4Pjo8bmV3X2phcj4KK19wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX0NPTkZJR1VSRURfSkFSX0xPQ0FUSU9OX09WRVJSSURFUworCiAjIENvbnRyb2xzIGZvciB3aGV0aGVyIGRpZmZlcmVudCBwYXJ0aXRpb25zIGFyZSBidWlsdCBmb3IgdGhlIGN1cnJlbnQgcHJvZHVjdC4KIF9wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfQlVJTERfU1lTVEVNX0lNQUdFCiBfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX0JVSUxEX1NZU1RFTV9PVEhFUl9JTUFHRQpAQCAtMzQwLDYgKzM2OSw4IEBACiBfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX0JVSUxEX1ZCTUVUQV9JTUFHRQogX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9CVUlMRF9TVVBFUl9FTVBUWV9JTUFHRQogX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9CVUlMRF9QVk1GV19JTUFHRQorX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9CVUlMRF9ERVNLVE9QX1JFQ09WRVJZX0lNQUdFCitfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX0JVSUxEX0RFU0tUT1BfVVBEQVRFX0lNQUdFCiAKICMgTGlzdCBvZiBib290IGphcnMgZGVsaXZlcmVkIHZpYSB1cGRhdGFibGUgQVBFWGVzLCBmb2xsb3dpbmcgdGhlIHNhbWUgZm9ybWF0IGFzCiAjIFBST0RVQ1RfQk9PVF9KQVJTLgpAQCAtMzY0LDIyICszOTUsNiBAQAogIyBJZiBzZXQsIEphdmEgbW9kdWxlIGluIHByb2R1Y3QgcGFydGl0aW9uIGNhbm5vdCB1c2UgaGlkZGVuIEFQSXMuCiBfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX0VORk9SQ0VfUFJPRFVDVF9QQVJUSVRJT05fSU5URVJGQUNFCiAKLSMgSWYgc2V0LCBvbmx5IGphdmFfc2RrX2xpYnJhcnkgY2FuIGJlIHVzZWQgYXQgaW50ZXItcGFydGl0aW9uIGRlcGVuZGVuY3kuCi0jIE5vdGU6IEJ1aWxkIGVycm9yIGlmIEJPQVJEX1ZOREtfVkVSU0lPTiBpcyBub3Qgc2V0IHdoaWxlCi0jICAgICAgIFBST0RVQ1RfRU5GT1JDRV9JTlRFUl9QQVJUSVRJT05fSkFWQV9TREtfTElCUkFSWSBpcyB0cnVlLCBiZWNhdXNlCi0jICAgICAgIFBST0RVQ1RfRU5GT1JDRV9JTlRFUl9QQVJUSVRJT05fSkFWQV9TREtfTElCUkFSWSBoYXMgbm8gbWVhbmluZyBpZgotIyAgICAgICBCT0FSRF9WTkRLX1ZFUlNJT04gaXMgbm90IHNldC4KLSMgTm90ZTogV2hlbiBQUk9EVUNUX0VORk9SQ0VfUFJPRFVDVF9QQVJUSVRJT05fSU5URVJGQUNFIGlzIG5vdCBzZXQsIHRoZXJlIGFyZQotIyAgICAgICBubyByZXN0cmljdGlvbnMgYXQgZGVwZW5kZW5jeSBiZXR3ZWVuIHN5c3RlbSBhbmQgcHJvZHVjdCBwYXJ0aXRpb24uCi1fcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX0VORk9SQ0VfSU5URVJfUEFSVElUSU9OX0pBVkFfU0RLX0xJQlJBUlkKLQotIyBBbGxvd2xpc3QgZm9yIFBST0RVQ1RfRU5GT1JDRV9JTlRFUl9QQVJUSVRJT05fSkFWQV9TREtfTElCUkFSWSBvcHRpb24uCi0jIExpc3RlZCBtb2R1bGVzIGFyZSBhbGxvd2VkIGF0IGludGVyLXBhcnRpdGlvbiBkZXBlbmRlbmN5IGV2ZW4gaWYgaXQgaXNuJ3QKLSMgYSBqYXZhX3Nka19saWJyYXJ5IG1vZHVsZS4KLV9wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX0lOVEVSX1BBUlRJVElPTl9KQVZBX0xJQlJBUllfQUxMT1dMSVNUCi0KLV9wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfSU5TVEFMTF9FWFRSQV9GTEFUVEVORURfQVBFWEVTCi0KICMgSW5zdGFsbCBhIGNvcHkgb2YgdGhlIGRlYnVnIHBvbGljeSB0byB0aGUgc3lzdGVtX2V4dCBwYXJ0aXRpb24sIGFuZCBhbGxvdwogIyBpbml0LXNlY29uZC1zdGFnZSB0byBsb2FkIGRlYnVnIHBvbGljeSBmcm9tIHN5c3RlbV9leHQuCiAjIFRoaXMgb3B0aW9uIGlzIG9ubHkgbWVhbnQgdG8gYmUgc2V0IGJ5IGNvbXBsaWFuY2UgR1NJIHRhcmdldHMuCkBAIC0zOTIsMTUgKzQwNywyOSBAQAogIyAvc3lzdGVtL2V0Yy9zZWN1cml0eS9mc3Zlcml0eS9CdWlsZE1hbmlmZXN0LmFwawogX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9GU1ZFUklUWV9HRU5FUkFURV9NRVRBREFUQQogCi0jIElmIHRydWUsIHNldHMgdGhlIGRlZmF1bHQgZm9yIE1PRFVMRV9CVUlMRF9GUk9NX1NPVVJDRS4gVGhpcyBvdmVycmlkZXMKLSMgQlJBTkNIX0RFRkFVTFRfTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFIGJ1dCBub3QgYW4gZXhwbGljaXRseSBzZXQgdmFsdWUuCisjIElmIHRydWUsIHRoaXMgYnVpbGRzIHRoZSBtYWlubGluZSBtb2R1bGVzIGZyb20gc291cmNlLiBUaGlzIG92ZXJyaWRlcyBhbnkKKyMgcHJlYnVpbHRzIHNlbGVjdGVkIHZpYSBSRUxFQVNFX0FQRVhfQ09OVFJJQlVUSU9OU18qIGJ1aWxkIGZsYWdzIGZvciB0aGUKKyMgY3VycmVudCByZWxlYXNlIGNvbmZpZy4KIF9wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFCiAKICMgSWYgdHJ1ZSwgaW5zdGFsbHMgYSBmdWxsIHZlcnNpb24gb2YgY29tLmFuZHJvaWQudmlydCBBUEVYLgogX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9BVkZfRU5BQkxFRAogCi0jIExpc3Qgb2YgLmpzb24gZmlsZXMgdG8gYmUgbWVyZ2VkL2NvbXBpbGVkIGludG8gdmVuZG9yL2V0Yy9saW5rZXIuY29uZmlnLnBiCisjIElmIGZhbHNlLCBkaXNhYmxlIHRoZSBBVkYgcmVtb3RlIGF0dGVzdGF0b24gZmVhdHVyZS4KK19wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfQVZGX1JFTU9URV9BVFRFU1RBVElPTl9ESVNBQkxFRAorCisjIElmIHRydWUsIGtlcm5lbCB3aXRoIG1vZHVsZXMgd2lsbCBiZSB1c2VkIGZvciBNaWNyb2Ryb2lkIFZNcy4KK19wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfQVZGX0tFUk5FTF9NT0RVTEVTX0VOQUJMRUQKKworIyBJZiB0cnVlLCB0aGUgbWVtb3J5IGNvbnRyb2xsZXIgd2lsbCBiZSBmb3JjZS1lbmFibGVkIGluIHRoZSBjZ3JvdXAgdjIgaGllcmFyY2h5CitfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX01FTUNHX1YyX0ZPUkNFX0VOQUJMRUQKKworIyBJZiB0cnVlLCB0aGUgY2dyb3VwIHYyIGhpZXJhcmNoeSB3aWxsIGJlIHNwbGl0IGludG8gYXBwcy9zeXN0ZW0gc3VidHJlZXMKK19wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfQ0dST1VQX1YyX1NZU19BUFBfSVNPTEFUSU9OX0VOQUJMRUQKKworIyBMaXN0IG9mIC5qc29uIGZpbGVzIHRvIGJlIG1lcmdlZC9jb21waWxlZCBpbnRvIHZlbmRvci9ldGMvbGlua2VyLmNvbmZpZy5wYiBhbmQgcHJvZHVjdC9ldGMvbGlua2VyLmNvbmZpZy5wYgogX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfVkVORE9SX0xJTktFUl9DT05GSUdfRlJBR01FTlRTCitfcHJvZHVjdF9saXN0X3ZhcnMgKz0gUFJPRFVDVF9QUk9EVUNUX0xJTktFUl9DT05GSUdfRlJBR01FTlRTCiAKICMgV2hldGhlciB0byB1c2UgdXNlcmZhdWx0ZmQgR0MuCiAjIFBvc3NpYmxlIHZhbHVlcyBhcmU6CkBAIC00MTEsMTEgKzQ0MCw2OCBAQAogIyAgIGRldmljZSBtYXkgaGF2ZSB0byByZS1jb21waWxlIGV2ZXJ5dGhpbmcgb24gdGhlIGZpcnN0IGJvb3QgaWYgdGhlIGtlcm5lbCBkb2Vzbid0IHN1cHBvcnQKICMgICB1c2VyZmF1bHRmZAogIyAtICJmYWxzZSI6IGRpc2FsbG93cyB0aGUgYnVpbGQgc3lzdGVtIGFuZCB0aGUgcnVudGltZSB0byB1c2UgdXNlcmZhdWx0ZmQgR0MgZXZlbiBpZiB0aGUgZGV2aWNlCi0jICAgc3VwcG9ydHMgaXQKKyMgICBzdXBwb3J0cyBpdC4gVGhpcyBvcHRpb24gaXMgdGVtcG9yYXJ5IC0gdGhlIHBsYW4gaXMgdG8gcmVtb3ZlIGl0IGJ5IEF1ZyAyMDI1LCBhdCB3aGljaCB0aW1lCisjICAgTWFpbmxpbmUgdXBkYXRlcyBvZiB0aGUgQVJUIG1vZHVsZSB3aWxsIGlnbm9yZSBpdCBhcyB3ZWxsLgogX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9FTkFCTEVfVUZGRF9HQwogCisjIFNwZWNpZmllcyBDT1cgdmVyc2lvbiB0byBiZSB1c2VkIGJ5IHVwZGF0ZV9lbmdpbmUgYW5kIGxpYnNuYXBzaG90LiBJZiB0aGlzIHZhbHVlIGlzIG5vdAorIyBzcGVjaWZpZWQgd2UgZGVmYXVsdCB0byBDT1cgdmVyc2lvbiAyIGluIHVwZGF0ZV9lbmdpbmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CitfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX1ZJUlRVQUxfQUJfQ09XX1ZFUlNJT04KKworIyBTcGVjaWZpZXMgbWF4aW11bSBieXRlcyB0byBiZSBjb21wcmVzc2VkIGF0IG9uY2UgZHVyaW5nIG90YS4gT3B0aW9uczogNDA5NiwgODE5MiwgMTYzODQsIDMyNzY4LCA2NTUzNiwgMTMxMDcyLCAyNjIxNDQuCitfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX1ZJUlRVQUxfQUJfQ09NUFJFU1NJT05fRkFDVE9SCisKKyMgSWYgc2V0LCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGJ1aWxkIHN5c3RlbSBjaGVja3MgdmVuZG9yIHNlYXBwIGNvbnRleHRzIHZpb2xhdGlvbnMuCitfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX0NIRUNLX1ZFTkRPUl9TRUFQUF9WSU9MQVRJT05TCisKKyMgSWYgc2V0LCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGJ1aWxkIHN5c3RlbSBjaGVja3MgZGV2IHR5cGUgdmlvbGF0aW9ucy4KK19wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfQ0hFQ0tfREVWX1RZUEVfVklPTEFUSU9OUworCiBfcHJvZHVjdF9saXN0X3ZhcnMgKz0gUFJPRFVDVF9BRkRPX1BST0ZJTEVTCiAKK19wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfU0NVRE9fQUxMT0NBVElPTl9SSU5HX0JVRkZFUl9TSVpFCisKK19wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX1JFTEVBU0VfQ09ORklHX01BUFMKKworX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfVkFMSURBVElPTl9DSEVDS1MKKworX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9CVUlMRF9GUk9NX1NPVVJDRV9TVFVCCisKK19wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfQlVJTERfSUdOT1JFX0FQRVhfQ09OVFJJQlVUSU9OX0NPTlRFTlRTCisKK19wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfSElEREVOX0FQSV9FWFBPUlRBQkxFX1NUVUJTCisKK19wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfRVhQT1JUX1JVTlRJTUVfQVBJUworCisjIElmIHNldCwgZGV0ZXJtaW5lcyB3aGljaCB2ZXJzaW9uIG9mIHRoZSBHS0kgaXMgdXNlZCBhcyBndWVzdCBrZXJuZWwgZm9yIE1pY3JvZHJvaWQgVk1zLgorIyBUT0RPKGIvMzI1OTkxNzM1KTogbGluayB0byBkb2N1bWVudGF0aW9uIG9uY2UgaXQgaXMgZG9uZS4KK19wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfQVZGX01JQ1JPRFJPSURfR1VFU1RfR0tJX1ZFUlNJT04KKworIyBFbmFibGVzIDE2S0IgZGV2ZWxvcGVyIG9wdGlvbiBmb3IgZGV2aWNlIGlmIHNldC4KK19wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfMTZLX0RFVkVMT1BFUl9PUFRJT04KKworIyBJZiBzZXQsIGFkYiByb290IHdpbGwgYmUgZGlzYWJsZWQgKHJlYWxseSByby5kZWJ1Z2dhYmxlPTApIGluIHVzZXJkZWJ1ZworIyBidWlsZHMuIEl0J3MgYWxyZWFkeSBvZmYgZGlzYWJsZWQgaW4gdXNlciBidWlsZHMuIEVuZyBidWlsZHMgYXJlIHVuYWZmZWN0ZWQKKyMgYnkgdGhpcyBmbGFnLgorX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9OT1RfREVCVUdHQUJMRV9JTl9VU0VSREVCVUcKKworIyBJZiBzZXQsIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSB2ZXJzaW9uTmFtZSBvZiBhcHBzIHdpbGwgaW5jbHVkZSB0aGUgYnVpbGQgbnVtYmVyLgorX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9CVUlMRF9BUFBTX1dJVEhfQlVJTERfTlVNQkVSCisKKyMgSWYgc2V0LCBidWlsZCB3b3VsZCBnZW5lcmF0ZSBzeXN0ZW0gaW1hZ2UgZnJvbSBTb29uZy1kZWZpbmVkIG1vZHVsZS4KK19wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UKKworIyBMaXN0IG9mIHN0dWIgbGlicmFyaWVzIHNwZWNpZmljIHRvIHRoZSBwcm9kdWN0IHRoYXQgYXJlIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgc3lzdGVtIGltYWdlIGFuZAorIyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHN5c3RlbV9saW5rZXJfY29uZmlnLgorX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfRVhUUkFfU1RVQl9MSUJSQVJJRVMKKworIyBJZiBzZXQgdG8gdHJ1ZSwgYWxsIEFuZHJvaWQubWsgZmlsZXMgd2lsbCBiZSBpZ25vcmVkLgorX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9JR05PUkVfQUxMX0FORFJPSURNSworIyBXaGVuIFBST0RVQ1RfSUdOT1JFX0FMTF9BTkRST0lETUsgaXMgc2V0IHRvIHRydWUsIHRoaXMgdmFyaWFibGUgd2lsbCBiZSB1c2VkIHRvIGFsbG93IHNvbWUgQW5kcm9pZC5tayBmaWxlcy4KK19wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX0FMTE9XRURfQU5EUk9JRE1LX0ZJTEVTCisjIFdoZW4gUFJPRFVDVF9JR05PUkVfQUxMX0FORFJPSURNSyBpcyBzZXQgdG8gdHJ1ZSwgcGF0aCBvZiBmaWxlIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mIGFsbG93ZWQgQW5kcm9pZC5tayBmaWxlcworX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9BTkRST0lETUtfQUxMT1dMSVNUX0ZJTEUKKwogLktBVElfUkVBRE9OTFkgOj0gX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgX3Byb2R1Y3RfbGlzdF92YXJzCiBfcHJvZHVjdF92YXJfbGlzdCA6PSQ9ICQoX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMpICQoX3Byb2R1Y3RfbGlzdF92YXJzKQogCkBAIC01MTMsNyArNTk5LDcgQEAKICMgYmUgY2xlYW5lZCB1cCB0byBub3QgYmUgcHJvZHVjdCB2YXJpYWJsZXMuCiBfcmVhZG9ubHlfbGF0ZV92YXJpYWJsZXMgOj0gXAogICBERVZJQ0VfUEFDS0FHRV9PVkVSTEFZUyBcCi0gIFdJVEhfREVYUFJFT1BUX0JPT1RfSU1HX0FORF9TWVNURU1fU0VSVkVSX09OTFkgXAorICBXSVRIX0RFWFBSRU9QVF9BUlRfQk9PVF9JTUdfT05MWSBcCiAKICMgTW9kaWZpZWQgaW50ZXJuYWxseSBpbiB0aGUgYnVpbGQgc3lzdGVtCiBfcmVhZG9ubHlfbGF0ZV92YXJpYWJsZXMgKz0gXApkaWZmIC0tZ2l0IGEvY29yZS9wcm9kdWN0X2NvbmZpZy5tayBiL2NvcmUvcHJvZHVjdF9jb25maWcubWsKaW5kZXggNWQ3NmVlYi4uZjkzYjYzYyAxMDA2NDQKLS0tIGEvY29yZS9wcm9kdWN0X2NvbmZpZy5taworKysgYi9jb3JlL3Byb2R1Y3RfY29uZmlnLm1rCkBAIC0yMjMsNyArMjIzLDcgQEAKIGVuZGlmCiAKIGlmZXEgKCwkKGN1cnJlbnRfcHJvZHVjdF9tYWtlZmlsZSkpCi0gICQoZXJyb3IgQ2FuIG5vdCBsb2NhdGUgY29uZmlnIG1ha2VmaWxlIGZvciBwcm9kdWN0ICIkKFRBUkdFVF9QUk9EVUNUKSIpCisgICQoZXJyb3IgQ2Fubm90IGxvY2F0ZSBjb25maWcgbWFrZWZpbGUgZm9yIHByb2R1Y3QgIiQoVEFSR0VUX1BST0RVQ1QpIikKIGVuZGlmCiAKIGlmbmVxICgsJChmaWx0ZXIgJChUQVJHRVRfUFJPRFVDVCksJChwcm9kdWN0c191c2luZ19zdGFybGFya19jb25maWcpKSkKQEAgLTIzNiwxNCArMjM2LDIyIEBACiAgICQoc2hlbGwgbWtkaXIgLXAgJChPVVRfRElSKS9yYmMpCiAgICQoY2FsbCBkdW1wLXZhcmlhYmxlcy1yYmMsICQoT1VUX0RJUikvcmJjL21ha2VfdmFyc19wcmVfcHJvZHVjdF9jb25maWcubWspCiAKLSAgJChzaGVsbCBidWlsZC9zb29uZy9zY3JpcHRzL3VwZGF0ZV9vdXQgXAotICAgICQoT1VUX0RJUikvcmJjL3JiY19wcm9kdWN0X2NvbmZpZ19yZXN1bHRzLm1rIFwKLSAgICBidWlsZC9zb29uZy9zY3JpcHRzL3JiYy1ydW4gXAotICAgICQoY3VycmVudF9wcm9kdWN0X21ha2VmaWxlKSBcCi0gICAgJChPVVRfRElSKS9yYmMvbWFrZV92YXJzX3ByZV9wcm9kdWN0X2NvbmZpZy5taykKKyAgJChzaGVsbCAkKE9VVF9ESVIpL21rMnJiYyBcCisgICAgLS1tb2RlPXdyaXRlIC1yIC0tb3V0ZGlyICQoT1VUX0RJUikvcmJjIFwKKyAgICAtLWxhdW5jaGVyPSQoT1VUX0RJUikvcmJjL2xhdW5jaGVyLnJiYyBcCisgICAgLS1pbnB1dF92YXJpYWJsZXM9JChPVVRfRElSKS9yYmMvbWFrZV92YXJzX3ByZV9wcm9kdWN0X2NvbmZpZy5tayBcCisgICAgLS1tYWtlZmlsZV9saXN0PSQoT1VUX0RJUikvLm1vZHVsZV9wYXRocy9jb25maWd1cmF0aW9uLmxpc3QgXAorICAgICQoY3VycmVudF9wcm9kdWN0X21ha2VmaWxlKSkKICAgaWZuZXEgKCQoLlNIRUxMU1RBVFVTKSwwKQogICAgICQoZXJyb3IgcHJvZHVjdCBjb25maWd1cmF0aW9uIGNvbnZlcnRlciBmYWlsZWQ6ICQoLlNIRUxMU1RBVFVTKSkKICAgZW5kaWYKKworICAkKHNoZWxsIGJ1aWxkL3Nvb25nL3NjcmlwdHMvdXBkYXRlX291dCAkKE9VVF9ESVIpL3JiYy9yYmNfcHJvZHVjdF9jb25maWdfcmVzdWx0cy5tayBcCisgICAgJChPVVRfRElSKS9yYmNydW4gLS1tb2RlPXJiYyAkKE9VVF9ESVIpL3JiYy9sYXVuY2hlci5yYmMpCisgIGlmbmVxICgkKC5TSEVMTFNUQVRVUyksMCkKKyAgICAkKGVycm9yIHByb2R1Y3QgY29uZmlndXJhdGlvbiBydW5uZXIgZmFpbGVkOiAkKC5TSEVMTFNUQVRVUykpCisgIGVuZGlmCisKICAgaW5jbHVkZSAkKE9VVF9ESVIpL3JiYy9yYmNfcHJvZHVjdF9jb25maWdfcmVzdWx0cy5tawogZW5kaWYKIApAQCAtMjcyLDIwICsyODAsMjkgQEAKIAogY3VycmVudF9wcm9kdWN0X21ha2VmaWxlIDo9CiAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENoZWNrIHByb2R1Y3QgaW5jbHVkZSB0YWcgYWxsb3dsaXN0Ci1CTFVFUFJJTlRfSU5DTFVERV9UQUdTX0FMTE9XTElTVCA6PSBjb20uYW5kcm9pZC5tYWlubGluZV9nbyBjb20uYW5kcm9pZC5tYWlubGluZQotLktBVElfUkVBRE9OTFkgOj0gQkxVRVBSSU5UX0lOQ0xVREVfVEFHU19BTExPV0xJU1QKLSQoZm9yZWFjaCBpbmNsdWRlX3RhZywkKFBST0RVQ1RfSU5DTFVERV9UQUdTKSwgXAotCSQoaWYgJChmaWx0ZXIgJChpbmNsdWRlX3RhZyksJChCTFVFUFJJTlRfSU5DTFVERV9UQUdTX0FMTE9XTElTVCkpLCxcCi0JJChjYWxsIHByZXR0eS1lcnJvciwgJChpbmNsdWRlX3RhZykgaXMgbm90IGluIEJMVUVQUklOVF9JTkNMVURFX1RBR1NfQUxMT1dMSVNUOiAkKEJMVUVQUklOVF9JTkNMVURFX1RBR1NfQUxMT1dMSVNUKSkpKQotIyBDcmVhdGUgZGVmYXVsdCBQUk9EVUNUX0lOQ0xVREVfVEFHUwotaWZlcSAoLCAkKFBST0RVQ1RfSU5DTFVERV9UQUdTKSkKLSMgU29vbmcgYW5hbHlzaXMgaXMgZ2xvYmFsOiBldmVuIHRob3VnaCBhIG1vZHVsZSBtaWdodCBub3QgYmUgcmVsZXZhbnQgdG8gYSBzcGVjaWZpYyBwcm9kdWN0IChlLmcuIGJ1aWxkX3Rvb2xzIGZvciBhb3NwX2FybSksCi0jIHdlIHN0aWxsIGFuYWx5c2UgaXQuCi0jIFRoaXMgbWVhbnMgdGhhdCBpbiBzZXR1cHMgd2hlcmUgd2UgdHdvIGhhdmUgdHdvIHByZWJ1aWx0cyBvZiBtb2R1bGVfc2RrLCB3ZSBuZWVkIGEgImRlZmF1bHQiIHRvIHVzZSBpbiBhbmFseXNpcwotIyBUaGlzIHNob3VsZCBiZSBhIG5vLW9wIGluIGFvc3AgYW5kIGludGVybmFsIHNpbmNlIG5vIEFuZHJvaWQuYnAgZmlsZSBjb250YWlucyBibHVlcHJpbnRfcGFja2FnZV9pbmNsdWRlcwotUFJPRFVDVF9JTkNMVURFX1RBR1MgKz0gY29tLmFuZHJvaWQubWFpbmxpbmUgIyBVc2UgdGhlIGJpZyBhbmRyb2lkIG9uZSBieSBkZWZhdWx0CisjIEFPU1AgYW5kIEdvb2dsZSBwcm9kdWN0cyBjdXJyZW50bHkgc2hhcmUgdGhlIHNhbWUgYGFwZXhfY29udHJpYnV0aW9uc2AgaW4gbmV4dC4KKyMgVGhpcyBjYXVzZXMgaXNzdWVzIHdoZW4gYnVpbGRpbmcgPGFvc3BfcHJvZHVjdD4tbmV4dC11c2VyZGVidWcgaW4gbWFpbi4KKyMgQ3JlYXRlIGEgdGVtcG9yYXJ5IGFsbG93bGlzdCB0byBpZ25vcmUgdGhlIGdvb2dsZSBhcGV4ZXMgbGlzdGVkIGluIGBjb250ZW50c2Agb2YgYXBleF9jb250cmlidXRpb25zIG9mIGBuZXh0YAorIyAqZm9yIGFvc3AgcHJvZHVjdHMqLgorIyBUT0RPKGIvMzA4MTg3MjY4KTogUmVtb3ZlIHRoaXMgZGVueWxpc3QgbWVjaGFuaXNtCisjIFVzZSBQUk9EVUNUX1BBQ0tBR0VTIHRvIGRldGVybWluZSBpZiB0aGlzIGlzIGFuIGFvc3AgcHJvZHVjdC4gYW9zcCBwcm9kdWN0cyBkbyBub3QgdXNlIGdvb2dsZSBzaWduZWQgYXBleGVzLgoraWdub3JlX2FwZXhfY29udHJpYnV0aW9ucyA6PQoraWZlcSAoLCQoZmluZHN0cmluZyBjb20uZ29vZ2xlLmFuZHJvaWQuY29uc2NyeXB0LCQoUFJPRFVDVF9QQUNLQUdFUykpJChmaW5kc3RyaW5nIGNvbS5nb29nbGUuYW5kcm9pZC5nby5jb25zY3J5cHQsJChQUk9EVUNUX1BBQ0tBR0VTKSkpCisgIGlnbm9yZV9hcGV4X2NvbnRyaWJ1dGlvbnMgOj0gdHJ1ZQorZW5kaWYKK2lmZXEgKHRydWUsJChQUk9EVUNUX01PRFVMRV9CVUlMRF9GUk9NX1NPVVJDRSkpCisgIGlnbm9yZV9hcGV4X2NvbnRyaWJ1dGlvbnMgOj0gdHJ1ZQorZW5kaWYKK2lmbmVxICgkKEVNTUFfSU5TVFJVTUVOVCkkKEVNTUFfSU5TVFJVTUVOVF9TVEFUSUMpJChFTU1BX0lOU1RSVU1FTlRfRlJBTUVXT1JLKSQoQ0xBTkdfQ09WRVJBR0UpJChOQVRJVkVfQ09WRVJBR0VfUEFUSFMpLCkKKyMgQ292ZXJhZ2UgYnVpbGRzIGZvciBUQVJHRVRfUkVMRUFTRT1mb28gc2hvdWxkIGFsd2F5cyBidWlsZCBmcm9tIHNvdXJjZSwKKyMgZXZlbiBpZiBUQVJHRVRfUkVMRUFTRT1mb28gdXNlcyBwcmVidWlsdCBtYWlubGluZSBtb2R1bGVzLgorIyBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBjaGVja2VkLWluIHByZWJ1aWx0cyB3ZXJlIGdlbmVyYXRlZCB3aXRoCisjIGluc3RydW1lbnRhdGlvbiB0dXJuZWQgb2ZmLgorICBpZ25vcmVfYXBleF9jb250cmlidXRpb25zIDo9IHRydWUKK2VuZGlmCisKK2lmZXEgKHRydWUsICQoaWdub3JlX2FwZXhfY29udHJpYnV0aW9ucykpCitQUk9EVUNUX0JVSUxEX0lHTk9SRV9BUEVYX0NPTlRSSUJVVElPTl9DT05URU5UUyA6PSB0cnVlCiBlbmRpZgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMjk0LDYgKzMxMSwxNCBAQAogCiBUQVJHRVRfREVWSUNFIDo9ICQoUFJPRFVDVF9ERVZJQ0UpCiAKKyMgQWxsb3cgb3ZlcnJpZGluZyBQTEFURk9STV9CQVNFX09TIHdoZW4gUFJPRFVDVF9CQVNFX09TIGlzIGRlZmluZWQKK2lmZGVmIFBST0RVQ1RfQkFTRV9PUworICBQTEFURk9STV9CQVNFX09TIDo9ICQoUFJPRFVDVF9CQVNFX09TKQorZWxzZQorICBQTEFURk9STV9CQVNFX09TIDo9ICQoUExBVEZPUk1fQkFTRV9PU19FTlZfSU5QVVQpCitlbmRpZgorLktBVElfUkVBRE9OTFkgOj0gUExBVEZPUk1fQkFTRV9PUworCiAjIFRPRE86IGFsc28ga2VlcCB0cmFjayBvZiB0aGluZ3MgbGlrZSAicG9ydCIsICJsYW5kIiBpbiBwcm9kdWN0IGZpbGVzLgogCiAjIEZpZ3VyZSBvdXQgd2hpY2ggcmVzb3VyZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGlzCkBAIC0zODgsNiArNDEzLDEwIEBACiAgIFRBUkdFVF9BQVBUX0NIQVJBQ1RFUklTVElDUyA6PSAkKFBST0RVQ1RfQ0hBUkFDVEVSSVNUSUNTKQogZW5kaWYKIAoraWZuZGVmIFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMCisgIFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMIDo9IDEwMDAwCitlbmRpZgorCiBpZmRlZiBQUk9EVUNUX0RFRkFVTFRfREVWX0NFUlRJRklDQVRFCiAgIGlmbmVxICgxLCQod29yZHMgJChQUk9EVUNUX0RFRkFVTFRfREVWX0NFUlRJRklDQVRFKSkpCiAgICAgJChlcnJvciBQUk9EVUNUX0RFRkFVTFRfREVWX0NFUlRJRklDQVRFPSckKFBST0RVQ1RfREVGQVVMVF9ERVZfQ0VSVElGSUNBVEUpJywgXApAQCAtMzk1LDEwICs0MjQsMTIgQEAKICAgZW5kaWYKIGVuZGlmCiAKLSQoZm9yZWFjaCBwYWlyLCQoUFJPRFVDVF9BUEVYX0JPT1RfSkFSUyksIFwKLSAgJChldmFsIGphciA6PSAkKGNhbGwgd29yZC1jb2xvbiwyLCQocGFpcikpKSBcCi0gICQoaWYgJChmaW5kc3RyaW5nICQoamFyKSwgJChQUk9EVUNUX0JPT1RfSkFSUykpLCBcCi0gICAgJChlcnJvciBBIGphciBpbiBQUk9EVUNUX0FQRVhfQk9PVF9KQVJTIG11c3Qgbm90IGJlIGluIFBST0RVQ1RfQk9PVF9KQVJTLCBidXQgJChqYXIpIGlzKSkpCiskKGZvcmVhY2ggYXBleHBhaXIsJChQUk9EVUNUX0FQRVhfQk9PVF9KQVJTKSwgXAorICAkKGZvcmVhY2ggcGxhdGZvcm1wYWlyLCQoUFJPRFVDVF9CT09UX0pBUlMpLCBcCisgICAgJChldmFsIGFwZXhqYXIgOj0gJChjYWxsIHdvcmQtY29sb24sMiwkKGFwZXhwYWlyKSkpIFwKKyAgICAkKGV2YWwgcGxhdGZvcm1qYXIgOj0gJChjYWxsIHdvcmQtY29sb24sMiwkKHBsYXRmb3JtcGFpcikpKSBcCisgICAgJChpZiAkKGZpbHRlciAkKGFwZXhqYXIpLCAkKHBsYXRmb3JtamFyKSksIFwKKyAgICAgICQoZXJyb3IgQSBqYXIgaW4gUFJPRFVDVF9BUEVYX0JPT1RfSkFSUyBtdXN0IG5vdCBiZSBpbiBQUk9EVUNUX0JPT1RfSkFSUywgYnV0ICQoYXBleGphcikgaXMpKSkpCiAKIEVORk9SQ0VfU1lTVEVNX0NFUlRJRklDQVRFIDo9ICQoUFJPRFVDVF9FTkZPUkNFX0FSVElGQUNUX1NZU1RFTV9DRVJUSUZJQ0FURV9SRVFVSVJFTUVOVCkKIEVORk9SQ0VfU1lTVEVNX0NFUlRJRklDQVRFX0FMTE9XX0xJU1QgOj0gJChQUk9EVUNUX0FSVElGQUNUX1NZU1RFTV9DRVJUSUZJQ0FURV9SRVFVSVJFTUVOVF9BTExPV19MSVNUKQpAQCAtNDA3LDYgKzQzOCw4IEBACiBQUk9EVUNUX0VYVFJBX09UQV9LRVlTIDo9ICQoc29ydCAkKFBST0RVQ1RfRVhUUkFfT1RBX0tFWVMpKQogUFJPRFVDVF9FWFRSQV9SRUNPVkVSWV9LRVlTIDo9ICQoc29ydCAkKFBST0RVQ1RfRVhUUkFfUkVDT1ZFUllfS0VZUykpCiAKK1BST0RVQ1RfVkFMSURBVElPTl9DSEVDS1MgOj0gJChzb3J0ICQoUFJPRFVDVF9WQUxJREFUSU9OX0NIRUNLUykpCisKICMgUmVzb2x2ZSBhbmQgc2V0dXAgcGVyLW1vZHVsZSBkZXgtcHJlb3B0IGNvbmZpZ3MuCiBERVhQUkVPUFRfRElTQUJMRURfTU9EVUxFUyA6PQogIyBJZiBhIG1vZHVsZSBoYXMgbXVsdGlwbGUgc2V0dXBzLCB0aGUgZmlyc3QgdGFrZXMgcHJlY2VkZW5jZS4KQEAgLTQzNSwxNyArNDY4LDI2IEBACiAgICAgJChldmFsIFNBTklUSVpFUi4kKFRBUkdFVF9QUk9EVUNUKS4kKG0pLkNPTkZJRyA6PSAkKGNmKSkpKQogX3BzbWNfbW9kdWxlcyA6PQogCi0jIFJlc2V0IEFEQiBrZXlzIGZvciBub24tZGVidWdnYWJsZSBidWlsZHMKLWlmZXEgKCwkKGZpbHRlciBlbmcgdXNlcmRlYnVnLCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpKSkKKyMgUmVzZXQgQURCIGtleXMuIElmIFJFTEVBU0VfQlVJTERfVVNFX1ZBUklBTlRfRkxBR1MgaXMgc2V0IGxvb2sgZm9yCisjIHRoZSB2YWx1ZSBvZiBhIGRlZGljYXRlZCBmbGFnLiBPdGhlcndpc2UgY2hlY2sgaWYgYnVpbGQgdmFyaWFudCBpcworIyBub24tZGVidWdnYWJsZS4KK2lmbmVxICgsJChSRUxFQVNFX0JVSUxEX1VTRV9WQVJJQU5UX0ZMQUdTKSkKK2lmbmVxICgsJChSRUxFQVNFX0JVSUxEX1BVUkdFX1BST0RVQ1RfQURCX0tFWVMpKQogICBQUk9EVUNUX0FEQl9LRVlTIDo9CiBlbmRpZgorZWxzZSBpZmVxICgsJChmaWx0ZXIgZW5nIHVzZXJkZWJ1ZywkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkpCisgIFBST0RVQ1RfQURCX0tFWVMgOj0KK2VuZGlmCisKIGlmbmVxICgkKGZpbHRlci1vdXQgMCAxLCQod29yZHMgJChQUk9EVUNUX0FEQl9LRVlTKSkpLCkKICAgJChlcnJvciBPbmx5IG9uZSBmaWxlIG1heSBiZSBpbiBQUk9EVUNUX0FEQl9LRVlTOiAkKFBST0RVQ1RfQURCX0tFWVMpKQogZW5kaWYKIAogIyBTaG93IGEgd2FybmluZyB3YWxsIG9mIHRleHQgaWYgbm9uLWNvbXBsaWFuY2UtR1NJIHByb2R1Y3RzIHNldCB0aGlzIG9wdGlvbi4KIGlmZGVmIFBST0RVQ1RfSU5TVEFMTF9ERUJVR19QT0xJQ1lfVE9fU1lTVEVNX0VYVAotICBpZmVxICgsJChmaWx0ZXIgZ3NpX2FybSBnc2lfYXJtNjQgZ3NpX3g4NiBnc2lfeDg2XzY0IGdzaV9jYXJfYXJtNjQgZ3NpX2Nhcl94ODZfNjQgZ3NpX3R2X2FybSBnc2lfdHZfYXJtNjQsJChQUk9EVUNUX05BTUUpKSkKKyAgaWZlcSAoLCQoZmlsdGVyIGdzaV9hcm0gZ3NpX2FybTY0IGdzaV9hcm02NF9zb29uZ19zeXN0ZW0gZ3NpX3g4NiBnc2lfeDg2XzY0IFwKKyAgICAgICAgICAgICAgICAgIGdzaV94ODZfNjRfc29vbmdfc3lzdGVtIGdzaV9jYXJfYXJtNjQgZ3NpX2Nhcl94ODZfNjQgXAorICAgICAgICAgICAgICAgICAgZ3NpX3R2X2FybSBnc2lfdHZfYXJtNjQsJChQUk9EVUNUX05BTUUpKSkKICAgICAkKHdhcm5pbmcgUFJPRFVDVF9JTlNUQUxMX0RFQlVHX1BPTElDWV9UT19TWVNURU1fRVhUIGlzIHNldCBidXQgXAogICAgICAgUFJPRFVDVF9OQU1FICgkKFBST0RVQ1RfTkFNRSkpIGRvZXNuJ3QgbG9vayBsaWtlIGEgR1NJIGZvciBjb21wbGlhbmNlIFwKICAgICAgIHRlc3RpbmcuIFRoaXMgaXMgYSBzcGVjaWFsIGNvbmZpZ3VyYXRpb24gZm9yIGNvbXBsaWFuY2UgR1NJLCBzbyBkbyBtYWtlIFwKQEAgLTQ4NSwxNSArNTI3LDYgQEAKICAgZW5kaWYKIGVuZGlmCiAKLWlmZGVmIFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMCi0gIGlmbmVxICgsJChjYWxsIG1hdGhfZ3Rfb3JfZXEsMjksJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCkpKQotICAgIFBST0RVQ1RfUEFDS0FHRVMgKz0gJChQUk9EVUNUX1BBQ0tBR0VTX1NISVBQSU5HX0FQSV9MRVZFTF8yOSkKLSAgZW5kaWYKLSAgaWZuZXEgKCwkKGNhbGwgbWF0aF9ndF9vcl9lcSwzMywkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSkpCi0gICAgUFJPRFVDVF9QQUNLQUdFUyArPSAkKFBST0RVQ1RfUEFDS0FHRVNfU0hJUFBJTkdfQVBJX0xFVkVMXzMzKQotICBlbmRpZgotZW5kaWYKLQogIyBJZiBidWlsZCBjb21tYW5kIGRlZmluZXMgT1ZFUlJJREVfUFJPRFVDVF9FWFRSQV9WTkRLX1ZFUlNJT05TLAogIyBvdmVycmlkZSBQUk9EVUNUX0VYVFJBX1ZOREtfVkVSU0lPTlMgd2l0aCBpdC4KIGlmZGVmIE9WRVJSSURFX1BST0RVQ1RfRVhUUkFfVk5ES19WRVJTSU9OUwpAQCAtNTEwLDYgKzU0MywxNyBAQAogICBQUk9EVUNUX0NPTVBSRVNTRURfQVBFWCA6PSAkKE9WRVJSSURFX1BST0RVQ1RfQ09NUFJFU1NFRF9BUEVYKQogZW5kaWYKIAoraWZkZWYgT1ZFUlJJREVfUFJPRFVDVF9ERUZBVUxUX0FQRVhfUEFZTE9BRF9UWVBFCisgIFBST0RVQ1RfREVGQVVMVF9BUEVYX1BBWUxPQURfVFlQRSA6PSAkKE9WRVJSSURFX1BST0RVQ1RfREVGQVVMVF9BUEVYX1BBWUxPQURfVFlQRSkKK2Vsc2UgaWZlcSAoJChQUk9EVUNUX0RFRkFVTFRfQVBFWF9QQVlMT0FEX1RZUEUpLCkKKyAgIyBVc2UgZXh0NCBhcyBhIGRlZmF1bHQgcGF5bG9hZCBmcyB0eXBlCisgIFBST0RVQ1RfREVGQVVMVF9BUEVYX1BBWUxPQURfVFlQRSA6PSBleHQ0CitlbmRpZgoraWZlcSAoJChmaWx0ZXIgZXh0NCBlcm9mcywkKFBST0RVQ1RfREVGQVVMVF9BUEVYX1BBWUxPQURfVFlQRSkpLCkKKyAgJChlcnJvciBQUk9EVUNUX0RFRkFVTFRfQVBFWF9QQVlMT0FEX1RZUEUgc2hvdWxkIGJlIGVpdGhlciBlcm9mcyBvciBleHQ0LFwKKyAgICBub3QgJChQUk9EVUNUX0RFRkFVTFRfQVBFWF9QQVlMT0FEX1RZUEUpLikKK2VuZGlmCisKICQoS0FUSV9vYnNvbGV0ZV92YXIgT1ZFUlJJREVfUFJPRFVDVF9FWFRSQV9WTkRLX1ZFUlNJT05TIFwKICAgICAsVXNlIFBST0RVQ1RfRVhUUkFfVk5ES19WRVJTSU9OUyBpbnN0ZWFkKQogCkBAIC01MjYsNyArNTcwLDggQEAKICAgICBQUk9EVUNUX0VORk9SQ0VfUFJPRFVDVF9QQVJUSVRJT05fSU5URVJGQUNFIDo9ICQoT1ZFUlJJREVfUFJPRFVDVF9FTkZPUkNFX1BST0RVQ1RfUEFSVElUSU9OX0lOVEVSRkFDRSkKICAgZW5kaWYKIGVsc2UgaWZlcSAoJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCksKQotICAjIE5vIHNoaXBwaW5nIGxldmVsIGRlZmluZWQKKyAgIyBObyBzaGlwcGluZyBsZXZlbCBkZWZpbmVkLiBFbmZvcmNlIHRoZSBwcm9kdWN0IGludGVyZmFjZSBieSBkZWZhdWx0LgorICBQUk9EVUNUX0VORk9SQ0VfUFJPRFVDVF9QQVJUSVRJT05fSU5URVJGQUNFIDo9IHRydWUKIGVsc2UgaWZlcSAoJChjYWxsIG1hdGhfZ3QsJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCksMjkpLHRydWUpCiAgICMgRW5mb3JjZSBwcm9kdWN0IGludGVyZmFjZSBpZiBQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCBpcyBncmVhdGVyIHRoYW4gMjkuCiAgIFBST0RVQ1RfRU5GT1JDRV9QUk9EVUNUX1BBUlRJVElPTl9JTlRFUkZBQ0UgOj0gdHJ1ZQpAQCAtNTM0LDM0ICs1NzksNzkgQEAKIAogJChLQVRJX29ic29sZXRlX3ZhciBPVkVSUklERV9QUk9EVUNUX0VORk9SQ0VfUFJPRFVDVF9QQVJUSVRJT05fSU5URVJGQUNFLFVzZSBQUk9EVUNUX0VORk9SQ0VfUFJPRFVDVF9QQVJUSVRJT05fSU5URVJGQUNFIGluc3RlYWQpCiAKLSMgSWYgYnVpbGQgY29tbWFuZCBkZWZpbmVzIFBST0RVQ1RfVVNFX1BST0RVQ1RfVk5ES19PVkVSUklERSBhcyBgZmFsc2VgLAotIyBQUk9EVUNUX1BST0RVQ1RfVk5ES19WRVJTSU9OIHdpbGwgbm90IGJlIGRlZmluZWQgYXV0b21hdGljYWxseS4KLSMgUFJPRFVDVF9VU0VfUFJPRFVDVF9WTkRLX09WRVJSSURFIGNhbiBiZSB1c2VkIGZvciB0ZXN0aW5nIG9ubHkuCi1QUk9EVUNUX1VTRV9QUk9EVUNUX1ZOREsgOj0gZmFsc2UKLWlmbmVxICgkKFBST0RVQ1RfVVNFX1BST0RVQ1RfVk5ES19PVkVSUklERSksKQotICBQUk9EVUNUX1VTRV9QUk9EVUNUX1ZOREsgOj0gJChQUk9EVUNUX1VTRV9QUk9EVUNUX1ZOREtfT1ZFUlJJREUpCi1lbHNlIGlmZXEgKCQoUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwpLCkKLSAgIyBObyBzaGlwcGluZyBsZXZlbCBkZWZpbmVkCi1lbHNlIGlmZXEgKCQoY2FsbCBtYXRoX2d0LCQoUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwpLDI5KSx0cnVlKQotICAjIEVuZm9yY2UgcHJvZHVjdCBpbnRlcmZhY2UgZm9yIFZOREsgaWYgUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwgaXMgZ3JlYXRlcgotICAjIHRoYW4gMjkuCi0gIFBST0RVQ1RfVVNFX1BST0RVQ1RfVk5ESyA6PSB0cnVlCisjIEZyb20gQW5kcm9pZCBWLCBEZWZpbmUgUFJPRFVDVF9QUk9EVUNUX1ZOREtfVkVSU0lPTiBhcyBjdXJyZW50IGJ5IGRlZmF1bHQuCisjIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZSBhbGwgZGV2aWNlcyBoYXZlIHByb2R1Y3QgdmFyaWFudHMuCitpZm5kZWYgUFJPRFVDVF9QUk9EVUNUX1ZOREtfVkVSU0lPTgorICBQUk9EVUNUX1BST0RVQ1RfVk5ES19WRVJTSU9OIDo9IGN1cnJlbnQKIGVuZGlmCiAKLWlmZXEgKCQoUFJPRFVDVF9VU0VfUFJPRFVDVF9WTkRLKSx0cnVlKQotICBpZm5kZWYgUFJPRFVDVF9QUk9EVUNUX1ZOREtfVkVSU0lPTgotICAgIFBST0RVQ1RfUFJPRFVDVF9WTkRLX1ZFUlNJT04gOj0gY3VycmVudAotICBlbmRpZgotZW5kaWYKLQotJChLQVRJX29ic29sZXRlX3ZhciBQUk9EVUNUX1VTRV9QUk9EVUNUX1ZOREssVXNlIFBST0RVQ1RfUFJPRFVDVF9WTkRLX1ZFUlNJT04gaW5zdGVhZCkKLSQoS0FUSV9vYnNvbGV0ZV92YXIgUFJPRFVDVF9VU0VfUFJPRFVDVF9WTkRLX09WRVJSSURFLFVzZSBQUk9EVUNUX1BST0RVQ1RfVk5ES19WRVJTSU9OIGluc3RlYWQpCi0KIGlmZGVmIFBST0RVQ1RfRU5GT1JDRV9SUk9fRVhFTVBURURfVEFSR0VUUwogICAgICQoZXJyb3IgUFJPRFVDVF9FTkZPUkNFX1JST19FWEVNUFRFRF9UQVJHRVRTIGlzIGRlcHJlY2F0ZWQsIGNvbnNpZGVyIHVzaW5nIFJSTyBmb3IgXAogICAgICAgJChQUk9EVUNUX0VORk9SQ0VfUlJPX0VYRU1QVEVEX1RBUkdFVFMpKQogZW5kaWYKIAorIyBUaGlzIHRhYmxlIG1hcHMgc2RrIHZlcnNpb24gMzUgdG8gdmVuZG9yIGFwaSBsZXZlbCAyMDI0MDQgYW5kIGFzc3VtZXMgeWVhcmx5CisjIHJlbGVhc2UgZm9yIHRoZSBzYW1lIG1vbnRoLiBJZiAxMDAwMCBBUEkgbGV2ZWwgb3IgbW9yZSBpcyB1c2VkLCB3aGljaCB1c3VhbGx5CisjIHJlcHJlc2VudHMgJ2N1cnJlbnQnIG9yICdmdXR1cmUnIEFQSSBsZXZlbHMsIHNldmVyYWwgemVyb3MgYXJlIGFkZGVkIHRvCisjIHByZXNlcnZlIG9yZGVyaW5nLiBTcGVjaWZpY2FsbHkgQVBJIGxldmVsIDEwLDAwMCBpcyBjb252ZXJ0ZWQgdG8gMTAsMDAwLDAwMAorIyB3aGljaCBpbXBvcnRhbnRseSBpcyBncmVhdGVyIHRoYW4gMjAyNDA0ID0gMjAyLDQwNC4gVGhpcyBjb252ZW50aW9uIHdpbGwgYnJlYWsKKyMgaW4gMTAwLDAwMCBDRSwgd2hpY2ggaXMgdGhlIGNsb3Nlc3QgbXVsdGlwbGUgb2YgMTAgdGhhdCBkb2Vzbid0IGJyZWFrIGVhcmxpZXIKKyMgdGhhbiAxMCwwMDAgYXMgYW4gQVBJIGxldmVsIGJyZWFrcy4KK2RlZmluZSBzZGstdG8tdmVuZG9yLWFwaS1sZXZlbAorJChpZiAkKGNhbGwgbWF0aF9sdF9vcl9lcSwkKDEpLDM0KSwkKDEpLCQoaWYgJChjYWxsIG1hdGhfbHQsJCgxKSwxMDAwMCksMjAkKGNhbGwgaW50X3N1YnRyYWN0LCQoMSksMTEpMDQsJCgxKTAwMCkpCitlbmRlZgorCitpZm5lcSAoJChjYWxsIHNkay10by12ZW5kb3ItYXBpLWxldmVsLDM0KSwzNCkKKyQoZXJyb3Igc2RrLXRvLXZlbmRvci1hcGktbGV2ZWwgaXMgYnJva2VuIGZvciBwcmUtVHJ1bmstU3RhYmxlIFNES3MpCitlbmRpZgoraWZuZXEgKCQoY2FsbCBzZGstdG8tdmVuZG9yLWFwaS1sZXZlbCwzNSksMjAyNDA0KQorJChlcnJvciBzZGstdG8tdmVuZG9yLWFwaS1sZXZlbCBpcyBicm9rZW4gZm9yIHBvc3QtVHJ1bmstU3RhYmxlIFNES3MpCitlbmRpZgoraWZuZXEgKCQoY2FsbCBzZGstdG8tdmVuZG9yLWFwaS1sZXZlbCwxMDAwMCksMTAwMDAwMDApCiskKGVycm9yIHNkay10by12ZW5kb3ItYXBpLWxldmVsIGlzIGJyb2tlbiBmb3IgY3VycmVudCAkKGNhbGwgc2RrLXRvLXZlbmRvci1hcGktbGV2ZWwsMTAwMDApKQorZW5kaWYKKworaWZkZWYgUFJPRFVDVF9TSElQUElOR19WRU5ET1JfQVBJX0xFVkVMCisjIEZvbGxvdyB0aGUgdmVyc2lvbiB0aGF0IGlzIHNldCBtYW51YWxseS4KKyAgVlNSX1ZFTkRPUl9BUElfTEVWRUwgOj0gJChQUk9EVUNUX1NISVBQSU5HX1ZFTkRPUl9BUElfTEVWRUwpCitlbHNlCisgICMgVlNSIEFQSSBsZXZlbCBpcyB0aGUgdmVuZG9yIGFwaSBsZXZlbCBvZiB0aGUgcHJvZHVjdCBzaGlwcGluZyBBUEkgbGV2ZWwuCisgIFZTUl9WRU5ET1JfQVBJX0xFVkVMIDo9ICQoY2FsbCBzZGstdG8tdmVuZG9yLWFwaS1sZXZlbCwkKFBMQVRGT1JNX1NES19WRVJTSU9OKSkKKyAgaWZkZWYgUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwKKyAgICBWU1JfVkVORE9SX0FQSV9MRVZFTCA6PSAkKGNhbGwgc2RrLXRvLXZlbmRvci1hcGktbGV2ZWwsJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCkpCisgIGVuZGlmCisgIGlmZGVmIEJPQVJEX1NISVBQSU5HX0FQSV9MRVZFTAorICAgICMgVmVuZG9ycyB3aXRoIEdSRiBtdXN0IGRlZmluZSBCT0FSRF9TSElQUElOR19BUElfTEVWRUwgZm9yIHRoZSB2ZW5kb3IgQVBJIGxldmVsLgorICAgICMgSW4gdGhpcyBjYXNlLCB0aGUgVlNSIEFQSSBsZXZlbCBpcyB0aGUgbWluaW11bSBvZiB0aGUgUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwKKyAgICAjIGFuZCBSRUxFQVNFX0JPQVJEX0FQSV9MRVZFTAorICAgIGJvYXJkX2FwaV9sZXZlbCA6PSAkKFJFTEVBU0VfQk9BUkRfQVBJX0xFVkVMKQorICAgIGlmZGVmIEJPQVJEX0FQSV9MRVZFTF9QUk9QX09WRVJSSURFCisgICAgICBib2FyZF9hcGlfbGV2ZWwgOj0gJChCT0FSRF9BUElfTEVWRUxfUFJPUF9PVkVSUklERSkKKyAgICBlbmRpZgorICAgIFZTUl9WRU5ET1JfQVBJX0xFVkVMIDo9ICQoY2FsbCBtYXRoX21pbiwkKFZTUl9WRU5ET1JfQVBJX0xFVkVMKSwkKGJvYXJkX2FwaV9sZXZlbCkpCisgICAgYm9hcmRfYXBpX2xldmVsIDo9CisgIGVuZGlmCitlbmRpZgorLktBVElfUkVBRE9OTFkgOj0gVlNSX1ZFTkRPUl9BUElfTEVWRUwKKworIyBCb29sZWFuIHZhcmlhYmxlIGRldGVybWluaW5nIGlmIHZlbmRvciBzZWFwcCBjb250ZXh0cyBpcyBlbmZvcmNlZAorQ0hFQ0tfVkVORE9SX1NFQVBQX1ZJT0xBVElPTlMgOj0gZmFsc2UKK2lmbmVxICgkKGNhbGwgbWF0aF9ndCwkKFZTUl9WRU5ET1JfQVBJX0xFVkVMKSwzNCksKQorICBDSEVDS19WRU5ET1JfU0VBUFBfVklPTEFUSU9OUyA6PSB0cnVlCitlbHNlIGlmbmVxICgkKFBST0RVQ1RfQ0hFQ0tfVkVORE9SX1NFQVBQX1ZJT0xBVElPTlMpLCkKKyAgQ0hFQ0tfVkVORE9SX1NFQVBQX1ZJT0xBVElPTlMgOj0gJChQUk9EVUNUX0NIRUNLX1ZFTkRPUl9TRUFQUF9WSU9MQVRJT05TKQorZW5kaWYKKy5LQVRJX1JFQURPTkxZIDo9IENIRUNLX1ZFTkRPUl9TRUFQUF9WSU9MQVRJT05TCisKKyMgQm9vbGVhbiB2YXJpYWJsZSBkZXRlcm1pbmluZyBpZiBzZWxpbnV4IGxhYmVscyBvZiAvZGV2IGFyZSBlbmZvcmNlZAorQ0hFQ0tfREVWX1RZUEVfVklPTEFUSU9OUyA6PSBmYWxzZQoraWZuZXEgKCQoY2FsbCBtYXRoX2d0LCQoVlNSX1ZFTkRPUl9BUElfTEVWRUwpLDIwMjQwNCksKQorICBDSEVDS19ERVZfVFlQRV9WSU9MQVRJT05TIDo9IHRydWUKK2Vsc2UgaWZuZXEgKCQoUFJPRFVDVF9DSEVDS19ERVZfVFlQRV9WSU9MQVRJT05TKSwpCisgIENIRUNLX0RFVl9UWVBFX1ZJT0xBVElPTlMgOj0gJChQUk9EVUNUX0NIRUNLX0RFVl9UWVBFX1ZJT0xBVElPTlMpCitlbmRpZgorLktBVElfUkVBRE9OTFkgOj0gQ0hFQ0tfREVWX1RZUEVfVklPTEFUSU9OUworCiBkZWZpbmUgcHJvZHVjdC1vdmVycmlkZXMtY29uZmlnCiAkJChmb3JlYWNoIHJ1bGUsJCQoUFJPRFVDVF8kKDEpX09WRVJSSURFUyksXAogICAgICQkKGlmICQkKGZpbHRlciAyLCQkKHdvcmRzICQkKHN1YnN0IDosJCQoc3BhY2UpLCQkKHJ1bGUpKSkpLCxcCkBAIC01ODEsNiArNjcxLDE1IEBACiBlbmRpZgogZW5kZWYKIAoraWZuZGVmIFBST0RVQ1RfVklSVFVBTF9BQl9DT1dfVkVSU0lPTgorICBQUk9EVUNUX1ZJUlRVQUxfQUJfQ09XX1ZFUlNJT04gOj0gMgorICBpZmRlZiBQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTAorICAgIGlmZXEgKHRydWUsJChjYWxsIG1hdGhfZ3Rfb3JfZXEsJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCksMzQpKQorICAgICAgUFJPRFVDVF9WSVJUVUFMX0FCX0NPV19WRVJTSU9OIDo9IDMKKyAgICBlbmRpZgorICBlbmRpZgorZW5kaWYKKwogIyBDb3B5IGFuZCBjaGVjayB0aGUgdmFsdWUgb2YgZWFjaCBQUk9EVUNUX0JVSUxEXypfSU1BR0UgdmFyaWFibGUKICQoZm9yZWFjaCBpbWFnZSwgXAogICAgIFBWTUZXIFwKZGlmZiAtLWdpdCBhL2NvcmUvcHJvZHVjdF9jb25maWcucmJjIGIvY29yZS9wcm9kdWN0X2NvbmZpZy5yYmMKaW5kZXggOTdjMWQwMC4uMjAzNDRmNCAxMDA2NDQKLS0tIGEvY29yZS9wcm9kdWN0X2NvbmZpZy5yYmMKKysrIGIvY29yZS9wcm9kdWN0X2NvbmZpZy5yYmMKQEAgLTU0LDI1ICs1NCwxNiBAQAogICAgIGlmIHZhbHVlID09IE5vbmU6CiAgICAgICAgIHJldHVybgogICAgIGlmIHR5cGUodmFsdWUpID09ICJsaXN0IjoKLSAgICAgICAgaWYgX29wdGlvbnMucmVhcnJhbmdlOgotICAgICAgICAgICAgdmFsdWUgPSBfX3ByaW50dmFyc19yZWFycmFuZ2VfbGlzdCh2YWx1ZSkKLSAgICAgICAgaWYgX29wdGlvbnMuZm9ybWF0ID09ICJwcmV0dHkiOgotICAgICAgICAgICAgcHJpbnQoYXR0ciwgIj0iLCByZXByKHZhbHVlKSkKLSAgICAgICAgZWxpZiBfb3B0aW9ucy5mb3JtYXQgPT0gIm1ha2UiOgotICAgICAgICAgICAgdmFsdWUgPSBsaXN0KHZhbHVlKQotICAgICAgICAgICAgZm9yIGksIHggaW4gZW51bWVyYXRlKHZhbHVlKToKLSAgICAgICAgICAgICAgICBpZiB0eXBlKHgpID09ICJ0dXBsZSIgYW5kIGxlbih4KSA9PSAxOgotICAgICAgICAgICAgICAgICAgICB2YWx1ZVtpXSA9ICJAaW5oZXJpdDoiICsgeFswXSArICIubWsiCi0gICAgICAgICAgICAgICAgZWxpZiB0eXBlKHgpICE9ICJzdHJpbmciOgotICAgICAgICAgICAgICAgICAgICBmYWlsKCJXYXNuJ3QgYSBsaXN0IG9mIHN0cmluZ3M6IiwgYXR0ciwgIiB2YWx1ZToiLCB2YWx1ZSkKLSAgICAgICAgICAgIHByaW50KGF0dHIsICI6PSIsICIgIi5qb2luKHZhbHVlKSkKLSAgICBlbGlmIF9vcHRpb25zLmZvcm1hdCA9PSAicHJldHR5IjoKLSAgICAgICAgcHJpbnQoYXR0ciwgIj0iLCByZXByKHZhbHVlKSkKLSAgICBlbGlmIF9vcHRpb25zLmZvcm1hdCA9PSAibWFrZSI6CisgICAgICAgIHZhbHVlID0gbGlzdCh2YWx1ZSkKKyAgICAgICAgZm9yIGksIHggaW4gZW51bWVyYXRlKHZhbHVlKToKKyAgICAgICAgICAgIGlmIHR5cGUoeCkgPT0gInR1cGxlIiBhbmQgbGVuKHgpID09IDE6CisgICAgICAgICAgICAgICAgdmFsdWVbaV0gPSAiQGluaGVyaXQ6IiArIHhbMF0gKyAiLm1rIgorICAgICAgICAgICAgZWxpZiB0eXBlKHgpICE9ICJzdHJpbmciOgorICAgICAgICAgICAgICAgIGZhaWwoIldhc24ndCBhIGxpc3Qgb2Ygc3RyaW5nczoiLCBhdHRyLCAiIHZhbHVlOiIsIHZhbHVlKQorICAgICAgICBwcmludChhdHRyLCAiOj0iLCAiICIuam9pbih2YWx1ZSkpCisgICAgZWxzZToKICAgICAgICAgIyBUcmltIGFsbCBzcGFjaW5nIHRvIGEgc2luZ2xlIHNwYWNlCiAgICAgICAgIHByaW50KGF0dHIsICI6PSIsIF9ta3N0cmlwKHZhbHVlKSkKLSAgICBlbHNlOgotICAgICAgICBmYWlsKCJiYWQgb3V0cHV0IGZvcm1hdCIsIF9vcHRpb25zLmZvcm1hdCkKIAogZGVmIF9wcmludHZhcnMoc3RhdGUpOgogICAgICIiIlByaW50cyBjb25maWd1cmF0aW9uIGFuZCBnbG9iYWwgdmFyaWFibGVzLiIiIgpAQCAtODMsOCArNzQsNyBAQAogICAgICAgICAgICAgZm9yIG5zbmFtZSwgbnN2YXJzIGluIHNvcnRlZCh2YWwuaXRlbXMoKSk6CiAgICAgICAgICAgICAgICAgIyBEZWZpbmUgU09PTkdfQ09ORklHXzxucz4gZm9yIE1ha2UsIG90aGV3aXNlCiAgICAgICAgICAgICAgICAgIyBpdCBjYW5ub3QgYmUgYWRkZWQgdG8gLktBVElfUkVBRE9OTFkgbGlzdAotICAgICAgICAgICAgICAgIGlmIF9vcHRpb25zLmZvcm1hdCA9PSAibWFrZSI6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50KCJTT09OR19DT05GSUdfIiArIG5zbmFtZSwgIjo9IiwgIiAiLmpvaW4obnN2YXJzLmtleXMoKSkpCisgICAgICAgICAgICAgICAgcHJpbnQoIlNPT05HX0NPTkZJR18iICsgbnNuYW1lLCAiOj0iLCAiICIuam9pbihuc3ZhcnMua2V5cygpKSkKICAgICAgICAgICAgICAgICBmb3IgdmFyLCB2YWwgaW4gc29ydGVkKG5zdmFycy5pdGVtcygpKToKICAgICAgICAgICAgICAgICAgICAgaWYgdmFsOgogICAgICAgICAgICAgICAgICAgICAgICAgX19wcmludF9hdHRyKCJTT09OR19DT05GSUdfJXNfJXMiICUgKG5zbmFtZSwgdmFyKSwgdmFsKQpAQCAtMTA1LDExICs5NSw2IEBACiAgICAgICAgIGVsaWYgYXR0ciBub3QgaW4gZ2xvYmFsc19iYXNlIG9yIGdsb2JhbHNfYmFzZVthdHRyXSAhPSB2YWw6CiAgICAgICAgICAgICBfX3ByaW50X2F0dHIoYXR0ciwgdmFsKQogCi1kZWYgX19wcmludHZhcnNfcmVhcnJhbmdlX2xpc3QodmFsdWVfbGlzdCk6Ci0gICAgIiIiUmVhcnJhbmdlIHZhbHVlIGxpc3Q6IHJldHVybiBvbmx5IGRpc3RpbmN0IGVsZW1lbnRzLCBtYXliZSBzb3J0ZWQuIiIiCi0gICAgc2VlbiA9IHtpdGVtOiAwIGZvciBpdGVtIGluIHZhbHVlX2xpc3R9Ci0gICAgcmV0dXJuIHNvcnRlZChzZWVuLmtleXMoKSkgaWYgX29wdGlvbnMucmVhcnJhbmdlID09ICJzb3J0IiBlbHNlIHNlZW4ua2V5cygpCi0KIGRlZiBfX3NvcnRfcGNtX25hbWVzKHBjbV9uYW1lcyk6CiAgICAgIyBXZSBoYXZlIHRvIGFkZCBhbiBleHRlbnNpb24gYmFjayBvbnRvIHRoZSBwY20gbmFtZXMgd2hlbiBzb3J0aW5nLAogICAgICMgb3IgZWxzZSB0aGUgc29ydCBvcmRlciBjb3VsZCBiZSB3cm9uZyB3aGVuIG9uZSBpcyBhIHByZWZpeCBvZiBhbm90aGVyLgpAQCAtMzY2LDYgKzM1MSw3IEBACiAgICAgICAgICAgICAgICAgaWYgY2ZnLmdldChhdHRyLCAiIikgPT0gIiI6CiAgICAgICAgICAgICAgICAgICAgIGNmZ1thdHRyXSA9IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgIHBlcmNvbGF0ZWRfYXR0cnNbYXR0cl0gPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGNoaWxkX2NmZy5wb3AoYXR0cikKIAogICAgIGZvciBhdHRyIGluIF9vcHRpb25zLnRyYWNlX3ZhcmlhYmxlczoKICAgICAgICAgaWYgYXR0ciBpbiBwZXJjb2xhdGVkX2F0dHJzOgpAQCAtMzc1LDcgKzM2MSw3IEBACiAgICAgdmFsdWUgPSBmcm9tX2NmZy5nZXQoYXR0ciwgW10pCiAgICAgaWYgdmFsdWU6CiAgICAgICAgIHRvX2xpc3QuZXh0ZW5kKHZhbHVlKQotICAgICAgICBmcm9tX2NmZ1thdHRyXSA9IFtdCisgICAgICAgIGZyb21fY2ZnLnBvcChhdHRyKQogCiBkZWYgX2luZGlyZWN0KHBjbV9uYW1lKToKICAgICAiIiJSZXR1cm5zIGNvbmZpZ3VyYXRpb24gaXRlbSBmb3IgdGhlIGluaGVyaXRlZCBtb2R1bGUuIiIiCkBAIC0zOTQsNyArMzgwLDEyIEBACiBkZWYgX3Nvb25nX2NvbmZpZ19zZXQoZywgbnNuYW1lLCB2YXIsIHZhbHVlKToKICAgICAiIiJBc3NpZ25zIHRoZSB2YWx1ZSB0byB0aGUgdmFyaWFibGUgaW4gdGhlIG5hbWVzcGFjZS4iIiIKICAgICBfc29vbmdfY29uZmlnX25hbWVzcGFjZShnLCBuc25hbWUpCi0gICAgZ1tfc29vbmdfY29uZmlnX25hbWVzcGFjZXNfa2V5XVtuc25hbWVdW3Zhcl09dmFsdWUKKyAgICBnW19zb29uZ19jb25maWdfbmFtZXNwYWNlc19rZXldW25zbmFtZV1bdmFyXT1fbWtzdHJpcCh2YWx1ZSkKKworZGVmIF9zb29uZ19jb25maWdfc2V0X2Jvb2woZywgbnNuYW1lLCB2YXIsIHZhbHVlKToKKyAgICAiIiJBc3NpZ25zIHRoZSB2YWx1ZSB0byB0aGUgdmFyaWFibGUgaW4gdGhlIG5hbWVzcGFjZSwgYW5kIG1hcmtzIGl0IGFzIGEgYm9vbGVhbi4iIiIKKyAgICBfc29vbmdfY29uZmlnX3NldChnLCBuc25hbWUsIHZhciwgX2ZpbHRlcigidHJ1ZSIsIHZhbHVlKSkKKyAgICBnWyJTT09OR19DT05GSUdfVFlQRV8lc18lcyIgJSAobnNuYW1lLCB2YXIpXSA9ICJib29sIgogCiBkZWYgX3Nvb25nX2NvbmZpZ19hcHBlbmQoZywgbnNuYW1lLCB2YXIsIHZhbHVlKToKICAgICAiIiJBcHBlbmRzIHRvIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgaW4gdGhlIG5hbWVzcGFjZS4iIiIKQEAgLTQwMiw5ICszOTMsOSBAQAogICAgIG5zID0gZ1tfc29vbmdfY29uZmlnX25hbWVzcGFjZXNfa2V5XVtuc25hbWVdCiAgICAgb2xkdiA9IG5zLmdldCh2YXIpCiAgICAgaWYgb2xkdiA9PSBOb25lOgotICAgICAgICBuc1t2YXJdID0gdmFsdWUKKyAgICAgICAgbnNbdmFyXSA9IF9ta3N0cmlwKHZhbHVlKQogICAgIGVsc2U6Ci0gICAgICAgIG5zW3Zhcl0gKz0gIiAiICsgdmFsdWUKKyAgICAgICAgbnNbdmFyXSArPSAiICIgKyBfbWtzdHJpcCh2YWx1ZSkKIAogCiBkZWYgX3Nvb25nX2NvbmZpZ19nZXQoZywgbnNuYW1lLCB2YXIpOgpAQCAtNjkxLDE2ICs2ODIsOCBAQAogICAgIHJibGZfbG9nKGZpbGUsICJ3YXJuaW5nIiwgbWVzc2FnZSwgc2VwID0gJzonKQogCiBkZWYgX21rMnJiY19lcnJvcihsb2MsIG1lc3NhZ2UpOgotICAgICIiIlByaW50cyBhIG1lc3NhZ2UgYWJvdXQgY29udmVyc2lvbiBlcnJvciBhbmQgc3RvcHMuCi0KLSAgICBJZiBSQkNfTUsyUkJDX0NPTlRJTlVFIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCwKLSAgICB0aGUgZXhlY3V0aW9uIHdpbGwgY29udGludWUgYWZ0ZXIgdGhlIG1lc3NhZ2UgaXMgcHJpbnRlZC4KLSAgICAiIiIKLSAgICBpZiBfb3B0aW9ucy5tazJyYmNfY29udGludWU6Ci0gICAgICAgIHJibGZfbG9nKGxvYywgbWVzc2FnZSwgc2VwID0gJzonKQotICAgIGVsc2U6Ci0gICAgICAgIF9ta2Vycm9yKGxvYywgbWVzc2FnZSkKLQorICAgICIiIlByaW50cyBhIG1lc3NhZ2UgYWJvdXQgY29udmVyc2lvbiBlcnJvciBhbmQgc3RvcHMuIiIiCisgICAgX21rZXJyb3IobG9jLCBtZXNzYWdlKQogCiBkZWYgX21raW5mbyhmaWxlLCBtZXNzYWdlID0gIiIpOgogICAgICIiIlByaW50cyBpbmZvLiIiIgpAQCAtODczLDQzICs4NTYsMTcgQEAKICAgICAgICAgICAgICMgQ2F1c2UgdGhlIHZhcmlhYmxlIHRvIGFwcGVhciBzZXQgbGlrZSB0aGUgbWFrZSB2ZXJzaW9uIGRvZXMKICAgICAgICAgICAgIGdbdl0gPSAiIgogCi0KLWRlZiBfX2dldF9vcHRpb25zKCk6Ci0gICAgIiIiUmV0dXJucyBzdHJ1Y3QgY29udGFpbmluZyBydW50aW1lIGdsb2JhbCBzZXR0aW5ncy4iIiIKLSAgICBzZXR0aW5ncyA9IGRpY3QoCi0gICAgICAgIGZvcm1hdCA9ICJwcmV0dHkiLAotICAgICAgICByZWFycmFuZ2UgPSAiIiwKLSAgICAgICAgdHJhY2VfbW9kdWxlcyA9IEZhbHNlLAotICAgICAgICB0cmFjZV92YXJpYWJsZXMgPSBbXSwKLSAgICAgICAgbWsycmJjX2NvbnRpbnVlID0gRmFsc2UsCi0gICAgKQotICAgIGZvciB4IGluIGdldGF0dHIocmJsZl9jbGksICJSQkNfT1VUIiwgIiIpLnNwbGl0KCIsIik6Ci0gICAgICAgIGlmIHggPT0gInNvcnQiIG9yIHggPT0gInVuaXF1ZSI6Ci0gICAgICAgICAgICBpZiBzZXR0aW5nc1sicmVhcnJhbmdlIl06Ci0gICAgICAgICAgICAgICAgZmFpbCgiUkJDX09VVDogZWl0aGVyIHNvcnQgb3IgdW5pcXVlIGlzIGFsbG93ZWQgKGFuZCBzb3J0IGltcGxpZXMgdW5pcXVlKSIpCi0gICAgICAgICAgICBzZXR0aW5nc1sicmVhcnJhbmdlIl0gPSB4Ci0gICAgICAgIGVsaWYgeCA9PSAicHJldHR5IiBvciB4ID09ICJtYWtlIjoKLSAgICAgICAgICAgIHNldHRpbmdzWyJmb3JtYXQiXSA9IHgKLSAgICAgICAgZWxpZiB4ID09ICJnbG9iYWwiOgotICAgICAgICAgICAgIyBUT0RPOiBSZW1vdmUgdGhpcywga2VwdCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZWxpZiB4ICE9ICIiOgotICAgICAgICAgICAgZmFpbCgiUkJDX09VVDogZ290ICVzLCBzaG91bGQgYmUgb25lIG9mOiBbcHJldHR5fG1ha2VdIFtzb3J0fHVuaXF1ZV0iICUgeCkKLSAgICBmb3IgeCBpbiBnZXRhdHRyKHJibGZfY2xpLCAiUkJDX0RFQlVHIiwgIiIpLnNwbGl0KCIsIik6Ci0gICAgICAgIGlmIHggPT0gIiF0cmFjZSI6Ci0gICAgICAgICAgICBzZXR0aW5nc1sidHJhY2VfbW9kdWxlcyJdID0gVHJ1ZQotICAgICAgICBlbGlmIHggIT0gIiI6Ci0gICAgICAgICAgICBzZXR0aW5nc1sidHJhY2VfdmFyaWFibGVzIl0uYXBwZW5kKHgpCi0gICAgaWYgZ2V0YXR0cihyYmxmX2NsaSwgIlJCQ19NSzJSQkNfQ09OVElOVUUiLCAiIik6Ci0gICAgICAgIHNldHRpbmdzWyJtazJyYmNfY29udGludWUiXSA9IFRydWUKLSAgICByZXR1cm4gc3RydWN0KCoqc2V0dGluZ3MpCi0KICMgU2V0dGluZ3MgdXNlZCBkdXJpbmcgZGVidWdnaW5nLgotX29wdGlvbnMgPSBfX2dldF9vcHRpb25zKCkKK19vcHRpb25zID0gc3RydWN0KAorICAgIHRyYWNlX21vZHVsZXMgPSBGYWxzZSwKKyAgICB0cmFjZV92YXJpYWJsZXMgPSBbXSwKKykKKwogcmJsZiA9IHN0cnVjdCgKICAgICBzb29uZ19jb25maWdfbmFtZXNwYWNlID0gX3Nvb25nX2NvbmZpZ19uYW1lc3BhY2UsCiAgICAgc29vbmdfY29uZmlnX2FwcGVuZCA9IF9zb29uZ19jb25maWdfYXBwZW5kLAogICAgIHNvb25nX2NvbmZpZ19zZXQgPSBfc29vbmdfY29uZmlnX3NldCwKKyAgICBzb29uZ19jb25maWdfc2V0X2Jvb2wgPSBfc29vbmdfY29uZmlnX3NldF9ib29sLAogICAgIHNvb25nX2NvbmZpZ19nZXQgPSBfc29vbmdfY29uZmlnX2dldCwKICAgICBhYnNwYXRoID0gX2Fic3BhdGgsCiAgICAgYWRkX3Byb2R1Y3RfZGV4X3ByZW9wdF9tb2R1bGVfY29uZmlnID0gX2FkZF9wcm9kdWN0X2RleF9wcmVvcHRfbW9kdWxlX2NvbmZpZywKZGlmZiAtLWdpdCBhL2NvcmUvcHJvZHVjdF92YWxpZGF0aW9uX2NoZWNrcy5tayBiL2NvcmUvcHJvZHVjdF92YWxpZGF0aW9uX2NoZWNrcy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGQ5NzZmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9wcm9kdWN0X3ZhbGlkYXRpb25fY2hlY2tzLm1rCkBAIC0wLDAgKzEsNzIgQEAKKyMgUFJPRFVDVF9WQUxJREFUSU9OX0NIRUNLUyBhbGxvd3MgeW91IHRvIGVuZm9yY2UgdGhhdCB5b3VyIHByb2R1Y3QgY29uZmlnIHZhcmlhYmxlcyBmb2xsb3cgc29tZQorIyBydWxlcy4gVG8gdXNlIGl0LCBhZGQgdGhlIHBhdGhzIHRvIHN0YXJsYXJrIGNvbmZpZ3VyYXRpb24gbGFuZ3VhZ2UgKHNjbCkgZmlsZXMgaW4KKyMgUFJPRFVDVF9WQUxJREFUSU9OX0NIRUNLUy4gQSB2YWxpZGF0ZV9wcm9kdWN0X3ZhcmlhYmxlcyBmdW5jdGlvbiBpbiB0aG9zZSBmaWxlcyB3aWxsIGJlIGNhbGxlZAorIyB3aXRoIGEgc2luZ2xlICJjb250ZXh0IiBvYmplY3QuCisjCisjIFRoZSBjb250ZXh0IG9iamVjdCBjdXJyZW50bHkgMiBhdHRyaWJ1dGVzOgorIyAgIC0gcHJvZHVjdF92YXJpYWJsZXM6IFRoaXMgaGFzIGFsbCB0aGUgcHJvZHVjdCB2YXJpYWJsZXMuIEFsbCB0aGUgdmFyaWFibGVzIGFyZSBlaXRoZXIgb2YgdHlwZQorIyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBvciBsaXN0LCBtb3JlIGFjY3VyYXRlIHR5cGluZyAobGlrZSBib29sKSBpc24ndCBrbm93bi4KKyMgICAtIGJvYXJkX3ZhcmlhYmxlczogVGhpcyBvbmx5IGhhcyBhIHNtYWxsIHN1YnNldCBvZiB0aGUgYm9hcmQgdmFyaWFibGVzLCBiZWNhdXNlIHRoZXJlIGlzbid0IGEKKyMgICAgICAgICAgICAgICAgICAgICAga25vd24gbGlzdCBvZiBib2FyZCB2YXJpYWJsZXMuIEZlZWwgZnJlZSB0byBleHBhbmQgdGhlIHN1YnNldCBpZiB5b3UgbmVlZCBhCisjICAgICAgICAgICAgICAgICAgICAgIG5ldyB2YXJpYWJsZS4KKyMKKyMgWW91IGNhbiB0aGVuIGluc3BlY3QgKGJ1dCBub3QgbW9kaWZ5KSB0aGVzZSB2YXJpYWJsZXMgYW5kIGZhaWwoKSBpZiB0aGV5IGRvbid0IG1lZXQgeW91cgorIyByZXF1aXJlbWVudHMuIEV4YW1wbGU6CisjCisjIEluIGEgcHJvZHVjdCBjb25maWcgZmlsZTogUFJPRFVDVF9WQUxJREFUSU9OX0NIRUNLUyArPSAvL3BhdGgvdG8vbXlfdmFsaWRhdGlvbnMuc2NsCisjIEluIG15X3ZhbGlkYXRpb25zLnNjbDoKKyMgZGVmIHZhbGlkYXRlX3Byb2R1Y3RfdmFyaWFibGVzKGN0eCk6CisjICAgICBmb3IgZGlyIGluIGN0eC5ib2FyZF92YXJpYWJsZXMuQk9BUkRfU0VQT0xJQ1lfRElSUzoKKyMgICAgICAgICBpZiBub3QgZGlyLnN0YXJ0c3dpdGgoJ3N5c3RlbS9zZXBvbGljeS8nKToKKyMgICAgICAgICAgICAgZmFpbCgnT25seSBzZXBvbGljaWVzIGluIHN5c3RlbS9zZXBsaWN5IGFyZSBhbGxvd2VkLCBmb3VuZDogJyArIGRpcikKKworaWZkZWYgUFJPRFVDVF9WQUxJREFUSU9OX0NIRUNLUworCiskKGlmICQoZmlsdGVyLW91dCAvLyUuc2NsLCQoUFJPRFVDVF9WQUxJREFUSU9OX0NIRUNLUykpLCBcCisJJChlcnJvciBBbGwgUFJPRFVDVF9WQUxJREFUSU9OX0NIRUNLUyBmaWxlcyBtdXN0IHN0YXJ0IHdpdGggLy8gYW5kIGVuZCB3aXRoIC5zY2wsIGV4Y2VwdGlvbnM6ICQoZmlsdGVyLW91dCAvLyUuc2NsLCQoUFJPRFVDVF9WQUxJREFUSU9OX0NIRUNLUykpKSkKKwora25vd25fYm9hcmRfdmFyaWFibGVzIDo9IFwKKyAgQk9BUkRfVkVORE9SX1NFUE9MSUNZX0RJUlMgQk9BUkRfU0VQT0xJQ1lfRElSUyBcCisgIFNZU1RFTV9FWFRfUFJJVkFURV9TRVBPTElDWV9ESVJTIFwKKyAgU1lTVEVNX0VYVF9QVUJMSUNfU0VQT0xJQ1lfRElSUyBcCisgIFBST0RVQ1RfUFVCTElDX1NFUE9MSUNZX0RJUlMgXAorICBQUk9EVUNUX1BSSVZBVEVfU0VQT0xJQ1lfRElSUworCitrbm93bl9ib2FyZF9saXN0X3ZhcmlhYmxlcyA6PSBcCisgIEJPQVJEX1ZFTkRPUl9TRVBPTElDWV9ESVJTIEJPQVJEX1NFUE9MSUNZX0RJUlMgXAorICBTWVNURU1fRVhUX1BSSVZBVEVfU0VQT0xJQ1lfRElSUyBcCisgIFNZU1RFTV9FWFRfUFVCTElDX1NFUE9MSUNZX0RJUlMgXAorICBQUk9EVUNUX1BVQkxJQ19TRVBPTElDWV9ESVJTIFwKKyAgUFJPRFVDVF9QUklWQVRFX1NFUE9MSUNZX0RJUlMKKworZXNjYXBlX3N0YXJsYXJrX3N0cmluZz0kKHN1YnN0ICIsXCIsJChzdWJzdCBcLFxcLCQoMSkpKQorcHJvZHVjdF92YXJpYWJsZV9zdGFybGFya192YWx1ZT0kKGlmICQoZmlsdGVyICQoMSksJChfcHJvZHVjdF9saXN0X3ZhcnMpICQoa25vd25fYm9hcmRfbGlzdF92YXJpYWJsZXMpKSxbJChmb3JlYWNoIHcsJCgkKDEpKSwiJChjYWxsIGVzY2FwZV9zdGFybGFya19zdHJpbmcsJCh3KSkiLCApXSwiJChjYWxsIGVzY2FwZV9zdGFybGFya19zdHJpbmcsJCgxKSkiKQorZmlsZW5hbWVfdG9fc3Rhcmxhcms9JChzdWJzdCAtLF8sJChzdWJzdCAvLF8sJChzdWJzdCAuLF8sJCgxKSkpKQorX2M6PSQoZm9yZWFjaCBmLCQoUFJPRFVDVF9WQUxJREFUSU9OX0NIRUNLUyksJChuZXdsaW5lKWxvYWQoIiQoZikiLCB2YWxpZGF0ZV9wcm9kdWN0X3ZhcmlhYmxlc18kKGNhbGwgZmlsZW5hbWVfdG9fc3RhcmxhcmssJChmKSkgPSAidmFsaWRhdGVfcHJvZHVjdF92YXJpYWJsZXMiKSkKKyMgVE9ETzogd2Ugc2hvdWxkIGZyZWV6ZSB0aGUgY29udGV4dCBiZWNhdXNlIGl0IGNvbnRhaW5zIG11dGFibGUgbGlzdHMsIHNvIHRoYXQgdmFsaWRhdGlvbiBjaGVja3MgY2FuJ3QgYWZmZWN0IGVhY2ggb3RoZXIKK19jKz0kKG5ld2xpbmUpX2N0eCA9IHN0cnVjdCgKK19jKz0kKG5ld2xpbmUpcHJvZHVjdF92YXJpYWJsZXMgPSBzdHJ1Y3QoCitfYys9JChmb3JlYWNoIHYsJChfcHJvZHVjdF92YXJfbGlzdCksJChuZXdsaW5lKSAgJCh2KSA9ICQoY2FsbCBwcm9kdWN0X3ZhcmlhYmxlX3N0YXJsYXJrX3ZhbHVlLCQodikpLCkKK19jKz0kKG5ld2xpbmUpKSwKK19jKz0kKG5ld2xpbmUpYm9hcmRfdmFyaWFibGVzID0gc3RydWN0KAorX2MrPSQoZm9yZWFjaCB2LCQoa25vd25fYm9hcmRfdmFyaWFibGVzKSwkKG5ld2xpbmUpICAkKHYpID0gJChjYWxsIHByb2R1Y3RfdmFyaWFibGVfc3RhcmxhcmtfdmFsdWUsJCh2KSksKQorX2MrPSQobmV3bGluZSkpCitfYys9JChuZXdsaW5lKSkKK19jKz0kKGZvcmVhY2ggZiwkKFBST0RVQ1RfVkFMSURBVElPTl9DSEVDS1MpLCQobmV3bGluZSl2YWxpZGF0ZV9wcm9kdWN0X3ZhcmlhYmxlc18kKGNhbGwgZmlsZW5hbWVfdG9fc3RhcmxhcmssJChmKSkoX2N0eCkpCitfYys9JChuZXdsaW5lKXZhcmlhYmxlc190b19leHBvcnRfdG9fbWFrZSA9IHt9CiskKEtBVElfZmlsZV9ub19yZXJ1biA+JChPVVRfRElSKS9wcm9kdWN0X3ZhbGlkYXRpb25fY2hlY2tzX2VudHJ5cG9pbnQuc2NsLCQoX2MpKQorZmlsZW5hbWVfdG9fc3Rhcmxhcms6PQorZXNjYXBlX3N0YXJsYXJrX3N0cmluZzo9Citwcm9kdWN0X3ZhcmlhYmxlX3N0YXJsYXJrX3ZhbHVlOj0KK2tub3duX2JvYXJkX3ZhcmlhYmxlcyA6PQora25vd25fYm9hcmRfbGlzdF92YXJpYWJsZXMgOj0KKworIyBFeGNsdWRlIHRoZSBlbnRyeXBvaW50IGZpbGUgYXMgYSBkZXBlbmRlbmN5IChieSBwYXNzaW5nIGl0IGFzIHRoZSAybmQgYXJndW1lbnQpIHNvIHRoYXQgd2UgZG9uJ3QKKyMgcmVydW4ga2F0aSBldmVyeSBidWlsZC4gRXZlbiB0aG91Z2ggd2UncmUgdXNpbmcgS0FUSV9maWxlX25vX3JlcnVuLCBwcm9kdWN0IGNvbmZpZyBpcyBydW4gZXZlcnkKKyMgYnVpbGQsIHNvIHRoZSBmaWxlIHdpbGwgc3RpbGwgYmUgcmV3cml0dGVuLgorIworIyBXZSBhbHNvIG5lZWQgdG8gcGFzcyAtLWFsbG93X2V4dGVybmFsX2VudHJ5cG9pbnQgdG8gcmJjcnVuIGluIGNhc2UgdGhlIE9VVF9ESVIgaXMgc2V0IHRvIHNvbWV0aGluZworIyBvdXRzaWRlIG9mIHRoZSBzb3VyY2UgdHJlZS4KKyQoY2FsbCBydW4tc3RhcmxhcmssJChPVVRfRElSKS9wcm9kdWN0X3ZhbGlkYXRpb25fY2hlY2tzX2VudHJ5cG9pbnQuc2NsLCQoT1VUX0RJUikvcHJvZHVjdF92YWxpZGF0aW9uX2NoZWNrc19lbnRyeXBvaW50LnNjbCwtLWFsbG93X2V4dGVybmFsX2VudHJ5cG9pbnQpCisKK2VuZGlmICMgaWZkZWYgUFJPRFVDVF9WQUxJREFUSU9OX0NIRUNLUwpkaWZmIC0tZ2l0IGEvY29yZS9wcm9ndWFyZC5mbGFncyBiL2NvcmUvcHJvZ3VhcmQuZmxhZ3MKaW5kZXggZDc5MDA2MS4uNTE0OGU1NiAxMDA2NDQKLS0tIGEvY29yZS9wcm9ndWFyZC5mbGFncworKysgYi9jb3JlL3Byb2d1YXJkLmZsYWdzCkBAIC0xNSw2ICsxNSwxMyBAQAogICAgIEBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZyAqOwogfQogCisjIEtlZXAgY2xhc3NlcyBhbmQgbWVtYmVycyB3aXRoIHBsYXRmb3JtIEBUZXN0QXBpIGFubm90YXRpb25zLCBzaW1pbGFyIHRvCisjIEBWaXNpYmxlRm9yVGVzdGluZy4KKy1rZWVwIEBhbmRyb2lkLmFubm90YXRpb24uVGVzdEFwaSBjbGFzcyAqCista2VlcGNsYXNzbWVtYmVycyBjbGFzcyAqIHsKKyAgICBAYW5kcm9pZC5hbm5vdGF0aW9uLlRlc3RBcGkgKjsKK30KKwogIyBLZWVwIGNsYXNzZXMgYW5kIG1lbWJlcnMgd2l0aCBub24tcGxhdGZvcm0gQFZpc2libGVGb3JUZXN0aW5nIGFubm90YXRpb25zLCBidXQKICMgb25seSB3aXRoaW4gcGxhdGZvcm0tZGVmaW5lZCBwYWNrYWdlcy4gVGhpcyBhdm9pZHMga2VlcGluZyBleHRlcm5hbCwgbGlicmFyeS1zcGVjaWZpYwogIyB0ZXN0IGNvZGUgdGhhdCBpc24ndCBhY3R1YWxseSBuZWVkZWQgZm9yIHBsYXRmb3JtIHRlc3RpbmcuCkBAIC0zMSw2ICszOCwxNyBAQAogICBAY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuS2VlcEZvcldlYWtSZWZlcmVuY2UgPGZpZWxkcz47CiB9CiAKKyMgTmVlZGVkIHRvIGVuc3VyZSBjYWxsYmFjayBmaWVsZCByZWZlcmVuY2VzIGFyZSBrZXB0IGluIHRoZWlyIHJlc3BlY3RpdmUKKyMgb3duaW5nIGNsYXNzZXMgd2hlbiB0aGUgZG93bnN0cmVhbSBjYWxsYmFjayByZWdpc3RyYXJzIG9ubHkgc3RvcmUgd2VhayByZWZzLgorLWlmIEBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5XZWFrbHlSZWZlcmVuY2VkQ2FsbGJhY2sgY2xhc3MgKgorLWtlZXBjbGFzc21lbWJlcnMsYWxsb3dhY2Nlc3Ntb2RpZmljYXRpb24gY2xhc3MgKiB7CisgIDwxPiAqOworfQorLWlmIGNsYXNzICogZXh0ZW5kcyBAY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuV2Vha2x5UmVmZXJlbmNlZENhbGxiYWNrICoqCista2VlcGNsYXNzbWVtYmVycyxhbGxvd2FjY2Vzc21vZGlmaWNhdGlvbiBjbGFzcyAqIHsKKyAgPDE+ICo7Cit9CisKICMgVW5kZXJzdGFuZCB0aGUgY29tbW9uIEBLZWVwIGFubm90YXRpb24gZnJvbSB2YXJpb3VzIEFuZHJvaWQgcGFja2FnZXM6CiAjICAqIGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uCiAjICAqIGFuZHJvaWR4LmFubm90YXRpb24KQEAgLTUxLDQgKzY5LDE0IEBACiAgICAgQCoqYW5kcm9pZCoqLmFubm90YXRpb24qLktlZXAgPGluaXQ+KC4uLik7CiB9CiAKKyMgS2VlcCBEYWx2aWsgb3B0aW1pemF0aW9uIGFubm90YXRpb25zLiBUaGVzZSBhbm5vdGF0aW9ucyBhcmUgc3BlY2lhbCBpbiB0aGF0CisjIDEpIHdlIHdhbnQgdGhlbSBwcmVzZXJ2ZWQgZm9yIHZpc2liaWxpdHkgd2l0aCBBUlQsIGJ1dCAyKSB0aGV5IGRvbid0IGhhdmUKKyMgUlVOVElNRSByZXRlbnRpb24uIFRoZXNlIG1pbmltYWwga2VlcCBydWxlcyBlbnN1cmUgdGhleSdyZSBub3Qgc3RyaXBwZWQgYnkgUjguCisjIFRPRE8oYi8yMTU0MTczODgpOiBFeHBvcnQgdGhpcyBydWxlIGZyb20gdGhlIG93bmluZyBsaWJyYXJ5LCBjb3JlLWxpYmFydCwKKyMgdmlhIGV4cG9ydF9wcm9ndWFyZF9mbGFnc19maWxlcy4KKy1rZWVwY2xhc3NtZW1iZXJzLGFsbG93c2hyaW5raW5nLGFsbG93b3B0aW1pemF0aW9uLGFsbG93b2JmdXNjYXRpb24sYWxsb3dhY2Nlc3Ntb2RpZmljYXRpb24gY2xhc3MgKiB7CisgICAgQGRhbHZpay5hbm5vdGF0aW9uLm9wdGltaXphdGlvbi4qKiAqOworfQorCiAtaW5jbHVkZSBwcm9ndWFyZF9iYXNpY19rZWVwcy5mbGFncworLWluY2x1ZGUgcHJvZ3VhcmQva290bGluLmZsYWdzCmRpZmYgLS1naXQgYS9jb3JlL3Byb2d1YXJkL2tvdGxpbi5mbGFncyBiL2NvcmUvcHJvZ3VhcmQva290bGluLmZsYWdzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNmJmMGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Byb2d1YXJkL2tvdGxpbi5mbGFncwpAQCAtMCwwICsxLDIxIEBACisjIElnbm9yZSBtaXNzaW5nIEtvdGxpbiBtZXRhLWFubm90YXRpb25zIHNvIHRoYXQgSmF2YS1vbmx5IHByb2plY3RzIGNhbiBkZXBlbmQKKyMgb24gcHJvamVjdHMgdGhhdCBoYXBwZW4gdG8gYmUgd3JpdHRlbiBpbiBLb3RsaW4gYnV0IGRvIG5vdCBoYXZlIGEgcnVuLXRpbWUKKyMgZGVwZW5kZW5jeSBvbiB0aGUgS290bGluIHN0YW5kYXJkIGxpYnJhcnkuIE5vdGUgdGhlc2UgYW5ub3RhdGlvbnMgYXJlIFJVTlRJTUUKKyMgcmV0ZW50aW9uLCBidXQgd2Ugd29uJ3QgbmVlZCB0aGVtIGF2YWlsYWJsZSBpbiBKYXZhLW9ubHkgcHJvamVjdHMuCistZG9udHdhcm4ga290bGluLk1ldGFkYXRhCistZG9udHdhcm4ga290bGluLmFubm90YXRpb24uQW5ub3RhdGlvblJldGVudGlvbgorLWRvbnR3YXJuIGtvdGxpbi5hbm5vdGF0aW9uLkFubm90YXRpb25UYXJnZXQKKy1kb250d2FybiBrb3RsaW4uYW5ub3RhdGlvbi5SZXRlbnRpb24KKy1kb250d2FybiBrb3RsaW4uYW5ub3RhdGlvbi5UYXJnZXQKKworIyBLb3RsaW4gRGVidWdNZXRhZGF0YSBoYXMgbm8gdmFsdWUgaW4gcmVsZWFzZSBidWlsZHMsIHRoZXNlIHR3byBydWxlcywgd2lsbAorIyBhbGxvdyBBcHBSZWR1Y2UgdG8gc3RyaXAgb3V0IERlYnV0TWV0YWRhdGEuCisjIFRPRE8oYi8zMDIzODMzMjgpOiBSZXN0b3JlIHRoZSBiZWxvdyBjaGVja2Rpc2NhcmQgYWZ0ZXIgcmVzb2x2aW5nIHRyYW5zaXRpdmUKKyMgaW5jbHVzaW9uIG9mIGtvdGxpbi1zdGRsaWIgZnJvbSBhbmRyb2lkeC5hbm5vdGF0aW9uIGxpYnJhcnkgZGVwcy4KKyMgLWNoZWNrZGlzY2FyZCBpbnRlcmZhY2Uga290bGluLmNvcm91dGluZXMuanZtLmludGVybmFsLkRlYnVnTWV0YWRhdGEKKy1hc3N1bWVub3NpZGVlZmZlY3RzIGNsYXNzIGtvdGxpbi5jb3JvdXRpbmVzLmp2bS5pbnRlcm5hbC5EZWJ1Z01ldGFkYXRhS3QgeworICAqKiogZ2V0RGVidWdNZXRhZGF0YUFubm90YXRpb24oLi4uKTsKK30KKy1hc3N1bWV2YWx1ZXMgY2xhc3Mga290bGluLmNvcm91dGluZXMuanZtLmludGVybmFsLkRlYnVnTWV0YWRhdGFLdCB7CisgICoqKiBnZXREZWJ1Z01ldGFkYXRhQW5ub3RhdGlvbiguLi4pIHJldHVybiBudWxsOworfQpkaWZmIC0tZ2l0IGEvY29yZS9wcm9ndWFyZF9iYXNpY19rZWVwcy5mbGFncyBiL2NvcmUvcHJvZ3VhcmRfYmFzaWNfa2VlcHMuZmxhZ3MKaW5kZXggYjU5NTI3YS4uZjZiMzRiOCAxMDA2NDQKLS0tIGEvY29yZS9wcm9ndWFyZF9iYXNpY19rZWVwcy5mbGFncworKysgYi9jb3JlL3Byb2d1YXJkX2Jhc2ljX2tlZXBzLmZsYWdzCkBAIC0xMCw2ICsxMCwxMiBAQAogIyBhbmQgUnVudGltZVZpc2libGVUeXBlQW5ub3RhdGlvbnMsIGFzIHdlbGwgYXMgYXNzb2NpYXRlZCBkZWZhdWx0cy4KIC1rZWVwYXR0cmlidXRlcyBSdW50aW1lVmlzaWJsZSpBbm5vdGF0aW9uKixBbm5vdGF0aW9uRGVmYXVsdAogCisjIFdpdGggUjggZnVsbCBtb2RlLCBjZXJ0YWluIGF0dHJpYnV0ZXMgYXJlIG9ubHkga2VwdCB3aGVuIG1hdGNoZWQgd2l0aCBhbgorIyBleHBsaWNpdCBrZWVwIHJ1bGUgZm9yIHRoYXQgdGFyZ2V0LCBldmVuIHdpdGggYSBnbG9iYWwgLWtlZXBhdHRyaWJ1dGVzIHJ1bGUuCisjIEFzIHN1Y2gsIHdlIGNhbiBhZGQgdGhlIGdsb2JhbCBrZWVwIHJ1bGUgaGVyZSB3aXRoIG1pbmltYWwgY29zdCB3aGlsZQorIyBzaW1wbGlmeWluZyBpbmNyZW1lbnRhbCBkZXZlbG9wbWVudC4KKy1rZWVwYXR0cmlidXRlcyBFeGNlcHRpb25zCisKICMgRm9yIGVudW1lcmF0aW9uIGNsYXNzZXMsIHNlZSBodHRwOi8vcHJvZ3VhcmQuc291cmNlZm9yZ2UubmV0L21hbnVhbC9leGFtcGxlcy5odG1sI2VudW1lcmF0aW9ucwogLWtlZXBjbGFzc21lbWJlcnMgZW51bSAqIHsKICAgICBwdWJsaWMgc3RhdGljICoqW10gdmFsdWVzKCk7CmRpZmYgLS1naXQgYS9jb3JlL3Byb2plY3RfZGVmaW5pdGlvbnMubWsgYi9jb3JlL3Byb2plY3RfZGVmaW5pdGlvbnMubWsKaW5kZXggNTcyOGI2Ny4uMTg0YjAzZSAxMDA2NDQKLS0tIGEvY29yZS9wcm9qZWN0X2RlZmluaXRpb25zLm1rCisrKyBiL2NvcmUvcHJvamVjdF9kZWZpbml0aW9ucy5tawpAQCAtMjIsMyArMjIsNiBAQAogIyBJbmNsdWRlIGRlZmluaXRpb25zIGZvciBwcmVidWlsdCBTREssIGlmIHByZXNlbnQuCiAjCiAtaW5jbHVkZSBwcmVidWlsdHMvc2RrL2N1cnJlbnQvZGVmaW5pdGlvbnMubWsKKworIyBTRFYtc3BlY2lmaWMgY29uZmlnLgorLWluY2x1ZGUgc3lzdGVtL3NvZnR3YXJlX2RlZmluZWRfdmVoaWNsZS9wbGF0Zm9ybS9jb25maWcubWsKZGlmZiAtLWdpdCBhL2NvcmUvcHl0aG9uX2JpbmFyeV9ob3N0X21vYmx5X3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbCBiL2NvcmUvcHl0aG9uX2JpbmFyeV9ob3N0X21vYmx5X3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbAppbmRleCBhNjU3NmNkLi5hOTg2ZGYyIDEwMDY0NAotLS0gYS9jb3JlL3B5dGhvbl9iaW5hcnlfaG9zdF9tb2JseV90ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwKKysrIGIvY29yZS9weXRob25fYmluYXJ5X2hvc3RfbW9ibHlfdGVzdF9jb25maWdfdGVtcGxhdGUueG1sCkBAIC0xMywxMyArMTMsOSBAQAogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3Ige01PRFVMRX0gbW9ibHkgdGVzdCI+CiAgICAge0VYVFJBX0NPTkZJR1N9CiAKLSAgICA8ZGV2aWNlIG5hbWU9ImRldmljZTEiPjwvZGV2aWNlPgotICAgIDxkZXZpY2UgbmFtZT0iZGV2aWNlMiI+PC9kZXZpY2U+CisgICAgPGRldmljZSBuYW1lPSJBbmRyb2lkUmVhbERldmljZSI+PC9kZXZpY2U+CisgICAgPGRldmljZSBuYW1lPSJBbmRyb2lkUmVhbERldmljZSI+PC9kZXZpY2U+CiAKLSAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUubW9ibHkuTW9ibHlCaW5hcnlIb3N0VGVzdCI+Ci0gICAgICA8IS0tIFRoZSBtb2JseS1wYXItZmlsZS1uYW1lIHNob3VsZCBtYXRjaCB0aGUgbW9kdWxlIG5hbWUgLS0+Ci0gICAgICA8b3B0aW9uIG5hbWU9Im1vYmx5LXBhci1maWxlLW5hbWUiIHZhbHVlPSJ7TU9EVUxFfSIgLz4KLSAgICAgIDwhLS0gVGltZW91dCBsaW1pdCBpbiBtaWxsaXNlY29uZHMgZm9yIGFsbCB0ZXN0IGNhc2VzIG9mIHRoZSBweXRob24gYmluYXJ5IC0tPgotICAgICAgPG9wdGlvbiBuYW1lPSJtb2JseS10ZXN0LXRpbWVvdXQiIHZhbHVlPSIzMDAwMDAiIC8+Ci0gICAgPC90ZXN0PgorICAgIDxvcHRpb24gbmFtZT0ibW9ibHlfcGtnIiBrZXk9ImZpbGUiIHZhbHVlPSJ7TU9EVUxFfSIgLz4KKyAgICA8dGVzdCBjbGFzcz0iTW9ibHlBb3NwUGFja2FnZVRlc3QiIC8+CiA8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9jb3JlL3JhdmVud29vZF90ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwgYi9jb3JlL3JhdmVud29vZF90ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU5ZGQ3NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmF2ZW53b29kX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbApAQCAtMCwwICsxLDQ0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBUaGlzIHRlc3QgY29uZmlnIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQuIC0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlJ1bnMge01PRFVMRX0iPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJyYXZlbndvb2QiIC8+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9InJhdmVud29vZC10ZXN0cyIgLz4KKworICAgIDxvcHRpb24gbmFtZT0iamF2YS1mb2xkZXIiIHZhbHVlPSJwcmVidWlsdHMvamRrL2pkazIxL2xpbnV4LXg4Ni8iIC8+CisgICAgPG9wdGlvbiBuYW1lPSJ1c2UtcmF2ZW53b29kLXJlc291cmNlcyIgdmFsdWU9InRydWUiIC8+CisgICAgPG9wdGlvbiBuYW1lPSJleGNsdWRlLXBhdGhzIiB2YWx1ZT0iamF2YSIgLz4KKyAgICA8b3B0aW9uIG5hbWU9Im51bGwtZGV2aWNlIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8b3B0aW9uIG5hbWU9ImRvLW5vdC1zd2FsbG93LXJ1bm5lci1lcnJvcnMiIHZhbHVlPSJ0cnVlIiAvPgorCisgICAge0VYVFJBX0NPTkZJR1N9CisKKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSXNvbGF0ZWRIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphciIgdmFsdWU9IntNT0RVTEV9LmphciIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXZhLWZsYWdzIiB2YWx1ZT0iLS1hZGQtbW9kdWxlcz1qZGsuY29tcGlsZXIiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXZhLWZsYWdzIiB2YWx1ZT0iLS1hZGQtZXhwb3J0cz1qZGsuY29tcGlsZXIvY29tLnN1bi50b29scy5qYXZhYy5hcGk9QUxMLVVOTkFNRUQiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXZhLWZsYWdzIiB2YWx1ZT0iLS1hZGQtZXhwb3J0cz1qZGsuY29tcGlsZXIvY29tLnN1bi50b29scy5qYXZhYy5jb2RlPUFMTC1VTk5BTUVEIi8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamF2YS1mbGFncyIgdmFsdWU9Ii0tYWRkLWV4cG9ydHM9amRrLmNvbXBpbGVyL2NvbS5zdW4udG9vbHMuamF2YWMuY29tcD1BTEwtVU5OQU1FRCIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphdmEtZmxhZ3MiIHZhbHVlPSItLWFkZC1leHBvcnRzPWpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLmZpbGU9QUxMLVVOTkFNRUQiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXZhLWZsYWdzIiB2YWx1ZT0iLS1hZGQtZXhwb3J0cz1qZGsuY29tcGlsZXIvY29tLnN1bi50b29scy5qYXZhYy5tYWluPUFMTC1VTk5BTUVEIi8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamF2YS1mbGFncyIgdmFsdWU9Ii0tYWRkLWV4cG9ydHM9amRrLmNvbXBpbGVyL2NvbS5zdW4udG9vbHMuamF2YWMucGFyc2VyPUFMTC1VTk5BTUVEIi8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamF2YS1mbGFncyIgdmFsdWU9Ii0tYWRkLWV4cG9ydHM9amRrLmNvbXBpbGVyL2NvbS5zdW4udG9vbHMuamF2YWMudHJlZT1BTEwtVU5OQU1FRCIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphdmEtZmxhZ3MiIHZhbHVlPSItLWFkZC1leHBvcnRzPWpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLnV0aWw9QUxMLVVOTkFNRUQiLz4KKworICAgICAgICA8IS0tIE5lZWRlZCBmb3Igc3VwcG9ydGluZyBQYXJjZWxGaWxlRGVzY3JpcHRvciBpbnRlcm5hbHMgLS0+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamF2YS1mbGFncyIgdmFsdWU9Ii0tYWRkLWV4cG9ydHM9amF2YS5iYXNlL2pkay5pbnRlcm5hbC5hY2Nlc3M9QUxMLVVOTkFNRUQiLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9jb3JlL3JiZS5tayBiL2NvcmUvcmJlLm1rCmluZGV4IDY3NTRiMGEuLjBmOTBkZGQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmJlLm1rCisrKyBiL2NvcmUvcmJlLm1rCkBAIC02NCw3ICs2NCw3IEBACiAgICAgZDhfZXhlY19zdHJhdGVneSA6PSByZW1vdGVfbG9jYWxfZmFsbGJhY2sKICAgZW5kaWYKIAotICBwbGF0Zm9ybSA6PSBjb250YWluZXItaW1hZ2U9ZG9ja2VyOi8vZ2NyLmlvL2FuZHJvaWRidWlsZC1yZS1kb2NrZXJpbWFnZS9hbmRyb2lkLWJ1aWxkLXJlbW90ZWV4ZWMtaW1hZ2VAc2hhMjU2OjU4MmVmYjM4ZjBjMjI5ZWEzOTk1MmZmZjllMTMyY2NiZTE4M2UxNDg2OWIzOTg4ODAxMGRhY2Y1NmIzNjBkNjIKKyAgcGxhdGZvcm0gOj0gY29udGFpbmVyLWltYWdlPWRvY2tlcjovL2djci5pby9hbmRyb2lkYnVpbGQtcmUtZG9ja2VyaW1hZ2UvYW5kcm9pZC1idWlsZC1yZW1vdGVleGVjLWltYWdlQHNoYTI1NjoxZWI3ZjY0YjllMTcxMDJiOTcwYmQ3YTFhZjdkYWFlYmRiMDFjM2ZiNzc3NzE1ODk5ZWY0NjJkNmM2ZDAxYTQ1CiAgIGN4eF9wbGF0Zm9ybSA6PSAkKHBsYXRmb3JtKSxQb29sPSQoY3h4X3Bvb2wpCiAgIGphdmFfcjhfZDhfcGxhdGZvcm0gOj0gJChwbGF0Zm9ybSksUG9vbD0kKGphdmFfcG9vbCkKIApkaWZmIC0tZ2l0IGEvY29yZS9yZWxlYXNlX2NvbmZpZy5tayBiL2NvcmUvcmVsZWFzZV9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlMTE1ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVsZWFzZV9jb25maWcubWsKQEAgLTAsMCArMSwzOTAgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZXRlcm1pbmUgd2hpY2ggcGFzcyB0aGlzIGlzLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPbiB0aGUgZmlyc3QgcGFzcywgd2UgYXJlIGFza2VkIGZvciBvbmx5IFBST0RVQ1RfUkVMRUFTRV9DT05GSUdfTUFQUywKKyMgb24gdGhlIHNlY29uZCBwYXNzLCB3ZSBhcmUgYXNrZWQgZm9yIHdoYXRldmVyIGVsc2UgaXMgd2FudGVkLgorX2ZpbmFsX3Byb2R1Y3RfY29uZmlnX3Bhc3M6PQoraWZuZXEgKFBST0RVQ1RfUkVMRUFTRV9DT05GSUdfTUFQUywkKERVTVBfTUFOWV9WQVJTKSkKKyAgICBfZmluYWxfcHJvZHVjdF9jb25maWdfcGFzczo9dHJ1ZQorZW5kaWYKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaG9vc2UgdGhlIGZsYWcgZmlsZXMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmVsZWFzZSBjb25maWdzIGFyZSBkZWZpbmVkIGluIHJlZmxlYXNlX2NvbmZpZ19tYXAgZmlsZXMsIHdoaWNoIG1hcAorIyB0aGUgc2hvcnQgbmFtZSAoZS5nLiAtbmV4dCkgdXNlZCBpbiBsdW5jaCB0byB0aGUgc3RhcmxhcmsgZmlsZXMKKyMgZGVmaW5pbmcgdGhlIGJ1aWxkIGZsYWcgdmFsdWVzLgorIworIyAoSWYgeW91J3JlIHRoaW5raW5nIGFib3V0IGFjb25maWcgZmxhZ3MsIHRoZXJlIGlzIG9uZSBidWlsZCBmbGFnLAorIyBSRUxFQVNFX0FDT05GSUdfVkFMVUVfU0VUUywgdGhhdCBzZXRzIHdoaWNoIGFjb25maWdfdmFsdWVfc2V0CisjIG1vZHVsZSB0byB1c2UgdG8gc2V0IHRoZSBhY29uZmlnIGZsYWcgdmFsdWVzLikKKyMKKyMgVGhlIHNob3J0IHJlbGVhc2UgY29uZmlnIG5hbWVzICpjYW4qIGFwcGVhciBtdWx0aXBsZSB0aW1lcywgdG8gYWxsb3cKKyMgZm9yIEFPU1AgYW5kIHZlbmRvciBzcGVjaWZpYyBmbGFncyB1bmRlciB0aGUgc2FtZSBuYW1lLCBidXQgdGhlCisjIGluZGl2aWR1YWwgZmxhZyB2YWx1ZXMgbXVzdCBhcHBlYXIgaW4gZXhhY3RseSBvbmUgY29uZmlnLiAgVmVuZG9yCisjIGRvZXMgbm90IG92ZXJyaWRlIEFPU1AsIG9yIGFueXRoaW5nIGxpa2UgdGhhdC4gIFRoaXMgaXMgYmVjYXVzZQorIyB2ZW5kb3IgY29kZSB1c3VhbGx5IGluY2x1ZGVzIHByZWJ1aWx0cywgYW5kIGhhdmluZyB2ZW5kb3IgY29tcGlsZQorIyB3aXRoIGRpZmZlcmVudCBmbGFncyBmcm9tIEFPU1AgaW5jcmVhc2VzIHRoZSBsaWtlbGlob29kIG9mIGZsYWcKKyMgbWlzbWF0Y2guCisKKyMgRG8gdGhpcyBmaXJzdCwgYmVjYXVzZSB3ZSdyZSBnb2luZyB0byB1bnNldCBUQVJHRVRfUkVMRUFTRSBiZWZvcmUKKyMgaW5jbHVkaW5nIGFueW9uZSwgc28gdGhleSBkb24ndCBzdGFydCBtYWtpbmcgY29uZGl0aW9uYWxzIGJhc2VkIG9uIGl0LgorIyBUaGlzIGxvZ2ljIGlzIGluIG1ha2UgYmVjYXVzZSBzdGFybGFyayBkb2Vzbid0IHVuZGVyc3RhbmQgb3B0aW9uYWwKKyMgdmVuZG9yIGZpbGVzLgorCisjIElmIHRoaXMgaXMgYSBnb29nbGUgc291cmNlIHRyZWUsIHJlc3RyaWN0IGl0IHRvIG9ubHkgdGhlIG9uZSBmaWxlCisjIHdoaWNoIGhhcyBPV05FUlMgY29udHJvbC4gIElmIGl0IGlzbid0IGxldCBvdGhlcnMgZGVmaW5lIHRoZWlyIG93bi4KK2NvbmZpZ19tYXBfZmlsZXMgOj0gJCh3aWxkY2FyZCBidWlsZC9yZWxlYXNlL3JlbGVhc2VfY29uZmlnX21hcC5taykgXAorICAgICQod2lsZGNhcmQgdmVuZG9yL2dvb2dsZV9zaGFyZWQvYnVpbGQvcmVsZWFzZS9yZWxlYXNlX2NvbmZpZ19tYXAubWspIFwKKyAgICAkKGlmICQod2lsZGNhcmQgdmVuZG9yL2dvb2dsZS9yZWxlYXNlL3JlbGVhc2VfY29uZmlnX21hcC5tayksIFwKKyAgICAgICAgdmVuZG9yL2dvb2dsZS9yZWxlYXNlL3JlbGVhc2VfY29uZmlnX21hcC5taywgXAorICAgICAgICAkKHNvcnQgXAorICAgICAgICAgICAgJCh3aWxkY2FyZCBkZXZpY2UvKi9yZWxlYXNlL3JlbGVhc2VfY29uZmlnX21hcC5taykgXAorICAgICAgICAgICAgJCh3aWxkY2FyZCBkZXZpY2UvKi8qL3JlbGVhc2UvcmVsZWFzZV9jb25maWdfbWFwLm1rKSBcCisgICAgICAgICAgICAkKHdpbGRjYXJkIHZlbmRvci8qL3JlbGVhc2UvcmVsZWFzZV9jb25maWdfbWFwLm1rKSBcCisgICAgICAgICAgICAkKHdpbGRjYXJkIHZlbmRvci8qLyovcmVsZWFzZS9yZWxlYXNlX2NvbmZpZ19tYXAubWspIFwKKyAgICAgICAgKSBcCisgICAgKQorCitwcm90b2J1Zl9tYXBfZmlsZXMgOj0gYnVpbGQvcmVsZWFzZS9yZWxlYXNlX2NvbmZpZ19tYXAudGV4dHByb3RvIFwKKyAgICAkKHdpbGRjYXJkIHZlbmRvci9nb29nbGVfc2hhcmVkL2J1aWxkL3JlbGVhc2UvcmVsZWFzZV9jb25maWdfbWFwLnRleHRwcm90bykgXAorICAgICQoaWYgJCh3aWxkY2FyZCB2ZW5kb3IvZ29vZ2xlL3JlbGVhc2UvcmVsZWFzZV9jb25maWdfbWFwLnRleHRwcm90byksIFwKKyAgICAgICAgdmVuZG9yL2dvb2dsZS9yZWxlYXNlL3JlbGVhc2VfY29uZmlnX21hcC50ZXh0cHJvdG8sIFwKKyAgICAgICAgJChzb3J0IFwKKyAgICAgICAgICAgICQod2lsZGNhcmQgZGV2aWNlLyovcmVsZWFzZS9yZWxlYXNlX2NvbmZpZ19tYXAudGV4dHByb3RvKSBcCisgICAgICAgICAgICAkKHdpbGRjYXJkIGRldmljZS8qLyovcmVsZWFzZS9yZWxlYXNlX2NvbmZpZ19tYXAudGV4dHByb3RvKSBcCisgICAgICAgICAgICAkKHdpbGRjYXJkIHZlbmRvci8qL3JlbGVhc2UvcmVsZWFzZV9jb25maWdfbWFwLnRleHRwcm90bykgXAorICAgICAgICAgICAgJCh3aWxkY2FyZCB2ZW5kb3IvKi8qL3JlbGVhc2UvcmVsZWFzZV9jb25maWdfbWFwLnRleHRwcm90bykgXAorICAgICAgICApIFwKKyAgICApCisKKyMgUmVtb3ZlIHN1cHBvcnQgZm9yIHRoZSBsZWdhY3kgYXBwcm9hY2guCitfbXVzdF9wcm90b2J1ZiA6PSB0cnVlCisKKyMgUFJPRFVDVF9SRUxFQVNFX0NPTkZJR19NQVBTIGlzIHNldCBieSBTb29uZyB1c2luZyBhbiBpbml0aWFsIHJ1biBvZiBwcm9kdWN0CisjIGNvbmZpZyB0byBjYXB0dXJlIG9ubHkgdGhlIGxpc3Qgb2YgY29uZmlnIG1hcHMgbmVlZGVkIGJ5IHRoZSBidWlsZC4KKyMgS2VlcCB0aGVtIGluIHRoZSBvcmRlciBwcm92aWRlZCwgYnV0IHJlbW92ZSBkdXBsaWNhdGVzLgorIyBUcmVhdCAubWsgYW5kIC50ZXh0cHJvdG8gYXMgZXF1YWwgZm9yIGR1cGxpY2F0ZSBlbGltaW5hdGlvbiwgYnV0IGZvcmNlCisjIHByb3RvYnVmIGlmIGFueSBQUk9EVUNUX1JFTEVBU0VfQ09ORklHX01BUFMgc3BlY2lmeSAudGV4dHByb3RvLgorJChmb3JlYWNoIG1hcCwkKFBST0RVQ1RfUkVMRUFTRV9DT05GSUdfTUFQUyksIFwKKyAgICAkKGlmICQoZmlsdGVyICQoYmFzZW5hbWUgJChtYXApKSwkKGJhc2VuYW1lICQoY29uZmlnX21hcF9maWxlcykpKSwsIFwKKyAgICAgICAgJChldmFsIGNvbmZpZ19tYXBfZmlsZXMgKz0gJChtYXApKSkgXAorICAgICQoaWYgJChmaWx0ZXIgJChiYXNlbmFtZSAkKG1hcCkpLnRleHRwcm90bywkKG1hcCkpLCQoZXZhbCBfbXVzdF9wcm90b2J1ZiA6PSB0cnVlKSkgXAorKQorCisKKyMgSWYgd2UgYXJlIG1pc3NpbmcgdGhlIHRleHRwcm90byB2ZXJzaW9uIG9mIGFueSBvZiAkKGNvbmZpZ19tYXBfZmlsZXMpLCB3ZSBjYW5ub3QgdXNlIHByb3RvYnVmLgorX2Nhbl9wcm90b2J1ZiA6PSB0cnVlCiskKGZvcmVhY2ggbWFwLCQoY29uZmlnX21hcF9maWxlcyksIFwKKyAgICAkKGlmICQod2lsZGNhcmQgJChiYXNlbmFtZSAkKG1hcCkpLnRleHRwcm90byksLCQoZXZhbCBfY2FuX3Byb3RvYnVmIDo9KSkgXAorKQorIyBJZiB3ZSBhcmUgbWlzc2luZyB0aGUgbWsgdmVyc2lvbiBvZiBhbnkgb2YgJChwcm90b2J1Zl9tYXBfZmlsZXMpLCB3ZSBtdXN0IHVzZSBwcm90b2J1Zi4KKyQoZm9yZWFjaCBtYXAsJChwcm90b2J1Zl9tYXBfZmlsZXMpLCBcCisgICAgJChpZiAkKHdpbGRjYXJkICQoYmFzZW5hbWUgJChtYXApKS5tayksLCQoZXZhbCBfbXVzdF9wcm90b2J1ZiA6PSB0cnVlKSkgXAorKQorCitpZm5lcSAoLCQoX211c3RfcHJvdG9idWYpKQorICAgIGlmZXEgKCwkKF9jYW5fcHJvdG9idWYpKQorICAgICAgICAjIFdlIG11c3QgdXNlIHByb3RvYnVmLCBidXQgd2UgY2Fubm90IHVzZSBwcm90b2J1Zi4KKyAgICAgICAgJChlcnJvciByZWxlYXNlIGNvbmZpZyBpcyBhIG1peHR1cmUgb2YgLnNjbCBhbmQgLnRleHRwcm90bykKKyAgICBlbmRpZgorZW5kaWYKKworX3VzZV9wcm90b2J1ZiA6PQoraWZuZXEgKCwkKF9tdXN0X3Byb3RvYnVmKSkKKyAgICBfdXNlX3Byb3RvYnVmIDo9IHRydWUKK2Vsc2UKKyAgICBpZm5lcSAoJChfY2FuX3Byb3RvYnVmKSwpCisgICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0CisgICAgICAgICQoZm9yZWFjaCBtYXAsJChjb25maWdfbWFwX2ZpbGVzKSwgXAorICAgICAgICAgICAgJChpZiAkKHdpbGRjYXJkICQoZGlyICQobWFwKSkvYnVpbGRfY29uZmlnL0RFRkFVTFQ9cHJvdG8pLCQoZXZhbCBfdXNlX3Byb3RvYnVmIDo9IHRydWUpKSBcCisgICAgICAgICAgICAkKGlmICQod2lsZGNhcmQgJChkaXIgJChtYXApKS9idWlsZF9jb25maWcvREVGQVVMVD1tYWtlKSwkKGV2YWwgX3VzZV9wcm90b2J1ZiA6PSApKSBcCisgICAgICAgICkKKyAgICAgICAgIyBVcGRhdGUgZm9yIHRoaXMgc3BlY2lmaWMgcmVsZWFzZSBjb25maWcgb25seSAobm8gaW5oZXJpdGFuY2UpLgorICAgICAgICAkKGZvcmVhY2ggbWFwLCQoY29uZmlnX21hcF9maWxlcyksIFwKKyAgICAgICAgICAgICQoaWYgJCh3aWxkY2FyZCAkKGRpciAkKG1hcCkpL2J1aWxkX2NvbmZpZy8kKFRBUkdFVF9SRUxFQVNFKT1wcm90byksJChldmFsIF91c2VfcHJvdG9idWYgOj0gdHJ1ZSkpIFwKKyAgICAgICAgICAgICQoaWYgJCh3aWxkY2FyZCAkKGRpciAkKG1hcCkpL2J1aWxkX2NvbmZpZy8kKFRBUkdFVF9SRUxFQVNFKT1tYWtlKSwkKGV2YWwgX3VzZV9wcm90b2J1ZiA6PSApKSBcCisgICAgICAgICkKKyAgICBlbmRpZgorZW5kaWYKKworaWZuZXEgKCwkKF91c2VfcHJvdG9idWYpKQorICAgICMgVGhlIC50ZXh0cHJvdG8gZmlsZXMgYXJlIHRoZSBjYW5vbmljYWwgc291cmNlIG9mIHRydXRoLgorICAgIF9hcmdzIDo9ICQoZm9yZWFjaCBtYXAsJChjb25maWdfbWFwX2ZpbGVzKSwgLS1tYXAgJChtYXApICkKKyAgICBpZm5lcSAoLCQoX211c3RfcHJvdG9idWYpKQorICAgICAgICAjIERpc2FibGUgdGhlIGJ1aWxkIGZsYWcgaW4gcmVsZWFzZS1jb25maWcuCisgICAgICAgIF9hcmdzICs9IC0tZ3VhcmQ9ZmFsc2UKKyAgICBlbmRpZgorICAgIF9hcmdzICs9IC0tYWxsb3ctbWlzc2luZz10cnVlCisgICAgaWZuZXEgKCwkKFRBUkdFVF9QUk9EVUNUKSkKKyAgICAgICAgX2FyZ3MgKz0gLS1wcm9kdWN0ICQoVEFSR0VUX1BST0RVQ1QpCisgICAgZW5kaWYKKyAgICBfZmxhZ3NfZGlyOj0kKE9VVF9ESVIpL3Nvb25nL3JlbGVhc2UtY29uZmlnCisgICAgX2ZsYWdzX2ZpbGU6PSQoX2ZsYWdzX2RpcikvcmVsZWFzZV9jb25maWctJChUQVJHRVRfUFJPRFVDVCktJChUQVJHRVRfUkVMRUFTRSkudmFycworICAgICMgcmVsZWFzZS1jb25maWcgZ2VuZXJhdGVzICQoX2ZsYWdzX3Zhcm1rKQorICAgIF9mbGFnc192YXJtazo9JChfZmxhZ3NfZmlsZToudmFycz0udmFybWspCisgICAgJChzaGVsbCAkKE9VVF9ESVIpL3JlbGVhc2UtY29uZmlnICQoX2FyZ3MpID4kKE9VVF9ESVIpL3JlbGVhc2UtY29uZmlnLm91dCAmJiB0b3VjaCAtdCAyMDAwMDEwMTAwMDAgJChfZmxhZ3NfdmFybWspKQorICAgICQoaWYgJChmaWx0ZXItb3V0IDAsJCguU0hFTExTVEFUVVMpKSwkKGVycm9yIHJlbGVhc2UtY29uZmlnIGZhaWxlZCB0byBydW4pKQorICAgIGlmbmVxICgsJChfZmluYWxfcHJvZHVjdF9jb25maWdfcGFzcykpCisgICAgICAgICMgU2F2ZSB0aGUgZmluYWwgdmVyc2lvbiBvZiB0aGUgY29uZmlnLgorICAgICAgICAkKHNoZWxsIGlmICEgY21wIC0tcXVpZXQgJChfZmxhZ3NfdmFybWspICQoX2ZsYWdzX2ZpbGUpOyB0aGVuIGNwICQoX2ZsYWdzX3Zhcm1rKSAkKF9mbGFnc19maWxlKTsgZmkpCisgICAgICAgICMgVGhpcyB3aWxsIGFsc28gc2V0IEFMTF9SRUxFQVNFX0NPTkZJR1NfRk9SX1BST0RVQ1QgYW5kIF91c2VkX2ZpbGVzIGZvciB1cy4KKyAgICAgICAgJChldmFsIGluY2x1ZGUgJChfZmxhZ3NfZmlsZSkpCisgICAgICAgICQoS0FUSV9leHRyYV9maWxlX2RlcHMgJChPVVRfRElSKS9yZWxlYXNlLWNvbmZpZyAkKHByb3RvYnVmX21hcF9maWxlcykgJChfZmxhZ3NfZmlsZSkpCisgICAgICAgIGlmbmVxICgsJChfZGlzYWxsb3dfbHVuY2hfdXNlKSkKKyAgICAgICAgICAgICQoZXJyb3IgUmVsZWFzZSBjb25maWcgJHtUQVJHRVRfUkVMRUFTRX0gaXMgZGlzYWxsb3dlZCBmb3IgYnVpbGQuICBQbGVhc2UgdXNlIG9uZSBvZjogJChBTExfUkVMRUFTRV9DT05GSUdTX0ZPUl9QUk9EVUNUKSkKKyAgICAgICAgZW5kaWYKKyAgICBlbHNlCisgICAgICAgICMgVGhpcyBpcyB0aGUgZmlyc3QgcGFzcyBvZiBwcm9kdWN0IGNvbmZpZy4KKyAgICAgICAgJChldmFsIGluY2x1ZGUgJChfZmxhZ3NfdmFybWspKQorICAgIGVuZGlmCisgICAgX3VzZWRfZmlsZXMgOj0KKyAgICBpZmVxICgsJChfbXVzdF9wcm90b2J1ZikkKFJFTEVBU0VfQlVJTERfRkxBR1NfSU5fUFJPVE9CVUYpKQorICAgICAgICBfdXNlX3Byb3RvYnVmIDo9CisgICAgZWxzZQorICAgICAgICBfYmFzZV9hbGxfcmVsZWFzZSA6PSBhbGxfcmVsZWFzZV9jb25maWdzLSQoVEFSR0VUX1BST0RVQ1QpCisgICAgICAgICQoY2FsbCBkaXN0LWZvci1nb2Fscyxkcm9pZCxcCisgICAgICAgICAgICAkKF9mbGFnc19kaXIpLyQoX2Jhc2VfYWxsX3JlbGVhc2UpLnBiOmJ1aWxkX2ZsYWdzL2FsbF9yZWxlYXNlX2NvbmZpZ3MucGIgXAorICAgICAgICAgICAgJChfZmxhZ3NfZGlyKS8kKF9iYXNlX2FsbF9yZWxlYXNlKS50ZXh0cHJvdG86YnVpbGRfZmxhZ3MvYWxsX3JlbGVhc2VfY29uZmlncy50ZXh0cHJvdG8gXAorICAgICAgICAgICAgJChfZmxhZ3NfZGlyKS8kKF9iYXNlX2FsbF9yZWxlYXNlKS5qc29uOmJ1aWxkX2ZsYWdzL2FsbF9yZWxlYXNlX2NvbmZpZ3MuanNvbiBcCisgICAgICAgICAgICAkKF9mbGFnc19kaXIpL2luaGVyaXRhbmNlX2dyYXBoLSQoVEFSR0VUX1BST0RVQ1QpLmRvdDpidWlsZF9mbGFncy9pbmhlcml0YW5jZV9ncmFwaC0kKFRBUkdFVF9QUk9EVUNUKS5kb3QgXAorICAgICAgICApCisjIFRoZXNlIGFyZSBhbHdheXMgY3JlYXRlZCwgYWRkIGFuIGVtcHR5IHJ1bGUgZm9yIHRoZW0gdG8ga2VlcCBuaW5qYSBoYXBweS4KKyQoX2ZsYWdzX2RpcikvaW5oZXJpdGFuY2VfZ3JhcGgtJChUQVJHRVRfUFJPRFVDVCkuZG90OgorCTogY3JlYXRlZCBieSAkKE9VVF9ESVIpL3JlbGVhc2UtY29uZmlnCiskKF9mbGFnc19kaXIpLyQoX2Jhc2VfYWxsX3JlbGVhc2UpLnBiICQoX2ZsYWdzX2RpcikvJChfYmFzZV9hbGxfcmVsZWFzZSkudGV4dHByb3RvICQoX2ZsYWdzX2RpcikvJChfYmFzZV9hbGxfcmVsZWFzZSkuanNvbjoKKwk6IGNyZWF0ZWQgYnkgJChPVVRfRElSKS9yZWxlYXNlLWNvbmZpZworICAgICAgICBfYmFzZV9hbGxfcmVsZWFzZSA6PQorICAgIGVuZGlmCisgICAgX2ZsYWdzX2Rpcjo9CisgICAgX2ZsYWdzX2ZpbGU6PQorICAgIF9mbGFnc192YXJtazo9CitlbmRpZgoraWZlcSAoLCQoX3VzZV9wcm90b2J1ZikpCisgICAgIyBUaGUgLm1rIGZpbGVzIGFyZSB0aGUgY2Fub25pY2FsIHNvdXJjZSBvZiB0cnV0aC4KKworCisjIERlY2xhcmUgYW4gYWxpYXMgcmVsZWFzZS1jb25maWcKKyMKKyMgVGhpcyBzaG91bGQgYmUgdXNlZCB0byBkZWNsYXJlIGEgcmVsZWFzZSBhcyBhbiBhbGlhcyBvZiBhbm90aGVyLCBtZWFuaW5nIG5vCisjIHJlbGVhc2UgY29uZmlnIGZpbGVzIHNob3VsZCBiZSBwcmVzZW50LgorIworIyAkMSBjb25maWcgbmFtZQorIyAkMiByZWxlYXNlIGNvbmZpZyBmb3Igd2hpY2ggaXQgaXMgYW4gYWxpYXMKK2RlZmluZSBhbGlhcy1yZWxlYXNlLWNvbmZpZworICAgICQoY2FsbCBfZGVjbGFyZS1yZWxlYXNlLWNvbmZpZywkKDEpLCwkKDIpLHRydWUpCitlbmRlZgorCisjIERlY2xhcmUgb3IgZXh0ZW5kIGEgcmVsZWFzZS1jb25maWcuCisjCisjIFRoZSBvcmRlciBvZiBwcm9jZXNzaW5nIGlzOgorIyAxLiBSZWN1cnNpdmVseSBhcHBseSBhbnkgb3ZlcnJpZGRlbiByZWxlYXNlIGNvbmZpZ3MuICBPbmx5IGFwcGx5IGVhY2ggY29uZmlnCisjICAgIHRoZSBmaXJzdCB0aW1lIHdlIHJlYWNoIGl0LgorIyAyLiBBcHBseSBhbnkgZmlsZXMgZm9yIHRoaXMgcmVsZWFzZSBjb25maWcsIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgYWRkZWQgdG8KKyMgICAgdGhlIGRlY2xhcmF0aW9uLgorIworIyBFeGFtcGxlOgorIyAgIFdpdGggdGhlc2UgZGVjbGFyYXRpb25zOgorIyAgICAgJChkZWNsYXJlLXJlbGVhc2UtY29uZmlnIGZvbywgZm9vLnNjbCkKKyMgICAgICQoZGVjbGFyZS1yZWxlYXNlLWNvbmZpZyBiYXIsIGJhci5zY2wsIGZvbykKKyMgICAgICQoZGVjbGFyZS1yZWxlYXNlLWNvbmZpZyBiYXosIGJhei5zY2wsIGJhcikKKyMgICAgICQoZGVjbGFyZS1yZWxlYXNlLWNvbmZpZyBiaWYsIGJpZi5zY2wsIGZvbyBiYXopCisjICAgICAkKGRlY2xhcmUtcmVsZWFzZS1jb25maWcgYm9wLCBib3Auc2NsLCBiYXIgYmF6KQorIworIyAgIFRBUkdFVF9SRUxFQVNFOgorIyAgICAgLSBiYXIgd2lsbCB1c2U6IGZvby5zY2wgYmFyLnNjbAorIyAgICAgLSBiYXogd2lsbCB1c2U6IGZvby5zY2wgYmFyLnNjbCBiYXouc2NsCisjICAgICAtIGJpZiB3aWxsIHVzZTogZm9vLnNjbCBiYXIuc2NsIGJhei5zY2wgYmlmLnNjbAorIyAgICAgLSBib3Agd2lsbCB1c2U6IGZvby5zY2wgYmFyLnNjbCBiYXouc2NsIGJvcC5zY2wKKyMKKyMgJDEgY29uZmlnIG5hbWUKKyMgJDIgcmVsZWFzZSBjb25maWcgZmlsZXMKKyMgJDMgb3ZlcnJpZGRlbiByZWxlYXNlIGNvbmZpZworZGVmaW5lIGRlY2xhcmUtcmVsZWFzZS1jb25maWcKKyAgICAkKGNhbGwgX2RlY2xhcmUtcmVsZWFzZS1jb25maWcsJCgxKSwkKDIpLCQoMyksKQorZW5kZWYKKworZGVmaW5lIF9kZWNsYXJlLXJlbGVhc2UtY29uZmlnCisgICAgJChpZiAkKHN0cmlwICQoMikkKDMpKSwsICBcCisgICAgICAgICQoZXJyb3IgZGVjbGFyZS1yZWxlYXNlLWNvbmZpZzogY29uZmlnICQoc3RyaXAgJCgxKSkgbXVzdCBoYXZlIHJlbGVhc2UgY29uZmlnIGZpbGVzLCBvdmVycmlkZSBhbm90aGVyIHJlbGVhc2UgY29uZmlnLCBvciBib3RoKSBcCisgICAgKQorICAgICQoaWYgJChzdHJpcCAkKDQpKSwkKGV2YWwgX2FsbF9yZWxlYXNlX2NvbmZpZ3MuJChzdHJpcCAkKDEpKS5BTElBUyA6PSB0cnVlKSkKKyAgICAkKGV2YWwgQUxMX1JFTEVBU0VfQ09ORklHU19GT1JfUFJPRFVDVCA6PSAkKHNvcnQgJChBTExfUkVMRUFTRV9DT05GSUdTX0ZPUl9QUk9EVUNUKSAkKHN0cmlwICQoMSkpKSkKKyAgICAkKGlmICQoc3RyaXAgJCgzKSksIFwKKyAgICAgICQoaWYgJChmaWx0ZXIgJChBTExfUkVMRUFTRV9DT05GSUdTX0ZPUl9QUk9EVUNUKSwgJChzdHJpcCAkKDMpKSksCisgICAgICAgICQoaWYgJChmaWx0ZXIgJChfYWxsX3JlbGVhc2VfY29uZmlncy4kKHN0cmlwICQoMSkpLk9WRVJSSURFUyksJChzdHJpcCAkKDMpKSksLAorICAgICAgICAgICQoZXZhbCBfYWxsX3JlbGVhc2VfY29uZmlncy4kKHN0cmlwICQoMSkpLk9WRVJSSURFUyA6PSAkKF9hbGxfcmVsZWFzZV9jb25maWdzLiQoc3RyaXAgJCgxKSkuT1ZFUlJJREVTKSAkKHN0cmlwICQoMykpKSksIFwKKyAgICAgICAgJChlcnJvciBObyByZWxlYXNlIGNvbmZpZyAkKHN0cmlwICQoMykpKSBcCisgICAgICApIFwKKyAgICApCisgICAgJChldmFsIF9hbGxfcmVsZWFzZV9jb25maWdzLiQoc3RyaXAgJCgxKSkuREVDTEFSRURfSU4gOj0gJChfaW5jbHVkZWQpICQoX2FsbF9yZWxlYXNlX2NvbmZpZ3MuJChzdHJpcCAkKDEpKS5ERUNMQVJFRF9JTikpCisgICAgJChldmFsIF9hbGxfcmVsZWFzZV9jb25maWdzLiQoc3RyaXAgJCgxKSkuRklMRVMgOj0gJChfYWxsX3JlbGVhc2VfY29uZmlncy4kKHN0cmlwICQoMSkpLkZJTEVTKSAkKHN0cmlwICQoMikpKQorZW5kZWYKKworIyBJbmNsdWRlIHRoZSBjb25maWcgbWFwIGZpbGVzIGFuZCBwb3B1bGF0ZSBfZmxhZ19kZWNsYXJhdGlvbl9maWxlcy4KKyMgSWYgdGhlIGZpbGUgaXMgZm91bmQgbW9yZSB0aGFuIG9uY2UsIG9ubHkgaW5jbHVkZSBpdCB0aGUgZmlyc3QgdGltZS4KK19mbGFnX2RlY2xhcmF0aW9uX2ZpbGVzIDo9CitfaW5jbHVkZWRfY29uZmlnX21hcF9maWxlcyA6PQorJChmb3JlYWNoIGYsICQoY29uZmlnX21hcF9maWxlcyksIFwKKyAgICAkKGV2YWwgRkxBR19ERUNMQVJBVElPTl9GSUxFUzo9ICkgXAorICAgICQoaWYgJChmaWx0ZXIgJChfaW5jbHVkZWRfY29uZmlnX21hcF9maWxlcyksJChmKSksLFwKKyAgICAgICAgJChldmFsIF9pbmNsdWRlZCA6PSAkKGYpKSBcCisgICAgICAgICQoZXZhbCBpbmNsdWRlICQoZikpIFwKKyAgICAgICAgJChldmFsIF9mbGFnX2RlY2xhcmF0aW9uX2ZpbGVzICs9ICQoRkxBR19ERUNMQVJBVElPTl9GSUxFUykpIFwKKyAgICAgICAgJChldmFsIF9pbmNsdWRlZF9jb25maWdfbWFwX2ZpbGVzICs9ICQoZikpIFwKKyAgICApIFwKKykKK0ZMQUdfREVDTEFSQVRJT05fRklMRVMgOj0KKworIyBWZXJpZnkgdGhhdCBhbGwgaW5oZXJpdGVkL292ZXJyaWRkZW4gcmVsZWFzZSBjb25maWdzIGFyZSBkZWNsYXJlZC4KKyQoZm9yZWFjaCBjb25maWcsJChBTExfUkVMRUFTRV9DT05GSUdTX0ZPUl9QUk9EVUNUKSxcCisgICQoZm9yZWFjaCByLCQoYWxsX3JlbGVhc2VfY29uZmlncy4kKHIpLk9WRVJSSURFUyksXAorICAgICQoaWYgJChzdHJpcCAkKF9hbGxfcmVsZWFzZV9jb25maWdzLiQocikuRklMRVMpJChfYWxsX3JlbGVhc2VfY29uZmlncy4kKHIpLk9WRVJSSURFUykpLCxcCisgICAgJChlcnJvciBSZWxlYXNlIGNvbmZpZyAkKGNvbmZpZykgW2RlY2xhcmVkIGluOiAkKF9hbGxfcmVsZWFzZV9jb25maWdzLiQocikuREVDTEFSRURfSU4pXSBpbmhlcml0cyBmcm9tIG5vbi1leGlzdGVudCAkKHIpLilcCispKSkKKyMgVmVyaWZ5IHRoYXQgYWxpYXMgY29uZmlncyBkbyBub3QgaGF2ZSBjb25maWcgZmlsZXMuCiskKGZvcmVhY2ggciwkKEFMTF9SRUxFQVNFX0NPTkZJR1NfRk9SX1BST0RVQ1QpLFwKKyAgJChpZiAkKF9hbGxfcmVsZWFzZV9jb25maWdzLiQocikuQUxJQVMpLCQoaWYgJChfYWxsX3JlbGVhc2VfY29uZmlncy4kKHIpLkZJTEVTKSxcCisgICAgJChlcnJvciBBbGlhcyByZWxlYXNlIGNvbmZpZyAiJChyKSIgbWF5IG5vdCBzcGVjaWZ5IHJlbGVhc2UgY29uZmlnIGZpbGVzICQoX2FsbF9yZWxlYXNlX2NvbmZpZ3MuJChyKS5GSUxFUykpXAorKSkpCisKKyMgVXNlIG1ha2VmaWxlcworZW5kaWYKKworaWZlcSAoJChUQVJHRVRfUkVMRUFTRSksKQorICAgICMgV2UgYWxsb3cgc29tZSBpbnRlcm5hbCBwYXRocyB0byBleHBsaWNpdGx5IHNldCBUQVJHRVRfUkVMRUFTRSB0byB0aGUKKyAgICAjIGVtcHR5IHN0cmluZy4gIEZvciB0aGUgbW9zdCBwYXJ0LCAnbWFrZScgdHJlYXRzIHVuc2V0IGFuZCBlbXB0eSBzdHJpbmcgYXMKKyAgICAjIHRoZSBzYW1lLiAgQnV0IHRoZSBmb2xsb3dpbmcgbGluZSBkaWZmZXJlbnRpYXRlcywgYW5kIHdpbGwgb25seSBhc3NpZ24KKyAgICAjIGlmIHRoZSB2YXJpYWJsZSB3YXMgY29tcGxldGVseSB1bnNldC4KKyAgICBUQVJHRVRfUkVMRUFTRSA/PSB3YXNfdW5zZXQKKyAgICBpZmVxICgkKFRBUkdFVF9SRUxFQVNFKSx3YXNfdW5zZXQpCisgICAgICAgICQoZXJyb3IgTm8gcmVsZWFzZSBjb25maWcgc2V0IGZvciB0YXJnZXQ7IHBsZWFzZSBzZXQgVEFSR0VUX1JFTEVBU0UsIG9yIGlmIGJ1aWxkaW5nIG9uIHRoZSBjb21tYW5kIGxpbmUgdXNlICdsdW5jaCA8dGFyZ2V0Pi08cmVsZWFzZT4tPGJ1aWxkX3R5cGU+Jywgd2hlcmUgcmVsZWFzZSBpcyBvbmUgb2Y6ICQoQUxMX1JFTEVBU0VfQ09ORklHU19GT1JfUFJPRFVDVCkpCisgICAgZW5kaWYKKyAgICAjIEluc3RlYWQgb2YgbGVhdmluZyB0aGlzIHN0cmluZyBlbXB0eSwgd2Ugd2FudCB0byBkZWZhdWx0IHRvIGEgdmFsaWQKKyAgICAjIHNldHRpbmcuICBGdWxsIGJ1aWxkcyBjb21pbmcgdGhyb3VnaCB0aGlzIHBhdGggaXMgYSBidWcsIGJ1dCBpbiBjYXNlCisgICAgIyBvZiBzdWNoIGEgYnVnLCB3ZSB3YW50IHRvIGF0IGxlYXN0IGdldCBjb25zaXN0ZW50LCB2YWxpZCByZXN1bHRzLgorICAgIFRBUkdFVF9SRUxFQVNFID0gdHJ1bmtfc3RhZ2luZworZW5kaWYKKworIyBEdXJpbmcgcGFzcyAxIG9mIHByb2R1Y3QgY29uZmlnLCB1c2luZyBhIG5vbi1leGlzdGVudCByZWxlYXNlIGNvbmZpZyBpcyBub3QgYW4gZXJyb3IuCisjIFdlIGNhbiBzYWZlbHkgYXNzdW1lIHRoYXQgd2UgYXJlIGRvaW5nIHBhc3MgMSBpZiBEVU1QX01BTllfVkFSUz09IlBST0RVQ1RfUkVMRUFTRV9DT05GSUdfTUFQUyIuCitpZm5lcSAoLCQoX2ZpbmFsX3Byb2R1Y3RfY29uZmlnX3Bhc3MpKQorICAgIGlmZXEgKCQoZmlsdGVyICQoQUxMX1JFTEVBU0VfQ09ORklHU19GT1JfUFJPRFVDVCksICQoVEFSR0VUX1JFTEVBU0UpKSwpCisgICAgICAgICQoZXJyb3IgTm8gcmVsZWFzZSBjb25maWcgZm91bmQgZm9yIFRBUkdFVF9SRUxFQVNFOiAkKFRBUkdFVF9SRUxFQVNFKS4gQXZhaWxhYmxlIHJlbGVhc2VzIGFyZTogJChBTExfUkVMRUFTRV9DT05GSUdTX0ZPUl9QUk9EVUNUKSkKKyAgICBlbmRpZgorZW5kaWYKKworaWZlcSAoLCQoX3VzZV9wcm90b2J1ZikpCisjIENob29zZSBmbGFnIGZpbGVzCisjIERvbid0IHNvcnQgdGhpcywgdXNlIGl0IGluIHRoZSBvcmRlciB0aGV5IGdhdmUgdXMuCisjIERvIGFsbG93IGR1cGxpY2F0ZSBlbnRyaWVzLCByZXRhaW5pbmcgb25seSB0aGUgZmlyc3QgdXNhZ2UuCitmbGFnX3ZhbHVlX2ZpbGVzIDo9CisKKyMgQXBwbHkgb3ZlcnJpZGVzIHJlY3Vyc2l2ZWx5CisjCisjICQxIHJlbGVhc2UgY29uZmlnIHRoYXQgd2Ugb3ZlcnJpZGUKK2FwcGxpZWRfcmVsZWFzZXMgOj0KK2RlZmluZSBfYXBwbHktcmVsZWFzZS1jb25maWctb3ZlcnJpZGVzCiskKGZvcmVhY2ggciwkKDEpLCBcCisgICQoaWYgJChmaWx0ZXIgJChyKSwkKGFwcGxpZWRfcmVsZWFzZXMpKSwsIFwKKyAgICAkKGZvcmVhY2ggbywkKF9hbGxfcmVsZWFzZV9jb25maWdzLiQocikuT1ZFUlJJREVTKSwkKGNhbGwgX2FwcGx5LXJlbGVhc2UtY29uZmlnLW92ZXJyaWRlcywkKG8pKSlcCisgICAgJChldmFsIGFwcGxpZWRfcmVsZWFzZXMgKz0gJChyKSlcCisgICAgJChmb3JlYWNoIGYsJChfYWxsX3JlbGVhc2VfY29uZmlncy4kKHIpLkZJTEVTKSwgXAorICAgICAgJChpZiAkKGZpbHRlciAkKGYpLCQoZmxhZ192YWx1ZV9maWxlcykpLCwkKGV2YWwgZmxhZ192YWx1ZV9maWxlcyArPSAkKGYpKSlcCisgICAgKVwKKyAgKVwKKykKK2VuZGVmCiskKGNhbGwgX2FwcGx5LXJlbGVhc2UtY29uZmlnLW92ZXJyaWRlcywkKFRBUkdFVF9SRUxFQVNFKSkKKyMgVW5zZXQgdmFyaWFibGVzIHNvIHRoZXkgY2FuJ3QgdXNlIHRoZW0KK2RlZmluZSBkZWNsYXJlLXJlbGVhc2UtY29uZmlnCiskKGVycm9yIGRlY2xhcmUtcmVsZWFzZS1jb25maWcgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gaW5zaWRlIHJlbGVhc2VfY29uZmlnX21hcC5tayBmaWxlcykKK2VuZGVmCitkZWZpbmUgX2FwcGx5LXJlbGVhc2UtY29uZmlnLW92ZXJyaWRlcworJChlcnJvciBpbnZhbGlkIHVzZSBvZiBhcHBseS1yZWxlYXNlLWNvbmZpZy1vdmVycmlkZXMpCitlbmRlZgorCisjIHVzZSBtYWtlZmlsZXMKK2VuZGlmCisKKyMgVE9ETzogUmVtb3ZlIHRoaXMgY2hlY2sgYWZ0ZXIgZW5vdWdoIHBlb3BsZSBoYXZlIHNvdXJjZWQgbHVuY2ggdGhhdCB3ZSBkb24ndAorIyBuZWVkIHRvIHdvcnJ5IGFib3V0IGl0IHRyeWluZyB0byBkbyBnZXRfYnVpbGRfdmFycyBUQVJHRVRfUkVMRUFTRS4gTWF5YmUgYWZ0ZXIgfjkvMjAyMworaWZuZXEgKCQoQ0FMTEVEX0ZST01fU0VUVVApLHRydWUpCitkZWZpbmUgVEFSR0VUX1JFTEVBU0UKKyQoZXJyb3IgVEFSR0VUX1JFTEVBU0UgbWF5IG5vdCBiZSBhY2Nlc3NlZCBkaXJlY3RseS4gVXNlIGluZGl2aWR1YWwgZmxhZ3MuKQorZW5kZWYKK2Vsc2UKK1RBUkdFVF9SRUxFQVNFOj0KK2VuZGlmCisuS0FUSV9SRUFET05MWSA6PSBUQVJHRVRfUkVMRUFTRQorCitpZmVxICgsJChfdXNlX3Byb3RvYnVmKSkKKyQoZm9yZWFjaCBjb25maWcsICQoQUxMX1JFTEVBU0VfQ09ORklHU19GT1JfUFJPRFVDVCksIFwKKyAgICAkKGV2YWwgX2FsbF9yZWxlYXNlX2NvbmZpZ3MuJChjb25maWcpLkRFQ0xBUkVEX0lOOj0gKSBcCisgICAgJChldmFsIF9hbGxfcmVsZWFzZV9jb25maWdzLiQoY29uZmlnKS5GSUxFUzo9ICkgXAorKQorYXBwbGllZF9yZWxlYXNlczo9CisjIHVzZSBtYWtlZmlsZXMKK2VuZGlmCitjb25maWdfbWFwX2ZpbGVzOj0KK3Byb3RvYnVmX21hcF9maWxlczo9CisKKworaWZlcSAoLCQoX3VzZV9wcm90b2J1ZikpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZsYWcgZGVjbGFyYXRpb25zIGFuZCB2YWx1ZXMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhpcyBwYXJ0IGlzIGluIHN0YXJsYXJrLiAgV2UgZ2VuZXJhdGUgYSByb290IHN0YXJsYXJrIGZpbGUgdGhhdCBsb2FkcworIyBhbGwgb2YgdGhlIGZsYWdzIGRlY2xhcmF0aW9uIGZpbGVzIHRoYXQgd2UgZm91bmQsIGFuZCB0aGUgZmxhZ192YWx1ZV9maWxlcworIyB0aGF0IHdlIGNob3NlIGZyb20gdGhlIGNvbmZpZyBtYXAgYWJvdmUuICBUaGVuIHdlIHJ1biB0aGF0LCBhbmQgbG9hZCB0aGUKKyMgcmVzdWx0cyBvZiB0aGF0IGludG8gdGhlIG1ha2UgZW52aXJvbm1lbnQuCisKKyMgX2ZsYWdfZGVjbGFyYXRpb25fZmlsZXMgaXMgdGhlIGNvbWJpbmVkIGxpc3Qgb2YgRkxBR19ERUNMQVJBVElPTl9GSUxFUyBzZXQgYnkKKyMgcmVsZWFzZV9jb25maWdfbWFwLm1rIGZpbGVzIGFib3ZlLgorCisjIEJlY2F1c2Ugc3RhcmxhcmsgY2FuJ3QgZmluZCBmaWxlcyB3aXRoICQod2lsZGNhcmQpLCB3cml0ZSBhbiBlbnRyeXBvaW50IHN0YXJsYXJrIHNjcmlwdCB0aGF0CisjIGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIGFib3ZlIHdpbGRjYXJkcyBmb3IgdGhlIHN0YXJsYXJrIGNvZGUgdG8gdXNlLgorZmlsZW5hbWVfdG9fc3Rhcmxhcms9JChzdWJzdCAvLF8sJChzdWJzdCAuLF8sJCgxKSkpCitfYzo9bG9hZCgiLy9idWlsZC9tYWtlL2NvcmUvcmVsZWFzZV9jb25maWcuc2NsIiwgInJlbGVhc2VfY29uZmlnIikKK19jKz0kKG5ld2xpbmUpZGVmIGFkZChkLCBrLCB2KToKK19jKz0kKG5ld2xpbmUpJChzcGFjZSlkID0gZGljdChkKQorX2MrPSQobmV3bGluZSkkKHNwYWNlKWRba10gPSB2CitfYys9JChuZXdsaW5lKSQoc3BhY2UpcmV0dXJuIGQKK19jKz0kKGZvcmVhY2ggZiwkKF9mbGFnX2RlY2xhcmF0aW9uX2ZpbGVzKSwkKG5ld2xpbmUpbG9hZCgiJChmKSIsIGZsYWdzXyQoY2FsbCBmaWxlbmFtZV90b19zdGFybGFyaywkKGYpKSA9ICJmbGFncyIpKQorX2MrPSQobmV3bGluZSlhbGxfZmxhZ3MgPSBbXSAkKGZvcmVhY2ggZiwkKF9mbGFnX2RlY2xhcmF0aW9uX2ZpbGVzKSwrIFthZGQoeCwgImRlY2xhcmVkX2luIiwgIiQoZikiKSBmb3IgeCBpbiBmbGFnc18kKGNhbGwgZmlsZW5hbWVfdG9fc3RhcmxhcmssJChmKSldKQorX2MrPSQoZm9yZWFjaCBmLCQoZmxhZ192YWx1ZV9maWxlcyksJChuZXdsaW5lKWxvYWQoIi8vJChmKSIsIHZhbHVlc18kKGNhbGwgZmlsZW5hbWVfdG9fc3RhcmxhcmssJChmKSkgPSAidmFsdWVzIikpCitfYys9JChuZXdsaW5lKWFsbF92YWx1ZXMgPSBbXSAkKGZvcmVhY2ggZiwkKGZsYWdfdmFsdWVfZmlsZXMpLCsgW2FkZCh4LCAic2V0X2luIiwgIiQoZikiKSBmb3IgeCBpbiB2YWx1ZXNfJChjYWxsIGZpbGVuYW1lX3RvX3N0YXJsYXJrLCQoZikpXSkKK19jKz0kKG5ld2xpbmUpdmFyaWFibGVzX3RvX2V4cG9ydF90b19tYWtlID0gcmVsZWFzZV9jb25maWcoYWxsX2ZsYWdzLCBhbGxfdmFsdWVzKQorJChmaWxlID4kKE9VVF9ESVIpL3JlbGVhc2VfY29uZmlnX2VudHJ5cG9pbnQuc2NsLCQoX2MpKQorX2M6PQorZmlsZW5hbWVfdG9fc3Rhcmxhcms6PQorCisjIEV4Y2x1ZGUgdGhlIGVudHJ5cG9pbnQgZmlsZSBhcyBhIGRlcGVuZGVuY3kgKGJ5IHBhc3NpbmcgaXQgYXMgdGhlIDJuZCBhcmd1bWVudCkgc28gdGhhdCB3ZSBkb24ndAorIyByZXJ1biBrYXRpIGV2ZXJ5IGJ1aWxkLiBLYXRpIHdpbGwgcmVwbGF5IHRoZSAkKGZpbGUpIGNvbW1hbmQgdGhhdCBnZW5lcmF0ZXMgaXQgZXZlcnkgYnVpbGQsCisjIHVwZGF0aW5nIGl0cyB0aW1lc3RhbXAuCisjCisjIFdlIGFsc28gbmVlZCB0byBwYXNzIC0tYWxsb3dfZXh0ZXJuYWxfZW50cnlwb2ludCB0byByYmNydW4gaW4gY2FzZSB0aGUgT1VUX0RJUiBpcyBzZXQgdG8gc29tZXRoaW5nCisjIG91dHNpZGUgb2YgdGhlIHNvdXJjZSB0cmVlLgorJChjYWxsIHJ1bi1zdGFybGFyaywkKE9VVF9ESVIpL3JlbGVhc2VfY29uZmlnX2VudHJ5cG9pbnQuc2NsLCQoT1VUX0RJUikvcmVsZWFzZV9jb25maWdfZW50cnlwb2ludC5zY2wsLS1hbGxvd19leHRlcm5hbF9lbnRyeXBvaW50KQorCisjIHVzZSBtYWtlZmlsZXMKK2VuZGlmCitfY2FuX3Byb3RvYnVmIDo9CitfbXVzdF9wcm90b2J1ZiA6PQorX3VzZV9wcm90b2J1ZiA6PQorCmRpZmYgLS1naXQgYS9jb3JlL3JlbGVhc2VfY29uZmlnLnNjbCBiL2NvcmUvcmVsZWFzZV9jb25maWcuc2NsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ODE1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3JlbGVhc2VfY29uZmlnLnNjbApAQCAtMCwwICsxLDI0MyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyIiIgorRXhwb3J0IGJ1aWxkIGZsYWdzICh3aXRoIHZhbHVlcykgdG8gbWFrZS4KKyIiIgorCitsb2FkKCIvL2J1aWxkL2JhemVsL3V0aWxzOnNjaGVtYV92YWxpZGF0aW9uLnNjbCIsICJ2YWxpZGF0ZSIpCisKKyMgUGFydGl0aW9ucyB0aGF0IGdldCBidWlsZCBzeXN0ZW0gZmxhZyBzdW1tYXJpZXMKK19mbGFnX3BhcnRpdGlvbnMgPSBbCisgICAgInByb2R1Y3QiLAorICAgICJzeXN0ZW0iLAorICAgICJzeXN0ZW1fZXh0IiwKKyAgICAidmVuZG9yIiwKK10KKworQUxMID0gWyJhbGwiXQorUFJPRFVDVCA9IFsicHJvZHVjdCJdCitTWVNURU0gPSBbInN5c3RlbSJdCitTWVNURU1fRVhUID0gWyJzeXN0ZW1fZXh0Il0KK1ZFTkRPUiA9IFsidmVuZG9yIl0KKworX3ZhbGlkX3R5cGVzID0gWyJOb25lVHlwZSIsICJib29sIiwgImxpc3QiLCAic3RyaW5nIiwgImludCJdCisKK19hbGxfZmxhZ3Nfc2NoZW1hID0geworICAgICJ0eXBlIjogImxpc3QiLAorICAgICJvZiI6IHsKKyAgICAgICAgInR5cGUiOiAiZGljdCIsCisgICAgICAgICJyZXF1aXJlZF9rZXlzIjogeworICAgICAgICAgICAgIm5hbWUiOiB7InR5cGUiOiAic3RyaW5nIn0sCisgICAgICAgICAgICAicGFydGl0aW9ucyI6IHsKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJsaXN0IiwKKyAgICAgICAgICAgICAgICAib2YiOiB7CisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICJjaG9pY2VzIjogX2ZsYWdfcGFydGl0aW9ucyArIFsiYWxsIl0sCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAidW5pcXVlIjogVHJ1ZSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiZGVmYXVsdCI6IHsKKyAgICAgICAgICAgICAgICAib3IiOiBbCisgICAgICAgICAgICAgICAgICAgIHsidHlwZSI6IHR9CisgICAgICAgICAgICAgICAgICAgIGZvciB0IGluIF92YWxpZF90eXBlcworICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgIm9yaWdpbiI6IHsidHlwZSI6ICJzdHJpbmcifSwKKyAgICAgICAgICAgICJkZWNsYXJlZF9pbiI6IHsidHlwZSI6ICJzdHJpbmcifSwKKyAgICAgICAgfSwKKyAgICAgICAgIm9wdGlvbmFsX2tleXMiOiB7CisgICAgICAgICAgICAiYXBwZW5kcyI6IHsKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgfSwKK30KKworX2FsbF92YWx1ZXNfc2NoZW1hID0geworICAgICJ0eXBlIjogImxpc3QiLAorICAgICJvZiI6IHsKKyAgICAgICAgInR5cGUiOiAiZGljdCIsCisgICAgICAgICJyZXF1aXJlZF9rZXlzIjogeworICAgICAgICAgICAgIm5hbWUiOiB7InR5cGUiOiAic3RyaW5nIn0sCisgICAgICAgICAgICAidmFsdWUiOiB7CisgICAgICAgICAgICAgICAgIm9yIjogWworICAgICAgICAgICAgICAgICAgICB7InR5cGUiOiB0fQorICAgICAgICAgICAgICAgICAgICBmb3IgdCBpbiBfdmFsaWRfdHlwZXMKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJzZXRfaW4iOiB7InR5cGUiOiAic3RyaW5nIn0sCisgICAgICAgIH0sCisgICAgfSwKK30KKworZGVmIGZsYWcobmFtZSwgcGFydGl0aW9ucywgZGVmYXVsdCwgKiwgb3JpZ2luID0gIlVua25vd24iLCBhcHBlbmRzID0gRmFsc2UpOgorICAgICIiIkRlY2xhcmUgYSBmbGFnLgorCisgICAgQXJnczoKKyAgICAgIG5hbWU6IG5hbWUgb2YgdGhlIGZsYWcKKyAgICAgIHBhcnRpdGlvbnM6IHRoZSBwYXJ0aXRpb25zIHdoZXJlIHRoaXMgc2hvdWxkIGJlIHJlY29yZGVkLgorICAgICAgZGVmYXVsdDogdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGZsYWcuCisgICAgICBvcmlnaW46IFRoZSBvcmlnaW4gb2YgdGhpcyBmbGFnLgorICAgICAgYXBwZW5kczogV2hldGhlciBuZXcgdmFsdWVzIHNob3VsZCBiZSBhcHBlbmQgKG5vdCByZXBsYWNlKSB0aGUgb2xkLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBmbGFnIGRlY2xhcmF0aW9uLgorICAgICIiIgorICAgIGlmIG5vdCBwYXJ0aXRpb25zOgorICAgICAgICBmYWlsKCJBdCBsZWFzdCAxIHBhcnRpdGlvbiBpcyByZXF1aXJlZCIpCisgICAgaWYgbm90IG5hbWUuc3RhcnRzd2l0aCgiUkVMRUFTRV8iKToKKyAgICAgICAgZmFpbCgiUmVsZWFzZSBmbGFnIG5hbWVzIG11c3Qgc3RhcnQgd2l0aCBSRUxFQVNFXyIpCisgICAgaWYgIiAiIGluIG5hbWUgb3IgIlx0IiBpbiBuYW1lIG9yICJcbiIgaW4gbmFtZToKKyAgICAgICAgZmFpbCgiRmxhZyBuYW1lcyBtdXN0IG5vdCBjb250YWluIHdoaXRlc3BhY2U6IFwiIiArIG5hbWUgKyAiXCIiKQorICAgIGZvciBwYXJ0aXRpb24gaW4gcGFydGl0aW9uczoKKyAgICAgICAgaWYgcGFydGl0aW9uID09ICJhbGwiOgorICAgICAgICAgICAgaWYgbGVuKHBhcnRpdGlvbnMpID4gMToKKyAgICAgICAgICAgICAgICBmYWlsKCJcImFsbFwiIGNhbid0IGJlIGNvbWJpbmVkIHdpdGggb3RoZXIgcGFydGl0aW9uczogIiArIHN0cihwYXJ0aXRpb25zKSkKKyAgICAgICAgZWxpZiBwYXJ0aXRpb24gbm90IGluIF9mbGFnX3BhcnRpdGlvbnM6CisgICAgICAgICAgICBmYWlsKCJJbnZhbGlkIHBhcnRpdGlvbjogIiArIHBhcnRpdGlvbiArICIsIGFsbG93ZWQgcGFydGl0aW9uczogIiArCisgICAgICAgICAgICAgICAgIHN0cihfZmxhZ19wYXJ0aXRpb25zKSkKKyAgICBpZiB0eXBlKGRlZmF1bHQpIG5vdCBpbiBfdmFsaWRfdHlwZXM6CisgICAgICAgIGZhaWwoIkludmFsaWQgdHlwZSBvZiBkZWZhdWx0IGZvciBmbGFnIFwiIiArIG5hbWUgKyAiXCIgKCIgKyB0eXBlKGRlZmF1bHQpICsgIikiKQorICAgIHJldHVybiB7CisgICAgICAgICJuYW1lIjogbmFtZSwKKyAgICAgICAgInBhcnRpdGlvbnMiOiBwYXJ0aXRpb25zLAorICAgICAgICAiZGVmYXVsdCI6IGRlZmF1bHQsCisgICAgICAgICJhcHBlbmRzIjogYXBwZW5kcywKKyAgICAgICAgIm9yaWdpbiI6IG9yaWdpbiwKKyAgICB9CisKK2RlZiB2YWx1ZShuYW1lLCB2YWx1ZSk6CisgICAgIiIiRGVmaW5lIHRoZSBmbGFnIHZhbHVlIGZvciBhIHBhcnRpY3VsYXIgY29uZmlndXJhdGlvbi4KKworICAgIEFyZ3M6CisgICAgICBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgZmxhZy4KKyAgICAgIHZhbHVlOiBUaGUgdmFsdWUgZm9yIHRoZSBmbGFnLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBuYW1lIGFuZCB2YWx1ZSB0byBiZSB1c2VkLgorICAgICIiIgorICAgIHJldHVybiB7CisgICAgICAgICJuYW1lIjogbmFtZSwKKyAgICAgICAgInZhbHVlIjogdmFsdWUsCisgICAgfQorCitkZWYgX2Zvcm1hdF92YWx1ZSh2YWwpOgorICAgICIiIkZvcm1hdCB0aGUgc3RhcmxhcmsgdHlwZSBjb3JyZWN0bHkgZm9yIG1ha2UuCisKKyAgICBBcmdzOgorICAgICAgdmFsOiBUaGUgdmFsdWUgdG8gZm9ybWF0CisKKyAgICBSZXR1cm5zOgorICAgICAgVGhlIHZhbHVlLCBmb3JtYXR0ZWQgY29ycmVjdGx5IGZvciBtYWtlLgorICAgICIiIgorICAgIGlmIHR5cGUodmFsKSA9PSAiTm9uZVR5cGUiOgorICAgICAgICByZXR1cm4gIiIKKyAgICBlbGlmIHR5cGUodmFsKSA9PSAiYm9vbCI6CisgICAgICAgIHJldHVybiAidHJ1ZSIgaWYgdmFsIGVsc2UgIiIKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gdmFsCisKK2RlZiBlcXVhbF9mbGFnX2RlY2xhcmF0aW9uKGZsYWcsIG90aGVyKToKKyAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgZmxhZyBkZWNsYXJhdGlvbnMgYXJlIGVxdWFsLgorCisgICAgQXJnczoKKyAgICAgIGZsYWc6IFRoaXMgZmxhZyBkZWNsYXJhdGlvbi4KKyAgICAgIG90aGVyOiBBbm90aGVyIGZsYWcgZGVjbGFyYXRpb24uCisKKyAgICBSZXR1cm5zOgorICAgICAgV2hldGhlciB0aGUgZGVjbGFyYXRpb25zIGFyZSB0aGUgc2FtZS4KKyAgICAiIiIKKyAgICBmb3Iga2V5IGluICJuYW1lIiwgInBhcnRpdGlvbnMiLCAiZGVmYXVsdCIsICJhcHBlbmRzIjoKKyAgICAgICAgaWYgZmxhZ1trZXldICE9IG90aGVyW2tleV06CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAjIEZvciBub3csIGFsbG93IFVua25vd24gdG8gbWF0Y2ggYW55IG90aGVyIG9yaWdpbi4KKyAgICBpZiBmbGFnWyJvcmlnaW4iXSA9PSAiVW5rbm93biIgb3Igb3RoZXJbIm9yaWdpbiJdID09ICJVbmtub3duIjoKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gZmxhZ1sib3JpZ2luIl0gPT0gb3RoZXJbIm9yaWdpbiJdCisKK2RlZiByZWxlYXNlX2NvbmZpZyhhbGxfZmxhZ3MsIGFsbF92YWx1ZXMpOgorICAgICIiIlJldHVybiB0aGUgbWFrZSB2YXJpYWJsZXMgdGhhdCBzaG91bGQgYmUgc2V0IGZvciB0aGlzIHJlbGVhc2UgY29uZmlnLgorCisgICAgQXJnczoKKyAgICAgIGFsbF9mbGFnczogQSBsaXN0IG9mIGZsYWcgb2JqZWN0cyAoZnJvbSBmbGFnKCkgY2FsbHMpLgorICAgICAgYWxsX3ZhbHVlczogQSBsaXN0IG9mIHZhbHVlIG9iamVjdHMgKGZyb20gdmFsdWUoKSBjYWxscykuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBkaWN0aW9uYXJ5IG9mIHtuYW1lOiB2YWx1ZX0gdmFyaWFibGVzIGZvciBtYWtlLgorICAgICIiIgorICAgIHZhbGlkYXRlKGFsbF9mbGFncywgX2FsbF9mbGFnc19zY2hlbWEpCisgICAgdmFsaWRhdGUoYWxsX3ZhbHVlcywgX2FsbF92YWx1ZXNfc2NoZW1hKQorCisgICAgIyBGaW5hbCB2YWx1ZXMuCisgICAgdmFsdWVzID0ge30KKyAgICAjIFZhbGlkYXRlIGZsYWdzCisgICAgZmxhZ19uYW1lcyA9IFtdCisgICAgZmxhZ3NfZGljdCA9IHt9CisgICAgZm9yIGZsYWcgaW4gYWxsX2ZsYWdzOgorICAgICAgICBuYW1lID0gZmxhZ1sibmFtZSJdCisgICAgICAgIGlmIG5hbWUgaW4gZmxhZ19uYW1lczoKKyAgICAgICAgICAgIGlmIGVxdWFsX2ZsYWdfZGVjbGFyYXRpb24oZmxhZywgZmxhZ3NfZGljdFtuYW1lXSk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZmFpbChmbGFnWyJkZWNsYXJlZF9pbiJdICsgIjogRHVwbGljYXRlIGRlY2xhcmF0aW9uIG9mIGZsYWcgIiArIG5hbWUgKworICAgICAgICAgICAgICAgICAgICAgIiAoZGVjbGFyZWQgZmlyc3QgaW4gIiArIGZsYWdzX2RpY3RbbmFtZV1bImRlY2xhcmVkX2luIl0gKyAiKSIpCisgICAgICAgIGZsYWdfbmFtZXMuYXBwZW5kKG5hbWUpCisgICAgICAgIGZsYWdzX2RpY3RbbmFtZV0gPSBmbGFnCisgICAgICAgICMgU2V0IHRoZSBmbGFnIHZhbHVlIHRvIHRoZSBkZWZhdWx0IHZhbHVlLgorICAgICAgICB2YWx1ZXNbbmFtZV0gPSB7Im5hbWUiOiBuYW1lLCAidmFsdWUiOiBfZm9ybWF0X3ZhbHVlKGZsYWdbImRlZmF1bHQiXSksICJzZXRfaW4iOiBmbGFnWyJkZWNsYXJlZF9pbiJdfQorCisgICAgIyBSZWNvcmQgd2hpY2ggZmxhZ3MgZ28gb24gd2hpY2ggcGFydGl0aW9uCisgICAgcGFydGl0aW9ucyA9IHt9CisgICAgZm9yIGZsYWcgaW4gYWxsX2ZsYWdzOgorICAgICAgICBmb3IgcGFydGl0aW9uIGluIGZsYWdbInBhcnRpdGlvbnMiXToKKyAgICAgICAgICAgIGlmIHBhcnRpdGlvbiA9PSAiYWxsIjoKKyAgICAgICAgICAgICAgICBpZiBsZW4oZmxhZ1sicGFydGl0aW9ucyJdKSA+IDE6CisgICAgICAgICAgICAgICAgICAgIGZhaWwoIlwiYWxsXCIgY2FuJ3QgYmUgY29tYmluZWQgd2l0aCBvdGhlciBwYXJ0aXRpb25zOiAiICsgc3RyKGZsYWdbInBhcnRpdGlvbnMiXSkpCisgICAgICAgICAgICAgICAgZm9yIHBhcnRpdGlvbiBpbiBfZmxhZ19wYXJ0aXRpb25zOgorICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25zLnNldGRlZmF1bHQocGFydGl0aW9uLCBbXSkuYXBwZW5kKGZsYWdbIm5hbWUiXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFydGl0aW9ucy5zZXRkZWZhdWx0KHBhcnRpdGlvbiwgW10pLmFwcGVuZChmbGFnWyJuYW1lIl0pCisKKyAgICAjIEdlbmVyYXRlIGZpbmFsIHZhbHVlcy4KKyAgICAjIE9ubHkgZGVjbGFyZWQgZmxhZ3MgbWF5IGhhdmUgYSB2YWx1ZS4KKyAgICBmb3IgdmFsdWUgaW4gYWxsX3ZhbHVlczoKKyAgICAgICAgbmFtZSA9IHZhbHVlWyJuYW1lIl0KKyAgICAgICAgaWYgbmFtZSBub3QgaW4gZmxhZ19uYW1lczoKKyAgICAgICAgICAgIGZhaWwodmFsdWVbInNldF9pbiJdICsgIjogVmFsdWUgc2V0IGZvciB1bmRlY2xhcmVkIGJ1aWxkIGZsYWc6ICIgKyBuYW1lKQorICAgICAgICBpZiBmbGFnc19kaWN0W25hbWVdWyJhcHBlbmRzIl06CisgICAgICAgICAgICBpZiBuYW1lIGluIHZhbHVlczoKKyAgICAgICAgICAgICAgICB2YWx1ZXNbbmFtZV1bInZhbHVlIl0gKz0gIiAiICsgdmFsdWVbInZhbHVlIl0KKyAgICAgICAgICAgICAgICB2YWx1ZXNbbmFtZV1bInNldF9pbiJdICs9ICIgIiArIHZhbHVlWyJzZXRfaW4iXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB2YWx1ZXNbbmFtZV0gPSB2YWx1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdmFsdWVzW25hbWVdID0gdmFsdWUKKworICAgICMgQ29sbGVjdCB2YWx1ZXMKKyAgICByZXN1bHQgPSB7CisgICAgICAgICJfQUxMX1JFTEVBU0VfRkxBR1MiOiBzb3J0ZWQoZmxhZ19uYW1lcyksCisgICAgfQorICAgIGZvciBwYXJ0aXRpb24sIG5hbWVzIGluIHBhcnRpdGlvbnMuaXRlbXMoKToKKyAgICAgICAgcmVzdWx0WyJfQUxMX1JFTEVBU0VfRkxBR1MuUEFSVElUSU9OUy4iICsgcGFydGl0aW9uXSA9IG5hbWVzCisgICAgZm9yIGZsYWcgaW4gYWxsX2ZsYWdzOgorICAgICAgICB2YWwgPSBfZm9ybWF0X3ZhbHVlKHZhbHVlc1tmbGFnWyJuYW1lIl1dWyJ2YWx1ZSJdKQorICAgICAgICByZXN1bHRbZmxhZ1sibmFtZSJdXSA9IHZhbAorICAgICAgICByZXN1bHRbIl9BTExfUkVMRUFTRV9GTEFHUy4iICsgZmxhZ1sibmFtZSJdICsgIi5QQVJUSVRJT05TIl0gPSBmbGFnWyJwYXJ0aXRpb25zIl0KKyAgICAgICAgcmVzdWx0WyJfQUxMX1JFTEVBU0VfRkxBR1MuIiArIGZsYWdbIm5hbWUiXSArICIuREVGQVVMVCJdID0gX2Zvcm1hdF92YWx1ZShmbGFnWyJkZWZhdWx0Il0pCisgICAgICAgIHJlc3VsdFsiX0FMTF9SRUxFQVNFX0ZMQUdTLiIgKyBmbGFnWyJuYW1lIl0gKyAiLlZBTFVFIl0gPSB2YWwKKyAgICAgICAgcmVzdWx0WyJfQUxMX1JFTEVBU0VfRkxBR1MuIiArIGZsYWdbIm5hbWUiXSArICIuREVDTEFSRURfSU4iXSA9IGZsYWdbImRlY2xhcmVkX2luIl0KKyAgICAgICAgcmVzdWx0WyJfQUxMX1JFTEVBU0VfRkxBR1MuIiArIGZsYWdbIm5hbWUiXSArICIuU0VUX0lOIl0gPSB2YWx1ZXNbZmxhZ1sibmFtZSJdXVsic2V0X2luIl0KKyAgICAgICAgcmVzdWx0WyJfQUxMX1JFTEVBU0VfRkxBR1MuIiArIGZsYWdbIm5hbWUiXSArICIuT1JJR0lOIl0gPSBmbGFnWyJvcmlnaW4iXQorCisgICAgcmV0dXJuIHJlc3VsdApkaWZmIC0tZ2l0IGEvY29yZS9yb2JvbGVjdHJpY190ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwgYi9jb3JlL3JvYm9sZWN0cmljX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbAppbmRleCAxOGY4ZWMwLi4xOTU2YjZlIDEwMDY0NAotLS0gYS9jb3JlL3JvYm9sZWN0cmljX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbAorKysgYi9jb3JlL3JvYm9sZWN0cmljX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbApAQCAtMTgsMTAgKzE4LDE3IEBACiAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9InJvYm9sZWN0cmljIiAvPgogICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJyb2JvbGVjdHJpYy10ZXN0cyIgLz4KIAotICAgIDxvcHRpb24gbmFtZT0iamF2YS1mb2xkZXIiIHZhbHVlPSJwcmVidWlsdHMvamRrL2pkazE3L2xpbnV4LXg4Ni8iIC8+CisgICAgPG9wdGlvbiBuYW1lPSJqYXZhLWZvbGRlciIgdmFsdWU9InByZWJ1aWx0cy9qZGsvamRrMjEvbGludXgteDg2LyIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImV4Y2x1ZGUtcGF0aHMiIHZhbHVlPSJqYXZhIiAvPgogICAgIDxvcHRpb24gbmFtZT0idXNlLXJvYm9sZWN0cmljLXJlc291cmNlcyIgdmFsdWU9InRydWUiIC8+CiAKKyAgICA8IS0tIGF0dGVtcHQgdG8gYWx3YXlzIHNob3cgVHJhZGVmZWQgZXJyb3JzIC0tPgorICAgIDxvcHRpb24gbmFtZT0iZG8tbm90LXN3YWxsb3ctcnVubmVyLWVycm9ycyIgdmFsdWU9InRydWUiIC8+CisKKyAgICA8IS0tIHByZXZlbnQgVHJhZGVmZWQgZnJvbSBoYW5naW5nIGluZGVmaW5pdGVseSBpbiBDSSAtLT4KKyAgICA8b3B0aW9uIG5hbWU9InNvY2tldC10aW1lb3V0IiB2YWx1ZT0iNjAwMDAwIiAvPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1jYXNlLXRpbWVvdXQiIHZhbHVlPSIybSIgLz4KKwogICAgIHtFWFRSQV9DT05GSUdTfQogCiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLklzb2xhdGVkSG9zdFRlc3QiID4KQEAgLTMzLDExICs0MCwxNSBAQAogICAgICAgICA8b3B0aW9uIG5hbWU9ImphdmEtZmxhZ3MiIHZhbHVlPSItLWFkZC1vcGVucz1qYXZhLmJhc2UvamRrLmludGVybmFsLnV0aWwucmFuZG9tPUFMTC1VTk5BTUVEIi8+CiAgICAgICAgIDwhLS0gYi8yNTEzODcyNTUgLS0+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iamF2YS1mbGFncyIgdmFsdWU9Ii0tYWRkLW9wZW5zPWphdmEuYmFzZS9qYXZhLmlvPUFMTC1VTk5BTUVEIi8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iamF2YS1mbGFncyIgdmFsdWU9Ii1Ecm9ib2xlY3RyaWMub2ZmbGluZT10cnVlIi8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iamF2YS1mbGFncyIgdmFsdWU9Ii1Ecm9ib2xlY3RyaWMubG9nZ2luZz1zdGRvdXQiLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXZhLWZsYWdzIiB2YWx1ZT0iLURyb2JvbGVjdHJpYy5yZXNvdXJjZXNNb2RlPWJpbmFyeSIvPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImphdmEtZmxhZ3MiIHZhbHVlPSItRHJvYm9sZWN0cmljLnVzZVByZWluc3RydW1lbnRlZEphcnM9ZmFsc2UiLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXZhLWZsYWdzIiB2YWx1ZT0iLURyb2JvbGVjdHJpYy5jb25zY3J5cHRNb2RlPU9GRiIvPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImphdmEtZmxhZ3MiIHZhbHVlPSItRHJvYm9sZWN0cmljLmxvZ2dpbmcuZW5hYmxlZD10cnVlIi8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamF2YS1mbGFncyIgdmFsdWU9Ii0tYWRkLW9wZW5zPWphdmEuYmFzZS9qYXZhLm5ldD1BTEwtVU5OQU1FRCIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphdmEtZmxhZ3MiIHZhbHVlPSItLWFkZC1vcGVucz1qYXZhLmJhc2UvamF2YS5uaW89QUxMLVVOTkFNRUQiLz4gPCEtLSByZXF1aXJlZCBmb3IgU2hhZG93Vk1SdW50aW1lIC0tPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphdmEtZmxhZ3MiIHZhbHVlPSItLWFkZC1vcGVucz1qYXZhLmJhc2UvamF2YS5zZWN1cml0eT1BTEwtVU5OQU1FRCIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphdmEtZmxhZ3MiIHZhbHVlPSItLWFkZC1vcGVucz1qYXZhLmJhc2UvamF2YS50ZXh0PUFMTC1VTk5BTUVEIi8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamF2YS1mbGFncyIgdmFsdWU9Ii0tYWRkLW9wZW5zPWphdmEuYmFzZS9qYXZhLnV0aWw9QUxMLVVOTkFNRUQiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXZhLWZsYWdzIiB2YWx1ZT0iLS1hZGQtb3BlbnM9amF2YS5iYXNlL2pkay5pbnRlcm5hbC5hY2Nlc3M9QUxMLVVOTkFNRUQiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXZhLWZsYWdzIiB2YWx1ZT0iLS1hZGQtb3BlbnM9amF2YS5kZXNrdG9wL2phdmEuYXd0LmZvbnQ9QUxMLVVOTkFNRUQiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXZhLWZsYWdzIiB2YWx1ZT0iLS1hZGQtb3BlbnM9amRrLmNvbXBpbGVyL2NvbS5zdW4udG9vbHMuamF2YWMuYXBpPUFMTC1VTk5BTUVEIi8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamF2YS1mbGFncyIgdmFsdWU9Ii0tYWRkLW9wZW5zPWpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLm1haW49QUxMLVVOTkFNRUQiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXZhLWZsYWdzIiB2YWx1ZT0iLS1hZGQtb3BlbnM9amRrLmNvbXBpbGVyL2NvbS5zdW4udG9vbHMuamF2YWMudXRpbD1BTEwtVU5OQU1FRCIvPgogICAgIDwvdGVzdD4KIDwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2NvcmUvcnVzdF9kZXZpY2VfYmVuY2htYXJrX2NvbmZpZ190ZW1wbGF0ZS54bWwgYi9jb3JlL3J1c3RfZGV2aWNlX2JlbmNobWFya19jb25maWdfdGVtcGxhdGUueG1sCmluZGV4IDIwNTVkZjIuLjU0MTYzMGMgMTAwNjQ0Ci0tLSBhL2NvcmUvcnVzdF9kZXZpY2VfYmVuY2htYXJrX2NvbmZpZ190ZW1wbGF0ZS54bWwKKysrIGIvY29yZS9ydXN0X2RldmljZV9iZW5jaG1hcmtfY29uZmlnX3RlbXBsYXRlLnhtbApAQCAtMTYsNyArMTYsNyBAQAogPCEtLSBUaGlzIHRlc3QgY29uZmlnIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQuIC0tPgogPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyB0byBydW4ge01PRFVMRX0gcnVzdCBiZW5jaG1hcmsgdGVzdHMuIj4KICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0ie01PRFVMRX0tPi9kYXRhL2xvY2FsL3RtcC97TU9EVUxFfSIgLz4KICAgICA8L3RhcmdldF9wcmVwYXJlcj4KIApkaWZmIC0tZ2l0IGEvY29yZS9ydXN0X2RldmljZV90ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwgYi9jb3JlL3J1c3RfZGV2aWNlX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbAppbmRleCBiZmQyZjQ3Li5hYWNhYmNiIDEwMDY0NAotLS0gYS9jb3JlL3J1c3RfZGV2aWNlX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbAorKysgYi9jb3JlL3J1c3RfZGV2aWNlX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbApAQCAtMjAsMTEgKzIwLDExIEBACiAKICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJ7TU9EVUxFfS0+L2RhdGEvbG9jYWwvdG1wL3tNT0RVTEV9IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJ7TU9EVUxFfS0+e1RFU1RfSU5TVEFMTF9CQVNFfS97TU9EVUxFfSIgLz4KICAgICA8L3RhcmdldF9wcmVwYXJlcj4KIAogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5ydXN0LlJ1c3RCaW5hcnlUZXN0IiA+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWRldmljZS1wYXRoIiB2YWx1ZT0ie1RFU1RfSU5TVEFMTF9CQVNFfSIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9IntNT0RVTEV9IiAvPgogICAgIDwvdGVzdD4KIDwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2NvcmUvc2hhcmVkX2xpYnJhcnlfaW50ZXJuYWwubWsgYi9jb3JlL3NoYXJlZF9saWJyYXJ5X2ludGVybmFsLm1rCmluZGV4IDEzOWRlMTAuLmFlMzRjYjggMTAwNjQ0Ci0tLSBhL2NvcmUvc2hhcmVkX2xpYnJhcnlfaW50ZXJuYWwubWsKKysrIGIvY29yZS9zaGFyZWRfbGlicmFyeV9pbnRlcm5hbC5tawpAQCAtNDIsNyArNDIsNyBAQAogaWZlcSAoJChMT0NBTF9OT19DUlQpLHRydWUpCiBteV90YXJnZXRfY3J0YmVnaW5fc29fbyA6PQogbXlfdGFyZ2V0X2NydGVuZF9zb19vIDo9Ci1lbHNlIGlmZGVmIExPQ0FMX1VTRV9WTkRLCitlbHNlIGlmZXEgKCQoY2FsbCBtb2R1bGUtaW4tdmVuZG9yLW9yLXByb2R1Y3QpLHRydWUpCiBteV90YXJnZXRfY3J0YmVnaW5fc29fbyA6PSAkKFNPT05HXyQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClUQVJHRVRfT0JKRUNUX2NydGJlZ2luX3NvLnZlbmRvcikKIG15X3RhcmdldF9jcnRlbmRfc29fbyA6PSAkKFNPT05HXyQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClUQVJHRVRfT0JKRUNUX2NydGVuZF9zby52ZW5kb3IpCiBlbHNlCkBAIC0xMDEsNCArMTAxLDYgQEAKICQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChteV9jb3ZlcmFnZV9wYXRoKS8kKEdDTk9fQVJDSElWRSkKIGVuZGlmCiAKKyQoaWYgJChteV9yZWdpc3Rlcl9uYW1lKSwkKGV2YWwgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5NQUtFX01PRFVMRV9UWVBFOj1TSEFSRURfTElCUkFSWSkpCisKIGVuZGlmICAjIHNraXBfYnVpbGRfZnJvbV9zb3VyY2UKZGlmZiAtLWdpdCBhL2NvcmUvc29vbmdfYW5kcm9pZF9hcHBfc2V0Lm1rIGIvY29yZS9zb29uZ19hbmRyb2lkX2FwcF9zZXQubWsKaW5kZXggZWMzZDhjOC4uZDk3OTgwZCAxMDA2NDQKLS0tIGEvY29yZS9zb29uZ19hbmRyb2lkX2FwcF9zZXQubWsKKysrIGIvY29yZS9zb29uZ19hbmRyb2lkX2FwcF9zZXQubWsKQEAgLTksMTAgKzksNiBAQAogTE9DQUxfQlVJTFRfTU9EVUxFX1NURU0gOj0gcGFja2FnZS5hcGsKIExPQ0FMX0lOU1RBTExFRF9NT0RVTEVfU1RFTSA6PSAkKG5vdGRpciAkKExPQ0FMX1BSRUJVSUxUX01PRFVMRV9GSUxFKSkKIAotIyBVc2UgdGhlIFNvb25nIG91dHB1dCBhcyB0aGUgY2hlY2tidWlsZCB0YXJnZXQgaW5zdGVhZCBvZiBMT0NBTF9CVUlMVF9NT0RVTEUKLSMgdG8gYXZvaWQgY2hlY2tidWlsZHMgbWFraW5nIGFuIGV4dHJhIGNvcHkgb2YgZXZlcnkgbW9kdWxlLgotTE9DQUxfQ0hFQ0tFRF9NT0RVTEUgOj0gJChMT0NBTF9QUkVCVUlMVF9NT0RVTEVfRklMRSkKLQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2NvcmUvc29vbmdfYXBwX3ByZWJ1aWx0Lm1rIGIvY29yZS9zb29uZ19hcHBfcHJlYnVpbHQubWsKaW5kZXggY2NjNTQ0OS4uYWI5MjI3ZiAxMDA2NDQKLS0tIGEvY29yZS9zb29uZ19hcHBfcHJlYnVpbHQubWsKKysrIGIvY29yZS9zb29uZ19hcHBfcHJlYnVpbHQubWsKQEAgLTI5LDE2ICsyOSw2IEBACiBmdWxsX2NsYXNzZXNfaGVhZGVyX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLWhlYWRlci5qYXIKIAogCi0jIFVzZSB0aGUgU29vbmcgb3V0cHV0IGFzIHRoZSBjaGVja2J1aWxkIHRhcmdldCBpbnN0ZWFkIG9mIExPQ0FMX0JVSUxUX01PRFVMRQotIyB0byBhdm9pZCBjaGVja2J1aWxkcyBtYWtpbmcgYW4gZXh0cmEgY29weSBvZiBldmVyeSBtb2R1bGUuCi1MT0NBTF9DSEVDS0VEX01PRFVMRSA6PSAkKExPQ0FMX1BSRUJVSUxUX01PRFVMRV9GSUxFKQotTE9DQUxfQURESVRJT05BTF9DSEVDS0VEX01PRFVMRSArPSAkKExPQ0FMX1NPT05HX0NMQVNTRVNfSkFSKQotTE9DQUxfQURESVRJT05BTF9DSEVDS0VEX01PRFVMRSArPSAkKExPQ0FMX1NPT05HX0hFQURFUl9KQVIpCi1MT0NBTF9BRERJVElPTkFMX0NIRUNLRURfTU9EVUxFICs9ICQoTE9DQUxfRlVMTF9NQU5JRkVTVF9GSUxFKQotTE9DQUxfQURESVRJT05BTF9DSEVDS0VEX01PRFVMRSArPSAkKExPQ0FMX1NPT05HX0RFWFBSRU9QVF9DT05GSUcpCi1MT0NBTF9BRERJVElPTkFMX0NIRUNLRURfTU9EVUxFICs9ICQoTE9DQUxfU09PTkdfUkVTT1VSQ0VfRVhQT1JUX1BBQ0tBR0UpCi1MT0NBTF9BRERJVElPTkFMX0NIRUNLRURfTU9EVUxFICs9ICQoTE9DQUxfU09PTkdfREVYX0pBUikKLQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTczLDEyICs2MywxNCBAQAogIyBXZSBza2lwIGl0IGZvciB1bmJ1bmRsZWQgYXBwIGJ1aWxkcyB3aGVyZSB3ZSBjYW5ub3QgYnVpbGQgdmVyaWRleC4KIG1vZHVsZV9ydW5fYXBwY29tcGF0IDo9CiBpZmVxICh0cnVlLCQobm9uX3N5c3RlbV9tb2R1bGUpKQotaWZlcSAoLCQoVEFSR0VUX0JVSUxEX0FQUFMpKSAgIyAhIHVuYnVuZGxlZCBhcHAgYnVpbGQKK2lmZXEgKCwkKFRBUkdFVF9CVUlMRF9BUFBTKSkgICMgbm90IHVuYnVuZGxlZCBhcHAgYnVpbGQKK2lmZXEgKCwkKGZpbHRlciBzZGssJChNQUtFQ01ER09BTFMpKSkgIyBub3Qgc2RrIGJ1aWxkICh3aGljaCBpcyBhbm90aGVyIGZvcm0gb2YgdW5idW5kbGVkIGJ1aWxkKQogaWZuZXEgKCQoVU5TQUZFX0RJU0FCTEVfSElEREVOQVBJX0ZMQUdTKSx0cnVlKQogICBtb2R1bGVfcnVuX2FwcGNvbXBhdCA6PSB0cnVlCiBlbmRpZgogZW5kaWYKIGVuZGlmCitlbmRpZgogCiBpZmVxICgkKG1vZHVsZV9ydW5fYXBwY29tcGF0KSx0cnVlKQogICAkKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoYXBwY29tcGF0LWZpbGVzKQpAQCAtMTAwLDMxICs5MiwyNCBAQAogZW5kaWYKIAogaWZkZWYgTE9DQUxfU09PTkdfUFJPR1VBUkRfRElDVAotICBteV9wcm9ndWFyZF9kaWN0aW9uYXJ5X2RpcmVjdG9yeSA6PSAkKGxvY2FsLXByb2d1YXJkLWRpY3Rpb25hcnktZGlyZWN0b3J5KQotICBteV9wcm9ndWFyZF9kaWN0aW9uYXJ5X21hcHBpbmdfZGlyZWN0b3J5IDo9ICQobG9jYWwtcHJvZ3VhcmQtZGljdGlvbmFyeS1tYXBwaW5nLWRpcmVjdG9yeSkKLSAgJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoTE9DQUxfU09PTkdfUFJPR1VBUkRfRElDVCksXAotICAgICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL3Byb2d1YXJkX2RpY3Rpb25hcnkpKQogICAkKGV2YWwgJChjYWxsIGNvcHktcjgtZGljdGlvbmFyeS1maWxlLXdpdGgtbWFwcGluZyxcCiAgICAgJChMT0NBTF9TT09OR19QUk9HVUFSRF9ESUNUKSxcCi0gICAgJChteV9wcm9ndWFyZF9kaWN0aW9uYXJ5X2RpcmVjdG9yeSkvcHJvZ3VhcmRfZGljdGlvbmFyeSxcCi0gICAgJChteV9wcm9ndWFyZF9kaWN0aW9uYXJ5X21hcHBpbmdfZGlyZWN0b3J5KS9wcm9ndWFyZF9kaWN0aW9uYXJ5LnRleHRwcm90bykpCi0gICQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKExPQ0FMX1NPT05HX0NMQVNTRVNfSkFSKSxcCi0gICAgJChteV9wcm9ndWFyZF9kaWN0aW9uYXJ5X2RpcmVjdG9yeSkvY2xhc3Nlcy5qYXIpKQotICAkKGNhbGwgYWRkLWRlcGVuZGVuY3ksJChMT0NBTF9CVUlMVF9NT0RVTEUpLFwKLSAgICAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9wcm9ndWFyZF9kaWN0aW9uYXJ5KQotICAkKGNhbGwgYWRkLWRlcGVuZGVuY3ksJChMT0NBTF9CVUlMVF9NT0RVTEUpLFwKLSAgICAkKG15X3Byb2d1YXJkX2RpY3Rpb25hcnlfZGlyZWN0b3J5KS9wcm9ndWFyZF9kaWN0aW9uYXJ5KQotICAkKGNhbGwgYWRkLWRlcGVuZGVuY3ksJChMT0NBTF9CVUlMVF9NT0RVTEUpLFwKLSAgICAkKG15X3Byb2d1YXJkX2RpY3Rpb25hcnlfbWFwcGluZ19kaXJlY3RvcnkpL3Byb2d1YXJkX2RpY3Rpb25hcnkudGV4dHByb3RvKQotICAkKGNhbGwgYWRkLWRlcGVuZGVuY3ksJChMT0NBTF9CVUlMVF9NT0RVTEUpLFwKLSAgICAkKG15X3Byb2d1YXJkX2RpY3Rpb25hcnlfZGlyZWN0b3J5KS9jbGFzc2VzLmphcikKKyAgICAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9wcm9ndWFyZF9kaWN0aW9uYXJ5LFwKKyAgICAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9wcm9ndWFyZF9kaWN0aW9uYXJ5LnRleHRwcm90bykpCisKKyAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5QUk9HVUFSRF9ESUNUSU9OQVJZX0ZJTEVTIDo9IFwKKyAgICAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9wcm9ndWFyZF9kaWN0aW9uYXJ5IFwKKyAgICAkKExPQ0FMX1NPT05HX0NMQVNTRVNfSkFSKQorICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlBST0dVQVJEX0RJQ1RJT05BUllfU09PTkdfWklQX0FSR1VNRU5UUyA6PSBcCisgICAgLWUgb3V0L3RhcmdldC9jb21tb24vb2JqLyQoTE9DQUxfTU9EVUxFX0NMQVNTKS8kKExPQ0FMX01PRFVMRSlfaW50ZXJtZWRpYXRlcy9wcm9ndWFyZF9kaWN0aW9uYXJ5IFwKKyAgICAtZiAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9wcm9ndWFyZF9kaWN0aW9uYXJ5IFwKKyAgICAtZSBvdXQvdGFyZ2V0L2NvbW1vbi9vYmovJChMT0NBTF9NT0RVTEVfQ0xBU1MpLyQoTE9DQUxfTU9EVUxFKV9pbnRlcm1lZGlhdGVzL2NsYXNzZXMuamFyIFwKKyAgICAtZiAkKExPQ0FMX1NPT05HX0NMQVNTRVNfSkFSKQorICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlBST0dVQVJEX0RJQ1RJT05BUllfTUFQUElORyA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9wcm9ndWFyZF9kaWN0aW9uYXJ5LnRleHRwcm90bwogZW5kaWYKIAogaWZkZWYgTE9DQUxfU09PTkdfUFJPR1VBUkRfVVNBR0VfWklQCi0gICQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKExPQ0FMX1NPT05HX1BST0dVQVJEX1VTQUdFX1pJUCksXAotICAgICQoY2FsbCBsb2NhbC1wYWNrYWdpbmctZGlyLHByb2d1YXJkX3VzYWdlKS9wcm9ndWFyZF91c2FnZS56aXApKQotICAkKGNhbGwgYWRkLWRlcGVuZGVuY3ksJChMT0NBTF9CVUlMVF9NT0RVTEUpLFwKLSAgICAkKGNhbGwgbG9jYWwtcGFja2FnaW5nLWRpcixwcm9ndWFyZF91c2FnZSkvcHJvZ3VhcmRfdXNhZ2UuemlwKQorICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlBST0dVQVJEX1VTQUdFX1pJUCA6PSAkKExPQ0FMX1NPT05HX1BST0dVQVJEX1VTQUdFX1pJUCkKIGVuZGlmCiAKIGlmZGVmIExPQ0FMX1NPT05HX1JFU09VUkNFX0VYUE9SVF9QQUNLQUdFCkBAIC0yMzksMzAgKzIyNCw2IEBACiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9saW5rX3R5cGUubWsKIGVuZGlmICMgIUxPQ0FMX0lTX0hPU1RfTU9EVUxFCiAKLWlmZXEgKCwkKGZpbHRlciB0ZXN0cywkKExPQ0FMX01PRFVMRV9UQUdTKSkpCi0gIGlmZGVmIExPQ0FMX1NPT05HX0RFVklDRV9SUk9fRElSUwotICAgICQoY2FsbCBhcHBlbmRfZW5mb3JjZV9ycm9fc291cmNlcywgXAotICAgICAgICAkKG15X3JlZ2lzdGVyX25hbWUpLCBcCi0gICAgICAgIGZhbHNlLCBcCi0gICAgICAgICQoTE9DQUxfRlVMTF9NQU5JRkVTVF9GSUxFKSwgXAotICAgICAgICAkKGlmICQoTE9DQUxfRVhQT1JUX1BBQ0tBR0VfUkVTT1VSQ0VTKSx0cnVlLGZhbHNlKSwgXAotICAgICAgICAkKExPQ0FMX1NPT05HX0RFVklDRV9SUk9fRElSUyksIFwKLSAgICAgICAgdmVuZG9yIFwKLSAgICApCi0gIGVuZGlmCi0KLSAgaWZkZWYgTE9DQUxfU09PTkdfUFJPRFVDVF9SUk9fRElSUwotICAgICQoY2FsbCBhcHBlbmRfZW5mb3JjZV9ycm9fc291cmNlcywgXAotICAgICAgICAkKG15X3JlZ2lzdGVyX25hbWUpLCBcCi0gICAgICAgIGZhbHNlLCBcCi0gICAgICAgICQoTE9DQUxfRlVMTF9NQU5JRkVTVF9GSUxFKSwgXAotICAgICAgICAkKGlmICQoTE9DQUxfRVhQT1JUX1BBQ0tBR0VfUkVTT1VSQ0VTKSx0cnVlLGZhbHNlKSwgXAotICAgICAgICAkKExPQ0FMX1NPT05HX1BST0RVQ1RfUlJPX0RJUlMpLCBcCi0gICAgICAgIHByb2R1Y3QgXAotICAgICkKLSAgZW5kaWYKLWVuZGlmCi0KIGlmZGVmIExPQ0FMX1BSRUJVSUxUX0NPVkVSQUdFX0FSQ0hJVkUKICAgbXlfY292ZXJhZ2VfZGlyIDo9ICQoVEFSR0VUX09VVF9DT1ZFUkFHRSkvJChwYXRzdWJzdCAkKFBST0RVQ1RfT1VUKS8lLCUsJChteV9tb2R1bGVfcGF0aCkpCiAgIG15X2NvdmVyYWdlX2NvcHlfcGFpcnMgOj0gJChmb3JlYWNoIGYsJChMT0NBTF9QUkVCVUlMVF9DT1ZFUkFHRV9BUkNISVZFKSwkKGYpOiQobXlfY292ZXJhZ2VfZGlyKS8kKG5vdGRpciAgJChmKSkpCmRpZmYgLS1naXQgYS9jb3JlL3Nvb25nX2NjX3J1c3RfcHJlYnVpbHQubWsgYi9jb3JlL3Nvb25nX2NjX3J1c3RfcHJlYnVpbHQubWsKaW5kZXggMDViNGI2Yi4uZGE2MDgzMiAxMDA2NDQKLS0tIGEvY29yZS9zb29uZ19jY19ydXN0X3ByZWJ1aWx0Lm1rCisrKyBiL2NvcmUvc29vbmdfY2NfcnVzdF9wcmVidWlsdC5tawpAQCAtMzgsMTggKzM4LDYgQEAKICAgZW5kaWYKIGVuZGlmCiAKLSMgRG9uJ3QgaW5zdGFsbCBtb2R1bGVzIG9mIGN1cnJlbnQgVk5ESyB3aGVuIGl0IGlzIHRvbGQgc28KLWlmZXEgKCQoVEFSR0VUX1NLSVBfQ1VSUkVOVF9WTkRLKSx0cnVlKQotICBpZmVxICgkKExPQ0FMX1NPT05HX1ZOREtfVkVSU0lPTiksJChQTEFURk9STV9WTkRLX1ZFUlNJT04pKQotICAgIExPQ0FMX1VOSU5TVEFMTEFCTEVfTU9EVUxFIDo9IHRydWUKLSAgZW5kaWYKLWVuZGlmCi0KLQotIyBVc2UgdGhlIFNvb25nIG91dHB1dCBhcyB0aGUgY2hlY2tidWlsZCB0YXJnZXQgaW5zdGVhZCBvZiBMT0NBTF9CVUlMVF9NT0RVTEUKLSMgdG8gYXZvaWQgY2hlY2tidWlsZHMgbWFraW5nIGFuIGV4dHJhIGNvcHkgb2YgZXZlcnkgbW9kdWxlLgotTE9DQUxfQ0hFQ0tFRF9NT0RVTEUgOj0gJChMT0NBTF9QUkVCVUlMVF9NT0RVTEVfRklMRSkKLQogbXlfY2hlY2tfc2FtZV92bmRrX3ZhcmlhbnRzIDo9CiBzYW1lX3ZuZGtfdmFyaWFudHNfc3RhbXAgOj0KIGlmZXEgKCQoTE9DQUxfQ0hFQ0tfU0FNRV9WTkRLX1ZBUklBTlRTKSx0cnVlKQpAQCAtNjksNyArNTcsNyBAQAogICAjIE5vdGUgdGhhdCBiZWNhdXNlIGBjaGVja2J1aWxkYCBkb2Vzbid0IGNoZWNrIExPQ0FMX0JVSUxUX01PRFVMRSBmb3Igc29vbmctYnVpbHQgbW9kdWxlcyBhZGRpbmcKICAgIyB0aGUgdGltZXN0YW1wIHRvIExPQ0FMX0JVSUxUX01PRFVMRSBpc24ndCBlbm91Z2guIEl0IGlzIHNraXBwZWQgd2hlbiB0aGUgdmVuZG9yIHZhcmlhbnQKICAgIyBpc24ndCB1c2VkIGF0IGFsbCBhbmQgaXQgbWF5IGJyZWFrIGluIHRoZSBkb3duc3RyZWFtIHRyZWVzLgotICBMT0NBTF9BRERJVElPTkFMX0NIRUNLRURfTU9EVUxFIDo9ICQoc2FtZV92bmRrX3ZhcmlhbnRzX3N0YW1wKQorICBMT0NBTF9BRERJVElPTkFMX0NIRUNLRURfTU9EVUxFICs9ICQoc2FtZV92bmRrX3ZhcmlhbnRzX3N0YW1wKQogZW5kaWYKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC05OSw3ICs4Nyw3IEBACiAgIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2xpbmtfdHlwZS5tawogZW5kaWYKIAotaWZkZWYgTE9DQUxfVVNFX1ZOREsKK2lmZXEgKCQoY2FsbCBtb2R1bGUtaW4tdmVuZG9yLW9yLXByb2R1Y3QpLHRydWUpCiAgIGlmbmVxICgkKExPQ0FMX1ZOREtfREVQRU5EX09OX0NPUkVfVkFSSUFOVCksdHJ1ZSkKICAgICBuYW1lX3dpdGhvdXRfc3VmZml4IDo9ICQocGF0c3Vic3QgJS52ZW5kb3IsJSwkKExPQ0FMX01PRFVMRSkpCiAgICAgaWZuZXEgKCQobmFtZV93aXRob3V0X3N1ZmZpeCksJChMT0NBTF9NT0RVTEUpKQpAQCAtMTI4LDkgKzExNiwxNCBAQAogaWZkZWYgTE9DQUxfSU5TVEFMTEVEX01PRFVMRQogICBpZmRlZiBMT0NBTF9TSEFSRURfTElCUkFSSUVTCiAgICAgbXlfc2hhcmVkX2xpYnJhcmllcyA6PSAkKExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMpCi0gICAgaWZkZWYgTE9DQUxfVVNFX1ZOREsKLSAgICAgIG15X3NoYXJlZF9saWJyYXJpZXMgOj0gJChmb3JlYWNoIGwsJChteV9zaGFyZWRfbGlicmFyaWVzKSxcCi0gICAgICAgICQoaWYgJChTUExJVF9WRU5ET1IuU0hBUkVEX0xJQlJBUklFUy4kKGwpKSwkKGwpLnZlbmRvciwkKGwpKSkKKyAgICBpZmVxICgkKGNhbGwgbW9kdWxlLWluLXZlbmRvci1vci1wcm9kdWN0KSx0cnVlKQorICAgICAgaWZkZWYgTE9DQUxfSU5fUFJPRFVDVAorICAgICAgICBteV9zaGFyZWRfbGlicmFyaWVzIDo9ICQoZm9yZWFjaCBsLCQobXlfc2hhcmVkX2xpYnJhcmllcyksXAorICAgICAgICAgICQoaWYgJChTUExJVF9QUk9EVUNULlNIQVJFRF9MSUJSQVJJRVMuJChsKSksJChsKS5wcm9kdWN0LCQobCkpKQorICAgICAgZWxzZQorICAgICAgICBteV9zaGFyZWRfbGlicmFyaWVzIDo9ICQoZm9yZWFjaCBsLCQobXlfc2hhcmVkX2xpYnJhcmllcyksXAorICAgICAgICAgICQoaWYgJChTUExJVF9WRU5ET1IuU0hBUkVEX0xJQlJBUklFUy4kKGwpKSwkKGwpLnZlbmRvciwkKGwpKSkKKyAgICAgIGVuZGlmCiAgICAgZW5kaWYKICAgICAkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpJChteV9wcmVmaXgpREVQRU5ERU5DSUVTX09OX1NIQVJFRF9MSUJSQVJJRVMgKz0gXAogICAgICAgJChteV9yZWdpc3Rlcl9uYW1lKTokKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpOiQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJChteV9zaGFyZWRfbGlicmFyaWVzKSkKQEAgLTEzOCw5ICsxMzEsMTQgQEAKICAgaWZkZWYgTE9DQUxfRFlMSUJfTElCUkFSSUVTCiAgICAgbXlfZHlsaWJzIDo9ICQoTE9DQUxfRFlMSUJfTElCUkFSSUVTKQogICAgICMgVHJlYXQgdGhlc2UgYXMgc2hhcmVkIGxpYnJhcnkgZGVwZW5kZW5jaWVzIGZvciBpbnN0YWxsYXRpb24gcHVycG9zZXMuCi0gICAgaWZkZWYgTE9DQUxfVVNFX1ZOREsKLSAgICAgIG15X2R5bGlicyA6PSAkKGZvcmVhY2ggbCwkKG15X2R5bGlicyksXAotICAgICAgICAkKGlmICQoU1BMSVRfVkVORE9SLlNIQVJFRF9MSUJSQVJJRVMuJChsKSksJChsKS52ZW5kb3IsJChsKSkpCisgICAgaWZlcSAoJChjYWxsIG1vZHVsZS1pbi12ZW5kb3Itb3ItcHJvZHVjdCksdHJ1ZSkKKyAgICAgIGlmZGVmIExPQ0FMX0lOX1BST0RVQ1QKKyAgICAgICAgbXlfZHlsaWJzIDo9ICQoZm9yZWFjaCBsLCQobXlfZHlsaWJzKSxcCisgICAgICAgICAgJChpZiAkKFNQTElUX1BST0RVQ1QuU0hBUkVEX0xJQlJBUklFUy4kKGwpKSwkKGwpLnByb2R1Y3QsJChsKSkpCisgICAgICBlbHNlCisgICAgICAgIG15X2R5bGlicyA6PSAkKGZvcmVhY2ggbCwkKG15X2R5bGlicyksXAorICAgICAgICAgICQoaWYgJChTUExJVF9WRU5ET1IuU0hBUkVEX0xJQlJBUklFUy4kKGwpKSwkKGwpLnZlbmRvciwkKGwpKSkKKyAgICAgIGVuZGlmCiAgICAgZW5kaWYKICAgICAkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpJChteV9wcmVmaXgpREVQRU5ERU5DSUVTX09OX1NIQVJFRF9MSUJSQVJJRVMgKz0gXAogICAgICAgJChteV9yZWdpc3Rlcl9uYW1lKTokKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpOiQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJChteV9keWxpYnMpKQpAQCAtMjUxLDMwICsyNDksNiBAQAogCiAkKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMpCiAKLSMgV2UgZG9uJ3QgY2FyZSBhYm91dCBpbnN0YWxsZWQgcmxpYi9zdGF0aWMgbGlicmFyaWVzLCBzaW5jZSB0aGUgbGlicmFyaWVzIGhhdmUKLSMgYWxyZWFkeSBiZWVuIGxpbmtlZCBpbnRvIHRoZSBtb2R1bGUgYXQgdGhhdCBwb2ludC4gV2UgZG8sIGhvd2V2ZXIsIGNhcmUKLSMgYWJvdXQgdGhlIE5PVElDRSBmaWxlcyBmb3IgYW55IHJsaWIvc3RhdGljIGxpYnJhcmllcyB0aGF0IHdlIHVzZS4KLSMgKHNlZSBub3RpY2VfZmlsZXMubWspCi0jCi0jIEZpbHRlciBvdXQgc29tZSBOREsgbGlicmFyaWVzIHRoYXQgYXJlIG5vdCBiZWluZyBleHBvcnRlZC4KLW15X3N0YXRpY19saWJyYXJpZXMgOj0gXAotICAgICQoZmlsdGVyLW91dCBuZGtfbGliYysrX3N0YXRpYyBuZGtfbGliYysrYWJpIG5ka19saWJhbmRyb2lkX3N1cHBvcnQgbmRrX2xpYnVud2luZCBcCi0gICAgICBuZGtfbGliYysrX3N0YXRpYy5uYXRpdmVfYnJpZGdlIG5ka19saWJjKythYmkubmF0aXZlX2JyaWRnZSBcCi0gICAgICBuZGtfbGliYW5kcm9pZF9zdXBwb3J0Lm5hdGl2ZV9icmlkZ2UgbmRrX2xpYnVud2luZC5uYXRpdmVfYnJpZGdlLCBcCi0gICAgICAkKExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMpKQotaW5zdGFsbGVkX3N0YXRpY19saWJyYXJ5X25vdGljZV9maWxlX3RhcmdldHMgOj0gXAotICAgICQoZm9yZWFjaCBsaWIsJChteV9zdGF0aWNfbGlicmFyaWVzKSAkKExPQ0FMX1dIT0xFX1NUQVRJQ19MSUJSQVJJRVMpLCBcCi0gICAgICBOT1RJQ0UtJChpZiAkKExPQ0FMX0lTX0hPU1RfTU9EVUxFKSxIT1NUJChpZiAkKG15X2hvc3RfY3Jvc3MpLF9DUk9TUywpLFRBUkdFVCktU1RBVElDX0xJQlJBUklFUy0kKGxpYikpCi1pbnN0YWxsZWRfc3RhdGljX2xpYnJhcnlfbm90aWNlX2ZpbGVfdGFyZ2V0cyArPSBcCi0gICAgJChmb3JlYWNoIGxpYiwkKExPQ0FMX1JMSUJfTElCUkFSSUVTKSwgXAotICAgICAgTk9USUNFLSQoaWYgJChMT0NBTF9JU19IT1NUX01PRFVMRSksSE9TVCQoaWYgJChteV9ob3N0X2Nyb3NzKSxfQ1JPU1MsKSxUQVJHRVQpLVJMSUJfTElCUkFSSUVTLSQobGliKSkKLWluc3RhbGxlZF9zdGF0aWNfbGlicmFyeV9ub3RpY2VfZmlsZV90YXJnZXRzICs9IFwKLSAgICAkKGZvcmVhY2ggbGliLCQoTE9DQUxfUFJPQ19NQUNST19MSUJSQVJJRVMpLCBcCi0gICAgICBOT1RJQ0UtJChpZiAkKExPQ0FMX0lTX0hPU1RfTU9EVUxFKSxIT1NUJChpZiAkKG15X2hvc3RfY3Jvc3MpLF9DUk9TUywpLFRBUkdFVCktUFJPQ19NQUNST19MSUJSQVJJRVMtJChsaWIpKQotCi0kKG5vdGljZV90YXJnZXQpOiB8ICQoaW5zdGFsbGVkX3N0YXRpY19saWJyYXJ5X25vdGljZV9maWxlX3RhcmdldHMpCi0kKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpOiB8ICQobm90aWNlX3RhcmdldCkKLQogIyBSZWluc3RhbGwgc2hhcmVkIGxpYnJhcnkgZGVwZW5kZW5jaWVzIG9mIGZ1enogdGFyZ2V0cyB0byAvZGF0YS9mdXp6LyAoZm9yCiAjIHRhcmdldCkgb3IgL2RhdGEvIChmb3IgaG9zdCkuCiBpZmRlZiBMT0NBTF9JU19GVVpaX1RBUkdFVApkaWZmIC0tZ2l0IGEvY29yZS9zb29uZ19jb25maWcubWsgYi9jb3JlL3Nvb25nX2NvbmZpZy5tawppbmRleCBlOWE2YjY0Li41NzBlYzI3IDEwMDY0NAotLS0gYS9jb3JlL3Nvb25nX2NvbmZpZy5taworKysgYi9jb3JlL3Nvb25nX2NvbmZpZy5tawpAQCAtMSwxMyArMSw1IEBACi1TT09OR19NQUtFVkFSU19NSyA6PSAkKFNPT05HX09VVF9ESVIpL21ha2VfdmFycy0kKFRBUkdFVF9QUk9EVUNUKS5tawotU09PTkdfVkFSSUFCTEVTIDo9ICQoU09PTkdfT1VUX0RJUikvc29vbmcudmFyaWFibGVzCi1TT09OR19BTkRST0lEX01LIDo9ICQoU09PTkdfT1VUX0RJUikvQW5kcm9pZC0kKFRBUkdFVF9QUk9EVUNUKS5tawotCi1CSU5ERVIzMkJJVCA6PQotaWZuZXEgKCQoVEFSR0VUX1VTRVNfNjRfQklUX0JJTkRFUiksdHJ1ZSkKLWlmbmVxICgkKFRBUkdFVF9JU182NF9CSVQpLHRydWUpCi1CSU5ERVIzMkJJVCA6PSB0cnVlCi1lbmRpZgotZW5kaWYKK1NPT05HX01BS0VWQVJTX01LIDo9ICQoU09PTkdfT1VUX0RJUikvbWFrZV92YXJzLSQoVEFSR0VUX1BST0RVQ1QpJChDT1ZFUkFHRV9TVUZGSVgpLm1rCitTT09OR19BTkRST0lEX01LIDo9ICQoU09PTkdfT1VUX0RJUikvQW5kcm9pZC0kKFRBUkdFVF9QUk9EVUNUKSQoQ09WRVJBR0VfU1VGRklYKS5tawogCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9hcnRfY29uZmlnLm1rCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9kZXhfcHJlb3B0X2NvbmZpZy5tawpAQCAtMTUsNiArNyw3IEBACiBpZm5kZWYgQUZET19QUk9GSUxFUwogIyBTZXQgQUZET19QUk9GSUxFUwogLWluY2x1ZGUgdmVuZG9yL2dvb2dsZV9kYXRhL3Bnb19wcm9maWxlL3NhbXBsaW5nL2FmZG9fcHJvZmlsZXMubWsKK2luY2x1ZGUgdG9vbGNoYWluL3Bnby1wcm9maWxlcy9zYW1wbGluZy9hZmRvX3Byb2ZpbGVzLm1rCiBlbHNlCiAkKGVycm9yIEFGRE9fUFJPRklMRVMgY2FuIG9ubHkgYmUgc2V0IGZyb20gc29vbmdfY29uZmlnLm1rLiBGb3IgcHJvZHVjdC1zcGVjaWZpYyBmZG9fcHJvZmlsZXMsIHBsZWFzZSB1c2UgUFJPRFVDVF9BRkRPX1BST0ZJTEVTKQogZW5kaWYKQEAgLTIyLDYgKzE1LDEwIEBACiAjIFBST0RVQ1RfQUZET19QUk9GSUxFUyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgcHJvZHVjdC1hZ25vc3RpYyBwcm9maWxlcyBpbiBBRkRPX1BST0ZJTEVTCiBBTExfQUZET19QUk9GSUxFUyA6PSAkKFBST0RVQ1RfQUZET19QUk9GSUxFUykgJChBRkRPX1BST0ZJTEVTKQogCitpZm5lcSAoLCQoZmlsdGVyLW91dCBlbnZpcm9ubWVudCB1bmRlZmluZWQsJChvcmlnaW4gR0VOUlVMRV9TQU5EQk9YSU5HKSkpCisgICQoZXJyb3IgR0VOUlVMRV9TQU5EQk9YSU5HIGNhbiBvbmx5IGJlIHByb3ZpZGVkIHZpYSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdXNlIEJVSUxEX0JST0tFTl9HRU5SVUxFX1NBTkRCT1hJTkcgdG8gZGlzYWJsZSBnZW5ydWxlIHNhbmRib3hpbmcgaW4gYm9hcmQgY29uZmlnKQorZW5kaWYKKwogaWZlcSAoJChXUklURV9TT09OR19WQVJJQUJMRVMpLHRydWUpCiAKICMgQ3JlYXRlIHNvb25nLnZhcmlhYmxlcyB3aXRoIGNvcGllcyBvZiBtYWtlZmlsZSBzZXR0aW5ncy4gIFJ1bnMgZXZlcnkgYnVpbGQsCkBAIC0yOSwxMyArMjYsMTkgQEAKICQoc2hlbGwgbWtkaXIgLXAgJChkaXIgJChTT09OR19WQVJJQUJMRVMpKSkKICQoY2FsbCBqc29uX3N0YXJ0KQogCi0kKGNhbGwgYWRkX2pzb25fc3RyLCAgTWFrZV9zdWZmaXgsIC0kKFRBUkdFVF9QUk9EVUNUKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBNYWtlX3N1ZmZpeCwgLSQoVEFSR0VUX1BST0RVQ1QpJChDT1ZFUkFHRV9TVUZGSVgpKQogCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgQnVpbGRJZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJVSUxEX0lEKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBCdWlsZEZpbmdlcnByaW50RmlsZSwgICAgICAgICAgICAgIGJ1aWxkX2ZpbmdlcnByaW50LnR4dCkKICQoY2FsbCBhZGRfanNvbl9zdHIsICBCdWlsZE51bWJlckZpbGUsICAgICAgICAgICAgICAgICAgIGJ1aWxkX251bWJlci50eHQpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgQnVpbGRIb3N0bmFtZUZpbGUsICAgICAgICAgICAgICAgICBidWlsZF9ob3N0bmFtZS50eHQpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgQnVpbGRUaHVtYnByaW50RmlsZSwgICAgICAgICAgICAgICBidWlsZF90aHVtYnByaW50LnR4dCkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBEaXNwbGF5QnVpbGROdW1iZXIsICAgICAgICAgICAgICAgICQoZmlsdGVyIHRydWUsJChESVNQTEFZX0JVSUxEX05VTUJFUikpKQogCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgUGxhdGZvcm1fZGlzcGxheV92ZXJzaW9uX25hbWUsICAgICAkKFBMQVRGT1JNX0RJU1BMQVlfVkVSU0lPTikpCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgUGxhdGZvcm1fdmVyc2lvbl9uYW1lLCAgICAgICAgICAgICAkKFBMQVRGT1JNX1ZFUlNJT04pKQogJChjYWxsIGFkZF9qc29uX3ZhbCwgIFBsYXRmb3JtX3Nka192ZXJzaW9uLCAgICAgICAgICAgICAgJChQTEFURk9STV9TREtfVkVSU0lPTikpCiskKGNhbGwgYWRkX2pzb25fdmFsLCAgUGxhdGZvcm1fc2RrX3ZlcnNpb25fZnVsbCwgICAgICAgICAkKFBMQVRGT1JNX1NES19WRVJTSU9OX0ZVTEwpKQogJChjYWxsIGFkZF9qc29uX3N0ciwgIFBsYXRmb3JtX3Nka19jb2RlbmFtZSwgICAgICAgICAgICAgJChQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FKSkKICQoY2FsbCBhZGRfanNvbl9ib29sLCBQbGF0Zm9ybV9zZGtfZmluYWwsICAgICAgICAgICAgICAgICQoZmlsdGVyIFJFTCwkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUpKSkKICQoY2FsbCBhZGRfanNvbl92YWwsICBQbGF0Zm9ybV9zZGtfZXh0ZW5zaW9uX3ZlcnNpb24sICAgICQoUExBVEZPUk1fU0RLX0VYVEVOU0lPTl9WRVJTSU9OKSkKQEAgLTQ4LDcgKzUxLDcgQEAKICQoY2FsbCBhZGRfanNvbl9zdHIsICBQbGF0Zm9ybV92ZXJzaW9uX2xhc3Rfc3RhYmxlLCAgICAgICQoUExBVEZPUk1fVkVSU0lPTl9MQVNUX1NUQUJMRSkpCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgUGxhdGZvcm1fdmVyc2lvbl9rbm93bl9jb2RlbmFtZXMsICAkKFBMQVRGT1JNX1ZFUlNJT05fS05PV05fQ09ERU5BTUVTKSkKIAotJChjYWxsIGFkZF9qc29uX3N0ciwgIFBsYXRmb3JtX21pbl9zdXBwb3J0ZWRfdGFyZ2V0X3Nka192ZXJzaW9uLCAkKFBMQVRGT1JNX01JTl9TVVBQT1JURURfVEFSR0VUX1NES19WRVJTSU9OKSkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBSZWxlYXNlX2FpZGxfdXNlX3VuZnJvemVuLCAgICAgICAgICQoUkVMRUFTRV9BSURMX1VTRV9VTkZST1pFTikpCiAKICQoY2FsbCBhZGRfanNvbl9ib29sLCBBbGxvd19taXNzaW5nX2RlcGVuZGVuY2llcywgICAgICAgICQoZmlsdGVyIHRydWUsJChBTExPV19NSVNTSU5HX0RFUEVOREVOQ0lFUykpKQogJChjYWxsIGFkZF9qc29uX2Jvb2wsIFVuYnVuZGxlZF9idWlsZCwgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQlVJTERfVU5CVU5ETEVEKSkKQEAgLTU4LDYgKzYxLDcgQEAKIAogJChjYWxsIGFkZF9qc29uX2Jvb2wsIERlYnVnZ2FibGUsICAgICAgICAgICAgICAgICAgICAgICAgJChmaWx0ZXIgdXNlcmRlYnVnIGVuZywkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkpCiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgRW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpbHRlciBlbmcsJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgIEJ1aWxkVHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQlVJTERfVFlQRSkpCiAKICQoY2FsbCBhZGRfanNvbl9zdHIsICBEZXZpY2VOYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX0RFVklDRSkpCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgRGV2aWNlUHJvZHVjdCwgICAgICAgICAgICAgICAgICAgICAkKFRBUkdFVF9QUk9EVUNUKSkKQEAgLTEwNiw2ICsxMTAsOCBAQAogJChjYWxsIGFkZF9qc29uX2xpc3QsIEFBUFRQcmVidWlsdERQSSwgICAgICAgICAgICAgICAgICAgJChQUk9EVUNUX0FBUFRfUFJFQlVJTFRfRFBJKSkKIAogJChjYWxsIGFkZF9qc29uX3N0ciwgIERlZmF1bHRBcHBDZXJ0aWZpY2F0ZSwgICAgICAgICAgICAgJChQUk9EVUNUX0RFRkFVTFRfREVWX0NFUlRJRklDQVRFKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBFeHRyYU90YUtleXMsICAgICAgICAgICAgICAgICAgICAgICQoUFJPRFVDVF9FWFRSQV9PVEFfS0VZUykpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgRXh0cmFPdGFSZWNvdmVyeUtleXMsICAgICAgICAgICAgICAkKFBST0RVQ1RfRVhUUkFfUkVDT1ZFUllfS0VZUykpCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgTWFpbmxpbmVTZXBvbGljeURldkNlcnRpZmljYXRlcywgICAkKE1BSU5MSU5FX1NFUE9MSUNZX0RFVl9DRVJUSUZJQ0FURVMpKQogCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgQXBwc0RlZmF1bHRWZXJzaW9uTmFtZSwgICAgICAgICAgICAkKEFQUFNfREVGQVVMVF9WRVJTSU9OX05BTUUpKQpAQCAtMTIxLDYgKzEyNyw3IEBACiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgQ0ZJSW5jbHVkZVBhdGhzLCAgICAgICAgICAgICAgICAgICAkKENGSV9JTkNMVURFX1BBVEhTKSAkKFBST0RVQ1RfQ0ZJX0lOQ0xVREVfUEFUSFMpKQogJChjYWxsIGFkZF9qc29uX2xpc3QsIEludGVnZXJPdmVyZmxvd0V4Y2x1ZGVQYXRocywgICAgICAgJChJTlRFR0VSX09WRVJGTE9XX0VYQ0xVREVfUEFUSFMpICQoUFJPRFVDVF9JTlRFR0VSX09WRVJGTE9XX0VYQ0xVREVfUEFUSFMpKQogJChjYWxsIGFkZF9qc29uX2xpc3QsIEhXQVNhbkluY2x1ZGVQYXRocywgICAgICAgICAgICAgICAgJChIV0FTQU5fSU5DTFVERV9QQVRIUykgJChQUk9EVUNUX0hXQVNBTl9JTkNMVURFX1BBVEhTKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBIV0FTYW5FeGNsdWRlUGF0aHMsICAgICAgICAgICAgICAgICQoSFdBU0FOX0VYQ0xVREVfUEFUSFMpICQoUFJPRFVDVF9IV0FTQU5fRVhDTFVERV9QQVRIUykpCiAKICQoY2FsbCBhZGRfanNvbl9saXN0LCBNZW10YWdIZWFwRXhjbHVkZVBhdGhzLCAgICAgICAgICAgICQoTUVNVEFHX0hFQVBfRVhDTFVERV9QQVRIUykgJChQUk9EVUNUX01FTVRBR19IRUFQX0VYQ0xVREVfUEFUSFMpKQogJChjYWxsIGFkZF9qc29uX2xpc3QsIE1lbXRhZ0hlYXBBc3luY0luY2x1ZGVQYXRocywgICAgICAgJChNRU1UQUdfSEVBUF9BU1lOQ19JTkNMVURFX1BBVEhTKSAkKFBST0RVQ1RfTUVNVEFHX0hFQVBfQVNZTkNfSU5DTFVERV9QQVRIUykgJChpZiAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9NRU1UQUdfSEVBUF9TS0lQX0RFRkFVTFRfUEFUSFMpKSwsJChQUk9EVUNUX01FTVRBR19IRUFQX0FTWU5DX0RFRkFVTFRfSU5DTFVERV9QQVRIUykpKQpAQCAtMTQwLDUyICsxNDcsMzYgQEAKICQoY2FsbCBhZGRfanNvbl9saXN0LCBOYXRpdmVDb3ZlcmFnZVBhdGhzLCAgICAgICAgICAgICAgICQoTkFUSVZFX0NPVkVSQUdFX1BBVEhTKSkKICQoY2FsbCBhZGRfanNvbl9saXN0LCBOYXRpdmVDb3ZlcmFnZUV4Y2x1ZGVQYXRocywgICAgICAgICQoTkFUSVZFX0NPVkVSQUdFX0VYQ0xVREVfUEFUSFMpKQogCi0kKGNhbGwgYWRkX2pzb25fYm9vbCwgU2FtcGxpbmdQR08sICAgICAgICAgICAgICAgICAgICAgICAkKGZpbHRlciB0cnVlLCQoU0FNUExJTkdfUEdPKSkpCi0KICQoY2FsbCBhZGRfanNvbl9ib29sLCBBcnRVc2VSZWFkQmFycmllciwgICAgICAgICAgICAgICAgICQoY2FsbCBpbnZlcnRfYm9vbCwkKGZpbHRlciBmYWxzZSwkKFBST0RVQ1RfQVJUX1VTRV9SRUFEX0JBUlJJRVIpKSkpCi0kKGNhbGwgYWRkX2pzb25fYm9vbCwgQmluZGVyMzJiaXQsICAgICAgICAgICAgICAgICAgICAgICAkKEJJTkRFUjMyQklUKSkKICQoY2FsbCBhZGRfanNvbl9zdHIsICBCdENvbmZpZ0luY2x1ZGVEaXIsICAgICAgICAgICAgICAgICQoQk9BUkRfQkxVRVRPT1RIX0JEUk9JRF9CVUlMRENGR19JTkNMVURFX0RJUikpCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgRGV2aWNlS2VybmVsSGVhZGVycywgICAgICAgICAgICAgICAkKFRBUkdFVF9ERVZJQ0VfS0VSTkVMX0hFQURFUlMpICQoVEFSR0VUX0JPQVJEX0tFUk5FTF9IRUFERVJTKSAkKFRBUkdFVF9QUk9EVUNUX0tFUk5FTF9IRUFERVJTKSkKLSQoY2FsbCBhZGRfanNvbl9zdHIsICBEZXZpY2VWbmRrVmVyc2lvbiwgICAgICAgICAgICAgICAgICQoQk9BUkRfVk5ES19WRVJTSU9OKSkKLSQoY2FsbCBhZGRfanNvbl9zdHIsICBQbGF0Zm9ybV92bmRrX3ZlcnNpb24sICAgICAgICAgICAgICQoUExBVEZPUk1fVk5ES19WRVJTSU9OKSkKLSQoY2FsbCBhZGRfanNvbl9zdHIsICBQcm9kdWN0Vm5ka1ZlcnNpb24sICAgICAgICAgICAgICAgICQoUFJPRFVDVF9QUk9EVUNUX1ZOREtfVkVSU0lPTikpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgVmVuZG9yQXBpTGV2ZWwsICAgICAgICAgICAgICAgICAgICAkKEJPQVJEX0FQSV9MRVZFTCkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgVmVuZG9yQXBpTGV2ZWxQcm9wT3ZlcnJpZGUsICAgICAgICAkKEJPQVJEX0FQSV9MRVZFTF9QUk9QX09WRVJSSURFKSkKICQoY2FsbCBhZGRfanNvbl9saXN0LCBFeHRyYVZuZGtWZXJzaW9ucywgICAgICAgICAgICAgICAgICQoUFJPRFVDVF9FWFRSQV9WTkRLX1ZFUlNJT05TKSkKICQoY2FsbCBhZGRfanNvbl9saXN0LCBEZXZpY2VTeXN0ZW1TZGtWZXJzaW9ucywgICAgICAgICAgICQoQk9BUkRfU1lTVEVNU0RLX1ZFUlNJT05TKSkKLSQoY2FsbCBhZGRfanNvbl9zdHIsICBSZWNvdmVyeVNuYXBzaG90VmVyc2lvbiwgICAgICAgICAgICQoUkVDT1ZFUllfU05BUFNIT1RfVkVSU0lPTikpCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgUGxhdGZvcm1fc3lzdGVtc2RrX3ZlcnNpb25zLCAgICAgICAkKFBMQVRGT1JNX1NZU1RFTVNES19WRVJTSU9OUykpCi0kKGNhbGwgYWRkX2pzb25fYm9vbCwgTWFsbG9jX25vdF9zdmVsdGUsICAgICAgICAgICAgICAgICAkKGNhbGwgaW52ZXJ0X2Jvb2wsJChmaWx0ZXIgdHJ1ZSwkKE1BTExPQ19TVkVMVEUpKSkpCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgTWFsbG9jX2xvd19tZW1vcnksICAgICAgICAgICAgICAgICAkKGZpbmRzdHJpbmcgdHJ1ZSwkKE1BTExPQ19TVkVMVEUpICQoTUFMTE9DX0xPV19NRU1PUlkpKSkKICQoY2FsbCBhZGRfanNvbl9ib29sLCBNYWxsb2NfemVyb19jb250ZW50cywgICAgICAgICAgICAgICQoY2FsbCBpbnZlcnRfYm9vbCwkKGZpbHRlciBmYWxzZSwkKE1BTExPQ19aRVJPX0NPTlRFTlRTKSkpKQogJChjYWxsIGFkZF9qc29uX2Jvb2wsIE1hbGxvY19wYXR0ZXJuX2ZpbGxfY29udGVudHMsICAgICAgJChNQUxMT0NfUEFUVEVSTl9GSUxMX0NPTlRFTlRTKSkKICQoY2FsbCBhZGRfanNvbl9zdHIsICBPdmVycmlkZV9yc19kcml2ZXIsICAgICAgICAgICAgICAgICQoT1ZFUlJJREVfUlNfRFJJVkVSKSkKICQoY2FsbCBhZGRfanNvbl9zdHIsICBEZXZpY2VNYXhQYWdlU2l6ZVN1cHBvcnRlZCwgICAgICAgICQoVEFSR0VUX01BWF9QQUdFX1NJWkVfU1VQUE9SVEVEKSkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBEZXZpY2VOb0Jpb25pY1BhZ2VTaXplTWFjcm8sICAgICAgICQoZmlsdGVyIHRydWUsJChUQVJHRVRfTk9fQklPTklDX1BBR0VfU0laRV9NQUNSTykpKQogCiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgVW5jb21wcmVzc1ByaXZBcHBEZXgsICAgICAgICAgICAgICAkKGNhbGwgaW52ZXJ0X2Jvb2wsJChmaWx0ZXIgdHJ1ZSwkKERPTlRfVU5DT01QUkVTU19QUklWX0FQUFNfREVYUykpKSkKICQoY2FsbCBhZGRfanNvbl9saXN0LCBNb2R1bGVzTG9hZGVkQnlQcml2aWxlZ2VkTW9kdWxlcywgICQoUFJPRFVDVF9MT0FERURfQllfUFJJVklMRUdFRF9NT0RVTEVTKSkKIAogJChjYWxsIGFkZF9qc29uX2xpc3QsIEJvb3RKYXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgJChQUk9EVUNUX0JPT1RfSkFSUykpCi0kKGNhbGwgYWRkX2pzb25fbGlzdCwgQXBleEJvb3RKYXJzLCAgICAgICAgICAgICAgICAgICAgICAkKFBST0RVQ1RfQVBFWF9CT09UX0pBUlMpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIEFwZXhCb290SmFycywgICAgICAgICAgICAgICAgICAgICAgJChmaWx0ZXItb3V0ICQoQVBFWF9CT09UX0pBUlNfRVhDTFVERUQpLCAkKFBST0RVQ1RfQVBFWF9CT09UX0pBUlMpKSkKIAotJChjYWxsIGFkZF9qc29uX2Jvb2wsIFZuZGtVc2VDb3JlVmFyaWFudCwgICAgICAgICAgICAgICAgJChUQVJHRVRfVk5ES19VU0VfQ09SRV9WQVJJQU5UKSkKLSQoY2FsbCBhZGRfanNvbl9ib29sLCBWbmRrU25hcHNob3RCdWlsZEFydGlmYWN0cywgICAgICAgICQoVk5ES19TTkFQU0hPVF9CVUlMRF9BUlRJRkFDVFMpKQotCi0kKGNhbGwgYWRkX2pzb25fYm9vbCwgRGlyZWN0ZWRWZW5kb3JTbmFwc2hvdCwgICAgICAgICAgICAkKERJUkVDVEVEX1ZFTkRPUl9TTkFQU0hPVCkpCi0kKGNhbGwgYWRkX2pzb25fbWFwLCAgVmVuZG9yU25hcHNob3RNb2R1bGVzKQotJChmb3JlYWNoIG1vZHVsZSwkKFZFTkRPUl9TTkFQU0hPVF9NT0RVTEVTKSxcCi0gICQoY2FsbCBhZGRfanNvbl9ib29sLCQobW9kdWxlKSx0cnVlKSkKKyQoY2FsbCBhZGRfanNvbl9tYXAsICBCdWlsZEZsYWdzKQorJChmb3JlYWNoIGZsYWcsJChfQUxMX1JFTEVBU0VfRkxBR1MpLFwKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwkKGZsYWcpLCQoX0FMTF9SRUxFQVNFX0ZMQUdTLiQoZmxhZykuVkFMVUUpKSkKICQoY2FsbCBlbmRfanNvbl9tYXApCi0KLSQoY2FsbCBhZGRfanNvbl9ib29sLCBEaXJlY3RlZFJlY292ZXJ5U25hcHNob3QsICAgICAgICAgICQoRElSRUNURURfUkVDT1ZFUllfU05BUFNIT1QpKQotJChjYWxsIGFkZF9qc29uX21hcCwgIFJlY292ZXJ5U25hcHNob3RNb2R1bGVzKQotJChmb3JlYWNoIG1vZHVsZSwkKFJFQ09WRVJZX1NOQVBTSE9UX01PRFVMRVMpLFwKLSAgJChjYWxsIGFkZF9qc29uX2Jvb2wsJChtb2R1bGUpLHRydWUpKQorJChjYWxsIGFkZF9qc29uX21hcCwgIEJ1aWxkRmxhZ1R5cGVzKQorJChmb3JlYWNoIGZsYWcsJChfQUxMX1JFTEVBU0VfRkxBR1MpLFwKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwkKGZsYWcpLCQoX0FMTF9SRUxFQVNFX0ZMQUdTLiQoZmxhZykuVFlQRSkpKQogJChjYWxsIGVuZF9qc29uX21hcCkKIAotJChjYWxsIGFkZF9qc29uX2xpc3QsIFZlbmRvclNuYXBzaG90RGlyc0luY2x1ZGVkLCAgICAgICAgJChWRU5ET1JfU05BUFNIT1RfRElSU19JTkNMVURFRCkpCi0kKGNhbGwgYWRkX2pzb25fbGlzdCwgVmVuZG9yU25hcHNob3REaXJzRXhjbHVkZWQsICAgICAgICAkKFZFTkRPUl9TTkFQU0hPVF9ESVJTX0VYQ0xVREVEKSkKLSQoY2FsbCBhZGRfanNvbl9saXN0LCBSZWNvdmVyeVNuYXBzaG90RGlyc0luY2x1ZGVkLCAgICAgICQoUkVDT1ZFUllfU05BUFNIT1RfRElSU19JTkNMVURFRCkpCi0kKGNhbGwgYWRkX2pzb25fbGlzdCwgUmVjb3ZlcnlTbmFwc2hvdERpcnNFeGNsdWRlZCwgICAgICAkKFJFQ09WRVJZX1NOQVBTSE9UX0RJUlNfRVhDTFVERUQpKQotJChjYWxsIGFkZF9qc29uX2Jvb2wsIEhvc3RGYWtlU25hcHNob3RFbmFibGVkLCAgICAgICAgICAgJChIT1NUX0ZBS0VfU05BUFNIT1RfRU5BQkxFKSkKLQogJChjYWxsIGFkZF9qc29uX2Jvb2wsIE11bHRpdHJlZVVwZGF0ZU1ldGEsICAgICAgICAgICAgICAgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9NVUxUSVRSRUVfVVBEQVRFX01FVEEpKSkKIAogJChjYWxsIGFkZF9qc29uX2Jvb2wsIFRyZWJsZV9saW5rZXJfbmFtZXNwYWNlcywgICAgICAgICAgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfVFJFQkxFX0xJTktFUl9OQU1FU1BBQ0VTKSkpCkBAIC0xOTMsMTMgKzE4NCwxOSBAQAogCiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgVW1sLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpbHRlciB0cnVlLCQoVEFSR0VUX1VTRVJfTU9ERV9MSU5VWCkpKQogJChjYWxsIGFkZF9qc29uX3N0ciwgIFZlbmRvclBhdGgsICAgICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQ09QWV9PVVRfVkVORE9SKSkKLSQoY2FsbCBhZGRfanNvbl9zdHIsICBPZG1QYXRoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX0NPUFlfT1VUX09ETSkpCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgVmVuZG9yRGxrbVBhdGgsICAgICAgICAgICAgICAgICAgICAkKFRBUkdFVF9DT1BZX09VVF9WRU5ET1JfRExLTSkpCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRpbmdWZW5kb3JJbWFnZSwgICAgICAgICAgICAgICAkKEJVSUxESU5HX1ZFTkRPUl9JTUFHRSkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgT2RtUGF0aCwgICAgICAgICAgICAgICAgICAgICAgICAgICAkKFRBUkdFVF9DT1BZX09VVF9PRE0pKQorJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJ1aWxkaW5nT2RtSW1hZ2UsICAgICAgICAgICAgICAgICAgJChCVUlMRElOR19PRE1fSU1BR0UpKQogJChjYWxsIGFkZF9qc29uX3N0ciwgIE9kbURsa21QYXRoLCAgICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQ09QWV9PVVRfT0RNX0RMS00pKQotJChjYWxsIGFkZF9qc29uX3N0ciwgIFN5c3RlbURsa21QYXRoLCAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQ09QWV9PVVRfU1lTVEVNX0RMS00pKQogJChjYWxsIGFkZF9qc29uX3N0ciwgIFByb2R1Y3RQYXRoLCAgICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQ09QWV9PVVRfUFJPRFVDVCkpCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRpbmdQcm9kdWN0SW1hZ2UsICAgICAgICAgICAgICAkKEJVSUxESU5HX1BST0RVQ1RfSU1BR0UpKQogJChjYWxsIGFkZF9qc29uX3N0ciwgIFN5c3RlbUV4dFBhdGgsICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQ09QWV9PVVRfU1lTVEVNX0VYVCkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgU3lzdGVtRGxrbVBhdGgsICAgICAgICAgICAgICAgICAgICAkKFRBUkdFVF9DT1BZX09VVF9TWVNURU1fRExLTSkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgT2VtUGF0aCwgICAgICAgICAgICAgICAgICAgICAgICAgICAkKFRBUkdFVF9DT1BZX09VVF9PRU0pKQogJChjYWxsIGFkZF9qc29uX2Jvb2wsIE1pbmltaXplSmF2YURlYnVnSW5mbywgICAgICAgICAgICAgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfTUlOSU1JWkVfSkFWQV9ERUJVR19JTkZPKSkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgUmVjb3ZlcnlQYXRoLCAgICAgICAgICAgICAgICAgICAgICAkKFRBUkdFVF9DT1BZX09VVF9SRUNPVkVSWSkpCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRpbmdSZWNvdmVyeUltYWdlLCAgICAgICAgICAgICAkKEJVSUxESU5HX1JFQ09WRVJZX0lNQUdFKSkKIAogJChjYWxsIGFkZF9qc29uX2Jvb2wsIFVzZUdvbWEsICAgICAgICAgICAgICAgICAgICAgICAgICAgJChmaWx0ZXItb3V0IGZhbHNlLCQoVVNFX0dPTUEpKSkKICQoY2FsbCBhZGRfanNvbl9ib29sLCBVc2VSQkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZmlsdGVyLW91dCBmYWxzZSwkKFVTRV9SQkUpKSkKQEAgLTIxMiwyOSArMjA5LDE5IEBACiAKICQoY2FsbCBhZGRfanNvbl9saXN0LCBQZ29BZGRpdGlvbmFsUHJvZmlsZURpcnMsICAgICAgICAgICQoUEdPX0FERElUSU9OQUxfUFJPRklMRV9ESVJTKSkKIAotJChjYWxsIGFkZF9qc29uX2xpc3QsIEJvYXJkUGxhdFZlbmRvclBvbGljeSwgICAgICAgICAgICAgJChCT0FSRF9QTEFUX1ZFTkRPUl9QT0xJQ1kpKQotJChjYWxsIGFkZF9qc29uX2xpc3QsIEJvYXJkUmVxZE1hc2tQb2xpY3ksICAgICAgICAgICAgICAgJChCT0FSRF9SRVFEX01BU0tfUE9MSUNZKSkKLSQoY2FsbCBhZGRfanNvbl9saXN0LCBCb2FyZFN5c3RlbUV4dFB1YmxpY1ByZWJ1aWx0RGlycywgICQoQk9BUkRfU1lTVEVNX0VYVF9QVUJMSUNfUFJFQlVJTFRfRElSUykpCi0kKGNhbGwgYWRkX2pzb25fbGlzdCwgQm9hcmRTeXN0ZW1FeHRQcml2YXRlUHJlYnVpbHREaXJzLCAkKEJPQVJEX1NZU1RFTV9FWFRfUFJJVkFURV9QUkVCVUlMVF9ESVJTKSkKLSQoY2FsbCBhZGRfanNvbl9saXN0LCBCb2FyZFByb2R1Y3RQdWJsaWNQcmVidWlsdERpcnMsICAgICQoQk9BUkRfUFJPRFVDVF9QVUJMSUNfUFJFQlVJTFRfRElSUykpCi0kKGNhbGwgYWRkX2pzb25fbGlzdCwgQm9hcmRQcm9kdWN0UHJpdmF0ZVByZWJ1aWx0RGlycywgICAkKEJPQVJEX1BST0RVQ1RfUFJJVkFURV9QUkVCVUlMVF9ESVJTKSkKICQoY2FsbCBhZGRfanNvbl9saXN0LCBCb2FyZFZlbmRvclNlcG9saWN5RGlycywgICAgICAgICAgICQoQk9BUkRfVkVORE9SX1NFUE9MSUNZX0RJUlMpICQoQk9BUkRfU0VQT0xJQ1lfRElSUykpCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgQm9hcmRPZG1TZXBvbGljeURpcnMsICAgICAgICAgICAgICAkKEJPQVJEX09ETV9TRVBPTElDWV9ESVJTKSkKLSQoY2FsbCBhZGRfanNvbl9saXN0LCBCb2FyZFZlbmRvckRsa21TZXBvbGljeURpcnMsICAgICAgICQoQk9BUkRfVkVORE9SX0RMS01fU0VQT0xJQ1lfRElSUykpCi0kKGNhbGwgYWRkX2pzb25fbGlzdCwgQm9hcmRPZG1EbGttU2Vwb2xpY3lEaXJzLCAgICAgICAgICAkKEJPQVJEX09ETV9ETEtNX1NFUE9MSUNZX0RJUlMpKQotJChjYWxsIGFkZF9qc29uX2xpc3QsIEJvYXJkU3lzdGVtRGxrbVNlcG9saWN5RGlycywgICAgICAgJChCT0FSRF9TWVNURU1fRExLTV9TRVBPTElDWV9ESVJTKSkKICQoY2FsbCBhZGRfanNvbl9saXN0LCBTeXN0ZW1FeHRQdWJsaWNTZXBvbGljeURpcnMsICAgICAgICQoU1lTVEVNX0VYVF9QVUJMSUNfU0VQT0xJQ1lfRElSUykpCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgU3lzdGVtRXh0UHJpdmF0ZVNlcG9saWN5RGlycywgICAgICAkKFNZU1RFTV9FWFRfUFJJVkFURV9TRVBPTElDWV9ESVJTKSkKICQoY2FsbCBhZGRfanNvbl9saXN0LCBCb2FyZFNlcG9saWN5TTREZWZzLCAgICAgICAgICAgICAgICQoQk9BUkRfU0VQT0xJQ1lfTTRERUZTKSkKICQoY2FsbCBhZGRfanNvbl9zdHIsICBCb2FyZFNlcG9saWN5VmVycywgICAgICAgICAgICAgICAgICQoQk9BUkRfU0VQT0xJQ1lfVkVSUykpCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgU3lzdGVtRXh0U2Vwb2xpY3lQcmVidWlsdEFwaURpciwgICAkKEJPQVJEX1NZU1RFTV9FWFRfUFJFQlVJTFRfRElSKSkKICQoY2FsbCBhZGRfanNvbl9zdHIsICBQcm9kdWN0U2Vwb2xpY3lQcmVidWlsdEFwaURpciwgICAgICQoQk9BUkRfUFJPRFVDVF9QUkVCVUlMVF9ESVIpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgIEJvYXJkUGxhdGZvcm0sICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pKQogCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgUGxhdGZvcm1TZXBvbGljeVZlcnNpb24sICAgICAgICAgICAkKFBMQVRGT1JNX1NFUE9MSUNZX1ZFUlNJT04pKQotJChjYWxsIGFkZF9qc29uX3N0ciwgIFRvdFNlcG9saWN5VmVyc2lvbiwgICAgICAgICAgICAgICAgJChUT1RfU0VQT0xJQ1lfVkVSU0lPTikpCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgUGxhdGZvcm1TZXBvbGljeUNvbXBhdFZlcnNpb25zLCAgICAkKFBMQVRGT1JNX1NFUE9MSUNZX0NPTVBBVF9WRVJTSU9OUykpCiAKLSQoY2FsbCBhZGRfanNvbl9ib29sLCBGbGF0dGVuX2FwZXgsICAgICAgICAgICAgICAgICAgICAgICQoZmlsdGVyIHRydWUsJChUQVJHRVRfRkxBVFRFTl9BUEVYKSkpCiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgRm9yY2VBcGV4U3ltbGlua09wdGltaXphdGlvbiwgICAgICAkKGZpbHRlciB0cnVlLCQoVEFSR0VUX0ZPUkNFX0FQRVhfU1lNTElOS19PUFRJTUlaQVRJT04pKSkKIAogJChjYWxsIGFkZF9qc29uX3N0ciwgIERleHByZW9wdEdsb2JhbENvbmZpZywgICAgICAgICAgICAgJChERVhfUFJFT1BUX0NPTkZJRykpCkBAIC0yNDQsNiArMjMxLDcgQEAKICQoY2FsbCBhZGRfanNvbl9saXN0LCBNYW5pZmVzdFBhY2thZ2VOYW1lT3ZlcnJpZGVzLCAgICAgICQoUFJPRFVDVF9NQU5JRkVTVF9QQUNLQUdFX05BTUVfT1ZFUlJJREVTKSkKICQoY2FsbCBhZGRfanNvbl9saXN0LCBQYWNrYWdlTmFtZU92ZXJyaWRlcywgICAgICAgICAgICAgICQoUFJPRFVDVF9QQUNLQUdFX05BTUVfT1ZFUlJJREVTKSkKICQoY2FsbCBhZGRfanNvbl9saXN0LCBDZXJ0aWZpY2F0ZU92ZXJyaWRlcywgICAgICAgICAgICAgICQoUFJPRFVDVF9DRVJUSUZJQ0FURV9PVkVSUklERVMpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIENvbmZpZ3VyZWRKYXJMb2NhdGlvbk92ZXJyaWRlcywgICAgJChQUk9EVUNUX0NPTkZJR1VSRURfSkFSX0xPQ0FUSU9OX09WRVJSSURFUykpCiAKICQoY2FsbCBhZGRfanNvbl9zdHIsIEFwZXhHbG9iYWxNaW5TZGtWZXJzaW9uT3ZlcnJpZGUsICAgICQoQVBFWF9HTE9CQUxfTUlOX1NES19WRVJTSU9OX09WRVJSSURFKSkKIApAQCAtMjU5LDcgKzI0NywxMSBAQAogCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgVGFyZ2V0RlNDb25maWdHZW4sICAgICAgICAgICAgICAgICAkKFRBUkdFVF9GU19DT05GSUdfR0VOKSkKIAotJChjYWxsIGFkZF9qc29uX2xpc3QsIE1pc3NpbmdVc2VzTGlicmFyaWVzLCAgICAgICAgICAgICAgJChJTlRFUk5BTF9QTEFURk9STV9NSVNTSU5HX1VTRVNfTElCUkFSSUVTKSkKKyMgQWx0aG91Z2ggVVNFX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFIGRldGVybWluZXMgd2hldGhlciB0byB1c2UgdGhlIHN5c3RlbSBpbWFnZSBzcGVjaWZpZWQgYnkKKyMgUFJPRFVDVF9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSwgUFJPRFVDVF9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSBpcyBzdGlsbCB1c2VkIHRvIGNvbXBhcmUKKyMgaW5zdGFsbGVkIGZpbGVzIGJldHdlZW4gbWFrZSBhbmQgc29vbmcsIHJlZ2FyZGxlc3Mgb2YgdGhlIFVTRV9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSBzZXR0aW5nLgorJChjYWxsIGFkZF9qc29uX2Jvb2wsIFVzZVNvb25nU3lzdGVtSW1hZ2UsICAgICAgICAgICAgICAgJChmaWx0ZXIgdHJ1ZSwkKFVTRV9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSkpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgIFByb2R1Y3RTb29uZ0RlZmluZWRTeXN0ZW1JbWFnZSwgICAgJChQUk9EVUNUX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFKSkKIAogJChjYWxsIGFkZF9qc29uX21hcCwgVmVuZG9yVmFycykKICQoZm9yZWFjaCBuYW1lc3BhY2UsJChzb3J0ICQoU09PTkdfQ09ORklHX05BTUVTUEFDRVMpKSxcCkBAIC0yNjksMTkgKzI2MSwyMyBAQAogICAkKGNhbGwgZW5kX2pzb25fbWFwKSkKICQoY2FsbCBlbmRfanNvbl9tYXApCiAKKyMgQWRkIHRoZSB0eXBlcyBvZiB0aGUgdmFyaWFibGVzIGluIFZlbmRvclZhcnMuIFNpbmNlIHRoaXMgaXMgbXVjaCBuZXdlcgorIyB0aGFuIFZlbmRvclZhcnMsIHdoaWNoIGhhcyBhIGhpc3Rvcnkgb2YganVzdCB1c2luZyBzdHJpbmcgdmFsdWVzIGZvciBldmVyeXRoaW5nLAorIyB2YXJpYWJsZXMgYXJlIGFzc3VtZWQgdG8gYmUgc3RyaW5ncyBieSBkZWZhdWx0LiBGb3Igc3RyaW5ncywgU09PTkdfQ09ORklHX1RZUEVfKgorIyB3aWxsIG5vdCBiZSBzZXQsIGFuZCB0aGV5IHdpbGwgbm90IGhhdmUgYW4gZW50cnkgaW4gdGhlIFZlbmRvclZhclR5cGVzIG1hcC4KKyQoY2FsbCBhZGRfanNvbl9tYXAsIFZlbmRvclZhclR5cGVzKQorJChmb3JlYWNoIG5hbWVzcGFjZSwkKHNvcnQgJChTT09OR19DT05GSUdfTkFNRVNQQUNFUykpLFwKKyAgJChjYWxsIGFkZF9qc29uX21hcCwgJChuYW1lc3BhY2UpKVwKKyAgJChmb3JlYWNoIGtleSwkKHNvcnQgJChTT09OR19DT05GSUdfJChuYW1lc3BhY2UpKSksXAorICAgICQoaWYgJChTT09OR19DT05GSUdfVFlQRV8kKG5hbWVzcGFjZSlfJChrZXkpKSwkKGNhbGwgYWRkX2pzb25fc3RyLCQoa2V5KSwkKHN1YnN0ICIsXCIsJChTT09OR19DT05GSUdfVFlQRV8kKG5hbWVzcGFjZSlfJChrZXkpKSkpKSlcCisgICQoY2FsbCBlbmRfanNvbl9tYXApKQorJChjYWxsIGVuZF9qc29uX21hcCkKKwogJChjYWxsIGFkZF9qc29uX2Jvb2wsIEVuZm9yY2VQcm9kdWN0UGFydGl0aW9uSW50ZXJmYWNlLCAgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfRU5GT1JDRV9QUk9EVUNUX1BBUlRJVElPTl9JTlRFUkZBQ0UpKSkKICQoY2FsbCBhZGRfanNvbl9zdHIsICBEZXZpY2VDdXJyZW50QXBpTGV2ZWxGb3JWZW5kb3JNb2R1bGVzLCAgJChCT0FSRF9DVVJSRU5UX0FQSV9MRVZFTF9GT1JfVkVORE9SX01PRFVMRVMpKQogCi0kKGNhbGwgYWRkX2pzb25fYm9vbCwgRW5mb3JjZUludGVyUGFydGl0aW9uSmF2YVNka0xpYnJhcnksICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX0VORk9SQ0VfSU5URVJfUEFSVElUSU9OX0pBVkFfU0RLX0xJQlJBUlkpKSkKLSQoY2FsbCBhZGRfanNvbl9saXN0LCBJbnRlclBhcnRpdGlvbkphdmFMaWJyYXJ5QWxsb3dMaXN0LCAkKFBST0RVQ1RfSU5URVJfUEFSVElUSU9OX0pBVkFfTElCUkFSWV9BTExPV0xJU1QpKQotCi0kKGNhbGwgYWRkX2pzb25fYm9vbCwgSW5zdGFsbEV4dHJhRmxhdHRlbmVkQXBleGVzLCAkKFBST0RVQ1RfSU5TVEFMTF9FWFRSQV9GTEFUVEVORURfQVBFWEVTKSkKLQogJChjYWxsIGFkZF9qc29uX2Jvb2wsIENvbXByZXNzZWRBcGV4LCAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9DT01QUkVTU0VEX0FQRVgpKSkKLQotaWZuZGVmIEFQRVhfQlVJTERfRk9SX1BSRV9TX0RFVklDRVMKLSQoY2FsbCBhZGRfanNvbl9ib29sLCBUcmltbWVkQXBleCwgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfVFJJTU1FRF9BUEVYKSkpCi1lbmRpZgorJChjYWxsIGFkZF9qc29uX3N0ciwgRGVmYXVsdEFwZXhQYXlsb2FkVHlwZSwgJChQUk9EVUNUX0RFRkFVTFRfQVBFWF9QQVlMT0FEX1RZUEUpKQogCiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgQm9hcmRVc2VzUmVjb3ZlcnlBc0Jvb3QsICQoZmlsdGVyIHRydWUsJChCT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1QpKSkKIApAQCAtMjkxLDE3ICsyODcsMjMgQEAKICQoY2FsbCBhZGRfanNvbl9ib29sLCBCb2FyZE1vdmVSZWNvdmVyeVJlc291cmNlc1RvVmVuZG9yQm9vdCwgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX01PVkVfUkVDT1ZFUllfUkVTT1VSQ0VTX1RPX1ZFTkRPUl9CT09UKSkpCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgUHJlYnVpbHRIaWRkZW5BcGlEaXIsICQoQk9BUkRfUFJFQlVJTFRfSElEREVOQVBJX0RJUikpCiAKLSQoY2FsbCBhZGRfanNvbl9zdHIsICBTaGlwcGluZ0FwaUxldmVsLCAkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBTaGlwcGluZ19hcGlfbGV2ZWwsICQoUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwpKQogCi0kKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRCcm9rZW5DbGFuZ1Byb3BlcnR5LCAgICAgICAgICAgJChmaWx0ZXIgdHJ1ZSwkKEJVSUxEX0JST0tFTl9DTEFOR19QUk9QRVJUWSkpKQotJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJ1aWxkQnJva2VuQ2xhbmdBc0ZsYWdzLCAgICAgICAgICAgICQoZmlsdGVyIHRydWUsJChCVUlMRF9CUk9LRU5fQ0xBTkdfQVNGTEFHUykpKQotJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJ1aWxkQnJva2VuQ2xhbmdDRmxhZ3MsICAgICAgICAgICAgICQoZmlsdGVyIHRydWUsJChCVUlMRF9CUk9LRU5fQ0xBTkdfQ0ZMQUdTKSkpCi0kKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRCcm9rZW5EZXBmaWxlLCAgICAgICAgICAgICAgICAgJChmaWx0ZXIgdHJ1ZSwkKEJVSUxEX0JST0tFTl9ERVBGSUxFKSkpCi0kKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRCcm9rZW5FbmZvcmNlU3lzcHJvcE93bmVyLCAgICAgJChmaWx0ZXIgdHJ1ZSwkKEJVSUxEX0JST0tFTl9FTkZPUkNFX1NZU1BST1BfT1dORVIpKSkKLSQoY2FsbCBhZGRfanNvbl9ib29sLCBCdWlsZEJyb2tlblRyZWJsZVN5c3Byb3BOZXZlcmFsbG93LCAkKGZpbHRlciB0cnVlLCQoQlVJTERfQlJPS0VOX1RSRUJMRV9TWVNQUk9QX05FVkVSQUxMT1cpKSkKLSQoY2FsbCBhZGRfanNvbl9ib29sLCBCdWlsZEJyb2tlblVzZXNTb29uZ1B5dGhvbjJNb2R1bGVzLCAkKGZpbHRlciB0cnVlLCQoQlVJTERfQlJPS0VOX1VTRVNfU09PTkdfUFlUSE9OMl9NT0RVTEVTKSkpCi0kKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRCcm9rZW5WZW5kb3JQcm9wZXJ0eU5hbWVzcGFjZSwgJChmaWx0ZXIgdHJ1ZSwkKEJVSUxEX0JST0tFTl9WRU5ET1JfUFJPUEVSVFlfTkFNRVNQQUNFKSkpCi0kKGNhbGwgYWRkX2pzb25fbGlzdCwgQnVpbGRCcm9rZW5JbnB1dERpck1vZHVsZXMsICQoQlVJTERfQlJPS0VOX0lOUFVUX0RJUl9NT0RVTEVTKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBCdWlsZEJyb2tlblBsdWdpblZhbGlkYXRpb24sICAgICAgICAgJChCVUlMRF9CUk9LRU5fUExVR0lOX1ZBTElEQVRJT04pKQorJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJ1aWxkQnJva2VuQ2xhbmdQcm9wZXJ0eSwgICAgICAgICAgICAkKGZpbHRlciB0cnVlLCQoQlVJTERfQlJPS0VOX0NMQU5HX1BST1BFUlRZKSkpCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRCcm9rZW5DbGFuZ0FzRmxhZ3MsICAgICAgICAgICAgICQoZmlsdGVyIHRydWUsJChCVUlMRF9CUk9LRU5fQ0xBTkdfQVNGTEFHUykpKQorJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJ1aWxkQnJva2VuQ2xhbmdDRmxhZ3MsICAgICAgICAgICAgICAkKGZpbHRlciB0cnVlLCQoQlVJTERfQlJPS0VOX0NMQU5HX0NGTEFHUykpKQorIyBVc2UgdGhlIHZhbHVlIG9mIEdFTlJVTEVfU0FOREJPWElORyBpZiBzZXQsIG90aGVyd2lzZSB1c2UgdGhlIGludmVyc2Ugb2YgQlVJTERfQlJPS0VOX0dFTlJVTEVfU0FOREJPWElORworJChjYWxsIGFkZF9qc29uX2Jvb2wsIEdlbnJ1bGVTYW5kYm94aW5nLCAgICAgICAgICAgICAgICAgICAkKGlmICQoR0VOUlVMRV9TQU5EQk9YSU5HKSwkKGZpbHRlciB0cnVlLCQoR0VOUlVMRV9TQU5EQk9YSU5HKSksJChpZiAkKGZpbHRlciB0cnVlLCQoQlVJTERfQlJPS0VOX0dFTlJVTEVfU0FOREJPWElORykpLCx0cnVlKSkpCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRCcm9rZW5FbmZvcmNlU3lzcHJvcE93bmVyLCAgICAgICQoZmlsdGVyIHRydWUsJChCVUlMRF9CUk9LRU5fRU5GT1JDRV9TWVNQUk9QX09XTkVSKSkpCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRCcm9rZW5UcmVibGVTeXNwcm9wTmV2ZXJhbGxvdywgICQoZmlsdGVyIHRydWUsJChCVUlMRF9CUk9LRU5fVFJFQkxFX1NZU1BST1BfTkVWRVJBTExPVykpKQorJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJ1aWxkQnJva2VuVmVuZG9yUHJvcGVydHlOYW1lc3BhY2UsICAkKGZpbHRlciB0cnVlLCQoQlVJTERfQlJPS0VOX1ZFTkRPUl9QUk9QRVJUWV9OQU1FU1BBQ0UpKSkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBCdWlsZEJyb2tlbkluY29ycmVjdFBhcnRpdGlvbkltYWdlcywgJChmaWx0ZXIgdHJ1ZSwkKEJVSUxEX0JST0tFTl9JTkNPUlJFQ1RfUEFSVElUSU9OX0lNQUdFUykpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIEJ1aWxkQnJva2VuSW5wdXREaXJNb2R1bGVzLCAgICAgICAgICAkKEJVSUxEX0JST0tFTl9JTlBVVF9ESVJfTU9EVUxFUykpCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRCcm9rZW5Eb250Q2hlY2tTeXN0ZW1TZGssICAgICAgICQoZmlsdGVyIHRydWUsJChCVUlMRF9CUk9LRU5fRE9OVF9DSEVDS19TWVNURU1TREspKSkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBCdWlsZEJyb2tlbkR1cFN5c3Byb3AsICAgICAgICAgICAgICAgJChmaWx0ZXIgdHJ1ZSwkKEJVSUxEX0JST0tFTl9EVVBfU1lTUFJPUCkpKQorCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgQnVpbGRXYXJuaW5nQmFkT3B0aW9uYWxVc2VzTGlic0FsbG93bGlzdCwgICAgJChCVUlMRF9XQVJOSU5HX0JBRF9PUFRJT05BTF9VU0VTX0xJQlNfQUxMT1dMSVNUKSkKIAogJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJ1aWxkRGVidWdmc1Jlc3RyaWN0aW9uc0VuYWJsZWQsICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX1NFVF9ERUJVR0ZTX1JFU1RSSUNUSU9OUykpKQogCkBAIC0zMDksOCArMzExLDYgQEAKIAogJChjYWxsIGFkZF9qc29uX2Jvb2wsIFNlbGludXhJZ25vcmVOZXZlcmFsbG93cywgJChmaWx0ZXIgdHJ1ZSwkKFNFTElOVVhfSUdOT1JFX05FVkVSQUxMT1dTKSkpCiAKLSQoY2FsbCBhZGRfanNvbl9ib29sLCBTZXBvbGljeVNwbGl0LCAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9TRVBPTElDWV9TUExJVCkpKQotCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgU2Vwb2xpY3lGcmVlemVUZXN0RXh0cmFEaXJzLCAgICAgICAgICQoU0VQT0xJQ1lfRlJFRVpFX1RFU1RfRVhUUkFfRElSUykpCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgU2Vwb2xpY3lGcmVlemVUZXN0RXh0cmFQcmVidWlsdERpcnMsICQoU0VQT0xJQ1lfRlJFRVpFX1RFU1RfRVhUUkFfUFJFQlVJTFRfRElSUykpCiAKQEAgLTMxOCwxNCArMzE4LDI1OSBAQAogCiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgSWdub3JlUHJlZmVyMzJPbkRldmljZSwgJChmaWx0ZXIgdHJ1ZSwkKElHTk9SRV9QUkVGRVIzMl9PTl9ERVZJQ0UpKSkKIAotJChjYWxsIGFkZF9qc29uX2xpc3QsIEluY2x1ZGVUYWdzLCAgICAgICAgICAgICAgICAkKFBST0RVQ1RfSU5DTFVERV9UQUdTKSkKICQoY2FsbCBhZGRfanNvbl9saXN0LCBTb3VyY2VSb290RGlycywgICAgICAgICAgICAgJChQUk9EVUNUX1NPVVJDRV9ST09UX0RJUlMpKQogCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgQWZkb1Byb2ZpbGVzLCAgICAgICAgICAgICAgICAkKEFMTF9BRkRPX1BST0ZJTEVTKSkKIAogJChjYWxsIGFkZF9qc29uX3N0ciwgIFByb2R1Y3RNYW51ZmFjdHVyZXIsICQoUFJPRFVDVF9NQU5VRkFDVFVSRVIpKQogJChjYWxsIGFkZF9qc29uX3N0ciwgIFByb2R1Y3RCcmFuZCwgICAgICAgICQoUFJPRFVDVF9CUkFORCkpCi0kKGNhbGwgYWRkX2pzb25fbGlzdCwgQnVpbGRWZXJzaW9uVGFncywgICAgJChCVUlMRF9WRVJTSU9OX1RBR1MpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgIFByb2R1Y3REZXZpY2UsICAgICAgICQoUFJPRFVDVF9ERVZJQ0UpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgIFByb2R1Y3RNb2RlbCwgICAgICAgICQoUFJPRFVDVF9NT0RFTCkpCisKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFJlbGVhc2VWZXJzaW9uLCAgICAkKF9SRUxFQVNFX1ZFUlNJT04pKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIFJlbGVhc2VBY29uZmlnVmFsdWVTZXRzLCAgICAkKFJFTEVBU0VfQUNPTkZJR19WQUxVRV9TRVRTKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFJlbGVhc2VBY29uZmlnRmxhZ0RlZmF1bHRQZXJtaXNzaW9uLCAgICAkKFJFTEVBU0VfQUNPTkZJR19GTEFHX0RFRkFVTFRfUEVSTUlTU0lPTikpCisKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBSZWxlYXNlRGVmYXVsdE1vZHVsZUJ1aWxkRnJvbVNvdXJjZSwgICAkKFJFTEVBU0VfREVGQVVMVF9NT0RVTEVfQlVJTERfRlJPTV9TT1VSQ0UpKQorCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgQ2hlY2tWZW5kb3JTZWFwcFZpb2xhdGlvbnMsICQoZmlsdGVyIHRydWUsJChDSEVDS19WRU5ET1JfU0VBUFBfVklPTEFUSU9OUykpKQorCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRJZ25vcmVBcGV4Q29udHJpYnV0aW9uQ29udGVudHMsICQoUFJPRFVDVF9CVUlMRF9JR05PUkVfQVBFWF9DT05UUklCVVRJT05fQ09OVEVOVFMpKQorCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRGcm9tU291cmNlU3R1YiwgJChmaW5kc3RyaW5nIHRydWUsJChQUk9EVUNUX0JVSUxEX0ZST01fU09VUkNFX1NUVUIpICQoQlVJTERfRlJPTV9TT1VSQ0VfU1RVQikpKQorCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgSGlkZGVuYXBpRXhwb3J0YWJsZVN0dWJzLCAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9ISURERU5fQVBJX0VYUE9SVEFCTEVfU1RVQlMpKSkKKworJChjYWxsIGFkZF9qc29uX2Jvb2wsIEV4cG9ydFJ1bnRpbWVBcGlzLCAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9FWFBPUlRfUlVOVElNRV9BUElTKSkpCisKKyQoY2FsbCBhZGRfanNvbl9zdHIsIEFjb25maWdDb250YWluZXJWYWxpZGF0aW9uLCAkKEFDT05GSUdfQ09OVEFJTkVSX1ZBTElEQVRJT04pKQorCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgUHJvZHVjdExvY2FsZXMsICQoc3Vic3QgXywtLCQoUFJPRFVDVF9MT0NBTEVTKSkpCisKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBQcm9kdWN0RGVmYXVsdFdpZmlDaGFubmVscywgJChQUk9EVUNUX0RFRkFVTFRfV0lGSV9DSEFOTkVMUykpCisKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBCb2FyZFVzZVZibWV0YURpZ2VzdEluRmluZ2VycHJpbnQsICQoZmlsdGVyIHRydWUsJChCT0FSRF9VU0VfVkJNRVRBX0RJR1RFU1RfSU5fRklOR0VSUFJJTlQpKSkKKworJChjYWxsIGFkZF9qc29uX2xpc3QsIE9lbVByb3BlcnRpZXMsICQoUFJPRFVDVF9PRU1fUFJPUEVSVElFUykpCisKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBTeXN0ZW1Qcm9wRmlsZXMsICQoVEFSR0VUX1NZU1RFTV9QUk9QKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBTeXN0ZW1FeHRQcm9wRmlsZXMsICQoVEFSR0VUX1NZU1RFTV9FWFRfUFJPUCkpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgUHJvZHVjdFByb3BGaWxlcywgJChUQVJHRVRfUFJPRFVDVF9QUk9QKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBPZG1Qcm9wRmlsZXMsICQoVEFSR0VUX09ETV9QUk9QKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBWZW5kb3JQcm9wRmlsZXMsICQoVEFSR0VUX1ZFTkRPUl9QUk9QKSkKKworJChjYWxsIGFkZF9qc29uX3N0ciwgRXh0cmFBbGxvd2VkRGVwc1R4dCwgJChFWFRSQV9BTExPV0VEX0RFUFNfVFhUKSkKKworIyBEbyBub3Qgc2V0IEFydFRhcmdldEluY2x1ZGVEZWJ1Z0J1aWxkIGludG8gYW55IHZhbHVlIGlmIFBST0RVQ1RfQVJUX1RBUkdFVF9JTkNMVURFX0RFQlVHX0JVSUxEIGlzIG5vdCBzZXQsCisjIHRvIGhhdmUgdGhlIHNhbWUgYmVoYXZpb3IgZnJvbSBydW50aW1lX2xpYmFydC5tay4KK2lmbmVxICgkKFBST0RVQ1RfQVJUX1RBUkdFVF9JTkNMVURFX0RFQlVHX0JVSUxEKSwpCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgQXJ0VGFyZ2V0SW5jbHVkZURlYnVnQnVpbGQsICQoUFJPRFVDVF9BUlRfVEFSR0VUX0lOQ0xVREVfREVCVUdfQlVJTEQpKQorZW5kaWYKKworX2NvbmZpZ19lbmFibGVfdWZmZF9nYyA6PSBcCisgICQoZmlyc3R3b3JkICQoT1ZFUlJJREVfRU5BQkxFX1VGRkRfR0MpICQoUFJPRFVDVF9FTkFCTEVfVUZGRF9HQykgZGVmYXVsdCkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIEVuYWJsZVVmZmRHYywgJChfY29uZmlnX2VuYWJsZV91ZmZkX2djKSkKK19jb25maWdfZW5hYmxlX3VmZmRfZ2MgOj0KKyQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkS2VybmVsVmVyc2lvbiwgJChCT0FSRF9LRVJORUxfVkVSU0lPTikpCisKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBEZXZpY2VGcmFtZXdvcmtDb21wYXRpYmlsaXR5TWF0cml4RmlsZSwgJChERVZJQ0VfRlJBTUVXT1JLX0NPTVBBVElCSUxJVFlfTUFUUklYX0ZJTEUpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIERldmljZVByb2R1Y3RDb21wYXRpYmlsaXR5TWF0cml4RmlsZSwgJChERVZJQ0VfUFJPRFVDVF9DT01QQVRJQklMSVRZX01BVFJJWF9GSUxFKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBCb2FyZEF2YlN5c3RlbUFkZEhhc2h0cmVlRm9vdGVyQXJncywgJChCT0FSRF9BVkJfU1lTVEVNX0FERF9IQVNIVFJFRV9GT09URVJfQVJHUykpCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgQm9hcmRBdmJFbmFibGUsICQoZmlsdGVyIHRydWUsJChCT0FSRF9BVkJfRU5BQkxFKSkpCisKKyQoY2FsbCBhZGRfanNvbl9zdHIsIEFkYktleXMsICQoUFJPRFVDVF9BREJfS0VZUykpCisKKyQoY2FsbCBhZGRfanNvbl9tYXAsIFBhcnRpdGlvblZhcnNGb3JTb29uZ01pZ3JhdGlvbk9ubHlEb05vdFVzZSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgIFByb2R1Y3REaXJlY3RvcnksICAgICQoZGlyICQoSU5URVJOQUxfUFJPRFVDVCkpKQorCisgICQoY2FsbCBhZGRfanNvbl9tYXAsUGFydGl0aW9uUXVhbGlmaWVkVmFyaWFibGVzKQorICAkKGZvcmVhY2ggaW1hZ2VfdHlwZSxJTklUX0JPT1QgQk9PVCBWRU5ET1JfQk9PVCBTWVNURU0gVkVORE9SIENBQ0hFIFVTRVJEQVRBIFBST0RVQ1QgU1lTVEVNX0VYVCBPRU0gT0RNIFZFTkRPUl9ETEtNIE9ETV9ETEtNIFNZU1RFTV9ETEtNLCBcCisgICAgJChjYWxsIGFkZF9qc29uX21hcCwkKGNhbGwgdG8tbG93ZXIsJChpbWFnZV90eXBlKSkpIFwKKyAgICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRpbmdJbWFnZSwgJChmaWx0ZXIgdHJ1ZSwkKEJVSUxESU5HXyQoaW1hZ2VfdHlwZSlfSU1BR0UpKSkgXAorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkRXJvZnNDb21wcmVzc29yLCAkKEJPQVJEXyQoaW1hZ2VfdHlwZSlJTUFHRV9FUk9GU19DT01QUkVTU09SKSkgXAorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkRXJvZnNDb21wcmVzc0hpbnRzLCAkKEJPQVJEXyQoaW1hZ2VfdHlwZSlJTUFHRV9FUk9GU19DT01QUkVTU19ISU5UUykpIFwKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZEVyb2ZzUGNsdXN0ZXJTaXplLCAkKEJPQVJEXyQoaW1hZ2VfdHlwZSlJTUFHRV9FUk9GU19QQ0xVU1RFUl9TSVpFKSkgXAorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkRXh0ZnNJbm9kZUNvdW50LCAkKEJPQVJEXyQoaW1hZ2VfdHlwZSlJTUFHRV9FWFRGU19JTk9ERV9DT1VOVCkpIFwKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZEV4dGZzUnN2UGN0LCAkKEJPQVJEXyQoaW1hZ2VfdHlwZSlJTUFHRV9FWFRGU19SU1ZfUENUKSkgXAorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkRjJmc1Nsb2FkQ29tcHJlc3NGbGFncywgJChCT0FSRF8kKGltYWdlX3R5cGUpSU1BR0VfRjJGU19TTE9BRF9DT01QUkVTU19GTEFHUykpIFwKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZEZpbGVTeXN0ZW1Db21wcmVzcywgJChCT0FSRF8kKGltYWdlX3R5cGUpSU1BR0VfRklMRV9TWVNURU1fQ09NUFJFU1MpKSBcCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRGaWxlU3lzdGVtVHlwZSwgJChCT0FSRF8kKGltYWdlX3R5cGUpSU1BR0VfRklMRV9TWVNURU1fVFlQRSkpIFwKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZEpvdXJuYWxTaXplLCAkKEJPQVJEXyQoaW1hZ2VfdHlwZSlJTUFHRV9KT1VSTkFMX1NJWkUpKSBcCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRQYXJ0aXRpb25SZXNlcnZlZFNpemUsICQoQk9BUkRfJChpbWFnZV90eXBlKUlNQUdFX1BBUlRJVElPTl9SRVNFUlZFRF9TSVpFKSkgXAorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkUGFydGl0aW9uU2l6ZSwgJChCT0FSRF8kKGltYWdlX3R5cGUpSU1BR0VfUEFSVElUSU9OX1NJWkUpKSBcCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRTcXVhc2hmc0Jsb2NrU2l6ZSwgJChCT0FSRF8kKGltYWdlX3R5cGUpSU1BR0VfU1FVQVNIRlNfQkxPQ0tfU0laRSkpIFwKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZFNxdWFzaGZzQ29tcHJlc3NvciwgJChCT0FSRF8kKGltYWdlX3R5cGUpSU1BR0VfU1FVQVNIRlNfQ09NUFJFU1NPUikpIFwKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZFNxdWFzaGZzQ29tcHJlc3Nvck9wdCwgJChCT0FSRF8kKGltYWdlX3R5cGUpSU1BR0VfU1FVQVNIRlNfQ09NUFJFU1NPUl9PUFQpKSBcCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRTcXVhc2hmc0Rpc2FibGU0a0FsaWduLCAkKEJPQVJEXyQoaW1hZ2VfdHlwZSlJTUFHRV9TUVVBU0hGU19ESVNBQkxFXzRLX0FMSUdOKSkgXAorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkQXZiS2V5UGF0aCwgJChCT0FSRF9BVkJfJChpbWFnZV90eXBlKV9LRVlfUEFUSCkpIFwKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZEF2YkFsZ29yaXRobSwgJChCT0FSRF9BVkJfJChpbWFnZV90eXBlKV9BTEdPUklUSE0pKSBcCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRBdmJSb2xsYmFja0luZGV4LCAkKEJPQVJEX0FWQl8kKGltYWdlX3R5cGUpX1JPTExCQUNLX0lOREVYKSkgXAorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkQXZiUm9sbGJhY2tJbmRleExvY2F0aW9uLCAkKEJPQVJEX0FWQl8kKGltYWdlX3R5cGUpX1JPTExCQUNLX0lOREVYX0xPQ0FUSU9OKSkgXAorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkQXZiQWRkSGFzaHRyZWVGb290ZXJBcmdzLCAkKEJPQVJEX0FWQl8kKGltYWdlX3R5cGUpX0FERF9IQVNIVFJFRV9GT09URVJfQVJHUykpIFwKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBQcm9kdWN0QmFzZUZzUGF0aCwgJChQUk9EVUNUXyQoaW1hZ2VfdHlwZSlfQkFTRV9GU19QQVRIKSkgXAorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIFByb2R1Y3RIZWFkcm9vbSwgJChQUk9EVUNUXyQoaW1hZ2VfdHlwZSlfSEVBRFJPT00pKSBcCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgUHJvZHVjdFZlcml0eVBhcnRpdGlvbiwgJChQUk9EVUNUXyQoaW1hZ2VfdHlwZSlfVkVSSVRZX1BBUlRJVElPTikpIFwKKyAgICAkKGNhbGwgZW5kX2pzb25fbWFwKSBcCisgICkKKyAgJChjYWxsIGVuZF9qc29uX21hcCkKKworICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgVGFyZ2V0VXNlcmltYWdlc1VzZUV4dDIsICQoZmlsdGVyIHRydWUsJChUQVJHRVRfVVNFUklNQUdFU19VU0VfRVhUMikpKQorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgVGFyZ2V0VXNlcmltYWdlc1VzZUV4dDMsICQoZmlsdGVyIHRydWUsJChUQVJHRVRfVVNFUklNQUdFU19VU0VfRVhUMykpKQorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgVGFyZ2V0VXNlcmltYWdlc1VzZUV4dDQsICQoZmlsdGVyIHRydWUsJChUQVJHRVRfVVNFUklNQUdFU19VU0VfRVhUNCkpKQorCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBUYXJnZXRVc2VyaW1hZ2VzU3BhcnNlRXh0RGlzYWJsZWQsICQoZmlsdGVyIHRydWUsJChUQVJHRVRfVVNFUklNQUdFU19TUEFSU0VfRVhUX0RJU0FCTEVEKSkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBUYXJnZXRVc2VyaW1hZ2VzU3BhcnNlRXJvZnNEaXNhYmxlZCwgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9VU0VSSU1BR0VTX1NQQVJTRV9FUk9GU19ESVNBQkxFRCkpKQorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgVGFyZ2V0VXNlcmltYWdlc1NwYXJzZVNxdWFzaGZzRGlzYWJsZWQsICQoZmlsdGVyIHRydWUsJChUQVJHRVRfVVNFUklNQUdFU19TUEFSU0VfU1FVQVNIRlNfRElTQUJMRUQpKSkKKyAgJChjYWxsIGFkZF9qc29uX2Jvb2wsIFRhcmdldFVzZXJpbWFnZXNTcGFyc2VGMmZzRGlzYWJsZWQsICQoZmlsdGVyIHRydWUsJChUQVJHRVRfVVNFUklNQUdFU19TUEFSU0VfRjJGU19ESVNBQkxFRCkpKQorCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkRXJvZnNDb21wcmVzc29yLCAkKEJPQVJEX0VST0ZTX0NPTVBSRVNTT1IpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZEVyb2ZzQ29tcHJlc3NvckhpbnRzLCAkKEJPQVJEX0VST0ZTX0NPTVBSRVNTX0hJTlRTKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRFcm9mc1BjbHVzdGVyU2l6ZSwgJChCT0FSRF9FUk9GU19QQ0xVU1RFUl9TSVpFKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRFcm9mc1NoYXJlRHVwQmxvY2tzLCAkKEJPQVJEX0VST0ZTX1NIQVJFX0RVUF9CTE9DS1MpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZEVyb2ZzVXNlTGVnYWN5Q29tcHJlc3Npb24sICQoQk9BUkRfRVJPRlNfVVNFX0xFR0FDWV9DT01QUkVTU0lPTikpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkRXh0NFNoYXJlRHVwQmxvY2tzLCAkKEJPQVJEX0VYVDRfU0hBUkVfRFVQX0JMT0NLUykpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkRmxhc2hMb2dpY2FsQmxvY2tTaXplLCAkKEJPQVJEX0ZMQVNIX0xPR0lDQUxfQkxPQ0tfU0laRSkpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkRmxhc2hFcmFzZUJsb2NrU2l6ZSwgJChCT0FSRF9GTEFTSF9FUkFTRV9CTE9DS19TSVpFKSkKKyAgJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJ1aWxkaW5nVmJtZXRhSW1hZ2UsICQoQlVJTERJTkdfVkJNRVRBX0lNQUdFKSkKKworICAjIGJvb3QgaW1hZ2Ugc3R1ZmYKKyAgJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJ1aWxkaW5nUmFtZGlza0ltYWdlLCAkKGZpbHRlciB0cnVlLCQoQlVJTERJTkdfUkFNRElTS19JTUFHRSkpKQorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgUHJvZHVjdEJ1aWxkQm9vdEltYWdlLCAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9CVUlMRF9CT09UX0lNQUdFKSkpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIFByb2R1Y3RCdWlsZFZlbmRvckJvb3RJbWFnZSwgJChQUk9EVUNUX0JVSUxEX1ZFTkRPUl9CT09UX0lNQUdFKSkKKyAgJChjYWxsIGFkZF9qc29uX2Jvb2wsIFByb2R1Y3RCdWlsZEluaXRCb290SW1hZ2UsICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX0JVSUxEX0lOSVRfQk9PVF9JTUFHRSkpKQorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgQm9hcmRVc2VzUmVjb3ZlcnlBc0Jvb3QsICQoZmlsdGVyIHRydWUsJChCT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1QpKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRQcmVidWlsdEJvb3RpbWFnZSwgJChCT0FSRF9QUkVCVUlMVF9CT09UX0lNQUdFKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRQcmVidWlsdEluaXRCb290aW1hZ2UsICQoQk9BUkRfUFJFQlVJTFRfSU5JVF9CT09UX0lNQUdFKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRCb290aW1hZ2VQYXJ0aXRpb25TaXplLCAkKEJPQVJEX0JPT1RJTUFHRV9QQVJUSVRJT05fU0laRSkpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkVmVuZG9yQm9vdGltYWdlUGFydGl0aW9uU2l6ZSwgJChCT0FSRF9WRU5ET1JfQk9PVElNQUdFX1BBUlRJVElPTl9TSVpFKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRJbml0Qm9vdGltYWdlUGFydGl0aW9uU2l6ZSwgJChCT0FSRF9JTklUX0JPT1RfSU1BR0VfUEFSVElUSU9OX1NJWkUpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZEJvb3RIZWFkZXJWZXJzaW9uLCAkKEJPQVJEX0JPT1RfSEVBREVSX1ZFUlNJT04pKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBUYXJnZXRLZXJuZWxQYXRoLCAkKFRBUkdFVF9LRVJORUxfUEFUSCkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBCb2FyZFVzZXNHZW5lcmljS2VybmVsSW1hZ2UsICQoQk9BUkRfVVNFU19HRU5FUklDX0tFUk5FTF9JTUFHRSkpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvb3RTZWN1cml0eVBhdGNoLCAkKEJPT1RfU0VDVVJJVFlfUEFUQ0gpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBJbml0Qm9vdFNlY3VyaXR5UGF0Y2gsICQoSU5JVF9CT09UX1NFQ1VSSVRZX1BBVENIKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgVmVuZG9yU2VjdXJpdHlQYXRjaCwgJChWRU5ET1JfU0VDVVJJVFlfUEFUQ0gpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBPZG1TZWN1cml0eVBhdGNoLCAkKE9ETV9TRUNVUklUWV9QQVRDSCkpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIFN5c3RlbURsa21TZWN1cml0eVBhdGNoLCAkKFNZU1RFTV9ETEtNX1NFQ1VSSVRZX1BBVENIKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgVmVuZG9yRGxrbVNlY3VyaXR5UGF0Y2gsICQoVkVORE9SX0RMS01fU0VDVVJJVFlfUEFUQ0gpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBPZG1EbGttU2VjdXJpdHlQYXRjaCwgJChPRE1fRExLTV9TRUNVUklUWV9QQVRDSCkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBCb2FyZEluY2x1ZGVEdGJJbkJvb3RpbWcsICQoQk9BUkRfSU5DTFVERV9EVEJfSU5fQk9PVElNRykpCisgICQoY2FsbCBhZGRfanNvbl9saXN0LCBJbnRlcm5hbEtlcm5lbENtZGxpbmUsICQoSU5URVJOQUxfS0VSTkVMX0NNRExJTkUpKQorICAkKGNhbGwgYWRkX2pzb25fbGlzdCwgSW50ZXJuYWxCb290Y29uZmlnLCAkKElOVEVSTkFMX0JPT1RDT05GSUcpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBJbnRlcm5hbEJvb3Rjb25maWdGaWxlLCAkKElOVEVSTkFMX0JPT1RDT05GSUdfRklMRSkpCisKKyAgIyBzdXBlciBpbWFnZSBzdHVmZgorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgUHJvZHVjdFVzZUR5bmFtaWNQYXJ0aXRpb25zLCAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9VU0VfRFlOQU1JQ19QQVJUSVRJT05TKSkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBQcm9kdWN0UmV0cm9maXREeW5hbWljUGFydGl0aW9ucywgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfUkVUUk9GSVRfRFlOQU1JQ19QQVJUSVRJT05TKSkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBQcm9kdWN0QnVpbGRTdXBlclBhcnRpdGlvbiwgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfQlVJTERfU1VQRVJfUEFSVElUSU9OKSkpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkU3VwZXJQYXJ0aXRpb25TaXplLCAkKEJPQVJEX1NVUEVSX1BBUlRJVElPTl9TSVpFKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRTdXBlclBhcnRpdGlvbk1ldGFkYXRhRGV2aWNlLCAkKEJPQVJEX1NVUEVSX1BBUlRJVElPTl9NRVRBREFUQV9ERVZJQ0UpKQorICAkKGNhbGwgYWRkX2pzb25fbGlzdCwgQm9hcmRTdXBlclBhcnRpdGlvbkJsb2NrRGV2aWNlcywgJChCT0FSRF9TVVBFUl9QQVJUSVRJT05fQkxPQ0tfREVWSUNFUykpCisgICQoY2FsbCBhZGRfanNvbl9tYXAsIEJvYXJkU3VwZXJQYXJ0aXRpb25Hcm91cHMpCisgICAgJChmb3JlYWNoIGdyb3VwLCAkKEJPQVJEX1NVUEVSX1BBUlRJVElPTl9HUk9VUFMpLCBcCisgICAgICAkKGNhbGwgYWRkX2pzb25fbWFwLCAkKGdyb3VwKSkgXAorICAgICAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBHcm91cFNpemUsICQoQk9BUkRfJChjYWxsIHRvLXVwcGVyLCQoZ3JvdXApKV9TSVpFKSkgXAorICAgICAgICAkKGlmICQoQk9BUkRfJChjYWxsIHRvLXVwcGVyLCQoZ3JvdXApKV9QQVJUSVRJT05fTElTVCksIFwKKyAgICAgICAgICAkKGNhbGwgYWRkX2pzb25fbGlzdCwgUGFydGl0aW9uTGlzdCwgJChCT0FSRF8kKGNhbGwgdG8tdXBwZXIsJChncm91cCkpX1BBUlRJVElPTl9MSVNUKSkpIFwKKyAgICAgICQoY2FsbCBlbmRfanNvbl9tYXApKQorICAgICQoY2FsbCBlbmRfanNvbl9tYXApCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBQcm9kdWN0VmlydHVhbEFiT3RhLCAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9WSVJUVUFMX0FCX09UQSkpKQorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgUHJvZHVjdFZpcnR1YWxBYk90YVJldHJvZml0LCAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9WSVJUVUFMX0FCX09UQV9SRVRST0ZJVCkpKQorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgQWJPdGFVcGRhdGVyLCAkKGZpbHRlciB0cnVlLCQoQUJfT1RBX1VQREFURVIpKSkKKworICAjIEF2YiAoYW5kcm9pZCB2ZXJpZmllZCBib290KSBzdHVmZgorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgQm9hcmRBdmJFbmFibGUsICQoZmlsdGVyIHRydWUsJChCT0FSRF9BVkJfRU5BQkxFKSkpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkQXZiQWxnb3JpdGhtLCAkKEJPQVJEX0FWQl9BTEdPUklUSE0pKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZEF2YktleVBhdGgsICQoQk9BUkRfQVZCX0tFWV9QQVRIKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRBdmJSb2xsYmFja0luZGV4LCAkKEJPQVJEX0FWQl9ST0xMQkFDS19JTkRFWCkpCisgICQoY2FsbCBhZGRfanNvbl9tYXAsIENoYWluZWRWYm1ldGFQYXJ0aXRpb25zKQorICAkKGZvcmVhY2ggcGFydGl0aW9uLHN5c3RlbSB2ZW5kb3IgJChCT0FSRF9BVkJfVkJNRVRBX0NVU1RPTV9QQVJUSVRJT05TKSxcCisgICAgJChjYWxsIGFkZF9qc29uX21hcCwgJChwYXJ0aXRpb24pKSBcCisgICAgICAkKGNhbGwgYWRkX2pzb25fbGlzdCxQYXJ0aXRpb25zLCQoQk9BUkRfQVZCX1ZCTUVUQV8kKGNhbGwgdG8tdXBwZXIsJChwYXJ0aXRpb24pKSkpIFwKKyAgICAgICQoY2FsbCBhZGRfanNvbl9zdHIsS2V5LCQoQk9BUkRfQVZCX1ZCTUVUQV8kKGNhbGwgdG8tdXBwZXIsJChwYXJ0aXRpb24pKV9LRVlfUEFUSCkpIFwKKyAgICAgICQoY2FsbCBhZGRfanNvbl9zdHIsQWxnb3JpdGhtLCQoQk9BUkRfQVZCX1ZCTUVUQV8kKGNhbGwgdG8tdXBwZXIsJChwYXJ0aXRpb24pKV9BTEdPUklUSE0pKSBcCisgICAgICAkKGNhbGwgYWRkX2pzb25fc3RyLFJvbGxiYWNrSW5kZXgsJChCT0FSRF9BVkJfVkJNRVRBXyQoY2FsbCB0by11cHBlciwkKHBhcnRpdGlvbikpX1JPTExCQUNLX0lOREVYKSkgXAorICAgICAgJChjYWxsIGFkZF9qc29uX3N0cixSb2xsYmFja0luZGV4TG9jYXRpb24sJChCT0FSRF9BVkJfVkJNRVRBXyQoY2FsbCB0by11cHBlciwkKHBhcnRpdGlvbikpX1JPTExCQUNLX0lOREVYX0xPQ0FUSU9OKSkgXAorICAgICQoY2FsbCBlbmRfanNvbl9tYXApKQorICAkKGNhbGwgZW5kX2pzb25fbWFwKQorCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBQcm9kdWN0VXNlRHluYW1pY1BhcnRpdGlvblNpemUsICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX1VTRV9EWU5BTUlDX1BBUlRJVElPTl9TSVpFKSkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBDb3B5SW1hZ2VzRm9yVGFyZ2V0RmlsZXNaaXAsICQoZmlsdGVyIHRydWUsJChDT1BZX0lNQUdFU19GT1JfVEFSR0VUX0ZJTEVTX1pJUCkpKQorCisgICQoY2FsbCBhZGRfanNvbl9saXN0LCBQcm9kdWN0UGFja2FnZXMsICQoUFJPRFVDVF9QQUNLQUdFUykpCisgICQoY2FsbCBhZGRfanNvbl9saXN0LCBQcm9kdWN0UGFja2FnZXNEZWJ1ZywgJChQUk9EVUNUX1BBQ0tBR0VTX0RFQlVHKSkKKworICAjIFVzZWQgdG8gZ2VuZXJhdGUgL3ZlbmRvci9saW5rZXIuY29uZmlnLnBiCisgICQoY2FsbCBhZGRfanNvbl9saXN0LCBWZW5kb3JMaW5rZXJDb25maWdTcmNzLCAkKFBST0RVQ1RfVkVORE9SX0xJTktFUl9DT05GSUdfRlJBR01FTlRTKSkKKyAgJChjYWxsIGFkZF9qc29uX2xpc3QsIFByb2R1Y3RMaW5rZXJDb25maWdTcmNzLCAkKFBST0RVQ1RfUFJPRFVDVF9MSU5LRVJfQ09ORklHX0ZSQUdNRU5UUykpCisKKyAgIyBVc2VkIHRvIGdlbmVyYXRlIF9kbGttIHBhcnRpdGlvbnMKKyAgJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJ1aWxkaW5nU3lzdGVtRGxrbUltYWdlLCAgICAgICAgICAgICAgICQoQlVJTERJTkdfU1lTVEVNX0RMS01fSU1BR0UpKQorICAkKGNhbGwgYWRkX2pzb25fbGlzdCwgU3lzdGVtS2VybmVsTW9kdWxlcywgJChCT0FSRF9TWVNURU1fS0VSTkVMX01PRFVMRVMpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBTeXN0ZW1LZXJuZWxCbG9ja2xpc3RGaWxlLCAkKEJPQVJEX1NZU1RFTV9LRVJORUxfTU9EVUxFU19CTE9DS0xJU1RfRklMRSkpCisgICQoY2FsbCBhZGRfanNvbl9saXN0LCBTeXN0ZW1LZXJuZWxMb2FkTW9kdWxlcywgJChCT0FSRF9TWVNURU1fS0VSTkVMX01PRFVMRVNfTE9BRCkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBCdWlsZGluZ1ZlbmRvckRsa21JbWFnZSwgICAgICAgICAgICAgICAkKEJVSUxESU5HX1ZFTkRPUl9ETEtNX0lNQUdFKSkKKyAgJChjYWxsIGFkZF9qc29uX2xpc3QsIFZlbmRvcktlcm5lbE1vZHVsZXMsICQoQk9BUkRfVkVORE9SX0tFUk5FTF9NT0RVTEVTKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgVmVuZG9yS2VybmVsQmxvY2tsaXN0RmlsZSwgJChCT0FSRF9WRU5ET1JfS0VSTkVMX01PRFVMRVNfQkxPQ0tMSVNUX0ZJTEUpKQorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRpbmdPZG1EbGttSW1hZ2UsICAgICAgICAgICAgICAgJChCVUlMRElOR19PRE1fRExLTV9JTUFHRSkpCisgICQoY2FsbCBhZGRfanNvbl9saXN0LCBPZG1LZXJuZWxNb2R1bGVzLCAkKEJPQVJEX09ETV9LRVJORUxfTU9EVUxFUykpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIE9kbUtlcm5lbEJsb2NrbGlzdEZpbGUsICQoQk9BUkRfT0RNX0tFUk5FTF9NT0RVTEVTX0JMT0NLTElTVF9GSUxFKSkKKyAgJChjYWxsIGFkZF9qc29uX2xpc3QsIFZlbmRvclJhbWRpc2tLZXJuZWxNb2R1bGVzLCAkKEJPQVJEX1ZFTkRPUl9SQU1ESVNLX0tFUk5FTF9NT0RVTEVTKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgVmVuZG9yUmFtZGlza0tlcm5lbEJsb2NrbGlzdEZpbGUsICQoQk9BUkRfVkVORE9SX1JBTURJU0tfS0VSTkVMX01PRFVMRVNfQkxPQ0tMSVNUX0ZJTEUpKQorICAkKGNhbGwgYWRkX2pzb25fbGlzdCwgVmVuZG9yUmFtZGlza0tlcm5lbExvYWRNb2R1bGVzLCAkKEJPQVJEX1ZFTkRPUl9SQU1ESVNLX0tFUk5FTF9NT0RVTEVTX0xPQUQpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBWZW5kb3JSYW1kaXNrS2VybmVsT3B0aW9uc0ZpbGUsICQoQk9BUkRfVkVORE9SX1JBTURJU0tfS0VSTkVMX01PRFVMRVNfT1BUSU9OU19GSUxFKSkKKworICAjIFVzZWQgdG8gZ2VuZXJhdGUgL3ZlbmRvci9idWlsZC5wcm9wCisgICQoY2FsbCBhZGRfanNvbl9saXN0LCBCb2FyZEluZm9GaWxlcywgJChpZiAkKFRBUkdFVF9CT0FSRF9JTkZPX0ZJTEVTKSwkKFRBUkdFVF9CT0FSRF9JTkZPX0ZJTEVTKSwkKGZpcnN0d29yZCAkKFRBUkdFVF9CT0FSRF9JTkZPX0ZJTEUpICQod2lsZGNhcmQgJChUQVJHRVRfREVWSUNFX0RJUikvYm9hcmQtaW5mby50eHQpKSkpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvb3RMb2FkZXJCb2FyZE5hbWUsICQoVEFSR0VUX0JPT1RMT0FERVJfQk9BUkRfTkFNRSkpCisKKyAgJChjYWxsIGFkZF9qc29uX2xpc3QsIFByb2R1Y3RDb3B5RmlsZXMsICQoUFJPRFVDVF9DT1BZX0ZJTEVTKSkKKworICAjIFVzZWQgdG8gZ2VuZXJhdGUgZnN2IG1ldGEKKyAgJChjYWxsIGFkZF9qc29uX2Jvb2wsIFByb2R1Y3RGc3Zlcml0eUdlbmVyYXRlTWV0YWRhdGEsICAgICAgICAgICAgICAgJChQUk9EVUNUX0ZTVkVSSVRZX0dFTkVSQVRFX01FVEFEQVRBKSkKKworICAjIFVzZWQgdG8gZ2VuZXJhdGUgcmVjb3ZlcnkgcGFydGl0aW9uCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIFRhcmdldFNjcmVlbkRlbnNpdHksICQoVEFSR0VUX1NDUkVFTl9ERU5TSVRZKSkKKworICAjIFVzZWQgdG8gZ2VuZXJhdGUgL3JlY292ZXJ5L3Jvb3QvYnVpbGQucHJvcAorICAkKGNhbGwgYWRkX2pzb25fbWFwLCBQcml2YXRlUmVjb3ZlcnlVaVByb3BlcnRpZXMpCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgYW5pbWF0aW9uX2ZwcywgJChUQVJHRVRfUkVDT1ZFUllfVUlfQU5JTUFUSU9OX0ZQUykpCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgbWFyZ2luX2hlaWdodCwgJChUQVJHRVRfUkVDT1ZFUllfVUlfTUFSR0lOX0hFSUdIVCkpCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgbWFyZ2luX3dpZHRoLCAkKFRBUkdFVF9SRUNPVkVSWV9VSV9NQVJHSU5fV0lEVEgpKQorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIG1lbnVfdW51c2FibGVfcm93cywgJChUQVJHRVRfUkVDT1ZFUllfVUlfTUVOVV9VTlVTQUJMRV9ST1dTKSkKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBwcm9ncmVzc19iYXJfYmFzZWxpbmUsICQoVEFSR0VUX1JFQ09WRVJZX1VJX1BST0dSRVNTX0JBUl9CQVNFTElORSkpCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgdG91Y2hfbG93X3RocmVzaG9sZCwgJChUQVJHRVRfUkVDT1ZFUllfVUlfVE9VQ0hfTE9XX1RIUkVTSE9MRCkpCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgdG91Y2hfaGlnaF90aHJlc2hvbGQsICQoVEFSR0VUX1JFQ09WRVJZX1VJX1RPVUNIX0hJR0hfVEhSRVNIT0xEKSkKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCB2cl9zdGVyZW9fb2Zmc2V0LCAkKFRBUkdFVF9SRUNPVkVSWV9VSV9WUl9TVEVSRU9fT0ZGU0VUKSkKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBicmlnaHRuZXNzX2ZpbGUsICQoVEFSR0VUX1JFQ09WRVJZX1VJX0JSSUdIVE5FU1NfRklMRSkpCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgbWF4X2JyaWdodG5lc3NfZmlsZSwgJChUQVJHRVRfUkVDT1ZFUllfVUlfTUFYX0JSSUdIVE5FU1NfRklMRSkpCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgYnJpZ2h0bmVzc19ub3JtYWxfcGVyY2VudCwgJChUQVJHRVRfUkVDT1ZFUllfVUlfQlJJR0hUTkVTU19OT1JNQUwpKQorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIGJyaWdodG5lc3NfZGltbWVkX3BlcmNlbnQsICQoVEFSR0VUX1JFQ09WRVJZX1VJX0JSSUdIVE5FU1NfRElNTUVEKSkKKyAgJChjYWxsIGVuZF9qc29uX21hcCkKKworJChjYWxsIGVuZF9qc29uX21hcCkKKworIyBGb3IgY29udmVydGluZyB2aW50Zl9kYXRhCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgRGV2aWNlTWF0cml4RmlsZSwgJChERVZJQ0VfTUFUUklYX0ZJTEUpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIFByb2R1Y3RNYW5pZmVzdEZpbGVzLCAkKFBST0RVQ1RfTUFOSUZFU1RfRklMRVMpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIFN5c3RlbU1hbmlmZXN0RmlsZSwgJChERVZJQ0VfRlJBTUVXT1JLX01BTklGRVNUX0ZJTEUpKQorU1lTVEVNX0VYVF9IV1NFUlZJQ0VfRklMRVMgOj0KK2lmZXEgKCQoUFJPRFVDVF9ISURMX0VOQUJMRUQpLHRydWUpCisgIGlmbmVxICgkKGZpbHRlciBod3NlcnZpY2VtYW5hZ2VyLCQoUFJPRFVDVF9QQUNLQUdFUykpLCkKKyAgICBTWVNURU1fRVhUX0hXU0VSVklDRV9GSUxFUyArPSBzeXN0ZW0vaHdzZXJ2aWNlbWFuYWdlci9od3NlcnZpY2VtYW5hZ2VyX25vX21heC54bWwKKyAgZWxzZQorICAgICQoZXJyb3IgSWYgUFJPRFVDVF9ISURMX0VOQUJMRUQgaXMgc2V0LCBod3NlcnZpY2VtYW5hZ2VyIG11c3QgYmUgYWRkZWQgdG8gUFJPRFVDVF9QQUNLQUdFUyBleHBsaWNpdGx5KQorICBlbmRpZgorZWxzZQorICBpZm5lcSAoJChmaWx0ZXIgaHdzZXJ2aWNlbWFuYWdlciwkKFBST0RVQ1RfUEFDS0FHRVMpKSwpCisgICAgU1lTVEVNX0VYVF9IV1NFUlZJQ0VfRklMRVMgKz0gc3lzdGVtL2h3c2VydmljZW1hbmFnZXIvaHdzZXJ2aWNlbWFuYWdlci54bWwKKyAgZWxzZSBpZm5lcSAoJChmaWx0ZXIgaHdzZXJ2aWNlbWFuYWdlciwkKFBST0RVQ1RfUEFDS0FHRVNfU0hJUFBJTkdfQVBJX0xFVkVMXzM0KSksKQorICAgIFNZU1RFTV9FWFRfSFdTRVJWSUNFX0ZJTEVTICs9IHN5c3RlbS9od3NlcnZpY2VtYW5hZ2VyL2h3c2VydmljZW1hbmFnZXIueG1sCisgIGVuZGlmCitlbmRpZgorJChjYWxsIGFkZF9qc29uX2xpc3QsIFN5c3RlbUV4dE1hbmlmZXN0RmlsZXMsICQoU1lTVEVNX0VYVF9NQU5JRkVTVF9GSUxFUykgJChTWVNURU1fRVhUX0hXU0VSVklDRV9GSUxFUykpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgRGV2aWNlTWFuaWZlc3RGaWxlcywgJChERVZJQ0VfTUFOSUZFU1RfRklMRSkpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgT2RtTWFuaWZlc3RGaWxlcywgJChPRE1fTUFOSUZFU1RfRklMRVMpKQogCiAkKGNhbGwganNvbl9lbmQpCiAKQEAgLTMzNyw0ICs1ODIsNiBAQAogCSAgcm0gJChTT09OR19WQVJJQUJMRVMpLnRtcDsgXAogCWZpKQogCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9zb29uZ19leHRyYV9jb25maWcubWsKKwogZW5kaWYgIyBDT05GSUdVUkVfU09PTkcKZGlmZiAtLWdpdCBhL2NvcmUvc29vbmdfZXh0cmFfY29uZmlnLm1rIGIvY29yZS9zb29uZ19leHRyYV9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVlZTUwYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc29vbmdfZXh0cmFfY29uZmlnLm1rCkBAIC0wLDAgKzEsMTA3IEBACiskKGNhbGwganNvbl9zdGFydCkKKworJChjYWxsIGFkZF9qc29uX3N0ciwgRGV2aWNlQ3B1VmFyaWFudFJ1bnRpbWUsICAgICAgICAgICAkKFRBUkdFVF9DUFVfVkFSSUFOVF9SVU5USU1FKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIERldmljZUFiaUxpc3QsICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQ1BVX0FCSV9MSVNUKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIERldmljZUFiaUxpc3QzMiwgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQ1BVX0FCSV9MSVNUXzMyX0JJVCkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCBEZXZpY2VBYmlMaXN0NjQsICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX0NQVV9BQklfTElTVF82NF9CSVQpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgRGV2aWNlU2Vjb25kYXJ5Q3B1VmFyaWFudFJ1bnRpbWUsICAkKFRBUkdFVF8yTkRfQ1BVX1ZBUklBTlRfUlVOVElNRSkpCisKKyQoY2FsbCBhZGRfanNvbl9zdHIsIERleDJvYXRUYXJnZXRDcHVWYXJpYW50UnVudGltZSwgICAgICAgICAkKERFWDJPQVRfVEFSR0VUX0NQVV9WQVJJQU5UX1JVTlRJTUUpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgRGV4Mm9hdFRhcmdldEluc3RydWN0aW9uU2V0RmVhdHVyZXMsICAgICQoREVYMk9BVF9UQVJHRVRfSU5TVFJVQ1RJT05fU0VUX0ZFQVRVUkVTKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFNlY29uZGFyeURleDJvYXRDcHVWYXJpYW50UnVudGltZSwgICAgICAkKCQoVEFSR0VUXzJORF9BUkNIX1ZBUl9QUkVGSVgpREVYMk9BVF9UQVJHRVRfQ1BVX1ZBUklBTlRfUlVOVElNRSkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCBTZWNvbmRhcnlEZXgyb2F0SW5zdHJ1Y3Rpb25TZXRGZWF0dXJlcywgJCgkKFRBUkdFVF8yTkRfQVJDSF9WQVJfUFJFRklYKURFWDJPQVRfVEFSR0VUX0lOU1RSVUNUSU9OX1NFVF9GRUFUVVJFUykpCisKKyQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkUGxhdGZvcm0sICAgICAgICAgICQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkU2hpcHBpbmdBcGlMZXZlbCwgICQoQk9BUkRfU0hJUFBJTkdfQVBJX0xFVkVMKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFNoaXBwaW5nQXBpTGV2ZWwsICAgICAgICQoUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgU2hpcHBpbmdWZW5kb3JBcGlMZXZlbCwgJChQUk9EVUNUX1NISVBQSU5HX1ZFTkRPUl9BUElfTEVWRUwpKQorCiskKGNhbGwgYWRkX2pzb25fc3RyLCBQcm9kdWN0TW9kZWwsICAgICAgICAgICAgICAgICAgICAgICQoUFJPRFVDVF9NT0RFTCkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCBQcm9kdWN0TW9kZWxGb3JBdHRlc3RhdGlvbiwgICAgICAgICQoUFJPRFVDVF9NT0RFTF9GT1JfQVRURVNUQVRJT04pKQorJChjYWxsIGFkZF9qc29uX3N0ciwgUHJvZHVjdEJyYW5kRm9yQXR0ZXN0YXRpb24sICAgICAgICAkKFBST0RVQ1RfQlJBTkRfRk9SX0FUVEVTVEFUSU9OKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFByb2R1Y3ROYW1lRm9yQXR0ZXN0YXRpb24sICAgICAgICAgJChQUk9EVUNUX05BTUVfRk9SX0FUVEVTVEFUSU9OKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFByb2R1Y3REZXZpY2VGb3JBdHRlc3RhdGlvbiwgICAgICAgJChQUk9EVUNUX0RFVklDRV9GT1JfQVRURVNUQVRJT04pKQorJChjYWxsIGFkZF9qc29uX3N0ciwgUHJvZHVjdE1hbnVmYWN0dXJlckZvckF0dGVzdGF0aW9uLCAkKFBST0RVQ1RfTUFOVUZBQ1RVUkVSX0ZPUl9BVFRFU1RBVElPTikpCisKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFN5c3RlbUJyYW5kLCAkKFBST0RVQ1RfU1lTVEVNX0JSQU5EKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFN5c3RlbURldmljZSwgJChQUk9EVUNUX1NZU1RFTV9ERVZJQ0UpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgU3lzdGVtTWFudWZhY3R1cmVyLCAkKFBST0RVQ1RfU1lTVEVNX01BTlVGQUNUVVJFUikpCiskKGNhbGwgYWRkX2pzb25fc3RyLCBTeXN0ZW1Nb2RlbCwgJChQUk9EVUNUX1NZU1RFTV9NT0RFTCkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCBTeXN0ZW1OYW1lLCAkKFBST0RVQ1RfU1lTVEVNX05BTUUpKQorCisjIENvbGxhcHNlcyA/PSBhbmQgPSBvcGVyYXRvcnMgZm9yIHN5c3RlbSBwcm9wZXJ0eSB2YXJpYWJsZXMuIEFsc28gcmVtb3ZlcyBkb3VibGUgcXVvdGVzIHRvIHByZXZlbnQKKyMgbWFsZm9ybWVkIEpTT04uIFRoaXMgY2hhbmdlIGFsaWducyB3aXRoIHRoZSBleGlzdGluZyBiZWhhdmlvciBvZiBzeXNwcm9wLm1rLCB3aGljaCBwYXNzZXMgcHJvcGVydHkKKyMgdmFyaWFibGVzIHRvIHRoZSBlY2hvIGNvbW1hbmQsIGVmZmVjdGl2ZWx5IGRpc2NhcmRpbmcgc3Vycm91bmRpbmcgZG91YmxlIHF1b3Rlcy4KK2RlZmluZSBjb2xsYXBzZS1wcm9wLXBhaXJzCiskKHN1YnN0ICIsLCQoY2FsbCBjb2xsYXBzZS1wYWlycywkKGNhbGwgY29sbGFwc2UtcGFpcnMsJCQoJCgxKSksPz0pLD0pKQorZW5kZWYKKworJChjYWxsIGFkZF9qc29uX2xpc3QsIFBST0RVQ1RfU1lTVEVNX1BST1BFUlRJRVMsICAgICAgICAgJChjYWxsIGNvbGxhcHNlLXByb3AtcGFpcnMsUFJPRFVDVF9TWVNURU1fUFJPUEVSVElFUykpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgUFJPRFVDVF9TWVNURU1fREVGQVVMVF9QUk9QRVJUSUVTLCAkKGNhbGwgY29sbGFwc2UtcHJvcC1wYWlycyxQUk9EVUNUX1NZU1RFTV9ERUZBVUxUX1BST1BFUlRJRVMpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIFBST0RVQ1RfU1lTVEVNX0VYVF9QUk9QRVJUSUVTLCAgICAgJChjYWxsIGNvbGxhcHNlLXByb3AtcGFpcnMsUFJPRFVDVF9TWVNURU1fRVhUX1BST1BFUlRJRVMpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMsICAgICAgICAgJChjYWxsIGNvbGxhcHNlLXByb3AtcGFpcnMsUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUykpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgUFJPRFVDVF9QUk9EVUNUX1BST1BFUlRJRVMsICAgICAgICAkKGNhbGwgY29sbGFwc2UtcHJvcC1wYWlycyxQUk9EVUNUX1BST0RVQ1RfUFJPUEVSVElFUykpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgUFJPRFVDVF9PRE1fUFJPUEVSVElFUywgICAgICAgICAgICAkKGNhbGwgY29sbGFwc2UtcHJvcC1wYWlycyxQUk9EVUNUX09ETV9QUk9QRVJUSUVTKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBQUk9EVUNUX1BST1BFUlRZX09WRVJSSURFUywgICAgICAgICQoY2FsbCBjb2xsYXBzZS1wcm9wLXBhaXJzLFBST0RVQ1RfUFJPUEVSVFlfT1ZFUlJJREVTKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBQUk9EVUNUX0RFRkFVTFRfUFJPUEVSVFlfT1ZFUlJJREVTLCAgICAgICAgJChjYWxsIGNvbGxhcHNlLXByb3AtcGFpcnMsUFJPRFVDVF9ERUZBVUxUX1BST1BFUlRZX09WRVJSSURFUykpCisKKyQoY2FsbCBhZGRfanNvbl9zdHIsIEJvb3Rsb2FkZXJCb2FyZE5hbWUsICQoVEFSR0VUX0JPT1RMT0FERVJfQk9BUkRfTkFNRSkpCisKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBTZGtCdWlsZCwgJChmaWx0ZXIgc2RrIHNka19hZGRvbiwkKE1BS0VDTURHT0FMUykpKQorCiskKGNhbGwgYWRkX2pzb25fc3RyLCBTeXN0ZW1TZXJ2ZXJDb21waWxlckZpbHRlciwgJChQUk9EVUNUX1NZU1RFTV9TRVJWRVJfQ09NUElMRVJfRklMVEVSKSkKKworJChjYWxsIGFkZF9qc29uX2Jvb2wsIFByb2R1Y3QxNktEZXZlbG9wZXJPcHRpb24sICQoZmlsdGVyIHRydWUsJChQUk9EVUNUXzE2S19ERVZFTE9QRVJfT1BUSU9OKSkpCisKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFJlY292ZXJ5RGVmYXVsdFJvdGF0aW9uLCAkKFRBUkdFVF9SRUNPVkVSWV9ERUZBVUxUX1JPVEFUSU9OKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFJlY292ZXJ5T3ZlcnNjYW5QZXJjZW50LCAkKFRBUkdFVF9SRUNPVkVSWV9PVkVSU0NBTl9QRVJDRU5UKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFJlY292ZXJ5UGl4ZWxGb3JtYXQsICQoVEFSR0VUX1JFQ09WRVJZX1BJWEVMX0ZPUk1BVCkpCisKK2lmZGVmIEFCX09UQV9VUERBVEVSCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgQWJPdGFVcGRhdGVyLCAkKGZpbHRlciB0cnVlLCQoQUJfT1RBX1VQREFURVIpKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIEFiT3RhUGFydGl0aW9ucywgJChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKHNvcnQgJChBQl9PVEFfUEFSVElUSU9OUykpKSkKK2VuZGlmCisKK2lmZGVmIFBST0RVQ1RfVVNFX0RZTkFNSUNfUEFSVElUSU9OUworJChjYWxsIGFkZF9qc29uX2Jvb2wsIFVzZUR5bmFtaWNQYXJ0aXRpb25zLCAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9VU0VfRFlOQU1JQ19QQVJUSVRJT05TKSkpCitlbmRpZgorCitpZmRlZiBQUk9EVUNUX1JFVFJPRklUX0RZTkFNSUNfUEFSVElUSU9OUworJChjYWxsIGFkZF9qc29uX2Jvb2wsIFJldHJvZml0RHluYW1pY1BhcnRpdGlvbnMsICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX1JFVFJPRklUX0RZTkFNSUNfUEFSVElUSU9OUykpKQorZW5kaWYKKworJChjYWxsIGFkZF9qc29uX2Jvb2wsIERvbnRVc2VWYWJjT3RhLCAkKGZpbHRlciB0cnVlLCQoQk9BUkRfRE9OVF9VU0VfVkFCQ19PVEEpKSkKKworJChjYWxsIGFkZF9qc29uX2Jvb2wsIEZ1bGxUcmVibGUsICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX0ZVTExfVFJFQkxFKSkpCisKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBOb0Jpb25pY1BhZ2VTaXplTWFjcm8sICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX05PX0JJT05JQ19QQUdFX1NJWkVfTUFDUk8pKSkKKworJChjYWxsIGFkZF9qc29uX2Jvb2wsIFByb3BlcnR5U3BsaXRFbmFibGVkLCAkKGZpbHRlciB0cnVlLCQoQk9BUkRfUFJPUEVSVFlfT1ZFUlJJREVTX1NQTElUX0VOQUJMRUQpKSkKKworJChjYWxsIGFkZF9qc29uX3N0ciwgU2NyZWVuRGVuc2l0eSwgJChUQVJHRVRfU0NSRUVOX0RFTlNJVFkpKQorCiskKGNhbGwgYWRkX2pzb25fc3RyLCBVc2VzVnVsa2FuLCAkKFRBUkdFVF9VU0VTX1ZVTEtBTikpCisKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBaeWdvdGVGb3JjZTY0LCAkKGZpbHRlciB0cnVlLCQoWllHT1RFX0ZPUkNFXzY0KSkpCisKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFZlbmRvclNlY3VyaXR5UGF0Y2gsICAgICAgICQoVkVORE9SX1NFQ1VSSVRZX1BBVENIKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFZlbmRvckltYWdlRmlsZVN5c3RlbVR5cGUsICQoQk9BUkRfVkVORE9SSU1BR0VfRklMRV9TWVNURU1fVFlQRSkpCisKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBCdWlsZFZlcnNpb25UYWdzLCAkKEJVSUxEX1ZFUlNJT05fVEFHUykpCisKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBQcm9kdWN0Tm90RGVidWdnYWJsZUluVXNlcmRlYnVnLCAkKFBST0RVQ1RfTk9UX0RFQlVHR0FCTEVfSU5fVVNFUkRFQlVHKSkKKworJChjYWxsIGFkZF9qc29uX2Jvb2wsIFVzZXNQcm9kdWN0SW1hZ2UsICQoZmlsdGVyIHRydWUsJChCT0FSRF9VU0VTX1BST0RVQ1RJTUFHRSkpKQorCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgVGFyZ2V0Qm9vdHMxNkssICQoZmlsdGVyIHRydWUsJChUQVJHRVRfQk9PVFNfMTZLKSkpCisKKyQoY2FsbCBqc29uX2VuZCkKKworJChzaGVsbCBta2RpciAtcCAkKGRpciAkKFNPT05HX0VYVFJBX1ZBUklBQkxFUykpKQorJChmaWxlID4kKFNPT05HX0VYVFJBX1ZBUklBQkxFUykudG1wLCQoanNvbl9jb250ZW50cykpCisKKyQoc2hlbGwgaWYgISBjbXAgLXMgJChTT09OR19FWFRSQV9WQVJJQUJMRVMpLnRtcCAkKFNPT05HX0VYVFJBX1ZBUklBQkxFUyk7IHRoZW4gXAorCSAgbXYgJChTT09OR19FWFRSQV9WQVJJQUJMRVMpLnRtcCAkKFNPT05HX0VYVFJBX1ZBUklBQkxFUyk7IFwKKwllbHNlIFwKKwkgIHJtICQoU09PTkdfRVhUUkFfVkFSSUFCTEVTKS50bXA7IFwKKwlmaSkKZGlmZiAtLWdpdCBhL2NvcmUvc29vbmdfamF2YV9wcmVidWlsdC5tayBiL2NvcmUvc29vbmdfamF2YV9wcmVidWlsdC5tawppbmRleCBhOGY0NzVmLi44YzM4ODJmIDEwMDY0NAotLS0gYS9jb3JlL3Nvb25nX2phdmFfcHJlYnVpbHQubWsKKysrIGIvY29yZS9zb29uZ19qYXZhX3ByZWJ1aWx0Lm1rCkBAIC0yMSwxOSArMjEsNiBAQAogZnVsbF9jbGFzc2VzX2hlYWRlcl9qYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy1oZWFkZXIuamFyCiBjb21tb25famF2YWxpYi5qYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvamF2YWxpYi5qYXIKIAotaWZkZWYgTE9DQUxfU09PTkdfQUFSCi0gIExPQ0FMX0FERElUSU9OQUxfQ0hFQ0tFRF9NT0RVTEUgKz0gJChMT0NBTF9TT09OR19BQVIpCi1lbmRpZgotCi0jIFVzZSB0aGUgU29vbmcgb3V0cHV0IGFzIHRoZSBjaGVja2J1aWxkIHRhcmdldCBpbnN0ZWFkIG9mIExPQ0FMX0JVSUxUX01PRFVMRQotIyB0byBhdm9pZCBjaGVja2J1aWxkcyBtYWtpbmcgYW4gZXh0cmEgY29weSBvZiBldmVyeSBtb2R1bGUuCi1MT0NBTF9DSEVDS0VEX01PRFVMRSA6PSAkKExPQ0FMX1BSRUJVSUxUX01PRFVMRV9GSUxFKQotTE9DQUxfQURESVRJT05BTF9DSEVDS0VEX01PRFVMRSArPSAkKExPQ0FMX1NPT05HX0hFQURFUl9KQVIpCi1MT0NBTF9BRERJVElPTkFMX0NIRUNLRURfTU9EVUxFICs9ICQoTE9DQUxfRlVMTF9NQU5JRkVTVF9GSUxFKQotTE9DQUxfQURESVRJT05BTF9DSEVDS0VEX01PRFVMRSArPSAkKExPQ0FMX1NPT05HX0RFWFBSRU9QVF9DT05GSUcpCi1MT0NBTF9BRERJVElPTkFMX0NIRUNLRURfTU9EVUxFICs9ICQoTE9DQUxfU09PTkdfUkVTT1VSQ0VfRVhQT1JUX1BBQ0tBR0UpCi1MT0NBTF9BRERJVElPTkFMX0NIRUNLRURfTU9EVUxFICs9ICQoTE9DQUxfU09PTkdfREVYX0pBUikKLQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTYyLDMxICs0OSwyNCBAQAogZW5kaWYKIAogaWZkZWYgTE9DQUxfU09PTkdfUFJPR1VBUkRfRElDVAotICBteV9wcm9ndWFyZF9kaWN0aW9uYXJ5X2RpcmVjdG9yeSA6PSAkKGxvY2FsLXByb2d1YXJkLWRpY3Rpb25hcnktZGlyZWN0b3J5KQotICBteV9wcm9ndWFyZF9kaWN0aW9uYXJ5X21hcHBpbmdfZGlyZWN0b3J5IDo9ICQobG9jYWwtcHJvZ3VhcmQtZGljdGlvbmFyeS1tYXBwaW5nLWRpcmVjdG9yeSkKLSAgJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoTE9DQUxfU09PTkdfUFJPR1VBUkRfRElDVCksXAotICAgICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL3Byb2d1YXJkX2RpY3Rpb25hcnkpKQogICAkKGV2YWwgJChjYWxsIGNvcHktcjgtZGljdGlvbmFyeS1maWxlLXdpdGgtbWFwcGluZyxcCiAgICAgJChMT0NBTF9TT09OR19QUk9HVUFSRF9ESUNUKSxcCi0gICAgJChteV9wcm9ndWFyZF9kaWN0aW9uYXJ5X2RpcmVjdG9yeSkvcHJvZ3VhcmRfZGljdGlvbmFyeSxcCi0gICAgJChteV9wcm9ndWFyZF9kaWN0aW9uYXJ5X21hcHBpbmdfZGlyZWN0b3J5KS9wcm9ndWFyZF9kaWN0aW9uYXJ5LnRleHRwcm90bykpCi0gICQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKExPQ0FMX1NPT05HX0NMQVNTRVNfSkFSKSxcCi0gICAgJChteV9wcm9ndWFyZF9kaWN0aW9uYXJ5X2RpcmVjdG9yeSkvY2xhc3Nlcy5qYXIpKQotICAkKGNhbGwgYWRkLWRlcGVuZGVuY3ksJChjb21tb25famF2YWxpYi5qYXIpLFwKLSAgICAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9wcm9ndWFyZF9kaWN0aW9uYXJ5KQotICAkKGNhbGwgYWRkLWRlcGVuZGVuY3ksJChjb21tb25famF2YWxpYi5qYXIpLFwKLSAgICAkKG15X3Byb2d1YXJkX2RpY3Rpb25hcnlfZGlyZWN0b3J5KS9wcm9ndWFyZF9kaWN0aW9uYXJ5KQotICAkKGNhbGwgYWRkLWRlcGVuZGVuY3ksJChjb21tb25famF2YWxpYi5qYXIpLFwKLSAgICAkKG15X3Byb2d1YXJkX2RpY3Rpb25hcnlfbWFwcGluZ19kaXJlY3RvcnkpL3Byb2d1YXJkX2RpY3Rpb25hcnkudGV4dHByb3RvKQotICAkKGNhbGwgYWRkLWRlcGVuZGVuY3ksJChjb21tb25famF2YWxpYi5qYXIpLFwKLSAgICAkKG15X3Byb2d1YXJkX2RpY3Rpb25hcnlfZGlyZWN0b3J5KS9jbGFzc2VzLmphcikKKyAgICAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9wcm9ndWFyZF9kaWN0aW9uYXJ5LFwKKyAgICAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9wcm9ndWFyZF9kaWN0aW9uYXJ5LnRleHRwcm90bykpCisKKyAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5QUk9HVUFSRF9ESUNUSU9OQVJZX0ZJTEVTIDo9IFwKKyAgICAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9wcm9ndWFyZF9kaWN0aW9uYXJ5IFwKKyAgICAkKExPQ0FMX1NPT05HX0NMQVNTRVNfSkFSKQorICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlBST0dVQVJEX0RJQ1RJT05BUllfU09PTkdfWklQX0FSR1VNRU5UUyA6PSBcCisgICAgLWUgb3V0L3RhcmdldC9jb21tb24vb2JqLyQoTE9DQUxfTU9EVUxFX0NMQVNTKS8kKExPQ0FMX01PRFVMRSlfaW50ZXJtZWRpYXRlcy9wcm9ndWFyZF9kaWN0aW9uYXJ5IFwKKyAgICAtZiAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9wcm9ndWFyZF9kaWN0aW9uYXJ5IFwKKyAgICAtZSBvdXQvdGFyZ2V0L2NvbW1vbi9vYmovJChMT0NBTF9NT0RVTEVfQ0xBU1MpLyQoTE9DQUxfTU9EVUxFKV9pbnRlcm1lZGlhdGVzL2NsYXNzZXMuamFyIFwKKyAgICAtZiAkKExPQ0FMX1NPT05HX0NMQVNTRVNfSkFSKQorICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlBST0dVQVJEX0RJQ1RJT05BUllfTUFQUElORyA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9wcm9ndWFyZF9kaWN0aW9uYXJ5LnRleHRwcm90bwogZW5kaWYKIAogaWZkZWYgTE9DQUxfU09PTkdfUFJPR1VBUkRfVVNBR0VfWklQCi0gICQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKExPQ0FMX1NPT05HX1BST0dVQVJEX1VTQUdFX1pJUCksXAotICAgICQoY2FsbCBsb2NhbC1wYWNrYWdpbmctZGlyLHByb2d1YXJkX3VzYWdlKS9wcm9ndWFyZF91c2FnZS56aXApKQotICAkKGNhbGwgYWRkLWRlcGVuZGVuY3ksJChjb21tb25famF2YWxpYi5qYXIpLFwKLSAgICAkKGNhbGwgbG9jYWwtcGFja2FnaW5nLWRpcixwcm9ndWFyZF91c2FnZSkvcHJvZ3VhcmRfdXNhZ2UuemlwKQorICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlBST0dVQVJEX1VTQUdFX1pJUCA6PSAkKExPQ0FMX1NPT05HX1BST0dVQVJEX1VTQUdFX1pJUCkKIGVuZGlmCiAKIApAQCAtOTksMTYgKzc5LDEyIEBACiAKICAgJChjYWxsIGFkZC1kZXBlbmRlbmN5LCQoTE9DQUxfQlVJTFRfTU9EVUxFKSwkKG15X3Jlc19wYWNrYWdlKSkKIAotICBteV9wcm9ndWFyZF9mbGFncyA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9leHBvcnRfcHJvZ3VhcmRfZmxhZ3MKLSAgJChteV9wcm9ndWFyZF9mbGFncyk6ICQoTE9DQUxfU09PTkdfRVhQT1JUX1BST0dVQVJEX0ZMQUdTKQotCUBlY2hvICJFeHBvcnQgcHJvZ3VhcmQgZmxhZ3M6ICRAIgotCXJtIC1mICRACi0JdG91Y2ggJEAKLQlmb3IgZiBpbiAkKzsgZG8gXAotCQllY2hvIC1lICJcbiMgaW5jbHVkaW5nICQkZiIgPj4kQDsgXAotCQljYXQgJCRmID4+JEA7IFwKLQlkb25lCisgIG15X3RyYW5zaXRpdmVfcmVzX3BhY2thZ2VzIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL3RyYW5zaXRpdmUtcmVzLXBhY2thZ2VzCisgICQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKExPQ0FMX1NPT05HX1RSQU5TSVRJVkVfUkVTX1BBQ0tBR0VTKSwkKG15X3RyYW5zaXRpdmVfcmVzX3BhY2thZ2VzKSkpCisgICQoY2FsbCBhZGQtZGVwZW5kZW5jeSwkKG15X3Jlc19wYWNrYWdlKSwkKG15X3RyYW5zaXRpdmVfcmVzX3BhY2thZ2VzKSkKIAorICBteV9wcm9ndWFyZF9mbGFncyA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9leHBvcnRfcHJvZ3VhcmRfZmxhZ3MKKyAgJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoTE9DQUxfU09PTkdfRVhQT1JUX1BST0dVQVJEX0ZMQUdTKSwkKG15X3Byb2d1YXJkX2ZsYWdzKSkpCiAgICQoY2FsbCBhZGQtZGVwZW5kZW5jeSwkKExPQ0FMX0JVSUxUX01PRFVMRSksJChteV9wcm9ndWFyZF9mbGFncykpCiAKICAgbXlfc3RhdGljX2xpYnJhcnlfZXh0cmFfcGFja2FnZXMgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvZXh0cmFfcGFja2FnZXMKQEAgLTEyNiwxNiArMTAyLDE0IEBACiAgICAgYm9vdF9qYXJzIDo9ICQoZm9yZWFjaCBwYWlyLCQoUFJPRFVDVF9CT09UX0pBUlMpLCAkKGNhbGwgd29yZC1jb2xvbiwyLCQocGFpcikpKQogICAgIGlmbmVxICgkKGZpbHRlciAkKExPQ0FMX01PRFVMRSksJChib290X2phcnMpKSwpICMgaXNfYm9vdF9qYXIKICAgICAgIGlmZXEgKHRydWUsJChXSVRIX0RFWFBSRU9QVCkpCi0gICAgICAgICMgJChERUZBVUxUX0RFWF9QUkVPUFRfSU5TVEFMTEVEX0lNQUdFX01PRFVMRSkgY29udGFpbnMgbW9kdWxlcyB0aGF0IGluc3RhbGxzCi0gICAgICAgICMgYWxsIG9mIGJvb3RqYXJzJyBkZXhwcmVvcHQgZmlsZXMgKC5hcnQsIC5vYXQsIC52ZGV4LCAuLi4pCisgICAgICAgICMgZGV4X2Jvb3RqYXJzIHNpbmdsZXRvbiBpbnN0YWxscyBhbGwgb2YgYm9vdGphcnMnIGRleHByZW9wdCBmaWxlcyAoLmFydCwgLm9hdCwgLnZkZXgsIC4uLikKKyAgICAgICAgIyBUaGlzIGluY2x1ZGVzIGJvdGggdGhlIHByaW1hcnkgYW5kIHNlY29uZGFyeSBhcmNoZXMuCiAgICAgICAgICMgQWRkIHRoZW0gdG8gdGhlIHJlcXVpcmVkIGxpc3Qgc28gdGhleSBhcmUgaW5zdGFsbGVkIGFsb25nc2lkZSB0aGlzIG1vZHVsZS4KLSAgICAgICAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5SRVFVSVJFRF9GUk9NX1RBUkdFVCArPSBcCi0gICAgICAgICAgJChERUZBVUxUX0RFWF9QUkVPUFRfSU5TVEFMTEVEX0lNQUdFX01PRFVMRSkgXAotICAgICAgICAgICQoMk5EX0RFRkFVTFRfREVYX1BSRU9QVF9JTlNUQUxMRURfSU1BR0VfTU9EVUxFKQorICAgICAgICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLlJFUVVJUkVEX0ZST01fVEFSR0VUICs9IGRleF9ib290amFycwogICAgICAgICAjIENvcHkgJChMT0NBTF9CVUlMVF9NT0RVTEUpIGFuZCBpdHMgZGVwZW5kZW5jaWVzIHdoZW4gaW5zdGFsbGluZyBib290LmFydAogICAgICAgICAjIHNvIHRoYXQgZGVwZW5kZW5jaWVzIG9mICQoTE9DQUxfQlVJTFRfTU9EVUxFKSAod2hpY2ggbWF5IGluY2x1ZGUKICAgICAgICAgIyBqYWNvY28tcmVwb3J0LWNsYXNzZXMuamFyKSBhcmUgY29waWVkIGZvciBldmVyeSBidWlsZC4KLSAgICAgICAgJChmb3JlYWNoIG0sJChERUZBVUxUX0RFWF9QUkVPUFRfSU5TVEFMTEVEX0lNQUdFX01PRFVMRSkgJCgyTkRfREVGQVVMVF9ERVhfUFJFT1BUX0lOU1RBTExFRF9JTUFHRV9NT0RVTEUpLCBcCisgICAgICAgICQoZm9yZWFjaCBtLGRleF9ib290amFycywgXAogICAgICAgICAgICQoZXZhbCAkKGNhbGwgYWRkLWRlcGVuZGVuY3ksJChmaXJzdHdvcmQgJChjYWxsIG1vZHVsZS1pbnN0YWxsZWQtZmlsZXMsJChtKSkpLCQoTE9DQUxfQlVJTFRfTU9EVUxFKSkpIFwKICAgICAgICAgKQogICAgICAgZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3RhdGljX2phdmFfbGlicmFyeS5tayBiL2NvcmUvc3RhdGljX2phdmFfbGlicmFyeS5tawppbmRleCA0MDUzOTg1Li5kZDFkOGI1IDEwMDY0NAotLS0gYS9jb3JlL3N0YXRpY19qYXZhX2xpYnJhcnkubWsKKysrIGIvY29yZS9zdGF0aWNfamF2YV9saWJyYXJ5Lm1rCkBAIC0xMjcsNiArMTI3LDEyIEBACiBlbmRpZgogZW5kaWYKIAorIyB0cmFuc2l0aXZlLXJlcy1wYWNrYWdlcyBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgU29vbmcgbW9kdWxlcyBmb3Igbm93LCBidXQgbmVlZHMKKyMgdG8gZXhpc3Qgc28gdGhhdCBvdGhlciBNYWtlIG1vZHVsZXMgY2FuIGRlcGVuZCBvbiBpdC4gIENyZWF0ZSBhbiBlbXB0eSBmaWxlLgorbXlfdHJhbnNpdGl2ZV9yZXNfcGFja2FnZXMgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvdHJhbnNpdGl2ZS1yZXMtcGFja2FnZXMKKyQobXlfdHJhbnNpdGl2ZV9yZXNfcGFja2FnZXMpOgorCXRvdWNoICRACisKIGltcG9ydF9wcm9ndWFyZF9mbGFnX2ZpbGVzIDo9ICQoc3RyaXAgJChmb3JlYWNoIGwsJChMT0NBTF9TVEFUSUNfQU5EUk9JRF9MSUJSQVJJRVMpICQoTE9DQUxfU1RBVElDX0pBVkFfQUFSX0xJQlJBUklFUyksXAogICAgICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsSkFWQV9MSUJSQVJJRVMsJChsKSwsQ09NTU9OKS9leHBvcnRfcHJvZ3VhcmRfZmxhZ3MpKQogJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvZXhwb3J0X3Byb2d1YXJkX2ZsYWdzOiAkKGltcG9ydF9wcm9ndWFyZF9mbGFnX2ZpbGVzKSAkKGFkZHByZWZpeCAkKExPQ0FMX1BBVEgpLywkKExPQ0FMX0VYUE9SVF9QUk9HVUFSRF9GTEFHX0ZJTEVTKSkKQEAgLTIyMywzICsyMjksNSBAQAogYWFyX2NsYXNzZXNfamFyIDo9CiBhbGxfcmVzX2Fzc2V0cyA6PQogTE9DQUxfSVNfU1RBVElDX0pBVkFfTElCUkFSWSA6PQorCiskKGlmICQobXlfcmVnaXN0ZXJfbmFtZSksJChldmFsIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUFLRV9NT0RVTEVfVFlQRTo9U1RBVElDX0pBVkFfTElCUkFSWSkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9zdGF0aWNfbGlicmFyeV9pbnRlcm5hbC5tayBiL2NvcmUvc3RhdGljX2xpYnJhcnlfaW50ZXJuYWwubWsKaW5kZXggMDM5MjQ2MC4uODQ0MzYwZSAxMDA2NDQKLS0tIGEvY29yZS9zdGF0aWNfbGlicmFyeV9pbnRlcm5hbC5taworKysgYi9jb3JlL3N0YXRpY19saWJyYXJ5X2ludGVybmFsLm1rCkBAIC00MSwzICs0MSw1IEBACiAkKGludGVybWVkaWF0ZXMpLyQoR0NOT19BUkNISVZFKSA6ICQoTE9DQUxfR0NOT19GSUxFUykgJChidWlsdF93aG9sZV9nY25vX2xpYnJhcmllcykKIAkkKHBhY2thZ2UtY292ZXJhZ2UtZmlsZXMpCiBlbmRpZgorCiskKGlmICQobXlfcmVnaXN0ZXJfbmFtZSksJChldmFsIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUFLRV9NT0RVTEVfVFlQRTo9U1RBVElDX0xJQlJBUlkpKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvc3lzcHJvcC5tayBiL2NvcmUvc3lzcHJvcC5tawppbmRleCA0NGFmMzY3Li5kOWZiZGQ5IDEwMDY0NAotLS0gYS9jb3JlL3N5c3Byb3AubWsKKysrIGIvY29yZS9zeXNwcm9wLm1rCkBAIC0yMyw3ICsyMyw2IEBACiAgIHByb3BlcnR5X292ZXJyaWRlc19zcGxpdF9lbmFibGVkIDo9IHRydWUKIGVuZGlmCiAKLUJVSUxESU5GT19TSCA6PSBidWlsZC9tYWtlL3Rvb2xzL2J1aWxkaW5mby5zaAogUE9TVF9QUk9DRVNTX1BST1BTIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3Bvc3RfcHJvY2Vzc19wcm9wcyQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKIAogIyBFbWl0cyBhIHNldCBvZiBzeXNwcm9wcyBjb21tb24gdG8gYWxsIHBhcnRpdGlvbnMgdG8gYSBmaWxlLgpAQCAtMzQsMzUgKzMzLDI2IEBACiAgICAgZWNobyAiIyBmcm9tIGdlbmVyYXRlLWNvbW1vbi1idWlsZC1wcm9wcyIgPj4gJCgyKTtcCiAgICAgZWNobyAiIyBUaGVzZSBwcm9wZXJ0aWVzIGlkZW50aWZ5IHRoaXMgcGFydGl0aW9uIGltYWdlLiIgPj4gJCgyKTtcCiAgICAgZWNobyAiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIiA+PiAkKDIpO1wKLSAgICAkKGlmICQoZmlsdGVyIHN5c3RlbSwkKDEpKSxcCi0gICAgICAgIGVjaG8gInJvLnByb2R1Y3QuJCgxKS5icmFuZD0kKFBST0RVQ1RfU1lTVEVNX0JSQU5EKSIgPj4gJCgyKTtcCi0gICAgICAgIGVjaG8gInJvLnByb2R1Y3QuJCgxKS5kZXZpY2U9JChQUk9EVUNUX1NZU1RFTV9ERVZJQ0UpIiA+PiAkKDIpO1wKLSAgICAgICAgZWNobyAicm8ucHJvZHVjdC4kKDEpLm1hbnVmYWN0dXJlcj0kKFBST0RVQ1RfU1lTVEVNX01BTlVGQUNUVVJFUikiID4+ICQoMik7XAotICAgICAgICBlY2hvICJyby5wcm9kdWN0LiQoMSkubW9kZWw9JChQUk9EVUNUX1NZU1RFTV9NT0RFTCkiID4+ICQoMik7XAotICAgICAgICBlY2hvICJyby5wcm9kdWN0LiQoMSkubmFtZT0kKFBST0RVQ1RfU1lTVEVNX05BTUUpIiA+PiAkKDIpO1wKLSAgICAgICxcCi0gICAgICAgIGVjaG8gInJvLnByb2R1Y3QuJCgxKS5icmFuZD0kKFBST0RVQ1RfQlJBTkQpIiA+PiAkKDIpO1wKLSAgICAgICAgZWNobyAicm8ucHJvZHVjdC4kKDEpLmRldmljZT0kKFRBUkdFVF9ERVZJQ0UpIiA+PiAkKDIpO1wKLSAgICAgICAgZWNobyAicm8ucHJvZHVjdC4kKDEpLm1hbnVmYWN0dXJlcj0kKFBST0RVQ1RfTUFOVUZBQ1RVUkVSKSIgPj4gJCgyKTtcCi0gICAgICAgIGVjaG8gInJvLnByb2R1Y3QuJCgxKS5tb2RlbD0kKFBST0RVQ1RfTU9ERUwpIiA+PiAkKDIpO1wKLSAgICAgICAgZWNobyAicm8ucHJvZHVjdC4kKDEpLm5hbWU9JChUQVJHRVRfUFJPRFVDVCkiID4+ICQoMik7XAotICAgICAgICAjIEF0dGVzdGF0aW9uIHNwZWNpZmljIHByb3BlcnRpZXMgZm9yIEFPU1AvR1NJIGJ1aWxkIHJ1bm5pbmcgb24gZGV2aWNlLgotICAgICAgICBpZiBbIC1uICIkKHN0cmlwICQoUFJPRFVDVF9NT0RFTF9GT1JfQVRURVNUQVRJT04pKSIgXTsgdGhlbiBcCi0gICAgICAgICAgICBlY2hvICJyby5wcm9kdWN0Lm1vZGVsX2Zvcl9hdHRlc3RhdGlvbj0kKFBST0RVQ1RfTU9ERUxfRk9SX0FUVEVTVEFUSU9OKSIgPj4gJCgyKTtcCi0gICAgICAgIGZpOyBcCi0gICAgICAgIGlmIFsgLW4gIiQoc3RyaXAgJChQUk9EVUNUX0JSQU5EX0ZPUl9BVFRFU1RBVElPTikpIiBdOyB0aGVuIFwKLSAgICAgICAgICAgIGVjaG8gInJvLnByb2R1Y3QuYnJhbmRfZm9yX2F0dGVzdGF0aW9uPSQoUFJPRFVDVF9CUkFORF9GT1JfQVRURVNUQVRJT04pIiA+PiAkKDIpO1wKLSAgICAgICAgZmk7IFwKLSAgICAgICAgaWYgWyAtbiAiJChzdHJpcCAkKFBST0RVQ1RfTkFNRV9GT1JfQVRURVNUQVRJT04pKSIgXTsgdGhlbiBcCi0gICAgICAgICAgICBlY2hvICJyby5wcm9kdWN0Lm5hbWVfZm9yX2F0dGVzdGF0aW9uPSQoUFJPRFVDVF9OQU1FX0ZPUl9BVFRFU1RBVElPTikiID4+ICQoMik7XAotICAgICAgICBmaTsgXAotICAgICAgICBpZiBbIC1uICIkKHN0cmlwICQoUFJPRFVDVF9ERVZJQ0VfRk9SX0FUVEVTVEFUSU9OKSkiIF07IHRoZW4gXAotICAgICAgICAgICAgZWNobyAicm8ucHJvZHVjdC5kZXZpY2VfZm9yX2F0dGVzdGF0aW9uPSQoUFJPRFVDVF9ERVZJQ0VfRk9SX0FUVEVTVEFUSU9OKSIgPj4gJCgyKTtcCi0gICAgICAgIGZpOyBcCi0gICAgICAgIGlmIFsgLW4gIiQoc3RyaXAgJChQUk9EVUNUX01BTlVGQUNUVVJFUl9GT1JfQVRURVNUQVRJT04pKSIgXTsgdGhlbiBcCi0gICAgICAgICAgICBlY2hvICJyby5wcm9kdWN0Lm1hbnVmYWN0dXJlcl9mb3JfYXR0ZXN0YXRpb249JChQUk9EVUNUX01BTlVGQUNUVVJFUl9GT1JfQVRURVNUQVRJT04pIiA+PiAkKDIpO1wKLSAgICAgICAgZmk7IFwKLSAgICApXAorICAgIGVjaG8gInJvLnByb2R1Y3QuJCgxKS5icmFuZD0kKFBST0RVQ1RfQlJBTkQpIiA+PiAkKDIpO1wKKyAgICBlY2hvICJyby5wcm9kdWN0LiQoMSkuZGV2aWNlPSQoVEFSR0VUX0RFVklDRSkiID4+ICQoMik7XAorICAgIGVjaG8gInJvLnByb2R1Y3QuJCgxKS5tYW51ZmFjdHVyZXI9JChQUk9EVUNUX01BTlVGQUNUVVJFUikiID4+ICQoMik7XAorICAgIGVjaG8gInJvLnByb2R1Y3QuJCgxKS5tb2RlbD0kKFBST0RVQ1RfTU9ERUwpIiA+PiAkKDIpO1wKKyAgICBlY2hvICJyby5wcm9kdWN0LiQoMSkubmFtZT0kKFRBUkdFVF9QUk9EVUNUKSIgPj4gJCgyKTtcCisgICAgaWYgWyAtbiAiJChzdHJpcCAkKFBST0RVQ1RfTU9ERUxfRk9SX0FUVEVTVEFUSU9OKSkiIF07IHRoZW4gXAorICAgICAgICBlY2hvICJyby5wcm9kdWN0Lm1vZGVsX2Zvcl9hdHRlc3RhdGlvbj0kKFBST0RVQ1RfTU9ERUxfRk9SX0FUVEVTVEFUSU9OKSIgPj4gJCgyKTtcCisgICAgZmk7IFwKKyAgICBpZiBbIC1uICIkKHN0cmlwICQoUFJPRFVDVF9CUkFORF9GT1JfQVRURVNUQVRJT04pKSIgXTsgdGhlbiBcCisgICAgICAgIGVjaG8gInJvLnByb2R1Y3QuYnJhbmRfZm9yX2F0dGVzdGF0aW9uPSQoUFJPRFVDVF9CUkFORF9GT1JfQVRURVNUQVRJT04pIiA+PiAkKDIpO1wKKyAgICBmaTsgXAorICAgIGlmIFsgLW4gIiQoc3RyaXAgJChQUk9EVUNUX05BTUVfRk9SX0FUVEVTVEFUSU9OKSkiIF07IHRoZW4gXAorICAgICAgICBlY2hvICJyby5wcm9kdWN0Lm5hbWVfZm9yX2F0dGVzdGF0aW9uPSQoUFJPRFVDVF9OQU1FX0ZPUl9BVFRFU1RBVElPTikiID4+ICQoMik7XAorICAgIGZpOyBcCisgICAgaWYgWyAtbiAiJChzdHJpcCAkKFBST0RVQ1RfREVWSUNFX0ZPUl9BVFRFU1RBVElPTikpIiBdOyB0aGVuIFwKKyAgICAgICAgZWNobyAicm8ucHJvZHVjdC5kZXZpY2VfZm9yX2F0dGVzdGF0aW9uPSQoUFJPRFVDVF9ERVZJQ0VfRk9SX0FUVEVTVEFUSU9OKSIgPj4gJCgyKTtcCisgICAgZmk7IFwKKyAgICBpZiBbIC1uICIkKHN0cmlwICQoUFJPRFVDVF9NQU5VRkFDVFVSRVJfRk9SX0FUVEVTVEFUSU9OKSkiIF07IHRoZW4gXAorICAgICAgICBlY2hvICJyby5wcm9kdWN0Lm1hbnVmYWN0dXJlcl9mb3JfYXR0ZXN0YXRpb249JChQUk9EVUNUX01BTlVGQUNUVVJFUl9GT1JfQVRURVNUQVRJT04pIiA+PiAkKDIpO1wKKyAgICBmaTsgXAogICAgICQoaWYgJChmaWx0ZXIgdHJ1ZSwkKFpZR09URV9GT1JDRV82NCkpLFwKICAgICAgICAgJChpZiAkKGZpbHRlciB2ZW5kb3IsJCgxKSksXAogICAgICAgICAgICAgZWNobyAicm8uJCgxKS5wcm9kdWN0LmNwdS5hYmlsaXN0PSQoVEFSR0VUX0NQVV9BQklfTElTVF82NF9CSVQpIiA+PiAkKDIpO1wKQEAgLTc4LDE0ICs2OCwxOCBAQAogICAgIClcCiAgICAgZWNobyAicm8uJCgxKS5idWlsZC5kYXRlPWAkKERBVEVfRlJPTV9GSUxFKWAiID4+ICQoMik7XAogICAgIGVjaG8gInJvLiQoMSkuYnVpbGQuZGF0ZS51dGM9YCQoREFURV9GUk9NX0ZJTEUpICslc2AiID4+ICQoMik7XAotICAgIGVjaG8gInJvLiQoMSkuYnVpbGQuZmluZ2VycHJpbnQ9JChCVUlMRF9GSU5HRVJQUklOVF9GUk9NX0ZJTEUpIiA+PiAkKDIpO1wKLSAgICBlY2hvICJyby4kKDEpLmJ1aWxkLmlkPSQoQlVJTERfSUQpIiA+PiAkKDIpO1wKLSAgICBlY2hvICJyby4kKDEpLmJ1aWxkLnRhZ3M9JChCVUlMRF9WRVJTSU9OX1RBR1MpIiA+PiAkKDIpO1wKKyAgICAjIEFsbG93IG9wdGlvbmFsIGFzc2lnbm1lbnRzIGZvciBBUkMgZm9yd2FyZC1kZWNsYXJhdGlvbnMgKGIvMjQ5MTY4NjU3KQorICAgICMgVE9ETzogUmVtb3ZlIGFueSB0YWctcmVsYXRlZCBpbmNvbnNpc3RlbmNpZXMgb25jZSB0aGUgZ29hbHMgZnJvbQorICAgICMgZ28vYXJjLWFuZHJvaWQtc2lncHJvcC1jaGFuZ2VzIGhhdmUgYmVlbiBhY2hpZXZlZC4KKyAgICBlY2hvICJyby4kKDEpLmJ1aWxkLmZpbmdlcnByaW50Pz0kKEJVSUxEX0ZJTkdFUlBSSU5UX0ZST01fRklMRSkiID4+ICQoMik7XAorICAgIGVjaG8gInJvLiQoMSkuYnVpbGQuaWQ/PSQoQlVJTERfSUQpIiA+PiAkKDIpO1wKKyAgICBlY2hvICJyby4kKDEpLmJ1aWxkLnRhZ3M/PSQoQlVJTERfVkVSU0lPTl9UQUdTKSIgPj4gJCgyKTtcCiAgICAgZWNobyAicm8uJCgxKS5idWlsZC50eXBlPSQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpIiA+PiAkKDIpO1wKICAgICBlY2hvICJyby4kKDEpLmJ1aWxkLnZlcnNpb24uaW5jcmVtZW50YWw9JChCVUlMRF9OVU1CRVJfRlJPTV9GSUxFKSIgPj4gJCgyKTtcCiAgICAgZWNobyAicm8uJCgxKS5idWlsZC52ZXJzaW9uLnJlbGVhc2U9JChQTEFURk9STV9WRVJTSU9OX0xBU1RfU1RBQkxFKSIgPj4gJCgyKTtcCiAgICAgZWNobyAicm8uJCgxKS5idWlsZC52ZXJzaW9uLnJlbGVhc2Vfb3JfY29kZW5hbWU9JChQTEFURk9STV9WRVJTSU9OKSIgPj4gJCgyKTtcCiAgICAgZWNobyAicm8uJCgxKS5idWlsZC52ZXJzaW9uLnNkaz0kKFBMQVRGT1JNX1NES19WRVJTSU9OKSIgPj4gJCgyKTtcCisgICAgZWNobyAicm8uJCgxKS5idWlsZC52ZXJzaW9uLnNka19mdWxsPSQoUExBVEZPUk1fU0RLX1ZFUlNJT05fRlVMTCkiID4+ICQoMik7XAogCiBlbmRlZgogCkBAIC0xMjIsMTggKzExNiwyNiBAQAogICAgICQoZXZhbCBfb3B0aW9uIDo9IC0tYWxsb3ctZHVwKVwKICkKIAotJCgyKTogJChQT1NUX1BST0NFU1NfUFJPUFMpICQoSU5URVJOQUxfQlVJTERfSURfTUFLRUZJTEUpICQoMykgJCg2KQorJCgyKTogJChQT1NUX1BST0NFU1NfUFJPUFMpICQoSU5URVJOQUxfQlVJTERfSURfTUFLRUZJTEUpICQoMykgJCg2KSAkKEJVSUxUX0tFUk5FTF9WRVJTSU9OX0ZJTEVfRk9SX1VGRkRfR0MpCiAJJChoaWRlKSBlY2hvIEJ1aWxkaW5nICQkQAogCSQoaGlkZSkgbWtkaXIgLXAgJCQoZGlyICQkQCkKIAkkKGhpZGUpIHJtIC1mICQkQCAmJiB0b3VjaCAkJEAKIGlmbmVxICgkKHN0cmlwICQoNykpLCB0cnVlKQogCSQoaGlkZSkgJCQoY2FsbCBnZW5lcmF0ZS1jb21tb24tYnVpbGQtcHJvcHMsJChjYWxsIHRvLWxvd2VyLCQoc3RyaXAgJCgxKSkpLCQkQCkKIGVuZGlmCisgICAgICAgICMgTWFrZSBhbmQgU29vbmcgdXNlIGRpZmZlcmVudCBpbnRlcm1lZGlhdGUgZmlsZXMgdG8gYnVpbGQgdmVuZG9yL2J1aWxkLnByb3AuCisgICAgICAgICMgQWx0aG91Z2ggdGhlIHN5c3Byb3AgY29udGVudHMgYXJlIHNhbWUsIHRoZSBhYnNvbHV0ZSBwYXRocyBvZiBhbmRyb2lkX2luZm8ucHJvcCBhcmUgZGlmZmVyZW50LgorICAgICAgICAjIFByaW50IHRoZSBmaWxlbmFtZSBmb3IgdGhlIGludGVybWVkaWF0ZSBmaWxlcyAoZmlsZXMgaW4gT1VUX0RJUikuCisgICAgICAgICMgVGhpcyBoZWxwcyB3aXRoIHZhbGlkYXRpbmcgbWstPnNvb25nIG1pZ3JhdGlvbiBvZiBhbmRyb2lkIHBhcnRpdGlvbnMuCiAJJChoaWRlKSAkKGZvcmVhY2ggZmlsZSwkKHN0cmlwICQoMykpLFwKIAkgICAgaWYgWyAtZiAiJChmaWxlKSIgXTsgdGhlblwKIAkgICAgICAgIGVjaG8gIiIgPj4gJCRAO1wKIAkgICAgICAgIGVjaG8gIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIgPj4gJCRAO1wKLQkgICAgICAgIGVjaG8gIiMgZnJvbSAkKGZpbGUpIiA+PiAkJEA7XAorCSAgICAgICAgJChpZiAkKGZpbHRlciAkKE9VVF9ESVIpLyUsJChmaWxlKSksIFwKKwkJZWNobyAiIyBmcm9tICQobm90ZGlyICQoZmlsZSkpIiA+PiAkJEA7XAorCQksXAorCQllY2hvICIjIGZyb20gJChmaWxlKSIgPj4gJCRAO1wKKwkJKVwKIAkgICAgICAgIGVjaG8gIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIgPj4gJCRAO1wKIAkgICAgICAgIGNhdCAkKGZpbGUpID4+ICQkQDtcCiAJICAgIGZpOykKQEAgLTE0Niw3ICsxNDgsMTAgQEAKIAkgICAgICAgIGVjaG8gIiQkKGxpbmUpIiA+PiAkJEA7XAogCSAgICApXAogCSkKLQkkKGhpZGUpICQoUE9TVF9QUk9DRVNTX1BST1BTKSAkJChfb3B0aW9uKSAtLXNkay12ZXJzaW9uICQoUExBVEZPUk1fU0RLX1ZFUlNJT04pICQkQCAkKDUpCisJJChoaWRlKSAkKFBPU1RfUFJPQ0VTU19QUk9QUykgJCQoX29wdGlvbikgXAorCSAgLS1zZGstdmVyc2lvbiAkKFBMQVRGT1JNX1NES19WRVJTSU9OKSBcCisJICAtLWtlcm5lbC12ZXJzaW9uLWZpbGUtZm9yLXVmZmQtZ2MgIiQoQlVJTFRfS0VSTkVMX1ZFUlNJT05fRklMRV9GT1JfVUZGRF9HQykiIFwKKwkgICQkQCAkKDUpCiAJJChoaWRlKSAkKGZvcmVhY2ggZmlsZSwkKHN0cmlwICQoNikpLFwKIAkgICAgaWYgWyAtZiAiJChmaWxlKSIgXTsgdGhlblwKIAkgICAgICAgIGNhdCAkKGZpbGUpID4+ICQkQDtcCkBAIC0xNTYsOTkgKzE2MSw2IEBACiAkKGNhbGwgZGVjbGFyZS0xcC10YXJnZXQsJCgyKSkKIGVuZGVmCiAKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRGVmaW5lIGZpbmdlcnByaW50LCB0aHVtYnByaW50LCBhbmQgdmVyc2lvbiB0YWdzIGZvciB0aGUgY3VycmVudCBidWlsZAotIwotIyBCVUlMRF9WRVJTSU9OX1RBR1MgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0YWdzIGNob3NlbiBieSB0aGUgZGV2aWNlCi0jIGltcGxlbWVudGVyIHRoYXQgZnVydGhlciBkaXN0aW5ndWlzaGVzIHRoZSBidWlsZC4gSXQncyBiYXNpY2FsbHkgZGVmaW5lZAotIyBieSB0aGUgZGV2aWNlIGltcGxlbWVudGVyLiBIZXJlLCB3ZSBhcmUgYWRkaW5nIGEgbWFuZGF0b3J5IHRhZyB0aGF0Ci0jIGlkZW50aWZpZXMgdGhlIHNpZ25pbmcgY29uZmlnIG9mIHRoZSBidWlsZC4KLUJVSUxEX1ZFUlNJT05fVEFHUyA6PSAkKEJVSUxEX1ZFUlNJT05fVEFHUykKLWlmZXEgKCQoVEFSR0VUX0JVSUxEX1RZUEUpLGRlYnVnKQotICBCVUlMRF9WRVJTSU9OX1RBR1MgKz0gZGVidWcKLWVuZGlmCi0jIFRoZSAidGVzdC1rZXlzIiB0YWcgbWFya3MgYnVpbGRzIHNpZ25lZCB3aXRoIHRoZSBvbGQgdGVzdCBrZXlzLAotIyB3aGljaCBhcmUgYXZhaWxhYmxlIGluIHRoZSBTREsuICAiZGV2LWtleXMiIG1hcmtzIGJ1aWxkcyBzaWduZWQgd2l0aAotIyBub24tZGVmYXVsdCBkZXYga2V5cyAodXN1YWxseSBwcml2YXRlIGtleXMgZnJvbSBhIHZlbmRvciBkaXJlY3RvcnkpLgotIyBCb3RoIG9mIHRoZXNlIHRhZ3Mgd2lsbCBiZSByZW1vdmVkIGFuZCByZXBsYWNlZCB3aXRoICJyZWxlYXNlLWtleXMiCi0jIHdoZW4gdGhlIHRhcmdldC1maWxlcyBpcyBzaWduZWQgaW4gYSBwb3N0LWJ1aWxkIHN0ZXAuCi1pZmVxICgkKERFRkFVTFRfU1lTVEVNX0RFVl9DRVJUSUZJQ0FURSksYnVpbGQvbWFrZS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS90ZXN0a2V5KQotQlVJTERfS0VZUyA6PSB0ZXN0LWtleXMKLWVsc2UKLUJVSUxEX0tFWVMgOj0gZGV2LWtleXMKLWVuZGlmCi1CVUlMRF9WRVJTSU9OX1RBR1MgKz0gJChCVUlMRF9LRVlTKQotQlVJTERfVkVSU0lPTl9UQUdTIDo9ICQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJChzb3J0ICQoQlVJTERfVkVSU0lPTl9UQUdTKSkpCi0KLSMgQlVJTERfRklOR0VSUFJJTlQgaXMgdXNlZCB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBjb21iaW5lZCBidWlsZCBhbmQKLSMgcHJvZHVjdDsgdXNlZCBieSB0aGUgT1RBIHNlcnZlci4KLWlmZXEgKCwkKHN0cmlwICQoQlVJTERfRklOR0VSUFJJTlQpKSkKLSAgaWZlcSAoJChzdHJpcCAkKEhBU19CVUlMRF9OVU1CRVIpKSxmYWxzZSkKLSAgICBCRl9CVUlMRF9OVU1CRVIgOj0gJChCVUlMRF9VU0VSTkFNRSkkJCgkKERBVEVfRlJPTV9GSUxFKSArJW0lZCVIJU0pCi0gIGVsc2UKLSAgICBCRl9CVUlMRF9OVU1CRVIgOj0gJChmaWxlIDwkKEJVSUxEX05VTUJFUl9GSUxFKSkKLSAgZW5kaWYKLSAgQlVJTERfRklOR0VSUFJJTlQgOj0gJChQUk9EVUNUX0JSQU5EKS8kKFRBUkdFVF9QUk9EVUNUKS8kKFRBUkdFVF9ERVZJQ0UpOiQoUExBVEZPUk1fVkVSU0lPTikvJChCVUlMRF9JRCkvJChCRl9CVUlMRF9OVU1CRVIpOiQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpLyQoQlVJTERfVkVSU0lPTl9UQUdTKQotZW5kaWYKLSMgdW5zZXQgaXQgZm9yIHNhZmV0eS4KLUJGX0JVSUxEX05VTUJFUiA6PQotCi1CVUlMRF9GSU5HRVJQUklOVF9GSUxFIDo9ICQoUFJPRFVDVF9PVVQpL2J1aWxkX2ZpbmdlcnByaW50LnR4dAotaWZuZXEgKCwkKHNoZWxsIG1rZGlyIC1wICQoUFJPRFVDVF9PVVQpICYmIGVjaG8gJChCVUlMRF9GSU5HRVJQUklOVCkgPiQoQlVJTERfRklOR0VSUFJJTlRfRklMRSkgJiYgZ3JlcCAiICIgJChCVUlMRF9GSU5HRVJQUklOVF9GSUxFKSkpCi0gICQoZXJyb3IgQlVJTERfRklOR0VSUFJJTlQgY2Fubm90IGNvbnRhaW4gc3BhY2VzOiAiJChmaWxlIDwkKEJVSUxEX0ZJTkdFUlBSSU5UX0ZJTEUpKSIpCi1lbmRpZgotQlVJTERfRklOR0VSUFJJTlRfRlJPTV9GSUxFIDo9ICQkKGNhdCAkKEJVSUxEX0ZJTkdFUlBSSU5UX0ZJTEUpKQotIyB1bnNldCBpdCBmb3Igc2FmZXR5LgotQlVJTERfRklOR0VSUFJJTlQgOj0KLQotIyBCVUlMRF9USFVNQlBSSU5UIGlzIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhlIHN5c3RlbSBidWlsZDsgdXNlZCBieSB0aGUKLSMgT1RBIHNlcnZlci4gVGhpcyBwdXJwb3NlZnVsbHkgZXhjbHVkZXMgYW55IHByb2R1Y3Qtc3BlY2lmaWMgdmFyaWFibGVzLgotaWZlcSAoLCQoc3RyaXAgJChCVUlMRF9USFVNQlBSSU5UKSkpCi0gIEJVSUxEX1RIVU1CUFJJTlQgOj0gJChQTEFURk9STV9WRVJTSU9OKS8kKEJVSUxEX0lEKS8kKEJVSUxEX05VTUJFUl9GUk9NX0ZJTEUpOiQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpLyQoQlVJTERfVkVSU0lPTl9UQUdTKQotZW5kaWYKLQotQlVJTERfVEhVTUJQUklOVF9GSUxFIDo9ICQoUFJPRFVDVF9PVVQpL2J1aWxkX3RodW1icHJpbnQudHh0Ci1pZm5lcSAoLCQoc2hlbGwgbWtkaXIgLXAgJChQUk9EVUNUX09VVCkgJiYgZWNobyAkKEJVSUxEX1RIVU1CUFJJTlQpID4kKEJVSUxEX1RIVU1CUFJJTlRfRklMRSkgJiYgZ3JlcCAiICIgJChCVUlMRF9USFVNQlBSSU5UX0ZJTEUpKSkKLSAgJChlcnJvciBCVUlMRF9USFVNQlBSSU5UIGNhbm5vdCBjb250YWluIHNwYWNlczogIiQoZmlsZSA8JChCVUlMRF9USFVNQlBSSU5UX0ZJTEUpKSIpCi1lbmRpZgotQlVJTERfVEhVTUJQUklOVF9GUk9NX0ZJTEUgOj0gJCQoY2F0ICQoQlVJTERfVEhVTUJQUklOVF9GSUxFKSkKLSMgdW5zZXQgaXQgZm9yIHNhZmV0eS4KLUJVSUxEX1RIVU1CUFJJTlQgOj0KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBEZWZpbmUgaHVtYW4gcmVhZGFibGUgc3RyaW5ncyB0aGF0IGRlc2NyaWJlIHRoaXMgYnVpbGQKLSMKLQotIyBCVUlMRF9JRDogZGV0YWlsIGluZm87IGhhcyB0aGUgc2FtZSBpbmZvIGFzIHRoZSBidWlsZCBmaW5nZXJwcmludAotQlVJTERfREVTQyA6PSAkKFRBUkdFVF9QUk9EVUNUKS0kKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSAkKFBMQVRGT1JNX1ZFUlNJT04pICQoQlVJTERfSUQpICQoQlVJTERfTlVNQkVSX0ZST01fRklMRSkgJChCVUlMRF9WRVJTSU9OX1RBR1MpCi0KLSMgQlVJTERfRElTUExBWV9JRCBpcyBzaG93biB1bmRlciBTZXR0aW5ncyAtPiBBYm91dCBQaG9uZQotaWZlcSAoJChUQVJHRVRfQlVJTERfVkFSSUFOVCksdXNlcikKLSAgIyBVc2VyIGJ1aWxkcyBzaG91bGQgc2hvdzoKLSAgIyByZWxlYXNlIGJ1aWxkIG51bWJlciBvciBicmFuY2guYnVsZF9udW1iZXIgbm9uLXJlbGVhc2UgYnVpbGRzCi0KLSAgIyBEZXYuIGJyYW5jaGVzIHNob3VsZCBoYXZlIERJU1BMQVlfQlVJTERfTlVNQkVSIHNldAotICBpZmVxICh0cnVlLCQoRElTUExBWV9CVUlMRF9OVU1CRVIpKQotICAgIEJVSUxEX0RJU1BMQVlfSUQgOj0gJChCVUlMRF9JRCkuJChCVUlMRF9OVU1CRVJfRlJPTV9GSUxFKSAkKEJVSUxEX0tFWVMpCi0gIGVsc2UKLSAgICBCVUlMRF9ESVNQTEFZX0lEIDo9ICQoQlVJTERfSUQpICQoQlVJTERfS0VZUykKLSAgZW5kaWYKLWVsc2UKLSAgIyBOb24tdXNlciBidWlsZHMgc2hvdWxkIHNob3cgZGV0YWlsZWQgYnVpbGQgaW5mb3JtYXRpb24KLSAgQlVJTERfRElTUExBWV9JRCA6PSAkKEJVSUxEX0RFU0MpCi1lbmRpZgotCi0jIFRBUkdFVF9CVUlMRF9GTEFWT1IgYW5kIHJvLmJ1aWxkLmZsYXZvciBhcmUgdXNlZCBvbmx5IGJ5IHRoZSB0ZXN0Ci0jIGhhcm5lc3MgdG8gZGlzdGluZ3Vpc2ggYnVpbGRzLiBPbmx5IGFkZCBfYXNhbiBmb3IgYSBzYW5pdGl6ZWQgYnVpbGQKLSMgaWYgaXQgaXNuJ3QgYWxyZWFkeSBhIHBhcnQgb2YgdGhlIGZsYXZvciAodmlhIGEgZGVkaWNhdGVkIGx1bmNoCi0jIGNvbmZpZyBmb3IgZXhhbXBsZSkuCi1UQVJHRVRfQlVJTERfRkxBVk9SIDo9ICQoVEFSR0VUX1BST0RVQ1QpLSQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpCi1pZm5lcSAoLCAkKGZpbHRlciBhZGRyZXNzLCAkKFNBTklUSVpFX1RBUkdFVCkpKQotaWZlcSAoLCQoZmluZHN0cmluZyBfYXNhbiwkKFRBUkdFVF9CVUlMRF9GTEFWT1IpKSkKLVRBUkdFVF9CVUlMRF9GTEFWT1IgOj0gJChUQVJHRVRfQlVJTERfRkxBVk9SKV9hc2FuCi1lbmRpZgotZW5kaWYKLQogS05PV05fT0VNX1RIVU1CUFJJTlRfUFJPUEVSVElFUyA6PSBcCiAgICAgcm8ucHJvZHVjdC5icmFuZCBcCiAgICAgcm8ucHJvZHVjdC5uYW1lIFwKQEAgLTI2MCw5MyArMTcyLDExIEBACiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIHN5c3RlbS9idWlsZC5wcm9wCiAjCi0jIE5vdGU6IHBhcnRzIG9mIHRoaXMgZmlsZSB0aGF0IGNhbid0IGJlIGdlbmVyYXRlZCBieSB0aGUgYnVpbGQtcHJvcGVydGllcwotIyBtYWNybyBhcmUgbWFudWFsbHkgY3JlYXRlZCBhcyBzZXBhcmF0ZSBmaWxlcyBhbmQgdGhlbiBmZWQgaW50byB0aGUgbWFjcm8KLQotIyBBY2NlcHRzIGEgd2hpdGVzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBwcm9kdWN0IGxvY2FsZXMgc3VjaCBhcwotIyAoZW5fVVMgZW5fQVUgZW5fR0IuLi4pIGFuZCByZXR1cm5zIHRoZSBmaXJzdCBsb2NhbGUgaW4gdGhlIGxpc3Qgd2l0aAotIyB1bmRlcnNjb3JlcyByZXBsYWNlZCB3aXRoIGh5cGhlbnMuIEluIHRoZSBleGFtcGxlIGFib3ZlLCB0aGlzIHdpbGwKLSMgcmV0dXJuICJlbi1VUyIuCi1kZWZpbmUgZ2V0LWRlZmF1bHQtcHJvZHVjdC1sb2NhbGUKLSQoc3RyaXAgJChzdWJzdCBfLC0sICQoZmlyc3R3b3JkICQoMSkpKSkKLWVuZGVmCi0KLWdlbl9mcm9tX2J1aWxkaW5mb19zaCA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxzeXN0ZW1fYnVpbGRfcHJvcCkvYnVpbGRpbmZvLnByb3AKLSQoZ2VuX2Zyb21fYnVpbGRpbmZvX3NoKTogJChJTlRFUk5BTF9CVUlMRF9JRF9NQUtFRklMRSkgJChBUElfRklOR0VSUFJJTlQpIHwgJChCVUlMRF9EQVRFVElNRV9GSUxFKSAkKEJVSUxEX05VTUJFUl9GSUxFKQotCSQoaGlkZSkgVEFSR0VUX0JVSUxEX1RZUEU9IiQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpIiBcCi0JICAgICAgICBUQVJHRVRfQlVJTERfRkxBVk9SPSIkKFRBUkdFVF9CVUlMRF9GTEFWT1IpIiBcCi0JICAgICAgICBUQVJHRVRfREVWSUNFPSIkKFRBUkdFVF9ERVZJQ0UpIiBcCi0JICAgICAgICBQUk9EVUNUX0RFRkFVTFRfTE9DQUxFPSIkKGNhbGwgZ2V0LWRlZmF1bHQtcHJvZHVjdC1sb2NhbGUsJChQUk9EVUNUX0xPQ0FMRVMpKSIgXAotCSAgICAgICAgUFJPRFVDVF9ERUZBVUxUX1dJRklfQ0hBTk5FTFM9IiQoUFJPRFVDVF9ERUZBVUxUX1dJRklfQ0hBTk5FTFMpIiBcCi0JICAgICAgICBQUklWQVRFX0JVSUxEX0RFU0M9IiQoQlVJTERfREVTQykiIFwKLQkgICAgICAgIEJVSUxEX0lEPSIkKEJVSUxEX0lEKSIgXAotCSAgICAgICAgQlVJTERfRElTUExBWV9JRD0iJChCVUlMRF9ESVNQTEFZX0lEKSIgXAotCSAgICAgICAgREFURT0iJChEQVRFX0ZST01fRklMRSkiIFwKLQkgICAgICAgIEJVSUxEX1VTRVJOQU1FPSIkKEJVSUxEX1VTRVJOQU1FKSIgXAotCSAgICAgICAgQlVJTERfSE9TVE5BTUU9IiQoQlVJTERfSE9TVE5BTUUpIiBcCi0JICAgICAgICBCVUlMRF9OVU1CRVI9IiQoQlVJTERfTlVNQkVSX0ZST01fRklMRSkiIFwKLQkgICAgICAgIEJPQVJEX1VTRV9WQk1FVEFfRElHVEVTVF9JTl9GSU5HRVJQUklOVD0iJChCT0FSRF9VU0VfVkJNRVRBX0RJR1RFU1RfSU5fRklOR0VSUFJJTlQpIiBcCi0JICAgICAgICBQTEFURk9STV9WRVJTSU9OPSIkKFBMQVRGT1JNX1ZFUlNJT04pIiBcCi0JICAgICAgICBQTEFURk9STV9ESVNQTEFZX1ZFUlNJT049IiQoUExBVEZPUk1fRElTUExBWV9WRVJTSU9OKSIgXAotCSAgICAgICAgUExBVEZPUk1fVkVSU0lPTl9MQVNUX1NUQUJMRT0iJChQTEFURk9STV9WRVJTSU9OX0xBU1RfU1RBQkxFKSIgXAotCSAgICAgICAgUExBVEZPUk1fU0VDVVJJVFlfUEFUQ0g9IiQoUExBVEZPUk1fU0VDVVJJVFlfUEFUQ0gpIiBcCi0JICAgICAgICBQTEFURk9STV9CQVNFX09TPSIkKFBMQVRGT1JNX0JBU0VfT1MpIiBcCi0JICAgICAgICBQTEFURk9STV9TREtfVkVSU0lPTj0iJChQTEFURk9STV9TREtfVkVSU0lPTikiIFwKLQkgICAgICAgIFBMQVRGT1JNX1BSRVZJRVdfU0RLX1ZFUlNJT049IiQoUExBVEZPUk1fUFJFVklFV19TREtfVkVSU0lPTikiIFwKLQkgICAgICAgIFBMQVRGT1JNX1BSRVZJRVdfU0RLX0ZJTkdFUlBSSU5UPSIkJChjYXQgJChBUElfRklOR0VSUFJJTlQpKSIgXAotCSAgICAgICAgUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRT0iJChQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FKSIgXAotCSAgICAgICAgUExBVEZPUk1fVkVSU0lPTl9BTExfQ09ERU5BTUVTPSIkKFBMQVRGT1JNX1ZFUlNJT05fQUxMX0NPREVOQU1FUykiIFwKLQkgICAgICAgIFBMQVRGT1JNX1ZFUlNJT05fS05PV05fQ09ERU5BTUVTPSIkKFBMQVRGT1JNX1ZFUlNJT05fS05PV05fQ09ERU5BTUVTKSIgXAotCSAgICAgICAgUExBVEZPUk1fTUlOX1NVUFBPUlRFRF9UQVJHRVRfU0RLX1ZFUlNJT049IiQoUExBVEZPUk1fTUlOX1NVUFBPUlRFRF9UQVJHRVRfU0RLX1ZFUlNJT04pIiBcCi0JICAgICAgICBCVUlMRF9WRVJTSU9OX1RBR1M9IiQoQlVJTERfVkVSU0lPTl9UQUdTKSIgXAotCSAgICAgICAgJChpZiAkKE9FTV9USFVNQlBSSU5UX1BST1BFUlRJRVMpLEJVSUxEX1RIVU1CUFJJTlQ9IiQoQlVJTERfVEhVTUJQUklOVF9GUk9NX0ZJTEUpIikgXAotCSAgICAgICAgVEFSR0VUX0NQVV9BQklfTElTVD0iJChUQVJHRVRfQ1BVX0FCSV9MSVNUKSIgXAotCSAgICAgICAgVEFSR0VUX0NQVV9BQklfTElTVF8zMl9CSVQ9IiQoVEFSR0VUX0NQVV9BQklfTElTVF8zMl9CSVQpIiBcCi0JICAgICAgICBUQVJHRVRfQ1BVX0FCSV9MSVNUXzY0X0JJVD0iJChUQVJHRVRfQ1BVX0FCSV9MSVNUXzY0X0JJVCkiIFwKLQkgICAgICAgIFRBUkdFVF9DUFVfQUJJPSIkKFRBUkdFVF9DUFVfQUJJKSIgXAotCSAgICAgICAgVEFSR0VUX0NQVV9BQkkyPSIkKFRBUkdFVF9DUFVfQUJJMikiIFwKLQkgICAgICAgIFpZR09URV9GT1JDRV82NF9CSVQ9IiQoWllHT1RFX0ZPUkNFXzY0X0JJVCkiIFwKLQkgICAgICAgIGJhc2ggJChCVUlMRElORk9fU0gpID4gJEAKLQotaWZkZWYgVEFSR0VUX1NZU1RFTV9QUk9QCi1zeXN0ZW1fcHJvcF9maWxlIDo9ICQoVEFSR0VUX1NZU1RFTV9QUk9QKQotZWxzZQotc3lzdGVtX3Byb3BfZmlsZSA6PSAkKHdpbGRjYXJkICQoVEFSR0VUX0RFVklDRV9ESVIpL3N5c3RlbS5wcm9wKQotZW5kaWYKLQotX3Byb3BfZmlsZXNfIDo9IFwKLSAgJChnZW5fZnJvbV9idWlsZGluZm9fc2gpIFwKLSAgJChzeXN0ZW1fcHJvcF9maWxlKQotCi0jIE9yZGVyIG1hdHRlcnMgaGVyZS4gV2hlbiB0aGVyZSBhcmUgZHVwbGljYXRlcywgdGhlIGxhc3Qgb25lIHdpbnMuCi0jIFRPRE8oYi8xMTc4OTIzMTgpOiBkb24ndCBhbGxvdyBkdXBsaWNhdGVzIHNvIHRoYXQgdGhlIG9yZGVyaW5nIGRvZXNuJ3QgbWF0dGVyCi1fcHJvcF92YXJzXyA6PSBcCi0gICAgQURESVRJT05BTF9TWVNURU1fUFJPUEVSVElFUyBcCi0gICAgUFJPRFVDVF9TWVNURU1fUFJPUEVSVElFUwotCi0jIFRPRE8oYi8xMTc4OTIzMTgpOiBkZXByZWNhdGUgdGhpcwotX3Byb3BfdmFyc18gKz0gXAotICAgIFBST0RVQ1RfU1lTVEVNX0RFRkFVTFRfUFJPUEVSVElFUwotCi1pZm5kZWYgcHJvcGVydHlfb3ZlcnJpZGVzX3NwbGl0X2VuYWJsZWQKLV9wcm9wX3ZhcnNfICs9IFwKLSAgICBBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTIFwKLSAgICBQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTCi1lbmRpZgorIyBzeXN0ZW0vYnVpbGQucHJvcCBpcyBidWlsdCBieSBTb29uZy4gU2VlIHN5c3RlbS1idWlsZC5wcm9wIG1vZHVsZSBpbgorIyBidWlsZC9zb29uZy9BbmRyb2lkLmJwLgogCiBJTlNUQUxMRURfQlVJTERfUFJPUF9UQVJHRVQgOj0gJChUQVJHRVRfT1VUKS9idWlsZC5wcm9wCiAKLSQoZXZhbCAkKGNhbGwgYnVpbGQtcHJvcGVydGllcyxcCi0gICAgc3lzdGVtLFwKLSAgICAkKElOU1RBTExFRF9CVUlMRF9QUk9QX1RBUkdFVCksXAotICAgICQoX3Byb3BfZmlsZXNfKSxcCi0gICAgJChfcHJvcF92YXJzXyksXAotICAgICQoUFJPRFVDVF9TWVNURU1fUFJPUEVSVFlfQkxBQ0tMSVNUKSxcCi0gICAgJChlbXB0eSksXAotICAgICQoZW1wdHkpKSkKLQotJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLXRhcmdldCwkKElOU1RBTExFRF9CVUlMRF9QUk9QX1RBUkdFVCkpKQotCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIHZlbmRvci9idWlsZC5wcm9wCiAjCkBAIC0zOTAsMTcxICsyMjAsNDcgQEAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgcHJvZHVjdC9ldGMvYnVpbGQucHJvcAogIwotCi1fcHJvcF9maWxlc18gOj0gJChpZiAkKFRBUkdFVF9QUk9EVUNUX1BST1ApLFwKLSAgICAkKFRBUkdFVF9QUk9EVUNUX1BST1ApLFwKLSAgICAkKHdpbGRjYXJkICQoVEFSR0VUX0RFVklDRV9ESVIpL3Byb2R1Y3QucHJvcCkpCi0KLSMgT3JkZXIgbWF0dGVycyBoZXJlLiBXaGVuIHRoZXJlIGFyZSBkdXBsaWNhdGVzLCB0aGUgbGFzdCBvbmUgd2lucy4KLSMgVE9ETyhiLzExNzg5MjMxOCk6IGRvbid0IGFsbG93IGR1cGxpY2F0ZXMgc28gdGhhdCB0aGUgb3JkZXJpbmcgZG9lc24ndCBtYXR0ZXIKLV9wcm9wX3ZhcnNfIDo9IFwKLSAgICBBRERJVElPTkFMX1BST0RVQ1RfUFJPUEVSVElFUyBcCi0gICAgUFJPRFVDVF9QUk9EVUNUX1BST1BFUlRJRVMKKyMgcHJvZHVjdC9ldGMvYnVpbGQucHJvcCBpcyBidWlsdCBieSBTb29uZy4gU2VlIHByb2R1Y3QtYnVpbGQucHJvcCBtb2R1bGUgaW4KKyMgYnVpbGQvc29vbmcvQW5kcm9pZC5icC4KIAogSU5TVEFMTEVEX1BST0RVQ1RfQlVJTERfUFJPUF9UQVJHRVQgOj0gJChUQVJHRVRfT1VUX1BST0RVQ1QpL2V0Yy9idWlsZC5wcm9wCiAKLWlmZGVmIFBST0RVQ1RfT0VNX1BST1BFUlRJRVMKLWltcG9ydF9vZW1fcHJvcCA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEVUQyxpbXBvcnRfb2VtX3Byb3ApL29lbS5wcm9wCi0KLSQoaW1wb3J0X29lbV9wcm9wKToKLQkkKGhpZGUpIGVjaG8gIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIgPj4gJEA7IFwKLQkgICAgICAgIGVjaG8gIiMgUFJPRFVDVF9PRU1fUFJPUEVSVElFUyIgPj4gJEA7IFwKLQkgICAgICAgIGVjaG8gIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIgPj4gJEA7Ci0JJChoaWRlKSAkKGZvcmVhY2ggcHJvcCwkKFBST0RVQ1RfT0VNX1BST1BFUlRJRVMpLCBcCi0JICAgIGVjaG8gImltcG9ydCAvb2VtL29lbS5wcm9wICQocHJvcCkiID4+ICRAOykKLQotX2Zvb3RlcnNfIDo9ICQoaW1wb3J0X29lbV9wcm9wKQotZWxzZQotX2Zvb3RlcnNfIDo9Ci1lbmRpZgotCi0jIFNraXAgY29tbW9uIC9wcm9kdWN0IHByb3BlcnRpZXMgZ2VuZXJhdGlvbiBpZiBkZXZpY2UgcmVsZWFzZWQgYmVmb3JlIFIgYW5kCi0jIGhhcyBubyBwcm9kdWN0IHBhcnRpdGlvbi4gVGhpcyBpcyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgY2hlY2suCi1pZmVxICgkKGNhbGwgbWF0aF9sdCwkKGlmICQoUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwpLCQoUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwpLDMwKSwzMCksIHRydWUpCi0gIF9za2lwX2NvbW1vbl9wcm9wZXJ0aWVzIDo9IHRydWUKLWVuZGlmCi0KLSMgVGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBjaGVjayAtIGFsd2F5cyBnZW5lcmF0ZSBjb21tb24gcHJvcGVydGllcyBmb3IgdGhlCi0jIGRldmljZXMgd2l0aCBwcm9kdWN0IHBhcnRpdGlvbiByZWdhcmRsZXNzIG9mIHNoaXBwaW5nIGxldmVsLgotaWZuZXEgKCQoQk9BUkRfVVNFU19QUk9EVUNUSU1BR0UpLCkKLSAgX3NraXBfY29tbW9uX3Byb3BlcnRpZXMgOj0KLWVuZGlmCi0KLSQoZXZhbCAkKGNhbGwgYnVpbGQtcHJvcGVydGllcyxcCi0gICAgcHJvZHVjdCxcCi0gICAgJChJTlNUQUxMRURfUFJPRFVDVF9CVUlMRF9QUk9QX1RBUkdFVCksXAotICAgICQoX3Byb3BfZmlsZXNfKSxcCi0gICAgJChfcHJvcF92YXJzXyksXAotICAgICQoZW1wdHkpLFwKLSAgICAkKF9mb290ZXJzXyksXAotICAgICQoX3NraXBfY29tbW9uX3Byb3BlcnRpZXMpKSkKLQotJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLXRhcmdldCwkKElOU1RBTExFRF9QUk9EVUNUX0JVSUxEX1BST1BfVEFSR0VUKSkpCi0KLV9za2lwX2NvbW1vbl9wcm9wZXJ0aWVzIDo9Ci0KICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBvZG0vZXRjL2J1aWxkLnByb3AKICMKLV9wcm9wX2ZpbGVzXyA6PSAkKGlmICQoVEFSR0VUX09ETV9QUk9QKSxcCi0gICAgJChUQVJHRVRfT0RNX1BST1ApLFwKLSAgICAkKHdpbGRjYXJkICQoVEFSR0VUX0RFVklDRV9ESVIpL29kbS5wcm9wKSkKLQotIyBPcmRlciBtYXR0ZXJzIGhlcmUuIFdoZW4gdGhlcmUgYXJlIGR1cGxpY2F0ZXMsIHRoZSBsYXN0IG9uZSB3aW5zLgotIyBUT0RPKGIvMTE3ODkyMzE4KTogZG9uJ3QgYWxsb3cgZHVwbGljYXRlcyBzbyB0aGF0IHRoZSBvcmRlcmluZyBkb2Vzbid0IG1hdHRlcgotX3Byb3BfdmFyc18gOj0gXAotICAgIEFERElUSU9OQUxfT0RNX1BST1BFUlRJRVMgXAotICAgIFBST0RVQ1RfT0RNX1BST1BFUlRJRVMKKyMgb2RtL2V0Yy9idWlsZC5wcm9wIGlzIGJ1aWx0IGJ5IFNvb25nLiBTZWUgb2RtLWJ1aWxkLnByb3AgbW9kdWxlIGluCisjIGJ1aWxkL3Nvb25nL0FuZHJvaWQuYnAuCiAKIElOU1RBTExFRF9PRE1fQlVJTERfUFJPUF9UQVJHRVQgOj0gJChUQVJHRVRfT1VUX09ETSkvZXRjL2J1aWxkLnByb3AKLSQoZXZhbCAkKGNhbGwgYnVpbGQtcHJvcGVydGllcyxcCi0gICAgb2RtLFwKLSAgICAkKElOU1RBTExFRF9PRE1fQlVJTERfUFJPUF9UQVJHRVQpLFwKLSAgICAkKF9wcm9wX2ZpbGVzXyksXAotICAgICQoX3Byb3BfdmFyc18pLFwKLSAgICAkKGVtcHR5KSxcCi0gICAgJChlbXB0eSksXAotICAgICQoZW1wdHkpKSkKLQotJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLXRhcmdldCwkKElOU1RBTExFRF9PRE1fQlVJTERfUFJPUF9UQVJHRVQpKSkKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIHZlbmRvcl9kbGttL2V0Yy9idWlsZC5wcm9wCi0jCisjIG9kbV9kbGttL2V0Yy9idWlsZC5wcm9wCisjIHN5c3RlbV9kbGttL2J1aWxkLnByb3AKKyMgVGhlc2UgYXJlIGJ1aWx0IGJ5IFNvb25nLiBTZWUgYnVpbGQvc29vbmcvQW5kcm9pZC5icAogCiBJTlNUQUxMRURfVkVORE9SX0RMS01fQlVJTERfUFJPUF9UQVJHRVQgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9ETEtNKS9ldGMvYnVpbGQucHJvcAotJChldmFsICQoY2FsbCBidWlsZC1wcm9wZXJ0aWVzLFwKLSAgICB2ZW5kb3JfZGxrbSxcCi0gICAgJChJTlNUQUxMRURfVkVORE9SX0RMS01fQlVJTERfUFJPUF9UQVJHRVQpLFwKLSAgICAkKGVtcHR5KSxcCi0gICAgJChlbXB0eSksXAotICAgICQoZW1wdHkpLFwKLSAgICAkKGVtcHR5KSxcCi0gICAgJChlbXB0eSkpKQotCi0kKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtdGFyZ2V0LCQoSU5TVEFMTEVEX1ZFTkRPUl9ETEtNX0JVSUxEX1BST1BfVEFSR0VUKSkpCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBvZG1fZGxrbS9ldGMvYnVpbGQucHJvcAotIwotCiBJTlNUQUxMRURfT0RNX0RMS01fQlVJTERfUFJPUF9UQVJHRVQgOj0gJChUQVJHRVRfT1VUX09ETV9ETEtNKS9ldGMvYnVpbGQucHJvcAotJChldmFsICQoY2FsbCBidWlsZC1wcm9wZXJ0aWVzLFwKLSAgICBvZG1fZGxrbSxcCi0gICAgJChJTlNUQUxMRURfT0RNX0RMS01fQlVJTERfUFJPUF9UQVJHRVQpLFwKLSAgICAkKGVtcHR5KSxcCi0gICAgJChlbXB0eSksXAotICAgICQoZW1wdHkpLFwKLSAgICAkKGVtcHR5KSxcCi0gICAgJChlbXB0eSkpKQotCi0kKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtdGFyZ2V0LCQoSU5TVEFMTEVEX09ETV9ETEtNX0JVSUxEX1BST1BfVEFSR0VUKSkpCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBzeXN0ZW1fZGxrbS9idWlsZC5wcm9wCi0jCi0KIElOU1RBTExFRF9TWVNURU1fRExLTV9CVUlMRF9QUk9QX1RBUkdFVCA6PSAkKFRBUkdFVF9PVVRfU1lTVEVNX0RMS00pL2V0Yy9idWlsZC5wcm9wCi0kKGV2YWwgJChjYWxsIGJ1aWxkLXByb3BlcnRpZXMsXAotICAgIHN5c3RlbV9kbGttLFwKLSAgICAkKElOU1RBTExFRF9TWVNURU1fRExLTV9CVUlMRF9QUk9QX1RBUkdFVCksXAotICAgICQoZW1wdHkpLFwKLSAgICAkKGVtcHR5KSxcCi0gICAgJChlbXB0eSksXAotICAgICQoZW1wdHkpLFwKLSAgICAkKGVtcHR5KSkpCi0KLSQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC10YXJnZXQsJChJTlNUQUxMRURfU1lTVEVNX0RMS01fQlVJTERfUFJPUF9UQVJHRVQpKSkKK0FMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTICs9IFwKKyAgJChJTlNUQUxMRURfVkVORE9SX0RMS01fQlVJTERfUFJPUF9UQVJHRVQpIFwKKyAgJChJTlNUQUxMRURfT0RNX0RMS01fQlVJTERfUFJPUF9UQVJHRVQpIFwKKyAgJChJTlNUQUxMRURfU1lTVEVNX0RMS01fQlVJTERfUFJPUF9UQVJHRVQpIFwKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBzeXN0ZW1fZXh0L2V0Yy9idWlsZC5wcm9wCiAjCi1fcHJvcF9maWxlc18gOj0gJChpZiAkKFRBUkdFVF9TWVNURU1fRVhUX1BST1ApLFwKLSAgICAkKFRBUkdFVF9TWVNURU1fRVhUX1BST1ApLFwKLSAgICAkKHdpbGRjYXJkICQoVEFSR0VUX0RFVklDRV9ESVIpL3N5c3RlbV9leHQucHJvcCkpCi0KLSMgT3JkZXIgbWF0dGVycyBoZXJlLiBXaGVuIHRoZXJlIGFyZSBkdXBsaWNhdGVzLCB0aGUgbGFzdCBvbmUgd2lucy4KLSMgVE9ETyhiLzExNzg5MjMxOCk6IGRvbid0IGFsbG93IGR1cGxpY2F0ZXMgc28gdGhhdCB0aGUgb3JkZXJpbmcgZG9lc24ndCBtYXR0ZXIKLV9wcm9wX3ZhcnNfIDo9IFBST0RVQ1RfU1lTVEVNX0VYVF9QUk9QRVJUSUVTCisjIHN5c3RlbV9leHQvZXRjL2J1aWxkLnByb3AgaXMgYnVpbHQgYnkgU29vbmcuIFNlZSBzeXN0ZW0tYnVpbGQucHJvcCBtb2R1bGUgaW4KKyMgYnVpbGQvc29vbmcvQW5kcm9pZC5icC4KIAogSU5TVEFMTEVEX1NZU1RFTV9FWFRfQlVJTERfUFJPUF9UQVJHRVQgOj0gJChUQVJHRVRfT1VUX1NZU1RFTV9FWFQpL2V0Yy9idWlsZC5wcm9wCi0kKGV2YWwgJChjYWxsIGJ1aWxkLXByb3BlcnRpZXMsXAotICAgIHN5c3RlbV9leHQsXAotICAgICQoSU5TVEFMTEVEX1NZU1RFTV9FWFRfQlVJTERfUFJPUF9UQVJHRVQpLFwKLSAgICAkKF9wcm9wX2ZpbGVzXyksXAotICAgICQoX3Byb3BfdmFyc18pLFwKLSAgICAkKGVtcHR5KSxcCi0gICAgJChlbXB0eSksXAotICAgICQoZW1wdHkpKSkKLQotJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLXRhcmdldCwkKElOU1RBTExFRF9TWVNURU1fRVhUX0JVSUxEX1BST1BfVEFSR0VUKSkpCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyByYW1kaXNrL2Jvb3QvZXRjL2J1aWxkLnByb3AKLSMKIAogUkFNRElTS19CVUlMRF9QUk9QX1JFTF9QQVRIIDo9IHN5c3RlbS9ldGMvcmFtZGlzay9idWlsZC5wcm9wCitpZmVxICh0cnVlLCQoQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09UKSkKK0lOU1RBTExFRF9SQU1ESVNLX0JVSUxEX1BST1BfVEFSR0VUIDo9ICQoVEFSR0VUX1JFQ09WRVJZX1JPT1RfT1VUKS9maXJzdF9zdGFnZV9yYW1kaXNrLyQoUkFNRElTS19CVUlMRF9QUk9QX1JFTF9QQVRIKQorZWxzZQogSU5TVEFMTEVEX1JBTURJU0tfQlVJTERfUFJPUF9UQVJHRVQgOj0gJChUQVJHRVRfUkFNRElTS19PVVQpLyQoUkFNRElTS19CVUlMRF9QUk9QX1JFTF9QQVRIKQotJChldmFsICQoY2FsbCBidWlsZC1wcm9wZXJ0aWVzLFwKLSAgICBib290aW1hZ2UsXAotICAgICQoSU5TVEFMTEVEX1JBTURJU0tfQlVJTERfUFJPUF9UQVJHRVQpLFwKLSAgICAkKGVtcHR5KSxcCi0gICAgJChlbXB0eSksXAotICAgICQoZW1wdHkpLFwKLSAgICAkKGVtcHR5KSxcCi0gICAgJChlbXB0eSkpKQotCi0kKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtdGFyZ2V0LCQoSU5TVEFMTEVEX1JBTURJU0tfQlVJTERfUFJPUF9UQVJHRVQpKSkKK2VuZGlmCiAKIEFMTF9JTlNUQUxMRURfQlVJTERfUFJPUF9GSUxFUyA6PSBcCiAgICQoSU5TVEFMTEVEX0JVSUxEX1BST1BfVEFSR0VUKSBcCkBAIC01NzAsNCArMjc2LDQgQEAKICMgJDEgaW5zdGFsbGVkIGZpbGUgcGF0aCwgZS5nLiBvdXQvdGFyZ2V0L3Byb2R1Y3QvdnNvY194ODZfNjQvc3lzdGVtL2J1aWxkLnByb3AKIGRlZmluZSBpcy1idWlsZC1wcm9wCiAkKGlmICQoZmluZHN0cmluZyAkMSwkKEFMTF9JTlNUQUxMRURfQlVJTERfUFJPUF9GSUxFUykpLFkpCi1lbmRlZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZGVmCmRpZmYgLS1naXQgYS9jb3JlL3N5c3Byb3BfY29uZmlnLm1rIGIvY29yZS9zeXNwcm9wX2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTkxNTAzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zeXNwcm9wX2NvbmZpZy5tawpAQCAtMCwwICsxLDE0OSBAQAorIyBBRERJVElPTkFMXzxwYXJ0aXRpb24+X1BST1BFUlRJRVMgYXJlIHByb3BlcnRpZXMgdGhhdCBhcmUgZGV0ZXJtaW5lZCBieSB0aGUKKyMgYnVpbGQgc3lzdGVtIGl0c2VsZi4gRG9uJ3QgbGV0IGl0IGJlIGRlZmluZWQgZnJvbSBvdXRzaWRlIG9mIHRoZSBjb3JlIGJ1aWxkCisjIHN5c3RlbSBsaWtlIEFuZHJvaWQubWsgb3IgPHByb2R1Y3Q+Lm1rIGZpbGVzLgorX2FkZGl0aW9uYWxfcHJvcF92YXJfbmFtZXMgOj0gXAorICAgIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMgXAorICAgIEFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgXAorICAgIEFERElUSU9OQUxfT0RNX1BST1BFUlRJRVMgXAorICAgIEFERElUSU9OQUxfUFJPRFVDVF9QUk9QRVJUSUVTCisKKyQoZm9yZWFjaCBuYW1lLCAkKF9hZGRpdGlvbmFsX3Byb3BfdmFyX25hbWVzKSxcCisgICQoaWYgJCgkKG5hbWUpKSxcCisgICAgJChlcnJvciAkKG5hbWUpIG11c3Qgbm90IHNldCBiZWZvcmUgaGVyZS4gJCgkKG5hbWUpKSlcCisgICwpXAorICAkKGV2YWwgJChuYW1lKSA6PSlcCispCitfYWRkaXRpb25hbF9wcm9wX3Zhcl9uYW1lcyA6PQorCiskKEtBVElfb2Jzb2xldGVfdmFyIEFERElUSU9OQUxfU1lTVEVNX1BST1BFUlRJRVMsVXNlIGJ1aWxkL3Nvb25nL3NjcmlwdHMvZ2VuX2J1aWxkX3Byb3AucHkgaW5zdGVhZCkKKyQoS0FUSV9vYnNvbGV0ZV92YXIgQURESVRJT05BTF9PRE1fUFJPUEVSVElFUyxVc2UgYnVpbGQvc29vbmcvc2NyaXB0cy9nZW5fYnVpbGRfcHJvcC5weSBpbnN0ZWFkKQorJChLQVRJX29ic29sZXRlX3ZhciBBRERJVElPTkFMX1BST0RVQ1RfUFJPUEVSVElFUyxVc2UgYnVpbGQvc29vbmcvc2NyaXB0cy9nZW5fYnVpbGRfcHJvcC5weSBpbnN0ZWFkKQorCisjIEFkZCBjcHUgcHJvcGVydGllcyBmb3IgYmlvbmljIGFuZCBBUlQuCitBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLmJpb25pYy5hcmNoPSQoVEFSR0VUX0FSQ0gpCitBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLmJpb25pYy5jcHVfdmFyaWFudD0kKFRBUkdFVF9DUFVfVkFSSUFOVF9SVU5USU1FKQorQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSByby5iaW9uaWMuMm5kX2FyY2g9JChUQVJHRVRfMk5EX0FSQ0gpCitBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLmJpb25pYy4ybmRfY3B1X3ZhcmlhbnQ9JChUQVJHRVRfMk5EX0NQVV9WQVJJQU5UX1JVTlRJTUUpCisKK0FERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gcGVyc2lzdC5zeXMuZGFsdmlrLnZtLmxpYi4yPWxpYmFydC5zbworQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBkYWx2aWsudm0uaXNhLiQoVEFSR0VUX0FSQ0gpLnZhcmlhbnQ9JChERVgyT0FUX1RBUkdFVF9DUFVfVkFSSUFOVF9SVU5USU1FKQoraWZuZXEgKCQoREVYMk9BVF9UQVJHRVRfSU5TVFJVQ1RJT05fU0VUX0ZFQVRVUkVTKSwpCisgIEFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gZGFsdmlrLnZtLmlzYS4kKFRBUkdFVF9BUkNIKS5mZWF0dXJlcz0kKERFWDJPQVRfVEFSR0VUX0lOU1RSVUNUSU9OX1NFVF9GRUFUVVJFUykKK2VuZGlmCisKK2lmZGVmIFRBUkdFVF8yTkRfQVJDSAorICBBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IGRhbHZpay52bS5pc2EuJChUQVJHRVRfMk5EX0FSQ0gpLnZhcmlhbnQ9JCgkKFRBUkdFVF8yTkRfQVJDSF9WQVJfUFJFRklYKURFWDJPQVRfVEFSR0VUX0NQVV9WQVJJQU5UX1JVTlRJTUUpCisgIGlmbmVxICgkKCQoVEFSR0VUXzJORF9BUkNIX1ZBUl9QUkVGSVgpREVYMk9BVF9UQVJHRVRfSU5TVFJVQ1RJT05fU0VUX0ZFQVRVUkVTKSwpCisgICAgQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBkYWx2aWsudm0uaXNhLiQoVEFSR0VUXzJORF9BUkNIKS5mZWF0dXJlcz0kKCQoVEFSR0VUXzJORF9BUkNIX1ZBUl9QUkVGSVgpREVYMk9BVF9UQVJHRVRfSU5TVFJVQ1RJT05fU0VUX0ZFQVRVUkVTKQorICBlbmRpZgorZW5kaWYKKworIyBBbHRob3VnaCB0aGVzZSB2YXJpYWJsZXMgYXJlIHByZWZpeGVkIHdpdGggVEFSR0VUX1JFQ09WRVJZXywgdGhleSBhcmUgYWxzbyBuZWVkZWQgdW5kZXIgY2hhcmdlcgorIyBtb2RlICh2aWEgbGlibWludWkpLgoraWZkZWYgVEFSR0VUX1JFQ09WRVJZX0RFRkFVTFRfUk9UQVRJT04KK0FERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAorICAgIHJvLm1pbnVpLmRlZmF1bHRfcm90YXRpb249JChUQVJHRVRfUkVDT1ZFUllfREVGQVVMVF9ST1RBVElPTikKK2VuZGlmCitpZmRlZiBUQVJHRVRfUkVDT1ZFUllfT1ZFUlNDQU5fUEVSQ0VOVAorQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCisgICAgcm8ubWludWkub3ZlcnNjYW5fcGVyY2VudD0kKFRBUkdFVF9SRUNPVkVSWV9PVkVSU0NBTl9QRVJDRU5UKQorZW5kaWYKK2lmZGVmIFRBUkdFVF9SRUNPVkVSWV9QSVhFTF9GT1JNQVQKK0FERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAorICAgIHJvLm1pbnVpLnBpeGVsX2Zvcm1hdD0kKFRBUkdFVF9SRUNPVkVSWV9QSVhFTF9GT1JNQVQpCitlbmRpZgorCitpZmRlZiBQUk9EVUNUX1VTRV9EWU5BTUlDX1BBUlRJVElPTlMKK0FERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAorICAgIHJvLmJvb3QuZHluYW1pY19wYXJ0aXRpb25zPSQoUFJPRFVDVF9VU0VfRFlOQU1JQ19QQVJUSVRJT05TKQorZW5kaWYKKworaWZkZWYgUFJPRFVDVF9SRVRST0ZJVF9EWU5BTUlDX1BBUlRJVElPTlMKK0FERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAorICAgIHJvLmJvb3QuZHluYW1pY19wYXJ0aXRpb25zX3JldHJvZml0PSQoUFJPRFVDVF9SRVRST0ZJVF9EWU5BTUlDX1BBUlRJVElPTlMpCitlbmRpZgorCitpZmRlZiBQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTAorQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCisgICAgcm8ucHJvZHVjdC5maXJzdF9hcGlfbGV2ZWw9JChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCkKK2VuZGlmCisKK2lmZGVmIFBST0RVQ1RfU0hJUFBJTkdfVkVORE9SX0FQSV9MRVZFTAorQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCisgICAgcm8udmVuZG9yLmFwaV9sZXZlbD0kKFBST0RVQ1RfU0hJUFBJTkdfVkVORE9SX0FQSV9MRVZFTCkKK2VuZGlmCisKK2lmbmVxICgkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSx1c2VyKQorICBpZmRlZiBQUk9EVUNUX1NFVF9ERUJVR0ZTX1JFU1RSSUNUSU9OUworICAgIEFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAorICAgICAgcm8ucHJvZHVjdC5kZWJ1Z2ZzX3Jlc3RyaWN0aW9ucy5lbmFibGVkPSQoUFJPRFVDVF9TRVRfREVCVUdGU19SRVNUUklDVElPTlMpCisgIGVuZGlmCitlbmRpZgorCisjIFZlbmRvcnMgd2l0aCBHUkYgbXVzdCBkZWZpbmUgQk9BUkRfU0hJUFBJTkdfQVBJX0xFVkVMIGZvciB0aGUgdmVuZG9yIEFQSSBsZXZlbC4KKyMgVGhpcyBtdXN0IG5vdCBiZSBkZWZpbmVkIGZvciB0aGUgbm9uLUdSRiBkZXZpY2VzLgorIyBUaGUgdmFsdWVzIG9mIHRoZSBHUkYgcHJvcGVydGllcyB3aWxsIGJlIHZlcmlmaWVkIGJ5IHBvc3RfcHJvY2Vzc19wcm9wcy5weQoraWZkZWYgQk9BUkRfU0hJUFBJTkdfQVBJX0xFVkVMCitBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IFwKKyAgICByby5ib2FyZC5maXJzdF9hcGlfbGV2ZWw9JChCT0FSRF9TSElQUElOR19BUElfTEVWRUwpCitlbmRpZgorCisjIEJ1aWxkIHN5c3RlbSBzZXQgQk9BUkRfQVBJX0xFVkVMIHRvIHNob3cgdGhlIGFwaSBsZXZlbCBvZiB0aGUgdmVuZG9yIEFQSSBzdXJmYWNlLgorIyBUaGlzIG11c3Qgbm90IGJlIGFsdGVyZWQgb3V0c2lkZSBvZiBidWlsZCBzeXN0ZW0uCitpZmRlZiBCT0FSRF9BUElfTEVWRUwKKyAgQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCisgICAgcm8uYm9hcmQuYXBpX2xldmVsPz0kKEJPQVJEX0FQSV9MRVZFTCkKKyAgaWZkZWYgQk9BUkRfQVBJX0xFVkVMX1BST1BfT1ZFUlJJREUKKyAgICBBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IFwKKyAgICAgIHJvLmJvYXJkLmFwaV9sZXZlbD0kKEJPQVJEX0FQSV9MRVZFTF9QUk9QX09WRVJSSURFKQorICBlbmRpZgorZW5kaWYKKyMgUkVMRUFTRV9CT0FSRF9BUElfTEVWRUxfRlJPWkVOIGlzIHRydWUgd2hlbiB0aGUgdmVuZG9yIEFQSSBzdXJmYWNlIGlzIGZyb3plbi4KK2lmZGVmIFJFTEVBU0VfQk9BUkRfQVBJX0xFVkVMX0ZST1pFTgorQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCisgICAgcm8uYm9hcmQuYXBpX2Zyb3plbj0kKFJFTEVBU0VfQk9BUkRfQVBJX0xFVkVMX0ZST1pFTikKK2VuZGlmCisKKyMgU2V0IGJ1aWxkIHByb3AuIFRoaXMgcHJvcCBpcyByZWFkIGJ5IG90YV9mcm9tX3RhcmdldF9maWxlcyB3aGVuIGdlbmVyYXRpbmcgT1RBLAorIyB0byBkZWNpZGUgaWYgVkFCQyBzaG91bGQgYmUgZGlzYWJsZWQuCitpZmVxICgkKEJPQVJEX0RPTlRfVVNFX1ZBQkNfT1RBKSx0cnVlKQorQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCisgICAgcm8udmVuZG9yLmJ1aWxkLmRvbnRfdXNlX3ZhYmM9dHJ1ZQorZW5kaWYKKworIyBTZXQgdGhlIGZsYWcgaW4gdmVuZG9yLiBTbyBWVFMgd291bGQga25vdyBpZiB0aGUgbmV3IGZpbmdlcnByaW50IGZvcm1hdCBpcyBpbiB1c2Ugd2hlbgorIyB0aGUgc3lzdGVtIGltYWdlcyBhcmUgcmVwbGFjZWQgYnkgR1NJLgoraWZlcSAoJChCT0FSRF9VU0VfVkJNRVRBX0RJR1RFU1RfSU5fRklOR0VSUFJJTlQpLHRydWUpCitBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IFwKKyAgICByby52ZW5kb3IuYnVpbGQuZmluZ2VycHJpbnRfaGFzX2RpZ2VzdD0xCitlbmRpZgorCitBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IFwKKyAgICByby52ZW5kb3IuYnVpbGQuc2VjdXJpdHlfcGF0Y2g9JChWRU5ET1JfU0VDVVJJVFlfUEFUQ0gpIFwKKyAgICByby5wcm9kdWN0LmJvYXJkPSQoVEFSR0VUX0JPT1RMT0FERVJfQk9BUkRfTkFNRSkgXAorICAgIHJvLmJvYXJkLnBsYXRmb3JtPSQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSBcCisgICAgcm8uaHd1aS51c2VfdnVsa2FuPSQoVEFSR0VUX1VTRVNfVlVMS0FOKQorCitpZmRlZiBUQVJHRVRfU0NSRUVOX0RFTlNJVFkKK0FERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAorICAgIHJvLnNmLmxjZF9kZW5zaXR5PSQoVEFSR0VUX1NDUkVFTl9ERU5TSVRZKQorZW5kaWYKKworaWZkZWYgQUJfT1RBX1VQREFURVIKK0FERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAorICAgIHJvLmJ1aWxkLmFiX3VwZGF0ZT0kKEFCX09UQV9VUERBVEVSKQorZW5kaWYKKworaWZlcSAoJChBQl9PVEFfVVBEQVRFUiksdHJ1ZSkKK0FERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8udmVuZG9yLmJ1aWxkLmFiX290YV9wYXJ0aXRpb25zPSQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJChzb3J0ICQoQUJfT1RBX1BBUlRJVElPTlMpKSkKK2VuZGlmCisKK3VzZXJfdmFyaWFudCA6PSAkKGZpbHRlciB1c2VyIHVzZXJkZWJ1ZywkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkKKworY29uZmlnX2VuYWJsZV91ZmZkX2djIDo9IFwKKyAgJChmaXJzdHdvcmQgJChPVkVSUklERV9FTkFCTEVfVUZGRF9HQykgJChQUk9EVUNUX0VOQUJMRV9VRkZEX0dDKSBkZWZhdWx0KQorCitBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTIDo9ICQoc3RyaXAgJChBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTKSkKKworLktBVElfUkVBRE9OTFkgKz0gXAorICAgIEFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvYXJ0LWhvc3QtdGVzdHMubWsgYi9jb3JlL3Rhc2tzL2FydC1ob3N0LXRlc3RzLm1rCmluZGV4IGZmOWViMDkuLmViNTRmYWUgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3MvYXJ0LWhvc3QtdGVzdHMubWsKKysrIGIvY29yZS90YXNrcy9hcnQtaG9zdC10ZXN0cy5tawpAQCAtNDcsMjAgKzQ3LDE2IEBACiAJJChoaWRlKSBmb3Igc2hhcmVkX2xpYiBpbiAkKFBSSVZBVEVfSE9TVF9TSEFSRURfTElCUyk7IGRvIFwKIAkgIGVjaG8gJCRzaGFyZWRfbGliID4+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvc2hhcmVkLWxpYnMubGlzdDsgXAogCWRvbmUKLQlncmVwICQoVEFSR0VUX09VVF9URVNUQ0FTRVMpICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvbGlzdCA+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvdGFyZ2V0Lmxpc3QgfHwgdHJ1ZQogCSQoaGlkZSkgJChTT09OR19aSVApIC1kIC1vICRAIC1QIGhvc3QgLUMgJChIT1NUX09VVCkgLWwgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9ob3N0Lmxpc3QgXAotCSAgLVAgdGFyZ2V0IC1DICQoUFJPRFVDVF9PVVQpIC1sICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvdGFyZ2V0Lmxpc3QgXAotCSAgLVAgaG9zdC90ZXN0Y2FzZXMgLUMgJChIT1NUX09VVCkgLWwgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9zaGFyZWQtbGlicy5saXN0CisJICAtUCBob3N0L3Rlc3RjYXNlcyAtQyAkKEhPU1RfT1VUKSAtbCAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3NoYXJlZC1saWJzLmxpc3QgXAorCSAgLXNoYTI1NgogCWdyZXAgLWUgLipcXC5jb25maWckJCAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2hvc3QubGlzdCA+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvaG9zdC10ZXN0LWNvbmZpZ3MubGlzdCB8fCB0cnVlCi0JZ3JlcCAtZSAuKlxcLmNvbmZpZyQkICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvdGFyZ2V0Lmxpc3QgPiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3RhcmdldC10ZXN0LWNvbmZpZ3MubGlzdCB8fCB0cnVlCiAJJChoaWRlKSAkKFNPT05HX1pJUCkgLWQgLW8gJChQUklWQVRFX2FydF9ob3N0X3Rlc3RzX2NvbmZpZ3NfemlwKSBcCi0JICAtUCBob3N0IC1DICQoSE9TVF9PVVQpIC1sICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvaG9zdC10ZXN0LWNvbmZpZ3MubGlzdCBcCi0JICAtUCB0YXJnZXQgLUMgJChQUk9EVUNUX09VVCkgLWwgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS90YXJnZXQtdGVzdC1jb25maWdzLmxpc3QKKwkgIC1QIGhvc3QgLUMgJChIT1NUX09VVCkgLWwgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9ob3N0LXRlc3QtY29uZmlncy5saXN0CiAJZ3JlcCAkKEhPU1RfT1VUKSAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3NoYXJlZC1saWJzLmxpc3QgPiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2hvc3Qtc2hhcmVkLWxpYnMubGlzdCB8fCB0cnVlCiAJJChoaWRlKSAkKFNPT05HX1pJUCkgLWQgLW8gJChQUklWQVRFX2FydF9ob3N0X3Rlc3RzX2hvc3Rfc2hhcmVkX2xpYnNfemlwKSBcCiAJICAtUCBob3N0IC1DICQoSE9TVF9PVVQpIC1sICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvaG9zdC1zaGFyZWQtbGlicy5saXN0CiAJZ3JlcCAtZSAuKlxcLmNvbmZpZyQkICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvaG9zdC5saXN0IHwgc2VkIHMlJChIT1NUX09VVCklaG9zdCVnID4gJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9hcnQtaG9zdC10ZXN0c19saXN0Ci0JZ3JlcCAtZSAuKlxcLmNvbmZpZyQkICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvdGFyZ2V0Lmxpc3QgfCBzZWQgcyUkKFBST0RVQ1RfT1VUKSV0YXJnZXQlZyA+PiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2FydC1ob3N0LXRlc3RzX2xpc3QKIAkkKGhpZGUpICQoU09PTkdfWklQKSAtZCAtbyAkKFBSSVZBVEVfYXJ0X2hvc3RfdGVzdHNfbGlzdF96aXApIC1DICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikgLWYgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9hcnQtaG9zdC10ZXN0c19saXN0CiAKIGFydC1ob3N0LXRlc3RzOiAkKGFydF9ob3N0X3Rlc3RzX3ppcCkKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvYXJ0Lm1rIGIvY29yZS90YXNrcy9hcnQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVkNjEyNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGFza3MvYXJ0Lm1rCkBAIC0wLDAgKzEsMjYgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBjbGVhbi1vYXQgcnVsZXMKKyMKKworLlBIT05ZOiBjbGVhbi1vYXQKK2NsZWFuLW9hdDogY2xlYW4tb2F0LWhvc3QgY2xlYW4tb2F0LXRhcmdldAorCisuUEhPTlk6IGNsZWFuLW9hdC1ob3N0CitjbGVhbi1vYXQtaG9zdDoKKwlmaW5kICQoT1VUX0RJUikgJygnIC1uYW1lICcqLm9hdCcgLW8gLW5hbWUgJyoub2RleCcgLW8gLW5hbWUgJyouYXJ0JyAtbyAtbmFtZSAnKi52ZGV4JyAnKScgLWEgLXR5cGUgZiB8IHhhcmdzIHJtIC1mCisJcm0gLXJmICQoVE1QRElSKS8qL3Rlc3QtKi9kYWx2aWstY2FjaGUvKgorCXJtIC1yZiAkKFRNUERJUikvYW5kcm9pZC1kYXRhL2RhbHZpay1jYWNoZS8qCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL2F1dG9tb3RpdmUtc2R2LXRlc3RzLm1rIGIvY29yZS90YXNrcy9hdXRvbW90aXZlLXNkdi10ZXN0cy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjcwNmNlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90YXNrcy9hdXRvbW90aXZlLXNkdi10ZXN0cy5tawpAQCAtMCwwICsxLDYxIEBACisjIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKy5QSE9OWTogYXV0b21vdGl2ZS1zZHYtdGVzdHMKKworYXV0b21vdGl2ZS1zZHYtdGVzdHMtemlwIDo9ICQoUFJPRFVDVF9PVVQpL2F1dG9tb3RpdmUtc2R2LXRlc3RzLnppcAorIyBDcmVhdGUgYW4gYXJ0aWZhY3QgdG8gaW5jbHVkZSBhIGxpc3Qgb2YgdGVzdCBjb25maWcgZmlsZXMgaW4gYXV0b21vdGl2ZS1zZHYtdGVzdHMuCithdXRvbW90aXZlLXNkdi10ZXN0cy1saXN0LXppcCA6PSAkKFBST0RVQ1RfT1VUKS9hdXRvbW90aXZlLXNkdi10ZXN0c19saXN0LnppcAorIyBDcmVhdGUgYW4gYXJ0aWZhY3QgdG8gaW5jbHVkZSBhbGwgdGVzdCBjb25maWcgZmlsZXMgaW4gYXV0b21vdGl2ZS1zZHYtdGVzdHMuCithdXRvbW90aXZlLXNkdi10ZXN0cy1jb25maWdzLXppcCA6PSAkKFBST0RVQ1RfT1VUKS9hdXRvbW90aXZlLXNkdi10ZXN0c19jb25maWdzLnppcAorbXlfaG9zdF9zaGFyZWRfbGliX2Zvcl9hdXRvbW90aXZlX3Nkdl90ZXN0cyA6PSAkKGNhbGwgY29weS1tYW55LWZpbGVzLCQoQ09NUEFUSUJJTElUWS5hdXRvbW90aXZlLXNkdi10ZXN0cy5IT1NUX1NIQVJFRF9MSUJSQVJZLkZJTEVTKSkKK2F1dG9tb3RpdmVfc2R2X3Rlc3RzX2hvc3Rfc2hhcmVkX2xpYnNfemlwIDo9ICQoUFJPRFVDVF9PVVQpL2F1dG9tb3RpdmUtc2R2LXRlc3RzX2hvc3Qtc2hhcmVkLWxpYnMuemlwCisKKyQoYXV0b21vdGl2ZS1zZHYtdGVzdHMtemlwKSA6IC5LQVRJX0lNUExJQ0lUX09VVFBVVFMgOj0gJChhdXRvbW90aXZlLXNkdi10ZXN0cy1saXN0LXppcCkgJChhdXRvbW90aXZlLXNkdi10ZXN0cy1jb25maWdzLXppcCkgJChhdXRvbW90aXZlX3Nkdl90ZXN0c19ob3N0X3NoYXJlZF9saWJzX3ppcCkKKyQoYXV0b21vdGl2ZS1zZHYtdGVzdHMtemlwKSA6IFBSSVZBVEVfYXV0b21vdGl2ZV9zZHZfdGVzdHNfbGlzdCA6PSAkKFBST0RVQ1RfT1VUKS9hdXRvbW90aXZlLXNkdi10ZXN0c19saXN0CiskKGF1dG9tb3RpdmUtc2R2LXRlc3RzLXppcCkgOiBQUklWQVRFX0hPU1RfU0hBUkVEX0xJQlMgOj0gJChteV9ob3N0X3NoYXJlZF9saWJfZm9yX2F1dG9tb3RpdmVfc2R2X3Rlc3RzKQorJChhdXRvbW90aXZlLXNkdi10ZXN0cy16aXApIDogUFJJVkFURV9hdXRvbW90aXZlX2hvc3Rfc2hhcmVkX2xpYnNfemlwIDo9ICQoYXV0b21vdGl2ZV9zZHZfdGVzdHNfaG9zdF9zaGFyZWRfbGlic196aXApCiskKGF1dG9tb3RpdmUtc2R2LXRlc3RzLXppcCkgOiAkKENPTVBBVElCSUxJVFkuYXV0b21vdGl2ZS1zZHYtdGVzdHMuRklMRVMpICQobXlfaG9zdF9zaGFyZWRfbGliX2Zvcl9hdXRvbW90aXZlX3Nkdl90ZXN0cykgJChTT09OR19aSVApCisJcm0gLWYgJEAtc2hhcmVkLWxpYnMubGlzdAorCWVjaG8gJChzb3J0ICQoQ09NUEFUSUJJTElUWS5hdXRvbW90aXZlLXNkdi10ZXN0cy5GSUxFUykpIHwgdHIgIiAiICJcbiIgPiAkQC5saXN0CisJZ3JlcCAkKEhPU1RfT1VUX1RFU1RDQVNFUykgJEAubGlzdCA+ICRALWhvc3QubGlzdCB8fCB0cnVlCisJZ3JlcCAtZSAuKlxcLmNvbmZpZyQkICRALWhvc3QubGlzdCA+ICRALWhvc3QtdGVzdC1jb25maWdzLmxpc3QgfHwgdHJ1ZQorCSQoaGlkZSkgZm9yIHNoYXJlZF9saWIgaW4gJChQUklWQVRFX0hPU1RfU0hBUkVEX0xJQlMpOyBkbyBcCisJICBlY2hvICQkc2hhcmVkX2xpYiA+PiAkQC1ob3N0Lmxpc3Q7IFwKKwkgIGVjaG8gJCRzaGFyZWRfbGliID4+ICRALXNoYXJlZC1saWJzLmxpc3Q7IFwKKwlkb25lCisJZ3JlcCAkKEhPU1RfT1VUX1RFU1RDQVNFUykgJEAtc2hhcmVkLWxpYnMubGlzdCA+ICRALWhvc3Qtc2hhcmVkLWxpYnMubGlzdCB8fCB0cnVlCisJZ3JlcCAkKFRBUkdFVF9PVVRfVEVTVENBU0VTKSAkQC5saXN0ID4gJEAtdGFyZ2V0Lmxpc3QgfHwgdHJ1ZQorCWdyZXAgLWUgLipcXC5jb25maWckJCAkQC10YXJnZXQubGlzdCA+ICRALXRhcmdldC10ZXN0LWNvbmZpZ3MubGlzdCB8fCB0cnVlCisJJChoaWRlKSAkKFNPT05HX1pJUCkgLWQgLW8gJEAgLVAgaG9zdCAtQyAkKEhPU1RfT1VUKSAtbCAkQC1ob3N0Lmxpc3QgLVAgdGFyZ2V0IC1DICQoUFJPRFVDVF9PVVQpIC1sICRALXRhcmdldC5saXN0CisJJChoaWRlKSAkKFNPT05HX1pJUCkgLWQgLW8gJChhdXRvbW90aXZlLXNkdi10ZXN0cy1jb25maWdzLXppcCkgXAorCSAgLVAgaG9zdCAtQyAkKEhPU1RfT1VUKSAtbCAkQC1ob3N0LXRlc3QtY29uZmlncy5saXN0IFwKKwkgIC1QIHRhcmdldCAtQyAkKFBST0RVQ1RfT1VUKSAtbCAkQC10YXJnZXQtdGVzdC1jb25maWdzLmxpc3QKKwkkKFNPT05HX1pJUCkgLWQgLW8gJChQUklWQVRFX2F1dG9tb3RpdmVfaG9zdF9zaGFyZWRfbGlic196aXApIFwKKwkgIC1QIGhvc3QgLUMgJChIT1NUX09VVCkgLWwgJEAtaG9zdC1zaGFyZWQtbGlicy5saXN0CisJcm0gLWYgJChQUklWQVRFX2F1dG9tb3RpdmVfc2R2X3Rlc3RzX2xpc3QpCisJJChoaWRlKSBncmVwIC1lIC4qXFwuY29uZmlnJCQgJEAtaG9zdC5saXN0IHwgc2VkIHMlJChIT1NUX09VVCklaG9zdCVnID4gJChQUklWQVRFX2F1dG9tb3RpdmVfc2R2X3Rlc3RzX2xpc3QpCisJJChoaWRlKSBncmVwIC1lIC4qXFwuY29uZmlnJCQgJEAtdGFyZ2V0Lmxpc3QgfCBzZWQgcyUkKFBST0RVQ1RfT1VUKSV0YXJnZXQlZyA+PiAkKFBSSVZBVEVfYXV0b21vdGl2ZV9zZHZfdGVzdHNfbGlzdCkKKwkkKGhpZGUpICQoU09PTkdfWklQKSAtZCAtbyAkKGF1dG9tb3RpdmUtc2R2LXRlc3RzLWxpc3QtemlwKSAtQyAkKGRpciAkQCkgLWYgJChQUklWQVRFX2F1dG9tb3RpdmVfc2R2X3Rlc3RzX2xpc3QpCisJcm0gLWYgJEAubGlzdCAkQC1ob3N0Lmxpc3QgJEAtdGFyZ2V0Lmxpc3QgJEAtaG9zdC10ZXN0LWNvbmZpZ3MubGlzdCAkQC10YXJnZXQtdGVzdC1jb25maWdzLmxpc3QgXAorCSAgJEAtc2hhcmVkLWxpYnMubGlzdCAkQC1ob3N0LXNoYXJlZC1saWJzLmxpc3QgJChQUklWQVRFX2F1dG9tb3RpdmVfc2R2X3Rlc3RzX2xpc3QpCisKK2F1dG9tb3RpdmUtc2R2LXRlc3RzOiAkKGF1dG9tb3RpdmUtc2R2LXRlc3RzLXppcCkKKyQoY2FsbCBkaXN0LWZvci1nb2FscywgYXV0b21vdGl2ZS1zZHYtdGVzdHMsICQoYXV0b21vdGl2ZS1zZHYtdGVzdHMtemlwKSAkKGF1dG9tb3RpdmUtc2R2LXRlc3RzLWxpc3QtemlwKSAkKGF1dG9tb3RpdmUtc2R2LXRlc3RzLWNvbmZpZ3MtemlwKSAkKGF1dG9tb3RpdmVfc2R2X3Rlc3RzX2hvc3Rfc2hhcmVkX2xpYnNfemlwKSkKKworJChjYWxsIGRlY2xhcmUtMXAtY29udGFpbmVyLCQoYXV0b21vdGl2ZS1zZHYtdGVzdHMtemlwKSwpCiskKGNhbGwgZGVjbGFyZS1jb250YWluZXItbGljZW5zZS1kZXBzLCQoYXV0b21vdGl2ZS1zZHYtdGVzdHMtemlwKSwkKENPTVBBVElCSUxJVFkuYXV0b21vdGl2ZS1zZHYtdGVzdHMuRklMRVMpICQobXlfaG9zdF9zaGFyZWRfbGliX2Zvcl9hdXRvbW90aXZlX3Nkdl90ZXN0cyksJChQUk9EVUNUX09VVCkvOi8pCisKK3Rlc3RzOiBhdXRvbW90aXZlLXNkdi10ZXN0cwpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9hdXRvcmVwcm8ubWsgYi9jb3JlL3Rhc2tzL2F1dG9yZXByby5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjgxZjliCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90YXNrcy9hdXRvcmVwcm8ubWsKQEAgLTAsMCArMSwzOSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaWZuZXEgKCQod2lsZGNhcmQgdGVzdC9zdHMvUkVBRE1FLWF1dG9yZXByby5tZCksKQordGVzdF9zdWl0ZV9uYW1lIDo9IGF1dG9yZXBybwordGVzdF9zdWl0ZV90cmFkZWZlZCA6PSBzdHMtdHJhZGVmZWQKK3Rlc3Rfc3VpdGVfcmVhZG1lIDo9IHRlc3Qvc3RzL1JFQURNRS1hdXRvcmVwcm8ubWQKK2F1dG9yZXByb196aXAgOj0gJChIT1NUX09VVCkvJCh0ZXN0X3N1aXRlX25hbWUpL2F1dG9yZXByby56aXAKKworaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvdGFza3MvdG9vbHMvY29tcGF0aWJpbGl0eS5taworCithdXRvcmVwcm9fcGx1Z2luX3NrZWwgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixFVEMsYXV0b3JlcHJvLXBsdWdpbi1za2VsLnppcCkvYXV0b3JlcHJvLXBsdWdpbi1za2VsLnppcAorCiskKGF1dG9yZXByb196aXApOiBBVVRPUkVQUk9fWklQIDo9ICQoY29tcGF0aWJpbGl0eV96aXApCiskKGF1dG9yZXByb196aXApOiBBVVRPUkVQUk9fUExVR0lOX1NLRUwgOj0gJChhdXRvcmVwcm9fcGx1Z2luX3NrZWwpCiskKGF1dG9yZXByb196aXApOiAkKE1FUkdFX1pJUFMpICQoWklQMlpJUCkgJChjb21wYXRpYmlsaXR5X3ppcCkgJChhdXRvcmVwcm9fcGx1Z2luX3NrZWwpCisJcm0gLWYgJEAgJChBVVRPUkVQUk9fWklQKV9maWx0ZXJlZAorCSQoWklQMlpJUCkgLWkgJChBVVRPUkVQUk9fWklQKSAtbyAkKEFVVE9SRVBST19aSVApX2ZpbHRlcmVkIFwKKwkJLXggYW5kcm9pZC1hdXRvcmVwcm8vdG9vbHMvc3RzLXRyYWRlZmVkLXRlc3RzLmphciBcCisJCSdhbmRyb2lkLWF1dG9yZXByby90b29scy8qOmF1dG9yZXByby9zcmMvbWFpbi9yZXNvdXJjZXMvc3RzLXRyYWRlZmVkLXRvb2xzLycKKwkkKE1FUkdFX1pJUFMpICRAICQoQVVUT1JFUFJPX1pJUClfZmlsdGVyZWQgJChBVVRPUkVQUk9fUExVR0lOX1NLRUwpCisJcm0gLWYgJChBVVRPUkVQUk9fWklQKV9maWx0ZXJlZAorCisuUEhPTlk6IGF1dG9yZXBybworYXV0b3JlcHJvOiAkKGF1dG9yZXByb196aXApCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGF1dG9yZXBybywgJChhdXRvcmVwcm9femlwKSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3Nka194ODZfNjQubWsgYi9jb3JlL3Rhc2tzL2JlcmJlcmlzX3Rlc3QubWsKc2ltaWxhcml0eSBpbmRleCA2MiUKY29weSBmcm9tIHRhcmdldC9wcm9kdWN0L3Nka194ODZfNjQubWsKY29weSB0byBjb3JlL3Rhc2tzL2JlcmJlcmlzX3Rlc3QubWsKaW5kZXggNWY2NTUzZS4uODYwNDcwOSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3g4Nl82NC5taworKysgYi9jb3JlL3Rhc2tzL2JlcmJlcmlzX3Rlc3QubWsKQEAgLTEsNSArMSw1IEBACiAjCi0jIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCw4ICsxNCwxMiBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotIyBEb24ndCBtb2RpZnkgdGhpcyBmaWxlIC0gSXQncyBqdXN0IGFuIGFsaWFzIQorQkVSQkVSSVNfRElSIDo9IGZyYW1ld29ya3MvbGlicy9iaW5hcnlfdHJhbnNsYXRpb24KIAotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9zZGtfcGhvbmVfeDg2XzY0Lm1rKQorIyBCZXJiZXJpcyBpbmNsdWRlcyBzb21lIGNvbXBvbmVudHMgd2hpY2ggbWF5IGNvbmZsaWN0IHdpdGggb3RoZXIgcGFja2FnZXMuCisjIE9ubHkgYnVpbGQgaXQgd2hlbiByZXF1ZXN0ZWQgZXhwbGljaXRseS4KK2lmZXEgKCQoQlVJTERfQkVSQkVSSVMpLHRydWUpCiAKLVBST0RVQ1RfTkFNRSA6PSBzZGtfeDg2XzY0CitpbmNsdWRlICQoQkVSQkVSSVNfRElSKS90ZXN0cy9ydW5faG9zdF90ZXN0cy5taworCitlbmRpZiAgIyBCVUlMRF9CRVJCRVJJUwpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9jaGVjay1hYmktZHVtcC1saXN0Lm1rIGIvY29yZS90YXNrcy9jaGVjay1hYmktZHVtcC1saXN0Lm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZDU0OWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rhc2tzL2NoZWNrLWFiaS1kdW1wLWxpc3QubWsKQEAgLTAsMCArMSwxMjMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDaGVjayB0aGUgZ2VuZXJhdGUgbGlzdCBhZ2FpbnN0IHRoZSBsYXRlc3QgbGlzdCBzdG9yZWQgaW4gdGhlCisjIHNvdXJjZSB0cmVlCisuUEhPTlk6IGNoZWNrLWFiaS1kdW1wLWxpc3QKKworIyBDaGVjayBpZiB2bmRrIGxpc3QgaXMgY2hhbmdlZAorZHJvaWRjb3JlOiBjaGVjay1hYmktZHVtcC1saXN0CisKK2NoZWNrLWFiaS1kdW1wLWxpc3QtdGltZXN0YW1wIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHZuZGspL2NoZWNrLWFiaS1kdW1wLWxpc3QtdGltZXN0YW1wCisKKyMgVGhlIEFCSSB0b29sIGRvZXMgbm90IHN1cHBvcnQgc2FuaXRpemVyIGFuZCBjb3ZlcmFnZSBidWlsZHMuCitpZmVxICgsJChmaWx0ZXIgdHJ1ZSwkKFNLSVBfQUJJX0NIRUNLUykgJChDTEFOR19DT1ZFUkFHRSkpKQoraWZlcSAoLCQoU0FOSVRJWkVfVEFSR0VUKSkKK2NoZWNrLWFiaS1kdW1wLWxpc3Q6ICQoY2hlY2stYWJpLWR1bXAtbGlzdC10aW1lc3RhbXApCitlbmRpZgorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEFCSSByZWZlcmVuY2UgZHVtcHMuCisKKyMgTFNEVU1QX1BBVEhTIGlzIGEgbGlzdCBvZiB0YWc6cGF0aC4gVGhleSBhcmUgd3JpdHRlbiB0byBMU0RVTVBfUEFUSFNfRklMRS4KK0xTRFVNUF9QQVRIU19GSUxFIDo9ICQoUFJPRFVDVF9PVVQpL2xzZHVtcF9wYXRocy50eHQKKworJChMU0RVTVBfUEFUSFNfRklMRSk6IFBSSVZBVEVfTFNEVU1QX1BBVEhTIDo9ICQoTFNEVU1QX1BBVEhTKQorJChMU0RVTVBfUEFUSFNfRklMRSk6CisJQGVjaG8gIkdlbmVyYXRlICRAIgorCUBybSAtcmYgJEAgJiYgZWNobyAtZSAiJChzdWJzdCA6LDokKHNwYWNlKSwkKHN1YnN0ICQoc3BhY2UpLFxuLCQoUFJJVkFURV9MU0RVTVBfUEFUSFMpKSkiID4gJEAKKworIyAkKDEpOiBBIGxpc3Qgb2YgdGFncy4KKyMgJCgyKTogQSBsaXN0IG9mIHRhZzpwYXRoLgorIyBSZXR1cm4gdGhlIGZpbGUgcGF0aHMgb2YgdGhlIEFCSSBkdW1wcyB0aGF0IG1hdGNoIHRoZSB0YWdzLgorZGVmaW5lIGZpbHRlci1hYmktZHVtcC1wYXRocworJChldmFsIHRhZ19wYXR0ZXJucyA6PSAkKGFkZHN1ZmZpeCA6JSwkKDEpKSkKKyQocGF0c3Vic3QgJCh0YWdfcGF0dGVybnMpLCUsJChmaWx0ZXIgJCh0YWdfcGF0dGVybnMpLCQoMikpKQorZW5kZWYKKworIyBTdWJzZXRzIG9mIExTRFVNUF9QQVRIUy4KKy5QSE9OWTogZmluZGxzZHVtcHNfQVBFWAorZmluZGxzZHVtcHNfQVBFWDogJChMU0RVTVBfUEFUSFNfRklMRSkgJChjYWxsIGZpbHRlci1hYmktZHVtcC1wYXRocyxBUEVYLCQoTFNEVU1QX1BBVEhTKSkKKworLlBIT05ZOiBmaW5kbHNkdW1wc19MTE5ESworZmluZGxzZHVtcHNfTExOREs6ICQoTFNEVU1QX1BBVEhTX0ZJTEUpICQoY2FsbCBmaWx0ZXItYWJpLWR1bXAtcGF0aHMsTExOREssJChMU0RVTVBfUEFUSFMpKQorCisuUEhPTlk6IGZpbmRsc2R1bXBzX05ESworZmluZGxzZHVtcHNfTkRLOiAkKExTRFVNUF9QQVRIU19GSUxFKSAkKGNhbGwgZmlsdGVyLWFiaS1kdW1wLXBhdGhzLE5ESywkKExTRFVNUF9QQVRIUykpCisKKy5QSE9OWTogZmluZGxzZHVtcHNfUExBVEZPUk0KK2ZpbmRsc2R1bXBzX1BMQVRGT1JNOiAkKExTRFVNUF9QQVRIU19GSUxFKSAkKGNhbGwgZmlsdGVyLWFiaS1kdW1wLXBhdGhzLFBMQVRGT1JNLCQoTFNEVU1QX1BBVEhTKSkKKworLlBIT05ZOiBmaW5kbHNkdW1wcworZmluZGxzZHVtcHM6ICQoTFNEVU1QX1BBVEhTX0ZJTEUpICQoZm9yZWFjaCBwLCQoTFNEVU1QX1BBVEhTKSwkKGNhbGwgd29yZC1jb2xvbiwyLCQocCkpKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ2hlY2sgdGhhdCBhbGwgQUJJIHJlZmVyZW5jZSBkdW1wcyBoYXZlIGNvcnJlc3BvbmRpbmcKKyMgQVBFWC9MTE5ESy9QTEFURk9STSBsaWJyYXJpZXMuCisKKyMgJCgxKTogVGhlIGRpcmVjdG9yeSBjb250YWluaW5nIEFCSSBkdW1wcy4KKyMgUmV0dXJuIGEgbGlzdCBvZiBBQkkgZHVtcCBwYXRocyBlbmRpbmcgd2l0aCAuc28ubHNkdW1wLgorZGVmaW5lIGZpbmQtYWJpLWR1bXAtcGF0aHMKKyQoaWYgJCh3aWxkY2FyZCAkKDEpKSwgXAorICAkKGFkZHByZWZpeCAkKDEpLywgXAorICAgICQoY2FsbCBmaW5kLWZpbGVzLWluLXN1YmRpcnMsJCgxKSwiKi5zby5sc2R1bXAiIC1hbmQgLXR5cGUgZiwuKSkpCitlbmRlZgorCisjICQoMSk6IEEgbGlzdCBvZiB0YWdzLgorIyAkKDIpOiBBIGxpc3Qgb2YgdGFnOnBhdGguCisjIFJldHVybiB0aGUgZmlsZSBuYW1lcyBvZiB0aGUgQUJJIGR1bXBzIHRoYXQgbWF0Y2ggdGhlIHRhZ3MsIGFuZCByZXBsYWNlIHRoZQorIyBmaWxlIG5hbWUgZXh0ZW5zaW9ucyB3aXRoIC5zby5sc2R1bXAuCitkZWZpbmUgZmlsdGVyLWFiaS1kdW1wLW5hbWVzCiskKHBhdHN1YnN0ICUuc28ubGxuZGsubHNkdW1wLCUuc28ubHNkdW1wLCBcCisgICQocGF0c3Vic3QgJS5zby5hcGV4LmxzZHVtcCwlLnNvLmxzZHVtcCwgXAorICAgICQobm90ZGlyICQoY2FsbCBmaWx0ZXItYWJpLWR1bXAtcGF0aHMsJCgxKSwkKDIpKSkpKQorZW5kZWYKKworVk5ES19BQklfRFVNUF9ESVIgOj0gcHJlYnVpbHRzL2FiaS1kdW1wcy92bmRrLyQoUkVMRUFTRV9CT0FSRF9BUElfTEVWRUwpCitpZmVxIChSRUwsJChQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FKSkKKyAgICBQTEFURk9STV9BQklfRFVNUF9ESVIgOj0gcHJlYnVpbHRzL2FiaS1kdW1wcy9wbGF0Zm9ybS8kKFBMQVRGT1JNX1NES19WRVJTSU9OKQorZWxzZQorICAgIFBMQVRGT1JNX0FCSV9EVU1QX0RJUiA6PSBwcmVidWlsdHMvYWJpLWR1bXBzL3BsYXRmb3JtL2N1cnJlbnQKK2VuZGlmCitWTkRLX0FCSV9EVU1QUyA6PSAkKGNhbGwgZmluZC1hYmktZHVtcC1wYXRocywkKFZOREtfQUJJX0RVTVBfRElSKSkKK1BMQVRGT1JNX0FCSV9EVU1QUyA6PSAkKGNhbGwgZmluZC1hYmktZHVtcC1wYXRocywkKFBMQVRGT1JNX0FCSV9EVU1QX0RJUikpCisKKyMgQ2hlY2sgZm9yIHN1cGVyZmx1b3VzIGxzZHVtcCBmaWxlcy4gU2luY2UgTFNEVU1QX1BBVEhTIG9ubHkgY292ZXJzIHRoZQorIyBsaWJyYXJpZXMgdGhhdCBjYW4gYmUgYnVpbHQgZnJvbSBzb3VyY2UgaW4gdGhlIGN1cnJlbnQgYnVpbGQsIGFuZCBwcmVidWlsdHMgb2YKKyMgTWFpbmxpbmUgbW9kdWxlcyBtYXkgYmUgaW4gdXNlLCB3ZSBhbHNvIGFsbG93IHRoZSBsaWJzIGluIFNUVUJfTElCUkFSSUVTIGZvcgorIyBwbGF0Zm9ybSBBQklzLgorIyBJbiBhZGRpdGlvbiwgbGliUlMgaXMgYWxsb3dlZCBiZWNhdXNlIGl0J3MgZGlzYWJsZWQgZm9yIFJJU0MtVi4KKworJChjaGVjay1hYmktZHVtcC1saXN0LXRpbWVzdGFtcCk6IFBSSVZBVEVfTFNEVU1QX1BBVEhTIDo9ICQoTFNEVU1QX1BBVEhTKQorJChjaGVjay1hYmktZHVtcC1saXN0LXRpbWVzdGFtcCk6IFBSSVZBVEVfU1RVQl9MSUJSQVJJRVMgOj0gJChTVFVCX0xJQlJBUklFUykKKyQoY2hlY2stYWJpLWR1bXAtbGlzdC10aW1lc3RhbXApOgorCSQoZXZhbCBhZGRlZF92bmRrX2FiaV9kdW1wcyA6PSAkKHN0cmlwICQoc29ydCAkKGZpbHRlci1vdXQgXAorCSAgJChjYWxsIGZpbHRlci1hYmktZHVtcC1uYW1lcyxMTE5ESywkKFBSSVZBVEVfTFNEVU1QX1BBVEhTKSkgbGliUlMuc28ubHNkdW1wLCBcCisJICAkKG5vdGRpciAkKFZOREtfQUJJX0RVTVBTKSkpKSkpCisJJChpZiAkKGFkZGVkX3ZuZGtfYWJpX2R1bXBzKSwgXAorCSAgZWNobyAtZSAiRm91bmQgdW5leHBlY3RlZCBBQkkgcmVmZXJlbmNlIGR1bXAgZmlsZXMgdW5kZXIgJChWTkRLX0FCSV9EVU1QX0RJUikuIEl0IGlzIGNhdXNlZCBieSBtaXNtYXRjaCBiZXR3ZWVuIEFuZHJvaWQuYnAgYW5kIHRoZSBkdW1wIGZpbGVzLiBSdW4gXGBmaW5kIFwkJHtBTkRST0lEX0JVSUxEX1RPUH0vJChWTkRLX0FCSV9EVU1QX0RJUikgJygnIC1uYW1lICQoc3Vic3QgJChzcGFjZSksIC1vciAtbmFtZSAsJChhZGRlZF92bmRrX2FiaV9kdW1wcykpICcpJyAtZGVsZXRlXGAgdG8gZGVsZXRlIHRoZSBkdW1wIGZpbGVzLiIpCisKKwkjIFRPRE8oYi8zMTQwMTA3NjQpOiBSZW1vdmUgTExOREsgdGFnIGFmdGVyIFBMQVRGT1JNX1NES19WRVJTSU9OIGlzIHVwZ3JhZGVkIHRvIDM1LgorCSQoZXZhbCBhZGRlZF9wbGF0Zm9ybV9hYmlfZHVtcHMgOj0gJChzdHJpcCAkKHNvcnQgJChmaWx0ZXItb3V0IFwKKwkgICQoY2FsbCBmaWx0ZXItYWJpLWR1bXAtbmFtZXMsQVBFWCBMTE5ESyBQTEFURk9STSwkKFBSSVZBVEVfTFNEVU1QX1BBVEhTKSkgXAorCSAgJChhZGRzdWZmaXggLmxzZHVtcCwkKFBSSVZBVEVfU1RVQl9MSUJSQVJJRVMpKSBsaWJSUy5zby5sc2R1bXAsIFwKKwkgICQobm90ZGlyICQoUExBVEZPUk1fQUJJX0RVTVBTKSkpKSkpCisJJChpZiAkKGFkZGVkX3BsYXRmb3JtX2FiaV9kdW1wcyksIFwKKwkgIGVjaG8gLWUgIkZvdW5kIHVuZXhwZWN0ZWQgQUJJIHJlZmVyZW5jZSBkdW1wIGZpbGVzIHVuZGVyICQoUExBVEZPUk1fQUJJX0RVTVBfRElSKS4gSXQgaXMgY2F1c2VkIGJ5IG1pc21hdGNoIGJldHdlZW4gQW5kcm9pZC5icCBhbmQgdGhlIGR1bXAgZmlsZXMuIFJ1biBcYGZpbmQgXCQke0FORFJPSURfQlVJTERfVE9QfS8kKFBMQVRGT1JNX0FCSV9EVU1QX0RJUikgJygnIC1uYW1lICQoc3Vic3QgJChzcGFjZSksIC1vciAtbmFtZSAsJChhZGRlZF9wbGF0Zm9ybV9hYmlfZHVtcHMpKSAnKScgLWRlbGV0ZVxgIHRvIGRlbGV0ZSB0aGUgZHVtcCBmaWxlcy4iKQorCisJJChpZiAkKGFkZGVkX3ZuZGtfYWJpX2R1bXBzKSQoYWRkZWRfcGxhdGZvcm1fYWJpX2R1bXBzKSxleGl0IDEpCisJJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkKKwkkKGhpZGUpIHRvdWNoICRACmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL2NvbGxlY3RfZ3BsX3NvdXJjZXMubWsgYi9jb3JlL3Rhc2tzL2NvbGxlY3RfZ3BsX3NvdXJjZXMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllOWFiOGUuLjAwMDAwMDAKLS0tIGEvY29yZS90YXNrcy9jb2xsZWN0X2dwbF9zb3VyY2VzLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBUaGUgcnVsZSBiZWxvdyBkb2Vzbid0IGhhdmUgZGVwZW5kZW5pY2VzIG9uIHRoZSBmaWxlcyB0aGF0IGl0IGNvcGllcywKLSMgc28gbWFudWFsbHkgZ2VuZXJhdGUgaW50byBhIFBBQ0tBR0lORyBpbnRlcm1lZGlhdGUgZGlyLCB3aGljaCBpcyB3aXBlZAotIyBpbiBpbnN0YWxsY2xlYW4gYmV0d2VlbiBpbmNyZW1lbnRhbCBidWlsZHMgb24gYnVpbGQgc2VydmVycy4KLWdwbF9zb3VyY2VfdGd6IDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLGdwbF9zb3VyY2UpL2dwbF9zb3VyY2UudGd6Ci0KLUFMTF9HUExfTU9EVUxFX0xJQ0VOU0VfRklMRVMgOj0gJChzb3J0ICQoQUxMX0dQTF9NT0RVTEVfTElDRU5TRV9GSUxFUykpCi0KLSMgRk9SQ0Ugc2luY2Ugd2UgY2FuJ3Qga25vdyB3aGV0aGVyIGFueSBvZiB0aGUgc291cmNlcyBjaGFuZ2VkCi0kKGdwbF9zb3VyY2VfdGd6KTogUFJJVkFURV9QQVRIUyA6PSAkKHNvcnQgJChwYXRzdWJzdCAlLywgJSwgJChkaXIgJChBTExfR1BMX01PRFVMRV9MSUNFTlNFX0ZJTEVTKSkpKQotJChncGxfc291cmNlX3RneikgOiAkKEFMTF9HUExfTU9EVUxFX0xJQ0VOU0VfRklMRVMpCi0JQGVjaG8gUGFja2FnZSBHUEwgc291cmNlczogJEAKLQkkKGhpZGUpIHRhciBjZnogJEAgLS1leGNsdWRlICIuZ2l0KiIgJChQUklWQVRFX1BBVEhTKQotCi0jIERpc3QgdGhlIHRneiBvbmx5IGlmIHdlIGFyZSBkb2luZyBhIGZ1bGwgYnVpbGQKLSQoY2FsbCBkaXN0LWZvci1nb2Fscyxkcm9pZGNvcmUtdW5idW5kbGVkLCQoZ3BsX3NvdXJjZV90Z3opKQpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9jdHMtaW50ZXJhY3RpdmUubWsgYi9jb3JlL3Rhc2tzL2N0cy1pbnRlcmFjdGl2ZS5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTQ1OTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS90YXNrcy9jdHMtaW50ZXJhY3RpdmUubWsKQEAgLTAsMCArMSwyOSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBjdHMtaW50ZXJhY3RpdmUgaW5jbHVkZXMgaW50ZXJhY3RpdmUgYW5kIG11bHRpLWRldmljZSBDVFMgdGVzdHMgdGhhdAorIyBjYW5ub3QgYmUgYXV0b21hdGVkLiBJdCBpcyBwYXJ0IG9mIENUUyBWZXJpZmllci4KK2lmbmVxICgkKHdpbGRjYXJkIGN0cy90b29scy9jdHMtaW50ZXJhY3RpdmUvUkVBRE1FKSwpCit0ZXN0X3N1aXRlX25hbWUgOj0gY3RzLWludGVyYWN0aXZlCit0ZXN0X3N1aXRlX3RyYWRlZmVkIDo9IGN0cy1pbnRlcmFjdGl2ZS10cmFkZWZlZAordGVzdF9zdWl0ZV9yZWFkbWUgOj0gY3RzL3Rvb2xzL2N0cy1pbnRlcmFjdGl2ZS9SRUFETUUKK3Rlc3Rfc3VpdGVfdG9vbHMgOj0gJChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvYXRzX2NvbnNvbGVfZGVwbG95LmphciBcCisgICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL2F0c19vbGNfc2VydmVyX2xvY2FsX21vZGVfZGVwbG95LmphcgorCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS90YXNrcy90b29scy9jb21wYXRpYmlsaXR5Lm1rCisKKy5QSE9OWTogY3RzLWludGVyYWN0aXZlCitjdHMtaW50ZXJhY3RpdmU6ICQoY29tcGF0aWJpbGl0eV96aXApICQoY29tcGF0aWJpbGl0eV90ZXN0c19saXN0X3ppcCkKKyQoY2FsbCBkaXN0LWZvci1nb2FscywgY3RzLWludGVyYWN0aXZlLCAkKGNvbXBhdGliaWxpdHlfemlwKSAkKGNvbXBhdGliaWxpdHlfdGVzdHNfbGlzdF96aXApKQorZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvY3RzLm1rIGIvY29yZS90YXNrcy9jdHMubWsKaW5kZXggNjc0YWZiNS4uMDJhM2RlOCAxMDA2NDQKLS0tIGEvY29yZS90YXNrcy9jdHMubWsKKysrIGIvY29yZS90YXNrcy9jdHMubWsKQEAgLTM5LDE2ICszOSwxOCBAQAogICBjdHNfcGxhdGZvcm1fcmVsZWFzZV9wYXRoIDo9IGN0cy90ZXN0cy90ZXN0cy9vcy9hc3NldHMvcGxhdGZvcm1fcmVsZWFzZXMudHh0CiAgIGN0c19wbGF0Zm9ybV9yZWxlYXNlX3N0cmluZyA6PSAkKHNoZWxsIGNhdCAkKGN0c19wbGF0Zm9ybV9yZWxlYXNlX3BhdGgpKQogCi0gIGlmZXEgKCwkKGZpbmRzdHJpbmcgJChQTEFURk9STV9WRVJTSU9OKSwkKGN0c19wbGF0Zm9ybV92ZXJzaW9uX3N0cmluZykpKQotICAgIGRlZmluZSBlcnJvcl9tc2cKLSAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgQ291bGQgbm90IGZpbmQgdmVyc2lvbiAiJChQTEFURk9STV9WRVJTSU9OKSIgaW4gQ1RTIHBsYXRmb3JtIHZlcnNpb24gZmlsZToKLSAgICAgICQoY3RzX3BsYXRmb3JtX3ZlcnNpb25fcGF0aCkKLSAgICAgIE1vc3QgbGlrZWx5IFBMQVRGT1JNX1ZFUlNJT04gaW4gYnVpbGQvY29yZS92ZXJzaW9uX2RlZmF1bHRzLm1rCi0gICAgICBoYXMgY2hhbmdlZCBhbmQgYSBuZXcgdmVyc2lvbiBtdXN0IGJlIGFkZGVkIHRvIHRoaXMgQ1RTIGZpbGUuCi0gICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBlbmRlZgotICAgICQoZXJyb3IgJChlcnJvcl9tc2cpKQorICBpZm5lcSAoUkVMLCQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkpCisgICAgaWZlcSAoLCQoZmluZHN0cmluZyAkKFBMQVRGT1JNX1ZFUlNJT04pLCQoY3RzX3BsYXRmb3JtX3ZlcnNpb25fc3RyaW5nKSkpCisgICAgICBkZWZpbmUgZXJyb3JfbXNnCisgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBDb3VsZCBub3QgZmluZCB2ZXJzaW9uICIkKFBMQVRGT1JNX1ZFUlNJT04pIiBpbiBDVFMgcGxhdGZvcm0gdmVyc2lvbiBmaWxlOgorICAgICAgICAkKGN0c19wbGF0Zm9ybV92ZXJzaW9uX3BhdGgpCisgICAgICAgIE1vc3QgbGlrZWx5IFBMQVRGT1JNX1ZFUlNJT04gaW4gYnVpbGQvY29yZS92ZXJzaW9uX2RlZmF1bHRzLm1rCisgICAgICAgIGhhcyBjaGFuZ2VkIGFuZCBhIG5ldyB2ZXJzaW9uIG11c3QgYmUgYWRkZWQgdG8gdGhpcyBDVFMgZmlsZS4KKyAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBlbmRlZgorICAgICAgJChlcnJvciAkKGVycm9yX21zZykpCisgICAgZW5kaWYKICAgZW5kaWYKICAgaWZlcSAoLCQoZmluZHN0cmluZyAkKFBMQVRGT1JNX1ZFUlNJT05fTEFTVF9TVEFCTEUpLCQoY3RzX3BsYXRmb3JtX3JlbGVhc2Vfc3RyaW5nKSkpCiAgICAgZGVmaW5lIGVycm9yX21zZwpAQCAtNzYsMjIgKzc4LDYwIEBACiB2ZXJpZmllci1kaXIgOj0gJChjdHMtZGlyKS8kKHZlcmlmaWVyLWRpci1uYW1lKQogdmVyaWZpZXItemlwLW5hbWUgOj0gJCh2ZXJpZmllci1kaXItbmFtZSkuemlwCiB2ZXJpZmllci16aXAgOj0gJChjdHMtZGlyKS8kKHZlcmlmaWVyLXppcC1uYW1lKQorY3RzLWludGVyYWN0aXZlLXppcCA6PSAkKEhPU1RfT1VUKS9jdHMtaW50ZXJhY3RpdmUvYW5kcm9pZC1jdHMtaW50ZXJhY3RpdmUuemlwCiAKIGN0cyA6ICQodmVyaWZpZXItemlwKQoraWZlcSAoJCh3aWxkY2FyZCBjdHMvdG9vbHMvY3RzLWludGVyYWN0aXZlL1JFQURNRSksKQogJCh2ZXJpZmllci16aXApOiBQUklWQVRFX0RJUiA6PSAkKGN0cy1kaXIpCiAkKHZlcmlmaWVyLXppcCk6ICQoU09PTkdfQU5EUk9JRF9DVFNfVkVSSUZJRVJfWklQKQogCXJtIC1yZiAkKFBSSVZBVEVfRElSKQogCW1rZGlyIC1wICQoUFJJVkFURV9ESVIpCiAJdW56aXAgLXEgLWQgJChQUklWQVRFX0RJUikgJDwKIAkkKGNvcHktZmlsZS10by10YXJnZXQpCitlbHNlCiskKHZlcmlmaWVyLXppcCk6IFBSSVZBVEVfRElSIDo9ICQoY3RzLWRpcikKKyQodmVyaWZpZXItemlwKTogUFJJVkFURV92ZXJpZmllcl9kaXIgOj0gJCh2ZXJpZmllci1kaXIpCiskKHZlcmlmaWVyLXppcCk6IFBSSVZBVEVfaW50ZXJhY3RpdmVfemlwIDo9ICQoY3RzLWludGVyYWN0aXZlLXppcCkKKyQodmVyaWZpZXItemlwKTogJChTT09OR19BTkRST0lEX0NUU19WRVJJRklFUl9aSVApICQoY3RzLWludGVyYWN0aXZlLXppcCkgJChTT09OR19aSVApCisJcm0gLXJmICQoUFJJVkFURV9ESVIpCisJbWtkaXIgLXAgJChQUklWQVRFX0RJUikKKwl1bnppcCAtcSAtZCAkKFBSSVZBVEVfRElSKSAkPAorCXVuemlwIC1xIC1kICQoUFJJVkFURV92ZXJpZmllcl9kaXIpICQoUFJJVkFURV9pbnRlcmFjdGl2ZV96aXApCisJJChTT09OR19aSVApIC1kIC1vICRAIC1DICQoUFJJVkFURV9ESVIpIC1EICQoUFJJVkFURV92ZXJpZmllcl9kaXIpCitlbmRpZgorJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBjdHMsICQodmVyaWZpZXItemlwKSkKIAogIyBGb3IgcHJvZHVjaW5nIENUUyBjb3ZlcmFnZSByZXBvcnRzLgogIyBSdW4gIm1ha2UgY3RzLXRlc3QtY292ZXJhZ2UiIGluIHRoZSAkQU5EUk9JRF9CVUlMRF9UT1AgZGlyZWN0b3J5LgogCiBjdHNfYXBpX2NvdmVyYWdlX2V4ZSA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9jdHMtYXBpLWNvdmVyYWdlCiBkZXhkZXBzX2V4ZSA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9kZXhkZXBzCitjdHNfYXBpX21hcF9leGUgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvY3RzLWFwaS1tYXAKIAogY292ZXJhZ2Vfb3V0IDo9ICQoSE9TVF9PVVQpL2N0cy1hcGktY292ZXJhZ2UKK2FwaV9tYXBfb3V0IDo9ICQoSE9TVF9PVVQpL2N0cy1hcGktbWFwCisKK2N0c19qYXJfZmlsZXMgOj0gJChhcGlfbWFwX291dCkvY3RzX2phcl9maWxlcy50eHQKK2N0c19pbnRlcmFjdGl2ZV9qYXJfZmlsZXMgOj0gJChhcGlfbWFwX291dCkvY3RzX2ludGVyYWN0aXZlX2phcl9maWxlcy50eHQKK2N0c19hbGxfamFyX2ZpbGVzIDo9ICQoYXBpX21hcF9vdXQpL2N0c19hbGxfamFyX2ZpbGVzLnR4dAorCiskKGN0c19qYXJfZmlsZXMpOiBQUklWQVRFX0FQSV9NQVBfRklMRVMgOj0gJChzb3J0ICQoQ09NUEFUSUJJTElUWS5jdHMuQVBJX01BUF9GSUxFUykpCiskKGN0c19qYXJfZmlsZXMpOgorCW1rZGlyIC1wICQoZGlyICRAKQorCWVjaG8gJChQUklWQVRFX0FQSV9NQVBfRklMRVMpID4gJEAKKworJChjdHNfaW50ZXJhY3RpdmVfamFyX2ZpbGVzKTogUFJJVkFURV9BUElfTUFQX0ZJTEVTIDo9ICQoc29ydCAkKENPTVBBVElCSUxJVFkuY3RzLWludGVyYWN0aXZlLkFQSV9NQVBfRklMRVMpKQorJChjdHNfaW50ZXJhY3RpdmVfamFyX2ZpbGVzKTogJChTT09OR19BTkRST0lEX0NUU19WRVJJRklFUl9BUFBfTElTVCkKKwlta2RpciAtcCAkKGRpciAkQCkKKwljcCAkPCAkQAorCWVjaG8gJChQUklWQVRFX0FQSV9NQVBfRklMRVMpID4+ICRACisKKyQoY3RzX2FsbF9qYXJfZmlsZXMpOiBQUklWQVRFX0FQSV9NQVBfRklMRVMgOj0gJChzb3J0ICQoQ09NUEFUSUJJTElUWS5jdHMuQVBJX01BUF9GSUxFUykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChDT01QQVRJQklMSVRZLmN0cy1pbnRlcmFjdGl2ZS5BUElfTUFQX0ZJTEVTKSkKKyQoY3RzX2FsbF9qYXJfZmlsZXMpOiAkKFNPT05HX0FORFJPSURfQ1RTX1ZFUklGSUVSX0FQUF9MSVNUKQorCW1rZGlyIC1wICQoZGlyICRAKQorCWNwICQ8ICRACisJZWNobyAkKFBSSVZBVEVfQVBJX01BUF9GSUxFUykgPj4gJEAKIAogYXBpX3htbF9kZXNjcmlwdGlvbiA6PSAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL2FwaS54bWwKIApAQCAtMTE0LDYgKzE1NCwxNSBAQAogY3RzX2FwaV9jb3ZlcmFnZV9kZXBlbmRlbmNpZXMgOj0gJChjdHNfYXBpX2NvdmVyYWdlX2V4ZSkgJChkZXhkZXBzX2V4ZSkgJChhcGlfeG1sX2Rlc2NyaXB0aW9uKSAkKG5hcGlfeG1sX2Rlc2NyaXB0aW9uKQogY3RzX3N5c3RlbV9hcGlfY292ZXJhZ2VfZGVwZW5kZW5jaWVzIDo9ICQoY3RzX2FwaV9jb3ZlcmFnZV9leGUpICQoZGV4ZGVwc19leGUpICQoc3lzdGVtX2FwaV94bWxfZGVzY3JpcHRpb24pCiAKK2N0cy1zeXN0ZW0tYXBpLW1hcC14bWwtcmVwb3J0IDo9ICQoYXBpX21hcF9vdXQpL2N0cy1zeXN0ZW0tYXBpLW1hcC54bWwKK2N0cy1pbnRlcmFjdGl2ZS1zeXN0ZW0tYXBpLW1hcC14bWwtcmVwb3J0IDo9ICQoYXBpX21hcF9vdXQpL2N0cy1pbnRlcmFjdGl2ZS1zeXN0ZW0tYXBpLW1hcC54bWwKK2N0cy1jb21iaW5lZC1zeXN0ZW0tYXBpLW1hcC14bWwtcmVwb3J0IDo9ICQoYXBpX21hcF9vdXQpL2N0cy1jb21iaW5lZC1zeXN0ZW0tYXBpLW1hcC54bWwKK2N0cy1jb21iaW5lZC1zeXN0ZW0tYXBpLW1hcC1odG1sLXJlcG9ydCA6PSAkKGFwaV9tYXBfb3V0KS9jdHMtY29tYmluZWQtc3lzdGVtLWFwaS1tYXAuaHRtbAorCitjdHNfc3lzdGVtX2FwaV9tYXBfZGVwZW5kZW5jaWVzIDo9ICQoY3RzX2FwaV9tYXBfZXhlKSAkKHN5c3RlbV9hcGlfeG1sX2Rlc2NyaXB0aW9uKSAkKGN0c19qYXJfZmlsZXMpCitjdHNfaW50ZXJhY3RpdmVfc3lzdGVtX2FwaV9tYXBfZGVwZW5kZW5jaWVzIDo9ICQoY3RzX2FwaV9tYXBfZXhlKSAkKHN5c3RlbV9hcGlfeG1sX2Rlc2NyaXB0aW9uKSAkKGN0c19pbnRlcmFjdGl2ZV9qYXJfZmlsZXMpCitjdHNfY29tYmluZWRfc3lzdGVtX2FwaV9tYXBfZGVwZW5kZW5jaWVzIDo9ICQoY3RzX2FwaV9tYXBfZXhlKSAkKHN5c3RlbV9hcGlfeG1sX2Rlc2NyaXB0aW9uKSAkKGN0c19hbGxfamFyX2ZpbGVzKQorCiBhbmRyb2lkX2N0c196aXAgOj0gJChIT1NUX09VVCkvY3RzL2FuZHJvaWQtY3RzLnppcAogY3RzX3ZlcmlmaWVyX2FwayA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEFQUFMsQ3RzVmVyaWZpZXIpL3BhY2thZ2UuYXBrCiAKQEAgLTE0NCwzMCArMTkzLDMwIEBACiAJJChjYWxsIGdlbmVyYXRlLWNvdmVyYWdlLXJlcG9ydC1jdHMsIkNUUyBTeXN0ZW0gQVBJIENvdmVyYWdlIFJlcG9ydCAtIFhNTCIsXAogCQkJJChQUklWQVRFX1RFU1RfQ0FTRVMpLHhtbCkKIAotJChjdHMtdmVyaWZpZXItY292ZXJhZ2UtcmVwb3J0KTogUFJJVkFURV9URVNUX0NBU0VTIDo9ICQoY3RzX3ZlcmlmaWVyX2FwaykKKyQoY3RzLXZlcmlmaWVyLWNvdmVyYWdlLXJlcG9ydCk6IFBSSVZBVEVfVEVTVF9DQVNFUyA6PSAkKGZvcmVhY2ggYywgJChjdHNfdmVyaWZpZXJfYXBrKSAkKHZlcmlmaWVyLWRpciksICQoYykpCiAkKGN0cy12ZXJpZmllci1jb3ZlcmFnZS1yZXBvcnQpOiBQUklWQVRFX0NUU19BUElfQ09WRVJBR0VfRVhFIDo9ICQoY3RzX2FwaV9jb3ZlcmFnZV9leGUpCiAkKGN0cy12ZXJpZmllci1jb3ZlcmFnZS1yZXBvcnQpOiBQUklWQVRFX0RFWERFUFNfRVhFIDo9ICQoZGV4ZGVwc19leGUpCiAkKGN0cy12ZXJpZmllci1jb3ZlcmFnZS1yZXBvcnQpOiBQUklWQVRFX0FQSV9YTUxfREVTQyA6PSAkKGFwaV94bWxfZGVzY3JpcHRpb24pCiAkKGN0cy12ZXJpZmllci1jb3ZlcmFnZS1yZXBvcnQpOiBQUklWQVRFX05BUElfWE1MX0RFU0MgOj0gJChuYXBpX3htbF9kZXNjcmlwdGlvbikKLSQoY3RzLXZlcmlmaWVyLWNvdmVyYWdlLXJlcG9ydCkgOiAkKGN0c192ZXJpZmllcl9hcGspICQoY3RzX2FwaV9jb3ZlcmFnZV9kZXBlbmRlbmNpZXMpIHwgJChBQ1ApCiskKGN0cy12ZXJpZmllci1jb3ZlcmFnZS1yZXBvcnQpIDogJChjdHNfdmVyaWZpZXJfYXBrKSAkKHZlcmlmaWVyLXppcCkgJChjdHNfYXBpX2NvdmVyYWdlX2RlcGVuZGVuY2llcykgfCAkKEFDUCkKIAkkKGNhbGwgZ2VuZXJhdGUtY292ZXJhZ2UtcmVwb3J0LWN0cywiQ1RTIFZlcmlmaWVyIEFQSSBDb3ZlcmFnZSBSZXBvcnQiLFwKIAkJCSQoUFJJVkFURV9URVNUX0NBU0VTKSxodG1sKQogCi0kKGN0cy1jb21iaW5lZC1jb3ZlcmFnZS1yZXBvcnQpOiBQUklWQVRFX1RFU1RfQ0FTRVMgOj0gJChmb3JlYWNoIGMsICQoY3RzX3ZlcmlmaWVyX2FwaykgJChDT01QQVRJQklMSVRZX1RFU1RDQVNFU19PVVRfY3RzKSwgJChjKSkKKyQoY3RzLWNvbWJpbmVkLWNvdmVyYWdlLXJlcG9ydCk6IFBSSVZBVEVfVEVTVF9DQVNFUyA6PSAkKGZvcmVhY2ggYywgJChjdHNfdmVyaWZpZXJfYXBrKSAkKENPTVBBVElCSUxJVFlfVEVTVENBU0VTX09VVF9jdHMpICQodmVyaWZpZXItZGlyKSwgJChjKSkKICQoY3RzLWNvbWJpbmVkLWNvdmVyYWdlLXJlcG9ydCk6IFBSSVZBVEVfQ1RTX0FQSV9DT1ZFUkFHRV9FWEUgOj0gJChjdHNfYXBpX2NvdmVyYWdlX2V4ZSkKICQoY3RzLWNvbWJpbmVkLWNvdmVyYWdlLXJlcG9ydCk6IFBSSVZBVEVfREVYREVQU19FWEUgOj0gJChkZXhkZXBzX2V4ZSkKICQoY3RzLWNvbWJpbmVkLWNvdmVyYWdlLXJlcG9ydCk6IFBSSVZBVEVfQVBJX1hNTF9ERVNDIDo9ICQoYXBpX3htbF9kZXNjcmlwdGlvbikKICQoY3RzLWNvbWJpbmVkLWNvdmVyYWdlLXJlcG9ydCk6IFBSSVZBVEVfTkFQSV9YTUxfREVTQyA6PSAkKG5hcGlfeG1sX2Rlc2NyaXB0aW9uKQotJChjdHMtY29tYmluZWQtY292ZXJhZ2UtcmVwb3J0KSA6ICQoYW5kcm9pZF9jdHNfemlwKSAkKGN0c192ZXJpZmllcl9hcGspICQoY3RzX2FwaV9jb3ZlcmFnZV9kZXBlbmRlbmNpZXMpIHwgJChBQ1ApCiskKGN0cy1jb21iaW5lZC1jb3ZlcmFnZS1yZXBvcnQpIDogJChhbmRyb2lkX2N0c196aXApICQoY3RzX3ZlcmlmaWVyX2FwaykgJCh2ZXJpZmllci16aXApICQoY3RzX2FwaV9jb3ZlcmFnZV9kZXBlbmRlbmNpZXMpIHwgJChBQ1ApCiAJJChjYWxsIGdlbmVyYXRlLWNvdmVyYWdlLXJlcG9ydC1jdHMsIkNUUyBDb21iaW5lZCBBUEkgQ292ZXJhZ2UgUmVwb3J0IixcCiAJCQkkKFBSSVZBVEVfVEVTVF9DQVNFUyksaHRtbCkKIAotJChjdHMtY29tYmluZWQteG1sLWNvdmVyYWdlLXJlcG9ydCk6IFBSSVZBVEVfVEVTVF9DQVNFUyA6PSAkKGZvcmVhY2ggYywgJChjdHNfdmVyaWZpZXJfYXBrKSAkKENPTVBBVElCSUxJVFlfVEVTVENBU0VTX09VVF9jdHMpLCAkKGMpKQorJChjdHMtY29tYmluZWQteG1sLWNvdmVyYWdlLXJlcG9ydCk6IFBSSVZBVEVfVEVTVF9DQVNFUyA6PSAkKGZvcmVhY2ggYywgJChjdHNfdmVyaWZpZXJfYXBrKSAkKENPTVBBVElCSUxJVFlfVEVTVENBU0VTX09VVF9jdHMpICQodmVyaWZpZXItZGlyKSwgJChjKSkKICQoY3RzLWNvbWJpbmVkLXhtbC1jb3ZlcmFnZS1yZXBvcnQpOiBQUklWQVRFX0NUU19BUElfQ09WRVJBR0VfRVhFIDo9ICQoY3RzX2FwaV9jb3ZlcmFnZV9leGUpCiAkKGN0cy1jb21iaW5lZC14bWwtY292ZXJhZ2UtcmVwb3J0KTogUFJJVkFURV9ERVhERVBTX0VYRSA6PSAkKGRleGRlcHNfZXhlKQogJChjdHMtY29tYmluZWQteG1sLWNvdmVyYWdlLXJlcG9ydCk6IFBSSVZBVEVfQVBJX1hNTF9ERVNDIDo9ICQoYXBpX3htbF9kZXNjcmlwdGlvbikKICQoY3RzLWNvbWJpbmVkLXhtbC1jb3ZlcmFnZS1yZXBvcnQpOiBQUklWQVRFX05BUElfWE1MX0RFU0MgOj0gJChuYXBpX3htbF9kZXNjcmlwdGlvbikKLSQoY3RzLWNvbWJpbmVkLXhtbC1jb3ZlcmFnZS1yZXBvcnQpIDogJChhbmRyb2lkX2N0c196aXApICQoY3RzX3ZlcmlmaWVyX2FwaykgJChjdHNfYXBpX2NvdmVyYWdlX2RlcGVuZGVuY2llcykgfCAkKEFDUCkKKyQoY3RzLWNvbWJpbmVkLXhtbC1jb3ZlcmFnZS1yZXBvcnQpIDogJChhbmRyb2lkX2N0c196aXApICQoY3RzX3ZlcmlmaWVyX2FwaykgJCh2ZXJpZmllci16aXApICQoY3RzX2FwaV9jb3ZlcmFnZV9kZXBlbmRlbmNpZXMpIHwgJChBQ1ApCiAJJChjYWxsIGdlbmVyYXRlLWNvdmVyYWdlLXJlcG9ydC1jdHMsIkNUUyBDb21iaW5lZCBBUEkgQ292ZXJhZ2UgUmVwb3J0IC0gWE1MIixcCiAJCQkkKFBSSVZBVEVfVEVTVF9DQVNFUykseG1sKQogCkBAIC0xOTIsNiArMjQxLDQ1IEBACiAuUEhPTlk6IGN0cy1jb3ZlcmFnZS1yZXBvcnQtYWxsIGN0cy1hcGktY292ZXJhZ2UKIGN0cy1jb3ZlcmFnZS1yZXBvcnQtYWxsOiBjdHMtdGVzdC1jb3ZlcmFnZSBjdHMtdmVyaWZpZXItY292ZXJhZ2UgY3RzLWNvbWJpbmVkLWNvdmVyYWdlIGN0cy1jb21iaW5lZC14bWwtY292ZXJhZ2UKIAorJChjdHMtc3lzdGVtLWFwaS1tYXAteG1sLXJlcG9ydCk6IFBSSVZBVEVfQ1RTX0FQSV9NQVBfRVhFIDo9ICQoY3RzX2FwaV9tYXBfZXhlKQorJChjdHMtc3lzdGVtLWFwaS1tYXAteG1sLXJlcG9ydCk6IFBSSVZBVEVfQVBJX1hNTF9ERVNDIDo9ICQoc3lzdGVtX2FwaV94bWxfZGVzY3JpcHRpb24pCiskKGN0cy1zeXN0ZW0tYXBpLW1hcC14bWwtcmVwb3J0KTogUFJJVkFURV9KQVJfRklMRVMgOj0gJChjdHNfamFyX2ZpbGVzKQorJChjdHMtc3lzdGVtLWFwaS1tYXAteG1sLXJlcG9ydCkgOiAkKGFuZHJvaWRfY3RzX3ppcCkgJChjdHNfc3lzdGVtX2FwaV9tYXBfZGVwZW5kZW5jaWVzKSB8ICQoQUNQKQorCSQoY2FsbCBnZW5lcmF0ZS1hcGktbWFwLXJlcG9ydC1jdHMsIkNUUyBTeXN0ZW0gQVBJIE1BUCBSZXBvcnQgLSBYTUwiLFwKKwkJCSQoUFJJVkFURV9KQVJfRklMRVMpLHhtbCkKKworJChjdHMtaW50ZXJhY3RpdmUtc3lzdGVtLWFwaS1tYXAteG1sLXJlcG9ydCk6IFBSSVZBVEVfQ1RTX0FQSV9NQVBfRVhFIDo9ICQoY3RzX2FwaV9tYXBfZXhlKQorJChjdHMtaW50ZXJhY3RpdmUtc3lzdGVtLWFwaS1tYXAteG1sLXJlcG9ydCk6IFBSSVZBVEVfQVBJX1hNTF9ERVNDIDo9ICQoc3lzdGVtX2FwaV94bWxfZGVzY3JpcHRpb24pCiskKGN0cy1pbnRlcmFjdGl2ZS1zeXN0ZW0tYXBpLW1hcC14bWwtcmVwb3J0KTogUFJJVkFURV9KQVJfRklMRVMgOj0gJChjdHNfaW50ZXJhY3RpdmVfamFyX2ZpbGVzKQorJChjdHMtaW50ZXJhY3RpdmUtc3lzdGVtLWFwaS1tYXAteG1sLXJlcG9ydCkgOiAkKHZlcmlmaWVyX3ppcCkgJChjdHNfaW50ZXJhY3RpdmVfc3lzdGVtX2FwaV9tYXBfZGVwZW5kZW5jaWVzKSB8ICQoQUNQKQorCSQoY2FsbCBnZW5lcmF0ZS1hcGktbWFwLXJlcG9ydC1jdHMsIkNUUyBJbnRlcmFjdGl2ZSBTeXN0ZW0gQVBJIE1BUCBSZXBvcnQgLSBYTUwiLFwKKwkJCSQoUFJJVkFURV9KQVJfRklMRVMpLHhtbCkKKworJChjdHMtY29tYmluZWQtc3lzdGVtLWFwaS1tYXAteG1sLXJlcG9ydCk6IFBSSVZBVEVfQ1RTX0FQSV9NQVBfRVhFIDo9ICQoY3RzX2FwaV9tYXBfZXhlKQorJChjdHMtY29tYmluZWQtc3lzdGVtLWFwaS1tYXAteG1sLXJlcG9ydCk6IFBSSVZBVEVfQVBJX1hNTF9ERVNDIDo9ICQoc3lzdGVtX2FwaV94bWxfZGVzY3JpcHRpb24pCiskKGN0cy1jb21iaW5lZC1zeXN0ZW0tYXBpLW1hcC14bWwtcmVwb3J0KTogUFJJVkFURV9KQVJfRklMRVMgOj0gJChjdHNfYWxsX2phcl9maWxlcykKKyQoY3RzLWNvbWJpbmVkLXN5c3RlbS1hcGktbWFwLXhtbC1yZXBvcnQpIDogJCh2ZXJpZmllcl96aXApICQoYW5kcm9pZF9jdHNfemlwKSAkKGN0c19jb21iaW5lZF9zeXN0ZW1fYXBpX21hcF9kZXBlbmRlbmNpZXMpIHwgJChBQ1ApCisJJChjYWxsIGdlbmVyYXRlLWFwaS1tYXAtcmVwb3J0LWN0cywiQ1RTIENvbWJpbmVkIFN5c3RlbSBBUEkgTUFQIFJlcG9ydCAtIFhNTCIsXAorCQkJJChQUklWQVRFX0pBUl9GSUxFUykseG1sKQorCiskKGN0cy1jb21iaW5lZC1zeXN0ZW0tYXBpLW1hcC1odG1sLXJlcG9ydCk6IFBSSVZBVEVfQ1RTX0FQSV9NQVBfRVhFIDo9ICQoY3RzX2FwaV9tYXBfZXhlKQorJChjdHMtY29tYmluZWQtc3lzdGVtLWFwaS1tYXAtaHRtbC1yZXBvcnQpOiBQUklWQVRFX0FQSV9YTUxfREVTQyA6PSAkKHN5c3RlbV9hcGlfeG1sX2Rlc2NyaXB0aW9uKQorJChjdHMtY29tYmluZWQtc3lzdGVtLWFwaS1tYXAtaHRtbC1yZXBvcnQpOiBQUklWQVRFX0pBUl9GSUxFUyA6PSAkKGN0c19hbGxfamFyX2ZpbGVzKQorJChjdHMtY29tYmluZWQtc3lzdGVtLWFwaS1tYXAtaHRtbC1yZXBvcnQpIDogJCh2ZXJpZmllcl96aXApICQoYW5kcm9pZF9jdHNfemlwKSAkKGN0c19jb21iaW5lZF9zeXN0ZW1fYXBpX21hcF9kZXBlbmRlbmNpZXMpIHwgJChBQ1ApCisJJChjYWxsIGdlbmVyYXRlLWFwaS1tYXAtcmVwb3J0LWN0cywiQ1RTIENvbWJpbmVkIFN5c3RlbSBBUEkgTUFQIFJlcG9ydCAtIEhUTUwiLFwKKwkJCSQoUFJJVkFURV9KQVJfRklMRVMpLGh0bWwpCisKKy5QSE9OWTogY3RzLXN5c3RlbS1hcGktbWFwLXhtbAorY3RzLXN5c3RlbS1hcGktbWFwLXhtbCA6ICQoY3RzLXN5c3RlbS1hcGktbWFwLXhtbC1yZXBvcnQpCisKKy5QSE9OWTogY3RzLWludGVyYWN0aXZlLXN5c3RlbS1hcGktbWFwLXhtbAorY3RzLWludGVyYWN0aXZlLXN5c3RlbS1hcGktbWFwLXhtbDogJChjdHMtaW50ZXJhY3RpdmUtc3lzdGVtLWFwaS1tYXAteG1sLXJlcG9ydCkKKworLlBIT05ZOiBjdHMtY29tYmluZWQtc3lzdGVtLWFwaS1tYXAteG1sCitjdHMtY29tYmluZWQtc3lzdGVtLWFwaS1tYXAteG1sIDogJChjdHMtY29tYmluZWQtc3lzdGVtLWFwaS1tYXAteG1sLXJlcG9ydCkKKworLlBIT05ZOiBjdHMtYXBpLW1hcC1hbGwKKwogIyBQdXQgdGhlIHRlc3QgY292ZXJhZ2UgcmVwb3J0IGluIHRoZSBkaXN0IGRpciBpZiAiY3RzLWFwaS1jb3ZlcmFnZSIgaXMgYW1vbmcgdGhlIGJ1aWxkIGdvYWxzLgogJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBjdHMtYXBpLWNvdmVyYWdlLCAkKGN0cy10ZXN0LWNvdmVyYWdlLXJlcG9ydCk6Y3RzLXRlc3QtY292ZXJhZ2UtcmVwb3J0Lmh0bWwpCiAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGN0cy1hcGktY292ZXJhZ2UsICQoY3RzLXN5c3RlbS1hcGktY292ZXJhZ2UtcmVwb3J0KTpjdHMtc3lzdGVtLWFwaS1jb3ZlcmFnZS1yZXBvcnQuaHRtbCkKQEAgLTIwNyw2ICsyOTUsMTUgQEAKIEFMTF9UQVJHRVRTLiQoY3RzLWNvbWJpbmVkLWNvdmVyYWdlLXJlcG9ydCkuTUVUQV9MSUM6PSQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpCiBBTExfVEFSR0VUUy4kKGN0cy1jb21iaW5lZC14bWwtY292ZXJhZ2UtcmVwb3J0KS5NRVRBX0xJQzo9JChtb2R1bGVfbGljZW5zZV9tZXRhZGF0YSkKIAorIyBQdXQgdGhlIHRlc3QgYXBpIG1hcCByZXBvcnQgaW4gdGhlIGRpc3QgZGlyIGlmICJjdHMtYXBpLW1hcC1hbGwiIGlzIGFtb25nIHRoZSBidWlsZCBnb2Fscy4KKyQoY2FsbCBkaXN0LWZvci1nb2FscywgY3RzLWFwaS1tYXAtYWxsLCAkKGN0cy1jb21iaW5lZC1zeXN0ZW0tYXBpLW1hcC14bWwtcmVwb3J0KTpjdHMtYXBpLW1hcC1yZXBvcnQueG1sKQorJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBjdHMtYXBpLW1hcC1hbGwsICQoY3RzLWNvbWJpbmVkLXN5c3RlbS1hcGktbWFwLWh0bWwtcmVwb3J0KTpjdHMtYXBpLW1hcC1yZXBvcnQuaHRtbCkKKworQUxMX1RBUkdFVFMuJChjdHMtc3lzdGVtLWFwaS1tYXAteG1sLXJlcG9ydCkuTUVUQV9MSUM6PSQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpCitBTExfVEFSR0VUUy4kKGN0cy1pbnRlcmFjdGl2ZS1zeXN0ZW0tYXBpLW1hcC14bWwtcmVwb3J0KS5NRVRBX0xJQzo9JChtb2R1bGVfbGljZW5zZV9tZXRhZGF0YSkKK0FMTF9UQVJHRVRTLiQoY3RzLWNvbWJpbmVkLXN5c3RlbS1hcGktbWFwLXhtbC1yZXBvcnQpLk1FVEFfTElDOj0kKG1vZHVsZV9saWNlbnNlX21ldGFkYXRhKQorQUxMX1RBUkdFVFMuJChjdHMtY29tYmluZWQtc3lzdGVtLWFwaS1tYXAtaHRtbC1yZXBvcnQpLk1FVEFfTElDOj0kKG1vZHVsZV9saWNlbnNlX21ldGFkYXRhKQorCiAjIEFyZ3VtZW50czsKICMgIDEgLSBOYW1lIG9mIHRoZSByZXBvcnQgcHJpbnRlZCBvdXQgb24gdGhlIHNjcmVlbgogIyAgMiAtIExpc3Qgb2YgYXBrIGZpbGVzIHRoYXQgd2lsbCBiZSBzY2FubmVkIHRvIGdlbmVyYXRlIHRoZSByZXBvcnQKQEAgLTIxNywyMiArMzE0LDQ4IEBACiAJQCBlY2hvICQoMSk6IGZpbGU6Ly8kJChjZCAkKGRpciAkQCk7IHB3ZCkvJChub3RkaXIgJEApCiBlbmRlZgogCisjIEFyZ3VtZW50czsKKyMgIDEgLSBOYW1lIG9mIHRoZSByZXBvcnQgcHJpbnRlZCBvdXQgb24gdGhlIHNjcmVlbgorIyAgMiAtIEEgZmlsZSBjb250YWluaW5nIGxpc3Qgb2YgZmlsZXMgdGhhdCB0byBiZSBhbmFseXplZAorIyAgMyAtIEZvcm1hdCBvZiB0aGUgcmVwb3J0CitkZWZpbmUgZ2VuZXJhdGUtYXBpLW1hcC1yZXBvcnQtY3RzCisJJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkKKwkkKGhpZGUpICQoUFJJVkFURV9DVFNfQVBJX01BUF9FWEUpIC1qIDggLWEgJChQUklWQVRFX0FQSV9YTUxfREVTQykgLWkgJCgyKSAtZiAkKDMpIC1vICRACisJQCBlY2hvICQoMSk6IGZpbGU6Ly8kJChjZCAkKGRpciAkQCk7IHB3ZCkvJChub3RkaXIgJEApCitlbmRlZgorCiAjIFJlc2V0IHRlbXAgdmFycwogY3RzX2FwaV9jb3ZlcmFnZV9kZXBlbmRlbmNpZXMgOj0KIGN0c19zeXN0ZW1fYXBpX2NvdmVyYWdlX2RlcGVuZGVuY2llcyA6PQorY3RzX3N5c3RlbV9hcGlfbWFwX2RlcGVuZGVuY2llcyA6PQorY3RzX2ludGVyYWN0aXZlX3N5c3RlbV9hcGlfbWFwX2RlcGVuZGVuY2llcyA6PQorY3RzX2NvbWJpbmVkX3N5c3RlbV9hcGlfbWFwX2RlcGVuZGVuY2llcyA6PQogY3RzLWNvbWJpbmVkLWNvdmVyYWdlLXJlcG9ydCA6PQogY3RzLWNvbWJpbmVkLXhtbC1jb3ZlcmFnZS1yZXBvcnQgOj0KIGN0cy12ZXJpZmllci1jb3ZlcmFnZS1yZXBvcnQgOj0KIGN0cy10ZXN0LWNvdmVyYWdlLXJlcG9ydCA6PQogY3RzLXN5c3RlbS1hcGktY292ZXJhZ2UtcmVwb3J0IDo9CiBjdHMtc3lzdGVtLWFwaS14bWwtY292ZXJhZ2UtcmVwb3J0IDo9CitjdHMtc3lzdGVtLWFwaS1tYXAteG1sLXJlcG9ydCA6PQorY3RzLWludGVyYWN0aXZlLXN5c3RlbS1hcGktbWFwLXhtbC1yZXBvcnQgOj0KK2N0cy1jb21iaW5lZC1zeXN0ZW0tYXBpLW1hcC14bWwtcmVwb3J0IDo9CitjdHMtY29tYmluZWQtc3lzdGVtLWFwaS1tYXAtaHRtbC1yZXBvcnQgOj0KIGFwaV94bWxfZGVzY3JpcHRpb24gOj0KIGFwaV90ZXh0X2Rlc2NyaXB0aW9uIDo9CiBzeXN0ZW1fYXBpX3htbF9kZXNjcmlwdGlvbiA6PQogbmFwaV94bWxfZGVzY3JpcHRpb24gOj0KIG5hcGlfdGV4dF9kZXNjcmlwdGlvbiA6PQogY292ZXJhZ2Vfb3V0IDo9CithcGlfbWFwX291dCA6PQorY3RzX2phcl9maWxlcyA6PQogZGV4ZGVwc19leGUgOj0KIGN0c19hcGlfY292ZXJhZ2VfZXhlIDo9CitjdHNfYXBpX21hcF9leGUgOj0KIGN0c192ZXJpZmllcl9hcGsgOj0KIGFuZHJvaWRfY3RzX3ppcCA6PQorY3RzLWRpciA6PQordmVyaWZpZXItZGlyLW5hbWUgOj0KK3ZlcmlmaWVyLWRpciA6PQordmVyaWZpZXItemlwLW5hbWUgOj0KK3ZlcmlmaWVyLXppcCA6PQorY3RzLWludGVyYWN0aXZlLXppcCA6PQpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9kZXZpY2UtcGxhdGludW0tdGVzdHMubWsgYi9jb3JlL3Rhc2tzL2RldmljZS1wbGF0aW51bS10ZXN0cy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWY0YzRjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90YXNrcy9kZXZpY2UtcGxhdGludW0tdGVzdHMubWsKQEAgLTAsMCArMSw3MSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisuUEhPTlk6IGRldmljZS1wbGF0aW51bS10ZXN0cworCitkZXZpY2VfcGxhdGludW1fdGVzdHNfemlwIDo9ICQoUFJPRFVDVF9PVVQpL2RldmljZS1wbGF0aW51bS10ZXN0cy56aXAKKyMgQ3JlYXRlIGFuIGFydGlmYWN0IHRvIGluY2x1ZGUgYSBsaXN0IG9mIHRlc3QgY29uZmlnIGZpbGVzIGluIGRldmljZS1wbGF0aW51bS10ZXN0cy4KK2RldmljZV9wbGF0aW51bV90ZXN0c19saXN0X3ppcCA6PSAkKFBST0RVQ1RfT1VUKS9kZXZpY2UtcGxhdGludW0tdGVzdHNfbGlzdC56aXAKKyMgQ3JlYXRlIGFuIGFydGlmYWN0IHRvIGluY2x1ZGUgYWxsIHRlc3QgY29uZmlnIGZpbGVzIGluIGRldmljZS1wbGF0aW51bS10ZXN0cy4KK2RldmljZV9wbGF0aW51bV90ZXN0c19jb25maWdzX3ppcCA6PSAkKFBST0RVQ1RfT1VUKS9kZXZpY2UtcGxhdGludW0tdGVzdHNfY29uZmlncy56aXAKK215X2hvc3Rfc2hhcmVkX2xpYl9mb3JfZGV2aWNlX3BsYXRpbnVtX3Rlc3RzIDo9ICQoY2FsbCBjb3B5LW1hbnktZmlsZXMsJChDT01QQVRJQklMSVRZLmRldmljZS1wbGF0aW51bS10ZXN0cy5IT1NUX1NIQVJFRF9MSUJSQVJZLkZJTEVTKSkKK2RldmljZV9wbGF0aW51bV90ZXN0c19ob3N0X3NoYXJlZF9saWJzX3ppcCA6PSAkKFBST0RVQ1RfT1VUKS9kZXZpY2UtcGxhdGludW0tdGVzdHNfaG9zdC1zaGFyZWQtbGlicy56aXAKKworJChkZXZpY2VfcGxhdGludW1fdGVzdHNfemlwKSA6IC5LQVRJX0lNUExJQ0lUX09VVFBVVFMgOj0gJChkZXZpY2VfcGxhdGludW1fdGVzdHNfbGlzdF96aXApICQoZGV2aWNlX3BsYXRpbnVtX3Rlc3RzX2NvbmZpZ3NfemlwKSAkKGRldmljZV9wbGF0aW51bV90ZXN0c19ob3N0X3NoYXJlZF9saWJzX3ppcCkKKyQoZGV2aWNlX3BsYXRpbnVtX3Rlc3RzX3ppcCkgOiBQUklWQVRFX2RldmljZV9wbGF0aW51bV90ZXN0c19saXN0X3ppcCA6PSAkKGRldmljZV9wbGF0aW51bV90ZXN0c19saXN0X3ppcCkKKyQoZGV2aWNlX3BsYXRpbnVtX3Rlc3RzX3ppcCkgOiBQUklWQVRFX2RldmljZV9wbGF0aW51bV90ZXN0c19jb25maWdzX3ppcCA6PSAkKGRldmljZV9wbGF0aW51bV90ZXN0c19jb25maWdzX3ppcCkKKyQoZGV2aWNlX3BsYXRpbnVtX3Rlc3RzX3ppcCkgOiBQUklWQVRFX2RldmljZV9wbGF0aW51bV90ZXN0c19saXN0IDo9ICQoUFJPRFVDVF9PVVQpL2RldmljZS1wbGF0aW51bS10ZXN0c19saXN0CiskKGRldmljZV9wbGF0aW51bV90ZXN0c196aXApIDogUFJJVkFURV9IT1NUX1NIQVJFRF9MSUJTIDo9ICQobXlfaG9zdF9zaGFyZWRfbGliX2Zvcl9kZXZpY2VfcGxhdGludW1fdGVzdHMpCiskKGRldmljZV9wbGF0aW51bV90ZXN0c196aXApIDogUFJJVkFURV9kZXZpY2VfaG9zdF9zaGFyZWRfbGlic196aXAgOj0gJChkZXZpY2VfcGxhdGludW1fdGVzdHNfaG9zdF9zaGFyZWRfbGlic196aXApCiskKGRldmljZV9wbGF0aW51bV90ZXN0c196aXApIDogJChDT01QQVRJQklMSVRZLmRldmljZS1wbGF0aW51bS10ZXN0cy5GSUxFUykgJChteV9ob3N0X3NoYXJlZF9saWJfZm9yX2RldmljZV9wbGF0aW51bV90ZXN0cykgJChTT09OR19aSVApCisJcm0gLWYgJEAtc2hhcmVkLWxpYnMubGlzdAorCXJtIC1mICQoUFJJVkFURV9kZXZpY2VfcGxhdGludW1fdGVzdHNfbGlzdF96aXApCisJZWNobyAkKHNvcnQgJChDT01QQVRJQklMSVRZLmRldmljZS1wbGF0aW51bS10ZXN0cy5GSUxFUykpIHwgdHIgIiAiICJcbiIgPiAkQC5saXN0CisJZ3JlcCAkKEhPU1RfT1VUX1RFU1RDQVNFUykgJEAubGlzdCA+ICRALWhvc3QubGlzdCB8fCB0cnVlCisJZ3JlcCAtZSAuKlxcLmNvbmZpZyQkICRALWhvc3QubGlzdCA+ICRALWhvc3QtdGVzdC1jb25maWdzLmxpc3QgfHwgdHJ1ZQorCSQoaGlkZSkgZm9yIHNoYXJlZF9saWIgaW4gJChQUklWQVRFX0hPU1RfU0hBUkVEX0xJQlMpOyBkbyBcCisJICBlY2hvICQkc2hhcmVkX2xpYiA+PiAkQC1ob3N0Lmxpc3Q7IFwKKwkgIGVjaG8gJCRzaGFyZWRfbGliID4+ICRALXNoYXJlZC1saWJzLmxpc3Q7IFwKKwlkb25lCisJZ3JlcCAkKEhPU1RfT1VUX1RFU1RDQVNFUykgJEAtc2hhcmVkLWxpYnMubGlzdCA+ICRALWhvc3Qtc2hhcmVkLWxpYnMubGlzdCB8fCB0cnVlCisJZ3JlcCAkKFRBUkdFVF9PVVRfVEVTVENBU0VTKSAkQC5saXN0ID4gJEAtdGFyZ2V0Lmxpc3QgfHwgdHJ1ZQorCWdyZXAgLWUgLipcXC5jb25maWckJCAkQC10YXJnZXQubGlzdCA+ICRALXRhcmdldC10ZXN0LWNvbmZpZ3MubGlzdCB8fCB0cnVlCisJJChoaWRlKSAkKFNPT05HX1pJUCkgLWQgLW8gJEAgLVAgaG9zdCAtQyAkKEhPU1RfT1VUKSAtbCAkQC1ob3N0Lmxpc3QgLVAgdGFyZ2V0IC1DICQoUFJPRFVDVF9PVVQpIC1sICRALXRhcmdldC5saXN0IC1zaGEyNTYKKwkkKGhpZGUpICQoU09PTkdfWklQKSAtZCAtbyAkKFBSSVZBVEVfZGV2aWNlX3BsYXRpbnVtX3Rlc3RzX2NvbmZpZ3NfemlwKSBcCisJICAtUCBob3N0IC1DICQoSE9TVF9PVVQpIC1sICRALWhvc3QtdGVzdC1jb25maWdzLmxpc3QgXAorCSAgLVAgdGFyZ2V0IC1DICQoUFJPRFVDVF9PVVQpIC1sICRALXRhcmdldC10ZXN0LWNvbmZpZ3MubGlzdAorCSQoU09PTkdfWklQKSAtZCAtbyAkKFBSSVZBVEVfZGV2aWNlX2hvc3Rfc2hhcmVkX2xpYnNfemlwKSBcCisJICAtUCBob3N0IC1DICQoSE9TVF9PVVQpIC1sICRALWhvc3Qtc2hhcmVkLWxpYnMubGlzdAorCXJtIC1mICQoUFJJVkFURV9kZXZpY2VfcGxhdGludW1fdGVzdHNfbGlzdCkKKwkkKGhpZGUpIGdyZXAgLWUgLipcXC5jb25maWckJCAkQC1ob3N0Lmxpc3QgfCBzZWQgcyUkKEhPU1RfT1VUKSVob3N0JWcgPiAkKFBSSVZBVEVfZGV2aWNlX3BsYXRpbnVtX3Rlc3RzX2xpc3QpCisJJChoaWRlKSBncmVwIC1lIC4qXFwuY29uZmlnJCQgJEAtdGFyZ2V0Lmxpc3QgfCBzZWQgcyUkKFBST0RVQ1RfT1VUKSV0YXJnZXQlZyA+PiAkKFBSSVZBVEVfZGV2aWNlX3BsYXRpbnVtX3Rlc3RzX2xpc3QpCisJJChoaWRlKSAkKFNPT05HX1pJUCkgLWQgLW8gJChQUklWQVRFX2RldmljZV9wbGF0aW51bV90ZXN0c19saXN0X3ppcCkgLUMgJChkaXIgJEApIC1mICQoUFJJVkFURV9kZXZpY2VfcGxhdGludW1fdGVzdHNfbGlzdCkKKwlybSAtZiAkQC5saXN0ICRALWhvc3QubGlzdCAkQC10YXJnZXQubGlzdCAkQC1ob3N0LXRlc3QtY29uZmlncy5saXN0ICRALXRhcmdldC10ZXN0LWNvbmZpZ3MubGlzdCBcCisJICAkQC1zaGFyZWQtbGlicy5saXN0ICRALWhvc3Qtc2hhcmVkLWxpYnMubGlzdCAkKFBSSVZBVEVfZGV2aWNlX3BsYXRpbnVtX3Rlc3RzX2xpc3QpCisKK2RldmljZS1wbGF0aW51bS10ZXN0czogJChkZXZpY2VfcGxhdGludW1fdGVzdHNfemlwKQorJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBkZXZpY2UtcGxhdGludW0tdGVzdHMsICQoZGV2aWNlX3BsYXRpbnVtX3Rlc3RzX3ppcCkgJChkZXZpY2VfcGxhdGludW1fdGVzdHNfbGlzdF96aXApICQoZGV2aWNlX3BsYXRpbnVtX3Rlc3RzX2NvbmZpZ3NfemlwKSAkKGRldmljZV9wbGF0aW51bV90ZXN0c19ob3N0X3NoYXJlZF9saWJzX3ppcCkpCisKKyQoY2FsbCBkZWNsYXJlLTFwLWNvbnRhaW5lciwkKGRldmljZV9wbGF0aW51bV90ZXN0c196aXApLCkKKyQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJChkZXZpY2VfcGxhdGludW1fdGVzdHNfemlwKSwkKENPTVBBVElCSUxJVFkuZGV2aWNlLXBsYXRpbnVtLXRlc3RzLkZJTEVTKSAkKG15X2hvc3Rfc2hhcmVkX2xpYl9mb3JfZGV2aWNlX3BsYXRpbnVtX3Rlc3RzKSwkKFBST0RVQ1RfT1VUKS86LykKKwordGVzdHM6IGRldmljZS1wbGF0aW51bS10ZXN0cworCisjIFJlc2V0IHRlbXAgdmFycworZGV2aWNlX3BsYXRpbnVtX3Rlc3RzX3ppcCA6PQorZGV2aWNlX3BsYXRpbnVtX3Rlc3RzX2xpc3RfemlwIDo9CitkZXZpY2VfcGxhdGludW1fdGVzdHNfY29uZmlnc196aXAgOj0KK215X2hvc3Rfc2hhcmVkX2xpYl9mb3JfZGV2aWNlX3BsYXRpbnVtX3Rlc3RzIDo9CitkZXZpY2VfcGxhdGludW1fdGVzdHNfaG9zdF9zaGFyZWRfbGlic196aXAgOj0KZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvZGV2aWNlLXRlc3RzLm1rIGIvY29yZS90YXNrcy9kZXZpY2UtdGVzdHMubWsKaW5kZXggNDE2N2E3ZS4uNjE2NGMyZSAxMDA2NDQKLS0tIGEvY29yZS90YXNrcy9kZXZpY2UtdGVzdHMubWsKKysrIGIvY29yZS90YXNrcy9kZXZpY2UtdGVzdHMubWsKQEAgLTE0LDYgKzE0LDcgQEAKIAogCiAuUEhPTlk6IGRldmljZS10ZXN0cworLlBIT05ZOiBkZXZpY2UtdGVzdHMtaG9zdC1zaGFyZWQtbGlicwogCiBkZXZpY2UtdGVzdHMtemlwIDo9ICQoUFJPRFVDVF9PVVQpL2RldmljZS10ZXN0cy56aXAKICMgQ3JlYXRlIGFuIGFydGlmYWN0IHRvIGluY2x1ZGUgYSBsaXN0IG9mIHRlc3QgY29uZmlnIGZpbGVzIGluIGRldmljZS10ZXN0cy4KQEAgLTIzLDM3ICsyNCw0NSBAQAogbXlfaG9zdF9zaGFyZWRfbGliX2Zvcl9kZXZpY2VfdGVzdHMgOj0gJChjYWxsIGNvcHktbWFueS1maWxlcywkKENPTVBBVElCSUxJVFkuZGV2aWNlLXRlc3RzLkhPU1RfU0hBUkVEX0xJQlJBUlkuRklMRVMpKQogZGV2aWNlX3Rlc3RzX2hvc3Rfc2hhcmVkX2xpYnNfemlwIDo9ICQoUFJPRFVDVF9PVVQpL2RldmljZS10ZXN0c19ob3N0LXNoYXJlZC1saWJzLnppcAogCi0kKGRldmljZS10ZXN0cy16aXApIDogLktBVElfSU1QTElDSVRfT1VUUFVUUyA6PSAkKGRldmljZS10ZXN0cy1saXN0LXppcCkgJChkZXZpY2UtdGVzdHMtY29uZmlncy16aXApICQoZGV2aWNlX3Rlc3RzX2hvc3Rfc2hhcmVkX2xpYnNfemlwKQorJChkZXZpY2UtdGVzdHMtemlwKSA6IC5LQVRJX0lNUExJQ0lUX09VVFBVVFMgOj0gJChkZXZpY2UtdGVzdHMtbGlzdC16aXApICQoZGV2aWNlLXRlc3RzLWNvbmZpZ3MtemlwKQogJChkZXZpY2UtdGVzdHMtemlwKSA6IFBSSVZBVEVfZGV2aWNlX3Rlc3RzX2xpc3QgOj0gJChQUk9EVUNUX09VVCkvZGV2aWNlLXRlc3RzX2xpc3QKICQoZGV2aWNlLXRlc3RzLXppcCkgOiBQUklWQVRFX0hPU1RfU0hBUkVEX0xJQlMgOj0gJChteV9ob3N0X3NoYXJlZF9saWJfZm9yX2RldmljZV90ZXN0cykKLSQoZGV2aWNlLXRlc3RzLXppcCkgOiBQUklWQVRFX2RldmljZV9ob3N0X3NoYXJlZF9saWJzX3ppcCA6PSAkKGRldmljZV90ZXN0c19ob3N0X3NoYXJlZF9saWJzX3ppcCkKLSQoZGV2aWNlLXRlc3RzLXppcCkgOiAkKENPTVBBVElCSUxJVFkuZGV2aWNlLXRlc3RzLkZJTEVTKSAkKG15X2hvc3Rfc2hhcmVkX2xpYl9mb3JfZGV2aWNlX3Rlc3RzKSAkKFNPT05HX1pJUCkKLQlybSAtZiAkQC1zaGFyZWQtbGlicy5saXN0Ci0JZWNobyAkKHNvcnQgJChDT01QQVRJQklMSVRZLmRldmljZS10ZXN0cy5GSUxFUykpIHwgdHIgIiAiICJcbiIgPiAkQC5saXN0CiskKGRldmljZS10ZXN0cy16aXApIDogJChDT01QQVRJQklMSVRZLmRldmljZS10ZXN0cy5GSUxFUykgJChDT01QQVRJQklMSVRZLmRldmljZS10ZXN0cy5TT09OR19JTlNUQUxMRURfQ09NUEFUSUJJTElUWV9TVVBQT1JUX0ZJTEVTKSAkKG15X2hvc3Rfc2hhcmVkX2xpYl9mb3JfZGV2aWNlX3Rlc3RzKSAkKFNPT05HX1pJUCkKKwllY2hvICQoc29ydCAkKENPTVBBVElCSUxJVFkuZGV2aWNlLXRlc3RzLkZJTEVTKSAkKENPTVBBVElCSUxJVFkuZGV2aWNlLXRlc3RzLlNPT05HX0lOU1RBTExFRF9DT01QQVRJQklMSVRZX1NVUFBPUlRfRklMRVMpKSB8IHRyICIgIiAiXG4iID4gJEAubGlzdAogCWdyZXAgJChIT1NUX09VVF9URVNUQ0FTRVMpICRALmxpc3QgPiAkQC1ob3N0Lmxpc3QgfHwgdHJ1ZQogCWdyZXAgLWUgLipcXC5jb25maWckJCAkQC1ob3N0Lmxpc3QgPiAkQC1ob3N0LXRlc3QtY29uZmlncy5saXN0IHx8IHRydWUKIAkkKGhpZGUpIGZvciBzaGFyZWRfbGliIGluICQoUFJJVkFURV9IT1NUX1NIQVJFRF9MSUJTKTsgZG8gXAogCSAgZWNobyAkJHNoYXJlZF9saWIgPj4gJEAtaG9zdC5saXN0OyBcCi0JICBlY2hvICQkc2hhcmVkX2xpYiA+PiAkQC1zaGFyZWQtbGlicy5saXN0OyBcCiAJZG9uZQotCWdyZXAgJChIT1NUX09VVF9URVNUQ0FTRVMpICRALXNoYXJlZC1saWJzLmxpc3QgPiAkQC1ob3N0LXNoYXJlZC1saWJzLmxpc3QgfHwgdHJ1ZQogCWdyZXAgJChUQVJHRVRfT1VUX1RFU1RDQVNFUykgJEAubGlzdCA+ICRALXRhcmdldC5saXN0IHx8IHRydWUKIAlncmVwIC1lIC4qXFwuY29uZmlnJCQgJEAtdGFyZ2V0Lmxpc3QgPiAkQC10YXJnZXQtdGVzdC1jb25maWdzLmxpc3QgfHwgdHJ1ZQogCSQoaGlkZSkgJChTT09OR19aSVApIC1kIC1vICRAIC1QIGhvc3QgLUMgJChIT1NUX09VVCkgLWwgJEAtaG9zdC5saXN0IC1QIHRhcmdldCAtQyAkKFBST0RVQ1RfT1VUKSAtbCAkQC10YXJnZXQubGlzdCAtc2hhMjU2CiAJJChoaWRlKSAkKFNPT05HX1pJUCkgLWQgLW8gJChkZXZpY2UtdGVzdHMtY29uZmlncy16aXApIFwKIAkgIC1QIGhvc3QgLUMgJChIT1NUX09VVCkgLWwgJEAtaG9zdC10ZXN0LWNvbmZpZ3MubGlzdCBcCiAJICAtUCB0YXJnZXQgLUMgJChQUk9EVUNUX09VVCkgLWwgJEAtdGFyZ2V0LXRlc3QtY29uZmlncy5saXN0Ci0JJChTT09OR19aSVApIC1kIC1vICQoUFJJVkFURV9kZXZpY2VfaG9zdF9zaGFyZWRfbGlic196aXApIFwKLQkgIC1QIGhvc3QgLUMgJChIT1NUX09VVCkgLWwgJEAtaG9zdC1zaGFyZWQtbGlicy5saXN0CiAJcm0gLWYgJChQUklWQVRFX2RldmljZV90ZXN0c19saXN0KQogCSQoaGlkZSkgZ3JlcCAtZSAuKlxcLmNvbmZpZyQkICRALWhvc3QubGlzdCB8IHNlZCBzJSQoSE9TVF9PVVQpJWhvc3QlZyA+ICQoUFJJVkFURV9kZXZpY2VfdGVzdHNfbGlzdCkKIAkkKGhpZGUpIGdyZXAgLWUgLipcXC5jb25maWckJCAkQC10YXJnZXQubGlzdCB8IHNlZCBzJSQoUFJPRFVDVF9PVVQpJXRhcmdldCVnID4+ICQoUFJJVkFURV9kZXZpY2VfdGVzdHNfbGlzdCkKIAkkKGhpZGUpICQoU09PTkdfWklQKSAtZCAtbyAkKGRldmljZS10ZXN0cy1saXN0LXppcCkgLUMgJChkaXIgJEApIC1mICQoUFJJVkFURV9kZXZpY2VfdGVzdHNfbGlzdCkKIAlybSAtZiAkQC5saXN0ICRALWhvc3QubGlzdCAkQC10YXJnZXQubGlzdCAkQC1ob3N0LXRlc3QtY29uZmlncy5saXN0ICRALXRhcmdldC10ZXN0LWNvbmZpZ3MubGlzdCBcCi0JICAkQC1zaGFyZWQtbGlicy5saXN0ICRALWhvc3Qtc2hhcmVkLWxpYnMubGlzdCAkKFBSSVZBVEVfZGV2aWNlX3Rlc3RzX2xpc3QpCisJCSQoUFJJVkFURV9kZXZpY2VfdGVzdHNfbGlzdCkKKworJChkZXZpY2VfdGVzdHNfaG9zdF9zaGFyZWRfbGlic196aXApIDogUFJJVkFURV9kZXZpY2VfaG9zdF9zaGFyZWRfbGlic196aXAgOj0gJChkZXZpY2VfdGVzdHNfaG9zdF9zaGFyZWRfbGlic196aXApCiskKGRldmljZV90ZXN0c19ob3N0X3NoYXJlZF9saWJzX3ppcCkgOiBQUklWQVRFX0hPU1RfU0hBUkVEX0xJQlMgOj0gJChteV9ob3N0X3NoYXJlZF9saWJfZm9yX2RldmljZV90ZXN0cykKKyQoZGV2aWNlX3Rlc3RzX2hvc3Rfc2hhcmVkX2xpYnNfemlwKSA6ICQobXlfaG9zdF9zaGFyZWRfbGliX2Zvcl9kZXZpY2VfdGVzdHMpICQoU09PTkdfWklQKQorCXJtIC1mICRALXNoYXJlZC1saWJzLmxpc3QKKwkkKGhpZGUpIGZvciBzaGFyZWRfbGliIGluICQoUFJJVkFURV9IT1NUX1NIQVJFRF9MSUJTKTsgZG8gXAorCSAgZWNobyAkJHNoYXJlZF9saWIgPj4gJEAtc2hhcmVkLWxpYnMubGlzdDsgXAorCWRvbmUKKwlncmVwICQoSE9TVF9PVVRfVEVTVENBU0VTKSAkQC1zaGFyZWQtbGlicy5saXN0ID4gJEAtaG9zdC1zaGFyZWQtbGlicy5saXN0IHx8IHRydWUKKwkkKFNPT05HX1pJUCkgLWQgLW8gJChQUklWQVRFX2RldmljZV9ob3N0X3NoYXJlZF9saWJzX3ppcCkgXAorCSAgLVAgaG9zdCAtQyAkKEhPU1RfT1VUKSAtbCAkQC1ob3N0LXNoYXJlZC1saWJzLmxpc3QKIAogZGV2aWNlLXRlc3RzOiAkKGRldmljZS10ZXN0cy16aXApCitkZXZpY2UtdGVzdHMtaG9zdC1zaGFyZWQtbGliczogJChkZXZpY2VfdGVzdHNfaG9zdF9zaGFyZWRfbGlic196aXApCisKICQoY2FsbCBkaXN0LWZvci1nb2FscywgZGV2aWNlLXRlc3RzLCAkKGRldmljZS10ZXN0cy16aXApICQoZGV2aWNlLXRlc3RzLWxpc3QtemlwKSAkKGRldmljZS10ZXN0cy1jb25maWdzLXppcCkgJChkZXZpY2VfdGVzdHNfaG9zdF9zaGFyZWRfbGlic196aXApKQorJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBkZXZpY2UtdGVzdHMtaG9zdC1zaGFyZWQtbGlicywgJChkZXZpY2VfdGVzdHNfaG9zdF9zaGFyZWRfbGlic196aXApKQogCiAkKGNhbGwgZGVjbGFyZS0xcC1jb250YWluZXIsJChkZXZpY2UtdGVzdHMtemlwKSwpCiAkKGNhbGwgZGVjbGFyZS1jb250YWluZXItbGljZW5zZS1kZXBzLCQoZGV2aWNlLXRlc3RzLXppcCksJChDT01QQVRJQklMSVRZLmRldmljZS10ZXN0cy5GSUxFUykgJChteV9ob3N0X3NoYXJlZF9saWJfZm9yX2RldmljZV90ZXN0cyksJChQUk9EVUNUX09VVCkvOi8pCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL2R0cy5tayBiL2NvcmUvdGFza3MvZHRzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMDkwODIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rhc2tzL2R0cy5tawpAQCAtMCwwICsxLDI4IEBACisjIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIERlc2t0b3AgdGVzdCBzdWl0ZQoraWZuZXEgKCQod2lsZGNhcmQgdGVzdC9kdHMvdG9vbHMvZHRzLXRyYWRlZmVkL1JFQURNRSksKQordGVzdF9zdWl0ZV9uYW1lIDo9IGR0cwordGVzdF9zdWl0ZV90cmFkZWZlZCA6PSBkdHMtdHJhZGVmZWQKK3Rlc3Rfc3VpdGVfcmVhZG1lIDo9IHRlc3QvZHRzL3Rvb2xzL2R0cy10cmFkZWZlZC9SRUFETUUKK3Rlc3Rfc3VpdGVfdG9vbHMgOj0gJChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvYXRzX2NvbnNvbGVfZGVwbG95LmphciBcCisgICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL2F0c19vbGNfc2VydmVyX2xvY2FsX21vZGVfZGVwbG95LmphcgorCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS90YXNrcy90b29scy9jb21wYXRpYmlsaXR5Lm1rCisKKy5QSE9OWTogZHRzCitkdHM6ICQoY29tcGF0aWJpbGl0eV96aXApICQoY29tcGF0aWJpbGl0eV90ZXN0c19saXN0X3ppcCkKKyQoY2FsbCBkaXN0LWZvci1nb2FscywgZHRzLCAkKGNvbXBhdGliaWxpdHlfemlwKSAkKGNvbXBhdGliaWxpdHlfdGVzdHNfbGlzdF96aXApKQorZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvZm9udGNoYWluX2xpbnQubWsgYi9jb3JlL3Rhc2tzL2ZvbnRjaGFpbl9saW50Lm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YzM5NmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rhc2tzL2ZvbnRjaGFpbl9saW50Lm1rCkBAIC0wLDAgKzEsNDMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgUnVuIHNhbml0eSB0ZXN0cyBvbiBmb250cyBvbiBjaGVja2J1aWxkCitjaGVja2J1aWxkOiBmb250Y2hhaW5fbGludAorCitGT05UQ0hBSU5fTElOVEVSIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2ZvbnRjaGFpbl9saW50ZXIKK2lmZXEgKCQoTUlOSU1BTF9GT05UX0ZPT1RQUklOVCksdHJ1ZSkKK0NIRUNLX0VNT0pJIDo9IGZhbHNlCitlbHNlCitDSEVDS19FTU9KSSA6PSB0cnVlCitlbmRpZgorCitmb250Y2hhaW5fbGludF90aW1lc3RhbXAgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsZm9udGNoYWluX2xpbnQpL3N0YW1wCisKKy5QSE9OWTogZm9udGNoYWluX2xpbnQKK2ZvbnRjaGFpbl9saW50OiAkKGZvbnRjaGFpbl9saW50X3RpbWVzdGFtcCkKKworZm9udGNoYWluX2xpbnRfZGVwcyA6PSBcCisgICAgZXh0ZXJuYWwvdW5pY29kZS9EZXJpdmVkQWdlLnR4dCBcCisgICAgZXh0ZXJuYWwvdW5pY29kZS9lbW9qaS1kYXRhLnR4dCBcCisgICAgZXh0ZXJuYWwvdW5pY29kZS9lbW9qaS1zZXF1ZW5jZXMudHh0IFwKKyAgICBleHRlcm5hbC91bmljb2RlL2Vtb2ppLXZhcmlhdGlvbi1zZXF1ZW5jZXMudHh0IFwKKyAgICBleHRlcm5hbC91bmljb2RlL2Vtb2ppLXp3ai1zZXF1ZW5jZXMudHh0IFwKKyAgICBleHRlcm5hbC91bmljb2RlL2FkZGl0aW9ucy9lbW9qaS1kYXRhLnR4dCBcCisgICAgZXh0ZXJuYWwvdW5pY29kZS9hZGRpdGlvbnMvZW1vamktc2VxdWVuY2VzLnR4dCBcCisgICAgZXh0ZXJuYWwvdW5pY29kZS9hZGRpdGlvbnMvZW1vamktendqLXNlcXVlbmNlcy50eHQgXAorCiskKGZvbnRjaGFpbl9saW50X3RpbWVzdGFtcCk6ICQoRk9OVENIQUlOX0xJTlRFUikgJChUQVJHRVRfT1VUKS9ldGMvZm9udHMueG1sICQoUFJPRFVDVF9PVVQpL3N5c3RlbS5pbWcgJChmb250Y2hhaW5fbGludF9kZXBzKQorCUBlY2hvIFJ1bm5pbmcgZm9udGNoYWluIGxpbnQKKwkkKEZPTlRDSEFJTl9MSU5URVIpICQoVEFSR0VUX09VVCkgJChDSEVDS19FTU9KSSkgZXh0ZXJuYWwvdW5pY29kZQorCXRvdWNoICRACmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL2dlbmVyYWwtdGVzdHMtc2hhcmVkLWxpYnMubWsgYi9jb3JlL3Rhc2tzL2dlbmVyYWwtdGVzdHMtc2hhcmVkLWxpYnMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwNTE0MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGFza3MvZ2VuZXJhbC10ZXN0cy1zaGFyZWQtbGlicy5tawpAQCAtMCwwICsxLDUyIEBACisjIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisuUEhPTlk6IGdlbmVyYWwtdGVzdHMtc2hhcmVkLWxpYnMKKworaW50ZXJtZWRpYXRlc19kaXIgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsZ2VuZXJhbC10ZXN0cy1zaGFyZWQtbGlicykKKworZ2VuZXJhbF90ZXN0c19zaGFyZWRfbGlic196aXAgOj0gJChQUk9EVUNUX09VVCkvZ2VuZXJhbC10ZXN0c19ob3N0LXNoYXJlZC1saWJzLnppcAorCisjIEZpbHRlciBzaGFyZWQgZW50cmllcyBiZXR3ZWVuIGdlbmVyYWwtdGVzdHMgYW5kIGRldmljZS10ZXN0cydzIEhPU1RfU0hBUkVEX0xJQlJBUlkuRklMRVMsCisjIHRvIGF2b2lkIHdhcm5pbmcgYWJvdXQgb3ZlcnJpZGluZyBjb21tYW5kcy4KK215X2hvc3Rfc2hhcmVkX2xpYl9mb3JfZ2VuZXJhbF90ZXN0cyA6PSBcCisgICQoZm9yZWFjaCBtLCQoZmlsdGVyICQoQ09NUEFUSUJJTElUWS5kZXZpY2UtdGVzdHMuSE9TVF9TSEFSRURfTElCUkFSWS5GSUxFUyksXAorCSAgICQoQ09NUEFUSUJJTElUWS5nZW5lcmFsLXRlc3RzLkhPU1RfU0hBUkVEX0xJQlJBUlkuRklMRVMpKSwkKGNhbGwgd29yZC1jb2xvbiwyLCQobSkpKQorbXlfZ2VuZXJhbF90ZXN0c19zaGFyZWRfbGliX2ZpbGVzIDo9IFwKKyAgJChmaWx0ZXItb3V0ICQoQ09NUEFUSUJJTElUWS5kZXZpY2UtdGVzdHMuSE9TVF9TSEFSRURfTElCUkFSWS5GSUxFUyksXAorCSAkKENPTVBBVElCSUxJVFkuZ2VuZXJhbC10ZXN0cy5IT1NUX1NIQVJFRF9MSUJSQVJZLkZJTEVTKSkKKworbXlfaG9zdF9zaGFyZWRfbGliX2Zvcl9nZW5lcmFsX3Rlc3RzICs9ICQoY2FsbCBjb3B5LW1hbnktZmlsZXMsJChteV9nZW5lcmFsX3Rlc3RzX3NoYXJlZF9saWJfZmlsZXMpKQorCiskKGdlbmVyYWxfdGVzdHNfc2hhcmVkX2xpYnNfemlwKSA6IFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIgOj0gJChpbnRlcm1lZGlhdGVzX2RpcikKKyQoZ2VuZXJhbF90ZXN0c19zaGFyZWRfbGlic196aXApIDogUFJJVkFURV9IT1NUX1NIQVJFRF9MSUJTIDo9ICQobXlfaG9zdF9zaGFyZWRfbGliX2Zvcl9nZW5lcmFsX3Rlc3RzKQorJChnZW5lcmFsX3Rlc3RzX3NoYXJlZF9saWJzX3ppcCkgOiBQUklWQVRFX2dlbmVyYWxfaG9zdF9zaGFyZWRfbGlic196aXAgOj0gJChnZW5lcmFsX3Rlc3RzX3NoYXJlZF9saWJzX3ppcCkKKyQoZ2VuZXJhbF90ZXN0c19zaGFyZWRfbGlic196aXApIDogJChteV9ob3N0X3NoYXJlZF9saWJfZm9yX2dlbmVyYWxfdGVzdHMpICQoU09PTkdfWklQKQorCXJtIC1yZiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpCisJbWtkaXIgLXAgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKSAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3Rvb2xzCisJJChoaWRlKSBmb3Igc2hhcmVkX2xpYiBpbiAkKFBSSVZBVEVfSE9TVF9TSEFSRURfTElCUyk7IGRvIFwKKwkgIGVjaG8gJCRzaGFyZWRfbGliID4+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvc2hhcmVkLWxpYnMubGlzdDsgXAorCWRvbmUKKwlncmVwICQoSE9TVF9PVVRfVEVTVENBU0VTKSAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3NoYXJlZC1saWJzLmxpc3QgPiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2hvc3Qtc2hhcmVkLWxpYnMubGlzdCB8fCB0cnVlCisJJChTT09OR19aSVApIC1kIC1vICQoUFJJVkFURV9nZW5lcmFsX2hvc3Rfc2hhcmVkX2xpYnNfemlwKSBcCisJICAtUCBob3N0IC1DICQoSE9TVF9PVVQpIC1sICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvaG9zdC1zaGFyZWQtbGlicy5saXN0CisKK2dlbmVyYWwtdGVzdHMtc2hhcmVkLWxpYnM6ICQoZ2VuZXJhbF90ZXN0c19zaGFyZWRfbGlic196aXApCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGdlbmVyYWwtdGVzdHMtc2hhcmVkLWxpYnMsICQoZ2VuZXJhbF90ZXN0c19zaGFyZWRfbGlic196aXApKQorCiskKGNhbGwgZGVjbGFyZS0xcC1jb250YWluZXIsJChnZW5lcmFsX3Rlc3RzX3NoYXJlZF9saWJzX3ppcCksKQorJChjYWxsIGRlY2xhcmUtY29udGFpbmVyLWxpY2Vuc2UtZGVwcywkKGdlbmVyYWxfdGVzdHNfc2hhcmVkX2xpYnNfemlwKSwkKG15X2hvc3Rfc2hhcmVkX2xpYl9mb3JfZ2VuZXJhbF90ZXN0cyksJChQUk9EVUNUX09VVCkvOi8pCisKK2ludGVybWVkaWF0ZXNfZGlyIDo9CitnZW5lcmFsX3Rlc3RzX3NoYXJlZF9saWJzX3ppcCA6PQpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9nZW5lcmFsLXRlc3RzLm1rIGIvY29yZS90YXNrcy9nZW5lcmFsLXRlc3RzLm1rCmluZGV4IDhkYmM3NmYuLjE5MDFlZDUgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3MvZ2VuZXJhbC10ZXN0cy5taworKysgYi9jb3JlL3Rhc2tzL2dlbmVyYWwtdGVzdHMubWsKQEAgLTI0LDY1ICsyNCwyNiBAQAogIyBDcmVhdGUgYW4gYXJ0aWZhY3QgdG8gaW5jbHVkZSBhIGxpc3Qgb2YgdGVzdCBjb25maWcgZmlsZXMgaW4gZ2VuZXJhbC10ZXN0cy4KIGdlbmVyYWxfdGVzdHNfbGlzdF96aXAgOj0gJChQUk9EVUNUX09VVCkvZ2VuZXJhbC10ZXN0c19saXN0LnppcAogCi0jIEZpbHRlciBzaGFyZWQgZW50cmllcyBiZXR3ZWVuIGdlbmVyYWwtdGVzdHMgYW5kIGRldmljZS10ZXN0cydzIEhPU1RfU0hBUkVEX0xJQlJBUlkuRklMRVMsCi0jIHRvIGF2b2lkIHdhcm5pbmcgYWJvdXQgb3ZlcnJpZGluZyBjb21tYW5kcy4KLW15X2hvc3Rfc2hhcmVkX2xpYl9mb3JfZ2VuZXJhbF90ZXN0cyA6PSBcCi0gICQoZm9yZWFjaCBtLCQoZmlsdGVyICQoQ09NUEFUSUJJTElUWS5kZXZpY2UtdGVzdHMuSE9TVF9TSEFSRURfTElCUkFSWS5GSUxFUyksXAotCSAgICQoQ09NUEFUSUJJTElUWS5nZW5lcmFsLXRlc3RzLkhPU1RfU0hBUkVEX0xJQlJBUlkuRklMRVMpKSwkKGNhbGwgd29yZC1jb2xvbiwyLCQobSkpKQotbXlfZ2VuZXJhbF90ZXN0c19zaGFyZWRfbGliX2ZpbGVzIDo9IFwKLSAgJChmaWx0ZXItb3V0ICQoQ09NUEFUSUJJTElUWS5kZXZpY2UtdGVzdHMuSE9TVF9TSEFSRURfTElCUkFSWS5GSUxFUyksXAotCSAkKENPTVBBVElCSUxJVFkuZ2VuZXJhbC10ZXN0cy5IT1NUX1NIQVJFRF9MSUJSQVJZLkZJTEVTKSkKLQotbXlfaG9zdF9zaGFyZWRfbGliX2Zvcl9nZW5lcmFsX3Rlc3RzICs9ICQoY2FsbCBjb3B5LW1hbnktZmlsZXMsJChteV9nZW5lcmFsX3Rlc3RzX3NoYXJlZF9saWJfZmlsZXMpKQotCiAjIENyZWF0ZSBhbiBhcnRpZmFjdCB0byBpbmNsdWRlIGFsbCB0ZXN0IGNvbmZpZyBmaWxlcyBpbiBnZW5lcmFsLXRlc3RzLgogZ2VuZXJhbF90ZXN0c19jb25maWdzX3ppcCA6PSAkKFBST0RVQ1RfT1VUKS9nZW5lcmFsLXRlc3RzX2NvbmZpZ3MuemlwCi0jIENyZWF0ZSBhbiBhcnRpZmFjdCB0byBpbmNsdWRlIGFsbCBzaGFyZWQgbGlicmFyaXkgZmlsZXMgaW4gZ2VuZXJhbC10ZXN0cy4KLWdlbmVyYWxfdGVzdHNfaG9zdF9zaGFyZWRfbGlic196aXAgOj0gJChQUk9EVUNUX09VVCkvZ2VuZXJhbC10ZXN0c19ob3N0LXNoYXJlZC1saWJzLnppcAogCi0jIENvcHkga2VybmVsIHRlc3QgbW9kdWxlcyB0byB0ZXN0Y2FzZXMgZGlyZWN0b3JpZXMKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Rhc2tzL3Rvb2xzL3Z0cy1rZXJuZWwtdGVzdHMubWsKLWx0cF9jb3B5X3BhaXJzIDo9IFwKLSAgJChjYWxsIHRhcmdldC1uYXRpdmUtY29weS1wYWlycywkKGtlcm5lbF9sdHBfbW9kdWxlcyksJChrZXJuZWxfbHRwX2hvc3Rfb3V0KSkKLWtzZWxmdGVzdF9jb3B5X3BhaXJzIDo9IFwKLSAgJChjYWxsIHRhcmdldC1uYXRpdmUtY29weS1wYWlycywkKGtlcm5lbF9rc2VsZnRlc3RfbW9kdWxlcyksJChrZXJuZWxfa3NlbGZ0ZXN0X2hvc3Rfb3V0KSkKLWNvcHlfbHRwX3Rlc3RzIDo9ICQoY2FsbCBjb3B5LW1hbnktZmlsZXMsJChsdHBfY29weV9wYWlycykpCi1jb3B5X2tzZWxmdGVzdF90ZXN0cyA6PSAkKGNhbGwgY29weS1tYW55LWZpbGVzLCQoa3NlbGZ0ZXN0X2NvcHlfcGFpcnMpKQorZ2VuZXJhbF90ZXN0c19zaGFyZWRfbGlic196aXAgOj0gJChQUk9EVUNUX09VVCkvZ2VuZXJhbC10ZXN0c19ob3N0LXNoYXJlZC1saWJzLnppcAogCi0jIFBIT05ZIHRhcmdldCB0byBiZSB1c2VkIHRvIGJ1aWxkIGFuZCB0ZXN0IGB2dHNfbHRwX3Rlc3RzYCBhbmQgYHZ0c19rc2VsZnRlc3RfdGVzdHNgIHdpdGhvdXQgYnVpbGRpbmcgZnVsbCB2dHMKLS5QSE9OWTogdnRzX2tlcm5lbF9sdHBfdGVzdHMKLXZ0c19rZXJuZWxfbHRwX3Rlc3RzOiAkKGNvcHlfbHRwX3Rlc3RzKQotCi0uUEhPTlk6IHZ0c19rZXJuZWxfa3NlbGZ0ZXN0X3Rlc3RzCi12dHNfa2VybmVsX2tzZWxmdGVzdF90ZXN0czogJChjb3B5X2tzZWxmdGVzdF90ZXN0cykKLQotJChnZW5lcmFsX3Rlc3RzX3ppcCkgOiAkKGNvcHlfbHRwX3Rlc3RzKQotJChnZW5lcmFsX3Rlc3RzX3ppcCkgOiAkKGNvcHlfa3NlbGZ0ZXN0X3Rlc3RzKQotJChnZW5lcmFsX3Rlc3RzX3ppcCkgOiBQUklWQVRFX0tFUk5FTF9MVFBfSE9TVF9PVVQgOj0gJChrZXJuZWxfbHRwX2hvc3Rfb3V0KQotJChnZW5lcmFsX3Rlc3RzX3ppcCkgOiBQUklWQVRFX0tFUk5FTF9LU0VMRlRFU1RfSE9TVF9PVVQgOj0gJChrZXJuZWxfa3NlbGZ0ZXN0X2hvc3Rfb3V0KQorJChnZW5lcmFsX3Rlc3RzX3ppcCkgOiAkKGdlbmVyYWxfdGVzdHNfc2hhcmVkX2xpYnNfemlwKQogJChnZW5lcmFsX3Rlc3RzX3ppcCkgOiBQUklWQVRFX2dlbmVyYWxfdGVzdHNfbGlzdF96aXAgOj0gJChnZW5lcmFsX3Rlc3RzX2xpc3RfemlwKQotJChnZW5lcmFsX3Rlc3RzX3ppcCkgOiAuS0FUSV9JTVBMSUNJVF9PVVRQVVRTIDo9ICQoZ2VuZXJhbF90ZXN0c19saXN0X3ppcCkgJChnZW5lcmFsX3Rlc3RzX2NvbmZpZ3NfemlwKSAkKGdlbmVyYWxfdGVzdHNfaG9zdF9zaGFyZWRfbGlic196aXApCiskKGdlbmVyYWxfdGVzdHNfemlwKSA6IC5LQVRJX0lNUExJQ0lUX09VVFBVVFMgOj0gJChnZW5lcmFsX3Rlc3RzX2xpc3RfemlwKSAkKGdlbmVyYWxfdGVzdHNfY29uZmlnc196aXApCiAkKGdlbmVyYWxfdGVzdHNfemlwKSA6IFBSSVZBVEVfVE9PTFMgOj0gJChnZW5lcmFsX3Rlc3RzX3Rvb2xzKQogJChnZW5lcmFsX3Rlc3RzX3ppcCkgOiBQUklWQVRFX0lOVEVSTUVESUFURVNfRElSIDo9ICQoaW50ZXJtZWRpYXRlc19kaXIpCi0kKGdlbmVyYWxfdGVzdHNfemlwKSA6IFBSSVZBVEVfSE9TVF9TSEFSRURfTElCUyA6PSAkKG15X2hvc3Rfc2hhcmVkX2xpYl9mb3JfZ2VuZXJhbF90ZXN0cykKICQoZ2VuZXJhbF90ZXN0c196aXApIDogUFJJVkFURV9nZW5lcmFsX3Rlc3RzX2NvbmZpZ3NfemlwIDo9ICQoZ2VuZXJhbF90ZXN0c19jb25maWdzX3ppcCkKLSQoZ2VuZXJhbF90ZXN0c196aXApIDogUFJJVkFURV9nZW5lcmFsX2hvc3Rfc2hhcmVkX2xpYnNfemlwIDo9ICQoZ2VuZXJhbF90ZXN0c19ob3N0X3NoYXJlZF9saWJzX3ppcCkKLSQoZ2VuZXJhbF90ZXN0c196aXApIDogJChDT01QQVRJQklMSVRZLmdlbmVyYWwtdGVzdHMuRklMRVMpICQoZ2VuZXJhbF90ZXN0c190b29scykgJChteV9ob3N0X3NoYXJlZF9saWJfZm9yX2dlbmVyYWxfdGVzdHMpICQoU09PTkdfWklQKQorJChnZW5lcmFsX3Rlc3RzX3ppcCkgOiAkKENPTVBBVElCSUxJVFkuZ2VuZXJhbC10ZXN0cy5GSUxFUykgJChDT01QQVRJQklMSVRZLmdlbmVyYWwtdGVzdHMuU09PTkdfSU5TVEFMTEVEX0NPTVBBVElCSUxJVFlfU1VQUE9SVF9GSUxFUykgJChnZW5lcmFsX3Rlc3RzX3Rvb2xzKSAkKFNPT05HX1pJUCkKIAlybSAtcmYgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKQogCXJtIC1mICRAICQoUFJJVkFURV9nZW5lcmFsX3Rlc3RzX2xpc3RfemlwKQogCW1rZGlyIC1wICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS90b29scwotCWVjaG8gJChzb3J0ICQoQ09NUEFUSUJJTElUWS5nZW5lcmFsLXRlc3RzLkZJTEVTKSkgfCB0ciAiICIgIlxuIiA+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvbGlzdAotCWZpbmQgJChQUklWQVRFX0tFUk5FTF9MVFBfSE9TVF9PVVQpID4+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvbGlzdAotCWZpbmQgJChQUklWQVRFX0tFUk5FTF9LU0VMRlRFU1RfSE9TVF9PVVQpID4+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvbGlzdAorCWVjaG8gJChzb3J0ICQoQ09NUEFUSUJJTElUWS5nZW5lcmFsLXRlc3RzLkZJTEVTKSAkKENPTVBBVElCSUxJVFkuZ2VuZXJhbC10ZXN0cy5TT09OR19JTlNUQUxMRURfQ09NUEFUSUJJTElUWV9TVVBQT1JUX0ZJTEVTKSkgfCB0ciAiICIgIlxuIiA+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvbGlzdAogCWdyZXAgJChIT1NUX09VVF9URVNUQ0FTRVMpICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvbGlzdCA+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvaG9zdC5saXN0IHx8IHRydWUKIAlncmVwICQoVEFSR0VUX09VVF9URVNUQ0FTRVMpICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvbGlzdCA+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvdGFyZ2V0Lmxpc3QgfHwgdHJ1ZQogCWdyZXAgLWUgLipcXC5jb25maWckJCAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2hvc3QubGlzdCA+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvaG9zdC10ZXN0LWNvbmZpZ3MubGlzdCB8fCB0cnVlCiAJZ3JlcCAtZSAuKlxcLmNvbmZpZyQkICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvdGFyZ2V0Lmxpc3QgPiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3RhcmdldC10ZXN0LWNvbmZpZ3MubGlzdCB8fCB0cnVlCi0JJChoaWRlKSBmb3Igc2hhcmVkX2xpYiBpbiAkKFBSSVZBVEVfSE9TVF9TSEFSRURfTElCUyk7IGRvIFwKLQkgIGVjaG8gJCRzaGFyZWRfbGliID4+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvaG9zdC5saXN0OyBcCi0JICBlY2hvICQkc2hhcmVkX2xpYiA+PiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3NoYXJlZC1saWJzLmxpc3Q7IFwKLQlkb25lCi0JZ3JlcCAkKEhPU1RfT1VUX1RFU1RDQVNFUykgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9zaGFyZWQtbGlicy5saXN0ID4gJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9ob3N0LXNoYXJlZC1saWJzLmxpc3QgfHwgdHJ1ZQogCWNwIC1mcCAkKFBSSVZBVEVfVE9PTFMpICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvdG9vbHMvCiAJJChTT09OR19aSVApIC1kIC1vICRAIFwKIAkgIC1QIGhvc3QgLUMgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKSAtRCAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3Rvb2xzIFwKQEAgLTkyLDIxICs1MywxOSBAQAogCSQoU09PTkdfWklQKSAtZCAtbyAkKFBSSVZBVEVfZ2VuZXJhbF90ZXN0c19jb25maWdzX3ppcCkgXAogCSAgLVAgaG9zdCAtQyAkKEhPU1RfT1VUKSAtbCAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2hvc3QtdGVzdC1jb25maWdzLmxpc3QgXAogCSAgLVAgdGFyZ2V0IC1DICQoUFJPRFVDVF9PVVQpIC1sICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvdGFyZ2V0LXRlc3QtY29uZmlncy5saXN0Ci0JJChTT09OR19aSVApIC1kIC1vICQoUFJJVkFURV9nZW5lcmFsX2hvc3Rfc2hhcmVkX2xpYnNfemlwKSBcCi0JICAtUCBob3N0IC1DICQoSE9TVF9PVVQpIC1sICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvaG9zdC1zaGFyZWQtbGlicy5saXN0CiAJZ3JlcCAtZSAuKlxcLmNvbmZpZyQkICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvaG9zdC5saXN0IHwgc2VkIHMlJChIT1NUX09VVCklaG9zdCVnID4gJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9nZW5lcmFsLXRlc3RzX2xpc3QKIAlncmVwIC1lIC4qXFwuY29uZmlnJCQgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS90YXJnZXQubGlzdCB8IHNlZCBzJSQoUFJPRFVDVF9PVVQpJXRhcmdldCVnID4+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvZ2VuZXJhbC10ZXN0c19saXN0CiAJJChTT09OR19aSVApIC1kIC1vICQoUFJJVkFURV9nZW5lcmFsX3Rlc3RzX2xpc3RfemlwKSAtQyAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpIC1mICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvZ2VuZXJhbC10ZXN0c19saXN0CiAKIGdlbmVyYWwtdGVzdHM6ICQoZ2VuZXJhbF90ZXN0c196aXApCi0kKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGdlbmVyYWwtdGVzdHMsICQoZ2VuZXJhbF90ZXN0c196aXApICQoZ2VuZXJhbF90ZXN0c19saXN0X3ppcCkgJChnZW5lcmFsX3Rlc3RzX2NvbmZpZ3NfemlwKSAkKGdlbmVyYWxfdGVzdHNfaG9zdF9zaGFyZWRfbGlic196aXApKQorJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBnZW5lcmFsLXRlc3RzLCAkKGdlbmVyYWxfdGVzdHNfemlwKSAkKGdlbmVyYWxfdGVzdHNfbGlzdF96aXApICQoZ2VuZXJhbF90ZXN0c19jb25maWdzX3ppcCkgJChnZW5lcmFsX3Rlc3RzX3NoYXJlZF9saWJzX3ppcCkpCiAKICQoY2FsbCBkZWNsYXJlLTFwLWNvbnRhaW5lciwkKGdlbmVyYWxfdGVzdHNfemlwKSwpCi0kKGNhbGwgZGVjbGFyZS1jb250YWluZXItbGljZW5zZS1kZXBzLCQoZ2VuZXJhbF90ZXN0c196aXApLCQoQ09NUEFUSUJJTElUWS5nZW5lcmFsLXRlc3RzLkZJTEVTKSAkKGdlbmVyYWxfdGVzdHNfdG9vbHMpICQobXlfaG9zdF9zaGFyZWRfbGliX2Zvcl9nZW5lcmFsX3Rlc3RzKSwkKFBST0RVQ1RfT1VUKS86LykKKyQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJChnZW5lcmFsX3Rlc3RzX3ppcCksJChDT01QQVRJQklMSVRZLmdlbmVyYWwtdGVzdHMuRklMRVMpICQoZ2VuZXJhbF90ZXN0c190b29scyksJChQUk9EVUNUX09VVCkvOi8pCiAKIGludGVybWVkaWF0ZXNfZGlyIDo9CiBnZW5lcmFsX3Rlc3RzX3Rvb2xzIDo9CiBnZW5lcmFsX3Rlc3RzX3ppcCA6PQogZ2VuZXJhbF90ZXN0c19saXN0X3ppcCA6PQogZ2VuZXJhbF90ZXN0c19jb25maWdzX3ppcCA6PQotZ2VuZXJhbF90ZXN0c19ob3N0X3NoYXJlZF9saWJzX3ppcCA6PQorZ2VuZXJhbF90ZXN0c19zaGFyZWRfbGlic196aXAgOj0KZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvaG9zdC11bml0LXRlc3RzLm1rIGIvY29yZS90YXNrcy9ob3N0LXVuaXQtdGVzdHMubWsKaW5kZXggNzMzYTJlMi4uNGNiMjNjMCAxMDA2NDQKLS0tIGEvY29yZS90YXNrcy9ob3N0LXVuaXQtdGVzdHMubWsKKysrIGIvY29yZS90YXNrcy9ob3N0LXVuaXQtdGVzdHMubWsKQEAgLTI5LDE1ICsyOSwyOCBAQAogICAgICQoZXZhbCBfY21mX3NyYyA6PSAkKHdvcmQgMSwkKF9jbWZfdHVwbGUpKSkgXAogICAgICQoX2NtZl9zcmMpKSkKIAorbXlfc3ltbGlua3NfZm9yX2hvc3RfdW5pdF90ZXN0cyA6PSAkKGZvcmVhY2ggZiwkKENPTVBBVElCSUxJVFkuaG9zdC11bml0LXRlc3RzLlNZTUxJTktTKSxcCisJJChzdHJpcCAkKGV2YWwgX2NtZl90dXBsZSA6PSAkKHN1YnN0IDosICwkKGYpKSkgXAorCSQoZXZhbCBfY21mX2RlcCA6PSAkKHdvcmQgMSwkKF9jbWZfdHVwbGUpKSkgXAorCSQoZXZhbCBfY21mX3NyYyA6PSAkKHdvcmQgMiwkKF9jbWZfdHVwbGUpKSkgXAorCSQoZXZhbCBfY21mX2Rlc3QgOj0gJCh3b3JkIDMsJChfY21mX3R1cGxlKSkpIFwKKwkkKGNhbGwgc3ltbGluay1maWxlLCQoX2NtZl9kZXApLCQoX2NtZl9zcmMpLCQoX2NtZl9kZXN0KSkgXAorCSQoX2NtZl9kZXN0KSkpCisKICQoaG9zdF91bml0X3Rlc3RzX3ppcCkgOiBQUklWQVRFX0hPU1RfU0hBUkVEX0xJQlMgOj0gJChteV9ob3N0X3NoYXJlZF9saWJfZm9yX2hvc3RfdW5pdF90ZXN0cykKIAotJChob3N0X3VuaXRfdGVzdHNfemlwKSA6ICQoQ09NUEFUSUJJTElUWS5ob3N0LXVuaXQtdGVzdHMuRklMRVMpICQobXlfaG9zdF9zaGFyZWRfbGliX2Zvcl9ob3N0X3VuaXRfdGVzdHMpICQoU09PTkdfWklQKQorJChob3N0X3VuaXRfdGVzdHNfemlwKSA6IFBSSVZBVEVfU1lNTElOS1MgOj0gJChteV9zeW1saW5rc19mb3JfaG9zdF91bml0X3Rlc3RzKQorCiskKGhvc3RfdW5pdF90ZXN0c196aXApIDogJChDT01QQVRJQklMSVRZLmhvc3QtdW5pdC10ZXN0cy5GSUxFUykgJChteV9ob3N0X3NoYXJlZF9saWJfZm9yX2hvc3RfdW5pdF90ZXN0cykgJChteV9zeW1saW5rc19mb3JfaG9zdF91bml0X3Rlc3RzKSAkKFNPT05HX1pJUCkKIAllY2hvICQoc29ydCAkKENPTVBBVElCSUxJVFkuaG9zdC11bml0LXRlc3RzLkZJTEVTKSkgfCB0ciAiICIgIlxuIiA+ICRALmxpc3QKIAlncmVwICQoSE9TVF9PVVRfVEVTVENBU0VTKSAkQC5saXN0ID4gJEAtaG9zdC5saXN0IHx8IHRydWUKIAllY2hvICIiID4+ICRALWhvc3QtbGlicy5saXN0CiAJJChoaWRlKSBmb3Igc2hhcmVkX2xpYiBpbiAkKFBSSVZBVEVfSE9TVF9TSEFSRURfTElCUyk7IGRvIFwKIAkgIGVjaG8gJCRzaGFyZWRfbGliID4+ICRALWhvc3QtbGlicy5saXN0OyBcCiAJZG9uZQorCSQoaGlkZSkgZm9yIHN5bWxpbmsgaW4gJChQUklWQVRFX1NZTUxJTktTKTsgZG8gXAorCSAgZWNobyAkJHN5bWxpbmsgPj4gJEAtaG9zdC5saXN0OyBcCisJZG9uZQogCWdyZXAgJChUQVJHRVRfT1VUX1RFU1RDQVNFUykgJEAubGlzdCA+ICRALXRhcmdldC5saXN0IHx8IHRydWUKIAkkKGhpZGUpICQoU09PTkdfWklQKSAtZCAtbyAkQCAtUCBob3N0IC1DICQoSE9TVF9PVVQpIC1sICRALWhvc3QubGlzdCBcCiAJICAtUCB0YXJnZXQgLUMgJChQUk9EVUNUX09VVCkgLWwgJEAtdGFyZ2V0Lmxpc3QgXApkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9pZGUubWsgYi9jb3JlL3Rhc2tzL2lkZS5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNhYTBjZC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rhc2tzL2lkZS5taworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLWRlZmluZSBmaWx0ZXItaWRlLWdvYWxzCi0kKHN0cmlwICQoZmlsdGVyICQoMSktJSwkKE1BS0VDTURHT0FMUykpKQotZW5kZWYKLQotZGVmaW5lIGZpbHRlci1pZGUtbW9kdWxlcwotJChzdHJpcCAkKHN1YnN0IC0sJChzcGFjZSksJChwYXRzdWJzdCAkKDEpLSUsJSwkKDIpKSkpCi1lbmRlZgotCi0jIGVjbGlwc2UKLWVjbGlwc2VfcHJvamVjdF9nb2FscyA6PSAkKGNhbGwgZmlsdGVyLWlkZS1nb2FscyxFQ0xJUFNFKQotaWZkZWYgZWNsaXBzZV9wcm9qZWN0X2dvYWxzCi0gIGlmbmVxICgkKHdvcmRzICQoZWNsaXBzZV9wcm9qZWN0X2dvYWxzKSksMSkKLSAgICAkKGVycm9yIE9ubHkgb25lIEVDTElQU0UtIGdvYWwgbWF5IGJlIHNwZWNpZmllZDogJChlY2xpcHNlX3Byb2plY3RfZ29hbHMpKQotICBlbmRpZgotICBlY2xpcHNlX3Byb2plY3RfbW9kdWxlcyA6PSAkKGNhbGwgZmlsdGVyLWlkZS1tb2R1bGVzLEVDTElQU0UsJChlY2xpcHNlX3Byb2plY3RfZ29hbHMpKQotCi0gIGlmbmVxICgkKGZpbHRlciBsdW5jaCwkKGVjbGlwc2VfcHJvamVjdF9tb2R1bGVzKSksKQotICAgIGVjbGlwc2VfcHJvamVjdF9tb2R1bGVzIDo9ICQoZmlsdGVyLW91dCBsdW5jaCwkKGVjbGlwc2VfcHJvamVjdF9tb2R1bGVzKSkKLSAgICBpbnN0YWxsZWRfbW9kdWxlcyA6PSAkKGZvcmVhY2ggbSwkKEFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTKSxcCi0gICAgICAgICQoSU5TVEFMTEFCTEVfRklMRVMuJChtKS5NT0RVTEUpKQotICAgIGphdmFfbW9kdWxlcyA6PSAkKGZvcmVhY2ggbSwkKGluc3RhbGxlZF9tb2R1bGVzKSxcCi0gICAgICAgICQoaWYgJChmaWx0ZXIgSkFWQV9MSUJSQVJJRVMgQVBQUywkKEFMTF9NT0RVTEVTLiQobSkuQ0xBU1MpKSwkKG0pLCkpCi0gICAgZWNsaXBzZV9wcm9qZWN0X21vZHVsZXMgOj0gJChzb3J0ICQoZWNsaXBzZV9wcm9qZWN0X21vZHVsZXMpICQoamF2YV9tb2R1bGVzKSkKLSAgZW5kaWYKLQotICBzb3VyY2VfcGF0aHMgOj0gJChmb3JlYWNoIG0sJChlY2xpcHNlX3Byb2plY3RfbW9kdWxlcyksJChBTExfTU9EVUxFUy4kKG0pLlBBVEgpKSBcCi0gICAgICAgICAgICAgICQoZm9yZWFjaCBtLCQoZWNsaXBzZV9wcm9qZWN0X21vZHVsZXMpLCQoQUxMX01PRFVMRVMuJChtKS5JTlRFUk1FRElBVEVfU09VUkNFX0RJUikpCi0gIHNvdXJjZV9wYXRocyA6PSAkKHNvcnQgJChzb3VyY2VfcGF0aHMpKQotCi0uY2xhc3NwYXRoOiBQUklWQVRFX01PRFVMRVMgOj0gJChlY2xpcHNlX3Byb2plY3RfbW9kdWxlcykKLS5jbGFzc3BhdGg6IFBSSVZBVEVfRElSUyA6PSAkKHNvdXJjZV9wYXRocykKLQotIyB0aGUgbWVzcyBiZWxvdyB3aXRoIC4vc3JjIHRyaWVzIHRvIGd1ZXNzIHdoZXRoZXIgdGhlIHNyYwotJChlY2xpcHNlX3Byb2plY3RfZ29hbHMpOiAuY2xhc3NwYXRoCi0uY2xhc3NwYXRoOiBGT1JDRQotCSQoaGlkZSkgZWNobyBHZW5lcmF0aW5nIC5jbGFzc3BhdGggZm9yIGVjbGlwc2UKLQkkKGhpZGUpIGVjaG8gJzxjbGFzc3BhdGg+JyA+ICRACi0JJChoaWRlKSBmb3IgcCBpbiAkKFBSSVZBVEVfRElSUykgOyBkbyBcCi0JCWVjaG8gLW4gJyAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iJyA+PiAkQCA7IFwKLQkJKCBpZiBbIC1kICQkcC9zcmMgXSA7IHRoZW4gZWNobyAtbiAkJHAvc3JjIDsgZWxzZSBlY2hvIC1uICQkcCA7IGZpICkgPj4gJEAgOyBcCi0JCWVjaG8gJyIvPicgPj4gJEAgOyBcCi0JZG9uZQotCSQoaGlkZSkgZWNobyAnPC9jbGFzc3BhdGg+JyA+PiAkQAotZW5kaWYKLQpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9tY3RzLm1rIGIvY29yZS90YXNrcy9tY3RzLm1rCmluZGV4IDZhNTYyMjguLjAyZTkxNmEgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3MvbWN0cy5taworKysgYi9jb3JlL3Rhc2tzL21jdHMubWsKQEAgLTEsNCArMSw0IEBACi0jIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNSwxOCArMTUsMjkgQEAKIGlmbmVxICgkKHdpbGRjYXJkIHRlc3QvbXRzL1JFQURNRS5tZCksKQogCiBtY3RzX3Rlc3Rfc3VpdGVzIDo9Ci1tY3RzX3Rlc3Rfc3VpdGVzICs9IG1jdHMKK21jdHNfYWxsX3Rlc3Rfc3VpdGVzIDo9CittY3RzX2FsbF90ZXN0X3N1aXRlcyArPSBtY3RzCiAKICQoZm9yZWFjaCBtb2R1bGUsICQobXRzX21vZHVsZXMpLCAkKGV2YWwgbWN0c190ZXN0X3N1aXRlcyArPSBtY3RzLSQobW9kdWxlKSkpCiAKICQoZm9yZWFjaCBzdWl0ZSwgJChtY3RzX3Rlc3Rfc3VpdGVzKSwgXAotICAgICAgICAkKGV2YWwgdGVzdF9zdWl0ZV9uYW1lIDo9ICQoc3VpdGUpKSBcCi0gICAgICAgICQoZXZhbCB0ZXN0X3N1aXRlX3RyYWRlZmVkIDo9IG10cy10cmFkZWZlZCkgXAotICAgICAgICAkKGV2YWwgdGVzdF9zdWl0ZV9yZWFkbWUgOj0gdGVzdC9tdHMvUkVBRE1FLm1kKSBcCi0gICAgICAgICQoZXZhbCBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS90YXNrcy90b29scy9jb21wYXRpYmlsaXR5Lm1rKSBcCi0gICAgICAgICQoZXZhbCAuUEhPTlk6ICQoc3VpdGUpKSBcCi0gICAgICAgICQoZXZhbCAkKHN1aXRlKTogJChjb21wYXRpYmlsaXR5X3ppcCkpIFwKLSAgICAgICAgJChldmFsICQoY2FsbCBkaXN0LWZvci1nb2FscywgJChzdWl0ZSksICQoY29tcGF0aWJpbGl0eV96aXApKSkgXAorCSQoZXZhbCB0ZXN0X3N1aXRlX25hbWUgOj0gJChzdWl0ZSkpIFwKKwkkKGV2YWwgdGVzdF9zdWl0ZV90cmFkZWZlZCA6PSBtdHMtdHJhZGVmZWQpIFwKKwkkKGV2YWwgdGVzdF9zdWl0ZV9yZWFkbWUgOj0gdGVzdC9tdHMvUkVBRE1FLm1kKSBcCisJJChldmFsIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Rhc2tzL3Rvb2xzL2NvbXBhdGliaWxpdHkubWspIFwKKwkkKGV2YWwgLlBIT05ZOiAkKHN1aXRlKSkgXAorCSQoZXZhbCAkKHN1aXRlKTogJChjb21wYXRpYmlsaXR5X3ppcCkpIFwKKwkkKGV2YWwgJChjYWxsIGRpc3QtZm9yLWdvYWxzLCAkKHN1aXRlKSwgJChjb21wYXRpYmlsaXR5X3ppcCkpKSBcCispCisKKyQoZm9yZWFjaCBzdWl0ZSwgJChtY3RzX2FsbF90ZXN0X3N1aXRlcyksIFwKKwkkKGV2YWwgdGVzdF9zdWl0ZV9uYW1lIDo9ICQoc3VpdGUpKSBcCisJJChldmFsIHRlc3Rfc3VpdGVfdHJhZGVmZWQgOj0gbWN0cy10cmFkZWZlZCkgXAorCSQoZXZhbCB0ZXN0X3N1aXRlX3JlYWRtZSA6PSB0ZXN0L210cy9SRUFETUUubWQpIFwKKwkkKGV2YWwgaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvdGFza3MvdG9vbHMvY29tcGF0aWJpbGl0eS5taykgXAorCSQoZXZhbCAuUEhPTlk6ICQoc3VpdGUpKSBcCisJJChldmFsICQoc3VpdGUpOiAkKGNvbXBhdGliaWxpdHlfemlwKSkgXAorCSQoZXZhbCAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsICQoc3VpdGUpLCAkKGNvbXBhdGliaWxpdHlfemlwKSkpIFwKICkKIAogZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvbWV0YS1saWMubWsgYi9jb3JlL3Rhc2tzL21ldGEtbGljLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMGIxZTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rhc2tzL21ldGEtbGljLm1rCkBAIC0wLDAgKzEsMjMwIEBACisjIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIERlY2xhcmUgbGljZW5zZSBtZXRhZGF0YSBmb3Igbm9uLW1vZHVsZSBmaWxlcyByZWxlYXNlZCB3aXRoIHByb2R1Y3RzLgorCisjIE1vdmVkIGhlcmUgZnJvbSBkZXZpY2UvZ2VuZXJpYy9jYXIvQW5kcm9pZC5taworJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dlbmVyaWMvY2FyLCkpCisKKyMgTW92ZWQgaGVyZSBmcm9tIGRldmljZS9nZW5lcmljL3RydXN0eS9BbmRyb2lkLm1rCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ2VuZXJpYy90cnVzdHksKSkKKworIyBNb3ZlZCBoZXJlIGZyb20gZGV2aWNlL2dlbmVyaWMvdW1sL0FuZHJvaWQubWsKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nZW5lcmljL3VtbCwpKQorCisjIE1vdmVkIGhlcmUgZnJvbSBkZXZpY2UvZ29vZ2xlX2Nhci9jb21tb24vQW5kcm9pZC5taworJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dvb2dsZV9jYXIvY29tbW9uLCkpCisKKyMgTW92ZWQgaGVyZSBmcm9tIGRldmljZS9nb29nbGUvYXR2L0FuZHJvaWQubWsKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nb29nbGUvYXR2LGF0di1jb21wb25lbnQtb3ZlcnJpZGVzLnhtbCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ29vZ2xlL2F0dix0dl9jb3JlX2hhcmR3YXJlLnhtbCkpCisKKyMgTW92ZWQgaGVyZSBmcm9tIGRldmljZS9nb29nbGUvYnJhbWJsZS9BbmRyb2lkLm1rCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvYnJhbWJsZSxkZWZhdWx0LXBlcm1pc3Npb25zLnhtbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvYnJhbWJsZSxsaWJuZmMtbmNpLmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2JyYW1ibGUsZnN0YWIucG9zdGluc3RhbGwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2JyYW1ibGUsdWV2ZW50ZC5yYyxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvYnJhbWJsZSx3cGFfc3VwcGxpY2FudC5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9icmFtYmxlLGhhbHMuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvYnJhbWJsZSxtZWRpYV9wcm9maWxlc19WMV8wLnhtbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvYnJhbWJsZSxtZWRpYV9jb2RlY3NfcGVyZm9ybWFuY2UueG1sLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9icmFtYmxlLGRldmljZV9zdGF0ZV9jb25maWd1cmF0aW9uLnhtbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvYnJhbWJsZSx0YXNrX3Byb2ZpbGVzLmpzb24sU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2JyYW1ibGUscDJwX3N1cHBsaWNhbnQuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvYnJhbWJsZSx3cGFfc3VwcGxpY2FudC5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9icmFtYmxlLHdwYV9zdXBwbGljYW50X292ZXJsYXkuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCisKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nb29nbGUvYnJhbWJsZSxhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwpKQorCisjIE1vdmVkIGhlcmUgZnJvbSBkZXZpY2UvZ29vZ2xlL2JhcmJldC9BbmRyb2lkLm1rCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvYmFyYmV0LGRlZmF1bHQtcGVybWlzc2lvbnMueG1sLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9iYXJiZXQsbGlibmZjLW5jaS5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9iYXJiZXQsZnN0YWIucG9zdGluc3RhbGwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2JhcmJldCx1ZXZlbnRkLnJjLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9iYXJiZXQsd3BhX3N1cHBsaWNhbnQuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvYmFyYmV0LGhhbHMuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvYmFyYmV0LG1lZGlhX3Byb2ZpbGVzX1YxXzAueG1sLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9iYXJiZXQsbWVkaWFfY29kZWNzX3BlcmZvcm1hbmNlLnhtbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvYmFyYmV0LGRldmljZV9zdGF0ZV9jb25maWd1cmF0aW9uLnhtbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvYmFyYmV0LHRhc2tfcHJvZmlsZXMuanNvbixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvYmFyYmV0LHAycF9zdXBwbGljYW50LmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2JhcmJldCx3cGFfc3VwcGxpY2FudC5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9iYXJiZXQsd3BhX3N1cHBsaWNhbnRfb3ZlcmxheS5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKworJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dvb2dsZS9iYXJiZXQsYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sKSkKKworIyBNb3ZlZCBoZXJlIGZyb20gZGV2aWNlL2dvb2dsZS9jb3JhbC9BbmRyb2lkLm1rCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY29yYWwsZGVmYXVsdC1wZXJtaXNzaW9ucy54bWwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2NvcmFsLGxpYm5mYy1uY2kuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY29yYWwsZnN0YWIucG9zdGluc3RhbGwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2NvcmFsLHVldmVudGQucmMsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2NvcmFsLHdwYV9zdXBwbGljYW50LmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2NvcmFsLGhhbHMuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY29yYWwsbWVkaWFfcHJvZmlsZXNfVjFfMC54bWwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2NvcmFsLG1lZGlhX2NvZGVjc19wZXJmb3JtYW5jZS54bWwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2NvcmFsLGRldmljZV9zdGF0ZV9jb25maWd1cmF0aW9uLnhtbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY29yYWwsdGFza19wcm9maWxlcy5qc29uLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jb3JhbCxwMnBfc3VwcGxpY2FudC5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jb3JhbCx3cGFfc3VwcGxpY2FudC5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jb3JhbCx3cGFfc3VwcGxpY2FudF9vdmVybGF5LmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2NvcmFsLGRpc3BsYXlfMTkyNjExMzI1NTA2NTQ1OTMueG1sLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKworJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dvb2dsZS9jb3JhbCxhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dvb2dsZS9jb3JhbCxkaXNwbGF5XzE5MjYwNTA0NTc1MDkwODE3LnhtbCkpCisKKyMgTW92ZWQgaGVyZSBmcm9tIGRldmljZS9nb29nbGUvY3V0dGxlZmlzaC9BbmRyb2lkLm1rCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCwuaWRjLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLGRlZmF1bHQtcGVybWlzc2lvbnMueG1sLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLGxpYm5mYy1uY2kuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCxmc3RhYi5wb3N0aW5zdGFsbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCx1ZXZlbnRkLnJjLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLHdwYV9zdXBwbGljYW50LmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gsaGFscy5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLGRldmljZV9zdGF0ZV9jb25maWd1cmF0aW9uLnhtbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCxwMnBfc3VwcGxpY2FudC5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLHdwYV9zdXBwbGljYW50LmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gsd3BhX3N1cHBsaWNhbnRfb3ZlcmxheS5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLHdwYV9zdXBwbGljYW50LnJjLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLGluaXQuY3V0Zl9jdm0ucmMsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gsZnN0YWIuY2YuZjJmcy5oY3RyMixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCxmc3RhYi5jZi5mMmZzLmN0cyxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCxmc3RhYi5jZi5leHQ0LmhjdHIyLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLGZzdGFiLmNmLmV4dDQuY3RzLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLGluaXQucmMsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gsYXVkaW9fcG9saWN5LmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaC9zaGFyZWQvY29uZmlnLHBjaS5pZHMsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQlNELTMtQ2xhdXNlLG5vdGljZSxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gvc2hhcmVkL2NvbmZpZy9MSUNFTlNFX0JTRCwpKQorCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gscHJpdmFwcC1wZXJtaXNzaW9ucy1jdXR0bGVmaXNoLnhtbCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gsbWVkaWFfcHJvZmlsZXNfVjFfMC54bWwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLG1lZGlhX2NvZGVjc19wZXJmb3JtYW5jZS54bWwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLGN1dHRsZWZpc2hfZXhjbHVkZWRfaGFyZHdhcmUueG1sKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCxtZWRpYV9jb2RlY3MueG1sKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCxtZWRpYV9jb2RlY3NfZ29vZ2xlX3ZpZGVvLnhtbCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ29vZ2xlL2N1dHRsZWZpc2gsY2FyX2F1ZGlvX2NvbmZpZ3VyYXRpb24ueG1sKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nb29nbGUvY3V0dGxlZmlzaCxhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dvb2dsZS9jdXR0bGVmaXNoLHByZWluc3RhbGxlZC1wYWNrYWdlcy1wcm9kdWN0LWNhci1jdXR0bGVmaXNoLnhtbCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxoYXJkd2FyZS9nb29nbGUvY2FtZXJhL2RldmljZXMsLmpzb24pKQorCisjIE1vdmVkIGhlcmUgZnJvbSBkZXZpY2UvZ29vZ2xlL2dzMTAxL0FuZHJvaWQubWsKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9nczEwMSxkZWZhdWx0LXBlcm1pc3Npb25zLnhtbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvZ3MxMDEsbGlibmZjLW5jaS5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9nczEwMSxmc3RhYi5wb3N0aW5zdGFsbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvZ3MxMDEsdWV2ZW50ZC5yYyxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvZ3MxMDEsd3BhX3N1cHBsaWNhbnQuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvZ3MxMDEsaGFscy5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9nczEwMSxtZWRpYV9wcm9maWxlc19WMV8wLnhtbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvZ3MxMDEsbWVkaWFfY29kZWNzX3BlcmZvcm1hbmNlLnhtbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvZ3MxMDEsZGV2aWNlX3N0YXRlX2NvbmZpZ3VyYXRpb24ueG1sLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9nczEwMSx0YXNrX3Byb2ZpbGVzLmpzb24sU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL2dzMTAxLHAycF9zdXBwbGljYW50X292ZXJsYXkuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvZ3MxMDEsd3BhX3N1cHBsaWNhbnQuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvZ3MxMDEsd3BhX3N1cHBsaWNhbnRfb3ZlcmxheS5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKworJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dvb2dsZS9nczEwMSxhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwpKQorCisjIE1vdmUgaGVyZSBmcm9tIGRldmljZS9nb29nbGUvcmF2aW9sZS9BbmRyb2lkLm1rCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvcmF2aW9sZSxkZWZhdWx0LXBlcm1pc3Npb25zLnhtbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvcmF2aW9sZSxsaWJuZmMtbmNpLXJhdmVuLmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL3JhdmlvbGUsbGlibmZjLW5jaS5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9yYXZpb2xlLGZzdGFiLnBvc3RpbnN0YWxsLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9yYXZpb2xlLHVldmVudGQucmMsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL3JhdmlvbGUsd3BhX3N1cHBsaWNhbnQuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvcmF2aW9sZSxoYWxzLmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL3JhdmlvbGUsbWVkaWFfcHJvZmlsZXNfVjFfMC54bWwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL3JhdmlvbGUsbWVkaWFfY29kZWNzX3BlcmZvcm1hbmNlLnhtbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvcmF2aW9sZSxkZXZpY2Vfc3RhdGVfY29uZmlndXJhdGlvbi54bWwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL3JhdmlvbGUsdGFza19wcm9maWxlcy5qc29uLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9yYXZpb2xlLHAycF9zdXBwbGljYW50LmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL3JhdmlvbGUsd3BhX3N1cHBsaWNhbnQuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvcmF2aW9sZSx3cGFfc3VwcGxpY2FudF9vdmVybGF5LmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ29vZ2xlL3JhdmlvbGUsYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sKSkKKworIyBNb3ZlZCBoZXJlIGZyb20gZGV2aWNlL2dvb2dsZS9yZWRmaW4vQW5kcm9pZC5taworJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL3JlZGZpbixkZWZhdWx0LXBlcm1pc3Npb25zLnhtbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvcmVkZmluLGxpYm5mYy1uY2kuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvcmVkZmluLGZzdGFiLnBvc3RpbnN0YWxsLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9yZWRmaW4sdWV2ZW50ZC5yYyxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvcmVkZmluLHdwYV9zdXBwbGljYW50LmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL3JlZGZpbixoYWxzLmNvbmYsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL3JlZGZpbixtZWRpYV9wcm9maWxlc19WMV8wLnhtbCxTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvcmVkZmluLG1lZGlhX2NvZGVjc19wZXJmb3JtYW5jZS54bWwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL3JlZGZpbixkZXZpY2Vfc3RhdGVfY29uZmlndXJhdGlvbi54bWwsU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL3JlZGZpbix0YXNrX3Byb2ZpbGVzLmpzb24sU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCxub3RpY2UsYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLWNvcHktZmlsZXMtbGljZW5zZS1tZXRhZGF0YSxkZXZpY2UvZ29vZ2xlL3JlZGZpbixwMnBfc3VwcGxpY2FudC5jb25mLFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAsbm90aWNlLGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS1jb3B5LWZpbGVzLWxpY2Vuc2UtbWV0YWRhdGEsZGV2aWNlL2dvb2dsZS9yZWRmaW4sd3BhX3N1cHBsaWNhbnQuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtY29weS1maWxlcy1saWNlbnNlLW1ldGFkYXRhLGRldmljZS9nb29nbGUvcmVkZmluLHdwYV9zdXBwbGljYW50X292ZXJsYXkuY29uZixTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wLG5vdGljZSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFLCkpCisKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nb29nbGUvcmVkZmluLGF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCkpCisKKyMgTW92ZWQgaGVyZSBmcm9tIGRldmljZS9zYW1wbGUvQW5kcm9pZC5taworJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL3NhbXBsZSwpKQorCisjIE1vdmVkIGhlcmUgZnJvbSBkZXZpY2UvZ29vZ2xlL3Ryb3V0L0FuZHJvaWQubWsKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nb29nbGUvdHJvdXQsKSkKKworIyBNb3ZlZCBoZXJlIGZyb20gZnJhbWV3b3Jrcy9hdi9tZWRpYS9BbmRyb2lkLm1rCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMsYXVkaW9fZWZmZWN0cy5jb25mKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cyxhdWRpb19lZmZlY3RzLnhtbCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0LCkpCisKKyMgTW92ZWQgaGVyZSBmcm9tIGZyYW1ld29ya3MvYXYvc2VydmljZXMvQW5kcm9pZC5taworJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeSwpKQorCisjIE1vdmVkIGhlcmUgZnJvbSBmcmFtZXdvcmtzL2Jhc2UvQW5kcm9pZC5taworJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZnJhbWV3b3Jrcy9iYXNlLC5vZ2cpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZnJhbWV3b3Jrcy9iYXNlLC5rbCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxmcmFtZXdvcmtzL2Jhc2UsLmtjbSkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxmcmFtZXdvcmtzL2Jhc2UsLmlkYykpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxmcmFtZXdvcmtzL2Jhc2UsZGlydHktaW1hZ2Utb2JqZWN0cykpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxmcmFtZXdvcmtzL2Jhc2UvY29uZmlnLCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxmcmFtZXdvcmtzL25hdGl2ZS9kYXRhLCkpCisKKyMgTW92ZWQgaGVyZSBmcm9tIGhhcmR3YXJlL2dvb2dsZS9jYW1lcmEvQW5kcm9pZC5taworJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsaGFyZHdhcmUvZ29vZ2xlL2NhbWVyYSwpKQorCisjIE1vdmVkIGhlcmUgZnJvbSBoYXJkd2FyZS9pbnRlcmZhY2VzL3R2L0FuZHJvaWQubWsKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGhhcmR3YXJlL2ludGVyZmFjZXMvdHYsdHVuZXJfdnRzX2NvbmZpZ18xXzAueG1sKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGhhcmR3YXJlL2ludGVyZmFjZXMvdHYsdHVuZXJfdnRzX2NvbmZpZ18xXzEueG1sKSkKKworIyBNb3ZlZCBoZXJlIGZyb20gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvQW5kcm9pZC5taworJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvZGF0YSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvaW5wdXQsKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nZW5lcmljL2dvbGRmaXNoL3dpZmksKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2NhbWVyYSwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gsaGFscy5jb25mKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nZW5lcmljL2dvbGRmaXNoLGluaXQucWVtdS1hZGIta2V5cy5zaCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaCxpbml0LnN5c3RlbV9leHQucmMpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gsLmpzb24pKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gsdWV2ZW50ZC5yYykpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaCx3cGFfc3VwcGxpY2FudC5jb25mKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nZW5lcmljL2dvbGRmaXNoLG1lZGlhX3Byb2ZpbGVzX1YxXzAueG1sKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nZW5lcmljL2dvbGRmaXNoLGluaXQucmFuY2h1LnJjKSkKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLGRldmljZS9nZW5lcmljL2dvbGRmaXNoLGZzdGFiLnJhbmNodSkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaCxkaXNwbGF5X3NldHRpbmdzLnhtbCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaCxkaXNwbGF5X3NldHRpbmdzX2ZyZWVmb3JtLnhtbCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaCxkZXZpY2Vfc3RhdGVfY29uZmlndXJhdGlvbi54bWwpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gsaW5pdC5yYW5jaHUtY29yZS5zaCkpCiskKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtY29weS1maWxlcyxkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaCxpbml0LnJhbmNodS1uZXQuc2gpKQorJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gsYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sKSkKKworIyBNb3ZlZCBoZXJlIGZyb20gcGFja2FnZXMvc2VydmljZXMvQ2FyL0FuZHJvaWQubWsKKyQoZXZhbCAkKGNhbGwgZGVjbGFyZS0xcC1jb3B5LWZpbGVzLHBhY2thZ2VzL3NlcnZpY2VzL0NhciwpKQorCisjIE1vdmVkIGhlcmUgZnJvbSBoYXJkd2FyZS9saWJoYXJkd2FyZV9sZWdhY3kvQW5kcm9pZC5taworJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsaGFyZHdhcmUvbGliaGFyZHdhcmVfbGVnYWN5LCkpCisKKyMgTW92ZWQgaGVyZSBmcm9tIHN5c3RlbS9jb3JlL3Jvb3RkaXIvQW5kcm9pZC5taworJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsc3lzdGVtL2NvcmUvcm9vdGRpciwpKQpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9ta2UyZnMtZGlzdC5tayBiL2NvcmUvdGFza3MvbWtlMmZzLWRpc3QubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0MGMxZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGFza3MvbWtlMmZzLWRpc3QubWsKQEAgLTAsMCArMSwyMiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMjQgR29vZ2xlIEluYy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgVE9ETzogQWZ0ZXIgU29vbmcncyByZWNvdmVyeSBwYXJ0aXRpb24gdmFyaWF0aW9uIGNhbiBiZSBzZXQgdG8gc2VsZWN0YWJsZQorIyAgICAgICBhbmQgdGhlIG1ldGFfbGljIGZpbGUgZHVwbGljYXRpb24gaXNzdWUgaXMgcmVzb2x2ZWQsIG1vdmUgaXQgdG8gdGhlCisjICAgICAgIGRpc3Qgc2VjdGlvbiBvZiB0aGUgY29ycmVzcG9uZGluZyBtb2R1bGUncyBBbmRyb2lkLmJwLgorbXlfZGlzdF9maWxlcyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9ta2UyZnMKK215X2Rpc3RfZmlsZXMgKz0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWFrZV9mMmZzCitteV9kaXN0X2ZpbGVzICs9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL21ha2VfZjJmc19jYXNlZm9sZAorJChjYWxsIGRpc3QtZm9yLWdvYWxzLGRpc3RfZmlsZXMgc2RrLCQobXlfZGlzdF9maWxlcykpCitteV9kaXN0X2ZpbGVzIDo9CmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL21vZHVsZS1pbmZvLm1rIGIvY29yZS90YXNrcy9tb2R1bGUtaW5mby5tawppbmRleCBlODNkNDA4Li5kZDAxZjk2IDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL21vZHVsZS1pbmZvLm1rCisrKyBiL2NvcmUvdGFza3MvbW9kdWxlLWluZm8ubWsKQEAgLTIsNDAgKzIsNjIgQEAKICMgQ3VycmVudGx5IHJ1bnRpbWVfZGVwZW5kZW5jaWVzIG9ubHkgaW5jbHVkZSB0aGUgcnVudGltZSBsaWJzIGluZm9ybWF0aW9uIGZvciBjYyBiaW5hcmllcy4KIAogTU9EVUxFX0lORk9fSlNPTiA6PSAkKFBST0RVQ1RfT1VUKS9tb2R1bGUtaW5mby5qc29uCitDT01NQSA6PSAsCitfTkVXTElORSA6PSAnXG4nCiAKLSQoTU9EVUxFX0lORk9fSlNPTik6CitkZWZpbmUgd3JpdGUtb3B0aW9uYWwtanNvbi1saXN0CiskKGlmICQoc3RyaXAgJCgyKSksJyQoQ09NTUEpJChzdHJpcCAkKDEpKTogWyQoS0FUSV9mb3JlYWNoX3NlcCB3LCQoQ09NTUEpICwkKDIpLCIkKHcpIildJykKK2VuZGVmCisKK2RlZmluZSB3cml0ZS1vcHRpb25hbC1qc29uLWJvb2wKKyQoaWYgJChzdHJpcCAkKDIpKSwnJChDT01NQSkkKHN0cmlwICQoMSkpOiAiJChzdHJpcCAkKDIpKSInKQorZW5kZWYKKworU09PTkdfTU9EVUxFX0lORk8gOj0gJChTT09OR19PVVRfRElSKS9tb2R1bGUtaW5mby0kKFRBUkdFVF9QUk9EVUNUKSR7Q09WRVJBR0VfU1VGRklYfS5qc29uCisKKyQoTU9EVUxFX0lORk9fSlNPTik6IFBSSVZBVEVfU09PTkdfTU9EVUxFX0lORk8gOj0gJChTT09OR19NT0RVTEVfSU5GTykKKyQoTU9EVUxFX0lORk9fSlNPTik6IFBSSVZBVEVfTUVSR0VfSlNPTl9PQkpFQ1RTIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL21lcmdlX21vZHVsZV9pbmZvX2pzb24KKyQoTU9EVUxFX0lORk9fSlNPTik6ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL21lcmdlX21vZHVsZV9pbmZvX2pzb24KKyQoTU9EVUxFX0lORk9fSlNPTik6ICQoU09PTkdfTU9EVUxFX0lORk8pCiAJQGVjaG8gR2VuZXJhdGluZyAkQAotCSQoaGlkZSkgZWNobyAtbmUgJ3tcbiAnID4gJEAKLQkkKGhpZGUpIGVjaG8gLW5lICQoZm9yZWFjaCBtLCAkKHNvcnQgJChBTExfTU9EVUxFUykpLCBcCi0JCScgIiQobSkiOiB7JyBcCi0JCQknImNsYXNzIjogWyQoZm9yZWFjaCB3LCQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuQ0xBU1MpKSwiJCh3KSIsICldLCAnIFwKLQkJCScicGF0aCI6IFskKGZvcmVhY2ggdywkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLlBBVEgpKSwiJCh3KSIsICldLCAnIFwKLQkJCScidGFncyI6IFskKGZvcmVhY2ggdywkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLlRBR1MpKSwiJCh3KSIsICldLCAnIFwKLQkJCSciaW5zdGFsbGVkIjogWyQoZm9yZWFjaCB3LCQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuSU5TVEFMTEVEKSksIiQodykiLCApXSwgJyBcCi0JCQknImNvbXBhdGliaWxpdHlfc3VpdGVzIjogWyQoZm9yZWFjaCB3LCQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuQ09NUEFUSUJJTElUWV9TVUlURVMpKSwiJCh3KSIsICldLCAnIFwKLQkJCSciYXV0b190ZXN0X2NvbmZpZyI6IFskKEFMTF9NT0RVTEVTLiQobSkuYXV0b190ZXN0X2NvbmZpZyldLCAnIFwKLQkJCScibW9kdWxlX25hbWUiOiAiJChBTExfTU9EVUxFUy4kKG0pLk1PRFVMRV9OQU1FKSIsICcgXAotCQkJJyJ0ZXN0X2NvbmZpZyI6IFskKGZvcmVhY2ggdywkKHN0cmlwICQoQUxMX01PRFVMRVMuJChtKS5URVNUX0NPTkZJRykgJChBTExfTU9EVUxFUy4kKG0pLkVYVFJBX1RFU1RfQ09ORklHUykpLCIkKHcpIiwgKV0sICcgXAotCQkJJyJkZXBlbmRlbmNpZXMiOiBbJChmb3JlYWNoIHcsJChzb3J0ICQoQUxMX0RFUFMuJChtKS5BTExfREVQUykpLCIkKHcpIiwgKV0sICcgXAotCQkJJyJzaGFyZWRfbGlicyI6IFskKGZvcmVhY2ggdywkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLlNIQVJFRF9MSUJTKSksIiQodykiLCApXSwgJyBcCi0JCQknInN5c3RlbV9zaGFyZWRfbGlicyI6IFskKGZvcmVhY2ggdywkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLlNZU1RFTV9TSEFSRURfTElCUykpLCIkKHcpIiwgKV0sICcgXAotCQkJJyJzcmNzIjogWyQoZm9yZWFjaCB3LCQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuU1JDUykpLCIkKHcpIiwgKV0sICcgXAotCQkJJyJzcmNqYXJzIjogWyQoZm9yZWFjaCB3LCQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuU1JDSkFSUykpLCIkKHcpIiwgKV0sICcgXAotCQkJJyJjbGFzc2VzX2phciI6IFskKGZvcmVhY2ggdywkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLkNMQVNTRVNfSkFSKSksIiQodykiLCApXSwgJyBcCi0JCQknInRlc3RfbWFpbmxpbmVfbW9kdWxlcyI6IFskKGZvcmVhY2ggdywkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLlRFU1RfTUFJTkxJTkVfTU9EVUxFUykpLCIkKHcpIiwgKV0sICcgXAotCQkJJyJpc191bml0X3Rlc3QiOiAiJChBTExfTU9EVUxFUy4kKG0pLklTX1VOSVRfVEVTVCkiLCAnIFwKLQkJCScidGVzdF9vcHRpb25zX3RhZ3MiOiBbJChmb3JlYWNoIHcsJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5URVNUX09QVElPTlNfVEFHUykpLCIkKHcpIiwgKV0sICcgXAotCQkJJyJkYXRhIjogWyQoZm9yZWFjaCB3LCQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuVEVTVF9EQVRBKSksIiQodykiLCApXSwgJyBcCi0JCQknInJ1bnRpbWVfZGVwZW5kZW5jaWVzIjogWyQoZm9yZWFjaCB3LCQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuTE9DQUxfUlVOVElNRV9MSUJSQVJJRVMpKSwiJCh3KSIsICldLCAnIFwKLQkJCScic3RhdGljX2RlcGVuZGVuY2llcyI6IFskKGZvcmVhY2ggdywkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLkxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMpKSwiJCh3KSIsICldLCAnIFwKLQkJCSciZGF0YV9kZXBlbmRlbmNpZXMiOiBbJChmb3JlYWNoIHcsJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5URVNUX0RBVEFfQklOUykpLCIkKHcpIiwgKV0sICcgXAotCQkJJyJzdXBwb3J0ZWRfdmFyaWFudHMiOiBbJChmb3JlYWNoIHcsJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5TVVBQT1JURURfVkFSSUFOVFMpKSwiJCh3KSIsICldLCAnIFwKLQkJCSciaG9zdF9kZXBlbmRlbmNpZXMiOiBbJChmb3JlYWNoIHcsJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5IT1NUX1JFUVVJUkVEX0ZST01fVEFSR0VUKSksIiQodykiLCApXSwgJyBcCi0JCQknInRhcmdldF9kZXBlbmRlbmNpZXMiOiBbJChmb3JlYWNoIHcsJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5UQVJHRVRfUkVRVUlSRURfRlJPTV9IT1NUKSksIiQodykiLCApXSwgJyBcCi0JCQknfSxcbicgXAotCSApIHwgc2VkIC1lICdzLywgKlxdL10vZycgLWUgJ3MvLCAqXH0vIH0vZycgLWUgJyQkcy8sJCQvLycgPj4gJEAKLQkkKGhpZGUpIGVjaG8gJ30nID4+ICRACisJJChoaWRlKSBlY2hvIC1uZSAne1xuICcgPiAkQC50bXAKKwkkKGhpZGUpIGVjaG8gLW5lICQoS0FUSV9mb3JlYWNoX3NlcCBtLCQoQ09NTUEpJChfTkVXTElORSksICQoc29ydCAkKEFMTF9NQUtFX01PRFVMRV9JTkZPX0pTT05fTU9EVUxFUykpLFwKKwkJJyIkKG0pIjogeycgXAorCQkJJyJtb2R1bGVfbmFtZSI6ICIkKEFMTF9NT0RVTEVTLiQobSkuTU9EVUxFX05BTUUpIicgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tbGlzdCwgImNsYXNzIiwgJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5DTEFTUykpKSBcCisJCQkkKGNhbGwgd3JpdGUtb3B0aW9uYWwtanNvbi1saXN0LCAicGF0aCIsICQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuUEFUSCkpKSBcCisJCQkkKGNhbGwgd3JpdGUtb3B0aW9uYWwtanNvbi1saXN0LCAidGFncyIsICQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuVEFHUykpKSBcCisJCQkkKGNhbGwgd3JpdGUtb3B0aW9uYWwtanNvbi1saXN0LCAiaW5zdGFsbGVkIiwgJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5JTlNUQUxMRUQpKSkgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tbGlzdCwgImNvbXBhdGliaWxpdHlfc3VpdGVzIiwgJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5DT01QQVRJQklMSVRZX1NVSVRFUykpKSBcCisJCQkkKGNhbGwgd3JpdGUtb3B0aW9uYWwtanNvbi1saXN0LCAiYXV0b190ZXN0X2NvbmZpZyIsICQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuYXV0b190ZXN0X2NvbmZpZykpKSBcCisJCQkkKGNhbGwgd3JpdGUtb3B0aW9uYWwtanNvbi1saXN0LCAidGVzdF9jb25maWciLCAkKHN0cmlwICQoQUxMX01PRFVMRVMuJChtKS5URVNUX0NPTkZJRykgJChBTExfTU9EVUxFUy4kKG0pLkVYVFJBX1RFU1RfQ09ORklHUykpKSBcCisJCQkkKGNhbGwgd3JpdGUtb3B0aW9uYWwtanNvbi1saXN0LCAiZGVwZW5kZW5jaWVzIiwgJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5BTExfREVQUykpKSBcCisJCQkkKGNhbGwgd3JpdGUtb3B0aW9uYWwtanNvbi1saXN0LCAicmVxdWlyZWQiLCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLlJFUVVJUkVEX0ZST01fVEFSR0VUKSkpIFwKKwkJCSQoY2FsbCB3cml0ZS1vcHRpb25hbC1qc29uLWxpc3QsICJzaGFyZWRfbGlicyIsICQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuU0hBUkVEX0xJQlMpKSkgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tbGlzdCwgInN0YXRpY19saWJzIiwgJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5TVEFUSUNfTElCUykpKSBcCisJCQkkKGNhbGwgd3JpdGUtb3B0aW9uYWwtanNvbi1saXN0LCAic3lzdGVtX3NoYXJlZF9saWJzIiwgJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5TWVNURU1fU0hBUkVEX0xJQlMpKSkgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tbGlzdCwgInNyY3MiLCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLlNSQ1MpKSkgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tbGlzdCwgInNyY2phcnMiLCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLlNSQ0pBUlMpKSkgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tbGlzdCwgImNsYXNzZXNfamFyIiwgJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5DTEFTU0VTX0pBUikpKSBcCisJCQkkKGNhbGwgd3JpdGUtb3B0aW9uYWwtanNvbi1saXN0LCAidGVzdF9tYWlubGluZV9tb2R1bGVzIiwgJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5URVNUX01BSU5MSU5FX01PRFVMRVMpKSkgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tYm9vbCwgImlzX3VuaXRfdGVzdCIsICQoQUxMX01PRFVMRVMuJChtKS5JU19VTklUX1RFU1QpKSBcCisJCQkkKGNhbGwgd3JpdGUtb3B0aW9uYWwtanNvbi1saXN0LCAidGVzdF9vcHRpb25zX3RhZ3MiLCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLlRFU1RfT1BUSU9OU19UQUdTKSkpIFwKKwkJCSQoY2FsbCB3cml0ZS1vcHRpb25hbC1qc29uLWxpc3QsICJkYXRhIiwgJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5URVNUX0RBVEEpKSkgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tbGlzdCwgInJ1bnRpbWVfZGVwZW5kZW5jaWVzIiwgJChzb3J0ICQoQUxMX01PRFVMRVMuJChtKS5MT0NBTF9SVU5USU1FX0xJQlJBUklFUykpKSBcCisJCQkkKGNhbGwgd3JpdGUtb3B0aW9uYWwtanNvbi1saXN0LCAic3RhdGljX2RlcGVuZGVuY2llcyIsICQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuTE9DQUxfU1RBVElDX0xJQlJBUklFUykpKSBcCisJCQkkKGNhbGwgd3JpdGUtb3B0aW9uYWwtanNvbi1saXN0LCAiZGF0YV9kZXBlbmRlbmNpZXMiLCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLlRFU1RfREFUQV9CSU5TKSkpIFwKKwkJCSQoY2FsbCB3cml0ZS1vcHRpb25hbC1qc29uLWxpc3QsICJzdXBwb3J0ZWRfdmFyaWFudHMiLCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLlNVUFBPUlRFRF9WQVJJQU5UUykpKSBcCisJCQkkKGNhbGwgd3JpdGUtb3B0aW9uYWwtanNvbi1saXN0LCAiaG9zdF9kZXBlbmRlbmNpZXMiLCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLkhPU1RfUkVRVUlSRURfRlJPTV9UQVJHRVQpKSkgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tbGlzdCwgInRhcmdldF9kZXBlbmRlbmNpZXMiLCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLlRBUkdFVF9SRVFVSVJFRF9GUk9NX0hPU1QpKSkgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tYm9vbCwgInRlc3RfbW9kdWxlX2NvbmZpZ19iYXNlIiwgJChBTExfTU9EVUxFUy4kKG0pLlRFU1RfTU9EVUxFX0NPTkZJR19CQVNFKSkgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tYm9vbCwgIm1ha2UiLCAkKGlmICQoQUxMX01PRFVMRVMuJChtKS5JU19TT09OR19NT0RVTEUpLCx0cnVlKSkgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tYm9vbCwgIm1ha2VfZ2VuZXJhdGVkX21vZHVsZV9pbmZvIiwgdHJ1ZSkgXAorCQknfScpJ1xufVxuJyA+PiAkQC50bXAKKwkkKFBSSVZBVEVfTUVSR0VfSlNPTl9PQkpFQ1RTKSAtbyAkQCAkKFBSSVZBVEVfU09PTkdfTU9EVUxFX0lORk8pICRALnRtcAorCXJtICRALnRtcAogCisuUEhPTlk6IG1vZHVsZS1pbmZvCittb2R1bGUtaW5mbzogJChNT0RVTEVfSU5GT19KU09OKQogCiBkcm9pZGNvcmUtdW5idW5kbGVkOiAkKE1PRFVMRV9JTkZPX0pTT04pCiAKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3Mvb2ZmbGluZS1zZGstZG9jcy5tayBiL2NvcmUvdGFza3Mvb2ZmbGluZS1zZGstZG9jcy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWU4MDA2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS90YXNrcy9vZmZsaW5lLXNkay1kb2NzLm1rCkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgc2RrLmF0cmVlIG5lZWRzIHRvIGNvcHkgdGhlIHdob2xlIGRpcjogJChPVVRfRE9DUykvb2ZmbGluZS1zZGsgdG8gdGhlIGZpbmFsIHppcC4KKyMgU28ga2VlcCBvZmZsaW5lLXNkay10aW1lc3RhbXAgdGFyZ2V0IGhlcmUsIGFuZCB1bnppcCBvZmZsaW5lLXNkay1kb2NzLnppcCB0bworIyAkKE9VVF9ET0NTKS9vZmZsaW5lLXNkay4KKyQoT1VUX0RPQ1MpL29mZmxpbmUtc2RrLXRpbWVzdGFtcDogJChPVVRfRE9DUykvb2ZmbGluZS1zZGstZG9jcy1kb2NzLnppcAorCSQoaGlkZSkgcm0gLXJmICQoT1VUX0RPQ1MpL29mZmxpbmUtc2RrCisJJChoaWRlKSBta2RpciAtcCAkKE9VVF9ET0NTKS9vZmZsaW5lLXNkaworCSggdW56aXAgLXFvICQ8IC1kICQoT1VUX0RPQ1MpL29mZmxpbmUtc2RrICYmIHRvdWNoIC1mICRAICkgfHwgZXhpdCAxCisKKy5QSE9OWTogZG9jcyBvZmZsaW5lLXNkay1kb2NzCitkb2NzIG9mZmxpbmUtc2RrLWRvY3M6ICQoT1VUX0RPQ1MpL29mZmxpbmUtc2RrLXRpbWVzdGFtcApkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9wZXJmb3JtYW5jZS10ZXN0cy5tayBiL2NvcmUvdGFza3MvcGVyZm9ybWFuY2UtdGVzdHMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcwMjc1NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGFza3MvcGVyZm9ybWFuY2UtdGVzdHMubWsKQEAgLTAsMCArMSw1NiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisuUEhPTlk6IHBlcmZvcm1hbmNlLXRlc3RzCisKK3BlcmZvcm1hbmNlX3Rlc3RzX3ppcCA6PSAkKFBST0RVQ1RfT1VUKS9wZXJmb3JtYW5jZS10ZXN0cy56aXAKKyMgQ3JlYXRlIGFuIGFydGlmYWN0IHRvIGluY2x1ZGUgYSBsaXN0IG9mIHRlc3QgY29uZmlnIGZpbGVzIGluIHBlcmZvcm1hbmNlLXRlc3RzLgorcGVyZm9ybWFuY2VfdGVzdHNfbGlzdF96aXAgOj0gJChQUk9EVUNUX09VVCkvcGVyZm9ybWFuY2UtdGVzdHNfbGlzdC56aXAKKyMgQ3JlYXRlIGFuIGFydGlmYWN0IHRvIGluY2x1ZGUgYWxsIHRlc3QgY29uZmlnIGZpbGVzIGluIHBlcmZvcm1hbmNlLXRlc3RzLgorcGVyZm9ybWFuY2VfdGVzdHNfY29uZmlnc196aXAgOj0gJChQUk9EVUNUX09VVCkvcGVyZm9ybWFuY2UtdGVzdHNfY29uZmlncy56aXAKKworJChwZXJmb3JtYW5jZV90ZXN0c196aXApIDogLktBVElfSU1QTElDSVRfT1VUUFVUUyA6PSAkKHBlcmZvcm1hbmNlX3Rlc3RzX2xpc3RfemlwKSAkKHBlcmZvcm1hbmNlX3Rlc3RzX2NvbmZpZ3NfemlwKQorJChwZXJmb3JtYW5jZV90ZXN0c196aXApIDogUFJJVkFURV9wZXJmb3JtYW5jZV90ZXN0c19saXN0X3ppcCA6PSAkKHBlcmZvcm1hbmNlX3Rlc3RzX2xpc3RfemlwKQorJChwZXJmb3JtYW5jZV90ZXN0c196aXApIDogUFJJVkFURV9wZXJmb3JtYW5jZV90ZXN0c19jb25maWdzX3ppcCA6PSAkKHBlcmZvcm1hbmNlX3Rlc3RzX2NvbmZpZ3NfemlwKQorJChwZXJmb3JtYW5jZV90ZXN0c196aXApIDogUFJJVkFURV9wZXJmb3JtYW5jZV90ZXN0c19saXN0IDo9ICQoUFJPRFVDVF9PVVQpL3BlcmZvcm1hbmNlLXRlc3RzX2xpc3QKKyQocGVyZm9ybWFuY2VfdGVzdHNfemlwKSA6ICQoQ09NUEFUSUJJTElUWS5wZXJmb3JtYW5jZS10ZXN0cy5GSUxFUykgJChTT09OR19aSVApCisJZWNobyAkKHNvcnQgJChDT01QQVRJQklMSVRZLnBlcmZvcm1hbmNlLXRlc3RzLkZJTEVTKSkgfCB0ciAiICIgIlxuIiA+ICRALmxpc3QKKwlncmVwICQoSE9TVF9PVVRfVEVTVENBU0VTKSAkQC5saXN0ID4gJEAtaG9zdC5saXN0IHx8IHRydWUKKwlncmVwIC1lIC4qXFwuY29uZmlnJCQgJEAtaG9zdC5saXN0ID4gJEAtaG9zdC10ZXN0LWNvbmZpZ3MubGlzdCB8fCB0cnVlCisJZ3JlcCAkKFRBUkdFVF9PVVRfVEVTVENBU0VTKSAkQC5saXN0ID4gJEAtdGFyZ2V0Lmxpc3QgfHwgdHJ1ZQorCWdyZXAgLWUgLipcXC5jb25maWckJCAkQC10YXJnZXQubGlzdCA+ICRALXRhcmdldC10ZXN0LWNvbmZpZ3MubGlzdCB8fCB0cnVlCisJJChoaWRlKSAkKFNPT05HX1pJUCkgLWQgLW8gJEAgLVAgaG9zdCAtQyAkKEhPU1RfT1VUKSAtbCAkQC1ob3N0Lmxpc3QgLVAgdGFyZ2V0IC1DICQoUFJPRFVDVF9PVVQpIC1sICRALXRhcmdldC5saXN0IC1zaGEyNTYKKwkkKGhpZGUpICQoU09PTkdfWklQKSAtZCAtbyAkKFBSSVZBVEVfcGVyZm9ybWFuY2VfdGVzdHNfY29uZmlnc196aXApIFwKKwkgIC1QIGhvc3QgLUMgJChIT1NUX09VVCkgLWwgJEAtaG9zdC10ZXN0LWNvbmZpZ3MubGlzdCBcCisJICAtUCB0YXJnZXQgLUMgJChQUk9EVUNUX09VVCkgLWwgJEAtdGFyZ2V0LXRlc3QtY29uZmlncy5saXN0CisJcm0gLWYgJChQUklWQVRFX3BlcmZvcm1hbmNlX3Rlc3RzX2xpc3QpCisJJChoaWRlKSBncmVwIC1lIC4qXFwuY29uZmlnJCQgJEAtaG9zdC5saXN0IHwgc2VkIHMlJChIT1NUX09VVCklaG9zdCVnID4gJChQUklWQVRFX3BlcmZvcm1hbmNlX3Rlc3RzX2xpc3QpCisJJChoaWRlKSBncmVwIC1lIC4qXFwuY29uZmlnJCQgJEAtdGFyZ2V0Lmxpc3QgfCBzZWQgcyUkKFBST0RVQ1RfT1VUKSV0YXJnZXQlZyA+PiAkKFBSSVZBVEVfcGVyZm9ybWFuY2VfdGVzdHNfbGlzdCkKKwkkKGhpZGUpICQoU09PTkdfWklQKSAtZCAtbyAkKFBSSVZBVEVfcGVyZm9ybWFuY2VfdGVzdHNfbGlzdF96aXApIC1DICQoZGlyICRAKSAtZiAkKFBSSVZBVEVfcGVyZm9ybWFuY2VfdGVzdHNfbGlzdCkKKwlybSAtZiAkQC5saXN0ICRALWhvc3QubGlzdCAkQC10YXJnZXQubGlzdCAkQC1ob3N0LXRlc3QtY29uZmlncy5saXN0ICRALXRhcmdldC10ZXN0LWNvbmZpZ3MubGlzdCBcCisJICAkKFBSSVZBVEVfcGVyZm9ybWFuY2VfdGVzdHNfbGlzdCkKKworcGVyZm9ybWFuY2UtdGVzdHM6ICQocGVyZm9ybWFuY2VfdGVzdHNfemlwKQorJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBwZXJmb3JtYW5jZS10ZXN0cywgJChwZXJmb3JtYW5jZV90ZXN0c196aXApICQocGVyZm9ybWFuY2VfdGVzdHNfbGlzdF96aXApICQocGVyZm9ybWFuY2VfdGVzdHNfY29uZmlnc196aXApKQorCiskKGNhbGwgZGVjbGFyZS0xcC1jb250YWluZXIsJChwZXJmb3JtYW5jZV90ZXN0c196aXApLCkKKyQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJChwZXJmb3JtYW5jZV90ZXN0c196aXApLCQoQ09NUEFUSUJJTElUWS5wZXJmb3JtYW5jZS10ZXN0cy5GSUxFUyksJChQUk9EVUNUX09VVCkvOi8pCisKK3Rlc3RzOiBwZXJmb3JtYW5jZS10ZXN0cworCisjIFJlc2V0IHRlbXAgdmFycworcGVyZm9ybWFuY2VfdGVzdHNfemlwIDo9CitwZXJmb3JtYW5jZV90ZXN0c19saXN0X3ppcCA6PQorcGVyZm9ybWFuY2VfdGVzdHNfY29uZmlnc196aXAgOj0KZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl9hcm0vZGV2aWNlLm1rIGIvY29yZS90YXNrcy9wcmVidWlsdF90cmFkZWZlZC5tawpzaW1pbGFyaXR5IGluZGV4IDcwJQpyZW5hbWUgZnJvbSB0YXJnZXQvYm9hcmQvZW11bGF0b3JfYXJtL2RldmljZS5tawpyZW5hbWUgdG8gY29yZS90YXNrcy9wcmVidWlsdF90cmFkZWZlZC5tawppbmRleCBhZjAyM2ViLi45NmM1N2Q1IDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfYXJtL2RldmljZS5taworKysgYi9jb3JlL3Rhc2tzL3ByZWJ1aWx0X3RyYWRlZmVkLm1rCkBAIC0xLDQgKzEsMyBAQAotIwogIyBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKQEAgLTEyLDcgKzExLDEyIEBACiAjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwogCi1QUk9EVUNUX1NPT05HX05BTUVTUEFDRVMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2ggIyBmb3IgbGlid2lmaS1oYWwtZW11Ci1QUk9EVUNUX1NPT05HX05BTUVTUEFDRVMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gtb3BlbmdsICMgZm9yIGdvbGRmaXNoIGRlcHMuCitpZmVxICgsJCh3aWxkY2FyZCB0b29scy90cmFkZWZlZGVyYXRpb24vY29yZSkpCisuUEhPTlk6IHRyYWRlZmVkLWNvcmUKK3RyYWRlZmVkLWNvcmU6IHRyYWRlZmVkIGF0ZXN0X3RyYWRlZmVkLnNoCisuUEhPTlk6IHRyYWRlZmVkLWFsbAordHJhZGVmZWQtYWxsOiB0cmFkZWZlZCBhdGVzdF90cmFkZWZlZC5zaAorCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIHRyYWRlZmVkLCAkKEhPU1RfT1VUKS9ldGMvdHJhZGVmZWQuemlwKQorZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvcmVjb3Zlcnlfc25hcHNob3QubWsgYi9jb3JlL3Rhc2tzL3JlY292ZXJ5X3NuYXBzaG90Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjUyNzNiLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGFza3MvcmVjb3Zlcnlfc25hcHNob3QubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1jdXJyZW50X21ha2VmaWxlIDo9ICQobGFzdHdvcmQgJChNQUtFRklMRV9MSVNUKSkKLQotIyBSRUNPVkVSWV9TTkFQU0hPVF9WRVJTSU9OIG11c3QgYmUgc2V0IHRvICdjdXJyZW50JyBpbiBvcmRlciB0byBnZW5lcmF0ZSBhIHJlY292ZXJ5IHNuYXBzaG90LgotaWZlcSAoJChSRUNPVkVSWV9TTkFQU0hPVF9WRVJTSU9OKSxjdXJyZW50KQotCi0uUEhPTlk6IHJlY292ZXJ5LXNuYXBzaG90Ci1yZWNvdmVyeS1zbmFwc2hvdDogJChTT09OR19SRUNPVkVSWV9TTkFQU0hPVF9aSVApCi0KLSQoY2FsbCBkaXN0LWZvci1nb2FscywgcmVjb3Zlcnktc25hcHNob3QsICQoU09PTkdfUkVDT1ZFUllfU05BUFNIT1RfWklQKSkKLQotZWxzZSAjIFJFQ09WRVJZX1NOQVBTSE9UX1ZFUlNJT04gaXMgTk9UIHNldCB0byAnY3VycmVudCcKLQotLlBIT05ZOiByZWNvdmVyeS1zbmFwc2hvdAotcmVjb3Zlcnktc25hcHNob3Q6IFBSSVZBVEVfTUFLRUZJTEUgOj0gJChjdXJyZW50X21ha2VmaWxlKQotcmVjb3Zlcnktc25hcHNob3Q6Ci0JJChjYWxsIGVjaG8tZXJyb3IsJChQUklWQVRFX01BS0VGSUxFKSxcCi0JCSJDQU5OT1QgZ2VuZXJhdGUgUmVjb3Zlcnkgc25hcHNob3QuIFJFQ09WRVJZX1NOQVBTSE9UX1ZFUlNJT04gbXVzdCBiZSBzZXQgdG8gJ2N1cnJlbnQnLiIpCi0JZXhpdCAxCi0KLWVuZGlmICMgUkVDT1ZFUllfU05BUFNIT1RfVkVSU0lPTgpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9zZGstYWRkb24ubWsgYi9jb3JlL3Rhc2tzL3Nkay1hZGRvbi5tawppbmRleCA1MDk3ZjEyLi4yZmQ0Y2U5IDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL3Nkay1hZGRvbi5taworKysgYi9jb3JlL3Rhc2tzL3Nkay1hZGRvbi5tawpAQCAtMTksMTIgKzE5LDEzIEBACiBhZGRvbl9uYW1lIDo9ICQoUFJPRFVDVF9TREtfQURET05fTkFNRSkKIGlmbmVxICgkKGFkZG9uX25hbWUpLCkKIAotYWRkb25fZGlyX2xlYWYgIDo9ICQoYWRkb25fbmFtZSktJChGSUxFX05BTUVfVEFHKS0kKElOVEVSTkFMX1NES19IT1NUX09TX05BTUUpCi1hZGRvbl9kaXJfaW1nICAgOj0gJChhZGRvbl9kaXJfbGVhZiktaW1nCi1pbnRlcm1lZGlhdGVzICAgOj0gJChIT1NUX09VVF9JTlRFUk1FRElBVEVTKS9TREtfQURET04vJChhZGRvbl9uYW1lKV9pbnRlcm1lZGlhdGVzCi1mdWxsX3RhcmdldCAgICAgOj0gJChIT1NUX09VVF9TREtfQURET04pLyQoYWRkb25fZGlyX2xlYWYpLnppcAotZnVsbF90YXJnZXRfaW1nIDo9ICQoSE9TVF9PVVRfU0RLX0FERE9OKS8kKGFkZG9uX2Rpcl9pbWcpLnppcAotc3RhZ2luZyAgICAgICAgIDo9ICQoaW50ZXJtZWRpYXRlcykKK2FkZG9uX2Rpcl9sZWFmICAgICAgICA6PSAkKGFkZG9uX25hbWUpLSQoSU5URVJOQUxfU0RLX0hPU1RfT1NfTkFNRSkKK2FkZG9uX2Rpcl9pbWcgICAgICAgICA6PSAkKGFkZG9uX2Rpcl9sZWFmKS1pbWcKK2ludGVybWVkaWF0ZXMgICAgICAgICA6PSAkKEhPU1RfT1VUX0lOVEVSTUVESUFURVMpL1NES19BRERPTi8kKGFkZG9uX25hbWUpX2ludGVybWVkaWF0ZXMKK2Z1bGxfdGFyZ2V0ICAgICAgICAgICA6PSAkKEhPU1RfT1VUX1NES19BRERPTikvJChhZGRvbl9kaXJfbGVhZikuemlwCitmdWxsX3RhcmdldF9kaXN0X25hbWUgOj0gJChhZGRvbl9uYW1lKS1GSUxFX05BTUVfVEFHX1BMQUNFSE9MREVSLSQoSU5URVJOQUxfU0RLX0hPU1RfT1NfTkFNRSkKK2Z1bGxfdGFyZ2V0X2ltZyAgICAgICA6PSAkKEhPU1RfT1VUX1NES19BRERPTikvJChhZGRvbl9kaXJfaW1nKS56aXAKK3N0YWdpbmcgICAgICAgICAgICAgICA6PSAkKGludGVybWVkaWF0ZXMpCiAKIHNka19hZGRvbl9kZXBzIDo9CiBmaWxlc190b19jb3B5IDo9CkBAIC0xMjUsNyArMTI2LDcgQEAKICQoZnVsbF90YXJnZXRfaW1nKTogJChmdWxsX3RhcmdldCkgJChhZGRvbl9pbWdfc291cmNlX3Byb3ApIHwgJChTT09OR19aSVApCiAJQGVjaG8gUGFja2FnaW5nIFNESyBBZGRvbiBTeXN0ZW0tSW1hZ2U6ICRACiAJJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkKLQljcCAtUiAkKFBST0RVQ1RfT1VUKS9kYXRhICQoUFJJVkFURV9TVEFHSU5HX0RJUikvZGF0YQorCWNwIC1SICQoUFJPRFVDVF9PVVQpL2RhdGEgJChQUklWQVRFX1NUQUdJTkdfRElSKQogCSQoaGlkZSkgJChTT09OR19aSVApIC1vICRAIC1DICQoZGlyICQoUFJJVkFURV9TVEFHSU5HX0RJUikpIC1EICQoUFJJVkFURV9TVEFHSU5HX0RJUikKIAogCkBAIC0xNDAsNyArMTQxLDcgQEAKIGVsc2UKICMgV2hlbiBub3QgYnVpbGRpbmcgYW4gc2RrX3JlcG8sIGp1c3QgZGlzdCB0aGUgYWRkb24gemlwIGZpbGUKICMgYXMtaXMuCi0kKGNhbGwgZGlzdC1mb3ItZ29hbHMsIHNka19hZGRvbiwgJChmdWxsX3RhcmdldCkpCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIHNka19hZGRvbiwgJChmdWxsX3RhcmdldCk6JChmdWxsX3RhcmdldF9kaXN0X25hbWUpKQogZW5kaWYKIAogZWxzZSAjIGFkZG9uX25hbWUKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3Mvc3RzLWxpdGUubWsgYi9jb3JlL3Rhc2tzL3N0cy1saXRlLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWM2NWMzLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGFza3Mvc3RzLWxpdGUubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pZm5lcSAoJCh3aWxkY2FyZCB0ZXN0L3N0cy9SRUFETUUtc3RzLXNkay5tZCksKQotdGVzdF9zdWl0ZV9uYW1lIDo9IHN0cy1saXRlCi10ZXN0X3N1aXRlX3RyYWRlZmVkIDo9IHN0cy10cmFkZWZlZAotdGVzdF9zdWl0ZV9yZWFkbWUgOj0gdGVzdC9zdHMvUkVBRE1FLXN0cy1zZGsubWQKLXN0c19zZGtfemlwIDo9ICQoSE9TVF9PVVQpLyQodGVzdF9zdWl0ZV9uYW1lKS9zdHMtc2RrLnppcAotCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS90YXNrcy90b29scy9jb21wYXRpYmlsaXR5Lm1rCi0KLXN0c19zZGtfc2FtcGxlcyA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEVUQyxzdHMtc2RrLXNhbXBsZXMuemlwKS9zdHMtc2RrLXNhbXBsZXMuemlwCi0KLSQoc3RzX3Nka196aXApOiBTVFNfTElURV9aSVAgOj0gJChjb21wYXRpYmlsaXR5X3ppcCkKLSQoc3RzX3Nka196aXApOiBTVFNfU0RLX1NBTVBMRVMgOj0gJChzdHNfc2RrX3NhbXBsZXMpCi0kKHN0c19zZGtfemlwKTogJChNRVJHRV9aSVBTKSAkKFpJUDJaSVApICQoY29tcGF0aWJpbGl0eV96aXApICQoc3RzX3Nka19zYW1wbGVzKQotCXJtIC1mICRAICQoU1RTX0xJVEVfWklQKV9maWx0ZXJlZAotCSQoWklQMlpJUCkgLWkgJChTVFNfTElURV9aSVApIC1vICQoU1RTX0xJVEVfWklQKV9maWx0ZXJlZCBcCi0JCS14IGFuZHJvaWQtc3RzLWxpdGUvdG9vbHMvc3RzLXRyYWRlZmVkLXRlc3RzLmphciBcCi0JCSdhbmRyb2lkLXN0cy1saXRlL3Rvb2xzLyo6c3RzLXRlc3QvbGlicy8nIFwKLQkJJ2FuZHJvaWQtc3RzLWxpdGUvdGVzdGNhc2VzLyo6c3RzLXRlc3QvdXRpbHMvJyBcCi0JCSdhbmRyb2lkLXN0cy1saXRlL2pkay8qKi8qOnN0cy10ZXN0L2pkay8nCi0JJChNRVJHRV9aSVBTKSAkQCAkKFNUU19MSVRFX1pJUClfZmlsdGVyZWQgJChTVFNfU0RLX1NBTVBMRVMpCi0Jcm0gLWYgJChTVFNfTElURV9aSVApX2ZpbHRlcmVkCi0KLS5QSE9OWTogc3RzLXNkawotc3RzLXNkazogJChzdHNfc2RrX3ppcCkKLSQoY2FsbCBkaXN0LWZvci1nb2Fscywgc3RzLXNkaywgJChzdHNfc2RrX3ppcCkpCi0KLWVuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL3Rvb2xzL2J1aWxkX2N1c3RvbV9pbWFnZS5tayBiL2NvcmUvdGFza3MvdG9vbHMvYnVpbGRfY3VzdG9tX2ltYWdlLm1rCmluZGV4IDI2MjYxMjAuLmJhOTdlOGEgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3MvdG9vbHMvYnVpbGRfY3VzdG9tX2ltYWdlLm1rCisrKyBiL2NvcmUvdGFza3MvdG9vbHMvYnVpbGRfY3VzdG9tX2ltYWdlLm1rCkBAIC0xMDUsNiArMTA1LDkgQEAKIGVsc2UgaWZuZXEgKCwkKGZpbHRlciB0cnVlLCAkKENVU1RPTV9JTUFHRV9BVkJfSEFTSF9FTkFCTEUpICQoQ1VTVE9NX0lNQUdFX0FWQl9IQVNIVFJFRV9FTkFCTEUpKSkKICAgJChlcnJvciBDYW5ub3Qgc2V0IGJvdGggQ1VTVE9NX0lNQUdFX0FWQl9IQVNIX0VOQUJMRSBhbmQgQ1VTVE9NX0lNQUdFX0FWQl9IQVNIVFJFRV9FTkFCTEUgdG8gdHJ1ZSkKIGVuZGlmCitpZmVxICgkKHN0cmlwICQoSEFTX0JVSUxEX05VTUJFUikpLHRydWUpCiskKG15X2J1aWx0X2N1c3RvbV9pbWFnZSk6ICQoQlVJTERfTlVNQkVSX0ZJTEUpCitlbmRpZgogJChteV9idWlsdF9jdXN0b21faW1hZ2UpOiAkKElOVEVSTkFMX1VTRVJJTUFHRVNfREVQUykgJChteV9idWlsdF9tb2R1bGVzKSAkKG15X2ltYWdlX2NvcHlfZmlsZXMpICQobXlfY3VzdG9tX2ltYWdlX21vZHVsZXNfZGVwKSBcCiAgICQoQ1VTVE9NX0lNQUdFX0RJQ1RfRklMRSkKIAlAZWNobyAiQnVpbGQgaW1hZ2UgJEAiCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL3Rvb2xzL2NvbXBhdGliaWxpdHkubWsgYi9jb3JlL3Rhc2tzL3Rvb2xzL2NvbXBhdGliaWxpdHkubWsKaW5kZXggYzc3MGIzNC4uZjIwNWNlYSAxMDA2NDQKLS0tIGEvY29yZS90YXNrcy90b29scy9jb21wYXRpYmlsaXR5Lm1rCisrKyBiL2NvcmUvdGFza3MvdG9vbHMvY29tcGF0aWJpbGl0eS5tawpAQCAtMjYsNyArMjYsMTYgQEAKICMgT3V0cHV0IHZhcmlhYmxlczoKICMgICBjb21wYXRpYmlsaXR5X3ppcDogdGhlIHBhdGggdG8gdGhlIG91dHB1dCB6aXAgZmlsZS4KIAotdGVzdF9zdWl0ZV9zdWJkaXIgOj0gYW5kcm9pZC0kKHRlc3Rfc3VpdGVfbmFtZSkKK3NwZWNpYWxfbXRzX3Rlc3Rfc3VpdGVzIDo9CitzcGVjaWFsX210c190ZXN0X3N1aXRlcyArPSAkKG10c19tb2R1bGVzKQoraWZuZXEgKCQoZmlsdGVyICQoc3BlY2lhbF9tdHNfdGVzdF9zdWl0ZXMpLCQocGF0c3Vic3QgbWN0cy0lLCUsJCh0ZXN0X3N1aXRlX25hbWUpKSksKQorCXRlc3Rfc3VpdGVfc3ViZGlyIDo9IGFuZHJvaWQtbXRzCitlbHNlIGlmbmVxICgkKGZpbHRlciAkKHNwZWNpYWxfbXRzX3Rlc3Rfc3VpdGVzKSwkKHBhdHN1YnN0IG10cy0lLCUsJCh0ZXN0X3N1aXRlX25hbWUpKSksKQorCXRlc3Rfc3VpdGVfc3ViZGlyIDo9IGFuZHJvaWQtbXRzCitlbHNlCisJdGVzdF9zdWl0ZV9zdWJkaXIgOj0gYW5kcm9pZC0kKHRlc3Rfc3VpdGVfbmFtZSkKK2VuZGlmCisKIG91dF9kaXIgOj0gJChIT1NUX09VVCkvJCh0ZXN0X3N1aXRlX25hbWUpLyQodGVzdF9zdWl0ZV9zdWJkaXIpCiB0ZXN0X2FydGlmYWN0cyA6PSAkKENPTVBBVElCSUxJVFkuJCh0ZXN0X3N1aXRlX25hbWUpLkZJTEVTKQogdGVzdF90b29scyA6PSAkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS90cmFkZWZlZC5qYXIgXApAQCAtMzYsNiArNDUsNyBAQAogICAkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS8kKHRlc3Rfc3VpdGVfdHJhZGVmZWQpLmphciBcCiAgICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpLyQodGVzdF9zdWl0ZV90cmFkZWZlZCktdGVzdHMuamFyIFwKICAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvJCh0ZXN0X3N1aXRlX3RyYWRlZmVkKSBcCisgICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3Rlc3QtdXRpbHMtc2NyaXB0IFwKICAgJCh0ZXN0X3N1aXRlX3JlYWRtZSkKIAogJChmb3JlYWNoIGYsJCh0ZXN0X3N1aXRlX3JlYWRtZSksJChpZiAkKHN0cmlwICQoQUxMX1RBUkdFVFMuJChmKS5NRVRBX0xJQykpLCwkKGV2YWwgQUxMX1RBUkdFVFMuJChmKS5NRVRBX0xJQyA6PSAkKG1vZHVsZV9saWNlbnNlX21ldGFkYXRhKSkpKQpAQCAtNDQsMTAgKzU0LDE2IEBACiAKICMgVGhlIEpESyB0byBwYWNrYWdlIGludG8gdGhlIHRlc3Qgc3VpdGUgemlwIGZpbGUuICBBbHdheXMgcGFja2FnZSB0aGUgbGludXggSkRLLgogdGVzdF9zdWl0ZV9qZGtfZGlyIDo9ICQoQU5EUk9JRF9KQVZBX0hPTUUpLy4uL2xpbnV4LXg4NgoraWZuZGVmIHRlc3Rfc3VpdGVfamRrX2ZpbGVzCisgICMgVGhpcyBmaWxlIGdldHMgaW5jbHVkZWQgbWFueSB0aW1lcywgc28gbWFrZSBzdXJlIHdlIG9ubHkgcnVuIHRoZSAkKHNoZWxsKSBvbmNlLgorICAjIE90aGVyd2lzZSBpdCB3aWxsIHNsb3cgZG93biBldmVyeSBidWlsZCBkdWUgdG8gYWxsIGNvcGllcyBvZiBpdCBiZWluZyByZXJ1biB3aGVuIGthdGkKKyAgIyBjaGVja3MgdGhlIHN0YW1wIGZpbGUuCisgIHRlc3Rfc3VpdGVfamRrX2ZpbGVzIDo9JD0gJChzaGVsbCBmaW5kICQodGVzdF9zdWl0ZV9qZGtfZGlyKSAtdHlwZSBmIHwgc29ydCkKK2VuZGlmCiB0ZXN0X3N1aXRlX2pkayA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORywkKHRlc3Rfc3VpdGVfbmFtZSlfamRrLEhPU1QpL2pkay56aXAKICQodGVzdF9zdWl0ZV9qZGspOiBQUklWQVRFX0pES19ESVIgOj0gJCh0ZXN0X3N1aXRlX2pka19kaXIpCiAkKHRlc3Rfc3VpdGVfamRrKTogUFJJVkFURV9TVUJESVIgOj0gJCh0ZXN0X3N1aXRlX3N1YmRpcikKLSQodGVzdF9zdWl0ZV9qZGspOiAkKHNoZWxsIGZpbmQgJCh0ZXN0X3N1aXRlX2pka19kaXIpIC10eXBlIGYgfCBzb3J0KQorJCh0ZXN0X3N1aXRlX2pkayk6ICQodGVzdF9zdWl0ZV9qZGtfZmlsZXMpCiAkKHRlc3Rfc3VpdGVfamRrKTogJChTT09OR19aSVApCiAJJChTT09OR19aSVApIC1vICRAIC1QICQoUFJJVkFURV9TVUJESVIpL2pkayAtQyAkKFBSSVZBVEVfSkRLX0RJUikgLUQgJChQUklWQVRFX0pES19ESVIpIC1zaGEyNTYKIApAQCAtMTAwLDkgKzExNiw5IEBACiBjb21wYXRpYmlsaXR5X3ppcF9kZXBzICs9ICQodGVzdF9zdWl0ZV9ub3RpY2VfdHh0KQogY29tcGF0aWJpbGl0eV96aXBfcmVzb3VyY2VzICs9ICQodGVzdF9zdWl0ZV9ub3RpY2VfdHh0KQogCi1jb21wYXRpYmlsaXR5X3Rlc3RzX2xpc3RfemlwIDo9ICQob3V0X2RpciktdGVzdHNfbGlzdC56aXAKK2NvbXBhdGliaWxpdHlfdGVzdHNfbGlzdF96aXAgOj0gJChIT1NUX09VVCkvJCh0ZXN0X3N1aXRlX25hbWUpL2FuZHJvaWQtJCh0ZXN0X3N1aXRlX25hbWUpLXRlc3RzX2xpc3QuemlwCiAKLWNvbXBhdGliaWxpdHlfemlwIDo9ICQob3V0X2RpcikuemlwCitjb21wYXRpYmlsaXR5X3ppcCA6PSAkKEhPU1RfT1VUKS8kKHRlc3Rfc3VpdGVfbmFtZSkvYW5kcm9pZC0kKHRlc3Rfc3VpdGVfbmFtZSkuemlwCiAkKGNvbXBhdGliaWxpdHlfemlwKSA6IC5LQVRJX0lNUExJQ0lUX09VVFBVVFMgOj0gJChjb21wYXRpYmlsaXR5X3Rlc3RzX2xpc3RfemlwKQogJChjb21wYXRpYmlsaXR5X3ppcCk6IFBSSVZBVEVfT1VUX0RJUiA6PSAkKG91dF9kaXIpCiAkKGNvbXBhdGliaWxpdHlfemlwKTogUFJJVkFURV9UT09MUyA6PSAkKHRlc3RfdG9vbHMpICQodGVzdF9zdWl0ZV9wcmVidWlsdF90b29scykKQEAgLTExMiw2ICsxMjgsOSBAQAogJChjb21wYXRpYmlsaXR5X3ppcCk6IFBSSVZBVEVfSkRLIDo9ICQodGVzdF9zdWl0ZV9qZGspCiAkKGNvbXBhdGliaWxpdHlfemlwKTogUFJJVkFURV90ZXN0c19saXN0IDo9ICQob3V0X2RpciktdGVzdHNfbGlzdAogJChjb21wYXRpYmlsaXR5X3ppcCk6IFBSSVZBVEVfdGVzdHNfbGlzdF96aXAgOj0gJChjb21wYXRpYmlsaXR5X3Rlc3RzX2xpc3RfemlwKQoraWZlcSAoJChzdHJpcCAkKEhBU19CVUlMRF9OVU1CRVIpKSx0cnVlKQorJChjb21wYXRpYmlsaXR5X3ppcCk6ICQoQlVJTERfTlVNQkVSX0ZJTEUpCitlbmRpZgogJChjb21wYXRpYmlsaXR5X3ppcCk6ICQoY29tcGF0aWJpbGl0eV96aXBfZGVwcykgfCAkKEFEQikgJChBQ1ApCiAjIE1ha2UgZGlyIHN0cnVjdHVyZQogCW1rZGlyIC1wICQoUFJJVkFURV9PVVRfRElSKS90b29scyAkKFBSSVZBVEVfT1VUX0RJUikvdGVzdGNhc2VzCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL3Rvb2xzL3BhY2thZ2UtbW9kdWxlcy5tayBiL2NvcmUvdGFza3MvdG9vbHMvcGFja2FnZS1tb2R1bGVzLm1rCmluZGV4IGIxNWRmMjguLjRlYzU1MjAgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3MvdG9vbHMvcGFja2FnZS1tb2R1bGVzLm1rCisrKyBiL2NvcmUvdGFza3MvdG9vbHMvcGFja2FnZS1tb2R1bGVzLm1rCkBAIC0xMDYsNiArMTA2LDcgQEAKIAkkKGhpZGUpICQoZm9yZWFjaCBmLCAkKFBSSVZBVEVfUElDS1VQX0ZJTEVTKSxcCiAJICBjcCAtUmZMICQoZikgJChQUklWQVRFX1NUQUdJTkdfRElSKSAmJiApIHRydWUKIAkkKGhpZGUpIGNkICQoUFJJVkFURV9TVEFHSU5HX0RJUikgJiYgemlwIC1ycVggLi4vJChub3RkaXIgJEApICoKKwlybSAtcmYgJChQUklWQVRFX1NUQUdJTkdfRElSKQogCiBteV9tYWtlZmlsZSA6PQogbXlfc3RhZ2luZ19kaXIgOj0KZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvdG9vbHMvdnRzLWtlcm5lbC10ZXN0cy5tayBiL2NvcmUvdGFza3MvdG9vbHMvdnRzLWtlcm5lbC10ZXN0cy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQxMTVjOS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rhc2tzL3Rvb2xzL3Z0cy1rZXJuZWwtdGVzdHMubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0taW5jbHVkZSBleHRlcm5hbC9saW51eC1rc2VsZnRlc3QvYW5kcm9pZC9rc2VsZnRlc3RfdGVzdF9saXN0Lm1rCi0taW5jbHVkZSBleHRlcm5hbC9sdHAvYW5kcm9pZC9sdHBfcGFja2FnZV9saXN0Lm1rCi0KLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Rhc2tzL3Rvb2xzL3Z0c19wYWNrYWdlX3V0aWxzLm1rCi0KLSMgQ29weSBrZXJuZWwgdGVzdCBtb2R1bGVzIHRvIHRlc3RjYXNlcyBkaXJlY3Rvcmllcwota2VybmVsX2x0cF9ob3N0X291dCA6PSAkKEhPU1RfT1VUX1RFU1RDQVNFUykvdnRzX2tlcm5lbF9sdHBfdGVzdHMKLWtlcm5lbF9sdHBfdnRzX291dCA6PSAkKEhPU1RfT1VUKS8kKHRlc3Rfc3VpdGVfbmFtZSkvYW5kcm9pZC0kKHRlc3Rfc3VpdGVfbmFtZSkvdGVzdGNhc2VzL3Z0c19rZXJuZWxfbHRwX3Rlc3RzCi1rZXJuZWxfbHRwX21vZHVsZXMgOj0gXAotICAgIGx0cCBcCi0gICAgJChsdHBfcGFja2FnZXMpCi0KLWtlcm5lbF9rc2VsZnRlc3RfaG9zdF9vdXQgOj0gJChIT1NUX09VVF9URVNUQ0FTRVMpL3Z0c19rZXJuZWxfa3NlbGZ0ZXN0X3Rlc3RzCi1rZXJuZWxfa3NlbGZ0ZXN0X3Z0c19vdXQgOj0gJChIT1NUX09VVCkvJCh0ZXN0X3N1aXRlX25hbWUpL2FuZHJvaWQtJCh0ZXN0X3N1aXRlX25hbWUpL3Rlc3RjYXNlcy92dHNfa2VybmVsX2tzZWxmdGVzdF90ZXN0cwota2VybmVsX2tzZWxmdGVzdF9tb2R1bGVzIDo9ICQoa3NlbGZ0ZXN0X21vZHVsZXMpCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL3Rvb2xzL3Z0c19wYWNrYWdlX3V0aWxzLm1rIGIvY29yZS90YXNrcy90b29scy92dHNfcGFja2FnZV91dGlscy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYxNjFmMC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rhc2tzL3Rvb2xzL3Z0c19wYWNrYWdlX3V0aWxzLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyAkKDEpOiBMaXN0IG9mIHRhcmdldCBuYXRpdmUgZmlsZXMgdG8gY29weS4KLSMgJCgyKTogQ29weSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCi0jIEV2YWx1YXRlcyB0byBhIGxpc3Qgb2YgIjoiLXNlcGFyYXRlZCBwYWlycyBzcmM6ZHN0LgotZGVmaW5lIHRhcmdldC1uYXRpdmUtY29weS1wYWlycwotJChmb3JlYWNoIG0sJCgxKSxcCi0gICQoZXZhbCBfYnVpbHRfZmlsZXMgOj0gJChzdHJpcCAkKEFMTF9NT0RVTEVTLiQobSkuQlVJTFRfSU5TVEFMTEVEKVwKLSAgJChBTExfTU9EVUxFUy4kKG0pJChUQVJHRVRfMk5EX0FSQ0hfTU9EVUxFX1NVRkZJWCkuQlVJTFRfSU5TVEFMTEVEKSkpXAotICAkKGZvcmVhY2ggaSwgJChfYnVpbHRfZmlsZXMpLFwKLSAgICAkKGV2YWwgYnVpX2lucyA6PSAkKHN1YnN0IDosJChzcGFjZSksJChpKSkpXAotICAgICQoZXZhbCBpbnMgOj0gJCh3b3JkIDIsJChidWlfaW5zKSkpXAotICAgICQoaWYgJChmaWx0ZXIgJChUQVJHRVRfT1VUX1JPT1QpLyUsJChpbnMpKSxcCi0gICAgICAkKGV2YWwgYnVpIDo9ICQod29yZCAxLCQoYnVpX2lucykpKVwKLSAgICAgICQoZXZhbCBteV9jb3B5X2Rlc3QgOj0gJChwYXRzdWJzdCBkYXRhLyUsREFUQS8lLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHBhdHN1YnN0IHN5c3RlbS8lLERBVEEvJSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQocGF0c3Vic3QgJChQUk9EVUNUX09VVCkvJSwlLCQoaW5zKSkpKSlcCi0gICAgICAkKGNhbGwgZGVjbGFyZS1jb3B5LXRhcmdldC1saWNlbnNlLW1ldGFkYXRhLCQoMikvJChteV9jb3B5X2Rlc3QpLCQoYnVpKSlcCi0gICAgICAkKGJ1aSk6JCgyKS8kKG15X2NvcHlfZGVzdCkpKSkKLWVuZGVmCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL3RyYWRlZmVkLXRlc3RzLWxpc3QubWsgYi9jb3JlL3Rhc2tzL3RyYWRlZmVkLXRlc3RzLWxpc3QubWsKaW5kZXggNjFiZjEzNi4uNDdjMzYwZCAxMDA2NDQKLS0tIGEvY29yZS90YXNrcy90cmFkZWZlZC10ZXN0cy1saXN0Lm1rCisrKyBiL2NvcmUvdGFza3MvdHJhZGVmZWQtdGVzdHMtbGlzdC5tawpAQCAtMTUsNiArMTUsMTEgQEAKICMgTGlzdCBhbGwgVHJhZGVGZWQgdGVzdHMgZnJvbSBDT01QQVRJQklMSVRZLnRyYWRlZmVkX3Rlc3RzX2RpcgogLlBIT05ZOiB0cmFkZWZlZC10ZXN0cy1saXN0CiAKK0NPTVBBVElCSUxJVFkudHJhZGVmZWRfdGVzdHNfZGlyIDo9IFwKKyAgJChDT01QQVRJQklMSVRZLnRyYWRlZmVkX3Rlc3RzX2RpcikgXAorICB0b29scy90cmFkZWZlZGVyYXRpb24vY29yZS9yZXMvY29uZmlnIFwKKyAgdG9vbHMvdHJhZGVmZWRlcmF0aW9uL2NvcmUvamF2YXRlc3RzL3Jlcy9jb25maWcKKwogdHJhZGVmZWRfdGVzdHMgOj0KICQoZm9yZWFjaCBkaXIsICQoQ09NUEFUSUJJTElUWS50cmFkZWZlZF90ZXN0c19kaXIpLCBcCiAgICQoZXZhbCB0cmFkZWZlZF90ZXN0cyArPSAkKHNoZWxsIGZpbmQgJChkaXIpIC10eXBlIGYgLW5hbWUgIioueG1sIikpKQpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy92ZW5kb3Jfc25hcHNob3QubWsgYi9jb3JlL3Rhc2tzL3ZlbmRvcl9zbmFwc2hvdC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNjMTM3OS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rhc2tzL3ZlbmRvcl9zbmFwc2hvdC5taworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWN1cnJlbnRfbWFrZWZpbGUgOj0gJChsYXN0d29yZCAkKE1BS0VGSUxFX0xJU1QpKQotCi0jIEJPQVJEX1ZOREtfVkVSU0lPTiBtdXN0IGJlIHNldCB0byAnY3VycmVudCcgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgYSB2ZW5kb3Igc25hcHNob3QuCi1pZmVxICgkKEJPQVJEX1ZOREtfVkVSU0lPTiksY3VycmVudCkKLQotLlBIT05ZOiB2ZW5kb3Itc25hcHNob3QKLXZlbmRvci1zbmFwc2hvdDogJChTT09OR19WRU5ET1JfU05BUFNIT1RfWklQKQotCi0kKGNhbGwgZGlzdC1mb3ItZ29hbHMsIHZlbmRvci1zbmFwc2hvdCwgJChTT09OR19WRU5ET1JfU05BUFNIT1RfWklQKSkKLQotLlBIT05ZOiB2ZW5kb3ItZmFrZS1zbmFwc2hvdAotdmVuZG9yLWZha2Utc25hcHNob3Q6ICQoU09PTkdfVkVORE9SX0ZBS0VfU05BUFNIT1RfWklQKQotCi0kKGNhbGwgZGlzdC1mb3ItZ29hbHMsIHZlbmRvci1mYWtlLXNuYXBzaG90LCAkKFNPT05HX1ZFTkRPUl9GQUtFX1NOQVBTSE9UX1pJUCk6ZmFrZS8kKG5vdGRpciAkKFNPT05HX1ZFTkRPUl9GQUtFX1NOQVBTSE9UX1pJUCkpKQotCi1lbHNlICMgQk9BUkRfVk5ES19WRVJTSU9OIGlzIE5PVCBzZXQgdG8gJ2N1cnJlbnQnCi0KLS5QSE9OWTogdmVuZG9yLXNuYXBzaG90Ci12ZW5kb3Itc25hcHNob3Q6IFBSSVZBVEVfTUFLRUZJTEUgOj0gJChjdXJyZW50X21ha2VmaWxlKQotdmVuZG9yLXNuYXBzaG90OgotCSQoY2FsbCBlY2hvLWVycm9yLCQoUFJJVkFURV9NQUtFRklMRSksXAotCQkiQ0FOTk9UIGdlbmVyYXRlIFZlbmRvciBzbmFwc2hvdC4gQk9BUkRfVk5ES19WRVJTSU9OIG11c3QgYmUgc2V0IHRvICdjdXJyZW50Jy4iKQotCWV4aXQgMQotCi0uUEhPTlk6IHZlbmRvci1mYWtlLXNuYXBzaG90Ci12ZW5kb3ItZmFrZS1zbmFwc2hvdDogUFJJVkFURV9NQUtFRklMRSA6PSAkKGN1cnJlbnRfbWFrZWZpbGUpCi12ZW5kb3ItZmFrZS1zbmFwc2hvdDoKLQkkKGNhbGwgZWNoby1lcnJvciwkKFBSSVZBVEVfTUFLRUZJTEUpLFwKLQkJIkNBTk5PVCBnZW5lcmF0ZSBWZW5kb3Igc25hcHNob3QuIEJPQVJEX1ZOREtfVkVSU0lPTiBtdXN0IGJlIHNldCB0byAnY3VycmVudCcuIikKLQlleGl0IDEKLQotZW5kaWYgIyBCT0FSRF9WTkRLX1ZFUlNJT04KZGlmZiAtLWdpdCBhL2NvcmUvdGFza3Mvdm5kay5tayBiL2NvcmUvdGFza3Mvdm5kay5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJlOWJkNC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rhc2tzL3ZuZGsubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1jdXJyZW50X21ha2VmaWxlIDo9ICQobGFzdHdvcmQgJChNQUtFRklMRV9MSVNUKSkKLQotIyBCT0FSRF9WTkRLX1ZFUlNJT04gbXVzdCBiZSBzZXQgdG8gJ2N1cnJlbnQnIGluIG9yZGVyIHRvIGdlbmVyYXRlIGEgVk5ESyBzbmFwc2hvdC4KLWlmZXEgKCQoQk9BUkRfVk5ES19WRVJTSU9OKSxjdXJyZW50KQotCi0jIFBMQVRGT1JNX1ZOREtfVkVSU0lPTiBtdXN0IGJlIHNldC4KLWlmbmVxICgsJChQTEFURk9STV9WTkRLX1ZFUlNJT04pKQotCi0uUEhPTlk6IHZuZGsKLXZuZGs6ICQoU09PTkdfVk5ES19TTkFQU0hPVF9aSVApCi0KLSQoY2FsbCBkaXN0LWZvci1nb2Fscywgdm5kaywgJChTT09OR19WTkRLX1NOQVBTSE9UX1pJUCkpCi0KLWVsc2UgIyBQTEFURk9STV9WTkRLX1ZFUlNJT04gaXMgTk9UIHNldAotZXJyb3JfbXNnIDo9ICJDQU5OT1QgZ2VuZXJhdGUgVk5ESyBzbmFwc2hvdC4gUExBVEZPUk1fVk5ES19WRVJTSU9OIG11c3QgYmUgc2V0LiIKLWVuZGlmICMgUExBVEZPUk1fVk5ES19WRVJTSU9OCi0KLWVsc2UgIyBCT0FSRF9WTkRLX1ZFUlNJT04gaXMgTk9UIHNldCB0byAnY3VycmVudCcKLWVycm9yX21zZyA6PSAiQ0FOTk9UIGdlbmVyYXRlIFZOREsgc25hcHNob3QuIEJPQVJEX1ZOREtfVkVSU0lPTiBtdXN0IGJlIHNldCB0byAnY3VycmVudCcuIgotZW5kaWYgIyBCT0FSRF9WTkRLX1ZFUlNJT04KLQotaWZuZXEgKCwkKGVycm9yX21zZykpCi0KLS5QSE9OWTogdm5kawotdm5kazogUFJJVkFURV9NQUtFRklMRSA6PSAkKGN1cnJlbnRfbWFrZWZpbGUpCi12bmRrOgotCSQoY2FsbCBlY2hvLWVycm9yLCQoUFJJVkFURV9NQUtFRklMRSksJChlcnJvcl9tc2cpKQotCWV4aXQgMQotCi1lbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy92dHMtY29yZS10ZXN0cy5tayBiL2NvcmUvdGFza3MvdnRzLWNvcmUtdGVzdHMubWsKaW5kZXggYmQ3NjUyYi4uMTFiYjkzMiAxMDA2NDQKLS0tIGEvY29yZS90YXNrcy92dHMtY29yZS10ZXN0cy5taworKysgYi9jb3JlL3Rhc2tzL3Z0cy1jb3JlLXRlc3RzLm1rCkBAIC0xNiwxOCArMTYsNiBAQAogdGVzdF9zdWl0ZV90cmFkZWZlZCA6PSB2dHMtdHJhZGVmZWQKIHRlc3Rfc3VpdGVfcmVhZG1lIDo9IHRlc3QvdnRzL3Rvb2xzL3Z0cy1jb3JlLXRyYWRlZmVkL1JFQURNRQogCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS90YXNrcy90b29scy92dHMta2VybmVsLXRlc3RzLm1rCi0KLWx0cF9jb3B5X3BhaXJzIDo9IFwKLSAgJChjYWxsIHRhcmdldC1uYXRpdmUtY29weS1wYWlycywkKGtlcm5lbF9sdHBfbW9kdWxlcyksJChrZXJuZWxfbHRwX3Z0c19vdXQpKQota3NlbGZ0ZXN0X2NvcHlfcGFpcnMgOj0gXAotICAkKGNhbGwgdGFyZ2V0LW5hdGl2ZS1jb3B5LXBhaXJzLCQoa2VybmVsX2tzZWxmdGVzdF9tb2R1bGVzKSwkKGtlcm5lbF9rc2VsZnRlc3RfdnRzX291dCkpCi0KLWNvcHlfbHRwX3Rlc3RzIDo9ICQoY2FsbCBjb3B5LW1hbnktZmlsZXMsJChsdHBfY29weV9wYWlycykpCi1jb3B5X2tzZWxmdGVzdF90ZXN0cyA6PSAkKGNhbGwgY29weS1tYW55LWZpbGVzLCQoa3NlbGZ0ZXN0X2NvcHlfcGFpcnMpKQotCi10ZXN0X3N1aXRlX2V4dHJhX2RlcHMgOj0gJChjb3B5X2x0cF90ZXN0cykgJChjb3B5X2tzZWxmdGVzdF90ZXN0cykKLQogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvdGFza3MvdG9vbHMvY29tcGF0aWJpbGl0eS5tawogCiAuUEhPTlk6IHZ0cwpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy93aXRoLWxpY2Vuc2UubWsgYi9jb3JlL3Rhc2tzL3dpdGgtbGljZW5zZS5tawppbmRleCBkNDFlNzdhLi41Y2E5NzRhIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL3dpdGgtbGljZW5zZS5taworKysgYi9jb3JlL3Rhc2tzL3dpdGgtbGljZW5zZS5tawpAQCAtMjAsNyArMjAsOCBAQAogCW5hbWUgOj0gJChuYW1lKV9kZWJ1ZwogZW5kaWYKIAotbmFtZSA6PSAkKG5hbWUpLWZsYXNoYWJsZS0kKEZJTEVfTkFNRV9UQUcpLXdpdGgtbGljZW5zZQorZGlzdF9uYW1lIDo9ICQobmFtZSktZmxhc2hhYmxlLUZJTEVfTkFNRV9UQUdfUExBQ0VIT0xERVItd2l0aC1saWNlbnNlCituYW1lIDo9ICQobmFtZSktZmxhc2hhYmxlLXdpdGgtbGljZW5zZQogCiB3aXRoX2xpY2Vuc2VfaW50ZXJtZWRpYXRlcyA6PSBcCiAJJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsd2l0aF9saWNlbnNlKQpAQCAtNDIsNiArNDMsNyBAQAogJChjYWxsIGRlY2xhcmUtY29udGFpbmVyLWRlcHMsJChsaWNlbnNlX2ltYWdlX2lucHV0X3ppcCksJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSkpCiAKIHdpdGhfbGljZW5zZV96aXAgOj0gJChQUk9EVUNUX09VVCkvJChuYW1lKS5zaAorZGlzdF9uYW1lIDo9ICQoZGlzdF9uYW1lKS5zaAogJCh3aXRoX2xpY2Vuc2VfemlwKTogUFJJVkFURV9OQU1FIDo9ICQobmFtZSkKICQod2l0aF9saWNlbnNlX3ppcCk6IFBSSVZBVEVfSU5QVVRfWklQIDo9ICQobGljZW5zZV9pbWFnZV9pbnB1dF96aXApCiAkKHdpdGhfbGljZW5zZV96aXApOiBQUklWQVRFX1ZFTkRPUl9CTE9CU19MSUNFTlNFIDo9ICQoVkVORE9SX0JMT0JTX0xJQ0VOU0UpCkBAIC01MSw3ICs1Myw3IEBACiAJJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZ2VuZXJhdGUtc2VsZi1leHRyYWN0aW5nLWFyY2hpdmUgJEAgXAogCQkkKFBSSVZBVEVfSU5QVVRfWklQKSAkKFBSSVZBVEVfTkFNRSkgJChQUklWQVRFX1ZFTkRPUl9CTE9CU19MSUNFTlNFKQogd2l0aC1saWNlbnNlIDogJCh3aXRoX2xpY2Vuc2VfemlwKQotJChjYWxsIGRpc3QtZm9yLWdvYWxzLCB3aXRoLWxpY2Vuc2UsICQod2l0aF9saWNlbnNlX3ppcCkpCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIHdpdGgtbGljZW5zZSwgJCh3aXRoX2xpY2Vuc2VfemlwKTokKGRpc3RfbmFtZSkpCiAKICQoY2FsbCBkZWNsYXJlLTFwLWNvbnRhaW5lciwkKHdpdGhfbGljZW5zZV96aXApLCkKICQoY2FsbCBkZWNsYXJlLWNvbnRhaW5lci1saWNlbnNlLWRlcHMsJCh3aXRoX2xpY2Vuc2VfemlwKSwkKGxpY2Vuc2VfaW1hZ2VfaW5wdXRfemlwKSwkKHdpdGhfbGljZW5zZV96aXApOikKZGlmZiAtLWdpdCBhL2NvcmUvdmVyc2lvbl9kZWZhdWx0cy5tayBiL2NvcmUvdmVyc2lvbl9kZWZhdWx0cy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI5NWFlZC4uMDAwMDAwMAotLS0gYS9jb3JlL3ZlcnNpb25fZGVmYXVsdHMubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIwotIyBIYW5kbGUgdmFyaW91cyBidWlsZCB2ZXJzaW9uIGluZm9ybWF0aW9uLgotIwotIyBHdWFyYW50ZWVzIHRoYXQgdGhlIGZvbGxvd2luZyBhcmUgZGVmaW5lZDoKLSMgICAgIFBMQVRGT1JNX1ZFUlNJT04KLSMgICAgIFBMQVRGT1JNX0RJU1BMQVlfVkVSU0lPTgotIyAgICAgUExBVEZPUk1fU0RLX1ZFUlNJT04KLSMgICAgIFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUKLSMgICAgIERFRkFVTFRfQVBQX1RBUkdFVF9TREsKLSMgICAgIEJVSUxEX0lECi0jICAgICBCVUlMRF9OVU1CRVIKLSMgICAgIFBMQVRGT1JNX1NFQ1VSSVRZX1BBVENICi0jICAgICBQTEFURk9STV9WTkRLX1ZFUlNJT04KLSMgICAgIFBMQVRGT1JNX1NZU1RFTVNES19WRVJTSU9OUwotIwotCi0jIExvb2sgZm9yIGFuIG9wdGlvbmFsIGZpbGUgY29udGFpbmluZyBvdmVycmlkZXMgb2YgdGhlIGRlZmF1bHRzLAotIyBidXQgZG9uJ3QgY3J5IGlmIHdlIGRvbid0IGZpbmQgaXQuICBXZSBjb3VsZCBqdXN0IHVzZSAtaW5jbHVkZSwgYnV0Ci0jIHRoZSBidWlsZC5wcm9wIHRhcmdldCBhbHNvIHdhbnRzIElOVEVSTkFMX0JVSUxEX0lEX01BS0VGSUxFIHRvIGJlIHNldAotIyBpZiB0aGUgZmlsZSBleGlzdHMuCi0jCi1JTlRFUk5BTF9CVUlMRF9JRF9NQUtFRklMRSA6PSAkKHdpbGRjYXJkICQoQlVJTERfU1lTVEVNKS9idWlsZF9pZC5taykKLWlmZGVmIElOVEVSTkFMX0JVSUxEX0lEX01BS0VGSUxFCi0gIGluY2x1ZGUgJChJTlRFUk5BTF9CVUlMRF9JRF9NQUtFRklMRSkKLWVuZGlmCi0KLURFRkFVTFRfUExBVEZPUk1fVkVSU0lPTiA6PSBVUDFBCi0uS0FUSV9SRUFET05MWSA6PSBERUZBVUxUX1BMQVRGT1JNX1ZFUlNJT04KLU1JTl9QTEFURk9STV9WRVJTSU9OIDo9IFVQMUEKLU1BWF9QTEFURk9STV9WRVJTSU9OIDo9IFZQMUEKLQotIyBUaGUgbGFzdCBzdGFibGUgdmVyc2lvbiBuYW1lIG9mIHRoZSBwbGF0Zm9ybSB0aGF0IHdhcyByZWxlYXNlZC4gIER1cmluZwotIyBkZXZlbG9wbWVudCwgdGhpcyBzdGF5cyBhdCB0aGF0IHByZXZpb3VzIHZlcnNpb24sIHdoaWxlIHRoZSBjb2RlbmFtZSBpbmRpY2F0ZXMKLSMgZnVydGhlciB3b3JrIGJhc2VkIG9uIHRoZSBwcmV2aW91cyB2ZXJzaW9uLgotUExBVEZPUk1fVkVSU0lPTl9MQVNUX1NUQUJMRSA6PSAxNAotLktBVElfUkVBRE9OTFkgOj0gUExBVEZPUk1fVkVSU0lPTl9MQVNUX1NUQUJMRQotCi0jIFRoZXNlIGFyZSB0aGUgY3VycmVudCBkZXZlbG9wbWVudCBjb2RlbmFtZXMsIGlmIHRoZSBidWlsZCBpcyBub3QgYSBmaW5hbAotIyByZWxlYXNlIGJ1aWxkLiAgSWYgdGhpcyBpcyBhIGZpbmFsIHJlbGVhc2UgYnVpbGQsIGl0IGlzIHNpbXBseSAiUkVMIi4KLVBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUuVVAxQSA6PSBSRUwKLVBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUuVlAxQSA6PSBWYW5pbGxhSWNlQ3JlYW0KLQotIyBUaGlzIGlzIHRoZSB1c2VyLXZpc2libGUgdmVyc2lvbi4gIEluIGEgZmluYWwgcmVsZWFzZSBidWlsZCBpdCBzaG91bGQKLSMgYmUgZW1wdHkgdG8gdXNlIFBMQVRGT1JNX1ZFUlNJT04gYXMgdGhlIHVzZXItdmlzaWJsZSB2ZXJzaW9uLiAgRm9yCi0jIGEgcHJldmlldyByZWxlYXNlIGl0IGNhbiBiZSBzZXQgdG8gYSB1c2VyLWZyaWVuZGx5IHZhbHVlIGxpa2UgYDEyIFByZXZpZXcgMWAKLVBMQVRGT1JNX0RJU1BMQVlfVkVSU0lPTiA6PQotCi1pZm5kZWYgUExBVEZPUk1fU0RLX1ZFUlNJT04KLSAgIyBUaGlzIGlzIHRoZSBjYW5vbmljYWwgZGVmaW5pdGlvbiBvZiB0aGUgU0RLIHZlcnNpb24sIHdoaWNoIGRlZmluZXMKLSAgIyB0aGUgc2V0IG9mIEFQSXMgYW5kIGZ1bmN0aW9uYWxpdHkgYXZhaWxhYmxlIGluIHRoZSBwbGF0Zm9ybS4gIEl0Ci0gICMgaXMgYSBzaW5nbGUgaW50ZWdlciB0aGF0IGluY3JlYXNlcyBtb25vdG9uaWNhbGx5IGFzIHVwZGF0ZXMgdG8KLSAgIyB0aGUgU0RLIGFyZSByZWxlYXNlZC4gIEl0IHNob3VsZCBvbmx5IGJlIGluY3JlbWVudGVkIHdoZW4gdGhlIEFQSXMgZm9yCi0gICMgdGhlIG5ldyByZWxlYXNlIGFyZSBmcm96ZW4gKHNvIHRoYXQgZGV2ZWxvcGVycyBkb24ndCB3cml0ZSBhcHBzIGFnYWluc3QKLSAgIyBpbnRlcm1lZGlhdGUgYnVpbGRzKS4gIER1cmluZyBkZXZlbG9wbWVudCwgdGhpcyBudW1iZXIgcmVtYWlucyBhdCB0aGUKLSAgIyBTREsgdmVyc2lvbiB0aGUgYnJhbmNoIGlzIGJhc2VkIG9uIGFuZCBQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FIGhvbGRzCi0gICMgdGhlIGNvZGUtbmFtZSBvZiB0aGUgbmV3IGRldmVsb3BtZW50IHdvcmsuCi0KLSAgIyBXaGVuIHlvdSBpbmNyZW1lbnQgdGhlIFBMQVRGT1JNX1NES19WRVJTSU9OIHBsZWFzZSBlbnN1cmUgeW91IGFsc28KLSAgIyBjbGVhciBvdXQgdGhlIGZvbGxvd2luZyB0ZXh0IGZpbGUgb2YgYWxsIG9sZGVyIFBMQVRGT1JNX1ZFUlNJT04nczoKLSAgIyBjdHMvdGVzdHMvdGVzdHMvb3MvYXNzZXRzL3BsYXRmb3JtX3ZlcnNpb25zLnR4dAotICBQTEFURk9STV9TREtfVkVSU0lPTiA6PSAzNAotZW5kaWYKLS5LQVRJX1JFQURPTkxZIDo9IFBMQVRGT1JNX1NES19WRVJTSU9OCi0KLSMgVGhpcyBpcyB0aGUgc2RrIGV4dGVuc2lvbiB2ZXJzaW9uIG9mIHRoaXMgdHJlZS4KLVBMQVRGT1JNX1NES19FWFRFTlNJT05fVkVSU0lPTiA6PSA3Ci0uS0FUSV9SRUFET05MWSA6PSBQTEFURk9STV9TREtfRVhURU5TSU9OX1ZFUlNJT04KLQotIyBUaGlzIGlzIHRoZSBzZGsgZXh0ZW5zaW9uIHZlcnNpb24gdGhhdCBQTEFURk9STV9TREtfVkVSU0lPTiBzaGlwcyB3aXRoLgotUExBVEZPUk1fQkFTRV9TREtfRVhURU5TSU9OX1ZFUlNJT04gOj0gJChQTEFURk9STV9TREtfRVhURU5TSU9OX1ZFUlNJT04pCi0uS0FUSV9SRUFET05MWSA6PSBQTEFURk9STV9CQVNFX1NES19FWFRFTlNJT05fVkVSU0lPTgotCi0jIFRoaXMgYXJlIGFsbCBrbm93biBjb2RlbmFtZXMuCi1QTEFURk9STV9WRVJTSU9OX0tOT1dOX0NPREVOQU1FUyA6PSBcCi1CYXNlIEJhc2UxMSBDdXBjYWtlIERvbnV0IEVjbGFpciBFY2xhaXIwMSBFY2xhaXJNcjEgRnJveW8gR2luZ2VyYnJlYWQgR2luZ2VyYnJlYWRNcjEgXAotSG9uZXljb21iIEhvbmV5Y29tYk1yMSBIb25leWNvbWJNcjIgSWNlQ3JlYW1TYW5kd2ljaCBJY2VDcmVhbVNhbmR3aWNoTXIxIFwKLUplbGx5QmVhbiBKZWxseUJlYW5NcjEgSmVsbHlCZWFuTXIyIEtpdGthdCBLaXRrYXRXYXRjaCBMb2xsaXBvcCBMb2xsaXBvcE1yMSBNIE4gTk1yMSBPIE9NcjEgUCBcCi1RIFIgUyBTdjIgVGlyYW1pc3UgVXBzaWRlRG93bkNha2UKLQotIyBDb252ZXJ0IGZyb20gc3BhY2Ugc2VwYXJhdGVkIGxpc3QgdG8gY29tbWEgc2VwYXJhdGVkCi1QTEFURk9STV9WRVJTSU9OX0tOT1dOX0NPREVOQU1FUyA6PSBcCi0gICQoY2FsbCBub3JtYWxpemUtY29tbWEtbGlzdCwkKFBMQVRGT1JNX1ZFUlNJT05fS05PV05fQ09ERU5BTUVTKSkKLS5LQVRJX1JFQURPTkxZIDo9IFBMQVRGT1JNX1ZFUlNJT05fS05PV05fQ09ERU5BTUVTCi0KLWlmbmRlZiBQTEFURk9STV9TRUNVUklUWV9QQVRDSAotICAgICMgIFVzZWQgdG8gaW5kaWNhdGUgdGhlIHNlY3VyaXR5IHBhdGNoIHRoYXQgaGFzIGJlZW4gYXBwbGllZCB0byB0aGUgZGV2aWNlLgotICAgICMgIEl0IG11c3Qgc2lnbmlmeSB0aGF0IHRoZSBidWlsZCBpbmNsdWRlcyBhbGwgc2VjdXJpdHkgcGF0Y2hlcyBpc3N1ZWQgdXAgdGhyb3VnaCB0aGUgZGVzaWduYXRlZCBBbmRyb2lkIFB1YmxpYyBTZWN1cml0eSBCdWxsZXRpbi4KLSAgICAjICBJdCBtdXN0IGJlIG9mIHRoZSBmb3JtICJZWVlZLU1NLUREIiBvbiBwcm9kdWN0aW9uIGRldmljZXMuCi0gICAgIyAgSXQgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIEFuZHJvaWQgU2VjdXJpdHkgUGF0Y2ggTGV2ZWwgc3RyaW5ncyBvZiB0aGUgUHVibGljIFNlY3VyaXR5IEJ1bGxldGlucy4KLSAgICAjICBJZiB0aGVyZSBpcyBubyAkUExBVEZPUk1fU0VDVVJJVFlfUEFUQ0ggc2V0LCBrZWVwIGl0IGVtcHR5LgotICAgIFBMQVRGT1JNX1NFQ1VSSVRZX1BBVENIIDo9IDIwMjUtMDMtMDEKLWVuZGlmCi0KLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL3ZlcnNpb25fdXRpbC5tawpkaWZmIC0tZ2l0IGEvY29yZS92ZXJzaW9uX3V0aWwubWsgYi9jb3JlL3ZlcnNpb25fdXRpbC5tawppbmRleCAwYTQ1Mjk2Li5jYzk0MDYzIDEwMDY0NAotLS0gYS9jb3JlL3ZlcnNpb25fdXRpbC5taworKysgYi9jb3JlL3ZlcnNpb25fdXRpbC5tawpAQCAtMTQsMTAzICsxNCwxMTUgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKKworIworIyBIYW5kbGUgdmFyaW91cyBidWlsZCB2ZXJzaW9uIGluZm9ybWF0aW9uLgorIworIyBHdWFyYW50ZWVzIHRoYXQgdGhlIGZvbGxvd2luZyBhcmUgZGVmaW5lZDoKKyMgICAgIFBMQVRGT1JNX1ZFUlNJT04KKyMgICAgIFBMQVRGT1JNX0RJU1BMQVlfVkVSU0lPTgorIyAgICAgUExBVEZPUk1fU0RLX1ZFUlNJT04KKyMgICAgIFBMQVRGT1JNX1NES19WRVJTSU9OX0ZVTEwKKyMgICAgIFBMQVRGT1JNX1NES19FWFRFTlNJT05fVkVSU0lPTgorIyAgICAgUExBVEZPUk1fQkFTRV9TREtfRVhURU5TSU9OX1ZFUlNJT04KKyMgICAgIFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUKKyMgICAgIERFRkFVTFRfQVBQX1RBUkdFVF9TREsKKyMgICAgIEJVSUxEX0lECisjICAgICBCVUlMRF9OVU1CRVIKKyMgICAgIFBMQVRGT1JNX1NFQ1VSSVRZX1BBVENICisjICAgICBQTEFURk9STV9TWVNURU1TREtfVkVSU0lPTlMKKyMgICAgIFBMQVRGT1JNX1ZFUlNJT05fTEFTVF9TVEFCTEUKKyMgICAgIFBMQVRGT1JNX1ZFUlNJT05fS05PV05fQ09ERU5BTUVTCiAjCiAKLUFMTE9XRURfVkVSU0lPTlMgOj0gJChjYWxsIGFsbG93ZWQtcGxhdGZvcm0tdmVyc2lvbnMsXAotICAkKE1JTl9QTEFURk9STV9WRVJTSU9OKSxcCi0gICQoTUFYX1BMQVRGT1JNX1ZFUlNJT04pLFwKLSAgJChERUZBVUxUX1BMQVRGT1JNX1ZFUlNJT04pKQotCi1pZm5kZWYgVEFSR0VUX1BMQVRGT1JNX1ZFUlNJT04KLSAgVEFSR0VUX1BMQVRGT1JNX1ZFUlNJT04gOj0gJChERUZBVUxUX1BMQVRGT1JNX1ZFUlNJT04pCisjIExvb2sgZm9yIGFuIG9wdGlvbmFsIGZpbGUgY29udGFpbmluZyBvdmVycmlkZXMgb2YgdGhlIGRlZmF1bHRzLAorIyBidXQgZG9uJ3QgY3J5IGlmIHdlIGRvbid0IGZpbmQgaXQuICBXZSBjb3VsZCBqdXN0IHVzZSAtaW5jbHVkZSwgYnV0CisjIHRoZSBidWlsZC5wcm9wIHRhcmdldCBhbHNvIHdhbnRzIElOVEVSTkFMX0JVSUxEX0lEX01BS0VGSUxFIHRvIGJlIHNldAorIyBpZiB0aGUgZmlsZSBleGlzdHMuCisjCitJTlRFUk5BTF9CVUlMRF9JRF9NQUtFRklMRSA6PSAkKHdpbGRjYXJkICQoQlVJTERfU1lTVEVNKS9idWlsZF9pZC5taykKK2lmZGVmIElOVEVSTkFMX0JVSUxEX0lEX01BS0VGSUxFCisgIGluY2x1ZGUgJChJTlRFUk5BTF9CVUlMRF9JRF9NQUtFRklMRSkKIGVuZGlmCiAKLWlmZXEgKCwkKGZpbHRlciAkKEFMTE9XRURfVkVSU0lPTlMpLCAkKFRBUkdFVF9QTEFURk9STV9WRVJTSU9OKSkpCi0gICQod2FybmluZyBJbnZhbGlkIFRBUkdFVF9QTEFURk9STV9WRVJTSU9OICckKFRBUkdFVF9QTEFURk9STV9WRVJTSU9OKScsIG11c3QgYmUgb25lIG9mKQotICAkKGVycm9yICQoQUxMT1dFRF9WRVJTSU9OUykpCitpZmRlZiBUQVJHRVRfUExBVEZPUk1fVkVSU0lPTgorICAkKGVycm9yIERvIG5vdCBzZXQgVEFSR0VUX1BMQVRGT1JNX1ZFUlNJT04gZGlyZWN0bHkuIFVzZSBSRUxFQVNFX1BMQVRGT1JNX1ZFUlNJT04uIHZhbHVlOiAkKFRBUkdFVF9QTEFURk9STV9WRVJTSU9OKSkKIGVuZGlmCi1BTExPV0VEX1ZFUlNJT05TIDo9Ci1NSU5fUExBVEZPUk1fVkVSU0lPTiA6PQotTUFYX1BMQVRGT1JNX1ZFUlNJT04gOj0KLQorVEFSR0VUX1BMQVRGT1JNX1ZFUlNJT04gOj0gJChSRUxFQVNFX1BMQVRGT1JNX1ZFUlNJT04pCiAuS0FUSV9SRUFET05MWSA6PSBUQVJHRVRfUExBVEZPUk1fVkVSU0lPTgogCi0jIERlZmF1bHQgdmVyc2lvbnMgZm9yIGVhY2ggVEFSR0VUX1BMQVRGT1JNX1ZFUlNJT04KLSMgVE9ETzogUExBVEZPUk1fVkVSU0lPTiwgUExBVEZPUk1fU0RLX1ZFUlNJT04sIGV0Yy4gc2hvdWxkIGJlIGNvbmRpdGlvbmFsCi0jIG9uIHRoaXMKLQotIyBUaGlzIGlzIHRoZSBjYW5vbmljYWwgZGVmaW5pdGlvbiBvZiB0aGUgcGxhdGZvcm0gdmVyc2lvbiwKLSMgd2hpY2ggaXMgdGhlIHZlcnNpb24gdGhhdCB3ZSByZXZlYWwgdG8gdGhlIGVuZCB1c2VyLgotIyBVcGRhdGUgdGhpcyB2YWx1ZSB3aGVuIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIGNoYW5nZXMgKHJhdGhlcgotIyB0aGFuIG92ZXJyaWRpbmcgaXQgc29tZXdoZXJlIGVsc2UpLiAgQ2FuIGJlIGFuIGFyYml0cmFyeSBzdHJpbmcuCi0KLSMgV2hlbiB5b3UgY2hhbmdlIFBMQVRGT1JNX1ZFUlNJT04gZm9yIGEgZ2l2ZW4gUExBVEZPUk1fU0RLX1ZFUlNJT04KLSMgcGxlYXNlIGFkZCB0aGF0IFBMQVRGT1JNX1ZFUlNJT04gYXMgd2VsbCBhcyBjbGVhbiB1cCBvYnNvbGV0ZSBQTEFURk9STV9WRVJTSU9OJ3MKLSMgaW4gdGhlIGZvbGxvd2luZyB0ZXh0IGZpbGU6Ci0jIGN0cy90ZXN0cy90ZXN0cy9vcy9hc3NldHMvcGxhdGZvcm1fdmVyc2lvbnMudHh0Ci0KLSMgTm90ZSB0aGF0IHRoZXJlIHNob3VsZCBiZSBvbmUgUExBVEZPUk1fVkVSU0lPTiBhbmQgUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRQotIyBlbnRyeSBmb3IgZWFjaCB1bnJlbGVhc2VkIEFQSSBsZXZlbCwgcmVnYXJkbGVzcyBvZgotIyBNSU5fUExBVEZPUk1fVkVSU0lPTi9NQVhfUExBVEZPUk1fVkVSU0lPTi4gUExBVEZPUk1fVkVSU0lPTiBpcyB1c2VkIHRvCi0jIGdlbmVyYXRlIHRoZSByYW5nZSBvZiBhbGxvd2VkIFNESyB2ZXJzaW9ucywgc28gaXQgbXVzdCBoYXZlIGFuIGVudHJ5IGZvciBldmVyeQotIyB1bnJlbGVhc2VkIEFQSSBsZXZlbCB0YXJnZXRhYmxlIGJ5IHRoaXMgYnJhbmNoLCBub3QganVzdCB0aG9zZSB0aGF0IGFyZSB2YWxpZAotIyBsdW5jaCB0YXJnZXRzIGZvciB0aGlzIGJyYW5jaC4KLQotUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSA6PSAkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUuJChUQVJHRVRfUExBVEZPUk1fVkVSU0lPTikpCi1pZm5kZWYgUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRQotICAjIFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUgZmFsbHMgYmFjayB0byBUQVJHRVRfUExBVEZPUk1fVkVSU0lPTgotICBQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FIDo9ICQoVEFSR0VUX1BMQVRGT1JNX1ZFUlNJT04pCitpZmRlZiBQTEFURk9STV9TRUNVUklUWV9QQVRDSAorICAkKGVycm9yIERvIG5vdCBzZXQgUExBVEZPUk1fU0VDVVJJVFlfUEFUQ0ggZGlyZWN0bHkuIFVzZSBSRUxFQVNFX1BMQVRGT1JNX1NFQ1VSSVRZX1BBVENILiB2YWx1ZTogJChQTEFURk9STV9TRUNVUklUWV9QQVRDSCkpCiBlbmRpZgorUExBVEZPUk1fU0VDVVJJVFlfUEFUQ0ggOj0gJChSRUxFQVNFX1BMQVRGT1JNX1NFQ1VSSVRZX1BBVENIKQorLktBVElfUkVBRE9OTFkgOj0gUExBVEZPUk1fU0VDVVJJVFlfUEFUQ0gKIAotIyBUaGlzIGlzIGFsbCBvZiB0aGUgKmFjdGl2ZSogZGV2ZWxvcG1lbnQgY29kZW5hbWVzLgotIyBUaGlzIGNvbmZ1c2luZyBuYW1lIGlzIG5lZWRlZCBiZWNhdXNlCi0jIGFsbF9jb2RlbmFtZXMgaGFzIGJlZW4gYmFrZWQgaW50byBidWlsZC5wcm9wIGZvciBhZ2VzLgotIwotIyBTaG91bGQgYmUgZWl0aGVyIHRoZSBzYW1lIGFzIFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUgb3IgYSBjb21tYS1zZXBhcmF0ZWQKLSMgbGlzdCBvZiBhZGRpdGlvbmFsIGNvZGVuYW1lcyBhZnRlciBQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FLgotUExBVEZPUk1fVkVSU0lPTl9BTExfQ09ERU5BTUVTIDo9CitpZmRlZiBQTEFURk9STV9TREtfVkVSU0lPTgorICAkKGVycm9yIERvIG5vdCBzZXQgUExBVEZPUk1fU0RLX1ZFUlNJT04gZGlyZWN0bHkuIFVzZSBSRUxFQVNFX1BMQVRGT1JNX1NES19WRVJTSU9OLiB2YWx1ZTogJChQTEFURk9STV9TREtfVkVSU0lPTikpCitlbmRpZgorUExBVEZPUk1fU0RLX1ZFUlNJT04gOj0gJChSRUxFQVNFX1BMQVRGT1JNX1NES19WRVJTSU9OKQorLktBVElfUkVBRE9OTFkgOj0gUExBVEZPUk1fU0RLX1ZFUlNJT04KIAotIyBCdWlsZCBhIGxpc3Qgb2YgYWxsIGFjdGl2ZSBjb2RlIG5hbWVzLiBBdm9pZCBkdXBsaWNhdGVzLCBhbmQgc3RvcCB3aGVuIHdlCi0jIHJlYWNoIGEgY29kZW5hbWUgdGhhdCBtYXRjaGVzIFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUgKGFueXRoaW5nIGJleW9uZAotIyB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiBvdXIgYnVpbGQpLgotX3ZlcnNpb25zX2luX3RhcmdldCA6PSBcCi0gICQoY2FsbCBmaW5kX2FuZF9lYXJsaWVyLCQoQUxMX1ZFUlNJT05TKSwkKFRBUkdFVF9QTEFURk9STV9WRVJTSU9OKSkKLSQoZm9yZWFjaCB2ZXJzaW9uLCQoX3ZlcnNpb25zX2luX3RhcmdldCksXAotICAkKGV2YWwgX2NvZGVuYW1lIDo9ICQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRS4kKHZlcnNpb24pKSlcCi0gICQoaWYgJChmaWx0ZXIgJChfY29kZW5hbWUpLCQoUExBVEZPUk1fVkVSU0lPTl9BTExfQ09ERU5BTUVTKSksLFwKLSAgICAkKGV2YWwgUExBVEZPUk1fVkVSU0lPTl9BTExfQ09ERU5BTUVTICs9ICQoX2NvZGVuYW1lKSkpKQotCi0jIEFuZCB0aGUgbGlzdCBvZiBhY3R1YWxseSBhbGwgdGhlIGNvZGVuYW1lcyB0aGF0IGFyZSBpbiBwcmV2aWV3LiBUaGUKLSMgQUxMX0NPREVOQU1FUyB2YXJpYWJsZSBpcyBzb3J0IG9mIGEgbGllIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMgYW5kIG9ubHkKLSMgaW5jbHVkZXMgY29kZW5hbWVzIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGN1cnJlbnRseSBhY3RpdmUgY29kZW5hbWUsIHdoZXJlYXMKLSMgdGhpcyB2YXJpYWJsZSBhbHNvIGluY2x1ZGVzIGZ1dHVyZSBjb2RlbmFtZXMuIEZvciBleGFtcGxlLCB3aGlsZSBBT1NQIGlzIHN0aWxsCi0jIG1lcmdpbmcgaW50byBVLCBidXQgViBkZXZlbG9wbWVudCBoYXMgc3RhcnRlZCwgQUxMX0NPREVOQU1FUyB3aWxsIG9ubHkgYmUgVSwKLSMgYnV0IEFMTF9QUkVWSUVXX0NPREVOQU1FUyB3aWxsIGJlIFUgYW5kIFYuCi1QTEFURk9STV9WRVJTSU9OX0FMTF9QUkVWSUVXX0NPREVOQU1FUyA6PQotJChmb3JlYWNoIHZlcnNpb24sJChBTExfVkVSU0lPTlMpLFwKLSAgJChldmFsIF9jb2RlbmFtZSA6PSAkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUuJCh2ZXJzaW9uKSkpXAotICAkKGlmICQoZmlsdGVyICQoX2NvZGVuYW1lKSwkKFBMQVRGT1JNX1ZFUlNJT05fQUxMX1BSRVZJRVdfQ09ERU5BTUVTKSksLFwKLSAgICAkKGV2YWwgUExBVEZPUk1fVkVSU0lPTl9BTExfUFJFVklFV19DT0RFTkFNRVMgKz0gJChfY29kZW5hbWUpKSkpCi0KLSMgQW5kIGNvbnZlcnQgZnJvbSBzcGFjZSBzZXBhcmF0ZWQgdG8gY29tbWEgc2VwYXJhdGVkLgotUExBVEZPUk1fVkVSU0lPTl9BTExfQ09ERU5BTUVTIDo9IFwKLSAgJChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKHN0cmlwICQoUExBVEZPUk1fVkVSU0lPTl9BTExfQ09ERU5BTUVTKSkpCi1QTEFURk9STV9WRVJTSU9OX0FMTF9QUkVWSUVXX0NPREVOQU1FUyA6PSBcCi0gICQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJChzdHJpcCAkKFBMQVRGT1JNX1ZFUlNJT05fQUxMX1BSRVZJRVdfQ09ERU5BTUVTKSkpCi0KLS5LQVRJX1JFQURPTkxZIDo9IFwKLSAgUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSBcCi0gIFBMQVRGT1JNX1ZFUlNJT05fQUxMX0NPREVOQU1FUyBcCi0gIFBMQVRGT1JNX1ZFUlNJT05fQUxMX1BSRVZJRVdfQ09ERU5BTUVTIFwKLQotaWZuZXEgKFJFTCwkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUpKQotICBjb2RlbmFtZXMgOj0gXAotICAgICQoc3Vic3QgJChjb21tYSksJChzcGFjZSksJChzdHJpcCAkKFBMQVRGT1JNX1ZFUlNJT05fS05PV05fQ09ERU5BTUVTKSkpCi0gIGlmZXEgKCQoZmlsdGVyICQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSksJChjb2RlbmFtZXMpKSwpCi0gICAgJChlcnJvciAnJChQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FKScgaXMgbm90IGluICckKGNvZGVuYW1lcyknLiBcCi0gICAgICAgIEFkZCBQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FIHRvIFBMQVRGT1JNX1ZFUlNJT05fS05PV05fQ09ERU5BTUVTKQoraWZkZWYgUExBVEZPUk1fU0RLX1ZFUlNJT05fRlVMTAorICAkKGVycm9yIERvIG5vdCBzZXQgUExBVEZPUk1fU0RLX1ZFUlNJT05fRlVMTCBkaXJlY3RseS4gVXNlIFJFTEVBU0VfUExBVEZPUk1fU0RLX1ZFUlNJT05fRlVMTC4gdmFsdWU6ICQoUExBVEZPUk1fU0RLX1ZFUlNJT05fRlVMTCkpCitlbmRpZgoraWZlcSAoJChSRUxFQVNFX1BMQVRGT1JNX1NES19WRVJTSU9OX0ZVTEwpLCkKKyAgUExBVEZPUk1fU0RLX1ZFUlNJT05fRlVMTCA6PSAiJChQTEFURk9STV9TREtfVkVSU0lPTikuMCIKK2Vsc2UKKyAgaWZuZXEgKCQoUkVMRUFTRV9QTEFURk9STV9TREtfVkVSU0lPTiksJCh3b3JkIDEsJChzdWJzdCAuLCAsJChSRUxFQVNFX1BMQVRGT1JNX1NES19WRVJTSU9OX0ZVTEwpKSkpCisgICAgJChlcnJvciBpZiBSRUxFQVNFX1BMQVRGT1JNX1NES19WRVJTSU9OX0ZVTEwgKCQoUkVMRUFTRV9QTEFURk9STV9TREtfVkVSU0lPTl9GVUxMKSkgaXMgc2V0LCBpdHMgbWFqb3IgdmVyc2lvbiBtdXN0IG1hdGNoIFJFTEVBU0VfUExBVEZPUk1fU0RLX1ZFUlNJT04gKCQoUkVMRUFTRV9QTEFURk9STV9TREtfVkVSU0lPTikpKQogICBlbmRpZgorICBQTEFURk9STV9TREtfVkVSU0lPTl9GVUxMIDo9ICIkKFJFTEVBU0VfUExBVEZPUk1fU0RLX1ZFUlNJT05fRlVMTCkiCiBlbmRpZgorLktBVElfUkVBRE9OTFkgOj0gUExBVEZPUk1fU0RLX1ZFUlNJT05fRlVMTAorCitpZmRlZiBQTEFURk9STV9TREtfRVhURU5TSU9OX1ZFUlNJT04KKyAgJChlcnJvciBEbyBub3Qgc2V0IFBMQVRGT1JNX1NES19FWFRFTlNJT05fVkVSU0lPTiBkaXJlY3RseS4gVXNlIFJFTEVBU0VfUExBVEZPUk1fU0RLX0VYVEVOU0lPTl9WRVJTSU9OLiB2YWx1ZTogJChQTEFURk9STV9TREtfRVhURU5TSU9OX1ZFUlNJT04pKQorZW5kaWYKK1BMQVRGT1JNX1NES19FWFRFTlNJT05fVkVSU0lPTiA6PSAkKFJFTEVBU0VfUExBVEZPUk1fU0RLX0VYVEVOU0lPTl9WRVJTSU9OKQorLktBVElfUkVBRE9OTFkgOj0gUExBVEZPUk1fU0RLX0VYVEVOU0lPTl9WRVJTSU9OCisKK2lmZGVmIFBMQVRGT1JNX0JBU0VfU0RLX0VYVEVOU0lPTl9WRVJTSU9OCisgICQoZXJyb3IgRG8gbm90IHNldCBQTEFURk9STV9CQVNFX1NES19FWFRFTlNJT05fVkVSU0lPTiBkaXJlY3RseS4gVXNlIFJFTEVBU0VfUExBVEZPUk1fQkFTRV9TREtfRVhURU5TSU9OX1ZFUlNJT04uIHZhbHVlOiAkKFBMQVRGT1JNX0JBU0VfU0RLX0VYVEVOU0lPTl9WRVJTSU9OKSkKK2VuZGlmCitpZmRlZiBSRUxFQVNFX1BMQVRGT1JNX0JBU0VfU0RLX0VYVEVOU0lPTl9WRVJTSU9OCisgICMgVGhpcyBpcyB0aGUgc2RrIGV4dGVuc2lvbiB2ZXJzaW9uIHRoYXQgUExBVEZPUk1fU0RLX1ZFUlNJT04gc2hpcHMgd2l0aC4KKyAgUExBVEZPUk1fQkFTRV9TREtfRVhURU5TSU9OX1ZFUlNJT04gOj0gJChSRUxFQVNFX1BMQVRGT1JNX0JBU0VfU0RLX0VYVEVOU0lPTl9WRVJTSU9OKQorZWxzZQorICAjIEZhbGxiYWNrIHRvIFBMQVRGT1JNX1NES19FWFRFTlNJT05fVkVSU0lPTiBpZiBSRUxFQVNFX1BMQVRGT1JNX0JBU0VfU0RLX0VYVEVOU0lPTl9WRVJTSU9OIGlzIHVuZGVmaW5lZC4KKyAgUExBVEZPUk1fQkFTRV9TREtfRVhURU5TSU9OX1ZFUlNJT04gOj0gJChQTEFURk9STV9TREtfRVhURU5TSU9OX1ZFUlNJT04pCitlbmRpZgorLktBVElfUkVBRE9OTFkgOj0gUExBVEZPUk1fQkFTRV9TREtfRVhURU5TSU9OX1ZFUlNJT04KKworaWZkZWYgUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRQorICAkKGVycm9yIERvIG5vdCBzZXQgUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSBkaXJlY3RseS4gVXNlIFJFTEVBU0VfUExBVEZPUk1fVkVSU0lPTi4gdmFsdWU6ICQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkpCitlbmRpZgorUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSA6PSAkKFJFTEVBU0VfUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkKKy5LQVRJX1JFQURPTkxZIDo9IFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUKKworaWZkZWYgUExBVEZPUk1fVkVSU0lPTl9BTExfQ09ERU5BTUVTCisgICQoZXJyb3IgRG8gbm90IHNldCBQTEFURk9STV9WRVJTSU9OX0FMTF9DT0RFTkFNRVMgZGlyZWN0bHkuIFVzZSBSRUxFQVNFX1BMQVRGT1JNX1ZFUlNJT05fQUxMX0NPREVOQU1FUy4gdmFsdWU6ICQoUExBVEZPUk1fVkVSU0lPTl9BTExfQ09ERU5BTUVTKSkKK2VuZGlmCitQTEFURk9STV9WRVJTSU9OX0FMTF9DT0RFTkFNRVMgOj0gJChSRUxFQVNFX1BMQVRGT1JNX1ZFUlNJT05fQUxMX0NPREVOQU1FUykKKy5LQVRJX1JFQURPTkxZIDo9IFBMQVRGT1JNX1ZFUlNJT05fQUxMX0NPREVOQU1FUworCitpZmRlZiBQTEFURk9STV9WRVJTSU9OX0FMTF9QUkVWSUVXX0NPREVOQU1FUworICAkKGVycm9yIERvIG5vdCBzZXQgUExBVEZPUk1fVkVSU0lPTl9BTExfUFJFVklFV19DT0RFTkFNRVMgZGlyZWN0bHkuIFVzZSBSRUxFQVNFX1BMQVRGT1JNX1ZFUlNJT05fQUxMX1BSRVZJRVdfQ09ERU5BTUVTLiB2YWx1ZTogJChQTEFURk9STV9WRVJTSU9OX0FMTF9QUkVWSUVXX0NPREVOQU1FUykpCitlbmRpZgorUExBVEZPUk1fVkVSU0lPTl9BTExfUFJFVklFV19DT0RFTkFNRVMgOj0gJChSRUxFQVNFX1BMQVRGT1JNX1ZFUlNJT05fQUxMX1BSRVZJRVdfQ09ERU5BTUVTKQorLktBVElfUkVBRE9OTFkgOj0gUExBVEZPUk1fVkVSU0lPTl9BTExfUFJFVklFV19DT0RFTkFNRVMKKworaWZkZWYgUExBVEZPUk1fVkVSU0lPTl9MQVNUX1NUQUJMRQorICAkKGVycm9yIERvIG5vdCBzZXQgUExBVEZPUk1fVkVSU0lPTl9MQVNUX1NUQUJMRSBkaXJlY3RseS4gVXNlIFJFTEVBU0VfUExBVEZPUk1fVkVSU0lPTl9MQVNUX1NUQUJMRS4gdmFsdWU6ICQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkpCitlbmRpZgorUExBVEZPUk1fVkVSU0lPTl9MQVNUX1NUQUJMRSA6PSAkKFJFTEVBU0VfUExBVEZPUk1fVkVSU0lPTl9MQVNUX1NUQUJMRSkKKy5LQVRJX1JFQURPTkxZIDo9IFBMQVRGT1JNX1ZFUlNJT05fTEFTVF9TVEFCTEUKKworaWZkZWYgUExBVEZPUk1fVkVSU0lPTl9LTk9XTl9DT0RFTkFNRVMKKyAgJChlcnJvciBEbyBub3Qgc2V0IFBMQVRGT1JNX1ZFUlNJT05fS05PV05fQ09ERU5BTUVTIGRpcmVjdGx5LiBVc2UgUkVMRUFTRV9QTEFURk9STV9WRVJTSU9OX0tOT1dOX0NPREVOQU1FUy4gdmFsdWU6ICQoUExBVEZPUk1fVkVSU0lPTl9LTk9XTl9DT0RFTkFNRVMpKQorZW5kaWYKK1BMQVRGT1JNX1ZFUlNJT05fS05PV05fQ09ERU5BTUVTIDo9ICQoUkVMRUFTRV9QTEFURk9STV9WRVJTSU9OX0tOT1dOX0NPREVOQU1FUykKKy5LQVRJX1JFQURPTkxZIDo9IFBMQVRGT1JNX1ZFUlNJT05fS05PV05fQ09ERU5BTUVTCiAKIGlmbmRlZiBQTEFURk9STV9WRVJTSU9OCiAgIGlmZXEgKFJFTCwkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUpKQpAQCAtMTYxLDI1ICsxNzMsNiBAQAogZW5kaWYKIC5LQVRJX1JFQURPTkxZIDo9IERFRkFVTFRfQVBQX1RBUkdFVF9TREsKIAotaWZuZGVmIFBMQVRGT1JNX1ZOREtfVkVSU0lPTgotICAjIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIFZOREsgdmVyc2lvbiBmb3IgdGhlIGN1cnJlbnQgVk5ESyBsaWJyYXJpZXMuCi0gICMgVGhlIHZlcnNpb24gaXMgb25seSBhdmFpbGFibGUgd2hlbiBQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FID09IFJFTC4KLSAgIyBPdGhlcndpc2UsIGl0IHdpbGwgYmUgc2V0IHRvIGEgQ09ERU5BTUUgdmVyc2lvbi4gVGhlIEFCSSBpcyBhbGxvd2VkIHRvIGJlCi0gICMgY2hhbmdlZCBvbmx5IGJlZm9yZSB0aGUgQW5kcm9pZCB2ZXJzaW9uIGlzIHJlbGVhc2VkLiBPbmNlCi0gICMgUExBVEZPUk1fVk5ES19WRVJTSU9OIGlzIHNldCB0byBhY3R1YWwgdmVyc2lvbiwgdGhlIEFCSSBmb3IgdGhpcyB2ZXJzaW9uCi0gICMgd2lsbCBiZSBmcm96b24gYW5kIGVtaXQgYnVpbGQgZXJyb3JzIGlmIGFueSBBQkkgZm9yIHRoZSBWTkRLIGxpYnMgYXJlCi0gICMgY2hhbmdlZC4KLSAgIyBBZnRlciB0aGF0IHRoZSBzbmFwc2hvdCBvZiB0aGUgVk5ESyB3aXRoIHRoaXMgdmVyc2lvbiB3aWxsIGJlIGdlbmVyYXRlZC4KLSAgIwotICAjIFRoZSBWTkRLIHZlcnNpb24gZm9sbG93cyBQTEFURk9STV9TREtfVkVSU0lPTi4KLSAgaWZlcSAoUkVMLCQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkpCi0gICAgUExBVEZPUk1fVk5ES19WRVJTSU9OIDo9ICQoUExBVEZPUk1fU0RLX1ZFUlNJT04pCi0gIGVsc2UKLSAgICBQTEFURk9STV9WTkRLX1ZFUlNJT04gOj0gJChQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FKQotICBlbmRpZgotZW5kaWYKLS5LQVRJX1JFQURPTkxZIDo9IFBMQVRGT1JNX1ZOREtfVkVSU0lPTgotCiBpZm5kZWYgUExBVEZPUk1fU1lTVEVNU0RLX01JTl9WRVJTSU9OCiAgICMgVGhpcyBpcyB0aGUgb2xkZXN0IHZlcnNpb24gb2Ygc3lzdGVtIFNESyB0aGF0IHRoZSBwbGF0Zm9ybSBzdXBwb3J0cy4gQ29udHJhcnkKICAgIyB0byB0aGUgcHVibGljIFNESyB3aGVyZSBwbGF0Zm9ybSBlc3NlbnRpYWxseSBzdXBwb3J0cyBhbGwgcHJldmlvdXMgU0RLIHZlcnNpb25zLApAQCAtMjEzLDE0ICsyMDYsMTcgQEAKIGVuZGlmCiAuS0FUSV9SRUFET05MWSA6PSBQTEFURk9STV9TRUNVUklUWV9QQVRDSF9USU1FU1RBTVAKIAotaWZuZGVmIFBMQVRGT1JNX0JBU0VfT1MKLSAgIyBVc2VkIHRvIGluZGljYXRlIHRoZSBiYXNlIG9zIGFwcGxpZWQgdG8gdGhlIGRldmljZS4KLSAgIyBDYW4gYmUgYW4gYXJiaXRyYXJ5IHN0cmluZywgYnV0IG11c3QgYmUgYSBzaW5nbGUgd29yZC4KLSAgIwotICAjIElmIHRoZXJlIGlzIG5vICRQTEFURk9STV9CQVNFX09TIHNldCwga2VlcCBpdCBlbXB0eS4KLSAgUExBVEZPUk1fQkFTRV9PUyA6PQotZW5kaWYKLS5LQVRJX1JFQURPTkxZIDo9IFBMQVRGT1JNX0JBU0VfT1MKKyMgUExBVEZPUk1fQkFTRV9PUyBpcyB1c2VkIHRvIGluZGljYXRlIHRoZSBiYXNlIG9zIGFwcGxpZWQKKyMgdG8gdGhlIGRldmljZS4gQ2FuIGJlIGFuIGFyYml0cmFyeSBzdHJpbmcsIGJ1dCBtdXN0IGJlIGEKKyMgc2luZ2xlIHdvcmQuCisjCisjIElmIHRoZXJlIGlzIG5vICRQTEFURk9STV9CQVNFX09TIHNldCwga2VlcCBpdCBlbXB0eS4KKyMKKyMgUExBVEZPUk1fQkFTRV9PUyBjYW4gZWl0aGVyIGJlIHNldCB2aWEgYW4gZW52aW9ybm1lbnQKKyMgdmFyaWFibGUsIG9yIHNldCB2aWEgdGhlIFBST0RVQ1RfQkFTRV9PUyBwcm9kdWN0IHZhcmlhYmxlLgorUExBVEZPUk1fQkFTRV9PU19FTlZfSU5QVVQgOj0gJChQTEFURk9STV9CQVNFX09TKQorLktBVElfUkVBRE9OTFkgOj0gUExBVEZPUk1fQkFTRV9PU19FTlZfSU5QVVQKK1BMQVRGT1JNX0JBU0VfT1MgOj0KIAogaWZuZGVmIEJVSUxEX0lECiAgICMgVXNlZCB0byBzaWduaWZ5IHNwZWNpYWwgYnVpbGRzLiAgRS5nLiwgYnJhbmNoZXMgYW5kL29yIHJlbGVhc2VzLApAQCAtMjQ2LDI2ICsyNDIsMTMgQEAKICMgdG8gc29vbmdfdWkuCiAkKEtBVElfb2Jzb2xldGVfdmFyIEJVSUxEX0RBVEVUSU1FLFVzZSBCVUlMRF9EQVRFVElNRV9GUk9NX0ZJTEUpCiAKLUhBU19CVUlMRF9OVU1CRVIgOj0gdHJ1ZQotaWZuZGVmIEJVSUxEX05VTUJFUgotICAjIEJVSUxEX05VTUJFUiBzaG91bGQgYmUgc2V0IHRvIHRoZSBzb3VyY2UgY29udHJvbCB2YWx1ZSB0aGF0Ci0gICMgcmVwcmVzZW50cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc291cmNlIGNvZGUuICBFLmcuLCBhCi0gICMgcGVyZm9yY2UgY2hhbmdlbGlzdCBudW1iZXIgb3IgYSBnaXQgaGFzaC4gIENhbiBiZSBhbiBhcmJpdHJhcnkgc3RyaW5nCi0gICMgKHRvIGFsbG93IGZvciBzb3VyY2UgY29udHJvbCB0aGF0IHVzZXMgc29tZXRoaW5nIG90aGVyIHRoYW4gbnVtYmVycyksCi0gICMgYnV0IG11c3QgYmUgYSBzaW5nbGUgd29yZCBhbmQgYSB2YWxpZCBmaWxlIG5hbWUuCi0gICMKLSAgIyBJZiBubyBCVUlMRF9OVU1CRVIgaXMgc2V0LCBjcmVhdGUgYSB1c2VmdWwgIkkgYW0gYW4gZW5naW5lZXJpbmcgYnVpbGQKLSAgIyBmcm9tIHRoaXMgZGF0ZS90aW1lIiB2YWx1ZS4gIE1ha2UgaXQgc3RhcnQgd2l0aCBhIG5vbi1kaWdpdCBzbyB0aGF0Ci0gICMgYW55b25lIHRyeWluZyB0byBwYXJzZSBpdCBhcyBhbiBpbnRlZ2VyIHdpbGwgcHJvYmFibHkgZ2V0ICIwIi4KLSAgQlVJTERfTlVNQkVSIDo9IGVuZy4kKHNoZWxsIGVjaG8gJCR7QlVJTERfVVNFUk5BTUU6MDo2fSkuJChzaGVsbCAkKERBVEUpICslWSVtJWQuJUglTSVTKQoraWZuZGVmIEhBU19CVUlMRF9OVU1CRVIKICAgSEFTX0JVSUxEX05VTUJFUiA6PSBmYWxzZQogZW5kaWYKLS5LQVRJX1JFQURPTkxZIDo9IEJVSUxEX05VTUJFUiBIQVNfQlVJTERfTlVNQkVSCisuS0FUSV9SRUFET05MWSA6PSBIQVNfQlVJTERfTlVNQkVSCiAKLWlmbmRlZiBQTEFURk9STV9NSU5fU1VQUE9SVEVEX1RBUkdFVF9TREtfVkVSU0lPTgotICAjIFVzZWQgdG8gc2V0IG1pbmltdW0gc3VwcG9ydGVkIHRhcmdldCBzZGsgdmVyc2lvbi4gQXBwcyB0YXJnZXRpbmcgc2RrCi0gICMgdmVyc2lvbiBsb3dlciB0aGFuIHRoZSBzZXQgdmFsdWUgd2lsbCByZXN1bHQgaW4gYSB3YXJuaW5nIGJlaW5nIHNob3duCi0gICMgd2hlbiBhbnkgYWN0aXZpdHkgZnJvbSB0aGUgYXBwIGlzIHN0YXJ0ZWQuCi0gIFBMQVRGT1JNX01JTl9TVVBQT1JURURfVEFSR0VUX1NES19WRVJTSU9OIDo9IDI4CitpZmRlZiBQTEFURk9STV9NSU5fU1VQUE9SVEVEX1RBUkdFVF9TREtfVkVSU0lPTgorICAkKGVycm9yIERvIG5vdCBzZXQgUExBVEZPUk1fTUlOX1NVUFBPUlRFRF9UQVJHRVRfU0RLX1ZFUlNJT04gZGlyZWN0bHkuIFVzZSBSRUxFQVNFX1BMQVRGT1JNX01JTl9TVVBQT1JURURfVEFSR0VUX1NES19WRVJTSU9OLiB2YWx1ZTogJChQTEFURk9STV9NSU5fU1VQUE9SVEVEX1RBUkdFVF9TREtfVkVSU0lPTikpCiBlbmRpZgorUExBVEZPUk1fTUlOX1NVUFBPUlRFRF9UQVJHRVRfU0RLX1ZFUlNJT04gOj0gJChSRUxFQVNFX1BMQVRGT1JNX01JTl9TVVBQT1JURURfVEFSR0VUX1NES19WRVJTSU9OKQogLktBVElfUkVBRE9OTFkgOj0gUExBVEZPUk1fTUlOX1NVUFBPUlRFRF9UQVJHRVRfU0RLX1ZFUlNJT04KZGlmZiAtLWdpdCBhL2VudnNldHVwLnNoIGIvZW52c2V0dXAuc2gKaW5kZXggOTA1NjM1Yy4uNTU0YTIyMCAxMDA2NDQKLS0tIGEvZW52c2V0dXAuc2gKKysrIGIvZW52c2V0dXAuc2gKQEAgLTQ4LDgxICs0OCwxMyBAQAogZmkKIElNUE9SVElOR19FTlZTRVRVUD10cnVlIHNvdXJjZSAkVC9idWlsZC9tYWtlL3NoZWxsX3V0aWxzLnNoCiAKLQotIyBIZWxwCi1mdW5jdGlvbiBobW0oKSB7Ci1jYXQgPDxFT0YKLQotUnVuICJtIGhlbHAiIGZvciBoZWxwIHdpdGggdGhlIGJ1aWxkIHN5c3RlbSBpdHNlbGYuCi0KLUludm9rZSAiLiBidWlsZC9lbnZzZXR1cC5zaCIgZnJvbSB5b3VyIHNoZWxsIHRvIGFkZCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB0byB5b3VyIGVudmlyb25tZW50OgotLSBsdW5jaDogICAgICBsdW5jaCA8cHJvZHVjdF9uYW1lPi08YnVpbGRfdmFyaWFudD4KLSAgICAgICAgICAgICAgU2VsZWN0cyA8cHJvZHVjdF9uYW1lPiBhcyB0aGUgcHJvZHVjdCB0byBidWlsZCwgYW5kIDxidWlsZF92YXJpYW50PiBhcyB0aGUgdmFyaWFudCB0bwotICAgICAgICAgICAgICBidWlsZCwgYW5kIHN0b3JlcyB0aG9zZSBzZWxlY3Rpb25zIGluIHRoZSBlbnZpcm9ubWVudCB0byBiZSByZWFkIGJ5IHN1YnNlcXVlbnQKLSAgICAgICAgICAgICAgaW52b2NhdGlvbnMgb2YgJ20nIGV0Yy4KLS0gdGFwYXM6ICAgICAgdGFwYXMgWzxBcHAxPiA8QXBwMj4gLi4uXSBbYXJtfHg4Nnxhcm02NHx4ODZfNjRdIFtlbmd8dXNlcmRlYnVnfHVzZXJdCi0gICAgICAgICAgICAgIFNldHMgdXAgdGhlIGJ1aWxkIGVudmlyb25tZW50IGZvciBidWlsZGluZyB1bmJ1bmRsZWQgYXBwcyAoQVBLcykuCi0tIGJhbmNoYW46ICAgIGJhbmNoYW4gPG1vZHVsZTE+IFs8bW9kdWxlMj4gLi4uXSBbYXJtfHg4Nnxhcm02NHx4ODZfNjR8YXJtNjRfb25seXx4ODZfNjRvbmx5XSBcCi0gICAgICAgICAgICAgICAgICAgICAgW2VuZ3x1c2VyZGVidWd8dXNlcl0KLSAgICAgICAgICAgICAgU2V0cyB1cCB0aGUgYnVpbGQgZW52aXJvbm1lbnQgZm9yIGJ1aWxkaW5nIHVuYnVuZGxlZCBtb2R1bGVzIChBUEVYZXMpLgotLSBjcm9vdDogICAgICBDaGFuZ2VzIGRpcmVjdG9yeSB0byB0aGUgdG9wIG9mIHRoZSB0cmVlLCBvciBhIHN1YmRpcmVjdG9yeSB0aGVyZW9mLgotLSBtOiAgICAgICAgICBNYWtlcyBmcm9tIHRoZSB0b3Agb2YgdGhlIHRyZWUuCi0tIG1tOiAgICAgICAgIEJ1aWxkcyBhbmQgaW5zdGFsbHMgYWxsIG9mIHRoZSBtb2R1bGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgYW5kIHRoZWlyCi0gICAgICAgICAgICAgIGRlcGVuZGVuY2llcy4KLS0gbW1tOiAgICAgICAgQnVpbGRzIGFuZCBpbnN0YWxscyBhbGwgb2YgdGhlIG1vZHVsZXMgaW4gdGhlIHN1cHBsaWVkIGRpcmVjdG9yaWVzLCBhbmQgdGhlaXIKLSAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLgotICAgICAgICAgICAgICBUbyBsaW1pdCB0aGUgbW9kdWxlcyBiZWluZyBidWlsdCB1c2UgdGhlIHN5bnRheDogbW1tIGRpci86dGFyZ2V0MSx0YXJnZXQyLgotLSBtbWE6ICAgICAgICBTYW1lIGFzICdtbScKLS0gbW1tYTogICAgICAgU2FtZSBhcyAnbW1tJwotLSBwcm92aXNpb246ICBGbGFzaCBkZXZpY2Ugd2l0aCBhbGwgcmVxdWlyZWQgcGFydGl0aW9ucy4gT3B0aW9ucyB3aWxsIGJlIHBhc3NlZCBvbiB0byBmYXN0Ym9vdC4KLS0gY2dyZXA6ICAgICAgR3JlcHMgb24gYWxsIGxvY2FsIEMvQysrIGZpbGVzLgotLSBnZ3JlcDogICAgICBHcmVwcyBvbiBhbGwgbG9jYWwgR3JhZGxlIGZpbGVzLgotLSBnb2dyZXA6ICAgICBHcmVwcyBvbiBhbGwgbG9jYWwgR28gZmlsZXMuCi0tIGpncmVwOiAgICAgIEdyZXBzIG9uIGFsbCBsb2NhbCBKYXZhIGZpbGVzLgotLSBqc29uZ3JlcDogICBHcmVwcyBvbiBhbGwgbG9jYWwgSnNvbiBmaWxlcy4KLS0ga3RncmVwOiAgICAgR3JlcHMgb24gYWxsIGxvY2FsIEtvdGxpbiBmaWxlcy4KLS0gcmVzZ3JlcDogICAgR3JlcHMgb24gYWxsIGxvY2FsIHJlcy8qLnhtbCBmaWxlcy4KLS0gbWFuZ3JlcDogICAgR3JlcHMgb24gYWxsIGxvY2FsIEFuZHJvaWRNYW5pZmVzdC54bWwgZmlsZXMuCi0tIG1ncmVwOiAgICAgIEdyZXBzIG9uIGFsbCBsb2NhbCBNYWtlZmlsZXMgYW5kICouYnAgZmlsZXMuCi0tIG93bmdyZXA6ICAgIEdyZXBzIG9uIGFsbCBsb2NhbCBPV05FUlMgZmlsZXMuCi0tIHJzZ3JlcDogICAgIEdyZXBzIG9uIGFsbCBsb2NhbCBSdXN0IGZpbGVzLgotLSBzZXBncmVwOiAgICBHcmVwcyBvbiBhbGwgbG9jYWwgc2Vwb2xpY3kgZmlsZXMuCi0tIHNncmVwOiAgICAgIEdyZXBzIG9uIGFsbCBsb2NhbCBzb3VyY2UgZmlsZXMuCi0tIHRvbWxncmVwOiAgIEdyZXBzIG9uIGFsbCBsb2NhbCBUb21sIGZpbGVzLgotLSBweWdyZXA6ICAgICBHcmVwcyBvbiBhbGwgbG9jYWwgUHl0aG9uIGZpbGVzLgotLSBnb2RpcjogICAgICBHbyB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYSBmaWxlLgotLSBhbGxtb2Q6ICAgICBMaXN0IGFsbCBtb2R1bGVzLgotLSBnb21vZDogICAgICBHbyB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYSBtb2R1bGUuCi0tIGJtb2Q6ICAgICAgIEdldCB0aGUgQmF6ZWwgbGFiZWwgb2YgYSBTb29uZyBtb2R1bGUgaWYgaXQgaXMgY29udmVydGVkIHdpdGggYnAyYnVpbGQuCi0tIHBhdGhtb2Q6ICAgIEdldCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYSBtb2R1bGUuCi0tIG91dG1vZDogICAgIEdldHMgdGhlIGxvY2F0aW9uIG9mIGEgbW9kdWxlJ3MgaW5zdGFsbGVkIG91dHB1dHMgd2l0aCBhIGNlcnRhaW4gZXh0ZW5zaW9uLgotLSBkaXJtb2RzOiAgICBHZXRzIHRoZSBtb2R1bGVzIGRlZmluZWQgaW4gYSBnaXZlbiBkaXJlY3RvcnkuCi0tIGluc3RhbGxtb2Q6IEFkYiBpbnN0YWxscyBhIG1vZHVsZSdzIGJ1aWx0IEFQSy4KLS0gcmVmcmVzaG1vZDogUmVmcmVzaCBsaXN0IG9mIG1vZHVsZXMgZm9yIGFsbG1vZC9nb21vZC9wYXRobW9kL291dG1vZC9pbnN0YWxsbW9kLgotLSBzeXN3cml0ZTogICBSZW1vdW50IHBhcnRpdGlvbnMgKGUuZy4gc3lzdGVtLmltZykgYXMgd3JpdGFibGUsIHJlYm9vdGluZyBpZiBuZWNlc3NhcnkuCi0KLUVudmlyb25tZW50IG9wdGlvbnM6Ci0tIFNBTklUSVpFX0hPU1Q6IFNldCB0byAnYWRkcmVzcycgdG8gdXNlIEFTQU4gZm9yIGFsbCBob3N0IG1vZHVsZXMuCi0tIEFORFJPSURfUVVJRVRfQlVJTEQ6IHNldCB0byAndHJ1ZScgdG8gZGlzcGxheSBvbmx5IHRoZSBlc3NlbnRpYWwgbWVzc2FnZXMuCi0KLUxvb2sgYXQgdGhlIHNvdXJjZSB0byB2aWV3IG1vcmUgZnVuY3Rpb25zLiBUaGUgY29tcGxldGUgbGlzdCBpczoKLUVPRgotICAgIGxvY2FsIFQ9JChnZXR0b3ApCi0gICAgbG9jYWwgQT0iIgotICAgIGxvY2FsIGkKLSAgICBmb3IgaSBpbiBgY2F0ICRUL2J1aWxkL2VudnNldHVwLnNoIHwgc2VkIC1uICIvXltbOmJsYW5rOl1dKmZ1bmN0aW9uIC9zL2Z1bmN0aW9uIFwoW2Etel9dKlwpLiovXDEvcCIgfCBzb3J0IHwgdW5pcWA7IGRvCi0gICAgICBBPSIkQSAkaSIKLSAgICBkb25lCi0gICAgZWNobyAkQQotfQotCiAjIEdldCBhbGwgdGhlIGJ1aWxkIHZhcmlhYmxlcyBuZWVkZWQgYnkgdGhpcyBzY3JpcHQgaW4gYSBzaW5nbGUgY2FsbCB0byB0aGUgYnVpbGQgc3lzdGVtLgogZnVuY3Rpb24gYnVpbGRfYnVpbGRfdmFyX2NhY2hlKCkKIHsKICAgICBsb2NhbCBUPSQoZ2V0dG9wKQogICAgICMgR3JlcCBvdXQgdGhlIHZhcmlhYmxlIG5hbWVzIGZyb20gdGhlIHNjcmlwdC4KLSAgICBjYWNoZWRfdmFycz0oYGNhdCAkVC9idWlsZC9lbnZzZXR1cC5zaCB8IHRyICcoKScgJyAgJyB8IGF3ayAne2ZvcihpPTE7aTw9TkY7aSsrKSBpZigkaX4vZ2V0X2J1aWxkX3Zhci8pIHByaW50ICQoaSsxKX0nIHwgc29ydCAtdSB8IHRyICdcbicgJyAnYCkKLSAgICBjYWNoZWRfYWJzX3ZhcnM9KGBjYXQgJFQvYnVpbGQvZW52c2V0dXAuc2ggfCB0ciAnKCknICcgICcgfCBhd2sgJ3tmb3IoaT0xO2k8PU5GO2krKykgaWYoJGl+L2dldF9hYnNfYnVpbGRfdmFyLykgcHJpbnQgJChpKzEpfScgfCBzb3J0IC11IHwgdHIgJ1xuJyAnICdgKQorICAgIGNhY2hlZF92YXJzPShgY2F0ICRUL2J1aWxkL2VudnNldHVwLnNoIHwgdHIgJygpJyAnICAnIHwgYXdrICd7Zm9yKGk9MTtpPD1ORjtpKyspIGlmKCRpfi9fZ2V0X2J1aWxkX3Zhcl9jYWNoZWQvKSBwcmludCAkKGkrMSl9JyB8IHNvcnQgLXUgfCB0ciAnXG4nICcgJ2ApCisgICAgY2FjaGVkX2Fic192YXJzPShgY2F0ICRUL2J1aWxkL2VudnNldHVwLnNoIHwgdHIgJygpJyAnICAnIHwgYXdrICd7Zm9yKGk9MTtpPD1ORjtpKyspIGlmKCRpfi9fZ2V0X2Fic19idWlsZF92YXJfY2FjaGVkLykgcHJpbnQgJChpKzEpfScgfCBzb3J0IC11IHwgdHIgJ1xuJyAnICdgKQogICAgICMgQ2FsbCB0aGUgYnVpbGQgc3lzdGVtIHRvIGR1bXAgdGhlICI8dmFsPj08dmFsdWU+IiBwYWlycyBhcyBhIHNoZWxsIHNjcmlwdC4KICAgICBidWlsZF9kaWN0c19zY3JpcHQ9YFxidWlsdGluIGNkICRUOyBidWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tZHVtcHZhcnMtbW9kZSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAtLXZhcnM9IiR7Y2FjaGVkX3ZhcnNbKl19IiBcCkBAIC0xNjMsNyArOTUsNyBAQAogfQogCiAjIEdldCB0aGUgdmFsdWUgb2YgYSBidWlsZCB2YXJpYWJsZSBhcyBhbiBhYnNvbHV0ZSBwYXRoLgotZnVuY3Rpb24gZ2V0X2Fic19idWlsZF92YXIoKQorZnVuY3Rpb24gX2dldF9hYnNfYnVpbGRfdmFyX2NhY2hlZCgpCiB7CiAgICAgaWYgWyAiJEJVSUxEX1ZBUl9DQUNIRV9SRUFEWSIgPSAidHJ1ZSIgXQogICAgIHRoZW4KQEAgLTE4MCw3ICsxMTIsNyBAQAogfQogCiAjIEdldCB0aGUgZXhhY3QgdmFsdWUgb2YgYSBidWlsZCB2YXJpYWJsZS4KLWZ1bmN0aW9uIGdldF9idWlsZF92YXIoKQorZnVuY3Rpb24gX2dldF9idWlsZF92YXJfY2FjaGVkKCkKIHsKICAgICBpZiBbICIkQlVJTERfVkFSX0NBQ0hFX1JFQURZIiA9ICJ0cnVlIiBdCiAgICAgdGhlbgpAQCAtMTk2LDM5ICsxMjgsMTkgQEAKICAgICAoXGNkICRUOyBidWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tZHVtcHZhci1tb2RlICQxKQogfQogCi0jIGNoZWNrIHRvIHNlZSBpZiB0aGUgc3VwcGxpZWQgcHJvZHVjdCBpcyBvbmUgd2UgY2FuIGJ1aWxkCi1mdW5jdGlvbiBjaGVja19wcm9kdWN0KCkKKyMgVGhpcyBsb2dpYyBtYXRjaGVzIGVudnNldHVwLm1rCitmdW5jdGlvbiBnZXRfaG9zdF9wcmVidWlsdF9wcmVmaXgKIHsKLSAgICBsb2NhbCBUPSQoZ2V0dG9wKQotICAgIGlmIFsgISAiJFQiIF07IHRoZW4KLSAgICAgICAgZWNobyAiQ291bGRuJ3QgbG9jYXRlIHRoZSB0b3Agb2YgdGhlIHRyZWUuICBUcnkgc2V0dGluZyBUT1AuIiA+JjIKLSAgICAgICAgcmV0dXJuCi0gICAgZmkKLSAgICAgICAgVEFSR0VUX1BST0RVQ1Q9JDEgXAotICAgICAgICBUQVJHRVRfQlVJTERfVkFSSUFOVD0gXAotICAgICAgICBUQVJHRVRfQlVJTERfVFlQRT0gXAotICAgICAgICBUQVJHRVRfQlVJTERfQVBQUz0gXAotICAgICAgICBnZXRfYnVpbGRfdmFyIFRBUkdFVF9ERVZJQ0UgPiAvZGV2L251bGwKLSAgICAjIGhpZGUgc3VjY2Vzc2Z1bCBhbnN3ZXJzLCBidXQgYWxsb3cgdGhlIGVycm9ycyB0byBzaG93CisgIGxvY2FsIHVuPSQodW5hbWUpCisgIGlmIFtbICR1biA9PSAiTGludXgiIF1dIDsgdGhlbgorICAgIGVjaG8gbGludXgteDg2CisgIGVsaWYgW1sgJHVuID09ICJEYXJ3aW4iIF1dIDsgdGhlbgorICAgIGVjaG8gZGFyd2luLXg4NgorICBlbHNlCisgICAgZWNobyAiRXJyb3I6IEludmFsaWQgaG9zdCBvcGVyYXRpbmcgc3lzdGVtOiAkdW4iIDE+JjIKKyAgZmkKIH0KIAotVkFSSUFOVF9DSE9JQ0VTPSh1c2VyIHVzZXJkZWJ1ZyBlbmcpCi0KLSMgY2hlY2sgdG8gc2VlIGlmIHRoZSBzdXBwbGllZCB2YXJpYW50IGlzIHZhbGlkCi1mdW5jdGlvbiBjaGVja192YXJpYW50KCkKLXsKLSAgICBsb2NhbCB2Ci0gICAgZm9yIHYgaW4gJHtWQVJJQU5UX0NIT0lDRVNbQF19Ci0gICAgZG8KLSAgICAgICAgaWYgWyAiJHYiID0gIiQxIiBdCi0gICAgICAgIHRoZW4KLSAgICAgICAgICAgIHJldHVybiAwCi0gICAgICAgIGZpCi0gICAgZG9uZQotICAgIHJldHVybiAxCi19Ci0KLQogIyBBZGQgZGlyZWN0b3JpZXMgdG8gUEFUSCB0aGF0IGFyZSBkZXBlbmRlbnQgb24gdGhlIGx1bmNoIHRhcmdldC4KICMgRm9yIGRpcmVjdG9yaWVzIHRoYXQgYXJlIG5vdCBsdW5jaC1zcGVjaWZpYywgYWRkIHRoZW0gaW4gc2V0X2dsb2JhbF9wYXRocwogZnVuY3Rpb24gc2V0X2x1bmNoX3BhdGhzKCkKQEAgLTI1Myw3ICsxNjUsNyBAQAogICAgICMgTm90ZTogb24gd2luZG93cy9jeWd3aW4sIEFORFJPSURfTFVOQ0hfQlVJTERfUEFUSFMgd2lsbCBjb250YWluIHNwYWNlcwogICAgICMgZHVlIHRvICJDOlxQcm9ncmFtIEZpbGVzIiBiZWluZyBpbiB0aGUgcGF0aC4KIAotICAgICMgSGFuZGxlIGNvbXBhdCB3aXRoIHRoZSBvbGQgQU5EUk9JRF9CVUlMRF9QQVRIUyB2YXJpYWJsZS4gCisgICAgIyBIYW5kbGUgY29tcGF0IHdpdGggdGhlIG9sZCBBTkRST0lEX0JVSUxEX1BBVEhTIHZhcmlhYmxlLgogICAgICMgVE9ETzogUmVtb3ZlIHRoaXMgYWZ0ZXIgd2UgdGhpbmsgZXZlcnlvbmUgaGFzIGx1bmNoZWQgYWdhaW4uCiAgICAgaWYgWyAteiAiJEFORFJPSURfTFVOQ0hfQlVJTERfUEFUSFMiIC1hIC1uICIkQU5EUk9JRF9CVUlMRF9QQVRIUyIgXSA7IHRoZW4KICAgICAgIEFORFJPSURfTFVOQ0hfQlVJTERfUEFUSFM9IiRBTkRST0lEX0JVSUxEX1BBVEhTIgpAQCAtMjcyLDI1ICsxODQsMjUgQEAKICAgICBmaQogCiAgICAgIyBBbmQgaW4gd2l0aCB0aGUgbmV3Li4uCi0gICAgQU5EUk9JRF9MVU5DSF9CVUlMRF9QQVRIUz0kKGdldF9hYnNfYnVpbGRfdmFyIFNPT05HX0hPU1RfT1VUX0VYRUNVVEFCTEVTKQotICAgIEFORFJPSURfTFVOQ0hfQlVJTERfUEFUSFMrPTokKGdldF9hYnNfYnVpbGRfdmFyIEhPU1RfT1VUX0VYRUNVVEFCTEVTKQorICAgIEFORFJPSURfTFVOQ0hfQlVJTERfUEFUSFM9JChfZ2V0X2Fic19idWlsZF92YXJfY2FjaGVkIFNPT05HX0hPU1RfT1VUX0VYRUNVVEFCTEVTKQorICAgIEFORFJPSURfTFVOQ0hfQlVJTERfUEFUSFMrPTokKF9nZXRfYWJzX2J1aWxkX3Zhcl9jYWNoZWQgSE9TVF9PVVRfRVhFQ1VUQUJMRVMpCiAKICAgICAjIEFwcGVuZCBsbHZtIGJpbnV0aWxzIHByZWJ1aWx0cyBwYXRoIHRvIEFORFJPSURfTFVOQ0hfQlVJTERfUEFUSFMuCi0gICAgbG9jYWwgQU5EUk9JRF9MTFZNX0JJTlVUSUxTPSQoZ2V0X2Fic19idWlsZF92YXIgQU5EUk9JRF9DTEFOR19QUkVCVUlMVFMpL2xsdm0tYmludXRpbHMtc3RhYmxlCisgICAgbG9jYWwgQU5EUk9JRF9MTFZNX0JJTlVUSUxTPSQoX2dldF9hYnNfYnVpbGRfdmFyX2NhY2hlZCBBTkRST0lEX0NMQU5HX1BSRUJVSUxUUykvbGx2bS1iaW51dGlscy1zdGFibGUKICAgICBBTkRST0lEX0xVTkNIX0JVSUxEX1BBVEhTKz06JEFORFJPSURfTExWTV9CSU5VVElMUwogCiAgICAgIyBTZXQgdXAgQVNBTl9TWU1CT0xJWkVSX1BBVEggZm9yIFNBTklUSVpFX0hPU1Q9YWRkcmVzcyBidWlsZHMuCiAgICAgZXhwb3J0IEFTQU5fU1lNQk9MSVpFUl9QQVRIPSRBTkRST0lEX0xMVk1fQklOVVRJTFMvbGx2bS1zeW1ib2xpemVyCiAKICAgICAjIEFwcGVuZCBhc3VpdGUgcHJlYnVpbHRzIHBhdGggdG8gQU5EUk9JRF9MVU5DSF9CVUlMRF9QQVRIUy4KLSAgICBsb2NhbCBvc19hcmNoPSQoZ2V0X2J1aWxkX3ZhciBIT1NUX1BSRUJVSUxUX1RBRykKKyAgICBsb2NhbCBvc19hcmNoPSQoX2dldF9idWlsZF92YXJfY2FjaGVkIEhPU1RfUFJFQlVJTFRfVEFHKQogICAgIEFORFJPSURfTFVOQ0hfQlVJTERfUEFUSFMrPTokVC9wcmVidWlsdHMvYXN1aXRlL2FjbG91ZC8kb3NfYXJjaAogICAgIEFORFJPSURfTFVOQ0hfQlVJTERfUEFUSFMrPTokVC9wcmVidWlsdHMvYXN1aXRlL2FpZGVnZW4vJG9zX2FyY2gKICAgICBBTkRST0lEX0xVTkNIX0JVSUxEX1BBVEhTKz06JFQvcHJlYnVpbHRzL2FzdWl0ZS9hdGVzdC8kb3NfYXJjaAogCi0gICAgZXhwb3J0IEFORFJPSURfSkFWQV9IT01FPSQoZ2V0X2Fic19idWlsZF92YXIgQU5EUk9JRF9KQVZBX0hPTUUpCisgICAgZXhwb3J0IEFORFJPSURfSkFWQV9IT01FPSQoX2dldF9hYnNfYnVpbGRfdmFyX2NhY2hlZCBBTkRST0lEX0pBVkFfSE9NRSkKICAgICBleHBvcnQgSkFWQV9IT01FPSRBTkRST0lEX0pBVkFfSE9NRQotICAgIGV4cG9ydCBBTkRST0lEX0pBVkFfVE9PTENIQUlOPSQoZ2V0X2Fic19idWlsZF92YXIgQU5EUk9JRF9KQVZBX1RPT0xDSEFJTikKKyAgICBleHBvcnQgQU5EUk9JRF9KQVZBX1RPT0xDSEFJTj0kKF9nZXRfYWJzX2J1aWxkX3Zhcl9jYWNoZWQgQU5EUk9JRF9KQVZBX1RPT0xDSEFJTikKICAgICBBTkRST0lEX0xVTkNIX0JVSUxEX1BBVEhTKz06JEFORFJPSURfSkFWQV9UT09MQ0hBSU4KIAogICAgICMgRml4IHVwIFBZVEhPTlBBVEgKQEAgLTMxMiwyNyArMjI0LDI3IEBACiAgICAgIyB3b3VsZCBwcmV2ZW50IGV4cG9ydGluZyB0eXBlIGluZm8gZnJvbSB0aG9zZSBwYWNrYWdlcy4KICAgICAjCiAgICAgIyBodHRwOi8vYi8yNjY2ODgwODYKLSAgICBleHBvcnQgQU5EUk9JRF9QWVRIT05QQVRIPSRUL2RldmVsb3BtZW50L3B5dGhvbi1wYWNrYWdlcy9hZGI6JFQvZGV2ZWxvcG1lbnQvcHl0aG9uLXBhY2thZ2VzOgorICAgIGV4cG9ydCBBTkRST0lEX1BZVEhPTlBBVEg9JFQvZGV2ZWxvcG1lbnQvcHl0aG9uLXBhY2thZ2VzL2FkYjokVC9kZXZlbG9wbWVudC9weXRob24tcGFja2FnZXMvZ2RicnVubmVyOiRUL2RldmVsb3BtZW50L3B5dGhvbi1wYWNrYWdlczoKICAgICBpZiBbIC1uICRWRU5ET1JfUFlUSE9OUEFUSCBdOyB0aGVuCiAgICAgICAgIEFORFJPSURfUFlUSE9OUEFUSD0kQU5EUk9JRF9QWVRIT05QQVRIJFZFTkRPUl9QWVRIT05QQVRICiAgICAgZmkKICAgICBleHBvcnQgUFlUSE9OUEFUSD0kQU5EUk9JRF9QWVRIT05QQVRIJFBZVEhPTlBBVEgKIAogICAgIHVuc2V0IEFORFJPSURfUFJPRFVDVF9PVVQKLSAgICBleHBvcnQgQU5EUk9JRF9QUk9EVUNUX09VVD0kKGdldF9hYnNfYnVpbGRfdmFyIFBST0RVQ1RfT1VUKQorICAgIGV4cG9ydCBBTkRST0lEX1BST0RVQ1RfT1VUPSQoX2dldF9hYnNfYnVpbGRfdmFyX2NhY2hlZCBQUk9EVUNUX09VVCkKICAgICBleHBvcnQgT1VUPSRBTkRST0lEX1BST0RVQ1RfT1VUCiAKICAgICB1bnNldCBBTkRST0lEX0hPU1RfT1VUCi0gICAgZXhwb3J0IEFORFJPSURfSE9TVF9PVVQ9JChnZXRfYWJzX2J1aWxkX3ZhciBIT1NUX09VVCkKKyAgICBleHBvcnQgQU5EUk9JRF9IT1NUX09VVD0kKF9nZXRfYWJzX2J1aWxkX3Zhcl9jYWNoZWQgSE9TVF9PVVQpCiAKICAgICB1bnNldCBBTkRST0lEX1NPT05HX0hPU1RfT1VUCi0gICAgZXhwb3J0IEFORFJPSURfU09PTkdfSE9TVF9PVVQ9JChnZXRfYWJzX2J1aWxkX3ZhciBTT09OR19IT1NUX09VVCkKKyAgICBleHBvcnQgQU5EUk9JRF9TT09OR19IT1NUX09VVD0kKF9nZXRfYWJzX2J1aWxkX3Zhcl9jYWNoZWQgU09PTkdfSE9TVF9PVVQpCiAKICAgICB1bnNldCBBTkRST0lEX0hPU1RfT1VUX1RFU1RDQVNFUwotICAgIGV4cG9ydCBBTkRST0lEX0hPU1RfT1VUX1RFU1RDQVNFUz0kKGdldF9hYnNfYnVpbGRfdmFyIEhPU1RfT1VUX1RFU1RDQVNFUykKKyAgICBleHBvcnQgQU5EUk9JRF9IT1NUX09VVF9URVNUQ0FTRVM9JChfZ2V0X2Fic19idWlsZF92YXJfY2FjaGVkIEhPU1RfT1VUX1RFU1RDQVNFUykKIAogICAgIHVuc2V0IEFORFJPSURfVEFSR0VUX09VVF9URVNUQ0FTRVMKLSAgICBleHBvcnQgQU5EUk9JRF9UQVJHRVRfT1VUX1RFU1RDQVNFUz0kKGdldF9hYnNfYnVpbGRfdmFyIFRBUkdFVF9PVVRfVEVTVENBU0VTKQorICAgIGV4cG9ydCBBTkRST0lEX1RBUkdFVF9PVVRfVEVTVENBU0VTPSQoX2dldF9hYnNfYnVpbGRfdmFyX2NhY2hlZCBUQVJHRVRfT1VUX1RFU1RDQVNFUykKIAogICAgICMgRmluYWxseSwgc2V0IFBBVEgKICAgICBleHBvcnQgUEFUSD0kQU5EUk9JRF9MVU5DSF9CVUlMRF9QQVRIUzokUEFUSApAQCAtMzY1LDcgKzI3Nyw4IEBACiAgICAgZmkKIAogICAgICMgQW5kIGluIHdpdGggdGhlIG5ldy4uLgotICAgIEFORFJPSURfR0xPQkFMX0JVSUxEX1BBVEhTPSRUL2J1aWxkL2JhemVsL2JpbgorICAgIEFORFJPSURfR0xPQkFMX0JVSUxEX1BBVEhTPSRUL2J1aWxkL3Nvb25nL2JpbgorICAgIEFORFJPSURfR0xPQkFMX0JVSUxEX1BBVEhTKz06JFQvYnVpbGQvYmF6ZWwvYmluCiAgICAgQU5EUk9JRF9HTE9CQUxfQlVJTERfUEFUSFMrPTokVC9kZXZlbG9wbWVudC9zY3JpcHRzCiAgICAgQU5EUk9JRF9HTE9CQUxfQlVJTERfUEFUSFMrPTokVC9wcmVidWlsdHMvZGV2dG9vbHMvdG9vbHMKIApAQCAtNDA0LDcgKzMxNyw3IEBACiAgICAgICAgIGVjaG8gIkNvdWxkbid0IGxvY2F0ZSB0aGUgdG9wIG9mIHRoZSB0cmVlLiAgVHJ5IHNldHRpbmcgVE9QLiIgPiYyCiAgICAgICAgIHJldHVybgogICAgIGZpCi0gICAgZ2V0X2J1aWxkX3ZhciByZXBvcnRfY29uZmlnCisgICAgX2dldF9idWlsZF92YXJfY2FjaGVkIHJlcG9ydF9jb25maWcKIH0KIAogZnVuY3Rpb24gc2V0X3N0dWZmX2Zvcl9lbnZpcm9ubWVudCgpCkBAIC00NDksNyArMzYyLDYgQEAKICAgICAgIHBhY2thZ2VzL21vZHVsZXMvYWRiL2FkYi5iYXNoCiAgICAgICBzeXN0ZW0vY29yZS9mYXN0Ym9vdC9mYXN0Ym9vdC5iYXNoCiAgICAgICB0b29scy9hc3VpdGUvYXN1aXRlLnNoCi0gICAgICBwcmVidWlsdHMvYmF6ZWwvY29tbW9uL2JhemVsLWNvbXBsZXRlLmJhc2gKICAgICApCiAgICAgIyBDb21wbGV0aW9uIGNhbiBiZSBkaXNhYmxlZCBzZWxlY3RpdmVseSB0byBhbGxvdyB1c2VycyB0byB1c2Ugbm9uLXN0YW5kYXJkIGNvbXBsZXRpb24uCiAgICAgIyBlLmcuCkBAIC00NjUsOSArMzc3LDYgQEAKICAgICAgICAgZmkKICAgICBkb25lCiAKLSAgICBpZiBzaG91bGRfYWRkX2NvbXBsZXRpb24gYml0IDsgdGhlbgotICAgICAgICBjb21wbGV0ZSAtQyAiYml0IC0tdGFiIiBiaXQKLSAgICBmaQogICAgIGlmIFsgLXogIiRaU0hfVkVSU0lPTiIgXTsgdGhlbgogICAgICAgICAjIERvZXNuJ3Qgd29yayBpbiB6c2guCiAgICAgICAgIGNvbXBsZXRlIC1vIG5vc3BhY2UgLUYgX2Nyb290IGNyb290CkBAIC00NzUsMjQ1ICszODQsMTUgQEAKICAgICAgICAgY29tcGxldGUgLUYgX2JhemVsX19jb21wbGV0ZSAtbyBub3NwYWNlIGIKICAgICBmaQogICAgIGNvbXBsZXRlIC1GIF9sdW5jaCBsdW5jaAorICAgIGNvbXBsZXRlIC1GIF9sdW5jaF9jb21wbGV0aW9uIGx1bmNoMgogCiAgICAgY29tcGxldGUgLUYgX2NvbXBsZXRlX2FuZHJvaWRfbW9kdWxlX25hbWVzIHBhdGhtb2QKICAgICBjb21wbGV0ZSAtRiBfY29tcGxldGVfYW5kcm9pZF9tb2R1bGVfbmFtZXMgZ29tb2QKICAgICBjb21wbGV0ZSAtRiBfY29tcGxldGVfYW5kcm9pZF9tb2R1bGVfbmFtZXMgb3V0bW9kCiAgICAgY29tcGxldGUgLUYgX2NvbXBsZXRlX2FuZHJvaWRfbW9kdWxlX25hbWVzIGluc3RhbGxtb2QKLSAgICBjb21wbGV0ZSAtRiBfY29tcGxldGVfYW5kcm9pZF9tb2R1bGVfbmFtZXMgYm1vZAogICAgIGNvbXBsZXRlIC1GIF9jb21wbGV0ZV9hbmRyb2lkX21vZHVsZV9uYW1lcyBtCiB9CiAKLWZ1bmN0aW9uIG11bHRpdHJlZV9sdW5jaF9oZWxwKCkKLXsKLSAgICBlY2hvICJ1c2FnZTogbHVuY2ggUFJPRFVDVC1WQVJJQU5UIiAxPiYyCi0gICAgZWNobyAiICAgIFNldCB1cCBhbmRyb2lkIGJ1aWxkIGVudmlyb25tZW50IGJhc2VkIG9uIGEgcHJvZHVjdCBzaG9ydCBuYW1lIGFuZCB2YXJpYW50IiAxPiYyCi0gICAgZWNobyAxPiYyCi0gICAgZWNobyAibHVuY2ggQ09NQk9fRklMRSBWQVJJQU5UIiAxPiYyCi0gICAgZWNobyAiICAgIFNldCB1cCBhbmRyb2lkIGJ1aWxkIGVudmlyb25tZW50IGJhc2VkIG9uIGEgc3BlY2lmaWMgbHVuY2ggY29tYm8gZmlsZSIgMT4mMgotICAgIGVjaG8gIiAgICBhbmQgdmFyaWFudC4iIDE+JjIKLSAgICBlY2hvIDE+JjIKLSAgICBlY2hvICJsdW5jaCAtLXByaW50IFtDT05GSUddIiAxPiYyCi0gICAgZWNobyAiICAgIFByaW50IHRoZSBjb250ZW50cyBvZiBhIGNvbmZpZ3VyYXRpb24uICBJZiBDT05GSUcgaXMgc3VwcGxpZWQsIHRoYXQgY29uZmlnIiAxPiYyCi0gICAgZWNobyAiICAgIHdpbGwgYmUgZmxhdHRlbmVkIGFuZCBwcmludGVkLiAgSWYgQ09ORklHIGlzIG5vdCBzdXBwbGllZCwgdGhlIGN1cnJlbnRseSIgMT4mMgotICAgIGVjaG8gIiAgICBzZWxlY3RlZCBjb25maWcgd2lsbCBiZSBwcmludGVkLiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3Igbm9uemVybyBvbiBlcnJvci4iIDE+JjIKLSAgICBlY2hvIDE+JjIKLSAgICBlY2hvICJsdW5jaCAtLWxpc3QiIDE+JjIKLSAgICBlY2hvICIgICAgTGlzdCBhbGwgcG9zc2libGUgY29tYm8gZmlsZXMgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IHRyZWUiIDE+JjIKLSAgICBlY2hvIDE+JjIKLSAgICBlY2hvICJsdW5jaCAtLWhlbHAiIDE+JjIKLSAgICBlY2hvICJsdW5jaCAtaCIgMT4mMgotICAgIGVjaG8gIiAgICBQcmludHMgdGhpcyBtZXNzYWdlLiIgMT4mMgotfQotCi1mdW5jdGlvbiBtdWx0aXRyZWVfbHVuY2goKQotewotICAgIGxvY2FsIGNvZGUKLSAgICBsb2NhbCByZXN1bHRzCi0gICAgIyBMdW5jaCBtdXN0IGJlIHJ1biBpbiB0aGUgdG9wZGlyLCBidXQgdGhpcyB3YXkgd2UgZ2V0IGEgY2xlYXIgZXJyb3IKLSAgICAjIG1lc3NhZ2UsIGluc3RlYWQgb2YgRmlsZU5vdEZvdW5kLgotICAgIGxvY2FsIFQ9JChtdWx0aXRyZWVfZ2V0dG9wKQotICAgIGlmIFsgLXogIiRUIiBdOyB0aGVuCi0gICAgICBfbXVsdGl0cmVlX2x1bmNoX2Vycm9yCi0gICAgICByZXR1cm4gMQotICAgIGZpCi0gICAgaWYgJChlY2hvICIkMSIgfCBncmVwIC1xICdeLScpIDsgdGhlbgotICAgICAgICAjIENhbGxzIHN0YXJ0aW5nIHdpdGggYSAtLSBhcmd1bWVudCBhcmUgcGFzc2VkIGRpcmVjdGx5IGFuZCB0aGUgZnVuY3Rpb24KLSAgICAgICAgIyByZXR1cm5zIHdpdGggdGhlIGx1bmNoLnB5IGV4aXQgY29kZS4KLSAgICAgICAgIiR7VH0vb3JjaGVzdHJhdG9yL2J1aWxkL29yY2hlc3RyYXRvci9jb3JlL2x1bmNoLnB5IiAiJEAiCi0gICAgICAgIGNvZGU9JD8KLSAgICAgICAgaWYgW1sgJGNvZGUgLWVxIDIgXV0gOyB0aGVuCi0gICAgICAgICAgZWNobyAxPiYyCi0gICAgICAgICAgbXVsdGl0cmVlX2x1bmNoX2hlbHAKLSAgICAgICAgICByZXR1cm4gJGNvZGUKLSAgICAgICAgZWxpZiBbWyAkY29kZSAtbmUgMCBdXSA7IHRoZW4KLSAgICAgICAgICByZXR1cm4gJGNvZGUKLSAgICAgICAgZmkKLSAgICBlbHNlCi0gICAgICAgICMgQWxsIG90aGVyIGNhbGxzIGdvIHRocm91Z2ggdGhlIC0tbHVuY2ggdmFyaWFudCBvZiBsdW5jaC5weQotICAgICAgICByZXN1bHRzPSgkKCR7VH0vb3JjaGVzdHJhdG9yL2J1aWxkL29yY2hlc3RyYXRvci9jb3JlL2x1bmNoLnB5IC0tbHVuY2ggIiRAIikpCi0gICAgICAgIGNvZGU9JD8KLSAgICAgICAgaWYgW1sgJGNvZGUgLWVxIDIgXV0gOyB0aGVuCi0gICAgICAgICAgZWNobyAxPiYyCi0gICAgICAgICAgbXVsdGl0cmVlX2x1bmNoX2hlbHAKLSAgICAgICAgICByZXR1cm4gJGNvZGUKLSAgICAgICAgZWxpZiBbWyAkY29kZSAtbmUgMCBdXSA7IHRoZW4KLSAgICAgICAgICByZXR1cm4gJGNvZGUKLSAgICAgICAgZmkKLQotICAgICAgICBleHBvcnQgVEFSR0VUX0JVSUxEX0NPTUJPPSR7cmVzdWx0c1swXX0KLSAgICAgICAgZXhwb3J0IFRBUkdFVF9CVUlMRF9WQVJJQU5UPSR7cmVzdWx0c1sxXX0KLSAgICBmaQotfQotCi1mdW5jdGlvbiBjaG9vc2V0eXBlKCkKLXsKLSAgICBlY2hvICJCdWlsZCB0eXBlIGNob2ljZXMgYXJlOiIKLSAgICBlY2hvICIgICAgIDEuIHJlbGVhc2UiCi0gICAgZWNobyAiICAgICAyLiBkZWJ1ZyIKLSAgICBlY2hvCi0KLSAgICBsb2NhbCBERUZBVUxUX05VTSBERUZBVUxUX1ZBTFVFCi0gICAgREVGQVVMVF9OVU09MQotICAgIERFRkFVTFRfVkFMVUU9cmVsZWFzZQotCi0gICAgZXhwb3J0IFRBUkdFVF9CVUlMRF9UWVBFPQotICAgIGxvY2FsIEFOU1dFUgotICAgIHdoaWxlIFsgLXogJFRBUkdFVF9CVUlMRF9UWVBFIF0KLSAgICBkbwotICAgICAgICBlY2hvIC1uICJXaGljaCB3b3VsZCB5b3UgbGlrZT8gWyIkREVGQVVMVF9OVU0iXSAiCi0gICAgICAgIGlmIFsgLXogIiQxIiBdIDsgdGhlbgotICAgICAgICAgICAgcmVhZCBBTlNXRVIKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZWNobyAkMQotICAgICAgICAgICAgQU5TV0VSPSQxCi0gICAgICAgIGZpCi0gICAgICAgIGNhc2UgJEFOU1dFUiBpbgotICAgICAgICAiIikKLSAgICAgICAgICAgIGV4cG9ydCBUQVJHRVRfQlVJTERfVFlQRT0kREVGQVVMVF9WQUxVRQotICAgICAgICAgICAgOzsKLSAgICAgICAgMSkKLSAgICAgICAgICAgIGV4cG9ydCBUQVJHRVRfQlVJTERfVFlQRT1yZWxlYXNlCi0gICAgICAgICAgICA7OwotICAgICAgICByZWxlYXNlKQotICAgICAgICAgICAgZXhwb3J0IFRBUkdFVF9CVUlMRF9UWVBFPXJlbGVhc2UKLSAgICAgICAgICAgIDs7Ci0gICAgICAgIDIpCi0gICAgICAgICAgICBleHBvcnQgVEFSR0VUX0JVSUxEX1RZUEU9ZGVidWcKLSAgICAgICAgICAgIDs7Ci0gICAgICAgIGRlYnVnKQotICAgICAgICAgICAgZXhwb3J0IFRBUkdFVF9CVUlMRF9UWVBFPWRlYnVnCi0gICAgICAgICAgICA7OwotICAgICAgICAqKQotICAgICAgICAgICAgZWNobwotICAgICAgICAgICAgZWNobyAiSSBkaWRuJ3QgdW5kZXJzdGFuZCB5b3VyIHJlc3BvbnNlLiAgUGxlYXNlIHRyeSBhZ2Fpbi4iCi0gICAgICAgICAgICBlY2hvCi0gICAgICAgICAgICA7OwotICAgICAgICBlc2FjCi0gICAgICAgIGlmIFsgLW4gIiQxIiBdIDsgdGhlbgotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLSAgICBkb25lCi0KLSAgICBidWlsZF9idWlsZF92YXJfY2FjaGUKLSAgICBzZXRfc3R1ZmZfZm9yX2Vudmlyb25tZW50Ci0gICAgZGVzdHJveV9idWlsZF92YXJfY2FjaGUKLX0KLQotIwotIyBUaGlzIGZ1bmN0aW9uIGlzbid0IHJlYWxseSByaWdodDogIEl0IGNob29zZXMgYSBUQVJHRVRfUFJPRFVDVAotIyBiYXNlZCBvbiB0aGUgbGlzdCBvZiBib2FyZHMuICBVc3VhbGx5LCB0aGF0IGdldHMgeW91IHNvbWV0aGluZwotIyB0aGF0IGtpbmRhIHdvcmtzIHdpdGggYSBnZW5lcmljIHByb2R1Y3QsIGJ1dCByZWFsbHksIHlvdSBzaG91bGQKLSMgcGljayBhIHByb2R1Y3QgYnkgbmFtZS4KLSMKLWZ1bmN0aW9uIGNob29zZXByb2R1Y3QoKQotewotICAgIGxvY2FsIGRlZmF1bHRfdmFsdWUKLSAgICBpZiBbICJ4JFRBUkdFVF9QUk9EVUNUIiAhPSB4IF0gOyB0aGVuCi0gICAgICAgIGRlZmF1bHRfdmFsdWU9JFRBUkdFVF9QUk9EVUNUCi0gICAgZWxzZQotICAgICAgICBkZWZhdWx0X3ZhbHVlPWFvc3BfYXJtCi0gICAgZmkKLQotICAgIGV4cG9ydCBUQVJHRVRfQlVJTERfQVBQUz0KLSAgICBleHBvcnQgVEFSR0VUX1BST0RVQ1Q9Ci0gICAgbG9jYWwgQU5TV0VSCi0gICAgd2hpbGUgWyAteiAiJFRBUkdFVF9QUk9EVUNUIiBdCi0gICAgZG8KLSAgICAgICAgZWNobyAtbiAiV2hpY2ggcHJvZHVjdCB3b3VsZCB5b3UgbGlrZT8gWyRkZWZhdWx0X3ZhbHVlXSAiCi0gICAgICAgIGlmIFsgLXogIiQxIiBdIDsgdGhlbgotICAgICAgICAgICAgcmVhZCBBTlNXRVIKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZWNobyAkMQotICAgICAgICAgICAgQU5TV0VSPSQxCi0gICAgICAgIGZpCi0KLSAgICAgICAgaWYgWyAteiAiJEFOU1dFUiIgXSA7IHRoZW4KLSAgICAgICAgICAgIGV4cG9ydCBUQVJHRVRfUFJPRFVDVD0kZGVmYXVsdF92YWx1ZQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBpZiBjaGVja19wcm9kdWN0ICRBTlNXRVIKLSAgICAgICAgICAgIHRoZW4KLSAgICAgICAgICAgICAgICBleHBvcnQgVEFSR0VUX1BST0RVQ1Q9JEFOU1dFUgotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVjaG8gIioqIE5vdCBhIHZhbGlkIHByb2R1Y3Q6ICRBTlNXRVIiCi0gICAgICAgICAgICBmaQotICAgICAgICBmaQotICAgICAgICBpZiBbIC1uICIkMSIgXSA7IHRoZW4KLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIGZpCi0gICAgZG9uZQotCi0gICAgYnVpbGRfYnVpbGRfdmFyX2NhY2hlCi0gICAgc2V0X3N0dWZmX2Zvcl9lbnZpcm9ubWVudAotICAgIGRlc3Ryb3lfYnVpbGRfdmFyX2NhY2hlCi19Ci0KLWZ1bmN0aW9uIGNob29zZXZhcmlhbnQoKQotewotICAgIGVjaG8gIlZhcmlhbnQgY2hvaWNlcyBhcmU6IgotICAgIGxvY2FsIGluZGV4PTEKLSAgICBsb2NhbCB2Ci0gICAgZm9yIHYgaW4gJHtWQVJJQU5UX0NIT0lDRVNbQF19Ci0gICAgZG8KLSAgICAgICAgIyBUaGUgcHJvZHVjdCBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZwotICAgICAgICAjIHRoZSBtYWtlZmlsZSB3ZSBmb3VuZCwgYWJvdmUuCi0gICAgICAgIGVjaG8gIiAgICAgJGluZGV4LiAkdiIKLSAgICAgICAgaW5kZXg9JCgoJGluZGV4KzEpKQotICAgIGRvbmUKLQotICAgIGxvY2FsIGRlZmF1bHRfdmFsdWU9ZW5nCi0gICAgbG9jYWwgQU5TV0VSCi0KLSAgICBleHBvcnQgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9Ci0gICAgd2hpbGUgWyAteiAiJFRBUkdFVF9CVUlMRF9WQVJJQU5UIiBdCi0gICAgZG8KLSAgICAgICAgZWNobyAtbiAiV2hpY2ggd291bGQgeW91IGxpa2U/IFskZGVmYXVsdF92YWx1ZV0gIgotICAgICAgICBpZiBbIC16ICIkMSIgXSA7IHRoZW4KLSAgICAgICAgICAgIHJlYWQgQU5TV0VSCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGVjaG8gJDEKLSAgICAgICAgICAgIEFOU1dFUj0kMQotICAgICAgICBmaQotCi0gICAgICAgIGlmIFsgLXogIiRBTlNXRVIiIF0gOyB0aGVuCi0gICAgICAgICAgICBleHBvcnQgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9JGRlZmF1bHRfdmFsdWUKLSAgICAgICAgZWxpZiAoZWNobyAtbiAkQU5TV0VSIHwgZ3JlcCAtcSAtZSAiXlswLTldWzAtOV0qJCIpIDsgdGhlbgotICAgICAgICAgICAgaWYgWyAiJEFOU1dFUiIgLWxlICIkeyNWQVJJQU5UX0NIT0lDRVNbQF19IiBdIDsgdGhlbgotICAgICAgICAgICAgICAgIGV4cG9ydCBUQVJHRVRfQlVJTERfVkFSSUFOVD0ke1ZBUklBTlRfQ0hPSUNFU1tAXTokKCgkQU5TV0VSLTEpKToxfQotICAgICAgICAgICAgZmkKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaWYgY2hlY2tfdmFyaWFudCAkQU5TV0VSCi0gICAgICAgICAgICB0aGVuCi0gICAgICAgICAgICAgICAgZXhwb3J0IFRBUkdFVF9CVUlMRF9WQVJJQU5UPSRBTlNXRVIKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBlY2hvICIqKiBOb3QgYSB2YWxpZCB2YXJpYW50OiAkQU5TV0VSIgotICAgICAgICAgICAgZmkKLSAgICAgICAgZmkKLSAgICAgICAgaWYgWyAtbiAiJDEiIF0gOyB0aGVuCi0gICAgICAgICAgICBicmVhawotICAgICAgICBmaQotICAgIGRvbmUKLX0KLQotZnVuY3Rpb24gY2hvb3NlY29tYm8oKQotewotICAgIGNob29zZXR5cGUgJDEKLQotICAgIGVjaG8KLSAgICBlY2hvCi0gICAgY2hvb3NlcHJvZHVjdCAkMgotCi0gICAgZWNobwotICAgIGVjaG8KLSAgICBjaG9vc2V2YXJpYW50ICQzCi0KLSAgICBlY2hvCi0gICAgYnVpbGRfYnVpbGRfdmFyX2NhY2hlCi0gICAgc2V0X3N0dWZmX2Zvcl9lbnZpcm9ubWVudAotICAgIHByaW50Y29uZmlnCi0gICAgZGVzdHJveV9idWlsZF92YXJfY2FjaGUKLX0KLQogZnVuY3Rpb24gYWRkX2x1bmNoX2NvbWJvKCkKIHsKICAgICBpZiBbIC1uICIkWlNIX1ZFUlNJT04iIF07IHRoZW4KQEAgLTcyOCw3ICs0MDcsNyBAQAogewogICAgIGxvY2FsIHVuYW1lPSQodW5hbWUpCiAgICAgbG9jYWwgY2hvaWNlcwotICAgIGNob2ljZXM9JChUQVJHRVRfQlVJTERfQVBQUz0gVEFSR0VUX1BST0RVQ1Q9IFRBUkdFVF9CVUlMRF9WQVJJQU5UPSBnZXRfYnVpbGRfdmFyIENPTU1PTl9MVU5DSF9DSE9JQ0VTIDI+L2Rldi9udWxsKQorICAgIGNob2ljZXM9JChUQVJHRVRfQlVJTERfQVBQUz0gVEFSR0VUX1BST0RVQ1Q9IFRBUkdFVF9SRUxFQVNFPSBUQVJHRVRfQlVJTERfVkFSSUFOVD0gX2dldF9idWlsZF92YXJfY2FjaGVkIENPTU1PTl9MVU5DSF9DSE9JQ0VTIDI+L2Rldi9udWxsKQogICAgIGxvY2FsIHJldD0kPwogCiAgICAgZWNobwpAQCAtNzYyLDYgKzQ0MSw3IEBACiBmdW5jdGlvbiBsdW5jaCgpCiB7CiAgICAgbG9jYWwgYW5zd2VyCisgICAgc2V0dXBfY29nX2Vudl9pZl9uZWVkZWQKIAogICAgIGlmIFtbICQjIC1ndCAxIF1dOyB0aGVuCiAgICAgICAgIGVjaG8gInVzYWdlOiBsdW5jaCBbdGFyZ2V0XSIgPiYyCkBAIC03NzQsOCArNDU0LDggQEAKICAgICAgICAgYW5zd2VyPSQxCiAgICAgZWxzZQogICAgICAgICBwcmludF9sdW5jaF9tZW51Ci0gICAgICAgIGVjaG8gIldoaWNoIHdvdWxkIHlvdSBsaWtlPyBbYW9zcF9hcm0tZW5nXSIKLSAgICAgICAgZWNobyAtbiAiUGljayBmcm9tIGNvbW1vbiBjaG9pY2VzIGFib3ZlIChlLmcuIDEzKSBvciBzcGVjaWZ5IHlvdXIgb3duIChlLmcuIGFvc3BfYmFyYmV0LWVuZyk6ICIKKyAgICAgICAgZWNobyAiV2hpY2ggd291bGQgeW91IGxpa2U/IFthb3NwX2NmX3g4Nl82NF9waG9uZS10cnVua19zdGFnaW5nLWVuZ10iCisgICAgICAgIGVjaG8gLW4gIlBpY2sgZnJvbSBjb21tb24gY2hvaWNlcyBhYm92ZSAoZS5nLiAxMykgb3Igc3BlY2lmeSB5b3VyIG93biAoZS5nLiBhb3NwX2JhcmJldC10cnVua19zdGFnaW5nLWVuZyk6ICIKICAgICAgICAgcmVhZCBhbnN3ZXIKICAgICAgICAgdXNlZF9sdW5jaF9tZW51PTEKICAgICBmaQpAQCAtNzg0LDEwICs0NjQsMTAgQEAKIAogICAgIGlmIFsgLXogIiRhbnN3ZXIiIF0KICAgICB0aGVuCi0gICAgICAgIHNlbGVjdGlvbj1hb3NwX2FybS1lbmcKKyAgICAgICAgc2VsZWN0aW9uPWFvc3BfY2ZfeDg2XzY0X3Bob25lLXRydW5rX3N0YWdpbmctZW5nCiAgICAgZWxpZiAoZWNobyAtbiAkYW5zd2VyIHwgZ3JlcCAtcSAtZSAiXlswLTldWzAtOV0qJCIpCiAgICAgdGhlbgotICAgICAgICBsb2NhbCBjaG9pY2VzPSgkKFRBUkdFVF9CVUlMRF9BUFBTPSBnZXRfYnVpbGRfdmFyIENPTU1PTl9MVU5DSF9DSE9JQ0VTKSkKKyAgICAgICAgbG9jYWwgY2hvaWNlcz0oJChUQVJHRVRfQlVJTERfQVBQUz0gVEFSR0VUX1BST0RVQ1Q9IFRBUkdFVF9SRUxFQVNFPSBUQVJHRVRfQlVJTERfVkFSSUFOVD0gX2dldF9idWlsZF92YXJfY2FjaGVkIENPTU1PTl9MVU5DSF9DSE9JQ0VTIDI+L2Rldi9udWxsKSkKICAgICAgICAgaWYgWyAkYW5zd2VyIC1sZSAkeyNjaG9pY2VzW0BdfSBdCiAgICAgICAgIHRoZW4KICAgICAgICAgICAgICMgYXJyYXkgaW4genNoIHN0YXJ0cyBmcm9tIDEgaW5zdGVhZCBvZiAwLgpAQCAtODA0LDI2ICs0ODQsMzEgQEAKIAogICAgIGV4cG9ydCBUQVJHRVRfQlVJTERfQVBQUz0KIAotICAgIGxvY2FsIHByb2R1Y3QgdmFyaWFudF9hbmRfdmVyc2lvbiB2YXJpYW50IHZlcnNpb24KLSAgICBwcm9kdWN0PSR7c2VsZWN0aW9uJSUtKn0gIyBUcmltIGV2ZXJ5dGhpbmcgYWZ0ZXIgZmlyc3QgZGFzaAotICAgIHZhcmlhbnRfYW5kX3ZlcnNpb249JHtzZWxlY3Rpb24jKi19ICMgVHJpbSBldmVyeXRoaW5nIHVwIHRvIGZpcnN0IGRhc2gKLSAgICBpZiBbICIkdmFyaWFudF9hbmRfdmVyc2lvbiIgIT0gIiRzZWxlY3Rpb24iIF07IHRoZW4KLSAgICAgICAgdmFyaWFudD0ke3ZhcmlhbnRfYW5kX3ZlcnNpb24lJS0qfQotICAgICAgICBpZiBbICIkdmFyaWFudCIgIT0gIiR2YXJpYW50X2FuZF92ZXJzaW9uIiBdOyB0aGVuCi0gICAgICAgICAgICB2ZXJzaW9uPSR7dmFyaWFudF9hbmRfdmVyc2lvbiMqLX0KLSAgICAgICAgZmkKLSAgICBmaQorICAgICMgVGhpcyBtdXN0IGJlIDxwcm9kdWN0Pi08cmVsZWFzZT4tPHZhcmlhbnQ+CisgICAgbG9jYWwgcHJvZHVjdCByZWxlYXNlIHZhcmlhbnQKKyAgICAjIFNwbGl0IHN0cmluZyBvbiB0aGUgJy0nIGNoYXJhY3Rlci4KKyAgICBJRlM9Ii0iIHJlYWQgLXIgcHJvZHVjdCByZWxlYXNlIHZhcmlhbnQgPDw8ICIkc2VsZWN0aW9uIgogCi0gICAgaWYgWyAteiAiJHByb2R1Y3QiIF0KKyAgICBpZiBbWyAteiAiJHByb2R1Y3QiIF1dIHx8IFtbIC16ICIkcmVsZWFzZSIgXV0gfHwgW1sgLXogIiR2YXJpYW50IiBdXQogICAgIHRoZW4KICAgICAgICAgZWNobwogICAgICAgICBlY2hvICJJbnZhbGlkIGx1bmNoIGNvbWJvOiAkc2VsZWN0aW9uIgorICAgICAgICBlY2hvICJWYWxpZCBjb21ib3MgbXVzdCBiZSBvZiB0aGUgZm9ybSA8cHJvZHVjdD4tPHJlbGVhc2U+LTx2YXJpYW50PiIKICAgICAgICAgcmV0dXJuIDEKICAgICBmaQogCisgICAgX2x1bmNoX21lYXQgJHByb2R1Y3QgJHJlbGVhc2UgJHZhcmlhbnQKK30KKworZnVuY3Rpb24gX2x1bmNoX21lYXQoKQoreworICAgIGxvY2FsIHByb2R1Y3Q9JDEKKyAgICBsb2NhbCByZWxlYXNlPSQyCisgICAgbG9jYWwgdmFyaWFudD0kMworCiAgICAgVEFSR0VUX1BST0RVQ1Q9JHByb2R1Y3QgXAorICAgIFRBUkdFVF9SRUxFQVNFPSRyZWxlYXNlIFwKICAgICBUQVJHRVRfQlVJTERfVkFSSUFOVD0kdmFyaWFudCBcCi0gICAgVEFSR0VUX1BMQVRGT1JNX1ZFUlNJT049JHZlcnNpb24gXAogICAgIGJ1aWxkX2J1aWxkX3Zhcl9jYWNoZQogICAgIGlmIFsgJD8gLW5lIDAgXQogICAgIHRoZW4KQEAgLTgzMywyNCArNTE4LDI0IEBACiAgICAgICAgIGZpCiAgICAgICAgIHJldHVybiAxCiAgICAgZmkKLSAgICBleHBvcnQgVEFSR0VUX1BST0RVQ1Q9JChnZXRfYnVpbGRfdmFyIFRBUkdFVF9QUk9EVUNUKQotICAgIGV4cG9ydCBUQVJHRVRfQlVJTERfVkFSSUFOVD0kKGdldF9idWlsZF92YXIgVEFSR0VUX0JVSUxEX1ZBUklBTlQpCi0gICAgaWYgWyAtbiAiJHZlcnNpb24iIF07IHRoZW4KLSAgICAgIGV4cG9ydCBUQVJHRVRfUExBVEZPUk1fVkVSU0lPTj0kKGdldF9idWlsZF92YXIgVEFSR0VUX1BMQVRGT1JNX1ZFUlNJT04pCi0gICAgZWxzZQotICAgICAgdW5zZXQgVEFSR0VUX1BMQVRGT1JNX1ZFUlNJT04KLSAgICBmaQorICAgIGV4cG9ydCBUQVJHRVRfUFJPRFVDVD0kKF9nZXRfYnVpbGRfdmFyX2NhY2hlZCBUQVJHRVRfUFJPRFVDVCkKKyAgICBleHBvcnQgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9JChfZ2V0X2J1aWxkX3Zhcl9jYWNoZWQgVEFSR0VUX0JVSUxEX1ZBUklBTlQpCisgICAgZXhwb3J0IFRBUkdFVF9SRUxFQVNFPSRyZWxlYXNlCisgICAgIyBOb3RlIHRoaXMgaXMgdGhlIHN0cmluZyAicmVsZWFzZSIsIG5vdCB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlLgogICAgIGV4cG9ydCBUQVJHRVRfQlVJTERfVFlQRT1yZWxlYXNlCiAKLSAgICBpZiBbICR1c2VkX2x1bmNoX21lbnUgLWVxIDEgXTsgdGhlbgotICAgICAgZWNobwotICAgICAgZWNobyAiSGludDogbmV4dCB0aW1lIHlvdSBjYW4gc2ltcGx5IHJ1biAnbHVuY2ggJHNlbGVjdGlvbiciCi0gICAgZmkKLQogICAgIFtbIC1uICIke0FORFJPSURfUVVJRVRfQlVJTEQ6LX0iIF1dIHx8IGVjaG8KIAogICAgIHNldF9zdHVmZl9mb3JfZW52aXJvbm1lbnQKICAgICBbWyAtbiAiJHtBTkRST0lEX1FVSUVUX0JVSUxEOi19IiBdXSB8fCBwcmludGNvbmZpZworCisgICAgaWYgW1sgLXogIiR7QU5EUk9JRF9RVUlFVF9CVUlMRH0iIF1dOyB0aGVuCisgICAgICAgIGxvY2FsIHNwYW1fZm9yX2x1bmNoPSQoZ2V0dG9wKS9idWlsZC9tYWtlL3Rvb2xzL2VudnNldHVwL3NwYW1fZm9yX2x1bmNoCisgICAgICAgIGlmIFtbIC14ICRzcGFtX2Zvcl9sdW5jaCBdXTsgdGhlbgorICAgICAgICAgICAgJHNwYW1fZm9yX2x1bmNoCisgICAgICAgIGZpCisgICAgZmkKKwogICAgIGRlc3Ryb3lfYnVpbGRfdmFyX2NhY2hlCiAKICAgICBpZiBbWyAtbiAiJHtDSEVDS19NVV9DT05GSUc6LX0iIF1dOyB0aGVuCkBAIC04NjgsMTkgKzU1MywxMjcgQEAKICAgICBwcmV2PSIke0NPTVBfV09SRFNbQ09NUF9DV09SRC0xXX0iCiAKICAgICBpZiBbIC16ICIkQ09NTU9OX0xVTkNIX0NIT0lDRVNfQ0FDSEUiIF07IHRoZW4KLSAgICAgICAgQ09NTU9OX0xVTkNIX0NIT0lDRVNfQ0FDSEU9JChUQVJHRVRfQlVJTERfQVBQUz0gZ2V0X2J1aWxkX3ZhciBDT01NT05fTFVOQ0hfQ0hPSUNFUykKKyAgICAgICAgQ09NTU9OX0xVTkNIX0NIT0lDRVNfQ0FDSEU9JChUQVJHRVRfQlVJTERfQVBQUz0gX2dldF9idWlsZF92YXJfY2FjaGVkIENPTU1PTl9MVU5DSF9DSE9JQ0VTKQogICAgIGZpCiAKICAgICBDT01QUkVQTFk9KCAkKGNvbXBnZW4gLVcgIiR7Q09NTU9OX0xVTkNIX0NIT0lDRVNfQ0FDSEV9IiAtLSAke2N1cn0pICkKICAgICByZXR1cm4gMAogfQogCitmdW5jdGlvbiBfbHVuY2hfdXNhZ2UoKQoreworICAgICgKKyAgICAgICAgZWNobyAiVGhlIGx1bmNoIGNvbW1hbmQgc2VsZWN0cyB0aGUgY29uZmlndXJhdGlvbiB0byB1c2UgZm9yIHN1YnNlcXVlbnQiCisgICAgICAgIGVjaG8gIkFuZHJvaWQgYnVpbGRzLiIKKyAgICAgICAgZWNobworICAgICAgICBlY2hvICJVc2FnZTogbHVuY2ggVEFSR0VUX1BST0RVQ1QgW1RBUkdFVF9SRUxFQVNFIFtUQVJHRVRfQlVJTERfVkFSSUFOVF1dIgorICAgICAgICBlY2hvCisgICAgICAgIGVjaG8gIiAgQ2hvb3NlIHRoZSBwcm9kdWN0LCByZWxlYXNlIGFuZCB2YXJpYW50IHRvIHVzZS4gSWYgbm90IgorICAgICAgICBlY2hvICIgIHN1cHBsaWVkLCBUQVJHRVRfUkVMRUFTRSB3aWxsIGJlICd0cnVua19zdGFnaW5nJyBhbmQiCisgICAgICAgIGVjaG8gIiAgVEFSR0VUX0JVSUxEX1ZBUklBTlQgd2lsbCBiZSAnZW5nJyIKKyAgICAgICAgZWNobworICAgICAgICBlY2hvCisgICAgICAgIGVjaG8gIlVzYWdlOiBsdW5jaCBUQVJHRVRfUFJPRFVDVC1UQVJHRVRfUkVMRUFTRS1UQVJHRVRfQlVJTERfVkFSSUFOVCIKKyAgICAgICAgZWNobworICAgICAgICBlY2hvICIgIENob3NlIHRoZSBwcm9kdWN0LCByZWxlYXNlIGFuZCB2YXJpYW50IHRvIHVzZS4gVGhpcyIKKyAgICAgICAgZWNobyAiICBsZWdhY3kgZm9ybWF0IGlzIG1haW50YWluZWQgZm9yIGNvbXBhdGliaWxpdHkuIgorICAgICAgICBlY2hvCisgICAgICAgIGVjaG8KKyAgICAgICAgZWNobyAiTm90ZSB0aGF0IHRoZSBwcmV2aW91cyBpbnRlcmFjdGl2ZSBtZW51IGFuZCBsaXN0IG9mIGhhcmQtY29kZWQiCisgICAgICAgIGVjaG8gImxpc3Qgb2YgY3VyYXRlZCB0YXJnZXRzIGhhcyBiZWVuIHJlbW92ZWQuIElmIHlvdSB3b3VsZCBsaWtlIHRoZSIKKyAgICAgICAgZWNobyAibGlzdCBvZiBwcm9kdWN0cywgcmVsZWFzZSBjb25maWdzIGZvciBhIHBhcnRpY3VsYXIgcHJvZHVjdCwgb3IiCisgICAgICAgIGVjaG8gInZhcmlhbnRzLCBydW4gbGlzdF9wcm9kdWN0cywgbGlzdF9yZWxlYXNlX2NvbmZpZ3MsIGxpc3RfdmFyaWFudHMiCisgICAgICAgIGVjaG8gInJlc3BlY3RpdmVseS4iCisgICAgICAgIGVjaG8KKyAgICApIDE+JjIKK30KKworZnVuY3Rpb24gbHVuY2gyKCkKK3sKKyAgICBpZiBbWyAkIyAtZXEgMSAmJiAkMSA9ICItLWhlbHAiIF1dOyB0aGVuCisgICAgICAgIF9sdW5jaF91c2FnZQorICAgICAgICByZXR1cm4gMAorICAgIGZpCisgICAgaWYgW1sgJCMgLWVxIDAgXV07IHRoZW4KKyAgICAgICAgZWNobyAiTm8gdGFyZ2V0IHNwZWNpZmllZC4gU2VlIGx1bmNoIC0taGVscCIgMT4mMgorICAgICAgICByZXR1cm4gMQorICAgIGZpCisgICAgaWYgW1sgJCMgLWd0IDMgXV07IHRoZW4KKyAgICAgICAgZWNobyAiVG9vIG1hbnkgcGFyYW1ldGVycyBnaXZlbi4gU2VlIGx1bmNoIC0taGVscCIgMT4mMgorICAgICAgICByZXR1cm4gMQorICAgIGZpCisKKyAgICBsb2NhbCBwcm9kdWN0IHJlbGVhc2UgdmFyaWFudAorCisgICAgIyBIYW5kbGUgdGhlIGxlZ2FjeSBmb3JtYXQKKyAgICBsb2NhbCBsZWdhY3k9JChlY2hvICQxIHwgZ3JlcCAiLSIpCisgICAgaWYgW1sgJCMgLWVxIDEgJiYgLW4gJGxlZ2FjeSBdXTsgdGhlbgorICAgICAgICBJRlM9Ii0iIHJlYWQgLXIgcHJvZHVjdCByZWxlYXNlIHZhcmlhbnQgPDw8ICIkMSIKKyAgICAgICAgaWYgW1sgLXogIiRwcm9kdWN0IiBdXSB8fCBbWyAteiAiJHJlbGVhc2UiIF1dIHx8IFtbIC16ICIkdmFyaWFudCIgXV07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIkludmFsaWQgbHVuY2ggY29tYm86ICQxIiAxPiYyCisgICAgICAgICAgICBlY2hvICJWYWxpZCBjb21ib3MgbXVzdCBiZSBvZiB0aGUgZm9ybSA8cHJvZHVjdD4tPHJlbGVhc2U+LTx2YXJpYW50PiB3aGVuIHVzaW5nIiAxPiYyCisgICAgICAgICAgICBlY2hvICJ0aGUgbGVnYWN5IGZvcm1hdC4gIFJ1biAnbHVuY2ggLS1oZWxwJyBmb3IgdXNhZ2UuIiAxPiYyCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBmaQorICAgIGZpCisKKyAgICAjIEhhbmRsZSB0aGUgbmV3IGZvcm1hdC4KKyAgICBpZiBbWyAteiAkbGVnYWN5IF1dOyB0aGVuCisgICAgICAgIHByb2R1Y3Q9JDEKKyAgICAgICAgcmVsZWFzZT0kMgorICAgICAgICBpZiBbWyAteiAkcmVsZWFzZSBdXTsgdGhlbgorICAgICAgICAgICAgcmVsZWFzZT10cnVua19zdGFnaW5nCisgICAgICAgIGZpCisgICAgICAgIHZhcmlhbnQ9JDMKKyAgICAgICAgaWYgW1sgLXogJHZhcmlhbnQgXV07IHRoZW4KKyAgICAgICAgICAgIHZhcmlhbnQ9ZW5nCisgICAgICAgIGZpCisgICAgZmkKKworICAgICMgVmFsaWRhdGUgdGhlIHNlbGVjdGlvbiBhbmQgc2V0IGFsbCB0aGUgZW52aXJvbm1lbnQgc3R1ZmYKKyAgICBfbHVuY2hfbWVhdCAkcHJvZHVjdCAkcmVsZWFzZSAkdmFyaWFudAorfQorCit1bnNldCBBTkRST0lEX0xVTkNIX0NPTVBMRVRJT05fUFJPRFVDVF9DQUNIRQordW5zZXQgQU5EUk9JRF9MVU5DSF9DT01QTEVUSU9OX0NIT1NFTl9QUk9EVUNUCit1bnNldCBBTkRST0lEX0xVTkNIX0NPTVBMRVRJT05fUkVMRUFTRV9DQUNIRQorIyBUYWIgY29tcGxldGlvbiBmb3IgbHVuY2guCitmdW5jdGlvbiBfbHVuY2hfY29tcGxldGlvbigpCit7CisgICAgIyBBdmFpbGFibGUgcHJvZHVjdHMKKyAgICBpZiBbWyAkQ09NUF9DV09SRCAtZXEgMSBdXSA7IHRoZW4KKyAgICAgICAgaWYgW1sgLXogJEFORFJPSURfTFVOQ0hfQ09NUExFVElPTl9QUk9EVUNUX0NBQ0hFIF1dOyB0aGVuCisgICAgICAgICAgICBBTkRST0lEX0xVTkNIX0NPTVBMRVRJT05fUFJPRFVDVF9DQUNIRT0kKGxpc3RfcHJvZHVjdHMpCisgICAgICAgIGZpCisgICAgICAgIENPTVBSRVBMWT0oICQoY29tcGdlbiAtVyAiJHtBTkRST0lEX0xVTkNIX0NPTVBMRVRJT05fUFJPRFVDVF9DQUNIRX0iIC0tICIke0NPTVBfV09SRFNbQ09NUF9DV09SRF19IikgKQorICAgIGZpCisKKyAgICAjIEF2YWlsYWJsZSByZWxlYXNlIGNvbmZpZ3MKKyAgICBpZiBbWyAkQ09NUF9DV09SRCAtZXEgMiBdXSA7IHRoZW4KKyAgICAgICAgaWYgW1sgLXogJEFORFJPSURfTFVOQ0hfQ09NUExFVElPTl9SRUxFQVNFX0NBQ0hFIHx8ICRBTkRST0lEX0xVTkNIX0NPTVBMRVRJT05fQ0hPU0VOX1BST0RVQ1QgIT0gJHtDT01QX1dPUkRTWzFdfSBdXSA7IHRoZW4KKyAgICAgICAgICAgIEFORFJPSURfTFVOQ0hfQ09NUExFVElPTl9SRUxFQVNFX0NBQ0hFPSQobGlzdF9yZWxlYXNlcyAke0NPTVBfV09SRFNbMV19KQorICAgICAgICAgICAgQU5EUk9JRF9MVU5DSF9DT01QTEVUSU9OX0NIT1NFTl9QUk9EVUNUPSR7Q09NUF9XT1JEU1sxXX0KKyAgICAgICAgZmkKKyAgICAgICAgQ09NUFJFUExZPSggJChjb21wZ2VuIC1XICIke0FORFJPSURfTFVOQ0hfQ09NUExFVElPTl9SRUxFQVNFX0NBQ0hFfSIgLS0gIiR7Q09NUF9XT1JEU1tDT01QX0NXT1JEXX0iKSApCisgICAgZmkKKworICAgICMgQXZhaWxhYmxlIHZhcmlhbnRzCisgICAgaWYgW1sgJENPTVBfQ1dPUkQgLWVxIDMgXV0gOyB0aGVuCisgICAgICAgIENPTVBSRVBMWT0odXNlciB1c2VyZGVidWcgZW5nKQorICAgIGZpCisKKyAgICByZXR1cm4gMAorfQorCisKICMgQ29uZmlndXJlcyB0aGUgYnVpbGQgdG8gYnVpbGQgdW5idW5kbGVkIGFwcHMuCiAjIFJ1biB0YXBhcyB3aXRoIG9uZSBvciBtb3JlIGFwcCBuYW1lcyAoZnJvbSBMT0NBTF9QQUNLQUdFX05BTUUpCiBmdW5jdGlvbiB0YXBhcygpCiB7CiAgICAgbG9jYWwgc2hvd0hlbHA9IiQoZWNobyAkKiB8IHhhcmdzIC1uIDEgZWNobyB8IFxncmVwIC1FICdeKGhlbHApJCcgfCB4YXJncykiCiAgICAgbG9jYWwgYXJjaD0iJChlY2hvICQqIHwgeGFyZ3MgLW4gMSBlY2hvIHwgXGdyZXAgLUUgJ14oYXJtfHg4Nnxhcm02NHx4ODZfNjQpJCcgfCB4YXJncykiCisgICAgIyBUT0RPKGIvMzA3OTc1MjkzKTogRXhwYW5kIHRhcGFzIHRvIHRha2UgcmVsZWFzZSBhcmd1bWVudHMgKGFuZCB1cGRhdGUgaG1tKCkgdXNhZ2UpLgorICAgIGxvY2FsIHJlbGVhc2U9InRydW5rX3N0YWdpbmciCiAgICAgbG9jYWwgdmFyaWFudD0iJChlY2hvICQqIHwgeGFyZ3MgLW4gMSBlY2hvIHwgXGdyZXAgLUUgJ14odXNlcnx1c2VyZGVidWd8ZW5nKSQnIHwgeGFyZ3MpIgogICAgIGxvY2FsIGRlbnNpdHk9IiQoZWNobyAkKiB8IHhhcmdzIC1uIDEgZWNobyB8IFxncmVwIC1FICdeKGxkcGl8bWRwaXx0dmRwaXxoZHBpfHhoZHBpfHh4aGRwaXx4eHhoZHBpfGFsbGRwaSkkJyB8IHhhcmdzKSIKICAgICBsb2NhbCBrZXlzPSIkKGVjaG8gJCogfCB4YXJncyAtbiAxIGVjaG8gfCBcZ3JlcCAtRSAnXihkZXZrZXlzKSQnIHwgeGFyZ3MpIgpAQCAtODk2LDYgKzY4OSwxMCBAQAogICAgICAgICBlY2hvICJ0YXBhczogRXJyb3I6IE11bHRpcGxlIGJ1aWxkIGFyY2hzIHN1cHBsaWVkOiAkYXJjaCIKICAgICAgICAgcmV0dXJuCiAgICAgZmkKKyAgICBpZiBbICQoZWNobyAkcmVsZWFzZSB8IHdjIC13KSAtZ3QgMSBdOyB0aGVuCisgICAgICAgIGVjaG8gInRhcGFzOiBFcnJvcjogTXVsdGlwbGUgYnVpbGQgcmVsZWFzZXMgc3VwcGxpZWQ6ICRyZWxlYXNlIgorICAgICAgICByZXR1cm4KKyAgICBmaQogICAgIGlmIFsgJChlY2hvICR2YXJpYW50IHwgd2MgLXcpIC1ndCAxIF07IHRoZW4KICAgICAgICAgZWNobyAidGFwYXM6IEVycm9yOiBNdWx0aXBsZSBidWlsZCB2YXJpYW50cyBzdXBwbGllZDogJHZhcmlhbnQiCiAgICAgICAgIHJldHVybgpAQCAtOTMwLDYgKzcyNyw3IEBACiAgICAgZmkKIAogICAgIGV4cG9ydCBUQVJHRVRfUFJPRFVDVD0kcHJvZHVjdAorICAgIGV4cG9ydCBUQVJHRVRfUkVMRUFTRT0kcmVsZWFzZQogICAgIGV4cG9ydCBUQVJHRVRfQlVJTERfVkFSSUFOVD0kdmFyaWFudAogICAgIGV4cG9ydCBUQVJHRVRfQlVJTERfREVOU0lUWT0kZGVuc2l0eQogICAgIGV4cG9ydCBUQVJHRVRfQlVJTERfVFlQRT1yZWxlYXNlCkBAIC05NDYsOSArNzQ0LDExIEBACiBmdW5jdGlvbiBiYW5jaGFuKCkKIHsKICAgICBsb2NhbCBzaG93SGVscD0iJChlY2hvICQqIHwgeGFyZ3MgLW4gMSBlY2hvIHwgXGdyZXAgLUUgJ14oaGVscCkkJyB8IHhhcmdzKSIKLSAgICBsb2NhbCBwcm9kdWN0PSIkKGVjaG8gJCogfCB4YXJncyAtbiAxIGVjaG8gfCBcZ3JlcCAtRSAnXiguKl8pPyhhcm18eDg2fGFybTY0fHg4Nl82NHxhcm02NG9ubHl8eDg2XzY0b25seSkkJyB8IHhhcmdzKSIKKyAgICBsb2NhbCBwcm9kdWN0PSIkKGVjaG8gJCogfCB4YXJncyAtbiAxIGVjaG8gfCBcZ3JlcCAtRSAnXiguKl8pPyhhcm18eDg2fGFybTY0fHJpc2N2NjR8eDg2XzY0fGFybTY0b25seXx4ODZfNjRvbmx5KSQnIHwgeGFyZ3MpIgorICAgICMgVE9ETzogRXhwYW5kIGJhbmNoYW4gdG8gdGFrZSByZWxlYXNlIGFyZ3VtZW50cyAoYW5kIHVwZGF0ZSBobW0oKSB1c2FnZSkuCisgICAgbG9jYWwgcmVsZWFzZT0idHJ1bmtfc3RhZ2luZyIKICAgICBsb2NhbCB2YXJpYW50PSIkKGVjaG8gJCogfCB4YXJncyAtbiAxIGVjaG8gfCBcZ3JlcCAtRSAnXih1c2VyfHVzZXJkZWJ1Z3xlbmcpJCcgfCB4YXJncykiCi0gICAgbG9jYWwgYXBwcz0iJChlY2hvICQqIHwgeGFyZ3MgLW4gMSBlY2hvIHwgXGdyZXAgLUUgLXYgJ14odXNlcnx1c2VyZGVidWd8ZW5nfCguKl8pPyhhcm18eDg2fGFybTY0fHg4Nl82NCkpJCcgfCB4YXJncykiCisgICAgbG9jYWwgYXBwcz0iJChlY2hvICQqIHwgeGFyZ3MgLW4gMSBlY2hvIHwgXGdyZXAgLUUgLXYgJ14odXNlcnx1c2VyZGVidWd8ZW5nfCguKl8pPyhhcm18eDg2fGFybTY0fHJpc2N2NjR8eDg2XzY0KSkkJyB8IHhhcmdzKSIKIAogICAgIGlmIFsgIiRzaG93SGVscCIgIT0gIiIgXTsgdGhlbgogICAgICAgJChnZXR0b3ApL2J1aWxkL21ha2UvYmFuY2hhbkhlbHAuc2gKQEAgLTk2MSw2ICs3NjEsMTAgQEAKICAgICAgICAgZWNobyAiYmFuY2hhbjogRXJyb3I6IE11bHRpcGxlIGJ1aWxkIGFyY2hzIG9yIHByb2R1Y3RzIHN1cHBsaWVkOiAkcHJvZHVjdHMiCiAgICAgICAgIHJldHVybgogICAgIGZpCisgICAgaWYgWyAkKGVjaG8gJHJlbGVhc2UgfCB3YyAtdykgLWd0IDEgXTsgdGhlbgorICAgICAgICBlY2hvICJiYW5jaGFuOiBFcnJvcjogTXVsdGlwbGUgYnVpbGQgcmVsZWFzZXMgc3VwcGxpZWQ6ICRyZWxlYXNlIgorICAgICAgICByZXR1cm4KKyAgICBmaQogICAgIGlmIFsgJChlY2hvICR2YXJpYW50IHwgd2MgLXcpIC1ndCAxIF07IHRoZW4KICAgICAgICAgZWNobyAiYmFuY2hhbjogRXJyb3I6IE11bHRpcGxlIGJ1aWxkIHZhcmlhbnRzIHN1cHBsaWVkOiAkdmFyaWFudCIKICAgICAgICAgcmV0dXJuCkBAIC05NzQsNiArNzc4LDcgQEAKICAgICAgIGFybSkgICAgcHJvZHVjdD1tb2R1bGVfYXJtOzsKICAgICAgIHg4NikgICAgcHJvZHVjdD1tb2R1bGVfeDg2OzsKICAgICAgIGFybTY0KSAgcHJvZHVjdD1tb2R1bGVfYXJtNjQ7OworICAgICAgcmlzY3Y2NCkgcHJvZHVjdD1tb2R1bGVfcmlzY3Y2NDs7CiAgICAgICB4ODZfNjQpIHByb2R1Y3Q9bW9kdWxlX3g4Nl82NDs7CiAgICAgICBhcm02NG9ubHkpICBwcm9kdWN0PW1vZHVsZV9hcm02NG9ubHk7OwogICAgICAgeDg2XzY0b25seSkgcHJvZHVjdD1tb2R1bGVfeDg2XzY0b25seTs7CkBAIC05ODMsNiArNzg4LDcgQEAKICAgICBmaQogCiAgICAgZXhwb3J0IFRBUkdFVF9QUk9EVUNUPSRwcm9kdWN0CisgICAgZXhwb3J0IFRBUkdFVF9SRUxFQVNFPSRyZWxlYXNlCiAgICAgZXhwb3J0IFRBUkdFVF9CVUlMRF9WQVJJQU5UPSR2YXJpYW50CiAgICAgZXhwb3J0IFRBUkdFVF9CVUlMRF9ERU5TSVRZPWFsbGRwaQogICAgIGV4cG9ydCBUQVJHRVRfQlVJTERfVFlQRT1yZWxlYXNlCkBAIC05OTcsMzQgKzgwMyw2IEBACiAgICAgZGVzdHJveV9idWlsZF92YXJfY2FjaGUKIH0KIAotIyBUT0RPOiBNZXJnZSBpbnRvIGdldHRvcCBhcyBwYXJ0IG9mIGxhdW5jaGluZyBtdWx0aXRyZWUKLWZ1bmN0aW9uIG11bHRpdHJlZV9nZXR0b3AKLXsKLSAgICBsb2NhbCBUT1BGSUxFPW9yY2hlc3RyYXRvci9idWlsZC9tYWtlL2NvcmUvZW52c2V0dXAubWsKLSAgICBpZiBbIC1uICIkVE9QIiAtYSAtZiAiJFRPUC8kVE9QRklMRSIgXSA7IHRoZW4KLSAgICAgICAgIyBUaGUgZm9sbG93aW5nIGNpcmN1bWxvY3V0aW9uIGVuc3VyZXMgd2UgcmVtb3ZlIHN5bWxpbmtzIGZyb20gVE9QLgotICAgICAgICAoY2QgIiRUT1AiOyBQV0Q9IC9iaW4vcHdkKQotICAgIGVsc2UKLSAgICAgICAgaWYgWyAtZiAkVE9QRklMRSBdIDsgdGhlbgotICAgICAgICAgICAgIyBUaGUgZm9sbG93aW5nIGNpcmN1bWxvY3V0aW9uIChyZXBlYXRlZCBiZWxvdyBhcyB3ZWxsKSBlbnN1cmVzCi0gICAgICAgICAgICAjIHRoYXQgd2UgcmVjb3JkIHRoZSB0cnVlIGRpcmVjdG9yeSBuYW1lIGFuZCBub3Qgb25lIHRoYXQgaXMKLSAgICAgICAgICAgICMgZmFrZWQgdXAgd2l0aCBzeW1saW5rIG5hbWVzLgotICAgICAgICAgICAgUFdEPSAvYmluL3B3ZAotICAgICAgICBlbHNlCi0gICAgICAgICAgICBsb2NhbCBIRVJFPSRQV0QKLSAgICAgICAgICAgIGxvY2FsIFQ9Ci0gICAgICAgICAgICB3aGlsZSBbIFwoICEgXCggLWYgJFRPUEZJTEUgXCkgXCkgLWEgXCggIiRQV0QiICE9ICIvIiBcKSBdOyBkbwotICAgICAgICAgICAgICAgIFxjZCAuLgotICAgICAgICAgICAgICAgIFQ9YFBXRD0gL2Jpbi9wd2QgLVBgCi0gICAgICAgICAgICBkb25lCi0gICAgICAgICAgICBcY2QgIiRIRVJFIgotICAgICAgICAgICAgaWYgWyAtZiAiJFQvJFRPUEZJTEUiIF07IHRoZW4KLSAgICAgICAgICAgICAgICBlY2hvICIkVCIKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgZmkKLX0KLQogZnVuY3Rpb24gY3Jvb3QoKQogewogICAgIGxvY2FsIFQ9JChnZXR0b3ApCkBAIC0xMDY4LDMzNCArODQ2LDMzIEBACiAgICAgZWNobyAiY2FuJ3QgZmluZCBBbmRyb2lkLm1rIgogfQogCi0jIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiBwczsgb3V0cHV0IGluIHRoZSBmb3JtCi0jIDxwaWQ+IDxwcm9jbmFtZT4KLWZ1bmN0aW9uIHFwaWQoKSB7Ci0gICAgbG9jYWwgcHJlcGVuZD0nJwotICAgIGxvY2FsIGFwcGVuZD0nJwotICAgIGlmIFsgIiQxIiA9ICItLWV4YWN0IiBdOyB0aGVuCi0gICAgICAgIHByZXBlbmQ9JyAnCi0gICAgICAgIGFwcGVuZD0nJCcKLSAgICAgICAgc2hpZnQKLSAgICBlbGlmIFsgIiQxIiA9ICItLWhlbHAiIC1vICIkMSIgPSAiLWgiIF07IHRoZW4KLSAgICAgICAgZWNobyAidXNhZ2U6IHFwaWQgW1stLWV4YWN0XSA8cHJvY2VzcyBuYW1lfHBpZD4iCi0gICAgICAgIHJldHVybiAyNTUKKyMgRW5zdXJlIHRoYXQgd2UncmUgYWx3YXlzIHVzaW5nIHRoZSBhZGIgaW4gdGhlIHRyZWUuIFRoaXMgd29ya3MgYXJvdW5kIHRoZSBmYWN0CisjIHRoYXQgYmFzaCBjYWNoZXMgJFBBVEggbG9va3Vwcywgc28gaWYgeW91IHVzZSBhZGIgYmVmb3JlIGx1bmNoaW5nL2J1aWxkaW5nIHRoZQorIyBvbmUgaW4geW91ciB0cmVlLCB5b3UnbGwgY29udGludWUgdG8gZ2V0IC91c3IvYmluL2FkYiBvciB3aGF0ZXZlciBldmVuIGFmdGVyCisjIHlvdSBoYXZlIHRoZSBvbmUgZnJvbSB5b3VyIGN1cnJlbnQgdHJlZSBvbiB5b3VyIHBhdGguIEhpc3RvcmljYWxseSB0aGlzIHdvdWxkCisjIGNhdXNlIGNvbmZ1c2lvbiBiZWNhdXNlIGdsaW51eCBoYWQgYWRiIGluIC91c3IvYmluLyBieSBkZWZhdWx0LCB0aG91Z2ggdGhhdAorIyBkb2Vzbid0IGFwcGVhciB0byBiZSB0aGUgY2FzZSBvbiBteSByb2RldGUgaG9zdHM7IGl0IGlzIGhvd2V2ZXIgc3RpbGwgdGhlIGNhc2UKKyMgdGhhdCBteSBNYWMgaGFzIC91c3IvbG9jYWwvYmluL2FkYiBpbnN0YWxsZWQgYnkgZGVmYXVsdCBhbmQgb24gdGhlIGRlZmF1bHQKKyMgcGF0aC4KK2Z1bmN0aW9uIGFkYigpIHsKKyAgICAjIFdlIG5lZWQgYGNvbW1hbmQgd2hpY2hgIGJlY2F1c2UgenNoIGhhcyBhIGJ1aWx0LWluIGB3aGljaGAgdGhhdCdzIG1vcmUKKyAgICAjIGxpa2UgYHR5cGVgLgorICAgIGxvY2FsIEFEQj0kKGNvbW1hbmQgd2hpY2ggYWRiKQorICAgIGlmIFsgLXogIiRBREIiIF07IHRoZW4KKyAgICAgICAgZWNobyAiQ29tbWFuZCBhZGIgbm90IGZvdW5kOyB0cnkgbHVuY2ggKGFuZCBidWlsZGluZykgZmlyc3Q/IgorICAgICAgICByZXR1cm4gMQogICAgIGZpCisgICAgcnVuX3Rvb2xfd2l0aF9sb2dnaW5nICJBREIiICRBREIgIiR7QH0iCit9CiAKLSAgICBsb2NhbCBFWEU9IiQxIgotICAgIGlmIFsgIiRFWEUiIF0gOyB0aGVuCi0gICAgICAgIHFwaWQgfCBcZ3JlcCAiJHByZXBlbmQkRVhFJGFwcGVuZCIKLSAgICBlbHNlCi0gICAgICAgIGFkYiBzaGVsbCBwcyBcCi0gICAgICAgICAgICB8IHRyIC1kICdccicgXAotICAgICAgICAgICAgfCBzZWQgLWUgMWQgLWUgJ3MvXlteIF0qICpcKFswLTldKlwpLiogXChbXiBdKlwpJC9cMSBcMi8nCitmdW5jdGlvbiBmYXN0Ym9vdCgpIHsKKyAgICBsb2NhbCBGQVNUQk9PVD0kKGNvbW1hbmQgd2hpY2ggZmFzdGJvb3QpCisgICAgaWYgWyAteiAiJEZBU1RCT09UIiBdOyB0aGVuCisgICAgICAgIGVjaG8gIkNvbW1hbmQgZmFzdGJvb3Qgbm90IGZvdW5kOyB0cnkgbHVuY2ggKGFuZCBidWlsZGluZykgZmlyc3Q/IgorICAgICAgICByZXR1cm4gMQogICAgIGZpCi19Ci0KLSMgc3lzd3JpdGUgLSBkaXNhYmxlIHZlcml0eSwgcmVib290IGlmIG5lZWRlZCwgYW5kIHJlbW91bnQgaW1hZ2UKLSMKLSMgRWFzeSB3YXkgdG8gbWFrZSBzeXN0ZW0uaW1nL2V0YyB3cml0YWJsZQotZnVuY3Rpb24gc3lzd3JpdGUoKSB7Ci0gIGFkYiB3YWl0LWZvci1kZXZpY2UgJiYgYWRiIHJvb3QgfHwgcmV0dXJuIDEKLSAgaWYgW1sgJChhZGIgZGlzYWJsZS12ZXJpdHkgfCBncmVwIC1pICJyZWJvb3QiKSBdXTsgdGhlbgotICAgICAgZWNobyAicmVib290aW5nIgotICAgICAgYWRiIHJlYm9vdCAmJiBhZGIgd2FpdC1mb3ItZGV2aWNlICYmIGFkYiByb290IHx8IHJldHVybiAxCi0gIGZpCi0gIGFkYiB3YWl0LWZvci1kZXZpY2UgJiYgYWRiIHJlbW91bnQgfHwgcmV0dXJuIDEKLX0KLQotIyBjb3JlZHVtcF9zZXR1cCAtIGVuYWJsZSBjb3JlIGR1bXBzIGdsb2JhbGx5IGZvciBhbnkgcHJvY2VzcwotIyAgICAgICAgICAgICAgICAgIHRoYXQgaGFzIHRoZSBjb3JlLWZpbGUtc2l6ZSBsaW1pdCBzZXQgY29ycmVjdGx5Ci0jCi0jIE5PVEU6IFlvdSBtdXN0IGNhbGwgYWxzbyBjb3JlZHVtcF9lbmFibGUgZm9yIGEgc3BlY2lmaWMgcHJvY2VzcwotIyAgICAgICBpZiBpdHMgY29yZS1maWxlLXNpemUgbGltaXQgaXMgbm90IHNldCBhbHJlYWR5LgotIyBOT1RFOiBDb3JlIGR1bXBzIGFyZSB3cml0dGVuIHRvIHJhbWRpc2s7IHRoZXkgd2lsbCBub3Qgc3Vydml2ZSBhIHJlYm9vdCEKLQotZnVuY3Rpb24gY29yZWR1bXBfc2V0dXAoKQotewotICAgIGVjaG8gIkdldHRpbmcgcm9vdC4uLiI7Ci0gICAgYWRiIHJvb3Q7Ci0gICAgYWRiIHdhaXQtZm9yLWRldmljZTsKLQotICAgIGVjaG8gIlJlbW91bnRpbmcgcm9vdCBwYXJ0aXRpb24gcmVhZC13cml0ZS4uLiI7Ci0gICAgYWRiIHNoZWxsIG1vdW50IC13IC1vIHJlbW91bnQgLXQgcm9vdGZzIHJvb3RmczsKLSAgICBzbGVlcCAxOwotICAgIGFkYiB3YWl0LWZvci1kZXZpY2U7Ci0gICAgYWRiIHNoZWxsIG1rZGlyIC1wIC9jb3JlczsKLSAgICBhZGIgc2hlbGwgbW91bnQgLXQgdG1wZnMgdG1wZnMgL2NvcmVzOwotICAgIGFkYiBzaGVsbCBjaG1vZCAwNzc3IC9jb3JlczsKLQotICAgIGVjaG8gIkdyYW50aW5nIFNFTGludXggcGVybWlzc2lvbiB0byBkdW1wIGluIC9jb3Jlcy4uLiI7Ci0gICAgYWRiIHNoZWxsIHJlc3RvcmVjb24gLVIgL2NvcmVzOwotCi0gICAgZWNobyAiU2V0IGNvcmUgcGF0dGVybi4iOwotICAgIGFkYiBzaGVsbCAnZWNobyAvY29yZXMvY29yZS4lcCA+IC9wcm9jL3N5cy9rZXJuZWwvY29yZV9wYXR0ZXJuJzsKLQotICAgIGVjaG8gIkRvbmUuIgotfQotCi0jIGNvcmVkdW1wX2VuYWJsZSAtIGVuYWJsZSBjb3JlIGR1bXBzIGZvciB0aGUgc3BlY2lmaWVkIHByb2Nlc3MKLSMgJDEgPSBQSUQgb2YgcHJvY2VzcyAoZS5nLiwgJChwaWQgbWVkaWFzZXJ2ZXIpKQotIwotIyBOT1RFOiBjb3JlZHVtcF9zZXR1cCBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgYXMgd2VsbCBmb3IgYSBjb3JlCi0jICAgICAgIGR1bXAgdG8gYWN0dWFsbHkgYmUgZ2VuZXJhdGVkLgotCi1mdW5jdGlvbiBjb3JlZHVtcF9lbmFibGUoKQotewotICAgIGxvY2FsIFBJRD0kMTsKLSAgICBpZiBbIC16ICIkUElEIiBdOyB0aGVuCi0gICAgICAgIHByaW50ZiAiRXhwZWN0aW5nIGEgUElEIVxuIjsKLSAgICAgICAgcmV0dXJuOwotICAgIGZpOwotICAgIGVjaG8gIlNldHRpbmcgY29yZSBsaW1pdCBmb3IgJFBJRCB0byBpbmZpbml0ZS4uLiI7Ci0gICAgYWRiIHNoZWxsIC9zeXN0ZW0vYmluL3VsaW1pdCAtUCAkUElEIC1jIHVubGltaXRlZAotfQotCi0jIGNvcmUgLSBzZW5kIFNJR1YgYW5kIHB1bGwgdGhlIGNvcmUgZm9yIHByb2Nlc3MKLSMgJDEgPSBQSUQgb2YgcHJvY2VzcyAoZS5nLiwgJChwaWQgbWVkaWFzZXJ2ZXIpKQotIwotIyBOT1RFOiBjb3JlZHVtcF9zZXR1cCBtdXN0IGJlIGNhbGxlZCBvbmNlIHBlciBib290IGZvciBjb3JlIGR1bXBzIHRvIGJlCi0jICAgICAgIGVuYWJsZWQgZ2xvYmFsbHkuCi0KLWZ1bmN0aW9uIGNvcmUoKQotewotICAgIGxvY2FsIFBJRD0kMTsKLQotICAgIGlmIFsgLXogIiRQSUQiIF07IHRoZW4KLSAgICAgICAgcHJpbnRmICJFeHBlY3RpbmcgYSBQSUQhXG4iOwotICAgICAgICByZXR1cm47Ci0gICAgZmk7Ci0KLSAgICBsb2NhbCBDT1JFTkFNRT1jb3JlLiRQSUQ7Ci0gICAgbG9jYWwgQ09SRVBBVEg9L2NvcmVzLyRDT1JFTkFNRTsKLSAgICBsb2NhbCBTSUc9U0VHVjsKLQotICAgIGNvcmVkdW1wX2VuYWJsZSAkMTsKLQotICAgIGxvY2FsIGRvbmU9MDsKLSAgICB3aGlsZSBbICQoYWRiIHNoZWxsICJbIC1kIC9wcm9jLyRQSUQgXSAmJiBlY2hvIC1uIHllcyIpIF07IGRvCi0gICAgICAgIHByaW50ZiAiXHRTZW5kaW5nIFNJRyVzIHRvICVkLi4uXG4iICRTSUcgJFBJRDsKLSAgICAgICAgYWRiIHNoZWxsIGtpbGwgLSRTSUcgJFBJRDsKLSAgICAgICAgc2xlZXAgMTsKLSAgICBkb25lOwotCi0gICAgYWRiIHNoZWxsICJ3aGlsZSBbICEgLWYgJENPUkVQQVRIIF0gOyBkbyBlY2hvIHdhaXRpbmcgZm9yICRDT1JFUEFUSCB0byBiZSBnZW5lcmF0ZWQ7IHNsZWVwIDE7IGRvbmUiCi0gICAgZWNobyAiRG9uZTogY29yZSBpcyB1bmRlciAkQ09SRVBBVEggb24gZGV2aWNlLiI7Ci19Ci0KLSMgc3lzdGVtc3RhY2sgLSBkdW1wIHRoZSBjdXJyZW50IHN0YWNrIHRyYWNlIG9mIGFsbCB0aHJlYWRzIGluIHRoZSBzeXN0ZW0gcHJvY2VzcwotIyB0byB0aGUgdXN1YWwgQU5SIHRyYWNlcyBmaWxlCi1mdW5jdGlvbiBzeXN0ZW1zdGFjaygpCi17Ci0gICAgc3RhY2tzIHN5c3RlbV9zZXJ2ZXIKLX0KLQotIyBSZWFkIHRoZSBFTEYgaGVhZGVyIGZyb20gL3Byb2MvJFBJRC9leGUgdG8gZGV0ZXJtaW5lIGlmIHRoZSBwcm9jZXNzIGlzCi0jIDY0LWJpdC4KLWZ1bmN0aW9uIGlzNjRiaXQoKQotewotICAgIGxvY2FsIFBJRD0iJDEiCi0gICAgaWYgWyAiJFBJRCIgXSA7IHRoZW4KLSAgICAgICAgaWYgW1sgIiQoYWRiIHNoZWxsIGNhdCAvcHJvYy8kUElEL2V4ZSB8IHh4ZCAtbCAxIC1zIDQgLXApIiAtZXEgIjAyIiBdXSA7IHRoZW4KLSAgICAgICAgICAgIGVjaG8gIjY0IgotICAgICAgICBlbHNlCi0gICAgICAgICAgICBlY2hvICIiCi0gICAgICAgIGZpCi0gICAgZWxzZQotICAgICAgICBlY2hvICIiCi0gICAgZmkKLX0KLQotY2FzZSBgdW5hbWUgLXNgIGluCi0gICAgRGFyd2luKQotICAgICAgICBmdW5jdGlvbiBzZ3JlcCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmQgLUUgLiAtbmFtZSAucmVwbyAtcHJ1bmUgLW8gLW5hbWUgLmdpdCAtcHJ1bmUgLW8gIC10eXBlIGYgLWlyZWdleCAnLipcLihjfGh8Y2N8Y3BwfGhwcHxTfGphdmF8a3R8eG1sfHNofG1rfGFpZGx8dnRzfHByb3RvfHJzfGdvKScgXAotICAgICAgICAgICAgICAgIC1leGVjIGdyZXAgLS1jb2xvciAtbiAiJEAiIHt9ICsKLSAgICAgICAgfQotCi0gICAgICAgIDs7Ci0gICAgKikKLSAgICAgICAgZnVuY3Rpb24gc2dyZXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5kIC4gLW5hbWUgLnJlcG8gLXBydW5lIC1vIC1uYW1lIC5naXQgLXBydW5lIC1vICAtdHlwZSBmIC1pcmVnZXggJy4qXC5cKGNcfGhcfGNjXHxjcHBcfGhwcFx8U1x8amF2YVx8a3RcfHhtbFx8c2hcfG1rXHxhaWRsXHx2dHNcfHByb3RvXHxyc1x8Z29cKScgXAotICAgICAgICAgICAgICAgIC1leGVjIGdyZXAgLS1jb2xvciAtbiAiJEAiIHt9ICsKLSAgICAgICAgfQotICAgICAgICA7OwotZXNhYwotCi1mdW5jdGlvbiBnZXR0YXJnZXRhcmNoCi17Ci0gICAgZ2V0X2J1aWxkX3ZhciBUQVJHRVRfQVJDSAotfQotCi1mdW5jdGlvbiBnZ3JlcCgpCi17Ci0gICAgZmluZCAuIC1uYW1lIC5yZXBvIC1wcnVuZSAtbyAtbmFtZSAuZ2l0IC1wcnVuZSAtbyAtbmFtZSBvdXQgLXBydW5lIC1vIC10eXBlIGYgLW5hbWUgIipcLmdyYWRsZSIgXAotICAgICAgICAtZXhlYyBncmVwIC0tY29sb3IgLW4gIiRAIiB7fSArCi19Ci0KLWZ1bmN0aW9uIGdvZ3JlcCgpCi17Ci0gICAgZmluZCAuIC1uYW1lIC5yZXBvIC1wcnVuZSAtbyAtbmFtZSAuZ2l0IC1wcnVuZSAtbyAtbmFtZSBvdXQgLXBydW5lIC1vIC10eXBlIGYgLW5hbWUgIipcLmdvIiBcCi0gICAgICAgIC1leGVjIGdyZXAgLS1jb2xvciAtbiAiJEAiIHt9ICsKLX0KLQotZnVuY3Rpb24gamdyZXAoKQotewotICAgIGZpbmQgLiAtbmFtZSAucmVwbyAtcHJ1bmUgLW8gLW5hbWUgLmdpdCAtcHJ1bmUgLW8gLW5hbWUgb3V0IC1wcnVuZSAtbyAtdHlwZSBmIC1uYW1lICIqXC5qYXZhIiBcCi0gICAgICAgIC1leGVjIGdyZXAgLS1jb2xvciAtbiAiJEAiIHt9ICsKLX0KLQotZnVuY3Rpb24gcnNncmVwKCkKLXsKLSAgICBmaW5kIC4gLW5hbWUgLnJlcG8gLXBydW5lIC1vIC1uYW1lIC5naXQgLXBydW5lIC1vIC1uYW1lIG91dCAtcHJ1bmUgLW8gLXR5cGUgZiAtbmFtZSAiKlwucnMiIFwKLSAgICAgICAgLWV4ZWMgZ3JlcCAtLWNvbG9yIC1uICIkQCIge30gKwotfQotCi1mdW5jdGlvbiBqc29uZ3JlcCgpCi17Ci0gICAgZmluZCAuIC1uYW1lIC5yZXBvIC1wcnVuZSAtbyAtbmFtZSAuZ2l0IC1wcnVuZSAtbyAtbmFtZSBvdXQgLXBydW5lIC1vIC10eXBlIGYgLW5hbWUgIipcLmpzb24iIFwKLSAgICAgICAgLWV4ZWMgZ3JlcCAtLWNvbG9yIC1uICIkQCIge30gKwotfQotCi1mdW5jdGlvbiB0b21sZ3JlcCgpCi17Ci0gICAgZmluZCAuIC1uYW1lIC5yZXBvIC1wcnVuZSAtbyAtbmFtZSAuZ2l0IC1wcnVuZSAtbyAtbmFtZSBvdXQgLXBydW5lIC1vIC10eXBlIGYgLW5hbWUgIipcLnRvbWwiIFwKLSAgICAgICAgLWV4ZWMgZ3JlcCAtLWNvbG9yIC1uICIkQCIge30gKwotfQotCi1mdW5jdGlvbiBrdGdyZXAoKQotewotICAgIGZpbmQgLiAtbmFtZSAucmVwbyAtcHJ1bmUgLW8gLW5hbWUgLmdpdCAtcHJ1bmUgLW8gLW5hbWUgb3V0IC1wcnVuZSAtbyAtdHlwZSBmIC1uYW1lICIqXC5rdCIgXAotICAgICAgICAtZXhlYyBncmVwIC0tY29sb3IgLW4gIiRAIiB7fSArCi19Ci0KLWZ1bmN0aW9uIGNncmVwKCkKLXsKLSAgICBmaW5kIC4gLW5hbWUgLnJlcG8gLXBydW5lIC1vIC1uYW1lIC5naXQgLXBydW5lIC1vIC1uYW1lIG91dCAtcHJ1bmUgLW8gLXR5cGUgZiBcKCAtbmFtZSAnKi5jJyAtbyAtbmFtZSAnKi5jYycgLW8gLW5hbWUgJyouY3BwJyAtbyAtbmFtZSAnKi5oJyAtbyAtbmFtZSAnKi5ocHAnIFwpIFwKLSAgICAgICAgLWV4ZWMgZ3JlcCAtLWNvbG9yIC1uICIkQCIge30gKwotfQotCi1mdW5jdGlvbiByZXNncmVwKCkKLXsKLSAgICBsb2NhbCBkaXIKLSAgICBmb3IgZGlyIGluIGBmaW5kIC4gLW5hbWUgLnJlcG8gLXBydW5lIC1vIC1uYW1lIC5naXQgLXBydW5lIC1vIC1uYW1lIG91dCAtcHJ1bmUgLW8gLW5hbWUgcmVzIC10eXBlIGRgOyBkbwotICAgICAgICBmaW5kICRkaXIgLXR5cGUgZiAtbmFtZSAnKlwueG1sJyAtZXhlYyBncmVwIC0tY29sb3IgLW4gIiRAIiB7fSArCi0gICAgZG9uZQotfQotCi1mdW5jdGlvbiBtYW5ncmVwKCkKLXsKLSAgICBmaW5kIC4gLW5hbWUgLnJlcG8gLXBydW5lIC1vIC1uYW1lIC5naXQgLXBydW5lIC1vIC1wYXRoIC4vb3V0IC1wcnVuZSAtbyAtdHlwZSBmIC1uYW1lICdBbmRyb2lkTWFuaWZlc3QueG1sJyBcCi0gICAgICAgIC1leGVjIGdyZXAgLS1jb2xvciAtbiAiJEAiIHt9ICsKLX0KLQotZnVuY3Rpb24gb3duZ3JlcCgpCi17Ci0gICAgZmluZCAuIC1uYW1lIC5yZXBvIC1wcnVuZSAtbyAtbmFtZSAuZ2l0IC1wcnVuZSAtbyAtcGF0aCAuL291dCAtcHJ1bmUgLW8gLXR5cGUgZiAtbmFtZSAnT1dORVJTJyBcCi0gICAgICAgIC1leGVjIGdyZXAgLS1jb2xvciAtbiAiJEAiIHt9ICsKLX0KLQotZnVuY3Rpb24gc2VwZ3JlcCgpCi17Ci0gICAgZmluZCAuIC1uYW1lIC5yZXBvIC1wcnVuZSAtbyAtbmFtZSAuZ2l0IC1wcnVuZSAtbyAtcGF0aCAuL291dCAtcHJ1bmUgLW8gLW5hbWUgc2Vwb2xpY3kgLXR5cGUgZCBcCi0gICAgICAgIC1leGVjIGdyZXAgLS1jb2xvciAtbiAtciAtLWV4Y2x1ZGUtZGlyPVwuZ2l0ICIkQCIge30gKwotfQotCi1mdW5jdGlvbiByY2dyZXAoKQotewotICAgIGZpbmQgLiAtbmFtZSAucmVwbyAtcHJ1bmUgLW8gLW5hbWUgLmdpdCAtcHJ1bmUgLW8gLW5hbWUgb3V0IC1wcnVuZSAtbyAtdHlwZSBmIC1uYW1lICIqXC5yYyoiIFwKLSAgICAgICAgLWV4ZWMgZ3JlcCAtLWNvbG9yIC1uICIkQCIge30gKwotfQotCi1mdW5jdGlvbiBweWdyZXAoKQotewotICAgIGZpbmQgLiAtbmFtZSAucmVwbyAtcHJ1bmUgLW8gLW5hbWUgLmdpdCAtcHJ1bmUgLW8gLW5hbWUgb3V0IC1wcnVuZSAtbyAtdHlwZSBmIC1uYW1lICIqXC5weSIgXAotICAgICAgICAtZXhlYyBncmVwIC0tY29sb3IgLW4gIiRAIiB7fSArCi19Ci0KLWNhc2UgYHVuYW1lIC1zYCBpbgotICAgIERhcndpbikKLSAgICAgICAgZnVuY3Rpb24gbWdyZXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5kIC1FIC4gLW5hbWUgLnJlcG8gLXBydW5lIC1vIC1uYW1lIC5naXQgLXBydW5lIC1vIC1wYXRoIC4vb3V0IC1wcnVuZSAtbyBcKCAtaXJlZ2V4ICcuKi8oTWFrZWZpbGV8TWFrZWZpbGVcLi4qfC4qXC5tYWtlfC4qXC5tYWt8LipcLm1rfC4qXC5icCknIC1vIC1yZWdleCAnKC4qLyk/KGJ1aWxkfHNvb25nKS8uKlteL10qXC5nbycgXCkgLXR5cGUgZiBcCi0gICAgICAgICAgICAgICAgLWV4ZWMgZ3JlcCAtLWNvbG9yIC1uICIkQCIge30gKwotICAgICAgICB9Ci0KLSAgICAgICAgZnVuY3Rpb24gdHJlZWdyZXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5kIC1FIC4gLW5hbWUgLnJlcG8gLXBydW5lIC1vIC1uYW1lIC5naXQgLXBydW5lIC1vIC10eXBlIGYgLWlyZWdleCAnLipcLihjfGh8Y3BwfGhwcHxTfGphdmF8a3R8eG1sKScgXAotICAgICAgICAgICAgICAgIC1leGVjIGdyZXAgLS1jb2xvciAtbiAtaSAiJEAiIHt9ICsKLSAgICAgICAgfQotCi0gICAgICAgIDs7Ci0gICAgKikKLSAgICAgICAgZnVuY3Rpb24gbWdyZXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5kIC4gLW5hbWUgLnJlcG8gLXBydW5lIC1vIC1uYW1lIC5naXQgLXBydW5lIC1vIC1wYXRoIC4vb3V0IC1wcnVuZSAtbyBcKCAtcmVnZXh0eXBlIHBvc2l4LWVncmVwIC1pcmVnZXggJyguKlwvTWFrZWZpbGV8LipcL01ha2VmaWxlXC4uKnwuKlwubWFrZXwuKlwubWFrfC4qXC5ta3wuKlwuYnApJyAtbyAtcmVnZXh0eXBlIHBvc2l4LWV4dGVuZGVkIC1yZWdleCAnKC4qLyk/KGJ1aWxkfHNvb25nKS8uKlteL10qXC5nbycgXCkgLXR5cGUgZiBcCi0gICAgICAgICAgICAgICAgLWV4ZWMgZ3JlcCAtLWNvbG9yIC1uICIkQCIge30gKwotICAgICAgICB9Ci0KLSAgICAgICAgZnVuY3Rpb24gdHJlZWdyZXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5kIC4gLW5hbWUgLnJlcG8gLXBydW5lIC1vIC1uYW1lIC5naXQgLXBydW5lIC1vIC1yZWdleHR5cGUgcG9zaXgtZWdyZXAgLWlyZWdleCAnLipcLihjfGh8Y3BwfGhwcHxTfGphdmF8a3R8eG1sKScgLXR5cGUgZiBcCi0gICAgICAgICAgICAgICAgLWV4ZWMgZ3JlcCAtLWNvbG9yIC1uIC1pICIkQCIge30gKwotICAgICAgICB9Ci0KLSAgICAgICAgOzsKLWVzYWMKLQotZnVuY3Rpb24gZ2V0cHJlYnVpbHQKLXsKLSAgICBnZXRfYWJzX2J1aWxkX3ZhciBBTkRST0lEX1BSRUJVSUxUUwotfQotCi1mdW5jdGlvbiB0cmFjZWRtZHVtcCgpCi17Ci0gICAgbG9jYWwgVD0kKGdldHRvcCkKLSAgICBpZiBbICEgIiRUIiBdOyB0aGVuCi0gICAgICAgIGVjaG8gIkNvdWxkbid0IGxvY2F0ZSB0aGUgdG9wIG9mIHRoZSB0cmVlLiAgVHJ5IHNldHRpbmcgVE9QLiIKLSAgICAgICAgcmV0dXJuCi0gICAgZmkKLSAgICBsb2NhbCBwcmVidWlsdGRpcj0kKGdldHByZWJ1aWx0KQotICAgIGxvY2FsIGFyY2g9JChnZXR0YXJnZXRhcmNoKQotICAgIGxvY2FsIEtFUk5FTD0kVC9wcmVidWlsdHMvcWVtdS1rZXJuZWwvJGFyY2gvdm1saW51eC1xZW11Ci0KLSAgICBsb2NhbCBUUkFDRT0kMQotICAgIGlmIFsgISAiJFRSQUNFIiBdIDsgdGhlbgotICAgICAgICBlY2hvICJ1c2FnZTogIHRyYWNlZG1kdW1wICB0cmFjZW5hbWUiCi0gICAgICAgIHJldHVybgotICAgIGZpCi0KLSAgICBpZiBbICEgLXIgIiRLRVJORUwiIF0gOyB0aGVuCi0gICAgICAgIGVjaG8gIkVycm9yOiBjYW5ub3QgZmluZCBrZXJuZWw6ICckS0VSTkVMJyIKLSAgICAgICAgcmV0dXJuCi0gICAgZmkKLQotICAgIGxvY2FsIEJBU0VUUkFDRT0kKGJhc2VuYW1lICRUUkFDRSkKLSAgICBpZiBbICIkQkFTRVRSQUNFIiA9ICIkVFJBQ0UiIF0gOyB0aGVuCi0gICAgICAgIFRSQUNFPSRBTkRST0lEX1BST0RVQ1RfT1VUL3RyYWNlcy8kVFJBQ0UKLSAgICBmaQotCi0gICAgZWNobyAicG9zdC1wcm9jZXNzaW5nIHRyYWNlcy4uLiIKLSAgICBybSAtZiAkVFJBQ0UvcXRyYWNlLmRleGxpc3QKLSAgICBwb3N0X3RyYWNlICRUUkFDRQotICAgIGlmIFsgJD8gLW5lIDAgXTsgdGhlbgotICAgICAgICBlY2hvICIqKioiCi0gICAgICAgIGVjaG8gIioqKiBFcnJvcjogbWFsZm9ybWVkIHRyYWNlLiAgRGlkIHlvdSByZW1lbWJlciB0byBleGl0IHRoZSBlbXVsYXRvcj8iCi0gICAgICAgIGVjaG8gIioqKiIKLSAgICAgICAgcmV0dXJuCi0gICAgZmkKLSAgICBlY2hvICJnZW5lcmF0aW5nIGRleGxpc3Qgb3V0cHV0Li4uIgotICAgIC9iaW4vbHMgJEFORFJPSURfUFJPRFVDVF9PVVQvc3lzdGVtL2ZyYW1ld29yay8qLmphciAkQU5EUk9JRF9QUk9EVUNUX09VVC9zeXN0ZW0vYXBwLyouYXBrICRBTkRST0lEX1BST0RVQ1RfT1VUL2RhdGEvYXBwLyouYXBrIDI+L2Rldi9udWxsIHwgeGFyZ3MgZGV4bGlzdCA+ICRUUkFDRS9xdHJhY2UuZGV4bGlzdAotICAgIGVjaG8gImdlbmVyYXRpbmcgZG10cmFjZSBkYXRhLi4uIgotICAgIHEyZG0gLXIgJEFORFJPSURfUFJPRFVDVF9PVVQvc3ltYm9scyAkVFJBQ0UgJEtFUk5FTCAkVFJBQ0UvZG10cmFjZSB8fCByZXR1cm4KLSAgICBlY2hvICJnZW5lcmF0aW5nIGh0bWwgZmlsZS4uLiIKLSAgICBkbXRyYWNlZHVtcCAtaCAkVFJBQ0UvZG10cmFjZSA+fCAkVFJBQ0UvZG10cmFjZS5odG1sIHx8IHJldHVybgotICAgIGVjaG8gImRvbmUsIHNlZSAkVFJBQ0UvZG10cmFjZS5odG1sIGZvciBkZXRhaWxzIgotICAgIGVjaG8gIm9yIHJ1bjoiCi0gICAgZWNobyAiICAgIHRyYWNldmlldyAkVFJBQ0UvZG10cmFjZSIKKyAgICAjIFN1cHBvcnQgdG9vbCBldmVudCBsb2dnaW5nIGZvciBmYXN0Ym9vdCBjb21tYW5kLgorICAgIHJ1bl90b29sX3dpdGhfbG9nZ2luZyAiRkFTVEJPT1QiICRGQVNUQk9PVCAiJHtAfSIKIH0KIAogIyBjb21tdW5pY2F0ZSB3aXRoIGEgcnVubmluZyBkZXZpY2Ugb3IgZW11bGF0b3IsIHNldCB1cCBuZWNlc3Nhcnkgc3RhdGUsCkBAIC0xNDUwLDExMSArOTI3LDYgQEAKICAgICBoYXQgLUpYbXg1MTJtICRsb2NhbEZpbGUKIH0KIAotZnVuY3Rpb24gZ2V0YnVncmVwb3J0cygpCi17Ci0gICAgbG9jYWwgcmVwb3J0cz0oYGFkYiBzaGVsbCBscyAvc2RjYXJkL2J1Z3JlcG9ydHMgfCB0ciAtZCAnXHInYCkKLQotICAgIGlmIFsgISAiJHJlcG9ydHMiIF07IHRoZW4KLSAgICAgICAgZWNobyAiQ291bGQgbm90IGxvY2F0ZSBhbnkgYnVncmVwb3J0cy4iCi0gICAgICAgIHJldHVybgotICAgIGZpCi0KLSAgICBsb2NhbCByZXBvcnQKLSAgICBmb3IgcmVwb3J0IGluICR7cmVwb3J0c1tAXX0KLSAgICBkbwotICAgICAgICBlY2hvICIvc2RjYXJkL2J1Z3JlcG9ydHMvJHtyZXBvcnR9IgotICAgICAgICBhZGIgcHVsbCAvc2RjYXJkL2J1Z3JlcG9ydHMvJHtyZXBvcnR9ICR7cmVwb3J0fQotICAgICAgICBndW56aXAgJHtyZXBvcnR9Ci0gICAgZG9uZQotfQotCi1mdW5jdGlvbiBnZXRzZGNhcmRwYXRoKCkKLXsKLSAgICBhZGIgJHthZGJPcHRpb25zfSBzaGVsbCBlY2hvIC1uIFwkXHtFWFRFUk5BTF9TVE9SQUdFXH0KLX0KLQotZnVuY3Rpb24gZ2V0c2NyZWVuc2hvdHBhdGgoKQotewotICAgIGVjaG8gIiQoZ2V0c2RjYXJkcGF0aCkvUGljdHVyZXMvU2NyZWVuc2hvdHMiCi19Ci0KLWZ1bmN0aW9uIGdldGxhc3RzY3JlZW5zaG90KCkKLXsKLSAgICBsb2NhbCBzY3JlZW5zaG90X3BhdGg9JChnZXRzY3JlZW5zaG90cGF0aCkKLSAgICBsb2NhbCBzY3JlZW5zaG90PWBhZGIgJHthZGJPcHRpb25zfSBscyAke3NjcmVlbnNob3RfcGF0aH0gfCBncmVwIFNjcmVlbnNob3RfWzAtOS1dKi4qXC5wbmcgfCBzb3J0IC1yayAzIHwgY3V0IC1kICIgIiAtZiA0IHwgaGVhZCAtbiAxYAotICAgIGlmIFsgIiRzY3JlZW5zaG90IiA9ICIiIF07IHRoZW4KLSAgICAgICAgZWNobyAiTm8gc2NyZWVuc2hvdHMgZm91bmQuIgotICAgICAgICByZXR1cm4KLSAgICBmaQotICAgIGVjaG8gIiR7c2NyZWVuc2hvdH0iCi0gICAgYWRiICR7YWRiT3B0aW9uc30gcHVsbCAke3NjcmVlbnNob3RfcGF0aH0vJHtzY3JlZW5zaG90fQotfQotCi1mdW5jdGlvbiBzdGFydHZpZXdzZXJ2ZXIoKQotewotICAgIGxvY2FsIHBvcnQ9NDkzOQotICAgIGlmIFsgJCMgLWd0IDAgXTsgdGhlbgotICAgICAgICAgICAgcG9ydD0kMQotICAgIGZpCi0gICAgYWRiIHNoZWxsIHNlcnZpY2UgY2FsbCB3aW5kb3cgMSBpMzIgJHBvcnQKLX0KLQotZnVuY3Rpb24gc3RvcHZpZXdzZXJ2ZXIoKQotewotICAgIGFkYiBzaGVsbCBzZXJ2aWNlIGNhbGwgd2luZG93IDIKLX0KLQotZnVuY3Rpb24gaXN2aWV3c2VydmVyc3RhcnRlZCgpCi17Ci0gICAgYWRiIHNoZWxsIHNlcnZpY2UgY2FsbCB3aW5kb3cgMwotfQotCi1mdW5jdGlvbiBrZXlfaG9tZSgpCi17Ci0gICAgYWRiIHNoZWxsIGlucHV0IGtleWV2ZW50IDMKLX0KLQotZnVuY3Rpb24ga2V5X2JhY2soKQotewotICAgIGFkYiBzaGVsbCBpbnB1dCBrZXlldmVudCA0Ci19Ci0KLWZ1bmN0aW9uIGtleV9tZW51KCkKLXsKLSAgICBhZGIgc2hlbGwgaW5wdXQga2V5ZXZlbnQgODIKLX0KLQotZnVuY3Rpb24gc21va2V0ZXN0KCkKLXsKLSAgICBpZiBbICEgIiRBTkRST0lEX1BST0RVQ1RfT1VUIiBdOyB0aGVuCi0gICAgICAgIGVjaG8gIkNvdWxkbid0IGxvY2F0ZSBvdXRwdXQgZmlsZXMuICBUcnkgcnVubmluZyAnbHVuY2gnIGZpcnN0LiIgPiYyCi0gICAgICAgIHJldHVybgotICAgIGZpCi0gICAgbG9jYWwgVD0kKGdldHRvcCkKLSAgICBpZiBbICEgIiRUIiBdOyB0aGVuCi0gICAgICAgIGVjaG8gIkNvdWxkbid0IGxvY2F0ZSB0aGUgdG9wIG9mIHRoZSB0cmVlLiAgVHJ5IHNldHRpbmcgVE9QLiIgPiYyCi0gICAgICAgIHJldHVybgotICAgIGZpCi0KLSAgICAoXGNkICIkVCIgJiYgbW1tIHRlc3RzL1Ntb2tlVGVzdCkgJiYKLSAgICAgIGFkYiB1bmluc3RhbGwgY29tLmFuZHJvaWQuc21va2V0ZXN0ID4gL2Rldi9udWxsICYmCi0gICAgICBhZGIgdW5pbnN0YWxsIGNvbS5hbmRyb2lkLnNtb2tldGVzdC50ZXN0cyA+IC9kZXYvbnVsbCAmJgotICAgICAgYWRiIGluc3RhbGwgJEFORFJPSURfUFJPRFVDVF9PVVQvZGF0YS9hcHAvU21va2VUZXN0QXBwLmFwayAmJgotICAgICAgYWRiIGluc3RhbGwgJEFORFJPSURfUFJPRFVDVF9PVVQvZGF0YS9hcHAvU21va2VUZXN0LmFwayAmJgotICAgICAgYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgY29tLmFuZHJvaWQuc21va2V0ZXN0LnRlc3RzL2FuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyCi19Ci0KLSMgc2ltcGxlIHNob3J0Y3V0IHRvIHRoZSBydW50ZXN0IGNvbW1hbmQKLWZ1bmN0aW9uIHJ1bnRlc3QoKQotewotICAgIGxvY2FsIFQ9JChnZXR0b3ApCi0gICAgaWYgWyAhICIkVCIgXTsgdGhlbgotICAgICAgICBlY2hvICJDb3VsZG4ndCBsb2NhdGUgdGhlIHRvcCBvZiB0aGUgdHJlZS4gIFRyeSBzZXR0aW5nIFRPUC4iID4mMgotICAgICAgICByZXR1cm4KLSAgICBmaQotICAgICgiJFQiL2RldmVsb3BtZW50L3Rlc3RydW5uZXIvcnVudGVzdC5weSAkQCkKLX0KLQogZnVuY3Rpb24gZ29kaXIgKCkgewogICAgIGlmIFtbIC16ICIkMSIgXV07IHRoZW4KICAgICAgICAgZWNobyAiVXNhZ2U6IGdvZGlyIDxyZWdleD4iCkBAIC0xNjA2LDE0MSArOTc4LDEwIEBACiAgICAgXGNkICRULyRwYXRobmFtZQogfQogCi0jIFVwZGF0ZSBtb2R1bGUtaW5mby5qc29uIGluIG91dC4KLWZ1bmN0aW9uIHJlZnJlc2htb2QoKSB7Ci0gICAgaWYgWyAhICIkQU5EUk9JRF9QUk9EVUNUX09VVCIgXTsgdGhlbgotICAgICAgICBlY2hvICJObyBBTkRST0lEX1BST0RVQ1RfT1VULiBUcnkgcnVubmluZyAnbHVuY2gnIGZpcnN0LiIgPiYyCi0gICAgICAgIHJldHVybiAxCi0gICAgZmkKLQotICAgIGVjaG8gIlJlZnJlc2hpbmcgbW9kdWxlcyAoYnVpbGRpbmcgbW9kdWxlLWluZm8uanNvbikuIExvZyBhdCAkQU5EUk9JRF9QUk9EVUNUX09VVC9tb2R1bGUtaW5mby5qc29uLmJ1aWxkLmxvZy4iID4mMgotCi0gICAgIyBmb3IgdGhlIG91dHB1dCBvZiB0aGUgbmV4dCBjb21tYW5kCi0gICAgbWtkaXIgLXAgJEFORFJPSURfUFJPRFVDVF9PVVQgfHwgcmV0dXJuIDEKLQotICAgICMgTm90ZSwgY2FuJ3QgdXNlIGFic29sdXRlIHBhdGggYmVjYXVzZSBvZiB0aGUgd2F5IG1ha2Ugd29ya3MuCi0gICAgbSAkKGdldF9idWlsZF92YXIgUFJPRFVDVF9PVVQpL21vZHVsZS1pbmZvLmpzb24gXAotICAgICAgICA+ICRBTkRST0lEX1BST0RVQ1RfT1VUL21vZHVsZS1pbmZvLmpzb24uYnVpbGQubG9nIDI+JjEKLX0KLQotIyBWZXJpZmllcyB0aGF0IG1vZHVsZS1pbmZvLnR4dCBleGlzdHMsIHJldHVybmluZyBub256ZXJvIGlmIGl0IGRvZXNuJ3QuCi1mdW5jdGlvbiB2ZXJpZnltb2RpbmZvKCkgewotICAgIGlmIFsgISAiJEFORFJPSURfUFJPRFVDVF9PVVQiIF07IHRoZW4KLSAgICAgICAgaWYgWyAiJFFVSUVUX1ZFUklGWU1PRElORk8iICE9ICJ0cnVlIiBdIDsgdGhlbgotICAgICAgICAgICAgZWNobyAiTm8gQU5EUk9JRF9QUk9EVUNUX09VVC4gVHJ5IHJ1bm5pbmcgJ2x1bmNoJyBmaXJzdC4iID4mMgotICAgICAgICBmaQotICAgICAgICByZXR1cm4gMQotICAgIGZpCi0KLSAgICBpZiBbICEgLWYgIiRBTkRST0lEX1BST0RVQ1RfT1VUL21vZHVsZS1pbmZvLmpzb24iIF07IHRoZW4KLSAgICAgICAgaWYgWyAiJFFVSUVUX1ZFUklGWU1PRElORk8iICE9ICJ0cnVlIiBdIDsgdGhlbgotICAgICAgICAgICAgZWNobyAiQ291bGQgbm90IGZpbmQgbW9kdWxlLWluZm8uanNvbi4gUGxlYXNlIHJ1biAncmVmcmVzaG1vZCcgZmlyc3QuIiA+JjIKLSAgICAgICAgZmkKLSAgICAgICAgcmV0dXJuIDEKLSAgICBmaQotfQotCi0jIExpc3QgYWxsIG1vZHVsZXMgZm9yIHRoZSBjdXJyZW50IGRldmljZSwgYXMgY2FjaGVkIGluIGFsbF9tb2R1bGVzLnR4dC4gSWYgYW55IGJ1aWxkIGNoYW5nZSBpcwotIyBtYWRlIGFuZCBpdCBzaG91bGQgYmUgcmVmbGVjdGVkIGluIHRoZSBvdXRwdXQsIHlvdSBzaG91bGQgcnVuIGBtIG5vdGhpbmdgIGZpcnN0LgotZnVuY3Rpb24gYWxsbW9kKCkgewotICAgIGNhdCAkQU5EUk9JRF9QUk9EVUNUX09VVC9hbGxfbW9kdWxlcy50eHQgMj4vZGV2L251bGwKLX0KLQotIyBSZXR1cm4gdGhlIEJhemVsIGxhYmVsIG9mIGEgU29vbmcgbW9kdWxlIGlmIGl0IGlzIGNvbnZlcnRlZCB3aXRoIGJwMmJ1aWxkLgotZnVuY3Rpb24gYm1vZCgpCi0oCi0gICAgaWYgWyAkIyAtbmUgMSBdOyB0aGVuCi0gICAgICAgIGVjaG8gInVzYWdlOiBibW9kIDxtb2R1bGU+IiA+JjIKLSAgICAgICAgcmV0dXJuIDEKLSAgICBmaQotCi0gICAgIyBXZSBjb3VsZCBydW4gYnAyYnVpbGQgaGVyZSwgYnV0IGl0IG1pZ2h0IHRyaWdnZXIgYnAyYnVpbGQgaW52YWxpZGF0aW9uCi0gICAgIyB3aGVuIHVzZWQgd2l0aCBgYmAgKGUuZy4gLS1ydW5fc29vbmdfdGVzdHMpIGFuZC9vciBhZGQgdW5uZWNlc3Nhcnkgd2FpdGluZwotICAgICMgdGltZSBvdmVyaGVhZC4KLSAgICAjCi0gICAgIyBGb3IgYSBzbmFwcHkgcmVzdWx0LCB1c2UgdGhlIGxhdGVzdCBnZW5lcmF0ZWQgdmVyc2lvbiBpbiBzb29uZ19pbmplY3Rpb24sCi0gICAgIyBhbmQgYXNrIHVzZXJzIHRvIHJ1biBtIGJwMmJ1aWxkIGlmIGl0IGRvZXNuJ3QgZXhpc3QuCi0gICAgY29udmVydGVkX2pzb249IiQoZ2V0X2Fic19idWlsZF92YXIgT1VUX0RJUikvc29vbmcvc29vbmdfaW5qZWN0aW9uL21ldHJpY3MvY29udmVydGVkX21vZHVsZXNfcGF0aF9tYXAuanNvbiIKLQotICAgIGlmIFsgISAtZiAke2NvbnZlcnRlZF9qc29ufSBdOyB0aGVuCi0gICAgICBlY2hvICJicDJidWlsZCBmaWxlcyBub3QgZm91bmQuIEhhdmUgeW91IHJhbiAnbSBicDJidWlsZCc/IiA+JjIKLSAgICAgIHJldHVybiAxCi0gICAgZmkKLQotICAgIGxvY2FsIHRhcmdldF9sYWJlbD0kKHB5dGhvbjMgLWMgImltcG9ydCBqc29uCi1tb2R1bGUgPSAnJDEnCi1jb252ZXJ0ZWRfanNvbj0nJGNvbnZlcnRlZF9qc29uJwotYnAyYnVpbGRfY29udmVydGVkX21hcCA9IGpzb24ubG9hZChvcGVuKGNvbnZlcnRlZF9qc29uKSkKLWlmIG1vZHVsZSBub3QgaW4gYnAyYnVpbGRfY29udmVydGVkX21hcDoKLSAgICBleGl0KDEpCi1wcmludChicDJidWlsZF9jb252ZXJ0ZWRfbWFwW21vZHVsZV0gKyAnOicgKyBtb2R1bGUpIikKLQotICAgIGlmIFsgLXogIiR7dGFyZ2V0X2xhYmVsfSIgXTsgdGhlbgotICAgICAgZWNobyAiJDEgaXMgbm90IGNvbnZlcnRlZCB0byBCYXplbC4iID4mMgotICAgICAgcmV0dXJuIDEKLSAgICBlbHNlCi0gICAgICBlY2hvICIke3RhcmdldF9sYWJlbH0iCi0gICAgZmkKLSkKLQotIyBHZXQgdGhlIHBhdGggb2YgYSBzcGVjaWZpYyBtb2R1bGUgaW4gdGhlIGFuZHJvaWQgdHJlZSwgYXMgY2FjaGVkIGluIG1vZHVsZS1pbmZvLmpzb24uCi0jIElmIGFueSBidWlsZCBjaGFuZ2UgaXMgbWFkZSwgYW5kIGl0IHNob3VsZCBiZSByZWZsZWN0ZWQgaW4gdGhlIG91dHB1dCwgeW91IHNob3VsZCBydW4KLSMgJ3JlZnJlc2htb2QnIGZpcnN0LiAgTm90ZTogVGhpcyBpcyB0aGUgaW52ZXJzZSBvZiBkaXJtb2RzLgotZnVuY3Rpb24gcGF0aG1vZCgpIHsKLSAgICBpZiBbWyAkIyAtbmUgMSBdXTsgdGhlbgotICAgICAgICBlY2hvICJ1c2FnZTogcGF0aG1vZCA8bW9kdWxlPiIgPiYyCi0gICAgICAgIHJldHVybiAxCi0gICAgZmkKLQotICAgIHZlcmlmeW1vZGluZm8gfHwgcmV0dXJuIDEKLQotICAgIGxvY2FsIHJlbHBhdGg9JChweXRob24zIC1jICJpbXBvcnQganNvbiwgb3MKLW1vZHVsZSA9ICckMScKLW1vZHVsZV9pbmZvID0ganNvbi5sb2FkKG9wZW4oJyRBTkRST0lEX1BST0RVQ1RfT1VUL21vZHVsZS1pbmZvLmpzb24nKSkKLWlmIG1vZHVsZSBub3QgaW4gbW9kdWxlX2luZm86Ci0gICAgZXhpdCgxKQotcHJpbnQobW9kdWxlX2luZm9bbW9kdWxlXVsncGF0aCddWzBdKSIgMj4vZGV2L251bGwpCi0KLSAgICBpZiBbIC16ICIkcmVscGF0aCIgXTsgdGhlbgotICAgICAgICBlY2hvICJDb3VsZCBub3QgZmluZCBtb2R1bGUgJyQxJyAodHJ5ICdyZWZyZXNobW9kJyBpZiB0aGVyZSBoYXZlIGJlZW4gYnVpbGQgY2hhbmdlcz8pLiIgPiYyCi0gICAgICAgIHJldHVybiAxCi0gICAgZWxzZQotICAgICAgICBlY2hvICIkQU5EUk9JRF9CVUlMRF9UT1AvJHJlbHBhdGgiCi0gICAgZmkKLX0KLQotIyBHZXQgdGhlIHBhdGggb2YgYSBzcGVjaWZpYyBtb2R1bGUgaW4gdGhlIGFuZHJvaWQgdHJlZSwgYXMgY2FjaGVkIGluIG1vZHVsZS1pbmZvLmpzb24uCi0jIElmIGFueSBidWlsZCBjaGFuZ2UgaXMgbWFkZSwgYW5kIGl0IHNob3VsZCBiZSByZWZsZWN0ZWQgaW4gdGhlIG91dHB1dCwgeW91IHNob3VsZCBydW4KLSMgJ3JlZnJlc2htb2QnIGZpcnN0LiAgTm90ZTogVGhpcyBpcyB0aGUgaW52ZXJzZSBvZiBwYXRobW9kLgotZnVuY3Rpb24gZGlybW9kcygpIHsKLSAgICBpZiBbWyAkIyAtbmUgMSBdXTsgdGhlbgotICAgICAgICBlY2hvICJ1c2FnZTogZGlybW9kcyA8cGF0aD4iID4mMgotICAgICAgICByZXR1cm4gMQotICAgIGZpCi0KLSAgICB2ZXJpZnltb2RpbmZvIHx8IHJldHVybiAxCi0KLSAgICBweXRob24zIC1jICJpbXBvcnQganNvbiwgb3MKLWRpciA9ICckMScKLXdoaWxlIGRpci5lbmRzd2l0aCgnLycpOgotICAgIGRpciA9IGRpcls6LTFdCi1wcmVmaXggPSBkaXIgKyAnLycKLW1vZHVsZV9pbmZvID0ganNvbi5sb2FkKG9wZW4oJyRBTkRST0lEX1BST0RVQ1RfT1VUL21vZHVsZS1pbmZvLmpzb24nKSkKLXJlc3VsdHMgPSBzZXQoKQotZm9yIG0gaW4gbW9kdWxlX2luZm8udmFsdWVzKCk6Ci0gICAgZm9yIHBhdGggaW4gbS5nZXQodSdwYXRoJywgW10pOgotICAgICAgICBpZiBwYXRoID09IGRpciBvciBwYXRoLnN0YXJ0c3dpdGgocHJlZml4KToKLSAgICAgICAgICAgIG5hbWUgPSBtLmdldCh1J21vZHVsZV9uYW1lJykKLSAgICAgICAgICAgIGlmIG5hbWU6Ci0gICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQobmFtZSkKLWZvciBuYW1lIGluIHNvcnRlZChyZXN1bHRzKToKLSAgICBwcmludChuYW1lKQotIgotfQotCi0KICMgR28gdG8gYSBzcGVjaWZpYyBtb2R1bGUgaW4gdGhlIGFuZHJvaWQgdHJlZSwgYXMgY2FjaGVkIGluIG1vZHVsZS1pbmZvLmpzb24uIElmIGFueSBidWlsZCBjaGFuZ2UKICMgaXMgbWFkZSwgYW5kIGl0IHNob3VsZCBiZSByZWZsZWN0ZWQgaW4gdGhlIG91dHB1dCwgeW91IHNob3VsZCBydW4gJ3JlZnJlc2htb2QnIGZpcnN0LgorIyBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIGluIGVudnNldHVwIGJlY2F1c2UgY2hhbmdpbmcgdGhlIGRpcmVjdG9yeSBuZWVkcyB0byBoYXBwZW4gaW4gdGhlIGN1cnJlbnQKKyMgc2hlbGwuIEFsbCBvdGhlciBmdW5jdGlvbnMgdGhhdCB1c2UgbW9kdWxlLWluZm8uanNvbiBzaG91bGQgYmUgaW4gYnVpbGQvc29vbmcvYmluLgogZnVuY3Rpb24gZ29tb2QoKSB7CiAgICAgaWYgW1sgJCMgLW5lIDEgXV07IHRoZW4KICAgICAgICAgZWNobyAidXNhZ2U6IGdvbW9kIDxtb2R1bGU+IiA+JjIKQEAgLTE3NTQsOTAgKzk5NSwxMSBAQAogICAgIGNkICRwYXRoCiB9CiAKLSMgR2V0cyB0aGUgbGlzdCBvZiBhIG1vZHVsZSdzIGluc3RhbGxlZCBvdXRwdXRzLCBhcyBjYWNoZWQgaW4gbW9kdWxlLWluZm8uanNvbi4KLSMgSWYgYW55IGJ1aWxkIGNoYW5nZSBpcyBtYWRlLCBhbmQgaXQgc2hvdWxkIGJlIHJlZmxlY3RlZCBpbiB0aGUgb3V0cHV0LCB5b3Ugc2hvdWxkIHJ1biAncmVmcmVzaG1vZCcgZmlyc3QuCi1mdW5jdGlvbiBvdXRtb2QoKSB7Ci0gICAgaWYgW1sgJCMgLW5lIDEgXV07IHRoZW4KLSAgICAgICAgZWNobyAidXNhZ2U6IG91dG1vZCA8bW9kdWxlPiIgPiYyCi0gICAgICAgIHJldHVybiAxCi0gICAgZmkKLQotICAgIHZlcmlmeW1vZGluZm8gfHwgcmV0dXJuIDEKLQotICAgIGxvY2FsIHJlbHBhdGgKLSAgICByZWxwYXRoPSQocHl0aG9uMyAtYyAiaW1wb3J0IGpzb24sIG9zCi1tb2R1bGUgPSAnJDEnCi1tb2R1bGVfaW5mbyA9IGpzb24ubG9hZChvcGVuKCckQU5EUk9JRF9QUk9EVUNUX09VVC9tb2R1bGUtaW5mby5qc29uJykpCi1pZiBtb2R1bGUgbm90IGluIG1vZHVsZV9pbmZvOgotICAgIGV4aXQoMSkKLWZvciBvdXRwdXQgaW4gbW9kdWxlX2luZm9bbW9kdWxlXVsnaW5zdGFsbGVkJ106Ci0gICAgcHJpbnQob3MucGF0aC5qb2luKCckQU5EUk9JRF9CVUlMRF9UT1AnLCBvdXRwdXQpKSIgMj4vZGV2L251bGwpCi0KLSAgICBpZiBbICQ/IC1uZSAwIF07IHRoZW4KLSAgICAgICAgZWNobyAiQ291bGQgbm90IGZpbmQgbW9kdWxlICckMScgKHRyeSAncmVmcmVzaG1vZCcgaWYgdGhlcmUgaGF2ZSBiZWVuIGJ1aWxkIGNoYW5nZXM/KSIgPiYyCi0gICAgICAgIHJldHVybiAxCi0gICAgZWxpZiBbICEgLXogIiRyZWxwYXRoIiBdOyB0aGVuCi0gICAgICAgIGVjaG8gIiRyZWxwYXRoIgotICAgIGZpCi19Ci0KLSMgYWRiIGluc3RhbGwgYSBtb2R1bGUncyBhcGssIGFzIGNhY2hlZCBpbiBtb2R1bGUtaW5mby5qc29uLiBJZiBhbnkgYnVpbGQgY2hhbmdlCi0jIGlzIG1hZGUsIGFuZCBpdCBzaG91bGQgYmUgcmVmbGVjdGVkIGluIHRoZSBvdXRwdXQsIHlvdSBzaG91bGQgcnVuICdyZWZyZXNobW9kJyBmaXJzdC4KLSMgVXNhZ2U6IGluc3RhbGxtb2QgW2FkYiBpbnN0YWxsIGFyZ3VtZW50c10gPG1vZHVsZT4KLSMgRm9yIGV4YW1wbGU6IGluc3RhbGxtb2QgLXIgRGlhbGVyIC0+IGFkYiBpbnN0YWxsIC1yIC9wYXRoL3RvL0RpYWxlci5hcGsKLWZ1bmN0aW9uIGluc3RhbGxtb2QoKSB7Ci0gICAgaWYgW1sgJCMgLWVxIDAgXV07IHRoZW4KLSAgICAgICAgZWNobyAidXNhZ2U6IGluc3RhbGxtb2QgW2FkYiBpbnN0YWxsIGFyZ3VtZW50c10gPG1vZHVsZT4iID4mMgotICAgICAgICBlY2hvICIiID4mMgotICAgICAgICBlY2hvICJPbmx5IGZsYWdzIHRvIGJlIHBhc3NlZCBhZnRlciB0aGUgXCJpbnN0YWxsXCIgaW4gYWRiIGluc3RhbGwgYXJlIHN1cHBvcnRlZCwiID4mMgotICAgICAgICBlY2hvICJ3aXRoIHRoZSBleGNlcHRpb24gb2YgLXMuIElmIC1zIGlzIHBhc3NlZCBpdCB3aWxsIGJlIHBsYWNlZCBiZWZvcmUgdGhlIFwiaW5zdGFsbFwiLiIgPiYyCi0gICAgICAgIGVjaG8gIi1zIG11c3QgYmUgdGhlIGZpcnN0IGZsYWcgcGFzc2VkIGlmIGl0IGV4aXN0cy4iID4mMgotICAgICAgICByZXR1cm4gMQotICAgIGZpCi0KLSAgICBsb2NhbCBfcGF0aAotICAgIF9wYXRoPSQob3V0bW9kICR7QDokIzoxfSkKLSAgICBpZiBbICQ/IC1uZSAwIF07IHRoZW4KLSAgICAgICAgcmV0dXJuIDEKLSAgICBmaQotCi0gICAgX3BhdGg9JChlY2hvICIkX3BhdGgiIHwgZ3JlcCAtRSBcXC5hcGskIHwgaGVhZCAtbiAxKQotICAgIGlmIFsgLXogIiRfcGF0aCIgXTsgdGhlbgotICAgICAgICBlY2hvICJNb2R1bGUgJyQxJyBkb2VzIG5vdCBwcm9kdWNlIGEgZmlsZSBlbmRpbmcgd2l0aCAuYXBrICh0cnkgJ3JlZnJlc2htb2QnIGlmIHRoZXJlIGhhdmUgYmVlbiBidWlsZCBjaGFuZ2VzPykiID4mMgotICAgICAgICByZXR1cm4gMQotICAgIGZpCi0gICAgbG9jYWwgc2VyaWFsX2RldmljZT0iIgotICAgIGlmIFtbICIkMSIgPT0gIi1zIiBdXTsgdGhlbgotICAgICAgICBpZiBbWyAkIyAtbGUgMiBdXTsgdGhlbgotICAgICAgICAgICAgZWNobyAiLXMgcmVxdWlyZXMgYW4gYXJndW1lbnQiID4mMgotICAgICAgICAgICAgcmV0dXJuIDEKLSAgICAgICAgZmkKLSAgICAgICAgc2VyaWFsX2RldmljZT0iLXMgJDIiCi0gICAgICAgIHNoaWZ0IDIKLSAgICBmaQotICAgIGxvY2FsIGxlbmd0aD0kKCggJCMgLSAxICkpCi0gICAgZWNobyBhZGIgJHNlcmlhbF9kZXZpY2UgaW5zdGFsbCAke0A6MTokbGVuZ3RofSAkX3BhdGgKLSAgICBhZGIgJHNlcmlhbF9kZXZpY2UgaW5zdGFsbCAke0A6MTokbGVuZ3RofSAkX3BhdGgKLX0KLQogZnVuY3Rpb24gX2NvbXBsZXRlX2FuZHJvaWRfbW9kdWxlX25hbWVzKCkgewogICAgIGxvY2FsIHdvcmQ9JHtDT01QX1dPUkRTW0NPTVBfQ1dPUkRdfQogICAgIENPTVBSRVBMWT0oICQoYWxsbW9kIHwgZ3JlcCAtRSAiXiR3b3JkIikgKQogfQogCi0jIFByaW50IGNvbG9yZWQgZXhpdCBjb25kaXRpb24KLWZ1bmN0aW9uIHBleiB7Ci0gICAgIiRAIgotICAgIGxvY2FsIHJldHZhbD0kPwotICAgIGlmIFsgJHJldHZhbCAtbmUgMCBdCi0gICAgdGhlbgotICAgICAgICBlY2hvICQnXEUnIlswOzMxbUZBSUxVUkVcZVswMG0iCi0gICAgZWxzZQotICAgICAgICBlY2hvICQnXEUnIlswOzMybVNVQ0NFU1NcZVswMG0iCi0gICAgZmkKLSAgICByZXR1cm4gJHJldHZhbAotfQotCiBmdW5jdGlvbiBnZXRfbWFrZV9jb21tYW5kKCkKIHsKICAgICAjIElmIHdlJ3JlIGluIHRoZSB0b3Agb2YgYW4gQW5kcm9pZCB0cmVlLCB1c2Ugc29vbmdfdWkuYmFzaCBpbnN0ZWFkIG9mIG1ha2UKQEAgLTE4NTUsMTM3ICsxMDE3LDExIEBACiAgICAgZmkKIH0KIAotZnVuY3Rpb24gX3dyYXBfYnVpbGQoKQotewotICAgIGlmIFtbICIke0FORFJPSURfUVVJRVRfQlVJTEQ6LX0iID09IHRydWUgXV07IHRoZW4KLSAgICAgICIkQCIKLSAgICAgIHJldHVybiAkPwotICAgIGZpCi0gICAgbG9jYWwgc3RhcnRfdGltZT0kKGRhdGUgKyIlcyIpCi0gICAgIiRAIgotICAgIGxvY2FsIHJldD0kPwotICAgIGxvY2FsIGVuZF90aW1lPSQoZGF0ZSArIiVzIikKLSAgICBsb2NhbCB0ZGlmZj0kKCgkZW5kX3RpbWUtJHN0YXJ0X3RpbWUpKQotICAgIGxvY2FsIGhvdXJzPSQoKCR0ZGlmZiAvIDM2MDAgKSkKLSAgICBsb2NhbCBtaW5zPSQoKCgkdGRpZmYgJSAzNjAwKSAvIDYwKSkKLSAgICBsb2NhbCBzZWNzPSQoKCR0ZGlmZiAlIDYwKSkKLSAgICBsb2NhbCBuY29sb3JzPSQodHB1dCBjb2xvcnMgMj4vZGV2L251bGwpCi0gICAgaWYgWyAtbiAiJG5jb2xvcnMiIF0gJiYgWyAkbmNvbG9ycyAtZ2UgOCBdOyB0aGVuCi0gICAgICAgIGNvbG9yX2ZhaWxlZD0kJ1xFJyJbMDszMW0iCi0gICAgICAgIGNvbG9yX3N1Y2Nlc3M9JCdcRSciWzA7MzJtIgotICAgICAgICBjb2xvcl93YXJuaW5nPSQnXEUnIlswOzMzbSIKLSAgICAgICAgY29sb3JfcmVzZXQ9JCdcRSciWzAwbSIKLSAgICBlbHNlCi0gICAgICAgIGNvbG9yX2ZhaWxlZD0iIgotICAgICAgICBjb2xvcl9zdWNjZXNzPSIiCi0gICAgICAgIGNvbG9yX3Jlc2V0PSIiCi0gICAgZmkKLQotICAgIGVjaG8KLSAgICBpZiBbICRyZXQgLWVxIDAgXSA7IHRoZW4KLSAgICAgICAgZWNobyAtbiAiJHtjb2xvcl9zdWNjZXNzfSMjIyMgYnVpbGQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAiCi0gICAgZWxzZQotICAgICAgICBlY2hvIC1uICIke2NvbG9yX2ZhaWxlZH0jIyMjIGZhaWxlZCB0byBidWlsZCBzb21lIHRhcmdldHMgIgotICAgIGZpCi0gICAgaWYgWyAkaG91cnMgLWd0IDAgXSA7IHRoZW4KLSAgICAgICAgcHJpbnRmICIoJTAyZzolMDJnOiUwMmcgKGhoOm1tOnNzKSkiICRob3VycyAkbWlucyAkc2VjcwotICAgIGVsaWYgWyAkbWlucyAtZ3QgMCBdIDsgdGhlbgotICAgICAgICBwcmludGYgIiglMDJnOiUwMmcgKG1tOnNzKSkiICRtaW5zICRzZWNzCi0gICAgZWxpZiBbICRzZWNzIC1ndCAwIF0gOyB0aGVuCi0gICAgICAgIHByaW50ZiAiKCVzIHNlY29uZHMpIiAkc2VjcwotICAgIGZpCi0gICAgZWNobyAiICMjIyMke2NvbG9yX3Jlc2V0fSIKLSAgICBlY2hvCi0gICAgcmV0dXJuICRyZXQKLX0KLQotZnVuY3Rpb24gX3RyaWdnZXJfYnVpbGQoKQotKAotICAgIGxvY2FsIC1yIGJjPSIkMSI7IHNoaWZ0Ci0gICAgbG9jYWwgVD0kKGdldHRvcCkKLSAgICBpZiBbIC1uICIkVCIgXTsgdGhlbgotICAgICAgX3dyYXBfYnVpbGQgIiRUL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2giIC0tYnVpbGQtbW9kZSAtLSR7YmN9IC0tZGlyPSIkKHB3ZCkiICIkQCIKLSAgICBlbHNlCi0gICAgICA+JjIgZWNobyAiQ291bGRuJ3QgbG9jYXRlIHRoZSB0b3Agb2YgdGhlIHRyZWUuIFRyeSBzZXR0aW5nIFRPUC4iCi0gICAgICByZXR1cm4gMQotICAgIGZpCi0pCi0KLWZ1bmN0aW9uIG0oKQotKAotICAgIF90cmlnZ2VyX2J1aWxkICJhbGwtbW9kdWxlcyIgIiRAIgotKQotCi1mdW5jdGlvbiBtbSgpCi0oCi0gICAgX3RyaWdnZXJfYnVpbGQgIm1vZHVsZXMtaW4tYS1kaXItbm8tZGVwcyIgIiRAIgotKQotCi1mdW5jdGlvbiBtbW0oKQotKAotICAgIF90cmlnZ2VyX2J1aWxkICJtb2R1bGVzLWluLWRpcnMtbm8tZGVwcyIgIiRAIgotKQotCi1mdW5jdGlvbiBtbWEoKQotKAotICAgIF90cmlnZ2VyX2J1aWxkICJtb2R1bGVzLWluLWEtZGlyIiAiJEAiCi0pCi0KLWZ1bmN0aW9uIG1tbWEoKQotKAotICAgIF90cmlnZ2VyX2J1aWxkICJtb2R1bGVzLWluLWRpcnMiICIkQCIKLSkKLQogZnVuY3Rpb24gbWFrZSgpCiB7CiAgICAgX3dyYXBfYnVpbGQgJChnZXRfbWFrZV9jb21tYW5kICIkQCIpICIkQCIKIH0KIAotZnVuY3Rpb24gX211bHRpdHJlZV9sdW5jaF9lcnJvcigpCi17Ci0gICAgICA+JjIgZWNobyAiQ291bGRuJ3QgbG9jYXRlIHRoZSB0b3Agb2YgdGhlIHRyZWUuIFBsZWFzZSBydW4gXCdzb3VyY2UgYnVpbGQvZW52c2V0dXAuc2hcJyBhbmQgbXVsdGl0cmVlX2x1bmNoIGZyb20gdGhlIHJvb3Qgb2YgeW91ciB3b3Jrc3BhY2UuIgotfQotCi1mdW5jdGlvbiBtdWx0aXRyZWVfYnVpbGQoKQotewotICAgIGxvY2FsIFQ9JChtdWx0aXRyZWVfZ2V0dG9wKQotICAgIGlmIFsgLW4gIiRUIiBdOyB0aGVuCi0gICAgICAiJFQvb3JjaGVzdHJhdG9yL2J1aWxkL29yY2hlc3RyYXRvci9jb3JlL29yY2hlc3RyYXRvci5weSIgIiRAIgotICAgIGVsc2UKLSAgICAgIF9tdWx0aXRyZWVfbHVuY2hfZXJyb3IKLSAgICAgIHJldHVybiAxCi0gICAgZmkKLX0KLQotZnVuY3Rpb24gcHJvdmlzaW9uKCkKLXsKLSAgICBpZiBbICEgIiRBTkRST0lEX1BST0RVQ1RfT1VUIiBdOyB0aGVuCi0gICAgICAgIGVjaG8gIkNvdWxkbid0IGxvY2F0ZSBvdXRwdXQgZmlsZXMuICBUcnkgcnVubmluZyAnbHVuY2gnIGZpcnN0LiIgPiYyCi0gICAgICAgIHJldHVybiAxCi0gICAgZmkKLSAgICBpZiBbICEgLWUgIiRBTkRST0lEX1BST0RVQ1RfT1VUL3Byb3Zpc2lvbi1kZXZpY2UiIF07IHRoZW4KLSAgICAgICAgZWNobyAiVGhlcmUgaXMgbm8gcHJvdmlzaW9uaW5nIHNjcmlwdCBmb3IgdGhlIGRldmljZS4iID4mMgotICAgICAgICByZXR1cm4gMQotICAgIGZpCi0KLSAgICAjIENoZWNrIGlmIHVzZXIgcmVhbGx5IHdhbnRzIHRvIGRvIHRoaXMuCi0gICAgaWYgWyAiJDEiID0gIi0tbm8tY29uZmlybWF0aW9uIiBdOyB0aGVuCi0gICAgICAgIHNoaWZ0IDEKLSAgICBlbHNlCi0gICAgICAgIGVjaG8gIlRoaXMgYWN0aW9uIHdpbGwgcmVmbGFzaCB5b3VyIGRldmljZS4iCi0gICAgICAgIGVjaG8gIiIKLSAgICAgICAgZWNobyAiQUxMIERBVEEgT04gVEhFIERFVklDRSBXSUxMIEJFIElSUkVWT0NBQkxZIEVSQVNFRC4iCi0gICAgICAgIGVjaG8gIiIKLSAgICAgICAgZWNobyAtbiAiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRvIHRoaXMgKHllcy9ubyk/ICIKLSAgICAgICAgcmVhZAotICAgICAgICBpZiBbWyAiJHtSRVBMWX0iICE9ICJ5ZXMiIF1dIDsgdGhlbgotICAgICAgICAgICAgZWNobyAiTm90IHRha2luZyBhbnkgYWN0aW9uLiBFeGl0aW5nLiIgPiYyCi0gICAgICAgICAgICByZXR1cm4gMQotICAgICAgICBmaQotICAgIGZpCi0gICAgIiRBTkRST0lEX1BST0RVQ1RfT1VUL3Byb3Zpc2lvbi1kZXZpY2UiICIkQCIKLX0KLQogIyBac2ggbmVlZHMgYmFzaGNvbXBpbml0IGNhbGxlZCB0byBzdXBwb3J0IGJhc2gtc3R5bGUgY29tcGxldGlvbi4KIGZ1bmN0aW9uIGVuYWJsZV96c2hfY29tcGxldGlvbigpIHsKICAgICAjIERvbid0IG92ZXJyaWRlIHVzZXIncyBvcHRpb25zIGlmIGJhc2gtc3R5bGUgY29tcGxldGlvbiBpcyBhbHJlYWR5IGVuYWJsZWQuCkBAIC0yMDQyLDYgKzEwNzgsOCBAQAogICAgICAgICAgICAgZmkKICAgICAgICAgZG9uZQogICAgIGRvbmUKKworICAgIHNldHVwX2NvZ19lbnZfaWZfbmVlZGVkCiB9CiAKIGZ1bmN0aW9uIHNob3djb21tYW5kcygpIHsKQEAgLTIwNjIsNyArMTEwMCw3IEBACiAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgIDs7CiAgICAgZXNhYwotICAgIE9VVF9ESVI9IiQoZ2V0X2Fic19idWlsZF92YXIgT1VUX0RJUikiCisgICAgT1VUX0RJUj0iJChfZ2V0X2Fic19idWlsZF92YXJfY2FjaGVkIE9VVF9ESVIpIgogICAgIGlmIFtbICIkMSIgPT0gIi0tcmVnZW5lcmF0ZSIgXV07IHRoZW4KICAgICAgIHNoaWZ0IDEKICAgICAgIE5JTkpBX0FSR1M9Ii10IGNvbW1hbmRzICRAIiBtCkBAIC0yMDczLDE1ICsxMTExLDY4IEBACiAgICAgZmkKIH0KIAotZnVuY3Rpb24gYXZidG9vbCgpIHsKLSAgICBpZiBbWyAhIC1mICIkQU5EUk9JRF9TT09OR19IT1NUX09VVCIvYmluL2F2YnRvb2wgXV07IHRoZW4KLSAgICAgICAgbSBhdmJ0b29sCi0gICAgZmkKLSAgICAiJEFORFJPSURfU09PTkdfSE9TVF9PVVQiL2Jpbi9hdmJ0b29sICRACi19CisjIFRoZXNlIGZ1bmN0aW9ucyB1c2VkIHRvIGJlIGhlcmUgYnV0IGFyZSBub3cgc3RhbmRhbG9uZSBzY3JpcHRzCisjIGluIGJ1aWxkL3Nvb25nL2Jpbi4gIFVuc2V0IHRoZXNlIGZvciB0aGUgdGltZSBiZWluZyBzbyB0aGUgcmVhbAorIyBzY3JpcHQgaXMgcGlja2VkIHVwLgorIyBUT0RPOiBSZW1vdmUgdGhpcyBzb21lIHRpbWUgYWZ0ZXIgYSBzdWl0YWJsZSBkZWxheSAobWF5YmUgMjAyNT8pCit1bnNldCBhbGxtb2QKK3Vuc2V0IGFuaW5qYQordW5zZXQgY2dyZXAKK3Vuc2V0IGNvcmUKK3Vuc2V0IGNvcmVkdW1wX2VuYWJsZQordW5zZXQgY29yZWR1bXBfc2V0dXAKK3Vuc2V0IGRpcm1vZHMKK3Vuc2V0IGdldF9idWlsZF92YXIKK3Vuc2V0IGdldF9hYnNfYnVpbGRfdmFyCit1bnNldCBnZXRsYXN0c2NyZWVuc2hvdAordW5zZXQgZ2V0cHJlYnVpbHQKK3Vuc2V0IGdldHNjcmVlbnNob3RwYXRoCit1bnNldCBnZXRzZGNhcmRwYXRoCit1bnNldCBnZXR0YXJnZXRhcmNoCit1bnNldCBnZ3JlcAordW5zZXQgZ29ncmVwCit1bnNldCBobW0KK3Vuc2V0IGluc3RhbGxtb2QKK3Vuc2V0IGlzNjRiaXQKK3Vuc2V0IGlzdmlld3NlcnZlcnN0YXJ0ZWQKK3Vuc2V0IGpncmVwCit1bnNldCBqc29uZ3JlcAordW5zZXQga2V5X2JhY2sKK3Vuc2V0IGtleV9ob21lCit1bnNldCBrZXlfbWVudQordW5zZXQga3RncmVwCit1bnNldCBtCit1bnNldCBtYW5ncmVwCit1bnNldCBtZ3JlcAordW5zZXQgbW0KK3Vuc2V0IG1tYQordW5zZXQgbW1tCit1bnNldCBtbW1hCit1bnNldCBvdXRtb2QKK3Vuc2V0IG92ZXJyaWRlZmxhZ3MKK3Vuc2V0IG93bmdyZXAKK3Vuc2V0IHBhdGhtb2QKK3Vuc2V0IHBlegordW5zZXQgcHlncmVwCit1bnNldCBxcGlkCit1bnNldCByY2dyZXAKK3Vuc2V0IHJlZnJlc2htb2QKK3Vuc2V0IHJlc2dyZXAKK3Vuc2V0IHJzZ3JlcAordW5zZXQgcnVuX3Rvb2xfd2l0aF9sb2dnaW5nCit1bnNldCBzZXBncmVwCit1bnNldCBzZ3JlcAordW5zZXQgc3RhcnR2aWV3c2VydmVyCit1bnNldCBzdG9wdmlld3NlcnZlcgordW5zZXQgc3lzdGVtc3RhY2sKK3Vuc2V0IHN5c3dyaXRlCit1bnNldCB0b21sZ3JlcAordW5zZXQgdHJlZWdyZXAKKwogCiB2YWxpZGF0ZV9jdXJyZW50X3NoZWxsCiBzZXRfZ2xvYmFsX3BhdGhzCiBzb3VyY2VfdmVuZG9yc2V0dXAKIGFkZGNvbXBsZXRpb25zCiAKKwpkaWZmIC0tZ2l0IGEvcGFja2FnaW5nL2Rpc3RkaXIubWsgYi9wYWNrYWdpbmcvZGlzdGRpci5tawppbmRleCAyNjRhOGIwLi4xNTNlY2Y2IDEwMDY0NAotLS0gYS9wYWNrYWdpbmcvZGlzdGRpci5taworKysgYi9wYWNrYWdpbmcvZGlzdGRpci5tawpAQCAtMTgsMTYgKzE4LDE5IEBACiBESVNUX0dPQUxfT1VUUFVUX1BBSVJTIDo9CiBESVNUX1NSQ19EU1RfUEFJUlMgOj0KIGluY2x1ZGUgJChLQVRJX1BBQ0tBR0VfTUtfRElSKS9kaXN0Lm1rCitGSUxFX05BTUVfVEFHIDo9ICQoZmlsZSA8JChPVVRfRElSKS9maWxlX25hbWVfdGFnLnR4dCkKKy5LQVRJX1JFQURPTkxZIDo9IEZJTEVfTkFNRV9UQUcKIAogJChmb3JlYWNoIHBhaXIsJChESVNUX0dPQUxfT1VUUFVUX1BBSVJTKSwgXAogICAkKGV2YWwgZ29hbCA6PSAkKGNhbGwgd29yZC1jb2xvbiwxLCQocGFpcikpKSBcCi0gICQoZXZhbCBvdXRwdXQgOj0gJChjYWxsIHdvcmQtY29sb24sMiwkKHBhaXIpKSkgXAorICAkKGV2YWwgb3V0cHV0IDo9ICQoc3Vic3QgRklMRV9OQU1FX1RBR19QTEFDRUhPTERFUiwkKEZJTEVfTkFNRV9UQUcpLCQoY2FsbCB3b3JkLWNvbG9uLDIsJChwYWlyKSkpKSBcCiAgICQoZXZhbCAuUEhPTlk6IF9kaXN0XyQkKGdvYWwpKSBcCiAgICQoaWYgJChjYWxsIHN0cmVxLCQoRElTVCksdHJ1ZSksXAogICAgICQoZXZhbCBfZGlzdF8kJChnb2FsKTogJCQoRElTVF9ESVIpLyQkKG91dHB1dCkpLCBcCiAgICAgJChldmFsIF9kaXN0XyQkKGdvYWwpOikpKQogCiBkZWZpbmUgY29weS1vbmUtZGlzdC1maWxlCiskKDIpOiAuS0FUSV9UQUdTICs9IDtydWxlX25hbWU9ZGlzdC1jcAogJCgyKTogJCgxKQogCUBlY2hvICJEaXN0OiAkJEAiCiAJcm0gLWYgJCRACkBAIC0zNyw3ICs0MCw3IEBACiBpZmVxICgkKERJU1QpLHRydWUpCiAgICQoZm9yZWFjaCBwYWlyLCQoRElTVF9TUkNfRFNUX1BBSVJTKSwgXAogICAgICQoZXZhbCBzcmMgOj0gJChjYWxsIHdvcmQtY29sb24sMSwkKHBhaXIpKSkgXAotICAgICQoZXZhbCBkc3QgOj0gJChESVNUX0RJUikvJChjYWxsIHdvcmQtY29sb24sMiwkKHBhaXIpKSkgXAorICAgICQoZXZhbCBkc3QgOj0gJChzdWJzdCBGSUxFX05BTUVfVEFHX1BMQUNFSE9MREVSLCQoRklMRV9OQU1FX1RBRyksJChESVNUX0RJUikvJChjYWxsIHdvcmQtY29sb24sMiwkKHBhaXIpKSkpIFwKICAgICAkKGV2YWwgJChjYWxsIGNvcHktb25lLWRpc3QtZmlsZSwkKHNyYyksJChkc3QpKSkpCiBlbmRpZgogCmRpZmYgLS1naXQgYS9yYmVzZXR1cC5zaCBiL3JiZXNldHVwLnNoCmluZGV4IDgzODY2MjguLjBkYTdhNTcgMTAwNjQ0Ci0tLSBhL3JiZXNldHVwLnNoCisrKyBiL3JiZXNldHVwLnNoCkBAIC0zNCw3ICszNCw3IEBACiAjIGZvciB0aGUgYnVpbGQgdG8gYmUgZXhlY3V0ZWQgd2l0aCBSQkUuCiBmdW5jdGlvbiB1c2VfcmJlKCkgewogICBsb2NhbCBSQkVfQklOQVJJRVNfRElSPSJwcmVidWlsdHMvcmVtb3RlZXhlY3V0aW9uLWNsaWVudC9sYXRlc3QiCi0gIGxvY2FsIERPQ0tFUl9JTUFHRT0iZ2NyLmlvL2FuZHJvaWRidWlsZC1yZS1kb2NrZXJpbWFnZS9hbmRyb2lkLWJ1aWxkLXJlbW90ZWV4ZWMtaW1hZ2VAc2hhMjU2OjU4MmVmYjM4ZjBjMjI5ZWEzOTk1MmZmZjllMTMyY2NiZTE4M2UxNDg2OWIzOTg4ODAxMGRhY2Y1NmIzNjBkNjIiCisgIGxvY2FsIERPQ0tFUl9JTUFHRT0iZ2NyLmlvL2FuZHJvaWRidWlsZC1yZS1kb2NrZXJpbWFnZS9hbmRyb2lkLWJ1aWxkLXJlbW90ZWV4ZWMtaW1hZ2VAc2hhMjU2OjFlYjdmNjRiOWUxNzEwMmI5NzBiZDdhMWFmN2RhYWViZGIwMWMzZmI3Nzc3MTU4OTllZjQ2MmQ2YzZkMDFhNDUiCiAKICAgIyBEbyBub3Qgc2V0IGFuIGludm9jYXRpb24tSUQgYW5kIGxldCByZXByb3h5IGF1dG8tZ2VuZXJhdGUgb25lLgogICBVU0VfUkJFPSJ0cnVlIiBcCmRpZmYgLS1naXQgYS9zaGVsbF91dGlscy5zaCBiL3NoZWxsX3V0aWxzLnNoCmluZGV4IDlkZTVhNTAuLjMxMjRkYjUgMTAwNjQ0Ci0tLSBhL3NoZWxsX3V0aWxzLnNoCisrKyBiL3NoZWxsX3V0aWxzLnNoCkBAIC00MCwyMCArNDAsOTMgQEAKICAgICBmaQogfQogCi0jIFNldHMgVE9QLCBvciBpZiB0aGUgcm9vdCBvZiB0aGUgdHJlZSBjYW4ndCBiZSBmb3VuZCwgcHJpbnRzIGEgbWVzc2FnZSBhbmQKLSMgZXhpdHMuICBTaW5jZSB0aGlzIGZ1bmN0aW9uIGV4aXRzLCBpdCBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIGZ1bmN0aW9ucwotIyBkZWZpbmVkIGluIGVudnNldHVwLnNoLgorIyBBc3NlcnRzIHRoYXQgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgY2FuIGJlIGZvdW5kLgogaWYgWyAteiAiJHtJTVBPUlRJTkdfRU5WU0VUVVA6LX0iIF0gOyB0aGVuCiBmdW5jdGlvbiByZXF1aXJlX3RvcAogewogICAgIFRPUD0kKGdldHRvcCkKICAgICBpZiBbWyAhICRUT1AgXV0gOyB0aGVuCi0gICAgICAgIGVjaG8gIkNhbiBub3QgbG9jYXRlIHJvb3Qgb2Ygc291cmNlIHRyZWUuICQoYmFzZW5hbWUgJDApIG11c3QgYmUgcnVuIGZyb20gd2l0aGluIHRoZSBBbmRyb2lkIHNvdXJjZSB0cmVlLiIgPiYyCisgICAgICAgIGVjaG8gIkNhbiBub3QgbG9jYXRlIHJvb3Qgb2Ygc291cmNlIHRyZWUuICQoYmFzZW5hbWUgJDApIG11c3QgYmUgcnVuIGZyb20gd2l0aGluIHRoZSBBbmRyb2lkIHNvdXJjZSB0cmVlIG9yIFRPUCBtdXN0IGJlIHNldC4iID4mMgogICAgICAgICBleGl0IDEKICAgICBmaQogfQogZmkKIAorIyBBc3NlcnRzIHRoYXQgdGhlIGx1bmNoIHZhcmlhYmxlcyBoYXZlIGJlZW4gc2V0CitpZiBbIC16ICIke0lNUE9SVElOR19FTlZTRVRVUDotfSIgXSA7IHRoZW4KK2Z1bmN0aW9uIHJlcXVpcmVfbHVuY2gKK3sKKyAgICBpZiBbWyAhICRUQVJHRVRfUFJPRFVDVCB8fCAhICRUQVJHRVRfUkVMRUFTRSB8fCAhICRUQVJHRVRfQlVJTERfVkFSSUFOVCAgXV0gOyB0aGVuCisgICAgICAgIGVjaG8gIlBsZWFzZSBydW4gbHVuY2ggYW5kIHRyeSBhZ2Fpbi4iID4mMgorICAgICAgICBleGl0IDEKKyAgICBmaQorfQorZmkKKworIyBUaGlzIGZ1bmN0aW9uIHNldHMgdXAgdGhlIGJ1aWxkIGVudmlyb25tZW50IHRvIGJlIGFwcHJvcHJpYXRlIGZvciBDb2cuCitmdW5jdGlvbiBzZXR1cF9jb2dfZW52X2lmX25lZWRlZCgpIHsKKyAgbG9jYWwgdG9wPSQoZ2V0dG9wKQorCisgICMgcmV0dXJuIGVhcmx5IGlmIG5vdCBpbiBhIGNvZyB3b3Jrc3BhY2UKKyAgaWYgW1sgISAiJHRvcCIgPX4gXi9nb29nbGUvY29nIF1dOyB0aGVuCisgICAgcmV0dXJuIDAKKyAgZmkKKworICBzZXR1cF9jb2dfc3ltbGluaworCisgIGV4cG9ydCBBTkRST0lEX0JVSUxEX0VOVklST05NRU5UX0NPTkZJRz0iZ29vZ2xlci1jb2ciCisKKyAgIyBSdW5uaW5nIHJlcG8gY29tbWFuZCB3aXRoaW4gQ29nIHdvcmtzcGFjZXMgaXMgbm90IHN1cHBvcnRlZCwgc28gb3ZlcnJpZGUKKyAgIyBpdCB3aXRoIHRoaXMgZnVuY3Rpb24uIElmIHRoZSB1c2VyIGlzIHJ1bm5pbmcgcmVwbyB3aXRoaW4gYSBDb2cgd29ya3NwYWNlLAorICAjIHdlJ2xsIGZhaWwgd2l0aCBhbiBlcnJvciwgb3RoZXJ3aXNlLCB3ZSBydW4gdGhlIG9yaWdpbmFsIHJlcG8gY29tbWFuZCB3aXRoCisgICMgdGhlIGdpdmVuIGFyZ3MuCisgIGlmICEgT1JJR19SRVBPX1BBVEg9YHdoaWNoIHJlcG9gOyB0aGVuCisgICAgcmV0dXJuIDAKKyAgZmkKKyAgZnVuY3Rpb24gcmVwbyB7CisgICAgaWYgW1sgIiR7UFdEfSIgPT0gL2dvb2dsZS9jb2cvKiBdXTsgdGhlbgorICAgICAgZWNobyAtZSAiXGVbMDE7MzFtRVJST1I6XGVbMG1yZXBvIGNvbW1hbmQgaXMgZGlzYWxsb3dlZCB3aXRoaW4gQ29nIHdvcmtzcGFjZXMuIgorICAgICAga2lsbCAtSU5UICQkICMgZXhpdHMgdGhlIHNjcmlwdCB3aXRob3V0IGV4aXRpbmcgdGhlIHVzZXIncyBzaGVsbAorICAgIGZpCisgICAgJHtPUklHX1JFUE9fUEFUSH0gIiRAIgorICB9Cit9CisKKyMgY3JlYXRlcyBhIHN5bWxpbmsgZm9yIHRoZSBvdXQvIGRpciB3aGVuIGluc2lkZSBhIGNvZyB3b3Jrc3BhY2UuCitmdW5jdGlvbiBzZXR1cF9jb2dfc3ltbGluaygpIHsKKyAgbG9jYWwgb3V0X2Rpcj0kKGdldG91dGRpcikKKyAgbG9jYWwgdG9wPSQoZ2V0dG9wKQorCisgICMgcmV0dXJuIGVhcmx5IGlmIG91dCBkaXIgaXMgYWxyZWFkeSBhIHN5bWxpbmsKKyAgaWYgW1sgLUwgIiRvdXRfZGlyIiBdXTsgdGhlbgorICAgIHJldHVybiAwCisgIGZpCisKKyAgIyByZXR1cm4gZWFybHkgaWYgb3V0IGRpciBpcyBub3QgaW4gdGhlIHdvcmtzcGFjZQorICBpZiBbWyAhICIkb3V0X2RpciIgPX4gXiR0b3AvIF1dOyB0aGVuCisgICAgcmV0dXJuIDAKKyAgZmkKKworICBsb2NhbCBsaW5rX2Rlc3RpbmF0aW9uPSIke0hPTUV9Ly5jb2cvYW5kcm9pZC1idWlsZC1vdXQiCisKKyAgIyByZW1vdmUgZXhpc3Rpbmcgb3V0LyBkaXIgaWYgaXQgZXhpc3RzCisgIGlmIFtbIC1kICIkb3V0X2RpciIgXV07IHRoZW4KKyAgICBlY2hvICJEZXRlY3RlZCBleGlzdGluZyBvdXQvIGRpcmVjdG9yeSBpbiB0aGUgQ29nIHdvcmtzcGFjZSB3aGljaCBpcyBub3Qgc3VwcG9ydGVkLiBSZXBhaXJpbmcgd29ya3NwYWNlIGJ5IHJlbW92aW5nIGl0IGFuZCBjcmVhdGluZyB0aGUgc3ltbGluayB0byB+Ly5jb2cvYW5kcm9pZC1idWlsZC1vdXQiCisgICAgaWYgISBybSAtcmYgIiRvdXRfZGlyIjsgdGhlbgorICAgICAgZWNobyAiRmFpbGVkIHRvIHJlbW92ZSBleGlzdGluZyBvdXQvIGRpcmVjdG9yeTogJG91dF9kaXIiID4mMgorICAgICAga2lsbCAtSU5UICQkICMgZXhpdHMgdGhlIHNjcmlwdCB3aXRob3V0IGV4aXRpbmcgdGhlIHVzZXIncyBzaGVsbAorICAgIGZpCisgIGZpCisKKyAgIyBjcmVhdGUgc3ltbGluaworICBlY2hvICJDcmVhdGluZyBzeW1saW5rOiAkb3V0X2RpciAtPiAkbGlua19kZXN0aW5hdGlvbiIKKyAgbWtkaXIgLXAgJHtsaW5rX2Rlc3RpbmF0aW9ufQorICBpZiAhIGxuIC1zICIkbGlua19kZXN0aW5hdGlvbiIgIiRvdXRfZGlyIjsgdGhlbgorICAgIGVjaG8gIkZhaWxlZCB0byBjcmVhdGUgY29nIHN5bWxpbms6ICRvdXRfZGlyIC0+ICRsaW5rX2Rlc3RpbmF0aW9uIiA+JjIKKyAgICBraWxsIC1JTlQgJCQgIyBleGl0cyB0aGUgc2NyaXB0IHdpdGhvdXQgZXhpdGluZyB0aGUgdXNlcidzIHNoZWxsCisgIGZpCit9CisKIGZ1bmN0aW9uIGdldG91dGRpcgogewogICAgIGxvY2FsIHRvcD0kKGdldHRvcCkKQEAgLTcxLDQgKzE0NCw4OSBAQAogICAgIGVjaG8gIiR7b3V0X2Rpcn0iCiB9CiAKKyMgUHJldHR5IHByaW50IHRoZSBidWlsZCBzdGF0dXMgYW5kIGR1cmF0aW9uCitmdW5jdGlvbiBfd3JhcF9idWlsZCgpCit7CisgICAgaWYgW1sgIiR7QU5EUk9JRF9RVUlFVF9CVUlMRDotfSIgPT0gdHJ1ZSBdXTsgdGhlbgorICAgICAgIiRAIgorICAgICAgcmV0dXJuICQ/CisgICAgZmkKKyAgICBsb2NhbCBzdGFydF90aW1lPSQoZGF0ZSArIiVzIikKKyAgICAiJEAiCisgICAgbG9jYWwgcmV0PSQ/CisgICAgbG9jYWwgZW5kX3RpbWU9JChkYXRlICsiJXMiKQorICAgIGxvY2FsIHRkaWZmPSQoKCRlbmRfdGltZS0kc3RhcnRfdGltZSkpCisgICAgbG9jYWwgaG91cnM9JCgoJHRkaWZmIC8gMzYwMCApKQorICAgIGxvY2FsIG1pbnM9JCgoKCR0ZGlmZiAlIDM2MDApIC8gNjApKQorICAgIGxvY2FsIHNlY3M9JCgoJHRkaWZmICUgNjApKQorICAgIGxvY2FsIG5jb2xvcnM9JCh0cHV0IGNvbG9ycyAyPi9kZXYvbnVsbCkKKyAgICBpZiBbIC1uICIkbmNvbG9ycyIgXSAmJiBbICRuY29sb3JzIC1nZSA4IF07IHRoZW4KKyAgICAgICAgY29sb3JfZmFpbGVkPSQnXEUnIlswOzMxbSIKKyAgICAgICAgY29sb3Jfc3VjY2Vzcz0kJ1xFJyJbMDszMm0iCisgICAgICAgIGNvbG9yX3dhcm5pbmc9JCdcRSciWzA7MzNtIgorICAgICAgICBjb2xvcl9yZXNldD0kJ1xFJyJbMDBtIgorICAgIGVsc2UKKyAgICAgICAgY29sb3JfZmFpbGVkPSIiCisgICAgICAgIGNvbG9yX3N1Y2Nlc3M9IiIKKyAgICAgICAgY29sb3JfcmVzZXQ9IiIKKyAgICBmaQogCisgICAgZWNobworICAgIGlmIFsgJHJldCAtZXEgMCBdIDsgdGhlbgorICAgICAgICBlY2hvIC1uICIke2NvbG9yX3N1Y2Nlc3N9IyMjIyBidWlsZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5ICIKKyAgICBlbHNlCisgICAgICAgIGVjaG8gLW4gIiR7Y29sb3JfZmFpbGVkfSMjIyMgZmFpbGVkIHRvIGJ1aWxkIHNvbWUgdGFyZ2V0cyAiCisgICAgZmkKKyAgICBpZiBbICRob3VycyAtZ3QgMCBdIDsgdGhlbgorICAgICAgICBwcmludGYgIiglMDJkOiUwMmQ6JTAyZCAoaGg6bW06c3MpKSIgJGhvdXJzICRtaW5zICRzZWNzCisgICAgZWxpZiBbICRtaW5zIC1ndCAwIF0gOyB0aGVuCisgICAgICAgIHByaW50ZiAiKCUwMmQ6JTAyZCAobW06c3MpKSIgJG1pbnMgJHNlY3MKKyAgICBlbGlmIFsgJHNlY3MgLWd0IDAgXSA7IHRoZW4KKyAgICAgICAgcHJpbnRmICIoJWQgc2Vjb25kcykiICRzZWNzCisgICAgZmkKKyAgICBlY2hvICIgIyMjIyR7Y29sb3JfcmVzZXR9IgorICAgIGVjaG8KKyAgICByZXR1cm4gJHJldAorfQorCisKK2Z1bmN0aW9uIGxvZ190b29sX2ludm9jYXRpb24oKQoreworICAgIGlmIFtbIC16ICRBTkRST0lEX1RPT0xfTE9HR0VSIF1dOyB0aGVuCisgICAgICAgIHJldHVybgorICAgIGZpCisKKyAgICBMT0dfVE9PTF9UQUc9JDEKKyAgICBMT0dfU1RBUlRfVElNRT0kKGRhdGUgKyVzLiVOKQorICAgIHRyYXAgJworICAgICAgICBleGl0X2NvZGU9JD87CisgICAgICAgICMgUmVtb3ZlIHRoZSB0cmFwIHRvIHByZXZlbnQgZHVwbGljYXRlIGxvZy4KKyAgICAgICAgdHJhcCAtIEVYSVQ7CisgICAgICAgICRBTkRST0lEX1RPT0xfTE9HR0VSIFwKKyAgICAgICAgICAgICAgICAtLXRvb2xfdGFnPSIke0xPR19UT09MX1RBR30iIFwKKyAgICAgICAgICAgICAgICAtLXN0YXJ0X3RpbWVzdGFtcD0iJHtMT0dfU1RBUlRfVElNRX0iIFwKKyAgICAgICAgICAgICAgICAtLWVuZF90aW1lc3RhbXA9IiQoZGF0ZSArJXMuJU4pIiBcCisgICAgICAgICAgICAgICAgLS10b29sX2FyZ3M9IiQqIiBcCisgICAgICAgICAgICAgICAgLS1leGl0X2NvZGU9IiR7ZXhpdF9jb2RlfSIgXAorICAgICAgICAgICAgICAgICR7QU5EUk9JRF9UT09MX0xPR0dFUl9FWFRSQV9BUkdTfSBcCisgICAgICAgICAgID4gL2Rldi9udWxsIDI+JjEgJgorICAgICAgICBleGl0ICR7ZXhpdF9jb2RlfQorICAgICcgU0lHSU5UIFNJR1RFUk0gU0lHUVVJVCBFWElUCit9CisKKyMgSW1wb3J0IHRoZSBidWlsZCB2YXJpYWJsZXMgc3VwcGxpZWQgYXMgYXJndW1lbnRzIGludG8gdGhpcyBzaGVsbCdzIGVudmlyb25tZW50LgorIyBGb3IgYWJzb2x1dGUgdmFyaWFibGVzLCBwcmVmaXggdGhlIHZhcmlhYmxlIG5hbWUgd2l0aCBhICcvJy4gRm9yIGV4YW1wbGU6CisjICAgIGltcG9ydF9idWlsZF92YXJzIE9VVF9ESVIgRElTVF9ESVIgL0hPU1RfT1VUX0VYRUNVVEFCTEVTCisjIFJldHVybnMgbm9uemVybyBpZiB0aGUgYnVpbGQgY29tbWFuZCBmYWlsZWQuIFN0ZGVyciBpcyBwYXNzZWQgdGhyb3VnaC4KK2Z1bmN0aW9uIGltcG9ydF9idWlsZF92YXJzKCkKK3sKKyAgICByZXF1aXJlX3RvcAorICAgIGxvY2FsIHNjcmlwdAorICAgIHNjcmlwdD0kKGNkICRUT1AgJiYgYnVpbGQvc29vbmcvYmluL2dldF9idWlsZF92YXJzICIkQCIpCisgICAgbG9jYWwgcmV0PSQ/CisgICAgaWYgWyAkcmV0IC1uZSAwIF0gOyB0aGVuCisgICAgICAgIHJldHVybiAkcmV0CisgICAgZmkKKyAgICBldmFsICIkc2NyaXB0IgorICAgIHJldHVybiAkPworfQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnRW11Q29tbW9uLm1rIGIvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnRW11Q29tbW9uLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWQwOGYwLi4wMDAwMDAwCi0tLSBhL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ0VtdUNvbW1vbi5taworKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLSMgQm9hcmRDb25maWdFbXVDb21tb24ubWsKLSMKLSMgQ29tbW9uIGNvbXBpbGUtdGltZSBkZWZpbml0aW9ucyBmb3IgZW11bGF0b3IKLSMKLQotSEFWRV9IVENfQVVESU9fRFJJVkVSIDo9IHRydWUKLUJPQVJEX1VTRVNfR0VORVJJQ19BVURJTyA6PSB0cnVlCi1UQVJHRVRfQk9PVExPQURFUl9CT0FSRF9OQU1FIDo9IGdvbGRmaXNoXyQoVEFSR0VUX0FSQ0gpCi0KLSMgTm8gS2VybmVsCi1UQVJHRVRfTk9fS0VSTkVMIDo9IHRydWUKLQotIyBubyBoYXJkd2FyZSBjYW1lcmEKLVVTRV9DQU1FUkFfU1RVQiA6PSB0cnVlCi0KLU5VTV9GUkFNRUJVRkZFUl9TVVJGQUNFX0JVRkZFUlMgOj0gMwotCi0jIEJ1aWxkIE9wZW5HTEVTIGVtdWxhdGlvbiBndWVzdCBhbmQgaG9zdCBsaWJyYXJpZXMKLUJVSUxEX0VNVUxBVE9SX09QRU5HTCA6PSB0cnVlCi1CVUlMRF9RRU1VX0lNQUdFUyA6PSB0cnVlCi0KLSMgQnVpbGQgYW5kIGVuYWJsZSB0aGUgT3BlbkdMIEVTIFZpZXcgcmVuZGVyZXIuIFdoZW4gcnVubmluZyBvbiB0aGUgZW11bGF0b3IsCi0jIHRoZSBHTEVTIHJlbmRlcmVyIGRpc2FibGVzIGl0c2VsZiBpZiBob3N0IEdMIGFjY2VsZXJhdGlvbiBpc24ndCBhdmFpbGFibGUuCi1VU0VfT1BFTkdMX1JFTkRFUkVSIDo9IHRydWUKLQotIyBFbXVsYXRvciBkb2Vzbid0IHN1cHBvcnQgc3BhcnNlIGltYWdlIGZvcm1hdC4KLVRBUkdFVF9VU0VSSU1BR0VTX1NQQVJTRV9FWFRfRElTQUJMRUQgOj0gdHJ1ZQotCi0jIGVtdWxhdG9yIGlzIE5vbi1BL0IgZGV2aWNlCi1BQl9PVEFfVVBEQVRFUiA6PSBmYWxzZQotCi0jIGVtdWxhdG9yIG5lZWRzIHN1cGVyLmltZwotQk9BUkRfQlVJTERfU1VQRVJfSU1BR0VfQllfREVGQVVMVCA6PSB0cnVlCi0KLSMgOEcgKyA4TQotQk9BUkRfU1VQRVJfUEFSVElUSU9OX1NJWkUgPz0gODU5ODMyMzIwMAotQk9BUkRfU1VQRVJfUEFSVElUSU9OX0dST1VQUyA6PSBlbXVsYXRvcl9keW5hbWljX3BhcnRpdGlvbnMKLQotQk9BUkRfRU1VTEFUT1JfRFlOQU1JQ19QQVJUSVRJT05TX1BBUlRJVElPTl9MSVNUIDo9IFwKLSAgc3lzdGVtIFwKLSAgc3lzdGVtX2Rsa20gXAotICBzeXN0ZW1fZXh0IFwKLSAgcHJvZHVjdCBcCi0gIHZlbmRvcgotCi1UQVJHRVRfQ09QWV9PVVRfUFJPRFVDVCA6PSBwcm9kdWN0Ci1CT0FSRF9QUk9EVUNUSU1BR0VfRklMRV9TWVNURU1fVFlQRSA6PSBleHQ0Ci1UQVJHRVRfQ09QWV9PVVRfU1lTVEVNX0VYVCA6PSBzeXN0ZW1fZXh0Ci1CT0FSRF9TWVNURU1fRVhUSU1BR0VfRklMRV9TWVNURU1fVFlQRSA6PSBleHQ0Ci0KLUJPQVJEX1VTRVNfU1lTVEVNX0RMS01JTUFHRSA6PSB0cnVlCi1CT0FSRF9TWVNURU1fRExLTUlNQUdFX0ZJTEVfU1lTVEVNX1RZUEUgOj0gZXJvZnMKLVRBUkdFVF9DT1BZX09VVF9TWVNURU1fRExLTSA6PSBzeXN0ZW1fZGxrbQotCi0jIDhHCi1CT0FSRF9FTVVMQVRPUl9EWU5BTUlDX1BBUlRJVElPTlNfU0laRSA/PSA4NTg5OTM0NTkyCi0KLSN2ZW5kb3IgYm9vdAotQk9BUkRfSU5DTFVERV9EVEJfSU5fQk9PVElNRyA6PSBmYWxzZQotQk9BUkRfQk9PVF9IRUFERVJfVkVSU0lPTiA6PSA0Ci1CT0FSRF9NS0JPT1RJTUdfQVJHUyArPSAtLWhlYWRlcl92ZXJzaW9uICQoQk9BUkRfQk9PVF9IRUFERVJfVkVSU0lPTikKLUJPQVJEX1ZFTkRPUl9CT09USU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gMHgwNjAwMDAwMAotQk9BUkRfUkFNRElTS19VU0VfTFo0IDo9IHRydWUKLQotIyBFbmFibGUgY2hhaW4gcGFydGl0aW9uIGZvciBzeXN0ZW0uCi1CT0FSRF9BVkJfU1lTVEVNX0tFWV9QQVRIIDo9IGV4dGVybmFsL2F2Yi90ZXN0L2RhdGEvdGVzdGtleV9yc2EyMDQ4LnBlbQotQk9BUkRfQVZCX1NZU1RFTV9BTEdPUklUSE0gOj0gU0hBMjU2X1JTQTIwNDgKLUJPQVJEX0FWQl9TWVNURU1fUk9MTEJBQ0tfSU5ERVggOj0gJChQTEFURk9STV9TRUNVUklUWV9QQVRDSF9USU1FU1RBTVApCi1CT0FSRF9BVkJfU1lTVEVNX1JPTExCQUNLX0lOREVYX0xPQ0FUSU9OIDo9IDEKLQotQk9BUkRfVkVORE9SSU1BR0VfRklMRV9TWVNURU1fVFlQRSA6PSBleHQ0Ci1CT0FSRF9GTEFTSF9CTE9DS19TSVpFIDo9IDUxMgotCi1CT0FSRF9TRVBPTElDWV9ESVJTICs9IGRldmljZS9nZW5lcmljL2dvbGRmaXNoL3NlcG9saWN5L2NvbW1vbgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnR3NpQ29tbW9uLm1rIGIvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnR3NpQ29tbW9uLm1rCmluZGV4IDRkOTViMzMuLjhhNjI3OTYgMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ0dzaUNvbW1vbi5taworKysgYi90YXJnZXQvYm9hcmQvQm9hcmRDb25maWdHc2lDb21tb24ubWsKQEAgLTM2LDYgKzM2LDcgQEAKIFRBUkdFVF9DT1BZX09VVF9QUk9EVUNUIDo9IHN5c3RlbS9wcm9kdWN0CiBUQVJHRVRfQ09QWV9PVVRfU1lTVEVNX0VYVCA6PSBzeXN0ZW0vc3lzdGVtX2V4dAogQk9BUkRfUFJPRFVDVElNQUdFX0ZJTEVfU1lTVEVNX1RZUEUgOj0KK0JPQVJEX1NZU1RFTV9FWFRJTUFHRV9GSUxFX1NZU1RFTV9UWVBFIDo9CiAKICMgQ3JlYXRlcyBtZXRhZGF0YSBwYXJ0aXRpb24gbW91bnQgcG9pbnQgdW5kZXIgcm9vdCBmb3IKICMgdGhlIGRldmljZXMgd2l0aCBtZXRhZGF0YSBwYXJpdGlvbgpAQCAtNjgsNiArNjksMTEgQEAKIEJPQVJEX1NVUEVSX1BBUlRJVElPTl9HUk9VUFMgOj0gZ3NpX2R5bmFtaWNfcGFydGl0aW9ucwogQk9BUkRfR1NJX0RZTkFNSUNfUEFSVElUSU9OU19QQVJUSVRJT05fTElTVCA6PSBzeXN0ZW0KIEJPQVJEX0dTSV9EWU5BTUlDX1BBUlRJVElPTlNfU0laRSA6PSAzMjIxMjI1NDcyCisKKyMgQnVpbGQgcHZtZncgd2l0aCBHU0k6IGIvMzc2MzYzOTg5CitpZmVxICh0cnVlLCQoUFJPRFVDVF9CVUlMRF9QVk1GV19JTUFHRSkpCitCT0FSRF9QVk1GV0lNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDB4MDAxMDAwMDAKK2VuZGlmCiBlbmRpZgogCiAjIFRPRE8oYi8xMjM2OTU4NjgsIGIvMTQ2MTQ5Njk4KToKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ01haW5saW5lQ29tbW9uLm1rIGIvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnTWFpbmxpbmVDb21tb24ubWsKaW5kZXggMDBmNmU1Yi4uYjVlM2RjMiAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnTWFpbmxpbmVDb21tb24ubWsKKysrIGIvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnTWFpbmxpbmVDb21tb24ubWsKQEAgLTIsNiArMiw5IEBACiAjCiAjIENvbW1vbiBjb21waWxlLXRpbWUgZGVmaW5pdGlvbnMgZm9yIG1haW5saW5lIGltYWdlcy4KIAorIyBFbnN1cmUgYWxsIHRydW5rLXN0YWJsZSBmbGFncyBhcmUgYXZhaWxhYmxlLgoraW5jbHVkZSBidWlsZC9tYWtlL3RhcmdldC9wcm9kdWN0L2J1aWxkX3ZhcmlhYmxlcy5taworCiAjIFRoZSBnZW5lcmljIHByb2R1Y3QgdGFyZ2V0IGRvZXNuJ3QgaGF2ZSBhbnkgaGFyZHdhcmUtc3BlY2lmaWMgcGllY2VzLgogVEFSR0VUX05PX0JPT1RMT0FERVIgOj0gdHJ1ZQogVEFSR0VUX05PX1JFQ09WRVJZIDo9IHRydWUKQEAgLTE0LDE3ICsxNywxMyBAQAogVEFSR0VUX0NPUFlfT1VUX1NZU1RFTV9FWFQgOj0gc3lzdGVtX2V4dAogVEFSR0VUX0NPUFlfT1VUX1ZFTkRPUiA6PSB2ZW5kb3IKIFRBUkdFVF9DT1BZX09VVF9QUk9EVUNUIDo9IHByb2R1Y3QKK0JPQVJEX1BST0RVQ1RJTUFHRV9GSUxFX1NZU1RFTV9UWVBFIDo9IGV4dDQKK0JPQVJEX1NZU1RFTV9FWFRJTUFHRV9GSUxFX1NZU1RFTV9UWVBFIDo9IGV4dDQKIAogIyBDcmVhdGVzIG1ldGFkYXRhIHBhcnRpdGlvbiBtb3VudCBwb2ludCB1bmRlciByb290IGZvcgogIyB0aGUgZGV2aWNlcyB3aXRoIG1ldGFkYXRhIHBhcml0aW9uCiBCT0FSRF9VU0VTX01FVEFEQVRBX1BBUlRJVElPTiA6PSB0cnVlCiAKLSMgRGVmYXVsdCBpcyBjdXJyZW50LCBidXQgYWxsb3cgZGV2aWNlcyB0byBvdmVycmlkZSB2bmRrIHZlcnNpb24gaWYgbmVlZGVkLgotQk9BUkRfVk5ES19WRVJTSU9OID89IGN1cnJlbnQKLQotIyBSZXF1aXJlZCBmbGFnIGZvciBub24tNjQgYml0IGRldmljZXMgZnJvbSBQLgotVEFSR0VUX1VTRVNfNjRfQklUX0JJTkRFUiA6PSB0cnVlCi0KICMgNjQgYml0IG1lZGlhZHJtc2VydmVyCiBUQVJHRVRfRU5BQkxFX01FRElBRFJNXzY0IDo9IHRydWUKIApkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnTW9kdWxlQ29tbW9uLm1rIGIvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnTW9kdWxlQ29tbW9uLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGMwMWE1Li4wMDAwMDAwCi0tLSBhL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ01vZHVsZUNvbW1vbi5taworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBCb2FyZENvbmZpZ01vZHVsZUNvbW1vbi5tawotIwotIyBDb21tb24gY29tcGlsZS10aW1lIHNldHRpbmdzIGZvciBtb2R1bGUgYnVpbGRzLgotCi0jIFJlcXVpcmVkIGZvciBhbGwgbW9kdWxlIGRldmljZXMuCi1UQVJHRVRfVVNFU182NF9CSVRfQklOREVSIDo9IHRydWUKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9BbmRyb2lkLm1rIGIvdGFyZ2V0L2JvYXJkL2FuZHJvaWQtaW5mby5tawpzaW1pbGFyaXR5IGluZGV4IDYyJQpyZW5hbWUgZnJvbSB0YXJnZXQvYm9hcmQvQW5kcm9pZC5tawpyZW5hbWUgdG8gdGFyZ2V0L2JvYXJkL2FuZHJvaWQtaW5mby5tawppbmRleCAyMWMwYzEwLi4zNmJlMDAyIDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvQW5kcm9pZC5taworKysgYi90YXJnZXQvYm9hcmQvYW5kcm9pZC1pbmZvLm1rCkBAIC0xMCwxNSArMTAsMjkgQEAKICMgZGV2aWNlIHdlJ3JlIGJ1aWxkaW5nIGZvci4gIFRoaXMgZmlsZSBpcyB0eXBpY2FsbHkgcGFja2FnZWQgdXAKICMgd2l0aCBldmVyeXRoaW5nIGVsc2UuCiAjCi0jIElmIFRBUkdFVF9CT0FSRF9JTkZPX0ZJTEUgKHdoaWNoIGNhbiBiZSBzZXQgaW4gQm9hcmRDb25maWcubWspIGlzCi0jIGRlZmluZWQsIGl0IGlzIHVzZWQsIG90aGVyd2lzZSBib2FyZC1pbmZvLnR4dCBpcyBsb29rZWQgZm9yIGluCi0jICQoVEFSR0VUX0RFVklDRV9ESVIpLgorIyBUaGUgZm9sbG93aW5nIGxvZ2ljIGlzIHVzZWQgdG8gZmluZCB0aGUgY29udGVudHMgb2YgdGhlIGluZm8gZmlsZToKKyMgICAxLiBUQVJHRVRfQk9BUkRfSU5GT19GSUxFUyAoY2FuIGJlIHNldCBpbiBCb2FyZENvbmZpZy5taykgd2lsbCBiZSBjb21iaW5lZC4KKyMgICAyLiBUQVJHRVRfQk9BUkRfSU5GT19GSUxFIChjYW4gYmUgc2V0IGluIEJvYXJkQ29uZmlnLm1rKSB3aWxsIGJlIHVzZWQuCisjICAgMy4gJChUQVJHRVRfREVWSUNFX0RJUikvYm9hcmQtaW5mby50eHQgd2lsbCBiZSB1c2VkIGlmIHByZXNlbnQuCisjCisjIFNwZWNpZnlpbmcgYm90aCBUQVJHRVRfQk9BUkRfSU5GT19GSUxFUyBhbmQgVEFSR0VUX0JPQVJEX0lORk9fRklMRSBpcyBhbgorIyBlcnJvci4KICMKIElOU1RBTExFRF9BTkRST0lEX0lORk9fVFhUX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9hbmRyb2lkLWluZm8udHh0Ci1ib2FyZF9pbmZvX3R4dCA6PSAkKFRBUkdFVF9CT0FSRF9JTkZPX0ZJTEUpCi1pZm5kZWYgYm9hcmRfaW5mb190eHQKLWJvYXJkX2luZm9fdHh0IDo9ICQod2lsZGNhcmQgJChUQVJHRVRfREVWSUNFX0RJUikvYm9hcmQtaW5mby50eHQpCitpZmRlZiBUQVJHRVRfQk9BUkRfSU5GT19GSUxFUworICBpZmRlZiBUQVJHRVRfQk9BUkRfSU5GT19GSUxFCisgICAgJCh3YXJuaW5nIEJvdGggVEFSR0VUX0JPQVJEX0lORk9fRklMRVMgYW5kIFRBUkdFVF9CT0FSRF9JTkZPX0ZJTEUgYXJlIGRlZmluZWQuKQorICAgICQod2FybmluZyBVc2luZyAkKFRBUkdFVF9CT0FSRF9JTkZPX0ZJTEVTKSByYXRoZXIgdGhhbiAkKFRBUkdFVF9CT0FSRF9JTkZPX0ZJTEUpIGZvciBhbmRyb2lkLWluZm8udHh0KQorICBlbmRpZgorICBib2FyZF9pbmZvX3R4dCA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxib2FyZC1pbmZvKS9ib2FyZC1pbmZvLnR4dAorJChib2FyZF9pbmZvX3R4dCk6ICQoVEFSR0VUX0JPQVJEX0lORk9fRklMRVMpCisJJChoaWRlKSBjYXQgJChUQVJHRVRfQk9BUkRfSU5GT19GSUxFUykgPiAkQAorZWxzZSBpZmRlZiBUQVJHRVRfQk9BUkRfSU5GT19GSUxFCisgIGJvYXJkX2luZm9fdHh0IDo9ICQoVEFSR0VUX0JPQVJEX0lORk9fRklMRSkKK2Vsc2UKKyAgYm9hcmRfaW5mb190eHQgOj0gJCh3aWxkY2FyZCAkKFRBUkdFVF9ERVZJQ0VfRElSKS9ib2FyZC1pbmZvLnR4dCkKIGVuZGlmCisKIENIRUNLX1JBRElPX1ZFUlNJT05TIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2NoZWNrX3JhZGlvX3ZlcnNpb25zJChIT1NUX0VYRUNVVEFCTEVfU1VGRklYKQogJChJTlNUQUxMRURfQU5EUk9JRF9JTkZPX1RYVF9UQVJHRVQpOiAkKGJvYXJkX2luZm9fdHh0KSAkKENIRUNLX1JBRElPX1ZFUlNJT05TKQogCSQoaGlkZSkgJChDSEVDS19SQURJT19WRVJTSU9OUykgXApAQCAtMzcsMzAgKzUxLDYgQEAKIAogIyBDb3B5IGNvbXBhdGliaWxpdHkgbWV0YWRhdGEgdG8gdGhlIGRldmljZS4KIAotIyBEZXZpY2UgTWFuaWZlc3QKLWlmZGVmIERFVklDRV9NQU5JRkVTVF9GSUxFCi0jICQoREVWSUNFX01BTklGRVNUX0ZJTEUpIGNhbiBiZSBhIGxpc3Qgb2YgZmlsZXMKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFICAgICAgICA6PSB2ZW5kb3JfbWFuaWZlc3QueG1sCi1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAgbGVnYWN5X25vdF9hX2NvbnRyaWJ1dGlvbgotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IGJ5X2V4Y2VwdGlvbl9vbmx5IG5vdF9hbGxvd2VkIG5vdGljZQotTE9DQUxfTU9EVUxFX1NURU0gICA6PSBtYW5pZmVzdC54bWwKLUxPQ0FMX01PRFVMRV9DTEFTUyAgOj0gRVRDCi1MT0NBTF9NT0RVTEVfUEFUSCAgIDo9ICQoVEFSR0VUX09VVF9WRU5ET1IpL2V0Yy92aW50ZgotCi1HRU4gOj0gJChsb2NhbC1nZW5lcmF0ZWQtc291cmNlcy1kaXIpL21hbmlmZXN0LnhtbAotJChHRU4pOiBQUklWQVRFX0RFVklDRV9NQU5JRkVTVF9GSUxFIDo9ICQoREVWSUNFX01BTklGRVNUX0ZJTEUpCi0kKEdFTik6ICQoREVWSUNFX01BTklGRVNUX0ZJTEUpICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2Fzc2VtYmxlX3ZpbnRmCi0JQk9BUkRfU0VQT0xJQ1lfVkVSUz0kKEJPQVJEX1NFUE9MSUNZX1ZFUlMpIFwKLQlQUk9EVUNUX0VORk9SQ0VfVklOVEZfTUFOSUZFU1Q9JChQUk9EVUNUX0VORk9SQ0VfVklOVEZfTUFOSUZFU1QpIFwKLQlQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTD0kKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSBcCi0JJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYXNzZW1ibGVfdmludGYgLW8gJEAgXAotCQktaSAkKGNhbGwgbm9ybWFsaXplLXBhdGgtbGlzdCwkKFBSSVZBVEVfREVWSUNFX01BTklGRVNUX0ZJTEUpKQotCi1MT0NBTF9QUkVCVUlMVF9NT0RVTEVfRklMRSA6PSAkKEdFTikKLWluY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKLWVuZGlmCi0KICMgREVWSUNFX01BTklGRVNUX1NLVVM6IGEgbGlzdCBvZiBTS1VTIHdoZXJlIERFVklDRV9NQU5JRkVTVF88c2t1Pl9GSUxFUyBpcyBkZWZpbmVkLgogaWZkZWYgREVWSUNFX01BTklGRVNUX1NLVVMKIApAQCAtODUsNyArNzUsNiBAQAogJCQoR0VOKTogJCQobXlfZnJhZ21lbnRfZmlsZXMpICQkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hc3NlbWJsZV92aW50ZgogCUJPQVJEX1NFUE9MSUNZX1ZFUlM9JCQoQk9BUkRfU0VQT0xJQ1lfVkVSUykgXAogCVBST0RVQ1RfRU5GT1JDRV9WSU5URl9NQU5JRkVTVD0kJChQUk9EVUNUX0VORk9SQ0VfVklOVEZfTUFOSUZFU1QpIFwKLQlQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTD0kJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCkgXAogCSQkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hc3NlbWJsZV92aW50ZiAtbyAkJEAgXAogCQktaSAkJChjYWxsIG5vcm1hbGl6ZS1wYXRoLWxpc3QsJCQoUFJJVkFURV9TUkNfRklMRVMpKQogCkBAIC0xMDAsMzAgKzg5LDYgQEAKIAogZW5kaWYgIyBERVZJQ0VfTUFOSUZFU1RfU0tVUwogCi0jIE9ETSBtYW5pZmVzdAotaWZkZWYgT0RNX01BTklGRVNUX0ZJTEVTCi0jIE9ETV9NQU5JRkVTVF9GSUxFUyBpcyBhIGxpc3Qgb2YgZmlsZXMgdGhhdCBpcyBjb21iaW5lZCBhbmQgaW5zdGFsbGVkIGFzIHRoZSBkZWZhdWx0IE9ETSBtYW5pZmVzdC4KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IG9kbV9tYW5pZmVzdC54bWwKLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCBsZWdhY3lfbm90X2FfY29udHJpYnV0aW9uCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gYnlfZXhjZXB0aW9uX29ubHkgbm90X2FsbG93ZWQgbm90aWNlCi1MT0NBTF9NT0RVTEVfU1RFTSA6PSBtYW5pZmVzdC54bWwKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHZpbnRmCi1MT0NBTF9PRE1fTU9EVUxFIDo9IHRydWUKLQotR0VOIDo9ICQobG9jYWwtZ2VuZXJhdGVkLXNvdXJjZXMtZGlyKS9tYW5pZmVzdC54bWwKLSQoR0VOKTogUFJJVkFURV9TUkNfRklMRVMgOj0gJChPRE1fTUFOSUZFU1RfRklMRVMpCi0kKEdFTik6ICQoT0RNX01BTklGRVNUX0ZJTEVTKSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hc3NlbWJsZV92aW50ZgotCSMgU2V0IFZJTlRGX0lHTk9SRV9UQVJHRVRfRkNNX1ZFUlNJT04gdG8gdHJ1ZSBiZWNhdXNlIGl0IHNob3VsZCBvbmx5IGJlIGluIGRldmljZSBtYW5pZmVzdC4KLQlWSU5URl9JR05PUkVfVEFSR0VUX0ZDTV9WRVJTSU9OPXRydWUgXAotCSQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2Fzc2VtYmxlX3ZpbnRmIC1vICRAIFwKLQkJLWkgJChjYWxsIG5vcm1hbGl6ZS1wYXRoLWxpc3QsJChQUklWQVRFX1NSQ19GSUxFUykpCi0KLUxPQ0FMX1BSRUJVSUxUX01PRFVMRV9GSUxFIDo9ICQoR0VOKQotaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQotZW5kaWYgIyBPRE1fTUFOSUZFU1RfRklMRVMKLQogIyBPRE1fTUFOSUZFU1RfU0tVUzogYSBsaXN0IG9mIFNLVVMgd2hlcmUgT0RNX01BTklGRVNUXzxza3U+X0ZJTEVTIGFyZSBkZWZpbmVkLgogaWZkZWYgT0RNX01BTklGRVNUX1NLVVMKIApkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX2FybS9BbmRyb2lkQm9hcmQubWsgYi90YXJnZXQvYm9hcmQvZW11bGF0b3JfYXJtL0FuZHJvaWRCb2FyZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxMWY2MS4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfYXJtL0FuZHJvaWRCb2FyZC5taworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl9hcm0vQm9hcmRDb25maWcubWsgYi90YXJnZXQvYm9hcmQvZW11bGF0b3JfYXJtL0JvYXJkQ29uZmlnLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODc4MjRmLi4wMDAwMDAwCi0tLSBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl9hcm0vQm9hcmRDb25maWcubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIGFybSBlbXVsYXRvciBzcGVjaWZpYyBkZWZpbml0aW9ucwotVEFSR0VUX0FSQ0ggOj0gYXJtCi1UQVJHRVRfQVJDSF9WQVJJQU5UIDo9IGFybXY3LWEtbmVvbgotVEFSR0VUX0NQVV9WQVJJQU5UIDo9IGdlbmVyaWMKLVRBUkdFVF9DUFVfQUJJIDo9IGFybWVhYmktdjdhCi1UQVJHRVRfQ1BVX0FCSTIgOj0gYXJtZWFiaQotCi1pbmNsdWRlIGJ1aWxkL21ha2UvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnR3NpQ29tbW9uLm1rCi1pbmNsdWRlIGJ1aWxkL21ha2UvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnRW11Q29tbW9uLm1rCi0KLUJPQVJEX1VTRVJEQVRBSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gNTc2NzE2ODAwCi0KLSMgV2lmaS4KLUJPQVJEX1dMQU5fREVWSUNFICAgICAgICAgICA6PSBlbXVsYXRvcgotQk9BUkRfSE9TVEFQRF9EUklWRVIgICAgICAgIDo9IE5MODAyMTEKLUJPQVJEX1dQQV9TVVBQTElDQU5UX0RSSVZFUiA6PSBOTDgwMjExCi1CT0FSRF9IT1NUQVBEX1BSSVZBVEVfTElCICAgOj0gbGliX2RyaXZlcl9jbWRfc2ltdWxhdGVkCi1CT0FSRF9XUEFfU1VQUExJQ0FOVF9QUklWQVRFX0xJQiA6PSBsaWJfZHJpdmVyX2NtZF9zaW11bGF0ZWQKLVdQQV9TVVBQTElDQU5UX1ZFUlNJT04gICAgICA6PSBWRVJfMF84X1gKLVdJRklfRFJJVkVSX0ZXX1BBVEhfUEFSQU0gICA6PSAiL2Rldi9udWxsIgotV0lGSV9EUklWRVJfRldfUEFUSF9TVEEgICAgIDo9ICIvZGV2L251bGwiCi1XSUZJX0RSSVZFUl9GV19QQVRIX0FQICAgICAgOj0gIi9kZXYvbnVsbCIKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl9hcm0vc3lzdGVtX2V4dC5wcm9wIGIvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX2FybS9zeXN0ZW1fZXh0LnByb3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ODI5ZjMuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX2FybS9zeXN0ZW1fZXh0LnByb3AKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMKLSMgc3lzdGVtLnByb3AgZm9yIGdlbmVyaWMgc2RrCi0jCi0KLXJpbGQubGlicGF0aD0vdmVuZG9yL2xpYi9saWJyZWZlcmVuY2UtcmlsLnNvCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfYXJtNjQvQm9hcmRDb25maWcubWsgYi90YXJnZXQvYm9hcmQvZW11bGF0b3JfYXJtNjQvQm9hcmRDb25maWcubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2M2U1NTguLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX2FybTY0L0JvYXJkQ29uZmlnLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBhcm02NCBlbXVsYXRvciBzcGVjaWZpYyBkZWZpbml0aW9ucwotVEFSR0VUX0FSQ0ggOj0gYXJtNjQKLVRBUkdFVF9BUkNIX1ZBUklBTlQgOj0gYXJtdjgtYQotVEFSR0VUX0NQVV9WQVJJQU5UIDo9IGdlbmVyaWMKLVRBUkdFVF9DUFVfQUJJIDo9IGFybTY0LXY4YQotCi1pZm5lcSAoJChUQVJHRVRfQlVJTERfQVBQUykkKGZpbHRlciBjdHMgc2RrLCQoTUFLRUNNREdPQUxTKSksKQotIyBETyBOT1QgVVNFCi0jIERPIE5PVCBVU0UKLSMKLSMgVGhpcyBhcmNoaXRlY3R1cmUgLyBDUFUgdmFyaWFudCBtdXN0IE5PVCBiZSB1c2VkIGZvciBhbnkgNjQgYml0Ci0jIHBsYXRmb3JtIGJ1aWxkcy4gSXQgaXMgdGhlIGxvd2VzdCBjb21tb24gZGVub21pbmF0b3IgcmVxdWlyZWQKLSMgdG8gYnVpbGQgYW4gdW5idW5kbGVkIGFwcGxpY2F0aW9uIG9yIGN0cyBmb3IgYWxsIHN1cHBvcnRlZCAzMiBhbmQgNjQgYml0Ci0jIHBsYXRmb3Jtcy4KLSMKLSMgSWYgeW91J3JlIGJ1aWxkaW5nIGEgNjQgYml0IHBsYXRmb3JtIChhbmQgbm90IGFuIGFwcGxpY2F0aW9uKSB0aGUKLSMgQVJNLXY4IHNwZWNpZmljYXRpb24gYWxsb3dzIHlvdSB0byBhc3N1bWUgYWxsIHRoZSBmZWF0dXJlcyBhdmFpbGFibGUgaW4gYW4KLSMgYXJtdjctYS1uZW9uIENQVS4gWW91IHNob3VsZCBzZXQgdGhlIGZvbGxvd2luZyBhcyAybmQgYXJjaC9jcHUgdmFyaWFudDoKLSMKLSMgVEFSR0VUXzJORF9BUkNIX1ZBUklBTlQgOj0gYXJtdjgtYQotIyBUQVJHRVRfMk5EX0NQVV9WQVJJQU5UIDo9IGdlbmVyaWMKLSMKLSMgRE8gTk9UIFVTRQotIyBETyBOT1QgVVNFCi1UQVJHRVRfMk5EX0FSQ0hfVkFSSUFOVCA6PSBhcm12Ny1hLW5lb24KLSMgRE8gTk9UIFVTRQotIyBETyBOT1QgVVNFCi1UQVJHRVRfMk5EX0NQVV9WQVJJQU5UIDo9IGdlbmVyaWMKLSMgRE8gTk9UIFVTRQotIyBETyBOT1QgVVNFCi1lbHNlCi1UQVJHRVRfMk5EX0FSQ0hfVkFSSUFOVCA6PSBhcm12OC1hCi1UQVJHRVRfMk5EX0NQVV9WQVJJQU5UIDo9IGdlbmVyaWMKLWVuZGlmCi0KLWluY2x1ZGUgYnVpbGQvbWFrZS90YXJnZXQvYm9hcmQvQm9hcmRDb25maWdHc2lDb21tb24ubWsKLWluY2x1ZGUgYnVpbGQvbWFrZS90YXJnZXQvYm9hcmQvQm9hcmRDb25maWdFbXVDb21tb24ubWsKLQotVEFSR0VUX05PX0tFUk5FTCA6PSBmYWxzZQotQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09UIDo9IHRydWUKLQotQk9BUkRfQk9PVElNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDB4MDIwMDAwMDAKLUJPQVJEX1VTRVJEQVRBSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gNTc2NzE2ODAwCi0KLSMgV2lmaS4KLUJPQVJEX1dMQU5fREVWSUNFICAgICAgICAgICA6PSBlbXVsYXRvcgotQk9BUkRfSE9TVEFQRF9EUklWRVIgICAgICAgIDo9IE5MODAyMTEKLUJPQVJEX1dQQV9TVVBQTElDQU5UX0RSSVZFUiA6PSBOTDgwMjExCi1CT0FSRF9IT1NUQVBEX1BSSVZBVEVfTElCICAgOj0gbGliX2RyaXZlcl9jbWRfc2ltdWxhdGVkCi1CT0FSRF9XUEFfU1VQUExJQ0FOVF9QUklWQVRFX0xJQiA6PSBsaWJfZHJpdmVyX2NtZF9zaW11bGF0ZWQKLVdQQV9TVVBQTElDQU5UX1ZFUlNJT04gICAgICA6PSBWRVJfMF84X1gKLVdJRklfRFJJVkVSX0ZXX1BBVEhfUEFSQU0gICA6PSAiL2Rldi9udWxsIgotV0lGSV9EUklWRVJfRldfUEFUSF9TVEEgICAgIDo9ICIvZGV2L251bGwiCi1XSUZJX0RSSVZFUl9GV19QQVRIX0FQICAgICAgOj0gIi9kZXYvbnVsbCIKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl9hcm02NC9kZXZpY2UubWsgYi90YXJnZXQvYm9hcmQvZW11bGF0b3JfYXJtNjQvZGV2aWNlLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjIxZTY0Li4wMDAwMDAwCi0tLSBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl9hcm02NC9kZXZpY2UubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1QUk9EVUNUX1NPT05HX05BTUVTUEFDRVMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2ggIyBmb3IgbGlid2lmaS1oYWwtZW11Ci1QUk9EVUNUX1NPT05HX05BTUVTUEFDRVMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gtb3BlbmdsICMgZm9yIGdvbGRmaXNoIGRlcHMuCi0KZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl9hcm02NC9zeXN0ZW1fZXh0LnByb3AgYi90YXJnZXQvYm9hcmQvZW11bGF0b3JfYXJtNjQvc3lzdGVtX2V4dC5wcm9wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjhmODAzLi4wMDAwMDAwCi0tLSBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl9hcm02NC9zeXN0ZW1fZXh0LnByb3AKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMKLSMgc3lzdGVtLnByb3AgZm9yIGVtdWxhdG9yIGFybTY0IHNkawotIwotCi1yaWxkLmxpYnBhdGg9L3ZlbmRvci9saWI2NC9saWJyZWZlcmVuY2UtcmlsLnNvCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2L0JvYXJkQ29uZmlnLm1rIGIvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX3g4Ni9Cb2FyZENvbmZpZy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY3OTE2Ni4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2L0JvYXJkQ29uZmlnLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyB4ODYgZW11bGF0b3Igc3BlY2lmaWMgZGVmaW5pdGlvbnMKLVRBUkdFVF9DUFVfQUJJIDo9IHg4NgotVEFSR0VUX0FSQ0ggOj0geDg2Ci1UQVJHRVRfQVJDSF9WQVJJQU5UIDo9IHg4NgotCi1UQVJHRVRfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKLQotaW5jbHVkZSBidWlsZC9tYWtlL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ0dzaUNvbW1vbi5tawotaW5jbHVkZSBidWlsZC9tYWtlL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ0VtdUNvbW1vbi5tawotCi0jIFJlc2l6ZSB0byA0RyB0byBhY2NvbW1vZGF0ZSBBU0FOIGFuZCBDVFMKLUJPQVJEX1VTRVJEQVRBSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gNDI5NDk2NzI5NgotCi1CT0FSRF9TRVBPTElDWV9ESVJTICs9IGRldmljZS9nZW5lcmljL2dvbGRmaXNoL3NlcG9saWN5L3g4NgotCi0jIFdpZmkuCi1CT0FSRF9XTEFOX0RFVklDRSAgICAgICAgICAgOj0gZW11bGF0b3IKLUJPQVJEX0hPU1RBUERfRFJJVkVSICAgICAgICA6PSBOTDgwMjExCi1CT0FSRF9XUEFfU1VQUExJQ0FOVF9EUklWRVIgOj0gTkw4MDIxMQotQk9BUkRfSE9TVEFQRF9QUklWQVRFX0xJQiAgIDo9IGxpYl9kcml2ZXJfY21kX3NpbXVsYXRlZAotQk9BUkRfV1BBX1NVUFBMSUNBTlRfUFJJVkFURV9MSUIgOj0gbGliX2RyaXZlcl9jbWRfc2ltdWxhdGVkCi1XUEFfU1VQUExJQ0FOVF9WRVJTSU9OICAgICAgOj0gVkVSXzBfOF9YCi1XSUZJX0RSSVZFUl9GV19QQVRIX1BBUkFNICAgOj0gIi9kZXYvbnVsbCIKLVdJRklfRFJJVkVSX0ZXX1BBVEhfU1RBICAgICA6PSAiL2Rldi9udWxsIgotV0lGSV9EUklWRVJfRldfUEFUSF9BUCAgICAgIDo9ICIvZGV2L251bGwiCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2L2RldmljZS5tayBiL3RhcmdldC9ib2FyZC9lbXVsYXRvcl94ODYvZGV2aWNlLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTlkOGRhLi4wMDAwMDAwCi0tLSBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl94ODYvZGV2aWNlLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotUFJPRFVDVF9TT09OR19OQU1FU1BBQ0VTICs9IGRldmljZS9nZW5lcmljL2dvbGRmaXNoICMgZm9yIGxpYndpZmktaGFsLWVtdQotUFJPRFVDVF9TT09OR19OQU1FU1BBQ0VTICs9IGRldmljZS9nZW5lcmljL2dvbGRmaXNoLW9wZW5nbCAjIGZvciBnb2xkZmlzaCBkZXBzLgotCi1pZmRlZiBORVRfRVRIMF9TVEFSVE9OQk9PVAotICBQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IG5ldC5ldGgwLnN0YXJ0b25ib290PTEKLWVuZGlmCi0KLSMgRW5zdXJlIHdlIHBhY2thZ2UgdGhlIEJJT1MgZmlsZXMgdG9vLgotUFJPRFVDVF9IT1NUX1BBQ0tBR0VTICs9IFwKLQliaW9zLmJpbiBcCi0JdmdhYmlvcy1jaXJydXMuYmluIFwKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl94ODYvc3lzdGVtX2V4dC5wcm9wIGIvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX3g4Ni9zeXN0ZW1fZXh0LnByb3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ODI5ZjMuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX3g4Ni9zeXN0ZW1fZXh0LnByb3AKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMKLSMgc3lzdGVtLnByb3AgZm9yIGdlbmVyaWMgc2RrCi0jCi0KLXJpbGQubGlicGF0aD0vdmVuZG9yL2xpYi9saWJyZWZlcmVuY2UtcmlsLnNvCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2XzY0L0JvYXJkQ29uZmlnLm1rIGIvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX3g4Nl82NC9Cb2FyZENvbmZpZy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjljYmQ4YS4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2XzY0L0JvYXJkQ29uZmlnLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyB4ODZfNjQgZW11bGF0b3Igc3BlY2lmaWMgZGVmaW5pdGlvbnMKLVRBUkdFVF9DUFVfQUJJIDo9IHg4Nl82NAotVEFSR0VUX0FSQ0ggOj0geDg2XzY0Ci1UQVJHRVRfQVJDSF9WQVJJQU5UIDo9IHg4Nl82NAotCi1UQVJHRVRfMk5EX0NQVV9BQkkgOj0geDg2Ci1UQVJHRVRfMk5EX0FSQ0ggOj0geDg2Ci1UQVJHRVRfMk5EX0FSQ0hfVkFSSUFOVCA6PSB4ODZfNjQKLQotVEFSR0VUX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCi1pbmNsdWRlIGJ1aWxkL21ha2UvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnR3NpQ29tbW9uLm1rCi1pbmNsdWRlIGJ1aWxkL21ha2UvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnRW11Q29tbW9uLm1rCi0KLUJPQVJEX1VTRVJEQVRBSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gNTc2NzE2ODAwCi0KLUJPQVJEX1NFUE9MSUNZX0RJUlMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvc2Vwb2xpY3kveDg2Ci0KLSMgV2lmaS4KLUJPQVJEX1dMQU5fREVWSUNFICAgICAgICAgICA6PSBlbXVsYXRvcgotQk9BUkRfSE9TVEFQRF9EUklWRVIgICAgICAgIDo9IE5MODAyMTEKLUJPQVJEX1dQQV9TVVBQTElDQU5UX0RSSVZFUiA6PSBOTDgwMjExCi1CT0FSRF9IT1NUQVBEX1BSSVZBVEVfTElCICAgOj0gbGliX2RyaXZlcl9jbWRfc2ltdWxhdGVkCi1CT0FSRF9XUEFfU1VQUExJQ0FOVF9QUklWQVRFX0xJQiA6PSBsaWJfZHJpdmVyX2NtZF9zaW11bGF0ZWQKLVdQQV9TVVBQTElDQU5UX1ZFUlNJT04gICAgICA6PSBWRVJfMF84X1gKLVdJRklfRFJJVkVSX0ZXX1BBVEhfUEFSQU0gICA6PSAiL2Rldi9udWxsIgotV0lGSV9EUklWRVJfRldfUEFUSF9TVEEgICAgIDo9ICIvZGV2L251bGwiCi1XSUZJX0RSSVZFUl9GV19QQVRIX0FQICAgICAgOj0gIi9kZXYvbnVsbCIKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl94ODZfNjQvZGV2aWNlLm1rIGIvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX3g4Nl82NC9kZXZpY2UubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhOWQ4ZGEuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX3g4Nl82NC9kZXZpY2UubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1QUk9EVUNUX1NPT05HX05BTUVTUEFDRVMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2ggIyBmb3IgbGlid2lmaS1oYWwtZW11Ci1QUk9EVUNUX1NPT05HX05BTUVTUEFDRVMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gtb3BlbmdsICMgZm9yIGdvbGRmaXNoIGRlcHMuCi0KLWlmZGVmIE5FVF9FVEgwX1NUQVJUT05CT09UCi0gIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gbmV0LmV0aDAuc3RhcnRvbmJvb3Q9MQotZW5kaWYKLQotIyBFbnN1cmUgd2UgcGFja2FnZSB0aGUgQklPUyBmaWxlcyB0b28uCi1QUk9EVUNUX0hPU1RfUEFDS0FHRVMgKz0gXAotCWJpb3MuYmluIFwKLQl2Z2FiaW9zLWNpcnJ1cy5iaW4gXApkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX3g4Nl82NC9zeXN0ZW1fZXh0LnByb3AgYi90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2XzY0L3N5c3RlbV9leHQucHJvcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ5ZDE3My4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2XzY0L3N5c3RlbV9leHQucHJvcAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIwotIyBzeXN0ZW0ucHJvcCBmb3IgZ2VuZXJpYyBzZGsKLSMKLQotcmlsZC5saWJwYXRoPS92ZW5kb3IvbGliNjQvbGlicmVmZXJlbmNlLXJpbC5zbwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX3g4Nl82NF9hcm02NC9Cb2FyZENvbmZpZy5tayBiL3RhcmdldC9ib2FyZC9lbXVsYXRvcl94ODZfNjRfYXJtNjQvQm9hcmRDb25maWcubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI2YjYxYTYuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX3g4Nl82NF9hcm02NC9Cb2FyZENvbmZpZy5taworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgeDg2XzY0IGVtdWxhdG9yIHNwZWNpZmljIGRlZmluaXRpb25zCi1UQVJHRVRfQ1BVX0FCSSA6PSB4ODZfNjQKLVRBUkdFVF9BUkNIIDo9IHg4Nl82NAotVEFSR0VUX0FSQ0hfVkFSSUFOVCA6PSB4ODZfNjQKLQotVEFSR0VUXzJORF9DUFVfQUJJIDo9IHg4NgotVEFSR0VUXzJORF9BUkNIIDo9IHg4NgotVEFSR0VUXzJORF9BUkNIX1ZBUklBTlQgOj0geDg2XzY0Ci0KLVRBUkdFVF9OQVRJVkVfQlJJREdFX0FSQ0ggOj0gYXJtNjQKLVRBUkdFVF9OQVRJVkVfQlJJREdFX0FSQ0hfVkFSSUFOVCA6PSBhcm12OC1hCi1UQVJHRVRfTkFUSVZFX0JSSURHRV9DUFVfVkFSSUFOVCA6PSBnZW5lcmljCi1UQVJHRVRfTkFUSVZFX0JSSURHRV9BQkkgOj0gYXJtNjQtdjhhCi0KLVRBUkdFVF9OQVRJVkVfQlJJREdFXzJORF9BUkNIIDo9IGFybQotVEFSR0VUX05BVElWRV9CUklER0VfMk5EX0FSQ0hfVkFSSUFOVCA6PSBhcm12Ny1hLW5lb24KLVRBUkdFVF9OQVRJVkVfQlJJREdFXzJORF9DUFVfVkFSSUFOVCA6PSBnZW5lcmljCi1UQVJHRVRfTkFUSVZFX0JSSURHRV8yTkRfQUJJIDo9IGFybWVhYmktdjdhIGFybWVhYmkKLQotQlVJTERfQlJPS0VOX0RVUF9SVUxFUyA6PSB0cnVlCi0KLVRBUkdFVF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQotCi1pbmNsdWRlIGJ1aWxkL21ha2UvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnTWFpbmxpbmVDb21tb24ubWsKLWluY2x1ZGUgYnVpbGQvbWFrZS90YXJnZXQvYm9hcmQvQm9hcmRDb25maWdFbXVDb21tb24ubWsKLQotIyB0aGUgc2V0dGluZ3MgZGlmZmVyIGZyb20gQm9hcmRDb25maWdNYWlubGluZUNvbW1vbi5tawotQk9BUkRfVVNFU19TWVNURU1fT1RIRVJfT0RFWCA6PQotCi0jIFJlc2l6ZSB0byA0RyB0byBhY2NvbW1vZGF0ZSBBU0FOIGFuZCBDVFMKLUJPQVJEX1VTRVJEQVRBSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gNDI5NDk2NzI5NgotCi1CT0FSRF9TRVBPTElDWV9ESVJTICs9IGRldmljZS9nZW5lcmljL2dvbGRmaXNoL3NlcG9saWN5L3g4NgotCi0jIFdpZmkuCi1CT0FSRF9XTEFOX0RFVklDRSAgICAgICAgICAgOj0gZW11bGF0b3IKLUJPQVJEX0hPU1RBUERfRFJJVkVSICAgICAgICA6PSBOTDgwMjExCi1CT0FSRF9XUEFfU1VQUExJQ0FOVF9EUklWRVIgOj0gTkw4MDIxMQotQk9BUkRfSE9TVEFQRF9QUklWQVRFX0xJQiAgIDo9IGxpYl9kcml2ZXJfY21kX3NpbXVsYXRlZAotQk9BUkRfV1BBX1NVUFBMSUNBTlRfUFJJVkFURV9MSUIgOj0gbGliX2RyaXZlcl9jbWRfc2ltdWxhdGVkCi1XUEFfU1VQUExJQ0FOVF9WRVJTSU9OICAgICAgOj0gVkVSXzBfOF9YCi1XSUZJX0RSSVZFUl9GV19QQVRIX1BBUkFNICAgOj0gIi9kZXYvbnVsbCIKLVdJRklfRFJJVkVSX0ZXX1BBVEhfU1RBICAgICA6PSAiL2Rldi9udWxsIgotV0lGSV9EUklWRVJfRldfUEFUSF9BUCAgICAgIDo9ICIvZGV2L251bGwiCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2XzY0X2FybTY0L2RldmljZS5tayBiL3RhcmdldC9ib2FyZC9lbXVsYXRvcl94ODZfNjRfYXJtNjQvZGV2aWNlLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZjAyM2ViLi4wMDAwMDAwCi0tLSBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl94ODZfNjRfYXJtNjQvZGV2aWNlLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotUFJPRFVDVF9TT09OR19OQU1FU1BBQ0VTICs9IGRldmljZS9nZW5lcmljL2dvbGRmaXNoICMgZm9yIGxpYndpZmktaGFsLWVtdQotUFJPRFVDVF9TT09OR19OQU1FU1BBQ0VTICs9IGRldmljZS9nZW5lcmljL2dvbGRmaXNoLW9wZW5nbCAjIGZvciBnb2xkZmlzaCBkZXBzLgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX3g4Nl82NF9hcm02NC9zeXN0ZW1fZXh0LnByb3AgYi90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2XzY0X2FybTY0L3N5c3RlbV9leHQucHJvcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ5ZDE3My4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2XzY0X2FybTY0L3N5c3RlbV9leHQucHJvcAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIwotIyBzeXN0ZW0ucHJvcCBmb3IgZ2VuZXJpYyBzZGsKLSMKLQotcmlsZC5saWJwYXRoPS92ZW5kb3IvbGliNjQvbGlicmVmZXJlbmNlLXJpbC5zbwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX3g4Nl9hcm0vQm9hcmRDb25maWcubWsgYi90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2X2FybS9Cb2FyZENvbmZpZy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFmZGJjOC4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2X2FybS9Cb2FyZENvbmZpZy5taworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgeDg2IGVtdWxhdG9yIHNwZWNpZmljIGRlZmluaXRpb25zCi1UQVJHRVRfQ1BVX0FCSSA6PSB4ODYKLVRBUkdFVF9BUkNIIDo9IHg4NgotVEFSR0VUX0FSQ0hfVkFSSUFOVCA6PSB4ODYKLQotVEFSR0VUX05BVElWRV9CUklER0VfQVJDSCA6PSBhcm0KLVRBUkdFVF9OQVRJVkVfQlJJREdFX0FSQ0hfVkFSSUFOVCA6PSBhcm12Ny1hLW5lb24KLVRBUkdFVF9OQVRJVkVfQlJJREdFX0NQVV9WQVJJQU5UIDo9IGdlbmVyaWMKLVRBUkdFVF9OQVRJVkVfQlJJREdFX0FCSSA6PSBhcm1lYWJpLXY3YSBhcm1lYWJpCi0KLUJVSUxEX0JST0tFTl9EVVBfUlVMRVMgOj0gdHJ1ZQotCi0jCi0jIFRoZSBpbmNsdXNpb24gb3JkZXIgYmVsb3cgaXMgaW1wb3J0YW50LgotIyBUaGUgc2V0dGluZ3MgaW4gbGF0dGVyIG1ha2VmaWxlcyBvdmVyd3JpdGUgdGhvc2UgaW4gdGhlIGZvcm1lci4KLSMKLWluY2x1ZGUgYnVpbGQvbWFrZS90YXJnZXQvYm9hcmQvQm9hcmRDb25maWdNYWlubGluZUNvbW1vbi5tawotaW5jbHVkZSBidWlsZC9tYWtlL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ0VtdUNvbW1vbi5tawotCi0jIHRoZSBzZXR0aW5ncyBkaWZmZXIgZnJvbSBCb2FyZENvbmZpZ01haW5saW5lQ29tbW9uLm1rCi1CT0FSRF9VU0VTX1NZU1RFTV9PVEhFUl9PREVYIDo9Ci0KLSMgUmVzaXplIHRvIDRHIHRvIGFjY29tbW9kYXRlIEFTQU4gYW5kIENUUwotQk9BUkRfVVNFUkRBVEFJTUFHRV9QQVJUSVRJT05fU0laRSA6PSA0Mjk0OTY3Mjk2Ci0KLUJPQVJEX1NFUE9MSUNZX0RJUlMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvc2Vwb2xpY3kveDg2Ci0KLSMgV2lmaS4KLUJPQVJEX1dMQU5fREVWSUNFICAgICAgICAgICA6PSBlbXVsYXRvcgotQk9BUkRfSE9TVEFQRF9EUklWRVIgICAgICAgIDo9IE5MODAyMTEKLUJPQVJEX1dQQV9TVVBQTElDQU5UX0RSSVZFUiA6PSBOTDgwMjExCi1CT0FSRF9IT1NUQVBEX1BSSVZBVEVfTElCICAgOj0gbGliX2RyaXZlcl9jbWRfc2ltdWxhdGVkCi1CT0FSRF9XUEFfU1VQUExJQ0FOVF9QUklWQVRFX0xJQiA6PSBsaWJfZHJpdmVyX2NtZF9zaW11bGF0ZWQKLVdQQV9TVVBQTElDQU5UX1ZFUlNJT04gICAgICA6PSBWRVJfMF84X1gKLVdJRklfRFJJVkVSX0ZXX1BBVEhfUEFSQU0gICA6PSAiL2Rldi9udWxsIgotV0lGSV9EUklWRVJfRldfUEFUSF9TVEEgICAgIDo9ICIvZGV2L251bGwiCi1XSUZJX0RSSVZFUl9GV19QQVRIX0FQICAgICAgOj0gIi9kZXYvbnVsbCIKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9lbXVsYXRvcl94ODZfYXJtL2RldmljZS5tayBiL3RhcmdldC9ib2FyZC9lbXVsYXRvcl94ODZfYXJtL2RldmljZS5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYwMjNlYi4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2X2FybS9kZXZpY2UubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1QUk9EVUNUX1NPT05HX05BTUVTUEFDRVMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2ggIyBmb3IgbGlid2lmaS1oYWwtZW11Ci1QUk9EVUNUX1NPT05HX05BTUVTUEFDRVMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gtb3BlbmdsICMgZm9yIGdvbGRmaXNoIGRlcHMuCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2X2FybS9zeXN0ZW1fZXh0LnByb3AgYi90YXJnZXQvYm9hcmQvZW11bGF0b3JfeDg2X2FybS9zeXN0ZW1fZXh0LnByb3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ODI5ZjMuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2VtdWxhdG9yX3g4Nl9hcm0vc3lzdGVtX2V4dC5wcm9wCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jCi0jIHN5c3RlbS5wcm9wIGZvciBnZW5lcmljIHNkawotIwotCi1yaWxkLmxpYnBhdGg9L3ZlbmRvci9saWIvbGlicmVmZXJlbmNlLXJpbC5zbwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvQm9hcmRDb25maWcubWsgYi90YXJnZXQvYm9hcmQvZ2VuZXJpYy9Cb2FyZENvbmZpZy5tawppbmRleCA4N2MxNmRhLi42NzIwZGRiIDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9Cb2FyZENvbmZpZy5taworKysgYi90YXJnZXQvYm9hcmQvZ2VuZXJpYy9Cb2FyZENvbmZpZy5tawpAQCAtMzAsMjAgKzMwLDMgQEAKIFRBUkdFVF9DUFVfQUJJMiA6PSBhcm1lYWJpCiAKIGluY2x1ZGUgYnVpbGQvbWFrZS90YXJnZXQvYm9hcmQvQm9hcmRDb25maWdHc2lDb21tb24ubWsKLQotaWZuZGVmIEJVSUxESU5HX0dTSQotaW5jbHVkZSBidWlsZC9tYWtlL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ0VtdUNvbW1vbi5tawotCi1CT0FSRF9VU0VSREFUQUlNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDU3NjcxNjgwMAotCi0jIFdpZmkuCi1CT0FSRF9XTEFOX0RFVklDRSAgICAgICAgICAgOj0gZW11bGF0b3IKLUJPQVJEX0hPU1RBUERfRFJJVkVSICAgICAgICA6PSBOTDgwMjExCi1CT0FSRF9XUEFfU1VQUExJQ0FOVF9EUklWRVIgOj0gTkw4MDIxMQotQk9BUkRfSE9TVEFQRF9QUklWQVRFX0xJQiAgIDo9IGxpYl9kcml2ZXJfY21kX3NpbXVsYXRlZAotQk9BUkRfV1BBX1NVUFBMSUNBTlRfUFJJVkFURV9MSUIgOj0gbGliX2RyaXZlcl9jbWRfc2ltdWxhdGVkCi1XUEFfU1VQUExJQ0FOVF9WRVJTSU9OICAgICAgOj0gVkVSXzBfOF9YCi1XSUZJX0RSSVZFUl9GV19QQVRIX1BBUkFNICAgOj0gIi9kZXYvbnVsbCIKLVdJRklfRFJJVkVSX0ZXX1BBVEhfU1RBICAgICA6PSAiL2Rldi9udWxsIgotV0lGSV9EUklWRVJfRldfUEFUSF9BUCAgICAgIDo9ICIvZGV2L251bGwiCi1lbmRpZgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvZGV2aWNlLm1rIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvZGV2aWNlLm1rCmluZGV4IDc2MjQyYzkuLjc2ZWRmNmIgMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljL2RldmljZS5taworKysgYi90YXJnZXQvYm9hcmQvZ2VuZXJpYy9kZXZpY2UubWsKQEAgLTE0LDUgKzE0LDMgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVBST0RVQ1RfU09PTkdfTkFNRVNQQUNFUyArPSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaCAjIGZvciBsaWJ3aWZpLWhhbC1lbXUKLVBST0RVQ1RfU09PTkdfTkFNRVNQQUNFUyArPSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC1vcGVuZ2wgIyBmb3IgZ29sZGZpc2ggZGVwcy4KZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljXzY0Yml0b25seV94ODZfNjQvQm9hcmRDb25maWcubWsgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY182NGJpdG9ubHlfeDg2XzY0L0JvYXJkQ29uZmlnLm1rCmluZGV4IGEyNDBlYWIuLmExMjllYTAgMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljXzY0Yml0b25seV94ODZfNjQvQm9hcmRDb25maWcubWsKKysrIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfNjRiaXRvbmx5X3g4Nl82NC9Cb2FyZENvbmZpZy5tawpAQCAtMjgsMjMgKzI4LDMgQEAKIFRBUkdFVF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQogCiBpbmNsdWRlIGJ1aWxkL21ha2UvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnR3NpQ29tbW9uLm1rCi0KLWlmbmRlZiBCVUlMRElOR19HU0kKLWluY2x1ZGUgYnVpbGQvbWFrZS90YXJnZXQvYm9hcmQvQm9hcmRDb25maWdFbXVDb21tb24ubWsKLQotQk9BUkRfVVNFUkRBVEFJTUFHRV9QQVJUSVRJT05fU0laRSA6PSA1NzY3MTY4MDAKLQotQk9BUkRfU0VQT0xJQ1lfRElSUyArPSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9zZXBvbGljeS94ODYKLQotIyBXaWZpLgotQk9BUkRfV0xBTl9ERVZJQ0UgICAgICAgICAgIDo9IGVtdWxhdG9yCi1CT0FSRF9IT1NUQVBEX0RSSVZFUiAgICAgICAgOj0gTkw4MDIxMQotQk9BUkRfV1BBX1NVUFBMSUNBTlRfRFJJVkVSIDo9IE5MODAyMTEKLUJPQVJEX0hPU1RBUERfUFJJVkFURV9MSUIgICA6PSBsaWJfZHJpdmVyX2NtZF9zaW11bGF0ZWQKLUJPQVJEX1dQQV9TVVBQTElDQU5UX1BSSVZBVEVfTElCIDo9IGxpYl9kcml2ZXJfY21kX3NpbXVsYXRlZAotV1BBX1NVUFBMSUNBTlRfVkVSU0lPTiAgICAgIDo9IFZFUl8wXzhfWAotV0lGSV9EUklWRVJfRldfUEFUSF9QQVJBTSAgIDo9ICIvZGV2L251bGwiCi1XSUZJX0RSSVZFUl9GV19QQVRIX1NUQSAgICAgOj0gIi9kZXYvbnVsbCIKLVdJRklfRFJJVkVSX0ZXX1BBVEhfQVAgICAgICA6PSAiL2Rldi9udWxsIgotCi1lbmRpZiAjICFCVUlMRElOR19HU0kKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljXzY0Yml0b25seV94ODZfNjQvZGV2aWNlLm1rIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfNjRiaXRvbmx5X3g4Nl82NC9kZXZpY2UubWsKaW5kZXggYmI0OTA1Ny4uNWVkZjVlMCAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfNjRiaXRvbmx5X3g4Nl82NC9kZXZpY2UubWsKKysrIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfNjRiaXRvbmx5X3g4Nl82NC9kZXZpY2UubWsKQEAgLTE3LDggKzE3LDMgQEAKIGlmZGVmIE5FVF9FVEgwX1NUQVJUT05CT09UCiAgIFBST0RVQ1RfUFJPUEVSVFlfT1ZFUlJJREVTICs9IG5ldC5ldGgwLnN0YXJ0b25ib290PTEKIGVuZGlmCi0KLSMgRW5zdXJlIHdlIHBhY2thZ2UgdGhlIEJJT1MgZmlsZXMgdG9vLgotUFJPRFVDVF9IT1NUX1BBQ0tBR0VTICs9IFwKLSAgICBiaW9zLmJpbiBcCi0gICAgdmdhYmlvcy1jaXJydXMuYmluIFwKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Ni9Cb2FyZENvbmZpZy5tayBiL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Ni9Cb2FyZENvbmZpZy5tawppbmRleCA0N2ZkMzg0Li4yNmJlZGU4IDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODYvQm9hcmRDb25maWcubWsKKysrIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2L0JvYXJkQ29uZmlnLm1rCkBAIC0xOSwyMyArMTksMyBAQAogVEFSR0VUX0FSQ0hfVkFSSUFOVCA6PSB4ODYKIAogaW5jbHVkZSBidWlsZC9tYWtlL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ0dzaUNvbW1vbi5tawotCi1pZm5kZWYgQlVJTERJTkdfR1NJCi1pbmNsdWRlIGJ1aWxkL21ha2UvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnRW11Q29tbW9uLm1rCi0KLSMgUmVzaXplIHRvIDRHIHRvIGFjY29tb2RhdGUgQVNBTiBhbmQgQ1RTCi1CT0FSRF9VU0VSREFUQUlNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDQyOTQ5NjcyOTYKLQotQk9BUkRfU0VQT0xJQ1lfRElSUyArPSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9zZXBvbGljeS94ODYKLQotIyBXaWZpLgotQk9BUkRfV0xBTl9ERVZJQ0UgICAgICAgICAgIDo9IGVtdWxhdG9yCi1CT0FSRF9IT1NUQVBEX0RSSVZFUiAgICAgICAgOj0gTkw4MDIxMQotQk9BUkRfV1BBX1NVUFBMSUNBTlRfRFJJVkVSIDo9IE5MODAyMTEKLUJPQVJEX0hPU1RBUERfUFJJVkFURV9MSUIgICA6PSBsaWJfZHJpdmVyX2NtZF9zaW11bGF0ZWQKLUJPQVJEX1dQQV9TVVBQTElDQU5UX1BSSVZBVEVfTElCIDo9IGxpYl9kcml2ZXJfY21kX3NpbXVsYXRlZAotV1BBX1NVUFBMSUNBTlRfVkVSU0lPTiAgICAgIDo9IFZFUl8wXzhfWAotV0lGSV9EUklWRVJfRldfUEFUSF9QQVJBTSAgIDo9ICIvZGV2L251bGwiCi1XSUZJX0RSSVZFUl9GV19QQVRIX1NUQSAgICAgOj0gIi9kZXYvbnVsbCIKLVdJRklfRFJJVkVSX0ZXX1BBVEhfQVAgICAgICA6PSAiL2Rldi9udWxsIgotZW5kaWYKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Ni9kZXZpY2UubWsgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODYvZGV2aWNlLm1rCmluZGV4IDVhZDAwOGYuLjI3ZmIzMTAgMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Ni9kZXZpY2UubWsKKysrIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2L2RldmljZS5tawpAQCAtMTQsMTQgKzE0LDYgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVBST0RVQ1RfU09PTkdfTkFNRVNQQUNFUyArPSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaCAjIGZvciBsaWJ3aWZpLWhhbC1lbXUKLVBST0RVQ1RfU09PTkdfTkFNRVNQQUNFUyArPSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC1vcGVuZ2wgIyBmb3IgZ29sZGZpc2ggZGVwcy4KLQogaWZkZWYgTkVUX0VUSDBfU1RBUlRPTkJPT1QKICAgUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSBuZXQuZXRoMC5zdGFydG9uYm9vdD0xCiBlbmRpZgotCi0jIEVuc3VyZSB3ZSBwYWNrYWdlIHRoZSBCSU9TIGZpbGVzIHRvby4KLVBST0RVQ1RfSE9TVF9QQUNLQUdFUyArPSBcCi0JYmlvcy5iaW4gXAotCXZnYWJpb3MtY2lycnVzLmJpbiBcCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODZfNjQvQm9hcmRDb25maWcubWsgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODZfNjQvQm9hcmRDb25maWcubWsKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAzNjEzNmY0Li42NGRhNTc4Ci0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Nl82NC9Cb2FyZENvbmZpZy5taworKysgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODZfNjQvQm9hcmRDb25maWcubWsKQEAgLTI4LDIzICsyOCwzIEBACiBUQVJHRVRfRFlOQU1JQ182NF8zMl9EUk1TRVJWRVIgOj0gdHJ1ZQogCiBpbmNsdWRlIGJ1aWxkL21ha2UvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnR3NpQ29tbW9uLm1rCi0KLWlmbmRlZiBCVUlMRElOR19HU0kKLWluY2x1ZGUgYnVpbGQvbWFrZS90YXJnZXQvYm9hcmQvQm9hcmRDb25maWdFbXVDb21tb24ubWsKLQotQk9BUkRfVVNFUkRBVEFJTUFHRV9QQVJUSVRJT05fU0laRSA6PSA1NzY3MTY4MDAKLQotQk9BUkRfU0VQT0xJQ1lfRElSUyArPSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9zZXBvbGljeS94ODYKLQotIyBXaWZpLgotQk9BUkRfV0xBTl9ERVZJQ0UgICAgICAgICAgIDo9IGVtdWxhdG9yCi1CT0FSRF9IT1NUQVBEX0RSSVZFUiAgICAgICAgOj0gTkw4MDIxMQotQk9BUkRfV1BBX1NVUFBMSUNBTlRfRFJJVkVSIDo9IE5MODAyMTEKLUJPQVJEX0hPU1RBUERfUFJJVkFURV9MSUIgICA6PSBsaWJfZHJpdmVyX2NtZF9zaW11bGF0ZWQKLUJPQVJEX1dQQV9TVVBQTElDQU5UX1BSSVZBVEVfTElCIDo9IGxpYl9kcml2ZXJfY21kX3NpbXVsYXRlZAotV1BBX1NVUFBMSUNBTlRfVkVSU0lPTiAgICAgIDo9IFZFUl8wXzhfWAotV0lGSV9EUklWRVJfRldfUEFUSF9QQVJBTSAgIDo9ICIvZGV2L251bGwiCi1XSUZJX0RSSVZFUl9GV19QQVRIX1NUQSAgICAgOj0gIi9kZXYvbnVsbCIKLVdJRklfRFJJVkVSX0ZXX1BBVEhfQVAgICAgICA6PSAiL2Rldi9udWxsIgotCi1lbmRpZiAjICFCVUlMRElOR19HU0kKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Nl82NF9hcm02NC9Cb2FyZENvbmZpZy5tayBiL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Nl82NF9hcm02NC9Cb2FyZENvbmZpZy5tawpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGY1MjgyOTQuLjgxOGVjNDQKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2XzY0X2FybTY0L0JvYXJkQ29uZmlnLm1rCisrKyBiL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Nl82NF9hcm02NC9Cb2FyZENvbmZpZy5tawpAQCAtMTMsNyArMTMsNiBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotIyB4ODZfNjQgZW11bGF0b3Igc3BlY2lmaWMgZGVmaW5pdGlvbnMKIFRBUkdFVF9DUFVfQUJJIDo9IHg4Nl82NAogVEFSR0VUX0FSQ0ggOj0geDg2XzY0CiBUQVJHRVRfQVJDSF9WQVJJQU5UIDo9IHg4Nl82NApAQCAtMzcsMjMgKzM2LDkgQEAKIFRBUkdFVF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQogCiBpbmNsdWRlIGJ1aWxkL21ha2UvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnTWFpbmxpbmVDb21tb24ubWsKLWluY2x1ZGUgYnVpbGQvbWFrZS90YXJnZXQvYm9hcmQvQm9hcmRDb25maWdFbXVDb21tb24ubWsKIAogIyB0aGUgc2V0dGluZ3MgZGlmZmVyIGZyb20gQm9hcmRDb25maWdNYWlubGluZUNvbW1vbi5tawogQk9BUkRfVVNFU19TWVNURU1fT1RIRVJfT0RFWCA6PQogCiAjIFJlc2l6ZSB0byA0RyB0byBhY2NvbW1vZGF0ZSBBU0FOIGFuZCBDVFMKIEJPQVJEX1VTRVJEQVRBSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gNDI5NDk2NzI5NgotCi1CT0FSRF9TRVBPTElDWV9ESVJTICs9IGRldmljZS9nZW5lcmljL2dvbGRmaXNoL3NlcG9saWN5L3g4NgotCi0jIFdpZmkuCi1CT0FSRF9XTEFOX0RFVklDRSAgICAgICAgICAgOj0gZW11bGF0b3IKLUJPQVJEX0hPU1RBUERfRFJJVkVSICAgICAgICA6PSBOTDgwMjExCi1CT0FSRF9XUEFfU1VQUExJQ0FOVF9EUklWRVIgOj0gTkw4MDIxMQotQk9BUkRfSE9TVEFQRF9QUklWQVRFX0xJQiAgIDo9IGxpYl9kcml2ZXJfY21kX3NpbXVsYXRlZAotQk9BUkRfV1BBX1NVUFBMSUNBTlRfUFJJVkFURV9MSUIgOj0gbGliX2RyaXZlcl9jbWRfc2ltdWxhdGVkCi1XUEFfU1VQUExJQ0FOVF9WRVJTSU9OICAgICAgOj0gVkVSXzBfOF9YCi1XSUZJX0RSSVZFUl9GV19QQVRIX1BBUkFNICAgOj0gIi9kZXYvbnVsbCIKLVdJRklfRFJJVkVSX0ZXX1BBVEhfU1RBICAgICA6PSAiL2Rldi9udWxsIgotV0lGSV9EUklWRVJfRldfUEFUSF9BUCAgICAgIDo9ICIvZGV2L251bGwiCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODZfNjRfYXJtNjQvZGV2aWNlLm1rIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2XzY0X2FybTY0L2RldmljZS5tawpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDc2MjQyYzkuLjc2ZWRmNmIKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2XzY0X2FybTY0L2RldmljZS5taworKysgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODZfNjRfYXJtNjQvZGV2aWNlLm1rCkBAIC0xNCw1ICsxNCwzIEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1QUk9EVUNUX1NPT05HX05BTUVTUEFDRVMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2ggIyBmb3IgbGlid2lmaS1oYWwtZW11Ci1QUk9EVUNUX1NPT05HX05BTUVTUEFDRVMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gtb3BlbmdsICMgZm9yIGdvbGRmaXNoIGRlcHMuCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODZfYXJtL0JvYXJkQ29uZmlnLm1rIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2X2FybS9Cb2FyZENvbmZpZy5tawppbmRleCBmNjU4OWIwLi42MmJiNWViIDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODZfYXJtL0JvYXJkQ29uZmlnLm1rCisrKyBiL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Nl9hcm0vQm9hcmRDb25maWcubWsKQEAgLTEzLDcgKzEzLDYgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLSMgeDg2IGVtdWxhdG9yIHNwZWNpZmljIGRlZmluaXRpb25zCiBUQVJHRVRfQ1BVX0FCSSA6PSB4ODYKIFRBUkdFVF9BUkNIIDo9IHg4NgogVEFSR0VUX0FSQ0hfVkFSSUFOVCA6PSB4ODYKQEAgLTMwLDIzICsyOSw5IEBACiAjIFRoZSBzZXR0aW5ncyBpbiBsYXR0ZXIgbWFrZWZpbGVzIG92ZXJ3cml0ZSB0aG9zZSBpbiB0aGUgZm9ybWVyLgogIwogaW5jbHVkZSBidWlsZC9tYWtlL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ01haW5saW5lQ29tbW9uLm1rCi1pbmNsdWRlIGJ1aWxkL21ha2UvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnRW11Q29tbW9uLm1rCiAKICMgdGhlIHNldHRpbmdzIGRpZmZlciBmcm9tIEJvYXJkQ29uZmlnTWFpbmxpbmVDb21tb24ubWsKIEJPQVJEX1VTRVNfU1lTVEVNX09USEVSX09ERVggOj0KIAogIyBSZXNpemUgdG8gNEcgdG8gYWNjb21vZGF0ZSBBU0FOIGFuZCBDVFMKIEJPQVJEX1VTRVJEQVRBSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gNDI5NDk2NzI5NgotCi1CT0FSRF9TRVBPTElDWV9ESVJTICs9IGRldmljZS9nZW5lcmljL2dvbGRmaXNoL3NlcG9saWN5L3g4NgotCi0jIFdpZmkuCi1CT0FSRF9XTEFOX0RFVklDRSAgICAgICAgICAgOj0gZW11bGF0b3IKLUJPQVJEX0hPU1RBUERfRFJJVkVSICAgICAgICA6PSBOTDgwMjExCi1CT0FSRF9XUEFfU1VQUExJQ0FOVF9EUklWRVIgOj0gTkw4MDIxMQotQk9BUkRfSE9TVEFQRF9QUklWQVRFX0xJQiAgIDo9IGxpYl9kcml2ZXJfY21kX3NpbXVsYXRlZAotQk9BUkRfV1BBX1NVUFBMSUNBTlRfUFJJVkFURV9MSUIgOj0gbGliX2RyaXZlcl9jbWRfc2ltdWxhdGVkCi1XUEFfU1VQUExJQ0FOVF9WRVJTSU9OICAgICAgOj0gVkVSXzBfOF9YCi1XSUZJX0RSSVZFUl9GV19QQVRIX1BBUkFNICAgOj0gIi9kZXYvbnVsbCIKLVdJRklfRFJJVkVSX0ZXX1BBVEhfU1RBICAgICA6PSAiL2Rldi9udWxsIgotV0lGSV9EUklWRVJfRldfUEFUSF9BUCAgICAgIDo9ICIvZGV2L251bGwiCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODZfYXJtL2RldmljZS5tayBiL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Nl9hcm0vZGV2aWNlLm1rCmluZGV4IDc2MjQyYzkuLjc2ZWRmNmIgMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Nl9hcm0vZGV2aWNlLm1rCisrKyBiL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Nl9hcm0vZGV2aWNlLm1rCkBAIC0xNCw1ICsxNCwzIEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1QUk9EVUNUX1NPT05HX05BTUVTUEFDRVMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2ggIyBmb3IgbGlid2lmaS1oYWwtZW11Ci1QUk9EVUNUX1NPT05HX05BTUVTUEFDRVMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gtb3BlbmdsICMgZm9yIGdvbGRmaXNoIGRlcHMuCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvbWFpbmxpbmVfc2RrL0JvYXJkQ29uZmlnLm1rIGIvdGFyZ2V0L2JvYXJkL21haW5saW5lX3Nkay9Cb2FyZENvbmZpZy5tawppbmRleCBmNWMyZGM2Li5lNGM2YThjIDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvbWFpbmxpbmVfc2RrL0JvYXJkQ29uZmlnLm1rCisrKyBiL3RhcmdldC9ib2FyZC9tYWlubGluZV9zZGsvQm9hcmRDb25maWcubWsKQEAgLTEzLDExICsxMywxMSBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAorIyBFbnN1cmUgYWxsIHRydW5rLXN0YWJsZSBmbGFncyBhcmUgYXZhaWxhYmxlLgoraW5jbHVkZSBidWlsZC9tYWtlL3RhcmdldC9wcm9kdWN0L2J1aWxkX3ZhcmlhYmxlcy5taworCiBUQVJHRVRfQVJDSF9TVUlURSA6PSBtYWlubGluZV9zZGsKIAogSE9TVF9DUk9TU19PUyA6PSBsaW51eF9iaW9uaWMKIEhPU1RfQ1JPU1NfQVJDSCA6PSB4ODZfNjQKIEhPU1RfQ1JPU1NfMk5EX0FSQ0ggOj0KLQotIyBSZXF1aXJlZCBmbGFnIGZvciBub24tNjQgYml0IGRldmljZXMgZnJvbSBQLgotVEFSR0VUX1VTRVNfNjRfQklUX0JJTkRFUiA6PSB0cnVlCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvbW9kdWxlX2FybS9Cb2FyZENvbmZpZy5tayBiL3RhcmdldC9ib2FyZC9tb2R1bGVfYXJtL0JvYXJkQ29uZmlnLm1rCmluZGV4IDNmMzVjMDYuLjU2NWVmYzggMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9tb2R1bGVfYXJtL0JvYXJkQ29uZmlnLm1rCisrKyBiL3RhcmdldC9ib2FyZC9tb2R1bGVfYXJtL0JvYXJkQ29uZmlnLm1rCkBAIC0xMyw4ICsxMyw2IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbmNsdWRlIGJ1aWxkL21ha2UvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnTW9kdWxlQ29tbW9uLm1rCi0KIFRBUkdFVF9BUkNIIDo9IGFybQogVEFSR0VUX0FSQ0hfVkFSSUFOVCA6PSBhcm12Ny1hLW5lb24KIFRBUkdFVF9DUFVfVkFSSUFOVCA6PSBnZW5lcmljCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvbW9kdWxlX2FybTY0L0JvYXJkQ29uZmlnLm1rIGIvdGFyZ2V0L2JvYXJkL21vZHVsZV9hcm02NC9Cb2FyZENvbmZpZy5tawppbmRleCAzNzAwMDU2Li42NmUzNzkyIDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvbW9kdWxlX2FybTY0L0JvYXJkQ29uZmlnLm1rCisrKyBiL3RhcmdldC9ib2FyZC9tb2R1bGVfYXJtNjQvQm9hcmRDb25maWcubWsKQEAgLTEzLDggKzEzLDYgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWluY2x1ZGUgYnVpbGQvbWFrZS90YXJnZXQvYm9hcmQvQm9hcmRDb25maWdNb2R1bGVDb21tb24ubWsKLQogVEFSR0VUX0FSQ0ggOj0gYXJtNjQKIFRBUkdFVF9BUkNIX1ZBUklBTlQgOj0gYXJtdjgtYQogVEFSR0VUX0NQVV9WQVJJQU5UIDo9IGdlbmVyaWMKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9tb2R1bGVfYXJtNjRvbmx5L0JvYXJkQ29uZmlnLm1rIGIvdGFyZ2V0L2JvYXJkL21vZHVsZV9hcm02NG9ubHkvQm9hcmRDb25maWcubWsKaW5kZXggM2NhYmYwNS4uNmMyNjU3OSAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL21vZHVsZV9hcm02NG9ubHkvQm9hcmRDb25maWcubWsKKysrIGIvdGFyZ2V0L2JvYXJkL21vZHVsZV9hcm02NG9ubHkvQm9hcmRDb25maWcubWsKQEAgLTEzLDggKzEzLDYgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWluY2x1ZGUgYnVpbGQvbWFrZS90YXJnZXQvYm9hcmQvQm9hcmRDb25maWdNb2R1bGVDb21tb24ubWsKLQogVEFSR0VUX0FSQ0ggOj0gYXJtNjQKIFRBUkdFVF9BUkNIX1ZBUklBTlQgOj0gYXJtdjgtYQogVEFSR0VUX0NQVV9WQVJJQU5UIDo9IGdlbmVyaWMKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3Nka194ODZfNjQubWsgYi90YXJnZXQvYm9hcmQvbW9kdWxlX3Jpc2N2NjQvQm9hcmRDb25maWcubWsKc2ltaWxhcml0eSBpbmRleCA2OCUKY29weSBmcm9tIHRhcmdldC9wcm9kdWN0L3Nka194ODZfNjQubWsKY29weSB0byB0YXJnZXQvYm9hcmQvbW9kdWxlX3Jpc2N2NjQvQm9hcmRDb25maWcubWsKaW5kZXggNWY2NTUzZS4uOGJjMTk5OSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3g4Nl82NC5taworKysgYi90YXJnZXQvYm9hcmQvbW9kdWxlX3Jpc2N2NjQvQm9hcmRDb25maWcubWsKQEAgLTEsNSArMSw0IEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCw4ICsxMywxMCBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotIyBEb24ndCBtb2RpZnkgdGhpcyBmaWxlIC0gSXQncyBqdXN0IGFuIGFsaWFzIQorVEFSR0VUX0FSQ0ggOj0gcmlzY3Y2NAorVEFSR0VUX0FSQ0hfVkFSSUFOVCA6PQorVEFSR0VUX0NQVV9WQVJJQU5UIDo9IGdlbmVyaWMKK1RBUkdFVF9DUFVfQUJJIDo9IHJpc2N2NjQKIAotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9zZGtfcGhvbmVfeDg2XzY0Lm1rKQotCi1QUk9EVUNUX05BTUUgOj0gc2RrX3g4Nl82NAorIyBUZW1wb3JhcnkgaGFjayB3aGlsZSBwcmVidWlsdCBtb2R1bGVzIGFyZSBtaXNzaW5nIHJpc2N2NjQuCitBTExPV19NSVNTSU5HX0RFUEVOREVOQ0lFUyA6PSB0cnVlCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvbW9kdWxlX3Jpc2N2NjQvUkVBRE1FLm1kIGIvdGFyZ2V0L2JvYXJkL21vZHVsZV9yaXNjdjY0L1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGViYWE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L2JvYXJkL21vZHVsZV9yaXNjdjY0L1JFQURNRS5tZApAQCAtMCwwICsxLDIgQEAKK1RoaXMgZGV2aWNlIGlzIHN1aXRhYmxlIGZvciBhbiB1bmJ1bmRsZWQgbW9kdWxlIHRhcmdldGVkIHNwZWNpZmljYWxseSB0byBhCityaXNjdjY0IGRldmljZS4gVGhpcyBpcyBhIDY0LWJpdCBvbmx5IGRldmljZSAobm8gMzItYml0IHN1cHBvcnQpLgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL21vZHVsZV94ODYvQm9hcmRDb25maWcubWsgYi90YXJnZXQvYm9hcmQvbW9kdWxlX3g4Ni9Cb2FyZENvbmZpZy5tawppbmRleCBhOTNhYzk3Li5hZjNmZmZkIDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvbW9kdWxlX3g4Ni9Cb2FyZENvbmZpZy5taworKysgYi90YXJnZXQvYm9hcmQvbW9kdWxlX3g4Ni9Cb2FyZENvbmZpZy5tawpAQCAtMTMsOCArMTMsNiBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW5jbHVkZSBidWlsZC9tYWtlL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ01vZHVsZUNvbW1vbi5tawotCiBUQVJHRVRfQ1BVX0FCSSA6PSB4ODYKIFRBUkdFVF9BUkNIIDo9IHg4NgogVEFSR0VUX0FSQ0hfVkFSSUFOVCA6PSB4ODYKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9tb2R1bGVfeDg2XzY0L0JvYXJkQ29uZmlnLm1rIGIvdGFyZ2V0L2JvYXJkL21vZHVsZV94ODZfNjQvQm9hcmRDb25maWcubWsKaW5kZXggMWVkM2JlMC4uMWFkYTAyNyAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL21vZHVsZV94ODZfNjQvQm9hcmRDb25maWcubWsKKysrIGIvdGFyZ2V0L2JvYXJkL21vZHVsZV94ODZfNjQvQm9hcmRDb25maWcubWsKQEAgLTEzLDggKzEzLDYgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWluY2x1ZGUgYnVpbGQvbWFrZS90YXJnZXQvYm9hcmQvQm9hcmRDb25maWdNb2R1bGVDb21tb24ubWsKLQogVEFSR0VUX0NQVV9BQkkgOj0geDg2XzY0CiBUQVJHRVRfQVJDSCA6PSB4ODZfNjQKIFRBUkdFVF9BUkNIX1ZBUklBTlQgOj0geDg2XzY0CmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvbW9kdWxlX3g4Nl82NG9ubHkvQm9hcmRDb25maWcubWsgYi90YXJnZXQvYm9hcmQvbW9kdWxlX3g4Nl82NG9ubHkvQm9hcmRDb25maWcubWsKaW5kZXggYjA2NzZjYi4uNWI4NmYwYSAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL21vZHVsZV94ODZfNjRvbmx5L0JvYXJkQ29uZmlnLm1rCisrKyBiL3RhcmdldC9ib2FyZC9tb2R1bGVfeDg2XzY0b25seS9Cb2FyZENvbmZpZy5tawpAQCAtMTMsOCArMTMsNiBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW5jbHVkZSBidWlsZC9tYWtlL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ01vZHVsZUNvbW1vbi5tawotCiBUQVJHRVRfQ1BVX0FCSSA6PSB4ODZfNjQKIFRBUkdFVF9BUkNIIDo9IHg4Nl82NAogVEFSR0VUX0FSQ0hfVkFSSUFOVCA6PSB4ODZfNjQKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9uZGsvQm9hcmRDb25maWcubWsgYi90YXJnZXQvYm9hcmQvbmRrL0JvYXJkQ29uZmlnLm1rCmluZGV4IGRhOGI1ZjMuLmUzNjc5MTggMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9uZGsvQm9hcmRDb25maWcubWsKKysrIGIvdGFyZ2V0L2JvYXJkL25kay9Cb2FyZENvbmZpZy5tawpAQCAtMTQsOCArMTQsMyBAQAogIwogCiBUQVJHRVRfQVJDSF9TVUlURSA6PSBuZGsKLVRBUkdFVF9VU0VTXzY0X0JJVF9CSU5ERVIgOj0gdHJ1ZQotCi1NQUxMT0NfU1ZFTFRFIDo9IHRydWUKLQotVVNFX1NBRkVTVEFDSyA6PSBmYWxzZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvQW5kcm9pZFByb2R1Y3RzLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvQW5kcm9pZFByb2R1Y3RzLm1rCmluZGV4IDEzM2RjNzMuLjA3ZWI5NmQgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L0FuZHJvaWRQcm9kdWN0cy5taworKysgYi90YXJnZXQvcHJvZHVjdC9BbmRyb2lkUHJvZHVjdHMubWsKQEAgLTY2LDE0ICs2Niw4IEBACiAgICAgJChMT0NBTF9ESVIpL21haW5saW5lX3N5c3RlbV94ODZfNjQubWsgXAogICAgICQoTE9DQUxfRElSKS9tYWlubGluZV9zeXN0ZW1feDg2X2FybS5tayBcCiAgICAgJChMT0NBTF9ESVIpL25kay5tayBcCi0gICAgJChMT0NBTF9ESVIpL3Nka19hcm02NC5tayBcCiAgICAgJChMT0NBTF9ESVIpL3Nkay5tayBcCi0gICAgJChMT0NBTF9ESVIpL3Nka19waG9uZV9hcm02NC5tayBcCi0gICAgJChMT0NBTF9ESVIpL3Nka19waG9uZV9hcm12Ny5tayBcCi0gICAgJChMT0NBTF9ESVIpL3Nka19waG9uZV94ODZfNjQubWsgXAotICAgICQoTE9DQUxfRElSKS9zZGtfcGhvbmVfeDg2Lm1rIFwKLSAgICAkKExPQ0FMX0RJUikvc2RrX3g4Nl82NC5tayBcCi0gICAgJChMT0NBTF9ESVIpL3Nka194ODYubWsgXAorICAgICQoTE9DQUxfRElSKS9zZGtfd2l0aF9ydW50aW1lX2FwaXMubWsgXAogCiBlbmRpZgogCkBAIC04MywxMiArNzcsMTMgQEAKICAgICAkKExPQ0FMX0RJUikvbW9kdWxlX2FybS5tayBcCiAgICAgJChMT0NBTF9ESVIpL21vZHVsZV9hcm02NC5tayBcCiAgICAgJChMT0NBTF9ESVIpL21vZHVsZV9hcm02NG9ubHkubWsgXAorICAgICQoTE9DQUxfRElSKS9tb2R1bGVfcmlzY3Y2NC5tayBcCiAgICAgJChMT0NBTF9ESVIpL21vZHVsZV94ODYubWsgXAogICAgICQoTE9DQUxfRElSKS9tb2R1bGVfeDg2XzY0Lm1rIFwKICAgICAkKExPQ0FMX0RJUikvbW9kdWxlX3g4Nl82NG9ubHkubWsgXAogCiBDT01NT05fTFVOQ0hfQ0hPSUNFUyA6PSBcCi0gICAgYW9zcF9hcm02NC1lbmcgXAotICAgIGFvc3BfYXJtLWVuZyBcCi0gICAgYW9zcF94ODZfNjQtZW5nIFwKLSAgICBhb3NwX3g4Ni1lbmcgXAorICAgIGFvc3BfYXJtNjQtdHJ1bmtfc3RhZ2luZy1lbmcgXAorICAgIGFvc3BfYXJtLXRydW5rX3N0YWdpbmctZW5nIFwKKyAgICBhb3NwX3g4Nl82NC10cnVua19zdGFnaW5nLWVuZyBcCisgICAgYW9zcF94ODYtdHJ1bmtfc3RhZ2luZy1lbmcgXApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvT1dORVJTIGIvdGFyZ2V0L3Byb2R1Y3QvT1dORVJTCmluZGV4IDAwOGU0YTIuLjQ4ZDNmMmEgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L09XTkVSUworKysgYi90YXJnZXQvcHJvZHVjdC9PV05FUlMKQEAgLTEsNCArMSw0IEBACi1wZXItZmlsZSBydW50aW1lX2xpYmFydC5tayA9IGNhbGluQGdvb2dsZS5jb20sIG1hc3RAZ29vZ2xlLmNvbSwgbmdlb2ZmcmF5QGdvb2dsZS5jb20sIG90aEBnb29nbGUuY29tLCBycGxAZ29vZ2xlLmNvbSwgdm1hcmtvQGdvb2dsZS5jb20KK3Blci1maWxlIHJ1bnRpbWVfbGliYXJ0Lm1rID0gbWFzdEBnb29nbGUuY29tLCBuZ2VvZmZyYXlAZ29vZ2xlLmNvbSwgcnBsQGdvb2dsZS5jb20sIHZtYXJrb0Bnb29nbGUuY29tCiAKICMgR1NJCiBwZXItZmlsZSBnc2lfcmVsZWFzZS5tayA9IGZpbGU6L3RhcmdldC9wcm9kdWN0L2dzaS9PV05FUlMKQEAgLTcsNCArNyw0IEBACiAjIEFuZHJvaWQgR28KIHBlci1maWxlIGdvX2RlZmF1bHRzLm1rID0gZ2thaXNlckBnb29nbGUuY29tLCBrdXNoZ0Bnb29nbGUuY29tLCByYWpla3VtYXJAZ29vZ2xlLmNvbQogcGVyLWZpbGUgZ29fZGVmYXVsdHNfNTEyLm1rID0gZ2thaXNlckBnb29nbGUuY29tLCBrdXNoZ0Bnb29nbGUuY29tLCByYWpla3VtYXJAZ29vZ2xlLmNvbQotcGVyLWZpbGUgZ29fZGVmYXVsdHNfY29tbW9uLm1rID0gZ2thaXNlckBnb29nbGUuY29tLCBrdXNoZ0Bnb29nbGUuY29tLCByYWpla3VtYXJAZ29vZ2xlLmNvbQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK3Blci1maWxlIGdvX2RlZmF1bHRzX2NvbW1vbi5tayA9IGdrYWlzZXJAZ29vZ2xlLmNvbSwga3VzaGdAZ29vZ2xlLmNvbSwgcmFqZWt1bWFyQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2FuZ2xlX2RlZmF1bHQubWsgYi90YXJnZXQvcHJvZHVjdC9hbmdsZV9kZWZhdWx0Lm1rCmluZGV4IGJlYTBiZTYuLjcyODQ2ZDMgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2FuZ2xlX2RlZmF1bHQubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvYW5nbGVfZGVmYXVsdC5tawpAQCAtMTUsOSArMTUsNyBAQAogIwogCiAjIFRvIGVuYWJsZSBBTkdMRSBhcyB0aGUgZGVmYXVsdCBzeXN0ZW0gR0xFUyBkcml2ZXJzLCBhZGQKLSMgJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9hbmdsZV9lbmFibGVkLm1rKSB0byB0aGUgTWFrZWZpbGUuCisjICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvYW5nbGVfZGVmYXVsdC5taykgdG8gdGhlIE1ha2VmaWxlLgogCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2FuZ2xlX3N1cHBvcnRlZC5taykKLQotUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCitQUk9EVUNUX1NZU1RFTV9QUk9QRVJUSUVTICs9IFwKICAgICBwZXJzaXN0LmdyYXBoaWNzLmVnbD1hbmdsZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYW5nbGVfc3VwcG9ydGVkLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvYW5nbGVfc3VwcG9ydGVkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODNmZjVmLi4wMDAwMDAwCi0tLSBhL3RhcmdldC9wcm9kdWN0L2FuZ2xlX3N1cHBvcnRlZC5taworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IDIwMjMgVGhlIEFuZHJvaWQgT3Blbi1Tb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBUbyBpbmNsdWRlIEFOR0xFIGludG8gdGhlIGltYWdlIGJ1aWxkLCBhZGQKLSMgJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9hbmdsZV9zdXBwb3J0ZWQubWspIHRvIHRoZSBNYWtlZmlsZS4KLSMgQnkgZGVmYXVsdCwgdGhpcyB3aWxsIGFsbG93IEFOR0xFIGJpbmFyaWVzIHRvIGNvZXhpc3Qgd2l0aCBuYXRpdmUgR0xFUyBkcml2ZXJzLgotCi1QUk9EVUNUX1BBQ0tBR0VTICs9IFwKLSAgICBsaWJFR0xfYW5nbGUgXAotICAgIGxpYkdMRVN2MV9DTV9hbmdsZSBcCi0gICAgbGliR0xFU3YyX2FuZ2xlCi0KLSMgU2V0IHJvLmdmeC5hbmdsZS5zdXBwb3J0ZWQgYmFzZWQgb24gaWYgQU5HTEUgaXMgaW5zdGFsbGVkIGluIHZlbmRvciBwYXJ0aXRpb24KLVBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8uZ2Z4LmFuZ2xlLnN1cHBvcnRlZD10cnVlCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9hb3NwXzY0Yml0b25seV94ODZfNjQubWsgYi90YXJnZXQvcHJvZHVjdC9hb3NwXzY0Yml0b25seV94ODZfNjQubWsKaW5kZXggNzVmZDNjOC4uY2Y4MTJhMiAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvYW9zcF82NGJpdG9ubHlfeDg2XzY0Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2Fvc3BfNjRiaXRvbmx5X3g4Nl82NC5tawpAQCAtNTEsNyArNTEsNiBAQAogIwogIyBBbGwgY29tcG9uZW50cyBpbmhlcml0ZWQgaGVyZSBnbyB0byB2ZW5kb3IgaW1hZ2UKICMKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvZW11bGF0b3JfdmVuZG9yLm1rKQogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvYm9hcmQvZ2VuZXJpY194ODZfNjQvZGV2aWNlLm1rKQogCiAjCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9hb3NwX2FybS5tayBiL3RhcmdldC9wcm9kdWN0L2Fvc3BfYXJtLm1rCmluZGV4IDYxYzEzMTYuLmQ5YzM2MmUgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2Fvc3BfYXJtLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2Fvc3BfYXJtLm1rCkBAIC01MCw3ICs1MCw2IEBACiAjIEFsbCBjb21wb25lbnRzIGluaGVyaXRlZCBoZXJlIGdvIHRvIHZlbmRvciBpbWFnZQogIwogJChjYWxsIGluaGVyaXQtcHJvZHVjdC1pZi1leGlzdHMsIGJ1aWxkL21ha2UvdGFyZ2V0L3Byb2R1Y3QvcmFtZGlza19zdHViLm1rKQotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9lbXVsYXRvcl92ZW5kb3IubWspCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9ib2FyZC9nZW5lcmljX3g4Ni9kZXZpY2UubWspCiAKICMKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2Fvc3BfYXJtNjQubWsgYi90YXJnZXQvcHJvZHVjdC9hb3NwX2FybTY0Lm1rCmluZGV4IDZjOTA3ZGIuLjdhOTMyNWQgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2Fvc3BfYXJtNjQubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9hcm02NC5tawpAQCAtNDQsNyArNDQsNyBAQAogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC90ZWxlcGhvbnlfc3lzdGVtX2V4dC5taykKIAogIyBwS1ZNCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCBwYWNrYWdlcy9tb2R1bGVzL1ZpcnR1YWxpemF0aW9uL2FwZXgvcHJvZHVjdF9wYWNrYWdlcy5taykKKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QtaWYtZXhpc3RzLCBwYWNrYWdlcy9tb2R1bGVzL1ZpcnR1YWxpemF0aW9uL2FwZXgvcHJvZHVjdF9wYWNrYWdlcy5taykKIAogIwogIyBBbGwgY29tcG9uZW50cyBpbmhlcml0ZWQgaGVyZSBnbyB0byBwcm9kdWN0IGltYWdlCkBAIC01NCw5ICs1NCw5IEBACiAjCiAjIEFsbCBjb21wb25lbnRzIGluaGVyaXRlZCBoZXJlIGdvIHRvIHZlbmRvciBvciB2ZW5kb3JfYm9vdCBpbWFnZQogIwotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9lbXVsYXRvcl92ZW5kb3IubWspCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9ib2FyZC9nZW5lcmljX2FybTY0L2RldmljZS5taykKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3Qvbm9uX2FiX2RldmljZS5taykKK0FCX09UQV9VUERBVEVSIDo9IHRydWUKK0FCX09UQV9QQVJUSVRJT05TID89IHN5c3RlbQogCiAjCiAjIFNwZWNpYWwgc2V0dGluZ3MgZm9yIEdTSSByZWxlYXNpbmcKQEAgLTczLDMgKzczLDUgQEAKIFBST0RVQ1RfREVWSUNFIDo9IGdlbmVyaWNfYXJtNjQKIFBST0RVQ1RfQlJBTkQgOj0gQW5kcm9pZAogUFJPRFVDVF9NT0RFTCA6PSBBT1NQIG9uIEFSTTY0CisKK1BST0RVQ1RfTk9fQklPTklDX1BBR0VfU0laRV9NQUNSTyA6PSB0cnVlCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9hb3NwX3Byb2R1Y3QubWsgYi90YXJnZXQvcHJvZHVjdC9hb3NwX3Byb2R1Y3QubWsKaW5kZXggYTRjM2E5MS4uM2E1YjYyMiAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9wcm9kdWN0Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2Fvc3BfcHJvZHVjdC5tawpAQCAtMzMsNyArMzMsNyBAQAogICAgIG1lc3NhZ2luZyBcCiAgICAgUGhvdG9UYWJsZSBcCiAgICAgcHJlaW5zdGFsbGVkLXBhY2thZ2VzLXBsYXRmb3JtLWFvc3AtcHJvZHVjdC54bWwgXAotICAgIFdhbGxwYXBlclBpY2tlciBcCisgICAgVGhlbWVQaWNrZXIgXAogCiAjIFRlbGVwaG9ueToKICMgICBQcm92aWRlIGEgQVBOIGNvbmZpZ3VyYXRpb24gdG8gR1NJIHByb2R1Y3QKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2Fvc3BfcmlzY3Y2NC5tayBiL3RhcmdldC9wcm9kdWN0L2Fvc3BfcmlzY3Y2NC5tawppbmRleCAyNzBhOTg5Li5mYTUwM2ZmIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9hb3NwX3Jpc2N2NjQubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9yaXNjdjY0Lm1rCkBAIC00Niw3ICs0Niw2IEBACiAjCiAjIEFsbCBjb21wb25lbnRzIGluaGVyaXRlZCBoZXJlIGdvIHRvIHZlbmRvciBpbWFnZQogIwotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9lbXVsYXRvcl92ZW5kb3IubWspCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9ib2FyZC9nZW5lcmljX3Jpc2N2NjQvZGV2aWNlLm1rKQogCiAjCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9hb3NwX3g4Ni5tayBiL3RhcmdldC9wcm9kdWN0L2Fvc3BfeDg2Lm1rCmluZGV4IGEyZjAzOTAuLmMyNmE4YmYgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2Fvc3BfeDg2Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2Fvc3BfeDg2Lm1rCkBAIC00Nyw3ICs0Nyw2IEBACiAjCiAjIEFsbCBjb21wb25lbnRzIGluaGVyaXRlZCBoZXJlIGdvIHRvIHZlbmRvciBpbWFnZQogIwotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9lbXVsYXRvcl92ZW5kb3IubWspCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9ib2FyZC9nZW5lcmljX3g4Ni9kZXZpY2UubWspCiAKIApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYW9zcF94ODZfNjQubWsgYi90YXJnZXQvcHJvZHVjdC9hb3NwX3g4Nl82NC5tawppbmRleCA1MzVlZTNmLi41OTU5NDBkIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9hb3NwX3g4Nl82NC5taworKysgYi90YXJnZXQvcHJvZHVjdC9hb3NwX3g4Nl82NC5tawpAQCAtNTYsOSArNTYsOSBAQAogIwogIyBBbGwgY29tcG9uZW50cyBpbmhlcml0ZWQgaGVyZSBnbyB0byB2ZW5kb3IgaW1hZ2UKICMKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvZW11bGF0b3JfdmVuZG9yLm1rKQogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvYm9hcmQvZ2VuZXJpY194ODZfNjQvZGV2aWNlLm1rKQotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9ub25fYWJfZGV2aWNlLm1rKQorQUJfT1RBX1VQREFURVIgOj0gdHJ1ZQorQUJfT1RBX1BBUlRJVElPTlMgPz0gc3lzdGVtCiAKICMKICMgU3BlY2lhbCBzZXR0aW5ncyBmb3IgR1NJIHJlbGVhc2luZwpAQCAtNzUsMyArNzUsNSBAQAogUFJPRFVDVF9ERVZJQ0UgOj0gZ2VuZXJpY194ODZfNjQKIFBST0RVQ1RfQlJBTkQgOj0gQW5kcm9pZAogUFJPRFVDVF9NT0RFTCA6PSBBT1NQIG9uIHg4Nl82NAorCitQUk9EVUNUX05PX0JJT05JQ19QQUdFX1NJWkVfTUFDUk8gOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYW9zcF94ODZfYXJtLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvYW9zcF94ODZfYXJtLm1rCmluZGV4IDM5YWQwZDguLmExMDNiMWEgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2Fvc3BfeDg2X2FybS5taworKysgYi90YXJnZXQvcHJvZHVjdC9hb3NwX3g4Nl9hcm0ubWsKQEAgLTQ1LDcgKzQ1LDYgQEAKICMKICMgQWxsIGNvbXBvbmVudHMgaW5oZXJpdGVkIGhlcmUgZ28gdG8gdmVuZG9yIGltYWdlCiAjCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2VtdWxhdG9yX3ZlbmRvci5taykKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL2JvYXJkL2dlbmVyaWNfeDg2X2FybS9kZXZpY2UubWspCiAKIApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3g4Nl82NC5tayBiL3RhcmdldC9wcm9kdWN0L2FwcF9mdW5jdGlvbl9leHRlbnNpb25zLm1rCnNpbWlsYXJpdHkgaW5kZXggNzIlCnJlbmFtZSBmcm9tIHRhcmdldC9wcm9kdWN0L3Nka194ODZfNjQubWsKcmVuYW1lIHRvIHRhcmdldC9wcm9kdWN0L2FwcF9mdW5jdGlvbl9leHRlbnNpb25zLm1rCmluZGV4IDVmNjU1M2UuLmU2MDFmZDcgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3Nka194ODZfNjQubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvYXBwX2Z1bmN0aW9uX2V4dGVuc2lvbnMubWsKQEAgLTEsNSArMSw1IEBACiAjCi0jIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCw4ICsxNCw5IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi0jIERvbid0IG1vZGlmeSB0aGlzIGZpbGUgLSBJdCdzIGp1c3QgYW4gYWxpYXMhCisjIFRoZSBhcHAgZnVuY3Rpb24gc2lkZWNhciBleHRlbnNpb25zCiAKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3Qvc2RrX3Bob25lX3g4Nl82NC5taykKLQotUFJPRFVDVF9OQU1FIDo9IHNka194ODZfNjQKKyMgL3N5c3RlbV9leHQgcGFja2FnZXMKK1BST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgIGNvbS5hbmRyb2lkLmV4dGVuc2lvbnMuYXBwZnVuY3Rpb25zIFwKKyAgICBhcHBmdW5jdGlvbnMuZXh0ZW5zaW9uLnhtbApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYmFzZV9wcm9kdWN0Lm1rIGIvdGFyZ2V0L3Byb2R1Y3QvYmFzZV9wcm9kdWN0Lm1rCmluZGV4IDU0NDYwNjQuLmFjZmM2NTMgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2Jhc2VfcHJvZHVjdC5taworKysgYi90YXJnZXQvcHJvZHVjdC9iYXNlX3Byb2R1Y3QubWsKQEAgLTE2LDYgKzE2LDcgQEAKIAogIyBCYXNlIG1vZHVsZXMgYW5kIHNldHRpbmdzIGZvciB0aGUgcHJvZHVjdCBwYXJ0aXRpb24uCiBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICBidWlsZF9mbGFnX3Byb2R1Y3QgXAogICAgIGZzX2NvbmZpZ19kaXJzX3Byb2R1Y3QgXAogICAgIGZzX2NvbmZpZ19maWxlc19wcm9kdWN0IFwKICAgICBncm91cF9wcm9kdWN0IFwKQEAgLTI0LDMgKzI1LDggQEAKICAgICBwcm9kdWN0X2NvbXBhdGliaWxpdHlfbWF0cml4LnhtbCBcCiAgICAgcHJvZHVjdF9tYW5pZmVzdC54bWwgXAogICAgIHNlbGludXhfcG9saWN5X3Byb2R1Y3QgXAorICAgIHByb2R1Y3QtYnVpbGQucHJvcCBcCisKKyMgUGFja2FnZXMgaW5jbHVkZWQgb25seSBmb3IgZW5nIG9yIHVzZXJkZWJ1ZyBidWlsZHMsIHByZXZpb3VzbHkgZGVidWcgdGFnZ2VkCitQUk9EVUNUX1BBQ0tBR0VTX0RFQlVHICs9IFwKKyAgICBhZGJfa2V5cyBcCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9iYXNlX3N5c3RlbS5tayBiL3RhcmdldC9wcm9kdWN0L2Jhc2Vfc3lzdGVtLm1rCmluZGV4IGEzZjVhYjMuLjk4MDk2ZTAgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2Jhc2Vfc3lzdGVtLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2Jhc2Vfc3lzdGVtLm1rCkBAIC0xNywxMyArMTcsMTIgQEAKICMgQmFzZSBtb2R1bGVzIGFuZCBzZXR0aW5ncyBmb3IgdGhlIHN5c3RlbSBwYXJ0aXRpb24uCiBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKICAgICBhYnggXAorICAgIGFjb25maWdkLXN5c3RlbSBcCiAgICAgYWRiZF9zeXN0ZW1fYXBpIFwKKyAgICBhZmxhZ3MgXAogICAgIGFtIFwKLSAgICBhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMC1zZXJ2aWNlIFwKICAgICBhbmRyb2lkLmhpZGwuYmFzZS1WMS4wLWphdmEgXAogICAgIGFuZHJvaWQuaGlkbC5tYW5hZ2VyLVYxLjAtamF2YSBcCi0gICAgYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAtaW1wbCBcCi0gICAgYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAtaW1wbC52ZW5kb3IgXAogICAgIGFuZHJvaWQuc3lzdGVtLnN1c3BlbmQtc2VydmljZSBcCiAgICAgYW5kcm9pZC50ZXN0LmJhc2UgXAogICAgIGFuZHJvaWQudGVzdC5tb2NrIFwKQEAgLTQ2LDEzICs0NSwxNCBAQAogICAgIGJ1IFwKICAgICBidWdyZXBvcnQgXAogICAgIGJ1Z3JlcG9ydHogXAorICAgIGJ1aWxkX2ZsYWdfc3lzdGVtIFwKICAgICBjZ3JvdXBzLmpzb24gXAogICAgIGNoYXJnZXIgXAogICAgIGNtZCBcCiAgICAgY29tLmFuZHJvaWQuYWRiZCBcCiAgICAgY29tLmFuZHJvaWQuYWRzZXJ2aWNlcyBcCiAgICAgY29tLmFuZHJvaWQuYXBwc2VhcmNoIFwKLSAgICBjb20uYW5kcm9pZC5idHNlcnZpY2VzIFwKKyAgICBjb20uYW5kcm9pZC5idCBcCiAgICAgY29tLmFuZHJvaWQuY29uZmlnaW5mcmFzdHJ1Y3R1cmUgXAogICAgIGNvbS5hbmRyb2lkLmNvbnNjcnlwdCBcCiAgICAgY29tLmFuZHJvaWQuZGV2aWNlbG9jayBcCkBAIC03Myw3ICs3Myw3IEBACiAgICAgY29tLmFuZHJvaWQuc2NoZWR1bGluZyBcCiAgICAgY29tLmFuZHJvaWQuc2RrZXh0IFwKICAgICBjb20uYW5kcm9pZC50ZXRoZXJpbmcgXAotICAgIGNvbS5hbmRyb2lkLnR6ZGF0YSBcCisgICAgJChSRUxFQVNFX1BBQ0tBR0VfVFpEQVRBX01PRFVMRSkgXAogICAgIGNvbS5hbmRyb2lkLnV3YiBcCiAgICAgY29tLmFuZHJvaWQudmlydCBcCiAgICAgY29tLmFuZHJvaWQud2lmaSBcCkBAIC05MSwxOSArOTEsMjIgQEAKICAgICBkdW1wLmVyb2ZzIFwKICAgICBkdW1wc3RhdGUgXAogICAgIGR1bXBzeXMgXAotICAgIER5bmFtaWNTeXN0ZW1JbnN0YWxsYXRpb25TZXJ2aWNlIFwKKyAgICBFMmVlQ29udGFjdEtleXNQcm92aWRlciBcCiAgICAgZTJmc2NrIFwKKyAgICBlbmhhbmNlZC1jb25maXJtYXRpb24ueG1sIFwKICAgICBFeHRTaGFyZWQgXAogICAgIGZsYWdzX2hlYWx0aF9jaGVjayBcCiAgICAgZnJhbWV3b3JrLWdyYXBoaWNzIFwKKyAgICBmcmFtZXdvcmstbG9jYXRpb24gXAogICAgIGZyYW1ld29yay1taW51cy1hcGV4IFwKLSAgICBmcmFtZXdvcmstcmVzIFwKKyAgICBmcmFtZXdvcmstbWludXMtYXBleC1pbnN0YWxsLWRlcGVuZGVuY2llcyBcCiAgICAgZnJhbWV3b3JrLXN5c2NvbmZpZy54bWwgXAogICAgIGZzY2suZXJvZnMgXAogICAgIGZzY2tfbXNkb3MgXAogICAgIGZzdmVyaXR5LXJlbGVhc2UtY2VydC1kZXIgXAogICAgIGZzX2NvbmZpZ19maWxlc19zeXN0ZW0gXAogICAgIGZzX2NvbmZpZ19kaXJzX3N5c3RlbSBcCisgICAgZ3B1X2NvdW50ZXJfcHJvZHVjZXIgXAogICAgIGdyb3VwX3N5c3RlbSBcCiAgICAgZ3NpZCBcCiAgICAgZ3NpX3Rvb2wgXApAQCAtMTEyLDcgKzExNSw2IEBACiAgICAgZ2F0ZWtlZXBlcmQgXAogICAgIGdwdXNlcnZpY2UgXAogICAgIGhpZCBcCi0gICAgaHdzZXJ2aWNlbWFuYWdlciBcCiAgICAgaWRtYXAyIFwKICAgICBpZG1hcDJkIFwKICAgICBpbWUgXApAQCAtMTI5LDggKzEzMSw4IEBACiAgICAgSW50ZW50UmVzb2x2ZXIgXAogICAgIGlwIFwKICAgICBpcHRhYmxlcyBcCi0gICAgaXAtdXAtdnBuIFwKICAgICBqYXZheC5vYmV4IFwKKyAgICBrY21kbGluZWN0cmwgXAogICAgIGtleXN0b3JlMiBcCiAgICAgY3JlZHN0b3JlIFwKICAgICBsZC5tYyBcCkBAIC0xNzMsMTAgKzE3NSwxMCBAQAogICAgIGxpYmpwZWcgXAogICAgIGxpYmxvZyBcCiAgICAgbGlibS5ib290c3RyYXAgXAotICAgIGxpYm1kbnNzZCBcCiAgICAgbGlibWVkaWEgXAogICAgIGxpYm1lZGlhX2puaSBcCiAgICAgbGlibWVkaWFuZGsgXAorICAgIGxpYm1vbmtleV9qbmkgXAogICAgIGxpYm10cCBcCiAgICAgbGlibmV0ZF9jbGllbnQgXAogICAgIGxpYm5ldGxpbmsgXApAQCAtMjA1LDEwICsyMDcsMTIgQEAKICAgICBsaWJ1aSBcCiAgICAgbGlidXNiaG9zdCBcCiAgICAgbGlidXRpbHMgXAorICAgIGxpYnZpbnRmX2puaSBcCiAgICAgbGlidnVsa2FuIFwKICAgICBsaWJ3aWxoZWxtIFwKICAgICBsaW5rZXIgXAogICAgIGxsa2QgXAorICAgIGxsbmRrX2xpYnMgXAogICAgIGxta2QgXAogICAgIExvY2FsVHJhbnNwb3J0IFwKICAgICBsb2Nrc2V0dGluZ3MgXApAQCAtMjI2LDggKzIzMCw4IEBACiAgICAgbWtlMmZzIFwKICAgICBta2ZzLmVyb2ZzIFwKICAgICBtb25rZXkgXAorICAgIG1pc2N0cmwgXAogICAgIG10ZWN0cmwgXAotICAgIG10cGQgXAogICAgIG5kYyBcCiAgICAgbmV0ZCBcCiAgICAgTmV0d29ya1N0YWNrIFwKQEAgLTIzNSwxOCArMjM5LDIyIEBACiAgICAgb3JnLmFwYWNoZS5odHRwLmxlZ2FjeSBcCiAgICAgb3RhY2VydHMgXAogICAgIFBhY2thZ2VJbnN0YWxsZXIgXAorICAgIHBhY2thZ2Utc2hhcmVkdWlkLWFsbG93bGlzdC54bWwgXAogICAgIHBhc3N3ZF9zeXN0ZW0gXAogICAgIHBlcmZldHRvIFwKKyAgICBwZXJmZXR0by1leHRyYXMgXAogICAgIHBpbmcgXAogICAgIHBpbmc2IFwKKyAgICBwaW50b29sIFwKICAgICBwbGF0Zm9ybS54bWwgXAogICAgIHBtIFwKLSAgICBwcHBkIFwKKyAgICBwcmVmZXRjaCBcCiAgICAgcHJlaW5zdGFsbGVkLXBhY2thZ2VzLWFzbC1maWxlcy54bWwgXAogICAgIHByZWluc3RhbGxlZC1wYWNrYWdlcy1wbGF0Zm9ybS54bWwgXAorICAgIHByZWluc3RhbGxlZC1wYWNrYWdlcy1zdHJpY3Qtc2lnbmF0dXJlLnhtbCBcCisgICAgcHJpbnRmbGFncyBcCiAgICAgcHJpdmFwcC1wZXJtaXNzaW9ucy1wbGF0Zm9ybS54bWwgXAogICAgIHBybmdfc2VlZGVyIFwKLSAgICByYWNvb24gXAogICAgIHJlY292ZXJ5LXBlcnNpc3QgXAogICAgIHJlc2l6ZTJmcyBcCiAgICAgcnNzX2h3bV9yZXNldCBcCkBAIC0yNjQsMTYgKzI3MiwxNiBAQAogICAgIHNlcnZpY2VzIFwKICAgICBzZXR0aW5ncyBcCiAgICAgU2V0dGluZ3NQcm92aWRlciBcCisgICAgc2ZkbyBcCiAgICAgc2dkaXNrIFwKICAgICBTaGVsbCBcCiAgICAgc2hlbGxfYW5kX3V0aWxpdGllc19zeXN0ZW0gXAogICAgIHNtIFwKLSAgICBzbmFwc2hvdGN0bCBcCiAgICAgc25hcHVzZXJkIFwKLSAgICBTb3VuZFBpY2tlciBcCiAgICAgc3RvcmFnZWQgXAogICAgIHN1cmZhY2VmbGluZ2VyIFwKICAgICBzdmMgXAorICAgIHN5c3RlbS1idWlsZC5wcm9wIFwKICAgICB0YXNrX3Byb2ZpbGVzLmpzb24gXAogICAgIHRjIFwKICAgICB0ZWxlY29tIFwKQEAgLTI4MSwxMyArMjg5LDE0IEBACiAgICAgdG9tYnN0b25lZCBcCiAgICAgdHJhY2VkIFwKICAgICB0cmFjZWRfcHJvYmVzIFwKKyAgICB0cmFkZWlubW9kZSBcCiAgICAgdHVuZTJmcyBcCiAgICAgdWlhdXRvbWF0b3IgXAogICAgIHVpbnB1dCBcCiAgICAgdW5jcnlwdCBcCiAgICAgdXNiZCBcCiAgICAgdmRjIFwKLSAgICB2aWV3Y29tcGlsZXIgXAorICAgIHZpbnRmIFwKICAgICB2b2lwLWNvbW1vbiBcCiAgICAgdm9sZCBcCiAgICAgd2F0Y2hkb2dkIFwKQEAgLTI5NSwxMSArMzA0LDEwNiBAQAogICAgIHdpZmkucmMgXAogICAgIHdtIFwKIAorIyBXaGVuIHdlIHJlbGVhc2UgY3Jhc2hyZWNvdmVyeSBtb2R1bGUKK2lmZXEgKCQoUkVMRUFTRV9DUkFTSFJFQ09WRVJZX01PRFVMRSksdHJ1ZSkKKyAgUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgICAgIGNvbS5hbmRyb2lkLmNyYXNocmVjb3ZlcnkgXAorCitlbHNlCisgIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgIGZyYW1ld29yay1wbGF0Zm9ybWNyYXNocmVjb3ZlcnkgXAorCitlbmRpZgorCisjIFdoZW4gd2UgcmVsZWFzZSBvbmRldmljZWludGVsbGlnZW5jZSBpbiBuZXVyYWxuZXR3b3JrcyBtb2R1bGUKK2lmbmVxICgkKFJFTEVBU0VfT05ERVZJQ0VfSU5URUxMSUdFTkNFX01PRFVMRSksdHJ1ZSkKKyAgUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgICAgIGZyYW1ld29yay1vbmRldmljZWludGVsbGlnZW5jZS1wbGF0Zm9ybQorCitlbmRpZgorCisKKyMgV2hlbiB3ZSByZWxlYXNlIHVwcm9iZXN0YXRzIG1vZHVsZQoraWZlcSAoJChSRUxFQVNFX1VQUk9CRVNUQVRTX01PRFVMRSksdHJ1ZSkKKyAgICBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICAgICAgY29tLmFuZHJvaWQudXByb2Jlc3RhdHMgXAorCitlbHNlCisgICAgUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgICAgIHVwcm9iZXN0YXRzIFwKKyAgICAgICAgbGlidXByb2Jlc3RhdHNfY2xpZW50IFwKKworZW5kaWYKKworIyBUaGVzZSBwYWNrYWdlcyBhcmUgbm90IHVzZWQgb24gQW5kcm9pZCBUVgoraWZuZXEgKCQoUFJPRFVDVF9JU19BVFYpLHRydWUpCisgIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgICAgJChSRUxFQVNFX1BBQ0tBR0VfU09VTkRfUElDS0VSKSBcCisKK2VuZGlmCisKKyMgUHJvZHVjdCBkb2VzIG5vdCBzdXBwb3J0IER5bmFtaWMgU3lzdGVtIFVwZGF0ZQoraWZuZXEgKCQoUFJPRFVDVF9OT19EWU5BTUlDX1NZU1RFTV9VUERBVEUpLHRydWUpCisgICAgUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgICAgIER5bmFtaWNTeXN0ZW1JbnN0YWxsYXRpb25TZXJ2aWNlIFwKKworZW5kaWYKKworIyBDaGVjayBpZiB0aGUgYnVpbGQgc3VwcG9ydHMgTkZDIGFwZXggb3Igbm90CitpZmVxICgkKFJFTEVBU0VfUEFDS0FHRV9ORkNfU1RBQ0spLE5mY05jaSkKKyAgICBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICAgICAgZnJhbWV3b3JrLW5mYyBcCisgICAgICAgIE5mY05jaQorZWxzZQorICAgIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgICAgICBjb20uYW5kcm9pZC5uZmNzZXJ2aWNlcworZW5kaWYKKworIyBDaGVjayBpZiB0aGUgYnVpbGQgc3VwcG9ydHMgUHJvZmlsaW5nIG1vZHVsZQoraWZlcSAoJChSRUxFQVNFX1BBQ0tBR0VfUFJPRklMSU5HX01PRFVMRSksdHJ1ZSkKKyAgICBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICAgICBjb20uYW5kcm9pZC5wcm9maWxpbmcKK2VuZGlmCisKK2lmZXEgKCQoUkVMRUFTRV9VU0VfV0VCVklFV19CT09UU1RSQVBfTU9EVUxFKSx0cnVlKQorICAgIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgICAgICBjb20uYW5kcm9pZC53ZWJ2aWV3LmJvb3RzdHJhcAorZW5kaWYKKworIyBPbmx5IGFkZCB0aGUgamFyIHdoZW4gaXQgaXMgbm90IGluIHRoZSBUZXRoZXJpbmcgbW9kdWxlLiBPdGhlcndpc2UsCisjIGl0IHdpbGwgYmUgYWRkZWQgdmlhIGNvbS5hbmRyb2lkLnRldGhlcmluZworaWZuZXEgKCQoUkVMRUFTRV9NT1ZFX1ZDTl9UT19NQUlOTElORSksdHJ1ZSkKKyAgICBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICAgICAgZnJhbWV3b3JrLWNvbm5lY3Rpdml0eS1iCitlbmRpZgorCitpZm5lcSAoLCQoUkVMRUFTRV9SQU5HSU5HX1NUQUNLKSkKKyAgICBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICAgICAgY29tLmFuZHJvaWQucmFuZ2luZworZW5kaWYKKworaWZlcSAoJChSRUxFQVNFX01FTU9SWV9NQU5BR0VNRU5UX0RBRU1PTiksdHJ1ZSkKKyAgUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgICAgIG1tX2RhZW1vbgorZW5kaWYKKwogIyBWSU5URiBkYXRhIGZvciBzeXN0ZW0gaW1hZ2UKIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAogICAgIHN5c3RlbV9tYW5pZmVzdC54bWwgXAogICAgIHN5c3RlbV9jb21wYXRpYmlsaXR5X21hdHJpeC54bWwgXAogCisjIEJhc2UgbW9kdWxlcyB3aGVuIHNoaXBwaW5nIGFwaSBsZXZlbCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMzQKK1BST0RVQ1RfUEFDS0FHRVNfU0hJUFBJTkdfQVBJX0xFVkVMXzM0ICs9IFwKKyAgICBhbmRyb2lkLmhpZGwubWVtb3J5QDEuMC1pbXBsIFwKKworIyBod3NlcnZpY2VtYW5hZ2VyIGlzIG5vdyBpbnN0YWxsZWQgb24gc3lzdGVtX2V4dCwgYnV0IGFwZXhlcyBtaWdodCBiZSB1c2luZworIyBvbGQgbGlicmFyaWVzIHRoYXQgYXJlIGV4cGVjdGluZyBpdCB0byBiZSBpbnN0YWxsZWQgb24gc3lzdGVtLiBUaGlzIGFsbG93cworIyB0aG9zZSBhcGV4ZXMgdG8gY29udGludWUgd29ya2luZy4gVGhlIHN5bWxpbmsgY2FuIGJlIHJlbW92ZWQgb25jZSB3ZSBhcmUgc3VyZQorIyB0aGVyZSBhcmUgbm8gZGV2aWNlcyB1c2luZyBod3NlcnZpY2VtYW5hZ2VyICh3aGVuIEFuZHJvaWQgViBsYXVuY2hpbmcgZGV2aWNlcworIyBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZCBmb3IgZGVzc2VydCB1cGdyYWRlcykuCitQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICBod3NlcnZpY2VtYW5hZ2VyX2NvbXBhdF9zeW1saW5rX21vZHVsZSBcCisKIFBST0RVQ1RfUEFDS0FHRVNfQVJNNjQgOj0gbGliY2xhbmdfcnQuaHdhc2FuIFwKICBsaWJjbGFuZ19ydC5od2FzYW4uYm9vdHN0cmFwIFwKICBsaWJjX2h3YXNhbiBcCkBAIC0zMjYsNiArNDMwLDExIEBACiAgICAgV2FsbHBhcGVyQmFja3VwCiBlbmRpZgogCitQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICBsaWJFR0xfYW5nbGUgXAorICAgIGxpYkdMRVN2MV9DTV9hbmdsZSBcCisgICAgbGliR0xFU3YyX2FuZ2xlCisKICMgRm9yIHRlc3RpbmcgcHVycG9zZXMKIGlmZXEgKCQoRk9SQ0VfQVVESU9fU0lMRU5UKSwgdHJ1ZSkKICAgICBQUk9EVUNUX1NZU1RFTV9QUk9QRVJUSUVTICs9IHJvLmF1ZGlvLnNpbGVudD0xCkBAIC0zMzUsNyArNDQ0LDcgQEAKIFBST0RVQ1RfSE9TVF9QQUNLQUdFUyArPSBcCiAgICAgQnVnUmVwb3J0IFwKICAgICBhZGIgXAotICAgIGFydC10b29scyBcCisgICAgYWRldmljZSBcCiAgICAgYXRlc3QgXAogICAgIGJjYyBcCiAgICAgYml0IFwKQEAgLTM0NSwxNCArNDU0LDE0IEBACiAgICAgZmxhZ3NfaGVhbHRoX2NoZWNrIFwKICAgICBmc2NrLmVyb2ZzIFwKICAgICBpY3UtZGF0YV9ob3N0X2kxOG5fYXBleCBcCi0gICAgaWN1X3R6ZGF0YS5kYXRfaG9zdF90emRhdGFfYXBleCBcCisgICAgdHpkYXRhX2ljdV9yZXNfZmlsZXNfaG9zdF9wcmVidWlsdHMgXAogICAgIGlkbWFwMiBcCiAgICAgaW5jaWRlbnRfcmVwb3J0IFwKICAgICBsZC5tYyBcCiAgICAgbHBkdW1wIFwKLSAgICBtaW5pZ3ppcCBcCiAgICAgbWtlMmZzIFwKICAgICBta2ZzLmVyb2ZzIFwKKyAgICBwYnRvbWJzdG9uZSBcCiAgICAgcmVzaXplMmZzIFwKICAgICBzZ2Rpc2sgXAogICAgIHNxbGl0ZTMgXApAQCAtMzYxLDMwICs0NzAsNDkgQEAKICAgICB1bndpbmRfaW5mbyBcCiAgICAgdW53aW5kX3JlZ19pbmZvIFwKICAgICB1bndpbmRfc3ltYm9scyBcCi0gICAgdmlld2NvbXBpbGVyIFwKICAgICB0emRhdGFfaG9zdCBcCiAgICAgdHpkYXRhX2hvc3RfdHpkYXRhX2FwZXggXAogICAgIHR6bG9va3VwLnhtbF9ob3N0X3R6ZGF0YV9hcGV4IFwKICAgICB0el92ZXJzaW9uX2hvc3QgXAogICAgIHR6X3ZlcnNpb25faG9zdF90emRhdGFfYXBleCBcCiAKKyMgRm9yIGFydC10b29scywgaWYgdGhlIGRlcGVuZGVuY2llcyBoYXZlIGNoYW5nZWQsIHBsZWFzZSBzeW5jIHRoZW0gdG8gYXJ0L0FuZHJvaWQuYnAgYXMgd2VsbC4KK1BST0RVQ1RfSE9TVF9QQUNLQUdFUyArPSBcCisgICAgYWhhdCBcCisgICAgZGV4ZHVtcCBcCisgICAgaHByb2YtY29udgorIyBBIHN1YnNldCBvZiB0aGUgdG9vbHMgYXJlIGRpc2FibGVkIHdoZW4gSE9TVF9QUkVGRVJfMzJfQklUIGlzIGRlZmluZWQgYXMgbWFrZSByZXBvcnRzIHRoYXQKKyMgdGhleSBhcmUgbm90IHN1cHBvcnRlZCBvbiBob3N0IChiLzEyOTMyMzc5MSkuIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBhcnRfYXBleCBkaXNhYmxpbmcgaG9zdAorIyBBUEVYIGJ1aWxkcyB3aGVuIEhPU1RfUFJFRkVSXzMyX0JJVCBpcyBzZXQgKGIvMTIwNjE3ODc2KS4KK2lmbmVxICgkKEhPU1RfUFJFRkVSXzMyX0JJVCksdHJ1ZSkKK1BST0RVQ1RfSE9TVF9QQUNLQUdFUyArPSBcCisgICAgZGV4bGlzdCBcCisgICAgb2F0ZHVtcAorZW5kaWYKIAotUFJPRFVDVF9DT1BZX0ZJTEVTICs9IFwKLSAgICBzeXN0ZW0vY29yZS9yb290ZGlyL2luaXQudXNiLnJjOnN5c3RlbS9ldGMvaW5pdC9ody9pbml0LnVzYi5yYyBcCi0gICAgc3lzdGVtL2NvcmUvcm9vdGRpci9pbml0LnVzYi5jb25maWdmcy5yYzpzeXN0ZW0vZXRjL2luaXQvaHcvaW5pdC51c2IuY29uZmlnZnMucmMgXAotICAgIHN5c3RlbS9jb3JlL3Jvb3RkaXIvZXRjL2hvc3RzOnN5c3RlbS9ldGMvaG9zdHMKIAotUFJPRFVDVF9DT1BZX0ZJTEVTICs9IHN5c3RlbS9jb3JlL3Jvb3RkaXIvaW5pdC56eWdvdGUzMi5yYzpzeXN0ZW0vZXRjL2luaXQvaHcvaW5pdC56eWdvdGUzMi5yYworUFJPRFVDVF9QQUNLQUdFUyArPSBpbml0LnVzYi5yYyBpbml0LnVzYi5jb25maWdmcy5yYworCitQUk9EVUNUX1BBQ0tBR0VTICs9IGV0Y19ob3N0cworCitQUk9EVUNUX1BBQ0tBR0VTICs9IGluaXQuenlnb3RlMzIucmMKIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8uenlnb3RlPz16eWdvdGUzMgogCiBQUk9EVUNUX1NZU1RFTV9QUk9QRVJUSUVTICs9IGRlYnVnLmF0cmFjZS50YWdzLmVuYWJsZWZsYWdzPTAKIFBST0RVQ1RfU1lTVEVNX1BST1BFUlRJRVMgKz0gcGVyc2lzdC50cmFjZWQuZW5hYmxlPTEKK1BST0RVQ1RfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uc3VyZmFjZV9mbGluZ2VyLmdhbWVfZGVmYXVsdF9mcmFtZV9yYXRlX292ZXJyaWRlPTYwCisKKyMgSW5jbHVkZSBrZXJuZWwgY29uZmlncy4KK1BST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgIGFwcHJvdmVkLW9na2ktYnVpbGRzLnhtbCBcCisgICAga2VybmVsLWxpZmV0aW1lcy54bWwKIAogIyBQYWNrYWdlcyBpbmNsdWRlZCBvbmx5IGZvciBlbmcgb3IgdXNlcmRlYnVnIGJ1aWxkcywgcHJldmlvdXNseSBkZWJ1ZyB0YWdnZWQKIFBST0RVQ1RfUEFDS0FHRVNfREVCVUcgOj0gXAotICAgIGFkYl9rZXlzIFwKKyAgICBhZGV2aWNlX2ZpbmdlcnByaW50IFwKICAgICBhcnBpbmcgXAogICAgIGRtdXNlcmQgXAorICAgIGV2ZW11LXJlY29yZCBcCiAgICAgaWRsY2xpIFwKICAgICBpbml0LWRlYnVnLnJjIFwKICAgICBpb3RvcCBcCkBAIC0zOTQsMTIgKzUyMiwxNSBAQAogICAgIGxpYmNsYW5nX3J0LnVic2FuX3N0YW5kYWxvbmUgXAogICAgIGxvZ3BlcnNpc3Quc3RhcnQgXAogICAgIGxvZ3RhZ2QucmMgXAorICAgIG90LWNsaS1mdGQgXAorICAgIG90LWN0bCBcCiAgICAgcHJvY3JhbmsgXAogICAgIHByb2Zjb2xsZWN0ZCBcCiAgICAgcHJvZmNvbGxlY3RjdGwgXAogICAgIHJlY29yZF9iaW5kZXIgXAogICAgIHNlcnZpY2VkaXNwYXRjaGVyIFwKICAgICBzaG93bWFwIFwKKyAgICBzbmFwc2hvdGN0bCBcCiAgICAgc3FsaXRlMyBcCiAgICAgc3MgXAogICAgIHN0YXJ0X3dpdGhfbG9ja2FnZW50IFwKQEAgLTQyOCw5ICs1NTksMjIgQEAKIFBST0RVQ1RfQ09QWV9GSUxFUyArPSAkKGNhbGwgYWRkLXRvLXByb2R1Y3QtY29weS1maWxlcy1pZi1leGlzdHMsXAogICAgIGZyYW1ld29ya3MvYmFzZS9jb25maWcvcHJlbG9hZGVkLWNsYXNzZXM6c3lzdGVtL2V0Yy9wcmVsb2FkZWQtY2xhc3NlcykKIAotIyBOb3RlOiBpdCBpcyBhY2NlcHRhYmxlIHRvIG5vdCBoYXZlIGEgZGlydHktaW1hZ2Utb2JqZWN0cyBmaWxlLiBJbiB0aGF0IGNhc2UsIHRoZSBzcGVjaWFsIGJpbgotIyAgICAgICBmb3Iga25vd24gZGlydHkgb2JqZWN0cyBpbiB0aGUgaW1hZ2Ugd2lsbCBiZSBlbXB0eS4KLVBST0RVQ1RfQ09QWV9GSUxFUyArPSAkKGNhbGwgYWRkLXRvLXByb2R1Y3QtY29weS1maWxlcy1pZi1leGlzdHMsXAotICAgIGZyYW1ld29ya3MvYmFzZS9jb25maWcvZGlydHktaW1hZ2Utb2JqZWN0czpzeXN0ZW0vZXRjL2RpcnR5LWltYWdlLW9iamVjdHMpCisjIEVuYWJsZSBkaXJ0eSBpbWFnZSBvYmplY3QgYmlubmluZyB0byByZWR1Y2UgZGlydHkgcGFnZXMgaW4gdGhlIGltYWdlLgorUFJPRFVDVF9QQUNLQUdFUyArPSBkaXJ0eS1pbWFnZS1vYmplY3RzCisKKyMgRW5hYmxlIGdvL3BlcmZldHRvLXBlcnNpc3RlbnQtdHJhY2luZyBmb3IgZW5nIGJ1aWxkcworaWZuZXEgKCwkKGZpbHRlciBlbmcsICQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpKSkKKyAgICBQUk9EVUNUX1BST0RVQ1RfUFJPUEVSVElFUyArPSBwZXJzaXN0LmRlYnVnLnBlcmZldHRvLnBlcnNpc3RlbnRfc3lzdWlfdHJhY2luZ19mb3JfYnVncmVwb3J0PTEKK2VuZGlmCiAKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvcnVudGltZV9saWJhcnQubWspCisKKyMgRW5zdXJlIGFsbCB0cnVuay1zdGFibGUgZmxhZ3MgYXJlIGF2YWlsYWJsZS4KKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvYnVpbGRfdmFyaWFibGVzLm1rKQorCisjIFVzZSAiaW1hZ2UiIEFQRVhlcyBhbHdheXMuCiskKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvdXBkYXRhYmxlX2FwZXgubWspCisKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LCBiaW9uaWMsIGxhcmdlX3N5c3RlbV9wcm9wZXJ0eV9ub2RlLCAkKFJFTEVBU0VfTEFSR0VfU1lTVEVNX1BST1BFUlRZX05PREUpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsIEFjb25maWcsIHJlYWRfZnJvbV9uZXdfc3RvcmFnZSwgJChSRUxFQVNFX1JFQURfRlJPTV9ORVdfU1RPUkFHRSkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldCwgU2V0dGluZ3NMaWIsIGxlZ2FjeV9hdmF0YXJfcGlja2VyX2FwcF9lbmFibGVkLCAkKGlmICQoUkVMRUFTRV9BVkFUQVJfUElDS0VSX0FQUCksLHRydWUpKQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYmFzZV9zeXN0ZW1fZXh0Lm1rIGIvdGFyZ2V0L3Byb2R1Y3QvYmFzZV9zeXN0ZW1fZXh0Lm1rCmluZGV4IDg1MmQ3Y2EuLjY3NjdiOWEgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2Jhc2Vfc3lzdGVtX2V4dC5taworKysgYi90YXJnZXQvcHJvZHVjdC9iYXNlX3N5c3RlbV9leHQubWsKQEAgLTE2LDkgKzE2LDIyIEBACiAKICMgQmFzZSBtb2R1bGVzIGFuZCBzZXR0aW5ncyBmb3IgdGhlIHN5c3RlbV9leHQgcGFydGl0aW9uLgogUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgYnVpbGRfZmxhZ19zeXN0ZW1fZXh0IFwKICAgICBmc19jb25maWdfZGlyc19zeXN0ZW1fZXh0IFwKICAgICBmc19jb25maWdfZmlsZXNfc3lzdGVtX2V4dCBcCiAgICAgZ3JvdXBfc3lzdGVtX2V4dCBcCiAgICAgcGFzc3dkX3N5c3RlbV9leHQgXAorICAgIFNhdGVsbGl0ZUNsaWVudCBcCiAgICAgc2VsaW51eF9wb2xpY3lfc3lzdGVtX2V4dCBcCiAgICAgc3lzdGVtX2V4dF9tYW5pZmVzdC54bWwgXAorICAgIHN5c3RlbV9leHQtYnVpbGQucHJvcCBcCisKKyMgQmFzZSBtb2R1bGVzIHdoZW4gc2hpcHBpbmcgYXBpIGxldmVsIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAzNAorUFJPRFVDVF9QQUNLQUdFU19TSElQUElOR19BUElfTEVWRUxfMzQgKz0gXAorICAgIGh3c2VydmljZW1hbmFnZXIgXAorICAgIGFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wLXNlcnZpY2UgXAorCisjIEFwcEZ1bmN0aW9uIEV4dGVuc2lvbnMKK2lmbmVxICgsJChSRUxFQVNFX0FQUEZVTkNUSU9OX1NJREVDQVIpKQorICAgICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvYXBwX2Z1bmN0aW9uX2V4dGVuc2lvbnMubWspCitlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2Jhc2VfdmVuZG9yLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvYmFzZV92ZW5kb3IubWsKaW5kZXggOTc4MDljMi4uMTZmYzdmZCAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvYmFzZV92ZW5kb3IubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvYmFzZV92ZW5kb3IubWsKQEAgLTE3LDcgKzE3LDcgQEAKICMgQmFzZSBtb2R1bGVzIGFuZCBzZXR0aW5ncyBmb3IgcmVjb3ZlcnkuCiBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKICAgICBhZGJkLnJlY292ZXJ5IFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmhlYWx0aEAyLjAtaW1wbC1kZWZhdWx0LnJlY292ZXJ5IFwKKyAgICBidWlsZF9mbGFnX3ZlbmRvciBcCiAgICAgY2dyb3Vwcy5yZWNvdmVyeS5qc29uIFwKICAgICBjaGFyZ2VyLnJlY292ZXJ5IFwKICAgICBpbml0X3NlY29uZF9zdGFnZS5yZWNvdmVyeSBcCkBAIC00NiwxMiArNDYsMTEgQEAKIAogIyBCYXNlIG1vZHVsZXMgYW5kIHNldHRpbmdzIGZvciB0aGUgdmVuZG9yIHBhcnRpdGlvbi4KIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FzLXNlcnZpY2UuZXhhbXBsZSBcCisgICAgY29tLmFuZHJvaWQuaGFyZHdhcmUuY2FzIFwKICAgICBib3Jpbmdzc2xfc2VsZl90ZXN0X3ZlbmRvciBcCiAgICAgZHVtcHN5c192ZW5kb3IgXAogICAgIGZzX2NvbmZpZ19maWxlc19ub25zeXN0ZW0gXAogICAgIGZzX2NvbmZpZ19kaXJzX25vbnN5c3RlbSBcCi0gICAgZ3B1X2NvdW50ZXJfcHJvZHVjZXIgXAogICAgIGdyYWxsb2MuZGVmYXVsdCBcCiAgICAgZ3JvdXBfb2RtIFwKICAgICBncm91cF92ZW5kb3IgXApAQCAtNzIsNyArNzEsMTkgQEAKICAgICBwYXNzd2Rfb2RtIFwKICAgICBwYXNzd2RfdmVuZG9yIFwKICAgICBzZWxpbnV4X3BvbGljeV9ub25zeXN0ZW0gXAorICAgIHNlbGludXhfcG9saWN5X3ZlbmRvciBcCisgICAgc2VsaW51eF9wb2xpY3lfb2RtIFwKICAgICBzaGVsbF9hbmRfdXRpbGl0aWVzX3ZlbmRvciBcCisgICAgb2RtLWJ1aWxkLnByb3AgXAorCisjIGxpYmhlYWx0aGxvb3AgQlBGIGZpbHRlci4gVGhpcyBpcyBpbiBiYXNlX3ZlbmRvci5tayBiZWNhdXNlIGxpYmhlYWx0aGxvb3AgbXVzdAorIyBiZSBhIHN0YXRpYyBsaWJyYXJ5IGFuZCBiZWNhdXNlIHRoZSBBbmRyb2lkIGJ1aWxkIHN5c3RlbSBpZ25vcmVzICdyZXF1aXJlZCcKKyMgc2VjdGlvbnMgZm9yIHN0YXRpYyBsaWJyYXJpZXMuCitQUk9EVUNUX1BBQ0tBR0VTICs9IGZpbHRlclBvd2VyU3VwcGx5RXZlbnRzLm8KKworIyBCYXNlIG1vZHVsZXMgd2hlbiBzaGlwcGluZyBhcGkgbGV2ZWwgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDM0CitQUk9EVUNUX1BBQ0tBR0VTX1NISVBQSU5HX0FQSV9MRVZFTF8zNCArPSBcCisgICAgIGFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wLWltcGwudmVuZG9yIFwKIAogIyBPTVggbm90IHN1cHBvcnRlZCBmb3IgNjRiaXRfb25seSBidWlsZHMKICMgT25seSBzdXBwb3J0ZWQgd2hlbiBTSElQUElOR19BUElfTEVWRUwgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDMzCkBAIC05NSw5ICsxMDYsMTYgQEAKICMgVklOVEYgZGF0YSBmb3IgdmVuZG9yIGltYWdlCiBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKICAgICB2ZW5kb3JfY29tcGF0aWJpbGl0eV9tYXRyaXgueG1sIFwKKyAgICB2ZW5kb3JfbWFuaWZlc3QueG1sIFwKIAogIyBCYXNlIG1vZHVsZXMgYW5kIHNldHRpbmdzIGZvciB0aGUgZGVidWcgcmFtZGlzaywgd2hpY2ggaXMgdGhlbiBwYWNrZWQKICMgaW50byBhIGJvb3QtZGVidWcuaW1nIGFuZCBhIHZlbmRvcl9ib290LWRlYnVnLmltZy4KIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAogICAgIGFkYl9kZWJ1Zy5wcm9wIFwKICAgICB1c2VyZGVidWdfcGxhdF9zZXBvbGljeS5jaWwKKworIyBPbiBlbmcgb3IgdXNlcmRlYnVnIGJ1aWxkcywgYnVpbGQgaW4gcGVyZi1zZXR1cC1zaCBieSBkZWZhdWx0LgoraWZuZXEgKCwkKGZpbHRlciB1c2VyZGVidWcgZW5nLCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpKSkKK1BST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgIHBlcmYtc2V0dXAtc2gKK2VuZGlmCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9idWlsZF92YXJpYWJsZXMubWsgYi90YXJnZXQvcHJvZHVjdC9idWlsZF92YXJpYWJsZXMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkzNjkxMQotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9wcm9kdWN0L2J1aWxkX3ZhcmlhYmxlcy5tawpAQCAtMCwwICsxLDM2IEBACisjCisjIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIFRoaXMgZmlsZSBjb250YWlucyB0aGUgdHJ1bmstc3RhYmxlIGZsYWdzIHRoYXQgc2hvdWxkIGJlIGV4cG9ydGVkIHRvIGFsbAorIyBBbmRyb2lkIHRhcmdldHMuCisKKyMgQ29udHJvbCBsaWJiaW5kZXIgY2xpZW50IGNhY2hpbmcKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LCBsaWJiaW5kZXIsIHJlbGVhc2VfbGliYmluZGVyX2NsaWVudF9jYWNoZSwgJChSRUxFQVNFX0xJQkJJTkRFUl9DTElFTlRfQ0FDSEUpKQorCisjIENvbnRyb2wgY2FjaGluZyB3aGlsZSBhZGRpbmcgc2VydmljZSBpbiBsaWJiaW5kZXIgY2FjaGUKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LCBsaWJiaW5kZXIsIHJlbGVhc2VfbGliYmluZGVyX2FkZHNlcnZpY2VfY2FjaGUsICQoUkVMRUFTRV9MSUJCSU5ERVJfQUREU0VSVklDRV9DQUNIRSkpCisKKyMgUmVtb3ZlIHN0YXRpYyBsaXN0IGluIGxpYmJpbmRlciBjYWNoZQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsIGxpYmJpbmRlciwgcmVsZWFzZV9saWJiaW5kZXJfcmVtb3ZlX2NhY2hlX3N0YXRpY19saXN0LCAkKFJFTEVBU0VfTElCQklOREVSX1JFTU9WRV9DQUNIRV9TVEFUSUNfTElTVCkpCisKKyMgVXNlIHRoZSBjb25maWd1cmVkIHJlbGVhc2Ugb2Ygc3FsaXRlCiskKGNhbGwgc29vbmdfY29uZmlnX3NldCwgbGlic3FsaXRlMywgcmVsZWFzZV9wYWNrYWdlX2xpYnNxbGl0ZTMsICQoUkVMRUFTRV9QQUNLQUdFX0xJQlNRTElURTMpKQorCisjIFVzZSB0aGUgY29uZmlndXJlZCBNZXNzYWdlUXVldWUgaW1wbGVtZW50YXRpb24KKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LCBtZXNzYWdlcXVldWUsIHJlbGVhc2VfcGFja2FnZV9tZXNzYWdlcXVldWVfaW1wbGVtZW50YXRpb24sICQoUkVMRUFTRV9QQUNLQUdFX01FU1NBR0VRVUVVRV9JTVBMRU1FTlRBVElPTikpCisKKyMgVXNlIHRoZSBjb25maWd1cmVkIHZlcnNpb24gb2YgV2ViVmlldworJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsIHdlYnZpZXcsIHJlbGVhc2VfcGFja2FnZV93ZWJ2aWV3X3ZlcnNpb24sICQoUkVMRUFTRV9QQUNLQUdFX1dFQlZJRVdfVkVSU0lPTikpCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9jb3JlXzY0X2JpdC5tayBiL3RhcmdldC9wcm9kdWN0L2NvcmVfNjRfYml0Lm1rCmluZGV4IGUwYzRkNTMuLjc5MGY1N2IgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2NvcmVfNjRfYml0Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2NvcmVfNjRfYml0Lm1rCkBAIC0yMyw5ICsyMyw3IEBACiAjIGZvciAzMi1iaXQgb25seS4KIAogIyBDb3B5IHRoZSA2NC1iaXQgcHJpbWFyeSwgMzItYml0IHNlY29uZGFyeSB6eWdvdGUgc3RhcnR1cCBzY3JpcHQKLVBST0RVQ1RfQ09QWV9GSUxFUyArPSBcCi0gICAgc3lzdGVtL2NvcmUvcm9vdGRpci9pbml0Lnp5Z290ZTY0LnJjOnN5c3RlbS9ldGMvaW5pdC9ody9pbml0Lnp5Z290ZTY0LnJjIFwKLSAgICBzeXN0ZW0vY29yZS9yb290ZGlyL2luaXQuenlnb3RlNjRfMzIucmM6c3lzdGVtL2V0Yy9pbml0L2h3L2luaXQuenlnb3RlNjRfMzIucmMgXAorUFJPRFVDVF9QQUNLQUdFUyArPSBpbml0Lnp5Z290ZTY0LnJjIGluaXQuenlnb3RlNjRfMzIucmMKIAogIyBTZXQgdGhlIHp5Z290ZSBwcm9wZXJ0eSB0byBzZWxlY3QgdGhlIDY0LWJpdCBwcmltYXJ5LCAzMi1iaXQgc2Vjb25kYXJ5IHNjcmlwdAogIyBUaGlzIGxpbmUgbXVzdCBiZSBwYXJzZWQgYmVmb3JlIHRoZSBvbmUgaW4gY29yZV9taW5pbWFsLm1rCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9jb3JlXzY0X2JpdF9vbmx5Lm1rIGIvdGFyZ2V0L3Byb2R1Y3QvY29yZV82NF9iaXRfb25seS5tawppbmRleCBmYzJiOGU1Li5mZmE1NTY3IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9jb3JlXzY0X2JpdF9vbmx5Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2NvcmVfNjRfYml0X29ubHkubWsKQEAgLTIwLDcgKzIwLDcgQEAKICMgdG8gY29yZV9taW5pbWFsLm1rLgogCiAjIENvcHkgdGhlIDY0LWJpdCB6eWdvdGUgc3RhcnR1cCBzY3JpcHQKLVBST0RVQ1RfQ09QWV9GSUxFUyArPSBzeXN0ZW0vY29yZS9yb290ZGlyL2luaXQuenlnb3RlNjQucmM6c3lzdGVtL2V0Yy9pbml0L2h3L2luaXQuenlnb3RlNjQucmMKK1BST0RVQ1RfUEFDS0FHRVMgKz0gaW5pdC56eWdvdGU2NC5yYwogCiAjIFNldCB0aGUgenlnb3RlIHByb3BlcnR5IHRvIHNlbGVjdCB0aGUgNjQtYml0IHNjcmlwdC4KICMgVGhpcyBsaW5lIG11c3QgYmUgcGFyc2VkIGJlZm9yZSB0aGUgb25lIGluIGNvcmVfbWluaW1hbC5tawpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvZGVmYXVsdF9hcnRfY29uZmlnLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvZGVmYXVsdF9hcnRfY29uZmlnLm1rCmluZGV4IGQ5NzAyMDMuLmY5MWNiMDcgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2RlZmF1bHRfYXJ0X2NvbmZpZy5taworKysgYi90YXJnZXQvcHJvZHVjdC9kZWZhdWx0X2FydF9jb25maWcubWsKQEAgLTM4LDIzICszOCwzNCBAQAogUFJPRFVDVF9CT09UX0pBUlMgOj0gXAogICAgICQoQVJUX0FQRVhfSkFSUykKIAorIyBMaXN0IG9mIGphcnMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIEFSVCBib290IGltYWdlIGZvciB0ZXN0aW5nLgorIyBETyBOT1QgcmVvcmRlciB0aGlzIGxpc3QuIFRoZSBvcmRlciBtdXN0IG1hdGNoIHRoZSBvbmUgZGVzY3JpYmVkIGFib3ZlLgorIyBOb3RlOiBXZSB1c2UgdGhlIGhvc3QgdmFyaWFudCBvZiAiY29yZS1pY3U0aiIgYW5kICJjb25zY3J5cHQiIGZvciB0ZXN0aW5nLgorUFJPRFVDVF9URVNUX09OTFlfQVJUX0JPT1RfSU1BR0VfSkFSUyA6PSBcCisgICAgJChBUlRfQVBFWF9KQVJTKSBcCisgICAgcGxhdGZvcm06Y29yZS1pY3U0ai1ob3N0IFwKKyAgICBwbGF0Zm9ybTpjb25zY3J5cHQtaG9zdCBcCisKICMgL3N5c3RlbSBhbmQgL3N5c3RlbV9leHQgYm9vdCBqYXJzLgogUFJPRFVDVF9CT09UX0pBUlMgKz0gXAogICAgIGZyYW1ld29yay1taW51cy1hcGV4IFwKICAgICBmcmFtZXdvcmstZ3JhcGhpY3MgXAorICAgIGZyYW1ld29yay1sb2NhdGlvbiBcCiAgICAgZXh0IFwKICAgICB0ZWxlcGhvbnktY29tbW9uIFwKICAgICB2b2lwLWNvbW1vbiBcCiAgICAgaW1zLWNvbW1vbgogCiAjIEFQRVggYm9vdCBqYXJzLiBLZWVwIHRoZSBsaXN0IHNvcnRlZCBieSBtb2R1bGUgbmFtZXMgYW5kIHRoZW4gbGlicmFyeSBuYW1lcy4KKyMgTm90ZTogSWYgdGhlIGV4aXN0aW5nIGFwZXggaW50cm9kdWNlcyB0aGUgbmV3IGphciwgYWxzbyBhZGQgaXQgdG8KKyMgUFJPRFVDVF9BUEVYX0JPT1RfSkFSU19GT1JfU09VUkNFX0JVSUxEX09OTFkgYmVsb3cuCiAjIE5vdGU6IGNvcmUtaWN1NGogaXMgbW92ZWQgYmFjayB0byBQUk9EVUNUX0JPT1RfSkFSUyBpbiBwcm9kdWN0X2NvbmZpZy5tayBhdCBhIGxhdGVyIHN0YWdlLgogIyBOb3RlOiBGb3IgbW9kdWxlcyBhdmFpbGFibGUgaW4gUSwgRE8gTk9UIGFkZCBuZXcgZW50cmllcyBoZXJlLgogUFJPRFVDVF9BUEVYX0JPT1RfSkFSUyA6PSBcCiAgICAgY29tLmFuZHJvaWQuYWRzZXJ2aWNlczpmcmFtZXdvcmstYWRzZXJ2aWNlcyBcCiAgICAgY29tLmFuZHJvaWQuYWRzZXJ2aWNlczpmcmFtZXdvcmstc2Rrc2FuZGJveCBcCiAgICAgY29tLmFuZHJvaWQuYXBwc2VhcmNoOmZyYW1ld29yay1hcHBzZWFyY2ggXAotICAgIGNvbS5hbmRyb2lkLmJ0c2VydmljZXM6ZnJhbWV3b3JrLWJsdWV0b290aCBcCisgICAgY29tLmFuZHJvaWQuYnQ6ZnJhbWV3b3JrLWJsdWV0b290aCBcCiAgICAgY29tLmFuZHJvaWQuY29uZmlnaW5mcmFzdHJ1Y3R1cmU6ZnJhbWV3b3JrLWNvbmZpZ2luZnJhc3RydWN0dXJlIFwKICAgICBjb20uYW5kcm9pZC5jb25zY3J5cHQ6Y29uc2NyeXB0IFwKICAgICBjb20uYW5kcm9pZC5kZXZpY2Vsb2NrOmZyYW1ld29yay1kZXZpY2Vsb2NrIFwKQEAgLTYzLDYgKzc0LDkgQEAKICAgICBjb20uYW5kcm9pZC5pcHNlYzphbmRyb2lkLm5ldC5pcHNlYy5pa2UgXAogICAgIGNvbS5hbmRyb2lkLm1lZGlhOnVwZGF0YWJsZS1tZWRpYSBcCiAgICAgY29tLmFuZHJvaWQubWVkaWFwcm92aWRlcjpmcmFtZXdvcmstbWVkaWFwcm92aWRlciBcCisgICAgY29tLmFuZHJvaWQubWVkaWFwcm92aWRlcjpmcmFtZXdvcmstcGRmIFwKKyAgICBjb20uYW5kcm9pZC5tZWRpYXByb3ZpZGVyOmZyYW1ld29yay1wZGYtdiBcCisgICAgY29tLmFuZHJvaWQubWVkaWFwcm92aWRlcjpmcmFtZXdvcmstcGhvdG9waWNrZXIgXAogICAgIGNvbS5hbmRyb2lkLm9uZGV2aWNlcGVyc29uYWxpemF0aW9uOmZyYW1ld29yay1vbmRldmljZXBlcnNvbmFsaXphdGlvbiBcCiAgICAgY29tLmFuZHJvaWQub3Muc3RhdHNkOmZyYW1ld29yay1zdGF0c2QgXAogICAgIGNvbS5hbmRyb2lkLnBlcm1pc3Npb246ZnJhbWV3b3JrLXBlcm1pc3Npb24gXApAQCAtNzYsNiArOTAsNjMgQEAKICAgICBjb20uYW5kcm9pZC52aXJ0OmZyYW1ld29yay12aXJ0dWFsaXphdGlvbiBcCiAgICAgY29tLmFuZHJvaWQud2lmaTpmcmFtZXdvcmstd2lmaSBcCiAKKyMgV2hlbiBjcmFzaHJlY292ZXJ5IG1vZHVsZSBpcyByZWFkeSB1c2UgYXBleCBqYXIKKyMgZWxzZSBwdXQgdGhlIHBsYXRmb3JtIGphciBpbiBzeXN0ZW0KK2lmZXEgKCQoUkVMRUFTRV9DUkFTSFJFQ09WRVJZX01PRFVMRSksdHJ1ZSkKKyAgICBQUk9EVUNUX0FQRVhfQk9PVF9KQVJTICs9IFwKKyAgICAgICAgY29tLmFuZHJvaWQuY3Jhc2hyZWNvdmVyeTpmcmFtZXdvcmstY3Jhc2hyZWNvdmVyeSBcCisKK2Vsc2UKKyAgICBQUk9EVUNUX0JPT1RfSkFSUyArPSBcCisgICAgICAgIGZyYW1ld29yay1wbGF0Zm9ybWNyYXNocmVjb3ZlcnkgXAorCitlbmRpZgorCisjIFdoZW4gd2UgcmVsZWFzZSBvbmRldmljZWludGVsbGlnZW5jZSBpbiBOZXVyYWxOZXR3b3JrcyBtb2R1bGUKK2lmZXEgKCQoUkVMRUFTRV9PTkRFVklDRV9JTlRFTExJR0VOQ0VfTU9EVUxFKSx0cnVlKQorICAgIFBST0RVQ1RfQVBFWF9CT09UX0pBUlMgKz0gXAorICAgIGNvbS5hbmRyb2lkLm5ldXJhbG5ldHdvcmtzOmZyYW1ld29yay1vbmRldmljZWludGVsbGlnZW5jZSBcCisKK2Vsc2UKKyAgICBQUk9EVUNUX0JPT1RfSkFSUyArPSBcCisgICAgICAgIGZyYW1ld29yay1vbmRldmljZWludGVsbGlnZW5jZS1wbGF0Zm9ybSBcCisKK2VuZGlmCisKKyMgQ2hlY2sgaWYgdGhlIGJ1aWxkIHN1cHBvcnRzIE5GQyBhcGV4IG9yIG5vdAoraWZlcSAoJChSRUxFQVNFX1BBQ0tBR0VfTkZDX1NUQUNLKSxOZmNOY2kpCisgICAgUFJPRFVDVF9CT09UX0pBUlMgKz0gXAorICAgICAgICBmcmFtZXdvcmstbmZjCitlbHNlCisgICAgUFJPRFVDVF9BUEVYX0JPT1RfSkFSUyArPSBcCisgICAgICAgIGNvbS5hbmRyb2lkLm5mY3NlcnZpY2VzOmZyYW1ld29yay1uZmMKKyAgICAkKGNhbGwgc29vbmdfY29uZmlnX3NldCxib290Y2xhc3NwYXRoLG5mY19hcGV4X2Jvb3RjbGFzc3BhdGhfZnJhZ21lbnQsdHJ1ZSkKK2VuZGlmCisKKyMgQ2hlY2sgaWYgYnVpbGQgc3VwcG9ydHMgUHJvZmlsaW5nIG1vZHVsZS4KK2lmZXEgKCQoUkVMRUFTRV9QQUNLQUdFX1BST0ZJTElOR19NT0RVTEUpLHRydWUpCisgICAgUFJPRFVDVF9BUEVYX0JPT1RfSkFSUyArPSBcCisgICAgICAgIGNvbS5hbmRyb2lkLnByb2ZpbGluZzpmcmFtZXdvcmstcHJvZmlsaW5nIFwKKworZW5kaWYKKworaWZuZXEgKCwkKFJFTEVBU0VfUkFOR0lOR19TVEFDSykpCisgICAgUFJPRFVDVF9BUEVYX0JPT1RfSkFSUyArPSBcCisgICAgICAgIGNvbS5hbmRyb2lkLnV3YjpmcmFtZXdvcmstcmFuZ2luZyBcCisgICAgJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsYm9vdGNsYXNzcGF0aCxyZWxlYXNlX3Jhbmdpbmdfc3RhY2ssdHJ1ZSkKK2VuZGlmCisKKyMgQ2hlY2sgaWYgVkNOIHNob3VsZCBiZSBidWlsdCBpbnRvIHRoZSB0ZXRoZXJpbmcgbW9kdWxlIG9yIG5vdAoraWZlcSAoJChSRUxFQVNFX01PVkVfVkNOX1RPX01BSU5MSU5FKSx0cnVlKQorICAgIFBST0RVQ1RfQVBFWF9CT09UX0pBUlMgKz0gXAorICAgICAgICBjb20uYW5kcm9pZC50ZXRoZXJpbmc6ZnJhbWV3b3JrLWNvbm5lY3Rpdml0eS1iIFwKKworZWxzZQorICAgIFBST0RVQ1RfQk9PVF9KQVJTICs9IFwKKyAgICAgICAgZnJhbWV3b3JrLWNvbm5lY3Rpdml0eS1iIFwKKworZW5kaWYKKwogIyBMaXN0IG9mIHN5c3RlbV9zZXJ2ZXIgY2xhc3NwYXRoIGphcnMgZGVsaXZlcmVkIHZpYSBhcGV4LgogIyBLZWVwIHRoZSBsaXN0IHNvcnRlZCBieSBtb2R1bGUgbmFtZXMgYW5kIHRoZW4gbGlicmFyeSBuYW1lcy4KICMgTm90ZTogRm9yIG1vZHVsZXMgYXZhaWxhYmxlIGluIFEsIERPIE5PVCBhZGQgbmV3IGVudHJpZXMgaGVyZS4KQEAgLTkxLDYgKzE2MiwyNCBAQAogICAgIGNvbS5hbmRyb2lkLnBlcm1pc3Npb246c2VydmljZS1wZXJtaXNzaW9uIFwKICAgICBjb20uYW5kcm9pZC5ya3BkOnNlcnZpY2UtcmtwIFwKIAorIyBXaGVuIHdlIHJlbGVhc2UgY3Jhc2hyZWNvdmVyeSBtb2R1bGUKK2lmZXEgKCQoUkVMRUFTRV9DUkFTSFJFQ09WRVJZX01PRFVMRSksdHJ1ZSkKKyAgUFJPRFVDVF9BUEVYX1NZU1RFTV9TRVJWRVJfSkFSUyArPSBcCisgICAgICAgIGNvbS5hbmRyb2lkLmNyYXNocmVjb3Zlcnk6c2VydmljZS1jcmFzaHJlY292ZXJ5IFwKKworZW5kaWYKKworIyBXaGVuIHdlIHJlbGVhc2Ugb25kZXZpY2VpbnRlbGxpZ2VuY2UgaW4gTmV1cmFsTmV0d29ya3MgbW9kdWxlCitpZmVxICgkKFJFTEVBU0VfT05ERVZJQ0VfSU5URUxMSUdFTkNFX01PRFVMRSksdHJ1ZSkKKyAgICBQUk9EVUNUX0FQRVhfU1lTVEVNX1NFUlZFUl9KQVJTICs9IFwKKyAgICAgICAgY29tLmFuZHJvaWQubmV1cmFsbmV0d29ya3M6c2VydmljZS1vbmRldmljZWludGVsbGlnZW5jZQorCitlbmRpZgorCitpZmVxICgkKFJFTEVBU0VfQVZGX0VOQUJMRV9MTFBWTV9DSEFOR0VTKSx0cnVlKQorICBQUk9EVUNUX0FQRVhfU1lTVEVNX1NFUlZFUl9KQVJTICs9IGNvbS5hbmRyb2lkLnZpcnQ6c2VydmljZS12aXJ0dWFsaXphdGlvbgorZW5kaWYKKwogIyBVc2UgJCh3aWxkY2FyZCkgdG8gYXZvaWQgcmVmZXJlbmNpbmcgdGhlIHByb2ZpbGUgaW4gdGhpbiBtYW5pZmVzdHMgdGhhdCBkb24ndCBoYXZlIHRoZQogIyBhcnQgcHJvamVjdC4KIGlmbmVxICgsJCh3aWxkY2FyZCBhcnQpKQpAQCAtMTA1LDcgKzE5NCw3IEBACiAjIEtlZXAgdGhlIGxpc3Qgc29ydGVkIGJ5IG1vZHVsZSBuYW1lcyBhbmQgdGhlbiBsaWJyYXJ5IG5hbWVzLgogIyBOb3RlOiBGb3IgbW9kdWxlcyBhdmFpbGFibGUgaW4gUSwgRE8gTk9UIGFkZCBuZXcgZW50cmllcyBoZXJlLgogUFJPRFVDVF9BUEVYX1NUQU5EQUxPTkVfU1lTVEVNX1NFUlZFUl9KQVJTIDo9IFwKLSAgICBjb20uYW5kcm9pZC5idHNlcnZpY2VzOnNlcnZpY2UtYmx1ZXRvb3RoIFwKKyAgICBjb20uYW5kcm9pZC5idDpzZXJ2aWNlLWJsdWV0b290aCBcCiAgICAgY29tLmFuZHJvaWQuZGV2aWNlbG9jazpzZXJ2aWNlLWRldmljZWxvY2sgXAogICAgIGNvbS5hbmRyb2lkLm9zLnN0YXRzZDpzZXJ2aWNlLXN0YXRzZCBcCiAgICAgY29tLmFuZHJvaWQuc2NoZWR1bGluZzpzZXJ2aWNlLXNjaGVkdWxpbmcgXApAQCAtMTEzLDYgKzIwMiwyNSBAQAogICAgIGNvbS5hbmRyb2lkLnV3YjpzZXJ2aWNlLXV3YiBcCiAgICAgY29tLmFuZHJvaWQud2lmaTpzZXJ2aWNlLXdpZmkgXAogCisjIENoZWNrIGlmIGJ1aWxkIHN1cHBvcnRzIFByb2ZpbGluZyBtb2R1bGUuCitpZmVxICgkKFJFTEVBU0VfUEFDS0FHRV9QUk9GSUxJTkdfTU9EVUxFKSx0cnVlKQorICAgIFBST0RVQ1RfQVBFWF9TVEFOREFMT05FX1NZU1RFTV9TRVJWRVJfSkFSUyArPSBcCisgICAgICAgIGNvbS5hbmRyb2lkLnByb2ZpbGluZzpzZXJ2aWNlLXByb2ZpbGluZyBcCisKK2VuZGlmCisKK2lmbmVxICgsJChSRUxFQVNFX1JBTkdJTkdfU1RBQ0spKQorICAgIFBST0RVQ1RfQVBFWF9TVEFOREFMT05FX1NZU1RFTV9TRVJWRVJfSkFSUyArPSBcCisgICAgICAgIGNvbS5hbmRyb2lkLnV3YjpzZXJ2aWNlLXJhbmdpbmcKK2VuZGlmCisKKyMgT3ZlcnJpZGVzIHRoZSAoYXBleCwgamFyKSBwYWlycyBhYm92ZSB3aGVuIGRldGVybWluaW5nIHRoZSBvbi1kZXZpY2UgbG9jYXRpb24uIFRoZSBmb3JtYXQgaXM6CisjIDxvbGRfYXBleD46PG9sZF9qYXI+OjxuZXdfYXBleD46PG5ld19qYXI+CitQUk9EVUNUX0NPTkZJR1VSRURfSkFSX0xPQ0FUSU9OX09WRVJSSURFUyA6PSBcCisgICAgcGxhdGZvcm06ZnJhbWV3b3JrLW1pbnVzLWFwZXg6cGxhdGZvcm06ZnJhbWV3b3JrIFwKKyAgICBwbGF0Zm9ybTpjb3JlLWljdTRqLWhvc3Q6Y29tLmFuZHJvaWQuaTE4bjpjb3JlLWljdTRqIFwKKyAgICBwbGF0Zm9ybTpjb25zY3J5cHQtaG9zdDpjb20uYW5kcm9pZC5jb25zY3J5cHQ6Y29uc2NyeXB0IFwKKwogIyBNaW5pbWFsIGNvbmZpZ3VyYXRpb24gZm9yIHJ1bm5pbmcgZGV4Mm9hdCAoZGVmYXVsdCBhcmd1bWVudCB2YWx1ZXMpLgogIyBQUk9EVUNUX1VTRVNfREVGQVVMVF9BUlRfQ09ORklHIG11c3QgYmUgdHJ1ZSB0byBlbmFibGUgYm9vdCBpbWFnZSBjb21waWxhdGlvbi4KIFBST0RVQ1RfVVNFU19ERUZBVUxUX0FSVF9DT05GSUcgOj0gdHJ1ZQpAQCAtMTIyLDQgKzIzMCw0IEBACiAgICAgZGFsdmlrLnZtLmRleDJvYXQtWG1zPTY0bSBcCiAgICAgZGFsdmlrLnZtLmRleDJvYXQtWG14PTUxMm0gXAogCi1QUk9EVUNUX0VOQUJMRV9VRkZEX0dDIDo9IGZhbHNlICAjIFRPRE8oamlha2Fpeik6IENoYW5nZSB0aGlzIHRvICJkZWZhdWx0Ii4KK1BST0RVQ1RfRU5BQkxFX1VGRkRfR0MgOj0gZGVmYXVsdApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvZW11bGF0b3Jfc3lzdGVtLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvZW11bGF0b3Jfc3lzdGVtLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2U3Y2ZhLi4wMDAwMDAwCi0tLSBhL3RhcmdldC9wcm9kdWN0L2VtdWxhdG9yX3N5c3RlbS5taworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jIFRoaXMgZmlsZSBsaXN0cyBlbXVsYXRvciBleHBlcmltZW50YWwgbW9kdWxlcyBhZGRlZCB0byBQUk9EVUNUX1BBQ0tBR0VTLAotIyBvbmx5IGluY2x1ZGVkIGJ5IHRhcmdldHMgc2RrX3Bob25lX3g4Ni82NCBhbmQgc2RrX2dwaG9uZV94ODYvNjQKLQotUFJPRFVDVF9BUlRJRkFDVF9QQVRIX1JFUVVJUkVNRU5UX0FMTE9XRURfTElTVCA6PSBcCi0gICAgc3lzdGVtL2xpYi9saWJlbXVsYXRvcl9tdWx0aWRpc3BsYXlfam5pLnNvIFwKLSAgICBzeXN0ZW0vbGliNjQvbGliZW11bGF0b3JfbXVsdGlkaXNwbGF5X2puaS5zbyBcCi0gICAgc3lzdGVtL3ByaXYtYXBwL011bHRpRGlzcGxheVByb3ZpZGVyL011bHRpRGlzcGxheVByb3ZpZGVyLmFwayBcCi0KLVBST0RVQ1RfUEFDS0FHRVMgKz0gTXVsdGlEaXNwbGF5UHJvdmlkZXIKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2VtdWxhdG9yX3ZlbmRvci5tayBiL3RhcmdldC9wcm9kdWN0L2VtdWxhdG9yX3ZlbmRvci5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcxYjI3NS4uMDAwMDAwMAotLS0gYS90YXJnZXQvcHJvZHVjdC9lbXVsYXRvcl92ZW5kb3IubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jCi0jIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBieSBvdGhlciBwcm9kdWN0IG1ha2VmaWxlcyB0byBhZGQgYWxsIHRoZQotIyBlbXVsYXRvci1yZWxhdGVkIG1vZHVsZXMgdG8gUFJPRFVDVF9QQUNLQUdFUy4KLSMKLQotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9oYW5kaGVsZF92ZW5kb3IubWspCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L3RlbGVwaG9ueV92ZW5kb3IubWspCi0KLSMgbmVlZCB0aGlzIGZvciBnbGVzIGxpYnJhcmllcyB0byBsb2FkIHByb3Blcmx5Ci0jIGFmdGVyIG1vdmluZyB0byAvdmVuZG9yL2xpYi8KLVBST0RVQ1RfUEFDS0FHRVMgKz0gXAotICAgIHZuZGstc3AKLQotREVWSUNFX1BBQ0tBR0VfT1ZFUkxBWVMgOj0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvb3ZlcmxheQotCi1QUk9EVUNUX0NIQVJBQ1RFUklTVElDUyA6PSBlbXVsYXRvcgotCi1QUk9EVUNUX0ZVTExfVFJFQkxFX09WRVJSSURFIDo9IHRydWUKLQotIyBnb2xkZmlzaCB2ZW5kb3IgcGFydGl0aW9uIGNvbmZpZ3VyYXRpb25zCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LWlmLWV4aXN0cywgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvdmVuZG9yLm1rKQotCi0jd2F0Y2hkb2cgdGlnZ2VycyByZWJvb3QgYmVjYXVzZSBsb2NhdGlvbiBzZXJ2aWNlIGlzIG5vdAotI3Jlc3BvbmRpbmcsIGRpc2JsZSBpdCBmb3Igbm93LgotI3N0aWxsIGtlZXAgaXQgb24gaW50ZXJuYWwgbWFpbiAobWFzdGVyKSBhcyBpdCBpcyBzdGlsbCB3b3JraW5nCi0jb25jZSBpdCBpcyBmaXhlZCBpbiBhb3NwLCByZW1vdmUgdGhpcyBibG9jayBvZiBjb21tZW50LgotI1BST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gXAotI2NvbmZpZy5kaXNhYmxlX2xvY2F0aW9uPXRydWUKLQotIyBlbmFibGUgR29vZ2xlLXNwZWNpZmljIGxvY2F0aW9uIGZlYXR1cmVzLAotIyBsaWtlIE5ldHdvcmtMb2NhdGlvblByb3ZpZGVyIGFuZCBMb2NhdGlvbkNvbGxlY3RvcgotUFJPRFVDVF9TWVNURU1fRVhUX1BST1BFUlRJRVMgKz0gXAotICAgIHJvLmNvbS5nb29nbGUubG9jYXRpb25mZWF0dXJlcz0xCi0KLSMgZGlzYWJsZSBzZXR1cHdpemFyZAotUFJPRFVDVF9TWVNURU1fRVhUX1BST1BFUlRJRVMgKz0gXAotICAgIHJvLnNldHVwd2l6YXJkLm1vZGU/PURJU0FCTEVECmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9mdWxsLm1hbmlmZXN0LnhtbCBiL3RhcmdldC9wcm9kdWN0L2Z1bGwubWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YjBkMzcKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvcHJvZHVjdC9mdWxsLm1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDIgQEAKKzxtYW5pZmVzdCB2ZXJzaW9uPSIxLjAiIHR5cGU9ImRldmljZSIgdGFyZ2V0LWxldmVsPSI3Ij4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9mdWxsLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvZnVsbC5tawppbmRleCA5NDU5NTdmLi5kYTA0ZjQ5IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9mdWxsLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2Z1bGwubWsKQEAgLTIwLDEwICsyMCwxMSBAQAogIyBlbnRpcmVseSBhcHByb3ByaWF0ZSB0byBpbmhlcml0IGZyb20gZm9yIG9uLWRldmljZSBjb25maWd1cmF0aW9ucy4KIAogJChjYWxsIGluaGVyaXQtcHJvZHVjdC1pZi1leGlzdHMsIGJ1aWxkL21ha2UvdGFyZ2V0L3Byb2R1Y3QvcmFtZGlza19zdHViLm1rKQotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9lbXVsYXRvcl92ZW5kb3IubWspCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2Fvc3BfYmFzZV90ZWxlcGhvbnkubWspCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9ib2FyZC9nZW5lcmljL2RldmljZS5taykKIAorREVWSUNFX01BTklGRVNUX0ZJTEUgKz0gYnVpbGQvbWFrZS90YXJnZXQvcHJvZHVjdC9mdWxsLm1hbmlmZXN0LnhtbAorCiAjIEVuYWJsZSBkeW5hbWljIHBhcnRpdGlvbiBzaXplCiBQUk9EVUNUX1VTRV9EWU5BTUlDX1BBUlRJVElPTl9TSVpFIDo9IHRydWUKIApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvZnVsbF94ODYubWsgYi90YXJnZXQvcHJvZHVjdC9mdWxsX3g4Ni5tawppbmRleCAwZjNiZTkxLi5hMWI3MWNhIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9mdWxsX3g4Ni5taworKysgYi90YXJnZXQvcHJvZHVjdC9mdWxsX3g4Ni5tawpAQCAtMjMsMTkgKzIzLDE1IEBACiAjIHRoYXQgaXNuJ3QgYSB3aWZpIGNvbm5lY3Rpb24uIFRoaXMgd2lsbCBpbnN0cnVjdCBpbml0LnJjIHRvIGVuYWJsZSB0aGUKICMgbmV0d29yayBjb25uZWN0aW9uIHNvIHRoYXQgeW91IGNhbiB1c2UgaXQgd2l0aCBBREIKIAotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9lbXVsYXRvcl92ZW5kb3IubWspCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2Fvc3BfYmFzZV90ZWxlcGhvbnkubWspCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9ib2FyZC9nZW5lcmljX3g4Ni9kZXZpY2UubWspCiAKK0RFVklDRV9NQU5JRkVTVF9GSUxFICs9IGJ1aWxkL21ha2UvdGFyZ2V0L3Byb2R1Y3QvZnVsbC5tYW5pZmVzdC54bWwKKwogaWZkZWYgTkVUX0VUSDBfU1RBUlRPTkJPT1QKICAgUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSBuZXQuZXRoMC5zdGFydG9uYm9vdD0xCiBlbmRpZgogCi0jIEVuc3VyZSB3ZSBwYWNrYWdlIHRoZSBCSU9TIGZpbGVzIHRvby4KLVBST0RVQ1RfSE9TVF9QQUNLQUdFUyArPSBcCi0JYmlvcy5iaW4gXAotCXZnYWJpb3MtY2lycnVzLmJpbiBcCi0KICMgRW5hYmxlIGR5bmFtaWMgcGFydGl0aW9uIHNpemUKIFBST0RVQ1RfVVNFX0RZTkFNSUNfUEFSVElUSU9OX1NJWkUgOj0gdHJ1ZQogCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9mdWxsbXRlLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvZnVsbG10ZS5tawppbmRleCBkNDdjNjg1Li5mZWQ2NmU3IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9mdWxsbXRlLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2Z1bGxtdGUubWsKQEAgLTIwLDcgKzIwLDggQEAKICMgRm9yIG1vcmUgZGV0YWlscywgc2VlOgogIyBodHRwczovL3NvdXJjZS5hbmRyb2lkLmNvbS9kb2NzL3NlY3VyaXR5L3Rlc3QvbWVtb3J5LXNhZmV0eS9hcm0tbXRlCiBpZmVxICgkKGZpbHRlciBtZW10YWdfaGVhcCwkKFNBTklUSVpFX1RBUkdFVCkpLCkKLSAgU0FOSVRJWkVfVEFSR0VUIDo9ICQoc3RyaXAgJChTQU5JVElaRV9UQVJHRVQpIG1lbXRhZ19oZWFwIG1lbXRhZ19zdGFjaykKKyAgU0FOSVRJWkVfVEFSR0VUIDo9ICQoc3RyaXAgJChTQU5JVElaRV9UQVJHRVQpIG1lbXRhZ19oZWFwIG1lbXRhZ19zdGFjayBtZW10YWdfZ2xvYmFscykKICAgU0FOSVRJWkVfVEFSR0VUX0RJQUcgOj0gJChzdHJpcCAkKFNBTklUSVpFX1RBUkdFVF9ESUFHKSBtZW10YWdfaGVhcCkKIGVuZGlmCiBQUk9EVUNUX1BST0RVQ1RfUFJPUEVSVElFUyArPSBwZXJzaXN0LmFybTY0Lm1lbXRhZy5kZWZhdWx0PXN5bmMKK1BST0RVQ1RfU0NVRE9fQUxMT0NBVElPTl9SSU5HX0JVRkZFUl9TSVpFIDo9IDEzMTA3MgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy5tayBiL3RhcmdldC9wcm9kdWN0L2dlbmVyaWMubWsKaW5kZXggZmI1YjcyNy4uZmQzYjNmYiAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy5taworKysgYi90YXJnZXQvcHJvZHVjdC9nZW5lcmljLm1rCkBAIC0xNCw5ICsxNCw2IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1QUk9EVUNUX1NPT05HX05BTUVTUEFDRVMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2ggIyBmb3IgbGlid2lmaS1oYWwtZW11Ci1QUk9EVUNUX1NPT05HX05BTUVTUEFDRVMgKz0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gtb3BlbmdsICMgZm9yIGdvbGRmaXNoIGRlcHMuCi0KICMgVGhpcyBpcyBhIGdlbmVyaWMgcGhvbmUgcHJvZHVjdCB0aGF0IGlzbid0IHNwZWNpYWxpemVkIGZvciBhIHNwZWNpZmljIGRldmljZS4KICMgSXQgaW5jbHVkZXMgdGhlIGJhc2UgQW5kcm9pZCBwbGF0Zm9ybS4KIApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy9BbmRyb2lkLmJwIGIvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMmFjMDkKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvcHJvZHVjdC9nZW5lcmljL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw5OTUgQEAKK2dlbmVyaWNfcm9vdGRpcnMgPSBbCisgICAgImFwZXgiLAorICAgICJib290c3RyYXAtYXBleCIsCisgICAgImNvbmZpZyIsCisgICAgImRhdGEiLAorICAgICJkYXRhX21pcnJvciIsCisgICAgImRlYnVnX3JhbWRpc2siLAorICAgICJkZXYiLAorICAgICJsaW5rZXJjb25maWciLAorICAgICJtZXRhZGF0YSIsCisgICAgIm1udCIsCisgICAgIm9kbSIsCisgICAgIm9kbV9kbGttIiwKKyAgICAib2VtIiwKKyAgICAicG9zdGluc3RhbGwiLAorICAgICJwcm9jIiwKKyAgICAic2Vjb25kX3N0YWdlX3Jlc291cmNlcyIsCisgICAgInN0b3JhZ2UiLAorICAgICJzeXMiLAorICAgICJzeXN0ZW0iLAorICAgICJzeXN0ZW1fZGxrbSIsCisgICAgInRtcCIsCisgICAgInZlbmRvciIsCisgICAgInZlbmRvcl9kbGttIiwKK10KKworYW5kcm9pZF9yb290ZGlycyA9IFsKKyAgICAic3lzdGVtX2V4dCIsCisgICAgInByb2R1Y3QiLAorXQorCitnZW5lcmljX3N5bWxpbmtzID0gWworICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3N5c3RlbS9iaW4vaW5pdCIsCisgICAgICAgIG5hbWU6ICJpbml0IiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3N5c3RlbS9ldGMiLAorICAgICAgICBuYW1lOiAiZXRjIiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3N5c3RlbS9iaW4iLAorICAgICAgICBuYW1lOiAiYmluIiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3ZlbmRvciIsCisgICAgICAgIG5hbWU6ICJzeXN0ZW0vdmVuZG9yIiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3N5c3RlbV9kbGttL2xpYi9tb2R1bGVzIiwKKyAgICAgICAgbmFtZTogInN5c3RlbS9saWIvbW9kdWxlcyIsCisgICAgfSwKKyAgICB7CisgICAgICAgIHRhcmdldDogIi9kYXRhL3VzZXJfZGUvMC9jb20uYW5kcm9pZC5zaGVsbC9maWxlcy9idWdyZXBvcnRzIiwKKyAgICAgICAgbmFtZTogImJ1Z3JlcG9ydHMiLAorICAgIH0sCisgICAgeworICAgICAgICB0YXJnZXQ6ICIvc3lzL2tlcm5lbC9kZWJ1ZyIsCisgICAgICAgIG5hbWU6ICJkIiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3N0b3JhZ2Uvc2VsZi9wcmltYXJ5IiwKKyAgICAgICAgbmFtZTogInNkY2FyZCIsCisgICAgfSwKKyAgICB7CisgICAgICAgIHRhcmdldDogIi9wcm9kdWN0L2V0Yy9zZWN1cml0eS9hZGJfa2V5cyIsCisgICAgICAgIG5hbWU6ICJhZGJfa2V5cyIsCisgICAgfSwKKyAgICAvLyBGb3IgVHJlYmxlIEdlbmVyaWMgU3lzdGVtIEltYWdlIChHU0kpLCBzeXN0ZW0tYXMtcm9vdCBHU0kgbmVlZHMgdG8gd29yayBvbiBib3RoIGRldmljZXMgd2l0aAorICAgIC8vIGFuZCB3aXRob3V0IC9vZG0gcGFydGl0aW9uLiBUaG9zZSBzeW1saW5rcyBhcmUgZm9yIGRldmljZXMgd2l0aG91dCAvb2RtIHBhcnRpdGlvbi4gRm9yCisgICAgLy8gZGV2aWNlcyB3aXRoIC9vZG0gcGFydGl0aW9uLCBtb3VudCBvZG0uaW1nIHVuZGVyIC9vZG0gd2lsbCBoaWRlIHRob3NlIHN5bWxpbmtzLgorICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3ZlbmRvci9vZG0vYXBwIiwKKyAgICAgICAgbmFtZTogIm9kbS9hcHAiLAorICAgIH0sCisgICAgeworICAgICAgICB0YXJnZXQ6ICIvdmVuZG9yL29kbS9iaW4iLAorICAgICAgICBuYW1lOiAib2RtL2JpbiIsCisgICAgfSwKKyAgICB7CisgICAgICAgIHRhcmdldDogIi92ZW5kb3Ivb2RtL2V0YyIsCisgICAgICAgIG5hbWU6ICJvZG0vZXRjIiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3ZlbmRvci9vZG0vZmlybXdhcmUiLAorICAgICAgICBuYW1lOiAib2RtL2Zpcm13YXJlIiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3ZlbmRvci9vZG0vZnJhbWV3b3JrIiwKKyAgICAgICAgbmFtZTogIm9kbS9mcmFtZXdvcmsiLAorICAgIH0sCisgICAgeworICAgICAgICB0YXJnZXQ6ICIvdmVuZG9yL29kbS9saWIiLAorICAgICAgICBuYW1lOiAib2RtL2xpYiIsCisgICAgfSwKKyAgICB7CisgICAgICAgIHRhcmdldDogIi92ZW5kb3Ivb2RtL2xpYjY0IiwKKyAgICAgICAgbmFtZTogIm9kbS9saWI2NCIsCisgICAgfSwKKyAgICB7CisgICAgICAgIHRhcmdldDogIi92ZW5kb3Ivb2RtL292ZXJsYXkiLAorICAgICAgICBuYW1lOiAib2RtL292ZXJsYXkiLAorICAgIH0sCisgICAgeworICAgICAgICB0YXJnZXQ6ICIvdmVuZG9yL29kbS9wcml2LWFwcCIsCisgICAgICAgIG5hbWU6ICJvZG0vcHJpdi1hcHAiLAorICAgIH0sCisgICAgeworICAgICAgICB0YXJnZXQ6ICIvdmVuZG9yL29kbS91c3IiLAorICAgICAgICBuYW1lOiAib2RtL3VzciIsCisgICAgfSwKK10KKworYW5kcm9pZF9zeW1saW5rcyA9IFsKKyAgICB7CisgICAgICAgIHRhcmdldDogIi9wcm9kdWN0IiwKKyAgICAgICAgbmFtZTogInN5c3RlbS9wcm9kdWN0IiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3N5c3RlbV9leHQiLAorICAgICAgICBuYW1lOiAic3lzdGVtL3N5c3RlbV9leHQiLAorICAgIH0sCisgICAgeworICAgICAgICB0YXJnZXQ6ICIvZGF0YS9jYWNoZSIsCisgICAgICAgIG5hbWU6ICJjYWNoZSIsCisgICAgfSwKK10KKworZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAiZ2VuZXJpY19zeXN0ZW1fc2lnbl9rZXkiLAorICAgIHNyY3M6IFsiOmF2Yl90ZXN0a2V5X3JzYTQwOTYiXSwKK30KKworcGhvbnkgeworICAgIG5hbWU6ICJnZW5lcmljX3N5c3RlbV9mb250cyIsCisgICAgcmVxdWlyZWQ6IFsKKyAgICAgICAgIkFuZHJvaWRDbG9jay50dGYiLAorICAgICAgICAiQ2Fycm9pc0dvdGhpY1NDLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIkNvbWluZ1Nvb24udHRmIiwKKyAgICAgICAgIkN1dGl2ZU1vbm8udHRmIiwKKyAgICAgICAgIkRhbmNpbmdTY3JpcHQtUmVndWxhci50dGYiLAorICAgICAgICAiRHJvaWRTYW5zTW9uby50dGYiLAorICAgICAgICAiTm90b0NvbG9yRW1vamkudHRmIiwKKyAgICAgICAgIk5vdG9Db2xvckVtb2ppRmxhZ3MudHRmIiwKKyAgICAgICAgIk5vdG9OYXNraEFyYWJpYy1Cb2xkLnR0ZiIsCisgICAgICAgICJOb3RvTmFza2hBcmFiaWMtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b05hc2toQXJhYmljVUktQm9sZC50dGYiLAorICAgICAgICAiTm90b05hc2toQXJhYmljVUktUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNBZGxhbS1WRi50dGYiLAorICAgICAgICAiTm90b1NhbnNBaG9tLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zQW5hdG9saWFuSGllcm9nbHlwaHMtUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNBcm1lbmlhbi1WRi50dGYiLAorICAgICAgICAiTm90b1NhbnNBdmVzdGFuLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zQmFsaW5lc2UtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNCYW11bS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0Jhc3NhVmFoLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zQmF0YWstUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNCZW5nYWxpLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0JlbmdhbGlVSS1WRi50dGYiLAorICAgICAgICAiTm90b1NhbnNCaGFpa3N1a2ktUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNCcmFobWktUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNCdWdpbmVzZS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0J1aGlkLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zQ0pLLVJlZ3VsYXIudHRjIiwKKyAgICAgICAgIk5vdG9TYW5zQ2FuYWRpYW5BYm9yaWdpbmFsLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zQ2FyaWFuLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zQ2hha21hLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zQ2hhbS1Cb2xkLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0NoYW0tUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNDaGVyb2tlZS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0NvcHRpYy1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0N1bmVpZm9ybS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0N5cHJpb3QtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNEZXNlcmV0LVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zRGV2YW5hZ2FyaS1WRi50dGYiLAorICAgICAgICAiTm90b1NhbnNEZXZhbmFnYXJpVUktVkYudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zRWd5cHRpYW5IaWVyb2dseXBocy1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0VsYmFzYW4tUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNFdGhpb3BpYy1WRi50dGYiLAorICAgICAgICAiTm90b1NhbnNHZW9yZ2lhbi1WRi50dGYiLAorICAgICAgICAiTm90b1NhbnNHbGFnb2xpdGljLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zR290aGljLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zR3JhbnRoYS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0d1amFyYXRpLUJvbGQudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zR3VqYXJhdGktUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNHdWphcmF0aVVJLUJvbGQudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zR3VqYXJhdGlVSS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0d1bmphbGFHb25kaS1SZWd1bGFyLm90ZiIsCisgICAgICAgICJOb3RvU2Fuc0d1cm11a2hpLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0d1cm11a2hpVUktVkYudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zSGFuaWZpUm9oaW5neWEtUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNIYW51bm9vLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zSGF0cmFuLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zSGVicmV3LUJvbGQudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zSGVicmV3LVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zSW1wZXJpYWxBcmFtYWljLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zSW5zY3JpcHRpb25hbFBhaGxhdmktUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNJbnNjcmlwdGlvbmFsUGFydGhpYW4tUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNKYXZhbmVzZS1SZWd1bGFyLm90ZiIsCisgICAgICAgICJOb3RvU2Fuc0thaXRoaS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0thbm5hZGEtVkYudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zS2FubmFkYVVJLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0theWFoTGktUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNLaGFyb3NodGhpLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zS2htZXItVkYudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zS2htZXJVSS1Cb2xkLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0tobWVyVUktUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNLaG9qa2ktUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNMYW8tQm9sZC50dGYiLAorICAgICAgICAiTm90b1NhbnNMYW8tUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNMYW9VSS1Cb2xkLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0xhb1VJLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zTGVwY2hhLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zTGltYnUtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNMaW5lYXJBLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zTGluZWFyQi1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0xpc3UtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNMeWNpYW4tUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNMeWRpYW4tUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNNYWxheWFsYW0tVkYudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zTWFsYXlhbGFtVUktVkYudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zTWFuZGFpYy1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc01hbmljaGFlYW4tUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNNYXJjaGVuLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zTWFzYXJhbUdvbmRpLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zTWVkZWZhaWRyaW4tVkYudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zTWVldGVpTWF5ZWstUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNNZXJvaXRpYy1SZWd1bGFyLm90ZiIsCisgICAgICAgICJOb3RvU2Fuc01pYW8tUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNNb2RpLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zTW9uZ29saWFuLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zTXJvLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zTXVsdGFuaS1SZWd1bGFyLm90ZiIsCisgICAgICAgICJOb3RvU2Fuc015YW5tYXItQm9sZC5vdGYiLAorICAgICAgICAiTm90b1NhbnNNeWFubWFyLU1lZGl1bS5vdGYiLAorICAgICAgICAiTm90b1NhbnNNeWFubWFyLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zTXlhbm1hclVJLUJvbGQub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zTXlhbm1hclVJLU1lZGl1bS5vdGYiLAorICAgICAgICAiTm90b1NhbnNNeWFubWFyVUktUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNOS28tUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNOYWJhdGFlYW4tUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNOZXdUYWlMdWUtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNOZXdhLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zT2doYW0tUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNPbENoaWtpLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zT2xkSXRhbGljLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zT2xkTm9ydGhBcmFiaWFuLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zT2xkUGVybWljLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zT2xkUGVyc2lhbi1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc09sZFNvdXRoQXJhYmlhbi1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc09sZFR1cmtpYy1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc09yaXlhLUJvbGQudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zT3JpeWEtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNPcml5YVVJLUJvbGQudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zT3JpeWFVSS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc09zYWdlLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zT3NtYW55YS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1BhaGF3aEhtb25nLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zUGFsbXlyZW5lLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zUGF1Q2luSGF1LVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zUGhhZ3NQYS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1Bob2VuaWNpYW4tUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNSZWphbmctUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNSdW5pYy1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1NhbWFyaXRhbi1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1NhdXJhc2h0cmEtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNTaGFyYWRhLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zU2hhdmlhbi1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1NpbmhhbGEtVkYudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zU2luaGFsYVVJLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1NvcmFTb21wZW5nLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zU295b21iby1WRi50dGYiLAorICAgICAgICAiTm90b1NhbnNTdW5kYW5lc2UtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNTeWxvdGlOYWdyaS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1N5bWJvbHMtUmVndWxhci1TdWJzZXR0ZWQudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zU3ltYm9scy1SZWd1bGFyLVN1YnNldHRlZDIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zU3lyaWFjRWFzdGVybi1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1N5cmlhY0VzdHJhbmdlbGEtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNTeXJpYWNXZXN0ZXJuLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zVGFnYWxvZy1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1RhZ2JhbndhLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zVGFpTGUtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNUYWlUaGFtLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zVGFpVmlldC1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1Rha3JpLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1RhbWlsLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1RhbWlsVUktVkYudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zVGVsdWd1LVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1RlbHVndVVJLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1RoYWFuYS1Cb2xkLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1RoYWFuYS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1RoYWktQm9sZC50dGYiLAorICAgICAgICAiTm90b1NhbnNUaGFpLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zVGhhaVVJLUJvbGQudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zVGhhaVVJLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zVGlmaW5hZ2gtUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNVZ2FyaXRpYy1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1ZhaS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1dhbmNoby1SZWd1bGFyLm90ZiIsCisgICAgICAgICJOb3RvU2Fuc1dhcmFuZ0NpdGktUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNZaS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2VyaWYtQm9sZC50dGYiLAorICAgICAgICAiTm90b1NlcmlmLUJvbGRJdGFsaWMudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZi1JdGFsaWMudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZi1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2VyaWZBcm1lbmlhbi1WRi50dGYiLAorICAgICAgICAiTm90b1NlcmlmQmVuZ2FsaS1WRi50dGYiLAorICAgICAgICAiTm90b1NlcmlmQ0pLLVJlZ3VsYXIudHRjIiwKKyAgICAgICAgIk5vdG9TZXJpZkRldmFuYWdhcmktVkYudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZkRvZ3JhLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZkV0aGlvcGljLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2VyaWZHZW9yZ2lhbi1WRi50dGYiLAorICAgICAgICAiTm90b1NlcmlmR3VqYXJhdGktVkYudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZkd1cm11a2hpLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2VyaWZIZWJyZXctQm9sZC50dGYiLAorICAgICAgICAiTm90b1NlcmlmSGVicmV3LVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZkhlbnRhaWdhbmEudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZkthbm5hZGEtVkYudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZktobWVyLUJvbGQub3RmIiwKKyAgICAgICAgIk5vdG9TZXJpZktobWVyLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TZXJpZkxhby1Cb2xkLnR0ZiIsCisgICAgICAgICJOb3RvU2VyaWZMYW8tUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NlcmlmTWFsYXlhbGFtLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2VyaWZNeWFubWFyLUJvbGQub3RmIiwKKyAgICAgICAgIk5vdG9TZXJpZk15YW5tYXItUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NlcmlmTnlpYWtlbmdQdWFjaHVlSG1vbmctVkYudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZlNpbmhhbGEtVkYudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZlRhbWlsLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2VyaWZUZWx1Z3UtVkYudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZlRoYWktQm9sZC50dGYiLAorICAgICAgICAiTm90b1NlcmlmVGhhaS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2VyaWZUaWJldGFuLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2VyaWZZZXppZGktVkYudHRmIiwKKyAgICAgICAgIlJvYm90by1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJSb2JvdG9GbGV4LVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIlJvYm90b1N0YXRpYy1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJTb3VyY2VTYW5zUHJvLUJvbGQudHRmIiwKKyAgICAgICAgIlNvdXJjZVNhbnNQcm8tQm9sZEl0YWxpYy50dGYiLAorICAgICAgICAiU291cmNlU2Fuc1Byby1JdGFsaWMudHRmIiwKKyAgICAgICAgIlNvdXJjZVNhbnNQcm8tUmVndWxhci50dGYiLAorICAgICAgICAiU291cmNlU2Fuc1Byby1TZW1pQm9sZC50dGYiLAorICAgICAgICAiU291cmNlU2Fuc1Byby1TZW1pQm9sZEl0YWxpYy50dGYiLAorICAgICAgICAiZm9udF9mYWxsYmFjay54bWwiLAorICAgICAgICAiZm9udHMueG1sIiwKKyAgICBdLAorfQorCithbmRyb2lkX2ZpbGVzeXN0ZW1fZGVmYXVsdHMgeworICAgIG5hbWU6ICJzeXN0ZW1fZXh0X2ltYWdlX2RlZmF1bHRzIiwKKyAgICBkZXBzOiBbCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gYmFzZV9zeXN0ZW1fZXh0CisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgImJ1aWxkX2ZsYWdfc3lzdGVtX2V4dCIsCisgICAgICAgICJmc19jb25maWdfZGlyc19zeXN0ZW1fZXh0IiwKKyAgICAgICAgImZzX2NvbmZpZ19maWxlc19zeXN0ZW1fZXh0IiwKKyAgICAgICAgImdyb3VwX3N5c3RlbV9leHQiLAorICAgICAgICAicGFzc3dkX3N5c3RlbV9leHQiLAorICAgICAgICAiU2F0ZWxsaXRlQ2xpZW50IiwKKyAgICAgICAgInNlbGludXhfcG9saWN5X3N5c3RlbV9leHQiLAorICAgICAgICAic3lzdGVtX2V4dF9tYW5pZmVzdC54bWwiLAorICAgICAgICAic3lzdGVtX2V4dC1idWlsZC5wcm9wIiwKKyAgICAgICAgLy8gQmFzZSBtb2R1bGVzIHdoZW4gc2hpcHBpbmcgYXBpIGxldmVsIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAzNAorICAgICAgICAiaHdzZXJ2aWNlbWFuYWdlciIsCisgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMC1zZXJ2aWNlIiwKKworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIC8vIHdpbmRvd19leHRlbnNpb25zX2Jhc2UKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAiYW5kcm9pZHgud2luZG93LmV4dGVuc2lvbnMiLAorICAgICAgICAiYW5kcm9pZHgud2luZG93LnNpZGVjYXIiLAorCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAiY2hhcmdlciIsCisgICAgXSArIHNlbGVjdChyZWxlYXNlX2ZsYWcoIlJFTEVBU0VfQVBQRlVOQ1RJT05fU0lERUNBUiIpLCB7CisgICAgICAgIHRydWU6IFsKKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5leHRlbnNpb25zLmFwcGZ1bmN0aW9ucyIsCisgICAgICAgICAgICAiYXBwZnVuY3Rpb25zLmV4dGVuc2lvbi54bWwiLAorICAgICAgICBdLAorICAgICAgICBkZWZhdWx0OiBbXSwKKyAgICB9KSwKK30KKworYW5kcm9pZF9maWxlc3lzdGVtX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAicHJvZHVjdF9pbWFnZV9kZWZhdWx0cyIsCisgICAgZGVwczogWworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIC8vIG1lZGlhX3Byb2R1Y3QKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAid2VidmlldyIsCisKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLyBiYXNlX3Byb2R1Y3QKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIC8vIEJhc2UgbW9kdWxlcyBhbmQgc2V0dGluZ3MgZm9yIHRoZSBwcm9kdWN0IHBhcnRpdGlvbi4KKyAgICAgICAgImJ1aWxkX2ZsYWdfcHJvZHVjdCIsCisgICAgICAgICJmc19jb25maWdfZGlyc19wcm9kdWN0IiwKKyAgICAgICAgImZzX2NvbmZpZ19maWxlc19wcm9kdWN0IiwKKyAgICAgICAgImdyb3VwX3Byb2R1Y3QiLAorICAgICAgICAiTW9kdWxlTWV0YWRhdGEiLAorICAgICAgICAicGFzc3dkX3Byb2R1Y3QiLAorICAgICAgICAicHJvZHVjdF9jb21wYXRpYmlsaXR5X21hdHJpeC54bWwiLAorICAgICAgICAicHJvZHVjdF9tYW5pZmVzdC54bWwiLAorICAgICAgICAic2VsaW51eF9wb2xpY3lfcHJvZHVjdCIsCisgICAgICAgICJwcm9kdWN0LWJ1aWxkLnByb3AiLAorCisgICAgICAgIC8vIEFVRElPCisgICAgICAgICJmcmFtZXdvcmtzX3NvdW5kcyIsCisgICAgXSArIHNlbGVjdChwcm9kdWN0X3ZhcmlhYmxlKCJkZWJ1Z2dhYmxlIiksIHsKKyAgICAgICAgLy8gUGFja2FnZXMgaW5jbHVkZWQgb25seSBmb3IgZW5nIG9yIHVzZXJkZWJ1ZyBidWlsZHMsIHByZXZpb3VzbHkgZGVidWcgdGFnZ2VkCisgICAgICAgIHRydWU6IFsiYWRiX2tleXMiXSwKKyAgICAgICAgZGVmYXVsdDogW10sCisgICAgfSksCit9CisKK2FuZHJvaWRfZmlsZXN5c3RlbV9kZWZhdWx0cyB7CisgICAgbmFtZTogInN5c3RlbV9pbWFnZV9kZWZhdWx0cyIsCisgICAgcGFydGl0aW9uX25hbWU6ICJzeXN0ZW0iLAorICAgIGJhc2VfZGlyOiAic3lzdGVtIiwKKyAgICBkaXJzOiBnZW5lcmljX3Jvb3RkaXJzLAorICAgIHN5bWxpbmtzOiBnZW5lcmljX3N5bWxpbmtzLAorICAgIGZpbGVfY29udGV4dHM6ICI6cGxhdF9maWxlX2NvbnRleHRzIiwKKyAgICBsaW5rZXJfY29uZmlnOiB7CisgICAgICAgIGdlbl9saW5rZXJfY29uZmlnOiB0cnVlLAorICAgICAgICBsaW5rZXJfY29uZmlnX3NyY3M6IFsiOnN5c3RlbV9saW5rZXJfY29uZmlnX2pzb25fZmlsZSJdLAorICAgIH0sCisgICAgZnN2ZXJpdHk6IHsKKyAgICAgICAgaW5wdXRzOiBbCisgICAgICAgICAgICAiZXRjL2Jvb3QtaW1hZ2UucHJvZiIsCisgICAgICAgICAgICAiZXRjL2NsYXNzcGF0aHMvKi5wYiIsCisgICAgICAgICAgICAiZXRjL2RpcnR5LWltYWdlLW9iamVjdHMiLAorICAgICAgICAgICAgImV0Yy9wcmVsb2FkZWQtY2xhc3NlcyIsCisgICAgICAgICAgICAiZnJhbWV3b3JrLyoiLAorICAgICAgICAgICAgImZyYW1ld29yay8qLyoiLCAvLyBmcmFtZXdvcmsve2FyY2h9CisgICAgICAgICAgICAiZnJhbWV3b3JrL29hdC8qLyoiLCAvLyBmcmFtZXdvcmsvb2F0L3thcmNofQorICAgICAgICBdLAorICAgICAgICBsaWJzOiBbIjpmcmFtZXdvcmstcmVzey5leHBvcnQtcGFja2FnZS5hcGt9Il0sCisgICAgfSwKKyAgICBidWlsZF9sb2d0YWdzOiB0cnVlLAorICAgIGdlbl9hY29uZmlnX2ZsYWdzX3BiOiB0cnVlLAorCisgICAgY29tcGlsZV9tdWx0aWxpYjogImJvdGgiLAorCisgICAgdXNlX2F2YjogdHJ1ZSwKKyAgICBhdmJfcHJpdmF0ZV9rZXk6ICI6Z2VuZXJpY19zeXN0ZW1fc2lnbl9rZXkiLAorICAgIGF2Yl9hbGdvcml0aG06ICJTSEEyNTZfUlNBNDA5NiIsCisgICAgYXZiX2hhc2hfYWxnb3JpdGhtOiAic2hhMjU2IiwKKworICAgIGRlcHM6IFsKKyAgICAgICAgImFieCIsCisgICAgICAgICJhY29uZmlnZC1zeXN0ZW0iLAorICAgICAgICAiYWZsYWdzIiwKKyAgICAgICAgImFtIiwKKyAgICAgICAgImFuZHJvaWQuc29mdHdhcmUuY3JlZGVudGlhbHMucHJlYnVpbHQueG1sIiwgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgImFuZHJvaWQuc29mdHdhcmUud2Vidmlldy5wcmVidWlsdC54bWwiLCAvLyBtZWRpYV9zeXN0ZW0KKyAgICAgICAgImFuZHJvaWQuc29mdHdhcmUud2luZG93X21hZ25pZmljYXRpb24ucHJlYnVpbHQueG1sIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICJhbmRyb2lkLnN5c3RlbS5zdXNwZW5kLXNlcnZpY2UiLAorICAgICAgICAiYXBleGQiLAorICAgICAgICAiYXBwb3BzIiwKKyAgICAgICAgImFwcHJvdmVkLW9na2ktYnVpbGRzLnhtbCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJhcHB3aWRnZXQiLAorICAgICAgICAiYXRyYWNlIiwKKyAgICAgICAgImF1ZGlvc2VydmVyIiwKKyAgICAgICAgImJjYyIsCisgICAgICAgICJibGFua19zY3JlZW4iLAorICAgICAgICAiYmxraWQiLAorICAgICAgICAiYm1nciIsCisgICAgICAgICJib290YW5pbWF0aW9uIiwKKyAgICAgICAgImJvb3RzdGF0IiwKKyAgICAgICAgImJwZmxvYWRlciIsCisgICAgICAgICJidSIsCisgICAgICAgICJidWdyZXBvcnQiLAorICAgICAgICAiYnVncmVwb3J0eiIsCisgICAgICAgICJjYW1lcmFzZXJ2ZXIiLAorICAgICAgICAiY2dyb3Vwcy5qc29uIiwKKyAgICAgICAgImNtZCIsCisgICAgICAgICJjb250ZW50IiwKKyAgICAgICAgImNwcHJlb3B0cy5zaCIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICJjcmVkc3RvcmUiLAorICAgICAgICAiZGVidWdnZXJkIiwKKyAgICAgICAgImRldmljZV9jb25maWciLAorICAgICAgICAiZGlydHktaW1hZ2Utb2JqZWN0cyIsCisgICAgICAgICJkbWN0bCIsCisgICAgICAgICJkbWVzZ2QiLAorICAgICAgICAiZG5zbWFzcSIsCisgICAgICAgICJkcG0iLAorICAgICAgICAiZHVtcC5lcm9mcyIsCisgICAgICAgICJkdW1wc3RhdGUiLAorICAgICAgICAiZHVtcHN5cyIsCisgICAgICAgICJlMmZzY2siLAorICAgICAgICAiZW5oYW5jZWQtY29uZmlybWF0aW9uLnhtbCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJldGNfaG9zdHMiLAorICAgICAgICAiZmxhZ3NfaGVhbHRoX2NoZWNrIiwKKyAgICAgICAgImZyYW1ld29yay1hdWRpb19lZmZlY3RzLnhtbCIsIC8vIGZvciBoYW5kaGVsZCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgImZyYW1ld29yay1zeXNjb25maWcueG1sIiwKKyAgICAgICAgImZzX2NvbmZpZ19kaXJzX3N5c3RlbSIsCisgICAgICAgICJmc19jb25maWdfZmlsZXNfc3lzdGVtIiwKKyAgICAgICAgImZzY2suZXJvZnMiLAorICAgICAgICAiZnNjay5mMmZzIiwgLy8gZm9yIG1lZGlhX3N5c3RlbQorICAgICAgICAiZnNja19tc2RvcyIsCisgICAgICAgICJmc3Zlcml0eS1yZWxlYXNlLWNlcnQtZGVyIiwKKyAgICAgICAgImdhdGVrZWVwZXJkIiwKKyAgICAgICAgImdwdV9jb3VudGVyX3Byb2R1Y2VyIiwKKyAgICAgICAgImdwdXNlcnZpY2UiLAorICAgICAgICAiZ3JvdXBfc3lzdGVtIiwKKyAgICAgICAgImdzaV90b29sIiwKKyAgICAgICAgImdzaWQiLAorICAgICAgICAiaGVhcHByb2ZkIiwKKyAgICAgICAgImhpZCIsCisgICAgICAgICJoaWRkZW5hcGktcGFja2FnZS13aGl0ZWxpc3QueG1sIiwgLy8gZnJvbSBydW50aW1lX2xpYmFydAorICAgICAgICAiaWRjX2RhdGEiLAorICAgICAgICAiaWRtYXAyIiwKKyAgICAgICAgImlkbWFwMmQiLAorICAgICAgICAiaW1lIiwKKyAgICAgICAgImluY2lkZW50IiwKKyAgICAgICAgImluY2lkZW50LWhlbHBlci1jbWQiLAorICAgICAgICAiaW5jaWRlbnRfaGVscGVyIiwKKyAgICAgICAgImluY2lkZW50ZCIsCisgICAgICAgICJpbml0LmVudmlyb24ucmMtc29vbmciLAorICAgICAgICAiaW5pdC51c2IuY29uZmlnZnMucmMiLAorICAgICAgICAiaW5pdC51c2IucmMiLAorICAgICAgICAiaW5pdC56eWdvdGUzMi5yYyIsCisgICAgICAgICJpbml0Lnp5Z290ZTY0LnJjIiwKKyAgICAgICAgImluaXQuenlnb3RlNjRfMzIucmMiLAorICAgICAgICAiaW5pdGlhbC1wYWNrYWdlLXN0b3BwZWQtc3RhdGVzLnhtbCIsCisgICAgICAgICJpbnB1dCIsCisgICAgICAgICJpbnN0YWxsZCIsCisgICAgICAgICJpcCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJpcHRhYmxlcyIsCisgICAgICAgICJrY21kbGluZWN0cmwiLAorICAgICAgICAia2VybmVsLWxpZmV0aW1lcy54bWwiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAia2V5Y2hhcnNfZGF0YSIsCisgICAgICAgICJrZXlsYXlvdXRfZGF0YSIsCisgICAgICAgICJrZXlzdG9yZTIiLAorICAgICAgICAibGQubWMiLAorICAgICAgICAibGxrZCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJsbWtkIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgImxvY2tzZXR0aW5ncyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJsb2djYXQiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAibG9nZCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJscGR1bXAiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAibHNoYWwiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAibWFrZV9mMmZzIiwgLy8gbWVkaWFfc3lzdGVtCisgICAgICAgICJtZG5zZCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJtZWRpYV9wcm9maWxlc19WMV8wLmR0ZCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJtZWRpYWNvZGVjLnBvbGljeSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJtZWRpYWV4dHJhY3RvciIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJtZWRpYW1ldHJpY3MiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAibWlzY3RybCIsIC8vIGZyb20gYmFzZV9zeXN0ZW0KKyAgICAgICAgIm1rZTJmcyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJta2ZzLmVyb2ZzIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgIm1vbmtleSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJtdGVjdHJsIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgIm5kYyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJuZXRkIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgIm5ldHV0aWxzLXdyYXBwZXItMS4wIiwgLy8gZnVsbF9iYXNlCisgICAgICAgICJub3RpY2VfeG1sX3N5c3RlbSIsCisgICAgICAgICJvZHNpZ24iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAib3RhcHJlb3B0X3NjcmlwdCIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICJwYWNrYWdlLXNoYXJlZHVpZC1hbGxvd2xpc3QueG1sIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInBhc3N3ZF9zeXN0ZW0iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAicGVyZmV0dG8iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAicGluZyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJwaW5nNiIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJwaW50b29sIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInBsYXRmb3JtLnhtbCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJwbSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJwcmVmZXRjaCIsIC8vYmFzZV9zeXN0ZW0KKyAgICAgICAgInByZWluc3RhbGxlZC1wYWNrYWdlcy1hc2wtZmlsZXMueG1sIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInByZWluc3RhbGxlZC1wYWNrYWdlcy1wbGF0Zm9ybS1nZW5lcmljLXN5c3RlbS54bWwiLCAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAicHJlaW5zdGFsbGVkLXBhY2thZ2VzLXBsYXRmb3JtLWhhbmRoZWxkLXN5c3RlbS54bWwiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgInByZWluc3RhbGxlZC1wYWNrYWdlcy1wbGF0Zm9ybS54bWwiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAicHJlaW5zdGFsbGVkLXBhY2thZ2VzLXN0cmljdC1zaWduYXR1cmUueG1sIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInByZWxvYWRlZC1jbGFzc2VzIiwgLy8gb2sKKyAgICAgICAgInByaW50ZmxhZ3MiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAicHJpdmFwcC1wZXJtaXNzaW9ucy1wbGF0Zm9ybS54bWwiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAicHJuZ19zZWVkZXIiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAicHVibGljLmxpYnJhcmllcy5hbmRyb2lkLnR4dCIsCisgICAgICAgICJyZWNvdmVyeS1wZXJzaXN0IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInJlY292ZXJ5LXJlZnJlc2giLCAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAicmVxdWVzdHN5bmMiLCAvLyBtZWRpYV9zeXN0ZW0KKyAgICAgICAgInJlc2l6ZTJmcyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJyc3NfaHdtX3Jlc2V0IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInJ1bi1hcyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJzY2hlZHRlc3QiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAic2NyZWVuY2FwIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInNjcmVlbnJlY29yZCIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAic2RjYXJkIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInNlY2Rpc2NhcmQiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAic2Vuc29yc2VydmljZSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJzZXJ2aWNlIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInNlcnZpY2VtYW5hZ2VyIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInNldHRpbmdzIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInNmZG8iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAic2dkaXNrIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInNtIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInNuYXB1c2VyZCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJzdG9yYWdlZCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJzdXJmYWNlZmxpbmdlciIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJzdmMiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAic3lzdGVtX21hbmlmZXN0LnhtbCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJ0YXNrX3Byb2ZpbGVzLmpzb24iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAidGMiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAidGVsZWNvbSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJ0b21ic3RvbmVkIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInRyYWNlZCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJ0cmFjZWRfcHJvYmVzIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInRyYWRlaW5tb2RlIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInR1bmUyZnMiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAidWlhdXRvbWF0b3IiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAidWlucHV0IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInVuY3J5cHQiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAidXBkYXRlX2VuZ2luZSIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICJ1cGRhdGVfZW5naW5lX3NpZGVsb2FkIiwgLy8gcmVjb3ZlcnkKKyAgICAgICAgInVwZGF0ZV92ZXJpZmllciIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICJ1c2JkIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInZkYyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJ2aXJ0dWFsX2NhbWVyYSIsIC8vIGhhbmRoZWxkX3N5c3RlbSAvLyByZWxlYXNlX3BhY2thZ2VfdmlydHVhbF9jYW1lcmEKKyAgICAgICAgInZvbGQiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAidnIiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgIndhdGNoZG9nZCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJ3aWZpLnJjIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgIndpZmljb25kIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgIndtIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICBdICsgc2VsZWN0KHJlbGVhc2VfZmxhZygiUkVMRUFTRV9QTEFURk9STV9WRVJTSU9OX0NPREVOQU1FIiksIHsKKyAgICAgICAgIlJFTCI6IFtdLAorICAgICAgICBkZWZhdWx0OiBbCisgICAgICAgICAgICAiYW5kcm9pZC5zb2Z0d2FyZS5wcmV2aWV3X3Nkay5wcmVidWlsdC54bWwiLCAvLyBtZWRpYV9zeXN0ZW0KKyAgICAgICAgXSwKKyAgICB9KSArIHNlbGVjdChyZWxlYXNlX2ZsYWcoIlJFTEVBU0VfTUVNT1JZX01BTkFHRU1FTlRfREFFTU9OIiksIHsKKyAgICAgICAgdHJ1ZTogWworICAgICAgICAgICAgIm1tX2RhZW1vbiIsIC8vIGJhc2Vfc3lzdGVtIChSRUxFQVNFX01FTU9SWV9NQU5BR0VNRU5UX0RBRU1PTikKKyAgICAgICAgXSwKKyAgICAgICAgZGVmYXVsdDogW10sCisgICAgfSkgKyBzZWxlY3QocHJvZHVjdF92YXJpYWJsZSgiZGVidWdnYWJsZSIpLCB7CisgICAgICAgIHRydWU6IFsKKyAgICAgICAgICAgICJhbGxvY3RvcCIsCisgICAgICAgICAgICAiYWRldmljZV9maW5nZXJwcmludCIsCisgICAgICAgICAgICAiYXJwaW5nIiwKKyAgICAgICAgICAgICJhdmJjdGwiLAorICAgICAgICAgICAgImJvb3RjdGwiLAorICAgICAgICAgICAgImRtdXNlcmQiLAorICAgICAgICAgICAgImV2ZW11LXJlY29yZCIsCisgICAgICAgICAgICAiaWRsY2xpIiwKKyAgICAgICAgICAgICJpbml0LWRlYnVnLnJjIiwKKyAgICAgICAgICAgICJpb3RvcCIsCisgICAgICAgICAgICAiaXBlcmYzIiwKKyAgICAgICAgICAgICJpdyIsCisgICAgICAgICAgICAibGF5ZXJ0cmFjZWdlbmVyYXRvciIsCisgICAgICAgICAgICAibG9ncGVyc2lzdC5zdGFydCIsCisgICAgICAgICAgICAibG9ndGFnZC5yYyIsCisgICAgICAgICAgICAib3QtY2xpLWZ0ZCIsCisgICAgICAgICAgICAib3QtY3RsIiwKKyAgICAgICAgICAgICJwcm9jcmFuayIsCisgICAgICAgICAgICAicHJvZmNvbGxlY3RjdGwiLAorICAgICAgICAgICAgInByb2Zjb2xsZWN0ZCIsCisgICAgICAgICAgICAicmVjb3JkX2JpbmRlciIsCisgICAgICAgICAgICAic2FuaXRpemVyLXN0YXR1cyIsCisgICAgICAgICAgICAic2VydmljZWRpc3BhdGNoZXIiLAorICAgICAgICAgICAgInNob3dtYXAiLAorICAgICAgICAgICAgInNuYXBzaG90Y3RsIiwKKyAgICAgICAgICAgICJzcWxpdGUzIiwKKyAgICAgICAgICAgICJzcyIsCisgICAgICAgICAgICAic3RhcnRfd2l0aF9sb2NrYWdlbnQiLAorICAgICAgICAgICAgInN0cmFjZSIsCisgICAgICAgICAgICAic3UiLAorICAgICAgICAgICAgInRpbnljYXAiLAorICAgICAgICAgICAgInRpbnlob3N0bGVzcyIsCisgICAgICAgICAgICAidGlueW1peCIsCisgICAgICAgICAgICAidGlueXBjbWluZm8iLAorICAgICAgICAgICAgInRpbnlwbGF5IiwgLy8gaG9zdAorICAgICAgICAgICAgInRyYWNlcGF0aCIsCisgICAgICAgICAgICAidHJhY2VwYXRoNiIsCisgICAgICAgICAgICAidHJhY2Vyb3V0ZTYiLAorICAgICAgICAgICAgInVud2luZF9pbmZvIiwKKyAgICAgICAgICAgICJ1bndpbmRfcmVnX2luZm8iLAorICAgICAgICAgICAgInVud2luZF9zeW1ib2xzIiwKKyAgICAgICAgICAgICJ1cGRhdGVfZW5naW5lX2NsaWVudCIsCisgICAgICAgIF0sCisgICAgICAgIGRlZmF1bHQ6IFtdLAorICAgIH0pLAorICAgIG11bHRpbGliOiB7CisgICAgICAgIGNvbW1vbjogeworICAgICAgICAgICAgZGVwczogWworICAgICAgICAgICAgICAgICJCYWNrdXBSZXN0b3JlQ29uZmlybWF0aW9uIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiQmFzaWNEcmVhbXMiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiQmxvY2tlZE51bWJlclByb3ZpZGVyIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIkJsdWV0b290aE1pZGlTZXJ2aWNlIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIkJvb2ttYXJrUHJvdmlkZXIiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiQnVpbHRJblByaW50U2VydmljZSIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAgICAgICAgICJDYWxlbmRhclByb3ZpZGVyIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIkNhbGxMb2dCYWNrdXAiLCAvLyB0ZWxlcGhvbnlfc3lzdGVtCisgICAgICAgICAgICAgICAgIkNhbWVyYUV4dGVuc2lvbnNQcm94eSIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAgICAgICAgICJDYXB0aXZlUG9ydGFsTG9naW4iLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiQ2FycmllckRlZmF1bHRBcHAiLCAvLyB0ZWxlcGhvbnlfc3lzdGVtCisgICAgICAgICAgICAgICAgIkNlbGxCcm9hZGNhc3RMZWdhY3lBcHAiLCAvLyB0ZWxlcGhvbnlfc3lzdGVtCisgICAgICAgICAgICAgICAgIkNlcnRJbnN0YWxsZXIiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiQ29tcGFuaW9uRGV2aWNlTWFuYWdlciIsIC8vIG1lZGlhX3N5c3RlbQorICAgICAgICAgICAgICAgICJDb250YWN0c1Byb3ZpZGVyIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiQ3JlZGVudGlhbE1hbmFnZXIiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiRGV2aWNlQXNXZWJjYW0iLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiRGV2aWNlRGlhZ25vc3RpY3MiLCAvLyBoYW5kaGVsZF9zeXN0ZW0gLSBpbnRlcm5hbAorICAgICAgICAgICAgICAgICJEb2N1bWVudHNVSSIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAgICAgICAgICJEb3dubG9hZFByb3ZpZGVyIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiRG93bmxvYWRQcm92aWRlclVpIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIkR5bmFtaWNTeXN0ZW1JbnN0YWxsYXRpb25TZXJ2aWNlIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiRTJlZUNvbnRhY3RLZXlzUHJvdmlkZXIiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJFYXN0ZXJFZ2ciLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiRXh0U2hhcmVkIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiRXh0ZXJuYWxTdG9yYWdlUHJvdmlkZXIiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiRnVzZWRMb2NhdGlvbiIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAgICAgICAgICJIVE1MVmlld2VyIiwgLy8gbWVkaWFfc3lzdGVtCisgICAgICAgICAgICAgICAgIklucHV0RGV2aWNlcyIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAgICAgICAgICJJbnRlbnRSZXNvbHZlciIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgIktleUNoYWluIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIkxpdmVXYWxscGFwZXJzUGlja2VyIiwgLy8gZ2VuZXJpY19zeXN0ZW0sIGZ1bGxfYmFzZQorICAgICAgICAgICAgICAgICJMb2NhbFRyYW5zcG9ydCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgIk1hbmFnZWRQcm92aXNpb25pbmciLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiTWVkaWFQcm92aWRlckxlZ2FjeSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgIk1tc1NlcnZpY2UiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiTXRwU2VydmljZSIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAgICAgICAgICJNdXNpY0ZYIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIk5ldHdvcmtTdGFjayIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgIk9OUyIsIC8vIHRlbGVwaG9ueV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiUGFjUHJvY2Vzc29yIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIlBhY2thZ2VJbnN0YWxsZXIiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJQYXJ0bmVyQm9va21hcmtzUHJvdmlkZXIiLCAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAgICAgICAgICJQcmludFJlY29tbWVuZGF0aW9uU2VydmljZSIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAgICAgICAgICJQcmludFNwb29sZXIiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiUHJveHlIYW5kbGVyIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIlNlY3VyZUVsZW1lbnQiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiU2V0dGluZ3NQcm92aWRlciIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgIlNoYXJlZFN0b3JhZ2VCYWNrdXAiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiU2hlbGwiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJTaW1BcHBEaWFsb2ciLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiU291bmRQaWNrZXIiLCAvLyBub3QgaW5zdGFsbGVkIGJ5IGFueW9uZQorICAgICAgICAgICAgICAgICJTdGF0ZW1lbnRTZXJ2aWNlIiwgLy8gbWVkaWFfc3lzdGVtCisgICAgICAgICAgICAgICAgIlN0ayIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICAgICAgICAgIlRhZyIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICAgICAgICAgIlRlbGVTZXJ2aWNlIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIlRlbGVjb20iLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiVGVsZXBob255UHJvdmlkZXIiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiVHJhY2V1ciIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAgICAgICAgICJVc2VyRGljdGlvbmFyeVByb3ZpZGVyIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIlZwbkRpYWxvZ3MiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiV2FsbHBhcGVyQmFja3VwIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiYWRiZF9zeXN0ZW1fYXBpIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5oaWRsLmJhc2UtVjEuMC1qYXZhIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5oaWRsLm1hbmFnZXItVjEuMC1qYXZhIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC50ZXN0LmJhc2UiLCAvLyBmcm9tIHJ1bnRpbWVfbGliYXJ0CisgICAgICAgICAgICAgICAgImFuZHJvaWQudGVzdC5tb2NrIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC50ZXN0LnJ1bm5lciIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImFvc3BfbWFpbmxpbmVfbW9kdWxlcyIsIC8vIG9rCisgICAgICAgICAgICAgICAgImJ1aWxkX2ZsYWdfc3lzdGVtIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiY2hhcmdlcl9yZXNfaW1hZ2VzIiwgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYXBleC5jdHMuc2hpbS52MV9wcmVidWlsdCIsIC8vIG9rCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmNlbGxicm9hZGNhc3QiLCAvLyB0ZWxlcGhvbnlfc3lzdGVtCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmZ1dHVyZS51c2IuYWNjZXNzb3J5IiwgLy8gbWVkaWFfc3lzdGVtCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmxvY2F0aW9uLnByb3ZpZGVyIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEucmVtb3RlZGlzcGxheSIsIC8vIG1lZGlhX3N5c3RlbQorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5yZW1vdGVkaXNwbGF5LnhtbCIsIC8vIG1lZGlhX3N5c3RlbQorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYWRybS5zaWduZXIiLCAvLyBtZWRpYV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQubmZjX2V4dHJhcyIsIC8vIG9rCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLm5mY3NlcnZpY2VzIiwgLy8gYmFzZV9zeXN0ZW0gKFJFTEVBU0VfUEFDS0FHRV9ORkNfU1RBQ0sgIT0gTmZjTmNpKQorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5ydW50aW1lIiwgLy8gb2sKKyAgICAgICAgICAgICAgICAiZGV4X2Jvb3RqYXJzIiwKKyAgICAgICAgICAgICAgICAiZXh0IiwgLy8gZnJvbSBydW50aW1lX2xpYmFydAorICAgICAgICAgICAgICAgICJmcmFtZXdvcmstZ3JhcGhpY3MiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJmcmFtZXdvcmstbG9jYXRpb24iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJmcmFtZXdvcmstbWludXMtYXBleC1pbnN0YWxsLWRlcGVuZGVuY2llcyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImZyYW1ld29ya19jb21wYXRpYmlsaXR5X21hdHJpeC5kZXZpY2UueG1sIiwKKyAgICAgICAgICAgICAgICAiZ2VuZXJpY19zeXN0ZW1fZm9udHMiLCAvLyBvaworICAgICAgICAgICAgICAgICJod3NlcnZpY2VtYW5hZ2VyX2NvbXBhdF9zeW1saW5rX21vZHVsZSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImh5cGgtZGF0YSIsCisgICAgICAgICAgICAgICAgImltcy1jb21tb24iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJpbml0X3N5c3RlbSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImphdmF4Lm9iZXgiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsbG5kay5saWJyYXJpZXMudHh0IiwgLy9vaworICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmh0dHAubGVnYWN5IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAicGVyZmV0dG8tZXh0cmFzIiwgLy8gc3lzdGVtCisgICAgICAgICAgICAgICAgInNhbml0aXplci5saWJyYXJpZXMudHh0IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAic2VsaW51eF9wb2xpY3lfc3lzdGVtX3Nvb25nIiwgLy8gb2sKKyAgICAgICAgICAgICAgICAic2VydmljZXMiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJzaGVsbF9hbmRfdXRpbGl0aWVzX3N5c3RlbSIsIC8vIG9rCisgICAgICAgICAgICAgICAgInN5c3RlbS1idWlsZC5wcm9wIiwKKyAgICAgICAgICAgICAgICAic3lzdGVtX2NvbXBhdGliaWxpdHlfbWF0cml4LnhtbCIsIC8vYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAidGVsZXBob255LWNvbW1vbiIsIC8vIGxpYnMgZnJvbSBUZWxlU2VydmljZQorICAgICAgICAgICAgICAgICJ2b2lwLWNvbW1vbiIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICBdICsgc2VsZWN0KHNvb25nX2NvbmZpZ192YXJpYWJsZSgiQU5EUk9JRCIsICJyZWxlYXNlX2NyYXNocmVjb3ZlcnlfbW9kdWxlIiksIHsKKyAgICAgICAgICAgICAgICAidHJ1ZSI6IFsKKyAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmNyYXNocmVjb3ZlcnkiLCAvLyBiYXNlX3N5c3RlbSAoUkVMRUFTRV9DUkFTSFJFQ09WRVJZX01PRFVMRSkKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFsKKyAgICAgICAgICAgICAgICAgICAgImZyYW1ld29yay1wbGF0Zm9ybWNyYXNocmVjb3ZlcnkiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICB9KSArIHNlbGVjdChyZWxlYXNlX2ZsYWcoIlJFTEVBU0VfT05ERVZJQ0VfSU5URUxMSUdFTkNFX01PRFVMRSIpLCB7CisgICAgICAgICAgICAgICAgdHJ1ZTogWworICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQubmV1cmFsbmV0d29ya3MiLCAvLyBiYXNlX3N5c3RlbSAoUkVMRUFTRV9PTkRFVklDRV9JTlRFTExJR0VOQ0VfTU9EVUxFKQorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgZGVmYXVsdDogWworICAgICAgICAgICAgICAgICAgICAiZnJhbWV3b3JrLW9uZGV2aWNlaW50ZWxsaWdlbmNlLXBsYXRmb3JtIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgfSkgKyBzZWxlY3Qoc29vbmdfY29uZmlnX3ZhcmlhYmxlKCJBTkRST0lEIiwgInJlbGVhc2VfcGFja2FnZV9wcm9maWxpbmdfbW9kdWxlIiksIHsKKyAgICAgICAgICAgICAgICAidHJ1ZSI6IFsKKyAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnByb2ZpbGluZyIsIC8vIGJhc2Vfc3lzdGVtIChSRUxFQVNFX1BBQ0tBR0VfUFJPRklMSU5HX01PRFVMRSkKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFtdLAorICAgICAgICAgICAgfSkgKyBzZWxlY3QocmVsZWFzZV9mbGFnKCJSRUxFQVNFX01PVkVfVkNOX1RPX01BSU5MSU5FIiksIHsKKyAgICAgICAgICAgICAgICB0cnVlOiBbXSwKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBbCisgICAgICAgICAgICAgICAgICAgICJmcmFtZXdvcmstY29ubmVjdGl2aXR5LWIiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICB9KSArIHNlbGVjdChyZWxlYXNlX2ZsYWcoIlJFTEVBU0VfQVZBVEFSX1BJQ0tFUl9BUFAiKSwgeworICAgICAgICAgICAgICAgIHRydWU6IFsKKyAgICAgICAgICAgICAgICAgICAgIkF2YXRhclBpY2tlciIsIC8vIGdlbmVyaWNfc3lzdGVtIChSRUxFQVNFX0FWQVRBUl9QSUNLRVJfQVBQKQorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgZGVmYXVsdDogW10sCisgICAgICAgICAgICB9KSArIHNlbGVjdChyZWxlYXNlX2ZsYWcoIlJFTEVBU0VfVVBST0JFU1RBVFNfTU9EVUxFIiksIHsKKyAgICAgICAgICAgICAgICB0cnVlOiBbCisgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC51cHJvYmVzdGF0cyIsIC8vIGJhc2Vfc3lzdGVtIChSRUxFQVNFX1VQUk9CRVNUQVRTX01PRFVMRSkKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFtdLAorICAgICAgICAgICAgfSksCisgICAgICAgIH0sCisgICAgICAgIHByZWZlcjMyOiB7CisgICAgICAgICAgICBkZXBzOiBbCisgICAgICAgICAgICAgICAgImRybXNlcnZlciIsIC8vIG1lZGlhX3N5c3RlbQorICAgICAgICAgICAgICAgICJtZWRpYXNlcnZlciIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICBdLAorICAgICAgICB9LAorICAgICAgICBsaWI2NDogeworICAgICAgICAgICAgZGVwczogWworICAgICAgICAgICAgICAgICJhbmRyb2lkLnN5c3RlbS52aXJ0dWFsaXphdGlvbmNvbW1vbi1uZGsiLAorICAgICAgICAgICAgICAgICJhbmRyb2lkLnN5c3RlbS52aXJ0dWFsaXphdGlvbnNlcnZpY2UtbmRrIiwKKyAgICAgICAgICAgICAgICAibGliZ3NpIiwKKyAgICAgICAgICAgICAgICAic2VydmljZW1hbmFnZXIiLAorICAgICAgICAgICAgXSArIHNlbGVjdChyZWxlYXNlX2ZsYWcoIlJFTEVBU0VfVVBST0JFU1RBVFNfTU9EVUxFIiksIHsKKyAgICAgICAgICAgICAgICB0cnVlOiBbXSwKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBbCisgICAgICAgICAgICAgICAgICAgICJ1cHJvYmVzdGF0cyIsIC8vIGJhc2Vfc3lzdGVtIGludGVybmFsCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIH0pLAorICAgICAgICB9LAorICAgICAgICBib3RoOiB7CisgICAgICAgICAgICBkZXBzOiBbCisgICAgICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYmlvbWV0cmljcy5maW5nZXJwcmludEAyLjEiLCAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnJhZGlvLmNvbmZpZ0AxLjAiLCAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnJhZGlvLmRlcHJlY2F0ZWRAMS4wIiwgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5yYWRpb0AxLjAiLCAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnJhZGlvQDEuMSIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUucmFkaW9AMS4yIiwgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5yYWRpb0AxLjMiLCAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnJhZGlvQDEuNCIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuc2VjdXJlX2VsZW1lbnRAMS4wIiwgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgICAgICAgICAiYXBwX3Byb2Nlc3MiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJib3Jpbmdzc2xfc2VsZl90ZXN0IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiaGVhcHByb2ZkX2NsaWVudCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYkVHTCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYkVHTF9hbmdsZSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYkVUQzEiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJGRlRFbSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYkdMRVN2MV9DTSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYkdMRVN2MV9DTV9hbmdsZSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYkdMRVN2MiIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYkdMRVN2Ml9hbmdsZSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYkdMRVN2MyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYk9wZW5NQVhBTCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYk9wZW5TTEVTIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliYWF1ZGlvIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliYWxhcm1fam5pIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliYW1pZGkiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJhbmRyb2lkIiwKKyAgICAgICAgICAgICAgICAibGliYW5kcm9pZF9ydW50aW1lIiwKKyAgICAgICAgICAgICAgICAibGliYW5kcm9pZF9zZXJ2ZXJzIiwKKyAgICAgICAgICAgICAgICAibGliYW5kcm9pZGZ3IiwKKyAgICAgICAgICAgICAgICAibGliYXJ0cGFsZXR0ZS1zeXN0ZW0iLAorICAgICAgICAgICAgICAgICJsaWJhdWRpby1yZXNhbXBsZXIiLCAvLyBnZW5lcmljLXN5c3RlbQorICAgICAgICAgICAgICAgICJsaWJhdWRpb2VmZmVjdF9qbmkiLAorICAgICAgICAgICAgICAgICJsaWJhdWRpb2hhbCIsIC8vIGdlbmVyaWMtc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYmF1ZGlvcG9saWN5ZW5naW5lY29uZmlndXJhYmxlIiwgLy8gZ2VuZXJpYy1zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgICAgICAgICAibGliYmluZGVyX25kayIsCisgICAgICAgICAgICAgICAgImxpYmJpbmRlcl9ycGNfdW5zdGFibGUiLAorICAgICAgICAgICAgICAgICJsaWJjYW1lcmEybmRrIiwKKyAgICAgICAgICAgICAgICAibGliY2dyb3VwcmMiLCAvLyBsbG5kayBsaWJyYXJ5CisgICAgICAgICAgICAgICAgImxpYmNsYW5nX3J0LmFzYW4iLAorICAgICAgICAgICAgICAgICJsaWJjb21waWxlcl9ydCIsCisgICAgICAgICAgICAgICAgImxpYmN1dGlscyIsIC8vIHVzZWQgYnkgbWFueSBsaWJzCisgICAgICAgICAgICAgICAgImxpYmRtYWJ1ZmhlYXAiLCAvLyB1c2VkIGJ5IG1hbnkgbGlicworICAgICAgICAgICAgICAgICJsaWJkcm0iLCAvLyB1c2VkIGJ5IG1hbnkgbGlicyAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJkcm1mcmFtZXdvcmsiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJkcm1mcmFtZXdvcmtfam5pIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliZmR0cmFjayIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYmZpbHRlcmZ3IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliZmlsdGVycGFja19pbWFnZXByb2MiLCAvLyBtZWRpYV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliZndkbG9ja2VuZ2luZSIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYmdhdGVrZWVwZXIiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJndWkiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJoYXJkd2FyZSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYmhhcmR3YXJlX2xlZ2FjeSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLCAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJod2JpbmRlciIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYmlucHV0IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliaW5wdXRmbGluZ2VyIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliaXByb3V0ZXV0aWwiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJqbmlncmFwaGljcyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYmpwZWciLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJsb2ciLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJsb2d3cmFwIiwgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlibHo0IiwgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlibWVkaWEiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJtZWRpYV9qbmkiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJtZWRpYW5kayIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYm1pbnVpIiwgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlibW9ua2V5X2puaSIsIC8vIGJhc2Vfc3lzdGVtIC0gaW50ZXJuYWwKKyAgICAgICAgICAgICAgICAibGlibXRwIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlibmV0ZF9jbGllbnQiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJuZXRsaW5rIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlibmV0dXRpbHMiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJuZXVyYWxuZXR3b3Jrc19wYWNrYWdlaW5mbyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYm5sIiwgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlicGRmaXVtIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlicG9saWN5LXN1YnN5c3RlbSIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnBvd2VyIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlicG93ZXJtYW5hZ2VyIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlicHJvdG9idWYtY3BwLWZ1bGwiLCAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJyYWRpb19tZXRhZGF0YSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnJzX2puaSIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJydHBfam5pIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlic2Vuc29yc2VydmljZSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlYyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnNraWEiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJzb25pYyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnNvbml2b3giLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJzb3VuZHBvb2wiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJzcGVleHJlc2FtcGxlciIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnNxbGl0ZSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnN0ZGMrKyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnN5c3V0aWxzIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlidWkiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJ1c2Job3N0IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlidXRpbHMiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJ2ZW5kb3JzdXBwb3J0IiwgLy8gbGxuZGsgbGlicmFyeQorICAgICAgICAgICAgICAgICJsaWJ2aW50Zl9qbmkiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJ2dWxrYW4iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJ3ZWJ2aWV3Y2hyb21pdW1fbG9hZGVyIiwgLy8gbWVkaWFfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYndlYnZpZXdjaHJvbWl1bV9wbGF0X3N1cHBvcnQiLCAvLyBtZWRpYV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlid2lsaGVsbSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpbmtlciIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICBdICsgc2VsZWN0KHNvb25nX2NvbmZpZ192YXJpYWJsZSgiQU5EUk9JRCIsICJUQVJHRVRfRFlOQU1JQ182NF8zMl9EUk1TRVJWRVIiKSwgeworICAgICAgICAgICAgICAgICJ0cnVlIjogWyJkcm1zZXJ2ZXIiXSwKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBbXSwKKyAgICAgICAgICAgIH0pICsgc2VsZWN0KHNvb25nX2NvbmZpZ192YXJpYWJsZSgiQU5EUk9JRCIsICJUQVJHRVRfRFlOQU1JQ182NF8zMl9NRURJQVNFUlZFUiIpLCB7CisgICAgICAgICAgICAgICAgInRydWUiOiBbIm1lZGlhc2VydmVyIl0sCisgICAgICAgICAgICAgICAgZGVmYXVsdDogW10sCisgICAgICAgICAgICB9KSArIHNlbGVjdChyZWxlYXNlX2ZsYWcoIlJFTEVBU0VfVVBST0JFU1RBVFNfTU9EVUxFIiksIHsKKyAgICAgICAgICAgICAgICB0cnVlOiBbXSwKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBbCisgICAgICAgICAgICAgICAgICAgICJsaWJ1cHJvYmVzdGF0c19jbGllbnQiLCAvLyBiYXNlX3N5c3RlbSBpbnRlcm5hbAorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICB9KSwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIGFyY2g6IHsKKyAgICAgICAgYXJtNjQ6IHsKKyAgICAgICAgICAgIGRlcHM6IFsKKyAgICAgICAgICAgICAgICAibGliY2xhbmdfcnQuaHdhc2FuIiwKKyAgICAgICAgICAgICAgICAibGliY19od2FzYW4iLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCithbmRyb2lkX3N5c3RlbV9pbWFnZSB7CisgICAgbmFtZTogImFvc3Bfc2hhcmVkX3N5c3RlbV9pbWFnZSIsCisgICAgZGVmYXVsdHM6IFsic3lzdGVtX2ltYWdlX2RlZmF1bHRzIl0sCisgICAgZGlyczogYW5kcm9pZF9yb290ZGlycywKKyAgICBzeW1saW5rczogYW5kcm9pZF9zeW1saW5rcywKKyAgICB0eXBlOiAiZXJvZnMiLAorICAgIGVyb2ZzOiB7CisgICAgICAgIGNvbXByZXNzb3I6ICJsejRoYyw5IiwKKyAgICAgICAgY29tcHJlc3NfaGludHM6ICJlcm9mc19jb21wcmVzc19oaW50cy50eHQiLAorICAgIH0sCisgICAgZGVwczogWworICAgICAgICAvLyBETyBOT1QgdXBkYXRlIHRoaXMgbGlzdC4gSW5zdGVhZCwgdXBkYXRlIHRoZSBzeXN0ZW1faW1hZ2VfZGVmYXVsdHMgdG8KKyAgICAgICAgLy8gc3luYyB3aXRoIHRoZSBiYXNlX3N5c3RlbS5taworICAgICAgICAibG9ncGVyc2lzdC5zdGFydCIsIC8vIGNmIG9ubHkKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy9PV05FUlMgYi90YXJnZXQvcHJvZHVjdC9nZW5lcmljL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDE0NDZmCi0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy9PV05FUlMKQEAgLTAsMCArMSw2IEBACisjIEJ1ZyBjb21wb25lbnQ6IDEzMjI3MTMKK2luc2VvYkBnb29nbGUuY29tCitqZW9uZ2lrQGdvb2dsZS5jb20KK2ppeW9uZ0Bnb29nbGUuY29tCitqdXN0aW55dW5AZ29vZ2xlLmNvbQora2l5b3VuZ2tpbUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9nZW5lcmljL2Vyb2ZzX2NvbXByZXNzX2hpbnRzLnR4dCBiL3RhcmdldC9wcm9kdWN0L2dlbmVyaWMvZXJvZnNfY29tcHJlc3NfaGludHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMmE3MTEKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvcHJvZHVjdC9nZW5lcmljL2Vyb2ZzX2NvbXByZXNzX2hpbnRzLnR4dApAQCAtMCwwICsxIEBACiswIC4qXC5hcGV4JApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2dlbmVyaWNfcmFtZGlzay5tayBiL3RhcmdldC9wcm9kdWN0L2dlbmVyaWNfcmFtZGlzay5tawppbmRleCBlYmFjNjJmLi41ZWNiNTVmIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9nZW5lcmljX3JhbWRpc2subWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpY19yYW1kaXNrLm1rCkBAIC0yMyw2ICsyMyw3IEBACiBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKICAgICBpbml0X2ZpcnN0X3N0YWdlIFwKICAgICBzbmFwdXNlcmRfcmFtZGlzayBcCisgICAgcmFtZGlzay1idWlsZC5wcm9wIFwKIAogIyBEZWJ1ZyByYW1kaXNrCiBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKQEAgLTM1LDggKzM2LDYgQEAKIF9teV9wYXRocyA6PSBcCiAgICAgJChUQVJHRVRfQ09QWV9PVVRfUkFNRElTSykvIFwKICAgICAkKFRBUkdFVF9DT1BZX09VVF9ERUJVR19SQU1ESVNLKS8gXAotICAgIHN5c3RlbS91c3Ivc2hhcmUvem9uZWluZm8vdHpfdmVyc2lvbiBcCi0gICAgc3lzdGVtL3Vzci9zaGFyZS96b25laW5mby90emRhdGEgXAogICAgICQoVEFSR0VUX0NPUFlfT1VUX1JFQ09WRVJZKS9yb290L2ZpcnN0X3N0YWdlX3JhbWRpc2svc3lzdGVtIFwKIAogCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9nZW5lcmljX3N5c3RlbS5tayBiL3RhcmdldC9wcm9kdWN0L2dlbmVyaWNfc3lzdGVtLm1rCmluZGV4IDk4ZDYwNDYuLmI5YTYyM2QgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2dlbmVyaWNfc3lzdGVtLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2dlbmVyaWNfc3lzdGVtLm1rCkBAIC0zNiw2ICszNiwxMSBAQAogICAgIFN0ayBcCiAgICAgVGFnIFwKIAoraWZlcSAoJChSRUxFQVNFX0FWQVRBUl9QSUNLRVJfQVBQKSx0cnVlKQorICBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICBBdmF0YXJQaWNrZXIKK2VuZGlmCisKICMgT1RBIHN1cHBvcnQKIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAogICAgIHJlY292ZXJ5LXJlZnJlc2ggXApAQCAtNjgsNyArNzMsNiBAQAogICAgIGFuZHJvaWQuaGFyZHdhcmUucmFkaW8uY29uZmlnQDEuMCBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5yYWRpby5kZXByZWNhdGVkQDEuMCBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5zZWN1cmVfZWxlbWVudEAxLjAgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUud2lmaSBcCiAgICAgbGliYXVkaW8tcmVzYW1wbGVyIFwKICAgICBsaWJhdWRpb2hhbCBcCiAgICAgbGliZHJtIFwKQEAgLTEwMywxMSArMTA3LDIyIEBACiAgICAgbGliYXVkaW9wb2xpY3llbmdpbmVjb25maWd1cmFibGUgXAogICAgIGxpYnBvbGljeS1zdWJzeXN0ZW0KIAorIyBBZGQgYWxsIG9mIHRoZSBwYWNrYWdlcyB1c2VkIHRvIHN1cHBvcnQgb2xkZXIvdXBncmFkaW5nIGRldmljZXMKKyMgVGhlc2UgY2FuIGJlIHJlbW92ZWQgYXMgd2UgZHJvcCBzdXBwb3J0IGZvciB0aGUgb2xkZXIgQVBJIGxldmVscworUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgJChQUk9EVUNUX1BBQ0tBR0VTX1NISVBQSU5HX0FQSV9MRVZFTF8yOSkgXAorICAgICQoUFJPRFVDVF9QQUNLQUdFU19TSElQUElOR19BUElfTEVWRUxfMzMpIFwKKyAgICAkKFBST0RVQ1RfUEFDS0FHRVNfU0hJUFBJTkdfQVBJX0xFVkVMXzM0KQorCiAjIEluY2x1ZGUgYWxsIHp5Z290ZSBpbml0IHNjcmlwdHMuICJyby56eWdvdGUiIHdpbGwgc2VsZWN0IG9uZSBvZiB0aGVtLgotUFJPRFVDVF9DT1BZX0ZJTEVTICs9IFwKLSAgICBzeXN0ZW0vY29yZS9yb290ZGlyL2luaXQuenlnb3RlMzIucmM6c3lzdGVtL2V0Yy9pbml0L2h3L2luaXQuenlnb3RlMzIucmMgXAotICAgIHN5c3RlbS9jb3JlL3Jvb3RkaXIvaW5pdC56eWdvdGU2NC5yYzpzeXN0ZW0vZXRjL2luaXQvaHcvaW5pdC56eWdvdGU2NC5yYyBcCi0gICAgc3lzdGVtL2NvcmUvcm9vdGRpci9pbml0Lnp5Z290ZTY0XzMyLnJjOnN5c3RlbS9ldGMvaW5pdC9ody9pbml0Lnp5Z290ZTY0XzMyLnJjIFwKK1BST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgIGluaXQuenlnb3RlMzIucmMgXAorICAgIGluaXQuenlnb3RlNjQucmMgXAorICAgIGluaXQuenlnb3RlNjRfMzIucmMKKworIyBTdXBwb3J0IENyZWRlbnRpYWwgTWFuYWdlcgorUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgYW5kcm9pZC5zb2Z0d2FyZS5jcmVkZW50aWFscy5wcmVidWlsdC54bWwKIAogIyBFbmFibGUgZHluYW1pYyBwYXJ0aXRpb24gc2l6ZQogUFJPRFVDVF9VU0VfRFlOQU1JQ19QQVJUSVRJT05fU0laRSA6PSB0cnVlCkBAIC0xMzUsMyArMTUwLDcgQEAKICAgJChUQVJHRVRfQ09QWV9PVVRfU1lTVEVNKS8gXAogCiAkKGNhbGwgcmVxdWlyZS1hcnRpZmFjdHMtaW4tcGF0aCwgJChfbXlfcGF0aHMpLCAkKF9teV9hbGxvd2VkX2xpc3QpKQorCisjIFByb2R1Y3QgY29uZmlnIG1hcCB0byB0b2dnbGUgYmV0d2VlbiBzb3VyY2VzIGFuZCBwcmVidWlsdHMgb2YgcmVxdWlyZWQgbWFpbmxpbmUgbW9kdWxlcworUFJPRFVDVF9SRUxFQVNFX0NPTkZJR19NQVBTICs9ICQod2lsZGNhcmQgYnVpbGQvcmVsZWFzZS9nbXNfbWFpbmxpbmUvcmVxdWlyZWQvcmVsZWFzZV9jb25maWdfbWFwLnRleHRwcm90bykKK1BST0RVQ1RfUkVMRUFTRV9DT05GSUdfTUFQUyArPSAkKHdpbGRjYXJkIHZlbmRvci9nb29nbGVfc2hhcmVkL2J1aWxkL3JlbGVhc2UvZ21zX21haW5saW5lL3JlcXVpcmVkL3JlbGVhc2VfY29uZmlnX21hcC50ZXh0cHJvdG8pCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9nb19kZWZhdWx0cy5tayBiL3RhcmdldC9wcm9kdWN0L2dvX2RlZmF1bHRzLm1rCmluZGV4IGI3MTc0ODYuLmNjYzRmMzYgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2dvX2RlZmF1bHRzLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2dvX2RlZmF1bHRzLm1rCkBAIC0xNyw2ICsxNywxMCBAQAogIyBJbmhlcml0IGNvbW1vbiBBbmRyb2lkIEdvIGRlZmF1bHRzLgogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgYnVpbGQvbWFrZS90YXJnZXQvcHJvZHVjdC9nb19kZWZhdWx0c19jb21tb24ubWspCiAKKyMgUHJvZHVjdCBjb25maWcgbWFwIHRvIHRvZ2dsZSBiZXR3ZWVuIHNvdXJjZXMgYW5kIHByZWJ1aWx0cyBvZiByZXF1aXJlZCBtYWlubGluZSBtb2R1bGVzCitQUk9EVUNUX1JFTEVBU0VfQ09ORklHX01BUFMgKz0gJCh3aWxkY2FyZCBidWlsZC9yZWxlYXNlL2dtc19tYWlubGluZV9nby9yZXF1aXJlZC9yZWxlYXNlX2NvbmZpZ19tYXAudGV4dHByb3RvKQorUFJPRFVDVF9SRUxFQVNFX0NPTkZJR19NQVBTICs9ICQod2lsZGNhcmQgdmVuZG9yL2dvb2dsZV9zaGFyZWQvYnVpbGQvcmVsZWFzZS9nbXNfbWFpbmxpbmVfZ28vcmVxdWlyZWQvcmVsZWFzZV9jb25maWdfbWFwLnRleHRwcm90bykKKwogIyBBZGQgdGhlIHN5c3RlbSBwcm9wZXJ0aWVzLgogVEFSR0VUX1NZU1RFTV9QUk9QICs9IFwKICAgICBidWlsZC9tYWtlL3RhcmdldC9ib2FyZC9nb19kZWZhdWx0cy5wcm9wCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9nb19kZWZhdWx0c19jb21tb24ubWsgYi90YXJnZXQvcHJvZHVjdC9nb19kZWZhdWx0c19jb21tb24ubWsKaW5kZXggNTFhMWVmNi4uMGZjZjE2YiAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvZ29fZGVmYXVsdHNfY29tbW9uLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2dvX2RlZmF1bHRzX2NvbW1vbi5tawpAQCAtMjQsMTUgKzI0LDYgQEAKICMgU3BlZWQgcHJvZmlsZSBzZXJ2aWNlcyBhbmQgd2lmaS1zZXJ2aWNlIHRvIHJlZHVjZSBSQU0gYW5kIHN0b3JhZ2UuCiBQUk9EVUNUX1NZU1RFTV9TRVJWRVJfQ09NUElMRVJfRklMVEVSIDo9IHNwZWVkLXByb2ZpbGUKIAotIyBBbHdheXMgcHJlb3B0IGV4dHJhY3RlZCBBUEtzIHRvIHByZXZlbnQgZXh0cmFjdGluZyBvdXQgb2YgdGhlIEFQSyBmb3IgZ21zCi0jIG1vZHVsZXMuCi1QUk9EVUNUX0FMV0FZU19QUkVPUFRfRVhUUkFDVEVEX0FQSyA6PSB0cnVlCi0KLSMgVXNlIGEgcHJvZmlsZSBiYXNlZCBib290IGltYWdlIGZvciB0aGlzIGRldmljZS4gTm90ZSB0aGF0IHRoaXMgaXMgY3VycmVudGx5IGEKLSMgZ2VuZXJpYyBwcm9maWxlIGFuZCBub3QgQW5kcm9pZCBHbyBvcHRpbWl6ZWQuCi1QUk9EVUNUX1VTRV9QUk9GSUxFX0ZPUl9CT09UX0lNQUdFIDo9IHRydWUKLVBST0RVQ1RfREVYX1BSRU9QVF9CT09UX0lNQUdFX1BST0ZJTEVfTE9DQVRJT04gOj0gZnJhbWV3b3Jrcy9iYXNlL2NvbmZpZy9ib290LWltYWdlLXByb2ZpbGUudHh0Ci0KICMgRG8gbm90IGdlbmVyYXRlIGxpYmFydGQuCiBQUk9EVUNUX0FSVF9UQVJHRVRfSU5DTFVERV9ERUJVR19CVUlMRCA6PSBmYWxzZQogCkBAIC00MSw5ICszMiw5IEBACiAjIGxlYXZlIGxlc3MgaW5mb3JtYXRpb24gYXZhaWxhYmxlIHZpYSBKRFdQLgogUFJPRFVDVF9NSU5JTUlaRV9KQVZBX0RFQlVHX0lORk8gOj0gdHJ1ZQogCi0jIERpc2FibGUgU2N1ZG8gb3V0c2lkZSBvZiBlbmcgYnVpbGRzIHRvIHNhdmUgUkFNLgorIyBVc2UgdGhlIGxvdyBtZW1vcnkgYWxsb2NhdG9yIG91dHNpZGUgb2YgZW5nIGJ1aWxkcyB0byBzYXZlIFJTUy4KIGlmbmVxICgsJChmaWx0ZXIgZW5nLCAkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkpCi0gIFBST0RVQ1RfRElTQUJMRV9TQ1VETyA6PSB0cnVlCisgIE1BTExPQ19MT1dfTUVNT1JZIDo9IHRydWUKIGVuZGlmCiAKICMgQWRkIHRoZSBzeXN0ZW0gcHJvcGVydGllcy4KQEAgLTUzLDYgKzQ0LDMgQEAKICMgdXNlIHRoZSBnbyBzcGVjaWZpYyBoYW5kaGVsZF9jb3JlX2hhcmR3YXJlLnhtbCBmcm9tIGZyYW1ld29ya3MKIFBST0RVQ1RfQ09QWV9GSUxFUyArPSBcCiAgICAgZnJhbWV3b3Jrcy9uYXRpdmUvZGF0YS9ldGMvZ29faGFuZGhlbGRfY29yZV9oYXJkd2FyZS54bWw6JChUQVJHRVRfQ09QWV9PVVRfVkVORE9SKS9ldGMvcGVybWlzc2lvbnMvaGFuZGhlbGRfY29yZV9oYXJkd2FyZS54bWwKLQotIyBEZWR1cGUgVk5ESyBsaWJyYXJpZXMgd2l0aCBpZGVudGljYWwgY29yZSB2YXJpYW50cy4KLVRBUkdFVF9WTkRLX1VTRV9DT1JFX1ZBUklBTlQgOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvZ3NpL0FuZHJvaWQuYnAgYi90YXJnZXQvcHJvZHVjdC9nc2kvQW5kcm9pZC5icAppbmRleCBhOGFmOWM0Li5jNmZjMDIxIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9nc2kvQW5kcm9pZC5icAorKysgYi90YXJnZXQvcHJvZHVjdC9nc2kvQW5kcm9pZC5icApAQCAtMjMsMyArMjMsMTM2IEBACiAgICAgICAgICIqLnR4dCIsCiAgICAgXSwKIH0KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiZ3NpX3NraXBfbW91bnQuY2ZnIiwKKyAgICBmaWxlbmFtZTogInNraXBfbW91bnQuY2ZnIiwKKyAgICBzcmM6ICJnc2lfc2tpcF9tb3VudC5jZmciLAorCisgICAgc3lzdGVtX2V4dF9zcGVjaWZpYzogdHJ1ZSwKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJpbml0L2NvbmZpZyIsCisKKyAgICByZXF1aXJlZDogWyJnc2lfc2tpcF9tb3VudF9jb21wYXRfc3ltbGluayJdLAorfQorCisvLyBBZGRzIGEgc3ltbGluayB1bmRlciAvc3lzdGVtL2V0Yy9pbml0L2NvbmZpZyBwb2ludGluZyB0byAvc3lzdGVtL3N5c3RlbV9leHQvZXRjL2luaXQvY29uZmlnCisvLyBiZWNhdXNlIGZpcnN0LXN0YWdlIGluaXQgaW4gQW5kcm9pZCAxMC4wIHdpbGwgcmVhZCB0aGUgc2tpcF9tb3VudC5jZmcgZnJvbSAvc3lzdGVtL2V0Yy8qIGFmdGVyCisvLyBjaHJvb3QgL3N5c3RlbS4KKy8vIFRPRE86IHJlbW92ZSB0aGlzIHN5bWxpbmsgd2hlbiBubyBuZWVkIHRvIHN1cHBvcnQgbmV3IEdTSSBvbiBBbmRyb2lkIDEwLgorLy8gVGhlIGFjdHVhbCBmaWxlIG5lZWRzIHRvIGJlIHVuZGVyIC9zeXN0ZW0vc3lzdGVtX2V4dCBiZWNhdXNlIGl0J3MgR1NJLXNwZWNpZmljIGFuZCBkb2VzIG5vdAorLy8gYmVsb25nIHRvIGNvcmUgQ1NJLgoraW5zdGFsbF9zeW1saW5rIHsKKyAgICBuYW1lOiAiZ3NpX3NraXBfbW91bnRfY29tcGF0X3N5bWxpbmsiLAorICAgIGluc3RhbGxlZF9sb2NhdGlvbjogImV0Yy9pbml0L2NvbmZpZyIsCisgICAgc3ltbGlua190YXJnZXQ6ICIvc3lzdGVtL3N5c3RlbV9leHQvZXRjL2luaXQvY29uZmlnIiwKK30KKworLy8gaW5pdC5nc2kucmMsIEdTSS1zcGVjaWZpYyBpbml0IHNjcmlwdC4KK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImluaXQuZ3NpLnJjIiwKKyAgICBzcmM6ICJpbml0LmdzaS5yYyIsCisgICAgc3lzdGVtX2V4dF9zcGVjaWZpYzogdHJ1ZSwKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJpbml0IiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiaW5pdC52bmRrLW5vZGVmLnJjIiwKKyAgICBzcmM6ICJpbml0LnZuZGstbm9kZWYucmMiLAorICAgIHN5c3RlbV9leHRfc3BlY2lmaWM6IHRydWUsCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiZ3NpIiwKK30KKworZ3NpX3N5bWxpbmtzID0gWworICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3N5c3RlbS9zeXN0ZW1fZXh0IiwKKyAgICAgICAgbmFtZTogInN5c3RlbV9leHQiLAorICAgIH0sCisgICAgeworICAgICAgICB0YXJnZXQ6ICIvc3lzdGVtL3Byb2R1Y3QiLAorICAgICAgICBuYW1lOiAicHJvZHVjdCIsCisgICAgfSwKKyAgICB7CisgICAgICAgIHRhcmdldDogIi9vZG0vb2RtX2Rsa20vZXRjIiwKKyAgICAgICAgbmFtZTogIm9kbV9kbGttL2V0YyIsCisgICAgfSwKKyAgICB7CisgICAgICAgIHRhcmdldDogIi92ZW5kb3IvdmVuZG9yX2Rsa20vZXRjIiwKKyAgICAgICAgbmFtZTogInZlbmRvcl9kbGttL2V0YyIsCisgICAgfSwKK10KKworYW5kcm9pZF9zeXN0ZW1faW1hZ2UgeworICAgIG5hbWU6ICJhbmRyb2lkX2dzaSIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgInN5c3RlbV9pbWFnZV9kZWZhdWx0cyIsCisgICAgICAgICJzeXN0ZW1fZXh0X2ltYWdlX2RlZmF1bHRzIiwKKyAgICAgICAgInByb2R1Y3RfaW1hZ2VfZGVmYXVsdHMiLAorICAgIF0sCisgICAgc3ltbGlua3M6IGdzaV9zeW1saW5rcywKKyAgICBkaXJzOiBbImNhY2hlIl0sCisgICAgZGVwczogWworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIC8vIGdzaV9zeXN0ZW1fZXh0CisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICAvLyBoYW5kaGVsZCBwYWNrYWdlcworICAgICAgICAiTGF1bmNoZXIzUXVpY2tTdGVwIiwKKyAgICAgICAgIlByb3Zpc2lvbiIsCisgICAgICAgICJTZXR0aW5ncyIsCisgICAgICAgICJTdG9yYWdlTWFuYWdlciIsCisgICAgICAgICJTeXN0ZW1VSSIsCisKKyAgICAgICAgLy8gdGVsZXBob255IHBhY2thZ2VzCisgICAgICAgICJDYXJyaWVyQ29uZmlnIiwKKworICAgICAgICAvLyBJbnN0YWxsIGEgY29weSBvZiB0aGUgZGVidWcgcG9saWN5IHRvIHRoZSBzeXN0ZW1fZXh0IHBhcnRpdGlvbiwgYW5kIGFsbG93CisgICAgICAgIC8vIGluaXQtc2Vjb25kLXN0YWdlIHRvIGxvYWQgZGVidWcgcG9saWN5IGZyb20gc3lzdGVtX2V4dC4KKyAgICAgICAgLy8gVGhpcyBvcHRpb24gaXMgb25seSBtZWFudCB0byBiZSBzZXQgYnkgY29tcGxpYW5jZSBHU0kgdGFyZ2V0cy4KKyAgICAgICAgInN5c3RlbV9leHRfdXNlcmRlYnVnX3BsYXRfc2Vwb2xpY3kuY2lsIiwKKworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIC8vIGdzaV9yZWxlYXNlCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgImdzaV9za2lwX21vdW50LmNmZyIsCisgICAgICAgICJpbml0LmdzaS5yYyIsCisgICAgICAgICJpbml0LnZuZGstbm9kZWYucmMiLAorICAgICAgICAvLyBPdmVybGF5IHRoZSBHU0kgc3BlY2lmaWMgc2V0dGluZyBmb3IgZnJhbWV3b3JrIGFuZCBTeXN0ZW1VSQorICAgICAgICAiZ3NpX292ZXJsYXlfZnJhbWV3b3JrIiwKKyAgICAgICAgImdzaV9vdmVybGF5X3N5c3RlbXVpIiwKKworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIC8vIFZOREsKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAiY29tLmFuZHJvaWQudm5kay52MzAiLAorICAgICAgICAiY29tLmFuZHJvaWQudm5kay52MzEiLAorICAgICAgICAiY29tLmFuZHJvaWQudm5kay52MzIiLAorICAgICAgICAiY29tLmFuZHJvaWQudm5kay52MzMiLAorICAgICAgICAiY29tLmFuZHJvaWQudm5kay52MzQiLAorCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gQVZGCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgImNvbS5hbmRyb2lkLmNvbXBvcyIsCisgICAgICAgICJmZWF0dXJlc19jb20uYW5kcm9pZC52aXJ0LnhtbCIsCisKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLyBnc2lfcHJvZHVjdAorICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICJCcm93c2VyMiIsCisgICAgICAgICJDYW1lcmEyIiwKKyAgICAgICAgIkRpYWxlciIsCisgICAgICAgICJMYXRpbklNRSIsCisgICAgICAgICJhcG5zLWZ1bGwtY29uZi54bWwiLAorICAgIF0sCisgICAgbXVsdGlsaWI6IHsKKyAgICAgICAgYm90aDogeworICAgICAgICAgICAgLy8gUFJPRFVDVF9QQUNLQUdFU19TSElQUElOR19BUElfTEVWRUxfMzQKKyAgICAgICAgICAgIGRlcHM6IFsiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAtaW1wbCJdLAorICAgICAgICB9LAorICAgIH0sCisgICAgZW5hYmxlZDogc2VsZWN0KHNvb25nX2NvbmZpZ192YXJpYWJsZSgiQU5EUk9JRCIsICJQUk9EVUNUX0lOU1RBTExfREVCVUdfUE9MSUNZX1RPX1NZU1RFTV9FWFQiKSwgeworICAgICAgICAidHJ1ZSI6IHRydWUsCisgICAgICAgIGRlZmF1bHQ6IGZhbHNlLAorICAgIH0pLAorICAgIHR5cGU6ICJleHQ0IiwKK30KZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2dzaS9BbmRyb2lkLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvZ3NpL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwN2M5NGYuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvZ3NpL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBsaXN0IG9mIHZuZGsgbGlicmFyaWVzIGZyb20gdGhlIHNvdXJjZSBjb2RlLgotSU5URVJOQUxfVk5ES19MSUJfTElTVCA6PSAkKFNPT05HX1ZOREtfTElCUkFSSUVTX0ZJTEUpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBUaGlzIGlzIHRoZSB1cC10by1kYXRlIGxpc3Qgb2Ygdm5kayBsaWJzLgotIyBUT0RPKGIvNjIwMTIyODUpOiB0aGUgbGliIGxpc3Qgc2hvdWxkIGJlIHN0b3JlZCBzb21ld2hlcmUgdW5kZXIKLSMgL3ByZWJ1aWx0cy92bmRrCi1pZmVxIChSRUwsJChQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FKSkKLUxBVEVTVF9WTkRLX0xJQl9MSVNUIDo9ICQoTE9DQUxfUEFUSCkvJChQTEFURk9STV9WTkRLX1ZFUlNJT04pLnR4dAotaWZlcSAoJCh3aWxkY2FyZCAkKExBVEVTVF9WTkRLX0xJQl9MSVNUKSksKQotJChlcnJvciAkKExBVEVTVF9WTkRLX0xJQl9MSVNUKSBmaWxlIG5vdCBmb3VuZC4gUGxlYXNlIGNvcHkgIiQoTE9DQUxfUEFUSCkvY3VycmVudC50eHQiIHRvICIkKExBVEVTVF9WTkRLX0xJQl9MSVNUKSIgYW5kIGNvbW1pdCBhIENMIGZvciByZWxlYXNlIGJyYW5jaCkKLWVuZGlmCi1lbHNlCi1MQVRFU1RfVk5ES19MSUJfTElTVCA6PSAkKExPQ0FMX1BBVEgpL2N1cnJlbnQudHh0Ci1lbmRpZgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ2hlY2sgdGhlIGdlbmVyYXRlIGxpc3QgYWdhaW5zdCB0aGUgbGF0ZXN0IGxpc3Qgc3RvcmVkIGluIHRoZQotIyBzb3VyY2UgdHJlZQotLlBIT05ZOiBjaGVjay12bmRrLWxpc3QKLQotIyBDaGVjayBpZiB2bmRrIGxpc3QgaXMgY2hhbmdlZAotZHJvaWRjb3JlOiBjaGVjay12bmRrLWxpc3QKLQotY2hlY2stdm5kay1saXN0LXRpbWVzdGFtcCA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyx2bmRrKS9jaGVjay1saXN0LXRpbWVzdGFtcAotY2hlY2stdm5kay1hYmktZHVtcC1saXN0LXRpbWVzdGFtcCA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyx2bmRrKS9jaGVjay1hYmktZHVtcC1saXN0LXRpbWVzdGFtcAotCi1pZmVxICgkKFRBUkdFVF9JU182NF9CSVQpfCQoVEFSR0VUXzJORF9BUkNIKSx0cnVlfCkKLSMgVE9ETyhiLzExMDQyOTc1NCkgcmVtb3ZlIHRoaXMgY29uZGl0aW9uIHdoZW4gd2Ugc3VwcG9ydCA2NC1iaXQtb25seSBkZXZpY2UKLWNoZWNrLXZuZGstbGlzdDogOwotZWxzZSBpZmVxICgkKFRBUkdFVF9TS0lQX0NVUlJFTlRfVk5ESyksdHJ1ZSkKLWNoZWNrLXZuZGstbGlzdDogOwotZWxzZSBpZmVxICgkKEJPQVJEX1ZOREtfVkVSU0lPTiksKQotIyBiLzE0MzIzMzYyNiBkbyBub3QgY2hlY2sgdm5kay1saXN0IHdoZW4gdm5kayBsaWJzIGFyZSBub3QgYnVpbHQKLWNoZWNrLXZuZGstbGlzdDogOwotZWxzZQotY2hlY2stdm5kay1saXN0OiAkKGNoZWNrLXZuZGstbGlzdC10aW1lc3RhbXApCi1pZm5lcSAoJChTS0lQX0FCSV9DSEVDS1MpLHRydWUpCi1jaGVjay12bmRrLWxpc3Q6ICQoY2hlY2stdm5kay1hYmktZHVtcC1saXN0LXRpbWVzdGFtcCkKLWVuZGlmCi1lbmRpZgotCi1fdm5ka19jaGVja19mYWlsdXJlX21lc3NhZ2UgOj0gIiBlcnJvcjogVk5ESyBsaWJyYXJ5IGxpc3QgaGFzIGJlZW4gY2hhbmdlZC5cbiIKLWlmZXEgKFJFTCwkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUpKQotX3ZuZGtfY2hlY2tfZmFpbHVyZV9tZXNzYWdlICs9ICIgICAgICAgQ2hhbmdpbmcgdGhlIFZOREsgbGlicmFyeSBsaXN0IGlzIG5vdCBhbGxvd2VkIGluIEFQSSBsb2NrZWQgYnJhbmNoZXMuIgotZWxzZQotX3ZuZGtfY2hlY2tfZmFpbHVyZV9tZXNzYWdlICs9ICIgICAgICAgUnVuIFxgdXBkYXRlLXZuZGstbGlzdC5zaFxgIHRvIHVwZGF0ZSAkKExBVEVTVF9WTkRLX0xJQl9MSVNUKSIKLWVuZGlmCi0KLSMgVGhlICotbmRrX3BsYXRmb3JtLnNvIGxpYnJhcmllcyBubyBsb25nZXIgZXhpc3QgYW5kIGFyZSByZW1vdmVkIGZyb20gdGhlIFZOREsgc2V0LiBIb3dldmVyLCB0aGV5Ci0jIGNhbiBleGlzdCBpZiBORUVEX0FJRExfTkRLX1BMQVRGT1JNX0JBQ0tFTkQgaXMgc2V0IHRvIHRydWUgZm9yIGxlZ2FjeSBkZXZpY2VzLiBEb24ndCBiZSBib3RoZXJlZAotIyB3aXRoIHRoZSBleHRyYW5lb3VzIGxpYnJhcmllcy4KLWlmZXEgKCQoTkVFRF9BSURMX05ES19QTEFURk9STV9CQUNLRU5EKSx0cnVlKQotCV9SRUFEX0lOVEVSTkFMX1ZOREtfTElCX0xJU1QgOj0gc2VkIC9uZGtfcGxhdGZvcm0uc28vZCAkKElOVEVSTkFMX1ZOREtfTElCX0xJU1QpCi1lbHNlCi0JX1JFQURfSU5URVJOQUxfVk5ES19MSUJfTElTVCA6PSBjYXQgJChJTlRFUk5BTF9WTkRLX0xJQl9MSVNUKQotZW5kaWYKLQotJChjaGVjay12bmRrLWxpc3QtdGltZXN0YW1wKTogJChJTlRFUk5BTF9WTkRLX0xJQl9MSVNUKSAkKExBVEVTVF9WTkRLX0xJQl9MSVNUKSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS91cGRhdGUtdm5kay1saXN0LnNoCi0JJChoaWRlKSAoJChfUkVBRF9JTlRFUk5BTF9WTkRLX0xJQl9MSVNUKSB8IHNvcnQgfCBcCi0JZGlmZiAtLW9sZC1saW5lLWZvcm1hdD0iUmVtb3ZlZCAlTCIgXAotCSAgLS1uZXctbGluZS1mb3JtYXQ9IkFkZGVkICVMIiBcCi0JICAtLXVuY2hhbmdlZC1saW5lLWZvcm1hdD0iIiBcCi0JICA8KGNhdCAkKExBVEVTVF9WTkRLX0xJQl9MSVNUKSB8IHNvcnQpIC0gXAotCSAgfHwgKCBlY2hvIC1lICQoX3ZuZGtfY2hlY2tfZmFpbHVyZV9tZXNzYWdlKTsgZXhpdCAxICkpCi0JJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkKLQkkKGhpZGUpIHRvdWNoICRACi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBTY3JpcHQgdG8gdXBkYXRlIHRoZSBsYXRlc3QgVk5ESyBsaWIgbGlzdAotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgOj0gdXBkYXRlLXZuZGstbGlzdC5zaAotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVhFQ1VUQUJMRVMKLUxPQ0FMX01PRFVMRV9TVEVNIDo9ICQoTE9DQUxfTU9EVUxFKQotTE9DQUxfSVNfSE9TVF9NT0RVTEUgOj0gdHJ1ZQotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0lOVEVSTkFMX1ZOREtfTElCX0xJU1QgOj0gJChJTlRFUk5BTF9WTkRLX0xJQl9MSVNUKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0xBVEVTVF9WTkRLX0xJQl9MSVNUIDo9ICQoTEFURVNUX1ZOREtfTElCX0xJU1QpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6Ci0JQGVjaG8gIkdlbmVyYXRlOiAkQCIKLQlAbWtkaXIgLXAgJChkaXIgJEApCi0JQHJtIC1mICRACi0JJChoaWRlKSBlY2hvICIjIS9iaW4vYmFzaCIgPiAkQAotaWZlcSAoUkVMLCQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkpCi0JJChoaWRlKSBlY2hvICJlY2hvIFVwZGF0aW5nIFZOREsgbGlicmFyeSBsaXN0IGlzIE5PVCBhbGxvd2VkIGluIEFQSSBsb2NrZWQgYnJhbmNoZXMuIiA+PiAkQDsgXAotCSAgICAgICAgZWNobyAiZXhpdCAxIiA+PiAkQAotZWxzZQotCSQoaGlkZSkgZWNobyAiaWYgWyAteiBcIlwkJHtBTkRST0lEX0JVSUxEX1RPUH1cIiBdOyB0aGVuIiA+PiAkQDsgXAotCSAgICAgICAgZWNobyAiICBlY2hvIFJ1biBsdW5jaCBvciBjaG9vc2Vjb21ibyBmaXJzdCIgPj4gJEA7IFwKLQkgICAgICAgIGVjaG8gIiAgZXhpdCAxIiA+PiAkQDsgXAotCSAgICAgICAgZWNobyAiZmkiID4+ICRAOyBcCi0JICAgICAgICBlY2hvICJjZCBcJCR7QU5EUk9JRF9CVUlMRF9UT1B9IiA+PiAkQAotaWZlcSAoJChORUVEX0FJRExfTkRLX1BMQVRGT1JNX0JBQ0tFTkQpLHRydWUpCi0JJChoaWRlKSBlY2hvICJzZWQgL25ka19wbGF0Zm9ybS5zby9kICQoUFJJVkFURV9JTlRFUk5BTF9WTkRLX0xJQl9MSVNUKSA+ICQoUFJJVkFURV9MQVRFU1RfVk5ES19MSUJfTElTVCkiID4+ICRACi1lbHNlCi0JJChoaWRlKSBlY2hvICJjcCAkKFBSSVZBVEVfSU5URVJOQUxfVk5ES19MSUJfTElTVCkgJChQUklWQVRFX0xBVEVTVF9WTkRLX0xJQl9MSVNUKSIgPj4gJEAKLWVuZGlmCi0JJChoaWRlKSBlY2hvICJlY2hvICQoUFJJVkFURV9MQVRFU1RfVk5ES19MSUJfTElTVCkgdXBkYXRlZC4iID4+ICRACi1lbmRpZgotCUBjaG1vZCBhK3ggJEAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENoZWNrIHRoYXQgYWxsIEFCSSByZWZlcmVuY2UgZHVtcHMgaGF2ZSBjb3JyZXNwb25kaW5nCi0jIE5ESy9WTkRLL1BMQVRGT1JNIGxpYnJhcmllcy4KLQotIyAkKDEpOiBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgQUJJIGR1bXBzLgotIyBSZXR1cm4gYSBsaXN0IG9mIEFCSSBkdW1wIHBhdGhzIGVuZGluZyB3aXRoIC5zby5sc2R1bXAuCi1kZWZpbmUgZmluZC1hYmktZHVtcC1wYXRocwotJChpZiAkKHdpbGRjYXJkICQoMSkpLCBcCi0gICQoYWRkcHJlZml4ICQoMSkvLCBcCi0gICAgJChjYWxsIGZpbmQtZmlsZXMtaW4tc3ViZGlycywkKDEpLCIqLnNvLmxzZHVtcCIgLWFuZCAtdHlwZSBmLC4pKSkKLWVuZGVmCi0KLSMgJCgxKTogQSBsaXN0IG9mIHRhZ3MuCi0jICQoMik6IEEgbGlzdCBvZiB0YWc6cGF0aC4KLSMgUmV0dXJuIHRoZSBmaWxlIG5hbWVzIG9mIHRoZSBBQkkgZHVtcHMgdGhhdCBtYXRjaCB0aGUgdGFncy4KLWRlZmluZSBmaWx0ZXItYWJpLWR1bXAtcGF0aHMKLSQoZXZhbCB0YWdfcGF0dGVybnMgOj0gJChmb3JlYWNoIHRhZywkKDEpLCQodGFnKTolKSkKLSQobm90ZGlyICQocGF0c3Vic3QgJCh0YWdfcGF0dGVybnMpLCUsJChmaWx0ZXIgJCh0YWdfcGF0dGVybnMpLCQoMikpKSkKLWVuZGVmCi0KLVZOREtfQUJJX0RVTVBfRElSIDo9IHByZWJ1aWx0cy9hYmktZHVtcHMvdm5kay8kKFBMQVRGT1JNX1ZOREtfVkVSU0lPTikKLWlmZXEgKFJFTCwkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUpKQotICAgIE5ES19BQklfRFVNUF9ESVIgOj0gcHJlYnVpbHRzL2FiaS1kdW1wcy9uZGsvJChQTEFURk9STV9TREtfVkVSU0lPTikKLSAgICBQTEFURk9STV9BQklfRFVNUF9ESVIgOj0gcHJlYnVpbHRzL2FiaS1kdW1wcy9wbGF0Zm9ybS8kKFBMQVRGT1JNX1NES19WRVJTSU9OKQotZWxzZQotICAgIE5ES19BQklfRFVNUF9ESVIgOj0gcHJlYnVpbHRzL2FiaS1kdW1wcy9uZGsvY3VycmVudAotICAgIFBMQVRGT1JNX0FCSV9EVU1QX0RJUiA6PSBwcmVidWlsdHMvYWJpLWR1bXBzL3BsYXRmb3JtL2N1cnJlbnQKLWVuZGlmCi1WTkRLX0FCSV9EVU1QUyA6PSAkKGNhbGwgZmluZC1hYmktZHVtcC1wYXRocywkKFZOREtfQUJJX0RVTVBfRElSKSkKLU5ES19BQklfRFVNUFMgOj0gJChjYWxsIGZpbmQtYWJpLWR1bXAtcGF0aHMsJChOREtfQUJJX0RVTVBfRElSKSkKLVBMQVRGT1JNX0FCSV9EVU1QUyA6PSAkKGNhbGwgZmluZC1hYmktZHVtcC1wYXRocywkKFBMQVRGT1JNX0FCSV9EVU1QX0RJUikpCi0KLSMgQ2hlY2sgZm9yIHN1cGVyZmx1b3VzIGxzZHVtcCBmaWxlcy4gU2luY2UgTFNEVU1QX1BBVEhTIG9ubHkgY292ZXJzIHRoZQotIyBsaWJyYXJpZXMgdGhhdCBjYW4gYmUgYnVpbHQgZnJvbSBzb3VyY2UgaW4gdGhlIGN1cnJlbnQgYnVpbGQsIGFuZCBwcmVidWlsdHMgb2YKLSMgTWFpbmxpbmUgbW9kdWxlcyBtYXkgYmUgaW4gdXNlLCB3ZSBhbHNvIGFsbG93IHRoZSBsaWJzIGluIFNUVUJfTElCUkFSSUVTIGZvcgotIyBOREsgYW5kIHBsYXRmb3JtIEFCSXMuCi0KLSQoY2hlY2stdm5kay1hYmktZHVtcC1saXN0LXRpbWVzdGFtcCk6IFBSSVZBVEVfTFNEVU1QX1BBVEhTIDo9ICQoTFNEVU1QX1BBVEhTKQotJChjaGVjay12bmRrLWFiaS1kdW1wLWxpc3QtdGltZXN0YW1wKTogUFJJVkFURV9TVFVCX0xJQlJBUklFUyA6PSAkKFNUVUJfTElCUkFSSUVTKQotJChjaGVjay12bmRrLWFiaS1kdW1wLWxpc3QtdGltZXN0YW1wKToKLQkkKGV2YWwgYWRkZWRfdm5ka19hYmlfZHVtcHMgOj0gJChzdHJpcCAkKHNvcnQgJChmaWx0ZXItb3V0IFwKLQkgICQoY2FsbCBmaWx0ZXItYWJpLWR1bXAtcGF0aHMsVk5ESy1TUCBWTkRLLWNvcmUsJChQUklWQVRFX0xTRFVNUF9QQVRIUykpLCBcCi0JICAkKG5vdGRpciAkKFZOREtfQUJJX0RVTVBTKSkpKSkpCi0JJChpZiAkKGFkZGVkX3ZuZGtfYWJpX2R1bXBzKSwgXAotCSAgZWNobyAtZSAiRm91bmQgdW5leHBlY3RlZCBBQkkgcmVmZXJlbmNlIGR1bXAgZmlsZXMgdW5kZXIgJChWTkRLX0FCSV9EVU1QX0RJUikuIEl0IGlzIGNhdXNlZCBieSBtaXNtYXRjaCBiZXR3ZWVuIEFuZHJvaWQuYnAgYW5kIHRoZSBkdW1wIGZpbGVzLiBSdW4gXGBmaW5kIFwkJHtBTkRST0lEX0JVSUxEX1RPUH0vJChWTkRLX0FCSV9EVU1QX0RJUikgJygnIC1uYW1lICQoc3Vic3QgJChzcGFjZSksIC1vciAtbmFtZSAsJChhZGRlZF92bmRrX2FiaV9kdW1wcykpICcpJyAtZGVsZXRlXGAgdG8gZGVsZXRlIHRoZSBkdW1wIGZpbGVzLiIpCi0KLQkkKGV2YWwgYWRkZWRfbmRrX2FiaV9kdW1wcyA6PSAkKHN0cmlwICQoc29ydCAkKGZpbHRlci1vdXQgXAotCSAgJChjYWxsIGZpbHRlci1hYmktZHVtcC1wYXRocyxOREssJChQUklWQVRFX0xTRFVNUF9QQVRIUykpIFwKLQkgICQoYWRkc3VmZml4IC5sc2R1bXAsJChQUklWQVRFX1NUVUJfTElCUkFSSUVTKSksIFwKLQkgICQobm90ZGlyICQoTkRLX0FCSV9EVU1QUykpKSkpKQotCSQoaWYgJChhZGRlZF9uZGtfYWJpX2R1bXBzKSwgXAotCSAgZWNobyAtZSAiRm91bmQgdW5leHBlY3RlZCBBQkkgcmVmZXJlbmNlIGR1bXAgZmlsZXMgdW5kZXIgJChOREtfQUJJX0RVTVBfRElSKS4gSXQgaXMgY2F1c2VkIGJ5IG1pc21hdGNoIGJldHdlZW4gQW5kcm9pZC5icCBhbmQgdGhlIGR1bXAgZmlsZXMuIFJ1biBcYGZpbmQgXCQke0FORFJPSURfQlVJTERfVE9QfS8kKE5ES19BQklfRFVNUF9ESVIpICcoJyAtbmFtZSAkKHN1YnN0ICQoc3BhY2UpLCAtb3IgLW5hbWUgLCQoYWRkZWRfbmRrX2FiaV9kdW1wcykpICcpJyAtZGVsZXRlXGAgdG8gZGVsZXRlIHRoZSBkdW1wIGZpbGVzLiIpCi0KLQkkKGV2YWwgYWRkZWRfcGxhdGZvcm1fYWJpX2R1bXBzIDo9ICQoc3RyaXAgJChzb3J0ICQoZmlsdGVyLW91dCBcCi0JICAkKGNhbGwgZmlsdGVyLWFiaS1kdW1wLXBhdGhzLExMTkRLIFBMQVRGT1JNLCQoUFJJVkFURV9MU0RVTVBfUEFUSFMpKSBcCi0JICAkKGFkZHN1ZmZpeCAubHNkdW1wLCQoUFJJVkFURV9TVFVCX0xJQlJBUklFUykpLCBcCi0JICAkKG5vdGRpciAkKFBMQVRGT1JNX0FCSV9EVU1QUykpKSkpKQotCSQoaWYgJChhZGRlZF9wbGF0Zm9ybV9hYmlfZHVtcHMpLCBcCi0JICBlY2hvIC1lICJGb3VuZCB1bmV4cGVjdGVkIEFCSSByZWZlcmVuY2UgZHVtcCBmaWxlcyB1bmRlciAkKFBMQVRGT1JNX0FCSV9EVU1QX0RJUikuIEl0IGlzIGNhdXNlZCBieSBtaXNtYXRjaCBiZXR3ZWVuIEFuZHJvaWQuYnAgYW5kIHRoZSBkdW1wIGZpbGVzLiBSdW4gXGBmaW5kIFwkJHtBTkRST0lEX0JVSUxEX1RPUH0vJChQTEFURk9STV9BQklfRFVNUF9ESVIpICcoJyAtbmFtZSAkKHN1YnN0ICQoc3BhY2UpLCAtb3IgLW5hbWUgLCQoYWRkZWRfcGxhdGZvcm1fYWJpX2R1bXBzKSkgJyknIC1kZWxldGVcYCB0byBkZWxldGUgdGhlIGR1bXAgZmlsZXMuIikKLQotCSQoaWYgJChhZGRlZF92bmRrX2FiaV9kdW1wcykkKGFkZGVkX25ka19hYmlfZHVtcHMpJChhZGRlZF9wbGF0Zm9ybV9hYmlfZHVtcHMpLGV4aXQgMSkKLQkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQotCSQoaGlkZSkgdG91Y2ggJEAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFZOREsgcGFja2FnZSBhbmQgc25hcHNob3QuCi0KLWlmbmVxICgkKEJPQVJEX1ZOREtfVkVSU0lPTiksKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSB2bmRrX3BhY2thZ2UKLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotIyBGaWx0ZXIgTExOREsgbGlicyBtb3ZlZCB0byBBUEVYIHRvIGF2b2lkIHB1bGxpbmcgdGhlbSBpbnRvIC9zeXN0ZW0vTElCCi1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKLSAgICAkKGZpbHRlci1vdXQgJChMTE5ES19NT1ZFRF9UT19BUEVYX0xJQlJBUklFUyksJChMTE5ES19MSUJSQVJJRVMpKQotCi1pZm5lcSAoJChUQVJHRVRfU0tJUF9DVVJSRU5UX1ZOREspLHRydWUpCi1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTICs9IFwKLSAgICB2bmRrY29yZXZhcmlhbnQubGlicmFyaWVzLnR4dCBcCi0gICAgJChhZGRzdWZmaXggLnZlbmRvciwkKFZOREtfQ09SRV9MSUJSQVJJRVMpKSBcCi0gICAgJChhZGRzdWZmaXggLnZlbmRvciwkKFZOREtfU0FNRVBST0NFU1NfTElCUkFSSUVTKSkgXAotICAgICQoVk5ES19VU0lOR19DT1JFX1ZBUklBTlRfTElCUkFSSUVTKSBcCi0gICAgY29tLmFuZHJvaWQudm5kay5jdXJyZW50Ci0KLUxPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTICs9ICQoY2FsbCBtb2R1bGUtYnVpbHQtZmlsZXMsXAotICAgICQoYWRkc3VmZml4IC52ZW5kb3IsJChWTkRLX0NPUkVfTElCUkFSSUVTKSAkKFZOREtfU0FNRVBST0NFU1NfTElCUkFSSUVTKSkpCi0KLWVuZGlmCi1pbmNsdWRlICQoQlVJTERfUEhPTllfUEFDS0FHRSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1fdm5ka192ZXJzaW9ucyA6PQotaWZlcSAoJChmaWx0ZXIgY29tLmFuZHJvaWQudm5kay5jdXJyZW50Lm9uX3ZlbmRvciwgJChQUk9EVUNUX1BBQ0tBR0VTKSksKQotCV92bmRrX3ZlcnNpb25zICs9ICQoUFJPRFVDVF9FWFRSQV9WTkRLX1ZFUlNJT05TKQotZW5kaWYKLWlmbmVxICgkKEJPQVJEX1ZOREtfVkVSU0lPTiksY3VycmVudCkKLQlfdm5ka192ZXJzaW9ucyArPSAkKEJPQVJEX1ZOREtfVkVSU0lPTikKLWVuZGlmCi1MT0NBTF9NT0RVTEUgOj0gdm5ka19hcGV4X3NuYXBzaG90X3BhY2thZ2UKLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSAkKGZvcmVhY2ggdm5ka192ZXIsJChfdm5ka192ZXJzaW9ucyksY29tLmFuZHJvaWQudm5kay52JCh2bmRrX3ZlcikpCi1pbmNsdWRlICQoQlVJTERfUEhPTllfUEFDS0FHRSkKLQotX3ZuZGtfdmVyc2lvbnMgOj0KLQotZW5kaWYgIyBCT0FSRF9WTkRLX1ZFUlNJT04gaXMgc2V0Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBza2lwX21vdW50LmNmZywgcmVhZCBieSBpbml0IHRvIHNraXAgbW91bnRpbmcgc29tZSBwYXJ0aXRpb25zIHdoZW4gR1NJIGlzIHVzZWQuCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IGdzaV9za2lwX21vdW50LmNmZwotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9NT0RVTEVfU1RFTSA6PSBza2lwX21vdW50LmNmZwotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoTE9DQUxfTU9EVUxFKQotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfU1lTVEVNX0VYVF9NT0RVTEUgOj0gdHJ1ZQotTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gaW5pdC9jb25maWcKLQotIyBBZGRzIGEgc3ltbGluayB1bmRlciAvc3lzdGVtL2V0Yy9pbml0L2NvbmZpZyBwb2ludGluZyB0byAvc3lzdGVtL3N5c3RlbV9leHQvZXRjL2luaXQvY29uZmlnCi0jIGJlY2F1c2UgZmlyc3Qtc3RhZ2UgaW5pdCBpbiBBbmRyb2lkIDEwLjAgd2lsbCByZWFkIHRoZSBza2lwX21vdW50LmNmZyBmcm9tIC9zeXN0ZW0vZXRjLyogYWZ0ZXIKLSMgY2hyb290IC9zeXN0ZW0uCi0jIFRPRE86IHJlbW92ZSB0aGlzIHN5bWxpbmsgd2hlbiBubyBuZWVkIHRvIHN1cHBvcnQgbmV3IEdTSSBvbiBBbmRyb2lkIDEwLgotIyBUaGUgYWN0dWFsIGZpbGUgbmVlZHMgdG8gYmUgdW5kZXIgL3N5c3RlbS9zeXN0ZW1fZXh0IGJlY2F1c2UgaXQncyBHU0ktc3BlY2lmaWMgYW5kIGRvZXMgbm90Ci0jIGJlbG9uZyB0byBjb3JlIENTSS4KLUxPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgOj0gXAotICAgIG1rZGlyIC1wICQoVEFSR0VUX09VVCkvZXRjL2luaXQ7IFwKLSAgICBsbiAtc2YgL3N5c3RlbS9zeXN0ZW1fZXh0L2V0Yy9pbml0L2NvbmZpZyAkKFRBUkdFVF9PVVQpL2V0Yy9pbml0L2NvbmZpZwotCi1pbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBpbml0LmdzaS5yYywgR1NJLXNwZWNpZmljIGluaXQgc2NyaXB0LgotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBpbml0LmdzaS5yYwotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9TUkNfRklMRVMgOj0gJChMT0NBTF9NT0RVTEUpCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9TWVNURU1fRVhUX01PRFVMRSA6PSB0cnVlCi1MT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBpbml0Ci0KLWluY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKLQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBpbml0LnZuZGstbm9kZWYucmMKLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoTE9DQUxfTU9EVUxFKQotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfU1lTVEVNX0VYVF9NT0RVTEUgOj0gdHJ1ZQotTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gZ3NpCi0KLWluY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2dzaS9jdXJyZW50LnR4dCBiL3RhcmdldC9wcm9kdWN0L2dzaS9jdXJyZW50LnR4dAppbmRleCBjZWIyMDYwLi5jYmI4YTBlIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9nc2kvY3VycmVudC50eHQKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZ3NpL2N1cnJlbnQudHh0CkBAIC00LDYgKzQsNyBAQAogTExOREs6IGxpYkdMRVN2My5zbwogTExOREs6IGxpYlJTLnNvCiBMTE5ESzogbGliYW5kcm9pZF9uZXQuc28KK0xMTkRLOiBsaWJhcGV4c3VwcG9ydC5zbwogTExOREs6IGxpYmJpbmRlcl9uZGsuc28KIExMTkRLOiBsaWJjLnNvCiBMTE5ESzogbGliY2dyb3VwcmMuc28KQEAgLTE3LDExICsxOCwxMyBAQAogTExOREs6IGxpYm5ldXJhbG5ldHdvcmtzLnNvCiBMTE5ESzogbGlic2VsaW51eC5zbwogTExOREs6IGxpYnN5bmMuc28KK0xMTkRLOiBsaWJ2ZW5kb3JzdXBwb3J0LnNvCiBMTE5ESzogbGlidm5ka3N1cHBvcnQuc28KIExMTkRLOiBsaWJ2dWxrYW4uc28KIFZOREstU1A6IGFuZHJvaWQuaGFyZHdhcmUuY29tbW9uLVYyLW5kay5zbwogVk5ESy1TUDogYW5kcm9pZC5oYXJkd2FyZS5jb21tb24uZm1xLVYxLW5kay5zbwotVk5ESy1TUDogYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5jb21tb24tVjQtbmRrLnNvCitWTkRLLVNQOiBhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmFsbG9jYXRvci1WMi1uZGsuc28KK1ZOREstU1A6IGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuY29tbW9uLVY2LW5kay5zbwogVk5ESy1TUDogYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5jb21tb25AMS4wLnNvCiBWTkRLLVNQOiBhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmNvbW1vbkAxLjEuc28KIFZOREstU1A6IGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuY29tbW9uQDEuMi5zbwpAQCAtMzAsMTAgKzMzLDggQEAKIFZOREstU1A6IGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MubWFwcGVyQDIuMS5zbwogVk5ESy1TUDogYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJAMy4wLnNvCiBWTkRLLVNQOiBhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLm1hcHBlckA0LjAuc28KLVZOREstU1A6IGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYWxsb2NhdG9yLVYyLW5kay5zbwogVk5ESy1TUDogYW5kcm9pZC5oYXJkd2FyZS5yZW5kZXJzY3JpcHRAMS4wLnNvCiBWTkRLLVNQOiBhbmRyb2lkLmhpZGwubWVtb3J5LnRva2VuQDEuMC5zbwotVk5ESy1TUDogYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAtaW1wbC5zbwogVk5ESy1TUDogYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAuc28KIFZOREstU1A6IGFuZHJvaWQuaGlkbC5zYWZlX3VuaW9uQDEuMC5zbwogVk5ESy1TUDogbGliUlNDcHVSZWYuc28KQEAgLTU5LDggKzYwLDggQEAKIFZOREstU1A6IGxpYnV0aWxzY2FsbHN0YWNrLnNvCiBWTkRLLVNQOiBsaWJ6LnNvCiBWTkRLLWNvcmU6IGFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLmNvbW1vbi1WMS1uZGsuc28KLVZOREstY29yZTogYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2UuZGV2aWNlLVYxLW5kay5zbwotVk5ESy1jb3JlOiBhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlLVYxLW5kay5zbworVk5ESy1jb3JlOiBhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5kZXZpY2UtVjItbmRrLnNvCitWTkRLLWNvcmU6IGFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2UtVjItbmRrLnNvCiBWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDIuMC5zbwogVk5ESy1jb3JlOiBhbmRyb2lkLmhhcmR3YXJlLmNvbmZpZ3N0b3JlLXV0aWxzLnNvCiBWTkRLLWNvcmU6IGFuZHJvaWQuaGFyZHdhcmUuY29uZmlnc3RvcmVAMS4wLnNvCkBAIC05Myw3ICs5NCw2IEBACiBWTkRLLWNvcmU6IGxpYmNyeXB0by5zbwogVk5ESy1jb3JlOiBsaWJjcnlwdG9fdXRpbHMuc28KIFZOREstY29yZTogbGliY3VybC5zbwotVk5ESy1jb3JlOiBsaWJkaXNrY29uZmlnLnNvCiBWTkRLLWNvcmU6IGxpYmR1bXBzdGF0ZXV0aWwuc28KIFZOREstY29yZTogbGliZXZlbnQuc28KIFZOREstY29yZTogbGliZXhpZi5zbwpAQCAtMTM4LDYgKzEzOCw3IEBACiBWTkRLLWNvcmU6IGxpYnhtbDIuc28KIFZOREstY29yZTogbGlieXV2LnNvCiBWTkRLLWNvcmU6IGxpYnppcGFyY2hpdmUuc28KK1ZOREstY29yZTogc2VydmVyX2NvbmZpZ3VyYWJsZV9mbGFncy5zbwogVk5ESy1wcml2YXRlOiBsaWJibGFzLnNvCiBWTkRLLXByaXZhdGU6IGxpYmNvbXBpbGVyX3J0LnNvCiBWTkRLLXByaXZhdGU6IGxpYmZ0Mi5zbwpAQCAtMjA4LDMgKzIwOSw0IEBACiBWTkRLLXByb2R1Y3Q6IGxpYnl1di5zbwogVk5ESy1wcm9kdWN0OiBsaWJ6LnNvCiBWTkRLLXByb2R1Y3Q6IGxpYnppcGFyY2hpdmUuc28KK1ZOREstcHJvZHVjdDogc2VydmVyX2NvbmZpZ3VyYWJsZV9mbGFncy5zbwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvZ3NpX3JlbGVhc2UubWsgYi90YXJnZXQvcHJvZHVjdC9nc2lfcmVsZWFzZS5tawppbmRleCA5ZDEwMmVhLi4xMTViMzU1IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9nc2lfcmVsZWFzZS5taworKysgYi90YXJnZXQvcHJvZHVjdC9nc2lfcmVsZWFzZS5tawpAQCAtMjgsOCArMjgsOCBAQAogCiBCVUlMRElOR19HU0kgOj0gdHJ1ZQogCi0jIEV4Y2x1ZGUgYWxsIGZpbGVzIHVuZGVyIHN5c3RlbS9wcm9kdWN0IGFuZCBzeXN0ZW0vc3lzdGVtX2V4dAogUFJPRFVDVF9BUlRJRkFDVF9QQVRIX1JFUVVJUkVNRU5UX0FMTE9XRURfTElTVCArPSBcCisgICAgc3lzdGVtL2V0Yy9pbml0L2NvbmZpZyBcCiAgICAgc3lzdGVtL3Byb2R1Y3QvJSBcCiAgICAgc3lzdGVtL3N5c3RlbV9leHQvJQogCkBAIC00NCwzOCArNDQsMjkgQEAKICMgRW5hYmxlIGR5bmFtaWMgcGFydGl0aW9uIHNpemUKIFBST0RVQ1RfVVNFX0RZTkFNSUNfUEFSVElUSU9OX1NJWkUgOj0gdHJ1ZQogCi0jIERpc2FibGUgdGhlIGJ1aWxkLXRpbWUgZGVidWdmcyByZXN0cmljdGlvbnMgb24gR1NJIGJ1aWxkcwotUFJPRFVDVF9TRVRfREVCVUdGU19SRVNUUklDVElPTlMgOj0gZmFsc2UKLQotIyBHU0kgdGFyZ2V0cyBzaG91bGQgaW5zdGFsbCAidW5mbGF0dGVuZWQiIEFQRVhlcyBpbiAvc3lzdGVtCi1UQVJHRVRfRkxBVFRFTl9BUEVYIDo9IGZhbHNlCi0KLSMgR1NJIHRhcmdldHMgc2hvdWxkIGluc3RhbGwgImZsYXR0ZW5lZCIgQVBFWGVzIGluIC9zeXN0ZW1fZXh0IGFzIHdlbGwKLVBST0RVQ1RfSU5TVEFMTF9FWFRSQV9GTEFUVEVORURfQVBFWEVTIDo9IHRydWUKLQotIyBUaGUgZmxhdHRlbmVkIHZlcnNpb24gb2YgY29tLmFuZHJvaWQuYXBleC5jdHMuc2hpbS52MSBzaG91bGQgYmUgZXhwbGljaXRseSBpbnN0YWxsZWQKLSMgYmVjYXVzZSB0aGUgc2hpbSBhcGV4IGlzIHByZWJ1aWx0IG9uZSBhbmQgUFJPRFVDVF9JTlNUQUxMX0VYVFJBX0ZMQVRURU5FRF9BUEVYRVMgaXMgbm90Ci0jIHN1cHBvcnRlZCBmb3IgcHJlYnVpbHRfYXBleCBtb2R1bGVzIHlldC4KLVBST0RVQ1RfUEFDS0FHRVMgKz0gY29tLmFuZHJvaWQuYXBleC5jdHMuc2hpbS52MV93aXRoX3ByZWJ1aWx0cy5mbGF0dGVuZWQKLQogIyBHU0kgc3BlY2lmaWMgdGFza3Mgb24gYm9vdAogUFJPRFVDVF9QQUNLQUdFUyArPSBcCiAgICAgZ3NpX3NraXBfbW91bnQuY2ZnIFwKICAgICBpbml0LmdzaS5yYyBcCiAgICAgaW5pdC52bmRrLW5vZGVmLnJjIFwKIAotIyBPdmVybGF5IHRoZSBHU0kgc3BlY2lmaWMgU3lzdGVtVUkgc2V0dGluZwotUFJPRFVDVF9QQUNLQUdFUyArPSBnc2lfb3ZlcmxheV9zeXN0ZW11aQotUFJPRFVDVF9DT1BZX0ZJTEVTICs9IFwKLSAgICBkZXZpY2UvZ2VuZXJpYy9jb21tb24vb3ZlcmxheXMvb3ZlcmxheS1jb25maWcueG1sOiQoVEFSR0VUX0NPUFlfT1VUX1NZU1RFTV9FWFQpL292ZXJsYXkvY29uZmlnL2NvbmZpZy54bWwKKworIyBPdmVybGF5IHRoZSBHU0kgc3BlY2lmaWMgc2V0dGluZyBmb3IgZnJhbWV3b3JrIGFuZCBTeXN0ZW1VSQoraWZuZXEgKCQoUFJPRFVDVF9JU19BVVRPTU9USVZFKSx0cnVlKQorICAgIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgICAgICBnc2lfb3ZlcmxheV9mcmFtZXdvcmsgXAorICAgICAgICBnc2lfb3ZlcmxheV9zeXN0ZW11aSBcCisgICAgUFJPRFVDVF9DT1BZX0ZJTEVTICs9IFwKKyAgICAgICAgZGV2aWNlL2dlbmVyaWMvY29tbW9uL292ZXJsYXlzL292ZXJsYXktY29uZmlnLnhtbDokKFRBUkdFVF9DT1BZX09VVF9TWVNURU1fRVhUKS9vdmVybGF5L2NvbmZpZy9jb25maWcueG1sCitlbmRpZgogCiAjIFN1cHBvcnQgYWRkaXRpb25hbCBWTkRLIHNuYXBzaG90cwogUFJPRFVDVF9FWFRSQV9WTkRLX1ZFUlNJT05TIDo9IFwKLSAgICAyOSBcCiAgICAgMzAgXAogICAgIDMxIFwKICAgICAzMiBcCiAgICAgMzMgXAorICAgIDM0IFwKIAogIyBEbyBub3QgYnVpbGQgbm9uLUdTSSBwYXJ0aXRpb24gaW1hZ2VzLgogUFJPRFVDVF9CVUlMRF9DQUNIRV9JTUFHRSA6PSBmYWxzZQpAQCAtODgsOSArNzksMjQgQEAKIFBST0RVQ1RfQlVJTERfU1lTVEVNX0RMS01fSU1BR0UgOj0gZmFsc2UKIFBST0RVQ1RfRVhQT1JUX0JPT1RfSU1BR0VfVE9fRElTVCA6PSB0cnVlCiAKKyMgQnVpbGQgcHZtZncgd2l0aCBHU0k6IGIvMzc2MzYzOTg5LCBwdm1mdyBjdXJyZW50bHkgb25seSBzdXBwb3J0cyBBQXJjaDY0CitpZm5lcSAoLCQoZmlsdGVyICVfYXJtNjQsJChUQVJHRVRfUFJPRFVDVCkpKQorUFJPRFVDVF9CVUlMRF9QVk1GV19JTUFHRSA6PSB0cnVlCitlbmRpZgorCiAjIEFkZGl0aW9uYWwgc2V0dGluZ3MgdXNlZCBpbiBhbGwgR1NJIGJ1aWxkcwogUFJPRFVDVF9QUk9EVUNUX1BST1BFUlRJRVMgKz0gXAogICAgIHJvLmNyeXB0by5tZXRhZGF0YV9pbml0X2RlbGV0ZV9hbGxfa2V5cy5lbmFibGVkPWZhbHNlIFwKKyAgICBkZWJ1Zy5jb2RlYzIuYnFwb29sX2RlYWxsb2NfYWZ0ZXJfc3RvcD0xIFwKIAogIyBXaW5kb3cgRXh0ZW5zaW9ucwotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC93aW5kb3dfZXh0ZW5zaW9ucy5taykKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitpZm5lcSAoJChQUk9EVUNUX0lTX0FUViksdHJ1ZSkKKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3Qvd2luZG93X2V4dGVuc2lvbnMubWspCitlbmRpZgorCisjIEEgR1NJIGlzIHRvIGJlIG1peGVkIHdpdGggZGlmZmVyZW50IGJvb3QgaW1hZ2VzLiBUaGF0IG1lYW5zIHdlIGNhbid0IGRldGVybWluZQorIyB0aGUga2VybmVsIHZlcnNpb24gd2hlbiBidWlsZGluZyBhIEdTSS4KKyMgQXNzdW1lIHRoZSBkZXZpY2Ugc3VwcG9ydHMgVUZGRC4gSWYgaXQgZG9lc24ndCwgdGhlIEFSVCBydW50aW1lIHdpbGwgZmFsbCBiYWNrCisjIHRvIENDLCBhbmQgb2RyZWZyZXNoIHdpbGwgcmVnZW5lcmF0ZSBjb3JlIGRleG9wdCBhcnRpZmFjdHMgb24gdGhlIGZpcnN0IGJvb3QsCisjIHNvIHRoaXMgaXMgb2theS4KK1BST0RVQ1RfRU5BQkxFX1VGRkRfR0MgOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvaGFuZGhlbGRfc3lzdGVtLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvaGFuZGhlbGRfc3lzdGVtLm1rCmluZGV4IDc4NjRlN2IuLjJiMDU1YzcgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2hhbmRoZWxkX3N5c3RlbS5taworKysgYi90YXJnZXQvcHJvZHVjdC9oYW5kaGVsZF9zeXN0ZW0ubWsKQEAgLTI3LDExICsyNywxMyBAQAogJChjYWxsIGluaGVyaXQtcHJvZHVjdC1pZi1leGlzdHMsIGV4dGVybmFsL2dvb2dsZS1mb250cy9zb3VyY2Utc2Fucy1wcm8vZm9udHMubWspCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LWlmLWV4aXN0cywgZXh0ZXJuYWwvbm90by1mb250cy9mb250cy5taykKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QtaWYtZXhpc3RzLCBleHRlcm5hbC9yb2JvdG8tZm9udHMvZm9udHMubWspCiskKGNhbGwgaW5oZXJpdC1wcm9kdWN0LWlmLWV4aXN0cywgZXh0ZXJuYWwvcm9ib3RvLWZsZXgtZm9udHMvZm9udHMubWspCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LWlmLWV4aXN0cywgZXh0ZXJuYWwvaHlwaGVuYXRpb24tcGF0dGVybnMvcGF0dGVybnMubWspCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LWlmLWV4aXN0cywgZnJhbWV3b3Jrcy9iYXNlL2RhdGEva2V5Ym9hcmRzL2tleWJvYXJkcy5taykKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QtaWYtZXhpc3RzLCBmcmFtZXdvcmtzL3dlYnZpZXcvY2hyb21pdW0vY2hyb21pdW0ubWspCiAKIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgIGFuZHJvaWQuc29mdHdhcmUud2luZG93X21hZ25pZmljYXRpb24ucHJlYnVpbHQueG1sIFwKICAgICBCYXNpY0RyZWFtcyBcCiAgICAgQmxvY2tlZE51bWJlclByb3ZpZGVyIFwKICAgICBCbHVldG9vdGhNaWRpU2VydmljZSBcCkBAIC00NCw2ICs0Niw3IEBACiAgICAgQ2VydEluc3RhbGxlciBcCiAgICAgQ3JlZGVudGlhbE1hbmFnZXIgXAogICAgIERldmljZUFzV2ViY2FtIFwKKyAgICBEZXZpY2VEaWFnbm9zdGljcyBcCiAgICAgRG9jdW1lbnRzVUkgXAogICAgIERvd25sb2FkUHJvdmlkZXJVaSBcCiAgICAgRWFzdGVyRWdnIFwKQEAgLTU2LDcgKzU5LDYgQEAKICAgICBNbXNTZXJ2aWNlIFwKICAgICBNdHBTZXJ2aWNlIFwKICAgICBNdXNpY0ZYIFwKLSAgICBOZmNOY2kgXAogICAgIFBhY1Byb2Nlc3NvciBcCiAgICAgcHJlaW5zdGFsbGVkLXBhY2thZ2VzLXBsYXRmb3JtLWhhbmRoZWxkLXN5c3RlbS54bWwgXAogICAgIFByaW50UmVjb21tZW5kYXRpb25TZXJ2aWNlIFwKQEAgLTY3LDEzICs2OSwyNCBAQAogICAgIFNoYXJlZFN0b3JhZ2VCYWNrdXAgXAogICAgIFNpbUFwcERpYWxvZyBcCiAgICAgVGVsZWNvbSBcCi0gICAgVGVsZXBob255UHJvdmlkZXIgXAogICAgIFRlbGVTZXJ2aWNlIFwKICAgICBUcmFjZXVyIFwKICAgICBVc2VyRGljdGlvbmFyeVByb3ZpZGVyIFwKICAgICBWcG5EaWFsb2dzIFwKICAgICB2ciBcCiAKKyMgQ2hvb3NlIHRoZSBjb3JyZWN0IHByb2R1Y3RzIGJhc2VkIG9uIEhTVU0gc3RhdHVzCitpZmVxICgkKFBST0RVQ1RfVVNFX0hTVU0pLHRydWUpCisgIFBST0RVQ1RfUEFDS0FHRVMgKz0gVGVsZXBob255UHJvdmlkZXJIc3VtCitlbHNlCisgIFBST0RVQ1RfUEFDS0FHRVMgKz0gVGVsZXBob255UHJvdmlkZXIKK2VuZGlmCisKK1BST0RVQ1RfUEFDS0FHRVMgKz0gJChSRUxFQVNFX1BBQ0tBR0VfVklSVFVBTF9DQU1FUkEpCisjIFNldCB2aXJ0dWFsX2NhbWVyYV9zZXJ2aWNlX2VuYWJsZWQgc29vbmcgY29uZmlnIHZhcmlhYmxlIGJhc2VkIG9uIHRoZQorIyBSRUxFQVNFX1BBQ0tBR0VfVklSVFVBTF9DQU1FUkEgYnVpbGQuIHZpcnR1YWxfY2FtZXJhX3NlcnZpY2VfZW5hYmxlZCBzb29uZyBjb25maWcKKyMgdmFyaWFibGUgaXMgdXNlZCB0byBwcmV2ZW50IGFjY2Vzc2luZyB0aGUgc2VydmljZSB3aGVuIGl0J3Mgbm90IHByZXNlbnQgaW4gdGhlIGJ1aWxkLgorJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsdmRtLHZpcnR1YWxfY2FtZXJhX3NlcnZpY2VfZW5hYmxlZCwkKGlmICQoUkVMRUFTRV9QQUNLQUdFX1ZJUlRVQUxfQ0FNRVJBKSx0cnVlLGZhbHNlKSkKIAogUFJPRFVDVF9TWVNURU1fU0VSVkVSX0FQUFMgKz0gXAogICAgIEZ1c2VkTG9jYXRpb24gXApAQCAtODEsOSArOTQsNyBAQAogICAgIEtleUNoYWluIFwKICAgICBUZWxlY29tIFwKIAotUFJPRFVDVF9DT1BZX0ZJTEVTICs9IFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvZGF0YS9hdWRpb19lZmZlY3RzLnhtbDpzeXN0ZW0vZXRjL2F1ZGlvX2VmZmVjdHMueG1sIFwKLSAgICBmcmFtZXdvcmtzL25hdGl2ZS9kYXRhL2V0Yy9hbmRyb2lkLnNvZnR3YXJlLndpbmRvd19tYWduaWZpY2F0aW9uLnhtbDokKFRBUkdFVF9DT1BZX09VVF9TWVNURU0pL2V0Yy9wZXJtaXNzaW9ucy9hbmRyb2lkLnNvZnR3YXJlLndpbmRvd19tYWduaWZpY2F0aW9uLnhtbCBcCitQUk9EVUNUX1BBQ0tBR0VTICs9IGZyYW1ld29yay1hdWRpb19lZmZlY3RzLnhtbAogCiBQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IFwKICAgICByby5jYXJyaWVyPz11bmtub3duIFwKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2hzdW1fY29tbW9uLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvaHN1bV9jb21tb24ubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE5YmM2NQotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9wcm9kdWN0L2hzdW1fY29tbW9uLm1rCkBAIC0wLDAgKzEsMjkgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgQ29udGFpbnMgY29tbW9uIGRlZmF1bHQgZWxlbWVudHMgZm9yIGRldmljZXMgcnVubmluZyBpbiBIZWFkbGVzcyBTeXN0ZW0gVXNlciBNb2RlLgorCisjIFNob3VsZCBnZW5lcmFsbHkgYmUgaW5oZXJpdGVkIGZpcnN0IGFzIHVzaW5nIGFuIEhTVU0gY29uZmlndXJhdGlvbiBjYW4gYWZmZWN0IGRvd25zdHJlYW0gY2hvaWNlcworIyAoc3VjaCBhcyBlbnN1cmluZyB0aGF0IHRoZSBIU1VNLXZhcmlhbnRzIG9mIHBhY2thZ2VzIGFyZSBzZWxlY3RlZCkuCisKK1BST0RVQ1RfU1lTVEVNX0RFRkFVTFRfUFJPUEVSVElFUyArPSBcCisgICAgcm8uZncubXUuaGVhZGxlc3Nfc3lzdGVtX3VzZXI9dHJ1ZQorCisjIFZhcmlhYmxlIGZvciBlbHNld2hlcmUgY2hvb3NpbmcgdGhlIGFwcHJvcHJpYXRlIHByb2R1Y3RzIGJhc2VkIG9uIEhTVU0gc3RhdHVzLgorUFJPRFVDVF9VU0VfSFNVTSA6PSB0cnVlCisKK1BST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgIEhzdW1EZWZhdWx0Q29uZmlnT3ZlcmxheQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3g4Nl82NC5tayBiL3RhcmdldC9wcm9kdWN0L2xhcmdlX3NjcmVlbl9jb21tb24ubWsKc2ltaWxhcml0eSBpbmRleCA2NiUKY29weSBmcm9tIHRhcmdldC9wcm9kdWN0L3Nka194ODZfNjQubWsKY29weSB0byB0YXJnZXQvcHJvZHVjdC9sYXJnZV9zY3JlZW5fY29tbW9uLm1rCmluZGV4IDVmNjU1M2UuLjNlYjlmZjAgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3Nka194ODZfNjQubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvbGFyZ2Vfc2NyZWVuX2NvbW1vbi5tawpAQCAtMSw1ICsxLDQgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMgQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICMKICMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDggKzEzLDkgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLSMgRG9uJ3QgbW9kaWZ5IHRoaXMgZmlsZSAtIEl0J3MganVzdCBhbiBhbGlhcyEKKyMgV2luZG93IEV4dGVuc2lvbnMKKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3Qvd2luZG93X2V4dGVuc2lvbnMubWspCiAKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3Qvc2RrX3Bob25lX3g4Nl82NC5taykKLQotUFJPRFVDVF9OQU1FIDo9IHNka194ODZfNjQKKyMgRW5hYmxlIFNldHRpbmdzIDItcGFuZSBvcHRpbWl6YXRpb24gZm9yIGxhcmdlLXNjcmVlbgorUFJPRFVDVF9TWVNURU1fUFJPUEVSVElFUyArPSBcCisgICAgcGVyc2lzdC5zZXR0aW5ncy5sYXJnZV9zY3JlZW5fb3B0LmVuYWJsZWQ9dHJ1ZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvbWFpbmxpbmVfc2RrLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvbWFpbmxpbmVfc2RrLm1rCmluZGV4IDM0M2FlZDYuLjEwYmIwYTAgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L21haW5saW5lX3Nkay5taworKysgYi90YXJnZXQvcHJvZHVjdC9tYWlubGluZV9zZGsubWsKQEAgLTE2LDMgKzE2LDUgQEAKIFBST0RVQ1RfTkFNRSA6PSBtYWlubGluZV9zZGsKIFBST0RVQ1RfQlJBTkQgOj0gQW5kcm9pZAogUFJPRFVDVF9ERVZJQ0UgOj0gbWFpbmxpbmVfc2RrCisKK1BST0RVQ1RfQlVJTERfRlJPTV9TT1VSQ0VfU1RVQiA6PSB0cnVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvbWVkaWFfc3lzdGVtLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvbWVkaWFfc3lzdGVtLm1rCmluZGV4IDM4YmEyMTkuLmFmMzg1N2UgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L21lZGlhX3N5c3RlbS5taworKysgYi90YXJnZXQvcHJvZHVjdC9tZWRpYV9zeXN0ZW0ubWsKQEAgLTIxLDYgKzIxLDcgQEAKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvYmFzZV9zeXN0ZW0ubWspCiAKIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgIGFuZHJvaWQuc29mdHdhcmUud2Vidmlldy5wcmVidWlsdC54bWwgXAogICAgIGNvbS5hbmRyb2lkLmZ1dHVyZS51c2IuYWNjZXNzb3J5IFwKICAgICBjb20uYW5kcm9pZC5tZWRpYWRybS5zaWduZXIgXAogICAgIGNvbS5hbmRyb2lkLm1lZGlhLnJlbW90ZWRpc3BsYXkgXApAQCAtMzksMTIgKzQwLDkgQEAKIFBST0RVQ1RfSE9TVF9QQUNLQUdFUyArPSBcCiAgICAgZnNjay5mMmZzIFwKIAotUFJPRFVDVF9DT1BZX0ZJTEVTICs9IFwKLSAgICBmcmFtZXdvcmtzL25hdGl2ZS9kYXRhL2V0Yy9hbmRyb2lkLnNvZnR3YXJlLndlYnZpZXcueG1sOnN5c3RlbS9ldGMvcGVybWlzc2lvbnMvYW5kcm9pZC5zb2Z0d2FyZS53ZWJ2aWV3LnhtbAotCiBpZm5lcSAoUkVMLCQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkpCi1QUk9EVUNUX0NPUFlfRklMRVMgKz0gXAotICAgIGZyYW1ld29ya3MvbmF0aXZlL2RhdGEvZXRjL2FuZHJvaWQuc29mdHdhcmUucHJldmlld19zZGsueG1sOnN5c3RlbS9ldGMvcGVybWlzc2lvbnMvYW5kcm9pZC5zb2Z0d2FyZS5wcmV2aWV3X3Nkay54bWwKK1BST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgIGFuZHJvaWQuc29mdHdhcmUucHJldmlld19zZGsucHJlYnVpbHQueG1sCiBlbmRpZgogCiAjIFRoZSBvcmRlciBoZXJlIGlzIHRoZSBzYW1lIG9yZGVyIHRoZXkgZW5kIHVwIG9uIHRoZSBjbGFzc3BhdGgsIHNvIGl0IG1hdHRlcnMuCkBAIC01OSwxMCArNTcsNiBAQAogUFJPRFVDVF9DT1BZX0ZJTEVTICs9ICQoY2FsbCBhZGQtdG8tcHJvZHVjdC1jb3B5LWZpbGVzLWlmLWV4aXN0cyxcCiAgICAgZnJhbWV3b3Jrcy9iYXNlL2NvbmZpZy9jb21waWxlZC1jbGFzc2VzLXBob25lOnN5c3RlbS9ldGMvY29tcGlsZWQtY2xhc3NlcykKIAotIyBFbmFibGUgZGlydHkgaW1hZ2Ugb2JqZWN0IGJpbm5pbmcgdG8gcmVkdWNlIGRpcnR5IHBhZ2VzIGluIHRoZSBpbWFnZS4KLVBST0RVQ1RfQ09QWV9GSUxFUyArPSAkKGNhbGwgYWRkLXRvLXByb2R1Y3QtY29weS1maWxlcy1pZi1leGlzdHMsXAotICAgIGZyYW1ld29ya3MvYmFzZS9kaXJ0eS1pbWFnZS1vYmplY3RzLXBob25lOnN5c3RlbS9ldGMvZGlydHktaW1hZ2Utb2JqZWN0cykKLQogIyBPbiB1c2VyZGVidWcgYnVpbGRzLCBjb2xsZWN0IG1vcmUgdG9tYnN0b25lcyBieSBkZWZhdWx0LgogaWZuZXEgKCwkKGZpbHRlciB1c2VyZGVidWcgZW5nLCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpKSkKIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gXApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvbWVkaWFfc3lzdGVtX2V4dC5tayBiL3RhcmdldC9wcm9kdWN0L21lZGlhX3N5c3RlbV9leHQubWsKaW5kZXggMmUyMGFmMy4uZTc5YTdlYiAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvbWVkaWFfc3lzdGVtX2V4dC5taworKysgYi90YXJnZXQvcHJvZHVjdC9tZWRpYV9zeXN0ZW1fZXh0Lm1rCkBAIC0yMCw2ICsyMCw1IEBACiAjIGJhc2Vfc3lzdGVtX2V4dC5tay4KICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvYmFzZV9zeXN0ZW1fZXh0Lm1rKQogCi0jIC9zeXN0ZW1fZXh0IHBhY2thZ2VzCi1QUk9EVUNUX1BBQ0tBR0VTICs9IFwKLSAgICB2bmRrX2FwZXhfc25hcHNob3RfcGFja2FnZSBcCisjIFdpbmRvdyBFeHRlbnNpb25zCiskKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L3dpbmRvd19leHRlbnNpb25zX2Jhc2UubWspCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9tb2R1bGVfYXJtNjQubWsgYi90YXJnZXQvcHJvZHVjdC9tb2R1bGVfYXJtNjQubWsKaW5kZXggMmU4YzhhNy4uZDY0ODdjYSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvbW9kdWxlX2FybTY0Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L21vZHVsZV9hcm02NC5tawpAQCAtMTksMyArMTksNiBAQAogCiBQUk9EVUNUX05BTUUgOj0gbW9kdWxlX2FybTY0CiBQUk9EVUNUX0RFVklDRSA6PSBtb2R1bGVfYXJtNjQKKworUFJPRFVDVF9OT19CSU9OSUNfUEFHRV9TSVpFX01BQ1JPIDo9IHRydWUKK1BST0RVQ1RfTUFYX1BBR0VfU0laRV9TVVBQT1JURUQgOj0gMTYzODQKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L21vZHVsZV9hcm02NG9ubHkubWsgYi90YXJnZXQvcHJvZHVjdC9tb2R1bGVfYXJtNjRvbmx5Lm1rCmluZGV4IGMwNzY5YmYuLjEzNzcwMWEgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L21vZHVsZV9hcm02NG9ubHkubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvbW9kdWxlX2FybTY0b25seS5tawpAQCAtMTksMyArMTksNiBAQAogCiBQUk9EVUNUX05BTUUgOj0gbW9kdWxlX2FybTY0b25seQogUFJPRFVDVF9ERVZJQ0UgOj0gbW9kdWxlX2FybTY0b25seQorCitQUk9EVUNUX05PX0JJT05JQ19QQUdFX1NJWkVfTUFDUk8gOj0gdHJ1ZQorUFJPRFVDVF9NQVhfUEFHRV9TSVpFX1NVUFBPUlRFRCA6PSAxNjM4NApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvbW9kdWxlX2NvbW1vbi5tayBiL3RhcmdldC9wcm9kdWN0L21vZHVsZV9jb21tb24ubWsKaW5kZXggNTNiMmNhNi4uZGE0ZWEyMyAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvbW9kdWxlX2NvbW1vbi5taworKysgYi90YXJnZXQvcHJvZHVjdC9tb2R1bGVfY29tbW9uLm1rCkBAIC0xNCw2ICsxNCw3IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCiskKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2J1aWxkX3ZhcmlhYmxlcy5taykKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvZGVmYXVsdF9hcnRfY29uZmlnLm1rKQogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9sYW5ndWFnZXNfZGVmYXVsdC5taykKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvY2ZpLWNvbW1vbi5taykKQEAgLTIzLDggKzI0LDkgQEAKICMgdXNlcyAtREVORk9SQ0VfVklOVEZfTUFOSUZFU1QuIFNlZSBiLzE4NTc1OTg3NwogUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwgOj0gMjkKIAotIyBCdWlsZHMgdXNpbmcgYSBtb2R1bGUgcHJvZHVjdCBzaG91bGQgYnVpbGQgbW9kdWxlcyBmcm9tIHNvdXJjZSwgZXZlbiBpZgotIyBCUkFOQ0hfREVGQVVMVF9NT0RVTEVfQlVJTERfRlJPTV9TT1VSQ0Ugc2F5cyBvdGhlcndpc2UuCisjIElmIHRydWUsIHRoaXMgYnVpbGRzIHRoZSBtYWlubGluZSBtb2R1bGVzIGZyb20gc291cmNlLiBUaGlzIG92ZXJyaWRlcyBhbnkKKyMgcHJlYnVpbHRzIHNlbGVjdGVkIHZpYSBSRUxFQVNFX0FQRVhfQ09OVFJJQlVUSU9OU18qIGJ1aWxkIGZsYWdzIGZvciB0aGUKKyMgY3VycmVudCByZWxlYXNlIGNvbmZpZy4KIFBST0RVQ1RfTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFIDo9IHRydWUKIAogIyBCdWlsZCBzZGsgZnJvbSBzb3VyY2UgaWYgdGhlIGJyYW5jaCBpcyBub3QgdXNpbmcgc2xpbSBtYW5pZmVzdHMuCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9zZGtfeDg2XzY0Lm1rIGIvdGFyZ2V0L3Byb2R1Y3QvbW9kdWxlX3Jpc2N2NjQubWsKc2ltaWxhcml0eSBpbmRleCA2OCUKY29weSBmcm9tIHRhcmdldC9wcm9kdWN0L3Nka194ODZfNjQubWsKY29weSB0byB0YXJnZXQvcHJvZHVjdC9tb2R1bGVfcmlzY3Y2NC5tawppbmRleCA1ZjY1NTNlLi40ZmQzOGMwIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9zZGtfeDg2XzY0Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L21vZHVsZV9yaXNjdjY0Lm1rCkBAIC0xLDUgKzEsNSBAQAogIwotIyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsOCArMTQsOCBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotIyBEb24ndCBtb2RpZnkgdGhpcyBmaWxlIC0gSXQncyBqdXN0IGFuIGFsaWFzIQorJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9tb2R1bGVfY29tbW9uLm1rKQorJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9jb3JlXzY0X2JpdF9vbmx5Lm1rKQogCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L3Nka19waG9uZV94ODZfNjQubWspCi0KLVBST0RVQ1RfTkFNRSA6PSBzZGtfeDg2XzY0CitQUk9EVUNUX05BTUUgOj0gbW9kdWxlX3Jpc2N2NjQKK1BST0RVQ1RfREVWSUNFIDo9IG1vZHVsZV9yaXNjdjY0CmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9tb2R1bGVfeDg2XzY0Lm1rIGIvdGFyZ2V0L3Byb2R1Y3QvbW9kdWxlX3g4Nl82NC5tawppbmRleCAyMGY0NDNhLi5lMTgyYmY2IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9tb2R1bGVfeDg2XzY0Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L21vZHVsZV94ODZfNjQubWsKQEAgLTE5LDMgKzE5LDYgQEAKIAogUFJPRFVDVF9OQU1FIDo9IG1vZHVsZV94ODZfNjQKIFBST0RVQ1RfREVWSUNFIDo9IG1vZHVsZV94ODZfNjQKKworUFJPRFVDVF9OT19CSU9OSUNfUEFHRV9TSVpFX01BQ1JPIDo9IHRydWUKK1BST0RVQ1RfTUFYX1BBR0VfU0laRV9TVVBQT1JURUQgOj0gIDE2Mzg0CmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9tb2R1bGVfeDg2XzY0b25seS5tayBiL3RhcmdldC9wcm9kdWN0L21vZHVsZV94ODZfNjRvbmx5Lm1rCmluZGV4IGIwZDcyYmYuLmZhNGEwNGQgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L21vZHVsZV94ODZfNjRvbmx5Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L21vZHVsZV94ODZfNjRvbmx5Lm1rCkBAIC0xOSwzICsxOSw2IEBACiAKIFBST0RVQ1RfTkFNRSA6PSBtb2R1bGVfeDg2XzY0b25seQogUFJPRFVDVF9ERVZJQ0UgOj0gbW9kdWxlX3g4Nl82NG9ubHkKKworUFJPRFVDVF9OT19CSU9OSUNfUEFHRV9TSVpFX01BQ1JPIDo9IHRydWUKK1BST0RVQ1RfTUFYX1BBR0VfU0laRV9TVVBQT1JURUQgOj0gMTYzODQKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L25kay5tayBiL3RhcmdldC9wcm9kdWN0L25kay5tawppbmRleCAxZGZkMGRiLi5lNGY3N2Y3IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9uZGsubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvbmRrLm1rCkBAIC0xOSwzICsxOSw1IEBACiBQUk9EVUNUX05BTUUgOj0gbmRrCiBQUk9EVUNUX0JSQU5EIDo9IEFuZHJvaWQKIFBST0RVQ1RfREVWSUNFIDo9IG5kaworCitQUk9EVUNUX05PX0JJT05JQ19QQUdFX1NJWkVfTUFDUk8gOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvcnVudGltZV9saWJhcnQubWsgYi90YXJnZXQvcHJvZHVjdC9ydW50aW1lX2xpYmFydC5tawppbmRleCA2OGVkMjQ5Li45ZThhZmE4IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9ydW50aW1lX2xpYmFydC5taworKysgYi90YXJnZXQvcHJvZHVjdC9ydW50aW1lX2xpYmFydC5tawpAQCAtMTAyLDM5ICsxMDIsNDggQEAKIFBST0RVQ1RfU1lTVEVNX1BST1BFUlRJRVMgKz0gXAogICAgIHJvLmRhbHZpay52bS5uYXRpdmUuYnJpZGdlPz0wCiAKLSMgRGlmZmVyZW50IGRleG9wdCB0eXBlcyBmb3IgZGlmZmVyZW50IHBhY2thZ2UgdXBkYXRlL2luc3RhbGwgdGltZXMuCi0jIE9uIGVuZyBidWlsZHMsIG1ha2UgImJvb3QiIHJlYXNvbnMgb25seSBleHRyYWN0IGZvciBmYXN0ZXIgdHVybmFyb3VuZC4KLWlmZXEgKGVuZywkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkKLSAgICBQUk9EVUNUX1NZU1RFTV9QUk9QRVJUSUVTICs9IFwKLSAgICAgICAgcG0uZGV4b3B0LmZpcnN0LWJvb3Q/PWV4dHJhY3QgXAotICAgICAgICBwbS5kZXhvcHQuYm9vdC1hZnRlci1vdGE/PWV4dHJhY3QKLWVsc2UKLSAgICBQUk9EVUNUX1NZU1RFTV9QUk9QRVJUSUVTICs9IFwKLSAgICAgICAgcG0uZGV4b3B0LmZpcnN0LWJvb3Q/PXZlcmlmeSBcCi0gICAgICAgIHBtLmRleG9wdC5ib290LWFmdGVyLW90YT89dmVyaWZ5Ci1lbmRpZgotCiAjIFRoZSBpbnN0YWxsIGZpbHRlciBpcyBzcGVlZC1wcm9maWxlIGluIG9yZGVyIHRvIGVuYWJsZSB0aGUgdXNlIG9mCiAjIHByb2ZpbGVzIGZyb20gdGhlIGRleCBtZXRhZGF0YSBmaWxlcy4gTm90ZSB0aGF0IGlmIGEgcHJvZmlsZSBpcyBub3QgcHJvdmlkZWQKICMgb3IgaWYgaXQgaXMgZW1wdHkgc3BlZWQtcHJvZmlsZSBpcyBlcXVpdmFsZW50IHRvIChxdWlja2VuICsgZW1wdHkgYXBwIGltYWdlKS4KICMgTm90ZSB0aGF0IGBjbWRsaW5lYCBpcyBub3Qgc3RyaWN0bHkgbmVlZGVkIGJ1dCBpdCBzaW1wbGlmaWVzIHRoZSBtYW5hZ2VtZW50CiAjIG9mIGNvbXBpbGF0aW9uIHJlYXNvbiBpbiB0aGUgcGxhdGZvcm0gKGFzIHdlIGhhdmUgYSB1bmlmaWVkLCBzaW5nbGUgcGF0aCwKICMgd2l0aG91dCBleGNlcHRpb25zKS4KKyMgVE9ETyhiLzI0MzY0Njg3Nik6IFJlbW92ZSBgcG0uZGV4b3B0LnBvc3QtYm9vdGAuCiBQUk9EVUNUX1NZU1RFTV9QUk9QRVJUSUVTICs9IFwKLSAgICBwbS5kZXhvcHQucG9zdC1ib290Pz1leHRyYWN0IFwKKyAgICBwbS5kZXhvcHQucG9zdC1ib290Pz12ZXJpZnkgXAorICAgIHBtLmRleG9wdC5maXJzdC1ib290Pz12ZXJpZnkgXAorICAgIHBtLmRleG9wdC5ib290LWFmdGVyLW90YT89dmVyaWZ5IFwKICAgICBwbS5kZXhvcHQuYm9vdC1hZnRlci1tYWlubGluZS11cGRhdGU/PXZlcmlmeSBcCiAgICAgcG0uZGV4b3B0Lmluc3RhbGw/PXNwZWVkLXByb2ZpbGUgXAogICAgIHBtLmRleG9wdC5pbnN0YWxsLWZhc3Q/PXNraXAgXAogICAgIHBtLmRleG9wdC5pbnN0YWxsLWJ1bGs/PXNwZWVkLXByb2ZpbGUgXAogICAgIHBtLmRleG9wdC5pbnN0YWxsLWJ1bGstc2Vjb25kYXJ5Pz12ZXJpZnkgXAogICAgIHBtLmRleG9wdC5pbnN0YWxsLWJ1bGstZG93bmdyYWRlZD89dmVyaWZ5IFwKLSAgICBwbS5kZXhvcHQuaW5zdGFsbC1idWxrLXNlY29uZGFyeS1kb3duZ3JhZGVkPz1leHRyYWN0IFwKKyAgICBwbS5kZXhvcHQuaW5zdGFsbC1idWxrLXNlY29uZGFyeS1kb3duZ3JhZGVkPz12ZXJpZnkgXAogICAgIHBtLmRleG9wdC5iZy1kZXhvcHQ/PXNwZWVkLXByb2ZpbGUgXAogICAgIHBtLmRleG9wdC5hYi1vdGE/PXNwZWVkLXByb2ZpbGUgXAogICAgIHBtLmRleG9wdC5pbmFjdGl2ZT89dmVyaWZ5IFwKICAgICBwbS5kZXhvcHQuY21kbGluZT89dmVyaWZ5IFwKICAgICBwbS5kZXhvcHQuc2hhcmVkPz1zcGVlZAogCitpZm5lcSAoLCQoZmlsdGVyIGVuZywkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkpCisgICAgT1ZFUlJJREVfRElTQUJMRV9ERVhPUFRfQUxMID89IHRydWUKK2VuZGlmCisKKyMgT1ZFUlJJREVfRElTQUJMRV9ERVhPUFRfQUxMIGRpc2FibGVzIGFsbCBkZXhwcmVvcHQgKGJ1aWxkLXRpbWUpIGFuZCBkZXhvcHQgKG9uLWRldmljZSkgYWN0aXZpdGllcy4KKyMgVGhpcyBvcHRpb24gaXMgZm9yIGZhc3RlciBpdGVyYXRpb24gZHVyaW5nIGRldmVsb3BtZW50IGFuZCBzaG91bGQgbmV2ZXIgYmUgZW5hYmxlZCBmb3IgcHJvZHVjdGlvbi4KK2lmbmVxICgsJChmaWx0ZXIgdHJ1ZSwkKE9WRVJSSURFX0RJU0FCTEVfREVYT1BUX0FMTCkpKQorICBQUk9EVUNUX1NZU1RFTV9QUk9QRVJUSUVTICs9IFwKKyAgICBkYWx2aWsudm0uZGlzYWJsZS1hcnQtc2VydmljZS1kZXhvcHQ9dHJ1ZSBcCisgICAgZGFsdmlrLnZtLmRpc2FibGUtb2RyZWZyZXNoPXRydWUKKworICAjIERpc2FibGUgYWxsIGRleHByZW9wdCBhY3Rpdml0aWVzIGV4Y2VwdCBmb3IgdGhlIEFSVCBib290IGltYWdlLgorICAjIFdlIGhhdmUgdG8gZGV4cHJlb3B0IHRoZSBBUlQgYm9vdCBpbWFnZSBiZWNhdXNlIHRoZXkgYXJlIHVzZWQgYnkgQVJUIHRlc3RzLiBUaGlzIHNob3VsZCBub3QKKyAgIyBiZSB0b28gbXVjaCBvZiBhIHByb2JsZW0gZm9yIHBsYXRmb3JtIGRldmVsb3BlcnMgYmVjYXVzZSBhIGNoYW5nZSB0byBmcmFtZXdvcmsgY29kZSBzaG91bGQgbm90CisgICMgdHJpZ2dlciBkZXhwcmVvcHQgZm9yIHRoZSBBUlQgYm9vdCBpbWFnZS4KKyAgV0lUSF9ERVhQUkVPUFRfQVJUX0JPT1RfSU1HX09OTFkgOj0gdHJ1ZQorZW5kaWYKKwogIyBFbmFibGUgcmVzb2x1dGlvbiBvZiBzdGFydHVwIGNvbnN0IHN0cmluZ3MuCiBQUk9EVUNUX1NZU1RFTV9QUk9QRVJUSUVTICs9IFwKICAgICBkYWx2aWsudm0uZGV4Mm9hdC1yZXNvbHZlLXN0YXJ0dXAtc3RyaW5ncz10cnVlCkBAIC0xNjYsMTUgKzE3NSwxMSBAQAogICAgIGRhbHZpay52bS51c2FwX3Bvb2xfc2l6ZV9taW4/PTEgXAogICAgIGRhbHZpay52bS51c2FwX3Bvb2xfcmVmaWxsX2RlbGF5X21zPz0zMDAwCiAKLSMgQWxsb3cgZGV4b3B0IGZpbGVzIHRoYXQgYXJlIHNpZGUtZWZmZWN0cyBvZiBhbHJlYWR5IGFsbG93bGlzdGVkIGZpbGVzLgotIyBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IHdoZW4gQVJUIGlzIHByZWJ1aWx0LgotaWZlcSAoZmFsc2UsJChBUlRfTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFKSkKLSAgUFJPRFVDVF9BUlRJRkFDVF9QQVRIX1JFUVVJUkVNRU5UX0FMTE9XRURfTElTVCArPSBcCi0gICAgICBzeXN0ZW0vZnJhbWV3b3JrLyUuYXJ0IFwKLSAgICAgIHN5c3RlbS9mcmFtZXdvcmsvJS5vYXQgXAotICAgICAgc3lzdGVtL2ZyYW1ld29yay8lLm9kZXggXAotICAgICAgc3lzdGVtL2ZyYW1ld29yay8lLnZkZXgKLWVuZGlmCi0KIFBST0RVQ1RfU1lTVEVNX1BST1BFUlRJRVMgKz0gXAotICAgIGRhbHZpay52bS51c2VhcnRzZXJ2aWNlPXRydWUKKyAgICBkYWx2aWsudm0udXNlYXJ0c2VydmljZT10cnVlIFwKKyAgICBkYWx2aWsudm0uZW5hYmxlX3ByX2RleG9wdD10cnVlCisKKyMgQ29weSBwcmVvcHRlZCBmaWxlcyBmcm9tIHN5c3RlbV9iIG9uIGZpcnN0IGJvb3QuCitQUk9EVUNUX1NZU1RFTV9QUk9QRVJUSUVTICs9IHJvLmNwX3N5c3RlbV9vdGhlcl9vZGV4PTEKK1BST0RVQ1RfUEFDS0FHRVMgKz0gXAorICBjcHByZW9wdHMuc2gKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3Nkay5tayBiL3RhcmdldC9wcm9kdWN0L3Nkay5tawppbmRleCBmYTdlMWFkLi4zZDU2YTgwIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9zZGsubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3Qvc2RrLm1rCkBAIC0xNyw4ICsxNywyOSBAQAogIyBUaGlzIGlzIGEgc2ltcGxlIHByb2R1Y3QgdGhhdCB1c2VzIGNvbmZpZ3VyZXMgdGhlIG1pbmltdW0gYW1vdW50CiAjIG5lZWRlZCB0byBidWlsZCB0aGUgU0RLICh3aXRob3V0IHRoZSBlbXVsYXRvcikuCiAKKyMgRW5zdXJlIGFsbCB0cnVuay1zdGFibGUgZmxhZ3MgYXJlIGF2YWlsYWJsZS4KKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvYnVpbGRfdmFyaWFibGVzLm1rKQorCisjIEluIG9yZGVyIHRvIGJ1aWxkIHRoZSBib290Y2xhc3NwYXRoIHNvdXJjZXMsIHRoZSBib290Y2xhc3NwYXRoIG5lZWRzIHRvCisjIGJlIHNldHVwIHZpYSBkZWZhdWx0X2FydF9jb25maWcubWsuIFRoZSBzb3VyY2VzIG9ubHkgcmVhbGx5IG1ha2Ugc2Vuc2UKKyMgdG9nZXRoZXIgd2l0aCBhIGRldmljZSAoZS5nLiB0aGUgZW11bGF0b3IpLiBTbyBpZiB0aGUgU0RLIHNvdXJjZXMgY2hhbmdlCisjIHRvIGJlIGJ1aWx0IHdpdGggdGhlIGRldmljZSwgdGhpcyBjb3VsZCBiZSByZW1vdmVkLgorJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9kZWZhdWx0X2FydF9jb25maWcubWspCisKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvbGFuZ3VhZ2VzX2RlZmF1bHQubWspCiAKIFBST0RVQ1RfTkFNRSA6PSBzZGsKIFBST0RVQ1RfQlJBTkQgOj0gQW5kcm9pZAogUFJPRFVDVF9ERVZJQ0UgOj0gbWFpbmxpbmVfeDg2CisKK1BST0RVQ1RfQlVJTERfRlJPTV9TT1VSQ0VfU1RVQiA6PSB0cnVlCisKKyMgVXNlIHNvdXJjZXMgb2YgbWFpbmxpbmUgbW9kdWxlcworUFJPRFVDVF9NT0RVTEVfQlVJTERfRlJPTV9TT1VSQ0UgOj0gdHJ1ZQorCitpZmVxICgkKFdJVEhPVVRfQ0hFQ0tfQVBJKSx0cnVlKQorICAkKGVycm9yIFdJVEhPVVRfQ0hFQ0tfQVBJIGNhbm5vdCBiZSBzZXQgdG8gdHJ1ZSBmb3IgU0RLIHByb2R1Y3QgYnVpbGRzKQorZW5kaWYKKworIyBJbmNsdWRlIFdlYXIgZmxhZyB2YWx1ZXMgc28gdGhhdCBXZWFyLXJlbGF0ZWQgQVBJcyBhcmUgYnVpbGQgaW4gc2Rrcy4KK1BST0RVQ1RfUkVMRUFTRV9DT05GSUdfTUFQUyArPSAkKHdpbGRjYXJkIHZlbmRvci9nb29nbGVfc2hhcmVkL3dlYXIvcmVsZWFzZS9yZWxlYXNlX2NvbmZpZ19tYXAudGV4dHByb3RvKQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3Qvc2RrX2FybTY0Lm1rIGIvdGFyZ2V0L3Byb2R1Y3Qvc2RrX2FybTY0Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmIzOGY0Li4wMDAwMDAwCi0tLSBhL3RhcmdldC9wcm9kdWN0L3Nka19hcm02NC5taworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgRG9uJ3QgbW9kaWZ5IHRoaXMgZmlsZSAtIEl0J3MganVzdCBhbiBhbGlhcyEKLQotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9zZGtfcGhvbmVfYXJtNjQubWspCi0KLVBST0RVQ1RfTkFNRSA6PSBzZGtfYXJtNjQKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3Nka19waG9uZV9hcm02NC5tayBiL3RhcmdldC9wcm9kdWN0L3Nka19waG9uZV9hcm02NC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4MTYxNS4uMDAwMDAwMAotLS0gYS90YXJnZXQvcHJvZHVjdC9zZGtfcGhvbmVfYXJtNjQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotUFJPRFVDVF9VU0VfRFlOQU1JQ19QQVJUSVRJT05TIDo9IHRydWUKLQotIyBUaGlzIGlzIGEgYnVpbGQgY29uZmlndXJhdGlvbiBmb3IgYSBmdWxsLWZlYXR1cmVkIGJ1aWxkIG9mIHRoZQotIyBPcGVuLVNvdXJjZSBwYXJ0IG9mIHRoZSB0cmVlLiBJdCdzIGdlYXJlZCB0b3dhcmQgYSBVUy1jZW50cmljCi0jIGJ1aWxkIHF1aXRlIHNwZWNpZmljYWxseSBmb3IgdGhlIGVtdWxhdG9yLCBhbmQgbWlnaHQgbm90IGJlCi0jIGVudGlyZWx5IGFwcHJvcHJpYXRlIHRvIGluaGVyaXQgZnJvbSBmb3Igb24tZGV2aWNlIGNvbmZpZ3VyYXRpb25zLgotCi0jIEVuYWJsZSBtYWlubGluZSBjaGVja2luZyBmb3IgZXhhY3QgdGhpcyBwcm9kdWN0IG5hbWUKLWlmZXEgKHNka19waG9uZV9hcm02NCwkKFRBUkdFVF9QUk9EVUNUKSkKLVBST0RVQ1RfRU5GT1JDRV9BUlRJRkFDVF9QQVRIX1JFUVVJUkVNRU5UUyA6PSByZWxheGVkCi1lbmRpZgotCi0jCi0jIEFsbCBjb21wb25lbnRzIGluaGVyaXRlZCBoZXJlIGdvIHRvIHN5c3RlbSBpbWFnZQotIwotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9jb3JlXzY0X2JpdC5taykKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvZ2VuZXJpY19zeXN0ZW0ubWspCi0KLSMKLSMgQWxsIGNvbXBvbmVudHMgaW5oZXJpdGVkIGhlcmUgZ28gdG8gc3lzdGVtX2V4dCBpbWFnZQotIwotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9oYW5kaGVsZF9zeXN0ZW1fZXh0Lm1rKQotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC90ZWxlcGhvbnlfc3lzdGVtX2V4dC5taykKLQotIwotIyBBbGwgY29tcG9uZW50cyBpbmhlcml0ZWQgaGVyZSBnbyB0byBwcm9kdWN0IGltYWdlCi0jCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2Fvc3BfcHJvZHVjdC5taykKLQotIwotIyBBbGwgY29tcG9uZW50cyBpbmhlcml0ZWQgaGVyZSBnbyB0byB2ZW5kb3Igb3IgdmVuZG9yX2Jvb3QgaW1hZ2UKLSMKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QtaWYtZXhpc3RzLCBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9hcm02NC12ZW5kb3IubWspCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2VtdWxhdG9yX3ZlbmRvci5taykKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL2JvYXJkL2VtdWxhdG9yX2FybTY0L2RldmljZS5taykKLQotIyBrZWVwIHRoaXMgYXBrIGZvciBzZGsgdGFyZ2V0cyBmb3Igbm93Ci1QUk9EVUNUX1BBQ0tBR0VTICs9IFwKLSAgICBFbXVsYXRvclNtb2tlVGVzdHMKLQotIyBPdmVycmlkZXMKLVBST0RVQ1RfQlJBTkQgOj0gQW5kcm9pZAotUFJPRFVDVF9OQU1FIDo9IHNka19waG9uZV9hcm02NAotUFJPRFVDVF9ERVZJQ0UgOj0gZW11bGF0b3JfYXJtNjQKLVBST0RVQ1RfTU9ERUwgOj0gQW5kcm9pZCBTREsgYnVpbHQgZm9yIGFybTY0Ci0jIERpc2FibGUgPHVzZXMtbGlicmFyeT4gY2hlY2tzIGZvciBTREsgcHJvZHVjdC4gSXQgbGFja3Mgc29tZSBsaWJyYXJpZXMgKGUuZy4KLSMgUmFkaW9Db25maWdMaWIpLCB3aGljaCBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHRyYW5zbGF0ZSB0aGVpciBtb2R1bGUgbmFtZXMgdG8KLSMgbGlicmFyeSBuYW1lLCBzbyB0aGUgY2hlY2sgZmFpbHMuCi1QUk9EVUNUX0JST0tFTl9WRVJJRllfVVNFU19MSUJSQVJJRVMgOj0gdHJ1ZQotCi0KZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3Nka19waG9uZV9hcm12Ny5tayBiL3RhcmdldC9wcm9kdWN0L3Nka19waG9uZV9hcm12Ny5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhMGUzYi4uMDAwMDAwMAotLS0gYS90YXJnZXQvcHJvZHVjdC9zZGtfcGhvbmVfYXJtdjcubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotUFJPRFVDVF9VU0VfRFlOQU1JQ19QQVJUSVRJT05TIDo9IHRydWUKLQotIyBUaGlzIGlzIGEgYnVpbGQgY29uZmlndXJhdGlvbiBmb3IgYSBmdWxsLWZlYXR1cmVkIGJ1aWxkIG9mIHRoZQotIyBPcGVuLVNvdXJjZSBwYXJ0IG9mIHRoZSB0cmVlLiBJdCdzIGdlYXJlZCB0b3dhcmQgYSBVUy1jZW50cmljCi0jIGJ1aWxkIHF1aXRlIHNwZWNpZmljYWxseSBmb3IgdGhlIGVtdWxhdG9yLCBhbmQgbWlnaHQgbm90IGJlCi0jIGVudGlyZWx5IGFwcHJvcHJpYXRlIHRvIGluaGVyaXQgZnJvbSBmb3Igb24tZGV2aWNlIGNvbmZpZ3VyYXRpb25zLgotCi0jIEVuYWJsZSBtYWlubGluZSBjaGVja2luZyBmb3IgZXhhY3QgdGhpcyBwcm9kdWN0IG5hbWUKLWlmZXEgKHNka19waG9uZV9hcm12NywkKFRBUkdFVF9QUk9EVUNUKSkKLVBST0RVQ1RfRU5GT1JDRV9BUlRJRkFDVF9QQVRIX1JFUVVJUkVNRU5UUyA6PSByZWxheGVkCi1lbmRpZgotCi0jCi0jIEFsbCBjb21wb25lbnRzIGluaGVyaXRlZCBoZXJlIGdvIHRvIHN5c3RlbSBpbWFnZQotIwotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9nZW5lcmljX3N5c3RlbS5taykKLQotIwotIyBBbGwgY29tcG9uZW50cyBpbmhlcml0ZWQgaGVyZSBnbyB0byBzeXN0ZW1fZXh0IGltYWdlCi0jCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2hhbmRoZWxkX3N5c3RlbV9leHQubWspCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L3RlbGVwaG9ueV9zeXN0ZW1fZXh0Lm1rKQotCi0jCi0jIEFsbCBjb21wb25lbnRzIGluaGVyaXRlZCBoZXJlIGdvIHRvIHByb2R1Y3QgaW1hZ2UKLSMKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvYW9zcF9wcm9kdWN0Lm1rKQotCi0jCi0jIEFsbCBjb21wb25lbnRzIGluaGVyaXRlZCBoZXJlIGdvIHRvIHZlbmRvciBpbWFnZQotIwotJChjYWxsIGluaGVyaXQtcHJvZHVjdC1pZi1leGlzdHMsIGJ1aWxkL21ha2UvdGFyZ2V0L3Byb2R1Y3QvcmFtZGlza19zdHViLm1rKQotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9lbXVsYXRvcl92ZW5kb3IubWspCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9ib2FyZC9lbXVsYXRvcl9hcm0vZGV2aWNlLm1rKQotCi0jIGtlZXAgdGhpcyBhcGsgZm9yIHNkayB0YXJnZXRzIGZvciBub3cKLVBST0RVQ1RfUEFDS0FHRVMgKz0gXAotICAgIEVtdWxhdG9yU21va2VUZXN0cwotCi0KLSMgT3ZlcnJpZGVzCi1QUk9EVUNUX0JSQU5EIDo9IEFuZHJvaWQKLVBST0RVQ1RfTkFNRSA6PSBzZGtfcGhvbmVfYXJtdjcKLVBST0RVQ1RfREVWSUNFIDo9IGVtdWxhdG9yX2FybQotUFJPRFVDVF9NT0RFTCA6PSBBbmRyb2lkIFNESyBidWlsdCBmb3IgYXJtCi0jIERpc2FibGUgPHVzZXMtbGlicmFyeT4gY2hlY2tzIGZvciBTREsgcHJvZHVjdC4gSXQgbGFja3Mgc29tZSBsaWJyYXJpZXMgKGUuZy4KLSMgUmFkaW9Db25maWdMaWIpLCB3aGljaCBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHRyYW5zbGF0ZSB0aGVpciBtb2R1bGUgbmFtZXMgdG8KLSMgbGlicmFyeSBuYW1lLCBzbyB0aGUgY2hlY2sgZmFpbHMuCi1QUk9EVUNUX0JST0tFTl9WRVJJRllfVVNFU19MSUJSQVJJRVMgOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3Bob25lX3g4Ni5tayBiL3RhcmdldC9wcm9kdWN0L3Nka19waG9uZV94ODYubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmOGI1MDguLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3Bob25lX3g4Ni5taworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi1QUk9EVUNUX1VTRV9EWU5BTUlDX1BBUlRJVElPTlMgOj0gdHJ1ZQotCi0jIFRoaXMgaXMgYSBidWlsZCBjb25maWd1cmF0aW9uIGZvciBhIGZ1bGwtZmVhdHVyZWQgYnVpbGQgb2YgdGhlCi0jIE9wZW4tU291cmNlIHBhcnQgb2YgdGhlIHRyZWUuIEl0J3MgZ2VhcmVkIHRvd2FyZCBhIFVTLWNlbnRyaWMKLSMgYnVpbGQgcXVpdGUgc3BlY2lmaWNhbGx5IGZvciB0aGUgZW11bGF0b3IsIGFuZCBtaWdodCBub3QgYmUKLSMgZW50aXJlbHkgYXBwcm9wcmlhdGUgdG8gaW5oZXJpdCBmcm9tIGZvciBvbi1kZXZpY2UgY29uZmlndXJhdGlvbnMuCi0KLSMKLSMgQWxsIGNvbXBvbmVudHMgaW5oZXJpdGVkIGhlcmUgZ28gdG8gc3lzdGVtIGltYWdlCi0jCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2dlbmVyaWNfc3lzdGVtLm1rKQotCi0jIEVuYWJsZSBtYWlubGluZSBjaGVja2luZyBmb3IgZXhhY3QgdGhpcyBwcm9kdWN0IG5hbWUKLWlmZXEgKHNka19waG9uZV94ODYsJChUQVJHRVRfUFJPRFVDVCkpCi1QUk9EVUNUX0VORk9SQ0VfQVJUSUZBQ1RfUEFUSF9SRVFVSVJFTUVOVFMgOj0gcmVsYXhlZAotZW5kaWYKLQotIwotIyBBbGwgY29tcG9uZW50cyBpbmhlcml0ZWQgaGVyZSBnbyB0byBzeXN0ZW1fZXh0IGltYWdlCi0jCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2hhbmRoZWxkX3N5c3RlbV9leHQubWspCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L3RlbGVwaG9ueV9zeXN0ZW1fZXh0Lm1rKQotCi0jCi0jIEFsbCBjb21wb25lbnRzIGluaGVyaXRlZCBoZXJlIGdvIHRvIHByb2R1Y3QgaW1hZ2UKLSMKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvYW9zcF9wcm9kdWN0Lm1rKQotCi0jCi0jIEFsbCBjb21wb25lbnRzIGluaGVyaXRlZCBoZXJlIGdvIHRvIHZlbmRvciBpbWFnZQotIwotJChjYWxsIGluaGVyaXQtcHJvZHVjdC1pZi1leGlzdHMsIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL3g4Ni12ZW5kb3IubWspCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2VtdWxhdG9yX3ZlbmRvci5taykKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL2JvYXJkL2VtdWxhdG9yX3g4Ni9kZXZpY2UubWspCi0KLSMgT3ZlcnJpZGVzCi1QUk9EVUNUX0JSQU5EIDo9IEFuZHJvaWQKLVBST0RVQ1RfTkFNRSA6PSBzZGtfcGhvbmVfeDg2Ci1QUk9EVUNUX0RFVklDRSA6PSBlbXVsYXRvcl94ODYKLVBST0RVQ1RfTU9ERUwgOj0gQW5kcm9pZCBTREsgYnVpbHQgZm9yIHg4NgotIyBEaXNhYmxlIDx1c2VzLWxpYnJhcnk+IGNoZWNrcyBmb3IgU0RLIHByb2R1Y3QuIEl0IGxhY2tzIHNvbWUgbGlicmFyaWVzIChlLmcuCi0jIFJhZGlvQ29uZmlnTGliKSwgd2hpY2ggbWFrZXMgaXQgaW1wb3NzaWJsZSB0byB0cmFuc2xhdGUgdGhlaXIgbW9kdWxlIG5hbWVzIHRvCi0jIGxpYnJhcnkgbmFtZSwgc28gdGhlIGNoZWNrIGZhaWxzLgotUFJPRFVDVF9CUk9LRU5fVkVSSUZZX1VTRVNfTElCUkFSSUVTIDo9IHRydWUKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3Nka19waG9uZV94ODZfNjQubWsgYi90YXJnZXQvcHJvZHVjdC9zZGtfcGhvbmVfeDg2XzY0Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWQ5MDI4Li4wMDAwMDAwCi0tLSBhL3RhcmdldC9wcm9kdWN0L3Nka19waG9uZV94ODZfNjQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotUFJPRFVDVF9VU0VfRFlOQU1JQ19QQVJUSVRJT05TIDo9IHRydWUKLQotIyBUaGlzIGlzIGEgYnVpbGQgY29uZmlndXJhdGlvbiBmb3IgYSBmdWxsLWZlYXR1cmVkIGJ1aWxkIG9mIHRoZQotIyBPcGVuLVNvdXJjZSBwYXJ0IG9mIHRoZSB0cmVlLiBJdCdzIGdlYXJlZCB0b3dhcmQgYSBVUy1jZW50cmljCi0jIGJ1aWxkIHF1aXRlIHNwZWNpZmljYWxseSBmb3IgdGhlIGVtdWxhdG9yLCBhbmQgbWlnaHQgbm90IGJlCi0jIGVudGlyZWx5IGFwcHJvcHJpYXRlIHRvIGluaGVyaXQgZnJvbSBmb3Igb24tZGV2aWNlIGNvbmZpZ3VyYXRpb25zLgotCi0jCi0jIEFsbCBjb21wb25lbnRzIGluaGVyaXRlZCBoZXJlIGdvIHRvIHN5c3RlbSBpbWFnZQotIwotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9jb3JlXzY0X2JpdC5taykKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvZ2VuZXJpY19zeXN0ZW0ubWspCi0KLSMgRW5hYmxlIG1haW5saW5lIGNoZWNraW5nIGZvciBleGFjdCB0aGlzIHByb2R1Y3QgbmFtZQotaWZlcSAoc2RrX3Bob25lX3g4Nl82NCwkKFRBUkdFVF9QUk9EVUNUKSkKLVBST0RVQ1RfRU5GT1JDRV9BUlRJRkFDVF9QQVRIX1JFUVVJUkVNRU5UUyA6PSByZWxheGVkCi1lbmRpZgotCi0jCi0jIEFsbCBjb21wb25lbnRzIGluaGVyaXRlZCBoZXJlIGdvIHRvIHN5c3RlbV9leHQgaW1hZ2UKLSMKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvaGFuZGhlbGRfc3lzdGVtX2V4dC5taykKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvdGVsZXBob255X3N5c3RlbV9leHQubWspCi0KLSMKLSMgQWxsIGNvbXBvbmVudHMgaW5oZXJpdGVkIGhlcmUgZ28gdG8gcHJvZHVjdCBpbWFnZQotIwotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9hb3NwX3Byb2R1Y3QubWspCi0KLSMKLSMgQWxsIGNvbXBvbmVudHMgaW5oZXJpdGVkIGhlcmUgZ28gdG8gdmVuZG9yIGltYWdlCi0jCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LWlmLWV4aXN0cywgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gveDg2XzY0LXZlbmRvci5taykKLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvZW11bGF0b3JfdmVuZG9yLm1rKQotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvYm9hcmQvZW11bGF0b3JfeDg2XzY0L2RldmljZS5taykKLQotIyBPdmVycmlkZXMKLVBST0RVQ1RfQlJBTkQgOj0gQW5kcm9pZAotUFJPRFVDVF9OQU1FIDo9IHNka19waG9uZV94ODZfNjQKLVBST0RVQ1RfREVWSUNFIDo9IGVtdWxhdG9yX3g4Nl82NAotUFJPRFVDVF9NT0RFTCA6PSBBbmRyb2lkIFNESyBidWlsdCBmb3IgeDg2XzY0Ci0jIERpc2FibGUgPHVzZXMtbGlicmFyeT4gY2hlY2tzIGZvciBTREsgcHJvZHVjdC4gSXQgbGFja3Mgc29tZSBsaWJyYXJpZXMgKGUuZy4KLSMgUmFkaW9Db25maWdMaWIpLCB3aGljaCBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHRyYW5zbGF0ZSB0aGVpciBtb2R1bGUgbmFtZXMgdG8KLSMgbGlicmFyeSBuYW1lLCBzbyB0aGUgY2hlY2sgZmFpbHMuCi1QUk9EVUNUX0JST0tFTl9WRVJJRllfVVNFU19MSUJSQVJJRVMgOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3g4Nl82NC5tayBiL3RhcmdldC9wcm9kdWN0L3Nka193aXRoX3J1bnRpbWVfYXBpcy5tawpzaW1pbGFyaXR5IGluZGV4IDcwJQpjb3B5IGZyb20gdGFyZ2V0L3Byb2R1Y3Qvc2RrX3g4Nl82NC5tawpjb3B5IHRvIHRhcmdldC9wcm9kdWN0L3Nka193aXRoX3J1bnRpbWVfYXBpcy5tawppbmRleCA1ZjY1NTNlLi5lODBiNGZiIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9zZGtfeDg2XzY0Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L3Nka193aXRoX3J1bnRpbWVfYXBpcy5tawpAQCAtMSw1ICsxLDUgQEAKICMKLSMgQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMgQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICMKICMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDggKzE0LDkgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLSMgRG9uJ3QgbW9kaWZ5IHRoaXMgZmlsZSAtIEl0J3MganVzdCBhbiBhbGlhcyEKKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3Qvc2RrLm1rKQogCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L3Nka19waG9uZV94ODZfNjQubWspCitQUk9EVUNUX05BTUUgOj0gc2RrX3dpdGhfcnVudGltZV9hcGlzCiAKLVBST0RVQ1RfTkFNRSA6PSBzZGtfeDg2XzY0CitQUk9EVUNUX0hJRERFTl9BUElfRVhQT1JUQUJMRV9TVFVCUyA6PSB0cnVlCitQUk9EVUNUX0VYUE9SVF9SVU5USU1FX0FQSVMgOj0gdHJ1ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L0FuZHJvaWQuYnAgYi90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9BbmRyb2lkLmJwCmluZGV4IDFlMjZkNTkuLjIxNGMwMDkgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L0FuZHJvaWQuYnAKKysrIGIvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvQW5kcm9pZC5icApAQCAtMjUsMyArMjUsMjYgQEAKICAgICBzdWJfZGlyOiAic2VjdXJpdHkvZnN2ZXJpdHkiLAogICAgIGZpbGVuYW1lX2Zyb21fc3JjOiB0cnVlLAogfQorCisvLyBvdGFjZXJ0czogQSBrZXlzdG9yZSB3aXRoIHRoZSBhdXRob3JpemVkIGtleXMgaW4gaXQsIHdoaWNoIGlzIHVzZWQgdG8gdmVyaWZ5CisvLyB0aGUgYXV0aGVudGljaXR5IG9mIGRvd25sb2FkZWQgT1RBIHBhY2thZ2VzLgorLy8gVGhpcyBtb2R1bGUgemlwcyBmaWxlcyBkZWZpbmVkIGluIFBST0RVQ1RfREVGQVVMVF9ERVZfQ0VSVElGSUNBVEUgYW5kCisvLyBQUk9EVUNUX0VYVFJBX09UQV9LRVlTIGZvciBzeXN0ZW0gb3IgUFJPRFVDVF9FWFRSQV9SRUNPVkVSWV9LRVlTIGZvciByZWNvdmVyeQorLy8gaW1hZ2UKK290YWNlcnRzX3ppcCB7CisgICAgbmFtZTogIm90YWNlcnRzIiwKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJzZWN1cml0eSIsCisgICAgZmlsZW5hbWU6ICJvdGFjZXJ0cy56aXAiLAorfQorCitvdGFjZXJ0c196aXAgeworICAgIG5hbWU6ICJvdGFjZXJ0cy5yZWNvdmVyeSIsCisgICAgcmVjb3Zlcnk6IHRydWUsCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAic2VjdXJpdHkiLAorICAgIGZpbGVuYW1lOiAib3RhY2VydHMuemlwIiwKK30KKworYWRiX2tleXMgeworICAgIG5hbWU6ICJhZGJfa2V5cyIsCisgICAgcHJvZHVjdF9zcGVjaWZpYzogdHJ1ZSwKK30KZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L0FuZHJvaWQubWsgYi90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmQ4ZWZjLi4wMDAwMDAwCi0tLSBhL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFkYiBrZXksIGlmIGNvbmZpZ3VyZWQgdmlhIFBST0RVQ1RfQURCX0tFWVMKLWlmZGVmIFBST0RVQ1RfQURCX0tFWVMKLSAgaWZuZXEgKCQoZmlsdGVyIGVuZyB1c2VyZGVidWcsJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpLCkKLSAgICBpbmNsdWRlICQoQ0xFQVJfVkFSUykKLSAgICBMT0NBTF9NT0RVTEUgOj0gYWRiX2tleXMKLSAgICBMT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBMT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi0gICAgTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotICAgIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLSAgICBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9ST09UX09VVCkKLSAgICBMT0NBTF9QUkVCVUlMVF9NT0RVTEVfRklMRSA6PSAkKFBST0RVQ1RfQURCX0tFWVMpCi0gICAgaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQotICBlbmRpZgotZW5kaWYKLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgb3RhY2VydHM6IEEga2V5c3RvcmUgd2l0aCB0aGUgYXV0aG9yaXplZCBrZXlzIGluIGl0LCB3aGljaCBpcyB1c2VkIHRvIHZlcmlmeSB0aGUgYXV0aGVudGljaXR5IG9mCi0jIGRvd25sb2FkZWQgT1RBIHBhY2thZ2VzLgotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBvdGFjZXJ0cwotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9NT0RVTEVfU1RFTSA6PSBvdGFjZXJ0cy56aXAKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9FVEMpL3NlY3VyaXR5Ci1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCi0KLWV4dHJhX290YV9rZXlzIDo9ICQoYWRkc3VmZml4IC54NTA5LnBlbSwkKFBST0RVQ1RfRVhUUkFfT1RBX0tFWVMpKQotCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQ0VSVCA6PSAkKERFRkFVTFRfU1lTVEVNX0RFVl9DRVJUSUZJQ0FURSkueDUwOS5wZW0KLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9FWFRSQV9PVEFfS0VZUyA6PSAkKGV4dHJhX290YV9rZXlzKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBcCi0JICAgICQoU09PTkdfWklQKSBcCi0JICAgICQoREVGQVVMVF9TWVNURU1fREVWX0NFUlRJRklDQVRFKS54NTA5LnBlbSBcCi0JICAgICQoZXh0cmFfb3RhX2tleXMpCi0JJChTT09OR19aSVApIC1vICRAIC1qIC1zeW1saW5rcz1mYWxzZSBcCi0JICAgICQoYWRkcHJlZml4IC1mICwkKFBSSVZBVEVfQ0VSVCkgJChQUklWQVRFX0VYVFJBX09UQV9LRVlTKSkKLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgb3RhY2VydHMgZm9yIHJlY292ZXJ5IGltYWdlLgotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBvdGFjZXJ0cy5yZWNvdmVyeQotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9NT0RVTEVfU1RFTSA6PSBvdGFjZXJ0cy56aXAKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX1JFQ09WRVJZX1JPT1RfT1VUKS9zeXN0ZW0vZXRjL3NlY3VyaXR5Ci1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCi0KLWV4dHJhX3JlY292ZXJ5X2tleXMgOj0gJChhZGRzdWZmaXggLng1MDkucGVtLCQoUFJPRFVDVF9FWFRSQV9SRUNPVkVSWV9LRVlTKSkKLQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0NFUlQgOj0gJChERUZBVUxUX1NZU1RFTV9ERVZfQ0VSVElGSUNBVEUpLng1MDkucGVtCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfRVhUUkFfUkVDT1ZFUllfS0VZUyA6PSAkKGV4dHJhX3JlY292ZXJ5X2tleXMpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFwKLQkgICAgJChTT09OR19aSVApIFwKLQkgICAgJChERUZBVUxUX1NZU1RFTV9ERVZfQ0VSVElGSUNBVEUpLng1MDkucGVtIFwKLQkgICAgJChleHRyYV9yZWNvdmVyeV9rZXlzKQotCSQoU09PTkdfWklQKSAtbyAkQCAtaiAtc3ltbGlua3M9ZmFsc2UgXAotCSAgICAkKGFkZHByZWZpeCAtZiAsJChQUklWQVRFX0NFUlQpICQoUFJJVkFURV9FWFRSQV9SRUNPVkVSWV9LRVlTKSkKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L0JVSUxELmJhemVsIGIvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvQlVJTEQuYmF6ZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMmJlNzkuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvQlVJTEQuYmF6ZWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWZpbGVncm91cCgKLSAgICBuYW1lID0gImFuZHJvaWRfY2VydGlmaWNhdGVfZGlyZWN0b3J5IiwKLSAgICBzcmNzID0gZ2xvYihbCi0gICAgICAgICIqLnBrOCIsCi0gICAgICAgICIqLnBlbSIsCi0gICAgXSksCi0gICAgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAotKQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvUkVBRE1FIGIvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvUkVBRE1FCmluZGV4IDJiMTYxYmIuLjFlMDE1ZjAgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L1JFQURNRQorKysgYi90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9SRUFETUUKQEAgLTM3LDMgKzM3LDMxIEBACiAKIFRoaXMgaXMgY2FsbGVkIGJ5IGJ1aWxkL21ha2UvY29yZS9NYWtlZmlsZSB0byBpbmNvcnBvcmF0ZSB0aGUgT1RBIHNpZ25pbmcga2V5cwogaW50byB0aGUgcmVjb3ZlcnkgaW1hZ2UuCisKK2NvbnZlcnRpbmcgdG8gamF2YSBrZXlzdG9yZSBmb3IgQW5kcm9pZCBTdHVkaW8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU3VwcG9zZSB3ZSB3YW50IHRvIGNvbnZlcnQgc2hhcmVkLnBrOCBhbmQgc2hhcmVkLng1MDkucGVtIHRvIHNoYXJlZC5rZXlzdG9yZS4KKworICQgb3BlbnNzbCBwa2NzOCAtaW5mb3JtIERFUiAtbm9jcnlwdCAgICAgICAgICAgICAgICAgICAgICBcCisgICAtaW4gYnVpbGQvbWFrZS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9zaGFyZWQucGs4ICAgICAgIFwKKyAgIC1vdXQgc2hhcmVkLnBlbQorICQgb3BlbnNzbCBwa2NzMTIgLWV4cG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAtaW4gYnVpbGQvbWFrZS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9zaGFyZWQueDUwOS5wZW0gIFwKKyAgIC1pbmtleSBzaGFyZWQucGVtIC1vdXQgc2hhcmVkLnAxMiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgLXBhc3N3b3JkIHBhc3M6YW5kcm9pZCAtbmFtZSBBbmRyb2lkRGVidWdLZXkKKyAkIGtleXRvb2wgLWltcG9ydGtleXN0b3JlIC1kZXN0c3RvcmVwYXNzIGFuZHJvaWQgICAgICAgICAgXAorICAgLWRlc3RrZXlzdG9yZSBzaGFyZWQua2V5c3RvcmUgLXNyY2tleXN0b3JlIHNoYXJlZC5wMTIgICBcCisgICAtc3Jjc3RvcmV0eXBlIFBLQ1MxMiAtc3Jjc3RvcmVwYXNzIGFuZHJvaWQKKworVGhlIGtleXN0b3JlIGNhbiBiZSB1c2VkIGluIGJ1aWxkLmdyYWRsZSBhcyBmb2xsb3dzLgorCitzaWduaW5nQ29uZmlncyB7CisgICAgc2hhcmVkIHsKKyAgICAgICAgc3RvcmVGaWxlIGZpbGUoInNoYXJlZC5rZXlzdG9yZSIpCisgICAgICAgIHN0b3JlUGFzc3dvcmQgImFuZHJvaWQiCisgICAgICAgIGtleVBhc3N3b3JkICJhbmRyb2lkIgorICAgICAgICBrZXlBbGlhcyAiQW5kcm9pZERlYnVnS2V5IgorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvbmZjLnBrOCBiL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L25mYy5wazgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE1ZTFiNwotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L25mYy5wazgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvbmZjLng1MDkucGVtIGIvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvbmZjLng1MDkucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YmZmNmEKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9uZmMueDUwOS5wZW0KQEAgLTAsMCArMSwyOSBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tDQorTUlJRjJEQ0NBOENnQXdJQkFnSVVDOTRxMzQ4aEZhUG0yam93M1I4NFpqTkZjM0V3RFFZSktvWklodmNOQVFFTEJRQXdmREVMTUFrRw0KK0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVTF2ZFc1MFlXbHVJRlpwWlhjeEZEQVMNCitCZ05WQkFvVEMwZHZiMmRzWlNCSmJtTXVNUkF3RGdZRFZRUUxFd2RCYm1SeWIybGtNUmd3RmdZRFZRUUREQTlqYjIxZllXNWtjbTlwDQorWkY5dVptTXdJQmNOTWpNeE1UQXhNakV6TnpFMVdoZ1BNakExTXpFeE1ERXlNVE0zTVRWYU1Id3hDekFKQmdOVkJBWVRBbFZUTVJNdw0KK0VRWURWUVFJRXdwRFlXeHBabTl5Ym1saE1SWXdGQVlEVlFRSEV3MU5iM1Z1ZEdGcGJpQldhV1YzTVJRd0VnWURWUVFLRXd0SGIyOW4NCitiR1VnU1c1akxqRVFNQTRHQTFVRUN4TUhRVzVrY205cFpERVlNQllHQTFVRUF3d1BZMjl0WDJGdVpISnZhV1JmYm1aak1JSUNJakFODQorQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBcnBnd0t5TERsOE0zS1JiMUZ4czNQMm1udDgxc0IzdUdaczQ0UjZDNg0KK0N3RmhpaUFDT21FUUJjbTc5QlVLQk1yRTlkVWJ5T0wvR0tsdU56RDAyNlVzREUrTjJ3RFE4c2lUeGFsakRBd2haQnB1cmhPdTR1SDgNCitCS0pPem9jekFsSkZNSHBGSU1DS1FYd290TWpUOTNCdWhsU28wMjRRNVFEZDJqN0dhamsyMVRra3lRTmxCT2l5RXBLa3JSUEJ1QXJ3DQorMmtucWh1WCtuTFlrSjVyb0FOYUpWRHNpS01ERy9tS25qd0FuZHJnVmJCaUthT2RmdVJkK3BKbGVOM0xVa0FmWUhIQnFsT0puUEdTSQ0KK2pmWUsrOVRqc0lFWVZFT2I0U01JM0NiV3dIZk9kRUlCZ3ozSVBxTXRhbUVuYlpITmxmVldVUlROR0FGMmNvK0RGM1RER0RFanJhSzQNCitSNXBYRGsvVys0RXg3N3dRUENJVCtkOTgxemtiVHBnc1BYdlptc0J6Q1lNdzZ0WWtzUGo4NmZTVkpVckpobGliRGs0WUhWRnNGN09LDQorYXJOZjA0NHlQaForV1VJRHFXSjZHQjBHVThMV0diYmU4aWFQMHJvOVExRFlnWWM2YnVZV0ljWDgxWFpPK2hIZ1d0VWIyck5xSVVzcA0KKy80RG1UMXZnejdUaU1XY1k3cGpySGxOSHRWZjRqQytPVTJjK3A4dTRYVUdReGRJS0dnWlNvSGxkdEFjbndxR3VJcGF0OWxTK2d0VmwNCit2SlVwOHczWjJndjRxL2JCVlozTk5hc0ExZDNIWFZRVVdpd3N6Y2ppVnZvU1JhL0FsTVZVR3VyZUdSYnNpS3N5SGlzWXA5cnhrMURCDQorZFBTOWg3dE1zLzVyVjZSTTJuWmZkZlFyNzF6WDlpZVNvejBDQXdFQUFhTlFNRTR3REFZRFZSMFRCQVV3QXdFQi96QWRCZ05WSFE0RQ0KK0ZnUVU5djlTTDBRSVU5ZnE3YUI3MC9qcVZCTG1aSlV3SHdZRFZSMGpCQmd3Rm9BVTl2OVNMMFFJVTlmcTdhQjcwL2pxVkJMbVpKVXcNCitEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUJBRXh0Mi9ORnQrMkloQzUrL2NnaThoenZ3WktReW1sMU1ROXBqcmtmUXkwSkd6R1RPUERyDQorK05QdVQ1amgvU09mR3pkQnNHVnMzaHZLN2hGdlhzRkVXd1ZRYURPa0toY3J1a3MrZzdGeGxkaFhDMno5aUtnak5yT2VVWG9FN1NpRQ0KK3pYQS9wMUtpQmNSTDNNU01iZy9pUWpRVnhsSmt5NEJEbzM5U29FZ0RlTDkraTdMNGNCd1pRMkxCQkxQSU9kRTdHL2NHMVE2VUUrS04NCisvbW56MGtrMytGSWcwcTRzelhEeEgrbzJWNFpZSFNPeThQNlRCVzhnRVE3MVJHT25oMHd0YVRJeDJSRC96cUpBaStCeldNTHNDNjM2DQorVE5NbXFLYXNzRzRNSDQ0NXVsMncwWnpPQ2xKNGdrbDFlN2R0SzcvS2VzNGtjTE9JL2k0SkhMT2N5ZEVxdW0rdDhnUXRNWXlHTTFLdg0KK21WcEMzaEV2MnBZd0ZmaGc4aGczMU1salptTEQ3NjFrTE9MZnc5OE4zNTBoNmROZFEwamNpLzNycWJialZpblZRb1FTVkV6SmNBOVENCitnUWhSTEtIaU83b1JtaHQ2aWxSTEZ0R1pkL1B3SU1XTU5xa3NUZlZNNWZyTUlJWlhkZmV3K2VmSElKN1grWmdKdTN0R1djYkZZRnRlDQorSy9CYm1QTG5wM2FBR2cvd3dVMWRxd0NBTmY1M29VYzRaenFSbTllb3ZsVnNyRmlSTS9ER3QyL3Q0dWpvclU2VXd3dDIrbjA1UVU3Yg0KKzdQWGhjN2JUUDZhZFVXTU5NeFNOSVBvNndIbXNUYjJwQ2crSzVMdU5NRkp6WGNvSTN1Qlc5UXU0TS90TFJ2NGtSS1p6cGhxVWJYK2UNCisvNWhXMm15dzJCdmJkd1dGcno2WEJna3oNCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tDQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3Qvc3lzY29uZmlnL3ByZWluc3RhbGxlZC1wYWNrYWdlcy1wbGF0Zm9ybS1hb3NwLXByb2R1Y3QueG1sIGIvdGFyZ2V0L3Byb2R1Y3Qvc3lzY29uZmlnL3ByZWluc3RhbGxlZC1wYWNrYWdlcy1wbGF0Zm9ybS1hb3NwLXByb2R1Y3QueG1sCmluZGV4IDEyOTVlMWMuLmQzZTI4MDggMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3N5c2NvbmZpZy9wcmVpbnN0YWxsZWQtcGFja2FnZXMtcGxhdGZvcm0tYW9zcC1wcm9kdWN0LnhtbAorKysgYi90YXJnZXQvcHJvZHVjdC9zeXNjb25maWcvcHJlaW5zdGFsbGVkLXBhY2thZ2VzLXBsYXRmb3JtLWFvc3AtcHJvZHVjdC54bWwKQEAgLTI3LDUgKzI3LDYgQEAKICAgICAgICAgPGluc3RhbGwtaW4gdXNlci10eXBlPSJGVUxMIiAvPgogICAgICAgICA8aW5zdGFsbC1pbiB1c2VyLXR5cGU9IlBST0ZJTEUiIC8+CiAgICAgICAgIDxkby1ub3QtaW5zdGFsbC1pbiB1c2VyLXR5cGU9ImFuZHJvaWQub3MudXNlcnR5cGUucHJvZmlsZS5DTE9ORSIgLz4KKyAgICAgICAgPGRvLW5vdC1pbnN0YWxsLWluIHVzZXItdHlwZT0iYW5kcm9pZC5vcy51c2VydHlwZS5wcm9maWxlLlBSSVZBVEUiIC8+CiAgICAgPC9pbnN0YWxsLWluLXVzZXItdHlwZT4KIDwvY29uZmlnPgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3Qvc3lzY29uZmlnL3ByZWluc3RhbGxlZC1wYWNrYWdlcy1wbGF0Zm9ybS1nZW5lcmljLXN5c3RlbS54bWwgYi90YXJnZXQvcHJvZHVjdC9zeXNjb25maWcvcHJlaW5zdGFsbGVkLXBhY2thZ2VzLXBsYXRmb3JtLWdlbmVyaWMtc3lzdGVtLnhtbAppbmRleCBlMjQ4MmUxLi5lZjgwNTZmIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9zeXNjb25maWcvcHJlaW5zdGFsbGVkLXBhY2thZ2VzLXBsYXRmb3JtLWdlbmVyaWMtc3lzdGVtLnhtbAorKysgYi90YXJnZXQvcHJvZHVjdC9zeXNjb25maWcvcHJlaW5zdGFsbGVkLXBhY2thZ2VzLXBsYXRmb3JtLWdlbmVyaWMtc3lzdGVtLnhtbApAQCAtMjQsNiArMjQsNyBAQAogICAgICAgICA8aW5zdGFsbC1pbiB1c2VyLXR5cGU9IkZVTEwiIC8+CiAgICAgICAgIDxpbnN0YWxsLWluIHVzZXItdHlwZT0iUFJPRklMRSIgLz4KICAgICAgICAgPGRvLW5vdC1pbnN0YWxsLWluIHVzZXItdHlwZT0iYW5kcm9pZC5vcy51c2VydHlwZS5wcm9maWxlLkNMT05FIiAvPgorICAgICAgICA8ZG8tbm90LWluc3RhbGwtaW4gdXNlci10eXBlPSJhbmRyb2lkLm9zLnVzZXJ0eXBlLnByb2ZpbGUuUFJJVkFURSIgLz4KICAgICA8L2luc3RhbGwtaW4tdXNlci10eXBlPgogPC9jb25maWc+CiAKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3N5c2NvbmZpZy9wcmVpbnN0YWxsZWQtcGFja2FnZXMtcGxhdGZvcm0taGFuZGhlbGQtcHJvZHVjdC54bWwgYi90YXJnZXQvcHJvZHVjdC9zeXNjb25maWcvcHJlaW5zdGFsbGVkLXBhY2thZ2VzLXBsYXRmb3JtLWhhbmRoZWxkLXByb2R1Y3QueG1sCmluZGV4IDU0YWRkMjIuLjUzNmMzNWIgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3N5c2NvbmZpZy9wcmVpbnN0YWxsZWQtcGFja2FnZXMtcGxhdGZvcm0taGFuZGhlbGQtcHJvZHVjdC54bWwKKysrIGIvdGFyZ2V0L3Byb2R1Y3Qvc3lzY29uZmlnL3ByZWluc3RhbGxlZC1wYWNrYWdlcy1wbGF0Zm9ybS1oYW5kaGVsZC1wcm9kdWN0LnhtbApAQCAtMjksNiArMjksNyBAQAogICAgICAgICA8aW5zdGFsbC1pbiB1c2VyLXR5cGU9IkZVTEwiIC8+CiAgICAgICAgIDxpbnN0YWxsLWluIHVzZXItdHlwZT0iUFJPRklMRSIgLz4KICAgICAgICAgPGRvLW5vdC1pbnN0YWxsLWluIHVzZXItdHlwZT0iYW5kcm9pZC5vcy51c2VydHlwZS5wcm9maWxlLkNMT05FIiAvPgorICAgICAgICA8ZG8tbm90LWluc3RhbGwtaW4gdXNlci10eXBlPSJhbmRyb2lkLm9zLnVzZXJ0eXBlLnByb2ZpbGUuUFJJVkFURSIgLz4KICAgICA8L2luc3RhbGwtaW4tdXNlci10eXBlPgogCiAgICAgPCEtLSAgQ2FtZXJhIChDYW1lcmEyKSAtLT4KQEAgLTQyLDYgKzQzLDcgQEAKICAgICA8aW5zdGFsbC1pbi11c2VyLXR5cGUgcGFja2FnZT0iY29tLmFuZHJvaWQuZGVza2Nsb2NrIj4KICAgICAgICAgPGluc3RhbGwtaW4gdXNlci10eXBlPSJGVUxMIiAvPgogICAgICAgICA8ZG8tbm90LWluc3RhbGwtaW4gdXNlci10eXBlPSJhbmRyb2lkLm9zLnVzZXJ0eXBlLnByb2ZpbGUuQ0xPTkUiIC8+CisgICAgICAgIDxkby1ub3QtaW5zdGFsbC1pbiB1c2VyLXR5cGU9ImFuZHJvaWQub3MudXNlcnR5cGUucHJvZmlsZS5QUklWQVRFIiAvPgogICAgIDwvaW5zdGFsbC1pbi11c2VyLXR5cGU+CiAKICAgICA8IS0tICBDb250YWN0cyAtLT4KQEAgLTU2LDYgKzU4LDcgQEAKICAgICAgICAgPGluc3RhbGwtaW4gdXNlci10eXBlPSJGVUxMIiAvPgogICAgICAgICA8aW5zdGFsbC1pbiB1c2VyLXR5cGU9IlBST0ZJTEUiIC8+CiAgICAgICAgIDxkby1ub3QtaW5zdGFsbC1pbiB1c2VyLXR5cGU9ImFuZHJvaWQub3MudXNlcnR5cGUucHJvZmlsZS5DTE9ORSIgLz4KKyAgICAgICAgPGRvLW5vdC1pbnN0YWxsLWluIHVzZXItdHlwZT0iYW5kcm9pZC5vcy51c2VydHlwZS5wcm9maWxlLlBSSVZBVEUiIC8+CiAgICAgPC9pbnN0YWxsLWluLXVzZXItdHlwZT4KIAogICAgIDwhLS0gIFNlYXJjaCAoUXVpY2tTZWFyY2hCb3gpIFRPRE8oYi8yNTgwNTU0NzkpIC0tPgpAQCAtNjQsNiArNjcsNyBAQAogICAgICAgICA8aW5zdGFsbC1pbiB1c2VyLXR5cGU9IkZVTEwiIC8+CiAgICAgICAgIDxpbnN0YWxsLWluIHVzZXItdHlwZT0iUFJPRklMRSIgLz4KICAgICAgICAgPGRvLW5vdC1pbnN0YWxsLWluIHVzZXItdHlwZT0iYW5kcm9pZC5vcy51c2VydHlwZS5wcm9maWxlLkNMT05FIiAvPgorICAgICAgICA8ZG8tbm90LWluc3RhbGwtaW4gdXNlci10eXBlPSJhbmRyb2lkLm9zLnVzZXJ0eXBlLnByb2ZpbGUuUFJJVkFURSIgLz4KICAgICA8L2luc3RhbGwtaW4tdXNlci10eXBlPgogCiAgICAgPCEtLSBXYWxscGFwZXJDcm9wcGVyIC0tPgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3Qvc3lzY29uZmlnL3ByZWluc3RhbGxlZC1wYWNrYWdlcy1wbGF0Zm9ybS10ZWxlcGhvbnktcHJvZHVjdC54bWwgYi90YXJnZXQvcHJvZHVjdC9zeXNjb25maWcvcHJlaW5zdGFsbGVkLXBhY2thZ2VzLXBsYXRmb3JtLXRlbGVwaG9ueS1wcm9kdWN0LnhtbAppbmRleCBjYzFjMTM1Li42N2EyYTAxIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9zeXNjb25maWcvcHJlaW5zdGFsbGVkLXBhY2thZ2VzLXBsYXRmb3JtLXRlbGVwaG9ueS1wcm9kdWN0LnhtbAorKysgYi90YXJnZXQvcHJvZHVjdC9zeXNjb25maWcvcHJlaW5zdGFsbGVkLXBhY2thZ2VzLXBsYXRmb3JtLXRlbGVwaG9ueS1wcm9kdWN0LnhtbApAQCAtMjQsNiArMjQsNyBAQAogICAgICAgICA8aW5zdGFsbC1pbiB1c2VyLXR5cGU9IkZVTEwiIC8+CiAgICAgICAgIDxpbnN0YWxsLWluIHVzZXItdHlwZT0iUFJPRklMRSIgLz4KICAgICAgICAgPGRvLW5vdC1pbnN0YWxsLWluIHVzZXItdHlwZT0iYW5kcm9pZC5vcy51c2VydHlwZS5wcm9maWxlLkNMT05FIiAvPgorICAgICAgICA8ZG8tbm90LWluc3RhbGwtaW4gdXNlci10eXBlPSJhbmRyb2lkLm9zLnVzZXJ0eXBlLnByb2ZpbGUuUFJJVkFURSIgLz4KICAgICA8L2luc3RhbGwtaW4tdXNlci10eXBlPgogPC9jb25maWc+CiAKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3RlbGVwaG9ueV9zeXN0ZW1fZXh0Lm1rIGIvdGFyZ2V0L3Byb2R1Y3QvdGVsZXBob255X3N5c3RlbV9leHQubWsKaW5kZXggZjgxYTYwNy4uZjgyMTM4MSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvdGVsZXBob255X3N5c3RlbV9leHQubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvdGVsZXBob255X3N5c3RlbV9leHQubWsKQEAgLTIxLDMgKzIxLDcgQEAKIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAogICAgIENhcnJpZXJDb25maWcgXAogICAgIEVtZXJnZW5jeUluZm8gXAorCitQUk9EVUNUX1BBQ0tBR0VTX1NISVBQSU5HX0FQSV9MRVZFTF8zNCArPSBcCisgICAgaHdzZXJ2aWNlbWFuYWdlciBcCisgICAgYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAtc2VydmljZSBcCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC91cGRhdGFibGVfYXBleC5tayBiL3RhcmdldC9wcm9kdWN0L3VwZGF0YWJsZV9hcGV4Lm1rCmluZGV4IGQ2MDZlMDAuLjgzNTdmZGYgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3VwZGF0YWJsZV9hcGV4Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L3VwZGF0YWJsZV9hcGV4Lm1rCkBAIC0xNCwxNyArMTQsMTMgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLSMgSW5oZXJpdCB0aGlzIHdoZW4gdGhlIHRhcmdldCBuZWVkcyB0byBzdXBwb3J0IHVwZGF0aW5nIEFQRVhlcworI8KgY29tLmFuZHJvaWQuYXBleC5jdHMuc2hpbS52MV9wcmVidWlsdCBvdmVycmlkZXMgQ3RzU2hpbVByZWJ1aWx0CisjIGFuZCBDdHNTaGltUHJpdlByZWJ1aWx0IHNpbmNlIHRoZXkgYXJlIHBhY2thZ2VkIGluc2lkZSB0aGUgQVBFWC4KK1BST0RVQ1RfUEFDS0FHRVMgKz0gY29tLmFuZHJvaWQuYXBleC5jdHMuc2hpbS52MV9wcmVidWlsdAorUFJPRFVDVF9TWVNURU1fUFJPUEVSVElFUyA6PSByby5hcGV4LnVwZGF0YWJsZT10cnVlCiAKLWlmbmVxICgkKE9WRVJSSURFX1RBUkdFVF9GTEFUVEVOX0FQRVgpLHRydWUpCi0gICPCoGNvbS5hbmRyb2lkLmFwZXguY3RzLnNoaW0udjFfcHJlYnVpbHQgb3ZlcnJpZGVzIEN0c1NoaW1QcmVidWlsdAotICAjIGFuZCBDdHNTaGltUHJpdlByZWJ1aWx0IHNpbmNlIHRoZXkgYXJlIHBhY2thZ2VkIGluc2lkZSB0aGUgQVBFWC4KLSAgUFJPRFVDVF9QQUNLQUdFUyArPSBjb20uYW5kcm9pZC5hcGV4LmN0cy5zaGltLnYxX3ByZWJ1aWx0Ci0gIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgOj0gcm8uYXBleC51cGRhdGFibGU9dHJ1ZQotICBUQVJHRVRfRkxBVFRFTl9BUEVYIDo9IGZhbHNlCi0gICMgVXNlIGNvbXByZXNzZWQgYXBleGVzIGluIHByZS1pbnN0YWxsZWQgcGFydGl0aW9ucy4KLSAgIyBOb3RlOiB0aGlzIGRvZXNuJ3QgbWVhbiB0aGF0IGFsbCBwcmUtaW5zdGFsbGVkIGFwZXhlcyB3aWxsIGJlIGNvbXByZXNzZWQuCi0gICMgIFdoZXRoZXIgYW4gYXBleCBpcyBjb21wcmVzc2VkIG9yIG5vdCBpcyBjb250cm9sbGVkIGF0IGFwZXggU29vbmcgbW9kdWxlCi0gICMgIHZpYSBjb21wcmVzaWJsZSBwcm9wZXJ0eS4KLSAgUFJPRFVDVF9DT01QUkVTU0VEX0FQRVggOj0gdHJ1ZQotZW5kaWYKKyMgVXNlIGNvbXByZXNzZWQgYXBleGVzIGluIHByZS1pbnN0YWxsZWQgcGFydGl0aW9ucy4KKyMgTm90ZTogdGhpcyBkb2Vzbid0IG1lYW4gdGhhdCBhbGwgcHJlLWluc3RhbGxlZCBhcGV4ZXMgd2lsbCBiZSBjb21wcmVzc2VkLgorIyAgV2hldGhlciBhbiBhcGV4IGlzIGNvbXByZXNzZWQgb3Igbm90IGlzIGNvbnRyb2xsZWQgYXQgYXBleCBTb29uZyBtb2R1bGUKKyMgIHZpYSBjb21wcmVzaWJsZSBwcm9wZXJ0eS4KK1BST0RVQ1RfQ09NUFJFU1NFRF9BUEVYIDo9IHRydWUKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3VzZXJzcGFjZV9yZWJvb3QubWsgYi90YXJnZXQvcHJvZHVjdC91c2Vyc3BhY2VfcmVib290Lm1rCmluZGV4IGYyMzVkMTQuLjUxZmViMDcgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3VzZXJzcGFjZV9yZWJvb3QubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvdXNlcnNwYWNlX3JlYm9vdC5tawpAQCAtMTQsNiArMTQsNCBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotIyBJbmhlcml0IHRoaXMgd2hlbiB0aGUgdGFyZ2V0IHN1cHBvcnRzIHVzZXJzcGFjZSByZWJvb3QKLQotUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyA6PSBpbml0LnVzZXJzcGFjZV9yZWJvb3QuaXNfc3VwcG9ydGVkPXRydWUKKyMgREVQUkVDQVRFRCEgRG8gbm90IGluaGVyaXQgdGhpcy4KZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3Zib290Lm1rIGIvdGFyZ2V0L3Byb2R1Y3QvdmJvb3QubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YTQ4ODMuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvdmJvb3QubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIFByb3ZpZGVzIGRlcGVuZGVuY2llcyBuZWNlc3NhcnkgZm9yIHZlcmlmaWVkIGJvb3QKLQotUFJPRFVDVF9TVVBQT1JUU19WQk9PVCA6PSB0cnVlCi0KLSMgVGhlIGRldiBrZXkgaXMgdXNlZCB0byBzaWduIGJvb3QgYW5kIHJlY292ZXJ5IGltYWdlcy4KLSMgV2UgZXhwZWN0IHRoaXMgZmlsZSB0byBleGlzdCB3aXRoIHRoZSBzdWZmaXhlcyAiLnZicHJpdmsiIGFuZCAiLnZicHVwayIuCi0jIFRPRE86IGZpbmQgYSBwcm9wZXIgbG9jYXRpb24gZm9yIHRoaXMKLVBST0RVQ1RfVkJPT1RfU0lHTklOR19LRVkgOj0gZXh0ZXJuYWwvdmJvb3RfcmVmZXJlbmNlL3Rlc3RzL2RldmtleXMva2VybmVsX2RhdGFfa2V5Ci1QUk9EVUNUX1ZCT09UX1NJR05JTkdfU1VCS0VZIDo9IGV4dGVybmFsL3Zib290X3JlZmVyZW5jZS90ZXN0cy9kZXZrZXlzL2tlcm5lbF9zdWJrZXkKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3ZpcnR1YWxfYWJfb3RhL09XTkVSUyBiL3RhcmdldC9wcm9kdWN0L3ZpcnR1YWxfYWJfb3RhL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWIwNjg2Ci0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvT1dORVJTCkBAIC0wLDAgKzEsNCBAQAoremhhbmdrZWx2aW5AZ29vZ2xlLmNvbQorZHZhbmRlckBnb29nbGUuY29tCitha2FpbGFzaEBnb29nbGUuY29tCisKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3ZpcnR1YWxfYWJfb3RhL2NvbXByZXNzaW9uLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvY29tcHJlc3Npb24ubWsKaW5kZXggZGMxZWUzZS4uZTc3YzM2ZiAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvY29tcHJlc3Npb24ubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvY29tcHJlc3Npb24ubWsKQEAgLTE4LDkgKzE4LDEyIEBACiAKIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8udmlydHVhbF9hYi5jb21wcmVzc2lvbi5lbmFibGVkPXRydWUKIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8udmlydHVhbF9hYi51c2Vyc3BhY2Uuc25hcHNob3RzLmVuYWJsZWQ9dHJ1ZQotUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52aXJ0dWFsX2FiLmlvX3VyaW5nLmVuYWJsZWQ9dHJ1ZQogUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52aXJ0dWFsX2FiLmJhdGNoX3dyaXRlcz10cnVlCiAKKyMgT3B0aW9uYWwgYXNzaWdubWVudC4gT24gbG93IG1lbW9yeSBkZXZpY2VzLCBkaXNhYmxpbmcgaW9fdXJpbmcgY2FuIHJlbGlldmUgY3B1IGFuZCBtZW1vcnkKKyMgcHJlc3N1cmUgZHVyaW5nIGFuIE9UQS4KK1BST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8udmlydHVhbF9hYi5pb191cmluZy5lbmFibGVkPz10cnVlCisKICMgRW5hYmxpbmcgdGhpcyBwcm9wZXJ0eSwgd2lsbCBpbXByb3ZlIE9UQSBpbnN0YWxsIHRpbWUKICMgYnV0IHdpbGwgdXNlIGFuIGFkZGl0aW9uYWwgQ1BVIGNvcmUKICMgUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52aXJ0dWFsX2FiLmNvbXByZXNzaW9uLnRocmVhZHM9dHJ1ZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvdmFiY19mZWF0dXJlcy5tayBiL3RhcmdldC9wcm9kdWN0L3ZpcnR1YWxfYWJfb3RhL3ZhYmNfZmVhdHVyZXMubWsKaW5kZXggODc0ZWI5Yy4uZDA5MjY5OSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvdmFiY19mZWF0dXJlcy5taworKysgYi90YXJnZXQvcHJvZHVjdC92aXJ0dWFsX2FiX290YS92YWJjX2ZlYXR1cmVzLm1rCkBAIC0zMSwxMyArMzEsMzMgQEAKIAogUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52aXJ0dWFsX2FiLmNvbXByZXNzaW9uLmVuYWJsZWQ9dHJ1ZQogUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52aXJ0dWFsX2FiLnVzZXJzcGFjZS5zbmFwc2hvdHMuZW5hYmxlZD10cnVlCi1QUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLnZpcnR1YWxfYWIuaW9fdXJpbmcuZW5hYmxlZD10cnVlCi1QUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLnZpcnR1YWxfYWIuY29tcHJlc3Npb24ueG9yLmVuYWJsZWQ9dHJ1ZQogUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52aXJ0dWFsX2FiLmJhdGNoX3dyaXRlcz10cnVlCiAKKyMgT3B0aW9uYWwgYXNzaWdubWVudHMsIGxvdyBtZW1vcnkgZGV2aWNlcyBtYXkgYmVuZWZpdCBmcm9tIG92ZXJyaWRpbmcgdGhlc2UuCitQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLnZpcnR1YWxfYWIuaW9fdXJpbmcuZW5hYmxlZD89dHJ1ZQorUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52aXJ0dWFsX2FiLmNvbXByZXNzaW9uLnhvci5lbmFibGVkPz10cnVlCisKKyMgTG93IG1lbW9yeSBkZXZpY2UgY29uZmlndXJhdGlvbnMuIElmIG1lbW9yeSB1c2FnZSBhbmQgY3B1IHV0aWxpemF0aW9uIGlzCisjIGEgYm90dGxlbmVjayBkdXJpbmcgT1RBLCB0aGUgYmVsb3cgY29uZmlndXJhdGlvbnMgY2FuIGJlIGFkZGVkIHRvIGEKKyMgZGV2aWNlJ3MgLm1rIGZpbGUgaW1wcm92ZSBwZXJmb3JtYW5jZSBmb3IgbG93IG1lbSBkZXZpY2VzLgorIworIyBQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLnZpcnR1YWxfYWIucmVhZF9haGVhZF9zaXplPTE2CisjIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8udmlydHVhbF9hYi5vX2RpcmVjdC5lbmFibGVkPXRydWUKKyMgUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52aXJ0dWFsX2FiLm1lcmdlX3RocmVhZF9wcmlvcml0eT0xOQorIyBQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLnZpcnR1YWxfYWIud29ya2VyX3RocmVhZF9wcmlvcml0eT0wCisjIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8udmlydHVhbF9hYi5udW1fd29ya2VyX3RocmVhZHM9MworIyBQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLnZpcnR1YWxfYWIubnVtX21lcmdlX3RocmVhZHM9MQorIyBQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLnZpcnR1YWxfYWIubnVtX3ZlcmlmeV90aHJlYWRzPTEKKyMgUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52aXJ0dWFsX2FiLmNvd19vcF9tZXJnZV9zaXplPTE2CisjIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8udmlydHVhbF9hYi52ZXJpZnlfdGhyZXNob2xkX3NpemU9MTA3Mzc0MTgyNAorIyBQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLnZpcnR1YWxfYWIudmVyaWZ5X2Jsb2NrX3NpemU9MTA0ODU3NgorCiAjIEVuYWJsaW5nIHRoaXMgcHJvcGVydHksIHdpbGwgaW1wcm92ZSBPVEEgaW5zdGFsbCB0aW1lCiAjIGJ1dCB3aWxsIHVzZSBhbiBhZGRpdGlvbmFsIENQVSBjb3JlCiAjIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8udmlydHVhbF9hYi5jb21wcmVzc2lvbi50aHJlYWRzPXRydWUKK2lmbmRlZiBQUk9EVUNUX1ZJUlRVQUxfQUJfQ09NUFJFU1NJT05fRkFDVE9SCisgICAgUFJPRFVDVF9WSVJUVUFMX0FCX0NPTVBSRVNTSU9OX0ZBQ1RPUiA6PSA2NTUzNgorZW5kaWYKIAogUFJPRFVDVF9WSVJUVUFMX0FCX0NPTVBSRVNTSU9OIDo9IHRydWUKIFBST0RVQ1RfVklSVFVBTF9BQl9DT01QUkVTU0lPTl9NRVRIT0QgPz0gbm9uZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3Qvd2luZG93X2V4dGVuc2lvbnMubWsgYi90YXJnZXQvcHJvZHVjdC93aW5kb3dfZXh0ZW5zaW9ucy5tawppbmRleCA1ZjU0MzFmLi5kMjdhNjEzIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC93aW5kb3dfZXh0ZW5zaW9ucy5taworKysgYi90YXJnZXQvcHJvZHVjdC93aW5kb3dfZXh0ZW5zaW9ucy5tawpAQCAtMTQsMTEgKzE0LDE0IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi0jIC9zeXN0ZW1fZXh0IHBhY2thZ2VzCi1QUk9EVUNUX1BBQ0tBR0VTICs9IFwKLSAgICBhbmRyb2lkeC53aW5kb3cuZXh0ZW5zaW9ucyBcCi0gICAgYW5kcm9pZHgud2luZG93LnNpZGVjYXIKLQotIyBwcm9wZXJ0aWVzCisjIEV4dGVuc2lvbiBvZiB3aW5kb3dfZXh0ZW5zaW9uc19iYXNlLm1rIHRvIGVuYWJsZSB0aGUgYWN0aXZpdHkgZW1iZWRkaW5nCisjIGZlYXR1cmUgZm9yIGFsbCBhcHBzIGJ5IGRlZmF1bHQuIEFsbCBsYXJnZSBzY3JlZW4gZGV2aWNlcyBtdXN0IGluaGVyaXQKKyMgdGhpcyBpbiBidWlsZC4gT3B0aW9uYWwgZm9yIG90aGVyIGZvcm0gZmFjdG9ycy4KKyMKKyMgSW5kaWNhdGVkIHdoZXRoZXIgdGhlIEFjdGl2aXR5IEVtYmVkZGluZyBmZWF0dXJlIHNob3VsZCBiZSBndWFyZGVkIGJ5CisjIEFuZHJvaWQgMTUgdG8gYXZvaWQgYXBwIGNvbXBhdCBpbXBhY3QuCisjIElmIHRydWUgKG9yIG5vdCBzZXQpLCB0aGUgZmVhdHVyZSBpcyBvbmx5IGVuYWJsZWQgZm9yIGFwcHMgd2l0aCB0YXJnZXQKKyMgU0RLIG9mIEFuZHJvaWQgMTUgb3IgYWJvdmUuCisjIElmIGZhbHNlLCB0aGUgZmVhdHVyZSBpcyBlbmFibGVkIGZvciBhbGwgYXBwcy4KIFBST0RVQ1RfUFJPRFVDVF9QUk9QRVJUSUVTICs9IFwKLSAgICBwZXJzaXN0LndtLmV4dGVuc2lvbnMuZW5hYmxlZD10cnVlCisgICAgcGVyc2lzdC53bS5leHRlbnNpb25zLmFjdGl2aXR5X2VtYmVkZGluZ19ndWFyZF93aXRoX2FuZHJvaWRfMTU9ZmFsc2UKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3dpbmRvd19leHRlbnNpb25zX2Jhc2UubWsgYi90YXJnZXQvcHJvZHVjdC93aW5kb3dfZXh0ZW5zaW9uc19iYXNlLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMGU1ZTcKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvcHJvZHVjdC93aW5kb3dfZXh0ZW5zaW9uc19iYXNlLm1rCkBAIC0wLDAgKzEsMzMgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgVGhlIGJhc2UgdmVyc2lvbiBvZiB3aW5kb3dfZXh0ZW5zaW9ucy5tayB0byBiZSBpbmNsdWRlZCBvbiBhbGwgbm9uLXdlYXJhYmxlCisjIGRldmljZXMuIERldmljZXMgdGhhdCBkb24ndCBzdXBwb3J0IG11bHRpLXdpbmRvdyBjYW4gY2hvb3NlIHRvIGRyb3AgdGhpcy4KKyMKKyMgTm90ZTogYnkgZGVmYXVsdCB0aGUgQWN0aXZpdHkgRW1iZWRkaW5nIGZlYXR1cmUgaXMgZ3VhcmRlZCBieSBhcHAncworIyB0YXJnZXRTREsgb24gQW5kcm9pZCAxNSB0byBhdm9pZCBhcHAgY29tcGF0IGltcGFjdC4KKyMKKyMgTGFyZ2Ugc2NyZWVuIGRldmljZXMgbXVzdCBpbmhlcml0IHdpbmRvd19leHRlbnNpb25zLm1rIHRvIGVuYWJsZSB0aGUKKyMgQWN0aXZpdHkgRW1iZWRkaW5nIGZlYXR1cmUgZm9yIGFsbCBhcHBzLgorCisjIC9zeXN0ZW1fZXh0IHBhY2thZ2VzCitQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICBhbmRyb2lkeC53aW5kb3cuZXh0ZW5zaW9ucyBcCisgICAgYW5kcm9pZHgud2luZG93LnNpZGVjYXIKKworIyBwcm9wZXJ0aWVzCitQUk9EVUNUX1BST0RVQ1RfUFJPUEVSVElFUyArPSBcCisgICAgcGVyc2lzdC53bS5leHRlbnNpb25zLmVuYWJsZWQ9dHJ1ZQpkaWZmIC0tZ2l0IGEvdGVhbXMvQW5kcm9pZC5icCBiL3RlYW1zL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJiMGQxNAotLS0gL2Rldi9udWxsCisrKyBiL3RlYW1zL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0NDA2IEBACisvLworLy8gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIERPTidUIEFERCBORVcgUlVMRVMgSEVSRS4gRm9yIG1vcmUgZGV0YWlscyByZWZlciB0bworLy8gZ28vbmV3LWFuZHJvaWQtb3duZXJzaGlwLW1vZGVsCisKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3FtY19wc3MiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjM0MjU0NDg0MTM3NTc0NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjM0MjU0NDg0MTM3NTc0NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jcHVfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTE5MDU5NzQ3MzA3NTIwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTE5MDU5NzQ3MzA3NTIwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3B3Z19tb2JpbGUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDg2OTI3NDU4ODMxNTY0OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDg2OTI3NDU4ODMxNTY0OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9wY2Vfd2V1IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUyMDU3MjU5Njg4OTE5MDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUyMDU3MjU5Njg4OTE5MDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGVlcHNfdF9wZ21fYW5kcm9pZF9lbmdwcm9kIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyODgyODQ5NjAzNTg0MDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyODgyODQ5NjAzNTg0MDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYXBwc2VhcmNoIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwNzU2NjE3MTY4MTU4NzIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUwNzU2NjE3MTY4MTU4NzIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc2hheWJhX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjIxMzEzNTAyMDIyODYwOAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjIxMzEzNTAyMDIyODYwOCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9zeXN0ZW1fc29mdHdhcmUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDg1NjAwNTEyMDYyMjU5MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNDg1NjAwNTEyMDYyMjU5MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9wbGF0Zm9ybV9lbmFibGVyX2ZyYW1ld29ya19tYWtlX3BpeGVsXyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81ODkzOTQ0MDk3MjQzMTM2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1ODkzOTQ0MDk3MjQzMTM2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3N5c3RlbV9zd19wb3dlcl9zdyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NzAzMTg0NjU1Mjg2MjcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NzAzMTg0NjU1Mjg2MjcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX21hcnZpbnBhdWxfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODAwNjg5NjkyOTAxMzc2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0ODAwNjg5NjkyOTAxMzc2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2ludGVyYWN0aXZlX3R2IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYxNTA1Nzc4NTM2NjExODQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYxNTA1Nzc4NTM2NjExODQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3lzdGVtX3N3X3NlbnNvcl9mcmFtZXdvcmsiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTAwNTMxMDU2NzI4NDczNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTAwNTMxMDU2NzI4NDczNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93c2RfYXJjaCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MTczNzY5ODA2NTEyMTI4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MTczNzY5ODA2NTEyMTI4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2xhbmVjaHJfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81Njc0NTk0MjA0ODExMjY0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1Njc0NTk0MjA0ODExMjY0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3Rlc3RfZW5nX2FuZHJvaWRfZm9yX3dvcmsiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTkwOTg4NzAxNTg0NTg4OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTkwOTg4NzAxNTg0NTg4OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jYW1lcmFfYXBwIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUyMTY2NDQ5MzQ1MzMxMjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUyMTY2NDQ5MzQ1MzMxMjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fdmFtYXJhanVfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTUwNTEwOTYwNzcxMDcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTUwNTEwOTYwNzcxMDcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfbWVkaWFfYXVkaW9fZnJhbWV3b3JrIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU4MjM1NzUzNTMwNjU0NzIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU4MjM1NzUzNTMwNjU0NzIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc3VwZXJnbHVlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUyMTE2Njc4ODI5OTk4MDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUyMTE2Njc4ODI5OTk4MDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZGlzcGxheV9mcmFtZXdvcmsiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjAzNTYwMDkyNTE2MzUyMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjAzNTYwMDkyNTE2MzUyMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmFudGhha190ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY3MDYwNDMzMDEyOTgxNzYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY3MDYwNDMzMDEyOTgxNzYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcW1jX3BxbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NzE1MjY3NjMyMjY3MjY0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NzE1MjY3NjMyMjY3MjY0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3NlYXJjaF9hbGxhcHBzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ5MjYxNjA2NzAxOTU3MTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ5MjYxNjA2NzAxOTU3MTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY29tbXVuYWwiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjM4MDY2OTk0MjUzMDA0OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjM4MDY2OTk0MjUzMDA0OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9ub3ZhIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU0MTg5NTUwNzQwNDM5MDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU0MTg5NTUwNzQwNDM5MDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZGVwcmVjYXRlZF9mcmFtZXdvcmtfb19vIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU5OTk0OTcyMTM1MDk2MzIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU5OTk0OTcyMTM1MDk2MzIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9nbyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NTQzMjA1NzEzNDQ0ODY0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NTQzMjA1NzEzNDQ0ODY0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl9mcmFtZXdvcmtzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxMzgzOTI0MDg4MTc2NjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxMzgzOTI0MDg4MTc2NjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc3NkX3NlbnNvciIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MDg0NzAzNTM5MjAwMDAwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MDg0NzAzNTM5MjAwMDAwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2RvbnRla190ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU3NDYwNzYyODUwNDI2ODgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU3NDYwNzYyODUwNDI2ODgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY2Fycmllcl9maWVsZF90ZXN0IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY0MDk3NjY2NDA5NzU4NzIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY0MDk3NjY2NDA5NzU4NzIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcG13X3N0YW5kYXJkcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NDI4ODA2ODIyNTI2OTc2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NDI4ODA2ODIyNTI2OTc2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2J1aWxkX2luZnJhIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ1MTYxODQxNjQ0MzM5MjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ1MTYxODQxNjQ0MzM5MjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcW1jX2dmdCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NDU0MTM5NDQ2MTMyNzM2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NDU0MTM5NDQ2MTMyNzM2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfc3RvcmFnZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MzAxNTk0OTM2MDQ5NjY0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MzAxNTk0OTM2MDQ5NjY0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX21vYmlsZV93aXJlbGVzcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODIxOTE4MTc1ODg3MzYwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0ODIxOTE4MTc1ODg3MzYwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2NhbWVyYV9mcm9tX2dvb2dsZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80Nzk5Njk0MTA0ODU0NTI4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0Nzk5Njk0MTA0ODU0NTI4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX2Nvbm5lY3Rpdml0eV9zZXR0aW5ncyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NjIyNDk2NDUwODcxMjk2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NjIyNDk2NDUwODcxMjk2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRidWd0b29sX2FidF8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjUzMTgxNzc4MTQ5Mzc2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjUzMTgxNzc4MTQ5Mzc2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfc2VjdXJpdHkiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjMyNTY5OTMyNTM2MjE3NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjMyNTY5OTMyNTM2MjE3NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9wYXNjYWxsb3Vpc190ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxMTEyMzgyNzYzMTcxODQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxMTEyMzgyNzYzMTcxODQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9jYW1lcmFfZWNvc3lzdGVtX2VuYWJsaW5nIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ1MjkyOTAyNjkzMjczNjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ1MjkyOTAyNjkzMjczNjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY2FsZW5kYXIiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjcxOTEyNzU3Mzg4OTAyNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjcxOTEyNzU3Mzg4OTAyNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jZ2MiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDU5MDMxNTQ5OTA2MTI0OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDU5MDMxNTQ5OTA2MTI0OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kaWFnbm9zdGljX3Rvb2wiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDY4OTkyNDU2NDc0NjI0MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDY4OTkyNDU2NDc0NjI0MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9jYW1lcmFfc3lzdGVtX3NvZnR3YXJlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYzODY1MjUzMDY0ODY3ODQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYzODY1MjUzMDY0ODY3ODQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY3JlZGVudGlhbF9tYW5hZ2VyIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUyNzY0MDM0Mjg2NTUxMDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUyNzY0MDM0Mjg2NTUxMDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93dGlfd2Vhcl90b29sc19hbmRfaW5mcmFfIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyMjU1NzEzMDY0Mzg2NTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyMjU1NzEzMDY0Mzg2NTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfYmlvbWV0cmljc19mYWNlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwMjg3MDU5MjY3NDIwMTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUwMjg3MDU5MjY3NDIwMTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbG9jYXRpb25fdGltZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODgzODA3NjAwMDE3NDA4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0ODgzODA3NjAwMDE3NDA4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfaGFyZHdhcmVfYmFja2VkX3NlY3VyaXR5IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYzOTg1OTU1NTYzNDM4MDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYzOTg1OTU1NTYzNDM4MDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGxheV9uZXdzc3RhbmQiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE3MTAxNTIwMTk4MDQxNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE3MTAxNTIwMTk4MDQxNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kZXByZWNhdGVkX2ZyYW1ld29ya19qYWdnaWVzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU3NTMyMDY2MDg4ODc4MDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU3NTMyMDY2MDg4ODc4MDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbWFrZV9waXhlbF90cGdtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYwNjEwNjk4NjQ2NjUwODgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYwNjEwNjk4NjQ2NjUwODgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbWFrZV90cmFuc2Zvcm1lciIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MjI0NTM5NDI3NDM4NTkyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MjI0NTM5NDI3NDM4NTkyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dpdHRyb2NrX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTcwNzQxMjA4MzQ3NDQzMgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTcwNzQxMjA4MzQ3NDQzMiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfYW5kcm9pZF9jb21wYW5pb25fc2RrIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ4NjQ5MjM2MzcwMjI3MjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ4NjQ5MjM2MzcwMjI3MjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYXNzaXN0YW50X3N5c3VpX2ludGVncmF0aW9uIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ4ODQyODI1NzUwNjA5OTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ4ODQyODI1NzUwNjA5OTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fdGhpbmdzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUyMDYxOTk1NzQwNjkyNDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUyMDYxOTk1NzQwNjkyNDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd3NkX3cxMyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NjEyNDY5MTIwNTMyNDgwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NjEyNDY5MTIwNTMyNDgwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2lxYmFsYXNpZl90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ5MTIwNDk4MTMwOTQ0MDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ5MTIwNDk4MTMwOTQ0MDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYmlvbWV0cmljX3NlY3VyaXR5IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU3OTc5MTE5NjA2NDk3MjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU3OTc5MTE5NjA2NDk3MjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc2lsYmVyc3RfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzEwODkyNTg0MDQyNDk2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NzEwODkyNTg0MDQyNDk2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3Btd190ZWxlcGhvbnkiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjAyOTEyMTQ0NDE1MTI5NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjAyOTEyMTQ0NDE1MTI5NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV96enoiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjM1MTM0MDkzNDM5Nzk1MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjM1MTM0MDkzNDM5Nzk1MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9saXRlX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTY0NzkyNTgxMzM0NjMwNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTY0NzkyNTgxMzM0NjMwNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9nbXNfY29yZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzM1NjE0NDIyODQzMzkyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NzM1NjE0NDIyODQzMzkyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2RpYWxlcl9tYWtlX3BpeGVsXyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTI2Mzk2NTA5OTc4NjI0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTI2Mzk2NTA5OTc4NjI0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3N5c3RlbV9zd19jb2xvciIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NDg5MjM2MTI1NTgxMzEyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NDg5MjM2MTI1NTgxMzEyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2Z3a19uZmMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTk2MjMxMjUxMjg2NDI1NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTk2MjMxMjUxMjg2NDI1NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zcmFqa3VtYXJfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTcwMDUzODk0MDEyOTI4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTcwMDUzODk0MDEyOTI4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2luX21hcmtldF90cG0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTM1MjU0OTg4ODE5NjYwOAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTM1MjU0OTg4ODE5NjYwOCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9sZWFubm9nYXNhd2FyYV90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ5MDU0NjcxOTg0NzIxOTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ5MDU0NjcxOTg0NzIxOTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fenVyaWtlbXBfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NTU5Nzk2NjAzODc5NDI0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NTU5Nzk2NjAzODc5NDI0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfdGVsZW1ldHJ5X2luZnJhIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUyOTU4MDk3NzE3MzI5OTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUyOTU4MDk3NzE3MzI5OTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc3lzdGVtX3VpX3NlbnNvcnMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTY0NzY1MzQ5MjYyMTMxMgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTY0NzY1MzQ5MjYyMTMxMiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93aW5kb3dpbmdfYW5pbWF0aW9uc190cmFuc2l0aW9ucyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODAzMDQwMzM3MzYyOTQ0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0ODAzMDQwMzM3MzYyOTQ0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2RlcHJlY2F0ZWRfZnJhbWV3b3JrX2pqYWdnaSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NDcxNzQyMjcwODk4MTc2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NDcxNzQyMjcwODk4MTc2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FjY2Vzc2liaWxpdHlfaGVhcmluZ19haWRzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ2NjEyMjYzNDAyNTM2OTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ2NjEyMjYzNDAyNTM2OTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGVyZm9ybWFuY2UiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTg0MjAwMDUyMTYyNTYwMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTg0MjAwMDUyMTYyNTYwMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jbG91ZF9hbmRyb2lkIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU5ODAyNTU3NjAwMjM1NTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU5ODAyNTU3NjAwMjM1NTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fdmlzdWFsX2Rlc2lnbiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NTA0MTYxMzk5NzM0MjcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NTA0MTYxMzk5NzM0MjcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dpbGtpbnNvbmNsYXlfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NjgwOTk3MTI4NjM0MzY4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NjgwOTk3MTI4NjM0MzY4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3RjY3lwX25hZGlhZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NTU2NTE4ODMxNjUyODY0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NTU2NTE4ODMxNjUyODY0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FjY2Vzc2liaWxpdHlfc2V0dGluZ3MiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTY0MTgwNjUxMDU4NzkwNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTY0MTgwNjUxMDU4NzkwNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9oYW5zbXVsbGVyX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTA2OTE5MjI1Nzc2NTM3NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTA2OTE5MjI1Nzc2NTM3NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9yZXRhaWxfZGVtb19tb2RlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY1MjA3ODc1MzEyMzUzMjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY1MjA3ODc1MzEyMzUzMjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbHNlX2RyZWFtcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MzE3NTU4ODQyMDk3NjY0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MzE3NTU4ODQyMDk3NjY0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfdXNiIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwOTA3MDc4NTQ0MjYxMTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUwOTA3MDc4NTQ0MjYxMTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY3VydGlzZ2FsbG93YXlfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzA2ODU3NzMwNzAzMzYwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NzA2ODU3NzMwNzAzMzYwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2NhbWVyYV9hbGdvcml0aG1zIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY1NDQ4NTQ5ODA4ODY1MjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY1NDQ4NTQ5ODA4ODY1MjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY2FzdF8zcCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NTg1NTY0OTcyODc1Nzc2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NTg1NTY0OTcyODc1Nzc2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX21lc2NoX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTIwNTQ2NTg5OTM2ODQ0OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTIwNTQ2NTg5OTM2ODQ0OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9zeXN0ZW1fc3dfYXVkaW9fYXJjaCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NTYwNTAxMzc3MDczMTUyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NTYwNTAxMzc3MDczMTUyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2RlZnVuY3RfdXNlX2NvbnRyb2xzX3F1aWNrX3NldHRpbmdzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ2Njc4NjEwNDM0MTI5OTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ2Njc4NjEwNDM0MTI5OTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9ydXN0IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ4NDQ2MDA1ODYzMDU1MzYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ4NDQ2MDA1ODYzMDU1MzYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYWlsYWJzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY2NzM0NzA1MzgyODUwNTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY2NzM0NzA1MzgyODUwNTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX2Nvbm5lY3Rpdml0eSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MjQ1MTQ5NDY2MjYzNTUyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MjQ1MTQ5NDY2MjYzNTUyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfY29yZV9leHBlcmltZW50cyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzA5NjU0OTY1NzgwNDgwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NzA5NjU0OTY1NzgwNDgwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX25hdGl2ZV90b29sc19saWJyYXJpZXMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTkyMDMzMjM3NjMwOTc2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTkyMDMzMjM3NjMwOTc2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hcHBfY29tcGF0IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ5MDcxMzI0MTEzMTQxNzYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ5MDcxMzI0MTEzMTQxNzYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fenJhX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjIyNzYxNTI2NzU4NjA0OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjIyNzYxNTI2NzU4NjA0OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF93YXRjaF9zeXN0ZW1fc29mdHdhcmUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTI5NTk5NDUwMDk3MjU0NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTI5NTk5NDUwMDk3MjU0NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zdXJmYWNlc19lbmdwcm9kIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYxNTQ0NzgxNzY2MDAwNjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYxNTQ0NzgxNzY2MDAwNjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9wZXJtaXNzaW9ucyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NTMzOTc3MzQwMzEzNjAwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NTMzOTc3MzQwMzEzNjAwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BsYXRmb3JtX3Byb2dyYW1fbWdycyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NzY2Mzk0OTIyOTU4ODQ4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NzY2Mzk0OTIyOTU4ODQ4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2RlcHJlY2F0ZWRfc3lzdGVtX2hlYWx0aCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODY0ODAxMjEzNjQ0ODAwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0ODY0ODAxMjEzNjQ0ODAwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX21lc3NhZ2VzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxMzc0ODAwOTczMzMyNDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxMzc0ODAwOTczMzMyNDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGFsbWVyX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTY0MzU3MDA1MjIzNTI2NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTY0MzU3MDA1MjIzNTI2NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX3ZpZGVvX2ltYWdlX2NvZGVjcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzMzMjQ2MTEwNDMzMjgwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NzMzMjQ2MTEwNDMzMjgwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BsYXlfbXVzaWMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjAxNTQ0MDEzMjExMjM4NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjAxNTQ0MDEzMjExMjM4NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zeXN0ZW1fY2xvY2t3b3JrX2ludGVybmFsXyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NTA5NjcwNjA4Nzk3Njk2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NTA5NjcwNjA4Nzk3Njk2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX211bHRpdGFza2luZ193aW5kb3dpbmciLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE0OTE4NTQzNjk3NTEwNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE0OTE4NTQzNjk3NTEwNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV92ciIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODU0MzU1ODUzMTgwOTI4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0ODU0MzU1ODUzMTgwOTI4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX21hcnVlbF90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYzMDI1NTE4MTAxNDYzMDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYzMDI1NTE4MTAxNDYzMDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fdHZfb3MiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDY2MjQ5MTA3NDEzNDAxNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNDY2MjQ5MTA3NDEzNDAxNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hdXRvX2VuZ3Byb2QiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjE5OTk0OTQ3NTQ3OTU1MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjE5OTk0OTQ3NTQ3OTU1MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zYXJhaGNvYmJfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzU1NjkyMTc5OTQ3NTIwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NzU1NjkyMTc5OTQ3NTIwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FjY2Vzc2liaWxpdHlfc2VydmljZXMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjM2NzI4Mzg1MzAwMDcwNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjM2NzI4Mzg1MzAwMDcwNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kb2N1bWVudHN1aSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81ODA1OTgzMTY3MDIxMDU2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1ODA1OTgzMTY3MDIxMDU2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2NhcnJpZXJfY2VydF9mb2xsb3dfdXAiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjc1MTkxMjA5OTc0MTY5NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjc1MTkxMjA5OTc0MTY5NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9tb2JpbGVfZGV2aWNlX3BhcnRuZXJzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU4MzMwNTc3MTcwOTIzNTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU4MzMwNTc3MTcwOTIzNTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYWN0aXZpdHlfcmVjb2duaXRpb24iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjMwNDcwMTI2ODAwMDc2OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjMwNDcwMTI2ODAwMDc2OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9qYXNvbmNhbXBiZWxsX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDgzNDk3MjUyNDUxMTIzMgorICAgIHRyZW5keV90ZWFtX2lkOiAiNDgzNDk3MjUyNDUxMTIzMiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9nbGFuY2VhYmxlcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NjU4MjIyMDA0NjAwODMyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NjU4MjIyMDA0NjAwODMyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfc2FmZV9icm93c2luZyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82Njg1NzEzMjQ0NzgyNTkyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2Njg1NzEzMjQ0NzgyNTkyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfaW5wdXQiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE0MTk5NDc3NTgwNTk1MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE0MTk5NDc3NTgwNTk1MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX3J1c3RfdG9vbGNoYWluIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY1MzA1OTA5ODk5NzU1NTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY1MzA1OTA5ODk5NzU1NTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZXhvIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2MzE1NDUyNDgwODgwNjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2MzE1NDUyNDgwODgwNjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY2FtZXJheCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MjcyNTkwNjY5NDc5OTM2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MjcyNTkwNjY5NDc5OTM2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FjY2Vzc2liaWxpdHlfc291bmRfYW1wbGlmaWVyIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2NzQ4NDAzMTIwMjA5OTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2NzQ4NDAzMTIwMjA5OTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9wcmludGluZyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MjU3NTI4MTQ2MDY3NDU2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MjU3NTI4MTQ2MDY3NDU2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2R0aXNlbGljZV90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxNzc5MzQyNTMwMzE0MjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxNzc5MzQyNTMwMzE0MjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGVyc29uYWxfc2FmZXR5IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyMjIyODUxNDcxMTE0MjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyMjIyODUxNDcxMTE0MjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbm90aWZpY2F0aW9ucyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81OTkzNTIxMzU1NTg3NTg0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1OTkzNTIxMzU1NTg3NTg0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2phdmFfY29yZV9saWJyYXJpZXMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDc2ODA0NDE5MDQwMDUxMgorICAgIHRyZW5keV90ZWFtX2lkOiAiNDc2ODA0NDE5MDQwMDUxMiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV91cGRhdGFibGVfc2RrX2FwaXMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDg0MDIxNTEzOTQ4MzY0OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDg0MDIxNTEzOTQ4MzY0OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX2xvd19wb3dlcl9tY3VfZXhwZXJpZW5jZXMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjE3Mjg3ODAxMzYyODQxNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjE3Mjg3ODAxMzYyODQxNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9iaW9tZXRyaWNzX2ZyYW1ld29yayIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MjA1NDE1NDI1OTk4ODQ4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MjA1NDE1NDI1OTk4ODQ4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3Blc3RvIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU1NTEwOTg1Mjg4MjUzNDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU1NTEwOTg1Mjg4MjUzNDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl9lbmdpbmVlcmluZ19mb3VuZGF0aW9ucyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MzY2OTM2Mjc1NjgxMjgwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MzY2OTM2Mjc1NjgxMjgwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2NzX2RldmVsb3BlciIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTE0MTk5NTc5NDU5NTg0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTE0MTk5NTc5NDU5NTg0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2Fhb3NfZnJhbWV3b3JrIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY1NDc3OTQyMjMzMzMzNzYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY1NDc3OTQyMjMzMzMzNzYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY2xvY2t3b3JrIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ5MDg3ODE2Nzg3NTU4NDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ5MDg3ODE2Nzg3NTU4NDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfY29ubmVjdGl2aXR5X3dpZmlfZHJpdmVyc19maXJtd2FyZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NTgzMzI2MjM2OTM0MTQ0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NTgzMzI2MjM2OTM0MTQ0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2dhbWVzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY3MzY3MTk3NTk5MzM0NDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY3MzY3MTk3NTk5MzM0NDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc3lzdGVtc19uNF8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjQ3NDQ4NjIzNjcwODg2NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjQ3NDQ4NjIzNjcwODg2NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX2t2bSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NTI5MzE4MTg0NzE0MjQwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NTI5MzE4MTg0NzE0MjQwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dzZF93MjIiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjU4MDAzOTM1Mjk3NTM2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjU4MDAzOTM1Mjk3NTM2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX3N1ZG8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTMyOTM0NDg3NjM4MDE2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTMyOTM0NDg3NjM4MDE2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfc3lzdGVtX2hlYWx0aF9hbmRfcG93ZXIiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTIxOTE0NzQ1NzY1ODg4MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTIxOTE0NzQ1NzY1ODg4MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX2J1aWxkX3JlbGVhc2VfdG9vbHMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjI2MDU1ODEwNzgwMzY0OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjI2MDU1ODEwNzgwMzY0OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9mdXNlZF9wcmVzZW5jZV9wcm92aWRlciIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NTM2MzQ0NzUzMzA3NjQ4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NTM2MzQ0NzUzMzA3NjQ4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2Fnc2EiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjE1NzgyNjg4NzkwOTM3NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjE1NzgyNjg4NzkwOTM3NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfZGV2ZWxvcGVyX3RpbGVzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY2MzM3NzczOTY2MTMxMjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY2MzM3NzczOTY2MTMxMjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZXNzZW50aWFsX2FwcGxpY2F0aW9ucyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80OTI2MzczODY0ODAwMjU2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0OTI2MzczODY0ODAwMjU2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX21vYmlsZV9kYXRhIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ5OTY3NDI2MDg5Nzc5MjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ5OTY3NDI2MDg5Nzc5MjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd3NkX3c1MiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MjgwOTcyMTkwMjIwMjg4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MjgwOTcyMTkwMjIwMjg4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX21vYmlsZV9jb25uZWN0aXZpdHkiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjc1NDMxMTk0NTk3Nzg1NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjc1NDMxMTk0NTk3Nzg1NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9lc3NlbnRpYWxhcHBzX2Nsb2NrX2NhbGN1bGF0b3IiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTI3MDM2MzcyODY3NDgxNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTI3MDM2MzcyODY3NDgxNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zc2Rfc3lzdGVtX2hlYWx0aCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NDU2ODk0MDUwNjY0NDQ4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NDU2ODk0MDUwNjY0NDQ4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX2NvbnRpbnVpdHkiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDc4NjYzNTU1MTMwOTgyNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDc4NjYzNTU1MTMwOTgyNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9tYWNoaW5lX2xlYXJuaW5nIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUyNzY1NjgzMTgyNDY5MTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUyNzY1NjgzMTgyNDY5MTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfbWwiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTMzOTg4MzEwODk5MDk3NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTMzOTg4MzEwODk5MDk3NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9leF9lbnRlcnByaXNlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY3MzgzNjkwMjczNzUxMDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY3MzgzNjkwMjczNzUxMDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3lzdGVtX3N3X2FvYyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NzEyNDY0OTgzNDI1MDI0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NzEyNDY0OTgzNDI1MDI0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfcGxhdGZvcm1fY29tbXVuaWNhdGlvbnMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjU3NzUwNTQxNTEwMjQ2NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjU3NzUwNTQxNTEwMjQ2NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zdW5zaGluZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MTA1MDUwMzI5Nzc2MTI4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MTA1MDUwMzI5Nzc2MTI4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3FtY19pcXRfdGFvIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwNjU0NjIwODU3MTM5MjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUwNjU0NjIwODU3MTM5MjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbWNraWxsb3BfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81OTI2NTg5NTk5NzQ0MDAwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1OTI2NTg5NTk5NzQ0MDAwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3Byb2Nlc3NfZXhwZXJpZW5jZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzQ1NDM2NjMzMjM1NDU2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NzQ1NDM2NjMzMjM1NDU2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dzZF9sMSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTE5ODg3OTExMjg4ODMyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTE5ODg3OTExMjg4ODMyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2ZvbGRhYmxlcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTQ5NDIxMzkyOTIwNTc2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTQ5NDIxMzkyOTIwNTc2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FyY19uZXh0IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyMzg5MTc2NTkzNjEyODAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyMzg5MTc2NTkzNjEyODAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9ydWJpZGl1bSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MDk4MDEyNTI5Mjk1MzYwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MDk4MDEyNTI5Mjk1MzYwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2RlcHJlY2F0ZWRfZnJhbWV3b3JrX3N2ZXRvc2xhdmdhbm92IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY0MDQxMTc0OTI1MzEyMDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY0MDQxMTc0OTI1MzEyMDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZ3JlZ3NpbW9uX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTcwMjAxODUxMDUyMDMyMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTcwMjAxODUxMDUyMDMyMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV90ZXh0X3RvX3NwZWVjaCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MzY4OTMzMTIwNDQyMzY4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MzY4OTMzMTIwNDQyMzY4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3N5c3RlbV9zd19hdWRpbyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NDkyMDc4NDIyNzUzMjgwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NDkyMDc4NDIyNzUzMjgwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3RyYW5zZm9ybWVyIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU5NjQzMTI4NDE0MjA4MDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU5NjQzMTI4NDE0MjA4MDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3lzdGVtX3N3X3ZpZGVvIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY0NDIzNjE3Mjg2OTYzMjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY0NDIzNjE3Mjg2OTYzMjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbHNlX2FwcF9jb21wYXQiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE4MDgyNzc0OTE1NDgxNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE4MDgyNzc0OTE1NDgxNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX21lZGlhX2xlYWRzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU0ODc2NzQ1NTA3Nzk5MDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU0ODc2NzQ1NTA3Nzk5MDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fa291c2hhX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE1NzMzODY3Njg4NzU1MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE1NzMzODY3Njg4NzU1MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zZWN1cml0eSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MjQxMzgzOTQ2MTU4MDgwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MjQxMzgzOTQ2MTU4MDgwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3N5c3RlbV9zd19iYXR0ZXJ5X2xpZmVfc3lzdGVtX3Bvd2VyXyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NTEyOTU3NDkyNzU2NDgwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NTEyOTU3NDkyNzU2NDgwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2VnZ3MiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDU2ODkyOTE5ODMwOTM3NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNDU2ODkyOTE5ODMwOTM3NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9qZXJlbXltYW5zb25fdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MDk1ODY5NzQ5Mjk3MTUyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MDk1ODY5NzQ5Mjk3MTUyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2V4Y2hhbmdlX2FjdGl2ZV9zeW5jX2luX2dtYWlsIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUzODIxMjE0MzQ1MTM0MDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUzODIxMjE0MzQ1MTM0MDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1faW9zX2JhY2t1cF9yZXN0b3JlX21ha2VfcGl4ZWxfIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU3NTIxNjA4NjM0MjA0MTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU3NTIxNjA4NjM0MjA0MTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZGVwcmVjYXRlZF9sb2NhdGlvbiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MjI4MTk1NjMyMDg3MDQwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MjI4MTk1NjMyMDg3MDQwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2lucHV0X2ZyYW1ld29yayIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80OTk5NDM2MzU3MjM4Nzg0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0OTk5NDM2MzU3MjM4Nzg0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3RwbV90dmMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTM5MDY4MzMzMzIzMDU5MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTM5MDY4MzMzMzIzMDU5MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9sc2VfZGVza3RvcF9vc19leHBlcmllbmNlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxMjUyMzQ5MDA0MzQ5NDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxMjUyMzQ5MDA0MzQ5NDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9mb3JfaW5kaWFfZGV2aWNlX2V4cGVyaWVuY2VzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUzOTU0MTM2NTIxMTEzNjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUzOTU0MTM2NTIxMTEzNjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfem9tYmllIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwNzQ2NDY5MTA1MzM2MzIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUwNzQ2NDY5MTA1MzM2MzIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9vbmJvYXJkaW5nIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxNTIyNzE5NzQzNjcyMzIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxNTIyNzE5NzQzNjcyMzIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfYXVkaW8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTQzNjU0NzI2MDA4ODMyMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTQzNjU0NzI2MDA4ODMyMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9jb25uZWN0aXZpdHlfYnQiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjMyODAzNTQyMzQ1MzE4NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjMyODAzNTQyMzQ1MzE4NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93c2RfdzEyIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYzMzM3NDg3NDgzNTM1MzYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYzMzM3NDg3NDgzNTM1MzYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcW1jX212dCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NTcyODgwODc2NDcwMjcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NTcyODgwODc2NDcwMjcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3N3aXRjaF9hY2Nlc3Nfdm9pY2VfYWNjZXNzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ3OTQ0MzI0Njk0NjcxMzYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ3OTQ0MzI0Njk0NjcxMzYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbWFpbmxpbmVfbW9kdWxhcml6YXRpb24iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTg0NTA4NDE0MzM4NjYyNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTg0NTA4NDE0MzM4NjYyNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9md2tfdGVsZWNvbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MzMwOTk0MTQzODIxODI0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MzMwOTk0MTQzODIxODI0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2RlcHJlY2F0ZWRfZnJhbWV3b3JrX2FrdWxpYW4iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTMyMzIxMDg3Mjc1MDA4MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTMyMzIxMDg3Mjc1MDA4MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfaWRlbnRpdHkiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjAxNzczMjM4NjM5MDAxNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjAxNzczMjM4NjM5MDAxNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX3BkZiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTc1MTM2NDMzMDQ1NTA0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTc1MTM2NDMzMDQ1NTA0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2RldmVsb3Blcl9yZWxhdGlvbnMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTcwOTIyNjE0Mzc3Njc2OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTcwOTIyNjE0Mzc3Njc2OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zeXN0ZW1faW50ZWxsaWdlbmNlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU4NDk2NzU5OTU3MDk0NDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU4NDk2NzU5OTU3MDk0NDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbWFpbmxpbmVfdXBkYXRlcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODQ1ODEwODA5OTk1MjY0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0ODQ1ODEwODA5OTk1MjY0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX25fYV8xIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU5NDY3MjA2NTUzNzYzODQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU5NDY3MjA2NTUzNzYzODQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZ29vZ2xlX2RyaXZlX2RvY3Nfc2hlZXRzX2FuZF9zbGlkZXMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjYxMzU3NDQ1NzYyMjUyOAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjYxMzU3NDQ1NzYyMjUyOCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kZXByZWNhdGVkX2F3YXJlbmVzc19oZWFsdGhfZXhwZXJpZW5jZXMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjYyNzg2NjM5NTk2NzQ4OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjYyNzg2NjM5NTk2NzQ4OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jb250ZXh0X2luZnJhc3RydWN0dXJlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ3MDEyNjgwNDA2NDY2NTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ3MDEyNjgwNDA2NDY2NTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9tZWRpYV9zb2x1dGlvbnMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDc1MDQ1MjAwNDM1NjA5NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNDc1MDQ1MjAwNDM1NjA5NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX2RldmljZV9hbmRfaW5mcmFzdHJ1Y3R1cmUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjM1ODA2OTM2OTc5ODY1NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjM1ODA2OTM2OTc5ODY1NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9iaW9tZXRyaWNzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU3ODA4NzU3NDg3MzcwMjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU3ODA4NzU3NDg3MzcwMjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYXBwX2tub3dsZWRnZV9wbGF0Zm9ybSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MjcyMjY2MzkwNjM0NDk2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MjcyMjY2MzkwNjM0NDk2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dzZCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NjgwMDgzMjYwMTc4NDMyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NjgwMDgzMjYwMTc4NDMyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3NlZyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MDY3MTExMzUzMTU1NTg0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MDY3MTExMzUzMTU1NTg0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2RldmlubGF3c29uX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDgwNTkwMDk3MTQ0MjE3NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNDgwNTkwMDk3MTQ0MjE3NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jYW1lcmFfaGFyZHdhcmUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjA4NzQ1ODE0MzczMTcxMgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjA4NzQ1ODE0MzczMTcxMiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jYW1lcmFfaW1hZ2VfcXVhbGl0eSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NDAxMzYyODg3OTk5NDg4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NDAxMzYyODg3OTk5NDg4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfcG93ZXJfYW5kX2NvbW1zX2luZnJhIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUzMjU1NDc2NTMzMzI5OTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUzMjU1NDc2NTMzMzI5OTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcG13X3BtbyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NjU2Mjk5MjcwNTA0NDQ4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NjU2Mjk5MjcwNTA0NDQ4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2ZpbGFtZW50IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYwMzE0MjU5MTU0ODYyMDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYwMzE0MjU5MTU0ODYyMDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3lzdGVtX3N3X2JzcGNvcmUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjUwODAyMTM0MTM1NjAzMgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjUwODAyMTM0MTM1NjAzMiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9wb3dlcm1hbmFnZXJfZnJhbWV3b3JrIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxMTYxNjIxMjE1NjQxNjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxMTYxNjIxMjE1NjQxNjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl9yb21hbmVzY28iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTExMjUyMDA2MjY5NzQ3MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTExMjUyMDA2MjY5NzQ3MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kZXByZWNhdGVkX3RoZW1pbmciLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE3OTMwODE3OTg4MTk4NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE3OTMwODE3OTg4MTk4NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9yZWNvcmRlciIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MDg1MDM1MzM3MzgzOTM2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MDg1MDM1MzM3MzgzOTM2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2ZyYW1ld29ya19hY2Nlc3NpYmlsaXR5IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU0NzQ3NTExNzAwMTkzMjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU0NzQ3NTExNzAwMTkzMjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2luZG93aW5nX2luZnJhXyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NTc4NDQwNjA5NDMxNTUyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NTc4NDQwNjA5NDMxNTUyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3Btd19tY3MiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTg2NDczMzU1MDYwODM4NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTg2NDczMzU1MDYwODM4NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfc3lzdWlfY3RybF9jYXJvdXNlbF90aWxlc19yZWNlbnRzX2xhdW5jaGVyXyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODIwMTMxOTc2NzQwODY0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0ODIwMTMxOTc2NzQwODY0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl9hY2Nlc3NpYmlsaXR5X2NvbXBsaWFuY2UiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTM4MTcxOTU1MzExNDExMgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTM4MTcxOTU1MzExNDExMiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9zeXN0ZW1fc3dfcGVyZm9ybWFuY2VfdGhlcm1hbCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTQ2Mjc2MTkwMzU1NDU2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTQ2Mjc2MTkwMzU1NDU2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX25lZWxzYV90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU3MzY3NTA5NzgzMzQ3MjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU3MzY3NTA5NzgzMzQ3MjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfY2FtZXJhX2VuZ2luZWVyaW5nX2V4cGVyaWVuY2UiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE5MDI1NjY1NTQ2NjQ5NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE5MDI1NjY1NTQ2NjQ5NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9lbWJlZGRlZF93ZWJfb25fYW5kcm9pZCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MzAwNjEzMDY1NzY4OTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYzMDA2MTMwNjU3Njg5NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9nYW50cnkiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTY3NzAxOTE1Mzg1ODU2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTY3NzAxOTE1Mzg1ODU2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9zeXN0ZW1fc3dfYmF0dGVyeSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MDUyMjczNzcxNjQyODgwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MDUyMjczNzcxNjQyODgwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2VuaWdtYSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81Mzk2MzM4MzYxNTk3OTUyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1Mzk2MzM4MzYxNTk3OTUyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX2dwc19wb3dlciIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MDc1OTA3NDQ2MTc3NzkyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MDc1OTA3NDQ2MTc3NzkyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3Rvb2xfZnJhbmsiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjIwMDIwOTk3NjM2MDk2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjIwMDIwOTk3NjM2MDk2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9yZ2luZGFfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MDMxMzY3MTA1MzE0ODE2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MDMxMzY3MTA1MzE0ODE2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3N5c3RlbV9zd19zb2NfcG93ZXIiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTQwMDc3MTM1ODc4NTUzNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTQwMDc3MTM1ODc4NTUzNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX2NydW1wZXQiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE5OTcwNDQ3ODM1MTM2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE5OTcwNDQ3ODM1MTM2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93YWxscGFwZXJzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxMjU0MTEzMDYzNzMxMjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxMjU0MTEzMDYzNzMxMjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZGVwcmVjYXRlZF92b2x0YSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MzE2MTU2NTYyMzA5MTIwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MzE2MTU2NTYyMzA5MTIwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2NhbWVyYV9tYWNoaW5lX2ludGVsbGlnZW5jZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NTc4MzkwMDg1NTMzNjk2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NTc4MzkwMDg1NTMzNjk2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3NoZWVwb190ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwNjgwNjEzNzI3NDM2ODAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUwNjgwNjEzNzI3NDM2ODAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9wcm9maWxlX2V4cGVyaWVuY2VzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU5MTQ5MTk0NjI0MDQwOTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU5MTQ5MTk0NjI0MDQwOTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcmV2aWV3X3BsYXRmb3JtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU5NTI5MDU1NzQ1MTQ2ODgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU5NTI5MDU1NzQ1MTQ2ODgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYWJhcnRoX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDg1NzUyODc4Njc4MDE2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDg1NzUyODc4Njc4MDE2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV90cmVibGUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTQ1MjQ5MDE3ODY5MTA3MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTQ1MjQ5MDE3ODY5MTA3MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9qc2FzaW5vd3NraV90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyMzkyNTk3NjI3ODYzMDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyMzkyNTk3NjI3ODYzMDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fdmFhc190ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxMDY3NTQyOTY5MDU3MjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxMDY3NTQyOTY5MDU3MjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1faW50ZXJuYXRpb25hbGl6YXRpb24iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTkxMTUzNjI4MzI4NzU1MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTkxMTUzNjI4MzI4NzU1MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX3NhZmVyX2FwcHMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTk0MzE3OTAwNTAzNDQ5NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTk0MzE3OTAwNTAzNDQ5NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jb25uZWN0aXZpdHlfdGVsZW1ldHJ5IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwODQ0OTEzNDkzOTM0MDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUwODQ0OTEzNDkzOTM0MDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZXNlaWRlbF90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU0NTM5OTc3Mzg3MjEyODAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU0NTM5OTc3Mzg3MjEyODAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fdGVzdF9lbmdfaW5mcmFzdHJ1Y3R1cmUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTk4MTkwNTAyNzQ2NTIxNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTk4MTkwNTAyNzQ2NTIxNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfd2NzX25vdGlmaWNhdGlvbiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODA1ODcxNTI3NjkwMjQwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0ODA1ODcxNTI3NjkwMjQwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2tvbmtlcnNfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzUxMTQ3NzAxODk1MTY4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NzUxMTQ3NzAxODk1MTY4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX21rZWFybmV5X3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTA4MjU5MDg0NDQ1Mjg2NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTA4MjU5MDg0NDQ1Mjg2NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX2tlcm5lbCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MDE0MzM0Nzk1MDIyMzM2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MDE0MzM0Nzk1MDIyMzM2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2Nocm9tZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NDM5MzAxODY0NjIwMDMyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NDM5MzAxODY0NjIwMDMyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl9kaWFsZXJfbWVzc2FnZXMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDkwNjczMjg3ODcyNTEyMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDkwNjczMjg3ODcyNTEyMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX3R2X2VuZ3Byb2QiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTUzODA4MTE1NzE4NTUzNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTUzODA4MTE1NzE4NTUzNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9uaWNvaF90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2NjIyOTIwMDkxODkzNzYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2NjIyOTIwMDkxODkzNzYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl9hcHBzX2Vjb3N5c3RlbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80OTA4NDEzODcxODgyMjQwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0OTA4NDEzODcxODgyMjQwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2NlbGx1bGFyX3NlY3VyaXR5IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY1MjkwMDQwMTE2ODM4NDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY1MjkwMDQwMTE2ODM4NDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZGhhbG9uaV90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyMTM1NTY0OTc0NDg5NjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyMTM1NTY0OTc0NDg5NjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYXBwbGljYXRpb25zX2dvb2dsZV93aWRlXyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MTIwOTkzMjQ4Mzc4ODgwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MTIwOTkzMjQ4Mzc4ODgwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2RlZnVuY3Rfc3lzdGVtX3VpX2ludGVsbGlnZW5jZV9kZmVuZyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NTc3Mjg0NzQ4NDQzNjQ4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NTc3Mjg0NzQ4NDQzNjQ4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX29zbG8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTc3OTU5NDg4Nzk1NDQzMgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTc3OTU5NDg4Nzk1NDQzMiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9ibHVldG9vdGgiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjIyNjU0NjM2NDY0NTM3NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjIyNjU0NjM2NDY0NTM3NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9sb2NhbGl6YXRpb24iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTc1MTU1NzM0MTQ0NjE0NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTc1MTU1NzM0MTQ0NjE0NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zc2Rfc2VjdXJpdHkiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDYwODA2NTI0ODU1OTEwNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDYwODA2NTI0ODU1OTEwNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9zeXN0ZW1fc3dfdXNiIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxMDA2NDY0NTc4MDI3NTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxMDA2NDY0NTc4MDI3NTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1faGlyb3NoaV90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU3NTY1NjQ2NjIyODgzODQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU3NTY1NjQ2NjIyODgzODQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY29udGFjdHMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDczMjg1OTgxODMxMTY4MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDczMjg1OTgxODMxMTY4MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93c2RfdzIiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTk0NTA3MTM4NzkzNDcyMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTk0NTA3MTM4NzkzNDcyMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93c2RfdzUxIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2OTg3ODA3ODMzMTI4OTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2OTg3ODA3ODMzMTI4OTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZXJhaG1fdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NjY2MzQ3ODA3MzA5ODI0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NjY2MzQ3ODA3MzA5ODI0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dzZF93NTMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTg0MTE2NzUzOTEwOTg4OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTg0MTE2NzUzOTEwOTg4OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9mcmFtZXdvcmtfb3Zlcmdyb3VuZCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTM1ODMwODI5ODkxNTg0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTM1ODMwODI5ODkxNTg0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfcGVyZm9ybWFuY2VfY29uc29sZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzYxNjYyMzU1OTYzOTA0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NzYxNjYyMzU1OTYzOTA0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BhcnRuZXJfbW9kZW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjUwMjcxMDMyOTM3Njc2OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjUwMjcxMDMyOTM3Njc2OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zY2RfdG9vbCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MjI1NDQxMDI3NTU1MzI4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MjI1NDQxMDI3NTU1MzI4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2d0d19zdyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MDY5ODY1OTU3Njg3Mjk2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MDY5ODY1OTU3Njg3Mjk2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJhYmxlcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MTIyNjQyNTE1ODIwNTQ0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MTIyNjQyNTE1ODIwNTQ0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfdGV4dCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTk0MDg1NTg1Mjg5MjE2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTk0MDg1NTg1Mjg5MjE2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfaGVhbHRoIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxNzc3NzI3MDYwMDQ5OTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxNzc3NzI3MDYwMDQ5OTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd3NkX3cyMyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MTkxMzYxOTkyNTU2NTQ0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MTkxMzYxOTkyNTU2NTQ0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX2Nvbm5lY3Rpdml0eV9uZXR3b3JraW5nIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY2ODU1OTI0NjkyNDE4NTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY2ODU1OTI0NjkyNDE4NTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcHBpX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE3MTkzMzY0Njg0ODAwMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE3MTkzMzY0Njg0ODAwMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zc2RfbW1fcGVyaXBoZXJhbCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NjI0MDE5ODE4MDg2NDAwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NjI0MDE5ODE4MDg2NDAwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX25fYSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODkxMTg5NDkyNzExNDI0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0ODkxMTg5NDkyNzExNDI0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3N5c3RlbV9zd19oaWRfZHJpdmVyIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ1MzQxMzA0MjUxMDIzMzYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ1MzQxMzA0MjUxMDIzMzYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyYWJsZV9tb3Rpb25fYWxnb3JpdGhtcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81Mzk3NTUwMTk4NTg3MzkyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1Mzk3NTUwMTk4NTg3MzkyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl9zeXN1aV9ub3RpZmljYXRpb25zIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUyNTYyNTcxODMwNTU4NzIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUyNTYyNTcxODMwNTU4NzIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9jYW1lcmFfZW5ncHJvZCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NTk0MzgyODQzMjgxNDA4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NTk0MzgyODQzMjgxNDA4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2xvY2tzY3JlZW5fYW9kIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU1MDM5Nzk2NDEwMTIyMjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU1MDM5Nzk2NDEwMTIyMjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2luZG93aW5nX3NkayIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NjgzMDM3MDA4NzIzOTY4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NjgzMDM3MDA4NzIzOTY4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3N5c3RlbV9zd19pbm1hcmtldF9wb3dlciIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82Njc1ODkxMzMxMTcwMzA0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2Njc1ODkxMzMxMTcwMzA0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2JldHRlcmJ1ZyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80OTEwNDAwNjUyNjA3NDg4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0OTEwNDAwNjUyNjA3NDg4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3N5c3RlbV9zd19zZWN1cml0eSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MDMwMjc3NzEzNjI1MDg4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MDMwMjc3NzEzNjI1MDg4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX2VuZXJnaXplciIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80OTcwNjA1MjcwMzAyNzIwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0OTcwNjA1MjcwMzAyNzIwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2Z3a19jb3JlX25ldHdvcmtpbmciLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTU1OTY5MjU2MjM5OTIzMgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTU1OTY5MjU2MjM5OTIzMiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jaHJvbWl1bV93ZWJ2aWV3IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2MzAwNjEzMDY1NzY4OTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2MzAwNjEzMDY1NzY4OTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZnJhbWV3b3JrX2NkbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NzkzNzIxODg3MDMxMjk2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NzkzNzIxODg3MDMxMjk2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3N5c3RlbV93YWxsZXllXyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NjY1MjQ1Njc4NjY1NzI4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NjY1MjQ1Njc4NjY1NzI4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3N5c3RlbV9tYXJsaW5fc2FpbGZpc2hfIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ3MTM2MTgzNjQ4MjU2MDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ3MTM2MTgzNjQ4MjU2MDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcW1jIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUyMDc4NDg4NDE1MTA5MTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUyMDc4NDg4NDE1MTA5MTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF93YWxsZXRfaW50ZWdyYXRpb24iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTc4NTc3Nzk5NTE1MzQwOAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTc4NTc3Nzk5NTE1MzQwOCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9ub3JlZW50X3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTc2NjI5OTg0MzE5ODk3NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTc2NjI5OTg0MzE5ODk3NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9pbmsiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjYyMDIyNTE2MjYwODY0MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjYyMDIyNTE2MjYwODY0MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9tYWtlX3BpeGVsIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYxNDAyMzQ3MDE4NjQ5NjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYxNDAyMzQ3MDE4NjQ5NjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY2hpbGxlcnNfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NjMxNjQ3ODg3Mjk0NDY0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NjMxNjQ3ODg3Mjk0NDY0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3N5c3RlbV9leHBlcmllbmNlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwODM2MzM1MjE5NTA3MjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUwODM2MzM1MjE5NTA3MjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZGVwcmVjYXRlZF9mcmFtZXdvcmtfcm9vc2EiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjcwODA2NzA3NDk5ODI3MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjcwODA2NzA3NDk5ODI3MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9idWlsZCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NTQyMTAwMzc2MzU0ODE2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NTQyMTAwMzc2MzU0ODE2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BsYXlfc3RvcmUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDgwMzIyODU2MjQ4OTM0NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDgwMzIyODU2MjQ4OTM0NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jbG9ja3MiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjMyNzA1ODM5MTAwNzIzMgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjMyNzA1ODM5MTAwNzIzMiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hc2FmaV90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyMTc3MzUzOTk5NjQ2NzIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyMTc3MzUzOTk5NjQ2NzIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3lzdGVtX3N3X3N0b3JhZ2UiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDY0NDg5ODg4ODA4OTYwMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDY0NDg5ODg4ODA4OTYwMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9wbGF5X21vdmllcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODM4NDEyOTM0NTc4MTc2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0ODM4NDEyOTM0NTc4MTc2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3N5c3RlbV9oYW1tZXJoZWFkX2NhbWVyYV8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjU5NzYzMTUzOTAxOTc3NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjU5NzYzMTUzOTAxOTc3NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfc3lzdWlfYXBwbGljYXRpb25zIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ5Mjk4MzM0OTQ1NDQzODQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ5Mjk4MzM0OTQ1NDQzODQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3lzdGVtX3N3X3RwbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NjEyOTIyOTgxMTIyMDQ4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NjEyOTIyOTgxMTIyMDQ4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3FtY19zY3JpcHRfYXV0b21hdGlvbiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MDQ3ODY5ODk5NjY5NTA0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MDQ3ODY5ODk5NjY5NTA0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3N3X3RwbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NTA2OTE2MDA0MjY1OTg0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NTA2OTE2MDA0MjY1OTg0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2RldmljZV9hbmRfZmFjdG9yeV90cG0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDU3NDUzMDE0MzkxMTkzNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNDU3NDUzMDE0MzkxMTkzNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9wbXdfbXNzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ1MjUyNjIwMzI4OTYwMDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ1MjUyNjIwMzI4OTYwMDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX2VzaW1fYW5kX2NhcnJpZXJzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwNDUxNjgxMTM2MTQ4NDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUwNDUxNjgxMTM2MTQ4NDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9waXhlbF9jb250ZXh0X2h1YiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81Mzc1OTcwMjAwOTQ0NjQwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1Mzc1OTcwMjAwOTQ0NjQwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3NldHRpbmdfZXhwIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU3NTgwMTA5MzYyOTU0MjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU3NTgwMTA5MzYyOTU0MjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZGVmdW5jdF9zeXN0ZW1fdWlfaW50ZWxsaWdlbmNlX3ByYXZlZW5qIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY2NDg3NTg4Mjk3MTEzNjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY2NDg3NTg4Mjk3MTEzNjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc3lzdGVtX2J1bGxoZWFkXyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NTkyMTIyMzI5OTU2MzUyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NTkyMTIyMzI5OTU2MzUyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3N5c3RlbV9zd19maW5nZXJwcmludCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MzgwMTgxMjg1NTY4NTEyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MzgwMTgxMjg1NTY4NTEyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfc2RsYyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NDkyODk2NTA0MTUyMDY0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NDkyODk2NTA0MTUyMDY0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfY29yZV9ncmFwaGljc19zdGFjayIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MjYwNjI1Mzk5NjQ0MTYwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MjYwNjI1Mzk5NjQ0MTYwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FjY2Vzc2liaWxpdHlfc3dpdGNoX2FjY2VzcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MDI2ODY5MDM5ODU3NjY0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MDI2ODY5MDM5ODU3NjY0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3NxYV9tYWtlX3BpeGVsXyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NjEwODE5ODUzMDkwODE2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NjEwODE5ODUzMDkwODE2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2NvbnRyb2xzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwMDU5OTQxMDIyNTk3MTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUwMDU5OTQxMDIyNTk3MTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcmVuZGVyc2NyaXB0X25uYXBpIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY1MjcyNjI3OTQ4NDIxMTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY1MjcyNjI3OTQ4NDIxMTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fdGVzdF9pbmZyYXN0cnVjdHVyZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTMwMTg5MTE1NjU0MTQ0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTMwMTg5MTE1NjU0MTQ0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3NzZF9wZXJpcGhlcmFsIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYzMTQ1MDcyOTQ4Njc0NTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYzMTQ1MDcyOTQ4Njc0NTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZGV2aWNlX2Nvbm5lY3Rpdml0eV9leHBlcmllbmNlc19tYWtlX3BpeGVsXyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MzQ4NTg2MzI5ODY2MjQwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MzQ4NTg2MzI5ODY2MjQwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX25hbmR1bmFpcl90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ4NzQ1MDAzODQxMjkwMjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ4NzQ1MDAzODQxMjkwMjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZ29kb2ZyZWRvY190ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ4OTI1Mjg3MTAxNTYyODgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ4OTI1Mjg3MTAxNTYyODgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZ3R3X21pc2MiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjQzNzY1MjU5NzE3ODM2OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjQzNzY1MjU5NzE3ODM2OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9wZXJjZXB0aW9uX3ZpcnR1YWxpemF0aW9uIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxMzM5MzE5MjU4OTcyMTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxMzM5MzE5MjU4OTcyMTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc2FmZXR5X2Vsc19lYXJ0aHF1YWtlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY1MDg0OTgxNjUwNzE4NzIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY1MDg0OTgxNjUwNzE4NzIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1feHJfZnJhbWV3b3JrIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ3OTgwNDA1NDI0NDU1NjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ3OTgwNDA1NDI0NDU1NjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc3lzdGVtX3VpX3BsZWFzZV91c2VfYV9tb3JlX3NwZWNpZmljX3N1YnRlYW1faWZfcG9zc2libGVfIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY0MDI0NjgyMjUwODk1MzYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY0MDI0NjgyMjUwODk1MzYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9tZWRpYV9yZWxpYWJpbGl0eSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NDg5MzIzODE4MjIxNTY4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NDg5MzIzODE4MjIxNTY4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl9zZXJ2aWNlcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTQwNTY2NzU3MTc5MzkyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTQwNTY2NzU3MTc5MzkyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3FtY19wZGEiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE1NTA3MjI4MzM3NzY2NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE1NTA3MjI4MzM3NzY2NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV92c2wiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjU2MjQ0NzE2NjkzMDk0NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjU2MjQ0NzE2NjkzMDk0NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX3JlbGVhc2VfbWV0cmljcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MDE4OTI1NzU5MjAxMjgwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MDE4OTI1NzU5MjAxMjgwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3Rlc3RpbmciLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTg5MjI5NDgyOTgwMTQ3MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTg5MjI5NDgyOTgwMTQ3MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kZXByZWNhdGVkX3dhbGxldF9pbnRlZ3JhdGlvbiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81Mjg2NzI2MDQyMjg4MTI4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1Mjg2NzI2MDQyMjg4MTI4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2xlb25hcmRjaGFuX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjI2MDk5NDU3OTAwNTQ0MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjI2MDk5NDU3OTAwNTQ0MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zeXN0ZW1fcGVyZm9ybWFuY2UiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE4ODYwNzM4ODAyNDgzMgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE4ODYwNzM4ODAyNDgzMiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zeXN0ZW1fcG93ZXIiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDgyMDgyMDc0ODUzMzc2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDgyMDgyMDc0ODUzMzc2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kZXByZWNhdGVkX2dkbV9sb2NhdGlvbl9hZHNfbWFya2V0cGxhY2VzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUyNjE2MzY4MTI1NzA2MjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUyNjE2MzY4MTI1NzA2MjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3lzdGVtX3N3X2RpZ2l0YWxfa2V5IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY0NDQ4OTY3NjYwMzM5MjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY0NDQ4OTY3NjYwMzM5MjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW9zcCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODYwODU1Mzc4MDE4MzA0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0ODYwODU1Mzc4MDE4MzA0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2xhdW5jaGVyIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxMDIyOTU3MjUyNDQ0MTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxMDIyOTU3MjUyNDQ0MTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1faW1lIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYwODU4MDg4NzYyOTAwNDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYwODU4MDg4NzYyOTAwNDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fanlvdGlyYWp1X3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTcyMDk3NzE2NzI1MzUwNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTcyMDk3NzE2NzI1MzUwNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jYW1lcmEiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTcxODAyMjIzNjc5ODk3NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTcxODAyMjIzNjc5ODk3NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfYmFja3VwX3Jlc3RvcmUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDg3NTk4MjE3MTE3Njk2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDg3NTk4MjE3MTE3Njk2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfZGV2ZWxvcGVyX3dhdGNoX2ZhY2VzX2NvbXBsaWNhdGlvbnMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTYzODIxMzAzNzA5Njk2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTYzODIxMzAzNzA5Njk2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9tYWlubGluZV9yZWFjaCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzAxMzg2MDEyMDk4NTYwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NzAxMzg2MDEyMDk4NTYwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3NzZF9ic3AiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTg3NjM1MTkxMTE5ODcyMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTg3NjM1MTkxMTE5ODcyMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV91eF9kZXNpZ24iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDY3ODQzMzk5MjczNjc2OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDY3ODQzMzk5MjczNjc2OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hY2Nlc3NpYmlsaXR5X2Z3X21ha2VfcGl4ZWwiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTUyMjg1ODkyMjg2ODczNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTUyMjg1ODkyMjg2ODczNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfbWVkaWEiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTM2NTQxMTU0NTUxMzk4NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTM2NTQxMTU0NTUxMzk4NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zeXN0ZW1fYW5nbGVyXyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NTkzMjI3NjY3MDQ2NDAwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NTkzMjI3NjY3MDQ2NDAwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3N5c3RlbV9zd190b29scyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NDYwNDc1NTcyOTEyMTI4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NDYwNDc1NTcyOTEyMTI4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BsYXRmb3JtX2J1aWxkIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU3NzQ0MDM1Nzg5MjA5NjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU3NzQ0MDM1Nzg5MjA5NjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGNoaXRvb3JfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81OTYyNTc3MzE1MjY2NTYwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1OTYyNTc3MzE1MjY2NTYwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX211bHRpX2RldmljZV9wbGF0Zm9ybSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81ODUwMTUzMDkwNzExNTUyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1ODUwMTUzMDkwNzExNTUyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3NhZmV0eW5ldCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NzQ4ODAyNzM2OTE0NDMyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NzQ4ODAyNzM2OTE0NDMyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfcmVzb3VyY2VzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ2Nzg3NjcwMjA3MDM3NDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ2Nzg3NjcwMjA3MDM3NDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fam9zaGNvbm5lcl90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyMjY4MjgyNDgzODM0ODgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyMjY4MjgyNDgzODM0ODgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcW1jX2FpdCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MTc1NDE5MDczOTUzNzkyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MTc1NDE5MDczOTUzNzkyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX2dsb2JhbCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NjA5NzE0NTE2MDAwNzY4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NjA5NzE0NTE2MDAwNzY4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3FhX2F1dG9tYXRpb24iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjE1OTg3ODMwMzY3ODQ2NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjE1OTg3ODMwMzY3ODQ2NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX2dwdSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MTA1ODQ4NTY1MTA0NjQwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MTA1ODQ4NTY1MTA0NjQwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3FtY19hdGUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDgxOTE3MTQ4MTA5MjA5NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNDgxOTE3MTQ4MTA5MjA5NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9oYW5nb3V0cyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MjYzMzgwMDA0MTc1ODcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MjYzMzgwMDA0MTc1ODcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2Nyb3NzX2RldmljZV9jb250cm9sIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU4ODg2MDcxOTc3NTc0NDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU4ODg2MDcxOTc3NTc0NDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1faW50ZXJhY3Rpb25zX2ZyYW1ld29ya3MiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDc5NTEyNDAyOTQ4OTE1MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNDc5NTEyNDAyOTQ4OTE1MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kZXByZWNhdGVkX2ZyYW1ld29ya19zYW50b3Njb3Jkb24iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjA0OTI0MjUzNzk1MTIzMgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjA0OTI0MjUzNzk1MTIzMiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hdXRoZW50aWNhdGlvbiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81OTAxOTA5MzgwOTg4OTI4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1OTAxOTA5MzgwOTg4OTI4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3N0eWx1cyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81Njg1MDAzMjE4NzQ3MzkyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1Njg1MDAzMjE4NzQ3MzkyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2xpbnVzX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjIxMDAzNTEwMDg0NDAzMgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjIxMDAzNTEwMDg0NDAzMiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV92aXJ0dWFsaXphdGlvbiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTE3MTMxNTE5Nzg3MDA4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTE3MTMxNTE5Nzg3MDA4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2JpbGxzdGV2ZW5zb25fdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NjMxMDY0NzQ0ODIwNzM2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NjMxMDY0NzQ0ODIwNzM2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfc21hcnRvcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NjM3OTczMzI1NDE0NDAwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NjM3OTczMzI1NDE0NDAwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FydF9wZXJmb3JtYW5jZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MjEwNjAzNDQ2MDQyNjI0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MjEwNjAzNDQ2MDQyNjI0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3NzZCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81ODU4NzU5NzI1MTU0MzA0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1ODU4NzU5NzI1MTU0MzA0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FiY19lbmdvcHMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTI3MzU3ODkyODUwNDgzMgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTI3MzU3ODkyODUwNDgzMiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXRoZXJfYW5kcm9pZF9hcHAiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjQ5NjQxNTU2ODAwMzA3MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjQ5NjQxNTU2ODAwMzA3MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9ydWJpZGl1bV9zZGtfcnVudGltZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82Mjg2NTA4MzU1OTExNjgwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2Mjg2NTA4MzU1OTExNjgwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2JvcnRoYWt1cl90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ5NjIyNDMwNTkwMjM4NzIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ5NjIyNDMwNTkwMjM4NzIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3lzdGVtX3N3X2dyYXBoaWNzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU3OTE2NDQ5MDcxMTA0MDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU3OTE2NDQ5MDcxMTA0MDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbWFrZV9jcmVhdGl2ZV9hbmRyb2lkX2tleV9leHBlcmllbmNlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU3MTY3Mzg1MTUxNzMzNzYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU3MTY3Mzg1MTUxNzMzNzYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcG13X2wxcmYiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTMwMjkwNjkxNTY4NDM1MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTMwMjkwNjkxNTY4NDM1MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV90ZXN0X2VuZ19jb21tc19wb3dlciIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NjMyODE1OTExMTA4NjA4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NjMyODE1OTExMTA4NjA4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl9hcmNoaXRlY3R1cmVfZ3JvdXAiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTYwOTkyODA2MDIwNzEwNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTYwOTkyODA2MDIwNzEwNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfZXNpbV9jYXJyaWVycyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81OTI4MzYxNDk4OTM1Mjk2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1OTI4MzYxNDk4OTM1Mjk2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX2Nvbm5lY3Rpdml0eV9ncHMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDkyMDY2MDUzOTg5OTkwNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDkyMDY2MDUzOTg5OTkwNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hZHZlcnNhcmlhbF9jb2RlX2FpX2FyY19haV8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDg1MDIxMzY1NzY3MzcyOAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDg1MDIxMzY1NzY3MzcyOCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX2JpbmFyeV90cmFuc3BhcmVuY3kiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjU4NTM2NTI0MzAwMjg4MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjU4NTM2NTI0MzAwMjg4MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV90ZXN0X2VuZ19hdXRvbW90aXZlX3R2IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYxNTYxNzc2MjA0Njc3MTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYxNTYxNzc2MjA0Njc3MTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fdGdvc3NlbGFhcl90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ4OTc2MzgwNzcwNzEzNjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ4OTc2MzgwNzcwNzEzNjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfY29ubmVjdGl2aXR5X3dpZmkiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDc3NjIxOTMxMzM0MDQxNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNDc3NjIxOTMxMzM0MDQxNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zZXR1cF93aXphcmQiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTQxNzMwNTgwNjYwMjI0MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTQxNzMwNTgwNjYwMjI0MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zZWN1cml0eV92YWxpZGF0aW9uX2VuZ2luZWVyaW5nX3N2ZV8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTg1MDk0MzA1MDkwNzY0OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTg1MDk0MzA1MDkwNzY0OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93c2RfZnVuY3Rpb24iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjY1MDQwODA5NzE1MzAyNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjY1MDQwODA5NzE1MzAyNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9wbGF0Zm9ybV9wcm9kdWN0X21ncnMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjQ4MzI4MjMyOTczMTA3MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjQ4MzI4MjMyOTczMTA3MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9wYXJ0bmVyX3RlbGVwaG9ueSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzY3ODgyMTIwMjY1NzI4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NzY3ODgyMTIwMjY1NzI4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2Nyam9obnNfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODA0MTAxNDczOTkyNzA0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0ODA0MTAxNDczOTkyNzA0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dzZF9pbXMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjA1MDYyNDUwNDIwMTIxNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjA1MDYyNDUwNDIwMTIxNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfd2VhdGhlciIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NDY0MTY0NDE5OTI4MDY0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NDY0MTY0NDE5OTI4MDY0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2d1cHRhcml0dV90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxNDI2Nzk2MjQ3Nzc3MjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxNDI2Nzk2MjQ3Nzc3MjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX2RldmVsb3Blcl90b29scyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MjI4OTE1ODc4MDAyNjg4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MjI4OTE1ODc4MDAyNjg4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BsYXlfYm9va3MiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTc2OTE0OTUyNzQ5MDU2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTc2OTE0OTUyNzQ5MDU2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9tZWxpc3NhZGFuaWVsc190ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU3MTUxMTI5MjYyODE3MjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU3MTUxMTI5MjYyODE3MjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl9zaGFyZWRfY29udGV4dF9zdGF0ZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MzI5MTA3MzQ0NTg4ODAwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MzI5MTA3MzQ0NTg4ODAwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX21vdGlvbiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MzMxMzUxMjY5Mjc3Njk2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MzMxMzUxMjY5Mjc3Njk2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2dwcF9vbl9kZXZpY2UiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE4MTk2MTUwNDk4MDk5MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE4MTk2MTUwNDk4MDk5MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX3NldHRpbmdzX2FwcCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MjA0NDAwODg0MTU0MzY4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MjA0NDAwODg0MTU0MzY4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2wxX2lubWFya2V0IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxNzI4NDY0NTA3MzcxNTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxNzI4NDY0NTA3MzcxNTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyZmxvdyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81OTQ3MjUwNDI5NTU4Nzg0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1OTQ3MjUwNDI5NTU4Nzg0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2VudGVycHJpc2UiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTM2NjE3ODUxNTkxMDY1NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTM2NjE3ODUxNTkxMDY1NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kZXByZWNhdGVkX2ZyYW1ld29ya19taWNoYWVsd3IiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDU3NDI3NzEyNDkxNTIwMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDU3NDI3NzEyNDkxNTIwMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jb2xvciIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MzA1MjA4MDg2NzI0NjA4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MzA1MjA4MDg2NzI0NjA4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX29zYm9ybmNfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MzE5NTA0NjUwMDQzMzkyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MzE5NTA0NjUwMDQzMzkyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2RpYWxlciIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NTk1OTgyMjcxNTc4MTEyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NTk1OTgyMjcxNTc4MTEyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2ZyYW1ld29ya19icG0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTQ5ODExOTkxMTI0Mzc3NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTQ5ODExOTkxMTI0Mzc3NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93c2RfY29yZV90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY2ODM5NDMyMDE4MDAxOTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY2ODM5NDMyMDE4MDAxOTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfY29ubmVjdGl2aXR5X3JpbCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80OTk1MDkzMzQxNTM2MjU2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0OTk1MDkzMzQxNTM2MjU2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BlcmZldHRvIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ3ODM5ODcxMDkwMDMyNjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ3ODM5ODcxMDkwMDMyNjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGFydG5lcl9kZXZyZWwiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDUzNzY5NjUwNDM4MTQ0MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDUzNzY5NjUwNDM4MTQ0MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9md2tfdGhyZWFkX25ldHdvcmsiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTA5NDY4NTc3NTEzNDcyMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTA5NDY4NTc3NTEzNDcyMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV90aGF0Z3V5X3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTY4ODM2OTc3NTU0MjI3MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTY4ODM2OTc3NTU0MjI3MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9maW5kZXIiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjQ5MjgzMTAyNTM2NDk5MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjQ5MjgzMTAyNTM2NDk5MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9ib290X3RpbWUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjAxNzA4OTM5OTU1NDA0OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjAxNzA4OTM5OTU1NDA0OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3djc19iZXRvIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ5MTA5NDU0MzYzMzYxMjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ5MTA5NDU0MzYzMzYxMjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcmVzcG9uc2libGVfYXBpcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NjUxOTYyODU0MTc4ODE2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NjUxOTYyODU0MTc4ODE2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3N5c3RlbV9zd19jb3JlYnNwIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ2MjY2NzM2OTk1NTMyODAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ2MjY2NzM2OTk1NTMyODAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZWR1Y2F0aW9uIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ4ODk1NDAyMjUyNjk3NjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ4ODk1NDAyMjUyNjk3NjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYWxhcm1fY2xvY2siLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjE5MzAxMTI1OTk5ODIwOAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjE5MzAxMTI1OTk5ODIwOCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9wbXdfdHZjIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ1MjYyODg3NjQ5NjA3NjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ1MjYyODg3NjQ5NjA3NjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZGVwcmVjYXRlZF9waXhlbF93aWZpIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU3NDE0MDU0MTM5MDAyODgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU3NDE0MDU0MTM5MDAyODgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYWJkdWxsYV90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyMjM1ODUxNDU0MjE4MjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyMjM1ODUxNDU0MjE4MjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1faGFyZHdhcmUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTM1NzM4MjQyMjg4ODQ0OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTM1NzM4MjQyMjg4ODQ0OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zdGF0dXNfYmFyIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYzMjk1MTYwNDMxNzM4ODgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYzMjk1MTYwNDMxNzM4ODgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX3N5c3VpX2JpZ19waWN0dXJlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwODEzNTY3MTk1MjE3OTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUwODEzNTY3MTk1MjE3OTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl9tYXRlcmlhbF9kZXNpZ25fZm9yX3dlYXJvcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NzkyOTQyMzMzOTUyMDAwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NzkyOTQyMzMzOTUyMDAwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BsYXRmb3JtX3NlY3VyaXR5IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUyNDMwMzMyMTM1OTk3NDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUyNDMwMzMyMTM1OTk3NDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbGx2bV9hbmRfdG9vbGNoYWlucyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81OTkwNzAxMTIwNDg3NDI0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1OTkwNzAxMTIwNDg3NDI0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2ptY2NhbmRsZXNzX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTIyNzc5NDIyNjM4MDgwMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTIyNzc5NDIyNjM4MDgwMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zYWZldHlfY2VudGVyIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU5MzAyNzM4NDM2MDk2MDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU5MzAyNzM4NDM2MDk2MDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX3N5c3RlbXNfZW5naW5lZXJpbmdfYW5kX2RldmljZXMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTQwNzg0NzI5ODc5MzQ3MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTQwNzg0NzI5ODc5MzQ3MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9mcmFtZXdvcmtfYW5kcm9pZF9tdWx0aXVzZXIiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTk4MTUyNTczMjM5Mjk2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTk4MTUyNTczMjM5Mjk2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kZXByZWNhdGVkX3Rlc3QyIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ1OTA5NTg2OTAwNzQ2MjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ1OTA5NTg2OTAwNzQ2MjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcW1jX2lxdF90cGUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjY2ODAwMDI4MzE5NzQ0MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjY2ODAwMDI4MzE5NzQ0MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9zeXN0ZW1fc3dfZmFjdG9yeSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MjY3MDMyNTczNzM5MDA4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MjY3MDMyNTczNzM5MDA4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2F1dG9tb3RpdmUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTc3MDc5ODc5NDkzMjIyNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTc3MDc5ODc5NDkzMjIyNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hYW9zX2Rpc3BsYXlfc2FmZXR5X3RyaWFnZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NTIyMDkzNjYzNzgwODY0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NTIyMDkzNjYzNzgwODY0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2NhbWVyYV9odGNfbGdfcXVhbGNvbW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjMzMjA5OTQ4MDkxMTg3MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjMzMjA5OTQ4MDkxMTg3MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9ya3Bfa2V5c3RvcmUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTYzNDMwNDM3NDUwNTQ3MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTYzNDMwNDM3NDUwNTQ3MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfd2F0Y2hfZmFjZXMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTg4NTcwODE5NTQ5NTkzNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTg4NTcwODE5NTQ5NTkzNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hcmNfYXBwX2NvbXBhdCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODExODk0NDQxMjc5NDg4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0ODExODk0NDQxMjc5NDg4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3Bzb2huX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDg1MjY3Mzk0NzAwOTAyNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDg1MjY3Mzk0NzAwOTAyNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9ob2xsYW5kZV90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUzNTY1MzMxODY3MjM4NDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUzNTY1MzMxODY3MjM4NDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX3BhcnRuZXJfcHJvZ3JhbXNfYW5kX2VuZ2luZWVyaW5nX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDkzNDk5NzU3MTk2MDgzMgorICAgIHRyZW5keV90ZWFtX2lkOiAiNDkzNDk5NzU3MTk2MDgzMiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9jb25uZWN0aXZpdHlfbmZjIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2MzEyNzIwNTE5NjU5NTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2MzEyNzIwNTE5NjU5NTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX2lvc19jb25uZWN0aXZpdHkiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDcwMjQ1NTY0NDE5Mjc2OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDcwMjQ1NTY0NDE5Mjc2OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hcmNfIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ1NTY5Mzc5NTc4Njc1MjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ1NTY5Mzc5NTc4Njc1MjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9vbmUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjI3MjE3NjA5NzE5ODA4MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjI3MjE3NjA5NzE5ODA4MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jY2hlcnViaW5vX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDg0NjQ3MTE5MjE1MDAxNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNDg0NjQ3MTE5MjE1MDAxNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kZXByZWNhdGVkX2JsdWV0b290aF9hbmRfbmZjIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUyNTkyODA4NTE0MzU1MjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUyNTkyODA4NTE0MzU1MjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fdGVzdF9lbmdfYWZ3X2F1dGhfbG9jYXRpb25fY2FtZXJhX21lZGlhIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyOTg1NjQzNzYyNjQ3MDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyOTg1NjQzNzYyNjQ3MDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZnJvdXNzZWF1X3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTcxODI5NjQzNjU3MjE2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTcxODI5NjQzNjU3MjE2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9zeXN0ZW1fc3dfdG91Y2hfaGFwdGljIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY0NjkyNjQzMzAwOTY2NDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY0NjkyNjQzMzAwOTY2NDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGFydG5lcl9lbmciLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE3MjY2NDQ2OTQyMjA4MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE3MjY2NDQ2OTQyMjA4MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kb2dmb29kZXJzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ2NDMyNDk2MjA2NDc5MzYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ2NDMyNDk2MjA2NDc5MzYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc3lzdGVtX2V4dGVybmFsXyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NTU4MDQzMjk0OTU3NTY4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NTU4MDQzMjk0OTU3NTY4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2ZvdW5kYXRpb25zIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyMTYyNTA5NTI2Nzk0MjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyMTYyNTA5NTI2Nzk0MjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY2FtZXJhX2ZyYW1ld29yayIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NDU1MjQ0NzgzMjIyNzg0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NDU1MjQ0NzgzMjIyNzg0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2J1Z2p1Z2dsZXIiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjQ3MjgzNjk2OTI2NzIwMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjQ3MjgzNjk2OTI2NzIwMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jbGlnaF90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyNzM3Nzg0NTUzMTQ0MzIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyNzM3Nzg0NTUzMTQ0MzIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF90ZXN0aW5nX2V4cGVyaWVuY2VzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2NTMxMzcwNTYzNjY1OTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2NTMxMzcwNTYzNjY1OTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZHgiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTY3Nzk3NzE2ODI4MTYwMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTY3Nzk3NzE2ODI4MTYwMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9mcmFtZXdvcmtfYmFja3N0YWdlX3Bvd2VyIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYzMTQwNjY5NjQyODMzOTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYzMTQwNjY5NjQyODMzOTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcmxiX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTIwNjg1ODg3ODA1ODQ5NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTIwNjg1ODg3ODA1ODQ5NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9zeXN0ZW1fc3dfcHRzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU1NTM3MjU2NjM1MTA1MjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU1NTM3MjU2NjM1MTA1MjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fa2Vpcl90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU3MzE3MDAwODk5Nzg4ODAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU3MzE3MDAwODk5Nzg4ODAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fc3lzdGVtX3RhaW1lbl8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjQyMTcwOTY3ODU3NTYxNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjQyMTcwOTY3ODU3NTYxNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zZWN1cml0eV9yZXNwb25zZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MDMxOTI2OTgxMDY2NzUyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MDMxOTI2OTgxMDY2NzUyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3ByZWxvYWRfc2FmZXR5IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ1ODQ2MDk1ODA3NDQ3MDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ1ODQ2MDk1ODA3NDQ3MDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfY3VzdG9taXphdGlvbnNfbWFrZV8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTE1NTY0MzgzNjM2Njg0OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTE1NTY0MzgzNjM2Njg0OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV90b29sdG9waWEiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTQ1NjQ3Mjg4MzEwMTY5NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTQ1NjQ3Mjg4MzEwMTY5NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hY2Nlc3NpYmlsaXR5X2xpdmVfdHJhbnNjcmliZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82Mjk5Njk1NjQyMzQ1NDcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI2Mjk5Njk1NjQyMzQ1NDcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3RydXN0eSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTA5MzE5NTQ5NjE2MTI4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTA5MzE5NTQ5NjE2MTI4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FtYXRoZXNfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTU3NzE1ODYyMjU3NjY0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MTU3NzE1ODYyMjU3NjY0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl9kZXZlbG9wZXJfYW5kcm9pZF9kZXZyZWxfIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU4NjE4MjA1OTQwMjg1NDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU4NjE4MjA1OTQwMjg1NDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fb3ZlcnZpZXciLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTA3MTc5MDU3NTU1MDQ2NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTA3MTc5MDU3NTU1MDQ2NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX3NlbnNvcnMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDc3NjM3MTA5MDI1OTk2OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDc3NjM3MTA5MDI1OTk2OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV91aV90b29sa2l0IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2Mzg4NTczOTk1OTkxMDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2Mzg4NTczOTk1OTkxMDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZ2VzdHVyZV9uYXYiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjMwNDQwNTM5MTMxMDg0OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjMwNDQwNTM5MTMxMDg0OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9xbWNfd2lmaV9zdG9yYWdlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ5MjQ3MjQ1OTczNTg1OTIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ5MjQ3MjQ1OTczNTg1OTIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd3NkX3cxMSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81OTI5MTI4NDY5MzMxOTY4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1OTI5MTI4NDY5MzMxOTY4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2ZzYW11ZWxfdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzUzNTE0NDk3MzEwNzIwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NzUzNTE0NDk3MzEwNzIwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX2hhcHRpYyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81OTE5MDEzMDAzNDkzMzc2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1OTE5MDEzMDAzNDkzMzc2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3JldGVudGlvbiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NjQ3OTg1MjkwODA1MjQ4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NjQ3OTg1MjkwODA1MjQ4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX29uYm9hcmRpbmciLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTUzMTM0MDgxMTk2MDMyMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTUzMTM0MDgxMTk2MDMyMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93c2Rfc3RhbmRhcmQiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjI5NjkxNTEwODgyMzA0MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjI5NjkxNTEwODgyMzA0MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hcnRfbWFpbmxpbmUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTczMzk2NTE1NTQwMTcyOAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTczMzk2NTE1NTQwMTcyOCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zaGFkZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NjQ2NzE1MTcwMjI2MTc2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NjQ2NzE1MTcwMjI2MTc2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2djaGlwc19jb21wdXRlX3N3IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyNDU3ODc4MTgxMzE0NTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyNDU3ODc4MTgxMzE0NTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1faGFwdGljc19mcmFtZXdvcmsiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTg5NTQzODUwOTQ0MTAyNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTg5NTQzODUwOTQ0MTAyNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hY2Nlc3NpYmlsaXR5X2JyYWlsbGUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDk5MjUzMDIwNTkzMzU2OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDk5MjUzMDIwNTkzMzU2OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9xbWNfdXRkIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU1MjQ1MDgxOTAzMTA0MDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU1MjQ1MDgxOTAzMTA0MDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9vbiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NTM5MzQ1NzcxODIzMTA0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NTM5MzQ1NzcxODIzMTA0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2ZpdCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NjI4NDEyMDM5MTM1MjMyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NjI4NDEyMDM5MTM1MjMyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2Z3a191d2IiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTk4MzczMzQwODIzNTUyMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTk4MzczMzQwODIzNTUyMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9haWRyb2lkIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ2OTc2NzU0NDYyMjI4NDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ2OTc2NzU0NDYyMjI4NDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZGVwcmVjYXRlZF90ZXN0MSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MjEyNzUyNDY3NDYwMDk2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MjEyNzUyNDY3NDYwMDk2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl9yZWxlYXNlc190ZWxlbWV0cnlfYW5kX2FuYWx5dGljcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81ODkyMDU3Mjk4MDEwMTEyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1ODkyMDU3Mjk4MDEwMTEyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2NvbnRleHRfaHViIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwODA3MDQ0Njc1MDEwNTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUwODA3MDQ0Njc1MDEwNTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY2Fycmllcl9mb2xsb3dfdXAiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjYxNTIyMzcyNTA2NDE5MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjYxNTIyMzcyNTA2NDE5MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hY2Nlc3NpYmlsaXR5X2xpdmVfY2FwdGlvbiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80NzY0NTI5NjY1NDA5MDI0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0NzY0NTI5NjY1NDA5MDI0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3N5c3RlbV9zd19kaXNwbGF5IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyNjE3MzA3MzY3MzQyMDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyNjE3MzA3MzY3MzQyMDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZm91bmRhdGlvbl9zZWN1cml0eV9ydXN0X3Brdm1fIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwNzEzNTQ0MjEwODQxNjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUwNzEzNTQ0MjEwODQxNjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfcmVwYWlyX21vZGUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjA4Mzc3NTg2NzgxMzg4OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjA4Mzc3NTg2NzgxMzg4OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jYXB0dXJlX2FuZF9zaGFyZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NjQ0NTIzNzQ2Nzg3MzI4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NjQ0NTIzNzQ2Nzg3MzI4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2tlZXAiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTgzOTUxODI3MTY2ODIyNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTgzOTUxODI3MTY2ODIyNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hYW9zX3NlY3VyaXR5IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyNjQzOTQzNjMwNzY2MDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYyNjQzOTQzNjMwNzY2MDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1femVyb19qYW5rIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ3NjQ4NzQxMzM4OTcyMTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ3NjQ4NzQxMzM4OTcyMTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF91bmlmaWVkX2NvcmVfaW5mcmFzdHJ1Y3R1cmUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTg0MjE3Mjk2MTkxNDg4MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTg0MjE3Mjk2MTkxNDg4MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX21lZGlhX2NvZGVjX2ZyYW1ld29yayIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80OTQzOTY2MDUwODQ0NjcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0OTQzOTY2MDUwODQ0NjcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3N5c3RlbV9nbl8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDc4NTYzNjM3NjQ0NDkyOAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDc4NTYzNjM3NjQ0NDkyOCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kZXByZWNhdGVkX2FuZHJvaWRfYXV0aF9jbGllbnQiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTQ3MTczMTYzMjE3NzE1MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTQ3MTczMTYzMjE3NzE1MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfaW9zX2NvbXBhbmlvbl9zZGsiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTczNzA0NDg2NTA4OTUzNgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTczNzA0NDg2NTA4OTUzNiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9uZWFyYnkiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDk1OTkwODk2OTQ0NzQyNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDk1OTkwODk2OTQ0NzQyNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jYW1lcmF4X21ha2VfcGl4ZWxfIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ1MjE3NTM1ODU3Nzg2ODgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ1MjE3NTM1ODU3Nzg2ODgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX2hlYWx0aF9zZXJ2aWNlcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NTI2MTgyNjg2MDk3NDA4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NTI2MTgyNjg2MDk3NDA4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX21lZGlhX3ZvbHVtZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MzYwMTQyMDcwODQxMzQ0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MzYwMTQyMDcwODQxMzQ0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2xhcmdlX3NjcmVlbl9leHBlcmllbmNlc19zeXN1aSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81ODU1MjE0MTMwMDY5NTA0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1ODU1MjE0MTMwMDY5NTA0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX21haW5saW5lX2VuZ3Byb2QiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTQ3NDYzNDc4OTg0NzA0MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTQ3NDYzNDc4OTg0NzA0MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfcG93ZXJfZm91bmRhdGlvbnMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjI5MjkwOTE5NjIxNDI3MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNjI5MjkwOTE5NjIxNDI3MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93aW5kb3dpbmdfdG9vbHMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjM4Mjc3ODM4MjE4ODU0NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjM4Mjc3ODM4MjE4ODU0NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX2ZyYW1ld29ya19hcHBjb21wYXQiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTM4Mzc3MDcwMTk1NTA3MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTM4Mzc3MDcwMTk1NTA3MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9maXRiaXQiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjQ5Nzg4NTMyNzM2MDAwMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjQ5Nzg4NTMyNzM2MDAwMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9vdmVyZHJpdmUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDk2MTU1ODIzNjg4OTA4OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDk2MTU1ODIzNjg4OTA4OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9mcmFtZXdvcmtfYW5kcm9pZF9wYWNrYWdlcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81OTg5NzYyNDA3MTA0NTEyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1OTg5NzYyNDA3MTA0NTEyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3RraWxib3Vybl90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ4NTY2NDY3MDc4NzE3NDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ4NTY2NDY3MDc4NzE3NDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbGFyZ2Vfc2NyZWVuX2V4cGVyaWVuY2VzX3BsYXRmb3JtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ4MjY0NjI5MzczMTczNzYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ4MjY0NjI5MzczMTczNzYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3lzdGVtX3NlcnZpY2UiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTgwMjY0Mzc5MDEzNTI5NgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTgwMjY0Mzc5MDEzNTI5NiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX2RldmVsb3Blcl90b29scyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MjAxODA3MzUzMDIwNDE2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MjAxODA3MzUzMDIwNDE2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2F1dG9maWxsIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ2NzYyMDM0NjAzMjk0NzIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ2NzYyMDM0NjAzMjk0NzIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd3NkX3c1IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ2MjczMDY3MDIwNDUxODQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ2MjczMDY3MDIwNDUxODQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX3hmb29kX3h3ZWFyX2FuZF9sb2dpc3RpY3MiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjU5OTA4OTMxMTM1MDc4NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjU5OTA4OTMxMTM1MDc4NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX21lZGlhX2RybSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MzExNzUyNjkwMzM1NzQ0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MzExNzUyNjkwMzM1NzQ0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX25zeWx2YWluX3RlYW0iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTEyOTA2Mjg5MzkxMjA2NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTEyOTA2Mjg5MzkxMjA2NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9md2tfd2lmaV9oYWwiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTQ3MDA4MjM2NDczNTQ4OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTQ3MDA4MjM2NDczNTQ4OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV90b21iZXJnYW5fdGVhbSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzY0MDMxMTk0NDk3MDI0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NzY0MDMxMTk0NDk3MDI0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl9wbGF0Zm9ybV9wcm9ncmFtX3BhcnRuZXJfZW5nXyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NDcyMjYxMDcwODE1MjMyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NDcyMjYxMDcwODE1MjMyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX21hc2RfcGl4ZWxfa2V5X2V4cGVyaWVuY2VzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ4NzM1OTczMDY2NjcwMDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ4NzM1OTczMDY2NjcwMDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZXh0ZXJuYWwiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjAzMzAzMjMxODE1NjgwMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjAzMzAzMjMxODE1NjgwMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9md2tfdGVsZXBob255IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2NjM1OTY0MTEyMjQwNjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2NjM1OTY0MTEyMjQwNjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fY3VzdG9taXphdGlvbl9waWNrZXIiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjMxMTE0MjE3MzA4MTYwMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjMxMTE0MjE3MzA4MTYwMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX3Rlc3Rfc3VyZmFjZXMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDg3OTE0OTY1MTA5OTY0OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDg3OTE0OTY1MTA5OTY0OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9pbnN0YW50X2FwcHMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjcyMDc3Njg0MTMzMDY4OAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjcyMDc3Njg0MTMzMDY4OCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hY2Nlc3NpYmlsaXR5X2FhcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MDQzMTk4MjI4Mjk5Nzc2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MDQzMTk4MjI4Mjk5Nzc2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfZW5ncHJvZF9sb24iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTQzMjI0MzE2Mzc5MTM2MAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTQzMjI0MzE2Mzc5MTM2MCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9wbXdfbWNlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY0MjQ3MjM4Njg5MDk1NjgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY0MjQ3MjM4Njg5MDk1NjgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3lzdGVtX3N3X2tlcm5lbCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NDM2ODAyNzExODQ2OTEyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NDM2ODAyNzExODQ2OTEyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX25nYSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NTk0ODc2OTM0NDg4MDY0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1NTk0ODc2OTM0NDg4MDY0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYl9vbl9hbmRyb2lkX3BlcmZvcm1hbmNlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU4NjQ4NTE3NDg4NDc2MTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU4NjQ4NTE3NDg4NDc2MTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcmV2ZW1hbl90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxMTMyNzQwNTcyNjEwNTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxMTMyNzQwNTcyNjEwNTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fdGVzdF9lbmdfb3RhX2ZyYW1ld29ya19zeXN1aV9zdXdfYWJ2dF9jdHMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDY1MzY5NDk4MTExMTgwOAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDY1MzY5NDk4MTExMTgwOCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9iYWNrdXBfcmVzdG9yZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MDQ5NTE5MTY3MTExMTY4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MDQ5NTE5MTY3MTExMTY4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3N5c3RlbV9zd19icmluZ3VwX2FuZF9mYWN0b3J5IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU5OTk3NTI2NjUyNjgyMjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU5OTk3NTI2NjUyNjgyMjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX2NhbGxpbmdfbWVzc2FnaW5nIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU0MDEyNzQ4MDc2NDgyNTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU0MDEyNzQ4MDc2NDgyNTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9pbWFnaW5nIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU4Mzg1MzgxMTMzODQ0NDgKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU4Mzg1MzgxMTMzODQ0NDgiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfc3lzdGVtX3N3X3NlbnNvciIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80OTA0NDE3NTU3NjQzMjY0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0OTA0NDE3NTU3NjQzMjY0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2RvZ2Zvb2RfdHJpYWdlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxMzA4MjM5ODEyMzYyMjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxMzA4MjM5ODEyMzYyMjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1faW5wdXRfbWV0aG9kX2ZyYW1ld29yayIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82Mzk0MjAxNzcwNDU5MTM2CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2Mzk0MjAxNzcwNDU5MTM2IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl9wbGF0Zm9ybV9kZXZfbGVhZF9kZXZpY2VfcHJvZ3JhbV8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDY0MjM5MzE5NDEzNTU1MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNDY0MjM5MzE5NDEzNTU1MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX2JvbmFfY29tcGFuaW9uIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ3MjE5MzI3ODQwMDkyMTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ3MjE5MzI3ODQwMDkyMTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX2NvbXBvc2UiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDk1ODQwNDI3MTMwODgwMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNDk1ODQwNDI3MTMwODgwMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zeXN0ZW1fZnVndV8iLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTY4MjgzNzg2NDcxMDE0NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTY4MjgzNzg2NDcxMDE0NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV90dm9sa2VydF90ZWFtIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwOTMwMTQ2OTY1MjU4MjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUwOTMwMTQ2OTY1MjU4MjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fbWVkaWFfZnJhbWV3b3JrX2RybSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MzExNzUyNjkwMzM1NzQ0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MzExNzUyNjkwMzM1NzQ0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX21lZGlhX2ZyYW1ld29ya19hdWRpbyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81ODIzNTc1MzUzMDY1NDcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1ODIzNTc1MzUzMDY1NDcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX3BpeGVsX3BlYXJsIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYzMjYyMTk2MDIyMzEyOTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYzMjYyMTk2MDIyMzEyOTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYXJfc2Vuc29yc19jb250ZXh0X2h1YiIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80Nzc2MzcxMDkwMjU5OTY4CisgICAgdHJlbmR5X3RlYW1faWQ6ICI0Nzc2MzcxMDkwMjU5OTY4IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX21lZGlhX2NvZGVjX2ZyYW1ld29yayIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80OTQzOTY2MDUwODQ0NjcyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI0OTQzOTY2MDUwODQ0NjcyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfcGxhdGZvcm1fcGVyZm9ybWFuY2VfdGVzdGluZyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81ODEwMDk3ODM2NjIxODI0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI1ODEwMDk3ODM2NjIxODI0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FkdGUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTU1MTA5ODUyODgyNTM0NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTU1MTA5ODUyODgyNTM0NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9pbmNyZW1lbnRhbCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81OTU1NDA1NTU5MjAxNzkyCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1OTU1NDA1NTU5MjAxNzkyIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfbWVkaWFfYmV0dGVyX3RvZ2V0aGVyIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU2MTczMDA0NTE3MjEyMTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU2MTczMDA0NTE3MjEyMTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYXR0YWNrX3Rvb2xzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzQ3MDU2MjkxODUwODEzNDQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjQ3MDU2MjkxODUwODEzNDQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9tZWRpYV9zb2x1dGlvbnNfZWRpdGluZyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MzUwNzUwMTkyNzYyODgwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MzUwNzUwMTkyNzYyODgwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfbWVkaWFfc29sdXRpb25zX3BsYXliYWNrIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY3NDI1MTUyNTI1NTk4NzIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY3NDI1MTUyNTI1NTk4NzIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF90ZWxlbWV0cnlfY2xpZW50X2luZnJhIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU0MDMyNDUwNzc0MzAyNzIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU0MDMyNDUwNzc0MzAyNzIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcHRlX3N5c3VpIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxODU4OTc0NjMzODIwMTYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxODU4OTc0NjMzODIwMTYiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcGl4ZWxfdHJvdWJsZXNob290aW5nX2FwcCIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MDk3MDAzNzQ2NDI2ODgwCisgICAgdHJlbmR5X3RlYW1faWQ6ICI1MDk3MDAzNzQ2NDI2ODgwIiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2Rlc2t0b3BfZmlybXdhcmUiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTc4NzkzODQ1NDg2Mzg3MgorICAgIHRyZW5keV90ZWFtX2lkOiAiNTc4NzkzODQ1NDg2Mzg3MiIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hcnRfY2xvdWQiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTEyMTQ0MDY0NzU3NzYwMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTEyMTQ0MDY0NzU3NzYwMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9yYXZlbndvb2QiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjAyNzE4MTUwMDQ5NzkyMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjAyNzE4MTUwMDQ5NzkyMCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hdXRvbW90aXZlX2Nhc3QiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTI5MzY4MzAyNjI2NDA2NAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTI5MzY4MzAyNjI2NDA2NCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3N0YW5kYWxvbmVfa2lkcyIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82MzAzMjk4NzAzOTQ5ODI0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2MzAzMjk4NzAzOTQ5ODI0IiwKK30KKwordGVhbSB7CisgICAgbmFtZTogInRyZW5keV90ZWFtX2Rlc2t0b3Bfc3RhdHMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTQ0MDc2NDExNDIwNjcyMAorICAgIHRyZW5keV90ZWFtX2lkOiAiNTQ0MDc2NDExNDIwNjcyMCIsCit9CisKKy8vIERPTidUIEFERCBORVcgUlVMRVMgSEVSRS4gRm9yIG1vcmUgZGV0YWlscyByZWZlciB0bworLy8gZ28vbmV3LWFuZHJvaWQtb3duZXJzaGlwLW1vZGVsCmRpZmYgLS1naXQgYS90ZWFtcy9PV05FUlMgYi90ZWFtcy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVlNjlmMwotLS0gL2Rldi9udWxsCisrKyBiL3RlYW1zL09XTkVSUwpAQCAtMCwwICsxLDMgQEAKK2RhcmlvZnJlbmlAZ29vZ2xlLmNvbQorcm9uaXNoQGdvb2dsZS5jb20KK2NhZGl0eWFAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvdGVzdHMvYl90ZXN0cy5zaCBiL3Rlc3RzL2JfdGVzdHMuc2gKaW5kZXggNDkxZDc2Mi4uNjhhMTNlMyAxMDA3NTUKLS0tIGEvdGVzdHMvYl90ZXN0cy5zaAorKysgYi90ZXN0cy9iX3Rlc3RzLnNoCkBAIC0yMyw2ICsyMywxMCBAQAogCiB0ZXN0X3RhcmdldD0vL2J1aWxkL2JhemVsL3NjcmlwdHMvZGlmZnRvb2w6ZGlmZnRvb2wKIAoraWYgYiBidWlsZCAvL2J1aWxkL2JhemVsOm5vbmV4aXN0ZW50X21vZHVsZSAmPi9kZXYvbnVsbCA7IHRoZW4KKyAgICBlY2hvICJiIGRpZCBub3QgZmFpbCB3aGVuIGJ1aWxkaW5nIGEgbm9uZXhpc3RlbnQgbW9kdWxlIiA+JjIKKyAgICBleGl0IDEKK2ZpCiBiIGJ1aWxkICIkdGVzdF90YXJnZXQiCiBiIGJ1aWxkIC0tICIkdGVzdF90YXJnZXQiCiBiIGJ1aWxkICIkdGVzdF90YXJnZXQiIC0tcnVuLXNvb25nLXRlc3RzCmRpZmYgLS1naXQgYS90ZXN0cy9sdW5jaF90ZXN0cy5zaCBiL3Rlc3RzL2x1bmNoX3Rlc3RzLnNoCmluZGV4IDQyODVkMTMuLjliMTQyZWUgMTAwNzU1Ci0tLSBhL3Rlc3RzL2x1bmNoX3Rlc3RzLnNoCisrKyBiL3Rlc3RzL2x1bmNoX3Rlc3RzLnNoCkBAIC0yOCw3ICsyOCw3IEBACiAgICAgWyAiJFRBUkdFVF9QTEFURk9STV9WRVJTSU9OIiA9ICIkNCIgXSB8fCAoIGVjaG8gImx1bmNoICQxOiBleHBlY3RlZCBUQVJHRVRfUExBVEZPUk1fVkVSU0lPTj0nJDQnLCBnb3QgJyRUQVJHRVRfUExBVEZPUk1fVkVSU0lPTiciICYmIGV4aXQgMSApCiApCiAKLWRlZmF1bHRfdmVyc2lvbj0kKGdldF9idWlsZF92YXIgREVGQVVMVF9QTEFURk9STV9WRVJTSU9OKQorZGVmYXVsdF92ZXJzaW9uPSQoZ2V0X2J1aWxkX3ZhciBSRUxFQVNFX1BMQVRGT1JNX1ZFUlNJT04pCiAKICMgbHVuY2ggdGVzdHMKIGNoZWNrX2x1bmNoICJhb3NwX2FybTY0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFvc3BfYXJtNjQiICJlbmciICAgICAgICIiCmRpZmYgLS1naXQgYS90ZXN0cy9wcm9kdWN0LnJiYyBiL3Rlc3RzL3Byb2R1Y3QucmJjCmluZGV4IDlhZTYzOTMuLmI0YzZkNDUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Byb2R1Y3QucmJjCisrKyBiL3Rlc3RzL3Byb2R1Y3QucmJjCkBAIC01NCw2ICs1NCw3IEBACiAgIHJibGYuc29vbmdfY29uZmlnX2FwcGVuZChnLCAiTlMxIiwgInYyIiwgImRlZiIpCiAgIHJibGYuc29vbmdfY29uZmlnX3NldChnLCAiTlMyIiwgInYzIiwgImFiYyIpCiAgIHJibGYuc29vbmdfY29uZmlnX3NldChnLCAiTlMyIiwgInYzIiwgInh5eiIpCisgIHJibGYuc29vbmdfY29uZmlnX3NldChnLCAiTlMyIiwgInY0IiwgInh5eiAgICIpCiAKICAgcmJsZi5ta2Rpc3RfZm9yX2dvYWxzKGcsICJnb2FsIiwgImRpcjEvZmlsZTE6b3V0MSBkaXIxL2ZpbGUyOm91dDIiKQogICByYmxmLm1rZGlzdF9mb3JfZ29hbHMoZywgImdvYWwiLCAiZGlyMi9maWxlMjoiKQpkaWZmIC0tZ2l0IGEvdGVzdHMvcnVuLnJiYyBiL3Rlc3RzL3J1bi5yYmMKaW5kZXggMzM1ODNlYi4uMjIxYjQwZiAxMDA2NDQKLS0tIGEvdGVzdHMvcnVuLnJiYworKysgYi90ZXN0cy9ydW4ucmJjCkBAIC0yNiw2ICsyNiw3IEBACiBsb2FkKCI6Ym9hcmQucmJjIiwgYm9hcmRfaW5pdCA9ICJpbml0IikKIGxvYWQoIjpib2FyZF9pbnB1dF92YXJzLnJiYyIsIGJvYXJkX2lucHV0X3ZhcnNfaW5pdCA9ICJpbml0IikKIGxvYWQoIi8vYnVpbGQvbWFrZS90ZXN0cy9zaW5nbGVfdmFsdWVfaW5oZXJpdGFuY2U6dGVzdC5yYmMiLCB0ZXN0X3NpbmdsZV92YWx1ZV9pbmhlcml0YW5jZSA9ICJ0ZXN0IikKK2xvYWQoIi8vYnVpbGQvbWFrZS90ZXN0cy9zaW5nbGVfdmFsdWVfaW5oZXJpdGFuY2VfMjp0ZXN0LnJiYyIsIHRlc3Rfc2luZ2xlX3ZhbHVlX2luaGVyaXRhbmNlXzIgPSAidGVzdCIpCiBsb2FkKCIvL2J1aWxkL21ha2UvdGVzdHMvYXJ0aWZhY3RfcGF0aF9yZXF1aXJlbWVudHM6dGVzdC5yYmMiLCB0ZXN0X2FydGlmYWN0X3BhdGhfcmVxdWlyZW1lbnRzID0gInRlc3QiKQogbG9hZCgiLy9idWlsZC9tYWtlL3Rlc3RzL3ByZWZpeGVkX3NvcnRfb3JkZXI6dGVzdC5yYmMiLCB0ZXN0X3ByZWZpeGVkX3NvcnRfb3JkZXIgPSAidGVzdCIpCiBsb2FkKCIvL2J1aWxkL21ha2UvdGVzdHMvaW5oZXJpdHNfaW5fcmVndWxhcl92YXJpYWJsZXM6dGVzdC5yYmMiLCB0ZXN0X2luaGVyaXRzX2luX3JlZ3VsYXJfdmFyaWFibGVzID0gInRlc3QiKQpAQCAtMTQ0LDcgKzE0NSw4IEBACiAgICAgICAgICAgICAidjIiOiAiZGVmIgogICAgICAgICB9LAogICAgICAgICAiTlMyIjogewotICAgICAgICAgICAgInYzIjogInh5eiIKKyAgICAgICAgICAgICJ2MyI6ICJ4eXoiLAorICAgICAgICAgICAgInY0IjogInh5eiIKICAgICAgICAgfQogICAgIH0sCiAgICAge2s6diBmb3IgaywgdiBpbiBzb3J0ZWQobnMuaXRlbXMoKSkgfQpAQCAtMTgwLDYgKzE4Miw3IEBACiBhc3NlcnRfZXEoIiIsIGcuZ2V0KCJORVdWQVIiKSkKIAogdGVzdF9zaW5nbGVfdmFsdWVfaW5oZXJpdGFuY2UoKQordGVzdF9zaW5nbGVfdmFsdWVfaW5oZXJpdGFuY2VfMigpCiB0ZXN0X2FydGlmYWN0X3BhdGhfcmVxdWlyZW1lbnRzKCkKIHRlc3RfcHJlZml4ZWRfc29ydF9vcmRlcigpCiB0ZXN0X2luaGVyaXRzX2luX3JlZ3VsYXJfdmFyaWFibGVzKCkKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3Nka194ODYubWsgYi90ZXN0cy9zaW5nbGVfdmFsdWVfaW5oZXJpdGFuY2VfMi9hLnJiYwpzaW1pbGFyaXR5IGluZGV4IDY2JQpjb3B5IGZyb20gdGFyZ2V0L3Byb2R1Y3Qvc2RrX3g4Ni5tawpjb3B5IHRvIHRlc3RzL3NpbmdsZV92YWx1ZV9pbmhlcml0YW5jZV8yL2EucmJjCmluZGV4IDEzZWU1N2QuLmZlMTg2YzcgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3Nka194ODYubWsKKysrIGIvdGVzdHMvc2luZ2xlX3ZhbHVlX2luaGVyaXRhbmNlXzIvYS5yYmMKQEAgLTEsMjEgKzEsMjAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMgQ29weXJpZ2h0IDIwMjQgR29vZ2xlIExMQwogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCiAKLSMgRG9uJ3QgbW9kaWZ5IHRoaXMgZmlsZSAtIEl0J3MganVzdCBhbiBhbGlhcyEKK2xvYWQoIi8vYnVpbGQvbWFrZS9jb3JlOnByb2R1Y3RfY29uZmlnLnJiYyIsICJyYmxmIikKIAotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9zZGtfcGhvbmVfeDg2Lm1rKQorZGVmIGluaXQoZywgaGFuZGxlKToKKyAgY2ZnID0gcmJsZi5jZmcoaGFuZGxlKQogCi1QUk9EVUNUX05BTUUgOj0gc2RrX3g4NgorICBjZmdbIlBST0RVQ1RfRU5BQkxFX1VGRkRfR0MiXSA9ICJ0cnVlIgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3g4Ni5tayBiL3Rlc3RzL3NpbmdsZV92YWx1ZV9pbmhlcml0YW5jZV8yL2IucmJjCnNpbWlsYXJpdHkgaW5kZXggNjYlCmNvcHkgZnJvbSB0YXJnZXQvcHJvZHVjdC9zZGtfeDg2Lm1rCmNvcHkgdG8gdGVzdHMvc2luZ2xlX3ZhbHVlX2luaGVyaXRhbmNlXzIvYi5yYmMKaW5kZXggMTNlZTU3ZC4uN2Q5NTc0OSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3g4Ni5taworKysgYi90ZXN0cy9zaW5nbGVfdmFsdWVfaW5oZXJpdGFuY2VfMi9iLnJiYwpAQCAtMSwyMSArMSwyMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIyBDb3B5cmlnaHQgMjAyNCBHb29nbGUgTExDCiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKIAotIyBEb24ndCBtb2RpZnkgdGhpcyBmaWxlIC0gSXQncyBqdXN0IGFuIGFsaWFzIQorbG9hZCgiLy9idWlsZC9tYWtlL2NvcmU6cHJvZHVjdF9jb25maWcucmJjIiwgInJibGYiKQogCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L3Nka19waG9uZV94ODYubWspCitkZWYgaW5pdChnLCBoYW5kbGUpOgorICBjZmcgPSByYmxmLmNmZyhoYW5kbGUpCiAKLVBST0RVQ1RfTkFNRSA6PSBzZGtfeDg2CisgIGNmZ1siUFJPRFVDVF9FTkFCTEVfVUZGRF9HQyJdID0gImRlZmF1bHQiCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9zZGtfeDg2XzY0Lm1rIGIvdGVzdHMvc2luZ2xlX3ZhbHVlX2luaGVyaXRhbmNlXzIvYy5yYmMKc2ltaWxhcml0eSBpbmRleCA2NSUKY29weSBmcm9tIHRhcmdldC9wcm9kdWN0L3Nka194ODZfNjQubWsKY29weSB0byB0ZXN0cy9zaW5nbGVfdmFsdWVfaW5oZXJpdGFuY2VfMi9jLnJiYwppbmRleCA1ZjY1NTNlLi5lOTBlMzdkIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9zZGtfeDg2XzY0Lm1rCisrKyBiL3Rlc3RzL3NpbmdsZV92YWx1ZV9pbmhlcml0YW5jZV8yL2MucmJjCkBAIC0xLDIxICsxLDIxIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjIENvcHlyaWdodCAyMDI0IEdvb2dsZSBMTEMKICMKICMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogIwogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwogCi0jIERvbid0IG1vZGlmeSB0aGlzIGZpbGUgLSBJdCdzIGp1c3QgYW4gYWxpYXMhCitsb2FkKCIvL2J1aWxkL21ha2UvY29yZTpwcm9kdWN0X2NvbmZpZy5yYmMiLCAicmJsZiIpCitsb2FkKCI6Yi5yYmMiLCBfYl9pbml0ID0gImluaXQiKQogCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L3Nka19waG9uZV94ODZfNjQubWspCitkZWYgaW5pdChnLCBoYW5kbGUpOgorICBjZmcgPSByYmxmLmNmZyhoYW5kbGUpCiAKLVBST0RVQ1RfTkFNRSA6PSBzZGtfeDg2XzY0CisgIHJibGYuaW5oZXJpdChoYW5kbGUsICJ0ZXN0L2IiLCBfYl9pbml0KQpkaWZmIC0tZ2l0IGEvdGVzdHMvc2luZ2xlX3ZhbHVlX2luaGVyaXRhbmNlXzIvZC5yYmMgYi90ZXN0cy9zaW5nbGVfdmFsdWVfaW5oZXJpdGFuY2VfMi9kLnJiYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTg4YzJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc2luZ2xlX3ZhbHVlX2luaGVyaXRhbmNlXzIvZC5yYmMKQEAgLTAsMCArMSwyMyBAQAorIyBDb3B5cmlnaHQgMjAyNCBHb29nbGUgTExDCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworbG9hZCgiLy9idWlsZC9tYWtlL2NvcmU6cHJvZHVjdF9jb25maWcucmJjIiwgInJibGYiKQorbG9hZCgiOmMucmJjIiwgX2NfaW5pdCA9ICJpbml0IikKK2xvYWQoIjphLnJiYyIsIF9hX2luaXQgPSAiaW5pdCIpCisKK2RlZiBpbml0KGcsIGhhbmRsZSk6CisgIGNmZyA9IHJibGYuY2ZnKGhhbmRsZSkKKworICByYmxmLmluaGVyaXQoaGFuZGxlLCAidGVzdC9hIiwgX2FfaW5pdCkKKyAgcmJsZi5pbmhlcml0KGhhbmRsZSwgInRlc3QvYyIsIF9jX2luaXQpCmRpZmYgLS1naXQgYS90ZXN0cy9zaW5nbGVfdmFsdWVfaW5oZXJpdGFuY2VfMi9wcm9kdWN0LnJiYyBiL3Rlc3RzL3NpbmdsZV92YWx1ZV9pbmhlcml0YW5jZV8yL3Byb2R1Y3QucmJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NzY2NGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9zaW5nbGVfdmFsdWVfaW5oZXJpdGFuY2VfMi9wcm9kdWN0LnJiYwpAQCAtMCwwICsxLDIzIEBACisjIENvcHlyaWdodCAyMDI0IEdvb2dsZSBMTEMKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsb2FkKCIvL2J1aWxkL21ha2UvY29yZTpwcm9kdWN0X2NvbmZpZy5yYmMiLCAicmJsZiIpCitsb2FkKCI6Yi5yYmMiLCBfYl9pbml0ID0gImluaXQiKQorbG9hZCgiOmQucmJjIiwgX2RfaW5pdCA9ICJpbml0IikKKworZGVmIGluaXQoZywgaGFuZGxlKToKKyAgY2ZnID0gcmJsZi5jZmcoaGFuZGxlKQorCisgIHJibGYuaW5oZXJpdChoYW5kbGUsICJ0ZXN0L2IiLCBfYl9pbml0KQorICByYmxmLmluaGVyaXQoaGFuZGxlLCAidGVzdC9kIiwgX2RfaW5pdCkKZGlmZiAtLWdpdCBhL3Rlc3RzL3NpbmdsZV92YWx1ZV9pbmhlcml0YW5jZV8yL3Rlc3QucmJjIGIvdGVzdHMvc2luZ2xlX3ZhbHVlX2luaGVyaXRhbmNlXzIvdGVzdC5yYmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE5M2FhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3NpbmdsZV92YWx1ZV9pbmhlcml0YW5jZV8yL3Rlc3QucmJjCkBAIC0wLDAgKzEsNDAgQEAKKyMgQ29weXJpZ2h0IDIwMjQgR29vZ2xlIExMQworIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xvYWQoIi8vYnVpbGQvbWFrZS9jb3JlOnByb2R1Y3RfY29uZmlnLnJiYyIsICJyYmxmIikKK2xvYWQoIi8vYnVpbGQvbWFrZS90ZXN0cy9pbnB1dF92YXJpYWJsZXMucmJjIiwgaW5wdXRfdmFyaWFibGVzX2luaXQgPSAiaW5pdCIpCitsb2FkKCI6cHJvZHVjdC5yYmMiLCAiaW5pdCIpCisKKworZGVmIGFzc2VydF9lcShleHBlY3RlZCwgYWN0dWFsKToKKyAgICBpZiBleHBlY3RlZCAhPSBhY3R1YWw6CisgICAgICAgIGZhaWwoIkV4cGVjdGVkICclcycsIGdvdCAnJXMnIiAlIChleHBlY3RlZCwgYWN0dWFsKSkKKworIyBUaGlzIHRlc3QgaXMgdGVzdGluZyB0aGF0IHNpbmdsZSB2YWx1ZSB2YXJpYWJsZXMgYXJlICJzdG9sZW4iIHdoZW4gcHJvY2Vzc2luZyB0aGUgaW5oZXJpdGFuY2UKKyMgZ3JhcGguIGkuZS4gaWYgeW91IGhhdmUgYSBncmFwaCBsaWtlIHRoaXM6CisjCisjICAgQiAgIEEKKyMgICB8XCAgfAorIyAgIHwgQyB8CisjICAgIFwgXHwKKyMgICAgIFwgRAorIyAgICAgIFx8CisjICAgICAgIEUKKyMKKyMgVGhlIHNhbWUgdmFyaWFibGUgaXMgZGVmaW5lZCBpbiBib3RoIEEgYW5kIEIuIEluIEQsIHRoZSB2YWx1ZSBmcm9tIEEgaXMgY2hvc2VuIGJlY2F1c2UgaXQgY29tZXMKKyMgYWxwaGFiZXRpY2FsbHkgYmVmb3JlIEMuIEJ1dCB0aGVuIGluIEUsIHRoZSB2YWx1ZSBmcm9tIEQgaXMgY2hvc2VuIGluc3RlYWQgb2YgdGhlIHZhbHVlIGZyb20gQiwKKyMgYmVjYXVzZSB0aGUgdmFsdWUgb2YgQiB3YXMgInN0b2xlbiIgYW5kIHN1Y2tlZCBpbnRvIEMsIGxlYXZpbmcgQiB3aXRoIG5vIHZhbHVlIHNldC4KK2RlZiB0ZXN0KCk6CisgICAgKGdsb2JhbHMsIGdsb2JhbHNfYmFzZSkgPSByYmxmLnByb2R1Y3RfY29uZmlndXJhdGlvbigidGVzdC9kZXZpY2UiLCBpbml0LCBpbnB1dF92YXJpYWJsZXNfaW5pdCkKKyAgICBhc3NlcnRfZXEoInRydWUiLCBnbG9iYWxzWyJQUk9EVUNUUy50ZXN0L2RldmljZS5tay5QUk9EVUNUX0VOQUJMRV9VRkZEX0dDIl0pCmRpZmYgLS1naXQgYS90b29scy9BbmRyb2lkLmJwIGIvdG9vbHMvQW5kcm9pZC5icAppbmRleCBiZWEwNjAyLi4yNDNjYjU2IDEwMDY0NAotLS0gYS90b29scy9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL0FuZHJvaWQuYnAKQEAgLTE4LDU2ICsxOCw2NSBAQAogfQogCiBweXRob25fYmluYXJ5X2hvc3QgewotICBuYW1lOiAiZ2VuZXJhdGUtc2VsZi1leHRyYWN0aW5nLWFyY2hpdmUiLAotICBzcmNzOiBbImdlbmVyYXRlLXNlbGYtZXh0cmFjdGluZy1hcmNoaXZlLnB5Il0sCisgICAgbmFtZTogImdlbmVyYXRlLXNlbGYtZXh0cmFjdGluZy1hcmNoaXZlIiwKKyAgICBzcmNzOiBbImdlbmVyYXRlLXNlbGYtZXh0cmFjdGluZy1hcmNoaXZlLnB5Il0sCiB9CiAKIHB5dGhvbl9iaW5hcnlfaG9zdCB7Ci0gIG5hbWU6ICJwb3N0X3Byb2Nlc3NfcHJvcHMiLAotICBzcmNzOiBbInBvc3RfcHJvY2Vzc19wcm9wcy5weSJdLAorICAgIG5hbWU6ICJwb3N0X3Byb2Nlc3NfcHJvcHMiLAorICAgIHNyY3M6IFsicG9zdF9wcm9jZXNzX3Byb3BzLnB5Il0sCisgICAgbGliczogWworICAgICAgICAidWZmZF9nY191dGlscyIsCisgICAgXSwKIH0KIAogcHl0aG9uX3Rlc3RfaG9zdCB7Ci0gIG5hbWU6ICJwb3N0X3Byb2Nlc3NfcHJvcHNfdW5pdHRlc3QiLAotICBtYWluOiAidGVzdF9wb3N0X3Byb2Nlc3NfcHJvcHMucHkiLAotICBzcmNzOiBbCi0gICAgInBvc3RfcHJvY2Vzc19wcm9wcy5weSIsCi0gICAgInRlc3RfcG9zdF9wcm9jZXNzX3Byb3BzLnB5IiwKLSAgXSwKLSAgdGVzdF9jb25maWc6ICJwb3N0X3Byb2Nlc3NfcHJvcHNfdW5pdHRlc3QueG1sIiwKLSAgdGVzdF9zdWl0ZXM6IFsiZ2VuZXJhbC10ZXN0cyJdLAorICAgIG5hbWU6ICJwb3N0X3Byb2Nlc3NfcHJvcHNfdW5pdHRlc3QiLAorICAgIG1haW46ICJ0ZXN0X3Bvc3RfcHJvY2Vzc19wcm9wcy5weSIsCisgICAgc3JjczogWworICAgICAgICAicG9zdF9wcm9jZXNzX3Byb3BzLnB5IiwKKyAgICAgICAgInRlc3RfcG9zdF9wcm9jZXNzX3Byb3BzLnB5IiwKKyAgICBdLAorICAgIGxpYnM6IFsKKyAgICAgICAgInVmZmRfZ2NfdXRpbHMiLAorICAgIF0sCisgICAgdGVzdF9jb25maWc6ICJwb3N0X3Byb2Nlc3NfcHJvcHNfdW5pdHRlc3QueG1sIiwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCiB9CiAKIHB5dGhvbl9iaW5hcnlfaG9zdCB7Ci0gIG5hbWU6ICJleHRyYWN0X2tlcm5lbCIsCi0gIHNyY3M6IFsiZXh0cmFjdF9rZXJuZWwucHkiXSwKKyAgICBuYW1lOiAiZXh0cmFjdF9rZXJuZWwiLAorICAgIHNyY3M6IFsiZXh0cmFjdF9rZXJuZWwucHkiXSwKIH0KIAogZ2VucnVsZV9kZWZhdWx0cyB7Ci0gIG5hbWU6ICJleHRyYWN0X2tlcm5lbF9yZWxlYXNlX2RlZmF1bHRzIiwKLSAgdG9vbHM6IFsiZXh0cmFjdF9rZXJuZWwiLCAibHo0Il0sCi0gIG91dDogWyJrZXJuZWxfcmVsZWFzZS50eHQiXSwKLSAgY21kOiAiJChsb2NhdGlvbikgLS10b29scyBsejQ6JChsb2NhdGlvbiBsejQpIC0taW5wdXQgJChpbikgLS1vdXRwdXQtcmVsZWFzZSA+ICQob3V0KSIKKyAgICBuYW1lOiAiZXh0cmFjdF9rZXJuZWxfcmVsZWFzZV9kZWZhdWx0cyIsCisgICAgdG9vbHM6IFsKKyAgICAgICAgImV4dHJhY3Rfa2VybmVsIiwKKyAgICAgICAgImx6NCIsCisgICAgXSwKKyAgICBvdXQ6IFsia2VybmVsX3JlbGVhc2UudHh0Il0sCisgICAgY21kOiAiJChsb2NhdGlvbikgLS10b29scyBsejQ6JChsb2NhdGlvbiBsejQpIC0taW5wdXQgJChpbikgLS1vdXRwdXQtcmVsZWFzZSA+ICQob3V0KSIsCiB9CiAKIGNjX2JpbmFyeV9ob3N0IHsKLSAgbmFtZTogImJ1aWxkLXJ1bmZpbGVzIiwKLSAgc3JjczogWyJidWlsZC1ydW5maWxlcy5jYyJdLAorICAgIG5hbWU6ICJidWlsZC1ydW5maWxlcyIsCisgICAgc3JjczogWyJidWlsZC1ydW5maWxlcy5jYyJdLAogfQogCiBweXRob25fYmluYXJ5X2hvc3QgewotICBuYW1lOiAiY2hlY2tfcmFkaW9fdmVyc2lvbnMiLAotICBzcmNzOiBbImNoZWNrX3JhZGlvX3ZlcnNpb25zLnB5Il0sCisgICAgbmFtZTogImNoZWNrX3JhZGlvX3ZlcnNpb25zIiwKKyAgICBzcmNzOiBbImNoZWNrX3JhZGlvX3ZlcnNpb25zLnB5Il0sCiB9CiAKIHB5dGhvbl9iaW5hcnlfaG9zdCB7Ci0gIG5hbWU6ICJjaGVja19lbGZfZmlsZSIsCi0gIHNyY3M6IFsiY2hlY2tfZWxmX2ZpbGUucHkiXSwKKyAgICBuYW1lOiAiY2hlY2tfZWxmX2ZpbGUiLAorICAgIHNyY3M6IFsiY2hlY2tfZWxmX2ZpbGUucHkiXSwKIH0KIAogcHl0aG9uX2JpbmFyeV9ob3N0IHsKLSAgbmFtZTogImdlbmVyYXRlX2d0c19zaGFyZWRfcmVwb3J0IiwKLSAgc3JjczogWyJnZW5lcmF0ZV9ndHNfc2hhcmVkX3JlcG9ydC5weSJdLAorICAgIG5hbWU6ICJnZW5lcmF0ZV9ndHNfc2hhcmVkX3JlcG9ydCIsCisgICAgc3JjczogWyJnZW5lcmF0ZV9ndHNfc2hhcmVkX3JlcG9ydC5weSJdLAogfQogCiBweXRob25fYmluYXJ5X2hvc3QgewpAQCAtNzcsOCArODYsNDggQEAKICAgICAgICAgImxpc3RfZmlsZXMucHkiLAogICAgIF0sCiAgICAgdmVyc2lvbjogewotICAgICAgcHkzOiB7Ci0gICAgICAgIGVtYmVkZGVkX2xhdW5jaGVyOiB0cnVlLAotICAgICAgfQotICAgIH0KKyAgICAgICAgcHkzOiB7CisgICAgICAgICAgICBlbWJlZGRlZF9sYXVuY2hlcjogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCitweXRob25fdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiYXV0b19nZW5fdGVzdF9jb25maWdfdGVzdCIsCisgICAgbWFpbjogImF1dG9fZ2VuX3Rlc3RfY29uZmlnX3Rlc3QucHkiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImF1dG9fZ2VuX3Rlc3RfY29uZmlnLnB5IiwKKyAgICAgICAgImF1dG9fZ2VuX3Rlc3RfY29uZmlnX3Rlc3QucHkiLAorICAgIF0sCisgICAgYXV0b19nZW5fY29uZmlnOiB0cnVlLAorICAgIHRlc3Rfc3VpdGVzOiBbImdlbmVyYWwtdGVzdHMiXSwKKyAgICB0ZXN0X29wdGlvbnM6IHsKKyAgICAgICAgdW5pdF90ZXN0OiB0cnVlLAorICAgIH0sCit9CisKK3B5dGhvbl9iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogImNoYXJhY3RlcmlzdGljc19ycm9fZ2VuZXJhdG9yIiwKKyAgICBzcmNzOiBbImNoYXJhY3RlcmlzdGljc19ycm9fZ2VuZXJhdG9yLnB5Il0sCisgICAgdmVyc2lvbjogeworICAgICAgICBweTM6IHsKKyAgICAgICAgICAgIGVtYmVkZGVkX2xhdW5jaGVyOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCit9CisKK3B5dGhvbl9iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogIm1lcmdlLWV2ZW50LWxvZy10YWdzIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJldmVudF9sb2dfdGFncy5weSIsCisgICAgICAgICJtZXJnZS1ldmVudC1sb2ctdGFncy5weSIsCisgICAgXSwKK30KKworcHl0aG9uX2JpbmFyeV9ob3N0IHsKKyAgICBuYW1lOiAiamF2YS1ldmVudC1sb2ctdGFncyIsCisgICAgc3JjczogWworICAgICAgICAiZXZlbnRfbG9nX3RhZ3MucHkiLAorICAgICAgICAiamF2YS1ldmVudC1sb2ctdGFncy5weSIsCisgICAgXSwKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL0JVSUxELmJhemVsIGIvdG9vbHMvQlVJTEQuYmF6ZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZTE3OGIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvQlVJTEQuYmF6ZWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1weV9saWJyYXJ5KAotICAgIG5hbWUgPSAiZXZlbnRfbG9nX3RhZ3MiLAotICAgIHNyY3MgPSBbImV2ZW50X2xvZ190YWdzLnB5Il0sCi0pCi0KLXB5X2JpbmFyeSgKLSAgICBuYW1lID0gImphdmEtZXZlbnQtbG9nLXRhZ3MiLAotICAgIHNyY3MgPSBbImphdmEtZXZlbnQtbG9nLXRhZ3MucHkiXSwKLSAgICBweXRob25fdmVyc2lvbiA9ICJQWTMiLAotICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKLSAgICBkZXBzID0gWyI6ZXZlbnRfbG9nX3RhZ3MiXSwKLSkKLQotcHlfYmluYXJ5KAotICAgIG5hbWUgPSAibWVyZ2UtZXZlbnQtbG9nLXRhZ3MiLAotICAgIHNyY3MgPSBbIm1lcmdlLWV2ZW50LWxvZy10YWdzLnB5Il0sCi0gICAgcHl0aG9uX3ZlcnNpb24gPSAiUFkzIiwKLSAgICB2aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0sCi0gICAgZGVwcyA9IFsiOmV2ZW50X2xvZ190YWdzIl0sCi0pCi0KLXB5X2JpbmFyeSgKLSAgICBuYW1lID0gImNoZWNrX2VsZl9maWxlIiwKLSAgICBzcmNzID0gWyJjaGVja19lbGZfZmlsZS5weSJdLAotICAgIHB5dGhvbl92ZXJzaW9uID0gIlBZMyIsCi0gICAgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAotKQpkaWZmIC0tZ2l0IGEvdG9vbHMvT1dORVJTIGIvdG9vbHMvT1dORVJTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDY2NmYxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL09XTkVSUworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXBlci1maWxlIHdhcm4ucHksY2hlY2tvd25lcnMucHkgPSBjaGhAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy8uZWRpdG9yY29uZmlnIGIvdG9vbHMvYWNvbmZpZy8uZWRpdG9yY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNTk4NWYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnLy5lZGl0b3Jjb25maWcKQEAgLTAsMCArMSw5IEBACisjIEVkaXRvckNvbmZpZyBpcyBhd2Vzb21lOiBodHRwczovL0VkaXRvckNvbmZpZy5vcmcKKworIyB0b3AtbW9zdCBFZGl0b3JDb25maWcgZmlsZQorcm9vdCA9IHRydWUKKworWyouamF2YV0KK2luZGVudF9zdHlsZSA9IHRhYgoraW5kZW50X3NpemUgPSA0CisKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvLmdpdGlnbm9yZSBiL3Rvb2xzL2Fjb25maWcvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjcyNDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMiBAQAorL0NhcmdvLmxvY2sKKy90YXJnZXQKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvQ2FyZ28udG9tbCBiL3Rvb2xzL2Fjb25maWcvQ2FyZ28udG9tbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjVlMWE5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9DYXJnby50b21sCkBAIC0wLDAgKzEsMTQgQEAKK1t3b3Jrc3BhY2VdCisKK21lbWJlcnMgPSBbCisgICAgImFjb25maWciLAorICAgICJhY29uZmlnX2RldmljZV9wYXRocyIsCisgICAgImFjb25maWdfcHJvdG9zIiwKKyAgICAiYWNvbmZpZ19zdG9yYWdlX2ZpbGUiLAorICAgICJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkiLAorICAgICJhY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpIiwKKyAgICAiYWZsYWdzIiwKKyAgICAicHJpbnRmbGFncyIKK10KKworcmVzb2x2ZXIgPSAiMiIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL3Rvb2xzL2Fjb25maWcvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL09XTkVSUyBiL3Rvb2xzL2Fjb25maWcvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MmZjN2MKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL09XTkVSUwpAQCAtMCwwICsxLDggQEAKK2R6c2hlbkBnb29nbGUuY29tCitvcGdAZ29vZ2xlLmNvbQordGVkYmF1ZXJAZ29vZ2xlLmNvbQoremhpZG91QGdvb2dsZS5jb20KKworYW1oa0Bnb29nbGUuY29tICAje0xBU1RfUkVTT1JUX1NVR0dFU1RJT059CitqaGFtQGdvb2dsZS5jb20gICN7TEFTVF9SRVNPUlRfU1VHR0VTVElPTn0KK2pvZW9AZ29vZ2xlLmNvbSAgI3tMQVNUX1JFU09SVF9TVUdHRVNUSU9OfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9QUkVVUExPQUQuY2ZnIGIvdG9vbHMvYWNvbmZpZy9QUkVVUExPQUQuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZWQ1N2MKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL1BSRVVQTE9BRC5jZmcKQEAgLTAsMCArMSw1IEBACitbQnVpbHRpbiBIb29rc10KK3J1c3RmbXQgPSB0cnVlCisKK1tCdWlsdGluIEhvb2tzIE9wdGlvbnNdCitydXN0Zm10ID0gLS1jb25maWctcGF0aD1ydXN0Zm10LnRvbWwKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvVEVTVF9NQVBQSU5HIGIvdG9vbHMvYWNvbmZpZy9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdmMGE0ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsMTE1IEBACit7CisgICJwcmVzdWJtaXQiOiBbCisgICAgeworICAgICAgLy8gYWNvbmZpZyB1bml0IHRlc3RzCisgICAgICAibmFtZSI6ICJhY29uZmlnLnRlc3QiCisgICAgfSwKKyAgICB7CisgICAgICAvLyBhY29uZmlnIEphdmEgaW50ZWdyYXRpb24gdGVzdHMgKGhvc3QpCisgICAgICAibmFtZSI6ICJBY29uZmlnSmF2YUhvc3RUZXN0IgorICAgIH0sCisgICAgeworICAgICAgLy8gYWNvbmZpZyBKYXZhIGludGVncmF0aW9uIHRlc3RzCisgICAgICAibmFtZSI6ICJhY29uZmlnLnRlc3QuamF2YSIKKyAgICB9LAorICAgIHsKKyAgICAgIC8vIGFjb25maWcgQysrIGludGVncmF0aW9uIHRlc3RzIChwcm9kdWN0aW9uIG1vZGUgYXV0by1nZW5lcmF0ZWQgY29kZSkKKyAgICAgICJuYW1lIjogImFjb25maWcudGVzdC5jcHAiCisgICAgfSwKKyAgICB7CisgICAgICAvLyBhY29uZmlnIEMrKyBpbnRlZ3JhdGlvbiB0ZXN0cyAodGVzdCBtb2RlIGF1dG8tZ2VuZXJhdGVkIGNvZGUpCisgICAgICAibmFtZSI6ICJhY29uZmlnLnRlc3QuY3BwLnRlc3RfbW9kZSIKKyAgICB9LAorICAgIC8vIFRPRE8oYi8zMjc0MjA2NzkpOiBFbmFibGUgZXhwb3J0IG1vZGUgZm9yIG5hdGl2ZSBmbGFnIGxpYnJhcnkKKyAgICAvLyB7CisgICAgLy8gICAvLyBhY29uZmlnIEMrKyBpbnRlZ3JhdGlvbiB0ZXN0cyAoZXhwb3J0ZWQgbW9kZSBhdXRvLWdlbmVyYXRlZCBjb2RlKQorICAgIC8vICAgIm5hbWUiOiAiYWNvbmZpZy50ZXN0LmNwcC5leHBvcnRlZF9tb2RlIgorICAgIC8vIH0sCisgICAgeworICAgICAgLy8gYWNvbmZpZyBSdXN0IGludGVncmF0aW9uIHRlc3RzIChwcm9kdWN0aW9uIG1vZGUgYXV0by1nZW5lcmF0ZWQgY29kZSkKKyAgICAgICJuYW1lIjogImFjb25maWcucHJvZF9tb2RlLnRlc3QucnVzdCIKKyAgICB9LAorICAgIHsKKyAgICAgIC8vIGFjb25maWcgUnVzdCBpbnRlZ3JhdGlvbiB0ZXN0cyAodGVzdCBtb2RlIGF1dG8tZ2VuZXJhdGVkIGNvZGUpCisgICAgICAibmFtZSI6ICJhY29uZmlnLnRlc3RfbW9kZS50ZXN0LnJ1c3QiCisgICAgfSwKKyAgICAvLyBUT0RPKGIvMzI3NDIwNjc5KTogRW5hYmxlIGV4cG9ydCBtb2RlIGZvciBuYXRpdmUgZmxhZyBsaWJyYXJ5CisgICAgLy8geworICAgIC8vICAgLy8gYWNvbmZpZyBSdXN0IGludGVncmF0aW9uIHRlc3RzIChleHBvcnRlZCBtb2RlIGF1dG8tZ2VuZXJhdGVkIGNvZGUpCisgICAgLy8gICAibmFtZSI6ICJhY29uZmlnLmV4cG9ydGVkX21vZGUudGVzdC5ydXN0IgorICAgIC8vIH0sCisgICAgeworICAgICAgLy8gYWZsYWdzIENMSSB1bml0IHRlc3RzCisgICAgICAibmFtZSI6ICJhZmxhZ3MudGVzdCIKKyAgICB9LAorICAgIHsKKyAgICAgIC8vIHByaW50ZmxhZ3MgdW5pdCB0ZXN0cworICAgICAgIm5hbWUiOiAicHJpbnRmbGFncy50ZXN0IgorICAgIH0sCisgICAgeworICAgICAgLy8gYWNvbmZpZ19wcm90b3MgdW5pdCB0ZXN0cworICAgICAgIm5hbWUiOiAiYWNvbmZpZ19wcm90b3MudGVzdCIKKyAgICB9LAorICAgIHsKKyAgICAgIC8vIGFjb25maWdfc3RvcmFnZV9maWxlIHVuaXQgdGVzdHMKKyAgICAgICJuYW1lIjogImFjb25maWdfc3RvcmFnZV9maWxlLnRlc3QiCisgICAgfSwKKyAgICB7CisgICAgICAvLyBFbnN1cmUgY2hhbmdlcyBvbiBhY29uZmlnIGF1dG8gZ2VuZXJhdGVkIGxpYnJhcnkgaXMgY29tcGF0aWJsZSB3aXRoCisgICAgICAvLyB0ZXN0IHRlc3RpbmcgZmlsdGVyaW5nIGxvZ2ljLiBCcmVha2FnZSBvbiB0aGlzIHRlc3QgbWVhbnMgYWxsIHRlc3RzCisgICAgICAvLyB0aGF0IHVzaW5nIHRoZSBmbGFnIGFubm90YXRpb25zIHRvIGRvIGZpbHRlcmluZyB3aWxsIGdldCBhZmZlY3RlZC4KKyAgICAgICJuYW1lIjogIkZsYWdBbm5vdGF0aW9uVGVzdHMiLAorICAgICAgIm9wdGlvbnMiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5jdHMuZmxhZ3MudGVzdHMuRmxhZ0Fubm90YXRpb25UZXN0IgorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICB7CisgICAgICAvLyBFbnN1cmUgY2hhbmdlcyBvbiBhY29uZmlnIGF1dG8gZ2VuZXJhdGVkIGxpYnJhcnkgaXMgY29tcGF0aWJsZSB3aXRoCisgICAgICAvLyB0ZXN0IHRlc3RpbmcgZmlsdGVyaW5nIGxvZ2ljLiBCcmVha2FnZSBvbiB0aGlzIHRlc3QgbWVhbnMgYWxsIHRlc3RzCisgICAgICAvLyB0aGF0IHVzaW5nIHRoZSBmbGFnIG1hY3JvcyB0byBkbyBmaWx0ZXJpbmcgd2lsbCBnZXQgYWZmZWN0ZWQuCisgICAgICAibmFtZSI6ICJGbGFnTWFjcm9zVGVzdHMiCisgICAgfSwKKyAgICB7CisgICAgICAvLyBhY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpIHVuaXQgdGVzdHMKKyAgICAgICJuYW1lIjogImFjb25maWdfc3RvcmFnZV93cml0ZV9hcGkudGVzdCIKKyAgICB9LAorICAgIHsKKyAgICAgIC8vIGFjb25maWdfc3RvcmFnZV9yZWFkX2FwaSB1bml0IHRlc3RzCisgICAgICAibmFtZSI6ICJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkudGVzdCIKKyAgICB9LAorICAgIHsKKyAgICAgIC8vIGFjb25maWdfc3RvcmFnZSB3cml0ZSBhcGkgcnVzdCBpbnRlZ3JhdGlvbiB0ZXN0cworICAgICAgIm5hbWUiOiAiYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS50ZXN0LnJ1c3QiCisgICAgfSwKKyAgICB7CisgICAgICAvLyBhY29uZmlnX3N0b3JhZ2Ugd3JpdGUgYXBpIGNwcCBpbnRlZ3JhdGlvbiB0ZXN0cworICAgICAgIm5hbWUiOiAiYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS50ZXN0LmNwcCIKKyAgICB9LAorICAgIHsKKyAgICAgIC8vIGFjb25maWdfc3RvcmFnZSByZWFkIGFwaSBydXN0IGludGVncmF0aW9uIHRlc3RzCisgICAgICAibmFtZSI6ICJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkudGVzdC5ydXN0IgorICAgIH0sCisgICAgeworICAgICAgLy8gYWNvbmZpZ19zdG9yYWdlIHJlYWQgYXBpIGNwcCBpbnRlZ3JhdGlvbiB0ZXN0cworICAgICAgIm5hbWUiOiAiYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpLnRlc3QuY3BwIgorICAgIH0sCisgICAgeworICAgICAgLy8gYWNvbmZpZ19zdG9yYWdlIGZpbGUgY3BwIGludGVncmF0aW9uIHRlc3RzCisgICAgICAibmFtZSI6ICJhY29uZmlnX3N0b3JhZ2VfZmlsZS50ZXN0LmNwcCIKKyAgICB9LAorICAgIHsKKyAgICAgIC8vIGFjb25maWdfc3RvcmFnZSBmaWxlIGphdmEgaW50ZWdyYXRpb24gdGVzdHMKKyAgICAgICJuYW1lIjogImFjb25maWdfc3RvcmFnZV9maWxlLnRlc3QuamF2YSIKKyAgICB9LAorICAgIHsKKyAgICAgIC8vIGFjb25maWdfc3RvcmFnZSByZWFkIGZ1bmN0aW9uYWwgdGVzdAorICAgICAgIm5hbWUiOiAiYWNvbmZpZ19zdG9yYWdlX3JlYWRfZnVuY3Rpb25hbCIKKyAgICB9LAorICAgIHsKKyAgICAgIC8vIGFjb25maWdfc3RvcmFnZSByZWFkIHVuaXQgdGVzdAorICAgICAgIm5hbWUiOiAiYWNvbmZpZ19zdG9yYWdlX3JlYWRfdW5pdCIKKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NlMGNhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzE5IEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCit9CisKK3J1c3RfZGVmYXVsdHMgeworICAgIG5hbWU6ICJhY29uZmlnLmRlZmF1bHRzIiwKKyAgICBlZGl0aW9uOiAiMjAyMSIsCisgICAgY2xpcHB5X2xpbnRzOiAiYW5kcm9pZCIsCisgICAgbGludHM6ICJhbmRyb2lkIiwKKyAgICBzcmNzOiBbInNyYy9tYWluLnJzIl0sCisgICAgcnVzdGxpYnM6IFsKKyAgICAgICAgImxpYmFjb25maWdfcHJvdG9zIiwKKyAgICAgICAgImxpYmFjb25maWdfc3RvcmFnZV9maWxlIiwKKyAgICAgICAgImxpYmFueWhvdyIsCisgICAgICAgICJsaWJjbGFwIiwKKyAgICAgICAgImxpYml0ZXJ0b29scyIsCisgICAgICAgICJsaWJwcm90b2J1ZiIsCisgICAgICAgICJsaWJzZXJkZSIsCisgICAgICAgICJsaWJzZXJkZV9qc29uIiwKKyAgICAgICAgImxpYnRpbnl0ZW1wbGF0ZSIsCisgICAgXSwKK30KKworcnVzdF9iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogImFjb25maWciLAorICAgIGRlZmF1bHRzOiBbImFjb25maWcuZGVmYXVsdHMiXSwKK30KKworcnVzdF90ZXN0X2hvc3QgeworICAgIG5hbWU6ICJhY29uZmlnLnRlc3QiLAorICAgIGRlZmF1bHRzOiBbImFjb25maWcuZGVmYXVsdHMiXSwKKyAgICBydXN0bGliczogWworICAgICAgICAibGliaXRlcnRvb2xzIiwKKyAgICBdLAorICAgIHRlc3Rfc3VpdGVzOiBbImdlbmVyYWwtdGVzdHMiXSwKK30KKworLy8gaW50ZWdyYXRpb24gdGVzdHM6IGdlbmVyYWwKKworYWNvbmZpZ19kZWNsYXJhdGlvbnMgeworICAgIG5hbWU6ICJhY29uZmlnLnRlc3QuZmxhZ3MiLAorICAgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiLAorICAgIGNvbnRhaW5lcjogInN5c3RlbSIsCisgICAgc3JjczogWyJ0ZXN0cy90ZXN0LmFjb25maWciXSwKK30KKworYWNvbmZpZ19kZWNsYXJhdGlvbnMgeworICAgIG5hbWU6ICJhY29uZmlnLnRlc3QuZXhwb3J0ZWQuZmxhZ3MiLAorICAgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZXhwb3J0ZWQiLAorICAgIGV4cG9ydGFibGU6IHRydWUsCisgICAgY29udGFpbmVyOiAic3lzdGVtIiwKKyAgICBzcmNzOiBbInRlc3RzL3Rlc3RfZXhwb3J0ZWQuYWNvbmZpZyJdLAorfQorCithY29uZmlnX2RlY2xhcmF0aW9ucyB7CisgICAgbmFtZTogImFjb25maWcudGVzdC5mb3JjZXJlYWRvbmx5LmZsYWdzIiwKKyAgICBwYWNrYWdlOiAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmZvcmNlcmVhZG9ubHkiLAorICAgIGNvbnRhaW5lcjogInN5c3RlbSIsCisgICAgc3JjczogWyJ0ZXN0cy90ZXN0X2ZvcmNlX3JlYWRfb25seS5hY29uZmlnIl0sCit9CisKK2Fjb25maWdfdmFsdWVzIHsKKyAgICBuYW1lOiAiYWNvbmZpZy50ZXN0LmZsYWcudmFsdWVzIiwKKyAgICBwYWNrYWdlOiAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJ0ZXN0cy9maXJzdC52YWx1ZXMiLAorICAgICAgICAidGVzdHMvc2Vjb25kLnZhbHVlcyIsCisgICAgXSwKK30KKworYWNvbmZpZ192YWx1ZXMgeworICAgIG5hbWU6ICJhY29uZmlnLnRlc3QuZmxhZy5zZWNvbmRfdmFsdWVzIiwKKyAgICBwYWNrYWdlOiAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJ0ZXN0cy90aGlyZC52YWx1ZXMiLAorICAgIF0sCit9CisKK2Fjb25maWdfdmFsdWVfc2V0IHsKKyAgICBuYW1lOiAiYWNvbmZpZy50ZXN0LmZsYWcudmFsdWVfc2V0IiwKKyAgICB2YWx1ZXM6IFsKKyAgICAgICAgImFjb25maWcudGVzdC5mbGFnLnZhbHVlcyIsCisgICAgXSwKK30KKworLy8gaW50ZWdyYXRpb24gdGVzdHM6IGphdmEKKworamF2YV9hY29uZmlnX2xpYnJhcnkgeworICAgIG5hbWU6ICJhY29uZmlnX3Rlc3RfamF2YV9saWJyYXJ5IiwKKyAgICBhY29uZmlnX2RlY2xhcmF0aW9uczogImFjb25maWcudGVzdC5mbGFncyIsCit9CisKK2phdmFfYWNvbmZpZ19saWJyYXJ5IHsKKyAgICBuYW1lOiAiYWNvbmZpZ190ZXN0X2phdmFfbGlicmFyeV9leHBvcnRlZCIsCisgICAgYWNvbmZpZ19kZWNsYXJhdGlvbnM6ICJhY29uZmlnLnRlc3QuZXhwb3J0ZWQuZmxhZ3MiLAorICAgIG1vZGU6ICJleHBvcnRlZCIsCit9CisKK2phdmFfYWNvbmZpZ19saWJyYXJ5IHsKKyAgICBuYW1lOiAiYWNvbmZpZ190ZXN0X2phdmFfbGlicmFyeV9mb3JjZXJlYWRvbmx5IiwKKyAgICBhY29uZmlnX2RlY2xhcmF0aW9uczogImFjb25maWcudGVzdC5mb3JjZXJlYWRvbmx5LmZsYWdzIiwKKyAgICBtb2RlOiAiZm9yY2UtcmVhZC1vbmx5IiwKK30KKworYW5kcm9pZF90ZXN0IHsKKyAgICBuYW1lOiAiYWNvbmZpZy50ZXN0LmphdmEiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInRlc3RzL0Fjb25maWdUZXN0LmphdmEiLAorICAgIF0sCisgICAgbWFuaWZlc3Q6ICJ0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sIiwKKyAgICBjZXJ0aWZpY2F0ZTogInBsYXRmb3JtIiwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYWNvbmZpZ190ZXN0X2phdmFfbGlicmFyeSIsCisgICAgICAgICJhY29uZmlnX3Rlc3RfamF2YV9saWJyYXJ5X2V4cG9ydGVkIiwKKyAgICAgICAgImFjb25maWdfdGVzdF9qYXZhX2xpYnJhcnlfZm9yY2VyZWFkb25seSIsCisgICAgICAgICJhbmRyb2lkeC50ZXN0LnJ1bGVzIiwKKyAgICAgICAgInRlc3RuZyIsCisgICAgXSwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCit9CisKK2phdmFfYWNvbmZpZ19saWJyYXJ5IHsKKyAgICBuYW1lOiAiYWNvbmZpZ19ob3N0X3Rlc3RfamF2YV9saWJyYXJ5IiwKKyAgICBhY29uZmlnX2RlY2xhcmF0aW9uczogImFjb25maWcudGVzdC5mbGFncyIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgbW9kZTogInRlc3QiLAorfQorCitqYXZhX3Rlc3RfaG9zdCB7CisgICAgbmFtZTogIkFjb25maWdKYXZhSG9zdFRlc3QiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInRlc3RzL0Fjb25maWdIb3N0VGVzdC5qYXZhIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhY29uZmlnX2hvc3RfdGVzdF9qYXZhX2xpYnJhcnkiLAorICAgICAgICAianVuaXQiLAorICAgIF0sCisgICAgdGVzdF9zdWl0ZXM6IFsiZ2VuZXJhbC10ZXN0cyJdLAorfQorCisvLyBpbnRlZ3JhdGlvbiB0ZXN0czogQysrCisKK2NjX2Fjb25maWdfbGlicmFyeSB7CisgICAgbmFtZTogImFjb25maWdfdGVzdF9jcHBfbGlicmFyeSIsCisgICAgYWNvbmZpZ19kZWNsYXJhdGlvbnM6ICJhY29uZmlnLnRlc3QuZmxhZ3MiLAorfQorCitjY19hY29uZmlnX2xpYnJhcnkgeworICAgIG5hbWU6ICJhY29uZmlnX3Rlc3RfY3BwX2xpYnJhcnlfdGVzdF92YXJpYW50IiwKKyAgICBhY29uZmlnX2RlY2xhcmF0aW9uczogImFjb25maWcudGVzdC5mbGFncyIsCisgICAgbW9kZTogInRlc3QiLAorfQorCitjY19hY29uZmlnX2xpYnJhcnkgeworICAgIG5hbWU6ICJhY29uZmlnX3Rlc3RfY3BwX2xpYnJhcnlfZm9yY2VfcmVhZF9vbmx5X3ZhcmlhbnQiLAorICAgIGFjb25maWdfZGVjbGFyYXRpb25zOiAiYWNvbmZpZy50ZXN0LmZsYWdzIiwKKyAgICBtb2RlOiAiZm9yY2UtcmVhZC1vbmx5IiwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogImFjb25maWcudGVzdC5jcHAiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInRlc3RzL2Fjb25maWdfdGVzdC5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFjb25maWdfdGVzdF9jcHBfbGlicmFyeSIsCisgICAgICAgICJsaWJnbW9jayIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAic2VydmVyX2NvbmZpZ3VyYWJsZV9mbGFncyIsCisgICAgXSwKKyAgICBkZWZhdWx0czogWworICAgICAgICAiYWNvbmZpZ19saWJfY2Nfc3RhdGljX2xpbmsuZGVmYXVsdHMiLAorICAgIF0sCisgICAgdGVzdF9zdWl0ZXM6IFsiZ2VuZXJhbC10ZXN0cyJdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiYWNvbmZpZy50ZXN0LmNwcC50ZXN0X21vZGUiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInRlc3RzL2Fjb25maWdfdGVzdF90ZXN0X3ZhcmlhbnQuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhY29uZmlnX3Rlc3RfY3BwX2xpYnJhcnlfdGVzdF92YXJpYW50IiwKKyAgICAgICAgImxpYmdtb2NrIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJzZXJ2ZXJfY29uZmlndXJhYmxlX2ZsYWdzIiwKKyAgICBdLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJhY29uZmlnX2xpYl9jY19zdGF0aWNfbGluay5kZWZhdWx0cyIsCisgICAgXSwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCit9CisKKy8vIFRPRE8oMzI3NDIwNjc5KTogRW5hYmxlIGV4cG9ydCBtb2RlIGZvciBuYXRpdmUgZmxhZyBsaWJyYXJ5CisvKgorY2NfYWNvbmZpZ19saWJyYXJ5IHsKKyAgICBuYW1lOiAiYWNvbmZpZ190ZXN0X2NwcF9saWJyYXJ5X2V4cG9ydGVkX3ZhcmlhbnQiLAorICAgIGFjb25maWdfZGVjbGFyYXRpb25zOiAiYWNvbmZpZy50ZXN0LmZsYWdzIiwKKyAgICBtb2RlOiAiZXhwb3J0ZWQiLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiYWNvbmZpZy50ZXN0LmNwcC5leHBvcnRlZF9tb2RlIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJ0ZXN0cy9hY29uZmlnX2V4cG9ydGVkX21vZGVfdGVzdC5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFjb25maWdfdGVzdF9jcHBfbGlicmFyeV9leHBvcnRlZF92YXJpYW50IiwKKyAgICAgICAgImxpYmdtb2NrIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJzZXJ2ZXJfY29uZmlndXJhYmxlX2ZsYWdzIiwKKyAgICBdLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJhY29uZmlnX2xpYl9jY19zdGF0aWNfbGluay5kZWZhdWx0cyIsCisgICAgXSwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCit9CisqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiYWNvbmZpZy50ZXN0LmNwcC5mb3JjZV9yZWFkX29ubHlfbW9kZSIsCisgICAgc3JjczogWworICAgICAgICAidGVzdHMvYWNvbmZpZ19mb3JjZV9yZWFkX29ubHlfbW9kZV90ZXN0LmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYWNvbmZpZ190ZXN0X2NwcF9saWJyYXJ5X2ZvcmNlX3JlYWRfb25seV92YXJpYW50IiwKKyAgICAgICAgImxpYmdtb2NrIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJzZXJ2ZXJfY29uZmlndXJhYmxlX2ZsYWdzIiwKKyAgICBdLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJhY29uZmlnX2xpYl9jY19zdGF0aWNfbGluay5kZWZhdWx0cyIsCisgICAgXSwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCit9CisKK3J1c3RfYWNvbmZpZ19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeSIsCisgICAgY3JhdGVfbmFtZTogImFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnkiLAorICAgIGFjb25maWdfZGVjbGFyYXRpb25zOiAiYWNvbmZpZy50ZXN0LmZsYWdzIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5jb25maWdpbmZyYXN0cnVjdHVyZSIsCisgICAgXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIzNCIsCit9CisKK3J1c3RfdGVzdCB7CisgICAgbmFtZTogImFjb25maWcucHJvZF9tb2RlLnRlc3QucnVzdCIsCisgICAgc3JjczogWworICAgICAgICAidGVzdHMvYWNvbmZpZ19wcm9kX21vZGVfdGVzdC5ycyIsCisgICAgXSwKKyAgICBydXN0bGliczogWworICAgICAgICAibGliYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeSIsCisgICAgXSwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCit9CisKK3J1c3RfYWNvbmZpZ19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeV93aXRoX3Rlc3RfbW9kZSIsCisgICAgY3JhdGVfbmFtZTogImFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnkiLAorICAgIGFjb25maWdfZGVjbGFyYXRpb25zOiAiYWNvbmZpZy50ZXN0LmZsYWdzIiwKKyAgICBtb2RlOiAidGVzdCIsCit9CisKK3J1c3RfdGVzdCB7CisgICAgbmFtZTogImFjb25maWcudGVzdF9tb2RlLnRlc3QucnVzdCIsCisgICAgc3JjczogWworICAgICAgICAidGVzdHMvYWNvbmZpZ190ZXN0X21vZGVfdGVzdC5ycyIsCisgICAgXSwKKyAgICBydXN0bGliczogWworICAgICAgICAibGliYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeV93aXRoX3Rlc3RfbW9kZSIsCisgICAgXSwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCit9CisKKy8vIFRPRE8oMzI3NDIwNjc5KTogRW5hYmxlIGV4cG9ydCBtb2RlIGZvciBuYXRpdmUgZmxhZyBsaWJyYXJ5CisvKgorcnVzdF9hY29uZmlnX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5X3dpdGhfZXhwb3J0ZWRfbW9kZSIsCisgICAgY3JhdGVfbmFtZTogImFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnkiLAorICAgIGFjb25maWdfZGVjbGFyYXRpb25zOiAiYWNvbmZpZy50ZXN0LmZsYWdzIiwKKyAgICBtb2RlOiAiZXhwb3J0ZWQiLAorfQorCitydXN0X3Rlc3QgeworICAgIG5hbWU6ICJhY29uZmlnLmV4cG9ydGVkX21vZGUudGVzdC5ydXN0IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJ0ZXN0cy9hY29uZmlnX2V4cG9ydGVkX21vZGVfdGVzdC5ycyIsCisgICAgXSwKKyAgICBydXN0bGliczogWworICAgICAgICAibGliYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeV93aXRoX2V4cG9ydGVkX21vZGUiLAorICAgIF0sCisgICAgdGVzdF9zdWl0ZXM6IFsiZ2VuZXJhbC10ZXN0cyJdLAorfQorKi8KKworcnVzdF9hY29uZmlnX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5X3dpdGhfZm9yY2VfcmVhZF9vbmx5X21vZGUiLAorICAgIGNyYXRlX25hbWU6ICJhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5IiwKKyAgICBhY29uZmlnX2RlY2xhcmF0aW9uczogImFjb25maWcudGVzdC5mbGFncyIsCisgICAgbW9kZTogImZvcmNlLXJlYWQtb25seSIsCit9CisKK3J1c3RfdGVzdCB7CisgICAgbmFtZTogImFjb25maWcuZm9yY2VfcmVhZF9vbmx5X21vZGUudGVzdC5ydXN0IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJ0ZXN0cy9hY29uZmlnX2ZvcmNlX3JlYWRfb25seV9tb2RlX3Rlc3QucnMiLAorICAgIF0sCisgICAgcnVzdGxpYnM6IFsKKyAgICAgICAgImxpYmFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnlfd2l0aF9mb3JjZV9yZWFkX29ubHlfbW9kZSIsCisgICAgXSwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvQ2FyZ28udG9tbCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9DYXJnby50b21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZDNlZTAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvQ2FyZ28udG9tbApAQCAtMCwwICsxLDE5IEBACitbcGFja2FnZV0KK25hbWUgPSAiYWNvbmZpZyIKK3ZlcnNpb24gPSAiMC4xLjAiCitlZGl0aW9uID0gIjIwMjEiCisKK1tmZWF0dXJlc10KK2RlZmF1bHQgPSBbImNhcmdvIl0KK2NhcmdvID0gW10KKworW2RlcGVuZGVuY2llc10KK2FueWhvdyA9ICIxLjAuNjkiCitjbGFwID0geyB2ZXJzaW9uID0gIjQuMS44IiwgZmVhdHVyZXMgPSBbImRlcml2ZSJdIH0KK2l0ZXJ0b29scyA9ICIwLjEwLjUiCitwcm90b2J1ZiA9ICIzLjIuMCIKK3NlcmRlID0geyB2ZXJzaW9uID0gIjEuMC4xNTIiLCBmZWF0dXJlcyA9IFsiZGVyaXZlIl0gfQorc2VyZGVfanNvbiA9ICIxLjAuOTMiCit0aW55dGVtcGxhdGUgPSAiMS4yLjEiCithY29uZmlnX3Byb3RvcyA9IHsgcGF0aCA9ICIuLi9hY29uZmlnX3Byb3RvcyIgfQorYWNvbmZpZ19zdG9yYWdlX2ZpbGUgPSB7IHBhdGggPSAiLi4vYWNvbmZpZ19zdG9yYWdlX2ZpbGUiIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29kZWdlbi9jcHAucnMgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvZGVnZW4vY3BwLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZDc3YzUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvZGVnZW4vY3BwLnJzCkBAIC0wLDAgKzEsMTI5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzZSBhbnlob3c6OntlbnN1cmUsIFJlc3VsdH07Cit1c2Ugc2VyZGU6OlNlcmlhbGl6ZTsKK3VzZSBzdGQ6OmNvbGxlY3Rpb25zOjpIYXNoTWFwOwordXNlIHN0ZDo6cGF0aDo6UGF0aEJ1ZjsKK3VzZSB0aW55dGVtcGxhdGU6OlRpbnlUZW1wbGF0ZTsKKwordXNlIGFjb25maWdfcHJvdG9zOjp7UHJvdG9GbGFnUGVybWlzc2lvbiwgUHJvdG9GbGFnU3RhdGUsIFByb3RvUGFyc2VkRmxhZ307CisKK3VzZSBjcmF0ZTo6Y29kZWdlbjsKK3VzZSBjcmF0ZTo6Y29kZWdlbjo6Q29kZWdlbk1vZGU7Cit1c2UgY3JhdGU6OmNvbW1hbmRzOjp7c2hvdWxkX2luY2x1ZGVfZmxhZywgT3V0cHV0RmlsZX07CisKK3B1YiBmbiBnZW5lcmF0ZV9jcHBfY29kZTxJPigKKyAgICBwYWNrYWdlOiAmc3RyLAorICAgIHBhcnNlZF9mbGFnc19pdGVyOiBJLAorICAgIGNvZGVnZW5fbW9kZTogQ29kZWdlbk1vZGUsCisgICAgZmxhZ19pZHM6IEhhc2hNYXA8U3RyaW5nLCB1MTY+LAorICAgIGFsbG93X2luc3RydW1lbnRhdGlvbjogYm9vbCwKKykgLT4gUmVzdWx0PFZlYzxPdXRwdXRGaWxlPj4KK3doZXJlCisgICAgSTogSXRlcmF0b3I8SXRlbSA9IFByb3RvUGFyc2VkRmxhZz4sCit7CisgICAgbGV0IG11dCByZWFkd3JpdGVfY291bnQgPSAwOworICAgIGxldCBjbGFzc19lbGVtZW50czogVmVjPENsYXNzRWxlbWVudD4gPSBwYXJzZWRfZmxhZ3NfaXRlcgorICAgICAgICAubWFwKHxwZnwgY3JlYXRlX2NsYXNzX2VsZW1lbnQocGFja2FnZSwgJnBmLCBmbGFnX2lkcy5jbG9uZSgpLCAmbXV0IHJlYWR3cml0ZV9jb3VudCkpCisgICAgICAgIC5jb2xsZWN0KCk7CisgICAgbGV0IHJlYWR3cml0ZSA9IHJlYWR3cml0ZV9jb3VudCA+IDA7CisgICAgbGV0IGhhc19maXhlZF9yZWFkX29ubHkgPSBjbGFzc19lbGVtZW50cy5pdGVyKCkuYW55KHxpdGVtfCBpdGVtLmlzX2ZpeGVkX3JlYWRfb25seSk7CisgICAgbGV0IGhlYWRlciA9IHBhY2thZ2UucmVwbGFjZSgnLicsICJfIik7CisgICAgbGV0IHBhY2thZ2VfbWFjcm8gPSBoZWFkZXIudG9fdXBwZXJjYXNlKCk7CisgICAgbGV0IGNwcF9uYW1lc3BhY2UgPSBwYWNrYWdlLnJlcGxhY2UoJy4nLCAiOjoiKTsKKyAgICBlbnN1cmUhKGNsYXNzX2VsZW1lbnRzLmxlbigpID4gMCk7CisgICAgbGV0IGNvbnRhaW5lciA9IGNsYXNzX2VsZW1lbnRzWzBdLmNvbnRhaW5lci5jbG9uZSgpOworICAgIGVuc3VyZSEoY29kZWdlbjo6aXNfdmFsaWRfbmFtZV9pZGVudCgmaGVhZGVyKSk7CisgICAgbGV0IGNvbnRleHQgPSBDb250ZXh0IHsKKyAgICAgICAgaGVhZGVyOiAmaGVhZGVyLAorICAgICAgICBwYWNrYWdlX21hY3JvOiAmcGFja2FnZV9tYWNybywKKyAgICAgICAgY3BwX25hbWVzcGFjZTogJmNwcF9uYW1lc3BhY2UsCisgICAgICAgIHBhY2thZ2UsCisgICAgICAgIGhhc19maXhlZF9yZWFkX29ubHksCisgICAgICAgIHJlYWR3cml0ZSwKKyAgICAgICAgcmVhZHdyaXRlX2NvdW50LAorICAgICAgICBpc190ZXN0X21vZGU6IGNvZGVnZW5fbW9kZSA9PSBDb2RlZ2VuTW9kZTo6VGVzdCwKKyAgICAgICAgY2xhc3NfZWxlbWVudHMsCisgICAgICAgIGNvbnRhaW5lciwKKyAgICAgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uLAorICAgIH07CisKKyAgICBsZXQgZmlsZXMgPSBbCisgICAgICAgIEZpbGVTcGVjIHsKKyAgICAgICAgICAgIG5hbWU6ICZmb3JtYXQhKCJ7fS5oIiwgaGVhZGVyKSwKKyAgICAgICAgICAgIHRlbXBsYXRlOiBpbmNsdWRlX3N0ciEoIi4uLy4uL3RlbXBsYXRlcy9jcHBfZXhwb3J0ZWRfaGVhZGVyLnRlbXBsYXRlIiksCisgICAgICAgICAgICBkaXI6ICJpbmNsdWRlIiwKKyAgICAgICAgfSwKKyAgICAgICAgRmlsZVNwZWMgeworICAgICAgICAgICAgbmFtZTogJmZvcm1hdCEoInt9LmNjIiwgaGVhZGVyKSwKKyAgICAgICAgICAgIHRlbXBsYXRlOiBpbmNsdWRlX3N0ciEoIi4uLy4uL3RlbXBsYXRlcy9jcHBfc291cmNlX2ZpbGUudGVtcGxhdGUiKSwKKyAgICAgICAgICAgIGRpcjogIiIsCisgICAgICAgIH0sCisgICAgXTsKKyAgICBmaWxlcy5pdGVyKCkubWFwKHxmaWxlfCBnZW5lcmF0ZV9maWxlKGZpbGUsICZjb250ZXh0KSkuY29sbGVjdCgpCit9CisKK3B1YiBmbiBnZW5lcmF0ZV9maWxlKGZpbGU6ICZGaWxlU3BlYywgY29udGV4dDogJkNvbnRleHQpIC0+IFJlc3VsdDxPdXRwdXRGaWxlPiB7CisgICAgbGV0IG11dCB0ZW1wbGF0ZSA9IFRpbnlUZW1wbGF0ZTo6bmV3KCk7CisgICAgdGVtcGxhdGUuYWRkX3RlbXBsYXRlKGZpbGUubmFtZSwgZmlsZS50ZW1wbGF0ZSk/OworICAgIGxldCBjb250ZW50cyA9IHRlbXBsYXRlLnJlbmRlcihmaWxlLm5hbWUsICZjb250ZXh0KT87CisgICAgbGV0IHBhdGg6IFBhdGhCdWYgPSBbJmZpbGUuZGlyLCAmZmlsZS5uYW1lXS5pdGVyKCkuY29sbGVjdCgpOworICAgIE9rKE91dHB1dEZpbGUgeyBjb250ZW50czogY29udGVudHMuaW50bygpLCBwYXRoIH0pCit9CisKKyNbZGVyaXZlKFNlcmlhbGl6ZSldCitwdWIgc3RydWN0IEZpbGVTcGVjPCdhPiB7CisgICAgcHViIG5hbWU6ICYnYSBzdHIsCisgICAgcHViIHRlbXBsYXRlOiAmJ2Egc3RyLAorICAgIHB1YiBkaXI6ICYnYSBzdHIsCit9CisKKyNbZGVyaXZlKFNlcmlhbGl6ZSldCitwdWIgc3RydWN0IENvbnRleHQ8J2E+IHsKKyAgICBwdWIgaGVhZGVyOiAmJ2Egc3RyLAorICAgIHB1YiBwYWNrYWdlX21hY3JvOiAmJ2Egc3RyLAorICAgIHB1YiBjcHBfbmFtZXNwYWNlOiAmJ2Egc3RyLAorICAgIHB1YiBwYWNrYWdlOiAmJ2Egc3RyLAorICAgIHB1YiBoYXNfZml4ZWRfcmVhZF9vbmx5OiBib29sLAorICAgIHB1YiByZWFkd3JpdGU6IGJvb2wsCisgICAgcHViIHJlYWR3cml0ZV9jb3VudDogaTMyLAorICAgIHB1YiBpc190ZXN0X21vZGU6IGJvb2wsCisgICAgcHViIGNsYXNzX2VsZW1lbnRzOiBWZWM8Q2xhc3NFbGVtZW50PiwKKyAgICBwdWIgY29udGFpbmVyOiBTdHJpbmcsCisgICAgcHViIGFsbG93X2luc3RydW1lbnRhdGlvbjogYm9vbCwKK30KKworI1tkZXJpdmUoU2VyaWFsaXplKV0KK3B1YiBzdHJ1Y3QgQ2xhc3NFbGVtZW50IHsKKyAgICBwdWIgcmVhZHdyaXRlX2lkeDogaTMyLAorICAgIHB1YiByZWFkd3JpdGU6IGJvb2wsCisgICAgcHViIGlzX2ZpeGVkX3JlYWRfb25seTogYm9vbCwKKyAgICBwdWIgZGVmYXVsdF92YWx1ZTogU3RyaW5nLAorICAgIHB1YiBmbGFnX25hbWU6IFN0cmluZywKKyAgICBwdWIgZmxhZ19tYWNybzogU3RyaW5nLAorICAgIHB1YiBmbGFnX29mZnNldDogdTE2LAorICAgIHB1YiBkZXZpY2VfY29uZmlnX25hbWVzcGFjZTogU3RyaW5nLAorICAgIHB1YiBkZXZpY2VfY29uZmlnX2ZsYWc6IFN0cmluZywKKyAgICBwdWIgY29udGFpbmVyOiBTdHJpbmcsCit9CisKK2ZuIGNyZWF0ZV9jbGFzc19lbGVtZW50KAorICAgIHBhY2thZ2U6ICZzdHIsCisgICAgcGY6ICZQcm90b1BhcnNlZEZsYWcsCisgICAgZmxhZ19pZHM6IEhhc2hNYXA8U3RyaW5nLCB1MTY+LAorICAgIHJ3X2NvdW50OiAmbXV0IGkzMiwKKykgLT4gQ2xhc3NFbGVtZW50IHsKKyAgICBsZXQgbm9fYXNzaWduZWRfb2Zmc2V0ID0gIXNob3VsZF9pbmNsdWRlX2ZsYWcocGYpOworCisgICAgbGV0IGZsYWdfb2Zmc2V0ID0gbWF0Y2ggZmxhZ19pZHMuZ2V0KHBmLm5hbWUoKSkgeworICAgICAgICBTb21lKG9mZnNldCkgPT4gb2Zmc2V0LAorICAgICAgICBOb25lID0+IHsKKyAgICAgICAgICAgIC8vIFN5c3RlbS92ZW5kb3IvcHJvZHVjdCBSTytkaXNhYmxlZCBmbGFncyBoYXZlIG5vIG9mZnNldCBpbiBzdG9yYWdlIGZpbGVzLgorICAgICAgICAgICAgLy8gQXNzaWduIHBsYWNlaG9sZGVyIHZhbHVlLgorICAgICAgICAgICAgaWYgbm9fYXNzaWduZWRfb2Zmc2V0IHsKKyAgICAgICAgICAgICAgICAmMAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQWxsIG90aGVyIGZsYWdzIF9tdXN0XyBoYXZlIGFuIG9mZnNldC4KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHBhbmljISgie30iLCBmb3JtYXQhKCJtaXNzaW5nIGZsYWcgb2Zmc2V0IGZvciB7fSIsIHBmLm5hbWUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIENsYXNzRWxlbWVudCB7CisgICAgICAgIHJlYWR3cml0ZV9pZHg6IGlmIHBmLnBlcm1pc3Npb24oKSA9PSBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFIHsKKyAgICAgICAgICAgIGxldCBpbmRleCA9ICpyd19jb3VudDsKKyAgICAgICAgICAgICpyd19jb3VudCArPSAxOworICAgICAgICAgICAgaW5kZXgKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC0xCisgICAgICAgIH0sCisgICAgICAgIHJlYWR3cml0ZTogcGYucGVybWlzc2lvbigpID09IFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfV1JJVEUsCisgICAgICAgIGlzX2ZpeGVkX3JlYWRfb25seTogcGYuaXNfZml4ZWRfcmVhZF9vbmx5KCksCisgICAgICAgIGRlZmF1bHRfdmFsdWU6IGlmIHBmLnN0YXRlKCkgPT0gUHJvdG9GbGFnU3RhdGU6OkVOQUJMRUQgeworICAgICAgICAgICAgInRydWUiLnRvX3N0cmluZygpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAiZmFsc2UiLnRvX3N0cmluZygpCisgICAgICAgIH0sCisgICAgICAgIGZsYWdfbmFtZTogcGYubmFtZSgpLnRvX3N0cmluZygpLAorICAgICAgICBmbGFnX21hY3JvOiBwZi5uYW1lKCkudG9fdXBwZXJjYXNlKCksCisgICAgICAgIGZsYWdfb2Zmc2V0OiAqZmxhZ19vZmZzZXQsCisgICAgICAgIGRldmljZV9jb25maWdfbmFtZXNwYWNlOiBwZi5uYW1lc3BhY2UoKS50b19zdHJpbmcoKSwKKyAgICAgICAgZGV2aWNlX2NvbmZpZ19mbGFnOiBjb2RlZ2VuOjpjcmVhdGVfZGV2aWNlX2NvbmZpZ19pZGVudChwYWNrYWdlLCBwZi5uYW1lKCkpCisgICAgICAgICAgICAuZXhwZWN0KCJ2YWx1ZXMgY2hlY2tlZCBhdCBmbGFnIHBhcnNlIHRpbWUiKSwKKyAgICAgICAgY29udGFpbmVyOiBwZi5jb250YWluZXIoKS50b19zdHJpbmcoKSwKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIGFjb25maWdfcHJvdG9zOjpQcm90b1BhcnNlZEZsYWdzOworICAgIHVzZSBzdGQ6OmNvbGxlY3Rpb25zOjpIYXNoTWFwOworCisgICAgY29uc3QgRVhQT1JURURfUFJPRF9IRUFERVJfRVhQRUNURUQ6ICZzdHIgPSByIyIKKyNwcmFnbWEgb25jZQorCisjaWZuZGVmIENPTV9BTkRST0lEX0FDT05GSUdfVEVTVAorI2RlZmluZSBDT01fQU5EUk9JRF9BQ09ORklHX1RFU1QoRkxBRykgQ09NX0FORFJPSURfQUNPTkZJR19URVNUXyMjRkxBRworI2VuZGlmCisKKyNpZm5kZWYgQ09NX0FORFJPSURfQUNPTkZJR19URVNUX0VOQUJMRURfRklYRURfUk8KKyNkZWZpbmUgQ09NX0FORFJPSURfQUNPTkZJR19URVNUX0VOQUJMRURfRklYRURfUk8gdHJ1ZQorI2VuZGlmCisKKyNpZm5kZWYgQ09NX0FORFJPSURfQUNPTkZJR19URVNUX0VOQUJMRURfRklYRURfUk9fRVhQT1JURUQKKyNkZWZpbmUgQ09NX0FORFJPSURfQUNPTkZJR19URVNUX0VOQUJMRURfRklYRURfUk9fRVhQT1JURUQgdHJ1ZQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0IHsKKworY2xhc3MgZmxhZ19wcm92aWRlcl9pbnRlcmZhY2UgeworcHVibGljOgorICAgIHZpcnR1YWwgfmZsYWdfcHJvdmlkZXJfaW50ZXJmYWNlKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBib29sIGRpc2FibGVkX3JvKCkgPSAwOworCisgICAgdmlydHVhbCBib29sIGRpc2FibGVkX3J3KCkgPSAwOworCisgICAgdmlydHVhbCBib29sIGRpc2FibGVkX3J3X2V4cG9ydGVkKCkgPSAwOworCisgICAgdmlydHVhbCBib29sIGRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX2ZpeGVkX3JvKCkgPSAwOworCisgICAgdmlydHVhbCBib29sIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoKSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgZW5hYmxlZF9ybygpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX3JvX2V4cG9ydGVkKCkgPSAwOworCisgICAgdmlydHVhbCBib29sIGVuYWJsZWRfcncoKSA9IDA7Cit9OworCitleHRlcm4gc3RkOjp1bmlxdWVfcHRyPGZsYWdfcHJvdmlkZXJfaW50ZXJmYWNlPiBwcm92aWRlcl87CisKK2lubGluZSBib29sIGRpc2FibGVkX3JvKCkgeworICAgIHJldHVybiBmYWxzZTsKK30KKworaW5saW5lIGJvb2wgZGlzYWJsZWRfcncoKSB7CisgICAgcmV0dXJuIHByb3ZpZGVyXy0+ZGlzYWJsZWRfcncoKTsKK30KKworaW5saW5lIGJvb2wgZGlzYWJsZWRfcndfZXhwb3J0ZWQoKSB7CisgICAgcmV0dXJuIHByb3ZpZGVyXy0+ZGlzYWJsZWRfcndfZXhwb3J0ZWQoKTsKK30KKworaW5saW5lIGJvb2wgZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKCkgeworICAgIHJldHVybiBwcm92aWRlcl8tPmRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgpOworfQorCitpbmxpbmUgYm9vbCBlbmFibGVkX2ZpeGVkX3JvKCkgeworICAgIHJldHVybiBDT01fQU5EUk9JRF9BQ09ORklHX1RFU1RfRU5BQkxFRF9GSVhFRF9STzsKK30KKworaW5saW5lIGJvb2wgZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgpIHsKKyAgICByZXR1cm4gQ09NX0FORFJPSURfQUNPTkZJR19URVNUX0VOQUJMRURfRklYRURfUk9fRVhQT1JURUQ7Cit9CisKK2lubGluZSBib29sIGVuYWJsZWRfcm8oKSB7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2lubGluZSBib29sIGVuYWJsZWRfcm9fZXhwb3J0ZWQoKSB7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2lubGluZSBib29sIGVuYWJsZWRfcncoKSB7CisgICAgcmV0dXJuIHByb3ZpZGVyXy0+ZW5hYmxlZF9ydygpOworfQorCit9CisKK2V4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2Rpc2FibGVkX3JvKCk7CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2Rpc2FibGVkX3J3KCk7CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2Rpc2FibGVkX3J3X2V4cG9ydGVkKCk7CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2Rpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX2ZpeGVkX3JvKCk7CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoKTsKKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9ybygpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX3JvX2V4cG9ydGVkKCk7CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcncoKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorIiM7CisKKyAgICBjb25zdCBFWFBPUlRFRF9URVNUX0hFQURFUl9FWFBFQ1RFRDogJnN0ciA9IHIjIgorI3ByYWdtYSBvbmNlCisKKyNpZmRlZiBfX2NwbHVzcGx1cworCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0IHsKKworY2xhc3MgZmxhZ19wcm92aWRlcl9pbnRlcmZhY2UgeworcHVibGljOgorCisgICAgdmlydHVhbCB+ZmxhZ19wcm92aWRlcl9pbnRlcmZhY2UoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIGJvb2wgZGlzYWJsZWRfcm8oKSA9IDA7CisgICAgdmlydHVhbCBib29sIGRpc2FibGVkX3J3KCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBkaXNhYmxlZF9yd19leHBvcnRlZCgpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX2ZpeGVkX3JvKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX3JvKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX3JvX2V4cG9ydGVkKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX3J3KCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIGRpc2FibGVkX3JvKGJvb2wgdmFsKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGRpc2FibGVkX3J3KGJvb2wgdmFsKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGRpc2FibGVkX3J3X2V4cG9ydGVkKGJvb2wgdmFsKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZShib29sIHZhbCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBlbmFibGVkX2ZpeGVkX3JvKGJvb2wgdmFsKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoYm9vbCB2YWwpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZW5hYmxlZF9ybyhib29sIHZhbCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBlbmFibGVkX3JvX2V4cG9ydGVkKGJvb2wgdmFsKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGVuYWJsZWRfcncoYm9vbCB2YWwpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCByZXNldF9mbGFncygpIHt9Cit9OworCitleHRlcm4gc3RkOjp1bmlxdWVfcHRyPGZsYWdfcHJvdmlkZXJfaW50ZXJmYWNlPiBwcm92aWRlcl87CisKK2lubGluZSBib29sIGRpc2FibGVkX3JvKCkgeworICAgIHJldHVybiBwcm92aWRlcl8tPmRpc2FibGVkX3JvKCk7Cit9CisKK2lubGluZSB2b2lkIGRpc2FibGVkX3JvKGJvb2wgdmFsKSB7CisgICAgcHJvdmlkZXJfLT5kaXNhYmxlZF9ybyh2YWwpOworfQorCitpbmxpbmUgYm9vbCBkaXNhYmxlZF9ydygpIHsKKyAgICByZXR1cm4gcHJvdmlkZXJfLT5kaXNhYmxlZF9ydygpOworfQorCitpbmxpbmUgdm9pZCBkaXNhYmxlZF9ydyhib29sIHZhbCkgeworICAgIHByb3ZpZGVyXy0+ZGlzYWJsZWRfcncodmFsKTsKK30KKworaW5saW5lIGJvb2wgZGlzYWJsZWRfcndfZXhwb3J0ZWQoKSB7CisgICAgcmV0dXJuIHByb3ZpZGVyXy0+ZGlzYWJsZWRfcndfZXhwb3J0ZWQoKTsKK30KKworaW5saW5lIHZvaWQgZGlzYWJsZWRfcndfZXhwb3J0ZWQoYm9vbCB2YWwpIHsKKyAgICBwcm92aWRlcl8tPmRpc2FibGVkX3J3X2V4cG9ydGVkKHZhbCk7Cit9CisKK2lubGluZSBib29sIGRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgpIHsKKyAgICByZXR1cm4gcHJvdmlkZXJfLT5kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UoKTsKK30KKworaW5saW5lIHZvaWQgZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKGJvb2wgdmFsKSB7CisgICAgcHJvdmlkZXJfLT5kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UodmFsKTsKK30KKworaW5saW5lIGJvb2wgZW5hYmxlZF9maXhlZF9ybygpIHsKKyAgICByZXR1cm4gcHJvdmlkZXJfLT5lbmFibGVkX2ZpeGVkX3JvKCk7Cit9CisKK2lubGluZSB2b2lkIGVuYWJsZWRfZml4ZWRfcm8oYm9vbCB2YWwpIHsKKyAgICBwcm92aWRlcl8tPmVuYWJsZWRfZml4ZWRfcm8odmFsKTsKK30KKworaW5saW5lIGJvb2wgZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgpIHsKKyAgICByZXR1cm4gcHJvdmlkZXJfLT5lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCk7Cit9CisKK2lubGluZSB2b2lkIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoYm9vbCB2YWwpIHsKKyAgICBwcm92aWRlcl8tPmVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQodmFsKTsKK30KKworaW5saW5lIGJvb2wgZW5hYmxlZF9ybygpIHsKKyAgICByZXR1cm4gcHJvdmlkZXJfLT5lbmFibGVkX3JvKCk7Cit9CisKK2lubGluZSB2b2lkIGVuYWJsZWRfcm8oYm9vbCB2YWwpIHsKKyAgICBwcm92aWRlcl8tPmVuYWJsZWRfcm8odmFsKTsKK30KKworaW5saW5lIGJvb2wgZW5hYmxlZF9yb19leHBvcnRlZCgpIHsKKyAgICByZXR1cm4gcHJvdmlkZXJfLT5lbmFibGVkX3JvX2V4cG9ydGVkKCk7Cit9CisKK2lubGluZSB2b2lkIGVuYWJsZWRfcm9fZXhwb3J0ZWQoYm9vbCB2YWwpIHsKKyAgICBwcm92aWRlcl8tPmVuYWJsZWRfcm9fZXhwb3J0ZWQodmFsKTsKK30KKworaW5saW5lIGJvb2wgZW5hYmxlZF9ydygpIHsKKyAgICByZXR1cm4gcHJvdmlkZXJfLT5lbmFibGVkX3J3KCk7Cit9CisKK2lubGluZSB2b2lkIGVuYWJsZWRfcncoYm9vbCB2YWwpIHsKKyAgICBwcm92aWRlcl8tPmVuYWJsZWRfcncodmFsKTsKK30KKworaW5saW5lIHZvaWQgcmVzZXRfZmxhZ3MoKSB7CisgICAgcmV0dXJuIHByb3ZpZGVyXy0+cmVzZXRfZmxhZ3MoKTsKK30KKworfQorCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9ybygpOworCit2b2lkIHNldF9jb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcm8oYm9vbCB2YWwpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9ydygpOworCit2b2lkIHNldF9jb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcncoYm9vbCB2YWwpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9yd19leHBvcnRlZCgpOworCit2b2lkIHNldF9jb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcndfZXhwb3J0ZWQoYm9vbCB2YWwpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UoKTsKKwordm9pZCBzZXRfY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2Rpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZShib29sIHZhbCk7CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfZml4ZWRfcm8oKTsKKwordm9pZCBzZXRfY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfZml4ZWRfcm8oYm9vbCB2YWwpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCk7CisKK3ZvaWQgc2V0X2NvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKGJvb2wgdmFsKTsKKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9ybygpOworCit2b2lkIHNldF9jb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9ybyhib29sIHZhbCk7CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcm9fZXhwb3J0ZWQoKTsKKwordm9pZCBzZXRfY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcm9fZXhwb3J0ZWQoYm9vbCB2YWwpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX3J3KCk7CisKK3ZvaWQgc2V0X2NvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX3J3KGJvb2wgdmFsKTsKKwordm9pZCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfcmVzZXRfZmxhZ3MoKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKworIiM7CisKKyAgICBjb25zdCBFWFBPUlRFRF9FWFBPUlRFRF9IRUFERVJfRVhQRUNURUQ6ICZzdHIgPSByIyIKKyNwcmFnbWEgb25jZQorCisjaWZkZWYgX19jcGx1c3BsdXMKKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdCB7CisKK2NsYXNzIGZsYWdfcHJvdmlkZXJfaW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5mbGFnX3Byb3ZpZGVyX2ludGVyZmFjZSgpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgYm9vbCBkaXNhYmxlZF9yd19leHBvcnRlZCgpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCkgPSAwOworCisgICAgdmlydHVhbCBib29sIGVuYWJsZWRfcm9fZXhwb3J0ZWQoKSA9IDA7Cit9OworCitleHRlcm4gc3RkOjp1bmlxdWVfcHRyPGZsYWdfcHJvdmlkZXJfaW50ZXJmYWNlPiBwcm92aWRlcl87CisKK2lubGluZSBib29sIGRpc2FibGVkX3J3X2V4cG9ydGVkKCkgeworICAgIHJldHVybiBwcm92aWRlcl8tPmRpc2FibGVkX3J3X2V4cG9ydGVkKCk7Cit9CisKK2lubGluZSBib29sIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoKSB7CisgICAgcmV0dXJuIHByb3ZpZGVyXy0+ZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgpOworfQorCitpbmxpbmUgYm9vbCBlbmFibGVkX3JvX2V4cG9ydGVkKCkgeworICAgIHJldHVybiBwcm92aWRlcl8tPmVuYWJsZWRfcm9fZXhwb3J0ZWQoKTsKK30KKworfQorCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9yd19leHBvcnRlZCgpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCk7CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcm9fZXhwb3J0ZWQoKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorIiM7CisKKyAgICBjb25zdCBFWFBPUlRFRF9GT1JDRV9SRUFEX09OTFlfSEVBREVSX0VYUEVDVEVEOiAmc3RyID0gciMiCisjcHJhZ21hIG9uY2UKKworI2lmbmRlZiBDT01fQU5EUk9JRF9BQ09ORklHX1RFU1QKKyNkZWZpbmUgQ09NX0FORFJPSURfQUNPTkZJR19URVNUKEZMQUcpIENPTV9BTkRST0lEX0FDT05GSUdfVEVTVF8jI0ZMQUcKKyNlbmRpZgorCisjaWZuZGVmIENPTV9BTkRST0lEX0FDT05GSUdfVEVTVF9FTkFCTEVEX0ZJWEVEX1JPCisjZGVmaW5lIENPTV9BTkRST0lEX0FDT05GSUdfVEVTVF9FTkFCTEVEX0ZJWEVEX1JPIHRydWUKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdCB7CisKK2NsYXNzIGZsYWdfcHJvdmlkZXJfaW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5mbGFnX3Byb3ZpZGVyX2ludGVyZmFjZSgpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgYm9vbCBkaXNhYmxlZF9ybygpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBkaXNhYmxlZF9ydygpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UoKSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgZW5hYmxlZF9maXhlZF9ybygpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX3JvKCkgPSAwOworCisgICAgdmlydHVhbCBib29sIGVuYWJsZWRfcncoKSA9IDA7Cit9OworCitleHRlcm4gc3RkOjp1bmlxdWVfcHRyPGZsYWdfcHJvdmlkZXJfaW50ZXJmYWNlPiBwcm92aWRlcl87CisKK2lubGluZSBib29sIGRpc2FibGVkX3JvKCkgeworICAgIHJldHVybiBmYWxzZTsKK30KKworaW5saW5lIGJvb2wgZGlzYWJsZWRfcncoKSB7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbmxpbmUgYm9vbCBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UoKSB7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbmxpbmUgYm9vbCBlbmFibGVkX2ZpeGVkX3JvKCkgeworICAgIHJldHVybiBDT01fQU5EUk9JRF9BQ09ORklHX1RFU1RfRU5BQkxFRF9GSVhFRF9STzsKK30KKworaW5saW5lIGJvb2wgZW5hYmxlZF9ybygpIHsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW5saW5lIGJvb2wgZW5hYmxlZF9ydygpIHsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfQorCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9ybygpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9ydygpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UoKTsKKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9maXhlZF9ybygpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX3JvKCk7CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcncoKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorIiM7CisKKyAgICBjb25zdCBQUk9EX1NPVVJDRV9GSUxFX0VYUEVDVEVEOiAmc3RyID0gciMiCisjaW5jbHVkZSAiY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0LmgiCisjaW5jbHVkZSA8c2VydmVyX2NvbmZpZ3VyYWJsZV9mbGFncy9nZXRfZmxhZ3MuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBjb206OmFuZHJvaWQ6OmFjb25maWc6OnRlc3QgeworCisgICAgY2xhc3MgZmxhZ19wcm92aWRlciA6IHB1YmxpYyBmbGFnX3Byb3ZpZGVyX2ludGVyZmFjZSB7CisgICAgICAgIHB1YmxpYzoKKworICAgICAgICAgICAgdmlydHVhbCBib29sIGRpc2FibGVkX3JvKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGRpc2FibGVkX3J3KCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIGlmIChjYWNoZV9bMF0gPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVfWzBdID0gc2VydmVyX2NvbmZpZ3VyYWJsZV9mbGFnczo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKKyAgICAgICAgICAgICAgICAgICAgICAgICJhY29uZmlnX2ZsYWdzLmFjb25maWdfdGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmYWxzZSIpID09ICJ0cnVlIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlX1swXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGRpc2FibGVkX3J3X2V4cG9ydGVkKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIGlmIChjYWNoZV9bMV0gPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVfWzFdID0gc2VydmVyX2NvbmZpZ3VyYWJsZV9mbGFnczo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKKyAgICAgICAgICAgICAgICAgICAgICAgICJhY29uZmlnX2ZsYWdzLmFjb25maWdfdGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2V4cG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmYWxzZSIpID09ICJ0cnVlIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlX1sxXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FjaGVfWzJdID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGNhY2hlX1syXSA9IHNlcnZlcl9jb25maWd1cmFibGVfZmxhZ3M6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCisgICAgICAgICAgICAgICAgICAgICAgICAiYWNvbmZpZ19mbGFncy5vdGhlcl9uYW1lc3BhY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgImZhbHNlIikgPT0gInRydWUiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVfWzJdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgZW5hYmxlZF9maXhlZF9ybygpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ09NX0FORFJPSURfQUNPTkZJR19URVNUX0VOQUJMRURfRklYRURfUk87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIHJldHVybiBDT01fQU5EUk9JRF9BQ09ORklHX1RFU1RfRU5BQkxFRF9GSVhFRF9ST19FWFBPUlRFRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGVuYWJsZWRfcm8oKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX3JvX2V4cG9ydGVkKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgZW5hYmxlZF9ydygpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FjaGVfWzNdID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGNhY2hlX1szXSA9IHNlcnZlcl9jb25maWd1cmFibGVfZmxhZ3M6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCisgICAgICAgICAgICAgICAgICAgICAgICAiYWNvbmZpZ19mbGFncy5hY29uZmlnX3Rlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3J3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0cnVlIikgPT0gInRydWUiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVfWzNdOworICAgICAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50OF90PiBjYWNoZV8gPSBzdGQ6OnZlY3RvcjxpbnQ4X3Q+KDQsIC0xKTsKKyAgICB9OworCisgICAgc3RkOjp1bmlxdWVfcHRyPGZsYWdfcHJvdmlkZXJfaW50ZXJmYWNlPiBwcm92aWRlcl8gPQorICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPGZsYWdfcHJvdmlkZXI+KCk7Cit9CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2Rpc2FibGVkX3JvKCkgeworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcncoKSB7CisgICAgcmV0dXJuIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZGlzYWJsZWRfcncoKTsKK30KKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcndfZXhwb3J0ZWQoKSB7CisgICAgcmV0dXJuIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZGlzYWJsZWRfcndfZXhwb3J0ZWQoKTsKK30KKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKCkgeworICAgIHJldHVybiBjb206OmFuZHJvaWQ6OmFjb25maWc6OnRlc3Q6OmRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgpOworfQorCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX2ZpeGVkX3JvKCkgeworICAgIHJldHVybiBDT01fQU5EUk9JRF9BQ09ORklHX1RFU1RfRU5BQkxFRF9GSVhFRF9STzsKK30KKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgpIHsKKyAgICByZXR1cm4gQ09NX0FORFJPSURfQUNPTkZJR19URVNUX0VOQUJMRURfRklYRURfUk9fRVhQT1JURUQ7Cit9CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcm8oKSB7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcm9fZXhwb3J0ZWQoKSB7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcncoKSB7CisgICAgcmV0dXJuIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZW5hYmxlZF9ydygpOworfQorCisiIzsKKworICAgIGNvbnN0IFRFU1RfU09VUkNFX0ZJTEVfRVhQRUNURUQ6ICZzdHIgPSByIyIKKyNpbmNsdWRlICJjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3QuaCIKKyNpbmNsdWRlIDxzZXJ2ZXJfY29uZmlndXJhYmxlX2ZsYWdzL2dldF9mbGFncy5oPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0IHsKKworICAgIGNsYXNzIGZsYWdfcHJvdmlkZXIgOiBwdWJsaWMgZmxhZ19wcm92aWRlcl9pbnRlcmZhY2UgeworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBib29sPiBvdmVycmlkZXNfOworCisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGZsYWdfcHJvdmlkZXIoKQorICAgICAgICAgICAgICAgIDogb3ZlcnJpZGVzXygpCisgICAgICAgICAgICB7fQorCisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgZGlzYWJsZWRfcm8oKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgYXV0byBpdCA9IG92ZXJyaWRlc18uZmluZCgiZGlzYWJsZWRfcm8iKTsKKyAgICAgICAgICAgICAgICAgIGlmIChpdCAhPSBvdmVycmlkZXNfLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBkaXNhYmxlZF9ybyhib29sIHZhbCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIG92ZXJyaWRlc19bImRpc2FibGVkX3JvIl0gPSB2YWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBkaXNhYmxlZF9ydygpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICBhdXRvIGl0ID0gb3ZlcnJpZGVzXy5maW5kKCJkaXNhYmxlZF9ydyIpOworICAgICAgICAgICAgICAgICAgaWYgKGl0ICE9IG92ZXJyaWRlc18uZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZlcl9jb25maWd1cmFibGVfZmxhZ3M6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCisgICAgICAgICAgICAgICAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3IiwKKyAgICAgICAgICAgICAgICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZGlzYWJsZWRfcncoYm9vbCB2YWwpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICBvdmVycmlkZXNfWyJkaXNhYmxlZF9ydyJdID0gdmFsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgZGlzYWJsZWRfcndfZXhwb3J0ZWQoKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgYXV0byBpdCA9IG92ZXJyaWRlc18uZmluZCgiZGlzYWJsZWRfcndfZXhwb3J0ZWQiKTsKKyAgICAgICAgICAgICAgICAgIGlmIChpdCAhPSBvdmVycmlkZXNfLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2ZXJfY29uZmlndXJhYmxlX2ZsYWdzOjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAgICAgICAgICAgICAgICJhY29uZmlnX2ZsYWdzLmFjb25maWdfdGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19leHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgImZhbHNlIikgPT0gInRydWUiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCB2b2lkIGRpc2FibGVkX3J3X2V4cG9ydGVkKGJvb2wgdmFsKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgb3ZlcnJpZGVzX1siZGlzYWJsZWRfcndfZXhwb3J0ZWQiXSA9IHZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICBhdXRvIGl0ID0gb3ZlcnJpZGVzXy5maW5kKCJkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UiKTsKKyAgICAgICAgICAgICAgICAgIGlmIChpdCAhPSBvdmVycmlkZXNfLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2ZXJfY29uZmlndXJhYmxlX2ZsYWdzOjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAgICAgICAgICAgICAgICJhY29uZmlnX2ZsYWdzLm90aGVyX25hbWVzcGFjZSIsCisgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UiLAorICAgICAgICAgICAgICAgICAgICAgICJmYWxzZSIpID09ICJ0cnVlIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UoYm9vbCB2YWwpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICBvdmVycmlkZXNfWyJkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UiXSA9IHZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGVuYWJsZWRfZml4ZWRfcm8oKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgYXV0byBpdCA9IG92ZXJyaWRlc18uZmluZCgiZW5hYmxlZF9maXhlZF9ybyIpOworICAgICAgICAgICAgICAgICAgaWYgKGl0ICE9IG92ZXJyaWRlc18uZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZW5hYmxlZF9maXhlZF9ybyhib29sIHZhbCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIG92ZXJyaWRlc19bImVuYWJsZWRfZml4ZWRfcm8iXSA9IHZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgYXV0byBpdCA9IG92ZXJyaWRlc18uZmluZCgiZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCIpOworICAgICAgICAgICAgICAgICAgaWYgKGl0ICE9IG92ZXJyaWRlc18uZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZChib29sIHZhbCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIG92ZXJyaWRlc19bImVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQiXSA9IHZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGVuYWJsZWRfcm8oKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgYXV0byBpdCA9IG92ZXJyaWRlc18uZmluZCgiZW5hYmxlZF9ybyIpOworICAgICAgICAgICAgICAgICAgaWYgKGl0ICE9IG92ZXJyaWRlc18uZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZW5hYmxlZF9ybyhib29sIHZhbCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIG92ZXJyaWRlc19bImVuYWJsZWRfcm8iXSA9IHZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGVuYWJsZWRfcm9fZXhwb3J0ZWQoKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgYXV0byBpdCA9IG92ZXJyaWRlc18uZmluZCgiZW5hYmxlZF9yb19leHBvcnRlZCIpOworICAgICAgICAgICAgICAgICAgaWYgKGl0ICE9IG92ZXJyaWRlc18uZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZW5hYmxlZF9yb19leHBvcnRlZChib29sIHZhbCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIG92ZXJyaWRlc19bImVuYWJsZWRfcm9fZXhwb3J0ZWQiXSA9IHZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGVuYWJsZWRfcncoKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgYXV0byBpdCA9IG92ZXJyaWRlc18uZmluZCgiZW5hYmxlZF9ydyIpOworICAgICAgICAgICAgICAgICAgaWYgKGl0ICE9IG92ZXJyaWRlc18uZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZlcl9jb25maWd1cmFibGVfZmxhZ3M6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCisgICAgICAgICAgICAgICAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcnciLAorICAgICAgICAgICAgICAgICAgICAgICJ0cnVlIikgPT0gInRydWUiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCB2b2lkIGVuYWJsZWRfcncoYm9vbCB2YWwpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICBvdmVycmlkZXNfWyJlbmFibGVkX3J3Il0gPSB2YWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCByZXNldF9mbGFncygpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICBvdmVycmlkZXNfLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgfTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxmbGFnX3Byb3ZpZGVyX2ludGVyZmFjZT4gcHJvdmlkZXJfID0KKyAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxmbGFnX3Byb3ZpZGVyPigpOworfQorCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9ybygpIHsKKyAgICByZXR1cm4gY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0OjpkaXNhYmxlZF9ybygpOworfQorCisKK3ZvaWQgc2V0X2NvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9ybyhib29sIHZhbCkgeworICAgIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZGlzYWJsZWRfcm8odmFsKTsKK30KKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcncoKSB7CisgICAgcmV0dXJuIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZGlzYWJsZWRfcncoKTsKK30KKworCit2b2lkIHNldF9jb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcncoYm9vbCB2YWwpIHsKKyAgICBjb206OmFuZHJvaWQ6OmFjb25maWc6OnRlc3Q6OmRpc2FibGVkX3J3KHZhbCk7Cit9CisKKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcndfZXhwb3J0ZWQoKSB7CisgICAgcmV0dXJuIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZGlzYWJsZWRfcndfZXhwb3J0ZWQoKTsKK30KKwordm9pZCBzZXRfY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2Rpc2FibGVkX3J3X2V4cG9ydGVkKGJvb2wgdmFsKSB7CisgICAgY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0OjpkaXNhYmxlZF9yd19leHBvcnRlZCh2YWwpOworfQorCisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2Rpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgpIHsKKyAgICByZXR1cm4gY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0OjpkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UoKTsKK30KKwordm9pZCBzZXRfY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2Rpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZShib29sIHZhbCkgeworICAgIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKHZhbCk7Cit9CisKKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9maXhlZF9ybygpIHsKKyAgICByZXR1cm4gY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0OjplbmFibGVkX2ZpeGVkX3JvKCk7Cit9CisKK3ZvaWQgc2V0X2NvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX2ZpeGVkX3JvKGJvb2wgdmFsKSB7CisgICAgY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0OjplbmFibGVkX2ZpeGVkX3JvKHZhbCk7Cit9CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoKSB7CisgICAgcmV0dXJuIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgpOworfQorCit2b2lkIHNldF9jb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZChib29sIHZhbCkgeworICAgIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCh2YWwpOworfQorCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX3JvKCkgeworICAgIHJldHVybiBjb206OmFuZHJvaWQ6OmFjb25maWc6OnRlc3Q6OmVuYWJsZWRfcm8oKTsKK30KKworCit2b2lkIHNldF9jb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9ybyhib29sIHZhbCkgeworICAgIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZW5hYmxlZF9ybyh2YWwpOworfQorCisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcm9fZXhwb3J0ZWQoKSB7CisgICAgcmV0dXJuIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZW5hYmxlZF9yb19leHBvcnRlZCgpOworfQorCisKK3ZvaWQgc2V0X2NvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX3JvX2V4cG9ydGVkKGJvb2wgdmFsKSB7CisgICAgY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0OjplbmFibGVkX3JvX2V4cG9ydGVkKHZhbCk7Cit9CisKKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9ydygpIHsKKyAgICByZXR1cm4gY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0OjplbmFibGVkX3J3KCk7Cit9CisKKwordm9pZCBzZXRfY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcncoYm9vbCB2YWwpIHsKKyAgICBjb206OmFuZHJvaWQ6OmFjb25maWc6OnRlc3Q6OmVuYWJsZWRfcncodmFsKTsKK30KKwordm9pZCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfcmVzZXRfZmxhZ3MoKSB7CisgICAgIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6cmVzZXRfZmxhZ3MoKTsKK30KKworIiM7CisKKyAgICBjb25zdCBFWFBPUlRFRF9TT1VSQ0VfRklMRV9FWFBFQ1RFRDogJnN0ciA9IHIjIgorI2luY2x1ZGUgImNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdC5oIgorI2luY2x1ZGUgPHNlcnZlcl9jb25maWd1cmFibGVfZmxhZ3MvZ2V0X2ZsYWdzLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0IHsKKworICAgIGNsYXNzIGZsYWdfcHJvdmlkZXIgOiBwdWJsaWMgZmxhZ19wcm92aWRlcl9pbnRlcmZhY2UgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgZGlzYWJsZWRfcndfZXhwb3J0ZWQoKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgaWYgKGNhY2hlX1swXSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBjYWNoZV9bMF0gPSBzZXJ2ZXJfY29uZmlndXJhYmxlX2ZsYWdzOjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAgICAgICAgICAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcndfZXhwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgImZhbHNlIikgPT0gInRydWUiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVfWzBdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FjaGVfWzFdID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGNhY2hlX1sxXSA9IHNlcnZlcl9jb25maWd1cmFibGVfZmxhZ3M6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCisgICAgICAgICAgICAgICAgICAgICAgICAiYWNvbmZpZ19mbGFncy5hY29uZmlnX3Rlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmYWxzZSIpID09ICJ0cnVlIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlX1sxXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGVuYWJsZWRfcm9fZXhwb3J0ZWQoKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgaWYgKGNhY2hlX1syXSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBjYWNoZV9bMl0gPSBzZXJ2ZXJfY29uZmlndXJhYmxlX2ZsYWdzOjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAgICAgICAgICAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9yb19leHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZV9bMl07CisgICAgICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ4X3Q+IGNhY2hlXyA9IHN0ZDo6dmVjdG9yPGludDhfdD4oMywgLTEpOworICAgIH07CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8ZmxhZ19wcm92aWRlcl9pbnRlcmZhY2U+IHByb3ZpZGVyXyA9CisgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8ZmxhZ19wcm92aWRlcj4oKTsKK30KKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcndfZXhwb3J0ZWQoKSB7CisgICAgcmV0dXJuIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZGlzYWJsZWRfcndfZXhwb3J0ZWQoKTsKK30KKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgpIHsKKyAgICByZXR1cm4gY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0OjplbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCk7Cit9CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcm9fZXhwb3J0ZWQoKSB7CisgICAgcmV0dXJuIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZW5hYmxlZF9yb19leHBvcnRlZCgpOworfQorCisKKyIjOworCisgICAgY29uc3QgRk9SQ0VfUkVBRF9PTkxZX1NPVVJDRV9GSUxFX0VYUEVDVEVEOiAmc3RyID0gciMiCisjaW5jbHVkZSAiY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0LmgiCisKK25hbWVzcGFjZSBjb206OmFuZHJvaWQ6OmFjb25maWc6OnRlc3QgeworCisgICAgY2xhc3MgZmxhZ19wcm92aWRlciA6IHB1YmxpYyBmbGFnX3Byb3ZpZGVyX2ludGVyZmFjZSB7CisgICAgICAgIHB1YmxpYzoKKworICAgICAgICAgICAgdmlydHVhbCBib29sIGRpc2FibGVkX3JvKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGRpc2FibGVkX3J3KCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX2ZpeGVkX3JvKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIHJldHVybiBDT01fQU5EUk9JRF9BQ09ORklHX1RFU1RfRU5BQkxFRF9GSVhFRF9STzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBib29sIGVuYWJsZWRfcm8oKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX3J3KCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgIH07CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8ZmxhZ19wcm92aWRlcl9pbnRlcmZhY2U+IHByb3ZpZGVyXyA9CisgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8ZmxhZ19wcm92aWRlcj4oKTsKK30KKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcm8oKSB7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9ydygpIHsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2Rpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgpIHsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfZml4ZWRfcm8oKSB7CisgICAgcmV0dXJuIENPTV9BTkRST0lEX0FDT05GSUdfVEVTVF9FTkFCTEVEX0ZJWEVEX1JPOworfQorCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX3JvKCkgeworICAgIHJldHVybiB0cnVlOworfQorCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX3J3KCkgeworICAgIHJldHVybiB0cnVlOworfQorCisiIzsKKworICAgIGNvbnN0IFJFQURfT05MWV9FWFBPUlRFRF9QUk9EX0hFQURFUl9FWFBFQ1RFRDogJnN0ciA9IHIjIgorI3ByYWdtYSBvbmNlCisKKyNpZm5kZWYgQ09NX0FORFJPSURfQUNPTkZJR19URVNUCisjZGVmaW5lIENPTV9BTkRST0lEX0FDT05GSUdfVEVTVChGTEFHKSBDT01fQU5EUk9JRF9BQ09ORklHX1RFU1RfIyNGTEFHCisjZW5kaWYKKworI2lmbmRlZiBDT01fQU5EUk9JRF9BQ09ORklHX1RFU1RfRElTQUJMRURfRklYRURfUk8KKyNkZWZpbmUgQ09NX0FORFJPSURfQUNPTkZJR19URVNUX0RJU0FCTEVEX0ZJWEVEX1JPIGZhbHNlCisjZW5kaWYKKworI2lmbmRlZiBDT01fQU5EUk9JRF9BQ09ORklHX1RFU1RfRU5BQkxFRF9GSVhFRF9STworI2RlZmluZSBDT01fQU5EUk9JRF9BQ09ORklHX1RFU1RfRU5BQkxFRF9GSVhFRF9STyB0cnVlCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBjb206OmFuZHJvaWQ6OmFjb25maWc6OnRlc3QgeworCitjbGFzcyBmbGFnX3Byb3ZpZGVyX2ludGVyZmFjZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+ZmxhZ19wcm92aWRlcl9pbnRlcmZhY2UoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIGJvb2wgZGlzYWJsZWRfZml4ZWRfcm8oKSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgZGlzYWJsZWRfcm8oKSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgZW5hYmxlZF9maXhlZF9ybygpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX3JvKCkgPSAwOworfTsKKworZXh0ZXJuIHN0ZDo6dW5pcXVlX3B0cjxmbGFnX3Byb3ZpZGVyX2ludGVyZmFjZT4gcHJvdmlkZXJfOworCitpbmxpbmUgYm9vbCBkaXNhYmxlZF9maXhlZF9ybygpIHsKKyAgICByZXR1cm4gQ09NX0FORFJPSURfQUNPTkZJR19URVNUX0RJU0FCTEVEX0ZJWEVEX1JPOworfQorCitpbmxpbmUgYm9vbCBkaXNhYmxlZF9ybygpIHsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2lubGluZSBib29sIGVuYWJsZWRfZml4ZWRfcm8oKSB7CisgICAgcmV0dXJuIENPTV9BTkRST0lEX0FDT05GSUdfVEVTVF9FTkFCTEVEX0ZJWEVEX1JPOworfQorCitpbmxpbmUgYm9vbCBlbmFibGVkX3JvKCkgeworICAgIHJldHVybiB0cnVlOworfQorfQorCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9maXhlZF9ybygpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9ybygpOworCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX2ZpeGVkX3JvKCk7CisKK2Jvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcm8oKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorIiM7CisKKyAgICBjb25zdCBSRUFEX09OTFlfUFJPRF9TT1VSQ0VfRklMRV9FWFBFQ1RFRDogJnN0ciA9IHIjIgorI2luY2x1ZGUgImNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdC5oIgorCituYW1lc3BhY2UgY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0IHsKKworICAgIGNsYXNzIGZsYWdfcHJvdmlkZXIgOiBwdWJsaWMgZmxhZ19wcm92aWRlcl9pbnRlcmZhY2UgeworICAgICAgICBwdWJsaWM6CisKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBkaXNhYmxlZF9maXhlZF9ybygpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ09NX0FORFJPSURfQUNPTkZJR19URVNUX0RJU0FCTEVEX0ZJWEVEX1JPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgZGlzYWJsZWRfcm8oKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgZW5hYmxlZF9maXhlZF9ybygpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ09NX0FORFJPSURfQUNPTkZJR19URVNUX0VOQUJMRURfRklYRURfUk87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX3JvKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgIH07CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8ZmxhZ19wcm92aWRlcl9pbnRlcmZhY2U+IHByb3ZpZGVyXyA9CisgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8ZmxhZ19wcm92aWRlcj4oKTsKK30KKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfZml4ZWRfcm8oKSB7CisgICAgcmV0dXJuIENPTV9BTkRST0lEX0FDT05GSUdfVEVTVF9ESVNBQkxFRF9GSVhFRF9STzsKK30KKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcm8oKSB7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX2ZpeGVkX3JvKCkgeworICAgIHJldHVybiBDT01fQU5EUk9JRF9BQ09ORklHX1RFU1RfRU5BQkxFRF9GSVhFRF9STzsKK30KKworYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9ybygpIHsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKyIjOworICAgIHVzZSBjcmF0ZTo6Y29tbWFuZHM6OmFzc2lnbl9mbGFnX2lkczsKKworICAgIGZuIHRlc3RfZ2VuZXJhdGVfY3BwX2NvZGUoCisgICAgICAgIHBhcnNlZF9mbGFnczogUHJvdG9QYXJzZWRGbGFncywKKyAgICAgICAgbW9kZTogQ29kZWdlbk1vZGUsCisgICAgICAgIGV4cGVjdGVkX2hlYWRlcjogJnN0ciwKKyAgICAgICAgZXhwZWN0ZWRfc3JjOiAmc3RyLAorICAgICAgICBhbGxvd19pbnN0cnVtZW50YXRpb246IGJvb2wsCisgICAgKSB7CisgICAgICAgIGxldCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MgPQorICAgICAgICAgICAgY3JhdGU6OmNvbW1hbmRzOjptb2RpZnlfcGFyc2VkX2ZsYWdzX2Jhc2VkX29uX21vZGUocGFyc2VkX2ZsYWdzLCBtb2RlKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGZsYWdfaWRzID0KKyAgICAgICAgICAgIGFzc2lnbl9mbGFnX2lkcyhjcmF0ZTo6dGVzdDo6VEVTVF9QQUNLQUdFLCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaXRlcigpKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGdlbmVyYXRlZCA9IGdlbmVyYXRlX2NwcF9jb2RlKAorICAgICAgICAgICAgY3JhdGU6OnRlc3Q6OlRFU1RfUEFDS0FHRSwKKyAgICAgICAgICAgIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pbnRvX2l0ZXIoKSwKKyAgICAgICAgICAgIG1vZGUsCisgICAgICAgICAgICBmbGFnX2lkcywKKyAgICAgICAgICAgIGFsbG93X2luc3RydW1lbnRhdGlvbiwKKyAgICAgICAgKQorICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBtdXQgZ2VuZXJhdGVkX2ZpbGVzX21hcCA9IEhhc2hNYXA6Om5ldygpOworICAgICAgICBmb3IgZmlsZSBpbiBnZW5lcmF0ZWQgeworICAgICAgICAgICAgZ2VuZXJhdGVkX2ZpbGVzX21hcC5pbnNlcnQoCisgICAgICAgICAgICAgICAgU3RyaW5nOjpmcm9tKGZpbGUucGF0aC50b19zdHIoKS51bndyYXAoKSksCisgICAgICAgICAgICAgICAgU3RyaW5nOjpmcm9tX3V0ZjgoZmlsZS5jb250ZW50cykudW53cmFwKCksCisgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgbGV0IG11dCB0YXJnZXRfZmlsZV9wYXRoID0gU3RyaW5nOjpmcm9tKCJpbmNsdWRlL2NvbV9hbmRyb2lkX2Fjb25maWdfdGVzdC5oIik7CisgICAgICAgIGFzc2VydCEoZ2VuZXJhdGVkX2ZpbGVzX21hcC5jb250YWluc19rZXkoJnRhcmdldF9maWxlX3BhdGgpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICBjcmF0ZTo6dGVzdDo6Zmlyc3Rfc2lnbmlmaWNhbnRfY29kZV9kaWZmKAorICAgICAgICAgICAgICAgIGV4cGVjdGVkX2hlYWRlciwKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZWRfZmlsZXNfbWFwLmdldCgmdGFyZ2V0X2ZpbGVfcGF0aCkudW53cmFwKCkKKyAgICAgICAgICAgICkKKyAgICAgICAgKTsKKworICAgICAgICB0YXJnZXRfZmlsZV9wYXRoID0gU3RyaW5nOjpmcm9tKCJjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3QuY2MiKTsKKyAgICAgICAgYXNzZXJ0IShnZW5lcmF0ZWRfZmlsZXNfbWFwLmNvbnRhaW5zX2tleSgmdGFyZ2V0X2ZpbGVfcGF0aCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgIGNyYXRlOjp0ZXN0OjpmaXJzdF9zaWduaWZpY2FudF9jb2RlX2RpZmYoCisgICAgICAgICAgICAgICAgZXhwZWN0ZWRfc3JjLAorICAgICAgICAgICAgICAgIGdlbmVyYXRlZF9maWxlc19tYXAuZ2V0KCZ0YXJnZXRfZmlsZV9wYXRoKS51bndyYXAoKQorICAgICAgICAgICAgKQorICAgICAgICApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2dlbmVyYXRlX2NwcF9jb2RlX2Zvcl9wcm9kKCkgeworICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0gY3JhdGU6OnRlc3Q6OnBhcnNlX3Rlc3RfZmxhZ3MoKTsKKyAgICAgICAgdGVzdF9nZW5lcmF0ZV9jcHBfY29kZSgKKyAgICAgICAgICAgIHBhcnNlZF9mbGFncywKKyAgICAgICAgICAgIENvZGVnZW5Nb2RlOjpQcm9kdWN0aW9uLAorICAgICAgICAgICAgRVhQT1JURURfUFJPRF9IRUFERVJfRVhQRUNURUQsCisgICAgICAgICAgICBQUk9EX1NPVVJDRV9GSUxFX0VYUEVDVEVELAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfZ2VuZXJhdGVfY3BwX2NvZGVfZm9yX3Rlc3QoKSB7CisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPSBjcmF0ZTo6dGVzdDo6cGFyc2VfdGVzdF9mbGFncygpOworICAgICAgICB0ZXN0X2dlbmVyYXRlX2NwcF9jb2RlKAorICAgICAgICAgICAgcGFyc2VkX2ZsYWdzLAorICAgICAgICAgICAgQ29kZWdlbk1vZGU6OlRlc3QsCisgICAgICAgICAgICBFWFBPUlRFRF9URVNUX0hFQURFUl9FWFBFQ1RFRCwKKyAgICAgICAgICAgIFRFU1RfU09VUkNFX0ZJTEVfRVhQRUNURUQsCisgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9nZW5lcmF0ZV9jcHBfY29kZV9mb3JfZXhwb3J0ZWQoKSB7CisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPSBjcmF0ZTo6dGVzdDo6cGFyc2VfdGVzdF9mbGFncygpOworICAgICAgICB0ZXN0X2dlbmVyYXRlX2NwcF9jb2RlKAorICAgICAgICAgICAgcGFyc2VkX2ZsYWdzLAorICAgICAgICAgICAgQ29kZWdlbk1vZGU6OkV4cG9ydGVkLAorICAgICAgICAgICAgRVhQT1JURURfRVhQT1JURURfSEVBREVSX0VYUEVDVEVELAorICAgICAgICAgICAgRVhQT1JURURfU09VUkNFX0ZJTEVfRVhQRUNURUQsCisgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9nZW5lcmF0ZV9jcHBfY29kZV9mb3JfZm9yY2VfcmVhZF9vbmx5KCkgeworICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0gY3JhdGU6OnRlc3Q6OnBhcnNlX3Rlc3RfZmxhZ3MoKTsKKyAgICAgICAgdGVzdF9nZW5lcmF0ZV9jcHBfY29kZSgKKyAgICAgICAgICAgIHBhcnNlZF9mbGFncywKKyAgICAgICAgICAgIENvZGVnZW5Nb2RlOjpGb3JjZVJlYWRPbmx5LAorICAgICAgICAgICAgRVhQT1JURURfRk9SQ0VfUkVBRF9PTkxZX0hFQURFUl9FWFBFQ1RFRCwKKyAgICAgICAgICAgIEZPUkNFX1JFQURfT05MWV9TT1VSQ0VfRklMRV9FWFBFQ1RFRCwKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2dlbmVyYXRlX2NwcF9jb2RlX2Zvcl9yZWFkX29ubHlfcHJvZCgpIHsKKyAgICAgICAgbGV0IHBhcnNlZF9mbGFncyA9IGNyYXRlOjp0ZXN0OjpwYXJzZV9yZWFkX29ubHlfdGVzdF9mbGFncygpOworICAgICAgICB0ZXN0X2dlbmVyYXRlX2NwcF9jb2RlKAorICAgICAgICAgICAgcGFyc2VkX2ZsYWdzLAorICAgICAgICAgICAgQ29kZWdlbk1vZGU6OlByb2R1Y3Rpb24sCisgICAgICAgICAgICBSRUFEX09OTFlfRVhQT1JURURfUFJPRF9IRUFERVJfRVhQRUNURUQsCisgICAgICAgICAgICBSRUFEX09OTFlfUFJPRF9TT1VSQ0VfRklMRV9FWFBFQ1RFRCwKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29kZWdlbi9qYXZhLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb2RlZ2VuL2phdmEucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQwMjVlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29kZWdlbi9qYXZhLnJzCkBAIC0wLDAgKzEsMTUxMCBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCit1c2UgYW55aG93OjpSZXN1bHQ7Cit1c2Ugc2VyZGU6OlNlcmlhbGl6ZTsKK3VzZSBzdGQ6OmNvbGxlY3Rpb25zOjp7QlRyZWVNYXAsIEJUcmVlU2V0fTsKK3VzZSBzdGQ6OnBhdGg6OlBhdGhCdWY7Cit1c2UgdGlueXRlbXBsYXRlOjpUaW55VGVtcGxhdGU7CisKK3VzZSBjcmF0ZTo6Y29kZWdlbjsKK3VzZSBjcmF0ZTo6Y29kZWdlbjo6Q29kZWdlbk1vZGU7Cit1c2UgY3JhdGU6OmNvbW1hbmRzOjp7c2hvdWxkX2luY2x1ZGVfZmxhZywgT3V0cHV0RmlsZX07Cit1c2UgYWNvbmZpZ19wcm90b3M6OntQcm90b0ZsYWdQZXJtaXNzaW9uLCBQcm90b0ZsYWdTdGF0ZSwgUHJvdG9QYXJzZWRGbGFnfTsKK3VzZSBzdGQ6OmNvbGxlY3Rpb25zOjpIYXNoTWFwOworCitwdWIgZm4gZ2VuZXJhdGVfamF2YV9jb2RlPEk+KAorICAgIHBhY2thZ2U6ICZzdHIsCisgICAgcGFyc2VkX2ZsYWdzX2l0ZXI6IEksCisgICAgY29kZWdlbl9tb2RlOiBDb2RlZ2VuTW9kZSwKKyAgICBmbGFnX2lkczogSGFzaE1hcDxTdHJpbmcsIHUxNj4sCisgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uOiBib29sLAorICAgIHBhY2thZ2VfZmluZ2VycHJpbnQ6IHU2NCwKKyAgICBuZXdfZXhwb3J0ZWQ6IGJvb2wsCispIC0+IFJlc3VsdDxWZWM8T3V0cHV0RmlsZT4+Cit3aGVyZQorICAgIEk6IEl0ZXJhdG9yPEl0ZW0gPSBQcm90b1BhcnNlZEZsYWc+LAoreworICAgIGxldCBmbGFnX2VsZW1lbnRzOiBWZWM8RmxhZ0VsZW1lbnQ+ID0KKyAgICAgICAgcGFyc2VkX2ZsYWdzX2l0ZXIubWFwKHxwZnwgY3JlYXRlX2ZsYWdfZWxlbWVudChwYWNrYWdlLCAmcGYsIGZsYWdfaWRzLmNsb25lKCkpKS5jb2xsZWN0KCk7CisgICAgbGV0IG5hbWVzcGFjZV9mbGFncyA9IGdlbl9mbGFnc19ieV9uYW1lc3BhY2UoJmZsYWdfZWxlbWVudHMpOworICAgIGxldCBwcm9wZXJ0aWVzX3NldDogQlRyZWVTZXQ8U3RyaW5nPiA9CisgICAgICAgIGZsYWdfZWxlbWVudHMuaXRlcigpLm1hcCh8ZmV8IGZvcm1hdF9wcm9wZXJ0eV9uYW1lKCZmZS5kZXZpY2VfY29uZmlnX25hbWVzcGFjZSkpLmNvbGxlY3QoKTsKKyAgICBsZXQgaXNfdGVzdF9tb2RlID0gY29kZWdlbl9tb2RlID09IENvZGVnZW5Nb2RlOjpUZXN0OworICAgIGxldCBsaWJyYXJ5X2V4cG9ydGVkID0gY29kZWdlbl9tb2RlID09IENvZGVnZW5Nb2RlOjpFeHBvcnRlZDsKKyAgICBsZXQgcnVudGltZV9sb29rdXBfcmVxdWlyZWQgPQorICAgICAgICBmbGFnX2VsZW1lbnRzLml0ZXIoKS5hbnkofGVsZW18IGVsZW0uaXNfcmVhZF93cml0ZSkgfHwgbGlicmFyeV9leHBvcnRlZDsKKyAgICBsZXQgY29udGFpbmVyID0gKGZsYWdfZWxlbWVudHMuZmlyc3QoKS5leHBlY3QoInplcm8gdGVtcGxhdGUgZmxhZ3MiKS5jb250YWluZXIpLnRvX3N0cmluZygpOworICAgIGxldCBpc19wbGF0Zm9ybV9jb250YWluZXIgPSBtYXRjaGVzIShjb250YWluZXIuYXNfc3RyKCksICJzeXN0ZW0iIHwgInByb2R1Y3QiIHwgInZlbmRvciIpOworICAgIGxldCBjb250ZXh0ID0gQ29udGV4dCB7CisgICAgICAgIGZsYWdfZWxlbWVudHMsCisgICAgICAgIG5hbWVzcGFjZV9mbGFncywKKyAgICAgICAgaXNfdGVzdF9tb2RlLAorICAgICAgICBydW50aW1lX2xvb2t1cF9yZXF1aXJlZCwKKyAgICAgICAgcHJvcGVydGllc19zZXQsCisgICAgICAgIHBhY2thZ2VfbmFtZTogcGFja2FnZS50b19zdHJpbmcoKSwKKyAgICAgICAgbGlicmFyeV9leHBvcnRlZCwKKyAgICAgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uLAorICAgICAgICBjb250YWluZXIsCisgICAgICAgIGlzX3BsYXRmb3JtX2NvbnRhaW5lciwKKyAgICAgICAgcGFja2FnZV9maW5nZXJwcmludDogZm9ybWF0ISgiMHh7Olh9TCIsIHBhY2thZ2VfZmluZ2VycHJpbnQpLAorICAgICAgICBuZXdfZXhwb3J0ZWQsCisgICAgfTsKKyAgICBsZXQgbXV0IHRlbXBsYXRlID0gVGlueVRlbXBsYXRlOjpuZXcoKTsKKyAgICB0ZW1wbGF0ZS5hZGRfdGVtcGxhdGUoIkZsYWdzLmphdmEiLCBpbmNsdWRlX3N0ciEoIi4uLy4uL3RlbXBsYXRlcy9GbGFncy5qYXZhLnRlbXBsYXRlIikpPzsKKyAgICB0ZW1wbGF0ZS5hZGRfdGVtcGxhdGUoCisgICAgICAgICJGZWF0dXJlRmxhZ3NJbXBsLmphdmEiLAorICAgICAgICBpbmNsdWRlX3N0ciEoIi4uLy4uL3RlbXBsYXRlcy9GZWF0dXJlRmxhZ3NJbXBsLmphdmEudGVtcGxhdGUiKSwKKyAgICApPzsKKyAgICB0ZW1wbGF0ZS5hZGRfdGVtcGxhdGUoCisgICAgICAgICJGZWF0dXJlRmxhZ3MuamF2YSIsCisgICAgICAgIGluY2x1ZGVfc3RyISgiLi4vLi4vdGVtcGxhdGVzL0ZlYXR1cmVGbGFncy5qYXZhLnRlbXBsYXRlIiksCisgICAgKT87CisgICAgdGVtcGxhdGUuYWRkX3RlbXBsYXRlKAorICAgICAgICAiQ3VzdG9tRmVhdHVyZUZsYWdzLmphdmEiLAorICAgICAgICBpbmNsdWRlX3N0ciEoIi4uLy4uL3RlbXBsYXRlcy9DdXN0b21GZWF0dXJlRmxhZ3MuamF2YS50ZW1wbGF0ZSIpLAorICAgICk/OworICAgIHRlbXBsYXRlLmFkZF90ZW1wbGF0ZSgKKyAgICAgICAgIkZha2VGZWF0dXJlRmxhZ3NJbXBsLmphdmEiLAorICAgICAgICBpbmNsdWRlX3N0ciEoIi4uLy4uL3RlbXBsYXRlcy9GYWtlRmVhdHVyZUZsYWdzSW1wbC5qYXZhLnRlbXBsYXRlIiksCisgICAgKT87CisKKyAgICBsZXQgcGF0aDogUGF0aEJ1ZiA9IHBhY2thZ2Uuc3BsaXQoJy4nKS5jb2xsZWN0KCk7CisgICAgWworICAgICAgICAiRmxhZ3MuamF2YSIsCisgICAgICAgICJGZWF0dXJlRmxhZ3MuamF2YSIsCisgICAgICAgICJGZWF0dXJlRmxhZ3NJbXBsLmphdmEiLAorICAgICAgICAiQ3VzdG9tRmVhdHVyZUZsYWdzLmphdmEiLAorICAgICAgICAiRmFrZUZlYXR1cmVGbGFnc0ltcGwuamF2YSIsCisgICAgXQorICAgIC5pdGVyKCkKKyAgICAubWFwKHxmaWxlfCB7CisgICAgICAgIE9rKE91dHB1dEZpbGUgeyBjb250ZW50czogdGVtcGxhdGUucmVuZGVyKGZpbGUsICZjb250ZXh0KT8uaW50bygpLCBwYXRoOiBwYXRoLmpvaW4oZmlsZSkgfSkKKyAgICB9KQorICAgIC5jb2xsZWN0Ojo8UmVzdWx0PFZlYzxPdXRwdXRGaWxlPj4+KCkKK30KKworZm4gZ2VuX2ZsYWdzX2J5X25hbWVzcGFjZShmbGFnczogJltGbGFnRWxlbWVudF0pIC0+IFZlYzxOYW1lc3BhY2VGbGFncz4geworICAgIGxldCBtdXQgbmFtZXNwYWNlX3RvX2ZsYWc6IEJUcmVlTWFwPFN0cmluZywgVmVjPEZsYWdFbGVtZW50Pj4gPSBCVHJlZU1hcDo6bmV3KCk7CisKKyAgICBmb3IgZmxhZyBpbiBmbGFncyB7CisgICAgICAgIG1hdGNoIG5hbWVzcGFjZV90b19mbGFnLmdldF9tdXQoJmZsYWcuZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2UpIHsKKyAgICAgICAgICAgIFNvbWUoZmxhZ19saXN0KSA9PiBmbGFnX2xpc3QucHVzaChmbGFnLmNsb25lKCkpLAorICAgICAgICAgICAgTm9uZSA9PiB7CisgICAgICAgICAgICAgICAgbmFtZXNwYWNlX3RvX2ZsYWcuaW5zZXJ0KGZsYWcuZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2UuY2xvbmUoKSwgdmVjIVtmbGFnLmNsb25lKCldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG5hbWVzcGFjZV90b19mbGFnCisgICAgICAgIC5pdGVyKCkKKyAgICAgICAgLm1hcCh8KG5hbWVzcGFjZSwgZmxhZ3MpfCBOYW1lc3BhY2VGbGFncyB7CisgICAgICAgICAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZS50b19zdHJpbmcoKSwKKyAgICAgICAgICAgIGZsYWdzOiBmbGFncy5jbG9uZSgpLAorICAgICAgICB9KQorICAgICAgICAuY29sbGVjdCgpCit9CisKKyNbZGVyaXZlKFNlcmlhbGl6ZSldCitzdHJ1Y3QgQ29udGV4dCB7CisgICAgcHViIGZsYWdfZWxlbWVudHM6IFZlYzxGbGFnRWxlbWVudD4sCisgICAgcHViIG5hbWVzcGFjZV9mbGFnczogVmVjPE5hbWVzcGFjZUZsYWdzPiwKKyAgICBwdWIgaXNfdGVzdF9tb2RlOiBib29sLAorICAgIHB1YiBydW50aW1lX2xvb2t1cF9yZXF1aXJlZDogYm9vbCwKKyAgICBwdWIgcHJvcGVydGllc19zZXQ6IEJUcmVlU2V0PFN0cmluZz4sCisgICAgcHViIHBhY2thZ2VfbmFtZTogU3RyaW5nLAorICAgIHB1YiBsaWJyYXJ5X2V4cG9ydGVkOiBib29sLAorICAgIHB1YiBhbGxvd19pbnN0cnVtZW50YXRpb246IGJvb2wsCisgICAgcHViIGNvbnRhaW5lcjogU3RyaW5nLAorICAgIHB1YiBpc19wbGF0Zm9ybV9jb250YWluZXI6IGJvb2wsCisgICAgcHViIHBhY2thZ2VfZmluZ2VycHJpbnQ6IFN0cmluZywKKyAgICBwdWIgbmV3X2V4cG9ydGVkOiBib29sLAorfQorCisjW2Rlcml2ZShTZXJpYWxpemUsIERlYnVnKV0KK3N0cnVjdCBOYW1lc3BhY2VGbGFncyB7CisgICAgcHViIG5hbWVzcGFjZTogU3RyaW5nLAorICAgIHB1YiBmbGFnczogVmVjPEZsYWdFbGVtZW50PiwKK30KKworI1tkZXJpdmUoU2VyaWFsaXplLCBDbG9uZSwgRGVidWcpXQorc3RydWN0IEZsYWdFbGVtZW50IHsKKyAgICBwdWIgY29udGFpbmVyOiBTdHJpbmcsCisgICAgcHViIGRlZmF1bHRfdmFsdWU6IGJvb2wsCisgICAgcHViIGRldmljZV9jb25maWdfbmFtZXNwYWNlOiBTdHJpbmcsCisgICAgcHViIGRldmljZV9jb25maWdfZmxhZzogU3RyaW5nLAorICAgIHB1YiBmbGFnX25hbWU6IFN0cmluZywKKyAgICBwdWIgZmxhZ19uYW1lX2NvbnN0YW50X3N1ZmZpeDogU3RyaW5nLAorICAgIHB1YiBmbGFnX29mZnNldDogdTE2LAorICAgIHB1YiBpc19yZWFkX3dyaXRlOiBib29sLAorICAgIHB1YiBtZXRob2RfbmFtZTogU3RyaW5nLAorICAgIHB1YiBwcm9wZXJ0aWVzOiBTdHJpbmcsCit9CisKK2ZuIGNyZWF0ZV9mbGFnX2VsZW1lbnQoCisgICAgcGFja2FnZTogJnN0ciwKKyAgICBwZjogJlByb3RvUGFyc2VkRmxhZywKKyAgICBmbGFnX29mZnNldHM6IEhhc2hNYXA8U3RyaW5nLCB1MTY+LAorKSAtPiBGbGFnRWxlbWVudCB7CisgICAgbGV0IGRldmljZV9jb25maWdfZmxhZyA9IGNvZGVnZW46OmNyZWF0ZV9kZXZpY2VfY29uZmlnX2lkZW50KHBhY2thZ2UsIHBmLm5hbWUoKSkKKyAgICAgICAgLmV4cGVjdCgidmFsdWVzIGNoZWNrZWQgYXQgZmxhZyBwYXJzZSB0aW1lIik7CisKKyAgICBsZXQgbm9fYXNzaWduZWRfb2Zmc2V0ID0gIXNob3VsZF9pbmNsdWRlX2ZsYWcocGYpOworCisgICAgbGV0IGZsYWdfb2Zmc2V0ID0gbWF0Y2ggZmxhZ19vZmZzZXRzLmdldChwZi5uYW1lKCkpIHsKKyAgICAgICAgU29tZShvZmZzZXQpID0+IG9mZnNldCwKKyAgICAgICAgTm9uZSA9PiB7CisgICAgICAgICAgICAvLyBTeXN0ZW0vdmVuZG9yL3Byb2R1Y3QgUk8rZGlzYWJsZWQgZmxhZ3MgaGF2ZSBubyBvZmZzZXQgaW4gc3RvcmFnZSBmaWxlcy4KKyAgICAgICAgICAgIC8vIEFzc2lnbiBwbGFjZWhvbGRlciB2YWx1ZS4KKyAgICAgICAgICAgIGlmIG5vX2Fzc2lnbmVkX29mZnNldCB7CisgICAgICAgICAgICAgICAgJjAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEFsbCBvdGhlciBmbGFncyBfbXVzdF8gaGF2ZSBhbiBvZmZzZXQuCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYW5pYyEoInt9IiwgZm9ybWF0ISgibWlzc2luZyBmbGFnIG9mZnNldCBmb3Ige30iLCBwZi5uYW1lKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBGbGFnRWxlbWVudCB7CisgICAgICAgIGNvbnRhaW5lcjogcGYuY29udGFpbmVyKCkudG9fc3RyaW5nKCksCisgICAgICAgIGRlZmF1bHRfdmFsdWU6IHBmLnN0YXRlKCkgPT0gUHJvdG9GbGFnU3RhdGU6OkVOQUJMRUQsCisgICAgICAgIGRldmljZV9jb25maWdfbmFtZXNwYWNlOiBwZi5uYW1lc3BhY2UoKS50b19zdHJpbmcoKSwKKyAgICAgICAgZGV2aWNlX2NvbmZpZ19mbGFnLAorICAgICAgICBmbGFnX25hbWU6IHBmLm5hbWUoKS50b19zdHJpbmcoKSwKKyAgICAgICAgZmxhZ19uYW1lX2NvbnN0YW50X3N1ZmZpeDogcGYubmFtZSgpLnRvX2FzY2lpX3VwcGVyY2FzZSgpLAorICAgICAgICBmbGFnX29mZnNldDogKmZsYWdfb2Zmc2V0LAorICAgICAgICBpc19yZWFkX3dyaXRlOiBwZi5wZXJtaXNzaW9uKCkgPT0gUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9XUklURSwKKyAgICAgICAgbWV0aG9kX25hbWU6IGZvcm1hdF9qYXZhX21ldGhvZF9uYW1lKHBmLm5hbWUoKSksCisgICAgICAgIHByb3BlcnRpZXM6IGZvcm1hdF9wcm9wZXJ0eV9uYW1lKHBmLm5hbWVzcGFjZSgpKSwKKyAgICB9Cit9CisKK2ZuIGZvcm1hdF9qYXZhX21ldGhvZF9uYW1lKGZsYWdfbmFtZTogJnN0cikgLT4gU3RyaW5nIHsKKyAgICBsZXQgc3BsaXRzOiBWZWM8JnN0cj4gPSBmbGFnX25hbWUuc3BsaXQoJ18nKS5maWx0ZXIofCZ3b3JkfCAhd29yZC5pc19lbXB0eSgpKS5jb2xsZWN0KCk7CisgICAgaWYgc3BsaXRzLmxlbigpID09IDEgeworICAgICAgICBsZXQgbmFtZSA9IHNwbGl0c1swXTsKKyAgICAgICAgbmFtZVswLi4xXS50b19hc2NpaV9sb3dlcmNhc2UoKSArICZuYW1lWzEuLl0KKyAgICB9IGVsc2UgeworICAgICAgICBzcGxpdHMKKyAgICAgICAgICAgIC5pdGVyKCkKKyAgICAgICAgICAgIC5lbnVtZXJhdGUoKQorICAgICAgICAgICAgLm1hcCh8KGluZGV4LCB3b3JkKXwgeworICAgICAgICAgICAgICAgIGlmIGluZGV4ID09IDAgeworICAgICAgICAgICAgICAgICAgICB3b3JkLnRvX2FzY2lpX2xvd2VyY2FzZSgpCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgd29yZFswLi4xXS50b19hc2NpaV91cHBlcmNhc2UoKSArICZ3b3JkWzEuLl0udG9fYXNjaWlfbG93ZXJjYXNlKCkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KQorICAgICAgICAgICAgLmNvbGxlY3Q6OjxWZWM8U3RyaW5nPj4oKQorICAgICAgICAgICAgLmpvaW4oIiIpCisgICAgfQorfQorCitmbiBmb3JtYXRfcHJvcGVydHlfbmFtZShwcm9wZXJ0eV9uYW1lOiAmc3RyKSAtPiBTdHJpbmcgeworICAgIGxldCBuYW1lID0gZm9ybWF0X2phdmFfbWV0aG9kX25hbWUocHJvcGVydHlfbmFtZSk7CisgICAgZm9ybWF0ISgibVByb3BlcnRpZXN7fXt9IiwgJm5hbWVbMC4uMV0udG9fYXNjaWlfdXBwZXJjYXNlKCksICZuYW1lWzEuLl0pCit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIGNyYXRlOjpjb21tYW5kczo6YXNzaWduX2ZsYWdfaWRzOworICAgIHVzZSBzdGQ6OmNvbGxlY3Rpb25zOjpIYXNoTWFwOworCisgICAgY29uc3QgRVhQRUNURURfRkVBVFVSRUZMQUdTX0NPTU1PTl9DT05URU5UOiAmc3RyID0gciMiCisgICAgcGFja2FnZSBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3Q7CisgICAgLy8gVE9ETyhiLzMwMzc3MzA1NSk6IFJlbW92ZSB0aGUgYW5ub3RhdGlvbiBhZnRlciBhY2Nlc3MgaXNzdWUgaXMgcmVzb2x2ZWQuCisgICAgaW1wb3J0IGFuZHJvaWQuY29tcGF0LmFubm90YXRpb24uVW5zdXBwb3J0ZWRBcHBVc2FnZTsKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIEZlYXR1cmVGbGFncyB7CisgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFzc3VtZUZhbHNlRm9yUjgKKyAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICBib29sZWFuIGRpc2FibGVkUm8oKTsKKyAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICBib29sZWFuIGRpc2FibGVkUncoKTsKKyAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICBib29sZWFuIGRpc2FibGVkUndFeHBvcnRlZCgpOworICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgIGJvb2xlYW4gZGlzYWJsZWRSd0luT3RoZXJOYW1lc3BhY2UoKTsKKyAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lVHJ1ZUZvclI4CisgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgYm9vbGVhbiBlbmFibGVkRml4ZWRSbygpOworICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5Bc3N1bWVUcnVlRm9yUjgKKyAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICBib29sZWFuIGVuYWJsZWRGaXhlZFJvRXhwb3J0ZWQoKTsKKyAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lVHJ1ZUZvclI4CisgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgYm9vbGVhbiBlbmFibGVkUm8oKTsKKyAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lVHJ1ZUZvclI4CisgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgYm9vbGVhbiBlbmFibGVkUm9FeHBvcnRlZCgpOworICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgIGJvb2xlYW4gZW5hYmxlZFJ3KCk7CisgICAgfQorICAgICIjOworCisgICAgY29uc3QgRVhQRUNURURfRkxBR19DT01NT05fQ09OVEVOVDogJnN0ciA9IHIjIgorICAgIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0OworICAgIC8vIFRPRE8oYi8zMDM3NzMwNTUpOiBSZW1vdmUgdGhlIGFubm90YXRpb24gYWZ0ZXIgYWNjZXNzIGlzc3VlIGlzIHJlc29sdmVkLgorICAgIGltcG9ydCBhbmRyb2lkLmNvbXBhdC5hbm5vdGF0aW9uLlVuc3VwcG9ydGVkQXBwVXNhZ2U7CisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIGZpbmFsIGNsYXNzIEZsYWdzIHsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRElTQUJMRURfUk8gPSAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3JvIjsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRElTQUJMRURfUlcgPSAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3IjsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRElTQUJMRURfUldfRVhQT1JURUQgPSAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2V4cG9ydGVkIjsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRElTQUJMRURfUldfSU5fT1RIRVJfTkFNRVNQQUNFID0gImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UiOworICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19FTkFCTEVEX0ZJWEVEX1JPID0gImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX2ZpeGVkX3JvIjsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRU5BQkxFRF9GSVhFRF9ST19FWFBPUlRFRCA9ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCI7CisgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0VOQUJMRURfUk8gPSAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcm8iOworICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19FTkFCTEVEX1JPX0VYUE9SVEVEID0gImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3JvX2V4cG9ydGVkIjsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRU5BQkxFRF9SVyA9ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9ydyI7CisKKyAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lRmFsc2VGb3JSOAorICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkaXNhYmxlZFJvKCkgeworICAgICAgICAgICAgcmV0dXJuIEZFQVRVUkVfRkxBR1MuZGlzYWJsZWRSbygpOworICAgICAgICB9CisgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGRpc2FibGVkUncoKSB7CisgICAgICAgICAgICByZXR1cm4gRkVBVFVSRV9GTEFHUy5kaXNhYmxlZFJ3KCk7CisgICAgICAgIH0KKyAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGlzYWJsZWRSd0V4cG9ydGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIEZFQVRVUkVfRkxBR1MuZGlzYWJsZWRSd0V4cG9ydGVkKCk7CisgICAgICAgIH0KKyAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGlzYWJsZWRSd0luT3RoZXJOYW1lc3BhY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gRkVBVFVSRV9GTEFHUy5kaXNhYmxlZFJ3SW5PdGhlck5hbWVzcGFjZSgpOworICAgICAgICB9CisgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFzc3VtZVRydWVGb3JSOAorICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbmFibGVkRml4ZWRSbygpIHsKKyAgICAgICAgICAgIHJldHVybiBGRUFUVVJFX0ZMQUdTLmVuYWJsZWRGaXhlZFJvKCk7CisgICAgICAgIH0KKyAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lVHJ1ZUZvclI4CisgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVuYWJsZWRGaXhlZFJvRXhwb3J0ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gRkVBVFVSRV9GTEFHUy5lbmFibGVkRml4ZWRSb0V4cG9ydGVkKCk7CisgICAgICAgIH0KKyAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lVHJ1ZUZvclI4CisgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVuYWJsZWRSbygpIHsKKyAgICAgICAgICAgIHJldHVybiBGRUFUVVJFX0ZMQUdTLmVuYWJsZWRSbygpOworICAgICAgICB9CisgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFzc3VtZVRydWVGb3JSOAorICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbmFibGVkUm9FeHBvcnRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBGRUFUVVJFX0ZMQUdTLmVuYWJsZWRSb0V4cG9ydGVkKCk7CisgICAgICAgIH0KKyAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5hYmxlZFJ3KCkgeworICAgICAgICAgICAgcmV0dXJuIEZFQVRVUkVfRkxBR1MuZW5hYmxlZFJ3KCk7CisgICAgICAgIH0KKyAgICAiIzsKKworICAgIGNvbnN0IEVYUEVDVEVEX0NVU1RPTUZFQVRVUkVGTEFHU19DT05URU5UOiAmc3RyID0gciMiCisgICAgcGFja2FnZSBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3Q7CisKKyAgICAvLyBUT0RPKGIvMzAzNzczMDU1KTogUmVtb3ZlIHRoZSBhbm5vdGF0aW9uIGFmdGVyIGFjY2VzcyBpc3N1ZSBpcyByZXNvbHZlZC4KKyAgICBpbXBvcnQgYW5kcm9pZC5jb21wYXQuYW5ub3RhdGlvbi5VbnN1cHBvcnRlZEFwcFVzYWdlOworICAgIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworICAgIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKKyAgICBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisgICAgaW1wb3J0IGphdmEudXRpbC5TZXQ7CisgICAgaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaVByZWRpY2F0ZTsKKyAgICBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKKworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBjbGFzcyBDdXN0b21GZWF0dXJlRmxhZ3MgaW1wbGVtZW50cyBGZWF0dXJlRmxhZ3MgeworCisgICAgICAgIHByaXZhdGUgQmlQcmVkaWNhdGU8U3RyaW5nLCBQcmVkaWNhdGU8RmVhdHVyZUZsYWdzPj4gbUdldFZhbHVlSW1wbDsKKworICAgICAgICBwdWJsaWMgQ3VzdG9tRmVhdHVyZUZsYWdzKEJpUHJlZGljYXRlPFN0cmluZywgUHJlZGljYXRlPEZlYXR1cmVGbGFncz4+IGdldFZhbHVlSW1wbCkgeworICAgICAgICAgICAgbUdldFZhbHVlSW1wbCA9IGdldFZhbHVlSW1wbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlZFJvKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlKEZsYWdzLkZMQUdfRElTQUJMRURfUk8sCisgICAgICAgICAgICAgICAgICAgIEZlYXR1cmVGbGFnczo6ZGlzYWJsZWRSbyk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVkUncoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWUoRmxhZ3MuRkxBR19ESVNBQkxFRF9SVywKKyAgICAgICAgICAgICAgICBGZWF0dXJlRmxhZ3M6OmRpc2FibGVkUncpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlZFJ3RXhwb3J0ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWUoRmxhZ3MuRkxBR19ESVNBQkxFRF9SV19FWFBPUlRFRCwKKyAgICAgICAgICAgICAgICBGZWF0dXJlRmxhZ3M6OmRpc2FibGVkUndFeHBvcnRlZCk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVkUndJbk90aGVyTmFtZXNwYWNlKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlKEZsYWdzLkZMQUdfRElTQUJMRURfUldfSU5fT1RIRVJfTkFNRVNQQUNFLAorICAgICAgICAgICAgICAgIEZlYXR1cmVGbGFnczo6ZGlzYWJsZWRSd0luT3RoZXJOYW1lc3BhY2UpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkRml4ZWRSbygpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZShGbGFncy5GTEFHX0VOQUJMRURfRklYRURfUk8sCisgICAgICAgICAgICAgICAgRmVhdHVyZUZsYWdzOjplbmFibGVkRml4ZWRSbyk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRGaXhlZFJvRXhwb3J0ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWUoRmxhZ3MuRkxBR19FTkFCTEVEX0ZJWEVEX1JPX0VYUE9SVEVELAorICAgICAgICAgICAgICAgIEZlYXR1cmVGbGFnczo6ZW5hYmxlZEZpeGVkUm9FeHBvcnRlZCk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRSbygpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZShGbGFncy5GTEFHX0VOQUJMRURfUk8sCisgICAgICAgICAgICAgICAgRmVhdHVyZUZsYWdzOjplbmFibGVkUm8pOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkUm9FeHBvcnRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZShGbGFncy5GTEFHX0VOQUJMRURfUk9fRVhQT1JURUQsCisgICAgICAgICAgICAgICAgRmVhdHVyZUZsYWdzOjplbmFibGVkUm9FeHBvcnRlZCk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRSdygpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZShGbGFncy5GTEFHX0VOQUJMRURfUlcsCisgICAgICAgICAgICAgICAgRmVhdHVyZUZsYWdzOjplbmFibGVkUncpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNGbGFnUmVhZE9ubHlPcHRpbWl6ZWQoU3RyaW5nIGZsYWdOYW1lKSB7CisgICAgICAgICAgICBpZiAobVJlYWRPbmx5RmxhZ3NTZXQuY29udGFpbnMoZmxhZ05hbWUpICYmCisgICAgICAgICAgICAgICAgaXNPcHRpbWl6YXRpb25FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5Bc3N1bWVUcnVlRm9yUjgKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzT3B0aW1pemF0aW9uRW5hYmxlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGdldFZhbHVlKFN0cmluZyBmbGFnTmFtZSwgUHJlZGljYXRlPEZlYXR1cmVGbGFncz4gZ2V0dGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbUdldFZhbHVlSW1wbC50ZXN0KGZsYWdOYW1lLCBnZXR0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRGbGFnTmFtZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0RJU0FCTEVEX1JPLAorICAgICAgICAgICAgICAgIEZsYWdzLkZMQUdfRElTQUJMRURfUlcsCisgICAgICAgICAgICAgICAgRmxhZ3MuRkxBR19ESVNBQkxFRF9SV19FWFBPUlRFRCwKKyAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0RJU0FCTEVEX1JXX0lOX09USEVSX05BTUVTUEFDRSwKKyAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0VOQUJMRURfRklYRURfUk8sCisgICAgICAgICAgICAgICAgRmxhZ3MuRkxBR19FTkFCTEVEX0ZJWEVEX1JPX0VYUE9SVEVELAorICAgICAgICAgICAgICAgIEZsYWdzLkZMQUdfRU5BQkxFRF9STywKKyAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0VOQUJMRURfUk9fRVhQT1JURUQsCisgICAgICAgICAgICAgICAgRmxhZ3MuRkxBR19FTkFCTEVEX1JXCisgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBtUmVhZE9ubHlGbGFnc1NldCA9IG5ldyBIYXNoU2V0PD4oCisgICAgICAgICAgICBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgIEZsYWdzLkZMQUdfRElTQUJMRURfUk8sCisgICAgICAgICAgICAgICAgRmxhZ3MuRkxBR19FTkFCTEVEX0ZJWEVEX1JPLAorICAgICAgICAgICAgICAgIEZsYWdzLkZMQUdfRU5BQkxFRF9GSVhFRF9ST19FWFBPUlRFRCwKKyAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0VOQUJMRURfUk8sCisgICAgICAgICAgICAgICAgRmxhZ3MuRkxBR19FTkFCTEVEX1JPX0VYUE9SVEVELAorICAgICAgICAgICAgICAgICIiCisgICAgICAgICAgICApCisgICAgICAgICk7CisgICAgfQorICAgICIjOworCisgICAgY29uc3QgRVhQRUNURURfRkFLRUZFQVRVUkVGTEFHU0lNUExfQ09OVEVOVDogJnN0ciA9IHIjIgorICAgIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0OworCisgICAgaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworICAgIGltcG9ydCBqYXZhLnV0aWwuTWFwOworICAgIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIGNsYXNzIEZha2VGZWF0dXJlRmxhZ3NJbXBsIGV4dGVuZHMgQ3VzdG9tRmVhdHVyZUZsYWdzIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBCb29sZWFuPiBtRmxhZ01hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBGZWF0dXJlRmxhZ3MgbURlZmF1bHRzOworCisgICAgICAgIHB1YmxpYyBGYWtlRmVhdHVyZUZsYWdzSW1wbCgpIHsKKyAgICAgICAgICAgIHRoaXMobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmFrZUZlYXR1cmVGbGFnc0ltcGwoRmVhdHVyZUZsYWdzIGRlZmF1bHRzKSB7CisgICAgICAgICAgICBzdXBlcihudWxsKTsKKyAgICAgICAgICAgIG1EZWZhdWx0cyA9IGRlZmF1bHRzOworICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgbWFwIHdpdGggbnVsbCB2YWx1ZXMKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGZsYWdOYW1lIDogZ2V0RmxhZ05hbWVzKCkpIHsKKyAgICAgICAgICAgICAgICBtRmxhZ01hcC5wdXQoZmxhZ05hbWUsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGdldFZhbHVlKFN0cmluZyBmbGFnTmFtZSwgUHJlZGljYXRlPEZlYXR1cmVGbGFncz4gZ2V0dGVyKSB7CisgICAgICAgICAgICBCb29sZWFuIHZhbHVlID0gdGhpcy5tRmxhZ01hcC5nZXQoZmxhZ05hbWUpOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobURlZmF1bHRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0dGVyLnRlc3QobURlZmF1bHRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZmxhZ05hbWUgKyAiIGlzIG5vdCBzZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZsYWcoU3RyaW5nIGZsYWdOYW1lLCBib29sZWFuIHZhbHVlKSB7CisgICAgICAgICAgICBpZiAoIXRoaXMubUZsYWdNYXAuY29udGFpbnNLZXkoZmxhZ05hbWUpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm8gc3VjaCBmbGFnICIgKyBmbGFnTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLm1GbGFnTWFwLnB1dChmbGFnTmFtZSwgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVzZXRBbGwoKSB7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeSBlbnRyeSA6IG1GbGFnTWFwLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBlbnRyeS5zZXRWYWx1ZShudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAiIzsKKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2dlbmVyYXRlX2phdmFfY29kZV9wcm9kdWN0aW9uKCkgeworICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0gY3JhdGU6OnRlc3Q6OnBhcnNlX3Rlc3RfZmxhZ3MoKTsKKyAgICAgICAgbGV0IG1vZGUgPSBDb2RlZ2VuTW9kZTo6UHJvZHVjdGlvbjsKKyAgICAgICAgbGV0IG1vZGlmaWVkX3BhcnNlZF9mbGFncyA9CisgICAgICAgICAgICBjcmF0ZTo6Y29tbWFuZHM6Om1vZGlmeV9wYXJzZWRfZmxhZ3NfYmFzZWRfb25fbW9kZShwYXJzZWRfZmxhZ3MsIG1vZGUpLnVud3JhcCgpOworICAgICAgICBsZXQgZmxhZ19pZHMgPQorICAgICAgICAgICAgYXNzaWduX2ZsYWdfaWRzKGNyYXRlOjp0ZXN0OjpURVNUX1BBQ0tBR0UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pdGVyKCkpLnVud3JhcCgpOworICAgICAgICBsZXQgZ2VuZXJhdGVkX2ZpbGVzID0gZ2VuZXJhdGVfamF2YV9jb2RlKAorICAgICAgICAgICAgY3JhdGU6OnRlc3Q6OlRFU1RfUEFDS0FHRSwKKyAgICAgICAgICAgIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pbnRvX2l0ZXIoKSwKKyAgICAgICAgICAgIG1vZGUsCisgICAgICAgICAgICBmbGFnX2lkcywKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICA1ODAxMTQ0Nzg0NjE4MjIxNjY4LAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcCgpOworICAgICAgICBsZXQgZXhwZWN0X2ZsYWdzX2NvbnRlbnQgPSBFWFBFQ1RFRF9GTEFHX0NPTU1PTl9DT05URU5ULnRvX3N0cmluZygpCisgICAgICAgICAgICArIHIjIgorICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRmVhdHVyZUZsYWdzIEZFQVRVUkVfRkxBR1MgPSBuZXcgRmVhdHVyZUZsYWdzSW1wbCgpOworICAgICAgICB9IiM7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkX2ZlYXR1cmVmbGFnc21wbF9jb250ZW50ID0gciMiCisgICAgICAgIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0OworICAgICAgICAvLyBUT0RPKGIvMzAzNzczMDU1KTogUmVtb3ZlIHRoZSBhbm5vdGF0aW9uIGFmdGVyIGFjY2VzcyBpc3N1ZSBpcyByZXNvbHZlZC4KKyAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29tcGF0LmFubm90YXRpb24uVW5zdXBwb3J0ZWRBcHBVc2FnZTsKKyAgICAgICAgaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CisgICAgICAgIGltcG9ydCBhbmRyb2lkLm9zLmZsYWdnaW5nLlBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbDsKKyAgICAgICAgaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICBwdWJsaWMgZmluYWwgY2xhc3MgRmVhdHVyZUZsYWdzSW1wbCBpbXBsZW1lbnRzIEZlYXR1cmVGbGFncyB7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkZlYXR1cmVGbGFnc0ltcGwiOworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBpc0NhY2hlZCA9IGZhbHNlOworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkaXNhYmxlZFJ3ID0gZmFsc2U7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGRpc2FibGVkUndFeHBvcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkaXNhYmxlZFJ3SW5PdGhlck5hbWVzcGFjZSA9IGZhbHNlOworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlbmFibGVkUncgPSB0cnVlOworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsIHJlYWRlciA9IFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbC5sb2FkKCJzeXN0ZW0iLCAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IiwgMHg1MDgxQ0U3MjIxQzc3MDY0TCk7CisgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkUncgPSByZWFkZXIuZ2V0Qm9vbGVhbkZsYWdWYWx1ZSgwKTsKKyAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWRSd0V4cG9ydGVkID0gcmVhZGVyLmdldEJvb2xlYW5GbGFnVmFsdWUoMSk7CisgICAgICAgICAgICAgICAgICAgIGVuYWJsZWRSdyA9IHJlYWRlci5nZXRCb29sZWFuRmxhZ1ZhbHVlKDcpOworICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZFJ3SW5PdGhlck5hbWVzcGFjZSA9IHJlYWRlci5nZXRCb29sZWFuRmxhZ1ZhbHVlKDIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChMaW5rYWdlRXJyb3IgZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBmb3IgbWFpbmxpbmUgbW9kdWxlIHJ1bm5pbmcgb24gb2xkZXIgZGV2aWNlcy4KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgcmVwbGFjZXMgdG8gdmVyc2lvbiBjaGVjaywgYWZ0ZXIgdGhlIHZlcnNpb24gYnVtcC4KKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpc0NhY2hlZCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVkUm8oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzYWJsZWRSdygpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzQ2FjaGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGluaXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGRpc2FibGVkUnc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlZFJ3RXhwb3J0ZWQoKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0NhY2hlZCkgeworICAgICAgICAgICAgICAgICAgICBpbml0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBkaXNhYmxlZFJ3RXhwb3J0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlZFJ3SW5PdGhlck5hbWVzcGFjZSgpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzQ2FjaGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGluaXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGRpc2FibGVkUndJbk90aGVyTmFtZXNwYWNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlZEZpeGVkUm8oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkRml4ZWRSb0V4cG9ydGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlZFJvKCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlZFJvRXhwb3J0ZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkUncoKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0NhY2hlZCkgeworICAgICAgICAgICAgICAgICAgICBpbml0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBlbmFibGVkUnc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIiM7CisKKyAgICAgICAgbGV0IG11dCBmaWxlX3NldCA9IEhhc2hNYXA6OmZyb20oWworICAgICAgICAgICAgKCJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvRmxhZ3MuamF2YSIsIGV4cGVjdF9mbGFnc19jb250ZW50LmFzX3N0cigpKSwKKyAgICAgICAgICAgICgiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0ZlYXR1cmVGbGFnc0ltcGwuamF2YSIsIGV4cGVjdGVkX2ZlYXR1cmVmbGFnc21wbF9jb250ZW50KSwKKyAgICAgICAgICAgICgiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0ZlYXR1cmVGbGFncy5qYXZhIiwgRVhQRUNURURfRkVBVFVSRUZMQUdTX0NPTU1PTl9DT05URU5UKSwKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0N1c3RvbUZlYXR1cmVGbGFncy5qYXZhIiwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9DVVNUT01GRUFUVVJFRkxBR1NfQ09OVEVOVCwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgImNvbS9hbmRyb2lkL2Fjb25maWcvdGVzdC9GYWtlRmVhdHVyZUZsYWdzSW1wbC5qYXZhIiwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9GQUtFRkVBVFVSRUZMQUdTSU1QTF9DT05URU5ULAorICAgICAgICAgICAgKSwKKyAgICAgICAgXSk7CisKKyAgICAgICAgZm9yIGZpbGUgaW4gZ2VuZXJhdGVkX2ZpbGVzIHsKKyAgICAgICAgICAgIGxldCBmaWxlX3BhdGggPSBmaWxlLnBhdGgudG9fc3RyKCkudW53cmFwKCk7CisgICAgICAgICAgICBhc3NlcnQhKGZpbGVfc2V0LmNvbnRhaW5zX2tleShmaWxlX3BhdGgpLCAiQ2Fubm90IGZpbmQge30iLCBmaWxlX3BhdGgpOworICAgICAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgICAgIGNyYXRlOjp0ZXN0OjpmaXJzdF9zaWduaWZpY2FudF9jb2RlX2RpZmYoCisgICAgICAgICAgICAgICAgICAgIGZpbGVfc2V0LmdldChmaWxlX3BhdGgpLnVud3JhcCgpLAorICAgICAgICAgICAgICAgICAgICAmU3RyaW5nOjpmcm9tX3V0ZjgoZmlsZS5jb250ZW50cykudW53cmFwKCkKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICJGaWxlIHt9IGNvbnRlbnQgaXMgbm90IGNvcnJlY3QiLAorICAgICAgICAgICAgICAgIGZpbGVfcGF0aAorICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGZpbGVfc2V0LnJlbW92ZShmaWxlX3BhdGgpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0IShmaWxlX3NldC5pc19lbXB0eSgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9nZW5lcmF0ZV9qYXZhX2NvZGVfZXhwb3J0ZWQoKSB7CisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPSBjcmF0ZTo6dGVzdDo6cGFyc2VfdGVzdF9mbGFncygpOworICAgICAgICBsZXQgbW9kZSA9IENvZGVnZW5Nb2RlOjpFeHBvcnRlZDsKKyAgICAgICAgbGV0IG1vZGlmaWVkX3BhcnNlZF9mbGFncyA9CisgICAgICAgICAgICBjcmF0ZTo6Y29tbWFuZHM6Om1vZGlmeV9wYXJzZWRfZmxhZ3NfYmFzZWRfb25fbW9kZShwYXJzZWRfZmxhZ3MsIG1vZGUpLnVud3JhcCgpOworICAgICAgICBsZXQgZmxhZ19pZHMgPQorICAgICAgICAgICAgYXNzaWduX2ZsYWdfaWRzKGNyYXRlOjp0ZXN0OjpURVNUX1BBQ0tBR0UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pdGVyKCkpLnVud3JhcCgpOworICAgICAgICBsZXQgZ2VuZXJhdGVkX2ZpbGVzID0gZ2VuZXJhdGVfamF2YV9jb2RlKAorICAgICAgICAgICAgY3JhdGU6OnRlc3Q6OlRFU1RfUEFDS0FHRSwKKyAgICAgICAgICAgIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pbnRvX2l0ZXIoKSwKKyAgICAgICAgICAgIG1vZGUsCisgICAgICAgICAgICBmbGFnX2lkcywKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICA1ODAxMTQ0Nzg0NjE4MjIxNjY4LAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcCgpOworCisgICAgICAgIGxldCBleHBlY3RfZmxhZ3NfY29udGVudCA9IHIjIgorICAgICAgICBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdDsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBjbGFzcyBGbGFncyB7CisgICAgICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRElTQUJMRURfUldfRVhQT1JURUQgPSAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2V4cG9ydGVkIjsKKyAgICAgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19FTkFCTEVEX0ZJWEVEX1JPX0VYUE9SVEVEID0gImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkIjsKKyAgICAgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19FTkFCTEVEX1JPX0VYUE9SVEVEID0gImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3JvX2V4cG9ydGVkIjsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkaXNhYmxlZFJ3RXhwb3J0ZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZFQVRVUkVfRkxBR1MuZGlzYWJsZWRSd0V4cG9ydGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5hYmxlZEZpeGVkUm9FeHBvcnRlZCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkVBVFVSRV9GTEFHUy5lbmFibGVkRml4ZWRSb0V4cG9ydGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5hYmxlZFJvRXhwb3J0ZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZFQVRVUkVfRkxBR1MuZW5hYmxlZFJvRXhwb3J0ZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIEZlYXR1cmVGbGFncyBGRUFUVVJFX0ZMQUdTID0gbmV3IEZlYXR1cmVGbGFnc0ltcGwoKTsKKyAgICAgICAgfQorICAgICAgICAiIzsKKworICAgICAgICBsZXQgZXhwZWN0X2ZlYXR1cmVfZmxhZ3NfY29udGVudCA9IHIjIgorICAgICAgICBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdDsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgRmVhdHVyZUZsYWdzIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZGlzYWJsZWRSd0V4cG9ydGVkKCk7CisgICAgICAgICAgICBib29sZWFuIGVuYWJsZWRGaXhlZFJvRXhwb3J0ZWQoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlZFJvRXhwb3J0ZWQoKTsKKyAgICAgICAgfQorICAgICAgICAiIzsKKworICAgICAgICBsZXQgZXhwZWN0X2ZlYXR1cmVfZmxhZ3NfaW1wbF9jb250ZW50ID0gciMiCisgICAgICAgIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0OworICAgICAgICBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CisgICAgICAgIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkRldmljZUNvbmZpZzsKKyAgICAgICAgaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuRGV2aWNlQ29uZmlnLlByb3BlcnRpZXM7CisgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICBwdWJsaWMgZmluYWwgY2xhc3MgRmVhdHVyZUZsYWdzSW1wbCBpbXBsZW1lbnRzIEZlYXR1cmVGbGFncyB7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIGFjb25maWdfdGVzdF9pc19jYWNoZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGlzYWJsZWRSd0V4cG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVuYWJsZWRGaXhlZFJvRXhwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZW5hYmxlZFJvRXhwb3J0ZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGxvYWRfb3ZlcnJpZGVzX2Fjb25maWdfdGVzdCgpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gRGV2aWNlQ29uZmlnLmdldFByb3BlcnRpZXMoImFjb25maWdfdGVzdCIpOworICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZFJ3RXhwb3J0ZWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRCb29sZWFuKEZsYWdzLkZMQUdfRElTQUJMRURfUldfRVhQT1JURUQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgZW5hYmxlZEZpeGVkUm9FeHBvcnRlZCA9CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldEJvb2xlYW4oRmxhZ3MuRkxBR19FTkFCTEVEX0ZJWEVEX1JPX0VYUE9SVEVELCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGVuYWJsZWRSb0V4cG9ydGVkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuZ2V0Qm9vbGVhbihGbGFncy5GTEFHX0VOQUJMRURfUk9fRVhQT1JURUQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWFkIHZhbHVlIGZyb20gbmFtZXNwYWNlIGFjb25maWdfdGVzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJmcm9tIERldmljZUNvbmZpZy4gSXQgY291bGQgYmUgdGhhdCB0aGUgY29kZSB1c2luZyBmbGFnICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImV4ZWN1dGVkIGJlZm9yZSBTZXR0aW5nc1Byb3ZpZGVyIGluaXRpYWxpemF0aW9uLiBQbGVhc2UgdXNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImZpeGVkIHJlYWQtb25seSBmbGFnIGJ5IGFkZGluZyBpc19maXhlZF9yZWFkX29ubHk6IHRydWUgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiZmxhZyBkZWNsYXJhdGlvbi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGlzb2xhdGVkIHByb2Nlc3MgY2FzZSwgc2tpcCBsb2FkaW5nIGZsYWcgdmFsdWUgZnJvbSB0aGUgc3RvcmFnZSwgdXNlIHRoZSBkZWZhdWx0CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhY29uZmlnX3Rlc3RfaXNfY2FjaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzYWJsZWRSd0V4cG9ydGVkKCkgeworICAgICAgICAgICAgICAgIGlmICghYWNvbmZpZ190ZXN0X2lzX2NhY2hlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9vdmVycmlkZXNfYWNvbmZpZ190ZXN0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBkaXNhYmxlZFJ3RXhwb3J0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRGaXhlZFJvRXhwb3J0ZWQoKSB7CisgICAgICAgICAgICAgICAgaWYgKCFhY29uZmlnX3Rlc3RfaXNfY2FjaGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2FkX292ZXJyaWRlc19hY29uZmlnX3Rlc3QoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGVuYWJsZWRGaXhlZFJvRXhwb3J0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRSb0V4cG9ydGVkKCkgeworICAgICAgICAgICAgICAgIGlmICghYWNvbmZpZ190ZXN0X2lzX2NhY2hlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9vdmVycmlkZXNfYWNvbmZpZ190ZXN0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBlbmFibGVkUm9FeHBvcnRlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSIjOworCisgICAgICAgIGxldCBleHBlY3RfY3VzdG9tX2ZlYXR1cmVfZmxhZ3NfY29udGVudCA9IHIjIgorICAgICAgICBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdDsKKworICAgICAgICBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKyAgICAgICAgaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworICAgICAgICBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisgICAgICAgIGltcG9ydCBqYXZhLnV0aWwuU2V0OworICAgICAgICBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpUHJlZGljYXRlOworICAgICAgICBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKKworICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgcHVibGljIGNsYXNzIEN1c3RvbUZlYXR1cmVGbGFncyBpbXBsZW1lbnRzIEZlYXR1cmVGbGFncyB7CisKKyAgICAgICAgICAgIHByaXZhdGUgQmlQcmVkaWNhdGU8U3RyaW5nLCBQcmVkaWNhdGU8RmVhdHVyZUZsYWdzPj4gbUdldFZhbHVlSW1wbDsKKworICAgICAgICAgICAgcHVibGljIEN1c3RvbUZlYXR1cmVGbGFncyhCaVByZWRpY2F0ZTxTdHJpbmcsIFByZWRpY2F0ZTxGZWF0dXJlRmxhZ3M+PiBnZXRWYWx1ZUltcGwpIHsKKyAgICAgICAgICAgICAgICBtR2V0VmFsdWVJbXBsID0gZ2V0VmFsdWVJbXBsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVkUndFeHBvcnRlZCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWUoRmxhZ3MuRkxBR19ESVNBQkxFRF9SV19FWFBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgRmVhdHVyZUZsYWdzOjpkaXNhYmxlZFJ3RXhwb3J0ZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkRml4ZWRSb0V4cG9ydGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZShGbGFncy5GTEFHX0VOQUJMRURfRklYRURfUk9fRVhQT1JURUQsCisgICAgICAgICAgICAgICAgICAgIEZlYXR1cmVGbGFnczo6ZW5hYmxlZEZpeGVkUm9FeHBvcnRlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRSb0V4cG9ydGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZShGbGFncy5GTEFHX0VOQUJMRURfUk9fRVhQT1JURUQsCisgICAgICAgICAgICAgICAgICAgIEZlYXR1cmVGbGFnczo6ZW5hYmxlZFJvRXhwb3J0ZWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnZXRWYWx1ZShTdHJpbmcgZmxhZ05hbWUsIFByZWRpY2F0ZTxGZWF0dXJlRmxhZ3M+IGdldHRlcikgeworICAgICAgICAgICAgICAgIHJldHVybiBtR2V0VmFsdWVJbXBsLnRlc3QoZmxhZ05hbWUsIGdldHRlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RmxhZ05hbWVzKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0RJU0FCTEVEX1JXX0VYUE9SVEVELAorICAgICAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0VOQUJMRURfRklYRURfUk9fRVhQT1JURUQsCisgICAgICAgICAgICAgICAgICAgIEZsYWdzLkZMQUdfRU5BQkxFRF9ST19FWFBPUlRFRAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgU2V0PFN0cmluZz4gbVJlYWRPbmx5RmxhZ3NTZXQgPSBuZXcgSGFzaFNldDw+KAorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgICAgICIiCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICIjOworCisgICAgICAgIGxldCBtdXQgZmlsZV9zZXQgPSBIYXNoTWFwOjpmcm9tKFsKKyAgICAgICAgICAgICgiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0ZsYWdzLmphdmEiLCBleHBlY3RfZmxhZ3NfY29udGVudCksCisgICAgICAgICAgICAoImNvbS9hbmRyb2lkL2Fjb25maWcvdGVzdC9GZWF0dXJlRmxhZ3MuamF2YSIsIGV4cGVjdF9mZWF0dXJlX2ZsYWdzX2NvbnRlbnQpLAorICAgICAgICAgICAgKCJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvRmVhdHVyZUZsYWdzSW1wbC5qYXZhIiwgZXhwZWN0X2ZlYXR1cmVfZmxhZ3NfaW1wbF9jb250ZW50KSwKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0N1c3RvbUZlYXR1cmVGbGFncy5qYXZhIiwKKyAgICAgICAgICAgICAgICBleHBlY3RfY3VzdG9tX2ZlYXR1cmVfZmxhZ3NfY29udGVudCwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgImNvbS9hbmRyb2lkL2Fjb25maWcvdGVzdC9GYWtlRmVhdHVyZUZsYWdzSW1wbC5qYXZhIiwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9GQUtFRkVBVFVSRUZMQUdTSU1QTF9DT05URU5ULAorICAgICAgICAgICAgKSwKKyAgICAgICAgXSk7CisKKyAgICAgICAgZm9yIGZpbGUgaW4gZ2VuZXJhdGVkX2ZpbGVzIHsKKyAgICAgICAgICAgIGxldCBmaWxlX3BhdGggPSBmaWxlLnBhdGgudG9fc3RyKCkudW53cmFwKCk7CisgICAgICAgICAgICBhc3NlcnQhKGZpbGVfc2V0LmNvbnRhaW5zX2tleShmaWxlX3BhdGgpLCAiQ2Fubm90IGZpbmQge30iLCBmaWxlX3BhdGgpOworICAgICAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgICAgIGNyYXRlOjp0ZXN0OjpmaXJzdF9zaWduaWZpY2FudF9jb2RlX2RpZmYoCisgICAgICAgICAgICAgICAgICAgIGZpbGVfc2V0LmdldChmaWxlX3BhdGgpLnVud3JhcCgpLAorICAgICAgICAgICAgICAgICAgICAmU3RyaW5nOjpmcm9tX3V0ZjgoZmlsZS5jb250ZW50cykudW53cmFwKCkKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICJGaWxlIHt9IGNvbnRlbnQgaXMgbm90IGNvcnJlY3QiLAorICAgICAgICAgICAgICAgIGZpbGVfcGF0aAorICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGZpbGVfc2V0LnJlbW92ZShmaWxlX3BhdGgpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0IShmaWxlX3NldC5pc19lbXB0eSgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9nZW5lcmF0ZV9qYXZhX2NvZGVfbmV3X2V4cG9ydGVkKCkgeworICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0gY3JhdGU6OnRlc3Q6OnBhcnNlX3Rlc3RfZmxhZ3MoKTsKKyAgICAgICAgbGV0IG1vZGUgPSBDb2RlZ2VuTW9kZTo6RXhwb3J0ZWQ7CisgICAgICAgIGxldCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MgPQorICAgICAgICAgICAgY3JhdGU6OmNvbW1hbmRzOjptb2RpZnlfcGFyc2VkX2ZsYWdzX2Jhc2VkX29uX21vZGUocGFyc2VkX2ZsYWdzLCBtb2RlKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGZsYWdfaWRzID0KKyAgICAgICAgICAgIGFzc2lnbl9mbGFnX2lkcyhjcmF0ZTo6dGVzdDo6VEVTVF9QQUNLQUdFLCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaXRlcigpKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGdlbmVyYXRlZF9maWxlcyA9IGdlbmVyYXRlX2phdmFfY29kZSgKKyAgICAgICAgICAgIGNyYXRlOjp0ZXN0OjpURVNUX1BBQ0tBR0UsCisgICAgICAgICAgICBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaW50b19pdGVyKCksCisgICAgICAgICAgICBtb2RlLAorICAgICAgICAgICAgZmxhZ19pZHMsCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgNTgwMTE0NDc4NDYxODIyMTY2OCwKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcCgpOworCisgICAgICAgIGxldCBleHBlY3RfZmxhZ3NfY29udGVudCA9IHIjIgorICAgICAgICBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdDsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBjbGFzcyBGbGFncyB7CisgICAgICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRElTQUJMRURfUldfRVhQT1JURUQgPSAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2V4cG9ydGVkIjsKKyAgICAgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19FTkFCTEVEX0ZJWEVEX1JPX0VYUE9SVEVEID0gImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkIjsKKyAgICAgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19FTkFCTEVEX1JPX0VYUE9SVEVEID0gImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3JvX2V4cG9ydGVkIjsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkaXNhYmxlZFJ3RXhwb3J0ZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZFQVRVUkVfRkxBR1MuZGlzYWJsZWRSd0V4cG9ydGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5hYmxlZEZpeGVkUm9FeHBvcnRlZCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkVBVFVSRV9GTEFHUy5lbmFibGVkRml4ZWRSb0V4cG9ydGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5hYmxlZFJvRXhwb3J0ZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZFQVRVUkVfRkxBR1MuZW5hYmxlZFJvRXhwb3J0ZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIEZlYXR1cmVGbGFncyBGRUFUVVJFX0ZMQUdTID0gbmV3IEZlYXR1cmVGbGFnc0ltcGwoKTsKKyAgICAgICAgfQorICAgICAgICAiIzsKKworICAgICAgICBsZXQgZXhwZWN0X2ZlYXR1cmVfZmxhZ3NfY29udGVudCA9IHIjIgorICAgICAgICBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdDsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgRmVhdHVyZUZsYWdzIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZGlzYWJsZWRSd0V4cG9ydGVkKCk7CisgICAgICAgICAgICBib29sZWFuIGVuYWJsZWRGaXhlZFJvRXhwb3J0ZWQoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlZFJvRXhwb3J0ZWQoKTsKKyAgICAgICAgfQorICAgICAgICAiIzsKKworICAgICAgICBsZXQgZXhwZWN0X2ZlYXR1cmVfZmxhZ3NfaW1wbF9jb250ZW50ID0gciMiCisgICAgICAgIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0OworICAgICAgICBpbXBvcnQgYW5kcm9pZC5vcy5mbGFnZ2luZy5BY29uZmlnUGFja2FnZTsKKyAgICAgICAgaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICBwdWJsaWMgZmluYWwgY2xhc3MgRmVhdHVyZUZsYWdzSW1wbCBpbXBsZW1lbnRzIEZlYXR1cmVGbGFncyB7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkZlYXR1cmVGbGFnc0ltcGxFeHBvcnQiOworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBpc0NhY2hlZCA9IGZhbHNlOworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkaXNhYmxlZFJ3RXhwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZW5hYmxlZEZpeGVkUm9FeHBvcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlbmFibGVkUm9FeHBvcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQWNvbmZpZ1BhY2thZ2UgcmVhZGVyID0gQWNvbmZpZ1BhY2thZ2UubG9hZCgiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0Iik7CisgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkUndFeHBvcnRlZCA9IHJlYWRlci5nZXRCb29sZWFuRmxhZ1ZhbHVlKCJkaXNhYmxlZF9yd19leHBvcnRlZCIsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgZW5hYmxlZEZpeGVkUm9FeHBvcnRlZCA9IHJlYWRlci5nZXRCb29sZWFuRmxhZ1ZhbHVlKCJlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkIiwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBlbmFibGVkUm9FeHBvcnRlZCA9IHJlYWRlci5nZXRCb29sZWFuRmxhZ1ZhbHVlKCJlbmFibGVkX3JvX2V4cG9ydGVkIiwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKExpbmthZ2VFcnJvciBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZvciBtYWlubGluZSBtb2R1bGUgcnVubmluZyBvbiBvbGRlciBkZXZpY2VzLgorICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSByZXBsYWNlcyB0byB2ZXJzaW9uIGNoZWNrLCBhZnRlciB0aGUgdmVyc2lvbiBidW1wLgorICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlzQ2FjaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzYWJsZWRSd0V4cG9ydGVkKCkgeworICAgICAgICAgICAgICAgIGlmICghaXNDYWNoZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5pdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZGlzYWJsZWRSd0V4cG9ydGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkRml4ZWRSb0V4cG9ydGVkKCkgeworICAgICAgICAgICAgICAgIGlmICghaXNDYWNoZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5pdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZW5hYmxlZEZpeGVkUm9FeHBvcnRlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlZFJvRXhwb3J0ZWQoKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0NhY2hlZCkgeworICAgICAgICAgICAgICAgICAgICBpbml0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBlbmFibGVkUm9FeHBvcnRlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSIjOworCisgICAgICAgIGxldCBleHBlY3RfY3VzdG9tX2ZlYXR1cmVfZmxhZ3NfY29udGVudCA9IHIjIgorICAgICAgICBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdDsKKworICAgICAgICBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKyAgICAgICAgaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworICAgICAgICBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisgICAgICAgIGltcG9ydCBqYXZhLnV0aWwuU2V0OworICAgICAgICBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpUHJlZGljYXRlOworICAgICAgICBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKKworICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgcHVibGljIGNsYXNzIEN1c3RvbUZlYXR1cmVGbGFncyBpbXBsZW1lbnRzIEZlYXR1cmVGbGFncyB7CisKKyAgICAgICAgICAgIHByaXZhdGUgQmlQcmVkaWNhdGU8U3RyaW5nLCBQcmVkaWNhdGU8RmVhdHVyZUZsYWdzPj4gbUdldFZhbHVlSW1wbDsKKworICAgICAgICAgICAgcHVibGljIEN1c3RvbUZlYXR1cmVGbGFncyhCaVByZWRpY2F0ZTxTdHJpbmcsIFByZWRpY2F0ZTxGZWF0dXJlRmxhZ3M+PiBnZXRWYWx1ZUltcGwpIHsKKyAgICAgICAgICAgICAgICBtR2V0VmFsdWVJbXBsID0gZ2V0VmFsdWVJbXBsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVkUndFeHBvcnRlZCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWUoRmxhZ3MuRkxBR19ESVNBQkxFRF9SV19FWFBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgRmVhdHVyZUZsYWdzOjpkaXNhYmxlZFJ3RXhwb3J0ZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkRml4ZWRSb0V4cG9ydGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZShGbGFncy5GTEFHX0VOQUJMRURfRklYRURfUk9fRVhQT1JURUQsCisgICAgICAgICAgICAgICAgICAgIEZlYXR1cmVGbGFnczo6ZW5hYmxlZEZpeGVkUm9FeHBvcnRlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRSb0V4cG9ydGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZShGbGFncy5GTEFHX0VOQUJMRURfUk9fRVhQT1JURUQsCisgICAgICAgICAgICAgICAgICAgIEZlYXR1cmVGbGFnczo6ZW5hYmxlZFJvRXhwb3J0ZWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnZXRWYWx1ZShTdHJpbmcgZmxhZ05hbWUsIFByZWRpY2F0ZTxGZWF0dXJlRmxhZ3M+IGdldHRlcikgeworICAgICAgICAgICAgICAgIHJldHVybiBtR2V0VmFsdWVJbXBsLnRlc3QoZmxhZ05hbWUsIGdldHRlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RmxhZ05hbWVzKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0RJU0FCTEVEX1JXX0VYUE9SVEVELAorICAgICAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0VOQUJMRURfRklYRURfUk9fRVhQT1JURUQsCisgICAgICAgICAgICAgICAgICAgIEZsYWdzLkZMQUdfRU5BQkxFRF9ST19FWFBPUlRFRAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgU2V0PFN0cmluZz4gbVJlYWRPbmx5RmxhZ3NTZXQgPSBuZXcgSGFzaFNldDw+KAorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgICAgICIiCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICIjOworCisgICAgICAgIGxldCBtdXQgZmlsZV9zZXQgPSBIYXNoTWFwOjpmcm9tKFsKKyAgICAgICAgICAgICgiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0ZsYWdzLmphdmEiLCBleHBlY3RfZmxhZ3NfY29udGVudCksCisgICAgICAgICAgICAoImNvbS9hbmRyb2lkL2Fjb25maWcvdGVzdC9GZWF0dXJlRmxhZ3MuamF2YSIsIGV4cGVjdF9mZWF0dXJlX2ZsYWdzX2NvbnRlbnQpLAorICAgICAgICAgICAgKCJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvRmVhdHVyZUZsYWdzSW1wbC5qYXZhIiwgZXhwZWN0X2ZlYXR1cmVfZmxhZ3NfaW1wbF9jb250ZW50KSwKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0N1c3RvbUZlYXR1cmVGbGFncy5qYXZhIiwKKyAgICAgICAgICAgICAgICBleHBlY3RfY3VzdG9tX2ZlYXR1cmVfZmxhZ3NfY29udGVudCwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgImNvbS9hbmRyb2lkL2Fjb25maWcvdGVzdC9GYWtlRmVhdHVyZUZsYWdzSW1wbC5qYXZhIiwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9GQUtFRkVBVFVSRUZMQUdTSU1QTF9DT05URU5ULAorICAgICAgICAgICAgKSwKKyAgICAgICAgXSk7CisKKyAgICAgICAgZm9yIGZpbGUgaW4gZ2VuZXJhdGVkX2ZpbGVzIHsKKyAgICAgICAgICAgIGxldCBmaWxlX3BhdGggPSBmaWxlLnBhdGgudG9fc3RyKCkudW53cmFwKCk7CisgICAgICAgICAgICBhc3NlcnQhKGZpbGVfc2V0LmNvbnRhaW5zX2tleShmaWxlX3BhdGgpLCAiQ2Fubm90IGZpbmQge30iLCBmaWxlX3BhdGgpOworICAgICAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgICAgIGNyYXRlOjp0ZXN0OjpmaXJzdF9zaWduaWZpY2FudF9jb2RlX2RpZmYoCisgICAgICAgICAgICAgICAgICAgIGZpbGVfc2V0LmdldChmaWxlX3BhdGgpLnVud3JhcCgpLAorICAgICAgICAgICAgICAgICAgICAmU3RyaW5nOjpmcm9tX3V0ZjgoZmlsZS5jb250ZW50cykudW53cmFwKCkKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICJGaWxlIHt9IGNvbnRlbnQgaXMgbm90IGNvcnJlY3QiLAorICAgICAgICAgICAgICAgIGZpbGVfcGF0aAorICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGZpbGVfc2V0LnJlbW92ZShmaWxlX3BhdGgpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0IShmaWxlX3NldC5pc19lbXB0eSgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9nZW5lcmF0ZV9qYXZhX2NvZGVfdGVzdCgpIHsKKyAgICAgICAgbGV0IHBhcnNlZF9mbGFncyA9IGNyYXRlOjp0ZXN0OjpwYXJzZV90ZXN0X2ZsYWdzKCk7CisgICAgICAgIGxldCBtb2RlID0gQ29kZWdlbk1vZGU6OlRlc3Q7CisgICAgICAgIGxldCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MgPQorICAgICAgICAgICAgY3JhdGU6OmNvbW1hbmRzOjptb2RpZnlfcGFyc2VkX2ZsYWdzX2Jhc2VkX29uX21vZGUocGFyc2VkX2ZsYWdzLCBtb2RlKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGZsYWdfaWRzID0KKyAgICAgICAgICAgIGFzc2lnbl9mbGFnX2lkcyhjcmF0ZTo6dGVzdDo6VEVTVF9QQUNLQUdFLCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaXRlcigpKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGdlbmVyYXRlZF9maWxlcyA9IGdlbmVyYXRlX2phdmFfY29kZSgKKyAgICAgICAgICAgIGNyYXRlOjp0ZXN0OjpURVNUX1BBQ0tBR0UsCisgICAgICAgICAgICBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaW50b19pdGVyKCksCisgICAgICAgICAgICBtb2RlLAorICAgICAgICAgICAgZmxhZ19pZHMsCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgNTgwMTE0NDc4NDYxODIyMTY2OCwKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICApCisgICAgICAgIC51bndyYXAoKTsKKworICAgICAgICBsZXQgZXhwZWN0X2ZsYWdzX2NvbnRlbnQgPSBFWFBFQ1RFRF9GTEFHX0NPTU1PTl9DT05URU5ULnRvX3N0cmluZygpCisgICAgICAgICAgICArIHIjIgorICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEZlYXR1cmVGbGFncyhGZWF0dXJlRmxhZ3MgZmVhdHVyZUZsYWdzKSB7CisgICAgICAgICAgICAgICAgRmxhZ3MuRkVBVFVSRV9GTEFHUyA9IGZlYXR1cmVGbGFnczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1bnNldEZlYXR1cmVGbGFncygpIHsKKyAgICAgICAgICAgICAgICBGbGFncy5GRUFUVVJFX0ZMQUdTID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIEZlYXR1cmVGbGFncyBGRUFUVVJFX0ZMQUdTOworICAgICAgICB9CisgICAgICAgICIjOworICAgICAgICBsZXQgZXhwZWN0X2ZlYXR1cmVmbGFnc2ltcGxfY29udGVudCA9IHIjIgorICAgICAgICBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdDsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBjbGFzcyBGZWF0dXJlRmxhZ3NJbXBsIGltcGxlbWVudHMgRmVhdHVyZUZsYWdzIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzYWJsZWRSbygpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJNZXRob2QgaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlZFJ3KCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVkUndFeHBvcnRlZCgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJNZXRob2QgaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlZFJ3SW5PdGhlck5hbWVzcGFjZSgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJNZXRob2QgaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkRml4ZWRSbygpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJNZXRob2QgaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkRml4ZWRSb0V4cG9ydGVkKCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRSbygpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJNZXRob2QgaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkUm9FeHBvcnRlZCgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJNZXRob2QgaXMgbm90IGltcGxlbWVudGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkUncoKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAiIzsKKworICAgICAgICBsZXQgbXV0IGZpbGVfc2V0ID0gSGFzaE1hcDo6ZnJvbShbCisgICAgICAgICAgICAoImNvbS9hbmRyb2lkL2Fjb25maWcvdGVzdC9GbGFncy5qYXZhIiwgZXhwZWN0X2ZsYWdzX2NvbnRlbnQuYXNfc3RyKCkpLAorICAgICAgICAgICAgKCJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvRmVhdHVyZUZsYWdzLmphdmEiLCBFWFBFQ1RFRF9GRUFUVVJFRkxBR1NfQ09NTU9OX0NPTlRFTlQpLAorICAgICAgICAgICAgKCJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvRmVhdHVyZUZsYWdzSW1wbC5qYXZhIiwgZXhwZWN0X2ZlYXR1cmVmbGFnc2ltcGxfY29udGVudCksCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgImNvbS9hbmRyb2lkL2Fjb25maWcvdGVzdC9DdXN0b21GZWF0dXJlRmxhZ3MuamF2YSIsCisgICAgICAgICAgICAgICAgRVhQRUNURURfQ1VTVE9NRkVBVFVSRUZMQUdTX0NPTlRFTlQsCisgICAgICAgICAgICApLAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvRmFrZUZlYXR1cmVGbGFnc0ltcGwuamF2YSIsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRkFLRUZFQVRVUkVGTEFHU0lNUExfQ09OVEVOVCwKKyAgICAgICAgICAgICksCisgICAgICAgIF0pOworCisgICAgICAgIGZvciBmaWxlIGluIGdlbmVyYXRlZF9maWxlcyB7CisgICAgICAgICAgICBsZXQgZmlsZV9wYXRoID0gZmlsZS5wYXRoLnRvX3N0cigpLnVud3JhcCgpOworICAgICAgICAgICAgYXNzZXJ0IShmaWxlX3NldC5jb250YWluc19rZXkoZmlsZV9wYXRoKSwgIkNhbm5vdCBmaW5kIHt9IiwgZmlsZV9wYXRoKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICBjcmF0ZTo6dGVzdDo6Zmlyc3Rfc2lnbmlmaWNhbnRfY29kZV9kaWZmKAorICAgICAgICAgICAgICAgICAgICBmaWxlX3NldC5nZXQoZmlsZV9wYXRoKS51bndyYXAoKSwKKyAgICAgICAgICAgICAgICAgICAgJlN0cmluZzo6ZnJvbV91dGY4KGZpbGUuY29udGVudHMpLnVud3JhcCgpCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAiRmlsZSB7fSBjb250ZW50IGlzIG5vdCBjb3JyZWN0IiwKKyAgICAgICAgICAgICAgICBmaWxlX3BhdGgKKyAgICAgICAgICAgICk7CisgICAgICAgICAgICBmaWxlX3NldC5yZW1vdmUoZmlsZV9wYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCEoZmlsZV9zZXQuaXNfZW1wdHkoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfZ2VuZXJhdGVfamF2YV9jb2RlX2ZvcmNlX3JlYWRfb25seSgpIHsKKyAgICAgICAgbGV0IHBhcnNlZF9mbGFncyA9IGNyYXRlOjp0ZXN0OjpwYXJzZV90ZXN0X2ZsYWdzKCk7CisgICAgICAgIGxldCBtb2RlID0gQ29kZWdlbk1vZGU6OkZvcmNlUmVhZE9ubHk7CisgICAgICAgIGxldCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MgPQorICAgICAgICAgICAgY3JhdGU6OmNvbW1hbmRzOjptb2RpZnlfcGFyc2VkX2ZsYWdzX2Jhc2VkX29uX21vZGUocGFyc2VkX2ZsYWdzLCBtb2RlKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGZsYWdfaWRzID0KKyAgICAgICAgICAgIGFzc2lnbl9mbGFnX2lkcyhjcmF0ZTo6dGVzdDo6VEVTVF9QQUNLQUdFLCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaXRlcigpKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGdlbmVyYXRlZF9maWxlcyA9IGdlbmVyYXRlX2phdmFfY29kZSgKKyAgICAgICAgICAgIGNyYXRlOjp0ZXN0OjpURVNUX1BBQ0tBR0UsCisgICAgICAgICAgICBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaW50b19pdGVyKCksCisgICAgICAgICAgICBtb2RlLAorICAgICAgICAgICAgZmxhZ19pZHMsCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgNTgwMTE0NDc4NDYxODIyMTY2OCwKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICApCisgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdF9mZWF0dXJlZmxhZ3NfY29udGVudCA9IHIjIgorICAgICAgICBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdDsKKyAgICAgICAgLy8gVE9ETyhiLzMwMzc3MzA1NSk6IFJlbW92ZSB0aGUgYW5ub3RhdGlvbiBhZnRlciBhY2Nlc3MgaXNzdWUgaXMgcmVzb2x2ZWQuCisgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbXBhdC5hbm5vdGF0aW9uLlVuc3VwcG9ydGVkQXBwVXNhZ2U7CisgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICBwdWJsaWMgaW50ZXJmYWNlIEZlYXR1cmVGbGFncyB7CisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5Bc3N1bWVGYWxzZUZvclI4CisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICAgICAgYm9vbGVhbiBkaXNhYmxlZFJvKCk7CisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5Bc3N1bWVGYWxzZUZvclI4CisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICAgICAgYm9vbGVhbiBkaXNhYmxlZFJ3KCk7CisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5Bc3N1bWVGYWxzZUZvclI4CisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICAgICAgYm9vbGVhbiBkaXNhYmxlZFJ3SW5PdGhlck5hbWVzcGFjZSgpOworICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lVHJ1ZUZvclI4CisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICAgICAgYm9vbGVhbiBlbmFibGVkRml4ZWRSbygpOworICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lVHJ1ZUZvclI4CisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICAgICAgYm9vbGVhbiBlbmFibGVkUm8oKTsKKyAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFzc3VtZVRydWVGb3JSOAorICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlZFJ3KCk7CisgICAgICAgIH0iIzsKKworICAgICAgICBsZXQgZXhwZWN0X2ZlYXR1cmVmbGFnc2ltcGxfY29udGVudCA9IHIjIgorICAgICAgICBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdDsKKyAgICAgICAgLy8gVE9ETyhiLzMwMzc3MzA1NSk6IFJlbW92ZSB0aGUgYW5ub3RhdGlvbiBhZnRlciBhY2Nlc3MgaXNzdWUgaXMgcmVzb2x2ZWQuCisgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbXBhdC5hbm5vdGF0aW9uLlVuc3VwcG9ydGVkQXBwVXNhZ2U7CisgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICBwdWJsaWMgZmluYWwgY2xhc3MgRmVhdHVyZUZsYWdzSW1wbCBpbXBsZW1lbnRzIEZlYXR1cmVGbGFncyB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlZFJvKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVkUncoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzYWJsZWRSd0luT3RoZXJOYW1lc3BhY2UoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlZEZpeGVkUm8oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkUm8oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkUncoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIiM7CisKKyAgICAgICAgbGV0IGV4cGVjdF9mbGFnc19jb250ZW50ID0gciMiCisgICAgICAgIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0OworICAgICAgICAvLyBUT0RPKGIvMzAzNzczMDU1KTogUmVtb3ZlIHRoZSBhbm5vdGF0aW9uIGFmdGVyIGFjY2VzcyBpc3N1ZSBpcyByZXNvbHZlZC4KKyAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29tcGF0LmFubm90YXRpb24uVW5zdXBwb3J0ZWRBcHBVc2FnZTsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBjbGFzcyBGbGFncyB7CisgICAgICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRElTQUJMRURfUk8gPSAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3JvIjsKKyAgICAgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19ESVNBQkxFRF9SVyA9ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcnciOworICAgICAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0RJU0FCTEVEX1JXX0lOX09USEVSX05BTUVTUEFDRSA9ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlIjsKKyAgICAgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19FTkFCTEVEX0ZJWEVEX1JPID0gImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX2ZpeGVkX3JvIjsKKyAgICAgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19FTkFCTEVEX1JPID0gImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3JvIjsKKyAgICAgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19FTkFCTEVEX1JXID0gImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3J3IjsKKyAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFzc3VtZUZhbHNlRm9yUjgKKyAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGlzYWJsZWRSbygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkVBVFVSRV9GTEFHUy5kaXNhYmxlZFJvKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5Bc3N1bWVGYWxzZUZvclI4CisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGRpc2FibGVkUncoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZFQVRVUkVfRkxBR1MuZGlzYWJsZWRSdygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lRmFsc2VGb3JSOAorICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkaXNhYmxlZFJ3SW5PdGhlck5hbWVzcGFjZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkVBVFVSRV9GTEFHUy5kaXNhYmxlZFJ3SW5PdGhlck5hbWVzcGFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lVHJ1ZUZvclI4CisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVuYWJsZWRGaXhlZFJvKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBGRUFUVVJFX0ZMQUdTLmVuYWJsZWRGaXhlZFJvKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5Bc3N1bWVUcnVlRm9yUjgKKyAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5hYmxlZFJvKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBGRUFUVVJFX0ZMQUdTLmVuYWJsZWRSbygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lVHJ1ZUZvclI4CisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVuYWJsZWRSdygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkVBVFVSRV9GTEFHUy5lbmFibGVkUncoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIEZlYXR1cmVGbGFncyBGRUFUVVJFX0ZMQUdTID0gbmV3IEZlYXR1cmVGbGFnc0ltcGwoKTsKKyAgICAgICAgfSIjOworCisgICAgICAgIGxldCBleHBlY3RfY3VzdG9tZmVhdHVyZWZsYWdzX2NvbnRlbnQgPSByIyIKKyAgICAgICAgcGFja2FnZSBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3Q7CisKKyAgICAgICAgLy8gVE9ETyhiLzMwMzc3MzA1NSk6IFJlbW92ZSB0aGUgYW5ub3RhdGlvbiBhZnRlciBhY2Nlc3MgaXNzdWUgaXMgcmVzb2x2ZWQuCisgICAgICAgIGltcG9ydCBhbmRyb2lkLmNvbXBhdC5hbm5vdGF0aW9uLlVuc3VwcG9ydGVkQXBwVXNhZ2U7CisgICAgICAgIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworICAgICAgICBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CisgICAgICAgIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKyAgICAgICAgaW1wb3J0IGphdmEudXRpbC5TZXQ7CisgICAgICAgIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlQcmVkaWNhdGU7CisgICAgICAgIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworCisgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICBwdWJsaWMgY2xhc3MgQ3VzdG9tRmVhdHVyZUZsYWdzIGltcGxlbWVudHMgRmVhdHVyZUZsYWdzIHsKKworICAgICAgICAgICAgcHJpdmF0ZSBCaVByZWRpY2F0ZTxTdHJpbmcsIFByZWRpY2F0ZTxGZWF0dXJlRmxhZ3M+PiBtR2V0VmFsdWVJbXBsOworCisgICAgICAgICAgICBwdWJsaWMgQ3VzdG9tRmVhdHVyZUZsYWdzKEJpUHJlZGljYXRlPFN0cmluZywgUHJlZGljYXRlPEZlYXR1cmVGbGFncz4+IGdldFZhbHVlSW1wbCkgeworICAgICAgICAgICAgICAgIG1HZXRWYWx1ZUltcGwgPSBnZXRWYWx1ZUltcGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVkUm8oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlKEZsYWdzLkZMQUdfRElTQUJMRURfUk8sCisgICAgICAgICAgICAgICAgICAgICAgICBGZWF0dXJlRmxhZ3M6OmRpc2FibGVkUm8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzYWJsZWRSdygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWUoRmxhZ3MuRkxBR19ESVNBQkxFRF9SVywKKyAgICAgICAgICAgICAgICAgICAgRmVhdHVyZUZsYWdzOjpkaXNhYmxlZFJ3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVkUndJbk90aGVyTmFtZXNwYWNlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZShGbGFncy5GTEFHX0RJU0FCTEVEX1JXX0lOX09USEVSX05BTUVTUEFDRSwKKyAgICAgICAgICAgICAgICAgICAgRmVhdHVyZUZsYWdzOjpkaXNhYmxlZFJ3SW5PdGhlck5hbWVzcGFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkRml4ZWRSbygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWUoRmxhZ3MuRkxBR19FTkFCTEVEX0ZJWEVEX1JPLAorICAgICAgICAgICAgICAgICAgICBGZWF0dXJlRmxhZ3M6OmVuYWJsZWRGaXhlZFJvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRSbygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWUoRmxhZ3MuRkxBR19FTkFCTEVEX1JPLAorICAgICAgICAgICAgICAgICAgICBGZWF0dXJlRmxhZ3M6OmVuYWJsZWRSbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkUncoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlKEZsYWdzLkZMQUdfRU5BQkxFRF9SVywKKyAgICAgICAgICAgICAgICAgICAgRmVhdHVyZUZsYWdzOjplbmFibGVkUncpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZsYWdSZWFkT25seU9wdGltaXplZChTdHJpbmcgZmxhZ05hbWUpIHsKKyAgICAgICAgICAgICAgICBpZiAobVJlYWRPbmx5RmxhZ3NTZXQuY29udGFpbnMoZmxhZ05hbWUpICYmCisgICAgICAgICAgICAgICAgICAgIGlzT3B0aW1pemF0aW9uRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5Bc3N1bWVUcnVlRm9yUjgKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc09wdGltaXphdGlvbkVuYWJsZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnZXRWYWx1ZShTdHJpbmcgZmxhZ05hbWUsIFByZWRpY2F0ZTxGZWF0dXJlRmxhZ3M+IGdldHRlcikgeworICAgICAgICAgICAgICAgIHJldHVybiBtR2V0VmFsdWVJbXBsLnRlc3QoZmxhZ05hbWUsIGdldHRlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RmxhZ05hbWVzKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0RJU0FCTEVEX1JPLAorICAgICAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0RJU0FCTEVEX1JXLAorICAgICAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0RJU0FCTEVEX1JXX0lOX09USEVSX05BTUVTUEFDRSwKKyAgICAgICAgICAgICAgICAgICAgRmxhZ3MuRkxBR19FTkFCTEVEX0ZJWEVEX1JPLAorICAgICAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0VOQUJMRURfUk8sCisgICAgICAgICAgICAgICAgICAgIEZsYWdzLkZMQUdfRU5BQkxFRF9SVworICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgU2V0PFN0cmluZz4gbVJlYWRPbmx5RmxhZ3NTZXQgPSBuZXcgSGFzaFNldDw+KAorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgICAgIEZsYWdzLkZMQUdfRElTQUJMRURfUk8sCisgICAgICAgICAgICAgICAgICAgIEZsYWdzLkZMQUdfRElTQUJMRURfUlcsCisgICAgICAgICAgICAgICAgICAgIEZsYWdzLkZMQUdfRElTQUJMRURfUldfSU5fT1RIRVJfTkFNRVNQQUNFLAorICAgICAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0VOQUJMRURfRklYRURfUk8sCisgICAgICAgICAgICAgICAgICAgIEZsYWdzLkZMQUdfRU5BQkxFRF9STywKKyAgICAgICAgICAgICAgICAgICAgRmxhZ3MuRkxBR19FTkFCTEVEX1JXLAorICAgICAgICAgICAgICAgICAgICAiIgorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICAgICAgIiM7CisKKyAgICAgICAgbGV0IG11dCBmaWxlX3NldCA9IEhhc2hNYXA6OmZyb20oWworICAgICAgICAgICAgKCJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvRmxhZ3MuamF2YSIsIGV4cGVjdF9mbGFnc19jb250ZW50KSwKKyAgICAgICAgICAgICgiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0ZlYXR1cmVGbGFnc0ltcGwuamF2YSIsIGV4cGVjdF9mZWF0dXJlZmxhZ3NpbXBsX2NvbnRlbnQpLAorICAgICAgICAgICAgKCJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvRmVhdHVyZUZsYWdzLmphdmEiLCBleHBlY3RfZmVhdHVyZWZsYWdzX2NvbnRlbnQpLAorICAgICAgICAgICAgKCJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvQ3VzdG9tRmVhdHVyZUZsYWdzLmphdmEiLCBleHBlY3RfY3VzdG9tZmVhdHVyZWZsYWdzX2NvbnRlbnQpLAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvRmFrZUZlYXR1cmVGbGFnc0ltcGwuamF2YSIsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRkFLRUZFQVRVUkVGTEFHU0lNUExfQ09OVEVOVCwKKyAgICAgICAgICAgICksCisgICAgICAgIF0pOworCisgICAgICAgIGZvciBmaWxlIGluIGdlbmVyYXRlZF9maWxlcyB7CisgICAgICAgICAgICBsZXQgZmlsZV9wYXRoID0gZmlsZS5wYXRoLnRvX3N0cigpLnVud3JhcCgpOworICAgICAgICAgICAgYXNzZXJ0IShmaWxlX3NldC5jb250YWluc19rZXkoZmlsZV9wYXRoKSwgIkNhbm5vdCBmaW5kIHt9IiwgZmlsZV9wYXRoKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICBjcmF0ZTo6dGVzdDo6Zmlyc3Rfc2lnbmlmaWNhbnRfY29kZV9kaWZmKAorICAgICAgICAgICAgICAgICAgICBmaWxlX3NldC5nZXQoZmlsZV9wYXRoKS51bndyYXAoKSwKKyAgICAgICAgICAgICAgICAgICAgJlN0cmluZzo6ZnJvbV91dGY4KGZpbGUuY29udGVudHMpLnVud3JhcCgpCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAiRmlsZSB7fSBjb250ZW50IGlzIG5vdCBjb3JyZWN0IiwKKyAgICAgICAgICAgICAgICBmaWxlX3BhdGgKKyAgICAgICAgICAgICk7CisgICAgICAgICAgICBmaWxlX3NldC5yZW1vdmUoZmlsZV9wYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCEoZmlsZV9zZXQuaXNfZW1wdHkoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfZm9ybWF0X2phdmFfbWV0aG9kX25hbWUoKSB7CisgICAgICAgIGxldCBleHBlY3RlZCA9ICJzb21lU25ha2VOYW1lIjsKKyAgICAgICAgbGV0IGlucHV0ID0gIl9fX19zb21lX3NuYWtlX19fbmFtZV9fX18iOworICAgICAgICBsZXQgZm9ybWF0dGVkX25hbWUgPSBmb3JtYXRfamF2YV9tZXRob2RfbmFtZShpbnB1dCk7CisgICAgICAgIGFzc2VydF9lcSEoZXhwZWN0ZWQsIGZvcm1hdHRlZF9uYW1lKTsKKworICAgICAgICBsZXQgaW5wdXQgPSAic29tZVNuYWtlTmFtZSI7CisgICAgICAgIGxldCBmb3JtYXR0ZWRfbmFtZSA9IGZvcm1hdF9qYXZhX21ldGhvZF9uYW1lKGlucHV0KTsKKyAgICAgICAgYXNzZXJ0X2VxIShleHBlY3RlZCwgZm9ybWF0dGVkX25hbWUpOworCisgICAgICAgIGxldCBpbnB1dCA9ICJTb21lU25ha2VOYW1lIjsKKyAgICAgICAgbGV0IGZvcm1hdHRlZF9uYW1lID0gZm9ybWF0X2phdmFfbWV0aG9kX25hbWUoaW5wdXQpOworICAgICAgICBhc3NlcnRfZXEhKGV4cGVjdGVkLCBmb3JtYXR0ZWRfbmFtZSk7CisKKyAgICAgICAgbGV0IGlucHV0ID0gIlNvbWVTbmFrZU5hbWVfIjsKKyAgICAgICAgbGV0IGZvcm1hdHRlZF9uYW1lID0gZm9ybWF0X2phdmFfbWV0aG9kX25hbWUoaW5wdXQpOworICAgICAgICBhc3NlcnRfZXEhKGV4cGVjdGVkLCBmb3JtYXR0ZWRfbmFtZSk7CisKKyAgICAgICAgbGV0IGlucHV0ID0gIl9Tb21lU25ha2VOYW1lIjsKKyAgICAgICAgbGV0IGZvcm1hdHRlZF9uYW1lID0gZm9ybWF0X2phdmFfbWV0aG9kX25hbWUoaW5wdXQpOworICAgICAgICBhc3NlcnRfZXEhKGV4cGVjdGVkLCBmb3JtYXR0ZWRfbmFtZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfZm9ybWF0X3Byb3BlcnR5X25hbWUoKSB7CisgICAgICAgIGxldCBleHBlY3RlZCA9ICJtUHJvcGVydGllc1NvbWVTbmFrZU5hbWUiOworICAgICAgICBsZXQgaW5wdXQgPSAiX19fX3NvbWVfc25ha2VfX19uYW1lX19fXyI7CisgICAgICAgIGxldCBmb3JtYXR0ZWRfbmFtZSA9IGZvcm1hdF9wcm9wZXJ0eV9uYW1lKGlucHV0KTsKKyAgICAgICAgYXNzZXJ0X2VxIShleHBlY3RlZCwgZm9ybWF0dGVkX25hbWUpOworCisgICAgICAgIGxldCBpbnB1dCA9ICJzb21lU25ha2VOYW1lIjsKKyAgICAgICAgbGV0IGZvcm1hdHRlZF9uYW1lID0gZm9ybWF0X3Byb3BlcnR5X25hbWUoaW5wdXQpOworICAgICAgICBhc3NlcnRfZXEhKGV4cGVjdGVkLCBmb3JtYXR0ZWRfbmFtZSk7CisKKyAgICAgICAgbGV0IGlucHV0ID0gIlNvbWVTbmFrZU5hbWUiOworICAgICAgICBsZXQgZm9ybWF0dGVkX25hbWUgPSBmb3JtYXRfcHJvcGVydHlfbmFtZShpbnB1dCk7CisgICAgICAgIGFzc2VydF9lcSEoZXhwZWN0ZWQsIGZvcm1hdHRlZF9uYW1lKTsKKworICAgICAgICBsZXQgaW5wdXQgPSAiU29tZVNuYWtlTmFtZV8iOworICAgICAgICBsZXQgZm9ybWF0dGVkX25hbWUgPSBmb3JtYXRfcHJvcGVydHlfbmFtZShpbnB1dCk7CisgICAgICAgIGFzc2VydF9lcSEoZXhwZWN0ZWQsIGZvcm1hdHRlZF9uYW1lKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvZGVnZW4vbW9kLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb2RlZ2VuL21vZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWEzYjM3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb2RlZ2VuL21vZC5ycwpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3B1YiBtb2QgY3BwOworcHViIG1vZCBqYXZhOworcHViIG1vZCBydXN0OworCit1c2UgYWNvbmZpZ19wcm90b3M6Ontpc192YWxpZF9uYW1lX2lkZW50LCBpc192YWxpZF9wYWNrYWdlX2lkZW50fTsKK3VzZSBhbnlob3c6OntlbnN1cmUsIFJlc3VsdH07Cit1c2UgY2xhcDo6VmFsdWVFbnVtOworCitwdWIgZm4gY3JlYXRlX2RldmljZV9jb25maWdfaWRlbnQocGFja2FnZTogJnN0ciwgZmxhZ19uYW1lOiAmc3RyKSAtPiBSZXN1bHQ8U3RyaW5nPiB7CisgICAgZW5zdXJlIShpc192YWxpZF9wYWNrYWdlX2lkZW50KHBhY2thZ2UpLCAiYmFkIHBhY2thZ2UiKTsKKyAgICBlbnN1cmUhKGlzX3ZhbGlkX25hbWVfaWRlbnQoZmxhZ19uYW1lKSwgImJhZCBmbGFnIG5hbWUiKTsKKyAgICBPayhmb3JtYXQhKCJ7fS57fSIsIHBhY2thZ2UsIGZsYWdfbmFtZSkpCit9CisKKyNbZGVyaXZlKENvcHksIENsb25lLCBEZWJ1ZywgUGFydGlhbEVxLCBFcSwgVmFsdWVFbnVtKV0KK3B1YiBlbnVtIENvZGVnZW5Nb2RlIHsKKyAgICBFeHBvcnRlZCwKKyAgICBGb3JjZVJlYWRPbmx5LAorICAgIFByb2R1Y3Rpb24sCisgICAgVGVzdCwKK30KKworaW1wbCBzdGQ6OmZtdDo6RGlzcGxheSBmb3IgQ29kZWdlbk1vZGUgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyKSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKKyAgICAgICAgbWF0Y2ggc2VsZiB7CisgICAgICAgICAgICBDb2RlZ2VuTW9kZTo6RXhwb3J0ZWQgPT4gd3JpdGUhKGYsICJleHBvcnRlZCIpLAorICAgICAgICAgICAgQ29kZWdlbk1vZGU6OkZvcmNlUmVhZE9ubHkgPT4gd3JpdGUhKGYsICJmb3JjZS1yZWFkLW9ubHkiKSwKKyAgICAgICAgICAgIENvZGVnZW5Nb2RlOjpQcm9kdWN0aW9uID0+IHdyaXRlIShmLCAicHJvZHVjdGlvbiIpLAorICAgICAgICAgICAgQ29kZWdlbk1vZGU6OlRlc3QgPT4gd3JpdGUhKGYsICJ0ZXN0IiksCisgICAgICAgIH0KKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIGFjb25maWdfcHJvdG9zOjppc192YWxpZF9jb250YWluZXJfaWRlbnQ7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9pc192YWxpZF9uYW1lX2lkZW50KCkgeworICAgICAgICBhc3NlcnQhKGlzX3ZhbGlkX25hbWVfaWRlbnQoImZvbyIpKTsKKyAgICAgICAgYXNzZXJ0IShpc192YWxpZF9uYW1lX2lkZW50KCJmb29fYmFyXzEyMyIpKTsKKyAgICAgICAgYXNzZXJ0IShpc192YWxpZF9uYW1lX2lkZW50KCJmb29fIikpOworCisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX25hbWVfaWRlbnQoIiIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfbmFtZV9pZGVudCgiMTIzX2ZvbyIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfbmFtZV9pZGVudCgiZm9vLWJhciIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfbmFtZV9pZGVudCgiZm9vLWJcdXswMGU1fXIiKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX25hbWVfaWRlbnQoImZvb19fYmFyIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9uYW1lX2lkZW50KCJfZm9vIikpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2lzX3ZhbGlkX3BhY2thZ2VfaWRlbnQoKSB7CisgICAgICAgIGFzc2VydCEoaXNfdmFsaWRfcGFja2FnZV9pZGVudCgiZm9vLmJhciIpKTsKKyAgICAgICAgYXNzZXJ0IShpc192YWxpZF9wYWNrYWdlX2lkZW50KCJmb28uYmFyX2JheiIpKTsKKyAgICAgICAgYXNzZXJ0IShpc192YWxpZF9wYWNrYWdlX2lkZW50KCJmb28uYmFyLmExMjMiKSk7CisKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfcGFja2FnZV9pZGVudCgiZm9vX2Jhcl8xMjMiKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX3BhY2thZ2VfaWRlbnQoImZvbyIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfcGFja2FnZV9pZGVudCgiZm9vLl9iYXIiKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX3BhY2thZ2VfaWRlbnQoIiIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfcGFja2FnZV9pZGVudCgiMTIzX2ZvbyIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfcGFja2FnZV9pZGVudCgiZm9vLWJhciIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfcGFja2FnZV9pZGVudCgiZm9vLWJcdXswMGU1fXIiKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX3BhY2thZ2VfaWRlbnQoImZvby5iYXIuMTIzIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9wYWNrYWdlX2lkZW50KCIuZm9vLmJhciIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfcGFja2FnZV9pZGVudCgiZm9vLmJhci4iKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX3BhY2thZ2VfaWRlbnQoIi4iKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX3BhY2thZ2VfaWRlbnQoIi4uIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9wYWNrYWdlX2lkZW50KCJmb28uLmJhciIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfcGFja2FnZV9pZGVudCgiZm9vLl9fYmFyIikpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2lzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudCgpIHsKKyAgICAgICAgYXNzZXJ0IShpc192YWxpZF9jb250YWluZXJfaWRlbnQoImZvby5iYXIiKSk7CisgICAgICAgIGFzc2VydCEoaXNfdmFsaWRfY29udGFpbmVyX2lkZW50KCJmb28uYmFyX2JheiIpKTsKKyAgICAgICAgYXNzZXJ0IShpc192YWxpZF9jb250YWluZXJfaWRlbnQoImZvby5iYXIuYTEyMyIpKTsKKyAgICAgICAgYXNzZXJ0IShpc192YWxpZF9jb250YWluZXJfaWRlbnQoImZvbyIpKTsKKyAgICAgICAgYXNzZXJ0IShpc192YWxpZF9jb250YWluZXJfaWRlbnQoImZvb19iYXJfMTIzIikpOworCisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudCgiIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9jb250YWluZXJfaWRlbnQoImZvby5fYmFyIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9jb250YWluZXJfaWRlbnQoIl9mb28iKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudCgiMTIzX2ZvbyIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfY29udGFpbmVyX2lkZW50KCJmb28tYmFyIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9jb250YWluZXJfaWRlbnQoImZvby1iXHV7MDBlNX1yIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9jb250YWluZXJfaWRlbnQoImZvby5iYXIuMTIzIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9jb250YWluZXJfaWRlbnQoIi5mb28uYmFyIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9jb250YWluZXJfaWRlbnQoImZvby5iYXIuIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9jb250YWluZXJfaWRlbnQoIi4iKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudCgiLi4iKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudCgiZm9vLi5iYXIiKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudCgiZm9vLl9fYmFyIikpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2NyZWF0ZV9kZXZpY2VfY29uZmlnX2lkZW50KCkgeworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgImNvbS5mb28uYmFyLnNvbWVfZmxhZyIsCisgICAgICAgICAgICBjcmVhdGVfZGV2aWNlX2NvbmZpZ19pZGVudCgiY29tLmZvby5iYXIiLCAic29tZV9mbGFnIikudW53cmFwKCkKKyAgICAgICAgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvZGVnZW4vcnVzdC5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29kZWdlbi9ydXN0LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZGExYmMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvZGVnZW4vcnVzdC5ycwpAQCAtMCwwICsxLDEwMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2UgYW55aG93OjpSZXN1bHQ7Cit1c2Ugc2VyZGU6OlNlcmlhbGl6ZTsKK3VzZSB0aW55dGVtcGxhdGU6OlRpbnlUZW1wbGF0ZTsKKwordXNlIGFjb25maWdfcHJvdG9zOjp7UHJvdG9GbGFnUGVybWlzc2lvbiwgUHJvdG9GbGFnU3RhdGUsIFByb3RvUGFyc2VkRmxhZ307CisKK3VzZSBzdGQ6OmNvbGxlY3Rpb25zOjpIYXNoTWFwOworCit1c2UgY3JhdGU6OmNvZGVnZW47Cit1c2UgY3JhdGU6OmNvZGVnZW46OkNvZGVnZW5Nb2RlOwordXNlIGNyYXRlOjpjb21tYW5kczo6e3Nob3VsZF9pbmNsdWRlX2ZsYWcsIE91dHB1dEZpbGV9OworCitwdWIgZm4gZ2VuZXJhdGVfcnVzdF9jb2RlPEk+KAorICAgIHBhY2thZ2U6ICZzdHIsCisgICAgZmxhZ19pZHM6IEhhc2hNYXA8U3RyaW5nLCB1MTY+LAorICAgIHBhcnNlZF9mbGFnc19pdGVyOiBJLAorICAgIGNvZGVnZW5fbW9kZTogQ29kZWdlbk1vZGUsCisgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uOiBib29sLAorKSAtPiBSZXN1bHQ8T3V0cHV0RmlsZT4KK3doZXJlCisgICAgSTogSXRlcmF0b3I8SXRlbSA9IFByb3RvUGFyc2VkRmxhZz4sCit7CisgICAgbGV0IHRlbXBsYXRlX2ZsYWdzOiBWZWM8VGVtcGxhdGVQYXJzZWRGbGFnPiA9IHBhcnNlZF9mbGFnc19pdGVyCisgICAgICAgIC5tYXAofHBmfCBUZW1wbGF0ZVBhcnNlZEZsYWc6Om5ldyhwYWNrYWdlLCBmbGFnX2lkcy5jbG9uZSgpLCAmcGYpKQorICAgICAgICAuY29sbGVjdCgpOworICAgIGxldCBoYXNfcmVhZHdyaXRlID0gdGVtcGxhdGVfZmxhZ3MuaXRlcigpLmFueSh8aXRlbXwgaXRlbS5yZWFkd3JpdGUpOworICAgIGxldCBjb250YWluZXIgPSAodGVtcGxhdGVfZmxhZ3MuZmlyc3QoKS5leHBlY3QoInplcm8gdGVtcGxhdGUgZmxhZ3MiKS5jb250YWluZXIpLnRvX3N0cmluZygpOworICAgIGxldCBjb250ZXh0ID0gVGVtcGxhdGVDb250ZXh0IHsKKyAgICAgICAgcGFja2FnZTogcGFja2FnZS50b19zdHJpbmcoKSwKKyAgICAgICAgdGVtcGxhdGVfZmxhZ3MsCisgICAgICAgIG1vZHVsZXM6IHBhY2thZ2Uuc3BsaXQoJy4nKS5tYXAofHN8IHMudG9fc3RyaW5nKCkpLmNvbGxlY3Q6OjxWZWM8Xz4+KCksCisgICAgICAgIGhhc19yZWFkd3JpdGUsCisgICAgICAgIGFsbG93X2luc3RydW1lbnRhdGlvbiwKKyAgICAgICAgY29udGFpbmVyLAorICAgIH07CisgICAgbGV0IG11dCB0ZW1wbGF0ZSA9IFRpbnlUZW1wbGF0ZTo6bmV3KCk7CisgICAgdGVtcGxhdGUuYWRkX3RlbXBsYXRlKAorICAgICAgICAicnVzdF9jb2RlX2dlbiIsCisgICAgICAgIG1hdGNoIGNvZGVnZW5fbW9kZSB7CisgICAgICAgICAgICBDb2RlZ2VuTW9kZTo6VGVzdCA9PiBpbmNsdWRlX3N0ciEoIi4uLy4uL3RlbXBsYXRlcy9ydXN0X3Rlc3QudGVtcGxhdGUiKSwKKyAgICAgICAgICAgIENvZGVnZW5Nb2RlOjpFeHBvcnRlZCB8IENvZGVnZW5Nb2RlOjpGb3JjZVJlYWRPbmx5IHwgQ29kZWdlbk1vZGU6OlByb2R1Y3Rpb24gPT4geworICAgICAgICAgICAgICAgIGluY2x1ZGVfc3RyISgiLi4vLi4vdGVtcGxhdGVzL3J1c3QudGVtcGxhdGUiKQorICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICk/OworICAgIGxldCBjb250ZW50cyA9IHRlbXBsYXRlLnJlbmRlcigicnVzdF9jb2RlX2dlbiIsICZjb250ZXh0KT87CisgICAgbGV0IHBhdGggPSBbInNyYyIsICJsaWIucnMiXS5pdGVyKCkuY29sbGVjdCgpOworICAgIE9rKE91dHB1dEZpbGUgeyBjb250ZW50czogY29udGVudHMuaW50bygpLCBwYXRoIH0pCit9CisKKyNbZGVyaXZlKFNlcmlhbGl6ZSldCitzdHJ1Y3QgVGVtcGxhdGVDb250ZXh0IHsKKyAgICBwdWIgcGFja2FnZTogU3RyaW5nLAorICAgIHB1YiB0ZW1wbGF0ZV9mbGFnczogVmVjPFRlbXBsYXRlUGFyc2VkRmxhZz4sCisgICAgcHViIG1vZHVsZXM6IFZlYzxTdHJpbmc+LAorICAgIHB1YiBoYXNfcmVhZHdyaXRlOiBib29sLAorICAgIHB1YiBhbGxvd19pbnN0cnVtZW50YXRpb246IGJvb2wsCisgICAgcHViIGNvbnRhaW5lcjogU3RyaW5nLAorfQorCisjW2Rlcml2ZShTZXJpYWxpemUpXQorc3RydWN0IFRlbXBsYXRlUGFyc2VkRmxhZyB7CisgICAgcHViIHJlYWR3cml0ZTogYm9vbCwKKyAgICBwdWIgZGVmYXVsdF92YWx1ZTogU3RyaW5nLAorICAgIHB1YiBuYW1lOiBTdHJpbmcsCisgICAgcHViIGNvbnRhaW5lcjogU3RyaW5nLAorICAgIHB1YiBmbGFnX29mZnNldDogdTE2LAorICAgIHB1YiBkZXZpY2VfY29uZmlnX25hbWVzcGFjZTogU3RyaW5nLAorICAgIHB1YiBkZXZpY2VfY29uZmlnX2ZsYWc6IFN0cmluZywKK30KKworaW1wbCBUZW1wbGF0ZVBhcnNlZEZsYWcgeworICAgICNbYWxsb3coY2xpcHB5Ojpub25taW5pbWFsX2Jvb2wpXQorICAgIGZuIG5ldyhwYWNrYWdlOiAmc3RyLCBmbGFnX29mZnNldHM6IEhhc2hNYXA8U3RyaW5nLCB1MTY+LCBwZjogJlByb3RvUGFyc2VkRmxhZykgLT4gU2VsZiB7CisgICAgICAgIGxldCBmbGFnX29mZnNldCA9IG1hdGNoIGZsYWdfb2Zmc2V0cy5nZXQocGYubmFtZSgpKSB7CisgICAgICAgICAgICBTb21lKG9mZnNldCkgPT4gb2Zmc2V0LAorICAgICAgICAgICAgTm9uZSA9PiB7CisgICAgICAgICAgICAgICAgLy8gU3lzdGVtL3ZlbmRvci9wcm9kdWN0IFJPK2Rpc2FibGVkIGZsYWdzIGhhdmUgbm8gb2Zmc2V0IGluIHN0b3JhZ2UgZmlsZXMuCisgICAgICAgICAgICAgICAgLy8gQXNzaWduIHBsYWNlaG9sZGVyIHZhbHVlLgorICAgICAgICAgICAgICAgIGlmICFzaG91bGRfaW5jbHVkZV9mbGFnKHBmKSB7CisgICAgICAgICAgICAgICAgICAgICYwCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEFsbCBvdGhlciBmbGFncyBfbXVzdF8gaGF2ZSBhbiBvZmZzZXQuCisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBhbmljISgie30iLCBmb3JtYXQhKCJtaXNzaW5nIGZsYWcgb2Zmc2V0IGZvciB7fSIsIHBmLm5hbWUoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBTZWxmIHsKKyAgICAgICAgICAgIHJlYWR3cml0ZTogcGYucGVybWlzc2lvbigpID09IFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfV1JJVEUsCisgICAgICAgICAgICBkZWZhdWx0X3ZhbHVlOiBtYXRjaCBwZi5zdGF0ZSgpIHsKKyAgICAgICAgICAgICAgICBQcm90b0ZsYWdTdGF0ZTo6RU5BQkxFRCA9PiAidHJ1ZSIudG9fc3RyaW5nKCksCisgICAgICAgICAgICAgICAgUHJvdG9GbGFnU3RhdGU6OkRJU0FCTEVEID0+ICJmYWxzZSIudG9fc3RyaW5nKCksCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgbmFtZTogcGYubmFtZSgpLnRvX3N0cmluZygpLAorICAgICAgICAgICAgY29udGFpbmVyOiBwZi5jb250YWluZXIoKS50b19zdHJpbmcoKSwKKyAgICAgICAgICAgIGZsYWdfb2Zmc2V0OiAqZmxhZ19vZmZzZXQsCisgICAgICAgICAgICBkZXZpY2VfY29uZmlnX25hbWVzcGFjZTogcGYubmFtZXNwYWNlKCkudG9fc3RyaW5nKCksCisgICAgICAgICAgICBkZXZpY2VfY29uZmlnX2ZsYWc6IGNvZGVnZW46OmNyZWF0ZV9kZXZpY2VfY29uZmlnX2lkZW50KHBhY2thZ2UsIHBmLm5hbWUoKSkKKyAgICAgICAgICAgICAgICAuZXhwZWN0KCJ2YWx1ZXMgY2hlY2tlZCBhdCBmbGFnIHBhcnNlIHRpbWUiKSwKKyAgICAgICAgfQorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKworICAgIGNvbnN0IFBST0RfRVhQRUNURUQ6ICZzdHIgPSByIyIKKy8vISBjb2RlZ2VuZXJhdGVkIHJ1c3QgZmxhZyBsaWIKK3VzZSBhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGk6OntNbWFwLCBBY29uZmlnU3RvcmFnZUVycm9yLCBTdG9yYWdlRmlsZVR5cGUsIFBhY2thZ2VSZWFkQ29udGV4dCwgZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUsIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUsIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dH07Cit1c2Ugc3RkOjpwYXRoOjpQYXRoOwordXNlIHN0ZDo6aW86OldyaXRlOwordXNlIHN0ZDo6c3luYzo6TGF6eUxvY2s7Cit1c2UgbG9nOjp7bG9nLCBMZXZlbEZpbHRlciwgTGV2ZWx9OworCisvLy8gZmxhZyBwcm92aWRlcgorcHViIHN0cnVjdCBGbGFnUHJvdmlkZXI7CisKKyAgICAvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3IgZGlzYWJsZWRfcncKKyAgICBzdGF0aWMgQ0FDSEVEX2Rpc2FibGVkX3J3OiBMYXp5TG9jazxib29sPiA9IExhenlMb2NrOjpuZXcofHwgZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKKyAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKKyAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9ydyIsCisgICAgICAgICJmYWxzZSIpID09ICJ0cnVlIik7CisKKyAgICAvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3IgZGlzYWJsZWRfcndfZXhwb3J0ZWQKKyAgICBzdGF0aWMgQ0FDSEVEX2Rpc2FibGVkX3J3X2V4cG9ydGVkOiBMYXp5TG9jazxib29sPiA9IExhenlMb2NrOjpuZXcofHwgZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKKyAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKKyAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19leHBvcnRlZCIsCisgICAgICAgICJmYWxzZSIpID09ICJ0cnVlIik7CisKKyAgICAvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3IgZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlCisgICAgc3RhdGljIENBQ0hFRF9kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2U6IExhenlMb2NrPGJvb2w+ID0gTGF6eUxvY2s6Om5ldyh8fCBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAiYWNvbmZpZ19mbGFncy5vdGhlcl9uYW1lc3BhY2UiLAorICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSIsCisgICAgICAgICJmYWxzZSIpID09ICJ0cnVlIik7CisKKyAgICAvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3IgZW5hYmxlZF9ydworICAgIHN0YXRpYyBDQUNIRURfZW5hYmxlZF9ydzogTGF6eUxvY2s8Ym9vbD4gPSBMYXp5TG9jazo6bmV3KHx8IGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCisgICAgICAgICJhY29uZmlnX2ZsYWdzLmFjb25maWdfdGVzdCIsCisgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9ydyIsCisgICAgICAgICJ0cnVlIikgPT0gInRydWUiKTsKKworaW1wbCBGbGFnUHJvdmlkZXIgeworICAgIC8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3JvCisgICAgcHViIGZuIGRpc2FibGVkX3JvKCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgZmFsc2UKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9ydworICAgIHB1YiBmbiBkaXNhYmxlZF9ydygmc2VsZikgLT4gYm9vbCB7CisgICAgICAgICpDQUNIRURfZGlzYWJsZWRfcncKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9yd19leHBvcnRlZAorICAgIHB1YiBmbiBkaXNhYmxlZF9yd19leHBvcnRlZCgmc2VsZikgLT4gYm9vbCB7CisgICAgICAgICpDQUNIRURfZGlzYWJsZWRfcndfZXhwb3J0ZWQKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UKKyAgICBwdWIgZm4gZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgKkNBQ0hFRF9kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBlbmFibGVkX2ZpeGVkX3JvCisgICAgcHViIGZuIGVuYWJsZWRfZml4ZWRfcm8oJnNlbGYpIC0+IGJvb2wgeworICAgICAgICB0cnVlCisgICAgfQorCisgICAgLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZAorICAgIHB1YiBmbiBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgdHJ1ZQorICAgIH0KKworICAgIC8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcm8KKyAgICBwdWIgZm4gZW5hYmxlZF9ybygmc2VsZikgLT4gYm9vbCB7CisgICAgICAgIHRydWUKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBlbmFibGVkX3JvX2V4cG9ydGVkCisgICAgcHViIGZuIGVuYWJsZWRfcm9fZXhwb3J0ZWQoJnNlbGYpIC0+IGJvb2wgeworICAgICAgICB0cnVlCisgICAgfQorCisgICAgLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9ydworICAgIHB1YiBmbiBlbmFibGVkX3J3KCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgKkNBQ0hFRF9lbmFibGVkX3J3CisgICAgfQorfQorCisvLy8gZmxhZyBwcm92aWRlcgorcHViIHN0YXRpYyBQUk9WSURFUjogRmxhZ1Byb3ZpZGVyID0gRmxhZ1Byb3ZpZGVyOworCisvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9ybworI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBkaXNhYmxlZF9ybygpIC0+IGJvb2wgeworICAgIGZhbHNlCit9CisKKy8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3J3CisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGRpc2FibGVkX3J3KCkgLT4gYm9vbCB7CisgICAgUFJPVklERVIuZGlzYWJsZWRfcncoKQorfQorCisvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9yd19leHBvcnRlZAorI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBkaXNhYmxlZF9yd19leHBvcnRlZCgpIC0+IGJvb2wgeworICAgIFBST1ZJREVSLmRpc2FibGVkX3J3X2V4cG9ydGVkKCkKK30KKworLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgpIC0+IGJvb2wgeworICAgIFBST1ZJREVSLmRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgpCit9CisKKy8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfZml4ZWRfcm8KKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZW5hYmxlZF9maXhlZF9ybygpIC0+IGJvb2wgeworICAgIHRydWUKK30KKworLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZAorI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCkgLT4gYm9vbCB7CisgICAgdHJ1ZQorfQorCisvLy8gcXVlcnkgZmxhZyBlbmFibGVkX3JvCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGVuYWJsZWRfcm8oKSAtPiBib29sIHsKKyAgICB0cnVlCit9CisKKy8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcm9fZXhwb3J0ZWQKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZW5hYmxlZF9yb19leHBvcnRlZCgpIC0+IGJvb2wgeworICAgIHRydWUKK30KKworLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9ydworI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBlbmFibGVkX3J3KCkgLT4gYm9vbCB7CisgICAgUFJPVklERVIuZW5hYmxlZF9ydygpCit9CisiIzsKKworICAgIGNvbnN0IFBST0RfSU5TVFJVTUVOVEVEX0VYUEVDVEVEOiAmc3RyID0gciMiCisvLyEgY29kZWdlbmVyYXRlZCBydXN0IGZsYWcgbGliCit1c2UgYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpOjp7TW1hcCwgQWNvbmZpZ1N0b3JhZ2VFcnJvciwgU3RvcmFnZUZpbGVUeXBlLCBQYWNrYWdlUmVhZENvbnRleHQsIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlLCBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlLCBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHR9OwordXNlIHN0ZDo6cGF0aDo6UGF0aDsKK3VzZSBzdGQ6OmlvOjpXcml0ZTsKK3VzZSBzdGQ6OnN5bmM6OkxhenlMb2NrOwordXNlIGxvZzo6e2xvZywgTGV2ZWxGaWx0ZXIsIExldmVsfTsKKworLy8vIGZsYWcgcHJvdmlkZXIKK3B1YiBzdHJ1Y3QgRmxhZ1Byb3ZpZGVyOworCitzdGF0aWMgUEFDS0FHRV9PRkZTRVQ6IExhenlMb2NrPFJlc3VsdDxPcHRpb248dTMyPiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4+ID0gTGF6eUxvY2s6Om5ldyh8fCB1bnNhZmUgeworICAgIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJzeXN0ZW0iLCBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXApCisgICAgLmFuZF90aGVuKHxwYWNrYWdlX21hcHwgZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX21hcCwgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpKQorICAgIC5tYXAofGNvbnRleHR8IGNvbnRleHQubWFwKHxjfCBjLmJvb2xlYW5fc3RhcnRfaW5kZXgpKQorfSk7CisKK3N0YXRpYyBGTEFHX1ZBTF9NQVA6IExhenlMb2NrPFJlc3VsdDxNbWFwLCBBY29uZmlnU3RvcmFnZUVycm9yPj4gPSBMYXp5TG9jazo6bmV3KHx8IHVuc2FmZSB7CisgICAgZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUoInN5c3RlbSIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCkKK30pOworCisvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3IgZGlzYWJsZWRfcncKK3N0YXRpYyBDQUNIRURfZGlzYWJsZWRfcnc6IExhenlMb2NrPGJvb2w+ID0gTGF6eUxvY2s6Om5ldyh8fCB7CisgICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QgYXJlIG5vb3BzLgorICAgIGxvZ2dlcjo6aW5pdCgKKyAgICAgICAgbG9nZ2VyOjpDb25maWc6OmRlZmF1bHQoKQorICAgICAgICAgICAgLndpdGhfdGFnX29uX2RldmljZSgiYWNvbmZpZ19ydXN0X2NvZGVnZW4iKQorICAgICAgICAgICAgLndpdGhfbWF4X2xldmVsKExldmVsRmlsdGVyOjpJbmZvKSk7CisKKyAgICBsZXQgZmxhZ192YWx1ZV9yZXN1bHQgPSBGTEFHX1ZBTF9NQVAKKyAgICAgICAgLmFzX3JlZigpCisgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZyB2YWwgbWFwOiB7ZXJyfSIpKQorICAgICAgICAuYW5kX3RoZW4ofGZsYWdfdmFsX21hcHwgeworICAgICAgICAgICAgUEFDS0FHRV9PRkZTRVQKKyAgICAgICAgICAgICAgIC5hc19yZWYoKQorICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBwYWNrYWdlIHJlYWQgb2Zmc2V0OiB7ZXJyfSIpKQorICAgICAgICAgICAgICAgLmFuZF90aGVuKHxwYWNrYWdlX29mZnNldHwgeworICAgICAgICAgICAgICAgICAgIG1hdGNoIHBhY2thZ2Vfb2Zmc2V0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgU29tZShvZmZzZXQpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsX21hcCwgb2Zmc2V0ICsgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IGZsYWc6IHtlcnJ9IikpCisgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgIE5vbmUgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJubyBjb250ZXh0IGZvdW5kIGZvciBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyKGZvcm1hdCEoImZhaWxlZCB0byBmbGFnIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IikpCisgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICB9KTsKKworICAgIG1hdGNoIGZsYWdfdmFsdWVfcmVzdWx0IHsKKyAgICAgICAgT2soZmxhZ192YWx1ZSkgPT4geworICAgICAgICAgICAgcmV0dXJuIGZsYWdfdmFsdWU7CisgICAgICAgIH0sCisgICAgICAgIEVycihlcnIpID0+IHsKKyAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiYWNvbmZpZ19ydXN0X2NvZGVnZW46IGVycm9yOiB7ZXJyfSIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorfSk7CisKKy8vLyBmbGFnIHZhbHVlIGNhY2hlIGZvciBkaXNhYmxlZF9yd19leHBvcnRlZAorc3RhdGljIENBQ0hFRF9kaXNhYmxlZF9yd19leHBvcnRlZDogTGF6eUxvY2s8Ym9vbD4gPSBMYXp5TG9jazo6bmV3KHx8IHsKKyAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QgYXJlIG5vb3BzLgorICAgICAgICBsb2dnZXI6OmluaXQoCisgICAgICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCisgICAgICAgICAgICAgICAgLndpdGhfdGFnX29uX2RldmljZSgiYWNvbmZpZ19ydXN0X2NvZGVnZW4iKQorICAgICAgICAgICAgICAgIC53aXRoX21heF9sZXZlbChMZXZlbEZpbHRlcjo6SW5mbykpOworCisgICAgICAgIGxldCBmbGFnX3ZhbHVlX3Jlc3VsdCA9IEZMQUdfVkFMX01BUAorICAgICAgICAgICAgLmFzX3JlZigpCisgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IGZsYWcgdmFsIG1hcDoge2Vycn0iKSkKKyAgICAgICAgICAgIC5hbmRfdGhlbih8ZmxhZ192YWxfbWFwfCB7CisgICAgICAgICAgICAgICAgUEFDS0FHRV9PRkZTRVQKKyAgICAgICAgICAgICAgICAgICAgLmFzX3JlZigpCisgICAgICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgcGFja2FnZSByZWFkIG9mZnNldDoge2Vycn0iKSkKKyAgICAgICAgICAgICAgICAgICAgLmFuZF90aGVuKHxwYWNrYWdlX29mZnNldHwgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggcGFja2FnZV9vZmZzZXQgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWUob2Zmc2V0KSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsX21hcCwgb2Zmc2V0ICsgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZzoge2Vycn0iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIm5vIGNvbnRleHQgZm91bmQgZm9yIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycihmb3JtYXQhKCJmYWlsZWQgdG8gZmxhZyBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBtYXRjaCBmbGFnX3ZhbHVlX3Jlc3VsdCB7CisgICAgICAgICAgICBPayhmbGFnX3ZhbHVlKSA9PiB7CisgICAgICAgICAgICAgICAgIHJldHVybiBmbGFnX3ZhbHVlOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEVycihlcnIpID0+IHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgImFjb25maWdfcnVzdF9jb2RlZ2VuOiBlcnJvcjoge2Vycn0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KK30pOworCisvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3IgZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlCitzdGF0aWMgQ0FDSEVEX2Rpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZTogTGF6eUxvY2s8Ym9vbD4gPSBMYXp5TG9jazo6bmV3KHx8IHsKKyAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QgYXJlIG5vb3BzLgorICAgICAgICBsb2dnZXI6OmluaXQoCisgICAgICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCisgICAgICAgICAgICAgICAgLndpdGhfdGFnX29uX2RldmljZSgiYWNvbmZpZ19ydXN0X2NvZGVnZW4iKQorICAgICAgICAgICAgICAgIC53aXRoX21heF9sZXZlbChMZXZlbEZpbHRlcjo6SW5mbykpOworCisgICAgICAgIGxldCBmbGFnX3ZhbHVlX3Jlc3VsdCA9IEZMQUdfVkFMX01BUAorICAgICAgICAgICAgLmFzX3JlZigpCisgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IGZsYWcgdmFsIG1hcDoge2Vycn0iKSkKKyAgICAgICAgICAgIC5hbmRfdGhlbih8ZmxhZ192YWxfbWFwfCB7CisgICAgICAgICAgICAgICAgUEFDS0FHRV9PRkZTRVQKKyAgICAgICAgICAgICAgICAgICAgLmFzX3JlZigpCisgICAgICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgcGFja2FnZSByZWFkIG9mZnNldDoge2Vycn0iKSkKKyAgICAgICAgICAgICAgICAgICAgLmFuZF90aGVuKHxwYWNrYWdlX29mZnNldHwgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggcGFja2FnZV9vZmZzZXQgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWUob2Zmc2V0KSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsX21hcCwgb2Zmc2V0ICsgMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZzoge2Vycn0iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIm5vIGNvbnRleHQgZm91bmQgZm9yIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycihmb3JtYXQhKCJmYWlsZWQgdG8gZmxhZyBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBtYXRjaCBmbGFnX3ZhbHVlX3Jlc3VsdCB7CisgICAgICAgICAgICBPayhmbGFnX3ZhbHVlKSA9PiB7CisgICAgICAgICAgICAgICAgIHJldHVybiBmbGFnX3ZhbHVlOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEVycihlcnIpID0+IHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgImFjb25maWdfcnVzdF9jb2RlZ2VuOiBlcnJvcjoge2Vycn0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KK30pOworCisKKy8vLyBmbGFnIHZhbHVlIGNhY2hlIGZvciBlbmFibGVkX3J3CitzdGF0aWMgQ0FDSEVEX2VuYWJsZWRfcnc6IExhenlMb2NrPGJvb2w+ID0gTGF6eUxvY2s6Om5ldyh8fCB7CisgICAgICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIFN1YnNlcXVlbnQgY2FsbHMgYWZ0ZXIgdGhlIGZpcnN0IGFyZSBub29wcy4KKyAgICAgICAgbG9nZ2VyOjppbml0KAorICAgICAgICAgICAgbG9nZ2VyOjpDb25maWc6OmRlZmF1bHQoKQorICAgICAgICAgICAgICAgIC53aXRoX3RhZ19vbl9kZXZpY2UoImFjb25maWdfcnVzdF9jb2RlZ2VuIikKKyAgICAgICAgICAgICAgICAud2l0aF9tYXhfbGV2ZWwoTGV2ZWxGaWx0ZXI6OkluZm8pKTsKKworICAgICAgICBsZXQgZmxhZ192YWx1ZV9yZXN1bHQgPSBGTEFHX1ZBTF9NQVAKKyAgICAgICAgICAgIC5hc19yZWYoKQorICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBmbGFnIHZhbCBtYXA6IHtlcnJ9IikpCisgICAgICAgICAgICAuYW5kX3RoZW4ofGZsYWdfdmFsX21hcHwgeworICAgICAgICAgICAgICAgIFBBQ0tBR0VfT0ZGU0VUCisgICAgICAgICAgICAgICAgICAgIC5hc19yZWYoKQorICAgICAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IHBhY2thZ2UgcmVhZCBvZmZzZXQ6IHtlcnJ9IikpCisgICAgICAgICAgICAgICAgICAgIC5hbmRfdGhlbih8cGFja2FnZV9vZmZzZXR8IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIHBhY2thZ2Vfb2Zmc2V0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb21lKG9mZnNldCkgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZmbGFnX3ZhbF9tYXAsIG9mZnNldCArIDcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IGZsYWc6IHtlcnJ9IikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJubyBjb250ZXh0IGZvdW5kIGZvciBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnIoZm9ybWF0ISgiZmFpbGVkIHRvIGZsYWcgcGFja2FnZSBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgbWF0Y2ggZmxhZ192YWx1ZV9yZXN1bHQgeworICAgICAgICAgICAgT2soZmxhZ192YWx1ZSkgPT4geworICAgICAgICAgICAgICAgICByZXR1cm4gZmxhZ192YWx1ZTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBFcnIoZXJyKSA9PiB7CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJhY29uZmlnX3J1c3RfY29kZWdlbjogZXJyb3I6IHtlcnJ9Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KK30pOworCitpbXBsIEZsYWdQcm92aWRlciB7CisKKworICAgIC8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3JvCisgICAgcHViIGZuIGRpc2FibGVkX3JvKCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgZmFsc2UKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9ydworICAgIHB1YiBmbiBkaXNhYmxlZF9ydygmc2VsZikgLT4gYm9vbCB7CisgICAgICAgICpDQUNIRURfZGlzYWJsZWRfcncKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9yd19leHBvcnRlZAorICAgIHB1YiBmbiBkaXNhYmxlZF9yd19leHBvcnRlZCgmc2VsZikgLT4gYm9vbCB7CisgICAgICAgICpDQUNIRURfZGlzYWJsZWRfcndfZXhwb3J0ZWQKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UKKyAgICBwdWIgZm4gZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgKkNBQ0hFRF9kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBlbmFibGVkX2ZpeGVkX3JvCisgICAgcHViIGZuIGVuYWJsZWRfZml4ZWRfcm8oJnNlbGYpIC0+IGJvb2wgeworICAgICAgICB0cnVlCisgICAgfQorCisgICAgLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZAorICAgIHB1YiBmbiBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgdHJ1ZQorICAgIH0KKworICAgIC8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcm8KKyAgICBwdWIgZm4gZW5hYmxlZF9ybygmc2VsZikgLT4gYm9vbCB7CisgICAgICAgIHRydWUKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBlbmFibGVkX3JvX2V4cG9ydGVkCisgICAgcHViIGZuIGVuYWJsZWRfcm9fZXhwb3J0ZWQoJnNlbGYpIC0+IGJvb2wgeworICAgICAgICB0cnVlCisgICAgfQorCisgICAgLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9ydworICAgIHB1YiBmbiBlbmFibGVkX3J3KCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgKkNBQ0hFRF9lbmFibGVkX3J3CisgICAgfQorCisKK30KKworLy8vIGZsYWcgcHJvdmlkZXIKK3B1YiBzdGF0aWMgUFJPVklERVI6IEZsYWdQcm92aWRlciA9IEZsYWdQcm92aWRlcjsKKworCisvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9ybworI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBkaXNhYmxlZF9ybygpIC0+IGJvb2wgeworICAgZmFsc2UKK30KKworLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcncKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZGlzYWJsZWRfcncoKSAtPiBib29sIHsKKyAgICBQUk9WSURFUi5kaXNhYmxlZF9ydygpCit9CisKKy8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3J3X2V4cG9ydGVkCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGRpc2FibGVkX3J3X2V4cG9ydGVkKCkgLT4gYm9vbCB7CisgICAgUFJPVklERVIuZGlzYWJsZWRfcndfZXhwb3J0ZWQoKQorfQorCisvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKCkgLT4gYm9vbCB7CisgICAgUFJPVklERVIuZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKCkKK30KKworLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9maXhlZF9ybworI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBlbmFibGVkX2ZpeGVkX3JvKCkgLT4gYm9vbCB7CisgICAgdHJ1ZQorfQorCisvLy8gcXVlcnkgZmxhZyBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoKSAtPiBib29sIHsKKyAgICB0cnVlCit9CisKKy8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcm8KKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZW5hYmxlZF9ybygpIC0+IGJvb2wgeworICAgIHRydWUKK30KKworLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9yb19leHBvcnRlZAorI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBlbmFibGVkX3JvX2V4cG9ydGVkKCkgLT4gYm9vbCB7CisgICAgdHJ1ZQorfQorCisvLy8gcXVlcnkgZmxhZyBlbmFibGVkX3J3CisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGVuYWJsZWRfcncoKSAtPiBib29sIHsKKyAgICBQUk9WSURFUi5lbmFibGVkX3J3KCkKK30KKyIjOworCisgICAgY29uc3QgVEVTVF9FWFBFQ1RFRDogJnN0ciA9IHIjIgorLy8hIGNvZGVnZW5lcmF0ZWQgcnVzdCBmbGFnIGxpYgorCit1c2Ugc3RkOjpjb2xsZWN0aW9uczo6QlRyZWVNYXA7Cit1c2Ugc3RkOjpzeW5jOjpNdXRleDsKKworLy8vIGZsYWcgcHJvdmlkZXIKK3B1YiBzdHJ1Y3QgRmxhZ1Byb3ZpZGVyIHsKKyAgICBvdmVycmlkZXM6IEJUcmVlTWFwPCYnc3RhdGljIHN0ciwgYm9vbD4sCit9CisKK2ltcGwgRmxhZ1Byb3ZpZGVyIHsKKyAgICAvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9ybworICAgIHB1YiBmbiBkaXNhYmxlZF9ybygmc2VsZikgLT4gYm9vbCB7CisgICAgICAgIHNlbGYub3ZlcnJpZGVzLmdldCgiZGlzYWJsZWRfcm8iKS5jb3BpZWQoKS51bndyYXBfb3IoCisgICAgICAgICAgICBmYWxzZQorICAgICAgICApCisgICAgfQorCisgICAgLy8vIHNldCBmbGFnIGRpc2FibGVkX3JvCisgICAgcHViIGZuIHNldF9kaXNhYmxlZF9ybygmbXV0IHNlbGYsIHZhbDogYm9vbCkgeworICAgICAgICBzZWxmLm92ZXJyaWRlcy5pbnNlcnQoImRpc2FibGVkX3JvIiwgdmFsKTsKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9ydworICAgIHB1YiBmbiBkaXNhYmxlZF9ydygmc2VsZikgLT4gYm9vbCB7CisgICAgICAgIHNlbGYub3ZlcnJpZGVzLmdldCgiZGlzYWJsZWRfcnciKS5jb3BpZWQoKS51bndyYXBfb3IoCisgICAgICAgICAgICBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAgICAgICAgICJhY29uZmlnX2ZsYWdzLmFjb25maWdfdGVzdCIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9ydyIsCisgICAgICAgICAgICAgICAgImZhbHNlIikgPT0gInRydWUiCisgICAgICAgICkKKyAgICB9CisKKyAgICAvLy8gc2V0IGZsYWcgZGlzYWJsZWRfcncKKyAgICBwdWIgZm4gc2V0X2Rpc2FibGVkX3J3KCZtdXQgc2VsZiwgdmFsOiBib29sKSB7CisgICAgICAgIHNlbGYub3ZlcnJpZGVzLmluc2VydCgiZGlzYWJsZWRfcnciLCB2YWwpOworICAgIH0KKworICAgIC8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3J3X2V4cG9ydGVkCisgICAgcHViIGZuIGRpc2FibGVkX3J3X2V4cG9ydGVkKCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgc2VsZi5vdmVycmlkZXMuZ2V0KCJkaXNhYmxlZF9yd19leHBvcnRlZCIpLmNvcGllZCgpLnVud3JhcF9vcigKKyAgICAgICAgICAgIGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCisgICAgICAgICAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2V4cG9ydGVkIiwKKyAgICAgICAgICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSIKKyAgICAgICAgKQorICAgIH0KKworICAgIC8vLyBzZXQgZmxhZyBkaXNhYmxlZF9yd19leHBvcnRlZAorICAgIHB1YiBmbiBzZXRfZGlzYWJsZWRfcndfZXhwb3J0ZWQoJm11dCBzZWxmLCB2YWw6IGJvb2wpIHsKKyAgICAgICAgc2VsZi5vdmVycmlkZXMuaW5zZXJ0KCJkaXNhYmxlZF9yd19leHBvcnRlZCIsIHZhbCk7CisgICAgfQorCisgICAgLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlCisgICAgcHViIGZuIGRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgmc2VsZikgLT4gYm9vbCB7CisgICAgICAgIHNlbGYub3ZlcnJpZGVzLmdldCgiZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlIikuY29waWVkKCkudW53cmFwX29yKAorICAgICAgICAgICAgZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKKyAgICAgICAgICAgICAgICAiYWNvbmZpZ19mbGFncy5vdGhlcl9uYW1lc3BhY2UiLAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlIiwKKyAgICAgICAgICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSIKKyAgICAgICAgKQorICAgIH0KKworICAgIC8vLyBzZXQgZmxhZyBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UKKyAgICBwdWIgZm4gc2V0X2Rpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgmbXV0IHNlbGYsIHZhbDogYm9vbCkgeworICAgICAgICBzZWxmLm92ZXJyaWRlcy5pbnNlcnQoImRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSIsIHZhbCk7CisgICAgfQorCisgICAgLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9maXhlZF9ybworICAgIHB1YiBmbiBlbmFibGVkX2ZpeGVkX3JvKCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgc2VsZi5vdmVycmlkZXMuZ2V0KCJlbmFibGVkX2ZpeGVkX3JvIikuY29waWVkKCkudW53cmFwX29yKAorICAgICAgICAgICAgdHJ1ZQorICAgICAgICApCisgICAgfQorCisgICAgLy8vIHNldCBmbGFnIGVuYWJsZWRfZml4ZWRfcm8KKyAgICBwdWIgZm4gc2V0X2VuYWJsZWRfZml4ZWRfcm8oJm11dCBzZWxmLCB2YWw6IGJvb2wpIHsKKyAgICAgICAgc2VsZi5vdmVycmlkZXMuaW5zZXJ0KCJlbmFibGVkX2ZpeGVkX3JvIiwgdmFsKTsKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkCisgICAgcHViIGZuIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoJnNlbGYpIC0+IGJvb2wgeworICAgICAgICBzZWxmLm92ZXJyaWRlcy5nZXQoImVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQiKS5jb3BpZWQoKS51bndyYXBfb3IoCisgICAgICAgICAgICB0cnVlCisgICAgICAgICkKKyAgICB9CisKKyAgICAvLy8gc2V0IGZsYWcgZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZAorICAgIHB1YiBmbiBzZXRfZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgmbXV0IHNlbGYsIHZhbDogYm9vbCkgeworICAgICAgICBzZWxmLm92ZXJyaWRlcy5pbnNlcnQoImVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQiLCB2YWwpOworICAgIH0KKworICAgIC8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcm8KKyAgICBwdWIgZm4gZW5hYmxlZF9ybygmc2VsZikgLT4gYm9vbCB7CisgICAgICAgIHNlbGYub3ZlcnJpZGVzLmdldCgiZW5hYmxlZF9ybyIpLmNvcGllZCgpLnVud3JhcF9vcigKKyAgICAgICAgICAgIHRydWUKKyAgICAgICAgKQorICAgIH0KKworICAgIC8vLyBzZXQgZmxhZyBlbmFibGVkX3JvCisgICAgcHViIGZuIHNldF9lbmFibGVkX3JvKCZtdXQgc2VsZiwgdmFsOiBib29sKSB7CisgICAgICAgIHNlbGYub3ZlcnJpZGVzLmluc2VydCgiZW5hYmxlZF9ybyIsIHZhbCk7CisgICAgfQorCisgICAgLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9yb19leHBvcnRlZAorICAgIHB1YiBmbiBlbmFibGVkX3JvX2V4cG9ydGVkKCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgc2VsZi5vdmVycmlkZXMuZ2V0KCJlbmFibGVkX3JvX2V4cG9ydGVkIikuY29waWVkKCkudW53cmFwX29yKAorICAgICAgICAgICAgdHJ1ZQorICAgICAgICApCisgICAgfQorCisgICAgLy8vIHNldCBmbGFnIGVuYWJsZWRfcm9fZXhwb3J0ZWQKKyAgICBwdWIgZm4gc2V0X2VuYWJsZWRfcm9fZXhwb3J0ZWQoJm11dCBzZWxmLCB2YWw6IGJvb2wpIHsKKyAgICAgICAgc2VsZi5vdmVycmlkZXMuaW5zZXJ0KCJlbmFibGVkX3JvX2V4cG9ydGVkIiwgdmFsKTsKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBlbmFibGVkX3J3CisgICAgcHViIGZuIGVuYWJsZWRfcncoJnNlbGYpIC0+IGJvb2wgeworICAgICAgICBzZWxmLm92ZXJyaWRlcy5nZXQoImVuYWJsZWRfcnciKS5jb3BpZWQoKS51bndyYXBfb3IoCisgICAgICAgICAgICBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAgICAgICAgICJhY29uZmlnX2ZsYWdzLmFjb25maWdfdGVzdCIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3J3IiwKKyAgICAgICAgICAgICAgICAidHJ1ZSIpID09ICJ0cnVlIgorICAgICAgICApCisgICAgfQorCisgICAgLy8vIHNldCBmbGFnIGVuYWJsZWRfcncKKyAgICBwdWIgZm4gc2V0X2VuYWJsZWRfcncoJm11dCBzZWxmLCB2YWw6IGJvb2wpIHsKKyAgICAgICAgc2VsZi5vdmVycmlkZXMuaW5zZXJ0KCJlbmFibGVkX3J3IiwgdmFsKTsKKyAgICB9CisKKyAgICAvLy8gY2xlYXIgYWxsIGZsYWcgb3ZlcnJpZGVzCisgICAgcHViIGZuIHJlc2V0X2ZsYWdzKCZtdXQgc2VsZikgeworICAgICAgICBzZWxmLm92ZXJyaWRlcy5jbGVhcigpOworICAgIH0KK30KKworLy8vIGZsYWcgcHJvdmlkZXIKK3B1YiBzdGF0aWMgUFJPVklERVI6IE11dGV4PEZsYWdQcm92aWRlcj4gPSBNdXRleDo6bmV3KAorICAgIEZsYWdQcm92aWRlciB7b3ZlcnJpZGVzOiBCVHJlZU1hcDo6bmV3KCl9CispOworCisvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9ybworI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBkaXNhYmxlZF9ybygpIC0+IGJvb2wgeworICAgIFBST1ZJREVSLmxvY2soKS51bndyYXAoKS5kaXNhYmxlZF9ybygpCit9CisKKy8vLyBzZXQgZmxhZyBkaXNhYmxlZF9ybworI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBzZXRfZGlzYWJsZWRfcm8odmFsOiBib29sKSB7CisgICAgUFJPVklERVIubG9jaygpLnVud3JhcCgpLnNldF9kaXNhYmxlZF9ybyh2YWwpOworfQorCisvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9ydworI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBkaXNhYmxlZF9ydygpIC0+IGJvb2wgeworICAgIFBST1ZJREVSLmxvY2soKS51bndyYXAoKS5kaXNhYmxlZF9ydygpCit9CisKKy8vLyBzZXQgZmxhZyBkaXNhYmxlZF9ydworI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBzZXRfZGlzYWJsZWRfcncodmFsOiBib29sKSB7CisgICAgUFJPVklERVIubG9jaygpLnVud3JhcCgpLnNldF9kaXNhYmxlZF9ydyh2YWwpOworfQorCisvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9yd19leHBvcnRlZAorI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBkaXNhYmxlZF9yd19leHBvcnRlZCgpIC0+IGJvb2wgeworICAgIFBST1ZJREVSLmxvY2soKS51bndyYXAoKS5kaXNhYmxlZF9yd19leHBvcnRlZCgpCit9CisKKy8vLyBzZXQgZmxhZyBkaXNhYmxlZF9yd19leHBvcnRlZAorI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBzZXRfZGlzYWJsZWRfcndfZXhwb3J0ZWQodmFsOiBib29sKSB7CisgICAgUFJPVklERVIubG9jaygpLnVud3JhcCgpLnNldF9kaXNhYmxlZF9yd19leHBvcnRlZCh2YWwpOworfQorCisvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKCkgLT4gYm9vbCB7CisgICAgUFJPVklERVIubG9jaygpLnVud3JhcCgpLmRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgpCit9CisKKy8vLyBzZXQgZmxhZyBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gc2V0X2Rpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSh2YWw6IGJvb2wpIHsKKyAgICBQUk9WSURFUi5sb2NrKCkudW53cmFwKCkuc2V0X2Rpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSh2YWwpOworfQorCisvLy8gcXVlcnkgZmxhZyBlbmFibGVkX2ZpeGVkX3JvCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGVuYWJsZWRfZml4ZWRfcm8oKSAtPiBib29sIHsKKyAgICBQUk9WSURFUi5sb2NrKCkudW53cmFwKCkuZW5hYmxlZF9maXhlZF9ybygpCit9CisKKy8vLyBzZXQgZmxhZyBlbmFibGVkX2ZpeGVkX3JvCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIHNldF9lbmFibGVkX2ZpeGVkX3JvKHZhbDogYm9vbCkgeworICAgIFBST1ZJREVSLmxvY2soKS51bndyYXAoKS5zZXRfZW5hYmxlZF9maXhlZF9ybyh2YWwpOworfQorCisvLy8gcXVlcnkgZmxhZyBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoKSAtPiBib29sIHsKKyAgICBQUk9WSURFUi5sb2NrKCkudW53cmFwKCkuZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgpCit9CisKKy8vLyBzZXQgZmxhZyBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIHNldF9lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKHZhbDogYm9vbCkgeworICAgIFBST1ZJREVSLmxvY2soKS51bndyYXAoKS5zZXRfZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCh2YWwpOworfQorCisvLy8gcXVlcnkgZmxhZyBlbmFibGVkX3JvCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGVuYWJsZWRfcm8oKSAtPiBib29sIHsKKyAgICBQUk9WSURFUi5sb2NrKCkudW53cmFwKCkuZW5hYmxlZF9ybygpCit9CisKKy8vLyBzZXQgZmxhZyBlbmFibGVkX3JvCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIHNldF9lbmFibGVkX3JvKHZhbDogYm9vbCkgeworICAgIFBST1ZJREVSLmxvY2soKS51bndyYXAoKS5zZXRfZW5hYmxlZF9ybyh2YWwpOworfQorCisvLy8gcXVlcnkgZmxhZyBlbmFibGVkX3JvX2V4cG9ydGVkCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGVuYWJsZWRfcm9fZXhwb3J0ZWQoKSAtPiBib29sIHsKKyAgICBQUk9WSURFUi5sb2NrKCkudW53cmFwKCkuZW5hYmxlZF9yb19leHBvcnRlZCgpCit9CisKKy8vLyBzZXQgZmxhZyBlbmFibGVkX3JvX2V4cG9ydGVkCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIHNldF9lbmFibGVkX3JvX2V4cG9ydGVkKHZhbDogYm9vbCkgeworICAgIFBST1ZJREVSLmxvY2soKS51bndyYXAoKS5zZXRfZW5hYmxlZF9yb19leHBvcnRlZCh2YWwpOworfQorCisvLy8gcXVlcnkgZmxhZyBlbmFibGVkX3J3CisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGVuYWJsZWRfcncoKSAtPiBib29sIHsKKyAgICBQUk9WSURFUi5sb2NrKCkudW53cmFwKCkuZW5hYmxlZF9ydygpCit9CisKKy8vLyBzZXQgZmxhZyBlbmFibGVkX3J3CisjW2lubGluZShhbHdheXMpXQorcHViIGZuIHNldF9lbmFibGVkX3J3KHZhbDogYm9vbCkgeworICAgIFBST1ZJREVSLmxvY2soKS51bndyYXAoKS5zZXRfZW5hYmxlZF9ydyh2YWwpOworfQorCisvLy8gY2xlYXIgYWxsIGZsYWcgb3ZlcnJpZGUKK3B1YiBmbiByZXNldF9mbGFncygpIHsKKyAgICBQUk9WSURFUi5sb2NrKCkudW53cmFwKCkucmVzZXRfZmxhZ3MoKQorfQorIiM7CisKKyAgICBjb25zdCBFWFBPUlRFRF9FWFBFQ1RFRDogJnN0ciA9IHIjIgorLy8hIGNvZGVnZW5lcmF0ZWQgcnVzdCBmbGFnIGxpYgordXNlIGFjb25maWdfc3RvcmFnZV9yZWFkX2FwaTo6e01tYXAsIEFjb25maWdTdG9yYWdlRXJyb3IsIFN0b3JhZ2VGaWxlVHlwZSwgUGFja2FnZVJlYWRDb250ZXh0LCBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSwgZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSwgZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0fTsKK3VzZSBzdGQ6OnBhdGg6OlBhdGg7Cit1c2Ugc3RkOjppbzo6V3JpdGU7Cit1c2Ugc3RkOjpzeW5jOjpMYXp5TG9jazsKK3VzZSBsb2c6Ontsb2csIExldmVsRmlsdGVyLCBMZXZlbH07CisKKy8vLyBmbGFnIHByb3ZpZGVyCitwdWIgc3RydWN0IEZsYWdQcm92aWRlcjsKKworICAgIC8vLyBmbGFnIHZhbHVlIGNhY2hlIGZvciBkaXNhYmxlZF9yd19leHBvcnRlZAorICAgIHN0YXRpYyBDQUNIRURfZGlzYWJsZWRfcndfZXhwb3J0ZWQ6IExhenlMb2NrPGJvb2w+ID0gTGF6eUxvY2s6Om5ldyh8fCBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAorICAgICAgICAiYWNvbmZpZ19mbGFncy5hY29uZmlnX3Rlc3QiLAorICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2V4cG9ydGVkIiwKKyAgICAgICAgImZhbHNlIikgPT0gInRydWUiKTsKKworICAgIC8vLyBmbGFnIHZhbHVlIGNhY2hlIGZvciBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkCisgICAgc3RhdGljIENBQ0hFRF9lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkOiBMYXp5TG9jazxib29sPiA9IExhenlMb2NrOjpuZXcofHwgZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKKyAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKKyAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkIiwKKyAgICAgICAgImZhbHNlIikgPT0gInRydWUiKTsKKworICAgIC8vLyBmbGFnIHZhbHVlIGNhY2hlIGZvciBlbmFibGVkX3JvX2V4cG9ydGVkCisgICAgc3RhdGljIENBQ0hFRF9lbmFibGVkX3JvX2V4cG9ydGVkOiBMYXp5TG9jazxib29sPiA9IExhenlMb2NrOjpuZXcofHwgZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKKyAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKKyAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3JvX2V4cG9ydGVkIiwKKyAgICAgICAgImZhbHNlIikgPT0gInRydWUiKTsKKworaW1wbCBGbGFnUHJvdmlkZXIgeworICAgIC8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3J3X2V4cG9ydGVkCisgICAgcHViIGZuIGRpc2FibGVkX3J3X2V4cG9ydGVkKCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgKkNBQ0hFRF9kaXNhYmxlZF9yd19leHBvcnRlZAorICAgIH0KKworICAgIC8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQKKyAgICBwdWIgZm4gZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgmc2VsZikgLT4gYm9vbCB7CisgICAgICAgICpDQUNIRURfZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZAorICAgIH0KKworICAgIC8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcm9fZXhwb3J0ZWQKKyAgICBwdWIgZm4gZW5hYmxlZF9yb19leHBvcnRlZCgmc2VsZikgLT4gYm9vbCB7CisgICAgICAgICpDQUNIRURfZW5hYmxlZF9yb19leHBvcnRlZAorICAgIH0KK30KKworLy8vIGZsYWcgcHJvdmlkZXIKK3B1YiBzdGF0aWMgUFJPVklERVI6IEZsYWdQcm92aWRlciA9IEZsYWdQcm92aWRlcjsKKworLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcndfZXhwb3J0ZWQKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZGlzYWJsZWRfcndfZXhwb3J0ZWQoKSAtPiBib29sIHsKKyAgICBQUk9WSURFUi5kaXNhYmxlZF9yd19leHBvcnRlZCgpCit9CisKKy8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgpIC0+IGJvb2wgeworICAgIFBST1ZJREVSLmVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoKQorfQorCisvLy8gcXVlcnkgZmxhZyBlbmFibGVkX3JvX2V4cG9ydGVkCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGVuYWJsZWRfcm9fZXhwb3J0ZWQoKSAtPiBib29sIHsKKyAgICBQUk9WSURFUi5lbmFibGVkX3JvX2V4cG9ydGVkKCkKK30KKyIjOworCisgICAgY29uc3QgRk9SQ0VfUkVBRF9PTkxZX0VYUEVDVEVEOiAmc3RyID0gciMiCisvLyEgY29kZWdlbmVyYXRlZCBydXN0IGZsYWcgbGliCit1c2UgYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpOjp7TW1hcCwgQWNvbmZpZ1N0b3JhZ2VFcnJvciwgU3RvcmFnZUZpbGVUeXBlLCBQYWNrYWdlUmVhZENvbnRleHQsIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlLCBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlLCBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHR9OwordXNlIHN0ZDo6cGF0aDo6UGF0aDsKK3VzZSBzdGQ6OmlvOjpXcml0ZTsKK3VzZSBzdGQ6OnN5bmM6OkxhenlMb2NrOwordXNlIGxvZzo6e2xvZywgTGV2ZWxGaWx0ZXIsIExldmVsfTsKKworLy8vIGZsYWcgcHJvdmlkZXIKK3B1YiBzdHJ1Y3QgRmxhZ1Byb3ZpZGVyOworCitpbXBsIEZsYWdQcm92aWRlciB7CisgICAgLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcm8KKyAgICBwdWIgZm4gZGlzYWJsZWRfcm8oJnNlbGYpIC0+IGJvb2wgeworICAgICAgICBmYWxzZQorICAgIH0KKworICAgIC8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3J3CisgICAgcHViIGZuIGRpc2FibGVkX3J3KCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgZmFsc2UKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UKKyAgICBwdWIgZm4gZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgZmFsc2UKKyAgICB9CisKKyAgICAvLy8gcXVlcnkgZmxhZyBlbmFibGVkX2ZpeGVkX3JvCisgICAgcHViIGZuIGVuYWJsZWRfZml4ZWRfcm8oJnNlbGYpIC0+IGJvb2wgeworICAgICAgICB0cnVlCisgICAgfQorCisgICAgLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9ybworICAgIHB1YiBmbiBlbmFibGVkX3JvKCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgdHJ1ZQorICAgIH0KKworICAgIC8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcncKKyAgICBwdWIgZm4gZW5hYmxlZF9ydygmc2VsZikgLT4gYm9vbCB7CisgICAgICAgIHRydWUKKyAgICB9Cit9CisKKy8vLyBmbGFnIHByb3ZpZGVyCitwdWIgc3RhdGljIFBST1ZJREVSOiBGbGFnUHJvdmlkZXIgPSBGbGFnUHJvdmlkZXI7CisKKy8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3JvCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGRpc2FibGVkX3JvKCkgLT4gYm9vbCB7CisgICAgZmFsc2UKK30KKworLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcncKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZGlzYWJsZWRfcncoKSAtPiBib29sIHsKKyAgICBmYWxzZQorfQorCisvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKCkgLT4gYm9vbCB7CisgICAgZmFsc2UKK30KKworLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9maXhlZF9ybworI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiBlbmFibGVkX2ZpeGVkX3JvKCkgLT4gYm9vbCB7CisgICAgdHJ1ZQorfQorCisvLy8gcXVlcnkgZmxhZyBlbmFibGVkX3JvCisjW2lubGluZShhbHdheXMpXQorcHViIGZuIGVuYWJsZWRfcm8oKSAtPiBib29sIHsKKyAgICB0cnVlCit9CisKKy8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcncKKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gZW5hYmxlZF9ydygpIC0+IGJvb2wgeworICAgIHRydWUKK30KKyIjOworICAgIHVzZSBjcmF0ZTo6Y29tbWFuZHM6OmFzc2lnbl9mbGFnX2lkczsKKworICAgIGZuIHRlc3RfZ2VuZXJhdGVfcnVzdF9jb2RlKG1vZGU6IENvZGVnZW5Nb2RlLCBhbGxvd19pbnN0cnVtZW50YXRpb246IGJvb2wsIGV4cGVjdGVkOiAmc3RyKSB7CisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPSBjcmF0ZTo6dGVzdDo6cGFyc2VfdGVzdF9mbGFncygpOworICAgICAgICBsZXQgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzID0KKyAgICAgICAgICAgIGNyYXRlOjpjb21tYW5kczo6bW9kaWZ5X3BhcnNlZF9mbGFnc19iYXNlZF9vbl9tb2RlKHBhcnNlZF9mbGFncywgbW9kZSkudW53cmFwKCk7CisgICAgICAgIGxldCBmbGFnX2lkcyA9CisgICAgICAgICAgICBhc3NpZ25fZmxhZ19pZHMoY3JhdGU6OnRlc3Q6OlRFU1RfUEFDS0FHRSwgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLml0ZXIoKSkudW53cmFwKCk7CisgICAgICAgIGxldCBnZW5lcmF0ZWQgPSBnZW5lcmF0ZV9ydXN0X2NvZGUoCisgICAgICAgICAgICBjcmF0ZTo6dGVzdDo6VEVTVF9QQUNLQUdFLAorICAgICAgICAgICAgZmxhZ19pZHMsCisgICAgICAgICAgICBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaW50b19pdGVyKCksCisgICAgICAgICAgICBtb2RlLAorICAgICAgICAgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uLAorICAgICAgICApCisgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxISgic3JjL2xpYi5ycyIsIGZvcm1hdCEoInt9IiwgZ2VuZXJhdGVkLnBhdGguZGlzcGxheSgpKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgY3JhdGU6OnRlc3Q6OmZpcnN0X3NpZ25pZmljYW50X2NvZGVfZGlmZigKKyAgICAgICAgICAgICAgICBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAmU3RyaW5nOjpmcm9tX3V0ZjgoZ2VuZXJhdGVkLmNvbnRlbnRzKS51bndyYXAoKQorICAgICAgICAgICAgKQorICAgICAgICApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2dlbmVyYXRlX3J1c3RfY29kZV9mb3JfcHJvZCgpIHsKKyAgICAgICAgdGVzdF9nZW5lcmF0ZV9ydXN0X2NvZGUoQ29kZWdlbk1vZGU6OlByb2R1Y3Rpb24sIGZhbHNlLCBQUk9EX0VYUEVDVEVEKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9nZW5lcmF0ZV9ydXN0X2NvZGVfZm9yX3Byb2RfaW5zdHJ1bWVudGVkKCkgeworICAgICAgICB0ZXN0X2dlbmVyYXRlX3J1c3RfY29kZShDb2RlZ2VuTW9kZTo6UHJvZHVjdGlvbiwgdHJ1ZSwgUFJPRF9JTlNUUlVNRU5URURfRVhQRUNURUQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2dlbmVyYXRlX3J1c3RfY29kZV9mb3JfdGVzdCgpIHsKKyAgICAgICAgdGVzdF9nZW5lcmF0ZV9ydXN0X2NvZGUoQ29kZWdlbk1vZGU6OlRlc3QsIGZhbHNlLCBURVNUX0VYUEVDVEVEKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9nZW5lcmF0ZV9ydXN0X2NvZGVfZm9yX2V4cG9ydGVkKCkgeworICAgICAgICB0ZXN0X2dlbmVyYXRlX3J1c3RfY29kZShDb2RlZ2VuTW9kZTo6RXhwb3J0ZWQsIGZhbHNlLCBFWFBPUlRFRF9FWFBFQ1RFRCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfZ2VuZXJhdGVfcnVzdF9jb2RlX2Zvcl9mb3JjZV9yZWFkX29ubHkoKSB7CisgICAgICAgIHRlc3RfZ2VuZXJhdGVfcnVzdF9jb2RlKENvZGVnZW5Nb2RlOjpGb3JjZVJlYWRPbmx5LCBmYWxzZSwgRk9SQ0VfUkVBRF9PTkxZX0VYUEVDVEVEKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvbW1hbmRzLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb21tYW5kcy5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjk2MDE1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb21tYW5kcy5ycwpAQCAtMCwwICsxLDEwMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2UgYW55aG93Ojp7YmFpbCwgZW5zdXJlLCBDb250ZXh0LCBSZXN1bHR9OwordXNlIGl0ZXJ0b29sczo6SXRlcnRvb2xzOwordXNlIHByb3RvYnVmOjpNZXNzYWdlOwordXNlIHN0ZDo6Y29sbGVjdGlvbnM6Okhhc2hNYXA7Cit1c2Ugc3RkOjpoYXNoOjpIYXNoZXI7Cit1c2Ugc3RkOjppbzo6UmVhZDsKK3VzZSBzdGQ6OnBhdGg6OlBhdGhCdWY7CisKK3VzZSBjcmF0ZTo6Y29kZWdlbjo6Y3BwOjpnZW5lcmF0ZV9jcHBfY29kZTsKK3VzZSBjcmF0ZTo6Y29kZWdlbjo6amF2YTo6Z2VuZXJhdGVfamF2YV9jb2RlOwordXNlIGNyYXRlOjpjb2RlZ2VuOjpydXN0OjpnZW5lcmF0ZV9ydXN0X2NvZGU7Cit1c2UgY3JhdGU6OmNvZGVnZW46OkNvZGVnZW5Nb2RlOwordXNlIGNyYXRlOjpkdW1wOjp7RHVtcEZvcm1hdCwgRHVtcFByZWRpY2F0ZX07Cit1c2UgY3JhdGU6OnN0b3JhZ2U6OmdlbmVyYXRlX3N0b3JhZ2VfZmlsZTsKK3VzZSBhY29uZmlnX3Byb3Rvczo6eworICAgIFBhcnNlZEZsYWdFeHQsIFByb3RvRmxhZ01ldGFkYXRhLCBQcm90b0ZsYWdQZXJtaXNzaW9uLCBQcm90b0ZsYWdTdGF0ZSwgUHJvdG9QYXJzZWRGbGFnLAorICAgIFByb3RvUGFyc2VkRmxhZ3MsIFByb3RvVHJhY2Vwb2ludCwKK307Cit1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OnNpcF9oYXNoZXIxMzo6U2lwSGFzaGVyMTM7Cit1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OlN0b3JhZ2VGaWxlVHlwZTsKKworcHViIHN0cnVjdCBJbnB1dCB7CisgICAgcHViIHNvdXJjZTogU3RyaW5nLAorICAgIHB1YiByZWFkZXI6IEJveDxkeW4gUmVhZD4sCit9CisKK2ltcGwgSW5wdXQgeworICAgIGZuIHRyeV9wYXJzZV9mbGFncygmbXV0IHNlbGYpIC0+IFJlc3VsdDxQcm90b1BhcnNlZEZsYWdzPiB7CisgICAgICAgIGxldCBtdXQgYnVmZmVyID0gVmVjOjpuZXcoKTsKKyAgICAgICAgc2VsZi5yZWFkZXIKKyAgICAgICAgICAgIC5yZWFkX3RvX2VuZCgmbXV0IGJ1ZmZlcikKKyAgICAgICAgICAgIC53aXRoX2NvbnRleHQofHwgZm9ybWF0ISgiZmFpbGVkIHRvIHJlYWQge30iLCBzZWxmLnNvdXJjZSkpPzsKKyAgICAgICAgYWNvbmZpZ19wcm90b3M6OnBhcnNlZF9mbGFnczo6dHJ5X2Zyb21fYmluYXJ5X3Byb3RvKCZidWZmZXIpCisgICAgICAgICAgICAud2l0aF9jb250ZXh0KHx8IHNlbGYuZXJyb3JfY29udGV4dCgpKQorICAgIH0KKworICAgIGZuIGVycm9yX2NvbnRleHQoJnNlbGYpIC0+IFN0cmluZyB7CisgICAgICAgIGZvcm1hdCEoImZhaWxlZCB0byBwYXJzZSB7fSIsIHNlbGYuc291cmNlKQorICAgIH0KK30KKworcHViIHN0cnVjdCBPdXRwdXRGaWxlIHsKKyAgICBwdWIgcGF0aDogUGF0aEJ1ZiwgLy8gcmVsYXRpdmUgdG8gc29tZSByb290IGRpcmVjdG9yeSBvbmx5IG1haW4ga25vd3MgYWJvdXQKKyAgICBwdWIgY29udGVudHM6IFZlYzx1OD4sCit9CisKK3B1YiBjb25zdCBERUZBVUxUX0ZMQUdfU1RBVEU6IFByb3RvRmxhZ1N0YXRlID0gUHJvdG9GbGFnU3RhdGU6OkRJU0FCTEVEOworcHViIGNvbnN0IERFRkFVTFRfRkxBR19QRVJNSVNTSU9OOiBQcm90b0ZsYWdQZXJtaXNzaW9uID0gUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9XUklURTsKKworcHViIGZuIHBhcnNlX2ZsYWdzKAorICAgIHBhY2thZ2U6ICZzdHIsCisgICAgY29udGFpbmVyOiBPcHRpb248JnN0cj4sCisgICAgZGVjbGFyYXRpb25zOiBWZWM8SW5wdXQ+LAorICAgIHZhbHVlczogVmVjPElucHV0PiwKKyAgICBkZWZhdWx0X3Blcm1pc3Npb246IFByb3RvRmxhZ1Blcm1pc3Npb24sCisgICAgYWxsb3dfcmVhZF93cml0ZTogYm9vbCwKKykgLT4gUmVzdWx0PFZlYzx1OD4+IHsKKyAgICBsZXQgbXV0IHBhcnNlZF9mbGFncyA9IFByb3RvUGFyc2VkRmxhZ3M6Om5ldygpOworCisgICAgZm9yIG11dCBpbnB1dCBpbiBkZWNsYXJhdGlvbnMgeworICAgICAgICBsZXQgbXV0IGNvbnRlbnRzID0gU3RyaW5nOjpuZXcoKTsKKyAgICAgICAgaW5wdXQKKyAgICAgICAgICAgIC5yZWFkZXIKKyAgICAgICAgICAgIC5yZWFkX3RvX3N0cmluZygmbXV0IGNvbnRlbnRzKQorICAgICAgICAgICAgLndpdGhfY29udGV4dCh8fCBmb3JtYXQhKCJmYWlsZWQgdG8gcmVhZCB7fSIsIGlucHV0LnNvdXJjZSkpPzsKKworICAgICAgICBsZXQgbXV0IGZsYWdfZGVjbGFyYXRpb25zID0KKyAgICAgICAgICAgIGFjb25maWdfcHJvdG9zOjpmbGFnX2RlY2xhcmF0aW9uczo6dHJ5X2Zyb21fdGV4dF9wcm90bygmY29udGVudHMpCisgICAgICAgICAgICAgICAgLndpdGhfY29udGV4dCh8fCBpbnB1dC5lcnJvcl9jb250ZXh0KCkpPzsKKworICAgICAgICAvLyBzeXN0ZW1fZXh0IGZsYWdzIHNob3VsZCBiZSB0cmVhdGVkIGFzIHN5c3RlbSBmbGFncyBhcyB3ZSBhcmUgY29tYmluaW5nIC9zeXN0ZW1fZXh0CisgICAgICAgIC8vIGFuZCAvc3lzdGVtIGFzIG9uZSBjb250YWluZXIKKyAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgbG9naWMgd2hlbiB3ZSBzdGFydCBlbmZvcmNpbmcgdGhhdCBzeXN0ZW1fZXh0IGNhbm5vdCBiZSBzZXQgYXMKKyAgICAgICAgLy8gY29udGFpbmVyIGluIGFjb25maWcgZGVjbGFyYXRpb24gZmlsZXMuCisgICAgICAgIGlmIGZsYWdfZGVjbGFyYXRpb25zLmNvbnRhaW5lcigpID09ICJzeXN0ZW1fZXh0IiB7CisgICAgICAgICAgICBmbGFnX2RlY2xhcmF0aW9ucy5zZXRfY29udGFpbmVyKFN0cmluZzo6ZnJvbSgic3lzdGVtIikpOworICAgICAgICB9CisKKyAgICAgICAgZW5zdXJlISgKKyAgICAgICAgICAgIHBhY2thZ2UgPT0gZmxhZ19kZWNsYXJhdGlvbnMucGFja2FnZSgpLAorICAgICAgICAgICAgImZhaWxlZCB0byBwYXJzZSB7fTogZXhwZWN0ZWQgcGFja2FnZSB7fSwgZ290IHt9IiwKKyAgICAgICAgICAgIGlucHV0LnNvdXJjZSwKKyAgICAgICAgICAgIHBhY2thZ2UsCisgICAgICAgICAgICBmbGFnX2RlY2xhcmF0aW9ucy5wYWNrYWdlKCkKKyAgICAgICAgKTsKKyAgICAgICAgaWYgbGV0IFNvbWUoYykgPSBjb250YWluZXIgeworICAgICAgICAgICAgZW5zdXJlISgKKyAgICAgICAgICAgICAgICBjID09IGZsYWdfZGVjbGFyYXRpb25zLmNvbnRhaW5lcigpLAorICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gcGFyc2Uge306IGV4cGVjdGVkIGNvbnRhaW5lciB7fSwgZ290IHt9IiwKKyAgICAgICAgICAgICAgICBpbnB1dC5zb3VyY2UsCisgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICBmbGFnX2RlY2xhcmF0aW9ucy5jb250YWluZXIoKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgbXV0IGZsYWdfZGVjbGFyYXRpb24gaW4gZmxhZ19kZWNsYXJhdGlvbnMuZmxhZy5pbnRvX2l0ZXIoKSB7CisgICAgICAgICAgICBhY29uZmlnX3Byb3Rvczo6ZmxhZ19kZWNsYXJhdGlvbjo6dmVyaWZ5X2ZpZWxkcygmZmxhZ19kZWNsYXJhdGlvbikKKyAgICAgICAgICAgICAgICAud2l0aF9jb250ZXh0KHx8IGlucHV0LmVycm9yX2NvbnRleHQoKSk/OworCisgICAgICAgICAgICAvLyBjcmVhdGUgUGFyc2VkRmxhZyB1c2luZyBGbGFnRGVjbGFyYXRpb24gYW5kIGRlZmF1bHQgdmFsdWVzCisgICAgICAgICAgICBsZXQgbXV0IHBhcnNlZF9mbGFnID0gUHJvdG9QYXJzZWRGbGFnOjpuZXcoKTsKKyAgICAgICAgICAgIGlmIGxldCBTb21lKGMpID0gY29udGFpbmVyIHsKKyAgICAgICAgICAgICAgICBwYXJzZWRfZmxhZy5zZXRfY29udGFpbmVyKGMudG9fc3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFyc2VkX2ZsYWcuc2V0X3BhY2thZ2UocGFja2FnZS50b19zdHJpbmcoKSk7CisgICAgICAgICAgICBwYXJzZWRfZmxhZy5zZXRfbmFtZShmbGFnX2RlY2xhcmF0aW9uLnRha2VfbmFtZSgpKTsKKyAgICAgICAgICAgIHBhcnNlZF9mbGFnLnNldF9uYW1lc3BhY2UoZmxhZ19kZWNsYXJhdGlvbi50YWtlX25hbWVzcGFjZSgpKTsKKyAgICAgICAgICAgIHBhcnNlZF9mbGFnLnNldF9kZXNjcmlwdGlvbihmbGFnX2RlY2xhcmF0aW9uLnRha2VfZGVzY3JpcHRpb24oKSk7CisgICAgICAgICAgICBwYXJzZWRfZmxhZy5idWcuYXBwZW5kKCZtdXQgZmxhZ19kZWNsYXJhdGlvbi5idWcpOworICAgICAgICAgICAgcGFyc2VkX2ZsYWcuc2V0X3N0YXRlKERFRkFVTFRfRkxBR19TVEFURSk7CisgICAgICAgICAgICBsZXQgZmxhZ19wZXJtaXNzaW9uID0gaWYgZmxhZ19kZWNsYXJhdGlvbi5pc19maXhlZF9yZWFkX29ubHkoKSB7CisgICAgICAgICAgICAgICAgUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9PTkxZCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlZmF1bHRfcGVybWlzc2lvbgorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHBhcnNlZF9mbGFnLnNldF9wZXJtaXNzaW9uKGZsYWdfcGVybWlzc2lvbik7CisgICAgICAgICAgICBwYXJzZWRfZmxhZy5zZXRfaXNfZml4ZWRfcmVhZF9vbmx5KGZsYWdfZGVjbGFyYXRpb24uaXNfZml4ZWRfcmVhZF9vbmx5KCkpOworICAgICAgICAgICAgcGFyc2VkX2ZsYWcuc2V0X2lzX2V4cG9ydGVkKGZsYWdfZGVjbGFyYXRpb24uaXNfZXhwb3J0ZWQoKSk7CisgICAgICAgICAgICBsZXQgbXV0IHRyYWNlcG9pbnQgPSBQcm90b1RyYWNlcG9pbnQ6Om5ldygpOworICAgICAgICAgICAgdHJhY2Vwb2ludC5zZXRfc291cmNlKGlucHV0LnNvdXJjZS5jbG9uZSgpKTsKKyAgICAgICAgICAgIHRyYWNlcG9pbnQuc2V0X3N0YXRlKERFRkFVTFRfRkxBR19TVEFURSk7CisgICAgICAgICAgICB0cmFjZXBvaW50LnNldF9wZXJtaXNzaW9uKGZsYWdfcGVybWlzc2lvbik7CisgICAgICAgICAgICBwYXJzZWRfZmxhZy50cmFjZS5wdXNoKHRyYWNlcG9pbnQpOworCisgICAgICAgICAgICBsZXQgbXV0IG1ldGFkYXRhID0gUHJvdG9GbGFnTWV0YWRhdGE6Om5ldygpOworICAgICAgICAgICAgbGV0IHB1cnBvc2UgPSBmbGFnX2RlY2xhcmF0aW9uLm1ldGFkYXRhLnB1cnBvc2UoKTsKKyAgICAgICAgICAgIG1ldGFkYXRhLnNldF9wdXJwb3NlKHB1cnBvc2UpOworICAgICAgICAgICAgcGFyc2VkX2ZsYWcubWV0YWRhdGEgPSBTb21lKG1ldGFkYXRhKS5pbnRvKCk7CisKKyAgICAgICAgICAgIC8vIHZlcmlmeSBQYXJzZWRGbGFnIGxvb2tzIHJlYXNvbmFibGUKKyAgICAgICAgICAgIGFjb25maWdfcHJvdG9zOjpwYXJzZWRfZmxhZzo6dmVyaWZ5X2ZpZWxkcygmcGFyc2VkX2ZsYWcpPzsKKworICAgICAgICAgICAgLy8gdmVyaWZ5IFBhcnNlZEZsYWcgY2FuIGJlIGFkZGVkCisgICAgICAgICAgICBlbnN1cmUhKAorICAgICAgICAgICAgICAgIHBhcnNlZF9mbGFncy5wYXJzZWRfZmxhZy5pdGVyKCkuYWxsKHxvdGhlcnwgb3RoZXIubmFtZSgpICE9IHBhcnNlZF9mbGFnLm5hbWUoKSksCisgICAgICAgICAgICAgICAgImZhaWxlZCB0byBkZWNsYXJlIGZsYWcge30gZnJvbSB7fTogZmxhZyBhbHJlYWR5IGRlY2xhcmVkIiwKKyAgICAgICAgICAgICAgICBwYXJzZWRfZmxhZy5uYW1lKCksCisgICAgICAgICAgICAgICAgaW5wdXQuc291cmNlCisgICAgICAgICAgICApOworCisgICAgICAgICAgICAvLyBhZGQgUGFyc2VkRmxhZyB0byBQYXJzZWRGbGFncworICAgICAgICAgICAgcGFyc2VkX2ZsYWdzLnBhcnNlZF9mbGFnLnB1c2gocGFyc2VkX2ZsYWcpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIG11dCBpbnB1dCBpbiB2YWx1ZXMgeworICAgICAgICBsZXQgbXV0IGNvbnRlbnRzID0gU3RyaW5nOjpuZXcoKTsKKyAgICAgICAgaW5wdXQKKyAgICAgICAgICAgIC5yZWFkZXIKKyAgICAgICAgICAgIC5yZWFkX3RvX3N0cmluZygmbXV0IGNvbnRlbnRzKQorICAgICAgICAgICAgLndpdGhfY29udGV4dCh8fCBmb3JtYXQhKCJmYWlsZWQgdG8gcmVhZCB7fSIsIGlucHV0LnNvdXJjZSkpPzsKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVzID0gYWNvbmZpZ19wcm90b3M6OmZsYWdfdmFsdWVzOjp0cnlfZnJvbV90ZXh0X3Byb3RvKCZjb250ZW50cykKKyAgICAgICAgICAgIC53aXRoX2NvbnRleHQofHwgaW5wdXQuZXJyb3JfY29udGV4dCgpKT87CisgICAgICAgIGZvciBmbGFnX3ZhbHVlIGluIGZsYWdfdmFsdWVzLmZsYWdfdmFsdWUuaW50b19pdGVyKCkgeworICAgICAgICAgICAgYWNvbmZpZ19wcm90b3M6OmZsYWdfdmFsdWU6OnZlcmlmeV9maWVsZHMoJmZsYWdfdmFsdWUpCisgICAgICAgICAgICAgICAgLndpdGhfY29udGV4dCh8fCBpbnB1dC5lcnJvcl9jb250ZXh0KCkpPzsKKworICAgICAgICAgICAgbGV0IFNvbWUocGFyc2VkX2ZsYWcpID0gcGFyc2VkX2ZsYWdzCisgICAgICAgICAgICAgICAgLnBhcnNlZF9mbGFnCisgICAgICAgICAgICAgICAgLml0ZXJfbXV0KCkKKyAgICAgICAgICAgICAgICAuZmluZCh8cGZ8IHBmLnBhY2thZ2UoKSA9PSBmbGFnX3ZhbHVlLnBhY2thZ2UoKSAmJiBwZi5uYW1lKCkgPT0gZmxhZ192YWx1ZS5uYW1lKCkpCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyAoc2lsZW50bHkpIHNraXAgdW5rbm93biBmbGFncworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgZW5zdXJlISgKKyAgICAgICAgICAgICAgICAhcGFyc2VkX2ZsYWcuaXNfZml4ZWRfcmVhZF9vbmx5KCkKKyAgICAgICAgICAgICAgICAgICAgfHwgZmxhZ192YWx1ZS5wZXJtaXNzaW9uKCkgPT0gUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9PTkxZLAorICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gc2V0IHBlcm1pc3Npb24gb2YgZmxhZyB7fSwgc2luY2UgdGhpcyBmbGFnIGlzIGZpeGVkIHJlYWQgb25seSBmbGFnIiwKKyAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlLm5hbWUoKQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgcGFyc2VkX2ZsYWcuc2V0X3N0YXRlKGZsYWdfdmFsdWUuc3RhdGUoKSk7CisgICAgICAgICAgICBwYXJzZWRfZmxhZy5zZXRfcGVybWlzc2lvbihmbGFnX3ZhbHVlLnBlcm1pc3Npb24oKSk7CisgICAgICAgICAgICBsZXQgbXV0IHRyYWNlcG9pbnQgPSBQcm90b1RyYWNlcG9pbnQ6Om5ldygpOworICAgICAgICAgICAgdHJhY2Vwb2ludC5zZXRfc291cmNlKGlucHV0LnNvdXJjZS5jbG9uZSgpKTsKKyAgICAgICAgICAgIHRyYWNlcG9pbnQuc2V0X3N0YXRlKGZsYWdfdmFsdWUuc3RhdGUoKSk7CisgICAgICAgICAgICB0cmFjZXBvaW50LnNldF9wZXJtaXNzaW9uKGZsYWdfdmFsdWUucGVybWlzc2lvbigpKTsKKyAgICAgICAgICAgIHBhcnNlZF9mbGFnLnRyYWNlLnB1c2godHJhY2Vwb2ludCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAhYWxsb3dfcmVhZF93cml0ZSB7CisgICAgICAgIGlmIGxldCBTb21lKHBmKSA9IHBhcnNlZF9mbGFncworICAgICAgICAgICAgLnBhcnNlZF9mbGFnCisgICAgICAgICAgICAuaXRlcigpCisgICAgICAgICAgICAuZmluZCh8cGZ8IHBmLnBlcm1pc3Npb24oKSA9PSBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFKQorICAgICAgICB7CisgICAgICAgICAgICBiYWlsISgiZmxhZyB7fSBoYXMgcGVybWlzc2lvbiBSRUFEX1dSSVRFLCBidXQgYWxsb3dfcmVhZF93cml0ZSBpcyBmYWxzZSIsIHBmLm5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSBzb3J0ZWQgcGFyc2VkX2ZsYWdzCisgICAgYWNvbmZpZ19wcm90b3M6OnBhcnNlZF9mbGFnczo6c29ydF9wYXJzZWRfZmxhZ3MoJm11dCBwYXJzZWRfZmxhZ3MpOworICAgIGFjb25maWdfcHJvdG9zOjpwYXJzZWRfZmxhZ3M6OnZlcmlmeV9maWVsZHMoJnBhcnNlZF9mbGFncyk/OworICAgIGxldCBtdXQgb3V0cHV0ID0gVmVjOjpuZXcoKTsKKyAgICBwYXJzZWRfZmxhZ3Mud3JpdGVfdG9fdmVjKCZtdXQgb3V0cHV0KT87CisgICAgT2sob3V0cHV0KQorfQorCitwdWIgZm4gY3JlYXRlX2phdmFfbGliKAorICAgIG11dCBpbnB1dDogSW5wdXQsCisgICAgY29kZWdlbl9tb2RlOiBDb2RlZ2VuTW9kZSwKKyAgICBhbGxvd19pbnN0cnVtZW50YXRpb246IGJvb2wsCisgICAgbmV3X2V4cG9ydGVkOiBib29sLAorKSAtPiBSZXN1bHQ8VmVjPE91dHB1dEZpbGU+PiB7CisgICAgbGV0IHBhcnNlZF9mbGFncyA9IGlucHV0LnRyeV9wYXJzZV9mbGFncygpPzsKKyAgICBsZXQgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzID0KKyAgICAgICAgbW9kaWZ5X3BhcnNlZF9mbGFnc19iYXNlZF9vbl9tb2RlKHBhcnNlZF9mbGFncy5jbG9uZSgpLCBjb2RlZ2VuX21vZGUpPzsKKyAgICBsZXQgU29tZShwYWNrYWdlKSA9IGZpbmRfdW5pcXVlX3BhY2thZ2UoJm1vZGlmaWVkX3BhcnNlZF9mbGFncykgZWxzZSB7CisgICAgICAgIGJhaWwhKCJubyBwYXJzZWQgZmxhZ3MsIG9yIHRoZSBwYXJzZWQgZmxhZ3MgdXNlIGRpZmZlcmVudCBwYWNrYWdlcyIpOworICAgIH07CisgICAgbGV0IHBhY2thZ2UgPSBwYWNrYWdlLnRvX3N0cmluZygpOworICAgIGxldCBtdXQgZmxhZ19uYW1lcyA9IGV4dHJhY3RfZmxhZ19uYW1lcyhwYXJzZWRfZmxhZ3MpPzsKKyAgICBsZXQgcGFja2FnZV9maW5nZXJwcmludCA9IGNvbXB1dGVfZmxhZ3NfZmluZ2VycHJpbnQoJm11dCBmbGFnX25hbWVzKTsKKyAgICBsZXQgZmxhZ19pZHMgPSBhc3NpZ25fZmxhZ19pZHMoJnBhY2thZ2UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pdGVyKCkpPzsKKyAgICBnZW5lcmF0ZV9qYXZhX2NvZGUoCisgICAgICAgICZwYWNrYWdlLAorICAgICAgICBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaW50b19pdGVyKCksCisgICAgICAgIGNvZGVnZW5fbW9kZSwKKyAgICAgICAgZmxhZ19pZHMsCisgICAgICAgIGFsbG93X2luc3RydW1lbnRhdGlvbiwKKyAgICAgICAgcGFja2FnZV9maW5nZXJwcmludCwKKyAgICAgICAgbmV3X2V4cG9ydGVkLAorICAgICkKK30KKworcHViIGZuIGNyZWF0ZV9jcHBfbGliKAorICAgIG11dCBpbnB1dDogSW5wdXQsCisgICAgY29kZWdlbl9tb2RlOiBDb2RlZ2VuTW9kZSwKKyAgICBhbGxvd19pbnN0cnVtZW50YXRpb246IGJvb2wsCispIC0+IFJlc3VsdDxWZWM8T3V0cHV0RmlsZT4+IHsKKyAgICAvLyBUT0RPKDMyNzQyMDY3OSk6IEVuYWJsZSBleHBvcnQgbW9kZSBmb3IgbmF0aXZlIGZsYWcgbGlicmFyeQorICAgIGVuc3VyZSEoCisgICAgICAgIGNvZGVnZW5fbW9kZSAhPSBDb2RlZ2VuTW9kZTo6RXhwb3J0ZWQsCisgICAgICAgICJFeHBvcnRlZCBtb2RlIGZvciBnZW5lcmF0ZWQgYy9jKysgZmxhZyBsaWJyYXJ5IGlzIGRpc2FibGVkIgorICAgICk7CisgICAgbGV0IHBhcnNlZF9mbGFncyA9IGlucHV0LnRyeV9wYXJzZV9mbGFncygpPzsKKyAgICBsZXQgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzID0gbW9kaWZ5X3BhcnNlZF9mbGFnc19iYXNlZF9vbl9tb2RlKHBhcnNlZF9mbGFncywgY29kZWdlbl9tb2RlKT87CisgICAgbGV0IFNvbWUocGFja2FnZSkgPSBmaW5kX3VuaXF1ZV9wYWNrYWdlKCZtb2RpZmllZF9wYXJzZWRfZmxhZ3MpIGVsc2UgeworICAgICAgICBiYWlsISgibm8gcGFyc2VkIGZsYWdzLCBvciB0aGUgcGFyc2VkIGZsYWdzIHVzZSBkaWZmZXJlbnQgcGFja2FnZXMiKTsKKyAgICB9OworICAgIGxldCBwYWNrYWdlID0gcGFja2FnZS50b19zdHJpbmcoKTsKKyAgICBsZXQgZmxhZ19pZHMgPSBhc3NpZ25fZmxhZ19pZHMoJnBhY2thZ2UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pdGVyKCkpPzsKKyAgICBnZW5lcmF0ZV9jcHBfY29kZSgKKyAgICAgICAgJnBhY2thZ2UsCisgICAgICAgIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pbnRvX2l0ZXIoKSwKKyAgICAgICAgY29kZWdlbl9tb2RlLAorICAgICAgICBmbGFnX2lkcywKKyAgICAgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uLAorICAgICkKK30KKworcHViIGZuIGNyZWF0ZV9ydXN0X2xpYigKKyAgICBtdXQgaW5wdXQ6IElucHV0LAorICAgIGNvZGVnZW5fbW9kZTogQ29kZWdlbk1vZGUsCisgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uOiBib29sLAorKSAtPiBSZXN1bHQ8T3V0cHV0RmlsZT4geworICAgIC8vIC8vIFRPRE8oMzI3NDIwNjc5KTogRW5hYmxlIGV4cG9ydCBtb2RlIGZvciBuYXRpdmUgZmxhZyBsaWJyYXJ5CisgICAgZW5zdXJlISgKKyAgICAgICAgY29kZWdlbl9tb2RlICE9IENvZGVnZW5Nb2RlOjpFeHBvcnRlZCwKKyAgICAgICAgIkV4cG9ydGVkIG1vZGUgZm9yIGdlbmVyYXRlZCBydXN0IGZsYWcgbGlicmFyeSBpcyBkaXNhYmxlZCIKKyAgICApOworICAgIGxldCBwYXJzZWRfZmxhZ3MgPSBpbnB1dC50cnlfcGFyc2VfZmxhZ3MoKT87CisgICAgbGV0IG1vZGlmaWVkX3BhcnNlZF9mbGFncyA9IG1vZGlmeV9wYXJzZWRfZmxhZ3NfYmFzZWRfb25fbW9kZShwYXJzZWRfZmxhZ3MsIGNvZGVnZW5fbW9kZSk/OworICAgIGxldCBTb21lKHBhY2thZ2UpID0gZmluZF91bmlxdWVfcGFja2FnZSgmbW9kaWZpZWRfcGFyc2VkX2ZsYWdzKSBlbHNlIHsKKyAgICAgICAgYmFpbCEoIm5vIHBhcnNlZCBmbGFncywgb3IgdGhlIHBhcnNlZCBmbGFncyB1c2UgZGlmZmVyZW50IHBhY2thZ2VzIik7CisgICAgfTsKKyAgICBsZXQgcGFja2FnZSA9IHBhY2thZ2UudG9fc3RyaW5nKCk7CisgICAgbGV0IGZsYWdfaWRzID0gYXNzaWduX2ZsYWdfaWRzKCZwYWNrYWdlLCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaXRlcigpKT87CisgICAgZ2VuZXJhdGVfcnVzdF9jb2RlKAorICAgICAgICAmcGFja2FnZSwKKyAgICAgICAgZmxhZ19pZHMsCisgICAgICAgIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pbnRvX2l0ZXIoKSwKKyAgICAgICAgY29kZWdlbl9tb2RlLAorICAgICAgICBhbGxvd19pbnN0cnVtZW50YXRpb24sCisgICAgKQorfQorCitwdWIgZm4gY3JlYXRlX3N0b3JhZ2UoCisgICAgY2FjaGVzOiBWZWM8SW5wdXQ+LAorICAgIGNvbnRhaW5lcjogJnN0ciwKKyAgICBmaWxlOiAmU3RvcmFnZUZpbGVUeXBlLAorICAgIHZlcnNpb246IHUzMiwKKykgLT4gUmVzdWx0PFZlYzx1OD4+IHsKKyAgICBsZXQgcGFyc2VkX2ZsYWdzX3ZlYzogVmVjPFByb3RvUGFyc2VkRmxhZ3M+ID0KKyAgICAgICAgY2FjaGVzLmludG9faXRlcigpLm1hcCh8bXV0IGlucHV0fCBpbnB1dC50cnlfcGFyc2VfZmxhZ3MoKSkuY29sbGVjdDo6PFJlc3VsdDxWZWM8Xz4+PigpPzsKKyAgICBnZW5lcmF0ZV9zdG9yYWdlX2ZpbGUoY29udGFpbmVyLCBwYXJzZWRfZmxhZ3NfdmVjLml0ZXIoKSwgZmlsZSwgdmVyc2lvbikKK30KKworcHViIGZuIGNyZWF0ZV9kZXZpY2VfY29uZmlnX2RlZmF1bHRzKG11dCBpbnB1dDogSW5wdXQpIC0+IFJlc3VsdDxWZWM8dTg+PiB7CisgICAgbGV0IHBhcnNlZF9mbGFncyA9IGlucHV0LnRyeV9wYXJzZV9mbGFncygpPzsKKyAgICBsZXQgbXV0IG91dHB1dCA9IFZlYzo6bmV3KCk7CisgICAgZm9yIHBhcnNlZF9mbGFnIGluIHBhcnNlZF9mbGFncworICAgICAgICAucGFyc2VkX2ZsYWcKKyAgICAgICAgLmludG9faXRlcigpCisgICAgICAgIC5maWx0ZXIofHBmfCBwZi5wZXJtaXNzaW9uKCkgPT0gUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9XUklURSkKKyAgICB7CisgICAgICAgIGxldCBsaW5lID0gZm9ybWF0ISgKKyAgICAgICAgICAgICJ7fTp7fT17fVxuIiwKKyAgICAgICAgICAgIHBhcnNlZF9mbGFnLm5hbWVzcGFjZSgpLAorICAgICAgICAgICAgcGFyc2VkX2ZsYWcuZnVsbHlfcXVhbGlmaWVkX25hbWUoKSwKKyAgICAgICAgICAgIG1hdGNoIHBhcnNlZF9mbGFnLnN0YXRlKCkgeworICAgICAgICAgICAgICAgIFByb3RvRmxhZ1N0YXRlOjpFTkFCTEVEID0+ICJlbmFibGVkIiwKKyAgICAgICAgICAgICAgICBQcm90b0ZsYWdTdGF0ZTo6RElTQUJMRUQgPT4gImRpc2FibGVkIiwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgb3V0cHV0LmV4dGVuZF9mcm9tX3NsaWNlKGxpbmUuYXNfYnl0ZXMoKSk7CisgICAgfQorICAgIE9rKG91dHB1dCkKK30KKworcHViIGZuIGNyZWF0ZV9kZXZpY2VfY29uZmlnX3N5c3Byb3BzKG11dCBpbnB1dDogSW5wdXQpIC0+IFJlc3VsdDxWZWM8dTg+PiB7CisgICAgbGV0IHBhcnNlZF9mbGFncyA9IGlucHV0LnRyeV9wYXJzZV9mbGFncygpPzsKKyAgICBsZXQgbXV0IG91dHB1dCA9IFZlYzo6bmV3KCk7CisgICAgZm9yIHBhcnNlZF9mbGFnIGluIHBhcnNlZF9mbGFncworICAgICAgICAucGFyc2VkX2ZsYWcKKyAgICAgICAgLmludG9faXRlcigpCisgICAgICAgIC5maWx0ZXIofHBmfCBwZi5wZXJtaXNzaW9uKCkgPT0gUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9XUklURSkKKyAgICB7CisgICAgICAgIGxldCBsaW5lID0gZm9ybWF0ISgKKyAgICAgICAgICAgICJwZXJzaXN0LmRldmljZV9jb25maWcue309e31cbiIsCisgICAgICAgICAgICBwYXJzZWRfZmxhZy5mdWxseV9xdWFsaWZpZWRfbmFtZSgpLAorICAgICAgICAgICAgbWF0Y2ggcGFyc2VkX2ZsYWcuc3RhdGUoKSB7CisgICAgICAgICAgICAgICAgUHJvdG9GbGFnU3RhdGU6OkVOQUJMRUQgPT4gInRydWUiLAorICAgICAgICAgICAgICAgIFByb3RvRmxhZ1N0YXRlOjpESVNBQkxFRCA9PiAiZmFsc2UiLAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBvdXRwdXQuZXh0ZW5kX2Zyb21fc2xpY2UobGluZS5hc19ieXRlcygpKTsKKyAgICB9CisgICAgT2sob3V0cHV0KQorfQorCitwdWIgZm4gZHVtcF9wYXJzZWRfZmxhZ3MoCisgICAgbXV0IGlucHV0OiBWZWM8SW5wdXQ+LAorICAgIGZvcm1hdDogRHVtcEZvcm1hdCwKKyAgICBmaWx0ZXJzOiAmWyZzdHJdLAorICAgIGRlZHVwOiBib29sLAorKSAtPiBSZXN1bHQ8VmVjPHU4Pj4geworICAgIGxldCBpbmRpdmlkdWFsbHlfcGFyc2VkX2ZsYWdzOiBSZXN1bHQ8VmVjPFByb3RvUGFyc2VkRmxhZ3M+PiA9CisgICAgICAgIGlucHV0Lml0ZXJfbXV0KCkubWFwKHxpfCBpLnRyeV9wYXJzZV9mbGFncygpKS5jb2xsZWN0KCk7CisgICAgbGV0IHBhcnNlZF9mbGFnczogUHJvdG9QYXJzZWRGbGFncyA9CisgICAgICAgIGFjb25maWdfcHJvdG9zOjpwYXJzZWRfZmxhZ3M6Om1lcmdlKGluZGl2aWR1YWxseV9wYXJzZWRfZmxhZ3M/LCBkZWR1cCk/OworICAgIGxldCBmaWx0ZXJzOiBWZWM8Qm94PER1bXBQcmVkaWNhdGU+PiA9IGlmIGZpbHRlcnMuaXNfZW1wdHkoKSB7CisgICAgICAgIHZlYyFbQm94OjpuZXcofF98IHRydWUpXQorICAgIH0gZWxzZSB7CisgICAgICAgIGZpbHRlcnMKKyAgICAgICAgICAgIC5pdGVyKCkKKyAgICAgICAgICAgIC5tYXAofGZ8IGNyYXRlOjpkdW1wOjpjcmVhdGVfZmlsdGVyX3ByZWRpY2F0ZShmKSkKKyAgICAgICAgICAgIC5jb2xsZWN0Ojo8UmVzdWx0PFZlYzxfPj4+KCk/CisgICAgfTsKKyAgICBjcmF0ZTo6ZHVtcDo6ZHVtcF9wYXJzZWRfZmxhZ3MoCisgICAgICAgIHBhcnNlZF9mbGFncy5wYXJzZWRfZmxhZy5pbnRvX2l0ZXIoKS5maWx0ZXIofGZsYWd8IGZpbHRlcnMuaXRlcigpLmFueSh8cHwgcChmbGFnKSkpLAorICAgICAgICBmb3JtYXQsCisgICAgKQorfQorCitmbiBmaW5kX3VuaXF1ZV9wYWNrYWdlKHBhcnNlZF9mbGFnczogJltQcm90b1BhcnNlZEZsYWddKSAtPiBPcHRpb248JnN0cj4geworICAgIGxldCBwYWNrYWdlID0gcGFyc2VkX2ZsYWdzLmZpcnN0KCkubWFwKHxwZnwgcGYucGFja2FnZSgpKT87CisgICAgaWYgcGFyc2VkX2ZsYWdzLml0ZXIoKS5hbnkofHBmfCBwZi5wYWNrYWdlKCkgIT0gcGFja2FnZSkgeworICAgICAgICByZXR1cm4gTm9uZTsKKyAgICB9CisgICAgU29tZShwYWNrYWdlKQorfQorCitwdWIgZm4gbW9kaWZ5X3BhcnNlZF9mbGFnc19iYXNlZF9vbl9tb2RlKAorICAgIHBhcnNlZF9mbGFnczogUHJvdG9QYXJzZWRGbGFncywKKyAgICBjb2RlZ2VuX21vZGU6IENvZGVnZW5Nb2RlLAorKSAtPiBSZXN1bHQ8VmVjPFByb3RvUGFyc2VkRmxhZz4+IHsKKyAgICBmbiBleHBvcnRlZF9tb2RlX2ZsYWdfbW9kaWZpZXIobXV0IHBhcnNlZF9mbGFnOiBQcm90b1BhcnNlZEZsYWcpIC0+IFByb3RvUGFyc2VkRmxhZyB7CisgICAgICAgIHBhcnNlZF9mbGFnLnNldF9zdGF0ZShQcm90b0ZsYWdTdGF0ZTo6RElTQUJMRUQpOworICAgICAgICBwYXJzZWRfZmxhZy5zZXRfcGVybWlzc2lvbihQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFKTsKKyAgICAgICAgcGFyc2VkX2ZsYWcuc2V0X2lzX2ZpeGVkX3JlYWRfb25seShmYWxzZSk7CisgICAgICAgIHBhcnNlZF9mbGFnCisgICAgfQorCisgICAgZm4gZm9yY2VfcmVhZF9vbmx5X21vZGVfZmxhZ19tb2RpZmllcihtdXQgcGFyc2VkX2ZsYWc6IFByb3RvUGFyc2VkRmxhZykgLT4gUHJvdG9QYXJzZWRGbGFnIHsKKyAgICAgICAgcGFyc2VkX2ZsYWcuc2V0X3Blcm1pc3Npb24oUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9PTkxZKTsKKyAgICAgICAgcGFyc2VkX2ZsYWcKKyAgICB9CisKKyAgICBsZXQgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzOiBWZWM8Xz4gPSBtYXRjaCBjb2RlZ2VuX21vZGUgeworICAgICAgICBDb2RlZ2VuTW9kZTo6RXhwb3J0ZWQgPT4gcGFyc2VkX2ZsYWdzCisgICAgICAgICAgICAucGFyc2VkX2ZsYWcKKyAgICAgICAgICAgIC5pbnRvX2l0ZXIoKQorICAgICAgICAgICAgLmZpbHRlcih8cGZ8IHBmLmlzX2V4cG9ydGVkKCkpCisgICAgICAgICAgICAubWFwKGV4cG9ydGVkX21vZGVfZmxhZ19tb2RpZmllcikKKyAgICAgICAgICAgIC5jb2xsZWN0KCksCisgICAgICAgIENvZGVnZW5Nb2RlOjpGb3JjZVJlYWRPbmx5ID0+IHBhcnNlZF9mbGFncworICAgICAgICAgICAgLnBhcnNlZF9mbGFnCisgICAgICAgICAgICAuaW50b19pdGVyKCkKKyAgICAgICAgICAgIC5maWx0ZXIofHBmfCAhcGYuaXNfZXhwb3J0ZWQoKSkKKyAgICAgICAgICAgIC5tYXAoZm9yY2VfcmVhZF9vbmx5X21vZGVfZmxhZ19tb2RpZmllcikKKyAgICAgICAgICAgIC5jb2xsZWN0KCksCisgICAgICAgIENvZGVnZW5Nb2RlOjpQcm9kdWN0aW9uIHwgQ29kZWdlbk1vZGU6OlRlc3QgPT4geworICAgICAgICAgICAgcGFyc2VkX2ZsYWdzLnBhcnNlZF9mbGFnLmludG9faXRlcigpLmNvbGxlY3QoKQorICAgICAgICB9CisgICAgfTsKKyAgICBpZiBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaXNfZW1wdHkoKSB7CisgICAgICAgIGJhaWwhKCJ7Y29kZWdlbl9tb2RlfSBsaWJyYXJ5IGNvbnRhaW5zIG5vIHtjb2RlZ2VuX21vZGV9IGZsYWdzIik7CisgICAgfQorCisgICAgT2sobW9kaWZpZWRfcGFyc2VkX2ZsYWdzKQorfQorCitwdWIgZm4gYXNzaWduX2ZsYWdfaWRzPCdhLCBJPihwYWNrYWdlOiAmc3RyLCBwYXJzZWRfZmxhZ3NfaXRlcjogSSkgLT4gUmVzdWx0PEhhc2hNYXA8U3RyaW5nLCB1MTY+Pgord2hlcmUKKyAgICBJOiBJdGVyYXRvcjxJdGVtID0gJidhIFByb3RvUGFyc2VkRmxhZz4gKyBDbG9uZSwKK3sKKyAgICBhc3NlcnQhKHBhcnNlZF9mbGFnc19pdGVyLmNsb25lKCkudHVwbGVfd2luZG93cygpLmFsbCh8KGEsIGIpfCBhLm5hbWUoKSA8PSBiLm5hbWUoKSkpOworICAgIGxldCBtdXQgZmxhZ19pZHMgPSBIYXNoTWFwOjpuZXcoKTsKKyAgICBsZXQgbXV0IGZsYWdfaWR4ID0gMDsKKyAgICBmb3IgcGYgaW4gcGFyc2VkX2ZsYWdzX2l0ZXIgeworICAgICAgICBpZiBwYWNrYWdlICE9IHBmLnBhY2thZ2UoKSB7CisgICAgICAgICAgICByZXR1cm4gRXJyKGFueWhvdzo6YW55aG93ISgiZW5jb3VudGVyZWQgYSBmbGFnIG5vdCBpbiBjdXJyZW50IHBhY2thZ2UiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwdXQgYSBjYXAgb24gaG93IG1hbnkgZmxhZ3MgYSBwYWNrYWdlIGNhbiBjb250YWluIHRvIDY1NTM1CisgICAgICAgIGlmIGZsYWdfaWR4ID4gdTE2OjpNQVggYXMgdTMyIHsKKyAgICAgICAgICAgIHJldHVybiBFcnIoYW55aG93Ojphbnlob3chKCJ0aGUgbnVtYmVyIG9mIGZsYWdzIGluIGEgcGFja2FnZSBjYW5ub3QgZXhjZWVkIDY1NTM1IikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgc2hvdWxkX2luY2x1ZGVfZmxhZyhwZikgeworICAgICAgICAgICAgZmxhZ19pZHMuaW5zZXJ0KHBmLm5hbWUoKS50b19zdHJpbmcoKSwgZmxhZ19pZHggYXMgdTE2KTsKKyAgICAgICAgICAgIGZsYWdfaWR4ICs9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgT2soZmxhZ19pZHMpCit9CisKKy8vIENyZWF0ZXMgYSBmaW5nZXJwcmludCBvZiB0aGUgZmxhZyBuYW1lcyAod2hpY2ggcmVxdWlyZXMgc29ydGluZyB0aGUgdmVjdG9yKS4KKy8vIEZpbmdlcnByaW50IGlzIHVzZWQgYnkgYm90aCBjb2RlZ2VuIGFuZCBzdG9yYWdlIGZpbGVzLgorcHViIGZuIGNvbXB1dGVfZmxhZ3NfZmluZ2VycHJpbnQoZmxhZ19uYW1lczogJm11dCBWZWM8U3RyaW5nPikgLT4gdTY0IHsKKyAgICBmbGFnX25hbWVzLnNvcnQoKTsKKworICAgIGxldCBtdXQgaGFzaGVyID0gU2lwSGFzaGVyMTM6Om5ldygpOworICAgIGZvciBmbGFnIGluIGZsYWdfbmFtZXMgeworICAgICAgICBoYXNoZXIud3JpdGUoZmxhZy5hc19ieXRlcygpKTsKKyAgICB9CisgICAgaGFzaGVyLmZpbmlzaCgpCit9CisKKy8vIENvbnZlcnRzIFByb3RvUGFyc2VkRmxhZ3MgaW50byBhIHZlY3RvciBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBmbGFnCisvLyBuYW1lcy4gSGVscGVyIGZuIGZvciBjcmVhdGluZyBmaW5nZXJwcmludCBmb3IgY29kZWdlbiBmaWxlcy4gRmxhZ3MgbXVzdCBhbGwKKy8vIGJlbG9uZyB0byB0aGUgc2FtZSBwYWNrYWdlLgorZm4gZXh0cmFjdF9mbGFnX25hbWVzKGZsYWdzOiBQcm90b1BhcnNlZEZsYWdzKSAtPiBSZXN1bHQ8VmVjPFN0cmluZz4+IHsKKyAgICBsZXQgc2VwYXJhdGVkX2ZsYWdzOiBWZWM8UHJvdG9QYXJzZWRGbGFnPiA9IGZsYWdzLnBhcnNlZF9mbGFnLmludG9faXRlcigpLmNvbGxlY3Q6OjxWZWM8Xz4+KCk7CisKKyAgICAvLyBBbGwgZmxhZ3MgbXVzdCBiZWxvbmcgdG8gdGhlIHNhbWUgcGFja2FnZSBhcyB0aGUgZmluZ2VycHJpbnQgaXMgcGVyLXBhY2thZ2UuCisgICAgbGV0IFNvbWUoX3BhY2thZ2UpID0gZmluZF91bmlxdWVfcGFja2FnZSgmc2VwYXJhdGVkX2ZsYWdzKSBlbHNlIHsKKyAgICAgICAgYmFpbCEoIk5vIHBhcnNlZCBmbGFncywgb3IgdGhlIHBhcnNlZCBmbGFncyB1c2UgZGlmZmVyZW50IHBhY2thZ2VzLiIpOworICAgIH07CisKKyAgICBPayhzZXBhcmF0ZWRfZmxhZ3MKKyAgICAgICAgLmludG9faXRlcigpCisgICAgICAgIC5maWx0ZXIoc2hvdWxkX2luY2x1ZGVfZmxhZykKKyAgICAgICAgLm1hcCh8ZmxhZ3wgZmxhZy5uYW1lLnVud3JhcCgpKQorICAgICAgICAuY29sbGVjdDo6PFZlYzxfPj4oKSkKK30KKworLy8gRXhjbHVkZSBzeXN0ZW0vdmVuZG9yL3Byb2R1Y3QgZmxhZ3MgdGhhdCBhcmUgUk8rZGlzYWJsZWQuCitwdWIgZm4gc2hvdWxkX2luY2x1ZGVfZmxhZyhwZjogJlByb3RvUGFyc2VkRmxhZykgLT4gYm9vbCB7CisgICAgbGV0IHNob3VsZF9maWx0ZXJfY29udGFpbmVyID0gcGYuY29udGFpbmVyID09IFNvbWUoInZlbmRvciIudG9fc3RyaW5nKCkpCisgICAgICAgIHx8IHBmLmNvbnRhaW5lciA9PSBTb21lKCJzeXN0ZW0iLnRvX3N0cmluZygpKQorICAgICAgICB8fCBwZi5jb250YWluZXIgPT0gU29tZSgicHJvZHVjdCIudG9fc3RyaW5nKCkpOworCisgICAgbGV0IGRpc2FibGVkX3JvID0gcGYuc3RhdGUgPT0gU29tZShQcm90b0ZsYWdTdGF0ZTo6RElTQUJMRUQuaW50bygpKQorICAgICAgICAmJiBwZi5wZXJtaXNzaW9uID09IFNvbWUoUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9PTkxZLmludG8oKSk7CisKKyAgICAhc2hvdWxkX2ZpbHRlcl9jb250YWluZXIgfHwgIWRpc2FibGVkX3JvCit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIGFjb25maWdfcHJvdG9zOjpQcm90b0ZsYWdQdXJwb3NlOworCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3Rfb2Zmc2V0X2ZpbmdlcnByaW50KCkgeworICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0gY3JhdGU6OnRlc3Q6OnBhcnNlX3Rlc3RfZmxhZ3MoKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX2ZpbmdlcnByaW50OiB1NjQgPSAxMTU1MTM3OTk2MDMyNDI0MjM2MDsKKworICAgICAgICBsZXQgbXV0IGV4dHJhY3RlZF9mbGFncyA9IGV4dHJhY3RfZmxhZ19uYW1lcyhwYXJzZWRfZmxhZ3MpLnVud3JhcCgpOworICAgICAgICBsZXQgaGFzaF9yZXN1bHQgPSBjb21wdXRlX2ZsYWdzX2ZpbmdlcnByaW50KCZtdXQgZXh0cmFjdGVkX2ZsYWdzKTsKKworICAgICAgICBhc3NlcnRfZXEhKGhhc2hfcmVzdWx0LCBleHBlY3RlZF9maW5nZXJwcmludCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3Rfb2Zmc2V0X2ZpbmdlcnByaW50X21hdGNoZXNfZnJvbV9wYWNrYWdlKCkgeworICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzOiBQcm90b1BhcnNlZEZsYWdzID0gY3JhdGU6OnRlc3Q6OnBhcnNlX3Rlc3RfZmxhZ3MoKTsKKworICAgICAgICAvLyBBbGwgdGVzdCBmbGFncyBhcmUgaW4gdGhlIHNhbWUgcGFja2FnZSwgc28gZmluZ2VycHJpbnQgZnJvbSBhbGwgb2YgdGhlbS4KKyAgICAgICAgbGV0IG11dCBleHRyYWN0ZWRfZmxhZ3MgPSBleHRyYWN0X2ZsYWdfbmFtZXMocGFyc2VkX2ZsYWdzLmNsb25lKCkpLnVud3JhcCgpOworICAgICAgICBsZXQgcmVzdWx0X2Zyb21fcGFyc2VkX2ZsYWdzID0gY29tcHV0ZV9mbGFnc19maW5nZXJwcmludCgmbXV0IGV4dHJhY3RlZF9mbGFncyk7CisKKyAgICAgICAgbGV0IG11dCBmbGFnX25hbWVzX3ZlYyA9IHBhcnNlZF9mbGFncworICAgICAgICAgICAgLnBhcnNlZF9mbGFnCisgICAgICAgICAgICAuY2xvbmUoKQorICAgICAgICAgICAgLmludG9faXRlcigpCisgICAgICAgICAgICAuZmlsdGVyKHNob3VsZF9pbmNsdWRlX2ZsYWcpCisgICAgICAgICAgICAubWFwKHxmbGFnfCBmbGFnLm5hbWUudW53cmFwKCkpCisgICAgICAgICAgICAubWFwKFN0cmluZzo6ZnJvbSkKKyAgICAgICAgICAgIC5jb2xsZWN0Ojo8VmVjPF8+PigpOworICAgICAgICBsZXQgcmVzdWx0X2Zyb21fbmFtZXMgPSBjb21wdXRlX2ZsYWdzX2ZpbmdlcnByaW50KCZtdXQgZmxhZ19uYW1lc192ZWMpOworCisgICAgICAgIC8vIEFzc2VydCB0aGUgc2FtZSBoYXNoIGlzIGdlbmVyYXRlZCBmb3IgZWFjaCBjYXNlLgorICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdF9mcm9tX3BhcnNlZF9mbGFncywgcmVzdWx0X2Zyb21fbmFtZXMpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X29mZnNldF9maW5nZXJwcmludF9kaWZmZXJlbnRfcGFja2FnZXNfZG9lc19ub3RfbWF0Y2goKSB7CisgICAgICAgIC8vIFBhcnNlIGZsYWdzIGZyb20gdHdvIHBhY2thZ2VzLgorICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzOiBQcm90b1BhcnNlZEZsYWdzID0gY3JhdGU6OnRlc3Q6OnBhcnNlX3Rlc3RfZmxhZ3MoKTsKKyAgICAgICAgbGV0IHNlY29uZF9wYXJzZWRfZmxhZ3MgPSBjcmF0ZTo6dGVzdDo6cGFyc2Vfc2Vjb25kX3BhY2thZ2VfZmxhZ3MoKTsKKworICAgICAgICBsZXQgbXV0IGV4dHJhY3RlZF9mbGFncyA9IGV4dHJhY3RfZmxhZ19uYW1lcyhwYXJzZWRfZmxhZ3MpLnVud3JhcCgpOworICAgICAgICBsZXQgcmVzdWx0X2Zyb21fcGFyc2VkX2ZsYWdzID0gY29tcHV0ZV9mbGFnc19maW5nZXJwcmludCgmbXV0IGV4dHJhY3RlZF9mbGFncyk7CisgICAgICAgIGxldCBtdXQgc2Vjb25kX2V4dHJhY3RlZF9mbGFncyA9IGV4dHJhY3RfZmxhZ19uYW1lcyhzZWNvbmRfcGFyc2VkX2ZsYWdzKS51bndyYXAoKTsKKyAgICAgICAgbGV0IHNlY29uZF9yZXN1bHQgPSBjb21wdXRlX2ZsYWdzX2ZpbmdlcnByaW50KCZtdXQgc2Vjb25kX2V4dHJhY3RlZF9mbGFncyk7CisKKyAgICAgICAgLy8gRGlmZmVyZW50IGZsYWdzIHNob3VsZCBoYXZlIGEgZGlmZmVyZW50IGZpbmdlcnByaW50LgorICAgICAgICBhc3NlcnRfbmUhKHJlc3VsdF9mcm9tX3BhcnNlZF9mbGFncywgc2Vjb25kX3Jlc3VsdCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfcGFyc2VfZmxhZ3MoKSB7CisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPSBjcmF0ZTo6dGVzdDo6cGFyc2VfdGVzdF9mbGFncygpOyAvLyBjYWxscyBwYXJzZV9mbGFncworICAgICAgICBhY29uZmlnX3Byb3Rvczo6cGFyc2VkX2ZsYWdzOjp2ZXJpZnlfZmllbGRzKCZwYXJzZWRfZmxhZ3MpLnVud3JhcCgpOworCisgICAgICAgIGxldCBlbmFibGVkX3JvID0KKyAgICAgICAgICAgIHBhcnNlZF9mbGFncy5wYXJzZWRfZmxhZy5pdGVyKCkuZmluZCh8cGZ8IHBmLm5hbWUoKSA9PSAiZW5hYmxlZF9ybyIpLnVud3JhcCgpOworICAgICAgICBhc3NlcnQhKGFjb25maWdfcHJvdG9zOjpwYXJzZWRfZmxhZzo6dmVyaWZ5X2ZpZWxkcyhlbmFibGVkX3JvKS5pc19vaygpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IiwgZW5hYmxlZF9yby5wYWNrYWdlKCkpOworICAgICAgICBhc3NlcnRfZXEhKCJlbmFibGVkX3JvIiwgZW5hYmxlZF9yby5uYW1lKCkpOworICAgICAgICBhc3NlcnRfZXEhKCJUaGlzIGZsYWcgaXMgRU5BQkxFRCArIFJFQURfT05MWSIsIGVuYWJsZWRfcm8uZGVzY3JpcHRpb24oKSk7CisgICAgICAgIGFzc2VydF9lcSEoUHJvdG9GbGFnU3RhdGU6OkVOQUJMRUQsIGVuYWJsZWRfcm8uc3RhdGUoKSk7CisgICAgICAgIGFzc2VydF9lcSEoUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9PTkxZLCBlbmFibGVkX3JvLnBlcm1pc3Npb24oKSk7CisgICAgICAgIGFzc2VydF9lcSEoUHJvdG9GbGFnUHVycG9zZTo6UFVSUE9TRV9CVUdGSVgsIGVuYWJsZWRfcm8ubWV0YWRhdGEucHVycG9zZSgpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgzLCBlbmFibGVkX3JvLnRyYWNlLmxlbigpKTsKKyAgICAgICAgYXNzZXJ0ISghZW5hYmxlZF9yby5pc19maXhlZF9yZWFkX29ubHkoKSk7CisgICAgICAgIGFzc2VydF9lcSEoInRlc3RzL3Rlc3QuYWNvbmZpZyIsIGVuYWJsZWRfcm8udHJhY2VbMF0uc291cmNlKCkpOworICAgICAgICBhc3NlcnRfZXEhKFByb3RvRmxhZ1N0YXRlOjpESVNBQkxFRCwgZW5hYmxlZF9yby50cmFjZVswXS5zdGF0ZSgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFLCBlbmFibGVkX3JvLnRyYWNlWzBdLnBlcm1pc3Npb24oKSk7CisgICAgICAgIGFzc2VydF9lcSEoInRlc3RzL2ZpcnN0LnZhbHVlcyIsIGVuYWJsZWRfcm8udHJhY2VbMV0uc291cmNlKCkpOworICAgICAgICBhc3NlcnRfZXEhKFByb3RvRmxhZ1N0YXRlOjpESVNBQkxFRCwgZW5hYmxlZF9yby50cmFjZVsxXS5zdGF0ZSgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFLCBlbmFibGVkX3JvLnRyYWNlWzFdLnBlcm1pc3Npb24oKSk7CisgICAgICAgIGFzc2VydF9lcSEoInRlc3RzL3NlY29uZC52YWx1ZXMiLCBlbmFibGVkX3JvLnRyYWNlWzJdLnNvdXJjZSgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShQcm90b0ZsYWdTdGF0ZTo6RU5BQkxFRCwgZW5hYmxlZF9yby50cmFjZVsyXS5zdGF0ZSgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX09OTFksIGVuYWJsZWRfcm8udHJhY2VbMl0ucGVybWlzc2lvbigpKTsKKworICAgICAgICBhc3NlcnRfZXEhKDksIHBhcnNlZF9mbGFncy5wYXJzZWRfZmxhZy5sZW4oKSk7CisgICAgICAgIGZvciBwZiBpbiBwYXJzZWRfZmxhZ3MucGFyc2VkX2ZsYWcuaXRlcigpIHsKKyAgICAgICAgICAgIGlmIHBmLm5hbWUoKS5zdGFydHNfd2l0aCgiZW5hYmxlZF9maXhlZF9ybyIpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxldCBmaXJzdCA9IHBmLnRyYWNlLmZpcnN0KCkudW53cmFwKCk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKERFRkFVTFRfRkxBR19TVEFURSwgZmlyc3Quc3RhdGUoKSk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKERFRkFVTFRfRkxBR19QRVJNSVNTSU9OLCBmaXJzdC5wZXJtaXNzaW9uKCkpOworCisgICAgICAgICAgICBsZXQgbGFzdCA9IHBmLnRyYWNlLmxhc3QoKS51bndyYXAoKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEocGYuc3RhdGUoKSwgbGFzdC5zdGF0ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEocGYucGVybWlzc2lvbigpLCBsYXN0LnBlcm1pc3Npb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBsZXQgZW5hYmxlZF9maXhlZF9ybyA9CisgICAgICAgICAgICBwYXJzZWRfZmxhZ3MucGFyc2VkX2ZsYWcuaXRlcigpLmZpbmQofHBmfCBwZi5uYW1lKCkgPT0gImVuYWJsZWRfZml4ZWRfcm8iKS51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0IShlbmFibGVkX2ZpeGVkX3JvLmlzX2ZpeGVkX3JlYWRfb25seSgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShQcm90b0ZsYWdTdGF0ZTo6RU5BQkxFRCwgZW5hYmxlZF9maXhlZF9yby5zdGF0ZSgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX09OTFksIGVuYWJsZWRfZml4ZWRfcm8ucGVybWlzc2lvbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgyLCBlbmFibGVkX2ZpeGVkX3JvLnRyYWNlLmxlbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX09OTFksIGVuYWJsZWRfZml4ZWRfcm8udHJhY2VbMF0ucGVybWlzc2lvbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX09OTFksIGVuYWJsZWRfZml4ZWRfcm8udHJhY2VbMV0ucGVybWlzc2lvbigpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9wYXJzZV9mbGFnc19zZXR0aW5nX2RlZmF1bHQoKSB7CisgICAgICAgIGxldCBmaXJzdF9mbGFnID0gciMiCisgICAgICAgIHBhY2thZ2U6ICJjb20uZmlyc3QiCisgICAgICAgIGZsYWcgeworICAgICAgICAgICAgbmFtZTogImZpcnN0IgorICAgICAgICAgICAgbmFtZXNwYWNlOiAiZmlyc3RfbnMiCisgICAgICAgICAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaXJzdCBmbGFnLiIKKyAgICAgICAgICAgIGJ1ZzogIjEyMyIKKyAgICAgICAgfQorICAgICAgICAiIzsKKyAgICAgICAgbGV0IGRlY2xhcmF0aW9uID0KKyAgICAgICAgICAgIHZlYyFbSW5wdXQgeyBzb3VyY2U6ICJtb21lcnkiLnRvX3N0cmluZygpLCByZWFkZXI6IEJveDo6bmV3KGZpcnN0X2ZsYWcuYXNfYnl0ZXMoKSkgfV07CisgICAgICAgIGxldCB2YWx1ZTogVmVjPElucHV0PiA9IHZlYyFbXTsKKworICAgICAgICBsZXQgZmxhZ3NfYnl0ZXMgPSBjcmF0ZTo6Y29tbWFuZHM6OnBhcnNlX2ZsYWdzKAorICAgICAgICAgICAgImNvbS5maXJzdCIsCisgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgZGVjbGFyYXRpb24sCisgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgIFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfT05MWSwKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcCgpOworICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0KKyAgICAgICAgICAgIGFjb25maWdfcHJvdG9zOjpwYXJzZWRfZmxhZ3M6OnRyeV9mcm9tX2JpbmFyeV9wcm90bygmZmxhZ3NfYnl0ZXMpLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKDEsIHBhcnNlZF9mbGFncy5wYXJzZWRfZmxhZy5sZW4oKSk7CisgICAgICAgIGxldCBwYXJzZWRfZmxhZyA9IHBhcnNlZF9mbGFncy5wYXJzZWRfZmxhZy5maXJzdCgpLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKFByb3RvRmxhZ1N0YXRlOjpESVNBQkxFRCwgcGFyc2VkX2ZsYWcuc3RhdGUoKSk7CisgICAgICAgIGFzc2VydF9lcSEoUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9PTkxZLCBwYXJzZWRfZmxhZy5wZXJtaXNzaW9uKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3BhcnNlX2ZsYWdzX3BhY2thZ2VfbWlzbWF0Y2hfYmV0d2Vlbl9kZWNsYXJhdGlvbl9hbmRfY29tbWFuZF9saW5lKCkgeworICAgICAgICBsZXQgZmlyc3RfZmxhZyA9IHIjIgorICAgICAgICBwYWNrYWdlOiAiY29tLmRlY2xhcmF0aW9uLnBhY2thZ2UiCisgICAgICAgIGNvbnRhaW5lcjogImZpcnN0LmNvbnRhaW5lciIKKyAgICAgICAgZmxhZyB7CisgICAgICAgICAgICBuYW1lOiAiZmlyc3QiCisgICAgICAgICAgICBuYW1lc3BhY2U6ICJmaXJzdF9ucyIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGZpcnN0IGZsYWcuIgorICAgICAgICAgICAgYnVnOiAiMTIzIgorICAgICAgICB9CisgICAgICAgICIjOworICAgICAgICBsZXQgZGVjbGFyYXRpb24gPQorICAgICAgICAgICAgdmVjIVtJbnB1dCB7IHNvdXJjZTogIm1lbW9yeSIudG9fc3RyaW5nKCksIHJlYWRlcjogQm94OjpuZXcoZmlyc3RfZmxhZy5hc19ieXRlcygpKSB9XTsKKworICAgICAgICBsZXQgdmFsdWU6IFZlYzxJbnB1dD4gPSB2ZWMhW107CisKKyAgICAgICAgbGV0IGVycm9yID0gY3JhdGU6OmNvbW1hbmRzOjpwYXJzZV9mbGFncygKKyAgICAgICAgICAgICJjb20uYXJndW1lbnQucGFja2FnZSIsCisgICAgICAgICAgICBTb21lKCJmaXJzdC5jb250YWluZXIiKSwKKyAgICAgICAgICAgIGRlY2xhcmF0aW9uLAorICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFLAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgKQorICAgICAgICAudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVycm9yKSwKKyAgICAgICAgICAgICJmYWlsZWQgdG8gcGFyc2UgbWVtb3J5OiBleHBlY3RlZCBwYWNrYWdlIGNvbS5hcmd1bWVudC5wYWNrYWdlLCBnb3QgY29tLmRlY2xhcmF0aW9uLnBhY2thZ2UiCisgICAgICAgICk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfcGFyc2VfZmxhZ3NfY29udGFpbmVyX21pc21hdGNoX2JldHdlZW5fZGVjbGFyYXRpb25fYW5kX2NvbW1hbmRfbGluZSgpIHsKKyAgICAgICAgbGV0IGZpcnN0X2ZsYWcgPSByIyIKKyAgICAgICAgcGFja2FnZTogImNvbS5maXJzdCIKKyAgICAgICAgY29udGFpbmVyOiAiZGVjbGFyYXRpb24uY29udGFpbmVyIgorICAgICAgICBmbGFnIHsKKyAgICAgICAgICAgIG5hbWU6ICJmaXJzdCIKKyAgICAgICAgICAgIG5hbWVzcGFjZTogImZpcnN0X25zIgorICAgICAgICAgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlyc3QgZmxhZy4iCisgICAgICAgICAgICBidWc6ICIxMjMiCisgICAgICAgIH0KKyAgICAgICAgIiM7CisgICAgICAgIGxldCBkZWNsYXJhdGlvbiA9CisgICAgICAgICAgICB2ZWMhW0lucHV0IHsgc291cmNlOiAibWVtb3J5Ii50b19zdHJpbmcoKSwgcmVhZGVyOiBCb3g6Om5ldyhmaXJzdF9mbGFnLmFzX2J5dGVzKCkpIH1dOworCisgICAgICAgIGxldCB2YWx1ZTogVmVjPElucHV0PiA9IHZlYyFbXTsKKworICAgICAgICBsZXQgZXJyb3IgPSBjcmF0ZTo6Y29tbWFuZHM6OnBhcnNlX2ZsYWdzKAorICAgICAgICAgICAgImNvbS5maXJzdCIsCisgICAgICAgICAgICBTb21lKCJhcmd1bWVudC5jb250YWluZXIiKSwKKyAgICAgICAgICAgIGRlY2xhcmF0aW9uLAorICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFLAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgKQorICAgICAgICAudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVycm9yKSwKKyAgICAgICAgICAgICJmYWlsZWQgdG8gcGFyc2UgbWVtb3J5OiBleHBlY3RlZCBjb250YWluZXIgYXJndW1lbnQuY29udGFpbmVyLCBnb3QgZGVjbGFyYXRpb24uY29udGFpbmVyIgorICAgICAgICApOworICAgIH0KKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9wYXJzZV9mbGFnc19ub19hbGxvd19yZWFkX3dyaXRlX2RlZmF1bHRfZXJyb3IoKSB7CisgICAgICAgIGxldCBmaXJzdF9mbGFnID0gciMiCisgICAgICAgIHBhY2thZ2U6ICJjb20uZmlyc3QiCisgICAgICAgIGNvbnRhaW5lcjogImNvbS5maXJzdC5jb250YWluZXIiCisgICAgICAgIGZsYWcgeworICAgICAgICAgICAgbmFtZTogImZpcnN0IgorICAgICAgICAgICAgbmFtZXNwYWNlOiAiZmlyc3RfbnMiCisgICAgICAgICAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaXJzdCBmbGFnLiIKKyAgICAgICAgICAgIGJ1ZzogIjEyMyIKKyAgICAgICAgfQorICAgICAgICAiIzsKKyAgICAgICAgbGV0IGRlY2xhcmF0aW9uID0KKyAgICAgICAgICAgIHZlYyFbSW5wdXQgeyBzb3VyY2U6ICJtZW1vcnkiLnRvX3N0cmluZygpLCByZWFkZXI6IEJveDo6bmV3KGZpcnN0X2ZsYWcuYXNfYnl0ZXMoKSkgfV07CisKKyAgICAgICAgbGV0IGVycm9yID0gY3JhdGU6OmNvbW1hbmRzOjpwYXJzZV9mbGFncygKKyAgICAgICAgICAgICJjb20uZmlyc3QiLAorICAgICAgICAgICAgU29tZSgiY29tLmZpcnN0LmNvbnRhaW5lciIpLAorICAgICAgICAgICAgZGVjbGFyYXRpb24sCisgICAgICAgICAgICB2ZWMhW10sCisgICAgICAgICAgICBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFLAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcF9lcnIoKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIGZvcm1hdCEoIns6P30iLCBlcnJvciksCisgICAgICAgICAgICAiZmxhZyBmaXJzdCBoYXMgcGVybWlzc2lvbiBSRUFEX1dSSVRFLCBidXQgYWxsb3dfcmVhZF93cml0ZSBpcyBmYWxzZSIKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9wYXJzZV9mbGFnc19ub19hbGxvd19yZWFkX3dyaXRlX3ZhbHVlX2Vycm9yKCkgeworICAgICAgICBsZXQgZmlyc3RfZmxhZyA9IHIjIgorICAgICAgICBwYWNrYWdlOiAiY29tLmZpcnN0IgorICAgICAgICBjb250YWluZXI6ICJjb20uZmlyc3QuY29udGFpbmVyIgorICAgICAgICBmbGFnIHsKKyAgICAgICAgICAgIG5hbWU6ICJmaXJzdCIKKyAgICAgICAgICAgIG5hbWVzcGFjZTogImZpcnN0X25zIgorICAgICAgICAgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlyc3QgZmxhZy4iCisgICAgICAgICAgICBidWc6ICIxMjMiCisgICAgICAgIH0KKyAgICAgICAgIiM7CisgICAgICAgIGxldCBkZWNsYXJhdGlvbiA9CisgICAgICAgICAgICB2ZWMhW0lucHV0IHsgc291cmNlOiAibWVtb3J5Ii50b19zdHJpbmcoKSwgcmVhZGVyOiBCb3g6Om5ldyhmaXJzdF9mbGFnLmFzX2J5dGVzKCkpIH1dOworCisgICAgICAgIGxldCBmaXJzdF9mbGFnX3ZhbHVlID0gciMiCisgICAgICAgIGZsYWdfdmFsdWUgeworICAgICAgICAgICAgcGFja2FnZTogImNvbS5maXJzdCIKKyAgICAgICAgICAgIG5hbWU6ICJmaXJzdCIKKyAgICAgICAgICAgIHN0YXRlOiBESVNBQkxFRAorICAgICAgICAgICAgcGVybWlzc2lvbjogUkVBRF9XUklURQorICAgICAgICB9CisgICAgICAgICIjOworICAgICAgICBsZXQgdmFsdWUgPSB2ZWMhW0lucHV0IHsKKyAgICAgICAgICAgIHNvdXJjZTogIm1lbW9yeSIudG9fc3RyaW5nKCksCisgICAgICAgICAgICByZWFkZXI6IEJveDo6bmV3KGZpcnN0X2ZsYWdfdmFsdWUuYXNfYnl0ZXMoKSksCisgICAgICAgIH1dOworICAgICAgICBsZXQgZXJyb3IgPSBjcmF0ZTo6Y29tbWFuZHM6OnBhcnNlX2ZsYWdzKAorICAgICAgICAgICAgImNvbS5maXJzdCIsCisgICAgICAgICAgICBTb21lKCJjb20uZmlyc3QuY29udGFpbmVyIiksCisgICAgICAgICAgICBkZWNsYXJhdGlvbiwKKyAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9PTkxZLAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcF9lcnIoKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIGZvcm1hdCEoIns6P30iLCBlcnJvciksCisgICAgICAgICAgICAiZmxhZyBmaXJzdCBoYXMgcGVybWlzc2lvbiBSRUFEX1dSSVRFLCBidXQgYWxsb3dfcmVhZF93cml0ZSBpcyBmYWxzZSIKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9wYXJzZV9mbGFnc19ub19hbGxvd19yZWFkX3dyaXRlX3N1Y2Nlc3MoKSB7CisgICAgICAgIGxldCBmaXJzdF9mbGFnID0gciMiCisgICAgICAgIHBhY2thZ2U6ICJjb20uZmlyc3QiCisgICAgICAgIGNvbnRhaW5lcjogImNvbS5maXJzdC5jb250YWluZXIiCisgICAgICAgIGZsYWcgeworICAgICAgICAgICAgbmFtZTogImZpcnN0IgorICAgICAgICAgICAgbmFtZXNwYWNlOiAiZmlyc3RfbnMiCisgICAgICAgICAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaXJzdCBmbGFnLiIKKyAgICAgICAgICAgIGJ1ZzogIjEyMyIKKyAgICAgICAgfQorICAgICAgICAiIzsKKyAgICAgICAgbGV0IGRlY2xhcmF0aW9uID0KKyAgICAgICAgICAgIHZlYyFbSW5wdXQgeyBzb3VyY2U6ICJtZW1vcnkiLnRvX3N0cmluZygpLCByZWFkZXI6IEJveDo6bmV3KGZpcnN0X2ZsYWcuYXNfYnl0ZXMoKSkgfV07CisKKyAgICAgICAgbGV0IGZpcnN0X2ZsYWdfdmFsdWUgPSByIyIKKyAgICAgICAgZmxhZ192YWx1ZSB7CisgICAgICAgICAgICBwYWNrYWdlOiAiY29tLmZpcnN0IgorICAgICAgICAgICAgbmFtZTogImZpcnN0IgorICAgICAgICAgICAgc3RhdGU6IERJU0FCTEVECisgICAgICAgICAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgICAgICAgfQorICAgICAgICAiIzsKKyAgICAgICAgbGV0IHZhbHVlID0gdmVjIVtJbnB1dCB7CisgICAgICAgICAgICBzb3VyY2U6ICJtZW1vcnkiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgcmVhZGVyOiBCb3g6Om5ldyhmaXJzdF9mbGFnX3ZhbHVlLmFzX2J5dGVzKCkpLAorICAgICAgICB9XTsKKyAgICAgICAgbGV0IGZsYWdzX2J5dGVzID0gY3JhdGU6OmNvbW1hbmRzOjpwYXJzZV9mbGFncygKKyAgICAgICAgICAgICJjb20uZmlyc3QiLAorICAgICAgICAgICAgU29tZSgiY29tLmZpcnN0LmNvbnRhaW5lciIpLAorICAgICAgICAgICAgZGVjbGFyYXRpb24sCisgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgIFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfT05MWSwKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICApCisgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IHBhcnNlZF9mbGFncyA9CisgICAgICAgICAgICBhY29uZmlnX3Byb3Rvczo6cGFyc2VkX2ZsYWdzOjp0cnlfZnJvbV9iaW5hcnlfcHJvdG8oJmZsYWdzX2J5dGVzKS51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxISgxLCBwYXJzZWRfZmxhZ3MucGFyc2VkX2ZsYWcubGVuKCkpOworICAgICAgICBsZXQgcGFyc2VkX2ZsYWcgPSBwYXJzZWRfZmxhZ3MucGFyc2VkX2ZsYWcuZmlyc3QoKS51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxIShQcm90b0ZsYWdTdGF0ZTo6RElTQUJMRUQsIHBhcnNlZF9mbGFnLnN0YXRlKCkpOworICAgICAgICBhc3NlcnRfZXEhKFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfT05MWSwgcGFyc2VkX2ZsYWcucGVybWlzc2lvbigpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9wYXJzZV9mbGFnc19vdmVycmlkZV9maXhlZF9yZWFkX29ubHkoKSB7CisgICAgICAgIGxldCBmaXJzdF9mbGFnID0gciMiCisgICAgICAgIHBhY2thZ2U6ICJjb20uZmlyc3QiCisgICAgICAgIGNvbnRhaW5lcjogImNvbS5maXJzdC5jb250YWluZXIiCisgICAgICAgIGZsYWcgeworICAgICAgICAgICAgbmFtZTogImZpcnN0IgorICAgICAgICAgICAgbmFtZXNwYWNlOiAiZmlyc3RfbnMiCisgICAgICAgICAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaXJzdCBmbGFnLiIKKyAgICAgICAgICAgIGJ1ZzogIjEyMyIKKyAgICAgICAgICAgIGlzX2ZpeGVkX3JlYWRfb25seTogdHJ1ZQorICAgICAgICB9CisgICAgICAgICIjOworICAgICAgICBsZXQgZGVjbGFyYXRpb24gPQorICAgICAgICAgICAgdmVjIVtJbnB1dCB7IHNvdXJjZTogIm1lbW9yeSIudG9fc3RyaW5nKCksIHJlYWRlcjogQm94OjpuZXcoZmlyc3RfZmxhZy5hc19ieXRlcygpKSB9XTsKKworICAgICAgICBsZXQgZmlyc3RfZmxhZ192YWx1ZSA9IHIjIgorICAgICAgICBmbGFnX3ZhbHVlIHsKKyAgICAgICAgICAgIHBhY2thZ2U6ICJjb20uZmlyc3QiCisgICAgICAgICAgICBuYW1lOiAiZmlyc3QiCisgICAgICAgICAgICBzdGF0ZTogRElTQUJMRUQKKyAgICAgICAgICAgIHBlcm1pc3Npb246IFJFQURfV1JJVEUKKyAgICAgICAgfQorICAgICAgICAiIzsKKyAgICAgICAgbGV0IHZhbHVlID0gdmVjIVtJbnB1dCB7CisgICAgICAgICAgICBzb3VyY2U6ICJtZW1vcnkiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgcmVhZGVyOiBCb3g6Om5ldyhmaXJzdF9mbGFnX3ZhbHVlLmFzX2J5dGVzKCkpLAorICAgICAgICB9XTsKKyAgICAgICAgbGV0IGVycm9yID0gY3JhdGU6OmNvbW1hbmRzOjpwYXJzZV9mbGFncygKKyAgICAgICAgICAgICJjb20uZmlyc3QiLAorICAgICAgICAgICAgU29tZSgiY29tLmZpcnN0LmNvbnRhaW5lciIpLAorICAgICAgICAgICAgZGVjbGFyYXRpb24sCisgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgIFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfV1JJVEUsCisgICAgICAgICAgICB0cnVlLAorICAgICAgICApCisgICAgICAgIC51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLAorICAgICAgICAgICAgImZhaWxlZCB0byBzZXQgcGVybWlzc2lvbiBvZiBmbGFnIGZpcnN0LCBzaW5jZSB0aGlzIGZsYWcgaXMgZml4ZWQgcmVhZCBvbmx5IGZsYWciCisgICAgICAgICk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfcGFyc2VfZmxhZ3NfbWV0YWRhdGEoKSB7CisgICAgICAgIGxldCBtZXRhZGF0YV9mbGFnID0gciMiCisgICAgICAgIHBhY2thZ2U6ICJjb20uZmlyc3QiCisgICAgICAgIGZsYWcgeworICAgICAgICAgICAgbmFtZTogImZpcnN0IgorICAgICAgICAgICAgbmFtZXNwYWNlOiAiZmlyc3RfbnMiCisgICAgICAgICAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgZmVhdHVyZSBmbGFnLiIKKyAgICAgICAgICAgIGJ1ZzogIjEyMyIKKyAgICAgICAgICAgIG1ldGFkYXRhIHsKKyAgICAgICAgICAgICAgICBwdXJwb3NlOiBQVVJQT1NFX0ZFQVRVUkUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAiIzsKKyAgICAgICAgbGV0IGRlY2xhcmF0aW9uID0gdmVjIVtJbnB1dCB7CisgICAgICAgICAgICBzb3VyY2U6ICJtZW1vcnkiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgcmVhZGVyOiBCb3g6Om5ldyhtZXRhZGF0YV9mbGFnLmFzX2J5dGVzKCkpLAorICAgICAgICB9XTsKKyAgICAgICAgbGV0IHZhbHVlOiBWZWM8SW5wdXQ+ID0gdmVjIVtdOworCisgICAgICAgIGxldCBmbGFnc19ieXRlcyA9IGNyYXRlOjpjb21tYW5kczo6cGFyc2VfZmxhZ3MoCisgICAgICAgICAgICAiY29tLmZpcnN0IiwKKyAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICBkZWNsYXJhdGlvbiwKKyAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9PTkxZLAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgKQorICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPQorICAgICAgICAgICAgYWNvbmZpZ19wcm90b3M6OnBhcnNlZF9mbGFnczo6dHJ5X2Zyb21fYmluYXJ5X3Byb3RvKCZmbGFnc19ieXRlcykudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEoMSwgcGFyc2VkX2ZsYWdzLnBhcnNlZF9mbGFnLmxlbigpKTsKKyAgICAgICAgbGV0IHBhcnNlZF9mbGFnID0gcGFyc2VkX2ZsYWdzLnBhcnNlZF9mbGFnLmZpcnN0KCkudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEoUHJvdG9GbGFnUHVycG9zZTo6UFVSUE9TRV9GRUFUVVJFLCBwYXJzZWRfZmxhZy5tZXRhZGF0YS5wdXJwb3NlKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2NyZWF0ZV9kZXZpY2VfY29uZmlnX2RlZmF1bHRzKCkgeworICAgICAgICBsZXQgaW5wdXQgPSBwYXJzZV90ZXN0X2ZsYWdzX2FzX2lucHV0KCk7CisgICAgICAgIGxldCBieXRlcyA9IGNyZWF0ZV9kZXZpY2VfY29uZmlnX2RlZmF1bHRzKGlucHV0KS51bndyYXAoKTsKKyAgICAgICAgbGV0IHRleHQgPSBzdGQ6OnN0cjo6ZnJvbV91dGY4KCZieXRlcykudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEoImFjb25maWdfdGVzdDpjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcnc9ZGlzYWJsZWRcbmFjb25maWdfdGVzdDpjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcndfZXhwb3J0ZWQ9ZGlzYWJsZWRcbm90aGVyX25hbWVzcGFjZTpjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlPWRpc2FibGVkXG5hY29uZmlnX3Rlc3Q6Y29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcnc9ZW5hYmxlZFxuIiwgdGV4dCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfY3JlYXRlX2RldmljZV9jb25maWdfc3lzcHJvcHMoKSB7CisgICAgICAgIGxldCBpbnB1dCA9IHBhcnNlX3Rlc3RfZmxhZ3NfYXNfaW5wdXQoKTsKKyAgICAgICAgbGV0IGJ5dGVzID0gY3JlYXRlX2RldmljZV9jb25maWdfc3lzcHJvcHMoaW5wdXQpLnVud3JhcCgpOworICAgICAgICBsZXQgdGV4dCA9IHN0ZDo6c3RyOjpmcm9tX3V0ZjgoJmJ5dGVzKS51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxISgicGVyc2lzdC5kZXZpY2VfY29uZmlnLmNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9ydz1mYWxzZVxucGVyc2lzdC5kZXZpY2VfY29uZmlnLmNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19leHBvcnRlZD1mYWxzZVxucGVyc2lzdC5kZXZpY2VfY29uZmlnLmNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2U9ZmFsc2VcbnBlcnNpc3QuZGV2aWNlX2NvbmZpZy5jb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9ydz10cnVlXG4iLCB0ZXh0KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9kdW1wKCkgeworICAgICAgICBsZXQgaW5wdXQgPSBwYXJzZV90ZXN0X2ZsYWdzX2FzX2lucHV0KCk7CisgICAgICAgIGxldCBieXRlcyA9IGR1bXBfcGFyc2VkX2ZsYWdzKAorICAgICAgICAgICAgdmVjIVtpbnB1dF0sCisgICAgICAgICAgICBEdW1wRm9ybWF0OjpDdXN0b20oIntmdWxseV9xdWFsaWZpZWRfbmFtZX0iLnRvX3N0cmluZygpKSwKKyAgICAgICAgICAgICZbXSwKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICApCisgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IHRleHQgPSBzdGQ6OnN0cjo6ZnJvbV91dGY4KCZieXRlcykudW53cmFwKCk7CisgICAgICAgIGFzc2VydCEodGV4dC5jb250YWlucygiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3JvIikpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2R1bXBfbXVsdGlwbGVfZmlsdGVycygpIHsKKyAgICAgICAgbGV0IGlucHV0ID0gcGFyc2VfdGVzdF9mbGFnc19hc19pbnB1dCgpOworICAgICAgICBsZXQgYnl0ZXMgPSBkdW1wX3BhcnNlZF9mbGFncygKKyAgICAgICAgICAgIHZlYyFbaW5wdXRdLAorICAgICAgICAgICAgRHVtcEZvcm1hdDo6Q3VzdG9tKCJ7ZnVsbHlfcXVhbGlmaWVkX25hbWV9Ii50b19zdHJpbmcoKSksCisgICAgICAgICAgICAmWyJjb250YWluZXI6c3lzdGVtK3N0YXRlOkVOQUJMRUQiLCAiY29udGFpbmVyOnN5c3RlbStwZXJtaXNzaW9uOlJFQURfV1JJVEUiXSwKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICApCisgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IHRleHQgPSBzdGQ6OnN0cjo6ZnJvbV91dGY4KCZieXRlcykudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9mbGFnX2xpc3QgPSAmWworICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9ydyIsCisgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2V4cG9ydGVkIiwKKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlIiwKKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9maXhlZF9ybyIsCisgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQiLAorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3JvIiwKKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9yb19leHBvcnRlZCIsCisgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcnciLAorICAgICAgICBdOworICAgICAgICBhc3NlcnRfZXEhKGV4cGVjdGVkX2ZsYWdfbGlzdC5tYXAofHN8IGZvcm1hdCEoInt9XG4iLCBzKSkuam9pbigiIiksIHRleHQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2R1bXBfdGV4dHByb3RvX2Zvcm1hdF9kZWR1cCgpIHsKKyAgICAgICAgbGV0IGlucHV0ID0gcGFyc2VfdGVzdF9mbGFnc19hc19pbnB1dCgpOworICAgICAgICBsZXQgaW5wdXQyID0gcGFyc2VfdGVzdF9mbGFnc19hc19pbnB1dCgpOworICAgICAgICBsZXQgYnl0ZXMgPQorICAgICAgICAgICAgZHVtcF9wYXJzZWRfZmxhZ3ModmVjIVtpbnB1dCwgaW5wdXQyXSwgRHVtcEZvcm1hdDo6VGV4dHByb3RvLCAmW10sIHRydWUpLnVud3JhcCgpOworICAgICAgICBsZXQgdGV4dCA9IHN0ZDo6c3RyOjpmcm9tX3V0ZjgoJmJ5dGVzKS51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICBjcmF0ZTo6dGVzdDo6Zmlyc3Rfc2lnbmlmaWNhbnRfY29kZV9kaWZmKAorICAgICAgICAgICAgICAgIGNyYXRlOjp0ZXN0OjpURVNUX0ZMQUdTX1RFWFRQUk9UTy50cmltKCksCisgICAgICAgICAgICAgICAgdGV4dC50cmltKCkKKyAgICAgICAgICAgICkKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBmbiBwYXJzZV90ZXN0X2ZsYWdzX2FzX2lucHV0KCkgLT4gSW5wdXQgeworICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0gY3JhdGU6OnRlc3Q6OnBhcnNlX3Rlc3RfZmxhZ3MoKTsKKyAgICAgICAgbGV0IGJpbmFyeV9wcm90byA9IHBhcnNlZF9mbGFncy53cml0ZV90b19ieXRlcygpLnVud3JhcCgpOworICAgICAgICBsZXQgY3Vyc29yID0gc3RkOjppbzo6Q3Vyc29yOjpuZXcoYmluYXJ5X3Byb3RvKTsKKyAgICAgICAgbGV0IHJlYWRlciA9IEJveDo6bmV3KGN1cnNvcik7CisgICAgICAgIElucHV0IHsgc291cmNlOiAidGVzdC5kYXRhIi50b19zdHJpbmcoKSwgcmVhZGVyIH0KKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9tb2RpZnlfcGFyc2VkX2ZsYWdzX2Jhc2VkX29uX21vZGVfcHJvZCgpIHsKKyAgICAgICAgbGV0IHBhcnNlZF9mbGFncyA9IGNyYXRlOjp0ZXN0OjpwYXJzZV90ZXN0X2ZsYWdzKCk7CisgICAgICAgIGxldCBwX3BhcnNlZF9mbGFncyA9CisgICAgICAgICAgICBtb2RpZnlfcGFyc2VkX2ZsYWdzX2Jhc2VkX29uX21vZGUocGFyc2VkX2ZsYWdzLmNsb25lKCksIENvZGVnZW5Nb2RlOjpQcm9kdWN0aW9uKQorICAgICAgICAgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYXJzZWRfZmxhZ3MucGFyc2VkX2ZsYWcubGVuKCksIHBfcGFyc2VkX2ZsYWdzLmxlbigpKTsKKyAgICAgICAgZm9yIChpLCBpdGVtKSBpbiBwX3BhcnNlZF9mbGFncy5pdGVyKCkuZW51bWVyYXRlKCkgeworICAgICAgICAgICAgYXNzZXJ0IShwYXJzZWRfZmxhZ3MucGFyc2VkX2ZsYWdbaV0uZXEoaXRlbSkpOworICAgICAgICB9CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfbW9kaWZ5X3BhcnNlZF9mbGFnc19iYXNlZF9vbl9tb2RlX2V4cG9ydGVkKCkgeworICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0gY3JhdGU6OnRlc3Q6OnBhcnNlX3Rlc3RfZmxhZ3MoKTsKKyAgICAgICAgbGV0IHBfcGFyc2VkX2ZsYWdzID0KKyAgICAgICAgICAgIG1vZGlmeV9wYXJzZWRfZmxhZ3NfYmFzZWRfb25fbW9kZShwYXJzZWRfZmxhZ3MsIENvZGVnZW5Nb2RlOjpFeHBvcnRlZCkudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEoMywgcF9wYXJzZWRfZmxhZ3MubGVuKCkpOworICAgICAgICBmb3IgZmxhZyBpbiBwX3BhcnNlZF9mbGFncy5pdGVyKCkgeworICAgICAgICAgICAgYXNzZXJ0X2VxIShQcm90b0ZsYWdTdGF0ZTo6RElTQUJMRUQsIGZsYWcuc3RhdGUoKSk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfV1JJVEUsIGZsYWcucGVybWlzc2lvbigpKTsKKyAgICAgICAgICAgIGFzc2VydCEoIWZsYWcuaXNfZml4ZWRfcmVhZF9vbmx5KCkpOworICAgICAgICAgICAgYXNzZXJ0IShmbGFnLmlzX2V4cG9ydGVkKCkpOworICAgICAgICB9CisKKyAgICAgICAgbGV0IG11dCBwYXJzZWRfZmxhZ3MgPSBjcmF0ZTo6dGVzdDo6cGFyc2VfdGVzdF9mbGFncygpOworICAgICAgICBwYXJzZWRfZmxhZ3MucGFyc2VkX2ZsYWcucmV0YWluKHxwZnwgIXBmLmlzX2V4cG9ydGVkKCkpOworICAgICAgICBsZXQgZXJyb3IgPQorICAgICAgICAgICAgbW9kaWZ5X3BhcnNlZF9mbGFnc19iYXNlZF9vbl9tb2RlKHBhcnNlZF9mbGFncywgQ29kZWdlbk1vZGU6OkV4cG9ydGVkKS51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoImV4cG9ydGVkIGxpYnJhcnkgY29udGFpbnMgbm8gZXhwb3J0ZWQgZmxhZ3MiLCBmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9hc3NpZ25fZmxhZ19pZHMoKSB7CisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPSBjcmF0ZTo6dGVzdDo6cGFyc2VfdGVzdF9mbGFncygpOworICAgICAgICBsZXQgcGFja2FnZSA9IGZpbmRfdW5pcXVlX3BhY2thZ2UoJnBhcnNlZF9mbGFncy5wYXJzZWRfZmxhZykudW53cmFwKCkudG9fc3RyaW5nKCk7CisgICAgICAgIGxldCBmbGFnX2lkcyA9IGFzc2lnbl9mbGFnX2lkcygmcGFja2FnZSwgcGFyc2VkX2ZsYWdzLnBhcnNlZF9mbGFnLml0ZXIoKSkudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9mbGFnX2lkcyA9IEhhc2hNYXA6OmZyb20oWworICAgICAgICAgICAgKFN0cmluZzo6ZnJvbSgiZGlzYWJsZWRfcnciKSwgMF91MTYpLAorICAgICAgICAgICAgKFN0cmluZzo6ZnJvbSgiZGlzYWJsZWRfcndfZXhwb3J0ZWQiKSwgMV91MTYpLAorICAgICAgICAgICAgKFN0cmluZzo6ZnJvbSgiZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlIiksIDJfdTE2KSwKKyAgICAgICAgICAgIChTdHJpbmc6OmZyb20oImVuYWJsZWRfZml4ZWRfcm8iKSwgM191MTYpLAorICAgICAgICAgICAgKFN0cmluZzo6ZnJvbSgiZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCIpLCA0X3UxNiksCisgICAgICAgICAgICAoU3RyaW5nOjpmcm9tKCJlbmFibGVkX3JvIiksIDVfdTE2KSwKKyAgICAgICAgICAgIChTdHJpbmc6OmZyb20oImVuYWJsZWRfcm9fZXhwb3J0ZWQiKSwgNl91MTYpLAorICAgICAgICAgICAgKFN0cmluZzo6ZnJvbSgiZW5hYmxlZF9ydyIpLCA3X3UxNiksCisgICAgICAgIF0pOworICAgICAgICBhc3NlcnRfZXEhKGZsYWdfaWRzLCBleHBlY3RlZF9mbGFnX2lkcyk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfbW9kaWZ5X3BhcnNlZF9mbGFnc19iYXNlZF9vbl9tb2RlX2ZvcmNlX3JlYWRfb25seSgpIHsKKyAgICAgICAgbGV0IHBhcnNlZF9mbGFncyA9IGNyYXRlOjp0ZXN0OjpwYXJzZV90ZXN0X2ZsYWdzKCk7CisgICAgICAgIGxldCBwX3BhcnNlZF9mbGFncyA9CisgICAgICAgICAgICBtb2RpZnlfcGFyc2VkX2ZsYWdzX2Jhc2VkX29uX21vZGUocGFyc2VkX2ZsYWdzLmNsb25lKCksIENvZGVnZW5Nb2RlOjpGb3JjZVJlYWRPbmx5KQorICAgICAgICAgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxISg2LCBwX3BhcnNlZF9mbGFncy5sZW4oKSk7CisgICAgICAgIGZvciBwZiBpbiBwX3BhcnNlZF9mbGFncyB7CisgICAgICAgICAgICBhc3NlcnRfZXEhKFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfT05MWSwgcGYucGVybWlzc2lvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGxldCBtdXQgcGFyc2VkX2ZsYWdzID0gY3JhdGU6OnRlc3Q6OnBhcnNlX3Rlc3RfZmxhZ3MoKTsKKyAgICAgICAgcGFyc2VkX2ZsYWdzLnBhcnNlZF9mbGFnLnJldGFpbl9tdXQofHBmfCBwZi5pc19leHBvcnRlZCgpKTsKKyAgICAgICAgbGV0IGVycm9yID0gbW9kaWZ5X3BhcnNlZF9mbGFnc19iYXNlZF9vbl9tb2RlKHBhcnNlZF9mbGFncywgQ29kZWdlbk1vZGU6OkZvcmNlUmVhZE9ubHkpCisgICAgICAgICAgICAudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgImZvcmNlLXJlYWQtb25seSBsaWJyYXJ5IGNvbnRhaW5zIG5vIGZvcmNlLXJlYWQtb25seSBmbGFncyIsCisgICAgICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpCisgICAgICAgICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9kdW1wLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9kdW1wLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMjljMmIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2R1bXAucnMKQEAgLTAsMCArMSw0MDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2UgYWNvbmZpZ19wcm90b3M6OnsKKyAgICBQYXJzZWRGbGFnRXh0LCBQcm90b0ZsYWdNZXRhZGF0YSwgUHJvdG9GbGFnUGVybWlzc2lvbiwgUHJvdG9GbGFnU3RhdGUsIFByb3RvVHJhY2Vwb2ludCwKK307Cit1c2UgYWNvbmZpZ19wcm90b3M6OntQcm90b1BhcnNlZEZsYWcsIFByb3RvUGFyc2VkRmxhZ3N9OwordXNlIGFueWhvdzo6e2FueWhvdywgYmFpbCwgQ29udGV4dCwgUmVzdWx0fTsKK3VzZSBwcm90b2J1Zjo6TWVzc2FnZTsKKworI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBQYXJ0aWFsRXEsIEVxKV0KK3B1YiBlbnVtIER1bXBGb3JtYXQgeworICAgIFByb3RvYnVmLAorICAgIFRleHRwcm90bywKKyAgICBDdXN0b20oU3RyaW5nKSwKK30KKworaW1wbCBUcnlGcm9tPCZzdHI+IGZvciBEdW1wRm9ybWF0IHsKKyAgICB0eXBlIEVycm9yID0gYW55aG93OjpFcnJvcjsKKworICAgIGZuIHRyeV9mcm9tKHZhbHVlOiAmc3RyKSAtPiBzdGQ6OnJlc3VsdDo6UmVzdWx0PFNlbGYsIFNlbGY6OkVycm9yPiB7CisgICAgICAgIG1hdGNoIHZhbHVlIHsKKyAgICAgICAgICAgIC8vIHByb3RvYnVmIGZvcm1hdHMKKyAgICAgICAgICAgICJwcm90b2J1ZiIgPT4gT2soU2VsZjo6UHJvdG9idWYpLAorICAgICAgICAgICAgInRleHRwcm90byIgPT4gT2soU2VsZjo6VGV4dHByb3RvKSwKKyAgICAgICAgICAgIC8vIGN1c3RvbSBmb3JtYXQKKyAgICAgICAgICAgIF8gPT4gT2soU2VsZjo6Q3VzdG9tKHZhbHVlLnRvX293bmVkKCkpKSwKKyAgICAgICAgfQorICAgIH0KK30KKworcHViIGZuIGR1bXBfcGFyc2VkX2ZsYWdzPEk+KHBhcnNlZF9mbGFnc19pdGVyOiBJLCBmb3JtYXQ6IER1bXBGb3JtYXQpIC0+IFJlc3VsdDxWZWM8dTg+Pgord2hlcmUKKyAgICBJOiBJdGVyYXRvcjxJdGVtID0gUHJvdG9QYXJzZWRGbGFnPiwKK3sKKyAgICBsZXQgbXV0IG91dHB1dCA9IFZlYzo6bmV3KCk7CisgICAgbWF0Y2ggZm9ybWF0IHsKKyAgICAgICAgRHVtcEZvcm1hdDo6UHJvdG9idWYgPT4geworICAgICAgICAgICAgbGV0IHBhcnNlZF9mbGFncyA9CisgICAgICAgICAgICAgICAgUHJvdG9QYXJzZWRGbGFncyB7IHBhcnNlZF9mbGFnOiBwYXJzZWRfZmxhZ3NfaXRlci5jb2xsZWN0KCksIC4uRGVmYXVsdDo6ZGVmYXVsdCgpIH07CisgICAgICAgICAgICBwYXJzZWRfZmxhZ3Mud3JpdGVfdG9fdmVjKCZtdXQgb3V0cHV0KT87CisgICAgICAgIH0KKyAgICAgICAgRHVtcEZvcm1hdDo6VGV4dHByb3RvID0+IHsKKyAgICAgICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPQorICAgICAgICAgICAgICAgIFByb3RvUGFyc2VkRmxhZ3MgeyBwYXJzZWRfZmxhZzogcGFyc2VkX2ZsYWdzX2l0ZXIuY29sbGVjdCgpLCAuLkRlZmF1bHQ6OmRlZmF1bHQoKSB9OworICAgICAgICAgICAgbGV0IHMgPSBwcm90b2J1Zjo6dGV4dF9mb3JtYXQ6OnByaW50X3RvX3N0cmluZ19wcmV0dHkoJnBhcnNlZF9mbGFncyk7CisgICAgICAgICAgICBvdXRwdXQuZXh0ZW5kX2Zyb21fc2xpY2Uocy5hc19ieXRlcygpKTsKKyAgICAgICAgfQorICAgICAgICBEdW1wRm9ybWF0OjpDdXN0b20oZm9ybWF0KSA9PiB7CisgICAgICAgICAgICBmb3IgZmxhZyBpbiBwYXJzZWRfZmxhZ3NfaXRlciB7CisgICAgICAgICAgICAgICAgZHVtcF9jdXN0b21fZm9ybWF0KCZmbGFnLCAmZm9ybWF0LCAmbXV0IG91dHB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgT2sob3V0cHV0KQorfQorCitmbiBkdW1wX2N1c3RvbV9mb3JtYXQoZmxhZzogJlByb3RvUGFyc2VkRmxhZywgZm9ybWF0OiAmc3RyLCBvdXRwdXQ6ICZtdXQgVmVjPHU4PikgeworICAgIGZuIGZvcm1hdF90cmFjZSh0cmFjZTogJltQcm90b1RyYWNlcG9pbnRdKSAtPiBTdHJpbmcgeworICAgICAgICB0cmFjZQorICAgICAgICAgICAgLml0ZXIoKQorICAgICAgICAgICAgLm1hcCh8dHJhY2Vwb2ludHwgeworICAgICAgICAgICAgICAgIGZvcm1hdCEoCisgICAgICAgICAgICAgICAgICAgICJ7fTogezo/fSArIHs6P30iLAorICAgICAgICAgICAgICAgICAgICB0cmFjZXBvaW50LnNvdXJjZSgpLAorICAgICAgICAgICAgICAgICAgICB0cmFjZXBvaW50LnBlcm1pc3Npb24oKSwKKyAgICAgICAgICAgICAgICAgICAgdHJhY2Vwb2ludC5zdGF0ZSgpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIC5jb2xsZWN0Ojo8VmVjPF8+PigpCisgICAgICAgICAgICAuam9pbigiLCAiKQorICAgIH0KKworICAgIGZuIGZvcm1hdF90cmFjZV9wYXRocyh0cmFjZTogJltQcm90b1RyYWNlcG9pbnRdKSAtPiBTdHJpbmcgeworICAgICAgICB0cmFjZS5pdGVyKCkubWFwKHx0cmFjZXBvaW50fCB0cmFjZXBvaW50LnNvdXJjZSgpKS5jb2xsZWN0Ojo8VmVjPF8+PigpLmpvaW4oIiwgIikKKyAgICB9CisKKyAgICBmbiBmb3JtYXRfbWV0YWRhdGEobWV0YWRhdGE6ICZQcm90b0ZsYWdNZXRhZGF0YSkgLT4gU3RyaW5nIHsKKyAgICAgICAgZm9ybWF0ISgiezo/fSIsIG1ldGFkYXRhLnB1cnBvc2UoKSkKKyAgICB9CisKKyAgICBsZXQgbXV0IHN0ciA9IGZvcm1hdAorICAgICAgICAvLyBQcm90b1BhcnNlZEZsYWcgZmllbGRzCisgICAgICAgIC5yZXBsYWNlKCJ7cGFja2FnZX0iLCBmbGFnLnBhY2thZ2UoKSkKKyAgICAgICAgLnJlcGxhY2UoIntuYW1lfSIsIGZsYWcubmFtZSgpKQorICAgICAgICAucmVwbGFjZSgie25hbWVzcGFjZX0iLCBmbGFnLm5hbWVzcGFjZSgpKQorICAgICAgICAucmVwbGFjZSgie2Rlc2NyaXB0aW9ufSIsIGZsYWcuZGVzY3JpcHRpb24oKSkKKyAgICAgICAgLnJlcGxhY2UoIntidWd9IiwgJmZsYWcuYnVnLmpvaW4oIiwgIikpCisgICAgICAgIC5yZXBsYWNlKCJ7c3RhdGV9IiwgJmZvcm1hdCEoIns6P30iLCBmbGFnLnN0YXRlKCkpKQorICAgICAgICAucmVwbGFjZSgie3N0YXRlOmJvb2x9IiwgJmZvcm1hdCEoInt9IiwgZmxhZy5zdGF0ZSgpID09IFByb3RvRmxhZ1N0YXRlOjpFTkFCTEVEKSkKKyAgICAgICAgLnJlcGxhY2UoIntwZXJtaXNzaW9ufSIsICZmb3JtYXQhKCJ7Oj99IiwgZmxhZy5wZXJtaXNzaW9uKCkpKQorICAgICAgICAucmVwbGFjZSgie3RyYWNlfSIsICZmb3JtYXRfdHJhY2UoJmZsYWcudHJhY2UpKQorICAgICAgICAucmVwbGFjZSgie3RyYWNlOnBhdGhzfSIsICZmb3JtYXRfdHJhY2VfcGF0aHMoJmZsYWcudHJhY2UpKQorICAgICAgICAucmVwbGFjZSgie2lzX2ZpeGVkX3JlYWRfb25seX0iLCAmZm9ybWF0ISgie30iLCBmbGFnLmlzX2ZpeGVkX3JlYWRfb25seSgpKSkKKyAgICAgICAgLnJlcGxhY2UoIntpc19leHBvcnRlZH0iLCAmZm9ybWF0ISgie30iLCBmbGFnLmlzX2V4cG9ydGVkKCkpKQorICAgICAgICAucmVwbGFjZSgie2NvbnRhaW5lcn0iLCBmbGFnLmNvbnRhaW5lcigpKQorICAgICAgICAucmVwbGFjZSgie21ldGFkYXRhfSIsICZmb3JtYXRfbWV0YWRhdGEoJmZsYWcubWV0YWRhdGEpKQorICAgICAgICAvLyBQYXJzZWRGbGFnRXh0IGZ1bmN0aW9ucworICAgICAgICAucmVwbGFjZSgie2Z1bGx5X3F1YWxpZmllZF9uYW1lfSIsICZmbGFnLmZ1bGx5X3F1YWxpZmllZF9uYW1lKCkpOworICAgIHN0ci5wdXNoKCdcbicpOworICAgIG91dHB1dC5leHRlbmRfZnJvbV9zbGljZShzdHIuYXNfYnl0ZXMoKSk7Cit9CisKK3B1YiB0eXBlIER1bXBQcmVkaWNhdGUgPSBkeW4gRm4oJlByb3RvUGFyc2VkRmxhZykgLT4gYm9vbDsKKworcHViIGZuIGNyZWF0ZV9maWx0ZXJfcHJlZGljYXRlKGZpbHRlcjogJnN0cikgLT4gUmVzdWx0PEJveDxEdW1wUHJlZGljYXRlPj4geworICAgIGxldCBwcmVkaWNhdGVzID0gZmlsdGVyCisgICAgICAgIC5zcGxpdCgnKycpCisgICAgICAgIC5tYXAofHN1Yl9maWx0ZXJ8IGNyZWF0ZV9maWx0ZXJfcHJlZGljYXRlX3NpbmdsZShzdWJfZmlsdGVyKSkKKyAgICAgICAgLmNvbGxlY3Q6OjxSZXN1bHQ8VmVjPF8+Pj4oKT87CisgICAgT2soQm94OjpuZXcobW92ZSB8ZmxhZ3wgcHJlZGljYXRlcy5pdGVyKCkuYWxsKHxwfCBwKGZsYWcpKSkpCit9CisKK2ZuIGNyZWF0ZV9maWx0ZXJfcHJlZGljYXRlX3NpbmdsZShmaWx0ZXI6ICZzdHIpIC0+IFJlc3VsdDxCb3g8RHVtcFByZWRpY2F0ZT4+IHsKKyAgICBmbiBlbnVtX2Zyb21fc3RyPFQ+KGV4cGVjdGVkOiAmW1RdLCBzOiAmc3RyKSAtPiBSZXN1bHQ8VD4KKyAgICB3aGVyZQorICAgICAgICBUOiBzdGQ6OmZtdDo6RGVidWcgKyBDb3B5LAorICAgIHsKKyAgICAgICAgZm9yIGNhbmRpZGF0ZSBpbiBleHBlY3RlZC5pdGVyKCkgeworICAgICAgICAgICAgaWYgcyA9PSBmb3JtYXQhKCJ7Oj99IiwgY2FuZGlkYXRlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9rKCpjYW5kaWRhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxldCBleHBlY3RlZCA9CisgICAgICAgICAgICBleHBlY3RlZC5pdGVyKCkubWFwKHxzdGF0ZXwgZm9ybWF0ISgiezo/fSIsIHN0YXRlKSkuY29sbGVjdDo6PFZlYzxfPj4oKS5qb2luKCIsICIpOworICAgICAgICBiYWlsISgiXCJ7c31cIjogbm90IGEgdmFsaWQgZmxhZyBzdGF0ZSwgZXhwZWN0ZWQgb25lIG9mIHtleHBlY3RlZH0iKTsKKyAgICB9CisKKyAgICBsZXQgZXJyb3JfbXNnID0gZm9ybWF0ISgiXCJ7ZmlsdGVyfVwiOiBmaWx0ZXIgc3ludGF4IGVycm9yIik7CisgICAgbGV0ICh3aGF0LCBhcmcpID0gZmlsdGVyLnNwbGl0X29uY2UoJzonKS5va19vcl9lbHNlKHx8IGFueWhvdyEoZXJyb3JfbXNnLmNsb25lKCkpKT87CisgICAgbWF0Y2ggd2hhdCB7CisgICAgICAgICJwYWNrYWdlIiA9PiB7CisgICAgICAgICAgICBsZXQgZXhwZWN0ZWQgPSBhcmcudG9fb3duZWQoKTsKKyAgICAgICAgICAgIE9rKEJveDo6bmV3KG1vdmUgfGZsYWc6ICZQcm90b1BhcnNlZEZsYWd8IGZsYWcucGFja2FnZSgpID09IGV4cGVjdGVkKSkKKyAgICAgICAgfQorICAgICAgICAibmFtZSIgPT4geworICAgICAgICAgICAgbGV0IGV4cGVjdGVkID0gYXJnLnRvX293bmVkKCk7CisgICAgICAgICAgICBPayhCb3g6Om5ldyhtb3ZlIHxmbGFnOiAmUHJvdG9QYXJzZWRGbGFnfCBmbGFnLm5hbWUoKSA9PSBleHBlY3RlZCkpCisgICAgICAgIH0KKyAgICAgICAgIm5hbWVzcGFjZSIgPT4geworICAgICAgICAgICAgbGV0IGV4cGVjdGVkID0gYXJnLnRvX293bmVkKCk7CisgICAgICAgICAgICBPayhCb3g6Om5ldyhtb3ZlIHxmbGFnOiAmUHJvdG9QYXJzZWRGbGFnfCBmbGFnLm5hbWVzcGFjZSgpID09IGV4cGVjdGVkKSkKKyAgICAgICAgfQorICAgICAgICAvLyBkZXNjcmlwdGlvbjogbm90IHN1cHBvcnRlZCB5ZXQKKyAgICAgICAgImJ1ZyIgPT4geworICAgICAgICAgICAgbGV0IGV4cGVjdGVkID0gYXJnLnRvX293bmVkKCk7CisgICAgICAgICAgICBPayhCb3g6Om5ldyhtb3ZlIHxmbGFnOiAmUHJvdG9QYXJzZWRGbGFnfCBmbGFnLmJ1Zy5qb2luKCIsICIpID09IGV4cGVjdGVkKSkKKyAgICAgICAgfQorICAgICAgICAic3RhdGUiID0+IHsKKyAgICAgICAgICAgIGxldCBleHBlY3RlZCA9IGVudW1fZnJvbV9zdHIoJltQcm90b0ZsYWdTdGF0ZTo6RU5BQkxFRCwgUHJvdG9GbGFnU3RhdGU6OkRJU0FCTEVEXSwgYXJnKQorICAgICAgICAgICAgICAgIC5jb250ZXh0KGVycm9yX21zZyk/OworICAgICAgICAgICAgT2soQm94OjpuZXcobW92ZSB8ZmxhZzogJlByb3RvUGFyc2VkRmxhZ3wgZmxhZy5zdGF0ZSgpID09IGV4cGVjdGVkKSkKKyAgICAgICAgfQorICAgICAgICAicGVybWlzc2lvbiIgPT4geworICAgICAgICAgICAgbGV0IGV4cGVjdGVkID0gZW51bV9mcm9tX3N0cigKKyAgICAgICAgICAgICAgICAmW1Byb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfT05MWSwgUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9XUklURV0sCisgICAgICAgICAgICAgICAgYXJnLAorICAgICAgICAgICAgKQorICAgICAgICAgICAgLmNvbnRleHQoZXJyb3JfbXNnKT87CisgICAgICAgICAgICBPayhCb3g6Om5ldyhtb3ZlIHxmbGFnOiAmUHJvdG9QYXJzZWRGbGFnfCBmbGFnLnBlcm1pc3Npb24oKSA9PSBleHBlY3RlZCkpCisgICAgICAgIH0KKyAgICAgICAgLy8gdHJhY2U6IG5vdCBzdXBwb3J0ZWQgeWV0CisgICAgICAgICJpc19maXhlZF9yZWFkX29ubHkiID0+IHsKKyAgICAgICAgICAgIGxldCBleHBlY3RlZDogYm9vbCA9IGFyZy5wYXJzZSgpLmNvbnRleHQoZXJyb3JfbXNnKT87CisgICAgICAgICAgICBPayhCb3g6Om5ldyhtb3ZlIHxmbGFnOiAmUHJvdG9QYXJzZWRGbGFnfCBmbGFnLmlzX2ZpeGVkX3JlYWRfb25seSgpID09IGV4cGVjdGVkKSkKKyAgICAgICAgfQorICAgICAgICAiaXNfZXhwb3J0ZWQiID0+IHsKKyAgICAgICAgICAgIGxldCBleHBlY3RlZDogYm9vbCA9IGFyZy5wYXJzZSgpLmNvbnRleHQoZXJyb3JfbXNnKT87CisgICAgICAgICAgICBPayhCb3g6Om5ldyhtb3ZlIHxmbGFnOiAmUHJvdG9QYXJzZWRGbGFnfCBmbGFnLmlzX2V4cG9ydGVkKCkgPT0gZXhwZWN0ZWQpKQorICAgICAgICB9CisgICAgICAgICJjb250YWluZXIiID0+IHsKKyAgICAgICAgICAgIGxldCBleHBlY3RlZCA9IGFyZy50b19vd25lZCgpOworICAgICAgICAgICAgT2soQm94OjpuZXcobW92ZSB8ZmxhZzogJlByb3RvUGFyc2VkRmxhZ3wgZmxhZy5jb250YWluZXIoKSA9PSBleHBlY3RlZCkpCisgICAgICAgIH0KKyAgICAgICAgLy8gbWV0YWRhdGE6IG5vdCBzdXBwb3J0ZWQgeWV0CisgICAgICAgICJmdWxseV9xdWFsaWZpZWRfbmFtZSIgPT4geworICAgICAgICAgICAgbGV0IGV4cGVjdGVkID0gYXJnLnRvX293bmVkKCk7CisgICAgICAgICAgICBPayhCb3g6Om5ldyhtb3ZlIHxmbGFnOiAmUHJvdG9QYXJzZWRGbGFnfCBmbGFnLmZ1bGx5X3F1YWxpZmllZF9uYW1lKCkgPT0gZXhwZWN0ZWQpKQorICAgICAgICB9CisgICAgICAgIF8gPT4gRXJyKGFueWhvdyEoZXJyb3JfbXNnKSksCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBjcmF0ZTo6dGVzdDo6cGFyc2VfdGVzdF9mbGFnczsKKyAgICB1c2UgYWNvbmZpZ19wcm90b3M6OlByb3RvUGFyc2VkRmxhZ3M7CisgICAgdXNlIHByb3RvYnVmOjpNZXNzYWdlOworCisgICAgZm4gcGFyc2VfZW5hYmxlZF9yb19mbGFnKCkgLT4gUHJvdG9QYXJzZWRGbGFnIHsKKyAgICAgICAgcGFyc2VfdGVzdF9mbGFncygpLnBhcnNlZF9mbGFnLmludG9faXRlcigpLmZpbmQofHBmfCBwZi5uYW1lKCkgPT0gImVuYWJsZWRfcm8iKS51bndyYXAoKQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2R1bXBmb3JtYXRfZnJvbV9zdHIoKSB7CisgICAgICAgIC8vIHN1cHBvcnRlZCBmb3JtYXQgdHlwZXMKKyAgICAgICAgYXNzZXJ0X2VxIShEdW1wRm9ybWF0Ojp0cnlfZnJvbSgicHJvdG9idWYiKS51bndyYXAoKSwgRHVtcEZvcm1hdDo6UHJvdG9idWYpOworICAgICAgICBhc3NlcnRfZXEhKER1bXBGb3JtYXQ6OnRyeV9mcm9tKCJ0ZXh0cHJvdG8iKS51bndyYXAoKSwgRHVtcEZvcm1hdDo6VGV4dHByb3RvKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIER1bXBGb3JtYXQ6OnRyeV9mcm9tKCJmb29iYXIiKS51bndyYXAoKSwKKyAgICAgICAgICAgIER1bXBGb3JtYXQ6OkN1c3RvbSgiZm9vYmFyIi50b19vd25lZCgpKQorICAgICAgICApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2R1bXBfcGFyc2VkX2ZsYWdzX3Byb3RvYnVmX2Zvcm1hdCgpIHsKKyAgICAgICAgbGV0IGV4cGVjdGVkID0gcHJvdG9idWY6OnRleHRfZm9ybWF0OjpwYXJzZV9mcm9tX3N0cjo6PFByb3RvUGFyc2VkRmxhZ3M+KAorICAgICAgICAgICAgY3JhdGU6OnRlc3Q6OlRFU1RfRkxBR1NfVEVYVFBST1RPLAorICAgICAgICApCisgICAgICAgIC51bndyYXAoKQorICAgICAgICAud3JpdGVfdG9fYnl0ZXMoKQorICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPSBwYXJzZV90ZXN0X2ZsYWdzKCk7CisgICAgICAgIGxldCBhY3R1YWwgPQorICAgICAgICAgICAgZHVtcF9wYXJzZWRfZmxhZ3MocGFyc2VkX2ZsYWdzLnBhcnNlZF9mbGFnLmludG9faXRlcigpLCBEdW1wRm9ybWF0OjpQcm90b2J1ZikudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfZHVtcF9wYXJzZWRfZmxhZ3NfdGV4dHByb3RvX2Zvcm1hdCgpIHsKKyAgICAgICAgbGV0IHBhcnNlZF9mbGFncyA9IHBhcnNlX3Rlc3RfZmxhZ3MoKTsKKyAgICAgICAgbGV0IGJ5dGVzID0KKyAgICAgICAgICAgIGR1bXBfcGFyc2VkX2ZsYWdzKHBhcnNlZF9mbGFncy5wYXJzZWRfZmxhZy5pbnRvX2l0ZXIoKSwgRHVtcEZvcm1hdDo6VGV4dHByb3RvKS51bndyYXAoKTsKKyAgICAgICAgbGV0IHRleHQgPSBzdGQ6OnN0cjo6ZnJvbV91dGY4KCZieXRlcykudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEoY3JhdGU6OnRlc3Q6OlRFU1RfRkxBR1NfVEVYVFBST1RPLnRyaW0oKSwgdGV4dC50cmltKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2R1bXBfcGFyc2VkX2ZsYWdzX2N1c3RvbV9mb3JtYXQoKSB7CisgICAgICAgIG1hY3JvX3J1bGVzISBhc3NlcnRfZHVtcF9wYXJzZWRfZmxhZ3NfY3VzdG9tX2Zvcm1hdF9jb250YWlucyB7CisgICAgICAgICAgICAoJGZvcm1hdDpleHByLCAkZXhwZWN0ZWQ6ZXhwcikgPT4geworICAgICAgICAgICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPSBwYXJzZV90ZXN0X2ZsYWdzKCk7CisgICAgICAgICAgICAgICAgbGV0IGJ5dGVzID0gZHVtcF9wYXJzZWRfZmxhZ3MoCisgICAgICAgICAgICAgICAgICAgIHBhcnNlZF9mbGFncy5wYXJzZWRfZmxhZy5pbnRvX2l0ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgJGZvcm1hdC50cnlfaW50bygpLnVud3JhcCgpLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgICAgICAgICAgbGV0IHRleHQgPSBzdGQ6OnN0cjo6ZnJvbV91dGY4KCZieXRlcykudW53cmFwKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0ISh0ZXh0LmNvbnRhaW5zKCRleHBlY3RlZCkpOworICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGN1c3RvbSBmb3JtYXQKKyAgICAgICAgYXNzZXJ0X2R1bXBfcGFyc2VkX2ZsYWdzX2N1c3RvbV9mb3JtYXRfY29udGFpbnMhKAorICAgICAgICAgICAgIntmdWxseV9xdWFsaWZpZWRfbmFtZX09e3Blcm1pc3Npb259ICsge3N0YXRlfSIsCisgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcm89UkVBRF9PTkxZICsgRU5BQkxFRCIKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9kdW1wX2N1c3RvbV9mb3JtYXQoKSB7CisgICAgICAgIG1hY3JvX3J1bGVzISBhc3NlcnRfY3VzdG9tX2Zvcm1hdCB7CisgICAgICAgICAgICAoJGZvcm1hdDpleHByLCAkZXhwZWN0ZWQ6ZXhwcikgPT4geworICAgICAgICAgICAgICAgIGxldCBmbGFnID0gcGFyc2VfZW5hYmxlZF9yb19mbGFnKCk7CisgICAgICAgICAgICAgICAgbGV0IG11dCBieXRlcyA9IHZlYyFbXTsKKyAgICAgICAgICAgICAgICBkdW1wX2N1c3RvbV9mb3JtYXQoJmZsYWcsICRmb3JtYXQsICZtdXQgYnl0ZXMpOworICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0gc3RkOjpzdHI6OmZyb21fdXRmOCgmYnl0ZXMpLnVud3JhcCgpOworICAgICAgICAgICAgICAgIGFzc2VydF9lcSEodGV4dCwgJGV4cGVjdGVkKTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRfY3VzdG9tX2Zvcm1hdCEoIntwYWNrYWdlfSIsICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3RcbiIpOworICAgICAgICBhc3NlcnRfY3VzdG9tX2Zvcm1hdCEoIntuYW1lfSIsICJlbmFibGVkX3JvXG4iKTsKKyAgICAgICAgYXNzZXJ0X2N1c3RvbV9mb3JtYXQhKCJ7bmFtZXNwYWNlfSIsICJhY29uZmlnX3Rlc3RcbiIpOworICAgICAgICBhc3NlcnRfY3VzdG9tX2Zvcm1hdCEoIntkZXNjcmlwdGlvbn0iLCAiVGhpcyBmbGFnIGlzIEVOQUJMRUQgKyBSRUFEX09OTFlcbiIpOworICAgICAgICBhc3NlcnRfY3VzdG9tX2Zvcm1hdCEoIntidWd9IiwgImFiY1xuIik7CisgICAgICAgIGFzc2VydF9jdXN0b21fZm9ybWF0ISgie3N0YXRlfSIsICJFTkFCTEVEXG4iKTsKKyAgICAgICAgYXNzZXJ0X2N1c3RvbV9mb3JtYXQhKCJ7c3RhdGU6Ym9vbH0iLCAidHJ1ZVxuIik7CisgICAgICAgIGFzc2VydF9jdXN0b21fZm9ybWF0ISgie3Blcm1pc3Npb259IiwgIlJFQURfT05MWVxuIik7CisgICAgICAgIGFzc2VydF9jdXN0b21fZm9ybWF0ISgie3RyYWNlfSIsICJ0ZXN0cy90ZXN0LmFjb25maWc6IFJFQURfV1JJVEUgKyBESVNBQkxFRCwgdGVzdHMvZmlyc3QudmFsdWVzOiBSRUFEX1dSSVRFICsgRElTQUJMRUQsIHRlc3RzL3NlY29uZC52YWx1ZXM6IFJFQURfT05MWSArIEVOQUJMRURcbiIpOworICAgICAgICBhc3NlcnRfY3VzdG9tX2Zvcm1hdCEoCisgICAgICAgICAgICAie3RyYWNlOnBhdGhzfSIsCisgICAgICAgICAgICAidGVzdHMvdGVzdC5hY29uZmlnLCB0ZXN0cy9maXJzdC52YWx1ZXMsIHRlc3RzL3NlY29uZC52YWx1ZXNcbiIKKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X2N1c3RvbV9mb3JtYXQhKCJ7aXNfZml4ZWRfcmVhZF9vbmx5fSIsICJmYWxzZVxuIik7CisgICAgICAgIGFzc2VydF9jdXN0b21fZm9ybWF0ISgie2lzX2V4cG9ydGVkfSIsICJmYWxzZVxuIik7CisgICAgICAgIGFzc2VydF9jdXN0b21fZm9ybWF0ISgie2NvbnRhaW5lcn0iLCAic3lzdGVtXG4iKTsKKyAgICAgICAgYXNzZXJ0X2N1c3RvbV9mb3JtYXQhKCJ7bWV0YWRhdGF9IiwgIlBVUlBPU0VfQlVHRklYXG4iKTsKKworICAgICAgICBhc3NlcnRfY3VzdG9tX2Zvcm1hdCEoIm5hbWU9e25hbWV9fHN0YXRlPXtzdGF0ZX0iLCAibmFtZT1lbmFibGVkX3JvfHN0YXRlPUVOQUJMRURcbiIpOworICAgICAgICBhc3NlcnRfY3VzdG9tX2Zvcm1hdCEoIntzdGF0ZX17c3RhdGV9e3N0YXRlfSIsICJFTkFCTEVERU5BQkxFREVOQUJMRURcbiIpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2NyZWF0ZV9maWx0ZXJfcHJlZGljYXRlKCkgeworICAgICAgICBtYWNyb19ydWxlcyEgYXNzZXJ0X2NyZWF0ZV9maWx0ZXJfcHJlZGljYXRlIHsKKyAgICAgICAgICAgICgkZmlsdGVyOmV4cHIsICRleHBlY3RlZDpleHByKSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IHBhcnNlZF9mbGFncyA9IHBhcnNlX3Rlc3RfZmxhZ3MoKTsKKyAgICAgICAgICAgICAgICBsZXQgcHJlZGljYXRlID0gY3JlYXRlX2ZpbHRlcl9wcmVkaWNhdGUoJGZpbHRlcikudW53cmFwKCk7CisgICAgICAgICAgICAgICAgbGV0IG11dCBmaWx0ZXJlZF9mbGFnczogVmVjPFN0cmluZz4gPSBwYXJzZWRfZmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgLnBhcnNlZF9mbGFnCisgICAgICAgICAgICAgICAgICAgIC5pbnRvX2l0ZXIoKQorICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHByZWRpY2F0ZSkKKyAgICAgICAgICAgICAgICAgICAgLm1hcCh8ZmxhZ3wgZmxhZy5mdWxseV9xdWFsaWZpZWRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAuY29sbGVjdCgpOworICAgICAgICAgICAgICAgIGZpbHRlcmVkX2ZsYWdzLnNvcnQoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRfZXEhKCZmaWx0ZXJlZF9mbGFncywgJGV4cGVjdGVkKTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRfY3JlYXRlX2ZpbHRlcl9wcmVkaWNhdGUhKAorICAgICAgICAgICAgInBhY2thZ2U6Y29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IiwKKyAgICAgICAgICAgICZbCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9ybyIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9ydyIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19leHBvcnRlZCIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UiLAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9maXhlZF9ybyIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcm8iLAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9yb19leHBvcnRlZCIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3J3IiwKKyAgICAgICAgICAgIF0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X2NyZWF0ZV9maWx0ZXJfcHJlZGljYXRlISgKKyAgICAgICAgICAgICJuYW1lOmRpc2FibGVkX3J3IiwKKyAgICAgICAgICAgICZbImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9ydyJdCisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9jcmVhdGVfZmlsdGVyX3ByZWRpY2F0ZSEoCisgICAgICAgICAgICAibmFtZXNwYWNlOm90aGVyX25hbWVzcGFjZSIsCisgICAgICAgICAgICAmWyJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlIl0KKyAgICAgICAgKTsKKyAgICAgICAgLy8gZGVzY3JpcHRpb246IG5vdCBzdXBwb3J0ZWQgeWV0CisgICAgICAgIGFzc2VydF9jcmVhdGVfZmlsdGVyX3ByZWRpY2F0ZSEoImJ1ZzoxMjMiLCAmWyJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcm8iLF0pOworICAgICAgICBhc3NlcnRfY3JlYXRlX2ZpbHRlcl9wcmVkaWNhdGUhKAorICAgICAgICAgICAgInN0YXRlOkVOQUJMRUQiLAorICAgICAgICAgICAgJlsKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfZml4ZWRfcm8iLAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3JvIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcm9fZXhwb3J0ZWQiLAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9ydyIsCisgICAgICAgICAgICBdCisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9jcmVhdGVfZmlsdGVyX3ByZWRpY2F0ZSEoCisgICAgICAgICAgICAicGVybWlzc2lvbjpSRUFEX09OTFkiLAorICAgICAgICAgICAgJlsKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3JvIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfZml4ZWRfcm8iLAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3JvIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcm9fZXhwb3J0ZWQiLAorICAgICAgICAgICAgXQorICAgICAgICApOworICAgICAgICAvLyB0cmFjZTogbm90IHN1cHBvcnRlZCB5ZXQKKyAgICAgICAgYXNzZXJ0X2NyZWF0ZV9maWx0ZXJfcHJlZGljYXRlISgKKyAgICAgICAgICAgICJpc19maXhlZF9yZWFkX29ubHk6dHJ1ZSIsCisgICAgICAgICAgICAmWworICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9maXhlZF9ybyIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkIiwKKyAgICAgICAgICAgIF0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X2NyZWF0ZV9maWx0ZXJfcHJlZGljYXRlISgKKyAgICAgICAgICAgICJpc19leHBvcnRlZDp0cnVlIiwKKyAgICAgICAgICAgICZbCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19leHBvcnRlZCIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcm9fZXhwb3J0ZWQiLAorICAgICAgICAgICAgXQorICAgICAgICApOworICAgICAgICBhc3NlcnRfY3JlYXRlX2ZpbHRlcl9wcmVkaWNhdGUhKAorICAgICAgICAgICAgImNvbnRhaW5lcjpzeXN0ZW0iLAorICAgICAgICAgICAgJlsKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3JvIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3IiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2V4cG9ydGVkIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX2ZpeGVkX3JvIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQiLAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9ybyIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3JvX2V4cG9ydGVkIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcnciLAorICAgICAgICAgICAgXQorICAgICAgICApOworICAgICAgICAvLyBtZXRhZGF0YTogbm90IHN1cHBvcnRlZCB5ZXQKKworICAgICAgICAvLyBzeW50aGVzaXplZCBmaWVsZHMKKyAgICAgICAgYXNzZXJ0X2NyZWF0ZV9maWx0ZXJfcHJlZGljYXRlISgKKyAgICAgICAgICAgICJmdWxseV9xdWFsaWZpZWRfbmFtZTpjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcnciLAorICAgICAgICAgICAgJlsiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3Il0KKyAgICAgICAgKTsKKworICAgICAgICAvLyBtdWx0aXBsZSBzdWIgZmlsdGVycworICAgICAgICBhc3NlcnRfY3JlYXRlX2ZpbHRlcl9wcmVkaWNhdGUhKAorICAgICAgICAgICAgInBlcm1pc3Npb246UkVBRF9PTkxZK3N0YXRlOkVOQUJMRUQiLAorICAgICAgICAgICAgJlsKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfZml4ZWRfcm8iLAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3JvIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcm9fZXhwb3J0ZWQiLAorICAgICAgICAgICAgXQorICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvbWFpbi5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvbWFpbi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODg3ODZiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9tYWluLnJzCkBAIC0wLDAgKzEsMzU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8hIGBhY29uZmlnYCBpcyBhIGJ1aWxkIHRpbWUgdG9vbCB0byBtYW5hZ2UgYnVpbGQgdGltZSBjb25maWd1cmF0aW9ucywgc3VjaCBhcyBmZWF0dXJlIGZsYWdzLgorCit1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OkRFRkFVTFRfRklMRV9WRVJTSU9OOwordXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjpNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTjsKK3VzZSBhbnlob3c6Onthbnlob3csIGJhaWwsIENvbnRleHQsIFJlc3VsdH07Cit1c2UgY2xhcDo6e2J1aWxkZXI6OkFyZ0FjdGlvbiwgYnVpbGRlcjo6RW51bVZhbHVlUGFyc2VyLCBBcmcsIEFyZ01hdGNoZXMsIENvbW1hbmR9OwordXNlIGNvcmU6OmFueTo6QW55OwordXNlIHN0ZDo6ZnM7Cit1c2Ugc3RkOjppbzsKK3VzZSBzdGQ6OmlvOjpXcml0ZTsKK3VzZSBzdGQ6OnBhdGg6OntQYXRoLCBQYXRoQnVmfTsKKworbW9kIGNvZGVnZW47Cittb2QgY29tbWFuZHM7Cittb2QgZHVtcDsKK21vZCBzdG9yYWdlOworCit1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OlN0b3JhZ2VGaWxlVHlwZTsKK3VzZSBjb2RlZ2VuOjpDb2RlZ2VuTW9kZTsKK3VzZSBkdW1wOjpEdW1wRm9ybWF0OworCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0OworCit1c2UgY29tbWFuZHM6OntJbnB1dCwgT3V0cHV0RmlsZX07CisKK2NvbnN0IEhFTFBfRFVNUF9GSUxURVI6ICZzdHIgPSByIyIKK0xpbWl0IHdoaWNoIGZsYWdzIHRvIG91dHB1dC4gSWYgbXVsdGlwbGUgLS1maWx0ZXIgYXJndW1lbnRzIGFyZSBwcm92aWRlZCwgdGhlIG91dHB1dCB3aWxsIGJlCitsaW1pdGVkIHRvIGZsYWdzIHRoYXQgbWF0Y2ggYW55IG9mIHRoZSBmaWx0ZXJzLgorIiM7CisKK2ZuIGNsaSgpIC0+IENvbW1hbmQgeworICAgIENvbW1hbmQ6Om5ldygiYWNvbmZpZyIpCisgICAgICAgIC5zdWJjb21tYW5kX3JlcXVpcmVkKHRydWUpCisgICAgICAgIC5zdWJjb21tYW5kKAorICAgICAgICAgICAgQ29tbWFuZDo6bmV3KCJjcmVhdGUtY2FjaGUiKQorICAgICAgICAgICAgICAgIC5hcmcoQXJnOjpuZXcoInBhY2thZ2UiKS5sb25nKCJwYWNrYWdlIikucmVxdWlyZWQodHJ1ZSkpCisgICAgICAgICAgICAgICAgLmFyZyhBcmc6Om5ldygiY29udGFpbmVyIikubG9uZygiY29udGFpbmVyIikucmVxdWlyZWQodHJ1ZSkpCisgICAgICAgICAgICAgICAgLmFyZyhBcmc6Om5ldygiZGVjbGFyYXRpb25zIikubG9uZygiZGVjbGFyYXRpb25zIikuYWN0aW9uKEFyZ0FjdGlvbjo6QXBwZW5kKSkKKyAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJ2YWx1ZXMiKS5sb25nKCJ2YWx1ZXMiKS5hY3Rpb24oQXJnQWN0aW9uOjpBcHBlbmQpKQorICAgICAgICAgICAgICAgIC5hcmcoCisgICAgICAgICAgICAgICAgICAgIEFyZzo6bmV3KCJkZWZhdWx0LXBlcm1pc3Npb24iKQorICAgICAgICAgICAgICAgICAgICAgICAgLmxvbmcoImRlZmF1bHQtcGVybWlzc2lvbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVfcGFyc2VyKGFjb25maWdfcHJvdG9zOjpmbGFnX3Blcm1pc3Npb246OnBhcnNlX2Zyb21fc3RyKQorICAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHRfdmFsdWUoYWNvbmZpZ19wcm90b3M6OmZsYWdfcGVybWlzc2lvbjo6dG9fc3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21tYW5kczo6REVGQVVMVF9GTEFHX1BFUk1JU1NJT04sCisgICAgICAgICAgICAgICAgICAgICAgICApKSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgLmFyZygKKyAgICAgICAgICAgICAgICAgICAgQXJnOjpuZXcoImFsbG93LXJlYWQtd3JpdGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmxvbmcoImFsbG93LXJlYWQtd3JpdGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlX3BhcnNlcihjbGFwOjp2YWx1ZV9wYXJzZXIhKGJvb2wpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHRfdmFsdWUoInRydWUiKSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgLmFyZyhBcmc6Om5ldygiY2FjaGUiKS5sb25nKCJjYWNoZSIpLnJlcXVpcmVkKHRydWUpKSwKKyAgICAgICAgKQorICAgICAgICAuc3ViY29tbWFuZCgKKyAgICAgICAgICAgIENvbW1hbmQ6Om5ldygiY3JlYXRlLWphdmEtbGliIikKKyAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJjYWNoZSIpLmxvbmcoImNhY2hlIikucmVxdWlyZWQodHJ1ZSkpCisgICAgICAgICAgICAgICAgLmFyZyhBcmc6Om5ldygib3V0IikubG9uZygib3V0IikucmVxdWlyZWQodHJ1ZSkpCisgICAgICAgICAgICAgICAgLmFyZygKKyAgICAgICAgICAgICAgICAgICAgQXJnOjpuZXcoIm1vZGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmxvbmcoIm1vZGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlX3BhcnNlcihFbnVtVmFsdWVQYXJzZXI6OjxDb2RlZ2VuTW9kZT46Om5ldygpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHRfdmFsdWUoInByb2R1Y3Rpb24iKSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgLmFyZygKKyAgICAgICAgICAgICAgICAgICAgQXJnOjpuZXcoImFsbG93LWluc3RydW1lbnRhdGlvbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAubG9uZygiYWxsb3ctaW5zdHJ1bWVudGF0aW9uIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV9wYXJzZXIoY2xhcDo6dmFsdWVfcGFyc2VyIShib29sKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0X3ZhbHVlKCJmYWxzZSIpLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAuYXJnKAorICAgICAgICAgICAgICAgICAgICBBcmc6Om5ldygibmV3LWV4cG9ydGVkIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5sb25nKCJuZXctZXhwb3J0ZWQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlX3BhcnNlcihjbGFwOjp2YWx1ZV9wYXJzZXIhKGJvb2wpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHRfdmFsdWUoImZhbHNlIiksCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgKQorICAgICAgICAuc3ViY29tbWFuZCgKKyAgICAgICAgICAgIENvbW1hbmQ6Om5ldygiY3JlYXRlLWNwcC1saWIiKQorICAgICAgICAgICAgICAgIC5hcmcoQXJnOjpuZXcoImNhY2hlIikubG9uZygiY2FjaGUiKS5yZXF1aXJlZCh0cnVlKSkKKyAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJvdXQiKS5sb25nKCJvdXQiKS5yZXF1aXJlZCh0cnVlKSkKKyAgICAgICAgICAgICAgICAuYXJnKAorICAgICAgICAgICAgICAgICAgICBBcmc6Om5ldygibW9kZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAubG9uZygibW9kZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVfcGFyc2VyKEVudW1WYWx1ZVBhcnNlcjo6PENvZGVnZW5Nb2RlPjo6bmV3KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdF92YWx1ZSgicHJvZHVjdGlvbiIpLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAuYXJnKAorICAgICAgICAgICAgICAgICAgICBBcmc6Om5ldygiYWxsb3ctaW5zdHJ1bWVudGF0aW9uIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5sb25nKCJhbGxvdy1pbnN0cnVtZW50YXRpb24iKQorICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlX3BhcnNlcihjbGFwOjp2YWx1ZV9wYXJzZXIhKGJvb2wpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHRfdmFsdWUoImZhbHNlIiksCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgKQorICAgICAgICAuc3ViY29tbWFuZCgKKyAgICAgICAgICAgIENvbW1hbmQ6Om5ldygiY3JlYXRlLXJ1c3QtbGliIikKKyAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJjYWNoZSIpLmxvbmcoImNhY2hlIikucmVxdWlyZWQodHJ1ZSkpCisgICAgICAgICAgICAgICAgLmFyZyhBcmc6Om5ldygib3V0IikubG9uZygib3V0IikucmVxdWlyZWQodHJ1ZSkpCisgICAgICAgICAgICAgICAgLmFyZygKKyAgICAgICAgICAgICAgICAgICAgQXJnOjpuZXcoImFsbG93LWluc3RydW1lbnRhdGlvbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAubG9uZygiYWxsb3ctaW5zdHJ1bWVudGF0aW9uIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV9wYXJzZXIoY2xhcDo6dmFsdWVfcGFyc2VyIShib29sKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0X3ZhbHVlKCJmYWxzZSIpLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAuYXJnKAorICAgICAgICAgICAgICAgICAgICBBcmc6Om5ldygibW9kZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAubG9uZygibW9kZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVfcGFyc2VyKEVudW1WYWx1ZVBhcnNlcjo6PENvZGVnZW5Nb2RlPjo6bmV3KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdF92YWx1ZSgicHJvZHVjdGlvbiIpLAorICAgICAgICAgICAgICAgICksCisgICAgICAgICkKKyAgICAgICAgLnN1YmNvbW1hbmQoCisgICAgICAgICAgICBDb21tYW5kOjpuZXcoImNyZWF0ZS1kZXZpY2UtY29uZmlnLWRlZmF1bHRzIikKKyAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJjYWNoZSIpLmxvbmcoImNhY2hlIikuYWN0aW9uKEFyZ0FjdGlvbjo6QXBwZW5kKS5yZXF1aXJlZCh0cnVlKSkKKyAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJvdXQiKS5sb25nKCJvdXQiKS5kZWZhdWx0X3ZhbHVlKCItIikpLAorICAgICAgICApCisgICAgICAgIC5zdWJjb21tYW5kKAorICAgICAgICAgICAgQ29tbWFuZDo6bmV3KCJjcmVhdGUtZGV2aWNlLWNvbmZpZy1zeXNwcm9wcyIpCisgICAgICAgICAgICAgICAgLmFyZyhBcmc6Om5ldygiY2FjaGUiKS5sb25nKCJjYWNoZSIpLmFjdGlvbihBcmdBY3Rpb246OkFwcGVuZCkucmVxdWlyZWQodHJ1ZSkpCisgICAgICAgICAgICAgICAgLmFyZyhBcmc6Om5ldygib3V0IikubG9uZygib3V0IikuZGVmYXVsdF92YWx1ZSgiLSIpKSwKKyAgICAgICAgKQorICAgICAgICAuc3ViY29tbWFuZCgKKyAgICAgICAgICAgIENvbW1hbmQ6Om5ldygiZHVtcC1jYWNoZSIpCisgICAgICAgICAgICAgICAgLmFsaWFzKCJkdW1wIikKKyAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJjYWNoZSIpLmxvbmcoImNhY2hlIikuYWN0aW9uKEFyZ0FjdGlvbjo6QXBwZW5kKSkKKyAgICAgICAgICAgICAgICAuYXJnKAorICAgICAgICAgICAgICAgICAgICBBcmc6Om5ldygiZm9ybWF0IikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5sb25nKCJmb3JtYXQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlX3BhcnNlcih8czogJnN0cnwgRHVtcEZvcm1hdDo6dHJ5X2Zyb20ocykpCisgICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdF92YWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAie2Z1bGx5X3F1YWxpZmllZF9uYW1lfSBbe2NvbnRhaW5lcn1dOiB7cGVybWlzc2lvbn0gKyB7c3RhdGV9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIC5hcmcoCisgICAgICAgICAgICAgICAgICAgIEFyZzo6bmV3KCJmaWx0ZXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmxvbmcoImZpbHRlciIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWN0aW9uKEFyZ0FjdGlvbjo6QXBwZW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgLmhlbHAoSEVMUF9EVU1QX0ZJTFRFUi50cmltKCkpLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJkZWR1cCIpLmxvbmcoImRlZHVwIikubnVtX2FyZ3MoMCkuYWN0aW9uKEFyZ0FjdGlvbjo6U2V0VHJ1ZSkpCisgICAgICAgICAgICAgICAgLmFyZyhBcmc6Om5ldygib3V0IikubG9uZygib3V0IikuZGVmYXVsdF92YWx1ZSgiLSIpKSwKKyAgICAgICAgKQorICAgICAgICAuc3ViY29tbWFuZCgKKyAgICAgICAgICAgIENvbW1hbmQ6Om5ldygiY3JlYXRlLXN0b3JhZ2UiKQorICAgICAgICAgICAgICAgIC5hcmcoCisgICAgICAgICAgICAgICAgICAgIEFyZzo6bmV3KCJjb250YWluZXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmxvbmcoImNvbnRhaW5lciIpCisgICAgICAgICAgICAgICAgICAgICAgICAucmVxdWlyZWQodHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5oZWxwKCJUaGUgdGFyZ2V0IGNvbnRhaW5lciBmb3IgdGhlIGdlbmVyYXRlZCBzdG9yYWdlIGZpbGUuIiksCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIC5hcmcoCisgICAgICAgICAgICAgICAgICAgIEFyZzo6bmV3KCJmaWxlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5sb25nKCJmaWxlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV9wYXJzZXIofHM6ICZzdHJ8IFN0b3JhZ2VGaWxlVHlwZTo6dHJ5X2Zyb20ocykpLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJjYWNoZSIpLmxvbmcoImNhY2hlIikuYWN0aW9uKEFyZ0FjdGlvbjo6QXBwZW5kKS5yZXF1aXJlZCh0cnVlKSkKKyAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJvdXQiKS5sb25nKCJvdXQiKS5yZXF1aXJlZCh0cnVlKSkKKyAgICAgICAgICAgICAgICAuYXJnKAorICAgICAgICAgICAgICAgICAgICBBcmc6Om5ldygidmVyc2lvbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAubG9uZygidmVyc2lvbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAucmVxdWlyZWQoZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVfcGFyc2VyKHxzOiAmc3RyfCBzLnBhcnNlOjo8dTMyPigpKSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICApCit9CisKK2ZuIGdldF9yZXF1aXJlZF9hcmc8J2EsIFQ+KG1hdGNoZXM6ICYnYSBBcmdNYXRjaGVzLCBhcmdfbmFtZTogJnN0cikgLT4gUmVzdWx0PCYnYSBUPgord2hlcmUKKyAgICBUOiBBbnkgKyBDbG9uZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKK3sKKyAgICBtYXRjaGVzCisgICAgICAgIC5nZXRfb25lOjo8VD4oYXJnX25hbWUpCisgICAgICAgIC5va19vcihhbnlob3chKCJpbnRlcm5hbCBlcnJvcjogcmVxdWlyZWQgYXJndW1lbnQgJ3t9JyBub3QgZm91bmQiLCBhcmdfbmFtZSkpCit9CisKK2ZuIGdldF9vcHRpb25hbF9hcmc8J2EsIFQ+KG1hdGNoZXM6ICYnYSBBcmdNYXRjaGVzLCBhcmdfbmFtZTogJnN0cikgLT4gT3B0aW9uPCYnYSBUPgord2hlcmUKKyAgICBUOiBBbnkgKyBDbG9uZSArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKK3sKKyAgICBtYXRjaGVzLmdldF9vbmU6OjxUPihhcmdfbmFtZSkKK30KKworZm4gb3Blbl96ZXJvX29yX21vcmVfZmlsZXMobWF0Y2hlczogJkFyZ01hdGNoZXMsIGFyZ19uYW1lOiAmc3RyKSAtPiBSZXN1bHQ8VmVjPElucHV0Pj4geworICAgIGxldCBtdXQgb3BlbmVkX2ZpbGVzID0gdmVjIVtdOworICAgIGZvciBwYXRoIGluIG1hdGNoZXMuZ2V0X21hbnk6OjxTdHJpbmc+KGFyZ19uYW1lKS51bndyYXBfb3JfZGVmYXVsdCgpIHsKKyAgICAgICAgbGV0IGZpbGUgPSBCb3g6Om5ldyhmczo6RmlsZTo6b3BlbihwYXRoKT8pOworICAgICAgICBvcGVuZWRfZmlsZXMucHVzaChJbnB1dCB7IHNvdXJjZTogcGF0aC50b19zdHJpbmcoKSwgcmVhZGVyOiBmaWxlIH0pOworICAgIH0KKyAgICBPayhvcGVuZWRfZmlsZXMpCit9CisKK2ZuIG9wZW5fc2luZ2xlX2ZpbGUobWF0Y2hlczogJkFyZ01hdGNoZXMsIGFyZ19uYW1lOiAmc3RyKSAtPiBSZXN1bHQ8SW5wdXQ+IHsKKyAgICBsZXQgU29tZShwYXRoKSA9IG1hdGNoZXMuZ2V0X29uZTo6PFN0cmluZz4oYXJnX25hbWUpIGVsc2UgeworICAgICAgICBiYWlsISgibWlzc2luZyBhcmd1bWVudCB7fSIsIGFyZ19uYW1lKTsKKyAgICB9OworICAgIGxldCBmaWxlID0gQm94OjpuZXcoZnM6OkZpbGU6Om9wZW4ocGF0aCk/KTsKKyAgICBPayhJbnB1dCB7IHNvdXJjZTogcGF0aC50b19zdHJpbmcoKSwgcmVhZGVyOiBmaWxlIH0pCit9CisKK2ZuIHdyaXRlX291dHB1dF9maWxlX3JlYWx0aXZlX3RvX2Rpcihyb290OiAmUGF0aCwgb3V0cHV0X2ZpbGU6ICZPdXRwdXRGaWxlKSAtPiBSZXN1bHQ8KCk+IHsKKyAgICBsZXQgcGF0aCA9IHJvb3Quam9pbigmb3V0cHV0X2ZpbGUucGF0aCk7CisgICAgbGV0IHBhcmVudCA9IHBhdGgKKyAgICAgICAgLnBhcmVudCgpCisgICAgICAgIC5va19vcihhbnlob3chKCJ1bmFibGUgdG8gbG9jYXRlIHBhcmVudCBvZiBvdXRwdXQgZmlsZSB7fSIsIHBhdGguZGlzcGxheSgpKSk/OworICAgIGZzOjpjcmVhdGVfZGlyX2FsbChwYXJlbnQpCisgICAgICAgIC53aXRoX2NvbnRleHQofHwgZm9ybWF0ISgiZmFpbGVkIHRvIGNyZWF0ZSBkaXJlY3Rvcnkge30iLCBwYXJlbnQuZGlzcGxheSgpKSk/OworICAgIGxldCBtdXQgZmlsZSA9CisgICAgICAgIGZzOjpGaWxlOjpjcmVhdGUoJnBhdGgpLndpdGhfY29udGV4dCh8fCBmb3JtYXQhKCJmYWlsZWQgdG8gb3BlbiB7fSIsIHBhdGguZGlzcGxheSgpKSk/OworICAgIGZpbGUud3JpdGVfYWxsKCZvdXRwdXRfZmlsZS5jb250ZW50cykKKyAgICAgICAgLndpdGhfY29udGV4dCh8fCBmb3JtYXQhKCJmYWlsZWQgdG8gd3JpdGUgdG8ge30iLCBwYXRoLmRpc3BsYXkoKSkpPzsKKyAgICBPaygoKSkKK30KKworZm4gd3JpdGVfb3V0cHV0X3RvX2ZpbGVfb3Jfc3Rkb3V0KHBhdGg6ICZzdHIsIGRhdGE6ICZbdThdKSAtPiBSZXN1bHQ8KCk+IHsKKyAgICBpZiBwYXRoID09ICItIiB7CisgICAgICAgIGlvOjpzdGRvdXQoKS53cml0ZV9hbGwoZGF0YSkuY29udGV4dCgiZmFpbGVkIHRvIHdyaXRlIHRvIHN0ZG91dCIpPzsKKyAgICB9IGVsc2UgeworICAgICAgICBmczo6RmlsZTo6Y3JlYXRlKHBhdGgpCisgICAgICAgICAgICAud2l0aF9jb250ZXh0KHx8IGZvcm1hdCEoImZhaWxlZCB0byBvcGVuIHt9IiwgcGF0aCkpPworICAgICAgICAgICAgLndyaXRlX2FsbChkYXRhKQorICAgICAgICAgICAgLndpdGhfY29udGV4dCh8fCBmb3JtYXQhKCJmYWlsZWQgdG8gd3JpdGUgdG8ge30iLCBwYXRoKSk/OworICAgIH0KKyAgICBPaygoKSkKK30KKworZm4gbWFpbigpIC0+IFJlc3VsdDwoKT4geworICAgIGxldCBtYXRjaGVzID0gY2xpKCkuZ2V0X21hdGNoZXMoKTsKKyAgICBtYXRjaCBtYXRjaGVzLnN1YmNvbW1hbmQoKSB7CisgICAgICAgIFNvbWUoKCJjcmVhdGUtY2FjaGUiLCBzdWJfbWF0Y2hlcykpID0+IHsKKyAgICAgICAgICAgIGxldCBwYWNrYWdlID0gZ2V0X3JlcXVpcmVkX2FyZzo6PFN0cmluZz4oc3ViX21hdGNoZXMsICJwYWNrYWdlIik/OworICAgICAgICAgICAgbGV0IGNvbnRhaW5lciA9CisgICAgICAgICAgICAgICAgZ2V0X29wdGlvbmFsX2FyZzo6PFN0cmluZz4oc3ViX21hdGNoZXMsICJjb250YWluZXIiKS5tYXAofGN8IGMuYXNfc3RyKCkpOworICAgICAgICAgICAgbGV0IGRlY2xhcmF0aW9ucyA9IG9wZW5femVyb19vcl9tb3JlX2ZpbGVzKHN1Yl9tYXRjaGVzLCAiZGVjbGFyYXRpb25zIik/OworICAgICAgICAgICAgbGV0IHZhbHVlcyA9IG9wZW5femVyb19vcl9tb3JlX2ZpbGVzKHN1Yl9tYXRjaGVzLCAidmFsdWVzIik/OworICAgICAgICAgICAgbGV0IGRlZmF1bHRfcGVybWlzc2lvbiA9IGdldF9yZXF1aXJlZF9hcmc6OjxhY29uZmlnX3Byb3Rvczo6UHJvdG9GbGFnUGVybWlzc2lvbj4oCisgICAgICAgICAgICAgICAgc3ViX21hdGNoZXMsCisgICAgICAgICAgICAgICAgImRlZmF1bHQtcGVybWlzc2lvbiIsCisgICAgICAgICAgICApPzsKKyAgICAgICAgICAgIGxldCBhbGxvd19yZWFkX3dyaXRlID0gZ2V0X29wdGlvbmFsX2FyZzo6PGJvb2w+KHN1Yl9tYXRjaGVzLCAiYWxsb3ctcmVhZC13cml0ZSIpCisgICAgICAgICAgICAgICAgLmV4cGVjdCgiZmFpbGVkIHRvIHBhcnNlIGFsbG93LXJlYWQtd3JpdGUiKTsKKyAgICAgICAgICAgIGxldCBvdXRwdXQgPSBjb21tYW5kczo6cGFyc2VfZmxhZ3MoCisgICAgICAgICAgICAgICAgcGFja2FnZSwKKyAgICAgICAgICAgICAgICBjb250YWluZXIsCisgICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zLAorICAgICAgICAgICAgICAgIHZhbHVlcywKKyAgICAgICAgICAgICAgICAqZGVmYXVsdF9wZXJtaXNzaW9uLAorICAgICAgICAgICAgICAgICphbGxvd19yZWFkX3dyaXRlLAorICAgICAgICAgICAgKQorICAgICAgICAgICAgLmNvbnRleHQoImZhaWxlZCB0byBjcmVhdGUgY2FjaGUiKT87CisgICAgICAgICAgICBsZXQgcGF0aCA9IGdldF9yZXF1aXJlZF9hcmc6OjxTdHJpbmc+KHN1Yl9tYXRjaGVzLCAiY2FjaGUiKT87CisgICAgICAgICAgICB3cml0ZV9vdXRwdXRfdG9fZmlsZV9vcl9zdGRvdXQocGF0aCwgJm91dHB1dCk/OworICAgICAgICB9CisgICAgICAgIFNvbWUoKCJjcmVhdGUtamF2YS1saWIiLCBzdWJfbWF0Y2hlcykpID0+IHsKKyAgICAgICAgICAgIGxldCBjYWNoZSA9IG9wZW5fc2luZ2xlX2ZpbGUoc3ViX21hdGNoZXMsICJjYWNoZSIpPzsKKyAgICAgICAgICAgIGxldCBtb2RlID0gZ2V0X3JlcXVpcmVkX2FyZzo6PENvZGVnZW5Nb2RlPihzdWJfbWF0Y2hlcywgIm1vZGUiKT87CisgICAgICAgICAgICBsZXQgYWxsb3dfaW5zdHJ1bWVudGF0aW9uID0KKyAgICAgICAgICAgICAgICBnZXRfcmVxdWlyZWRfYXJnOjo8Ym9vbD4oc3ViX21hdGNoZXMsICJhbGxvdy1pbnN0cnVtZW50YXRpb24iKT87CisgICAgICAgICAgICBsZXQgbmV3X2V4cG9ydGVkID0gZ2V0X3JlcXVpcmVkX2FyZzo6PGJvb2w+KHN1Yl9tYXRjaGVzLCAibmV3LWV4cG9ydGVkIik/OworICAgICAgICAgICAgbGV0IGdlbmVyYXRlZF9maWxlcyA9CisgICAgICAgICAgICAgICAgY29tbWFuZHM6OmNyZWF0ZV9qYXZhX2xpYihjYWNoZSwgKm1vZGUsICphbGxvd19pbnN0cnVtZW50YXRpb24sICpuZXdfZXhwb3J0ZWQpCisgICAgICAgICAgICAgICAgICAgIC5jb250ZXh0KCJmYWlsZWQgdG8gY3JlYXRlIGphdmEgbGliIik/OworICAgICAgICAgICAgbGV0IGRpciA9IFBhdGhCdWY6OmZyb20oZ2V0X3JlcXVpcmVkX2FyZzo6PFN0cmluZz4oc3ViX21hdGNoZXMsICJvdXQiKT8pOworICAgICAgICAgICAgZ2VuZXJhdGVkX2ZpbGVzCisgICAgICAgICAgICAgICAgLml0ZXIoKQorICAgICAgICAgICAgICAgIC50cnlfZm9yX2VhY2gofGZpbGV8IHdyaXRlX291dHB1dF9maWxlX3JlYWx0aXZlX3RvX2RpcigmZGlyLCBmaWxlKSk/OworICAgICAgICB9CisgICAgICAgIFNvbWUoKCJjcmVhdGUtY3BwLWxpYiIsIHN1Yl9tYXRjaGVzKSkgPT4geworICAgICAgICAgICAgbGV0IGNhY2hlID0gb3Blbl9zaW5nbGVfZmlsZShzdWJfbWF0Y2hlcywgImNhY2hlIik/OworICAgICAgICAgICAgbGV0IG1vZGUgPSBnZXRfcmVxdWlyZWRfYXJnOjo8Q29kZWdlbk1vZGU+KHN1Yl9tYXRjaGVzLCAibW9kZSIpPzsKKyAgICAgICAgICAgIGxldCBhbGxvd19pbnN0cnVtZW50YXRpb24gPQorICAgICAgICAgICAgICAgIGdldF9yZXF1aXJlZF9hcmc6Ojxib29sPihzdWJfbWF0Y2hlcywgImFsbG93LWluc3RydW1lbnRhdGlvbiIpPzsKKyAgICAgICAgICAgIGxldCBnZW5lcmF0ZWRfZmlsZXMgPSBjb21tYW5kczo6Y3JlYXRlX2NwcF9saWIoY2FjaGUsICptb2RlLCAqYWxsb3dfaW5zdHJ1bWVudGF0aW9uKQorICAgICAgICAgICAgICAgIC5jb250ZXh0KCJmYWlsZWQgdG8gY3JlYXRlIGNwcCBsaWIiKT87CisgICAgICAgICAgICBsZXQgZGlyID0gUGF0aEJ1Zjo6ZnJvbShnZXRfcmVxdWlyZWRfYXJnOjo8U3RyaW5nPihzdWJfbWF0Y2hlcywgIm91dCIpPyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRfZmlsZXMKKyAgICAgICAgICAgICAgICAuaXRlcigpCisgICAgICAgICAgICAgICAgLnRyeV9mb3JfZWFjaCh8ZmlsZXwgd3JpdGVfb3V0cHV0X2ZpbGVfcmVhbHRpdmVfdG9fZGlyKCZkaXIsIGZpbGUpKT87CisgICAgICAgIH0KKyAgICAgICAgU29tZSgoImNyZWF0ZS1ydXN0LWxpYiIsIHN1Yl9tYXRjaGVzKSkgPT4geworICAgICAgICAgICAgbGV0IGNhY2hlID0gb3Blbl9zaW5nbGVfZmlsZShzdWJfbWF0Y2hlcywgImNhY2hlIik/OworICAgICAgICAgICAgbGV0IG1vZGUgPSBnZXRfcmVxdWlyZWRfYXJnOjo8Q29kZWdlbk1vZGU+KHN1Yl9tYXRjaGVzLCAibW9kZSIpPzsKKyAgICAgICAgICAgIGxldCBhbGxvd19pbnN0cnVtZW50YXRpb24gPQorICAgICAgICAgICAgICAgIGdldF9yZXF1aXJlZF9hcmc6Ojxib29sPihzdWJfbWF0Y2hlcywgImFsbG93LWluc3RydW1lbnRhdGlvbiIpPzsKKyAgICAgICAgICAgIGxldCBnZW5lcmF0ZWRfZmlsZSA9IGNvbW1hbmRzOjpjcmVhdGVfcnVzdF9saWIoY2FjaGUsICptb2RlLCAqYWxsb3dfaW5zdHJ1bWVudGF0aW9uKQorICAgICAgICAgICAgICAgIC5jb250ZXh0KCJmYWlsZWQgdG8gY3JlYXRlIHJ1c3QgbGliIik/OworICAgICAgICAgICAgbGV0IGRpciA9IFBhdGhCdWY6OmZyb20oZ2V0X3JlcXVpcmVkX2FyZzo6PFN0cmluZz4oc3ViX21hdGNoZXMsICJvdXQiKT8pOworICAgICAgICAgICAgd3JpdGVfb3V0cHV0X2ZpbGVfcmVhbHRpdmVfdG9fZGlyKCZkaXIsICZnZW5lcmF0ZWRfZmlsZSk/OworICAgICAgICB9CisgICAgICAgIFNvbWUoKCJjcmVhdGUtZGV2aWNlLWNvbmZpZy1kZWZhdWx0cyIsIHN1Yl9tYXRjaGVzKSkgPT4geworICAgICAgICAgICAgbGV0IGNhY2hlID0gb3Blbl9zaW5nbGVfZmlsZShzdWJfbWF0Y2hlcywgImNhY2hlIik/OworICAgICAgICAgICAgbGV0IG91dHB1dCA9IGNvbW1hbmRzOjpjcmVhdGVfZGV2aWNlX2NvbmZpZ19kZWZhdWx0cyhjYWNoZSkKKyAgICAgICAgICAgICAgICAuY29udGV4dCgiZmFpbGVkIHRvIGNyZWF0ZSBkZXZpY2UgY29uZmlnIGRlZmF1bHRzIik/OworICAgICAgICAgICAgbGV0IHBhdGggPSBnZXRfcmVxdWlyZWRfYXJnOjo8U3RyaW5nPihzdWJfbWF0Y2hlcywgIm91dCIpPzsKKyAgICAgICAgICAgIHdyaXRlX291dHB1dF90b19maWxlX29yX3N0ZG91dChwYXRoLCAmb3V0cHV0KT87CisgICAgICAgIH0KKyAgICAgICAgU29tZSgoImNyZWF0ZS1kZXZpY2UtY29uZmlnLXN5c3Byb3BzIiwgc3ViX21hdGNoZXMpKSA9PiB7CisgICAgICAgICAgICBsZXQgY2FjaGUgPSBvcGVuX3NpbmdsZV9maWxlKHN1Yl9tYXRjaGVzLCAiY2FjaGUiKT87CisgICAgICAgICAgICBsZXQgb3V0cHV0ID0gY29tbWFuZHM6OmNyZWF0ZV9kZXZpY2VfY29uZmlnX3N5c3Byb3BzKGNhY2hlKQorICAgICAgICAgICAgICAgIC5jb250ZXh0KCJmYWlsZWQgdG8gY3JlYXRlIGRldmljZSBjb25maWcgc3lzcHJvcHMiKT87CisgICAgICAgICAgICBsZXQgcGF0aCA9IGdldF9yZXF1aXJlZF9hcmc6OjxTdHJpbmc+KHN1Yl9tYXRjaGVzLCAib3V0Iik/OworICAgICAgICAgICAgd3JpdGVfb3V0cHV0X3RvX2ZpbGVfb3Jfc3Rkb3V0KHBhdGgsICZvdXRwdXQpPzsKKyAgICAgICAgfQorICAgICAgICBTb21lKCgiZHVtcC1jYWNoZSIsIHN1Yl9tYXRjaGVzKSkgPT4geworICAgICAgICAgICAgbGV0IGlucHV0ID0gb3Blbl96ZXJvX29yX21vcmVfZmlsZXMoc3ViX21hdGNoZXMsICJjYWNoZSIpPzsKKyAgICAgICAgICAgIGxldCBmb3JtYXQgPSBnZXRfcmVxdWlyZWRfYXJnOjo8RHVtcEZvcm1hdD4oc3ViX21hdGNoZXMsICJmb3JtYXQiKQorICAgICAgICAgICAgICAgIC5jb250ZXh0KCJmYWlsZWQgdG8gZHVtcCBwcmV2aW91c2x5IHBhcnNlZCBmbGFncyIpPzsKKyAgICAgICAgICAgIGxldCBmaWx0ZXJzID0gc3ViX21hdGNoZXMKKyAgICAgICAgICAgICAgICAuZ2V0X21hbnk6OjxTdHJpbmc+KCJmaWx0ZXIiKQorICAgICAgICAgICAgICAgIC51bndyYXBfb3JfZGVmYXVsdCgpCisgICAgICAgICAgICAgICAgLm1hcChTdHJpbmc6OmFzX3JlZikKKyAgICAgICAgICAgICAgICAuY29sbGVjdDo6PFZlYzxfPj4oKTsKKyAgICAgICAgICAgIGxldCBkZWR1cCA9IGdldF9yZXF1aXJlZF9hcmc6Ojxib29sPihzdWJfbWF0Y2hlcywgImRlZHVwIik/OworICAgICAgICAgICAgbGV0IG91dHB1dCA9IGNvbW1hbmRzOjpkdW1wX3BhcnNlZF9mbGFncyhpbnB1dCwgZm9ybWF0LmNsb25lKCksICZmaWx0ZXJzLCAqZGVkdXApPzsKKyAgICAgICAgICAgIGxldCBwYXRoID0gZ2V0X3JlcXVpcmVkX2FyZzo6PFN0cmluZz4oc3ViX21hdGNoZXMsICJvdXQiKT87CisgICAgICAgICAgICB3cml0ZV9vdXRwdXRfdG9fZmlsZV9vcl9zdGRvdXQocGF0aCwgJm91dHB1dCk/OworICAgICAgICB9CisgICAgICAgIFNvbWUoKCJjcmVhdGUtc3RvcmFnZSIsIHN1Yl9tYXRjaGVzKSkgPT4geworICAgICAgICAgICAgbGV0IHZlcnNpb24gPQorICAgICAgICAgICAgICAgIGdldF9vcHRpb25hbF9hcmc6Ojx1MzI+KHN1Yl9tYXRjaGVzLCAidmVyc2lvbiIpLnVud3JhcF9vcigmREVGQVVMVF9GSUxFX1ZFUlNJT04pOworICAgICAgICAgICAgaWYgKnZlcnNpb24gPiBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiB7CisgICAgICAgICAgICAgICAgYmFpbCEoIkludmFsaWQgdmVyc2lvbiBzZWxlY3RlZCAoe30pIiwgdmVyc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZXQgZmlsZSA9IGdldF9yZXF1aXJlZF9hcmc6OjxTdG9yYWdlRmlsZVR5cGU+KHN1Yl9tYXRjaGVzLCAiZmlsZSIpCisgICAgICAgICAgICAgICAgLmNvbnRleHQoIkludmFsaWQgc3RvcmFnZSBmaWxlIHNlbGVjdGlvbiIpPzsKKyAgICAgICAgICAgIGxldCBjYWNoZSA9IG9wZW5femVyb19vcl9tb3JlX2ZpbGVzKHN1Yl9tYXRjaGVzLCAiY2FjaGUiKT87CisgICAgICAgICAgICBsZXQgY29udGFpbmVyID0gZ2V0X3JlcXVpcmVkX2FyZzo6PFN0cmluZz4oc3ViX21hdGNoZXMsICJjb250YWluZXIiKT87CisgICAgICAgICAgICBsZXQgcGF0aCA9IGdldF9yZXF1aXJlZF9hcmc6OjxTdHJpbmc+KHN1Yl9tYXRjaGVzLCAib3V0Iik/OworCisgICAgICAgICAgICBsZXQgb3V0cHV0ID0gY29tbWFuZHM6OmNyZWF0ZV9zdG9yYWdlKGNhY2hlLCBjb250YWluZXIsIGZpbGUsICp2ZXJzaW9uKQorICAgICAgICAgICAgICAgIC5jb250ZXh0KCJmYWlsZWQgdG8gY3JlYXRlIHN0b3JhZ2UgZmlsZXMiKT87CisgICAgICAgICAgICB3cml0ZV9vdXRwdXRfdG9fZmlsZV9vcl9zdGRvdXQocGF0aCwgJm91dHB1dCk/OworICAgICAgICB9CisgICAgICAgIF8gPT4gdW5yZWFjaGFibGUhKCksCisgICAgfQorICAgIE9rKCgpKQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9zdG9yYWdlL2ZsYWdfaW5mby5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvc3RvcmFnZS9mbGFnX2luZm8ucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk0M2RhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvc3RvcmFnZS9mbGFnX2luZm8ucnMKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzZSBjcmF0ZTo6Y29tbWFuZHM6OmFzc2lnbl9mbGFnX2lkczsKK3VzZSBjcmF0ZTo6c3RvcmFnZTo6RmxhZ1BhY2thZ2U7Cit1c2UgYWNvbmZpZ19wcm90b3M6OntQcm90b0ZsYWdQZXJtaXNzaW9uLCBQcm90b0ZsYWdTdGF0ZX07Cit1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OntGbGFnSW5mb0hlYWRlciwgRmxhZ0luZm9MaXN0LCBGbGFnSW5mb05vZGUsIFN0b3JhZ2VGaWxlVHlwZX07Cit1c2UgYW55aG93Ojp7YW55aG93LCBSZXN1bHR9OworCitmbiBuZXdfaGVhZGVyKGNvbnRhaW5lcjogJnN0ciwgbnVtX2ZsYWdzOiB1MzIsIHZlcnNpb246IHUzMikgLT4gRmxhZ0luZm9IZWFkZXIgeworICAgIEZsYWdJbmZvSGVhZGVyIHsKKyAgICAgICAgdmVyc2lvbiwKKyAgICAgICAgY29udGFpbmVyOiBTdHJpbmc6OmZyb20oY29udGFpbmVyKSwKKyAgICAgICAgZmlsZV90eXBlOiBTdG9yYWdlRmlsZVR5cGU6OkZsYWdJbmZvIGFzIHU4LAorICAgICAgICBmaWxlX3NpemU6IDAsCisgICAgICAgIG51bV9mbGFncywKKyAgICAgICAgYm9vbGVhbl9mbGFnX29mZnNldDogMCwKKyAgICB9Cit9CisKK3B1YiBmbiBjcmVhdGVfZmxhZ19pbmZvKAorICAgIGNvbnRhaW5lcjogJnN0ciwKKyAgICBwYWNrYWdlczogJltGbGFnUGFja2FnZV0sCisgICAgdmVyc2lvbjogdTMyLAorKSAtPiBSZXN1bHQ8RmxhZ0luZm9MaXN0PiB7CisgICAgLy8gRXhjbHVkZSBzeXN0ZW0vdmVuZG9yL3Byb2R1Y3QgZmxhZ3MgdGhhdCBhcmUgUk8rZGlzYWJsZWQuCisgICAgbGV0IG11dCBmaWx0ZXJlZF9wYWNrYWdlcyA9IHBhY2thZ2VzLnRvX3ZlYygpOworICAgIGlmIGNvbnRhaW5lciA9PSAic3lzdGVtIiB8fCBjb250YWluZXIgPT0gInZlbmRvciIgfHwgY29udGFpbmVyID09ICJwcm9kdWN0IiB7CisgICAgICAgIGZvciBwYWNrYWdlIGluIGZpbHRlcmVkX3BhY2thZ2VzLml0ZXJfbXV0KCkgeworICAgICAgICAgICAgcGFja2FnZS5ib29sZWFuX2ZsYWdzLnJldGFpbih8YnwgeworICAgICAgICAgICAgICAgICEoYi5zdGF0ZSA9PSBTb21lKFByb3RvRmxhZ1N0YXRlOjpESVNBQkxFRC5pbnRvKCkpCisgICAgICAgICAgICAgICAgICAgICYmIGIucGVybWlzc2lvbiA9PSBTb21lKFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfT05MWS5pbnRvKCkpKQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsZXQgbnVtX2ZsYWdzID0gZmlsdGVyZWRfcGFja2FnZXMuaXRlcigpLm1hcCh8cGtnfCBwa2cuYm9vbGVhbl9mbGFncy5sZW4oKSBhcyB1MzIpLnN1bSgpOworCisgICAgbGV0IG11dCBpc19mbGFnX3J3ID0gdmVjIVtmYWxzZTsgbnVtX2ZsYWdzIGFzIHVzaXplXTsKKyAgICBmb3IgcGtnIGluIGZpbHRlcmVkX3BhY2thZ2VzIHsKKyAgICAgICAgbGV0IHN0YXJ0X2luZGV4ID0gcGtnLmJvb2xlYW5fc3RhcnRfaW5kZXggYXMgdXNpemU7CisgICAgICAgIGxldCBmbGFnX2lkcyA9IGFzc2lnbl9mbGFnX2lkcyhwa2cucGFja2FnZV9uYW1lLCBwa2cuYm9vbGVhbl9mbGFncy5pdGVyKCkuY29waWVkKCkpPzsKKyAgICAgICAgZm9yIHBmIGluIHBrZy5ib29sZWFuX2ZsYWdzIHsKKyAgICAgICAgICAgIGxldCBmaWQgPSBmbGFnX2lkcworICAgICAgICAgICAgICAgIC5nZXQocGYubmFtZSgpKQorICAgICAgICAgICAgICAgIC5va19vcihhbnlob3chKGZvcm1hdCEoIm1pc3NpbmcgZmxhZyBpZCBmb3Ige30iLCBwZi5uYW1lKCkpKSk/OworICAgICAgICAgICAgaXNfZmxhZ19yd1tzdGFydF9pbmRleCArICgqZmlkIGFzIHVzaXplKV0gPQorICAgICAgICAgICAgICAgIHBmLnBlcm1pc3Npb24oKSA9PSBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFOworICAgICAgICB9CisgICAgfQorCisgICAgbGV0IG11dCBsaXN0ID0gRmxhZ0luZm9MaXN0IHsKKyAgICAgICAgaGVhZGVyOiBuZXdfaGVhZGVyKGNvbnRhaW5lciwgbnVtX2ZsYWdzLCB2ZXJzaW9uKSwKKyAgICAgICAgbm9kZXM6IGlzX2ZsYWdfcncuaXRlcigpLm1hcCh8JnJ3fCBGbGFnSW5mb05vZGU6OmNyZWF0ZShydykpLmNvbGxlY3QoKSwKKyAgICB9OworCisgICAgLy8gaW5pdGlhbGl6ZSBhbGwgaGVhZGVyIGZpZWxkcworICAgIGxpc3QuaGVhZGVyLmJvb2xlYW5fZmxhZ19vZmZzZXQgPSBsaXN0LmhlYWRlci5pbnRvX2J5dGVzKCkubGVuKCkgYXMgdTMyOworICAgIGxldCBieXRlc19wZXJfbm9kZSA9IEZsYWdJbmZvTm9kZTo6Y3JlYXRlKGZhbHNlKS5pbnRvX2J5dGVzKCkubGVuKCkgYXMgdTMyOworICAgIGxpc3QuaGVhZGVyLmZpbGVfc2l6ZSA9IGxpc3QuaGVhZGVyLmJvb2xlYW5fZmxhZ19vZmZzZXQgKyBudW1fZmxhZ3MgKiBieXRlc19wZXJfbm9kZTsKKworICAgIE9rKGxpc3QpCit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIGNyYXRlOjpzdG9yYWdlOjp7Z3JvdXBfZmxhZ3NfYnlfcGFja2FnZSwgdGVzdHM6OnBhcnNlX2FsbF90ZXN0X2ZsYWdzfTsKKyAgICB1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OkRFRkFVTFRfRklMRV9WRVJTSU9OOworCisgICAgcHViIGZuIGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0X2Zyb21fc291cmNlKCkgLT4gUmVzdWx0PEZsYWdJbmZvTGlzdD4geworICAgICAgICBsZXQgY2FjaGVzID0gcGFyc2VfYWxsX3Rlc3RfZmxhZ3MoKTsKKyAgICAgICAgbGV0IHBhY2thZ2VzID0gZ3JvdXBfZmxhZ3NfYnlfcGFja2FnZShjYWNoZXMuaXRlcigpLCBERUZBVUxUX0ZJTEVfVkVSU0lPTik7CisgICAgICAgIGNyZWF0ZV9mbGFnX2luZm8oIm1vY2t1cCIsICZwYWNrYWdlcywgREVGQVVMVF9GSUxFX1ZFUlNJT04pCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRoZSBmbGFnIGluZm8gY3JlYXRpb24gYW5kIGVhY2ggZmllbGQKKyAgICBmbiB0ZXN0X2xpc3RfY29udGVudHMoKSB7CisgICAgICAgIGxldCBmbGFnX2luZm9fbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0X2Zyb21fc291cmNlKCk7CisgICAgICAgIGFzc2VydCEoZmxhZ19pbmZvX2xpc3QuaXNfb2soKSk7CisgICAgICAgIGxldCBleHBlY3RlZF9mbGFnX2luZm9fbGlzdCA9CisgICAgICAgICAgICBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6dGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pOworICAgICAgICBhc3NlcnRfZXEhKGZsYWdfaW5mb19saXN0LnVud3JhcCgpLCBleHBlY3RlZF9mbGFnX2luZm9fbGlzdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9zdG9yYWdlL2ZsYWdfdGFibGUucnMgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3N0b3JhZ2UvZmxhZ190YWJsZS5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2I0ZThmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9zdG9yYWdlL2ZsYWdfdGFibGUucnMKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2UgY3JhdGU6OmNvbW1hbmRzOjp7YXNzaWduX2ZsYWdfaWRzLCBzaG91bGRfaW5jbHVkZV9mbGFnfTsKK3VzZSBjcmF0ZTo6c3RvcmFnZTo6RmxhZ1BhY2thZ2U7Cit1c2UgYWNvbmZpZ19wcm90b3M6OlByb3RvRmxhZ1Blcm1pc3Npb247Cit1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OnsKKyAgICBnZXRfdGFibGVfc2l6ZSwgRmxhZ1RhYmxlLCBGbGFnVGFibGVIZWFkZXIsIEZsYWdUYWJsZU5vZGUsIFN0b3JhZ2VGaWxlVHlwZSwgU3RvcmVkRmxhZ1R5cGUsCit9OwordXNlIGFueWhvdzo6e2FueWhvdywgUmVzdWx0fTsKKworZm4gbmV3X2hlYWRlcihjb250YWluZXI6ICZzdHIsIG51bV9mbGFnczogdTMyLCB2ZXJzaW9uOiB1MzIpIC0+IEZsYWdUYWJsZUhlYWRlciB7CisgICAgRmxhZ1RhYmxlSGVhZGVyIHsKKyAgICAgICAgdmVyc2lvbiwKKyAgICAgICAgY29udGFpbmVyOiBTdHJpbmc6OmZyb20oY29udGFpbmVyKSwKKyAgICAgICAgZmlsZV90eXBlOiBTdG9yYWdlRmlsZVR5cGU6OkZsYWdNYXAgYXMgdTgsCisgICAgICAgIGZpbGVfc2l6ZTogMCwKKyAgICAgICAgbnVtX2ZsYWdzLAorICAgICAgICBidWNrZXRfb2Zmc2V0OiAwLAorICAgICAgICBub2RlX29mZnNldDogMCwKKyAgICB9Cit9CisKKy8vIGEgc3RydWN0IHRoYXQgY29udGFpbnMgRmxhZ1RhYmxlTm9kZSBhbmQgYSBidW5jaCBvZiBvdGhlciBpbmZvcm1hdGlvbiB0byBoZWxwCisvLyBmbGFnIHRhYmxlIGNyZWF0aW9uCisjW2Rlcml2ZShQYXJ0aWFsRXEsIERlYnVnLCBDbG9uZSldCitzdHJ1Y3QgRmxhZ1RhYmxlTm9kZVdyYXBwZXIgeworICAgIHB1YiBub2RlOiBGbGFnVGFibGVOb2RlLAorICAgIHB1YiBidWNrZXRfaW5kZXg6IHUzMiwKK30KKworaW1wbCBGbGFnVGFibGVOb2RlV3JhcHBlciB7CisgICAgZm4gbmV3KAorICAgICAgICBwYWNrYWdlX2lkOiB1MzIsCisgICAgICAgIGZsYWdfbmFtZTogJnN0ciwKKyAgICAgICAgZmxhZ190eXBlOiBTdG9yZWRGbGFnVHlwZSwKKyAgICAgICAgZmxhZ19pbmRleDogdTE2LAorICAgICAgICBudW1fYnVja2V0czogdTMyLAorICAgICkgLT4gU2VsZiB7CisgICAgICAgIGxldCBidWNrZXRfaW5kZXggPSBGbGFnVGFibGVOb2RlOjpmaW5kX2J1Y2tldF9pbmRleChwYWNrYWdlX2lkLCBmbGFnX25hbWUsIG51bV9idWNrZXRzKTsKKyAgICAgICAgbGV0IG5vZGUgPSBGbGFnVGFibGVOb2RlIHsKKyAgICAgICAgICAgIHBhY2thZ2VfaWQsCisgICAgICAgICAgICBmbGFnX25hbWU6IGZsYWdfbmFtZS50b19zdHJpbmcoKSwKKyAgICAgICAgICAgIGZsYWdfdHlwZSwKKyAgICAgICAgICAgIGZsYWdfaW5kZXgsCisgICAgICAgICAgICBuZXh0X29mZnNldDogTm9uZSwKKyAgICAgICAgfTsKKyAgICAgICAgU2VsZiB7IG5vZGUsIGJ1Y2tldF9pbmRleCB9CisgICAgfQorCisgICAgZm4gY3JlYXRlX25vZGVzKHBhY2thZ2U6ICZGbGFnUGFja2FnZSwgbnVtX2J1Y2tldHM6IHUzMikgLT4gUmVzdWx0PFZlYzxTZWxmPj4geworICAgICAgICAvLyBFeGNsdWRlIHN5c3RlbS92ZW5kb3IvcHJvZHVjdCBmbGFncyB0aGF0IGFyZSBSTytkaXNhYmxlZC4KKyAgICAgICAgbGV0IG11dCBmaWx0ZXJlZF9wYWNrYWdlID0gcGFja2FnZS5jbG9uZSgpOworICAgICAgICBmaWx0ZXJlZF9wYWNrYWdlLmJvb2xlYW5fZmxhZ3MucmV0YWluKHxwZnwgc2hvdWxkX2luY2x1ZGVfZmxhZyhwZikpOworCisgICAgICAgIGxldCBmbGFnX2lkcyA9CisgICAgICAgICAgICBhc3NpZ25fZmxhZ19pZHMocGFja2FnZS5wYWNrYWdlX25hbWUsIGZpbHRlcmVkX3BhY2thZ2UuYm9vbGVhbl9mbGFncy5pdGVyKCkuY29waWVkKCkpPzsKKyAgICAgICAgZmlsdGVyZWRfcGFja2FnZQorICAgICAgICAgICAgLmJvb2xlYW5fZmxhZ3MKKyAgICAgICAgICAgIC5pdGVyKCkKKyAgICAgICAgICAgIC5tYXAofCZwZnwgeworICAgICAgICAgICAgICAgIGxldCBmaWQgPSBmbGFnX2lkcworICAgICAgICAgICAgICAgICAgICAuZ2V0KHBmLm5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgLm9rX29yKGFueWhvdyEoZm9ybWF0ISgibWlzc2luZyBmbGFnIGlkIGZvciB7fSIsIHBmLm5hbWUoKSkpKT87CisgICAgICAgICAgICAgICAgbGV0IGZsYWdfdHlwZSA9IGlmIHBmLmlzX2ZpeGVkX3JlYWRfb25seSgpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RvcmVkRmxhZ1R5cGU6OkZpeGVkUmVhZE9ubHlCb29sZWFuCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2ggcGYucGVybWlzc2lvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfV1JJVEUgPT4gU3RvcmVkRmxhZ1R5cGU6OlJlYWRXcml0ZUJvb2xlYW4sCisgICAgICAgICAgICAgICAgICAgICAgICBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX09OTFkgPT4gU3RvcmVkRmxhZ1R5cGU6OlJlYWRPbmx5Qm9vbGVhbiwKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgT2soU2VsZjo6bmV3KHBhY2thZ2UucGFja2FnZV9pZCwgcGYubmFtZSgpLCBmbGFnX3R5cGUsICpmaWQsIG51bV9idWNrZXRzKSkKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgICAuY29sbGVjdDo6PFJlc3VsdDxWZWM8Xz4+PigpCisgICAgfQorfQorCitwdWIgZm4gY3JlYXRlX2ZsYWdfdGFibGUoCisgICAgY29udGFpbmVyOiAmc3RyLAorICAgIHBhY2thZ2VzOiAmW0ZsYWdQYWNrYWdlXSwKKyAgICB2ZXJzaW9uOiB1MzIsCispIC0+IFJlc3VsdDxGbGFnVGFibGU+IHsKKyAgICAvLyBjcmVhdGUgdGFibGUKKyAgICBsZXQgbnVtX2ZsYWdzID0gcGFja2FnZXMuaXRlcigpLm1hcCh8cGtnfCBwa2cuYm9vbGVhbl9mbGFncy5sZW4oKSBhcyB1MzIpLnN1bSgpOworICAgIGxldCBudW1fYnVja2V0cyA9IGdldF90YWJsZV9zaXplKG51bV9mbGFncyk/OworCisgICAgbGV0IG11dCBoZWFkZXIgPSBuZXdfaGVhZGVyKGNvbnRhaW5lciwgbnVtX2ZsYWdzLCB2ZXJzaW9uKTsKKyAgICBsZXQgbXV0IGJ1Y2tldHMgPSB2ZWMhW05vbmU7IG51bV9idWNrZXRzIGFzIHVzaXplXTsKKyAgICBsZXQgbXV0IG5vZGVfd3JhcHBlcnMgPSBwYWNrYWdlcworICAgICAgICAuaXRlcigpCisgICAgICAgIC5tYXAofHBrZ3wgRmxhZ1RhYmxlTm9kZVdyYXBwZXI6OmNyZWF0ZV9ub2Rlcyhwa2csIG51bV9idWNrZXRzKSkKKyAgICAgICAgLmNvbGxlY3Q6OjxSZXN1bHQ8VmVjPF8+Pj4oKT8KKyAgICAgICAgLmNvbmNhdCgpOworCisgICAgLy8gaW5pdGlhbGl6ZSBhbGwgaGVhZGVyIGZpZWxkcworICAgIGhlYWRlci5idWNrZXRfb2Zmc2V0ID0gaGVhZGVyLmludG9fYnl0ZXMoKS5sZW4oKSBhcyB1MzI7CisgICAgaGVhZGVyLm5vZGVfb2Zmc2V0ID0gaGVhZGVyLmJ1Y2tldF9vZmZzZXQgKyBudW1fYnVja2V0cyAqIDQ7CisgICAgaGVhZGVyLmZpbGVfc2l6ZSA9IGhlYWRlci5ub2RlX29mZnNldAorICAgICAgICArIG5vZGVfd3JhcHBlcnMuaXRlcigpLm1hcCh8eHwgeC5ub2RlLmludG9fYnl0ZXMoKS5sZW4oKSkuc3VtOjo8dXNpemU+KCkgYXMgdTMyOworCisgICAgLy8gc29ydCBub2RlcyBieSBidWNrZXQgaW5kZXggZm9yIGVmZmljaWVuY3kKKyAgICBub2RlX3dyYXBwZXJzLnNvcnRfYnkofGEsIGJ8IGEuYnVja2V0X2luZGV4LmNtcCgmYi5idWNrZXRfaW5kZXgpKTsKKworICAgIC8vIGZpbGwgYWxsIG5vZGUgb2Zmc2V0CisgICAgbGV0IG11dCBvZmZzZXQgPSBoZWFkZXIubm9kZV9vZmZzZXQ7CisgICAgZm9yIGkgaW4gMC4ubm9kZV93cmFwcGVycy5sZW4oKSB7CisgICAgICAgIGxldCBub2RlX2J1Y2tldF9pZHggPSBub2RlX3dyYXBwZXJzW2ldLmJ1Y2tldF9pbmRleDsKKyAgICAgICAgbGV0IG5leHRfbm9kZV9idWNrZXRfaWR4ID0gaWYgaSArIDEgPCBub2RlX3dyYXBwZXJzLmxlbigpIHsKKyAgICAgICAgICAgIFNvbWUobm9kZV93cmFwcGVyc1tpICsgMV0uYnVja2V0X2luZGV4KQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTm9uZQorICAgICAgICB9OworCisgICAgICAgIGlmIGJ1Y2tldHNbbm9kZV9idWNrZXRfaWR4IGFzIHVzaXplXS5pc19ub25lKCkgeworICAgICAgICAgICAgYnVja2V0c1tub2RlX2J1Y2tldF9pZHggYXMgdXNpemVdID0gU29tZShvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSBub2RlX3dyYXBwZXJzW2ldLm5vZGUuaW50b19ieXRlcygpLmxlbigpIGFzIHUzMjsKKworICAgICAgICBpZiBsZXQgU29tZShpbmRleCkgPSBuZXh0X25vZGVfYnVja2V0X2lkeCB7CisgICAgICAgICAgICBpZiBpbmRleCA9PSBub2RlX2J1Y2tldF9pZHggeworICAgICAgICAgICAgICAgIG5vZGVfd3JhcHBlcnNbaV0ubm9kZS5uZXh0X29mZnNldCA9IFNvbWUob2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGxldCB0YWJsZSA9CisgICAgICAgIEZsYWdUYWJsZSB7IGhlYWRlciwgYnVja2V0cywgbm9kZXM6IG5vZGVfd3JhcHBlcnMuaW50b19pdGVyKCkubWFwKHxud3wgbncubm9kZSkuY29sbGVjdCgpIH07CisKKyAgICBPayh0YWJsZSkKK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6REVGQVVMVF9GSUxFX1ZFUlNJT047CisKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIGNyYXRlOjpzdG9yYWdlOjp7Z3JvdXBfZmxhZ3NfYnlfcGFja2FnZSwgdGVzdHM6OnBhcnNlX2FsbF90ZXN0X2ZsYWdzfTsKKworICAgIGZuIGNyZWF0ZV90ZXN0X2ZsYWdfdGFibGVfZnJvbV9zb3VyY2UoKSAtPiBSZXN1bHQ8RmxhZ1RhYmxlPiB7CisgICAgICAgIGxldCBjYWNoZXMgPSBwYXJzZV9hbGxfdGVzdF9mbGFncygpOworICAgICAgICBsZXQgcGFja2FnZXMgPSBncm91cF9mbGFnc19ieV9wYWNrYWdlKGNhY2hlcy5pdGVyKCksIERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgY3JlYXRlX2ZsYWdfdGFibGUoIm1vY2t1cCIsICZwYWNrYWdlcywgREVGQVVMVF9GSUxFX1ZFUlNJT04pCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRoZSB0YWJsZSBjcmVhdGlvbiBhbmQgZWFjaCBmaWVsZAorICAgIGZuIHRlc3RfdGFibGVfY29udGVudHMoKSB7CisgICAgICAgIGxldCBmbGFnX3RhYmxlID0gY3JlYXRlX3Rlc3RfZmxhZ190YWJsZV9mcm9tX3NvdXJjZSgpOworICAgICAgICBhc3NlcnQhKGZsYWdfdGFibGUuaXNfb2soKSk7CisgICAgICAgIGxldCBleHBlY3RlZF9mbGFnX3RhYmxlID0KKyAgICAgICAgICAgIGFjb25maWdfc3RvcmFnZV9maWxlOjp0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9mbGFnX3RhYmxlKERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgYXNzZXJ0X2VxIShmbGFnX3RhYmxlLnVud3JhcCgpLCBleHBlY3RlZF9mbGFnX3RhYmxlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3N0b3JhZ2UvZmxhZ192YWx1ZS5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvc3RvcmFnZS9mbGFnX3ZhbHVlLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZmE0NDcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3N0b3JhZ2UvZmxhZ192YWx1ZS5ycwpAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNlIGNyYXRlOjpjb21tYW5kczo6YXNzaWduX2ZsYWdfaWRzOwordXNlIGNyYXRlOjpzdG9yYWdlOjpGbGFnUGFja2FnZTsKK3VzZSBhY29uZmlnX3Byb3Rvczo6e1Byb3RvRmxhZ1Blcm1pc3Npb24sIFByb3RvRmxhZ1N0YXRlfTsKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6e0ZsYWdWYWx1ZUhlYWRlciwgRmxhZ1ZhbHVlTGlzdCwgU3RvcmFnZUZpbGVUeXBlfTsKK3VzZSBhbnlob3c6Onthbnlob3csIFJlc3VsdH07CisKK2ZuIG5ld19oZWFkZXIoY29udGFpbmVyOiAmc3RyLCBudW1fZmxhZ3M6IHUzMiwgdmVyc2lvbjogdTMyKSAtPiBGbGFnVmFsdWVIZWFkZXIgeworICAgIEZsYWdWYWx1ZUhlYWRlciB7CisgICAgICAgIHZlcnNpb24sCisgICAgICAgIGNvbnRhaW5lcjogU3RyaW5nOjpmcm9tKGNvbnRhaW5lciksCisgICAgICAgIGZpbGVfdHlwZTogU3RvcmFnZUZpbGVUeXBlOjpGbGFnVmFsIGFzIHU4LAorICAgICAgICBmaWxlX3NpemU6IDAsCisgICAgICAgIG51bV9mbGFncywKKyAgICAgICAgYm9vbGVhbl92YWx1ZV9vZmZzZXQ6IDAsCisgICAgfQorfQorCitwdWIgZm4gY3JlYXRlX2ZsYWdfdmFsdWUoCisgICAgY29udGFpbmVyOiAmc3RyLAorICAgIHBhY2thZ2VzOiAmW0ZsYWdQYWNrYWdlXSwKKyAgICB2ZXJzaW9uOiB1MzIsCispIC0+IFJlc3VsdDxGbGFnVmFsdWVMaXN0PiB7CisgICAgLy8gRXhjbHVkZSBzeXN0ZW0vdmVuZG9yL3Byb2R1Y3QgZmxhZ3MgdGhhdCBhcmUgUk8rZGlzYWJsZWQuCisgICAgbGV0IG11dCBmaWx0ZXJlZF9wYWNrYWdlcyA9IHBhY2thZ2VzLnRvX3ZlYygpOworICAgIGlmIGNvbnRhaW5lciA9PSAic3lzdGVtIiB8fCBjb250YWluZXIgPT0gInZlbmRvciIgfHwgY29udGFpbmVyID09ICJwcm9kdWN0IiB7CisgICAgICAgIGZvciBwYWNrYWdlIGluIGZpbHRlcmVkX3BhY2thZ2VzLml0ZXJfbXV0KCkgeworICAgICAgICAgICAgcGFja2FnZS5ib29sZWFuX2ZsYWdzLnJldGFpbih8YnwgeworICAgICAgICAgICAgICAgICEoYi5zdGF0ZSA9PSBTb21lKFByb3RvRmxhZ1N0YXRlOjpESVNBQkxFRC5pbnRvKCkpCisgICAgICAgICAgICAgICAgICAgICYmIGIucGVybWlzc2lvbiA9PSBTb21lKFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfT05MWS5pbnRvKCkpKQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisgICAgbGV0IG51bV9mbGFncyA9IGZpbHRlcmVkX3BhY2thZ2VzLml0ZXIoKS5tYXAofHBrZ3wgcGtnLmJvb2xlYW5fZmxhZ3MubGVuKCkgYXMgdTMyKS5zdW0oKTsKKyAgICBsZXQgbXV0IGxpc3QgPSBGbGFnVmFsdWVMaXN0IHsKKyAgICAgICAgaGVhZGVyOiBuZXdfaGVhZGVyKGNvbnRhaW5lciwgbnVtX2ZsYWdzLCB2ZXJzaW9uKSwKKyAgICAgICAgYm9vbGVhbnM6IHZlYyFbZmFsc2U7IG51bV9mbGFncyBhcyB1c2l6ZV0sCisgICAgfTsKKyAgICBmb3IgcGtnIGluIGZpbHRlcmVkX3BhY2thZ2VzIHsKKyAgICAgICAgbGV0IHN0YXJ0X2luZGV4ID0gcGtnLmJvb2xlYW5fc3RhcnRfaW5kZXggYXMgdXNpemU7CisgICAgICAgIGxldCBmbGFnX2lkcyA9IGFzc2lnbl9mbGFnX2lkcyhwa2cucGFja2FnZV9uYW1lLCBwa2cuYm9vbGVhbl9mbGFncy5pdGVyKCkuY29waWVkKCkpPzsKKyAgICAgICAgZm9yIHBmIGluIHBrZy5ib29sZWFuX2ZsYWdzLml0ZXIoKSB7CisgICAgICAgICAgICBsZXQgZmlkID0gZmxhZ19pZHMKKyAgICAgICAgICAgICAgICAuZ2V0KHBmLm5hbWUoKSkKKyAgICAgICAgICAgICAgICAub2tfb3IoYW55aG93IShmb3JtYXQhKCJtaXNzaW5nIGZsYWcgaWQgZm9yIHt9IiwgcGYubmFtZSgpKSkpPzsKKworICAgICAgICAgICAgbGlzdC5ib29sZWFuc1tzdGFydF9pbmRleCArICgqZmlkIGFzIHVzaXplKV0gPSBwZi5zdGF0ZSgpID09IFByb3RvRmxhZ1N0YXRlOjpFTkFCTEVEOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaW5pdGlhbGl6ZSBhbGwgaGVhZGVyIGZpZWxkcworICAgIGxpc3QuaGVhZGVyLmJvb2xlYW5fdmFsdWVfb2Zmc2V0ID0gbGlzdC5oZWFkZXIuaW50b19ieXRlcygpLmxlbigpIGFzIHUzMjsKKyAgICBsaXN0LmhlYWRlci5maWxlX3NpemUgPSBsaXN0LmhlYWRlci5ib29sZWFuX3ZhbHVlX29mZnNldCArIG51bV9mbGFnczsKKworICAgIE9rKGxpc3QpCit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OkRFRkFVTFRfRklMRV9WRVJTSU9OOworCisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBjcmF0ZTo6c3RvcmFnZTo6e2dyb3VwX2ZsYWdzX2J5X3BhY2thZ2UsIHRlc3RzOjpwYXJzZV9hbGxfdGVzdF9mbGFnc307CisKKyAgICBwdWIgZm4gY3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0X2Zyb21fc291cmNlKCkgLT4gUmVzdWx0PEZsYWdWYWx1ZUxpc3Q+IHsKKyAgICAgICAgbGV0IGNhY2hlcyA9IHBhcnNlX2FsbF90ZXN0X2ZsYWdzKCk7CisgICAgICAgIGxldCBwYWNrYWdlcyA9IGdyb3VwX2ZsYWdzX2J5X3BhY2thZ2UoY2FjaGVzLml0ZXIoKSwgREVGQVVMVF9GSUxFX1ZFUlNJT04pOworICAgICAgICBjcmVhdGVfZmxhZ192YWx1ZSgibW9ja3VwIiwgJnBhY2thZ2VzLCBERUZBVUxUX0ZJTEVfVkVSU0lPTikKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhlIGZsYWcgdmFsdWUgY3JlYXRpb24gYW5kIGVhY2ggZmllbGQKKyAgICBmbiB0ZXN0X2xpc3RfY29udGVudHMoKSB7CisgICAgICAgIGxldCBmbGFnX3ZhbHVlX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3RfZnJvbV9zb3VyY2UoKTsKKyAgICAgICAgYXNzZXJ0IShmbGFnX3ZhbHVlX2xpc3QuaXNfb2soKSk7CisgICAgICAgIGxldCBleHBlY3RlZF9mbGFnX3ZhbHVlX2xpc3QgPQorICAgICAgICAgICAgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OnRlc3RfdXRpbHM6OmNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdChERUZBVUxUX0ZJTEVfVkVSU0lPTik7CisgICAgICAgIGFzc2VydF9lcSEoZmxhZ192YWx1ZV9saXN0LnVud3JhcCgpLCBleHBlY3RlZF9mbGFnX3ZhbHVlX2xpc3QpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvc3RvcmFnZS9tb2QucnMgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3N0b3JhZ2UvbW9kLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZTY1ZDEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3N0b3JhZ2UvbW9kLnJzCkBAIC0wLDAgKzEsMjc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcHViIG1vZCBmbGFnX2luZm87CitwdWIgbW9kIGZsYWdfdGFibGU7CitwdWIgbW9kIGZsYWdfdmFsdWU7CitwdWIgbW9kIHBhY2thZ2VfdGFibGU7CisKK3VzZSBhbnlob3c6OlJlc3VsdDsKK3VzZSBzdGQ6OmNvbGxlY3Rpb25zOjp7SGFzaE1hcCwgSGFzaFNldH07CisKK3VzZSBjcmF0ZTo6Y29tbWFuZHM6OmNvbXB1dGVfZmxhZ3NfZmluZ2VycHJpbnQ7Cit1c2UgY3JhdGU6OnN0b3JhZ2U6OnsKKyAgICBmbGFnX2luZm86OmNyZWF0ZV9mbGFnX2luZm8sIGZsYWdfdGFibGU6OmNyZWF0ZV9mbGFnX3RhYmxlLCBmbGFnX3ZhbHVlOjpjcmVhdGVfZmxhZ192YWx1ZSwKKyAgICBwYWNrYWdlX3RhYmxlOjpjcmVhdGVfcGFja2FnZV90YWJsZSwKK307Cit1c2UgYWNvbmZpZ19wcm90b3M6OntQcm90b0ZsYWdQZXJtaXNzaW9uLCBQcm90b0ZsYWdTdGF0ZSwgUHJvdG9QYXJzZWRGbGFnLCBQcm90b1BhcnNlZEZsYWdzfTsKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6U3RvcmFnZUZpbGVUeXBlOworCisjW2Rlcml2ZShDbG9uZSldCitwdWIgc3RydWN0IEZsYWdQYWNrYWdlPCdhPiB7CisgICAgcHViIHBhY2thZ2VfbmFtZTogJidhIHN0ciwKKyAgICBwdWIgcGFja2FnZV9pZDogdTMyLAorICAgIHB1YiBmaW5nZXJwcmludDogdTY0LAorICAgIHB1YiBmbGFnX25hbWVzOiBIYXNoU2V0PCYnYSBzdHI+LAorICAgIHB1YiBib29sZWFuX2ZsYWdzOiBWZWM8JidhIFByb3RvUGFyc2VkRmxhZz4sCisgICAgLy8gVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBib29sZWFuIGZsYWcgaW4gdGhpcyBhY29uZmlnIHBhY2thZ2UgYW1vbmcgYWxsIGJvb2xlYW4KKyAgICAvLyBmbGFncyBpbiB0aGlzIGNvbnRhaW5lci4KKyAgICBwdWIgYm9vbGVhbl9zdGFydF9pbmRleDogdTMyLAorfQorCitpbXBsPCdhPiBGbGFnUGFja2FnZTwnYT4geworICAgIGZuIG5ldyhwYWNrYWdlX25hbWU6ICYnYSBzdHIsIHBhY2thZ2VfaWQ6IHUzMikgLT4gU2VsZiB7CisgICAgICAgIEZsYWdQYWNrYWdlIHsKKyAgICAgICAgICAgIHBhY2thZ2VfbmFtZSwKKyAgICAgICAgICAgIHBhY2thZ2VfaWQsCisgICAgICAgICAgICBmaW5nZXJwcmludDogMCwKKyAgICAgICAgICAgIGZsYWdfbmFtZXM6IEhhc2hTZXQ6Om5ldygpLAorICAgICAgICAgICAgYm9vbGVhbl9mbGFnczogdmVjIVtdLAorICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleDogMCwKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIGluc2VydCgmbXV0IHNlbGYsIHBmOiAmJ2EgUHJvdG9QYXJzZWRGbGFnKSB7CisgICAgICAgIGlmIHNlbGYuZmxhZ19uYW1lcy5pbnNlcnQocGYubmFtZSgpKSB7CisgICAgICAgICAgICBzZWxmLmJvb2xlYW5fZmxhZ3MucHVzaChwZik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3B1YiBmbiBncm91cF9mbGFnc19ieV9wYWNrYWdlPCdhLCBJPihwYXJzZWRfZmxhZ3NfdmVjX2l0ZXI6IEksIHZlcnNpb246IHUzMikgLT4gVmVjPEZsYWdQYWNrYWdlPCdhPj4KK3doZXJlCisgICAgSTogSXRlcmF0b3I8SXRlbSA9ICYnYSBQcm90b1BhcnNlZEZsYWdzPiwKK3sKKyAgICAvLyBncm91cCBmbGFncyBieSBwYWNrYWdlCisgICAgbGV0IG11dCBwYWNrYWdlczogVmVjPEZsYWdQYWNrYWdlPCdhPj4gPSBWZWM6Om5ldygpOworICAgIGxldCBtdXQgcGFja2FnZV9pbmRleDogSGFzaE1hcDwmc3RyLCB1c2l6ZT4gPSBIYXNoTWFwOjpuZXcoKTsKKyAgICBmb3IgcGFyc2VkX2ZsYWdzIGluIHBhcnNlZF9mbGFnc192ZWNfaXRlciB7CisgICAgICAgIGZvciBwYXJzZWRfZmxhZyBpbiBwYXJzZWRfZmxhZ3MucGFyc2VkX2ZsYWcuaXRlcigpIHsKKyAgICAgICAgICAgIGxldCBpbmRleCA9ICoocGFja2FnZV9pbmRleC5lbnRyeShwYXJzZWRfZmxhZy5wYWNrYWdlKCkpLm9yX2luc2VydChwYWNrYWdlcy5sZW4oKSkpOworICAgICAgICAgICAgaWYgaW5kZXggPT0gcGFja2FnZXMubGVuKCkgeworICAgICAgICAgICAgICAgIHBhY2thZ2VzLnB1c2goRmxhZ1BhY2thZ2U6Om5ldyhwYXJzZWRfZmxhZy5wYWNrYWdlKCksIGluZGV4IGFzIHUzMikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBFeGNsdWRlIHN5c3RlbS92ZW5kb3IvcHJvZHVjdCBmbGFncyB0aGF0IGFyZSBSTytkaXNhYmxlZC4KKyAgICAgICAgICAgIGlmIChwYXJzZWRfZmxhZy5jb250YWluZXIgPT0gU29tZSgic3lzdGVtIi50b19zdHJpbmcoKSkKKyAgICAgICAgICAgICAgICB8fCBwYXJzZWRfZmxhZy5jb250YWluZXIgPT0gU29tZSgidmVuZG9yIi50b19zdHJpbmcoKSkKKyAgICAgICAgICAgICAgICB8fCBwYXJzZWRfZmxhZy5jb250YWluZXIgPT0gU29tZSgicHJvZHVjdCIudG9fc3RyaW5nKCkpKQorICAgICAgICAgICAgICAgICYmIHBhcnNlZF9mbGFnLnBlcm1pc3Npb24gPT0gU29tZShQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX09OTFkuaW50bygpKQorICAgICAgICAgICAgICAgICYmIHBhcnNlZF9mbGFnLnN0YXRlID09IFNvbWUoUHJvdG9GbGFnU3RhdGU6OkRJU0FCTEVELmludG8oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFja2FnZXNbaW5kZXhdLmluc2VydChwYXJzZWRfZmxhZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDYWxjdWxhdGUgYm9vbGVhbiBmbGFnIHN0YXJ0IGluZGV4IGZvciBlYWNoIHBhY2thZ2UKKyAgICBsZXQgbXV0IGJvb2xlYW5fc3RhcnRfaW5kZXggPSAwOworICAgIGZvciBwIGluIHBhY2thZ2VzLml0ZXJfbXV0KCkgeworICAgICAgICBwLmJvb2xlYW5fc3RhcnRfaW5kZXggPSBib29sZWFuX3N0YXJ0X2luZGV4OworICAgICAgICBib29sZWFuX3N0YXJ0X2luZGV4ICs9IHAuYm9vbGVhbl9mbGFncy5sZW4oKSBhcyB1MzI7CisKKyAgICAgICAgaWYgdmVyc2lvbiA+PSAyIHsKKyAgICAgICAgICAgIGxldCBtdXQgZmxhZ19uYW1lc192ZWMgPQorICAgICAgICAgICAgICAgIHAuZmxhZ19uYW1lcy5jbG9uZSgpLmludG9faXRlcigpLm1hcChTdHJpbmc6OmZyb20pLmNvbGxlY3Q6OjxWZWM8Xz4+KCk7CisgICAgICAgICAgICBsZXQgZmluZ2VycHJpbnQgPSBjb21wdXRlX2ZsYWdzX2ZpbmdlcnByaW50KCZtdXQgZmxhZ19uYW1lc192ZWMpOworICAgICAgICAgICAgcC5maW5nZXJwcmludCA9IGZpbmdlcnByaW50OworICAgICAgICB9CisgICAgfQorCisgICAgcGFja2FnZXMKK30KKworcHViIGZuIGdlbmVyYXRlX3N0b3JhZ2VfZmlsZTwnYSwgST4oCisgICAgY29udGFpbmVyOiAmc3RyLAorICAgIHBhcnNlZF9mbGFnc192ZWNfaXRlcjogSSwKKyAgICBmaWxlOiAmU3RvcmFnZUZpbGVUeXBlLAorICAgIHZlcnNpb246IHUzMiwKKykgLT4gUmVzdWx0PFZlYzx1OD4+Cit3aGVyZQorICAgIEk6IEl0ZXJhdG9yPEl0ZW0gPSAmJ2EgUHJvdG9QYXJzZWRGbGFncz4sCit7CisgICAgbGV0IHBhY2thZ2VzID0gZ3JvdXBfZmxhZ3NfYnlfcGFja2FnZShwYXJzZWRfZmxhZ3NfdmVjX2l0ZXIsIHZlcnNpb24pOworCisgICAgbWF0Y2ggZmlsZSB7CisgICAgICAgIFN0b3JhZ2VGaWxlVHlwZTo6UGFja2FnZU1hcCA9PiB7CisgICAgICAgICAgICBsZXQgcGFja2FnZV90YWJsZSA9IGNyZWF0ZV9wYWNrYWdlX3RhYmxlKGNvbnRhaW5lciwgJnBhY2thZ2VzLCB2ZXJzaW9uKT87CisgICAgICAgICAgICBPayhwYWNrYWdlX3RhYmxlLmludG9fYnl0ZXMoKSkKKyAgICAgICAgfQorICAgICAgICBTdG9yYWdlRmlsZVR5cGU6OkZsYWdNYXAgPT4geworICAgICAgICAgICAgbGV0IGZsYWdfdGFibGUgPSBjcmVhdGVfZmxhZ190YWJsZShjb250YWluZXIsICZwYWNrYWdlcywgdmVyc2lvbik/OworICAgICAgICAgICAgT2soZmxhZ190YWJsZS5pbnRvX2J5dGVzKCkpCisgICAgICAgIH0KKyAgICAgICAgU3RvcmFnZUZpbGVUeXBlOjpGbGFnVmFsID0+IHsKKyAgICAgICAgICAgIGxldCBmbGFnX3ZhbHVlID0gY3JlYXRlX2ZsYWdfdmFsdWUoY29udGFpbmVyLCAmcGFja2FnZXMsIHZlcnNpb24pPzsKKyAgICAgICAgICAgIE9rKGZsYWdfdmFsdWUuaW50b19ieXRlcygpKQorICAgICAgICB9CisgICAgICAgIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ0luZm8gPT4geworICAgICAgICAgICAgbGV0IGZsYWdfaW5mbyA9IGNyZWF0ZV9mbGFnX2luZm8oY29udGFpbmVyLCAmcGFja2FnZXMsIHZlcnNpb24pPzsKKyAgICAgICAgICAgIE9rKGZsYWdfaW5mby5pbnRvX2J5dGVzKCkpCisgICAgICAgIH0KKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OkRFRkFVTFRfRklMRV9WRVJTSU9OOworCisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBjcmF0ZTo6SW5wdXQ7CisKKyAgICBwdWIgZm4gcGFyc2VfYWxsX3Rlc3RfZmxhZ3MoKSAtPiBWZWM8UHJvdG9QYXJzZWRGbGFncz4geworICAgICAgICBsZXQgYWNvbmZpZ19maWxlcyA9IFsKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsCisgICAgICAgICAgICAgICAgInN0b3JhZ2VfdGVzdF8xLmFjb25maWciLAorICAgICAgICAgICAgICAgIGluY2x1ZGVfYnl0ZXMhKCIuLi8uLi90ZXN0cy9zdG9yYWdlX3Rlc3RfMS5hY29uZmlnIikuYXNfc2xpY2UoKSwKKyAgICAgICAgICAgICAgICAic3RvcmFnZV90ZXN0XzEudmFsdWUiLAorICAgICAgICAgICAgICAgIGluY2x1ZGVfYnl0ZXMhKCIuLi8uLi90ZXN0cy9zdG9yYWdlX3Rlc3RfMS52YWx1ZXMiKS5hc19zbGljZSgpLAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIsCisgICAgICAgICAgICAgICAgInN0b3JhZ2VfdGVzdF8yLmFjb25maWciLAorICAgICAgICAgICAgICAgIGluY2x1ZGVfYnl0ZXMhKCIuLi8uLi90ZXN0cy9zdG9yYWdlX3Rlc3RfMi5hY29uZmlnIikuYXNfc2xpY2UoKSwKKyAgICAgICAgICAgICAgICAic3RvcmFnZV90ZXN0XzIudmFsdWUiLAorICAgICAgICAgICAgICAgIGluY2x1ZGVfYnl0ZXMhKCIuLi8uLi90ZXN0cy9zdG9yYWdlX3Rlc3RfMi52YWx1ZXMiKS5hc19zbGljZSgpLAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIsCisgICAgICAgICAgICAgICAgInN0b3JhZ2VfdGVzdF80LmFjb25maWciLAorICAgICAgICAgICAgICAgIGluY2x1ZGVfYnl0ZXMhKCIuLi8uLi90ZXN0cy9zdG9yYWdlX3Rlc3RfNC5hY29uZmlnIikuYXNfc2xpY2UoKSwKKyAgICAgICAgICAgICAgICAic3RvcmFnZV90ZXN0XzQudmFsdWUiLAorICAgICAgICAgICAgICAgIGluY2x1ZGVfYnl0ZXMhKCIuLi8uLi90ZXN0cy9zdG9yYWdlX3Rlc3RfNC52YWx1ZXMiKS5hc19zbGljZSgpLAorICAgICAgICAgICAgKSwKKyAgICAgICAgXTsKKyAgICAgICAgYWNvbmZpZ19maWxlcworICAgICAgICAgICAgLmludG9faXRlcigpCisgICAgICAgICAgICAubWFwKHwocGtnLCBhY29uZmlnX2ZpbGUsIGFjb25maWdfY29udGVudCwgdmFsdWVfZmlsZSwgdmFsdWVfY29udGVudCl8IHsKKyAgICAgICAgICAgICAgICBsZXQgYnl0ZXMgPSBjcmF0ZTo6Y29tbWFuZHM6OnBhcnNlX2ZsYWdzKAorICAgICAgICAgICAgICAgICAgICBwa2csCisgICAgICAgICAgICAgICAgICAgIFNvbWUoInN5c3RlbSIpLAorICAgICAgICAgICAgICAgICAgICB2ZWMhW0lucHV0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZm9ybWF0ISgidGVzdHMve30iLCBhY29uZmlnX2ZpbGUpLnRvX3N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyOiBCb3g6Om5ldyhhY29uZmlnX2NvbnRlbnQpLAorICAgICAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgICAgICAgICAgdmVjIVtJbnB1dCB7CisgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZvcm1hdCEoInRlc3RzL3t9IiwgdmFsdWVfZmlsZSkudG9fc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXI6IEJveDo6bmV3KHZhbHVlX2NvbnRlbnQpLAorICAgICAgICAgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgICAgICAgICAgY3JhdGU6OmNvbW1hbmRzOjpERUZBVUxUX0ZMQUdfUEVSTUlTU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgLnVud3JhcCgpOworICAgICAgICAgICAgICAgIGFjb25maWdfcHJvdG9zOjpwYXJzZWRfZmxhZ3M6OnRyeV9mcm9tX2JpbmFyeV9wcm90bygmYnl0ZXMpLnVud3JhcCgpCisgICAgICAgICAgICB9KQorICAgICAgICAgICAgLmNvbGxlY3QoKQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2ZsYWdfcGFja2FnZSgpIHsKKyAgICAgICAgbGV0IGNhY2hlcyA9IHBhcnNlX2FsbF90ZXN0X2ZsYWdzKCk7CisgICAgICAgIGxldCBwYWNrYWdlcyA9IGdyb3VwX2ZsYWdzX2J5X3BhY2thZ2UoY2FjaGVzLml0ZXIoKSwgREVGQVVMVF9GSUxFX1ZFUlNJT04pOworCisgICAgICAgIGZvciBwa2cgaW4gcGFja2FnZXMuaXRlcigpIHsKKyAgICAgICAgICAgIGxldCBwa2dfbmFtZSA9IHBrZy5wYWNrYWdlX25hbWU7CisgICAgICAgICAgICBhc3NlcnRfZXEhKHBrZy5mbGFnX25hbWVzLmxlbigpLCBwa2cuYm9vbGVhbl9mbGFncy5sZW4oKSk7CisgICAgICAgICAgICBmb3IgcGYgaW4gcGtnLmJvb2xlYW5fZmxhZ3MuaXRlcigpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQhKHBrZy5mbGFnX25hbWVzLmNvbnRhaW5zKHBmLm5hbWUoKSkpOworICAgICAgICAgICAgICAgIGFzc2VydF9lcSEocGYucGFja2FnZSgpLCBwa2dfbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzLmxlbigpLCAzKTsKKworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzBdLnBhY2thZ2VfbmFtZSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1swXS5wYWNrYWdlX2lkLCAwKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1swXS5mbGFnX25hbWVzLmxlbigpLCAzKTsKKyAgICAgICAgYXNzZXJ0IShwYWNrYWdlc1swXS5mbGFnX25hbWVzLmNvbnRhaW5zKCJlbmFibGVkX3J3IikpOworICAgICAgICBhc3NlcnQhKHBhY2thZ2VzWzBdLmZsYWdfbmFtZXMuY29udGFpbnMoImRpc2FibGVkX3J3IikpOworICAgICAgICBhc3NlcnQhKHBhY2thZ2VzWzBdLmZsYWdfbmFtZXMuY29udGFpbnMoImVuYWJsZWRfcm8iKSk7CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMF0uYm9vbGVhbl9zdGFydF9pbmRleCwgMCk7CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMF0uZmluZ2VycHJpbnQsIDApOworCisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMV0ucGFja2FnZV9uYW1lLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIpOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzFdLnBhY2thZ2VfaWQsIDEpOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzFdLmZsYWdfbmFtZXMubGVuKCksIDMpOworICAgICAgICBhc3NlcnQhKHBhY2thZ2VzWzFdLmZsYWdfbmFtZXMuY29udGFpbnMoImVuYWJsZWRfcm8iKSk7CisgICAgICAgIGFzc2VydCEocGFja2FnZXNbMV0uZmxhZ19uYW1lcy5jb250YWlucygiZGlzYWJsZWRfcnciKSk7CisgICAgICAgIGFzc2VydCEocGFja2FnZXNbMV0uZmxhZ19uYW1lcy5jb250YWlucygiZW5hYmxlZF9maXhlZF9ybyIpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1sxXS5ib29sZWFuX3N0YXJ0X2luZGV4LCAzKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1swXS5maW5nZXJwcmludCwgMCk7CisKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1syXS5wYWNrYWdlX25hbWUsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80Iik7CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMl0ucGFja2FnZV9pZCwgMik7CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMl0uZmxhZ19uYW1lcy5sZW4oKSwgMik7CisgICAgICAgIGFzc2VydCEocGFja2FnZXNbMl0uZmxhZ19uYW1lcy5jb250YWlucygiZW5hYmxlZF9ydyIpKTsKKyAgICAgICAgYXNzZXJ0IShwYWNrYWdlc1syXS5mbGFnX25hbWVzLmNvbnRhaW5zKCJlbmFibGVkX2ZpeGVkX3JvIikpOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzJdLmJvb2xlYW5fc3RhcnRfaW5kZXgsIDYpOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzJdLmZpbmdlcnByaW50LCAwKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9mbGFnX3BhY2thZ2Vfd2l0aF9maW5nZXJwcmludCgpIHsKKyAgICAgICAgbGV0IGNhY2hlcyA9IHBhcnNlX2FsbF90ZXN0X2ZsYWdzKCk7CisgICAgICAgIGxldCBwYWNrYWdlcyA9IGdyb3VwX2ZsYWdzX2J5X3BhY2thZ2UoY2FjaGVzLml0ZXIoKSwgMik7CisKKyAgICAgICAgZm9yIHBrZyBpbiBwYWNrYWdlcy5pdGVyKCkgeworICAgICAgICAgICAgbGV0IHBrZ19uYW1lID0gcGtnLnBhY2thZ2VfbmFtZTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEocGtnLmZsYWdfbmFtZXMubGVuKCksIHBrZy5ib29sZWFuX2ZsYWdzLmxlbigpKTsKKyAgICAgICAgICAgIGZvciBwZiBpbiBwa2cuYm9vbGVhbl9mbGFncy5pdGVyKCkgeworICAgICAgICAgICAgICAgIGFzc2VydCEocGtnLmZsYWdfbmFtZXMuY29udGFpbnMocGYubmFtZSgpKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0X2VxIShwZi5wYWNrYWdlKCksIHBrZ19uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXMubGVuKCksIDMpOworCisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMF0ucGFja2FnZV9uYW1lLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzBdLnBhY2thZ2VfaWQsIDApOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzBdLmZsYWdfbmFtZXMubGVuKCksIDMpOworICAgICAgICBhc3NlcnQhKHBhY2thZ2VzWzBdLmZsYWdfbmFtZXMuY29udGFpbnMoImVuYWJsZWRfcnciKSk7CisgICAgICAgIGFzc2VydCEocGFja2FnZXNbMF0uZmxhZ19uYW1lcy5jb250YWlucygiZGlzYWJsZWRfcnciKSk7CisgICAgICAgIGFzc2VydCEocGFja2FnZXNbMF0uZmxhZ19uYW1lcy5jb250YWlucygiZW5hYmxlZF9ybyIpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1swXS5ib29sZWFuX3N0YXJ0X2luZGV4LCAwKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1swXS5maW5nZXJwcmludCwgMTUyNDg5NDg1MTA1OTAxNTgwODZ1NjQpOworCisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMV0ucGFja2FnZV9uYW1lLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIpOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzFdLnBhY2thZ2VfaWQsIDEpOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzFdLmZsYWdfbmFtZXMubGVuKCksIDMpOworICAgICAgICBhc3NlcnQhKHBhY2thZ2VzWzFdLmZsYWdfbmFtZXMuY29udGFpbnMoImVuYWJsZWRfcm8iKSk7CisgICAgICAgIGFzc2VydCEocGFja2FnZXNbMV0uZmxhZ19uYW1lcy5jb250YWlucygiZGlzYWJsZWRfcnciKSk7CisgICAgICAgIGFzc2VydCEocGFja2FnZXNbMV0uZmxhZ19uYW1lcy5jb250YWlucygiZW5hYmxlZF9maXhlZF9ybyIpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1sxXS5ib29sZWFuX3N0YXJ0X2luZGV4LCAzKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1sxXS5maW5nZXJwcmludCwgNDQzMTk0MDUwMjI3NDg1Nzk2NHU2NCk7CisKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1syXS5wYWNrYWdlX25hbWUsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80Iik7CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMl0ucGFja2FnZV9pZCwgMik7CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMl0uZmxhZ19uYW1lcy5sZW4oKSwgMik7CisgICAgICAgIGFzc2VydCEocGFja2FnZXNbMl0uZmxhZ19uYW1lcy5jb250YWlucygiZW5hYmxlZF9ydyIpKTsKKyAgICAgICAgYXNzZXJ0IShwYWNrYWdlc1syXS5mbGFnX25hbWVzLmNvbnRhaW5zKCJlbmFibGVkX2ZpeGVkX3JvIikpOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzJdLmJvb2xlYW5fc3RhcnRfaW5kZXgsIDYpOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzJdLmZpbmdlcnByaW50LCAxNjIzMzIyOTkxNzcxMTYyMjM3NXU2NCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9zdG9yYWdlL3BhY2thZ2VfdGFibGUucnMgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3N0b3JhZ2UvcGFja2FnZV90YWJsZS5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2RhYTdmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9zdG9yYWdlL3BhY2thZ2VfdGFibGUucnMKQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2UgYW55aG93OjpSZXN1bHQ7CisKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6eworICAgIGdldF90YWJsZV9zaXplLCBQYWNrYWdlVGFibGUsIFBhY2thZ2VUYWJsZUhlYWRlciwgUGFja2FnZVRhYmxlTm9kZSwgU3RvcmFnZUZpbGVUeXBlLAorfTsKKwordXNlIGNyYXRlOjpzdG9yYWdlOjpGbGFnUGFja2FnZTsKKworZm4gbmV3X2hlYWRlcihjb250YWluZXI6ICZzdHIsIG51bV9wYWNrYWdlczogdTMyLCB2ZXJzaW9uOiB1MzIpIC0+IFBhY2thZ2VUYWJsZUhlYWRlciB7CisgICAgUGFja2FnZVRhYmxlSGVhZGVyIHsKKyAgICAgICAgdmVyc2lvbiwKKyAgICAgICAgY29udGFpbmVyOiBTdHJpbmc6OmZyb20oY29udGFpbmVyKSwKKyAgICAgICAgZmlsZV90eXBlOiBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXAgYXMgdTgsCisgICAgICAgIGZpbGVfc2l6ZTogMCwKKyAgICAgICAgbnVtX3BhY2thZ2VzLAorICAgICAgICBidWNrZXRfb2Zmc2V0OiAwLAorICAgICAgICBub2RlX29mZnNldDogMCwKKyAgICB9Cit9CisKKy8vIGEgc3RydWN0IHRoYXQgY29udGFpbnMgUGFja2FnZVRhYmxlTm9kZSBhbmQgYSBidW5jaCBvZiBvdGhlciBpbmZvcm1hdGlvbiB0byBoZWxwCisvLyBwYWNrYWdlIHRhYmxlIGNyZWF0aW9uCisjW2Rlcml2ZShQYXJ0aWFsRXEsIERlYnVnKV0KK3N0cnVjdCBQYWNrYWdlVGFibGVOb2RlV3JhcHBlciB7CisgICAgcHViIG5vZGU6IFBhY2thZ2VUYWJsZU5vZGUsCisgICAgcHViIGJ1Y2tldF9pbmRleDogdTMyLAorfQorCitpbXBsIFBhY2thZ2VUYWJsZU5vZGVXcmFwcGVyIHsKKyAgICBmbiBuZXcocGFja2FnZTogJkZsYWdQYWNrYWdlLCBudW1fYnVja2V0czogdTMyKSAtPiBTZWxmIHsKKyAgICAgICAgbGV0IG5vZGUgPSBQYWNrYWdlVGFibGVOb2RlIHsKKyAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogU3RyaW5nOjpmcm9tKHBhY2thZ2UucGFja2FnZV9uYW1lKSwKKyAgICAgICAgICAgIHBhY2thZ2VfaWQ6IHBhY2thZ2UucGFja2FnZV9pZCwKKyAgICAgICAgICAgIGZpbmdlcnByaW50OiBwYWNrYWdlLmZpbmdlcnByaW50LAorICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleDogcGFja2FnZS5ib29sZWFuX3N0YXJ0X2luZGV4LAorICAgICAgICAgICAgbmV4dF9vZmZzZXQ6IE5vbmUsCisgICAgICAgIH07CisgICAgICAgIGxldCBidWNrZXRfaW5kZXggPSBQYWNrYWdlVGFibGVOb2RlOjpmaW5kX2J1Y2tldF9pbmRleChwYWNrYWdlLnBhY2thZ2VfbmFtZSwgbnVtX2J1Y2tldHMpOworICAgICAgICBTZWxmIHsgbm9kZSwgYnVja2V0X2luZGV4IH0KKyAgICB9Cit9CisKK3B1YiBmbiBjcmVhdGVfcGFja2FnZV90YWJsZSgKKyAgICBjb250YWluZXI6ICZzdHIsCisgICAgcGFja2FnZXM6ICZbRmxhZ1BhY2thZ2VdLAorICAgIHZlcnNpb246IHUzMiwKKykgLT4gUmVzdWx0PFBhY2thZ2VUYWJsZT4geworICAgIC8vIGNyZWF0ZSB0YWJsZQorICAgIGxldCBudW1fcGFja2FnZXMgPSBwYWNrYWdlcy5sZW4oKSBhcyB1MzI7CisgICAgbGV0IG51bV9idWNrZXRzID0gZ2V0X3RhYmxlX3NpemUobnVtX3BhY2thZ2VzKT87CisgICAgbGV0IG11dCBoZWFkZXIgPSBuZXdfaGVhZGVyKGNvbnRhaW5lciwgbnVtX3BhY2thZ2VzLCB2ZXJzaW9uKTsKKyAgICBsZXQgbXV0IGJ1Y2tldHMgPSB2ZWMhW05vbmU7IG51bV9idWNrZXRzIGFzIHVzaXplXTsKKyAgICBsZXQgbXV0IG5vZGVfd3JhcHBlcnM6IFZlYzxfPiA9IHBhY2thZ2VzCisgICAgICAgIC5pdGVyKCkKKyAgICAgICAgLm1hcCh8cGtnOiAmRmxhZ1BhY2thZ2U8J18+fCBQYWNrYWdlVGFibGVOb2RlV3JhcHBlcjo6bmV3KHBrZywgbnVtX2J1Y2tldHMpKQorICAgICAgICAuY29sbGVjdCgpOworCisgICAgLy8gaW5pdGlhbGl6ZSBhbGwgaGVhZGVyIGZpZWxkcworICAgIGhlYWRlci5idWNrZXRfb2Zmc2V0ID0gaGVhZGVyLmludG9fYnl0ZXMoKS5sZW4oKSBhcyB1MzI7CisgICAgaGVhZGVyLm5vZGVfb2Zmc2V0ID0gaGVhZGVyLmJ1Y2tldF9vZmZzZXQgKyBudW1fYnVja2V0cyAqIDQ7CisgICAgaGVhZGVyLmZpbGVfc2l6ZSA9IGhlYWRlci5ub2RlX29mZnNldAorICAgICAgICArIG5vZGVfd3JhcHBlcnMuaXRlcigpLm1hcCh8eHwgeC5ub2RlLmludG9fYnl0ZXModmVyc2lvbikubGVuKCkpLnN1bTo6PHVzaXplPigpIGFzIHUzMjsKKworICAgIC8vIHNvcnQgbm9kZV93cmFwcGVycyBieSBidWNrZXQgaW5kZXggZm9yIGVmZmljaWVuY3kKKyAgICBub2RlX3dyYXBwZXJzLnNvcnRfYnkofGEsIGJ8IGEuYnVja2V0X2luZGV4LmNtcCgmYi5idWNrZXRfaW5kZXgpKTsKKworICAgIC8vIGZpbGwgYWxsIG5vZGUgb2Zmc2V0CisgICAgbGV0IG11dCBvZmZzZXQgPSBoZWFkZXIubm9kZV9vZmZzZXQ7CisgICAgZm9yIGkgaW4gMC4ubm9kZV93cmFwcGVycy5sZW4oKSB7CisgICAgICAgIGxldCBub2RlX2J1Y2tldF9pZHggPSBub2RlX3dyYXBwZXJzW2ldLmJ1Y2tldF9pbmRleDsKKyAgICAgICAgbGV0IG5leHRfbm9kZV9idWNrZXRfaWR4ID0gaWYgaSArIDEgPCBub2RlX3dyYXBwZXJzLmxlbigpIHsKKyAgICAgICAgICAgIFNvbWUobm9kZV93cmFwcGVyc1tpICsgMV0uYnVja2V0X2luZGV4KQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTm9uZQorICAgICAgICB9OworCisgICAgICAgIGlmIGJ1Y2tldHNbbm9kZV9idWNrZXRfaWR4IGFzIHVzaXplXS5pc19ub25lKCkgeworICAgICAgICAgICAgYnVja2V0c1tub2RlX2J1Y2tldF9pZHggYXMgdXNpemVdID0gU29tZShvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSBub2RlX3dyYXBwZXJzW2ldLm5vZGUuaW50b19ieXRlcyh2ZXJzaW9uKS5sZW4oKSBhcyB1MzI7CisKKyAgICAgICAgaWYgbGV0IFNvbWUoaW5kZXgpID0gbmV4dF9ub2RlX2J1Y2tldF9pZHggeworICAgICAgICAgICAgaWYgaW5kZXggPT0gbm9kZV9idWNrZXRfaWR4IHsKKyAgICAgICAgICAgICAgICBub2RlX3dyYXBwZXJzW2ldLm5vZGUubmV4dF9vZmZzZXQgPSBTb21lKG9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsZXQgdGFibGUgPSBQYWNrYWdlVGFibGUgeworICAgICAgICBoZWFkZXIsCisgICAgICAgIGJ1Y2tldHMsCisgICAgICAgIG5vZGVzOiBub2RlX3dyYXBwZXJzLmludG9faXRlcigpLm1hcCh8bnd8IG53Lm5vZGUpLmNvbGxlY3QoKSwKKyAgICB9OworICAgIE9rKHRhYmxlKQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7REVGQVVMVF9GSUxFX1ZFUlNJT04sIE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OfTsKKworICAgIHVzZSBzdXBlcjo6KjsKKyAgICB1c2UgY3JhdGU6OnN0b3JhZ2U6Ontncm91cF9mbGFnc19ieV9wYWNrYWdlLCB0ZXN0czo6cGFyc2VfYWxsX3Rlc3RfZmxhZ3N9OworCisgICAgcHViIGZuIGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGVfZnJvbV9zb3VyY2UodmVyc2lvbjogdTMyKSAtPiBSZXN1bHQ8UGFja2FnZVRhYmxlPiB7CisgICAgICAgIGxldCBjYWNoZXMgPSBwYXJzZV9hbGxfdGVzdF9mbGFncygpOworICAgICAgICBsZXQgcGFja2FnZXMgPSBncm91cF9mbGFnc19ieV9wYWNrYWdlKGNhY2hlcy5pdGVyKCksIHZlcnNpb24pOworICAgICAgICBjcmVhdGVfcGFja2FnZV90YWJsZSgibW9ja3VwIiwgJnBhY2thZ2VzLCB2ZXJzaW9uKQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biB0aGUgdGFibGUgY3JlYXRpb24gYW5kIGVhY2ggZmllbGQKKyAgICBmbiB0ZXN0X3RhYmxlX2NvbnRlbnRzX2RlZmF1bHRfdmVyc2lvbigpIHsKKyAgICAgICAgbGV0IHBhY2thZ2VfdGFibGVfcmVzdWx0ID0gY3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZV9mcm9tX3NvdXJjZShERUZBVUxUX0ZJTEVfVkVSU0lPTik7CisgICAgICAgIGFzc2VydCEocGFja2FnZV90YWJsZV9yZXN1bHQuaXNfb2soKSk7CisgICAgICAgIGxldCBwYWNrYWdlX3RhYmxlID0gcGFja2FnZV90YWJsZV9yZXN1bHQudW53cmFwKCk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfdGFibGUgPQorICAgICAgICAgICAgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OnRlc3RfdXRpbHM6OmNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoREVGQVVMVF9GSUxFX1ZFUlNJT04pOworCisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZV90YWJsZS5oZWFkZXIsIGV4cGVjdGVkX3BhY2thZ2VfdGFibGUuaGVhZGVyKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX3RhYmxlLmJ1Y2tldHMsIGV4cGVjdGVkX3BhY2thZ2VfdGFibGUuYnVja2V0cyk7CisgICAgICAgIGZvciAobm9kZSwgZXhwZWN0ZWRfbm9kZSkgaW4KKyAgICAgICAgICAgIHBhY2thZ2VfdGFibGUubm9kZXMuaXRlcigpLnppcChleHBlY3RlZF9wYWNrYWdlX3RhYmxlLm5vZGVzLml0ZXIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0X2VxIShub2RlLnBhY2thZ2VfbmFtZSwgZXhwZWN0ZWRfbm9kZS5wYWNrYWdlX25hbWUpOworICAgICAgICAgICAgYXNzZXJ0X2VxIShub2RlLnBhY2thZ2VfaWQsIGV4cGVjdGVkX25vZGUucGFja2FnZV9pZCk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKG5vZGUuYm9vbGVhbl9zdGFydF9pbmRleCwgZXhwZWN0ZWRfbm9kZS5ib29sZWFuX3N0YXJ0X2luZGV4KTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEobm9kZS5uZXh0X29mZnNldCwgZXhwZWN0ZWRfbm9kZS5uZXh0X29mZnNldCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhlIHRhYmxlIGNyZWF0aW9uIGFuZCBlYWNoIGZpZWxkCisgICAgZm4gdGVzdF90YWJsZV9jb250ZW50c19tYXhfdmVyc2lvbigpIHsKKyAgICAgICAgbGV0IHBhY2thZ2VfdGFibGVfcmVzdWx0ID0KKyAgICAgICAgICAgIGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGVfZnJvbV9zb3VyY2UoTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04pOworICAgICAgICBhc3NlcnQhKHBhY2thZ2VfdGFibGVfcmVzdWx0LmlzX29rKCkpOworICAgICAgICBsZXQgcGFja2FnZV90YWJsZSA9IHBhY2thZ2VfdGFibGVfcmVzdWx0LnVud3JhcCgpOworCisgICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX3RhYmxlID0KKyAgICAgICAgICAgIGFjb25maWdfc3RvcmFnZV9maWxlOjp0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlKE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OKTsKKworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VfdGFibGUuaGVhZGVyLCBleHBlY3RlZF9wYWNrYWdlX3RhYmxlLmhlYWRlcik7CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZV90YWJsZS5idWNrZXRzLCBleHBlY3RlZF9wYWNrYWdlX3RhYmxlLmJ1Y2tldHMpOworICAgICAgICBmb3IgKG5vZGUsIGV4cGVjdGVkX25vZGUpIGluCisgICAgICAgICAgICBwYWNrYWdlX3RhYmxlLm5vZGVzLml0ZXIoKS56aXAoZXhwZWN0ZWRfcGFja2FnZV90YWJsZS5ub2Rlcy5pdGVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydF9lcSEobm9kZS5wYWNrYWdlX25hbWUsIGV4cGVjdGVkX25vZGUucGFja2FnZV9uYW1lKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEobm9kZS5wYWNrYWdlX2lkLCBleHBlY3RlZF9ub2RlLnBhY2thZ2VfaWQpOworICAgICAgICAgICAgYXNzZXJ0X2VxIShub2RlLmJvb2xlYW5fc3RhcnRfaW5kZXgsIGV4cGVjdGVkX25vZGUuYm9vbGVhbl9zdGFydF9pbmRleCk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKG5vZGUubmV4dF9vZmZzZXQsIGV4cGVjdGVkX25vZGUubmV4dF9vZmZzZXQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy90ZXN0LnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy90ZXN0LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZGEyNTIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3Rlc3QucnMKQEAgLTAsMCArMSwzNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjW2NmZyh0ZXN0KV0KK3B1YiB1c2UgdGVzdF91dGlsczo6KjsKKworI1tjZmcodGVzdCldCitwdWIgbW9kIHRlc3RfdXRpbHMgeworICAgIHVzZSBjcmF0ZTo6Y29tbWFuZHM6OklucHV0OworICAgIHVzZSBhY29uZmlnX3Byb3Rvczo6UHJvdG9QYXJzZWRGbGFnczsKKyAgICB1c2UgaXRlcnRvb2xzOworCisgICAgcHViIGNvbnN0IFRFU1RfUEFDS0FHRTogJnN0ciA9ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiOworCisgICAgcHViIGNvbnN0IFRFU1RfRkxBR1NfVEVYVFBST1RPOiAmc3RyID0gciMiCitwYXJzZWRfZmxhZyB7CisgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiCisgIG5hbWU6ICJkaXNhYmxlZF9ybyIKKyAgbmFtZXNwYWNlOiAiYWNvbmZpZ190ZXN0IgorICBkZXNjcmlwdGlvbjogIlRoaXMgZmxhZyBpcyBESVNBQkxFRCArIFJFQURfT05MWSIKKyAgYnVnOiAiMTIzIgorICBzdGF0ZTogRElTQUJMRUQKKyAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgIHRyYWNlIHsKKyAgICBzb3VyY2U6ICJ0ZXN0cy90ZXN0LmFjb25maWciCisgICAgc3RhdGU6IERJU0FCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9XUklURQorICB9CisgIHRyYWNlIHsKKyAgICBzb3VyY2U6ICJ0ZXN0cy9maXJzdC52YWx1ZXMiCisgICAgc3RhdGU6IERJU0FCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgIH0KKyAgaXNfZml4ZWRfcmVhZF9vbmx5OiBmYWxzZQorICBpc19leHBvcnRlZDogZmFsc2UKKyAgY29udGFpbmVyOiAic3lzdGVtIgorICBtZXRhZGF0YSB7CisgICAgcHVycG9zZTogUFVSUE9TRV9VTlNQRUNJRklFRAorICB9Cit9CitwYXJzZWRfZmxhZyB7CisgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiCisgIG5hbWU6ICJkaXNhYmxlZF9ydyIKKyAgbmFtZXNwYWNlOiAiYWNvbmZpZ190ZXN0IgorICBkZXNjcmlwdGlvbjogIlRoaXMgZmxhZyBpcyBESVNBQkxFRCArIFJFQURfV1JJVEUiCisgIGJ1ZzogIjQ1NiIKKyAgc3RhdGU6IERJU0FCTEVECisgIHBlcm1pc3Npb246IFJFQURfV1JJVEUKKyAgdHJhY2UgeworICAgIHNvdXJjZTogInRlc3RzL3Rlc3QuYWNvbmZpZyIKKyAgICBzdGF0ZTogRElTQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX1dSSVRFCisgIH0KKyAgaXNfZml4ZWRfcmVhZF9vbmx5OiBmYWxzZQorICBpc19leHBvcnRlZDogZmFsc2UKKyAgY29udGFpbmVyOiAic3lzdGVtIgorICBtZXRhZGF0YSB7CisgICAgcHVycG9zZTogUFVSUE9TRV9VTlNQRUNJRklFRAorICB9Cit9CitwYXJzZWRfZmxhZyB7CisgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiCisgIG5hbWU6ICJkaXNhYmxlZF9yd19leHBvcnRlZCIKKyAgbmFtZXNwYWNlOiAiYWNvbmZpZ190ZXN0IgorICBkZXNjcmlwdGlvbjogIlRoaXMgZmxhZyBpcyBESVNBQkxFRCArIFJFQURfV1JJVEUgYW5kIGV4cG9ydGVkIgorICBidWc6ICIxMTEiCisgIHN0YXRlOiBESVNBQkxFRAorICBwZXJtaXNzaW9uOiBSRUFEX1dSSVRFCisgIHRyYWNlIHsKKyAgICBzb3VyY2U6ICJ0ZXN0cy90ZXN0LmFjb25maWciCisgICAgc3RhdGU6IERJU0FCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9XUklURQorICB9CisgIHRyYWNlIHsKKyAgICBzb3VyY2U6ICJ0ZXN0cy9maXJzdC52YWx1ZXMiCisgICAgc3RhdGU6IERJU0FCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9XUklURQorICB9CisgIGlzX2ZpeGVkX3JlYWRfb25seTogZmFsc2UKKyAgaXNfZXhwb3J0ZWQ6IHRydWUKKyAgY29udGFpbmVyOiAic3lzdGVtIgorICBtZXRhZGF0YSB7CisgICAgcHVycG9zZTogUFVSUE9TRV9VTlNQRUNJRklFRAorICB9Cit9CitwYXJzZWRfZmxhZyB7CisgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiCisgIG5hbWU6ICJkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UiCisgIG5hbWVzcGFjZTogIm90aGVyX25hbWVzcGFjZSIKKyAgZGVzY3JpcHRpb246ICJUaGlzIGZsYWcgaXMgRElTQUJMRUQgKyBSRUFEX1dSSVRFLCBhbmQgaXMgZGVmaW5lZCBpbiBhbm90aGVyIG5hbWVzcGFjZSIKKyAgYnVnOiAiOTk5IgorICBzdGF0ZTogRElTQUJMRUQKKyAgcGVybWlzc2lvbjogUkVBRF9XUklURQorICB0cmFjZSB7CisgICAgc291cmNlOiAidGVzdHMvdGVzdC5hY29uZmlnIgorICAgIHN0YXRlOiBESVNBQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfV1JJVEUKKyAgfQorICB0cmFjZSB7CisgICAgc291cmNlOiAidGVzdHMvZmlyc3QudmFsdWVzIgorICAgIHN0YXRlOiBESVNBQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfV1JJVEUKKyAgfQorICBpc19maXhlZF9yZWFkX29ubHk6IGZhbHNlCisgIGlzX2V4cG9ydGVkOiBmYWxzZQorICBjb250YWluZXI6ICJzeXN0ZW0iCisgIG1ldGFkYXRhIHsKKyAgICBwdXJwb3NlOiBQVVJQT1NFX1VOU1BFQ0lGSUVECisgIH0KK30KK3BhcnNlZF9mbGFnIHsKKyAgcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIKKyAgbmFtZTogImVuYWJsZWRfZml4ZWRfcm8iCisgIG5hbWVzcGFjZTogImFjb25maWdfdGVzdCIKKyAgZGVzY3JpcHRpb246ICJUaGlzIGZsYWcgaXMgZml4ZWQgUkVBRF9PTkxZICsgRU5BQkxFRCIKKyAgYnVnOiAiIgorICBzdGF0ZTogRU5BQkxFRAorICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgdHJhY2UgeworICAgIHNvdXJjZTogInRlc3RzL3Rlc3QuYWNvbmZpZyIKKyAgICBzdGF0ZTogRElTQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgfQorICB0cmFjZSB7CisgICAgc291cmNlOiAidGVzdHMvZmlyc3QudmFsdWVzIgorICAgIHN0YXRlOiBFTkFCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgIH0KKyAgaXNfZml4ZWRfcmVhZF9vbmx5OiB0cnVlCisgIGlzX2V4cG9ydGVkOiBmYWxzZQorICBjb250YWluZXI6ICJzeXN0ZW0iCisgIG1ldGFkYXRhIHsKKyAgICBwdXJwb3NlOiBQVVJQT1NFX1VOU1BFQ0lGSUVECisgIH0KK30KK3BhcnNlZF9mbGFnIHsKKyAgcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIKKyAgbmFtZTogImVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQiCisgIG5hbWVzcGFjZTogImFjb25maWdfdGVzdCIKKyAgZGVzY3JpcHRpb246ICJUaGlzIGZsYWcgaXMgZml4ZWQgRU5BQkxFRCArIFJFQURfT05MWSBhbmQgZXhwb3J0ZWQiCisgIGJ1ZzogIjExMSIKKyAgc3RhdGU6IEVOQUJMRUQKKyAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgIHRyYWNlIHsKKyAgICBzb3VyY2U6ICJ0ZXN0cy90ZXN0LmFjb25maWciCisgICAgc3RhdGU6IERJU0FCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgIH0KKyAgdHJhY2UgeworICAgIHNvdXJjZTogInRlc3RzL2ZpcnN0LnZhbHVlcyIKKyAgICBzdGF0ZTogRU5BQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorICB9CisgIGlzX2ZpeGVkX3JlYWRfb25seTogdHJ1ZQorICBpc19leHBvcnRlZDogdHJ1ZQorICBjb250YWluZXI6ICJzeXN0ZW0iCisgIG1ldGFkYXRhIHsKKyAgICBwdXJwb3NlOiBQVVJQT1NFX1VOU1BFQ0lGSUVECisgIH0KK30KK3BhcnNlZF9mbGFnIHsKKyAgcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIKKyAgbmFtZTogImVuYWJsZWRfcm8iCisgIG5hbWVzcGFjZTogImFjb25maWdfdGVzdCIKKyAgZGVzY3JpcHRpb246ICJUaGlzIGZsYWcgaXMgRU5BQkxFRCArIFJFQURfT05MWSIKKyAgYnVnOiAiYWJjIgorICBzdGF0ZTogRU5BQkxFRAorICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgdHJhY2UgeworICAgIHNvdXJjZTogInRlc3RzL3Rlc3QuYWNvbmZpZyIKKyAgICBzdGF0ZTogRElTQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX1dSSVRFCisgIH0KKyAgdHJhY2UgeworICAgIHNvdXJjZTogInRlc3RzL2ZpcnN0LnZhbHVlcyIKKyAgICBzdGF0ZTogRElTQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX1dSSVRFCisgIH0KKyAgdHJhY2UgeworICAgIHNvdXJjZTogInRlc3RzL3NlY29uZC52YWx1ZXMiCisgICAgc3RhdGU6IEVOQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgfQorICBpc19maXhlZF9yZWFkX29ubHk6IGZhbHNlCisgIGlzX2V4cG9ydGVkOiBmYWxzZQorICBjb250YWluZXI6ICJzeXN0ZW0iCisgIG1ldGFkYXRhIHsKKyAgICBwdXJwb3NlOiBQVVJQT1NFX0JVR0ZJWAorICB9Cit9CitwYXJzZWRfZmxhZyB7CisgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiCisgIG5hbWU6ICJlbmFibGVkX3JvX2V4cG9ydGVkIgorICBuYW1lc3BhY2U6ICJhY29uZmlnX3Rlc3QiCisgIGRlc2NyaXB0aW9uOiAiVGhpcyBmbGFnIGlzIEVOQUJMRUQgKyBSRUFEX09OTFkgYW5kIGV4cG9ydGVkIgorICBidWc6ICIxMTEiCisgIHN0YXRlOiBFTkFCTEVECisgIHBlcm1pc3Npb246IFJFQURfT05MWQorICB0cmFjZSB7CisgICAgc291cmNlOiAidGVzdHMvdGVzdC5hY29uZmlnIgorICAgIHN0YXRlOiBESVNBQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfV1JJVEUKKyAgfQorICB0cmFjZSB7CisgICAgc291cmNlOiAidGVzdHMvZmlyc3QudmFsdWVzIgorICAgIHN0YXRlOiBFTkFCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgIH0KKyAgaXNfZml4ZWRfcmVhZF9vbmx5OiBmYWxzZQorICBpc19leHBvcnRlZDogdHJ1ZQorICBjb250YWluZXI6ICJzeXN0ZW0iCisgIG1ldGFkYXRhIHsKKyAgICBwdXJwb3NlOiBQVVJQT1NFX1VOU1BFQ0lGSUVECisgIH0KK30KK3BhcnNlZF9mbGFnIHsKKyAgcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIKKyAgbmFtZTogImVuYWJsZWRfcnciCisgIG5hbWVzcGFjZTogImFjb25maWdfdGVzdCIKKyAgZGVzY3JpcHRpb246ICJUaGlzIGZsYWcgaXMgRU5BQkxFRCArIFJFQURfV1JJVEUiCisgIGJ1ZzogIiIKKyAgc3RhdGU6IEVOQUJMRUQKKyAgcGVybWlzc2lvbjogUkVBRF9XUklURQorICB0cmFjZSB7CisgICAgc291cmNlOiAidGVzdHMvdGVzdC5hY29uZmlnIgorICAgIHN0YXRlOiBESVNBQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfV1JJVEUKKyAgfQorICB0cmFjZSB7CisgICAgc291cmNlOiAidGVzdHMvZmlyc3QudmFsdWVzIgorICAgIHN0YXRlOiBFTkFCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9XUklURQorICB9CisgIGlzX2ZpeGVkX3JlYWRfb25seTogZmFsc2UKKyAgaXNfZXhwb3J0ZWQ6IGZhbHNlCisgIGNvbnRhaW5lcjogInN5c3RlbSIKKyAgbWV0YWRhdGEgeworICAgIHB1cnBvc2U6IFBVUlBPU0VfVU5TUEVDSUZJRUQKKyAgfQorfQorIiM7CisKKyAgICBwdWIgZm4gcGFyc2VfcmVhZF9vbmx5X3Rlc3RfZmxhZ3MoKSAtPiBQcm90b1BhcnNlZEZsYWdzIHsKKyAgICAgICAgbGV0IGJ5dGVzID0gY3JhdGU6OmNvbW1hbmRzOjpwYXJzZV9mbGFncygKKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiLAorICAgICAgICAgICAgU29tZSgic3lzdGVtIiksCisgICAgICAgICAgICB2ZWMhW0lucHV0IHsKKyAgICAgICAgICAgICAgICBzb3VyY2U6ICJ0ZXN0cy9yZWFkX29ubHlfdGVzdC5hY29uZmlnIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICByZWFkZXI6IEJveDo6bmV3KGluY2x1ZGVfYnl0ZXMhKCIuLi90ZXN0cy9yZWFkX29ubHlfdGVzdC5hY29uZmlnIikuYXNfc2xpY2UoKSksCisgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgIHZlYyFbSW5wdXQgeworICAgICAgICAgICAgICAgIHNvdXJjZTogInRlc3RzL3JlYWRfb25seV90ZXN0LnZhbHVlcyIudG9fc3RyaW5nKCksCisgICAgICAgICAgICAgICAgcmVhZGVyOiBCb3g6Om5ldyhpbmNsdWRlX2J5dGVzISgiLi4vdGVzdHMvcmVhZF9vbmx5X3Rlc3QudmFsdWVzIikuYXNfc2xpY2UoKSksCisgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgIGNyYXRlOjpjb21tYW5kczo6REVGQVVMVF9GTEFHX1BFUk1JU1NJT04sCisgICAgICAgICAgICB0cnVlLAorICAgICAgICApCisgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgYWNvbmZpZ19wcm90b3M6OnBhcnNlZF9mbGFnczo6dHJ5X2Zyb21fYmluYXJ5X3Byb3RvKCZieXRlcykudW53cmFwKCkKKyAgICB9CisKKyAgICBwdWIgZm4gcGFyc2VfdGVzdF9mbGFncygpIC0+IFByb3RvUGFyc2VkRmxhZ3MgeworICAgICAgICBsZXQgYnl0ZXMgPSBjcmF0ZTo6Y29tbWFuZHM6OnBhcnNlX2ZsYWdzKAorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIsCisgICAgICAgICAgICBTb21lKCJzeXN0ZW0iKSwKKyAgICAgICAgICAgIHZlYyFbSW5wdXQgeworICAgICAgICAgICAgICAgIHNvdXJjZTogInRlc3RzL3Rlc3QuYWNvbmZpZyIudG9fc3RyaW5nKCksCisgICAgICAgICAgICAgICAgcmVhZGVyOiBCb3g6Om5ldyhpbmNsdWRlX2J5dGVzISgiLi4vdGVzdHMvdGVzdC5hY29uZmlnIikuYXNfc2xpY2UoKSksCisgICAgICAgICAgICB9XSwKKyAgICAgICAgICAgIHZlYyFbCisgICAgICAgICAgICAgICAgSW5wdXQgeworICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICJ0ZXN0cy9maXJzdC52YWx1ZXMiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICByZWFkZXI6IEJveDo6bmV3KGluY2x1ZGVfYnl0ZXMhKCIuLi90ZXN0cy9maXJzdC52YWx1ZXMiKS5hc19zbGljZSgpKSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIElucHV0IHsKKyAgICAgICAgICAgICAgICAgICAgc291cmNlOiAidGVzdHMvc2Vjb25kLnZhbHVlcyIudG9fc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIHJlYWRlcjogQm94OjpuZXcoaW5jbHVkZV9ieXRlcyEoIi4uL3Rlc3RzL3NlY29uZC52YWx1ZXMiKS5hc19zbGljZSgpKSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIGNyYXRlOjpjb21tYW5kczo6REVGQVVMVF9GTEFHX1BFUk1JU1NJT04sCisgICAgICAgICAgICB0cnVlLAorICAgICAgICApCisgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgYWNvbmZpZ19wcm90b3M6OnBhcnNlZF9mbGFnczo6dHJ5X2Zyb21fYmluYXJ5X3Byb3RvKCZieXRlcykudW53cmFwKCkKKyAgICB9CisKKyAgICBwdWIgZm4gcGFyc2Vfc2Vjb25kX3BhY2thZ2VfZmxhZ3MoKSAtPiBQcm90b1BhcnNlZEZsYWdzIHsKKyAgICAgICAgbGV0IGJ5dGVzID0gY3JhdGU6OmNvbW1hbmRzOjpwYXJzZV9mbGFncygKKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnNlY29uZF90ZXN0IiwKKyAgICAgICAgICAgIFNvbWUoInN5c3RlbSIpLAorICAgICAgICAgICAgdmVjIVtJbnB1dCB7CisgICAgICAgICAgICAgICAgc291cmNlOiAidGVzdHMvdGVzdF9zZWNvbmRfcGFja2FnZS5hY29uZmlnIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICByZWFkZXI6IEJveDo6bmV3KGluY2x1ZGVfYnl0ZXMhKCIuLi90ZXN0cy90ZXN0X3NlY29uZF9wYWNrYWdlLmFjb25maWciKS5hc19zbGljZSgpKSwKKyAgICAgICAgICAgIH1dLAorICAgICAgICAgICAgdmVjIVtJbnB1dCB7CisgICAgICAgICAgICAgICAgc291cmNlOiAidGVzdHMvdGhpcmQudmFsdWVzIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICByZWFkZXI6IEJveDo6bmV3KGluY2x1ZGVfYnl0ZXMhKCIuLi90ZXN0cy90aGlyZC52YWx1ZXMiKS5hc19zbGljZSgpKSwKKyAgICAgICAgICAgIH1dLAorICAgICAgICAgICAgY3JhdGU6OmNvbW1hbmRzOjpERUZBVUxUX0ZMQUdfUEVSTUlTU0lPTiwKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcCgpOworICAgICAgICBhY29uZmlnX3Byb3Rvczo6cGFyc2VkX2ZsYWdzOjp0cnlfZnJvbV9iaW5hcnlfcHJvdG8oJmJ5dGVzKS51bndyYXAoKQorICAgIH0KKworICAgIHB1YiBmbiBmaXJzdF9zaWduaWZpY2FudF9jb2RlX2RpZmYoYTogJnN0ciwgYjogJnN0cikgLT4gT3B0aW9uPFN0cmluZz4geworICAgICAgICBsZXQgYSA9IGEubGluZXMoKS5tYXAofGxpbmV8IGxpbmUudHJpbV9zdGFydCgpKS5maWx0ZXIofGxpbmV8ICFsaW5lLmlzX2VtcHR5KCkpOworICAgICAgICBsZXQgYiA9IGIubGluZXMoKS5tYXAofGxpbmV8IGxpbmUudHJpbV9zdGFydCgpKS5maWx0ZXIofGxpbmV8ICFsaW5lLmlzX2VtcHR5KCkpOworICAgICAgICBtYXRjaCBpdGVydG9vbHM6OmRpZmZfd2l0aChhLCBiLCB8bGVmdCwgcmlnaHR8IGxlZnQgPT0gcmlnaHQpIHsKKyAgICAgICAgICAgIFNvbWUoaXRlcnRvb2xzOjpEaWZmOjpGaXJzdE1pc21hdGNoKF8sIG11dCBsZWZ0LCBtdXQgcmlnaHQpKSA9PiB7CisgICAgICAgICAgICAgICAgU29tZShmb3JtYXQhKCIne30nIHZzICd7fSciLCBsZWZ0Lm5leHQoKS51bndyYXAoKSwgcmlnaHQubmV4dCgpLnVud3JhcCgpKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNvbWUoaXRlcnRvb2xzOjpEaWZmOjpTaG9ydGVyKF8sIG11dCBsZWZ0KSkgPT4geworICAgICAgICAgICAgICAgIFNvbWUoZm9ybWF0ISgiTEhTIHRyYWlsaW5nIGRhdGE6ICd7fSciLCBsZWZ0Lm5leHQoKS51bndyYXAoKSkpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBTb21lKGl0ZXJ0b29sczo6RGlmZjo6TG9uZ2VyKF8sIG11dCByaWdodCkpID0+IHsKKyAgICAgICAgICAgICAgICBTb21lKGZvcm1hdCEoIlJIUyB0cmFpbGluZyBkYXRhOiAne30nIiwgcmlnaHQubmV4dCgpLnVud3JhcCgpKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5vbmUgPT4gTm9uZSwKKyAgICAgICAgfQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2ZpcnN0X3NpZ25pZmljYW50X2NvZGVfZGlmZigpIHsKKyAgICAgICAgYXNzZXJ0IShmaXJzdF9zaWduaWZpY2FudF9jb2RlX2RpZmYoIiIsICIiKS5pc19ub25lKCkpOworICAgICAgICBhc3NlcnQhKGZpcnN0X3NpZ25pZmljYW50X2NvZGVfZGlmZigiICAgYSIsICJcblxuYVxuIikuaXNfbm9uZSgpKTsKKyAgICAgICAgbGV0IGEgPSByIyIKKyAgICAgICAgcHVibGljIGNsYXNzIEEgeworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTyA9ICJGT08iOworICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRk9PPSIgKyBGT08pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICIjOworICAgICAgICBsZXQgYiA9IHIjIgorICAgICAgICBwdWJsaWMgY2xhc3MgQSB7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9PID0gIkJBUiI7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmb289IiArIEZPTyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIiM7CisgICAgICAgIGFzc2VydF9lcSEoU29tZShyIyIncHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTyA9ICJGT08iOycgdnMgJ3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT08gPSAiQkFSIjsnIiMudG9fc3RyaW5nKCkpLCBmaXJzdF9zaWduaWZpY2FudF9jb2RlX2RpZmYoYSwgYikpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgU29tZSgiTEhTIHRyYWlsaW5nIGRhdGE6ICdiJyIudG9fc3RyaW5nKCkpLAorICAgICAgICAgICAgZmlyc3Rfc2lnbmlmaWNhbnRfY29kZV9kaWZmKCJhXG5iIiwgImEiKQorICAgICAgICApOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgU29tZSgiUkhTIHRyYWlsaW5nIGRhdGE6ICdiJyIudG9fc3RyaW5nKCkpLAorICAgICAgICAgICAgZmlyc3Rfc2lnbmlmaWNhbnRfY29kZV9kaWZmKCJhIiwgImFcbmIiKQorICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvQ3VzdG9tRmVhdHVyZUZsYWdzLmphdmEudGVtcGxhdGUgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0N1c3RvbUZlYXR1cmVGbGFncy5qYXZhLnRlbXBsYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MmI5Y2IKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0N1c3RvbUZlYXR1cmVGbGFncy5qYXZhLnRlbXBsYXRlCkBAIC0wLDAgKzEsNzAgQEAKK3BhY2thZ2Uge3BhY2thZ2VfbmFtZX07CisKK3t7IGlmIG5vdCBsaWJyYXJ5X2V4cG9ydGVkLSB9fQorLy8gVE9ETyhiLzMwMzc3MzA1NSk6IFJlbW92ZSB0aGUgYW5ub3RhdGlvbiBhZnRlciBhY2Nlc3MgaXNzdWUgaXMgcmVzb2x2ZWQuCitpbXBvcnQgYW5kcm9pZC5jb21wYXQuYW5ub3RhdGlvbi5VbnN1cHBvcnRlZEFwcFVzYWdlOwore3sgLWVuZGlmIH19CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaVByZWRpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworCisvKiogQGhpZGUgKi8KK3B1YmxpYyBjbGFzcyBDdXN0b21GZWF0dXJlRmxhZ3MgaW1wbGVtZW50cyBGZWF0dXJlRmxhZ3MgXHsKKworICAgIHByaXZhdGUgQmlQcmVkaWNhdGU8U3RyaW5nLCBQcmVkaWNhdGU8RmVhdHVyZUZsYWdzPj4gbUdldFZhbHVlSW1wbDsKKworICAgIHB1YmxpYyBDdXN0b21GZWF0dXJlRmxhZ3MoQmlQcmVkaWNhdGU8U3RyaW5nLCBQcmVkaWNhdGU8RmVhdHVyZUZsYWdzPj4gZ2V0VmFsdWVJbXBsKSBceworICAgICAgICBtR2V0VmFsdWVJbXBsID0gZ2V0VmFsdWVJbXBsOworICAgIH0KKwore3sgLWZvciBpdGVtIGluIGZsYWdfZWxlbWVudHN9fQorICAgIEBPdmVycmlkZQore3sgaWYgbm90IGxpYnJhcnlfZXhwb3J0ZWQgfX0gICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2V7eyAtZW5kaWYgfX0KKyAgICBwdWJsaWMgYm9vbGVhbiB7aXRlbS5tZXRob2RfbmFtZX0oKSBceworICAgICAgICByZXR1cm4gZ2V0VmFsdWUoRmxhZ3MuRkxBR197aXRlbS5mbGFnX25hbWVfY29uc3RhbnRfc3VmZml4fSwKKyAgICAgICAgICAgIEZlYXR1cmVGbGFnczo6e2l0ZW0ubWV0aG9kX25hbWV9KTsKKyAgICB9Cit7eyBlbmRmb3IgfX0KKwore3sgLWlmIG5vdCBsaWJyYXJ5X2V4cG9ydGVkIH19CisgICAgcHVibGljIGJvb2xlYW4gaXNGbGFnUmVhZE9ubHlPcHRpbWl6ZWQoU3RyaW5nIGZsYWdOYW1lKSBceworICAgICAgICBpZiAobVJlYWRPbmx5RmxhZ3NTZXQuY29udGFpbnMoZmxhZ05hbWUpICYmCisgICAgICAgICAgICBpc09wdGltaXphdGlvbkVuYWJsZWQoKSkgXHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lVHJ1ZUZvclI4CisgICAgcHJpdmF0ZSBib29sZWFuIGlzT3B0aW1pemF0aW9uRW5hYmxlZCgpIFx7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit7eyAtZW5kaWYgfX0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGdldFZhbHVlKFN0cmluZyBmbGFnTmFtZSwgUHJlZGljYXRlPEZlYXR1cmVGbGFncz4gZ2V0dGVyKSBceworICAgICAgICByZXR1cm4gbUdldFZhbHVlSW1wbC50ZXN0KGZsYWdOYW1lLCBnZXR0ZXIpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RmxhZ05hbWVzKCkgXHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICB7eyAtZm9yIGl0ZW0gaW4gZmxhZ19lbGVtZW50cyB9fQorICAgICAgICAgICAgRmxhZ3MuRkxBR197aXRlbS5mbGFnX25hbWVfY29uc3RhbnRfc3VmZml4fQorICAgICAgICAgICAge3sgLWlmIG5vdCBAbGFzdCB9fSx7eyBlbmRpZiB9fQorICAgICAgICAgICAge3sgLWVuZGZvciB9fQorICAgICAgICApOworICAgIH0KKworICAgIHByaXZhdGUgU2V0PFN0cmluZz4gbVJlYWRPbmx5RmxhZ3NTZXQgPSBuZXcgSGFzaFNldDw+KAorICAgICAgICBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAge3sgLWZvciBpdGVtIGluIGZsYWdfZWxlbWVudHMgfX0KKyAgICAgICAgICAgIHt7IC1pZiBub3QgaXRlbS5pc19yZWFkX3dyaXRlIH19CisgICAgICAgICAgICBGbGFncy5GTEFHX3tpdGVtLmZsYWdfbmFtZV9jb25zdGFudF9zdWZmaXh9LAorICAgICAgICAgICAge3sgLWVuZGlmIH19CisgICAgICAgICAgICB7eyAtZW5kZm9yIH19CisgICAgICAgICAgICAiInsjIFRoZSBlbXB0eSBzdHJpbmcgaGVyZSBpcyB0byByZXNvbHZlIHRoZSBlbmRpbmcgY29tbWEgI30KKyAgICAgICAgKQorICAgICk7Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0Zha2VGZWF0dXJlRmxhZ3NJbXBsLmphdmEudGVtcGxhdGUgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0Zha2VGZWF0dXJlRmxhZ3NJbXBsLmphdmEudGVtcGxhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwZDJjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvRmFrZUZlYXR1cmVGbGFnc0ltcGwuamF2YS50ZW1wbGF0ZQpAQCAtMCwwICsxLDQ5IEBACitwYWNrYWdlIHtwYWNrYWdlX25hbWV9OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworCisvKiogQGhpZGUgKi8KK3B1YmxpYyBjbGFzcyBGYWtlRmVhdHVyZUZsYWdzSW1wbCBleHRlbmRzIEN1c3RvbUZlYXR1cmVGbGFncyBceworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgQm9vbGVhbj4gbUZsYWdNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBGZWF0dXJlRmxhZ3MgbURlZmF1bHRzOworCisgICAgcHVibGljIEZha2VGZWF0dXJlRmxhZ3NJbXBsKCkgXHsKKyAgICAgICAgdGhpcyhudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmFrZUZlYXR1cmVGbGFnc0ltcGwoRmVhdHVyZUZsYWdzIGRlZmF1bHRzKSBceworICAgICAgICBzdXBlcihudWxsKTsKKyAgICAgICAgbURlZmF1bHRzID0gZGVmYXVsdHM7CisgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIG1hcCB3aXRoIG51bGwgdmFsdWVzCisgICAgICAgIGZvciAoU3RyaW5nIGZsYWdOYW1lIDogZ2V0RmxhZ05hbWVzKCkpIFx7CisgICAgICAgICAgICBtRmxhZ01hcC5wdXQoZmxhZ05hbWUsIG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2V0VmFsdWUoU3RyaW5nIGZsYWdOYW1lLCBQcmVkaWNhdGU8RmVhdHVyZUZsYWdzPiBnZXR0ZXIpIFx7CisgICAgICAgIEJvb2xlYW4gdmFsdWUgPSB0aGlzLm1GbGFnTWFwLmdldChmbGFnTmFtZSk7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSBceworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmIChtRGVmYXVsdHMgIT0gbnVsbCkgXHsKKyAgICAgICAgICAgIHJldHVybiBnZXR0ZXIudGVzdChtRGVmYXVsdHMpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZmxhZ05hbWUgKyAiIGlzIG5vdCBzZXQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGbGFnKFN0cmluZyBmbGFnTmFtZSwgYm9vbGVhbiB2YWx1ZSkgXHsKKyAgICAgICAgaWYgKCF0aGlzLm1GbGFnTWFwLmNvbnRhaW5zS2V5KGZsYWdOYW1lKSkgXHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vIHN1Y2ggZmxhZyAiICsgZmxhZ05hbWUpOworICAgICAgICB9CisgICAgICAgIHRoaXMubUZsYWdNYXAucHV0KGZsYWdOYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzZXRBbGwoKSBceworICAgICAgICBmb3IgKE1hcC5FbnRyeSBlbnRyeSA6IG1GbGFnTWFwLmVudHJ5U2V0KCkpIFx7CisgICAgICAgICAgICBlbnRyeS5zZXRWYWx1ZShudWxsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvRmVhdHVyZUZsYWdzLmphdmEudGVtcGxhdGUgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZlYXR1cmVGbGFncy5qYXZhLnRlbXBsYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNzk5YjIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZlYXR1cmVGbGFncy5qYXZhLnRlbXBsYXRlCkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2Uge3BhY2thZ2VfbmFtZX07Cit7eyBpZiBub3QgbGlicmFyeV9leHBvcnRlZC0gfX0KKy8vIFRPRE8oYi8zMDM3NzMwNTUpOiBSZW1vdmUgdGhlIGFubm90YXRpb24gYWZ0ZXIgYWNjZXNzIGlzc3VlIGlzIHJlc29sdmVkLgoraW1wb3J0IGFuZHJvaWQuY29tcGF0LmFubm90YXRpb24uVW5zdXBwb3J0ZWRBcHBVc2FnZTsKK3t7IC1lbmRpZiB9fQorLyoqIEBoaWRlICovCitwdWJsaWMgaW50ZXJmYWNlIEZlYXR1cmVGbGFncyBcewore3sgZm9yIGl0ZW0gaW4gZmxhZ19lbGVtZW50cyB9fQore3sgLWlmIG5vdCBpdGVtLmlzX3JlYWRfd3JpdGUgfX0KK3t7IC1pZiBpdGVtLmRlZmF1bHRfdmFsdWUgfX0KKyAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5Bc3N1bWVUcnVlRm9yUjgKK3t7IC1lbHNlIH19CisgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQXNzdW1lRmFsc2VGb3JSOAore3sgLWVuZGlmLSB9fQore3sgLWVuZGlmIH19Cit7eyAtaWYgbm90IGxpYnJhcnlfZXhwb3J0ZWQgfX0KKyAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKK3t7IC1lbmRpZiB9fQorICAgIGJvb2xlYW4ge2l0ZW0ubWV0aG9kX25hbWV9KCk7Cit7eyAtZW5kZm9yIH19Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZlYXR1cmVGbGFnc0ltcGwuamF2YS50ZW1wbGF0ZSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvRmVhdHVyZUZsYWdzSW1wbC5qYXZhLnRlbXBsYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNTI3MGEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZlYXR1cmVGbGFnc0ltcGwuamF2YS50ZW1wbGF0ZQpAQCAtMCwwICsxLDI0MyBAQAorcGFja2FnZSB7cGFja2FnZV9uYW1lfTsKK3t7IC1pZiBub3QgaXNfdGVzdF9tb2RlIH19Cit7eyAtaWYgYWxsb3dfaW5zdHJ1bWVudGF0aW9uIH19Cit7eyBpZiBub3QgbGlicmFyeV9leHBvcnRlZC0gfX17Iy0gb25seSBuZXcgc3RvcmFnZSBmb3IgcHJvZCBtb2RlICN9CisvLyBUT0RPKGIvMzAzNzczMDU1KTogUmVtb3ZlIHRoZSBhbm5vdGF0aW9uIGFmdGVyIGFjY2VzcyBpc3N1ZSBpcyByZXNvbHZlZC4KK2ltcG9ydCBhbmRyb2lkLmNvbXBhdC5hbm5vdGF0aW9uLlVuc3VwcG9ydGVkQXBwVXNhZ2U7Cit7eyAtaWYgcnVudGltZV9sb29rdXBfcmVxdWlyZWQgfX0KK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwore3sgaWYgaXNfcGxhdGZvcm1fY29udGFpbmVyIH19CitpbXBvcnQgYW5kcm9pZC5vcy5mbGFnZ2luZy5QbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWw7Cit7eyAtZWxzZSB9fQoraW1wb3J0IGFuZHJvaWQub3MuZmxhZ2dpbmcuQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbDsKK3t7IC1lbmRpZiB9fQoraW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Cit7eyAtZW5kaWYgfX0KKy8qKiBAaGlkZSAqLworcHVibGljIGZpbmFsIGNsYXNzIEZlYXR1cmVGbGFnc0ltcGwgaW1wbGVtZW50cyBGZWF0dXJlRmxhZ3MgXHsKK3t7IC1pZiBydW50aW1lX2xvb2t1cF9yZXF1aXJlZCB9fQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRmVhdHVyZUZsYWdzSW1wbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBpc0NhY2hlZCA9IGZhbHNlOwore3sgZm9yIGZsYWcgaW4gZmxhZ19lbGVtZW50cyB9fQore3sgLWlmIGZsYWcuaXNfcmVhZF93cml0ZSB9fQorICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4ge2ZsYWcubWV0aG9kX25hbWV9ID0ge2ZsYWcuZGVmYXVsdF92YWx1ZX07Cit7eyAtZW5kaWYgfX0KK3t7IC1lbmRmb3IgfX0KKworICAgIHByaXZhdGUgdm9pZCBpbml0KCkgXHsKKyAgICAgICAgdHJ5IFx7Cit7eyBpZiBpc19wbGF0Zm9ybV9jb250YWluZXIgfX0KKyAgICAgICAgICAgIFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbCByZWFkZXIgPSBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwubG9hZCgie2NvbnRhaW5lcn0iLCAie3BhY2thZ2VfbmFtZX0iLCB7cGFja2FnZV9maW5nZXJwcmludH0pOwore3sgLWVsc2UgfX0KKyAgICAgICAgICAgIEFjb25maWdQYWNrYWdlSW50ZXJuYWwgcmVhZGVyID0gQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbC5sb2FkKCJ7Y29udGFpbmVyfSIsICJ7cGFja2FnZV9uYW1lfSIsIHtwYWNrYWdlX2ZpbmdlcnByaW50fSk7Cit7eyAtZW5kaWYgfX0KKyAgICAgICAge3sgLWZvciBuYW1lc3BhY2Vfd2l0aF9mbGFncyBpbiBuYW1lc3BhY2VfZmxhZ3MgfX0KKyAgICAgICAge3sgLWZvciBmbGFnIGluIG5hbWVzcGFjZV93aXRoX2ZsYWdzLmZsYWdzIH19CisgICAgICAgIHt7IC1pZiBmbGFnLmlzX3JlYWRfd3JpdGUgfX0KKyAgICAgICAgICAgIHtmbGFnLm1ldGhvZF9uYW1lfSA9IHJlYWRlci5nZXRCb29sZWFuRmxhZ1ZhbHVlKHtmbGFnLmZsYWdfb2Zmc2V0fSk7CisgICAgICAgIHt7IC1lbmRpZiB9fQorICAgICAgICB7eyAtZW5kZm9yIH19CisgICAgICAgIHt7IC1lbmRmb3IgfX0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIFx7CisgICAgICAgICAgICBMb2cuZShUQUcsIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0gY2F0Y2ggKExpbmthZ2VFcnJvciBlKSBceworICAgICAgICAgICAgLy8gZm9yIG1haW5saW5lIG1vZHVsZSBydW5uaW5nIG9uIG9sZGVyIGRldmljZXMuCisgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSByZXBsYWNlcyB0byB2ZXJzaW9uIGNoZWNrLCBhZnRlciB0aGUgdmVyc2lvbiBidW1wLgorICAgICAgICAgICAgTG9nLmUoVEFHLCBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGlzQ2FjaGVkID0gdHJ1ZTsKKyAgICB9Cit7eyAtZW5kaWYgfX17Iy0gZW5kIG9mIHJ1bnRpbWVfbG9va3VwX3JlcXVpcmVkICN9Cit7eyAtZm9yIGZsYWcgaW4gZmxhZ19lbGVtZW50cyB9fQorICAgIEBPdmVycmlkZQorICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgIHB1YmxpYyBib29sZWFuIHtmbGFnLm1ldGhvZF9uYW1lfSgpIFx7Cit7eyAtaWYgZmxhZy5pc19yZWFkX3dyaXRlIH19CisgICAgICAgIGlmICghaXNDYWNoZWQpIFx7CisgICAgICAgICAgICBpbml0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHtmbGFnLm1ldGhvZF9uYW1lfTsKK3t7IC1lbHNlIH19CisgICAgICAgIHJldHVybiB7ZmxhZy5kZWZhdWx0X3ZhbHVlfTsKK3t7IC1lbmRpZiB9fQorICAgIH0KK3t7IGVuZGZvciB9fQorfQore3sgLWVsc2UtIH19eyMtIGRldmljZSBjb25maWcgZm9yIGV4cHJvdGVkIG1vZGUgI30KK3t7IC1pZiBuZXdfZXhwb3J0ZWQgfX0KK2ltcG9ydCBhbmRyb2lkLm9zLmZsYWdnaW5nLkFjb25maWdQYWNrYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisvKiogQGhpZGUgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBGZWF0dXJlRmxhZ3NJbXBsIGltcGxlbWVudHMgRmVhdHVyZUZsYWdzIFx7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJGZWF0dXJlRmxhZ3NJbXBsRXhwb3J0IjsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIGlzQ2FjaGVkID0gZmFsc2U7Cit7eyBmb3IgZmxhZyBpbiBmbGFnX2VsZW1lbnRzIH19CisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB7ZmxhZy5tZXRob2RfbmFtZX0gPSBmYWxzZTsKK3t7IC1lbmRmb3IgfX0KKyAgICBwcml2YXRlIHZvaWQgaW5pdCgpIFx7CisgICAgICAgIHRyeSBceworICAgICAgICAgICAgQWNvbmZpZ1BhY2thZ2UgcmVhZGVyID0gQWNvbmZpZ1BhY2thZ2UubG9hZCgie3BhY2thZ2VfbmFtZX0iKTsKKyAgICAgICAgICAgIHt7IC1mb3IgbmFtZXNwYWNlX3dpdGhfZmxhZ3MgaW4gbmFtZXNwYWNlX2ZsYWdzIH19CisgICAgICAgICAgICB7eyAtZm9yIGZsYWcgaW4gbmFtZXNwYWNlX3dpdGhfZmxhZ3MuZmxhZ3MgfX0KKyAgICAgICAgICAgIHtmbGFnLm1ldGhvZF9uYW1lfSA9IHJlYWRlci5nZXRCb29sZWFuRmxhZ1ZhbHVlKCJ7ZmxhZy5mbGFnX25hbWV9Iiwge2ZsYWcuZGVmYXVsdF92YWx1ZX0pOworICAgICAgICAgICAge3sgLWVuZGZvciB9fQorICAgICAgICAgICAge3sgLWVuZGZvciB9fQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgXHsKKyAgICAgICAgICAgIC8vIHBhc3MKKyAgICAgICAgICAgIExvZy5lKFRBRywgZS50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoTGlua2FnZUVycm9yIGUpIFx7CisgICAgICAgICAgICAvLyBmb3IgbWFpbmxpbmUgbW9kdWxlIHJ1bm5pbmcgb24gb2xkZXIgZGV2aWNlcy4KKyAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIHJlcGxhY2VzIHRvIHZlcnNpb24gY2hlY2ssIGFmdGVyIHRoZSB2ZXJzaW9uIGJ1bXAuCisgICAgICAgICAgICBMb2cuZShUQUcsIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgaXNDYWNoZWQgPSB0cnVlOworICAgIH0KK3t7IC1mb3IgZmxhZyBpbiBmbGFnX2VsZW1lbnRzIH19CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4ge2ZsYWcubWV0aG9kX25hbWV9KCkgXHsKKyAgICAgICAgaWYgKCFpc0NhY2hlZCkgXHsKKyAgICAgICAgICAgIGluaXQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4ge2ZsYWcubWV0aG9kX25hbWV9OworICAgIH0KK3t7IGVuZGZvciB9fQorfQore3sgZWxzZSB9fQoraW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuRGV2aWNlQ29uZmlnOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuRGV2aWNlQ29uZmlnLlByb3BlcnRpZXM7CisvKiogQGhpZGUgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBGZWF0dXJlRmxhZ3NJbXBsIGltcGxlbWVudHMgRmVhdHVyZUZsYWdzIFx7Cit7eyAtZm9yIG5hbWVzcGFjZV93aXRoX2ZsYWdzIGluIG5hbWVzcGFjZV9mbGFncyB9fQorICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4ge25hbWVzcGFjZV93aXRoX2ZsYWdzLm5hbWVzcGFjZX1faXNfY2FjaGVkID0gZmFsc2U7Cit7eyAtZW5kZm9yLSB9fQore3sgZm9yIGZsYWcgaW4gZmxhZ19lbGVtZW50cyB9fQore3sgLWlmIGZsYWcuaXNfcmVhZF93cml0ZSB9fQorICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4ge2ZsYWcubWV0aG9kX25hbWV9ID0ge2ZsYWcuZGVmYXVsdF92YWx1ZX07Cit7eyAtZW5kaWYgfX0KK3t7IC1lbmRmb3IgfX0KK3t7IGZvciBuYW1lc3BhY2Vfd2l0aF9mbGFncyBpbiBuYW1lc3BhY2VfZmxhZ3MgfX0KKyAgICBwcml2YXRlIHZvaWQgbG9hZF9vdmVycmlkZXNfe25hbWVzcGFjZV93aXRoX2ZsYWdzLm5hbWVzcGFjZX0oKSBceworICAgICAgICBmaW5hbCBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgIHRyeSBceworICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gRGV2aWNlQ29uZmlnLmdldFByb3BlcnRpZXMoIntuYW1lc3BhY2Vfd2l0aF9mbGFncy5uYW1lc3BhY2V9Iik7Cit7eyAtZm9yIGZsYWcgaW4gbmFtZXNwYWNlX3dpdGhfZmxhZ3MuZmxhZ3MgfX0KK3t7IC1pZiBmbGFnLmlzX3JlYWRfd3JpdGUgfX0KKyAgICAgICAgICAgIHtmbGFnLm1ldGhvZF9uYW1lfSA9CisgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRCb29sZWFuKEZsYWdzLkZMQUdfe2ZsYWcuZmxhZ19uYW1lX2NvbnN0YW50X3N1ZmZpeH0sIHtmbGFnLmRlZmF1bHRfdmFsdWV9KTsKK3t7IC1lbmRpZiB9fQore3sgLWVuZGZvciB9fQorICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSBceworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkNhbm5vdCByZWFkIHZhbHVlIGZyb20gbmFtZXNwYWNlIHtuYW1lc3BhY2Vfd2l0aF9mbGFncy5uYW1lc3BhY2V9ICIKKyAgICAgICAgICAgICAgICArICJmcm9tIERldmljZUNvbmZpZy4gSXQgY291bGQgYmUgdGhhdCB0aGUgY29kZSB1c2luZyBmbGFnICIKKyAgICAgICAgICAgICAgICArICJleGVjdXRlZCBiZWZvcmUgU2V0dGluZ3NQcm92aWRlciBpbml0aWFsaXphdGlvbi4gUGxlYXNlIHVzZSAiCisgICAgICAgICAgICAgICAgKyAiZml4ZWQgcmVhZC1vbmx5IGZsYWcgYnkgYWRkaW5nIGlzX2ZpeGVkX3JlYWRfb25seTogdHJ1ZSBpbiAiCisgICAgICAgICAgICAgICAgKyAiZmxhZyBkZWNsYXJhdGlvbi4iLAorICAgICAgICAgICAgICAgIGUKKyAgICAgICAgICAgICk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIFx7CisgICAgICAgICAgICAvLyBmb3IgaXNvbGF0ZWQgcHJvY2VzcyBjYXNlLCBza2lwIGxvYWRpbmcgZmxhZyB2YWx1ZSBmcm9tIHRoZSBzdG9yYWdlLCB1c2UgdGhlIGRlZmF1bHQKKyAgICAgICAgfSBmaW5hbGx5IFx7CisgICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudCk7CisgICAgICAgIH0KKyAgICAgICAge25hbWVzcGFjZV93aXRoX2ZsYWdzLm5hbWVzcGFjZX1faXNfY2FjaGVkID0gdHJ1ZTsKKyAgICB9Cit7eyBlbmRmb3ItIH19Cit7eyAtZm9yIGZsYWcgaW4gZmxhZ19lbGVtZW50cyB9fQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHtmbGFnLm1ldGhvZF9uYW1lfSgpIFx7CisgICAgICAgIGlmICghe2ZsYWcuZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2V9X2lzX2NhY2hlZCkgXHsKKyAgICAgICAgICAgIGxvYWRfb3ZlcnJpZGVzX3tmbGFnLmRldmljZV9jb25maWdfbmFtZXNwYWNlfSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB7ZmxhZy5tZXRob2RfbmFtZX07CisgICAgfQore3sgZW5kZm9yIH19Cit9Cit7eyAtZW5kaWYtIH19IHsjLSBlbmQgbmV3X2V4cG9ydGVkIG1vZGUgI30KK3t7IC1lbmRpZi0gfX0geyMtIGVuZCBleHBvcnRlZCBtb2RlICN9Cit7eyBlbHNlIH19IHsjLSBlbHNlIGZvciBhbGxvd19pbnN0cnVtZW50YXRpb24gaXMgbm90IGVuYWJsZWQgI30KK3t7IGlmIG5vdCBsaWJyYXJ5X2V4cG9ydGVkLSB9fQorLy8gVE9ETyhiLzMwMzc3MzA1NSk6IFJlbW92ZSB0aGUgYW5ub3RhdGlvbiBhZnRlciBhY2Nlc3MgaXNzdWUgaXMgcmVzb2x2ZWQuCitpbXBvcnQgYW5kcm9pZC5jb21wYXQuYW5ub3RhdGlvbi5VbnN1cHBvcnRlZEFwcFVzYWdlOwore3sgLWVuZGlmIH19CisKK3t7IC1pZiBydW50aW1lX2xvb2t1cF9yZXF1aXJlZCB9fQoraW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuRGV2aWNlQ29uZmlnOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuRGV2aWNlQ29uZmlnLlByb3BlcnRpZXM7Cit7eyAtZW5kaWYgfX0KKy8qKiBAaGlkZSAqLworcHVibGljIGZpbmFsIGNsYXNzIEZlYXR1cmVGbGFnc0ltcGwgaW1wbGVtZW50cyBGZWF0dXJlRmxhZ3MgXHsKK3t7IC1pZiBydW50aW1lX2xvb2t1cF9yZXF1aXJlZCB9fQore3sgLWZvciBuYW1lc3BhY2Vfd2l0aF9mbGFncyBpbiBuYW1lc3BhY2VfZmxhZ3MgfX0KKyAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIHtuYW1lc3BhY2Vfd2l0aF9mbGFncy5uYW1lc3BhY2V9X2lzX2NhY2hlZCA9IGZhbHNlOwore3sgLWVuZGZvci0gfX0KKwore3sgZm9yIGZsYWcgaW4gZmxhZ19lbGVtZW50cyB9fQore3stIGlmIGZsYWcuaXNfcmVhZF93cml0ZSB9fQorICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4ge2ZsYWcubWV0aG9kX25hbWV9ID0ge2ZsYWcuZGVmYXVsdF92YWx1ZX07Cit7eyAtZW5kaWYgfX0KK3t7IC1lbmRmb3IgfX0KK3t7IGZvciBuYW1lc3BhY2Vfd2l0aF9mbGFncyBpbiBuYW1lc3BhY2VfZmxhZ3MgfX0KKyAgICBwcml2YXRlIHZvaWQgbG9hZF9vdmVycmlkZXNfe25hbWVzcGFjZV93aXRoX2ZsYWdzLm5hbWVzcGFjZX0oKSBceworICAgICAgICBmaW5hbCBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgIHRyeSBceworICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gRGV2aWNlQ29uZmlnLmdldFByb3BlcnRpZXMoIntuYW1lc3BhY2Vfd2l0aF9mbGFncy5uYW1lc3BhY2V9Iik7Cit7eyAtZm9yIGZsYWcgaW4gbmFtZXNwYWNlX3dpdGhfZmxhZ3MuZmxhZ3MgfX0KK3t7IC1pZiBmbGFnLmlzX3JlYWRfd3JpdGUgfX0KKyAgICAgICAgICAgIHtmbGFnLm1ldGhvZF9uYW1lfSA9CisgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRCb29sZWFuKEZsYWdzLkZMQUdfe2ZsYWcuZmxhZ19uYW1lX2NvbnN0YW50X3N1ZmZpeH0sIHtmbGFnLmRlZmF1bHRfdmFsdWV9KTsKK3t7IC1lbmRpZiB9fQore3sgLWVuZGZvciB9fQorICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSBceworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkNhbm5vdCByZWFkIHZhbHVlIGZyb20gbmFtZXNwYWNlIHtuYW1lc3BhY2Vfd2l0aF9mbGFncy5uYW1lc3BhY2V9ICIKKyAgICAgICAgICAgICAgICArICJmcm9tIERldmljZUNvbmZpZy4gSXQgY291bGQgYmUgdGhhdCB0aGUgY29kZSB1c2luZyBmbGFnICIKKyAgICAgICAgICAgICAgICArICJleGVjdXRlZCBiZWZvcmUgU2V0dGluZ3NQcm92aWRlciBpbml0aWFsaXphdGlvbi4gUGxlYXNlIHVzZSAiCisgICAgICAgICAgICAgICAgKyAiZml4ZWQgcmVhZC1vbmx5IGZsYWcgYnkgYWRkaW5nIGlzX2ZpeGVkX3JlYWRfb25seTogdHJ1ZSBpbiAiCisgICAgICAgICAgICAgICAgKyAiZmxhZyBkZWNsYXJhdGlvbi4iLAorICAgICAgICAgICAgICAgIGUKKyAgICAgICAgICAgICk7CisgICAgICAgIH0gZmluYWxseSBceworICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnQpOworICAgICAgICB9CisgICAgICAgIHtuYW1lc3BhY2Vfd2l0aF9mbGFncy5uYW1lc3BhY2V9X2lzX2NhY2hlZCA9IHRydWU7Cit9Cit7eyBlbmRmb3ItIH19Cit7eyAtZW5kaWYgfX17Iy0gZW5kIG9mIHJ1bnRpbWVfbG9va3VwX3JlcXVpcmVkICN9Cit7eyAtZm9yIGZsYWcgaW4gZmxhZ19lbGVtZW50cyB9fQorICAgIEBPdmVycmlkZQore3sgLWlmIG5vdCBsaWJyYXJ5X2V4cG9ydGVkIH19CisgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCit7eyAtZW5kaWYgfX0KKyAgICBwdWJsaWMgYm9vbGVhbiB7ZmxhZy5tZXRob2RfbmFtZX0oKSBcewore3sgLWlmIGZsYWcuaXNfcmVhZF93cml0ZSB9fQorICAgICAgICBpZiAoIXtmbGFnLmRldmljZV9jb25maWdfbmFtZXNwYWNlfV9pc19jYWNoZWQpIFx7CisgICAgICAgICAgICBsb2FkX292ZXJyaWRlc197ZmxhZy5kZXZpY2VfY29uZmlnX25hbWVzcGFjZX0oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4ge2ZsYWcubWV0aG9kX25hbWV9Owore3sgLWVsc2UgfX0KKyAgICAgICAgcmV0dXJuIHtmbGFnLmRlZmF1bHRfdmFsdWV9Owore3sgLWVuZGlmIH19CisgICAgfQore3sgZW5kZm9yIH19Cit9Cit7eyBlbmRpZn19IHsjLSBlbmRpZiBmb3IgYWxsb3dfaW5zdHJ1bWVudGF0aW9uICN9Cit7eyBlbHNlIH19IHsjLSBHZW5lcmF0ZSBvbmx5IHN0dWIgaWYgaW4gdGVzdCBtb2RlICN9CisvKiogQGhpZGUgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBGZWF0dXJlRmxhZ3NJbXBsIGltcGxlbWVudHMgRmVhdHVyZUZsYWdzIFx7Cit7eyBmb3IgZmxhZyBpbiBmbGFnX2VsZW1lbnRzIH19CisgICAgQE92ZXJyaWRlCit7eyAtaWYgbm90IGxpYnJhcnlfZXhwb3J0ZWQgfX0KKyAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCit7eyAtZW5kaWYgfX0KKyAgICBwdWJsaWMgYm9vbGVhbiB7ZmxhZy5tZXRob2RfbmFtZX0oKSBceworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAiTWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICB9Cit7eyBlbmRmb3ItIH19Cit9Cit7eyBlbmRpZiB9fQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9GbGFncy5qYXZhLnRlbXBsYXRlIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9GbGFncy5qYXZhLnRlbXBsYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZjcwYjkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZsYWdzLmphdmEudGVtcGxhdGUKQEAgLTAsMCArMSw0MCBAQAorcGFja2FnZSB7cGFja2FnZV9uYW1lfTsKK3t7IGlmIG5vdCBsaWJyYXJ5X2V4cG9ydGVkLSB9fQorLy8gVE9ETyhiLzMwMzc3MzA1NSk6IFJlbW92ZSB0aGUgYW5ub3RhdGlvbiBhZnRlciBhY2Nlc3MgaXNzdWUgaXMgcmVzb2x2ZWQuCitpbXBvcnQgYW5kcm9pZC5jb21wYXQuYW5ub3RhdGlvbi5VbnN1cHBvcnRlZEFwcFVzYWdlOwore3sgLWVuZGlmIH19CisvKiogQGhpZGUgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBGbGFncyBcewore3sgLWZvciBpdGVtIGluIGZsYWdfZWxlbWVudHN9fQorICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfe2l0ZW0uZmxhZ19uYW1lX2NvbnN0YW50X3N1ZmZpeH0gPSAie2l0ZW0uZGV2aWNlX2NvbmZpZ19mbGFnfSI7Cit7ey0gZW5kZm9yIH19Cit7eyAtZm9yIGl0ZW0gaW4gZmxhZ19lbGVtZW50c319Cit7eyAtaWYgbm90IGl0ZW0uaXNfcmVhZF93cml0ZSB9fQore3sgLWlmIGl0ZW0uZGVmYXVsdF92YWx1ZSB9fQorICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFzc3VtZVRydWVGb3JSOAore3sgLWVsc2UgfX0KKyAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5Bc3N1bWVGYWxzZUZvclI4Cit7eyAtZW5kaWYgfX0KK3t7IC1lbmRpZiB9fQore3sgLWlmIG5vdCBsaWJyYXJ5X2V4cG9ydGVkIH19CisgICAgQGNvbS5hbmRyb2lkLmFjb25maWcuYW5ub3RhdGlvbnMuQWNvbmZpZ0ZsYWdBY2Nlc3NvcgorICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCit7eyAtZW5kaWYgfX0KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4ge2l0ZW0ubWV0aG9kX25hbWV9KCkgXHsKKyAgICAgICAgcmV0dXJuIEZFQVRVUkVfRkxBR1Mue2l0ZW0ubWV0aG9kX25hbWV9KCk7CisgICAgfQore3sgLWVuZGZvciB9fQore3sgLWlmIGlzX3Rlc3RfbW9kZSB9fQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGZWF0dXJlRmxhZ3MoRmVhdHVyZUZsYWdzIGZlYXR1cmVGbGFncykgXHsKKyAgICAgICAgRmxhZ3MuRkVBVFVSRV9GTEFHUyA9IGZlYXR1cmVGbGFnczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdW5zZXRGZWF0dXJlRmxhZ3MoKSBceworICAgICAgICBGbGFncy5GRUFUVVJFX0ZMQUdTID0gbnVsbDsKKyAgICB9Cit7eyAtZW5kaWYgfX0KKworICAgIHByaXZhdGUgc3RhdGljIEZlYXR1cmVGbGFncyBGRUFUVVJFX0ZMQUdTe3sgLWlmIG5vdCBpc190ZXN0X21vZGUgfX0gPSBuZXcgRmVhdHVyZUZsYWdzSW1wbCgpe3sgLWVuZGlmLSB9fTsKKworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9jcHBfZXhwb3J0ZWRfaGVhZGVyLnRlbXBsYXRlIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9jcHBfZXhwb3J0ZWRfaGVhZGVyLnRlbXBsYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NDNjOTcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL2NwcF9leHBvcnRlZF9oZWFkZXIudGVtcGxhdGUKQEAgLTAsMCArMSw5MyBAQAorI3ByYWdtYSBvbmNlCisKK3t7IGlmIG5vdCBpc190ZXN0X21vZGUtIH19Cit7eyBpZiBoYXNfZml4ZWRfcmVhZF9vbmx5LSB9fQorI2lmbmRlZiB7cGFja2FnZV9tYWNyb30KKyNkZWZpbmUge3BhY2thZ2VfbWFjcm99KEZMQUcpIHtwYWNrYWdlX21hY3JvfV8jI0ZMQUcKKyNlbmRpZgore3sgZm9yIGl0ZW0gaW4gY2xhc3NfZWxlbWVudHMgfX0KK3t7IC1pZiBpdGVtLmlzX2ZpeGVkX3JlYWRfb25seSB9fQorI2lmbmRlZiB7cGFja2FnZV9tYWNyb31fe2l0ZW0uZmxhZ19tYWNyb30KKyNkZWZpbmUge3BhY2thZ2VfbWFjcm99X3tpdGVtLmZsYWdfbWFjcm99IHtpdGVtLmRlZmF1bHRfdmFsdWV9CisjZW5kaWYKK3t7IC1lbmRpZiB9fQore3sgLWVuZGZvciB9fQore3sgLWVuZGlmIH19Cit7eyAtZW5kaWYgfX0KKworI2lmZGVmIF9fY3BsdXNwbHVzCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSB7Y3BwX25hbWVzcGFjZX0gXHsKKworY2xhc3MgZmxhZ19wcm92aWRlcl9pbnRlcmZhY2UgXHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5mbGFnX3Byb3ZpZGVyX2ludGVyZmFjZSgpID0gZGVmYXVsdDsKKyAgICB7eyAtZm9yIGl0ZW0gaW4gY2xhc3NfZWxlbWVudHN9fQorICAgIHZpcnR1YWwgYm9vbCB7aXRlbS5mbGFnX25hbWV9KCkgPSAwOworCisgICAge3sgLWVuZGZvciB9fQorCisgICAge3sgLWlmIGlzX3Rlc3RfbW9kZSB9fQorICAgIHt7IC1mb3IgaXRlbSBpbiBjbGFzc19lbGVtZW50c319CisgICAgdmlydHVhbCB2b2lkIHtpdGVtLmZsYWdfbmFtZX0oYm9vbCB2YWwpID0gMDsKKyAgICB7eyAtZW5kZm9yIH19CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXRfZmxhZ3MoKSBce30KKyAgICB7eyAtZW5kaWYgfX0KK307CisKK2V4dGVybiBzdGQ6OnVuaXF1ZV9wdHI8ZmxhZ19wcm92aWRlcl9pbnRlcmZhY2U+IHByb3ZpZGVyXzsKKwore3sgZm9yIGl0ZW0gaW4gY2xhc3NfZWxlbWVudHN9fQoraW5saW5lIGJvb2wge2l0ZW0uZmxhZ19uYW1lfSgpIFx7CisgICAge3sgLWlmIGlzX3Rlc3RfbW9kZSB9fQorICAgIHJldHVybiBwcm92aWRlcl8tPntpdGVtLmZsYWdfbmFtZX0oKTsKKyAgICB7eyAtZWxzZSB9fQorICAgIHt7IC1pZiBpdGVtLnJlYWR3cml0ZSB9fQorICAgIHJldHVybiBwcm92aWRlcl8tPntpdGVtLmZsYWdfbmFtZX0oKTsKKyAgICB7eyAtZWxzZSB9fQorICAgIHt7IC1pZiBpdGVtLmlzX2ZpeGVkX3JlYWRfb25seSB9fQorICAgIHJldHVybiB7cGFja2FnZV9tYWNyb31fe2l0ZW0uZmxhZ19tYWNyb307CisgICAge3sgLWVsc2UgfX0KKyAgICByZXR1cm4ge2l0ZW0uZGVmYXVsdF92YWx1ZX07CisgICAge3sgLWVuZGlmIH19CisgICAge3sgLWVuZGlmIH19CisgICAge3sgLWVuZGlmIH19Cit9CisKK3t7IC1pZiBpc190ZXN0X21vZGUgfX0KK2lubGluZSB2b2lkIHtpdGVtLmZsYWdfbmFtZX0oYm9vbCB2YWwpIFx7CisgICAgcHJvdmlkZXJfLT57aXRlbS5mbGFnX25hbWV9KHZhbCk7Cit9Cit7eyAtZW5kaWYgfX0KK3t7IC1lbmRmb3IgfX0KKwore3sgLWlmIGlzX3Rlc3RfbW9kZSB9fQoraW5saW5lIHZvaWQgcmVzZXRfZmxhZ3MoKSBceworICAgIHJldHVybiBwcm92aWRlcl8tPnJlc2V0X2ZsYWdzKCk7Cit9Cit7eyAtZW5kaWYgfX0KKworfQorCitleHRlcm4gIkMiIFx7CisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKwore3sgZm9yIGl0ZW0gaW4gY2xhc3NfZWxlbWVudHMgfX0KK2Jvb2wge2hlYWRlcn1fe2l0ZW0uZmxhZ19uYW1lfSgpOworCit7eyAtaWYgaXNfdGVzdF9tb2RlIH19Cit2b2lkIHNldF97aGVhZGVyfV97aXRlbS5mbGFnX25hbWV9KGJvb2wgdmFsKTsKK3t7IC1lbmRpZiB9fQore3sgLWVuZGZvciB9fQorCit7eyAtaWYgaXNfdGVzdF9tb2RlIH19Cit2b2lkIHtoZWFkZXJ9X3Jlc2V0X2ZsYWdzKCk7Cit7eyAtZW5kaWYgfX0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL2NwcF9zb3VyY2VfZmlsZS50ZW1wbGF0ZSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvY3BwX3NvdXJjZV9maWxlLnRlbXBsYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNGU0MzUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL2NwcF9zb3VyY2VfZmlsZS50ZW1wbGF0ZQpAQCAtMCwwICsxLDI5MyBAQAorI2luY2x1ZGUgIntoZWFkZXJ9LmgiCisKK3t7IGlmIGFsbG93X2luc3RydW1lbnRhdGlvbiB9fQore3sgaWYgcmVhZHdyaXRlLSB9fQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgImFjb25maWdfc3RvcmFnZS9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkuaHBwIgorI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisjZGVmaW5lIExPR19UQUcgImFjb25maWdfY3BwX2NvZGVnZW4iCisjZGVmaW5lIEFMT0dFKC4uLikgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19FUlJPUiwgTE9HX1RBRywgX19WQV9BUkdTX18pCit7eyAtZW5kaWYgfX0KK3t7IGVuZGlmIH19CisKK3t7IGlmIHJlYWR3cml0ZS0gfX0KKyNpbmNsdWRlIDxzZXJ2ZXJfY29uZmlndXJhYmxlX2ZsYWdzL2dldF9mbGFncy5oPgore3sgZW5kaWYgfX0KK3t7IGlmIGlzX3Rlc3RfbW9kZSB9fQorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8c3RyaW5nPgore3sgLWVsc2UtIH19Cit7eyBpZiByZWFkd3JpdGUtIH19CisjaW5jbHVkZSA8dmVjdG9yPgore3sgLWVuZGlmIH19Cit7eyAtZW5kaWYgfX0KKworbmFtZXNwYWNlIHtjcHBfbmFtZXNwYWNlfSBceworCit7eyBpZiBpc190ZXN0X21vZGUgfX0KKyAgICBjbGFzcyBmbGFnX3Byb3ZpZGVyIDogcHVibGljIGZsYWdfcHJvdmlkZXJfaW50ZXJmYWNlIFx7CisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBib29sPiBvdmVycmlkZXNfOworCisgICAge3sgaWYgYWxsb3dfaW5zdHJ1bWVudGF0aW9uLSB9fQorICAgIHt7IGlmIHJlYWR3cml0ZS0gfX0KKyAgICAgICAgdWludDMyX3QgYm9vbGVhbl9zdGFydF9pbmRleF87CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGFjb25maWdfc3RvcmFnZTo6TWFwcGVkU3RvcmFnZUZpbGU+IGZsYWdfdmFsdWVfZmlsZV87CisKKyAgICAgICAgYm9vbCBwYWNrYWdlX2V4aXN0c19pbl9zdG9yYWdlXzsKKyAgICB7eyAtZW5kaWYgfX0KKyAgICB7eyAtZW5kaWYgfX0KKworICAgIHB1YmxpYzoKKyAgICB7eyBpZiBhbGxvd19pbnN0cnVtZW50YXRpb24tIH19CisgICAge3sgaWYgcmVhZHdyaXRlLSB9fQorICAgICAgICBmbGFnX3Byb3ZpZGVyKCkKKyAgICAgICAgICAgIDogb3ZlcnJpZGVzXygpCisgICAgICAgICAgICAsIGJvb2xlYW5fc3RhcnRfaW5kZXhfKCkKKyAgICAgICAgICAgICwgZmxhZ192YWx1ZV9maWxlXyhudWxscHRyKQorICAgICAgICAgICAgLCBwYWNrYWdlX2V4aXN0c19pbl9zdG9yYWdlXyh0cnVlKSBceworCisgICAgICAgICAgICBhdXRvIHBhY2thZ2VfbWFwX2ZpbGUgPSBhY29uZmlnX3N0b3JhZ2U6OmdldF9tYXBwZWRfZmlsZSgKKyAgICAgICAgICAgICAgICAgIntjb250YWluZXJ9IiwKKyAgICAgICAgICAgICAgICAgYWNvbmZpZ19zdG9yYWdlOjpTdG9yYWdlRmlsZVR5cGU6OnBhY2thZ2VfbWFwKTsKKworICAgICAgICAgICAgaWYgKCFwYWNrYWdlX21hcF9maWxlLm9rKCkpIFx7CisgICAgICAgICAgICAgICAgQUxPR0UoImVycm9yOiBmYWlsZWQgdG8gZ2V0IHBhY2thZ2UgbWFwIGZpbGU6ICVzIiwgcGFja2FnZV9tYXBfZmlsZS5lcnJvcigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHBhY2thZ2VfZXhpc3RzX2luX3N0b3JhZ2VfID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdXRvIGNvbnRleHQgPSBhY29uZmlnX3N0b3JhZ2U6OmdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgKKyAgICAgICAgICAgICAgICAqKnBhY2thZ2VfbWFwX2ZpbGUsICJ7cGFja2FnZX0iKTsKKworICAgICAgICAgICAgaWYgKCFjb250ZXh0Lm9rKCkpIFx7CisgICAgICAgICAgICAgICAgQUxPR0UoImVycm9yOiBmYWlsZWQgdG8gZ2V0IHBhY2thZ2UgcmVhZCBjb250ZXh0OiAlcyIsIGNvbnRleHQuZXJyb3IoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBwYWNrYWdlX2V4aXN0c19pbl9zdG9yYWdlXyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCEoY29udGV4dC0+cGFja2FnZV9leGlzdHMpKSBceworICAgICAgICAgICAgICAgIHBhY2thZ2VfZXhpc3RzX2luX3N0b3JhZ2VfID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjYWNoZSBwYWNrYWdlIGJvb2xlYW4gZmxhZyBzdGFydCBpbmRleAorICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleF8gPSBjb250ZXh0LT5ib29sZWFuX3N0YXJ0X2luZGV4OworCisgICAgICAgICAgICAvLyB1bm1hcCBwYWNrYWdlIG1hcCBmaWxlIGFuZCBmcmVlIG1lbW9yeQorICAgICAgICAgICAgZGVsZXRlICpwYWNrYWdlX21hcF9maWxlOworCisgICAgICAgICAgICBhdXRvIGZsYWdfdmFsdWVfZmlsZSA9IGFjb25maWdfc3RvcmFnZTo6Z2V0X21hcHBlZF9maWxlKAorICAgICAgICAgICAgICAgICJ7Y29udGFpbmVyfSIsCisgICAgICAgICAgICAgICAgYWNvbmZpZ19zdG9yYWdlOjpTdG9yYWdlRmlsZVR5cGU6OmZsYWdfdmFsKTsKKyAgICAgICAgICAgIGlmICghZmxhZ192YWx1ZV9maWxlLm9rKCkpIFx7CisgICAgICAgICAgICAgICAgQUxPR0UoImVycm9yOiBmYWlsZWQgdG8gZ2V0IGZsYWcgdmFsdWUgZmlsZTogJXMiLCBmbGFnX3ZhbHVlX2ZpbGUuZXJyb3IoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBwYWNrYWdlX2V4aXN0c19pbl9zdG9yYWdlXyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY2FjaGUgZmxhZyB2YWx1ZSBmaWxlCisgICAgICAgICAgICBmbGFnX3ZhbHVlX2ZpbGVfID0gc3RkOjp1bmlxdWVfcHRyPGFjb25maWdfc3RvcmFnZTo6TWFwcGVkU3RvcmFnZUZpbGU+KAorICAgICAgICAgICAgICAgICpmbGFnX3ZhbHVlX2ZpbGUpOworCisgICAgICAgIH0KKyAgICB7eyAtZWxzZSB9fQorICAgICAgICBmbGFnX3Byb3ZpZGVyKCkKKyAgICAgICAgICAgIDogb3ZlcnJpZGVzXygpCisgICAgICAgIFx7fQorICAgIHt7IC1lbmRpZiB9fQorICAgIHt7IC1lbHNlIH19CisgICAgICAgIGZsYWdfcHJvdmlkZXIoKQorICAgICAgICAgICAgOiBvdmVycmlkZXNfKCkKKyAgICAgICAgXHt9CisgICAge3sgLWVuZGlmIH19CisKKyAgICB7eyBmb3IgaXRlbSBpbiBjbGFzc19lbGVtZW50cyB9fQorICAgICAgICB2aXJ0dWFsIGJvb2wge2l0ZW0uZmxhZ19uYW1lfSgpIG92ZXJyaWRlIFx7CisgICAgICAgICAgICBhdXRvIGl0ID0gb3ZlcnJpZGVzXy5maW5kKCJ7aXRlbS5mbGFnX25hbWV9Iik7CisgICAgICAgICAgICBpZiAoaXQgIT0gb3ZlcnJpZGVzXy5lbmQoKSkgXHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgICAgIH0gZWxzZSBceworICAgICAgICAgICAgICAgIHt7IGlmIGl0ZW0ucmVhZHdyaXRlLSB9fQorICAgICAgICAgICAgICAgIHt7IGlmIGFsbG93X2luc3RydW1lbnRhdGlvbi0gfX0KKyAgICAgICAgICAgICAgICBpZiAoIXBhY2thZ2VfZXhpc3RzX2luX3N0b3JhZ2VfKSBceworICAgICAgICAgICAgICAgICAgICByZXR1cm4ge2l0ZW0uZGVmYXVsdF92YWx1ZX07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXV0byB2YWx1ZSA9IGFjb25maWdfc3RvcmFnZTo6Z2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgKmZsYWdfdmFsdWVfZmlsZV8sCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW5fc3RhcnRfaW5kZXhfICsge2l0ZW0uZmxhZ19vZmZzZXR9KTsKKworICAgICAgICAgICAgICAgIGlmICghdmFsdWUub2soKSkgXHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnIHZhbHVlOiAlcyIsIHZhbHVlLmVycm9yKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB7aXRlbS5kZWZhdWx0X3ZhbHVlfTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgXHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICp2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAge3sgLWVsc2UgfX0KKyAgICAgICAgICAgICAgICByZXR1cm4gc2VydmVyX2NvbmZpZ3VyYWJsZV9mbGFnczo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKKyAgICAgICAgICAgICAgICAgICJhY29uZmlnX2ZsYWdzLntpdGVtLmRldmljZV9jb25maWdfbmFtZXNwYWNlfSIsCisgICAgICAgICAgICAgICAgICAie2l0ZW0uZGV2aWNlX2NvbmZpZ19mbGFnfSIsCisgICAgICAgICAgICAgICAgICAie2l0ZW0uZGVmYXVsdF92YWx1ZX0iKSA9PSAidHJ1ZSI7CisgICAgICAgICAgICAgICAge3sgLWVuZGlmIH19CisgICAgICAgICAgICAgICAge3sgLWVsc2UgfX0KKyAgICAgICAgICAgICAgICByZXR1cm4ge2l0ZW0uZGVmYXVsdF92YWx1ZX07CisgICAgICAgICAgICAgICAge3sgLWVuZGlmIH19CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQge2l0ZW0uZmxhZ19uYW1lfShib29sIHZhbCkgb3ZlcnJpZGUgXHsKKyAgICAgICAgICAgIG92ZXJyaWRlc19bIntpdGVtLmZsYWdfbmFtZX0iXSA9IHZhbDsKKyAgICAgICAgfQorICAgIHt7IGVuZGZvciB9fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCByZXNldF9mbGFncygpIG92ZXJyaWRlIFx7CisgICAgICAgICAgICBvdmVycmlkZXNfLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9OworCit7eyAtZWxzZS0gfX0KKworICAgIGNsYXNzIGZsYWdfcHJvdmlkZXIgOiBwdWJsaWMgZmxhZ19wcm92aWRlcl9pbnRlcmZhY2UgXHsKKyAgICBwdWJsaWM6CisKKyAgICAgICAge3sgaWYgcmVhZHdyaXRlLSB9fQorICAgICAgICB7eyBpZiBhbGxvd19pbnN0cnVtZW50YXRpb24tIH19CisgICAgICAgIGZsYWdfcHJvdmlkZXIoKQorICAgICAgICAgICAgOiBjYWNoZV8oe3JlYWR3cml0ZV9jb3VudH0sIC0xKQorICAgICAgICAgICAgLCBib29sZWFuX3N0YXJ0X2luZGV4XygpCisgICAgICAgICAgICAsIGZsYWdfdmFsdWVfZmlsZV8obnVsbHB0cikKKyAgICAgICAgICAgICwgcGFja2FnZV9leGlzdHNfaW5fc3RvcmFnZV8odHJ1ZSkgXHsKKworICAgICAgICAgICAgYXV0byBwYWNrYWdlX21hcF9maWxlID0gYWNvbmZpZ19zdG9yYWdlOjpnZXRfbWFwcGVkX2ZpbGUoCisgICAgICAgICAgICAgICAgICJ7Y29udGFpbmVyfSIsCisgICAgICAgICAgICAgICAgIGFjb25maWdfc3RvcmFnZTo6U3RvcmFnZUZpbGVUeXBlOjpwYWNrYWdlX21hcCk7CisgICAgICAgICAgICBpZiAoIXBhY2thZ2VfbWFwX2ZpbGUub2soKSkgXHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZXJyb3I6IGZhaWxlZCB0byBnZXQgcGFja2FnZSBtYXAgZmlsZTogJXMiLCBwYWNrYWdlX21hcF9maWxlLmVycm9yKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcGFja2FnZV9leGlzdHNfaW5fc3RvcmFnZV8gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF1dG8gY29udGV4dCA9IGFjb25maWdfc3RvcmFnZTo6Z2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KAorICAgICAgICAgICAgICAgICoqcGFja2FnZV9tYXBfZmlsZSwgIntwYWNrYWdlfSIpOworICAgICAgICAgICAgaWYgKCFjb250ZXh0Lm9rKCkpIFx7CisgICAgICAgICAgICAgICAgQUxPR0UoImVycm9yOiBmYWlsZWQgdG8gZ2V0IHBhY2thZ2UgcmVhZCBjb250ZXh0OiAlcyIsIGNvbnRleHQuZXJyb3IoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBwYWNrYWdlX2V4aXN0c19pbl9zdG9yYWdlXyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCEoY29udGV4dC0+cGFja2FnZV9leGlzdHMpKSBceworICAgICAgICAgICAgICAgIHBhY2thZ2VfZXhpc3RzX2luX3N0b3JhZ2VfID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjYWNoZSBwYWNrYWdlIGJvb2xlYW4gZmxhZyBzdGFydCBpbmRleAorICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleF8gPSBjb250ZXh0LT5ib29sZWFuX3N0YXJ0X2luZGV4OworCisgICAgICAgICAgICAvLyB1bm1hcCBwYWNrYWdlIG1hcCBmaWxlIGFuZCBmcmVlIG1lbW9yeQorICAgICAgICAgICAgZGVsZXRlICpwYWNrYWdlX21hcF9maWxlOworCisgICAgICAgICAgICBhdXRvIGZsYWdfdmFsdWVfZmlsZSA9IGFjb25maWdfc3RvcmFnZTo6Z2V0X21hcHBlZF9maWxlKAorICAgICAgICAgICAgICAgICJ7Y29udGFpbmVyfSIsCisgICAgICAgICAgICAgICAgYWNvbmZpZ19zdG9yYWdlOjpTdG9yYWdlRmlsZVR5cGU6OmZsYWdfdmFsKTsKKyAgICAgICAgICAgIGlmICghZmxhZ192YWx1ZV9maWxlLm9rKCkpIFx7CisgICAgICAgICAgICAgICAgQUxPR0UoImVycm9yOiBmYWlsZWQgdG8gZ2V0IGZsYWcgdmFsdWUgZmlsZTogJXMiLCBmbGFnX3ZhbHVlX2ZpbGUuZXJyb3IoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBwYWNrYWdlX2V4aXN0c19pbl9zdG9yYWdlXyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY2FjaGUgZmxhZyB2YWx1ZSBmaWxlCisgICAgICAgICAgICBmbGFnX3ZhbHVlX2ZpbGVfID0gc3RkOjp1bmlxdWVfcHRyPGFjb25maWdfc3RvcmFnZTo6TWFwcGVkU3RvcmFnZUZpbGU+KAorICAgICAgICAgICAgICAgICpmbGFnX3ZhbHVlX2ZpbGUpOworCisgICAgICAgIH0KKyAgICAgICAge3sgLWVuZGlmIH19CisgICAgICAgIHt7IC1lbmRpZiB9fQorCisgICAgICAgIHt7IC1mb3IgaXRlbSBpbiBjbGFzc19lbGVtZW50cyB9fQorICAgICAgICB2aXJ0dWFsIGJvb2wge2l0ZW0uZmxhZ19uYW1lfSgpIG92ZXJyaWRlIFx7CisgICAgICAgICAgICB7eyAtaWYgaXRlbS5yZWFkd3JpdGUgfX0KKyAgICAgICAgICAgIGlmIChjYWNoZV9be2l0ZW0ucmVhZHdyaXRlX2lkeH1dID09IC0xKSBceworICAgICAgICAgICAge3sgaWYgYWxsb3dfaW5zdHJ1bWVudGF0aW9uLSB9fQorICAgICAgICAgICAgICAgIGlmICghcGFja2FnZV9leGlzdHNfaW5fc3RvcmFnZV8pIFx7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB7aXRlbS5kZWZhdWx0X3ZhbHVlfTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhdXRvIHZhbHVlID0gYWNvbmZpZ19zdG9yYWdlOjpnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKAorICAgICAgICAgICAgICAgICAgICAqZmxhZ192YWx1ZV9maWxlXywKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleF8gKyB7aXRlbS5mbGFnX29mZnNldH0pOworCisgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZS5vaygpKSBceworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgdmFsdWU6ICVzIiwgdmFsdWUuZXJyb3IoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtpdGVtLmRlZmF1bHRfdmFsdWV9OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhY2hlX1t7aXRlbS5yZWFkd3JpdGVfaWR4fV0gPSAqdmFsdWU7CisgICAgICAgICAgICB7eyAtZWxzZS0gfX0KKyAgICAgICAgICAgICAgICBjYWNoZV9be2l0ZW0ucmVhZHdyaXRlX2lkeH1dID0gc2VydmVyX2NvbmZpZ3VyYWJsZV9mbGFnczo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKKyAgICAgICAgICAgICAgICAgICAgImFjb25maWdfZmxhZ3Mue2l0ZW0uZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2V9IiwKKyAgICAgICAgICAgICAgICAgICAgIntpdGVtLmRldmljZV9jb25maWdfZmxhZ30iLAorICAgICAgICAgICAgICAgICAgICAie2l0ZW0uZGVmYXVsdF92YWx1ZX0iKSA9PSAidHJ1ZSI7CisgICAgICAgICAgICB7eyAtZW5kaWYgfX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjYWNoZV9be2l0ZW0ucmVhZHdyaXRlX2lkeH1dOworICAgICAgICAgICAge3sgLWVsc2UgfX0KKyAgICAgICAgICAgIHt7IC1pZiBpdGVtLmlzX2ZpeGVkX3JlYWRfb25seSB9fQorICAgICAgICAgICAgcmV0dXJuIHtwYWNrYWdlX21hY3JvfV97aXRlbS5mbGFnX21hY3JvfTsKKyAgICAgICAgICAgIHt7IC1lbHNlIH19CisgICAgICAgICAgICByZXR1cm4ge2l0ZW0uZGVmYXVsdF92YWx1ZX07CisgICAgICAgICAgICB7eyAtZW5kaWYgfX0KKyAgICAgICAgICAgIHt7IC1lbmRpZiB9fQorICAgICAgICB9CisgICAgICAgIHt7IC1lbmRmb3IgfX0KKworICAgIHt7IGlmIHJlYWR3cml0ZS0gfX0KKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ4X3Q+IGNhY2hlXyA9IHN0ZDo6dmVjdG9yPGludDhfdD4oe3JlYWR3cml0ZV9jb3VudH0sIC0xKTsKKyAgICB7eyBpZiBhbGxvd19pbnN0cnVtZW50YXRpb24tIH19CisgICAgICAgIHVpbnQzMl90IGJvb2xlYW5fc3RhcnRfaW5kZXhfOworCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhY29uZmlnX3N0b3JhZ2U6Ok1hcHBlZFN0b3JhZ2VGaWxlPiBmbGFnX3ZhbHVlX2ZpbGVfOworCisgICAgICAgIGJvb2wgcGFja2FnZV9leGlzdHNfaW5fc3RvcmFnZV87CisgICAge3sgLWVuZGlmIH19CisgICAge3sgLWVuZGlmIH19CisKKyAgICB9OworCit7eyAtZW5kaWYgfX0KKworc3RkOjp1bmlxdWVfcHRyPGZsYWdfcHJvdmlkZXJfaW50ZXJmYWNlPiBwcm92aWRlcl8gPQorICAgIHN0ZDo6bWFrZV91bmlxdWU8ZmxhZ19wcm92aWRlcj4oKTsKK30KKwore3sgZm9yIGl0ZW0gaW4gY2xhc3NfZWxlbWVudHMgfX0KK2Jvb2wge2hlYWRlcn1fe2l0ZW0uZmxhZ19uYW1lfSgpIFx7CisgICAge3sgLWlmIGlzX3Rlc3RfbW9kZSB9fQorICAgIHJldHVybiB7Y3BwX25hbWVzcGFjZX06OntpdGVtLmZsYWdfbmFtZX0oKTsKKyAgICB7eyAtZWxzZSB9fQorICAgIHt7IC1pZiBpdGVtLnJlYWR3cml0ZSB9fQorICAgIHJldHVybiB7Y3BwX25hbWVzcGFjZX06OntpdGVtLmZsYWdfbmFtZX0oKTsKKyAgICB7eyAtZWxzZSB9fQorICAgIHt7IC1pZiBpdGVtLmlzX2ZpeGVkX3JlYWRfb25seSB9fQorICAgIHJldHVybiB7cGFja2FnZV9tYWNyb31fe2l0ZW0uZmxhZ19tYWNyb307CisgICAge3sgLWVsc2UgfX0KKyAgICByZXR1cm4ge2l0ZW0uZGVmYXVsdF92YWx1ZX07CisgICAge3sgLWVuZGlmIH19CisgICAge3sgLWVuZGlmIH19CisgICAge3sgLWVuZGlmIH19Cit9CisKK3t7IC1pZiBpc190ZXN0X21vZGUgfX0KK3ZvaWQgc2V0X3toZWFkZXJ9X3tpdGVtLmZsYWdfbmFtZX0oYm9vbCB2YWwpIFx7CisgICAge2NwcF9uYW1lc3BhY2V9Ojp7aXRlbS5mbGFnX25hbWV9KHZhbCk7Cit9Cit7eyAtZW5kaWYgfX0KK3t7IGVuZGZvciB9fQorCit7eyAtaWYgaXNfdGVzdF9tb2RlIH19Cit2b2lkIHtoZWFkZXJ9X3Jlc2V0X2ZsYWdzKCkgXHsKKyAgICAge2NwcF9uYW1lc3BhY2V9OjpyZXNldF9mbGFncygpOworfQore3sgLWVuZGlmIH19CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL3J1c3QudGVtcGxhdGUgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL3J1c3QudGVtcGxhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTllMTAzMgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvcnVzdC50ZW1wbGF0ZQpAQCAtMCwwICsxLDEwNiBAQAorLy8hIGNvZGVnZW5lcmF0ZWQgcnVzdCBmbGFnIGxpYgordXNlIGFjb25maWdfc3RvcmFnZV9yZWFkX2FwaTo6XHtNbWFwLCBBY29uZmlnU3RvcmFnZUVycm9yLCBTdG9yYWdlRmlsZVR5cGUsIFBhY2thZ2VSZWFkQ29udGV4dCwgZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUsIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUsIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dH07Cit1c2Ugc3RkOjpwYXRoOjpQYXRoOwordXNlIHN0ZDo6aW86OldyaXRlOwordXNlIHN0ZDo6c3luYzo6TGF6eUxvY2s7Cit1c2UgbG9nOjpce2xvZywgTGV2ZWxGaWx0ZXIsIExldmVsfTsKKworLy8vIGZsYWcgcHJvdmlkZXIKK3B1YiBzdHJ1Y3QgRmxhZ1Byb3ZpZGVyOworCit7eyBpZiBoYXNfcmVhZHdyaXRlLSB9fQore3sgaWYgYWxsb3dfaW5zdHJ1bWVudGF0aW9uIH19CitzdGF0aWMgUEFDS0FHRV9PRkZTRVQ6IExhenlMb2NrPFJlc3VsdDxPcHRpb248dTMyPiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4+ID0gTGF6eUxvY2s6Om5ldyh8fCB1bnNhZmUgXHsKKyAgICBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSgie2NvbnRhaW5lcn0iLCBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXApCisgICAgLmFuZF90aGVuKHxwYWNrYWdlX21hcHwgZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX21hcCwgIntwYWNrYWdlfSIpKQorICAgIC5tYXAofGNvbnRleHR8IGNvbnRleHQubWFwKHxjfCBjLmJvb2xlYW5fc3RhcnRfaW5kZXgpKQorfSk7CisKK3N0YXRpYyBGTEFHX1ZBTF9NQVA6IExhenlMb2NrPFJlc3VsdDxNbWFwLCBBY29uZmlnU3RvcmFnZUVycm9yPj4gPSBMYXp5TG9jazo6bmV3KHx8IHVuc2FmZSBceworICAgIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJ7Y29udGFpbmVyfSIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCkKK30pOwore3sgLWVuZGlmIH19Cit7eyAtZm9yIGZsYWcgaW4gdGVtcGxhdGVfZmxhZ3MgfX0KKwore3sgLWlmIGZsYWcucmVhZHdyaXRlIH19CisvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3Ige2ZsYWcubmFtZX0KK3t7IGlmIGFsbG93X2luc3RydW1lbnRhdGlvbiB9fQorc3RhdGljIENBQ0hFRF97ZmxhZy5uYW1lfTogTGF6eUxvY2s8Ym9vbD4gPSBMYXp5TG9jazo6bmV3KHx8IFx7CisKKyAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBTdWJzZXF1ZW50IGNhbGxzIGFmdGVyIHRoZSBmaXJzdCBhcmUgbm9vcHMuCisgICAgbG9nZ2VyOjppbml0KAorICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCisgICAgICAgICAgICAud2l0aF90YWdfb25fZGV2aWNlKCJhY29uZmlnX3J1c3RfY29kZWdlbiIpCisgICAgICAgICAgICAud2l0aF9tYXhfbGV2ZWwoTGV2ZWxGaWx0ZXI6OkluZm8pKTsKKworICAgIGxldCBmbGFnX3ZhbHVlX3Jlc3VsdCA9IEZMQUdfVkFMX01BUAorICAgICAgICAuYXNfcmVmKCkKKyAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBmbGFnIHZhbCBtYXA6IFx7ZXJyfSIpKQorICAgICAgICAuYW5kX3RoZW4ofGZsYWdfdmFsX21hcHwgXHsKKyAgICAgICAgICAgIFBBQ0tBR0VfT0ZGU0VUCisgICAgICAgICAgICAgICAgLmFzX3JlZigpCisgICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBwYWNrYWdlIHJlYWQgb2Zmc2V0OiBce2Vycn0iKSkKKyAgICAgICAgICAgICAgICAuYW5kX3RoZW4ofHBhY2thZ2Vfb2Zmc2V0fCBceworICAgICAgICAgICAgICAgICAgICBtYXRjaCBwYWNrYWdlX29mZnNldCBceworICAgICAgICAgICAgICAgICAgICAgICAgU29tZShvZmZzZXQpID0+IFx7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgmZmxhZ192YWxfbWFwLCBvZmZzZXQgKyB7ZmxhZy5mbGFnX29mZnNldH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZzogXHtlcnJ9IikpCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiBceworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAibm8gY29udGV4dCBmb3VuZCBmb3IgcGFja2FnZSB7cGFja2FnZX0iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnIoZm9ybWF0ISgiZmFpbGVkIHRvIGZsYWcgcGFja2FnZSB7cGFja2FnZX0iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICB9KTsKKworICAgIG1hdGNoIGZsYWdfdmFsdWVfcmVzdWx0IFx7CisgICAgICAgIE9rKGZsYWdfdmFsdWUpID0+IFx7CisgICAgICAgICAgICByZXR1cm4gZmxhZ192YWx1ZTsKKyAgICAgICAgfSwKKyAgICAgICAgRXJyKGVycikgPT4gXHsKKyAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiYWNvbmZpZ19ydXN0X2NvZGVnZW46IGVycm9yOiBce2Vycn0iKTsKKyAgICAgICAgICAgIHJldHVybiB7ZmxhZy5kZWZhdWx0X3ZhbHVlfTsKKyAgICAgICAgfQorICAgIH0KKworfSk7Cit7eyBlbHNlIH19CitzdGF0aWMgQ0FDSEVEX3tmbGFnLm5hbWV9OiBMYXp5TG9jazxib29sPiA9IExhenlMb2NrOjpuZXcofHwgZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKKyAgICAiYWNvbmZpZ19mbGFncy57ZmxhZy5kZXZpY2VfY29uZmlnX25hbWVzcGFjZX0iLAorICAgICJ7ZmxhZy5kZXZpY2VfY29uZmlnX2ZsYWd9IiwKKyAgICAie2ZsYWcuZGVmYXVsdF92YWx1ZX0iKSA9PSAidHJ1ZSIpOwore3sgZW5kaWYgfX0KK3t7IC1lbmRpZiB9fQore3sgLWVuZGZvciB9fQore3sgLWVuZGlmIH19CisKK2ltcGwgRmxhZ1Byb3ZpZGVyIFx7CisKK3t7IGZvciBmbGFnIGluIHRlbXBsYXRlX2ZsYWdzIH19CisgICAgLy8vIHF1ZXJ5IGZsYWcge2ZsYWcubmFtZX0KKyAgICBwdWIgZm4ge2ZsYWcubmFtZX0oJnNlbGYpIC0+IGJvb2wgXHsKKyAgICAgICAge3sgLWlmIGZsYWcucmVhZHdyaXRlIH19CisgICAgICAgICpDQUNIRURfe2ZsYWcubmFtZX0KKyAgICAgICAge3sgLWVsc2UgfX0KKyAgICAgICAge2ZsYWcuZGVmYXVsdF92YWx1ZX0KKyAgICAgICAge3sgLWVuZGlmIH19CisgICAgfQore3sgZW5kZm9yIH19CisKK30KKworLy8vIGZsYWcgcHJvdmlkZXIKK3B1YiBzdGF0aWMgUFJPVklERVI6IEZsYWdQcm92aWRlciA9IEZsYWdQcm92aWRlcjsKKwore3sgZm9yIGZsYWcgaW4gdGVtcGxhdGVfZmxhZ3MgfX0KKy8vLyBxdWVyeSBmbGFnIHtmbGFnLm5hbWV9CisjW2lubGluZShhbHdheXMpXQorcHViIGZuIHtmbGFnLm5hbWV9KCkgLT4gYm9vbCBcewore3sgLWlmIGZsYWcucmVhZHdyaXRlIH19CisgICAgUFJPVklERVIue2ZsYWcubmFtZX0oKQore3sgLWVsc2UgfX0KKyAgICB7ZmxhZy5kZWZhdWx0X3ZhbHVlfQore3sgLWVuZGlmIH19Cit9Cit7eyBlbmRmb3IgfX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvcnVzdF90ZXN0LnRlbXBsYXRlIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9ydXN0X3Rlc3QudGVtcGxhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAxZjQwYQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvcnVzdF90ZXN0LnRlbXBsYXRlCkBAIC0wLDAgKzEsNjEgQEAKKy8vISBjb2RlZ2VuZXJhdGVkIHJ1c3QgZmxhZyBsaWIKKwordXNlIHN0ZDo6Y29sbGVjdGlvbnM6OkJUcmVlTWFwOwordXNlIHN0ZDo6c3luYzo6TXV0ZXg7CisKKy8vLyBmbGFnIHByb3ZpZGVyCitwdWIgc3RydWN0IEZsYWdQcm92aWRlciBceworICAgIG92ZXJyaWRlczogQlRyZWVNYXA8JidzdGF0aWMgc3RyLCBib29sPiwKK30KKworaW1wbCBGbGFnUHJvdmlkZXIgXHsKK3t7IGZvciBmbGFnIGluIHRlbXBsYXRlX2ZsYWdzIH19CisgICAgLy8vIHF1ZXJ5IGZsYWcge2ZsYWcubmFtZX0KKyAgICBwdWIgZm4ge2ZsYWcubmFtZX0oJnNlbGYpIC0+IGJvb2wgXHsKKyAgICAgICAgc2VsZi5vdmVycmlkZXMuZ2V0KCJ7ZmxhZy5uYW1lfSIpLmNvcGllZCgpLnVud3JhcF9vcigKKyAgICAgICAge3sgaWYgZmxhZy5yZWFkd3JpdGUgLX19CisgICAgICAgICAgZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKKyAgICAgICAgICAgICJhY29uZmlnX2ZsYWdzLntmbGFnLmRldmljZV9jb25maWdfbmFtZXNwYWNlfSIsCisgICAgICAgICAgICAie2ZsYWcuZGV2aWNlX2NvbmZpZ19mbGFnfSIsCisgICAgICAgICAgICAie2ZsYWcuZGVmYXVsdF92YWx1ZX0iKSA9PSAidHJ1ZSIKKyAgICAgICAge3sgLWVsc2UtIH19CisgICAgICAgICAgIHtmbGFnLmRlZmF1bHRfdmFsdWV9CisgICAgICAgIHt7IC1lbmRpZiB9fQorICAgICAgICApCisgICAgfQorCisgICAgLy8vIHNldCBmbGFnIHtmbGFnLm5hbWV9CisgICAgcHViIGZuIHNldF97ZmxhZy5uYW1lfSgmbXV0IHNlbGYsIHZhbDogYm9vbCkgXHsKKyAgICAgICAgc2VsZi5vdmVycmlkZXMuaW5zZXJ0KCJ7ZmxhZy5uYW1lfSIsIHZhbCk7CisgICAgfQore3sgZW5kZm9yIH19CisKKyAgICAvLy8gY2xlYXIgYWxsIGZsYWcgb3ZlcnJpZGVzCisgICAgcHViIGZuIHJlc2V0X2ZsYWdzKCZtdXQgc2VsZikgXHsKKyAgICAgICAgc2VsZi5vdmVycmlkZXMuY2xlYXIoKTsKKyAgICB9Cit9CisKKy8vLyBmbGFnIHByb3ZpZGVyCitwdWIgc3RhdGljIFBST1ZJREVSOiBNdXRleDxGbGFnUHJvdmlkZXI+ID0gTXV0ZXg6Om5ldygKKyAgICBGbGFnUHJvdmlkZXIgXHtvdmVycmlkZXM6IEJUcmVlTWFwOjpuZXcoKX0KKyk7CisKK3t7IGZvciBmbGFnIGluIHRlbXBsYXRlX2ZsYWdzIH19CisvLy8gcXVlcnkgZmxhZyB7ZmxhZy5uYW1lfQorI1tpbmxpbmUoYWx3YXlzKV0KK3B1YiBmbiB7ZmxhZy5uYW1lfSgpIC0+IGJvb2wgXHsKKyAgICBQUk9WSURFUi5sb2NrKCkudW53cmFwKCkue2ZsYWcubmFtZX0oKQorfQorCisvLy8gc2V0IGZsYWcge2ZsYWcubmFtZX0KKyNbaW5saW5lKGFsd2F5cyldCitwdWIgZm4gc2V0X3tmbGFnLm5hbWV9KHZhbDogYm9vbCkgXHsKKyAgICBQUk9WSURFUi5sb2NrKCkudW53cmFwKCkuc2V0X3tmbGFnLm5hbWV9KHZhbCk7Cit9Cit7eyBlbmRmb3IgfX0KKworLy8vIGNsZWFyIGFsbCBmbGFnIG92ZXJyaWRlCitwdWIgZm4gcmVzZXRfZmxhZ3MoKSBceworICAgIFBST1ZJREVSLmxvY2soKS51bndyYXAoKS5yZXNldF9mbGFncygpCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvQWNvbmZpZ0hvc3RUZXN0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvQWNvbmZpZ0hvc3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE3MWI3ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9BY29uZmlnSG9zdFRlc3QuamF2YQpAQCAtMCwwICsxLDg4IEBACitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhyb3dzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OworCisKK2ltcG9ydCBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuRmFrZUZlYXR1cmVGbGFnc0ltcGw7CitpbXBvcnQgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LkZlYXR1cmVGbGFnczsKK2ltcG9ydCBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuRmVhdHVyZUZsYWdzSW1wbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuRmxhZ3M7CisKK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBmaW5hbCBjbGFzcyBBY29uZmlnSG9zdFRlc3QgeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRocm93c0V4Y2VwdGlvbklmRmxhZ05vdFNldCgpIHsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBGbGFncy5kaXNhYmxlZFJvKCkpOworICAgICAgICBGYWtlRmVhdHVyZUZsYWdzSW1wbCBmZWF0dXJlRmxhZ3MgPSBuZXcgRmFrZUZlYXR1cmVGbGFnc0ltcGwoKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gZmVhdHVyZUZsYWdzLmRpc2FibGVkUm8oKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0RmxhZ0luRmFrZUZlYXR1cmVGbGFnc0ltcGwoKSB7CisgICAgICAgIEZha2VGZWF0dXJlRmxhZ3NJbXBsIGZlYXR1cmVGbGFncyA9IG5ldyBGYWtlRmVhdHVyZUZsYWdzSW1wbCgpOworICAgICAgICBmZWF0dXJlRmxhZ3Muc2V0RmxhZyhGbGFncy5GTEFHX0VOQUJMRURfUlcsIHRydWUpOworICAgICAgICBhc3NlcnRUcnVlKGZlYXR1cmVGbGFncy5lbmFibGVkUncoKSk7CisgICAgICAgIGZlYXR1cmVGbGFncy5zZXRGbGFnKEZsYWdzLkZMQUdfRU5BQkxFRF9SVywgZmFsc2UpOworICAgICAgICBhc3NlcnRGYWxzZShmZWF0dXJlRmxhZ3MuZW5hYmxlZFJ3KCkpOworCisgICAgICAgIC8vU2V0IEZsYWdzCisgICAgICAgIGFzc2VydFRocm93cyhOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gRmxhZ3MuZW5hYmxlZFJ3KCkpOworICAgICAgICBGbGFncy5zZXRGZWF0dXJlRmxhZ3MoZmVhdHVyZUZsYWdzKTsKKyAgICAgICAgZmVhdHVyZUZsYWdzLnNldEZsYWcoRmxhZ3MuRkxBR19FTkFCTEVEX1JXLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShGbGFncy5lbmFibGVkUncoKSk7CisgICAgICAgIEZsYWdzLnVuc2V0RmVhdHVyZUZsYWdzKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0RmxhZ1dpdGhSYW5kb21OYW1lKCkgeworICAgICAgICBGYWtlRmVhdHVyZUZsYWdzSW1wbCBmZWF0dXJlRmxhZ3MgPSBuZXcgRmFrZUZlYXR1cmVGbGFnc0ltcGwoKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICgpIC0+IGZlYXR1cmVGbGFncy5zZXRGbGFnKCJSYW5kb21lX25hbWUiLCB0cnVlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzZXRGbGFnc0luRmFrZUZlYXR1cmVGbGFnc0ltcGwoKSB7CisgICAgICAgIEZha2VGZWF0dXJlRmxhZ3NJbXBsIGZlYXR1cmVGbGFncyA9IG5ldyBGYWtlRmVhdHVyZUZsYWdzSW1wbCgpOworICAgICAgICBmZWF0dXJlRmxhZ3Muc2V0RmxhZyhGbGFncy5GTEFHX0VOQUJMRURfUk8sIHRydWUpOworICAgICAgICBhc3NlcnRUcnVlKGZlYXR1cmVGbGFncy5lbmFibGVkUm8oKSk7CisgICAgICAgIGZlYXR1cmVGbGFncy5yZXNldEFsbCgpOworICAgICAgICBhc3NlcnRUaHJvd3MoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBmZWF0dXJlRmxhZ3MuZW5hYmxlZFJvKCkpOworCisgICAgICAgIC8vIFNldCB2YWx1ZSBhZnRlciByZXNldAorICAgICAgICBmZWF0dXJlRmxhZ3Muc2V0RmxhZyhGbGFncy5GTEFHX0VOQUJMRURfUk8sIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZmVhdHVyZUZsYWdzLmVuYWJsZWRSbygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGbGFnc1NldEZlYXR1cmVGbGFncygpIHsKKyAgICAgICAgRmFrZUZlYXR1cmVGbGFnc0ltcGwgZmVhdHVyZUZsYWdzID0gbmV3IEZha2VGZWF0dXJlRmxhZ3NJbXBsKCk7CisgICAgICAgIGZlYXR1cmVGbGFncy5zZXRGbGFnKEZsYWdzLkZMQUdfRU5BQkxFRF9SVywgdHJ1ZSk7CisgICAgICAgIGFzc2VydFRocm93cyhOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gRmxhZ3MuZW5hYmxlZFJ3KCkpOworICAgICAgICBGbGFncy5zZXRGZWF0dXJlRmxhZ3MoZmVhdHVyZUZsYWdzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShGbGFncy5lbmFibGVkUncoKSk7CisgICAgICAgIEZsYWdzLnVuc2V0RmVhdHVyZUZsYWdzKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmxhZ3NVbnNldEZlYXR1cmVGbGFncygpIHsKKyAgICAgICAgRmFrZUZlYXR1cmVGbGFnc0ltcGwgZmVhdHVyZUZsYWdzID0gbmV3IEZha2VGZWF0dXJlRmxhZ3NJbXBsKCk7CisgICAgICAgIGZlYXR1cmVGbGFncy5zZXRGbGFnKEZsYWdzLkZMQUdfRU5BQkxFRF9SVywgdHJ1ZSk7CisgICAgICAgIGFzc2VydFRocm93cyhOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gRmxhZ3MuZW5hYmxlZFJ3KCkpOworICAgICAgICBGbGFncy5zZXRGZWF0dXJlRmxhZ3MoZmVhdHVyZUZsYWdzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShGbGFncy5lbmFibGVkUncoKSk7CisKKyAgICAgICAgRmxhZ3MudW5zZXRGZWF0dXJlRmxhZ3MoKTsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiBGbGFncy5lbmFibGVkUncoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZUZsYWdzSW1wbE5vdEltcGwoKSB7CisgICAgICAgIEZlYXR1cmVGbGFncyBmZWF0dXJlRmxhZ3MgPSBuZXcgRmVhdHVyZUZsYWdzSW1wbCgpOworICAgICAgICBhc3NlcnRUaHJvd3MoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAoKSAtPiBmZWF0dXJlRmxhZ3MuZW5hYmxlZFJ3KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9BY29uZmlnVGVzdC5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL0Fjb25maWdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3NmVmYgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9BY29uZmlnVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LkZsYWdzLkZMQUdfRElTQUJMRURfUk87CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5GbGFncy5GTEFHX0RJU0FCTEVEX1JXOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuRmxhZ3MuRkxBR19FTkFCTEVEX0ZJWEVEX1JPOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuRmxhZ3MuRkxBR19FTkFCTEVEX1JPOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuRmxhZ3MuRkxBR19FTkFCTEVEX1JXOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuRmxhZ3MuZGlzYWJsZWRSbzsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LkZsYWdzLmRpc2FibGVkUnc7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5GbGFncy5lbmFibGVkRml4ZWRSbzsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LkZsYWdzLmVuYWJsZWRSbzsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LkZsYWdzLmVuYWJsZWRSdzsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmV4cG9ydGVkLkZsYWdzLmV4cG9ydGVkRmxhZzsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmV4cG9ydGVkLkZsYWdzLkZMQUdfRVhQT1JURURfRkxBRzsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmZvcmNlcmVhZG9ubHkuRmxhZ3MuZnJvUnc7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRocm93czsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5GYWtlRmVhdHVyZUZsYWdzSW1wbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuRmVhdHVyZUZsYWdzOworCitAUnVuV2l0aChKVW5pdDQuY2xhc3MpCitwdWJsaWMgZmluYWwgY2xhc3MgQWNvbmZpZ1Rlc3QgeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVkUmVhZE9ubHlGbGFnKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9ybyIsIEZMQUdfRElTQUJMRURfUk8pOworICAgICAgICBhc3NlcnRGYWxzZShkaXNhYmxlZFJvKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZWRSZWFkT25seUZsYWcoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3IiwgRkxBR19ESVNBQkxFRF9SVyk7CisgICAgICAgIGFzc2VydFRydWUoZW5hYmxlZFJvKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZWRGaXhlZFJlYWRPbmx5RmxhZygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9maXhlZF9ybyIsIEZMQUdfRU5BQkxFRF9GSVhFRF9STyk7CisgICAgICAgIGFzc2VydFRydWUoZW5hYmxlZEZpeGVkUm8oKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRSZWFkV3JpdGVGbGFnKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3JvIiwgRkxBR19FTkFCTEVEX1JPKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZGlzYWJsZWRSdygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmFibGVkUmVhZFdyaXRlRmxhZygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9ydyIsIEZMQUdfRU5BQkxFRF9SVyk7CisgICAgICAgIGFzc2VydFRydWUoZW5hYmxlZFJ3KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZha2VGZWF0dXJlRmxhZ3NJbXBsSW1wbGVkKCkgeworICAgICAgICBGYWtlRmVhdHVyZUZsYWdzSW1wbCBmYWtlRmVhdHVyZUZsYWdzID0gbmV3IEZha2VGZWF0dXJlRmxhZ3NJbXBsKCk7CisgICAgICAgIGZha2VGZWF0dXJlRmxhZ3Muc2V0RmxhZyhGTEFHX0VOQUJMRURfUlcsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZmFrZUZlYXR1cmVGbGFncy5lbmFibGVkUncoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwb3J0ZWRGbGFnKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5leHBvcnRlZC5leHBvcnRlZF9mbGFnIiwgRkxBR19FWFBPUlRFRF9GTEFHKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZXhwb3J0ZWRGbGFnKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvcmNlUmVhZE9ubHkoKSB7CisgICAgICAgIGFzc2VydEZhbHNlKGZyb1J3KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQwMDJlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYWNvbmZpZy50ZXN0LmphdmEiPgorCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0RFVklDRV9DT05GSUciIC8+CisKKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIi8+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYWNvbmZpZy50ZXN0LmphdmEiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9ImFjb25maWcgaW50ZWdyYXRpb24gdGVzdHMgKGphdmEpIiAvPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9hY29uZmlnX2V4cG9ydGVkX21vZGVfdGVzdC5jcHAgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvYWNvbmZpZ19leHBvcnRlZF9tb2RlX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZWFiNDMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvYWNvbmZpZ19leHBvcnRlZF9tb2RlX3Rlc3QuY3BwCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKwordXNpbmcgbmFtZXNwYWNlIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDsKKworVEVTVChBY29uZmlnVGVzdCwgVGVzdERpc2FibGVkUndFeHBvcnRlZEZsYWcpIHsKKyAgQVNTRVJUX0ZBTFNFKGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9yd19leHBvcnRlZCgpKTsKKyAgQVNTRVJUX0ZBTFNFKHByb3ZpZGVyXy0+ZGlzYWJsZWRfcndfZXhwb3J0ZWQoKSk7CisgIEFTU0VSVF9GQUxTRShkaXNhYmxlZF9yd19leHBvcnRlZCgpKTsKK30KKworVEVTVChBY29uZmlnVGVzdCwgVGVzdEVuYWJsZWRGaXhlZFJvRXhwb3J0ZWRGbGFnKSB7CisgIC8vIFRPRE86IGNoYW5nZSB0byBhc3NlcnRUcnVlKGVuYWJsZWRGaXhlZFJvRXhwb3J0ZWQoKSkgd2hlbiB0aGUgYnVpbGQgc3VwcG9ydHMgcmVhZGluZyB0ZXN0cy8qLnZhbHVlcworICBBU1NFUlRfRkFMU0UoY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoKSk7CisgIEFTU0VSVF9GQUxTRShwcm92aWRlcl8tPmVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoKSk7CisgIEFTU0VSVF9GQUxTRShlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCkpOworfQorCitURVNUKEFjb25maWdUZXN0LCBUZXN0RW5hYmxlZFJvRXhwb3J0ZWRGbGFnKSB7CisgIC8vIFRPRE86IGNoYW5nZSB0byBhc3NlcnRUcnVlKGVuYWJsZWRSb0V4cG9ydGVkKCkpIHdoZW4gdGhlIGJ1aWxkIHN1cHBvcnRzIHJlYWRpbmcgdGVzdHMvKi52YWx1ZXMKKyAgQVNTRVJUX0ZBTFNFKGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX3JvX2V4cG9ydGVkKCkpOworICBBU1NFUlRfRkFMU0UocHJvdmlkZXJfLT5lbmFibGVkX3JvX2V4cG9ydGVkKCkpOworICBBU1NFUlRfRkFMU0UoZW5hYmxlZF9yb19leHBvcnRlZCgpKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvYWNvbmZpZ19leHBvcnRlZF9tb2RlX3Rlc3QucnMgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvYWNvbmZpZ19leHBvcnRlZF9tb2RlX3Rlc3QucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0ODA0NwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9hY29uZmlnX2V4cG9ydGVkX21vZGVfdGVzdC5ycwpAQCAtMCwwICsxLDcgQEAKKyNbY2ZnKG5vdChmZWF0dXJlID0gImNhcmdvIikpXQorI1t0ZXN0XQorZm4gdGVzdF9mbGFncygpIHsKKyAgICBhc3NlcnQhKCFhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5OjpkaXNhYmxlZF9yd19leHBvcnRlZCgpKTsKKyAgICBhc3NlcnQhKCFhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5OjplbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCkpOworICAgIGFzc2VydCEoIWFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnk6OmVuYWJsZWRfcm9fZXhwb3J0ZWQoKSk7Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvYWNvbmZpZ19mb3JjZV9yZWFkX29ubHlfbW9kZV90ZXN0LmNwcCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9hY29uZmlnX2ZvcmNlX3JlYWRfb25seV9tb2RlX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZWM0ODEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvYWNvbmZpZ19mb3JjZV9yZWFkX29ubHlfbW9kZV90ZXN0LmNwcApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdC5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBjb206OmFuZHJvaWQ6OmFjb25maWc6OnRlc3Q7CisKK1RFU1QoQWNvbmZpZ1Rlc3QsIFRlc3REaXNhYmxlZFJlYWRPbmx5RmxhZykgeworICBBU1NFUlRfRkFMU0UoY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2Rpc2FibGVkX3JvKCkpOworICBBU1NFUlRfRkFMU0UocHJvdmlkZXJfLT5kaXNhYmxlZF9ybygpKTsKKyAgQVNTRVJUX0ZBTFNFKGRpc2FibGVkX3JvKCkpOworfQorCitURVNUKEFjb25maWdUZXN0LCBUZXN0RW5hYmxlZFJlYWRPbmx5RmxhZykgeworICBBU1NFUlRfVFJVRShjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9ybygpKTsKKyAgQVNTRVJUX1RSVUUocHJvdmlkZXJfLT5lbmFibGVkX3JvKCkpOworICBBU1NFUlRfVFJVRShlbmFibGVkX3JvKCkpOworfQorCitURVNUKEFjb25maWdUZXN0LCBUZXN0RGlzYWJsZWRSZWFkV3JpdGVGbGFnKSB7CisgIEFTU0VSVF9GQUxTRShjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcncoKSk7CisgIEFTU0VSVF9GQUxTRShwcm92aWRlcl8tPmRpc2FibGVkX3J3KCkpOworICBBU1NFUlRfRkFMU0UoZGlzYWJsZWRfcncoKSk7Cit9CisKK1RFU1QoQWNvbmZpZ1Rlc3QsIFRlc3RFbmFibGVkUmVhZFdyaXRlRmxhZykgeworICBBU1NFUlRfVFJVRShjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9ydygpKTsKKyAgQVNTRVJUX1RSVUUocHJvdmlkZXJfLT5lbmFibGVkX3J3KCkpOworICBBU1NFUlRfVFJVRShlbmFibGVkX3J3KCkpOworfQorCitURVNUKEFjb25maWdUZXN0LCBUZXN0RW5hYmxlZEZpeGVkUmVhZE9ubHlGbGFnKSB7CisgIEFTU0VSVF9UUlVFKGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX2ZpeGVkX3JvKCkpOworICBBU1NFUlRfVFJVRShwcm92aWRlcl8tPmVuYWJsZWRfZml4ZWRfcm8oKSk7CisgIEFTU0VSVF9UUlVFKGVuYWJsZWRfZml4ZWRfcm8oKSk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvYWNvbmZpZ19mb3JjZV9yZWFkX29ubHlfbW9kZV90ZXN0LnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL2Fjb25maWdfZm9yY2VfcmVhZF9vbmx5X21vZGVfdGVzdC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjA1ZTI2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL2Fjb25maWdfZm9yY2VfcmVhZF9vbmx5X21vZGVfdGVzdC5ycwpAQCAtMCwwICsxLDEwIEBACisjW2NmZyhub3QoZmVhdHVyZSA9ICJjYXJnbyIpKV0KKyNbdGVzdF0KK2ZuIHRlc3RfZmxhZ3MoKSB7CisgICAgYXNzZXJ0ISghYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeTo6ZGlzYWJsZWRfcm8oKSk7CisgICAgYXNzZXJ0ISghYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeTo6ZGlzYWJsZWRfcncoKSk7CisgICAgYXNzZXJ0ISghYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeTo6ZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKCkpOworICAgIGFzc2VydCEoYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeTo6ZW5hYmxlZF9maXhlZF9ybygpKTsKKyAgICBhc3NlcnQhKGFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnk6OmVuYWJsZWRfcm8oKSk7CisgICAgYXNzZXJ0IShhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5OjplbmFibGVkX3J3KCkpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL2Fjb25maWdfcHJvZF9tb2RlX3Rlc3QucnMgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvYWNvbmZpZ19wcm9kX21vZGVfdGVzdC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWZiOGU1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL2Fjb25maWdfcHJvZF9tb2RlX3Rlc3QucnMKQEAgLTAsMCArMSw4IEBACisjW2NmZyhub3QoZmVhdHVyZSA9ICJjYXJnbyIpKV0KKyNbdGVzdF0KK2ZuIHRlc3RfZmxhZ3MoKSB7CisgICAgYXNzZXJ0ISghYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeTo6ZGlzYWJsZWRfcm8oKSk7CisgICAgYXNzZXJ0ISghYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeTo6ZGlzYWJsZWRfcncoKSk7CisgICAgYXNzZXJ0IShhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5OjplbmFibGVkX3JvKCkpOworICAgIGFzc2VydCEoYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeTo6ZW5hYmxlZF9ydygpKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9hY29uZmlnX3Rlc3QuY3BwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL2Fjb25maWdfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRlYzQ4MQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9hY29uZmlnX3Rlc3QuY3BwCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0LmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKwordXNpbmcgbmFtZXNwYWNlIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDsKKworVEVTVChBY29uZmlnVGVzdCwgVGVzdERpc2FibGVkUmVhZE9ubHlGbGFnKSB7CisgIEFTU0VSVF9GQUxTRShjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcm8oKSk7CisgIEFTU0VSVF9GQUxTRShwcm92aWRlcl8tPmRpc2FibGVkX3JvKCkpOworICBBU1NFUlRfRkFMU0UoZGlzYWJsZWRfcm8oKSk7Cit9CisKK1RFU1QoQWNvbmZpZ1Rlc3QsIFRlc3RFbmFibGVkUmVhZE9ubHlGbGFnKSB7CisgIEFTU0VSVF9UUlVFKGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX3JvKCkpOworICBBU1NFUlRfVFJVRShwcm92aWRlcl8tPmVuYWJsZWRfcm8oKSk7CisgIEFTU0VSVF9UUlVFKGVuYWJsZWRfcm8oKSk7Cit9CisKK1RFU1QoQWNvbmZpZ1Rlc3QsIFRlc3REaXNhYmxlZFJlYWRXcml0ZUZsYWcpIHsKKyAgQVNTRVJUX0ZBTFNFKGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9ydygpKTsKKyAgQVNTRVJUX0ZBTFNFKHByb3ZpZGVyXy0+ZGlzYWJsZWRfcncoKSk7CisgIEFTU0VSVF9GQUxTRShkaXNhYmxlZF9ydygpKTsKK30KKworVEVTVChBY29uZmlnVGVzdCwgVGVzdEVuYWJsZWRSZWFkV3JpdGVGbGFnKSB7CisgIEFTU0VSVF9UUlVFKGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX3J3KCkpOworICBBU1NFUlRfVFJVRShwcm92aWRlcl8tPmVuYWJsZWRfcncoKSk7CisgIEFTU0VSVF9UUlVFKGVuYWJsZWRfcncoKSk7Cit9CisKK1RFU1QoQWNvbmZpZ1Rlc3QsIFRlc3RFbmFibGVkRml4ZWRSZWFkT25seUZsYWcpIHsKKyAgQVNTRVJUX1RSVUUoY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfZml4ZWRfcm8oKSk7CisgIEFTU0VSVF9UUlVFKHByb3ZpZGVyXy0+ZW5hYmxlZF9maXhlZF9ybygpKTsKKyAgQVNTRVJUX1RSVUUoZW5hYmxlZF9maXhlZF9ybygpKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9hY29uZmlnX3Rlc3RfbW9kZV90ZXN0LnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL2Fjb25maWdfdGVzdF9tb2RlX3Rlc3QucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA4ZmJhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9hY29uZmlnX3Rlc3RfbW9kZV90ZXN0LnJzCkBAIC0wLDAgKzEsMjMgQEAKKyNbY2ZnKG5vdChmZWF0dXJlID0gImNhcmdvIikpXQorI1t0ZXN0XQorZm4gdGVzdF9mbGFncygpIHsKKyAgICBhc3NlcnQhKCFhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5OjpkaXNhYmxlZF9ybygpKTsKKyAgICBhc3NlcnQhKCFhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5OjpkaXNhYmxlZF9ydygpKTsKKyAgICBhc3NlcnQhKGFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnk6OmVuYWJsZWRfcm8oKSk7CisgICAgYXNzZXJ0IShhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5OjplbmFibGVkX3J3KCkpOworCisgICAgYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeTo6c2V0X2Rpc2FibGVkX3JvKHRydWUpOworICAgIGFzc2VydCEoYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeTo6ZGlzYWJsZWRfcm8oKSk7CisgICAgYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeTo6c2V0X2Rpc2FibGVkX3J3KHRydWUpOworICAgIGFzc2VydCEoYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeTo6ZGlzYWJsZWRfcncoKSk7CisgICAgYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeTo6c2V0X2VuYWJsZWRfcm8oZmFsc2UpOworICAgIGFzc2VydCEoIWFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnk6OmVuYWJsZWRfcm8oKSk7CisgICAgYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeTo6c2V0X2VuYWJsZWRfcncoZmFsc2UpOworICAgIGFzc2VydCEoIWFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnk6OmVuYWJsZWRfcncoKSk7CisKKyAgICBhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5OjpyZXNldF9mbGFncygpOworICAgIGFzc2VydCEoIWFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnk6OmRpc2FibGVkX3JvKCkpOworICAgIGFzc2VydCEoIWFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnk6OmRpc2FibGVkX3J3KCkpOworICAgIGFzc2VydCEoYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeTo6ZW5hYmxlZF9ybygpKTsKKyAgICBhc3NlcnQhKGFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnk6OmVuYWJsZWRfcncoKSk7Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvYWNvbmZpZ190ZXN0X3Rlc3RfdmFyaWFudC5jcHAgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvYWNvbmZpZ190ZXN0X3Rlc3RfdmFyaWFudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNjZjcxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9hY29uZmlnX3Rlc3RfdGVzdF92YXJpYW50LmNwcApAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdC5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBjb206OmFuZHJvaWQ6OmFjb25maWc6OnRlc3Q7CisKK2NsYXNzIEFjb25maWdUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIHJlc2V0X2ZsYWdzKCk7CisgIH0KK307CisKK1RFU1RfRihBY29uZmlnVGVzdCwgVGVzdERpc2FibGVkUmVhZE9ubHlGbGFnKSB7CisgIEFTU0VSVF9GQUxTRShjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcm8oKSk7CisgIEFTU0VSVF9GQUxTRShwcm92aWRlcl8tPmRpc2FibGVkX3JvKCkpOworICBBU1NFUlRfRkFMU0UoZGlzYWJsZWRfcm8oKSk7Cit9CisKK1RFU1RfRihBY29uZmlnVGVzdCwgVGVzdEVuYWJsZWRSZWFkT25seUZsYWcpIHsKKyAgQVNTRVJUX1RSVUUoY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcm8oKSk7CisgIEFTU0VSVF9UUlVFKHByb3ZpZGVyXy0+ZW5hYmxlZF9ybygpKTsKKyAgQVNTRVJUX1RSVUUoZW5hYmxlZF9ybygpKTsKK30KKworVEVTVF9GKEFjb25maWdUZXN0LCBUZXN0RGlzYWJsZWRSZWFkV3JpdGVGbGFnKSB7CisgIEFTU0VSVF9GQUxTRShjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcncoKSk7CisgIEFTU0VSVF9GQUxTRShwcm92aWRlcl8tPmRpc2FibGVkX3J3KCkpOworICBBU1NFUlRfRkFMU0UoZGlzYWJsZWRfcncoKSk7Cit9CisKK1RFU1RfRihBY29uZmlnVGVzdCwgVGVzdEVuYWJsZWRSZWFkV3JpdGVGbGFnKSB7CisgIEFTU0VSVF9UUlVFKGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX3J3KCkpOworICBBU1NFUlRfVFJVRShwcm92aWRlcl8tPmVuYWJsZWRfcncoKSk7CisgIEFTU0VSVF9UUlVFKGVuYWJsZWRfcncoKSk7Cit9CisKK1RFU1RfRihBY29uZmlnVGVzdCwgVGVzdEVuYWJsZWRGaXhlZFJlYWRPbmx5RmxhZykgeworICBBU1NFUlRfVFJVRShjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9maXhlZF9ybygpKTsKKyAgQVNTRVJUX1RSVUUocHJvdmlkZXJfLT5lbmFibGVkX2ZpeGVkX3JvKCkpOworICBBU1NFUlRfVFJVRShlbmFibGVkX2ZpeGVkX3JvKCkpOworfQorCitURVNUX0YoQWNvbmZpZ1Rlc3QsIE92ZXJyaWRlRmxhZ1ZhbHVlKSB7CisgIEFTU0VSVF9GQUxTRShkaXNhYmxlZF9ybygpKTsKKyAgZGlzYWJsZWRfcm8odHJ1ZSk7CisgIEFTU0VSVF9UUlVFKGRpc2FibGVkX3JvKCkpOworfQorCitURVNUX0YoQWNvbmZpZ1Rlc3QsIFJlc2V0RmxhZ1ZhbHVlKSB7CisgIEFTU0VSVF9GQUxTRShkaXNhYmxlZF9ybygpKTsKKyAgQVNTRVJUX1RSVUUoZW5hYmxlZF9ybygpKTsKKyAgZGlzYWJsZWRfcm8odHJ1ZSk7CisgIGVuYWJsZWRfcm8oZmFsc2UpOworICBBU1NFUlRfVFJVRShkaXNhYmxlZF9ybygpKTsKKyAgQVNTRVJUX0ZBTFNFKGVuYWJsZWRfcm8oKSk7CisgIHJlc2V0X2ZsYWdzKCk7CisgIEFTU0VSVF9GQUxTRShkaXNhYmxlZF9ybygpKTsKKyAgQVNTRVJUX1RSVUUoZW5hYmxlZF9ybygpKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9maXJzdC52YWx1ZXMgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvZmlyc3QudmFsdWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZmI0NjMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvZmlyc3QudmFsdWVzCkBAIC0wLDAgKzEsNDggQEAKK2ZsYWdfdmFsdWUgeworICAgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiCisgICAgbmFtZTogImRpc2FibGVkX3JvIgorICAgIHN0YXRlOiBESVNBQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorfQorZmxhZ192YWx1ZSB7CisgICAgcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIKKyAgICBuYW1lOiAiZW5hYmxlZF9ybyIKKyAgICBzdGF0ZTogRElTQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX1dSSVRFCit9CitmbGFnX3ZhbHVlIHsKKyAgICBwYWNrYWdlOiAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IgorICAgIG5hbWU6ICJlbmFibGVkX3J3IgorICAgIHN0YXRlOiBFTkFCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9XUklURQorfQorZmxhZ192YWx1ZSB7CisgICAgcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIKKyAgICBuYW1lOiAiZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlIgorICAgIHN0YXRlOiBESVNBQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfV1JJVEUKK30KK2ZsYWdfdmFsdWUgeworICAgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiCisgICAgbmFtZTogImVuYWJsZWRfZml4ZWRfcm8iCisgICAgc3RhdGU6IEVOQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKK30KK2ZsYWdfdmFsdWUgeworICAgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiCisgICAgbmFtZTogImVuYWJsZWRfcm9fZXhwb3J0ZWQiCisgICAgc3RhdGU6IEVOQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKK30KK2ZsYWdfdmFsdWUgeworICAgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiCisgICAgbmFtZTogImRpc2FibGVkX3J3X2V4cG9ydGVkIgorICAgIHN0YXRlOiBESVNBQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfV1JJVEUKK30KK2ZsYWdfdmFsdWUgeworICAgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiCisgICAgbmFtZTogImVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQiCisgICAgc3RhdGU6IEVOQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9yZWFkX29ubHlfdGVzdC5hY29uZmlnIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3JlYWRfb25seV90ZXN0LmFjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWViNTA1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9yZWFkX29ubHlfdGVzdC5hY29uZmlnCkBAIC0wLDAgKzEsMzIgQEAKK3BhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiCitjb250YWluZXI6ICJzeXN0ZW0iCisKK2ZsYWcgeworICAgIG5hbWU6ICJlbmFibGVkX3JvIgorICAgIG5hbWVzcGFjZTogImFjb25maWdfdGVzdCIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgZmxhZyBpcyBFTkFCTEVEICsgUkVBRF9PTkxZIgorICAgIGJ1ZzogImFiYyIKK30KKworZmxhZyB7CisgICAgbmFtZTogImRpc2FibGVkX3JvIgorICAgIG5hbWVzcGFjZTogImFjb25maWdfdGVzdCIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgZmxhZyBpcyBESVNBQkxFRCArIFJFQURfT05MWSIKKyAgICBidWc6ICIxMjMiCit9CisKK2ZsYWcgeworICAgIG5hbWU6ICJlbmFibGVkX2ZpeGVkX3JvIgorICAgIG5hbWVzcGFjZTogImFjb25maWdfdGVzdCIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgZmxhZyBpcyBmaXhlZCBSRUFEX09OTFkgKyBFTkFCTEVEIgorICAgIGJ1ZzogIiIKKyAgICBpc19maXhlZF9yZWFkX29ubHk6IHRydWUKK30KKworZmxhZyB7CisgICAgbmFtZTogImRpc2FibGVkX2ZpeGVkX3JvIgorICAgIG5hbWVzcGFjZTogImFjb25maWdfdGVzdCIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgZmxhZyBpcyBmaXhlZCBSRUFEX09OTFkgKyBESVNBQkxFRCIKKyAgICBidWc6ICIiCisgICAgaXNfZml4ZWRfcmVhZF9vbmx5OiB0cnVlCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvcmVhZF9vbmx5X3Rlc3QudmFsdWVzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3JlYWRfb25seV90ZXN0LnZhbHVlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDljN2FhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3JlYWRfb25seV90ZXN0LnZhbHVlcwpAQCAtMCwwICsxLDE4IEBACitmbGFnX3ZhbHVlIHsKKyAgICBwYWNrYWdlOiAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IgorICAgIG5hbWU6ICJkaXNhYmxlZF9ybyIKKyAgICBzdGF0ZTogRElTQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKK30KK2ZsYWdfdmFsdWUgeworICAgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiCisgICAgbmFtZTogImVuYWJsZWRfcm8iCisgICAgc3RhdGU6IEVOQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKK30KK2ZsYWdfdmFsdWUgeworICAgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiCisgICAgbmFtZTogImVuYWJsZWRfZml4ZWRfcm8iCisgICAgc3RhdGU6IEVOQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9zZWNvbmQudmFsdWVzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3NlY29uZC52YWx1ZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEwOWNmNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9zZWNvbmQudmFsdWVzCkBAIC0wLDAgKzEsNiBAQAorZmxhZ192YWx1ZSB7CisgICAgcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIKKyAgICBuYW1lOiAiZW5hYmxlZF9ybyIKKyAgICBzdGF0ZTogRU5BQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3N0b3JhZ2VfdGVzdF8xLmFjb25maWcgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvc3RvcmFnZV90ZXN0XzEuYWNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTIyYzU3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3N0b3JhZ2VfdGVzdF8xLmFjb25maWcKQEAgLTAsMCArMSwyNCBAQAorcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiCitjb250YWluZXI6ICJzeXN0ZW0iCisKK2ZsYWcgeworICAgIG5hbWU6ICJlbmFibGVkX3J3IgorICAgIG5hbWVzcGFjZTogImFjb25maWdfdGVzdCIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgZmxhZyBpcyBFTkFCTEVEICsgUkVBRF9XUklURSIKKyAgICBidWc6ICIiCit9CisKK2ZsYWcgeworICAgIG5hbWU6ICJkaXNhYmxlZF9ydyIKKyAgICBuYW1lc3BhY2U6ICJhY29uZmlnX3Rlc3QiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGZsYWcgaXMgRElTQUJMRUQgKyBSRUFEX1dSSVRFIgorICAgIGJ1ZzogIjQ1NiIKKyAgICBpc19leHBvcnRlZDogdHJ1ZQorfQorCitmbGFnIHsKKyAgICBuYW1lOiAiZW5hYmxlZF9ybyIKKyAgICBuYW1lc3BhY2U6ICJhY29uZmlnX3Rlc3QiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGZsYWcgaXMgRU5BQkxFRCArIFJFQURfT05MWSIKKyAgICBidWc6ICJhYmMiCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvc3RvcmFnZV90ZXN0XzEudmFsdWVzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3N0b3JhZ2VfdGVzdF8xLnZhbHVlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTU0OGFlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3N0b3JhZ2VfdGVzdF8xLnZhbHVlcwpAQCAtMCwwICsxLDE4IEBACitmbGFnX3ZhbHVlIHsKKyAgICBwYWNrYWdlOiAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIKKyAgICBuYW1lOiAiZW5hYmxlZF9ydyIKKyAgICBzdGF0ZTogRU5BQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfV1JJVEUKK30KK2ZsYWdfdmFsdWUgeworICAgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIgorICAgIG5hbWU6ICJkaXNhYmxlZF9ydyIKKyAgICBzdGF0ZTogRElTQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX1dSSVRFCit9CitmbGFnX3ZhbHVlIHsKKyAgICBwYWNrYWdlOiAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIKKyAgICBuYW1lOiAiZW5hYmxlZF9ybyIKKyAgICBzdGF0ZTogRU5BQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3N0b3JhZ2VfdGVzdF8yLmFjb25maWcgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvc3RvcmFnZV90ZXN0XzIuYWNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjc3ZjdhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3N0b3JhZ2VfdGVzdF8yLmFjb25maWcKQEAgLTAsMCArMSwyNCBAQAorcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiCitjb250YWluZXI6ICJzeXN0ZW0iCisKK2ZsYWcgeworICAgIG5hbWU6ICJlbmFibGVkX3JvIgorICAgIG5hbWVzcGFjZTogImFjb25maWdfdGVzdCIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgZmxhZyBpcyBFTkFCTEVEICsgUkVBRF9PTkxZIgorICAgIGJ1ZzogImFiYyIKK30KKworZmxhZyB7CisgICAgbmFtZTogImRpc2FibGVkX3J3IgorICAgIG5hbWVzcGFjZTogImFjb25maWdfdGVzdCIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgZmxhZyBpcyBESVNBQkxFRCArIFJFQURfT05MWSIKKyAgICBidWc6ICIxMjMiCit9CisKK2ZsYWcgeworICAgIG5hbWU6ICJlbmFibGVkX2ZpeGVkX3JvIgorICAgIG5hbWVzcGFjZTogImFjb25maWdfdGVzdCIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgZmxhZyBpcyBmaXhlZCBSRUFEX09OTFkgKyBFTkFCTEVEIgorICAgIGJ1ZzogIiIKKyAgICBpc19maXhlZF9yZWFkX29ubHk6IHRydWUKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9zdG9yYWdlX3Rlc3RfMi52YWx1ZXMgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvc3RvcmFnZV90ZXN0XzIudmFsdWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NTA3MjEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvc3RvcmFnZV90ZXN0XzIudmFsdWVzCkBAIC0wLDAgKzEsMTggQEAKK2ZsYWdfdmFsdWUgeworICAgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIgorICAgIG5hbWU6ICJlbmFibGVkX3JvIgorICAgIHN0YXRlOiBFTkFCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCit9CitmbGFnX3ZhbHVlIHsKKyAgICBwYWNrYWdlOiAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIKKyAgICBuYW1lOiAiZGlzYWJsZWRfcnciCisgICAgc3RhdGU6IERJU0FCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9XUklURQorfQorZmxhZ192YWx1ZSB7CisgICAgcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiCisgICAgbmFtZTogImVuYWJsZWRfZml4ZWRfcm8iCisgICAgc3RhdGU6IEVOQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9zdG9yYWdlX3Rlc3RfNC5hY29uZmlnIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3N0b3JhZ2VfdGVzdF80LmFjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgwMmE3MwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9zdG9yYWdlX3Rlc3RfNC5hY29uZmlnCkBAIC0wLDAgKzEsMTcgQEAKK3BhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IgorY29udGFpbmVyOiAic3lzdGVtIgorCitmbGFnIHsKKyAgICBuYW1lOiAiZW5hYmxlZF9ydyIKKyAgICBuYW1lc3BhY2U6ICJhY29uZmlnX3Rlc3QiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGZsYWcgaXMgRU5BQkxFRCArIFJFQURfT05MWSIKKyAgICBidWc6ICJhYmMiCit9CisKK2ZsYWcgeworICAgIG5hbWU6ICJlbmFibGVkX2ZpeGVkX3JvIgorICAgIG5hbWVzcGFjZTogImFjb25maWdfdGVzdCIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgZmxhZyBpcyBmaXhlZCBSRUFEX09OTFkgKyBFTkFCTEVEIgorICAgIGJ1ZzogIiIKKyAgICBpc19maXhlZF9yZWFkX29ubHk6IHRydWUKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy9zdG9yYWdlX3Rlc3RfNC52YWx1ZXMgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvc3RvcmFnZV90ZXN0XzQudmFsdWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NGI3NDQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvc3RvcmFnZV90ZXN0XzQudmFsdWVzCkBAIC0wLDAgKzEsMTIgQEAKK2ZsYWdfdmFsdWUgeworICAgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IgorICAgIG5hbWU6ICJlbmFibGVkX3J3IgorICAgIHN0YXRlOiBFTkFCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9XUklURQorfQorZmxhZ192YWx1ZSB7CisgICAgcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiCisgICAgbmFtZTogImVuYWJsZWRfZml4ZWRfcm8iCisgICAgc3RhdGU6IEVOQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy90ZXN0LmFjb25maWcgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvdGVzdC5hY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMTUwOGEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvdGVzdC5hY29uZmlnCkBAIC0wLDAgKzEsODkgQEAKK3BhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiCitjb250YWluZXI6ICJzeXN0ZW0iCisKKyMgVGhpcyBmbGFnJ3MgZmluYWwgdmFsdWUgaXMgY2FsY3VsYXRlZCBmcm9tOgorIyAtIHRlc3QuYWNvbmZpZzogRElTQUJMRUQgKyBSRUFEX1dSSVRFIChkZWZhdWx0KQorIyAtIGZpcnN0LnZhbHVlczogRElTQUJMRUQgKyBSRUFEX1dSSVRFCisjIC0gc2Vjb25kLnZhbHVlczogRU5BQkxFRCArIFJFQURfT05MWQorZmxhZyB7CisgICAgbmFtZTogImVuYWJsZWRfcm8iCisgICAgbmFtZXNwYWNlOiAiYWNvbmZpZ190ZXN0IgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBmbGFnIGlzIEVOQUJMRUQgKyBSRUFEX09OTFkiCisgICAgYnVnOiAiYWJjIgorICAgIG1ldGFkYXRhIHsKKyAgICAgICAgcHVycG9zZTogUFVSUE9TRV9CVUdGSVgKKyAgICB9Cit9CisKKyMgVGhpcyBmbGFnJ3MgZmluYWwgdmFsdWUgaXMgY2FsY3VsYXRlZCBmcm9tOgorIyAtIHRlc3QuYWNvbmZpZzogRElTQUJMRUQgKyBSRUFEX1dSSVRFIChkZWZhdWx0KQorIyAtIGZpcnN0LnZhbHVlczogRU5BQkxFRCArIFJFQURfV1JJVEUKK2ZsYWcgeworICAgIG5hbWU6ICJlbmFibGVkX3J3IgorICAgIG5hbWVzcGFjZTogImFjb25maWdfdGVzdCIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgZmxhZyBpcyBFTkFCTEVEICsgUkVBRF9XUklURSIKKyAgICAjIGZvciBidWcgZmllbGRzLCB0aGUgZW1wdHkgc3RyaW5nIGlzIGEgZGlzY291cmFnZWQgYnV0IHZhbGlkIHZhbHVlCisgICAgYnVnOiAiIgorfQorCisjIFRoaXMgZmxhZydzIGZpbmFsIHZhbHVlIGlzIGNhbGN1bGF0ZWQgZnJvbToKKyMgLSB0ZXN0LmFjb25maWc6IERJU0FCTEVEICsgUkVBRF9XUklURSAoZGVmYXVsdCkKKyMgLSBmaXJzdC52YWx1ZXM6IERJU0FCTEVEICsgUkVBRF9PTkxZCitmbGFnIHsKKyAgICBuYW1lOiAiZGlzYWJsZWRfcm8iCisgICAgbmFtZXNwYWNlOiAiYWNvbmZpZ190ZXN0IgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBmbGFnIGlzIERJU0FCTEVEICsgUkVBRF9PTkxZIgorICAgIGJ1ZzogIjEyMyIKK30KKworIyBUaGlzIGZsYWcncyBmaW5hbCB2YWx1ZSBpcyBjYWxjdWxhdGVkIGZyb206CisjIC0gdGVzdC5hY29uZmlnOiBESVNBQkxFRCArIFJFQURfV1JJVEUgKGRlZmF1bHQpCitmbGFnIHsKKyAgICBuYW1lOiAiZGlzYWJsZWRfcnciCisgICAgbmFtZXNwYWNlOiAiYWNvbmZpZ190ZXN0IgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBmbGFnIGlzIERJU0FCTEVEICsgUkVBRF9XUklURSIKKyAgICBidWc6ICI0NTYiCit9CisKKyMgVGhpcyBmbGFnJ3MgZmluYWwgdmFsdWUgY2FsY3VsYXRlZCBmcm9tOgorIyAtIHRlc3QuYWNvbmZpZzogRElTQUJMRUQgKyBSRUFEX09OTFkKKyMgLSBmaXJzdC52YWx1ZXM6IEVOQUJMRUQgKyBSRUFEX09OTFkKK2ZsYWcgeworICAgIG5hbWU6ICJlbmFibGVkX2ZpeGVkX3JvIgorICAgIG5hbWVzcGFjZTogImFjb25maWdfdGVzdCIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgZmxhZyBpcyBmaXhlZCBSRUFEX09OTFkgKyBFTkFCTEVEIgorICAgIGJ1ZzogIiIKKyAgICBpc19maXhlZF9yZWFkX29ubHk6IHRydWUKK30KKworZmxhZyB7CisgICAgbmFtZTogImRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSIKKyAgICBuYW1lc3BhY2U6ICJvdGhlcl9uYW1lc3BhY2UiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGZsYWcgaXMgRElTQUJMRUQgKyBSRUFEX1dSSVRFLCBhbmQgaXMgZGVmaW5lZCBpbiBhbm90aGVyIG5hbWVzcGFjZSIKKyAgICBidWc6ICI5OTkiCit9CisKK2ZsYWcgeworICAgIG5hbWU6ICJlbmFibGVkX3JvX2V4cG9ydGVkIgorICAgIG5hbWVzcGFjZTogImFjb25maWdfdGVzdCIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgZmxhZyBpcyBFTkFCTEVEICsgUkVBRF9PTkxZIGFuZCBleHBvcnRlZCIKKyAgICBidWc6ICIxMTEiCisgICAgaXNfZXhwb3J0ZWQ6IHRydWUKK30KKworZmxhZyB7CisgICAgbmFtZTogImRpc2FibGVkX3J3X2V4cG9ydGVkIgorICAgIG5hbWVzcGFjZTogImFjb25maWdfdGVzdCIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgZmxhZyBpcyBESVNBQkxFRCArIFJFQURfV1JJVEUgYW5kIGV4cG9ydGVkIgorICAgIGJ1ZzogIjExMSIKKyAgICBpc19leHBvcnRlZDogdHJ1ZQorfQorCitmbGFnIHsKKyAgICBuYW1lOiAiZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCIKKyAgICBuYW1lc3BhY2U6ICJhY29uZmlnX3Rlc3QiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGZsYWcgaXMgZml4ZWQgRU5BQkxFRCArIFJFQURfT05MWSBhbmQgZXhwb3J0ZWQiCisgICAgYnVnOiAiMTExIgorICAgIGlzX2ZpeGVkX3JlYWRfb25seTogdHJ1ZQorICAgIGlzX2V4cG9ydGVkOiB0cnVlCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3Rlc3RfZXhwb3J0ZWQuYWNvbmZpZyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy90ZXN0X2V4cG9ydGVkLmFjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBmMjNhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy90ZXN0X2V4cG9ydGVkLmFjb25maWcKQEAgLTAsMCArMSwxNyBAQAorcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5leHBvcnRlZCIKK2NvbnRhaW5lcjogInN5c3RlbSIKKworZmxhZyB7CisgICAgbmFtZTogImV4cG9ydGVkX2ZsYWciCisgICAgbmFtZXNwYWNlOiAiYWNvbmZpZ190ZXN0IgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBpcyBhbiBleHBvcnRlZCBmbGFnIgorICAgIGlzX2V4cG9ydGVkOiB0cnVlCisgICAgYnVnOiAiODg4IgorfQorCitmbGFnIHsKKyAgICBuYW1lOiAibm90X2V4cG9ydGVkX2ZsYWciCisgICAgbmFtZXNwYWNlOiAiYWNvbmZpZ190ZXN0IgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBmbGFnIGlzIG5vdCBleHBvcnRlZCIKKyAgICBidWc6ICI3NzciCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvdGVzdF9mb3JjZV9yZWFkX29ubHkuYWNvbmZpZyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy90ZXN0X2ZvcmNlX3JlYWRfb25seS5hY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YWIwZTIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvdGVzdF9mb3JjZV9yZWFkX29ubHkuYWNvbmZpZwpAQCAtMCwwICsxLDE3IEBACitwYWNrYWdlOiAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmZvcmNlcmVhZG9ubHkiCitjb250YWluZXI6ICJzeXN0ZW0iCisKK2ZsYWcgeworICAgIG5hbWU6ICJmcm9fZXhwb3J0ZWQiCisgICAgbmFtZXNwYWNlOiAiYWNvbmZpZ190ZXN0IgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBpcyBhbiBleHBvcnRlZCBmbGFnIgorICAgIGlzX2V4cG9ydGVkOiB0cnVlCisgICAgYnVnOiAiODg4IgorfQorCitmbGFnIHsKKyAgICBuYW1lOiAiZnJvX3J3IgorICAgIG5hbWVzcGFjZTogImFjb25maWdfdGVzdCIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgZmxhZyBpcyBub3QgZXhwb3J0ZWQiCisgICAgYnVnOiAiNzc3IgorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3Rlc3Rfc2Vjb25kX3BhY2thZ2UuYWNvbmZpZyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy90ZXN0X3NlY29uZF9wYWNrYWdlLmFjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg4YmM5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy90ZXN0X3NlY29uZF9wYWNrYWdlLmFjb25maWcKQEAgLTAsMCArMSwxMCBAQAorcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcuc2Vjb25kX3Rlc3QiCitjb250YWluZXI6ICJzeXN0ZW0iCisKK2ZsYWcgeworICAgIG5hbWU6ICJ0ZXN0aW5nX2ZsYWciCisgICAgbmFtZXNwYWNlOiAiYW5vdGhlcl9uYW1lc3BhY2UiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIGEgZmxhZyBmb3IgdGVzdGluZy4iCisgICAgYnVnOiAiMTIzIgorfQorCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvdGhpcmQudmFsdWVzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3RoaXJkLnZhbHVlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzU4MzJhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3RoaXJkLnZhbHVlcwpAQCAtMCwwICsxLDYgQEAKK2ZsYWdfdmFsdWUgeworICAgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnNlY29uZF90ZXN0IgorICAgIG5hbWU6ICJ0ZXN0aW5nX2ZsYWciCisgICAgc3RhdGU6IERJU0FCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9XUklURQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MzE0NTAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMDEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCit9CisKK3J1c3RfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJhY29uZmlnX2RldmljZV9wYXRocy5kZWZhdWx0cyIsCisgICAgZWRpdGlvbjogIjIwMjEiLAorICAgIGNsaXBweV9saW50czogImFuZHJvaWQiLAorICAgIGxpbnRzOiAiYW5kcm9pZCIsCisgICAgc3JjczogWyJzcmMvbGliLnJzIl0sCisgICAgcnVzdGxpYnM6IFsKKyAgICAgICAgImxpYmFjb25maWdfcHJvdG9zIiwKKyAgICAgICAgImxpYmFueWhvdyIsCisgICAgICAgICJsaWJwcm90b2J1ZiIsCisgICAgXSwKK30KKworcnVzdF9saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliYWNvbmZpZ19kZXZpY2VfcGF0aHMiLAorICAgIGNyYXRlX25hbWU6ICJhY29uZmlnX2RldmljZV9wYXRocyIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgZGVmYXVsdHM6IFsibGliYWNvbmZpZ19kZXZpY2VfcGF0aHMuZGVmYXVsdHMiXSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5jb25maWdpbmZyYXN0cnVjdHVyZSIsCisgICAgXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIzNCIsCit9CisKK2dlbnJ1bGUgeworICAgIG5hbWU6ICJsaWJhY29uZmlnX2phdmFfZGV2aWNlX3BhdGhzX3NyYyIsCisgICAgc3JjczogWyJzcmMvRGV2aWNlUHJvdG9zVGVtcGxhdGUuamF2YSJdLAorICAgIG91dDogWyJEZXZpY2VQcm90b3MuamF2YSJdLAorICAgIHRvb2xfZmlsZXM6IFsicGFydGl0aW9uX2Fjb25maWdfZmxhZ3NfcGF0aHMudHh0Il0sCisgICAgY21kOiAic2VkIC1lICcvVEVNUExBVEUve3IkKGxvY2F0aW9uIHBhcnRpdGlvbl9hY29uZmlnX2ZsYWdzX3BhdGhzLnR4dCknIC1lICdkfScgJChpbikgPiAkKG91dCkiLAorfQorCitqYXZhX2xpYnJhcnkgeworICAgIG5hbWU6ICJhY29uZmlnX2RldmljZV9wYXRoc19qYXZhIiwKKyAgICBzcmNzOiBbIjpsaWJhY29uZmlnX2phdmFfZGV2aWNlX3BhdGhzX3NyYyJdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhY29uZmlnX2phdmFfcHJvdG9fbmFubyIsCisgICAgXSwKKyAgICBzZGtfdmVyc2lvbjogImNvcmVfcGxhdGZvcm0iLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLmNvbmZpZ2luZnJhc3RydWN0dXJlIiwKKyAgICBdLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjM0IiwKK30KKworZ2VucnVsZSB7CisgICAgbmFtZTogImxpYmFjb25maWdfamF2YV9ob3N0X2RldmljZV9wYXRoc19zcmMiLAorICAgIHNyY3M6IFsic3JjL0hvc3REZXZpY2VQcm90b3NUZW1wbGF0ZS5qYXZhIl0sCisgICAgb3V0OiBbIkhvc3REZXZpY2VQcm90b3MuamF2YSJdLAorICAgIHRvb2xfZmlsZXM6IFsKKyAgICAgICAgInBhcnRpdGlvbl9hY29uZmlnX2ZsYWdzX3BhdGhzLnR4dCIsCisgICAgICAgICJtYWlubGluZV9hY29uZmlnX2ZsYWdzX3BhdGhzLnR4dCIsCisgICAgXSwKKyAgICBjbWQ6ICJzZWQgLWUgJy9URU1QTEFURS97ciQobG9jYXRpb24gcGFydGl0aW9uX2Fjb25maWdfZmxhZ3NfcGF0aHMudHh0KScgLWUgJ2R9JyAkKGluKSA+ICQob3V0KS50bXAgJiYgIiArCisgICAgInNlZCAtZSAnL01BSU5MSU5FX1Qve3IkKGxvY2F0aW9uIG1haW5saW5lX2Fjb25maWdfZmxhZ3NfcGF0aHMudHh0KScgLWUgJ2R9JyAkKG91dCkudG1wID4gJChvdXQpIiwKK30KKworamF2YV9saWJyYXJ5X2hvc3QgeworICAgIG5hbWU6ICJhY29uZmlnX2hvc3RfZGV2aWNlX3BhdGhzX2phdmEiLAorICAgIHNyY3M6IFsiOmxpYmFjb25maWdfamF2YV9ob3N0X2RldmljZV9wYXRoc19zcmMiXSwKK30KKworZ2VucnVsZSB7CisgICAgbmFtZTogImphdmFfZGV2aWNlX3BhdGhzX3Rlc3RfdXRpbF9zcmMiLAorICAgIHNyY3M6IFsic3JjL0RldmljZVByb3Rvc1Rlc3RVdGlsVGVtcGxhdGUuamF2YSJdLAorICAgIG91dDogWyJEZXZpY2VQcm90b3NUZXN0VXRpbC5qYXZhIl0sCisgICAgdG9vbF9maWxlczogWyJwYXJ0aXRpb25fYWNvbmZpZ19mbGFnc19wYXRocy50eHQiXSwKKyAgICBjbWQ6ICJzZWQgLWUgJy9URU1QTEFURS97ciQobG9jYXRpb24gcGFydGl0aW9uX2Fjb25maWdfZmxhZ3NfcGF0aHMudHh0KScgLWUgJ2R9JyAkKGluKSA+ICQob3V0KSIsCit9CisKK2phdmFfbGlicmFyeSB7CisgICAgbmFtZTogImFjb25maWdfZGV2aWNlX3BhdGhzX2phdmFfdXRpbCIsCisgICAgc3JjczogWyI6amF2YV9kZXZpY2VfcGF0aHNfdGVzdF91dGlsX3NyYyJdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhY29uZmlnX2phdmFfcHJvdG9fbmFubyIsCisgICAgXSwKKyAgICBzZGtfdmVyc2lvbjogImNvcmVfcGxhdGZvcm0iLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9DYXJnby50b21sIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9DYXJnby50b21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZTliM2EKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL0NhcmdvLnRvbWwKQEAgLTAsMCArMSw5IEBACitbcGFja2FnZV0KK25hbWUgPSAiYWNvbmZpZ19kZXZpY2VfcGF0aHMiCit2ZXJzaW9uID0gIjAuMS4wIgorZWRpdGlvbiA9ICIyMDIxIgorCisjIFNlZSBtb3JlIGtleXMgYW5kIHRoZWlyIGRlZmluaXRpb25zIGF0IGh0dHBzOi8vZG9jLnJ1c3QtbGFuZy5vcmcvY2FyZ28vcmVmZXJlbmNlL21hbmlmZXN0Lmh0bWwKKworW2RlcGVuZGVuY2llc10KK2FueWhvdyA9ICIxLjAuODIiCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL21haW5saW5lX2Fjb25maWdfZmxhZ3NfcGF0aHMudHh0IGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9tYWlubGluZV9hY29uZmlnX2ZsYWdzX3BhdGhzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWQyYjIzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9tYWlubGluZV9hY29uZmlnX2ZsYWdzX3BhdGhzLnR4dApAQCAtMCwwICsxLDIwIEBACisiL2FwZXgvY29tLmFuZHJvaWQuYWRzZXJ2aWNlcy9ldGMvYWNvbmZpZ19mbGFncy5wYiIsCisiL2FwZXgvY29tLmFuZHJvaWQuYXBwc2VhcmNoL2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKKyIvYXBleC9jb20uYW5kcm9pZC5hcnQvZXRjL2Fjb25maWdfZmxhZ3MucGIiLAorIi9hcGV4L2NvbS5hbmRyb2lkLmJ0L2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKKyIvYXBleC9jb20uYW5kcm9pZC5jZWxsYnJvYWRjYXN0L2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKKyIvYXBleC9jb20uYW5kcm9pZC5jb25maWdpbmZyYXN0cnVjdHVyZS9ldGMvYWNvbmZpZ19mbGFncy5wYiIsCisiL2FwZXgvY29tLmFuZHJvaWQuY29uc2NyeXB0L2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKKyIvYXBleC9jb20uYW5kcm9pZC5kZXZpY2Vsb2NrL2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKKyIvYXBleC9jb20uYW5kcm9pZC5oZWFsdGhmaXRuZXNzL2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKKyIvYXBleC9jb20uYW5kcm9pZC5pcHNlYy9ldGMvYWNvbmZpZ19mbGFncy5wYiIsCisiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEvZXRjL2Fjb25maWdfZmxhZ3MucGIiLAorIi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhcHJvdmlkZXIvZXRjL2Fjb25maWdfZmxhZ3MucGIiLAorIi9hcGV4L2NvbS5hbmRyb2lkLm9uZGV2aWNlcGVyc29uYWxpemF0aW9uL2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKKyIvYXBleC9jb20uYW5kcm9pZC5vcy5zdGF0c2QvZXRjL2Fjb25maWdfZmxhZ3MucGIiLAorIi9hcGV4L2NvbS5hbmRyb2lkLnBlcm1pc3Npb24vZXRjL2Fjb25maWdfZmxhZ3MucGIiLAorIi9hcGV4L2NvbS5hbmRyb2lkLnByb2ZpbGluZy9ldGMvYWNvbmZpZ19mbGFncy5wYiIsCisiL2FwZXgvY29tLmFuZHJvaWQudGV0aGVyaW5nL2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKKyIvYXBleC9jb20uYW5kcm9pZC51d2IvZXRjL2Fjb25maWdfZmxhZ3MucGIiLAorIi9hcGV4L2NvbS5hbmRyb2lkLnZpcnQvZXRjL2Fjb25maWdfZmxhZ3MucGIiLAorIi9hcGV4L2NvbS5hbmRyb2lkLndpZmkvZXRjL2Fjb25maWdfZmxhZ3MucGIiLApkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9wYXJ0aXRpb25fYWNvbmZpZ19mbGFnc19wYXRocy50eHQgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3BhcnRpdGlvbl9hY29uZmlnX2ZsYWdzX3BhdGhzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTk3ZTNkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9wYXJ0aXRpb25fYWNvbmZpZ19mbGFnc19wYXRocy50eHQKQEAgLTAsMCArMSwzIEBACisiL3N5c3RlbS9ldGMvYWNvbmZpZ19mbGFncy5wYiIsCisiL3Byb2R1Y3QvZXRjL2Fjb25maWdfZmxhZ3MucGIiLAorIi92ZW5kb3IvZXRjL2Fjb25maWdfZmxhZ3MucGIiLApkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9zcmMvRGV2aWNlUHJvdG9zVGVtcGxhdGUuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvc3JjL0RldmljZVByb3Rvc1RlbXBsYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ0MTE5OQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvc3JjL0RldmljZVByb3Rvc1RlbXBsYXRlLmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZzsKKworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5uYW5vLkFjb25maWcucGFyc2VkX2ZsYWc7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLm5hbm8uQWNvbmZpZy5wYXJzZWRfZmxhZ3M7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIERldmljZVByb3RvcyB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQQVRIUyA9IHsKKyAgICAgICAgVEVNUExBVEUKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQRVhfRElSID0gIi9hcGV4IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBFWF9BQ09ORklHX1BBVEhfU1VGRklYID0gIi9ldGMvYWNvbmZpZ19mbGFncy5wYiI7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgb24tZGV2aWNlIGFjb25maWcgcHJvdG9zLgorICAgICAqCisgICAgICogTWF5IHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgcHJvdG9zIGNhbid0IGJlIHJlYWQgYXQgdGhlIGNhbGwgc2l0ZS4gRm9yCisgICAgICogZXhhbXBsZSwgc29tZSBvZiB0aGUgcHJvdG9zIGFyZSBpbiB0aGUgYXBleC8gcGFydGl0aW9uLCB3aGljaCBpcyBtb3VudGVkCisgICAgICogc29tZXdoYXQgbGF0ZSBpbiB0aGUgYm9vdCBwcm9jZXNzLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB3ZSBjYW4ndCByZWFkIG9uZSBvZiB0aGUgcHJvdG9zIHlldAorICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGFsbCBvbi1kZXZpY2UgYWNvbmZpZyBwcm90b3MKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8cGFyc2VkX2ZsYWc+IGxvYWRBbmRQYXJzZUZsYWdQcm90b3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBBcnJheUxpc3Q8cGFyc2VkX2ZsYWc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgICAgICBmb3IgKFN0cmluZyBwYXRoIDogcGFyc2VkRmxhZ3NQcm90b1BhdGhzKCkpIHsKKyAgICAgICAgICAgIHRyeSAoRmlsZUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKSkgeworICAgICAgICAgICAgICAgIHBhcnNlZF9mbGFncyBwYXJzZWRGbGFncyA9IHBhcnNlZF9mbGFncy5wYXJzZUZyb20oaW5wdXRTdHJlYW0ucmVhZEFsbEJ5dGVzKCkpOworICAgICAgICAgICAgICAgIGZvciAocGFyc2VkX2ZsYWcgZmxhZyA6IHBhcnNlZEZsYWdzLnBhcnNlZEZsYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChmbGFnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIG9uLWRldmljZSBhY29uZmlnIHByb3RvcyBwYXRocy4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IHBhcnNlZEZsYWdzUHJvdG9QYXRocygpIHsKKyAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gcGF0aHMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoUEFUSFMpKTsKKworICAgICAgICBGaWxlIGFwZXhEaXJlY3RvcnkgPSBuZXcgRmlsZShBUEVYX0RJUik7CisgICAgICAgIGlmICghYXBleERpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICByZXR1cm4gcGF0aHM7CisgICAgICAgIH0KKworICAgICAgICBGaWxlW10gc3ViZGlycyA9IGFwZXhEaXJlY3RvcnkubGlzdEZpbGVzKCk7CisgICAgICAgIGlmIChzdWJkaXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXRoczsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoRmlsZSBwcmVmaXggOiBzdWJkaXJzKSB7CisgICAgICAgICAgICAvLyBGb3IgZWFjaCBtYWlubGluZSBtb2R1bGVzLCB0aGVyZSBhcmUgdHdvIGRpcmVjdG9yaWVzLCBvbmUgPG1vZHVsZXBhY2thZ2U+LywKKyAgICAgICAgICAgIC8vIGFuZCBvbmUgPG1vZHVsZXBhY2thZ2U+QDx2ZXJzaW9uY29kZT4vLiBKdXN0IHJlYWQgdGhlIGZvcm1lci4KKyAgICAgICAgICAgIGlmIChwcmVmaXguZ2V0QWJzb2x1dGVQYXRoKCkuY29udGFpbnMoIkAiKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGaWxlIHByb3RvUGF0aCA9IG5ldyBGaWxlKHByZWZpeCArIEFQRVhfQUNPTkZJR19QQVRIX1NVRkZJWCk7CisgICAgICAgICAgICBpZiAoIXByb3RvUGF0aC5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYXRocy5hZGQocHJvdG9QYXRoLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGF0aHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9zcmMvRGV2aWNlUHJvdG9zVGVzdFV0aWxUZW1wbGF0ZS5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9zcmMvRGV2aWNlUHJvdG9zVGVzdFV0aWxUZW1wbGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMTEzZGYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3NyYy9EZXZpY2VQcm90b3NUZXN0VXRpbFRlbXBsYXRlLmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZzsKKworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5uYW5vLkFjb25maWcucGFyc2VkX2ZsYWc7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLm5hbm8uQWNvbmZpZy5wYXJzZWRfZmxhZ3M7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKiBAaGlkZSAqLworcHVibGljIGNsYXNzIERldmljZVByb3Rvc1Rlc3RVdGlsIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBBVEhTID0geworICAgICAgICBURU1QTEFURQorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBFWF9ESVIgPSAiL2FwZXgvIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBFWF9BQ09ORklHX1BBVEhfU1VGRklYID0gIi9ldGMvYWNvbmZpZ19mbGFncy5wYiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9BUEVYX0RJUiA9ICIvc3lzdGVtL2FwZXgiOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIG9uLWRldmljZSBhY29uZmlnIHByb3Rvcy4KKyAgICAgKgorICAgICAqIDxwPk1heSB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHByb3RvcyBjYW4ndCBiZSByZWFkIGF0IHRoZSBjYWxsIHNpdGUuIEZvciBleGFtcGxlLCBzb21lIG9mCisgICAgICogdGhlIHByb3RvcyBhcmUgaW4gdGhlIGFwZXgvIHBhcnRpdGlvbiwgd2hpY2ggaXMgbW91bnRlZCBzb21ld2hhdCBsYXRlIGluIHRoZSBib290IHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHdlIGNhbid0IHJlYWQgb25lIG9mIHRoZSBwcm90b3MgeWV0CisgICAgICogQHJldHVybiBhIGxpc3Qgb2YgYWxsIG9uLWRldmljZSBhY29uZmlnIHByb3RvcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxwYXJzZWRfZmxhZz4gbG9hZEFuZFBhcnNlRmxhZ1Byb3RvcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEFycmF5TGlzdDxwYXJzZWRfZmxhZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgICAgIGZvciAoU3RyaW5nIHBhdGggOiBwYXJzZWRGbGFnc1Byb3RvUGF0aHMoKSkgeworICAgICAgICAgICAgdHJ5IChGaWxlSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgpKSB7CisgICAgICAgICAgICAgICAgcGFyc2VkX2ZsYWdzIHBhcnNlZEZsYWdzID0gcGFyc2VkX2ZsYWdzLnBhcnNlRnJvbShpbnB1dFN0cmVhbS5yZWFkQWxsQnl0ZXMoKSk7CisgICAgICAgICAgICAgICAgZm9yIChwYXJzZWRfZmxhZyBmbGFnIDogcGFyc2VkRmxhZ3MucGFyc2VkRmxhZykgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGZsYWcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgb24tZGV2aWNlIGFjb25maWcgcHJvdG9zIHBhdGhzLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBwYXJzZWRGbGFnc1Byb3RvUGF0aHMoKSB7CisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHBhdGhzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KFBBVEhTKSk7CisKKyAgICAgICAgRmlsZSBhcGV4RGlyZWN0b3J5ID0gbmV3IEZpbGUoU1lTVEVNX0FQRVhfRElSKTsKKyAgICAgICAgaWYgKCFhcGV4RGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXRoczsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGVbXSBzdWJkaXJzID0gYXBleERpcmVjdG9yeS5saXN0RmlsZXMoKTsKKyAgICAgICAgaWYgKHN1YmRpcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHBhdGhzOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChGaWxlIHByZWZpeCA6IHN1YmRpcnMpIHsKKyAgICAgICAgICAgIC8vIEZvciBlYWNoIG1haW5saW5lIG1vZHVsZXMsIHRoZXJlIGFyZSB0d28gZGlyZWN0b3JpZXMsIG9uZSA8bW9kdWxlcGFja2FnZT4vLAorICAgICAgICAgICAgLy8gYW5kIG9uZSA8bW9kdWxlcGFja2FnZT5APHZlcnNpb25jb2RlPi8uIEp1c3QgcmVhZCB0aGUgZm9ybWVyLgorICAgICAgICAgICAgaWYgKCFwcmVmaXguZ2V0QWJzb2x1dGVQYXRoKCkuZW5kc1dpdGgoIi5hcGV4IikpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGFwZXhOYW1lID0gcHJlZml4LmdldE5hbWUoKS5yZXBsYWNlKCJjb20uZ29vZ2xlIiwgImNvbSIpOworICAgICAgICAgICAgYXBleE5hbWUgPSBhcGV4TmFtZS5zdWJzdHJpbmcoMCwgYXBleE5hbWUubGVuZ3RoKCkgLSA1KTsKKworICAgICAgICAgICAgRmlsZSBwcm90b1BhdGggPSBuZXcgRmlsZShBUEVYX0RJUiArIGFwZXhOYW1lICsgQVBFWF9BQ09ORklHX1BBVEhfU1VGRklYKTsKKyAgICAgICAgICAgIGlmICghcHJvdG9QYXRoLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBhdGhzLmFkZChwcm90b1BhdGguZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXRoczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3NyYy9Ib3N0RGV2aWNlUHJvdG9zVGVtcGxhdGUuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvc3JjL0hvc3REZXZpY2VQcm90b3NUZW1wbGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZDBhNzYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3NyYy9Ib3N0RGV2aWNlUHJvdG9zVGVtcGxhdGUuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworLyoqCisgKiBBIGhvc3QgbGliIHRoYXQgY2FuIHJlYWQgYWxsIGFjb25maWcgcHJvdG8gZmlsZSBwYXRocyBvbiBhIGdpdmVuIGRldmljZS4KKyAqIFRoaXMgbGliIGlzIG9ubHkgYXZhaWxhYmxlIG9uIGRldmljZSB3aXRoIHJvb3QgYWNjZXNzICh1c2VyZGVidWcvZW5nKS4KKyAqLworcHVibGljIGNsYXNzIEhvc3REZXZpY2VQcm90b3MgeworICAgIC8qKgorICAgICAqIEFuIGludGVyZmFjZSB0aGF0IGV4ZWN1dGVzIEFEQiBjb21tYW5kIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBBZGJDb21tYW5kRXhlY3V0b3IgeworICAgICAgICAvKiogRXhlY3V0ZXMgdGhlIEFEQiBjb21tYW5kLiAqLworICAgICAgICBTdHJpbmcgZXhlY3V0ZUFkYkNvbW1hbmQoU3RyaW5nIGNvbW1hbmQpOworICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQQVRIUyA9IHsKKyAgICAgICAgVEVNUExBVEUKKyAgICB9OworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE1BSU5MSU5FX1BBVEhTID0geworICAgICAgICBNQUlOTElORV9UCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUEVYX0RJUiA9ICIvYXBleCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQ1VSU0lWRUxZX0xJU1RfQVBFWF9ESVJfQ09NTUFORCA9CisgICAgICAgICJzaGVsbCBzdSAwIGZpbmQgL2FwZXggfCBncmVwIGFjb25maWdfZmxhZ3MiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUEVYX0FDT05GSUdfUEFUSF9TVUZGSVggPSAiL2V0Yy9hY29uZmlnX2ZsYWdzLnBiIjsKKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgb24tZGV2aWNlIGFjb25maWcgcHJvdG8gcGF0aHMgZnJvbSBob3N0IHNpZGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gcGFyc2VkRmxhZ3NQcm90b1BhdGhzKEFkYkNvbW1hbmRFeGVjdXRvciBhZGJDb21tYW5kRXhlY3V0b3IpIHsKKyAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gcGF0aHMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoUEFUSFMpKTsKKworICAgICAgICBTdHJpbmcgYWRiQ29tbWFuZE91dHB1dCA9IGFkYkNvbW1hbmRFeGVjdXRvci5leGVjdXRlQWRiQ29tbWFuZCgKKyAgICAgICAgICAgIFJFQ1VSU0lWRUxZX0xJU1RfQVBFWF9ESVJfQ09NTUFORCk7CisKKyAgICAgICAgaWYgKGFkYkNvbW1hbmRPdXRwdXQgPT0gbnVsbCB8fCBhZGJDb21tYW5kT3V0cHV0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcGF0aHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoTUFJTkxJTkVfUEFUSFMpKTsKKyAgICAgICAgICAgIHJldHVybiBwYXRoczsKKyAgICAgICAgfQorCisgICAgICAgIFNldDxTdHJpbmc+IGFsbEZpbGVzID0gbmV3IEhhc2hTZXQ8PihBcnJheXMuYXNMaXN0KGFkYkNvbW1hbmRPdXRwdXQuc3BsaXQoIlxuIikpKTsKKworICAgICAgICBTZXQ8U3RyaW5nPiBzdWJkaXJzID0gYWxsRmlsZXMuc3RyZWFtKCkubWFwKGZpbGUgLT4geworICAgICAgICAgICAgU3RyaW5nW10gZmlsZVBhdGhzID0gZmlsZS5zcGxpdCgiLyIpOworICAgICAgICAgICAgLy8gVGhlIGZpcnN0IGVsZW1lbnQgaXMgIiIsIHRoZSBzZWNvbmQgZWxlbWVudCBpcyAiYXBleCIuCisgICAgICAgICAgICByZXR1cm4gZmlsZVBhdGhzLmxlbmd0aCA+IDIgPyBmaWxlUGF0aHNbMl0gOiAiIjsKKyAgICAgICAgfSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworCisgICAgICAgIGZvciAoU3RyaW5nIHByZWZpeCA6IHN1YmRpcnMpIHsKKyAgICAgICAgICAgIC8vIEZvciBlYWNoIG1haW5saW5lIG1vZHVsZXMsIHRoZXJlIGFyZSB0d28gZGlyZWN0b3JpZXMsIG9uZSA8bW9kdWxlcGFja2FnZT4vLAorICAgICAgICAgICAgLy8gYW5kIG9uZSA8bW9kdWxlcGFja2FnZT5APHZlcnNpb25jb2RlPi8uIEp1c3QgcmVhZCB0aGUgZm9ybWVyLgorICAgICAgICAgICAgaWYgKHByZWZpeC5jb250YWlucygiQCIpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBwcm90b1BhdGggPSBBUEVYX0RJUiArICIvIiArIHByZWZpeCArIEFQRVhfQUNPTkZJR19QQVRIX1NVRkZJWDsKKyAgICAgICAgICAgIGlmIChhbGxGaWxlcy5jb250YWlucyhwcm90b1BhdGgpKSB7CisgICAgICAgICAgICAgICAgcGF0aHMuYWRkKHByb3RvUGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhdGhzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvc3JjL2xpYi5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvc3JjL2xpYi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODcxYjRmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9zcmMvbGliLnJzCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyEgTGlicmFyeSBmb3IgZmluZGluZyBhbGwgYWNvbmZpZyBvbi1kZXZpY2UgcHJvdG9idWYgZmlsZSBwYXRocy4KKwordXNlIGFueWhvdzo6UmVzdWx0OwordXNlIHN0ZDo6cGF0aDo6UGF0aEJ1ZjsKKwordXNlIHN0ZDo6ZnM7CisKK2ZuIHJlYWRfcGFydGl0aW9uX3BhdGhzKCkgLT4gVmVjPFBhdGhCdWY+IHsKKyAgICBpbmNsdWRlX3N0ciEoIi4uL3BhcnRpdGlvbl9hY29uZmlnX2ZsYWdzX3BhdGhzLnR4dCIpCisgICAgICAgIC5zcGxpdCgnLCcpCisgICAgICAgIC5tYXAofHN8IHMudHJpbSgpLnRyaW1fbWF0Y2hlcygnIicpKQorICAgICAgICAuZmlsdGVyKHxzfCAhcy5pc19lbXB0eSgpKQorICAgICAgICAubWFwKHxzfCBQYXRoQnVmOjpmcm9tKHMudG9fc3RyaW5nKCkpKQorICAgICAgICAuY29sbGVjdCgpCit9CisKKy8vLyBEZXRlcm1pbmVzIGFsbCBwYXRocyB0aGF0IGNvbnRhaW4gYW4gYWNvbmZpZyBwcm90b2J1ZiBmaWxlLAorLy8vIGZpbHRlcmluZyBvdXQgbm9uZXhpc3RlbnQgcGFydGl0aW9uIHByb3RvYnVmIGZpbGVzLgorcHViIGZuIHBhcnNlZF9mbGFnc19wcm90b19wYXRocygpIC0+IFJlc3VsdDxWZWM8UGF0aEJ1Zj4+IHsKKyAgICBsZXQgbXV0IHJlc3VsdDogVmVjPFBhdGhCdWY+ID0KKyAgICAgICAgcmVhZF9wYXJ0aXRpb25fcGF0aHMoKS5pbnRvX2l0ZXIoKS5maWx0ZXIofHN8IHMuZXhpc3RzKCkpLmNvbGxlY3QoKTsKKworICAgIGZvciBkaXIgaW4gZnM6OnJlYWRfZGlyKCIvYXBleCIpPyB7CisgICAgICAgIGxldCBkaXIgPSBkaXI/OworCisgICAgICAgIC8vIE9ubHkgc2NhbiB0aGUgY3VycmVudGx5IGFjdGl2ZSB2ZXJzaW9uIG9mIGVhY2ggbWFpbmxpbmUgbW9kdWxlOyBza2lwIHRoZSBAdmVyc2lvbiBkaXJzLgorICAgICAgICBpZiBkaXIuZmlsZV9uYW1lKCkuYXNfZW5jb2RlZF9ieXRlcygpLml0ZXIoKS5hbnkofCZifCBiID09IGInQCcpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgbGV0IG11dCBwYXRoID0gUGF0aEJ1Zjo6ZnJvbSgiL2FwZXgiKTsKKyAgICAgICAgcGF0aC5wdXNoKGRpci5wYXRoKCkpOworICAgICAgICBwYXRoLnB1c2goImV0YyIpOworICAgICAgICBwYXRoLnB1c2goImFjb25maWdfZmxhZ3MucGIiKTsKKyAgICAgICAgaWYgcGF0aC5leGlzdHMoKSB7CisgICAgICAgICAgICByZXN1bHQucHVzaChwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIE9rKHJlc3VsdCkKK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3JlYWRfcGFydGl0aW9uX3BhdGhzKCkgeworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcGFydGl0aW9uX3BhdGhzKCkubGVuKCksIDMpOworCisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX3BhcnRpdGlvbl9wYXRocygpLAorICAgICAgICAgICAgdmVjIVsKKyAgICAgICAgICAgICAgICBQYXRoQnVmOjpmcm9tKCIvc3lzdGVtL2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiksCisgICAgICAgICAgICAgICAgUGF0aEJ1Zjo6ZnJvbSgiL3Byb2R1Y3QvZXRjL2Fjb25maWdfZmxhZ3MucGIiKSwKKyAgICAgICAgICAgICAgICBQYXRoQnVmOjpmcm9tKCIvdmVuZG9yL2V0Yy9hY29uZmlnX2ZsYWdzLnBiIikKKyAgICAgICAgICAgIF0KKyAgICAgICAgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3Rlc3QvQW5kcm9pZC5icCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvdGVzdC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZjU2MWYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3Rlc3QvQW5kcm9pZC5icApAQCAtMCwwICsxLDM1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSB7CisgICAgZGVmYXVsdF90ZWFtOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9jb3JlX2V4cGVyaW1lbnRzIiwKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCit9CisKK2FuZHJvaWRfdGVzdCB7CisgICAgbmFtZTogImFjb25maWdfZGV2aWNlX3BhdGhzX2phdmFfdGVzdCIsCisgICAgc3JjczogWworICAgICAgICAic3JjLyoqLyouamF2YSIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZHgudGVzdC5ydW5uZXIiLAorICAgICAgICAianVuaXQiLAorICAgICAgICAiYWNvbmZpZ19kZXZpY2VfcGF0aHNfamF2YV91dGlsIiwKKyAgICBdLAorICAgIHRlc3Rfc3VpdGVzOiBbCisgICAgICAgICJnZW5lcmFsLXRlc3RzIiwKKyAgICBdLAorICAgIHBsYXRmb3JtX2FwaXM6IHRydWUsCisgICAgY2VydGlmaWNhdGU6ICJwbGF0Zm9ybSIsCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3Rlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvdGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMDE4NzkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3Rlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICB+IENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgIH4KKyAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIH4KKyAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICB+CisgIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAtLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0Ij4KKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0IiAvPgorCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy90ZXN0L3NyYy9EZXZpY2VQcm90b3NUZXN0VXRpbFRlc3QuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvdGVzdC9zcmMvRGV2aWNlUHJvdG9zVGVzdFV0aWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRkMGZkMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvdGVzdC9zcmMvRGV2aWNlUHJvdG9zVGVzdFV0aWxUZXN0LmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLkRldmljZVByb3Rvc1Rlc3RVdGlsOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5uYW5vLkFjb25maWcucGFyc2VkX2ZsYWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIERldmljZVByb3Rvc1Rlc3RVdGlsVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBQTEFURk9STV9DT05UQUlORVJTID0gU2V0Lm9mKCJzeXN0ZW0iLCAidmVuZG9yIiwgInByb2R1Y3QiKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERldmljZVByb3Rvc19sb2FkQW5kUGFyc2VGbGFnUHJvdG9zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8cGFyc2VkX2ZsYWc+IGZsYWdzID0gRGV2aWNlUHJvdG9zVGVzdFV0aWwubG9hZEFuZFBhcnNlRmxhZ1Byb3RvcygpOworICAgICAgICBpbnQgcGxhdGZvcm1GbGFncyA9IDA7CisgICAgICAgIGludCBtYWlubGluZUZsYWdzID0gMDsKKyAgICAgICAgZm9yIChwYXJzZWRfZmxhZyBwZiA6IGZsYWdzKSB7CisgICAgICAgICAgICBpZiAoUExBVEZPUk1fQ09OVEFJTkVSUy5jb250YWlucyhwZi5jb250YWluZXIpKSB7CisgICAgICAgICAgICAgICAgcGxhdGZvcm1GbGFncysrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtYWlubGluZUZsYWdzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRUcnVlKHBsYXRmb3JtRmxhZ3MgPiAzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYWlubGluZUZsYWdzID4gMyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2ZsYWdzL0FuZHJvaWQuYnAgYi90b29scy9hY29uZmlnL2Fjb25maWdfZmxhZ3MvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjRlMTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2ZsYWdzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3J1c3RfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmFjb25maWdfZmxhZ3MiLAorICAgIGNyYXRlX25hbWU6ICJhY29uZmlnX2ZsYWdzIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmMvbGliLnJzIiwKKyAgICBdLAorICAgIHJ1c3RsaWJzOiBbCisgICAgICAgICJsaWJhY29uZmlnX2ZsYWdzX3J1c3QiLAorICAgIF0sCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQuY29uZmlnaW5mcmFzdHJ1Y3R1cmUiLAorICAgIF0sCisgICAgbWluX3Nka192ZXJzaW9uOiAiMzQiLAorfQorCithY29uZmlnX2RlY2xhcmF0aW9ucyB7CisgICAgbmFtZTogImFjb25maWdfZmxhZ3MiLAorICAgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLmZsYWdzIiwKKyAgICBjb250YWluZXI6ICJzeXN0ZW0iLAorICAgIHNyY3M6IFsiZmxhZ3MuYWNvbmZpZyJdLAorfQorCitydXN0X2Fjb25maWdfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmFjb25maWdfZmxhZ3NfcnVzdCIsCisgICAgY3JhdGVfbmFtZTogImFjb25maWdfZmxhZ3NfcnVzdCIsCisgICAgYWNvbmZpZ19kZWNsYXJhdGlvbnM6ICJhY29uZmlnX2ZsYWdzIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5jb25maWdpbmZyYXN0cnVjdHVyZSIsCisgICAgXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIzNCIsCit9CisKK2NjX2Fjb25maWdfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmFjb25maWdfZmxhZ3NfY2MiLAorICAgIGFjb25maWdfZGVjbGFyYXRpb25zOiAiYWNvbmZpZ19mbGFncyIsCit9CisKK2phdmFfYWNvbmZpZ19saWJyYXJ5IHsKKyAgICBuYW1lOiAiYWNvbmZpZ19mbGFnc19qYXZhIiwKKyAgICBhY29uZmlnX2RlY2xhcmF0aW9uczogImFjb25maWdfZmxhZ3MiLAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2ZsYWdzL0NhcmdvLnRvbWwgYi90b29scy9hY29uZmlnL2Fjb25maWdfZmxhZ3MvQ2FyZ28udG9tbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWI5ZjE0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2ZsYWdzL0NhcmdvLnRvbWwKQEAgLTAsMCArMSwxMCBAQAorW3BhY2thZ2VdCituYW1lID0gImFjb25maWdfZmxhZ3MiCit2ZXJzaW9uID0gIjAuMS4wIgorZWRpdGlvbiA9ICIyMDIxIgorCitbZmVhdHVyZXNdCitkZWZhdWx0ID0gWyJjYXJnbyJdCitjYXJnbyA9IFtdCisKK1tkZXBlbmRlbmNpZXNdClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2ZsYWdzL2ZsYWdzLmFjb25maWcgYi90b29scy9hY29uZmlnL2Fjb25maWdfZmxhZ3MvZmxhZ3MuYWNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDg4YjVjCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2ZsYWdzL2ZsYWdzLmFjb25maWcKQEAgLTAsMCArMSw0MyBAQAorcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcuZmxhZ3MiCitjb250YWluZXI6ICJzeXN0ZW0iCisKK2ZsYWcgeworICBuYW1lOiAiZW5hYmxlX29ubHlfbmV3X3N0b3JhZ2UiCisgIG5hbWVzcGFjZTogImNvcmVfZXhwZXJpbWVudHNfdGVhbV9pbnRlcm5hbCIKKyAgYnVnOiAiMzEyMjM1NTk2IgorICBkZXNjcmlwdGlvbjogIldoZW4gZW5hYmxlZCwgYWNvbmZpZyBmbGFncyBhcmUgcmVhZCBmcm9tIHRoZSBuZXcgYWNvbmZpZyBzdG9yYWdlIG9ubHkuIgorfQorCitmbGFnIHsKKyAgbmFtZTogImVuYWJsZV9hY29uZmlnZF9mcm9tX21haW5saW5lIgorICBuYW1lc3BhY2U6ICJjb3JlX2V4cGVyaW1lbnRzX3RlYW1faW50ZXJuYWwiCisgIGJ1ZzogIjM2OTgwODgwNSIKKyAgZGVzY3JpcHRpb246ICJXaGVuIGVuYWJsZWQsIGxhdW5jaCBhY29uZmlnZCBmcm9tIGNvbmZpZyBpbmZyYSBtb2R1bGUuIgorfQorCitmbGFnIHsKKyAgbmFtZTogInRvb2xzX3JlYWRfZnJvbV9uZXdfc3RvcmFnZSIKKyAgbmFtZXNwYWNlOiAiY29yZV9leHBlcmltZW50c190ZWFtX2ludGVybmFsIgorICBidWc6ICIzNzA0OTk2NDAiCisgIGRlc2NyaXB0aW9uOiAiV2hlbiBlbmFibGVkLCB0b29scyByZWFkIGRpcmVjdGx5IGZyb20gdGhlIG5ldyBhY29uZmlnIHN0b3JhZ2UuIgorfQorCitmbGFnIHsKKyAgbmFtZTogInRvb2xzX3JlYWRfZnJvbV9uZXdfc3RvcmFnZV9idWdmaXgiCisgIG5hbWVzcGFjZTogImNvcmVfZXhwZXJpbWVudHNfdGVhbV9pbnRlcm5hbCIKKyAgYnVnOiAiMzcwNDk5NjQwIgorICBkZXNjcmlwdGlvbjogIldoZW4gZW5hYmxlZCwgdG9vbHMgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBuZXcgYWNvbmZpZyBzdG9yYWdlLiIKKyAgbWV0YWRhdGEgeworICAgIHB1cnBvc2U6IFBVUlBPU0VfQlVHRklYCisgIH0KK30KKworZmxhZyB7CisgIG5hbWU6ICJpbnZva2VfdXBkYXRhYmxlX2FmbGFncyIKKyAgbmFtZXNwYWNlOiAiY29yZV9leHBlcmltZW50c190ZWFtX2ludGVybmFsIgorICBidWc6ICIzODUzODM4OTkiCisgIGRlc2NyaXB0aW9uOiAiV2hlbiBlbmFibGVkLCB0aGUgc3lzdGVtIGFmbGFncyBiaW5hcnkgaW52b2tlcyB0aGUgdXBkYXRhYmxlIGFmbGFncy4iCisgIG1ldGFkYXRhIHsKKyAgICBwdXJwb3NlOiBQVVJQT1NFX0JVR0ZJWAorICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfZmxhZ3Mvc3JjL2xpYi5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19mbGFncy9zcmMvbGliLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNTA3YWUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfZmxhZ3Mvc3JjL2xpYi5ycwpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8hIGBhY29uZmlnX2ZsYWdzYCBpcyBhIGNyYXRlIGZvciByZWFkaW5nIGFjb25maWcgZmxhZ3MgZnJvbSBSdXN0CisvLyBXaGVuIGJ1aWxkaW5nIHdpdGggdGhlIEFuZHJvaWQgdG9vbC1jaGFpbgorLy8KKy8vICAgLSB0aGUgZmxhZyBmdW5jdGlvbnMgd2lsbCByZWFkIGZyb20gYWNvbmZpZ19mbGFnc19pbm5lcgorLy8gICAtIHRoZSBmZWF0dXJlICJjYXJnbyIgd2lsbCBiZSBkaXNhYmxlZAorLy8KKy8vIFdoZW4gYnVpbGRpbmcgd2l0aCBjYXJnbworLy8KKy8vICAgLSB0aGUgZmxhZyBmdW5jdGlvbnMgd2lsbCBhbGwgcmV0dXJuIHNvbWUgdHJpdmlhbCB2YWx1ZSwgbGlrZSB0cnVlCisvLyAgIC0gdGhlIGZlYXR1cmUgImNhcmdvIiB3aWxsIGJlIGVuYWJsZWQKKy8vCisvLyBUaGlzIG1vZHVsZSBoaWRlcyB0aGVzZSBkaWZmZXJlbmNlcyBmcm9tIHRoZSByZXN0IG9mIGFjb25maWcuCisKKy8vLyBNb2R1bGUgdXNlZCB3aGVuIGJ1aWxkaW5nIHdpdGggdGhlIEFuZHJvaWQgdG9vbC1jaGFpbgorI1tjZmcobm90KGZlYXR1cmUgPSAiY2FyZ28iKSldCitwdWIgbW9kIGF1dG9fZ2VuZXJhdGVkIHsKKyAgICAvLy8gUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBlbmFibGVfb25seV9uZXdfc3RvcmFnZSBmbGFnLgorICAgIHB1YiBmbiBlbmFibGVfb25seV9uZXdfc3RvcmFnZSgpIC0+IGJvb2wgeworICAgICAgICBhY29uZmlnX2ZsYWdzX3J1c3Q6OmVuYWJsZV9vbmx5X25ld19zdG9yYWdlKCkKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBlbmFibGVfYWNvbmZpZ2RfZnJvbV9tYWlubGluZSBmbGFnLgorICAgIHB1YiBmbiBlbmFibGVfYWNvbmZpZ2RfZnJvbV9tYWlubGluZSgpIC0+IGJvb2wgeworICAgICAgICBhY29uZmlnX2ZsYWdzX3J1c3Q6OmVuYWJsZV9vbmx5X25ld19zdG9yYWdlKCkKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBpbnZva2VfdXBkYXRhYmxlX2FmbGFncyBmbGFnLgorICAgIHB1YiBmbiBpbnZva2VfdXBkYXRhYmxlX2FmbGFncygpIC0+IGJvb2wgeworICAgICAgICBhY29uZmlnX2ZsYWdzX3J1c3Q6Omludm9rZV91cGRhdGFibGVfYWZsYWdzKCkKKyAgICB9Cit9CisKKy8vLyBNb2R1bGUgdXNlZCB3aGVuIGJ1aWxkaW5nIHdpdGggY2FyZ28KKyNbY2ZnKGZlYXR1cmUgPSAiY2FyZ28iKV0KK3B1YiBtb2QgYXV0b19nZW5lcmF0ZWQgeworICAgIC8vLyBSZXR1cm5zIGEgcGxhY2Vob2xkZXIgdmFsdWUgZm9yIHRoZSBlbmFibGVfb25seV9uZXdfc3RvcmFnZSBmbGFnLgorICAgIHB1YiBmbiBlbmFibGVfb25seV9uZXdfc3RvcmFnZSgpIC0+IGJvb2wgeworICAgICAgICAvLyBVc2VkIG9ubHkgdG8gZW5hYmxlIHR5cGVjaGVja2luZyBhbmQgdGVzdGluZyB3aXRoIGNhcmdvCisgICAgICAgIHRydWUKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyBhIHBsYWNlaG9sZGVyIHZhbHVlIGZvciB0aGUgZW5hYmxlX2Fjb25maWdkX2Zyb21fbWFpbmxpbmUgZmxhZy4KKyAgICBwdWIgZm4gZW5hYmxlX2Fjb25maWdkX2Zyb21fbWFpbmxpbmUoKSAtPiBib29sIHsKKyAgICAgICAgLy8gVXNlZCBvbmx5IHRvIGVuYWJsZSB0eXBlY2hlY2tpbmcgYW5kIHRlc3Rpbmcgd2l0aCBjYXJnbworICAgICAgICB0cnVlCisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgaW52b2tlX3VwZGF0YWJsZV9hZmxhZ3MgZmxhZy4KKyAgICBwdWIgZm4gaW52b2tlX3VwZGF0YWJsZV9hZmxhZ3MoKSAtPiBib29sIHsKKyAgICAgICAgLy8gVXNlZCBvbmx5IHRvIGVuYWJsZSB0eXBlY2hlY2tpbmcgYW5kIHRlc3Rpbmcgd2l0aCBjYXJnbworICAgICAgICB0cnVlCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3Byb3Rvcy9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3Byb3Rvcy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYTJiNjQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfcHJvdG9zL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMDAgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKK30KKworLy8gcHJvdG8gbGlicmFyaWVzIGZvciBjb25zdW1lcnMgb2YgYGFjb25maWcgZHVtcCAtLWZvcm1hdD1wcm90b2J1ZmAgb3V0cHV0CisKK2phdmFfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmFjb25maWdfamF2YV9wcm90b19saXRlIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBzcmNzOiBbInByb3Rvcy9hY29uZmlnLnByb3RvIl0sCisgICAgc3RhdGljX2xpYnM6IFsibGlicHJvdG9idWYtamF2YS1saXRlIl0sCisgICAgcHJvdG86IHsKKyAgICAgICAgdHlwZTogImxpdGUiLAorICAgIH0sCisgICAgc2RrX3ZlcnNpb246ICJjdXJyZW50IiwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICJVcHNpZGVEb3duQ2FrZSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgImNvbS5hbmRyb2lkLmNvbmZpZ2luZnJhc3RydWN0dXJlIiwKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgIF0sCit9CisKK2phdmFfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmFjb25maWdfamF2YV9wcm90b19uYW5vIiwKKyAgICBzcmNzOiBbInByb3Rvcy9hY29uZmlnLnByb3RvIl0sCisgICAgc3RhdGljX2xpYnM6IFsibGlicHJvdG9idWYtamF2YS1uYW5vIl0sCisgICAgcHJvdG86IHsKKyAgICAgICAgdHlwZTogIm5hbm8iLAorICAgIH0sCisgICAgc2RrX3ZlcnNpb246ICJjdXJyZW50IiwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICJVcHNpZGVEb3duQ2FrZSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgIF0sCisgICAgamFyamFyX3J1bGVzOiAiamFyamFyLW5hbm8tcnVsZXMudHh0IiwKK30KKworamF2YV9saWJyYXJ5X2hvc3QgeworICAgIG5hbWU6ICJsaWJhY29uZmlnX2phdmFfcHJvdG9fZnVsbCIsCisgICAgc3JjczogWyJwcm90b3MvYWNvbmZpZy5wcm90byJdLAorICAgIHN0YXRpY19saWJzOiBbImxpYnByb3RvYnVmLWphdmEtZnVsbCJdLAorICAgIHByb3RvOiB7CisgICAgICAgIHR5cGU6ICJmdWxsIiwKKyAgICB9LAorfQorCitweXRob25fbGlicmFyeV9ob3N0IHsKKyAgICBuYW1lOiAibGliYWNvbmZpZ19weXRob25fcHJvdG8iLAorICAgIHNyY3M6IFsicHJvdG9zL2Fjb25maWcucHJvdG8iXSwKKyAgICBwcm90bzogeworICAgICAgICBjYW5vbmljYWxfcGF0aF9mcm9tX3Jvb3Q6IGZhbHNlLAorICAgIH0sCit9CisKK3J1c3RfcHJvdG9idWYgeworICAgIG5hbWU6ICJsaWJhY29uZmlnX3J1c3RfcHJvdG8iLAorICAgIHByb3RvczogWyJwcm90b3MvYWNvbmZpZy5wcm90byJdLAorICAgIGNyYXRlX25hbWU6ICJhY29uZmlnX3J1c3RfcHJvdG8iLAorICAgIHNvdXJjZV9zdGVtOiAiYWNvbmZpZ19ydXN0X3Byb3RvIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5jb25maWdpbmZyYXN0cnVjdHVyZSIsCisgICAgXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIzNCIsCit9CisKK3J1c3RfZGVmYXVsdHMgeworICAgIG5hbWU6ICJhY29uZmlnX3Byb3Rvcy5kZWZhdWx0cyIsCisgICAgZWRpdGlvbjogIjIwMjEiLAorICAgIGNsaXBweV9saW50czogImFuZHJvaWQiLAorICAgIGxpbnRzOiAiYW5kcm9pZCIsCisgICAgc3JjczogWyJzcmMvbGliLnJzIl0sCisgICAgcnVzdGxpYnM6IFsKKyAgICAgICAgImxpYmFjb25maWdfcnVzdF9wcm90byIsCisgICAgICAgICJsaWJhbnlob3ciLAorICAgICAgICAibGlicHJvdG9idWYiLAorICAgIF0sCisgICAgcHJvY19tYWNyb3M6IFsKKyAgICAgICAgImxpYnBhc3RlIiwKKyAgICBdLAorfQorCitydXN0X2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJhY29uZmlnX3Byb3RvcyIsCisgICAgY3JhdGVfbmFtZTogImFjb25maWdfcHJvdG9zIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBkZWZhdWx0czogWyJhY29uZmlnX3Byb3Rvcy5kZWZhdWx0cyJdLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLmNvbmZpZ2luZnJhc3RydWN0dXJlIiwKKyAgICBdLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjM0IiwKK30KKworcnVzdF90ZXN0X2hvc3QgeworICAgIG5hbWU6ICJhY29uZmlnX3Byb3Rvcy50ZXN0IiwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCisgICAgZGVmYXVsdHM6IFsiYWNvbmZpZ19wcm90b3MuZGVmYXVsdHMiXSwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19wcm90b3MvQ2FyZ28udG9tbCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19wcm90b3MvQ2FyZ28udG9tbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTRjZjgwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3Byb3Rvcy9DYXJnby50b21sCkBAIC0wLDAgKzEsMTcgQEAKK1twYWNrYWdlXQorbmFtZSA9ICJhY29uZmlnX3Byb3RvcyIKK3ZlcnNpb24gPSAiMC4xLjAiCitlZGl0aW9uID0gIjIwMjEiCitidWlsZCA9ICJidWlsZC5ycyIKKworW2ZlYXR1cmVzXQorZGVmYXVsdCA9IFsiY2FyZ28iXQorY2FyZ28gPSBbXQorCitbZGVwZW5kZW5jaWVzXQorYW55aG93ID0gIjEuMC42OSIKK3Bhc3RlID0gIjEuMC4xMSIKK3Byb3RvYnVmID0gIjMuMi4wIgorCitbYnVpbGQtZGVwZW5kZW5jaWVzXQorcHJvdG9idWYtY29kZWdlbiA9ICIzLjIuMCIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19wcm90b3MvYnVpbGQucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfcHJvdG9zL2J1aWxkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZjViNjAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfcHJvdG9zL2J1aWxkLnJzCkBAIC0wLDAgKzEsMTcgQEAKK3VzZSBwcm90b2J1Zl9jb2RlZ2VuOjpDb2RlZ2VuOworCitmbiBtYWluKCkgeworICAgIGxldCBwcm90b19maWxlcyA9IHZlYyFbInByb3Rvcy9hY29uZmlnLnByb3RvIl07CisKKyAgICAvLyB0ZWxsIGNhcmdvIHRvIG9ubHkgcmUtcnVuIHRoZSBidWlsZCBzY3JpcHQgaWYgYW55IG9mIHRoZSBwcm90byBmaWxlcyBoYXMgY2hhbmdlZAorICAgIGZvciBwYXRoIGluICZwcm90b19maWxlcyB7CisgICAgICAgIHByaW50bG4hKCJjYXJnbzpyZXJ1bi1pZi1jaGFuZ2VkPXt9IiwgcGF0aCk7CisgICAgfQorCisgICAgQ29kZWdlbjo6bmV3KCkKKyAgICAgICAgLnB1cmUoKQorICAgICAgICAuaW5jbHVkZSgicHJvdG9zIikKKyAgICAgICAgLmlucHV0cyhwcm90b19maWxlcykKKyAgICAgICAgLmNhcmdvX291dF9kaXIoImFjb25maWdfcHJvdG8iKQorICAgICAgICAucnVuX2Zyb21fc2NyaXB0KCk7Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfcHJvdG9zL2phcmphci1uYW5vLXJ1bGVzLnR4dCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19wcm90b3MvamFyamFyLW5hbm8tcnVsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OGZhNjQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfcHJvdG9zL2phcmphci1uYW5vLXJ1bGVzLnR4dApAQCAtMCwwICsxIEBACitydWxlIGNvbS5nb29nbGUucHJvdG9idWYuKiogYW5kcm9pZC5pbnRlcm5hbC5mcmFtZXdvcmsucHJvdG9idWYuQDEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfcHJvdG9zL3Byb3Rvcy9hY29uZmlnLnByb3RvIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3Byb3Rvcy9wcm90b3MvYWNvbmZpZy5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDFiOGNiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3Byb3Rvcy9wcm90b3MvYWNvbmZpZy5wcm90bwpAQCAtMCwwICsxLDE5NSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKworLy8gVGhpcyBpcyB0aGUgc2NoZW1hIGRlZmluaXRpb24gZm9yIGFjb25maWcgZmlsZXMuIE1vZGlmaWNhdGlvbnMgbmVlZCB0byBiZQorLy8gZWl0aGVyIGJhY2t3YXJkcyBjb21wYXRpYmxlLCBvciBpbmNsdWRlIHVwZGF0ZXMgdG8gYWxsIGFjb25maWcgZmlsZXMgaW4gdGhlCisvLyBBbmRyb2lkIHRyZWUuCisKK3N5bnRheCA9ICJwcm90bzIiOworCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZzsKKworLy8gVGhpcyBwcm90b2J1ZiBmaWxlIGRlZmluZXMgbWVzc2FnZXMgdXNlZCB0byByZXByZXNlbnQgYW5kIG1hbmFnZSBmbGFncyBpbiB0aGUgImFjb25maWciIHN5c3RlbQorLy8gVGhlIGZvbGxvd2luZyBmb3JtYXQgcmVxdWlyZW1lbnRzIGFwcGx5IGFjcm9zcyB2YXJpb3VzIG1lc3NhZ2UgZmllbGRzOgorLy8KKy8vICMgbmFtZTogbmFtZSBvZiB0aGUgZmxhZworLy8KKy8vICAgIGZvcm1hdDogYSBsb3dlcmNhc2Ugc3RyaW5nIGluIHNuYWtlX2Nhc2UgZm9ybWF0LCBubyBjb25zZWN1dGl2ZSB1bmRlcnNjb3JlcywgYW5kIG5vIGxlYWRpbmcKKy8vICAgICAgZGlnaXQuIEZvciBleGFtcGxlIGFkanVzdF9yYXRlIGlzIGEgdmFsaWQgbmFtZSwgd2hpbGUgQWRqdXN0UmF0ZSwgYWRqdXN0X19yYXRlLCBhbmQKKy8vICAgICAgYWRqdXN0X3JhdGUgYXJlIGludmFsaWQKKy8vCisvLyAjIG5hbWVzcGFjZTogbmFtZXNwYWNlIHRoZSBmbGFnIGJlbG9uZ3MgdG8KKy8vCisvLyAgICBmb3JtYXQ6IGEgbG93ZXJjYXNlIHN0cmluZyBpbiBzbmFrZV9jYXNlIGZvcm1hdCwgbm8gY29uc2VjdXRpdmUgdW5kZXJzY29yZXMsIGFuZCBubyBsZWFkaW5nCisvLyAgICAgIGRpZ2l0LiBGb3IgZXhhbXBsZSBhbmRyb2lkX2Jhcl9zeXN0ZW0KKy8vCisvLyAjIHBhY2thZ2U6IHBhY2thZ2UgdG8gd2hpY2ggdGhlIGZsYWcgYmVsb25ncworLy8KKy8vICAgIGZvcm1hdDogbG93ZXJjYXNlIHN0cmluZ3MgaW4gc25ha2VfY2FzZSBmb3JtYXQsIGRlbGltaXRlZCBieSBkb3RzLCBubyBjb25zZWN1dGl2ZSB1bmRlcnNjb3JlcworLy8gICAgICBhbmQgbm8gbGVhZGluZyBkaWdpdCBpbiBlYWNoIHN0cmluZy4gRm9yIGV4YW1wbGUgY29tLmFuZHJvaWQubXlwYWNrYWdlIGlzIGEgdmFsaWQgbmFtZQorLy8gICAgICB3aGlsZSBjb20uYW5kcm9pZC5teVBhY2thZ2UsIGNvbS5hbmRyb2lkLjFteXBhY2thZ2UgYXJlIGludmFsaWQKKy8vCisvLyAjIGNvbnRhaW5lcjogY29udGFpbmVyIGFzIHNvZnR3YXJlIGJ1aWx0IGluIGl0cyBlbnRpcmV0eSB1c2luZyB0aGUgc2FtZSBidWlsZCBlbnZpcm9ubWVudCBhbmQKKy8vICAgIGFsd2F5cyBpbnN0YWxsZWQgYXMgYSBzaW5nbGUgdW5pdAorLy8KKy8vICAgIEZvciBleGFtcGxlIHRoZSBmb2xsb3dpbmcgYXJlIGFsbCBzZXBhcmF0ZSBjb250YWluZXJzOgorLy8gICAgICAgICogdGhlIHN5c3RlbSBwYXJ0aXRpb24KKy8vICAgICAgICAqIHRoZSB2ZW5kb3IgcGFydGl0aW9uCisvLyAgICAgICAgKiBhcGV4ZXM6IGVhY2ggQVBFWCBpcyBpdHMgb3duIGNvbnRhaW5lcgorLy8gICAgICAgICogQVBLczogZm9yIEFQS3Mgd2hpY2ggYXJlIHJlbGVhc2VkIGluZGVwZW5kZW50bHkgdmlhIFBsYXksIGVhY2ggQVBLIGlzIGl0cyBvd24gY29udGFpbmVyLgorLy8gICAgICAgICAgICBJZiBhbiBBUEsgaXMgcmVsZWFzZWQgYXMgcGFydCBvZiBhIE1haW5saW5lIG1vZHVsZSwgb3IgYXMgcGFydCBvZiB0aGUgc3lzdGVtIHBhcnRpdGlvbgorLy8gICAgICAgICAgICB2aWEgT1RBLCB0aGVuIHRoZXkgYXJlIHBhcnQgb2YgdGhlIGFwZXggb3IgdGhlIHN5c3RlbSBwYXJ0aXRpb24gY29udGFpbmVyCisvLworLy8gICAgZm9ybWF0OiBsb3dlcmNhc2Ugc3RyaW5ncyBpbiBzbmFrZV9jYXNlIGZvcm1hdCwgZGVsaW1pdGVkIGJ5IGRvdHMgaWYgbXVsdGlwbGUsIG5vIGNvbnNlY3V0aXZlCisvLyAgICAgIHVuZGVyc2NvcmVzIG9yIGxlYWRpbmcgZGlnaXRzIGluIGVhY2ggc3RyaW5nLiBUaGUgcmVjb21tZW5kZWQgY29udGFpbmVyIHZhbHVlcyBhcmUgdGhlCisvLyAgICAgIHBhcnRpdGlvbiBuYW1lcyBvciB0aGUgbW9kdWxlIG5hbWVzCisKKy8vIG1lc3NhZ2VzIHVzZWQgaW4gYm90aCBhY29uZmlnIGlucHV0IGFuZCBvdXRwdXQKKworZW51bSBmbGFnX3N0YXRlIHsKKyAgRU5BQkxFRCA9IDE7CisgIERJU0FCTEVEID0gMjsKK30KKworZW51bSBmbGFnX3Blcm1pc3Npb24geworICBSRUFEX09OTFkgPSAxOworICBSRUFEX1dSSVRFID0gMjsKK30KKworLy8gYWNvbmZpZyBpbnB1dCBtZXNzYWdlczogZmxhZyBkZWNsYXJhdGlvbnMgYW5kIHZhbHVlcworCittZXNzYWdlIGZsYWdfZGVjbGFyYXRpb24geworICAvLyBOYW1lIG9mIHRoZSBmbGFnIChyZXF1aXJlZCkKKyAgLy8gU2VlICMgbmFtZSBmb3IgZm9ybWF0IGRldGFpbAorICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisKKyAgLy8gTmFtZXNwYWNlIHRoZSBmbGFnIGJlbG9uZ3MgdG8gKHJlcXVpcmVkKQorICAvLyBTZWUgIyBuYW1lc3BhY2UgZm9yIGZvcm1hdCBkZXRhaWwKKyAgb3B0aW9uYWwgc3RyaW5nIG5hbWVzcGFjZSA9IDI7CisKKyAgLy8gVGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgZmxhZydzIHB1cnBvc2UgKHJlcXVpcmVkKQorICBvcHRpb25hbCBzdHJpbmcgZGVzY3JpcHRpb24gPSAzOworCisgIC8vIFNpbmdsZSBidWcgaWQgcmVsYXRlZCB0byB0aGUgZmxhZyAocmVxdWlyZWQpCisgIHJlcGVhdGVkIHN0cmluZyBidWcgPSA0OworCisgIC8vIEluZGljYXRlcyBpZiB0aGUgZmxhZyBpcyBwZXJtYW5lbnRseSByZWFkLW9ubHkgYW5kIGNhbm5vdCBiZSBjaGFuZ2VkCisgIC8vIHZpYSByZWxlYXNlIGNvbmZpZ3MgKG9wdGlvbmFsKQorICAvLyBEZWZhdWx0IHZhbHVlIGZhbHNlCisgIG9wdGlvbmFsIGJvb2wgaXNfZml4ZWRfcmVhZF9vbmx5ID0gNTsKKworICAvLyBJbmRpY2F0ZXMgaWYgdGhlIGZsYWcgaXMgZXhwb3J0ZWQgYW5kIGFjY2Vzc2libGUgYmV5b25kIGl0cyBvcmlnaW5hdGluZyBjb250YWluZXIgKG9wdGlvbmFsKQorICAvLyBEZWZhdWx0IHZhbHVlIGZhbHNlCisgIG9wdGlvbmFsIGJvb2wgaXNfZXhwb3J0ZWQgPSA2OworCisgIC8vIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZsYWcsIGluY2x1ZGluZyBpdHMgcHVycG9zZSBhbmQgZm9ybSBmYWN0b3JzIChvcHRpb25hbCkKKyAgb3B0aW9uYWwgZmxhZ19tZXRhZGF0YSBtZXRhZGF0YSA9IDc7Cit9OworCisvLyBPcHRpb25hbCBtZXRhZGF0YSBhYm91dCB0aGUgZmxhZywgc3VjaCBhcyBpdHMgcHVycG9zZSBhbmQgaXRzIGludGVuZGVkIGZvcm0gZmFjdG9ycy4KKy8vIENhbiBpbmZsdWVuY2UgdGhlIGFwcGxpZWQgcG9saWNpZXMgYW5kIHRlc3Rpbmcgc3RyYXRlZ3kuCittZXNzYWdlIGZsYWdfbWV0YWRhdGEgeworICBlbnVtIGZsYWdfcHVycG9zZSB7CisgICAgUFVSUE9TRV9VTlNQRUNJRklFRCA9IDA7CisgICAgUFVSUE9TRV9GRUFUVVJFID0gMTsKKyAgICBQVVJQT1NFX0JVR0ZJWCA9IDI7CisgIH0KKworICBvcHRpb25hbCBmbGFnX3B1cnBvc2UgcHVycG9zZSA9IDE7CisKKyAgLy8gVE9ETyhiLzMxNTAyNTkzMCk6IEFkZCBmaWVsZCB0byBkZXNpZ25hdGUgaW50ZW5kZWQgdGFyZ2V0IGRldmljZSBmb3JtIGZhY3RvcihzKSwgc3VjaCBhcyBwaG9uZSwgd2F0Y2ggb3Igb3RoZXIuCit9CisKK21lc3NhZ2UgZmxhZ19kZWNsYXJhdGlvbnMgeworICAvLyBQYWNrYWdlIHRvIHdoaWNoIHRoZSBmbGFnIGJlbG9uZ3MgKHJlcXVpcmVkKQorICAvLyBTZWUgIyBwYWNrYWdlIGZvciBmb3JtYXQgZGV0YWlsCisgIG9wdGlvbmFsIHN0cmluZyBwYWNrYWdlID0gMTsKKworICAvLyBMaXN0IG9mIGZsYWdfZGVjbGFyYXRpb24gb2JqZWN0cyAocmVxdWlyZWQpCisgIHJlcGVhdGVkIGZsYWdfZGVjbGFyYXRpb24gZmxhZyA9IDI7CisKKyAgLy8gQ29udGFpbmVyIHRoZSBmbGFnIGJlbG9uZ3MgdG8gKG9wdGlvbmFsKQorICAvLyBTZWUgIyBjb250YWluZXIgZm9yIGZvcm1hdCBkZXRhaWwKKyAgb3B0aW9uYWwgc3RyaW5nIGNvbnRhaW5lciA9IDM7Cit9OworCittZXNzYWdlIGZsYWdfdmFsdWUgeworICAvLyBQYWNrYWdlIHRvIHdoaWNoIHRoZSBmbGFnIGJlbG9uZ3MgKHJlcXVpcmVkKQorICAvLyBTZWUgIyBwYWNrYWdlIGZvciBmb3JtYXQgZGV0YWlsCisgIG9wdGlvbmFsIHN0cmluZyBwYWNrYWdlID0gMTsKKworICAvLyBOYW1lIG9mIHRoZSBmbGFnIChyZXF1aXJlZCkKKyAgLy8gU2VlICMgbmFtZSBmb3IgZm9ybWF0IGRldGFpbAorICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDI7CisKKyAgb3B0aW9uYWwgZmxhZ19zdGF0ZSBzdGF0ZSA9IDM7CisgIG9wdGlvbmFsIGZsYWdfcGVybWlzc2lvbiBwZXJtaXNzaW9uID0gNDsKK307CisKK21lc3NhZ2UgZmxhZ192YWx1ZXMgeworICByZXBlYXRlZCBmbGFnX3ZhbHVlIGZsYWdfdmFsdWUgPSAxOworfTsKKworLy8gYWNvbmZpZyBvdXRwdXQgbWVzc2FnZXM6IHBhcnNlZCBhbmQgdmVyaWZpZWQgZmxhZyBkZWNsYXJhdGlvbnMgYW5kIHZhbHVlcworCittZXNzYWdlIHRyYWNlcG9pbnQgeworICAvLyBwYXRoIHRvIGRlY2xhcmF0aW9uIG9yIHZhbHVlIGZpbGUgcmVsYXRpdmUgdG8gJFRPUAorICBvcHRpb25hbCBzdHJpbmcgc291cmNlID0gMTsKKyAgb3B0aW9uYWwgZmxhZ19zdGF0ZSBzdGF0ZSA9IDI7CisgIG9wdGlvbmFsIGZsYWdfcGVybWlzc2lvbiBwZXJtaXNzaW9uID0gMzsKK30KKworbWVzc2FnZSBwYXJzZWRfZmxhZyB7CisgIC8vIFBhY2thZ2UgdG8gd2hpY2ggdGhlIGZsYWcgYmVsb25ncyAocmVxdWlyZWQpCisgIC8vIFNlZSAjIHBhY2thZ2UgZm9yIGZvcm1hdCBkZXRhaWwKKyAgb3B0aW9uYWwgc3RyaW5nIHBhY2thZ2UgPSAxOworCisgIC8vIE5hbWUgb2YgdGhlIGZsYWcgKHJlcXVpcmVkKQorICAvLyBTZWUgIyBuYW1lIGZvciBmb3JtYXQgZGV0YWlsCisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMjsKKworICAvLyBOYW1lc3BhY2UgdGhlIGZsYWcgYmVsb25ncyB0byAocmVxdWlyZWQpCisgIC8vIFNlZSAjIG5hbWVzcGFjZSBmb3IgZm9ybWF0IGRldGFpbAorICBvcHRpb25hbCBzdHJpbmcgbmFtZXNwYWNlID0gMzsKKworICAvLyBUZXh0dWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBmbGFnJ3MgcHVycG9zZSAocmVxdWlyZWQpCisgIG9wdGlvbmFsIHN0cmluZyBkZXNjcmlwdGlvbiA9IDQ7CisKKyAgLy8gU2luZ2xlIGJ1ZyBpZCByZWxhdGVkIHRvIHRoZSBmbGFnIChyZXF1aXJlZCkKKyAgcmVwZWF0ZWQgc3RyaW5nIGJ1ZyA9IDU7CisKKyAgb3B0aW9uYWwgZmxhZ19zdGF0ZSBzdGF0ZSA9IDY7CisgIG9wdGlvbmFsIGZsYWdfcGVybWlzc2lvbiBwZXJtaXNzaW9uID0gNzsKKyAgcmVwZWF0ZWQgdHJhY2Vwb2ludCB0cmFjZSA9IDg7CisKKyAgLy8gSW5kaWNhdGVzIGlmIHRoZSBmbGFnIGlzIHBlcm1hbmVudGx5IHJlYWQtb25seSBhbmQgY2Fubm90IGJlIGNoYW5nZWQKKyAgLy8gdmlhIHJlbGVhc2UgY29uZmlncyAob3B0aW9uYWwpCisgIC8vIERlZmF1bHQgdmFsdWUgZmFsc2UKKyAgb3B0aW9uYWwgYm9vbCBpc19maXhlZF9yZWFkX29ubHkgPSA5OworCisgIC8vIEluZGljYXRlcyBpZiB0aGUgZmxhZyBpcyBleHBvcnRlZCBhbmQgYWNjZXNzaWJsZSBiZXlvbmQgaXRzIG9yaWdpbmF0aW5nIGNvbnRhaW5lciAob3B0aW9uYWwpCisgIC8vIERlZmF1bHQgdmFsdWUgZmFsc2UKKyAgb3B0aW9uYWwgYm9vbCBpc19leHBvcnRlZCA9IDEwOworCisgIC8vIENvbnRhaW5lciB0aGUgZmxhZyBiZWxvbmdzIHRvIChvcHRpb25hbCkKKyAgLy8gU2VlICMgY29udGFpbmVyIGZvciBmb3JtYXQgZGV0YWlsCisgIG9wdGlvbmFsIHN0cmluZyBjb250YWluZXIgPSAxMTsKKworICAvLyBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmbGFnLCBpbmNsdWRpbmcgaXRzIHB1cnBvc2UgYW5kIGZvcm0gZmFjdG9ycyAob3B0aW9uYWwpCisgIG9wdGlvbmFsIGZsYWdfbWV0YWRhdGEgbWV0YWRhdGEgPSAxMjsKK30KKworbWVzc2FnZSBwYXJzZWRfZmxhZ3MgeworICByZXBlYXRlZCBwYXJzZWRfZmxhZyBwYXJzZWRfZmxhZyA9IDE7Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfcHJvdG9zL3NyYy9saWIucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfcHJvdG9zL3NyYy9saWIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFiYmQ3ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19wcm90b3Mvc3JjL2xpYi5ycwpAQCAtMCwwICsxLDEwNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyEgYGFjb25maWdfcHJvdG9zYCBpcyBhIGNyYXRlIGZvciB0aGUgcHJvdG9zIGRlZmluZWQgZm9yIGFjb25maWcKKy8vIFdoZW4gYnVpbGRpbmcgd2l0aCB0aGUgQW5kcm9pZCB0b29sLWNoYWluCisvLworLy8gICAtIGFuIGV4dGVybmFsIGNyYXRlIGBhY29uZmlnX3Byb3Rvc2Agd2lsbCBiZSBnZW5lcmF0ZWQKKy8vICAgLSB0aGUgZmVhdHVyZSAiY2FyZ28iIHdpbGwgYmUgZGlzYWJsZWQKKy8vCisvLyBXaGVuIGJ1aWxkaW5nIHdpdGggY2FyZ28KKy8vCisvLyAgIC0gYSBsb2NhbCBzdWItbW9kdWxlIHdpbGwgYmUgZ2VuZXJhdGVkIGluIE9VVF9ESVIgYW5kIGluY2x1ZGVkIGluIHRoaXMgZmlsZQorLy8gICAtIHRoZSBmZWF0dXJlICJjYXJnbyIgd2lsbCBiZSBlbmFibGVkCisvLworLy8gVGhpcyBtb2R1bGUgaGlkZXMgdGhlc2UgZGlmZmVyZW5jZXMgZnJvbSB0aGUgcmVzdCBvZiBhY29uZmlnLgorCisvLyAtLS0tIFdoZW4gYnVpbGRpbmcgd2l0aCB0aGUgQW5kcm9pZCB0b29sLWNoYWluIC0tLS0KKyNbY2ZnKG5vdChmZWF0dXJlID0gImNhcmdvIikpXQorbW9kIGF1dG9fZ2VuZXJhdGVkIHsKKyAgICBwdWIgdXNlIGFjb25maWdfcnVzdF9wcm90bzo6YWNvbmZpZzo6ZmxhZ19tZXRhZGF0YTo6RmxhZ19wdXJwb3NlIGFzIFByb3RvRmxhZ1B1cnBvc2U7CisgICAgcHViIHVzZSBhY29uZmlnX3J1c3RfcHJvdG86OmFjb25maWc6OkZsYWdfZGVjbGFyYXRpb24gYXMgUHJvdG9GbGFnRGVjbGFyYXRpb247CisgICAgcHViIHVzZSBhY29uZmlnX3J1c3RfcHJvdG86OmFjb25maWc6OkZsYWdfZGVjbGFyYXRpb25zIGFzIFByb3RvRmxhZ0RlY2xhcmF0aW9uczsKKyAgICBwdWIgdXNlIGFjb25maWdfcnVzdF9wcm90bzo6YWNvbmZpZzo6RmxhZ19tZXRhZGF0YSBhcyBQcm90b0ZsYWdNZXRhZGF0YTsKKyAgICBwdWIgdXNlIGFjb25maWdfcnVzdF9wcm90bzo6YWNvbmZpZzo6RmxhZ19wZXJtaXNzaW9uIGFzIFByb3RvRmxhZ1Blcm1pc3Npb247CisgICAgcHViIHVzZSBhY29uZmlnX3J1c3RfcHJvdG86OmFjb25maWc6OkZsYWdfc3RhdGUgYXMgUHJvdG9GbGFnU3RhdGU7CisgICAgcHViIHVzZSBhY29uZmlnX3J1c3RfcHJvdG86OmFjb25maWc6OkZsYWdfdmFsdWUgYXMgUHJvdG9GbGFnVmFsdWU7CisgICAgcHViIHVzZSBhY29uZmlnX3J1c3RfcHJvdG86OmFjb25maWc6OkZsYWdfdmFsdWVzIGFzIFByb3RvRmxhZ1ZhbHVlczsKKyAgICBwdWIgdXNlIGFjb25maWdfcnVzdF9wcm90bzo6YWNvbmZpZzo6UGFyc2VkX2ZsYWcgYXMgUHJvdG9QYXJzZWRGbGFnOworICAgIHB1YiB1c2UgYWNvbmZpZ19ydXN0X3Byb3RvOjphY29uZmlnOjpQYXJzZWRfZmxhZ3MgYXMgUHJvdG9QYXJzZWRGbGFnczsKKyAgICBwdWIgdXNlIGFjb25maWdfcnVzdF9wcm90bzo6YWNvbmZpZzo6VHJhY2Vwb2ludCBhcyBQcm90b1RyYWNlcG9pbnQ7Cit9CisKKy8vIC0tLS0gV2hlbiBidWlsZGluZyB3aXRoIGNhcmdvIC0tLS0KKyNbY2ZnKGZlYXR1cmUgPSAiY2FyZ28iKV0KK21vZCBhdXRvX2dlbmVyYXRlZCB7CisgICAgLy8gaW5jbHVkZSEgc3RhdGVtZW50cyBzaG91bGQgYmUgYXZvaWRlZCAoYmVjYXVzZSB0aGV5IGltcG9ydCBmaWxlIGNvbnRlbnRzIHZlcmJhdGltKSwgYnV0CisgICAgLy8gYmVjYXVzZSB0aGlzIGlzIG9ubHkgdXNlZCBkdXJpbmcgbG9jYWwgZGV2ZWxvcG1lbnQsIGFuZCBvbmx5IGlmIHVzaW5nIGNhcmdvIGluc3RlYWQgb2YgdGhlCisgICAgLy8gQW5kcm9pZCB0b29sLWNoYWluLCB3ZSBhbGxvdyBpdAorICAgIGluY2x1ZGUhKGNvbmNhdCEoZW52ISgiT1VUX0RJUiIpLCAiL2Fjb25maWdfcHJvdG8vbW9kLnJzIikpOworICAgIHB1YiB1c2UgYWNvbmZpZzo6ZmxhZ19tZXRhZGF0YTo6RmxhZ19wdXJwb3NlIGFzIFByb3RvRmxhZ1B1cnBvc2U7CisgICAgcHViIHVzZSBhY29uZmlnOjpGbGFnX2RlY2xhcmF0aW9uIGFzIFByb3RvRmxhZ0RlY2xhcmF0aW9uOworICAgIHB1YiB1c2UgYWNvbmZpZzo6RmxhZ19kZWNsYXJhdGlvbnMgYXMgUHJvdG9GbGFnRGVjbGFyYXRpb25zOworICAgIHB1YiB1c2UgYWNvbmZpZzo6RmxhZ19tZXRhZGF0YSBhcyBQcm90b0ZsYWdNZXRhZGF0YTsKKyAgICBwdWIgdXNlIGFjb25maWc6OkZsYWdfcGVybWlzc2lvbiBhcyBQcm90b0ZsYWdQZXJtaXNzaW9uOworICAgIHB1YiB1c2UgYWNvbmZpZzo6RmxhZ19zdGF0ZSBhcyBQcm90b0ZsYWdTdGF0ZTsKKyAgICBwdWIgdXNlIGFjb25maWc6OkZsYWdfdmFsdWUgYXMgUHJvdG9GbGFnVmFsdWU7CisgICAgcHViIHVzZSBhY29uZmlnOjpGbGFnX3ZhbHVlcyBhcyBQcm90b0ZsYWdWYWx1ZXM7CisgICAgcHViIHVzZSBhY29uZmlnOjpQYXJzZWRfZmxhZyBhcyBQcm90b1BhcnNlZEZsYWc7CisgICAgcHViIHVzZSBhY29uZmlnOjpQYXJzZWRfZmxhZ3MgYXMgUHJvdG9QYXJzZWRGbGFnczsKKyAgICBwdWIgdXNlIGFjb25maWc6OlRyYWNlcG9pbnQgYXMgUHJvdG9UcmFjZXBvaW50OworfQorCisvLyAtLS0tIENvbW1vbiBmb3IgYm90aCB0aGUgQW5kcm9pZCB0b29sLWNoYWluIGFuZCBjYXJnbyAtLS0tCitwdWIgdXNlIGF1dG9fZ2VuZXJhdGVkOjoqOworCit1c2UgYW55aG93OjpSZXN1bHQ7Cit1c2UgcGFzdGU6OnBhc3RlOworCisvLy8gUGF0aCB0byBwcm90byBmaWxlCitjb25zdCBBQ09ORklHX1BST1RPX1BBVEg6ICZzdHIgPSAiLy9idWlsZC9tYWtlL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19wcm90b3MvcHJvdG9zL2Fjb25maWcucHJvdG8iOworCisvLy8gQ2hlY2sgaWYgdGhlIG5hbWUgaWRlbnRpZmllciBpcyB2YWxpZAorcHViIGZuIGlzX3ZhbGlkX25hbWVfaWRlbnQoczogJnN0cikgLT4gYm9vbCB7CisgICAgLy8gSWRlbnRpZmllcnMgbXVzdCBtYXRjaCBbYS16XVthLXowLTlfXSosIGV4Y2VwdCBjb25zZWN1dGl2ZSB1bmRlcnNjb3JlcyBhcmUgbm90IGFsbG93ZWQKKyAgICBpZiBzLmNvbnRhaW5zKCJfXyIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBsZXQgbXV0IGNoYXJzID0gcy5jaGFycygpOworICAgIGxldCBTb21lKGZpcnN0KSA9IGNoYXJzLm5leHQoKSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH07CisgICAgaWYgIWZpcnN0LmlzX2FzY2lpX2xvd2VyY2FzZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjaGFycy5hbGwofGNofCBjaC5pc19hc2NpaV9sb3dlcmNhc2UoKSB8fCBjaC5pc19hc2NpaV9kaWdpdCgpIHx8IGNoID09ICdfJykKK30KKworLy8vIENoZWNrIGlmIHRoZSBwYWNrYWdlIGlkZW50aWZpZXIgaXMgdmFsaWQKK3B1YiBmbiBpc192YWxpZF9wYWNrYWdlX2lkZW50KHM6ICZzdHIpIC0+IGJvb2wgeworICAgIGlmICFzLmNvbnRhaW5zKCcuJykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHMuc3BsaXQoJy4nKS5hbGwoaXNfdmFsaWRfbmFtZV9pZGVudCkKK30KKworLy8vIENoZWNrIGlmIHRoZSBjb250YWluZXIgaWRlbnRpZmllciBpcyB2YWxpZAorcHViIGZuIGlzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudChzOiAmc3RyKSAtPiBib29sIHsKKyAgICBzLnNwbGl0KCcuJykuYWxsKGlzX3ZhbGlkX25hbWVfaWRlbnQpCit9CisKK2ZuIHRyeV9mcm9tX3RleHRfcHJvdG88VD4oczogJnN0cikgLT4gUmVzdWx0PFQ+Cit3aGVyZQorICAgIFQ6IHByb3RvYnVmOjpNZXNzYWdlRnVsbCwKK3sKKyAgICBwcm90b2J1Zjo6dGV4dF9mb3JtYXQ6OnBhcnNlX2Zyb21fc3RyKHMpLm1hcF9lcnIofGV8IGUuaW50bygpKQorfQorCittYWNyb19ydWxlcyEgZW5zdXJlX3JlcXVpcmVkX2ZpZWxkcyB7CisgICAgKCR0eXBlOmV4cHIsICRzdHJ1Y3Q6ZXhwciwgJCgkZmllbGQ6ZXhwciksKykgPT4geworICAgICAgICAkKAorICAgICAgICBwYXN0ZSEgeworICAgICAgICAgICAgZW5zdXJlISgkc3RydWN0Lls8aGFzXyAkZmllbGQ+XSgpLCAiYmFkIHt9OiBtaXNzaW5nIHt9IiwgJHR5cGUsICRmaWVsZCk7CisgICAgICAgIH0KKyAgICAgICAgKSsKKyAgICB9OworfQorCisvLy8gVXRpbGl0eSBtb2R1bGUgZm9yIGZsYWdfZGVjbGFyYXRpb24gcHJvdG8KK3B1YiBtb2QgZmxhZ19kZWNsYXJhdGlvbiB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBhbnlob3c6OmVuc3VyZTsKKworICAgIC8vLyBFbnN1cmUgdGhlIHByb3RvIGluc3RhbmNlIGlzIHZhbGlkIGJ5IGNoZWNraW5nIGl0cyBmaWVsZHMKKyAgICBwdWIgZm4gdmVyaWZ5X2ZpZWxkcyhwZGY6ICZQcm90b0ZsYWdEZWNsYXJhdGlvbikgLT4gUmVzdWx0PCgpPiB7CisgICAgICAgIGVuc3VyZV9yZXF1aXJlZF9maWVsZHMhKCJmbGFnIGRlY2xhcmF0aW9uIiwgcGRmLCAibmFtZSIsICJuYW1lc3BhY2UiLCAiZGVzY3JpcHRpb24iKTsKKworICAgICAgICBlbnN1cmUhKAorICAgICAgICAgICAgaXNfdmFsaWRfbmFtZV9pZGVudChwZGYubmFtZSgpKSwKKyAgICAgICAgICAgICJiYWQgZmxhZyBkZWNsYXJhdGlvbjogYmFkIG5hbWUge30gZXhwZWN0ZWQgc25ha2VfY2FzZSBzdHJpbmc7IFwKKyAgICAgICAgc2VlIHtBQ09ORklHX1BST1RPX1BBVEh9IGZvciBkZXRhaWxzIiwKKyAgICAgICAgICAgIHBkZi5uYW1lKCkKKyAgICAgICAgKTsKKyAgICAgICAgZW5zdXJlISgKKyAgICAgICAgICAgIGlzX3ZhbGlkX25hbWVfaWRlbnQocGRmLm5hbWVzcGFjZSgpKSwKKyAgICAgICAgICAgICJiYWQgZmxhZyBkZWNsYXJhdGlvbjogYmFkIG5hbWVzcGFjZSB7fSBleHBlY3RlZCBzbmFrZV9jYXNlIHN0cmluZzsgXAorICAgICAgICBzZWUge0FDT05GSUdfUFJPVE9fUEFUSH0gZm9yIGRldGFpbHMiLAorICAgICAgICAgICAgcGRmLm5hbWVzcGFjZSgpCisgICAgICAgICk7CisgICAgICAgIGVuc3VyZSEoIXBkZi5kZXNjcmlwdGlvbigpLmlzX2VtcHR5KCksICJiYWQgZmxhZyBkZWNsYXJhdGlvbjogZW1wdHkgZGVzY3JpcHRpb24iKTsKKyAgICAgICAgZW5zdXJlIShwZGYuYnVnLmxlbigpID09IDEsICJiYWQgZmxhZyBkZWNsYXJhdGlvbjogZXhhY3RseSBvbmUgYnVnIHJlcXVpcmVkIik7CisKKyAgICAgICAgT2soKCkpCisgICAgfQorfQorCisvLy8gVXRpbGl0eSBtb2R1bGUgZm9yIGZsYWdfZGVjbGFyYXRpb25zIHByb3RvCitwdWIgbW9kIGZsYWdfZGVjbGFyYXRpb25zIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIGFueWhvdzo6ZW5zdXJlOworCisgICAgLy8vIENvbnN0cnVjdCBhIHByb3RvIGluc3RhbmNlIGZyb20gYSB0ZXh0cHJvdG8gc3RyaW5nIGNvbnRlbnQKKyAgICBwdWIgZm4gdHJ5X2Zyb21fdGV4dF9wcm90byhzOiAmc3RyKSAtPiBSZXN1bHQ8UHJvdG9GbGFnRGVjbGFyYXRpb25zPiB7CisgICAgICAgIGxldCBwZGY6IFByb3RvRmxhZ0RlY2xhcmF0aW9ucyA9IHN1cGVyOjp0cnlfZnJvbV90ZXh0X3Byb3RvKHMpPzsKKyAgICAgICAgdmVyaWZ5X2ZpZWxkcygmcGRmKT87CisgICAgICAgIE9rKHBkZikKKyAgICB9CisKKyAgICAvLy8gRW5zdXJlIHRoZSBwcm90byBpbnN0YW5jZSBpcyB2YWxpZCBieSBjaGVja2luZyBpdHMgZmllbGRzCisgICAgcHViIGZuIHZlcmlmeV9maWVsZHMocGRmOiAmUHJvdG9GbGFnRGVjbGFyYXRpb25zKSAtPiBSZXN1bHQ8KCk+IHsKKyAgICAgICAgZW5zdXJlX3JlcXVpcmVkX2ZpZWxkcyEoImZsYWcgZGVjbGFyYXRpb25zIiwgcGRmLCAicGFja2FnZSIpOworICAgICAgICAvLyBUT0RPKGIvMzEyNzY5NzEwKTogTWFrZSB0aGUgY29udGFpbmVyIGZpZWxkIHJlcXVpcmVkLgorICAgICAgICBlbnN1cmUhKAorICAgICAgICAgICAgaXNfdmFsaWRfcGFja2FnZV9pZGVudChwZGYucGFja2FnZSgpKSwKKyAgICAgICAgICAgICJiYWQgZmxhZyBkZWNsYXJhdGlvbnM6IGJhZCBwYWNrYWdlIHt9IGV4cGVjdGVkIHNuYWtlX2Nhc2Ugc3RyaW5ncyBkZWxpbWl0ZWQgYnkgZG90czsgXAorICAgICAgICBzZWUge0FDT05GSUdfUFJPVE9fUEFUSH0gZm9yIGRldGFpbHMiLAorICAgICAgICAgICAgcGRmLnBhY2thZ2UoKQorICAgICAgICApOworICAgICAgICBlbnN1cmUhKAorICAgICAgICAgICAgIXBkZi5oYXNfY29udGFpbmVyKCkgfHwgaXNfdmFsaWRfY29udGFpbmVyX2lkZW50KHBkZi5jb250YWluZXIoKSksCisgICAgICAgICAgICAiYmFkIGZsYWcgZGVjbGFyYXRpb25zOiBiYWQgY29udGFpbmVyIgorICAgICAgICApOworICAgICAgICBmb3IgZmxhZ19kZWNsYXJhdGlvbiBpbiBwZGYuZmxhZy5pdGVyKCkgeworICAgICAgICAgICAgc3VwZXI6OmZsYWdfZGVjbGFyYXRpb246OnZlcmlmeV9maWVsZHMoZmxhZ19kZWNsYXJhdGlvbik/OworICAgICAgICB9CisKKyAgICAgICAgT2soKCkpCisgICAgfQorfQorCisvLy8gVXRpbGl0eSBtb2R1bGUgZm9yIGZsYWdfdmFsdWUgcHJvdG8KK3B1YiBtb2QgZmxhZ192YWx1ZSB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBhbnlob3c6OmVuc3VyZTsKKworICAgIC8vLyBFbnN1cmUgdGhlIHByb3RvIGluc3RhbmNlIGlzIHZhbGlkIGJ5IGNoZWNraW5nIGl0cyBmaWVsZHMKKyAgICBwdWIgZm4gdmVyaWZ5X2ZpZWxkcyhmdjogJlByb3RvRmxhZ1ZhbHVlKSAtPiBSZXN1bHQ8KCk+IHsKKyAgICAgICAgZW5zdXJlX3JlcXVpcmVkX2ZpZWxkcyEoImZsYWcgdmFsdWUiLCBmdiwgInBhY2thZ2UiLCAibmFtZSIsICJzdGF0ZSIsICJwZXJtaXNzaW9uIik7CisKKyAgICAgICAgZW5zdXJlISgKKyAgICAgICAgICAgIGlzX3ZhbGlkX3BhY2thZ2VfaWRlbnQoZnYucGFja2FnZSgpKSwKKyAgICAgICAgICAgICJiYWQgZmxhZyB2YWx1ZTogYmFkIHBhY2thZ2Uge30gZXhwZWN0ZWQgc25ha2VfY2FzZSBzdHJpbmdzIGRlbGltaXRlZCBieSBkb3RzOyBcCisgICAgICAgIHNlZSB7QUNPTkZJR19QUk9UT19QQVRIfSBmb3IgZGV0YWlscyIsCisgICAgICAgICAgICBmdi5wYWNrYWdlKCkKKyAgICAgICAgKTsKKyAgICAgICAgZW5zdXJlISgKKyAgICAgICAgICAgIGlzX3ZhbGlkX25hbWVfaWRlbnQoZnYubmFtZSgpKSwKKyAgICAgICAgICAgICJiYWQgZmxhZyB2YWx1ZTogYmFkIG5hbWUge30gZXhwZWN0ZWQgc25ha2VfY2FzZSBzdHJpbmc7IFwKKyAgICAgICAgc2VlIHtBQ09ORklHX1BST1RPX1BBVEh9IGZvciBkZXRhaWxzIiwKKyAgICAgICAgICAgIGZ2Lm5hbWUoKQorICAgICAgICApOworCisgICAgICAgIE9rKCgpKQorICAgIH0KK30KKworLy8vIFV0aWxpdHkgbW9kdWxlIGZvciBmbGFnX3ZhbHVlcyBwcm90bworcHViIG1vZCBmbGFnX3ZhbHVlcyB7CisgICAgdXNlIHN1cGVyOjoqOworCisgICAgLy8vIENvbnN0cnVjdCBhIHByb3RvIGluc3RhbmNlIGZyb20gYSB0ZXh0cHJvdG8gc3RyaW5nIGNvbnRlbnQKKyAgICBwdWIgZm4gdHJ5X2Zyb21fdGV4dF9wcm90byhzOiAmc3RyKSAtPiBSZXN1bHQ8UHJvdG9GbGFnVmFsdWVzPiB7CisgICAgICAgIGxldCBwZnY6IFByb3RvRmxhZ1ZhbHVlcyA9IHN1cGVyOjp0cnlfZnJvbV90ZXh0X3Byb3RvKHMpPzsKKyAgICAgICAgdmVyaWZ5X2ZpZWxkcygmcGZ2KT87CisgICAgICAgIE9rKHBmdikKKyAgICB9CisKKyAgICAvLy8gRW5zdXJlIHRoZSBwcm90byBpbnN0YW5jZSBpcyB2YWxpZCBieSBjaGVja2luZyBpdHMgZmllbGRzCisgICAgcHViIGZuIHZlcmlmeV9maWVsZHMocGZ2OiAmUHJvdG9GbGFnVmFsdWVzKSAtPiBSZXN1bHQ8KCk+IHsKKyAgICAgICAgZm9yIGZsYWdfdmFsdWUgaW4gcGZ2LmZsYWdfdmFsdWUuaXRlcigpIHsKKyAgICAgICAgICAgIHN1cGVyOjpmbGFnX3ZhbHVlOjp2ZXJpZnlfZmllbGRzKGZsYWdfdmFsdWUpPzsKKyAgICAgICAgfQorICAgICAgICBPaygoKSkKKyAgICB9Cit9CisKKy8vLyBVdGlsaXR5IG1vZHVsZSBmb3IgZmxhZ19wZXJtaXNzaW9uIHByb3RvIGVudW0KK3B1YiBtb2QgZmxhZ19wZXJtaXNzaW9uIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIGFueWhvdzo6YmFpbDsKKworICAgIC8vLyBDb25zdHJ1Y3QgYSBmbGFnIHBlcm1pc3Npb24gcHJvdG8gZW51bSBmcm9tIHN0cmluZworICAgIHB1YiBmbiBwYXJzZV9mcm9tX3N0cihwZXJtaXNzaW9uOiAmc3RyKSAtPiBSZXN1bHQ8UHJvdG9GbGFnUGVybWlzc2lvbj4geworICAgICAgICBtYXRjaCBwZXJtaXNzaW9uLnRvX2FzY2lpX2xvd2VyY2FzZSgpLmFzX3N0cigpIHsKKyAgICAgICAgICAgICJyZWFkX3dyaXRlIiA9PiBPayhQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFKSwKKyAgICAgICAgICAgICJyZWFkX29ubHkiID0+IE9rKFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfT05MWSksCisgICAgICAgICAgICBfID0+IGJhaWwhKCJQZXJtaXNzaW9uIG5lZWRzIHRvIGJlIHJlYWRfb25seSBvciByZWFkX3dyaXRlLiIpLAorICAgICAgICB9CisgICAgfQorCisgICAgLy8vIFNlcmlhbGl6ZSBmbGFnIHBlcm1pc3Npb24gcHJvdG8gZW51bSB0byBzdHJpbmcKKyAgICBwdWIgZm4gdG9fc3RyaW5nKHBlcm1pc3Npb246ICZQcm90b0ZsYWdQZXJtaXNzaW9uKSAtPiAmc3RyIHsKKyAgICAgICAgbWF0Y2ggcGVybWlzc2lvbiB7CisgICAgICAgICAgICBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFID0+ICJyZWFkX3dyaXRlIiwKKyAgICAgICAgICAgIFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfT05MWSA9PiAicmVhZF9vbmx5IiwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIFV0aWxpdHkgbW9kdWxlIGZvciB0cmFjZXBvaW50IHByb3RvCitwdWIgbW9kIHRyYWNlcG9pbnQgeworICAgIHVzZSBzdXBlcjo6KjsKKyAgICB1c2UgYW55aG93OjplbnN1cmU7CisKKyAgICAvLy8gRW5zdXJlIHRoZSBwcm90byBpbnN0YW5jZSBpcyB2YWxpZCBieSBjaGVja2luZyBpdHMgZmllbGRzCisgICAgcHViIGZuIHZlcmlmeV9maWVsZHModHA6ICZQcm90b1RyYWNlcG9pbnQpIC0+IFJlc3VsdDwoKT4geworICAgICAgICBlbnN1cmVfcmVxdWlyZWRfZmllbGRzISgidHJhY2Vwb2ludCIsIHRwLCAic291cmNlIiwgInN0YXRlIiwgInBlcm1pc3Npb24iKTsKKworICAgICAgICBlbnN1cmUhKCF0cC5zb3VyY2UoKS5pc19lbXB0eSgpLCAiYmFkIHRyYWNlcG9pbnQ6IGVtcHR5IHNvdXJjZSIpOworCisgICAgICAgIE9rKCgpKQorICAgIH0KK30KKworLy8vIFV0aWxpdHkgbW9kdWxlIGZvciBwYXJzZWRfZmxhZyBwcm90bworcHViIG1vZCBwYXJzZWRfZmxhZyB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBhbnlob3c6OmVuc3VyZTsKKworICAgIC8vLyBFbnN1cmUgdGhlIHByb3RvIGluc3RhbmNlIGlzIHZhbGlkIGJ5IGNoZWNraW5nIGl0cyBmaWVsZHMKKyAgICBwdWIgZm4gdmVyaWZ5X2ZpZWxkcyhwZjogJlByb3RvUGFyc2VkRmxhZykgLT4gUmVzdWx0PCgpPiB7CisgICAgICAgIGVuc3VyZV9yZXF1aXJlZF9maWVsZHMhKAorICAgICAgICAgICAgInBhcnNlZCBmbGFnIiwKKyAgICAgICAgICAgIHBmLAorICAgICAgICAgICAgInBhY2thZ2UiLAorICAgICAgICAgICAgIm5hbWUiLAorICAgICAgICAgICAgIm5hbWVzcGFjZSIsCisgICAgICAgICAgICAiZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgInN0YXRlIiwKKyAgICAgICAgICAgICJwZXJtaXNzaW9uIgorICAgICAgICApOworCisgICAgICAgIGVuc3VyZSEoCisgICAgICAgICAgICBpc192YWxpZF9wYWNrYWdlX2lkZW50KHBmLnBhY2thZ2UoKSksCisgICAgICAgICAgICAiYmFkIHBhcnNlZCBmbGFnOiBiYWQgcGFja2FnZSB7fSBleHBlY3RlZCBzbmFrZV9jYXNlIHN0cmluZ3MgZGVsaW1pdGVkIGJ5IGRvdHM7IFwKKyAgICAgICAgc2VlIHtBQ09ORklHX1BST1RPX1BBVEh9IGZvciBkZXRhaWxzIiwKKyAgICAgICAgICAgIHBmLnBhY2thZ2UoKQorICAgICAgICApOworICAgICAgICBlbnN1cmUhKAorICAgICAgICAgICAgIXBmLmhhc19jb250YWluZXIoKSB8fCBpc192YWxpZF9jb250YWluZXJfaWRlbnQocGYuY29udGFpbmVyKCkpLAorICAgICAgICAgICAgImJhZCBwYXJzZWQgZmxhZzogYmFkIGNvbnRhaW5lciIKKyAgICAgICAgKTsKKyAgICAgICAgZW5zdXJlISgKKyAgICAgICAgICAgIGlzX3ZhbGlkX25hbWVfaWRlbnQocGYubmFtZSgpKSwKKyAgICAgICAgICAgICJiYWQgcGFyc2VkIGZsYWc6IGJhZCBuYW1lIHt9IGV4cGVjdGVkIHNuYWtlX2Nhc2Ugc3RyaW5nOyBcCisgICAgICAgIHNlZSB7QUNPTkZJR19QUk9UT19QQVRIfSBmb3IgZGV0YWlscyIsCisgICAgICAgICAgICBwZi5uYW1lKCkKKyAgICAgICAgKTsKKyAgICAgICAgZW5zdXJlISgKKyAgICAgICAgICAgIGlzX3ZhbGlkX25hbWVfaWRlbnQocGYubmFtZXNwYWNlKCkpLAorICAgICAgICAgICAgImJhZCBwYXJzZWQgZmxhZzogYmFkIG5hbWVzcGFjZSB7fSBleHBlY3RlZCBzbmFrZV9jYXNlIHN0cmluZzsgXAorICAgICAgICBzZWUge0FDT05GSUdfUFJPVE9fUEFUSH0gZm9yIGRldGFpbHMiLAorICAgICAgICAgICAgcGYubmFtZXNwYWNlKCkKKyAgICAgICAgKTsKKyAgICAgICAgZW5zdXJlISghcGYuZGVzY3JpcHRpb24oKS5pc19lbXB0eSgpLCAiYmFkIHBhcnNlZCBmbGFnOiBlbXB0eSBkZXNjcmlwdGlvbiIpOworICAgICAgICBlbnN1cmUhKCFwZi50cmFjZS5pc19lbXB0eSgpLCAiYmFkIHBhcnNlZCBmbGFnOiBlbXB0eSB0cmFjZSIpOworICAgICAgICBmb3IgdHAgaW4gcGYudHJhY2UuaXRlcigpIHsKKyAgICAgICAgICAgIHN1cGVyOjp0cmFjZXBvaW50Ojp2ZXJpZnlfZmllbGRzKHRwKT87CisgICAgICAgIH0KKyAgICAgICAgZW5zdXJlIShwZi5idWcubGVuKCkgPT0gMSwgImJhZCBmbGFnIGRlY2xhcmF0aW9uOiBleGFjdGx5IG9uZSBidWcgcmVxdWlyZWQiKTsKKyAgICAgICAgaWYgcGYuaXNfZml4ZWRfcmVhZF9vbmx5KCkgeworICAgICAgICAgICAgZW5zdXJlISgKKyAgICAgICAgICAgICAgICBwZi5wZXJtaXNzaW9uKCkgPT0gUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9PTkxZLAorICAgICAgICAgICAgICAgICJiYWQgcGFyc2VkIGZsYWc6IGZsYWcgaXMgaXNfZml4ZWRfcmVhZF9vbmx5IGJ1dCBwZXJtaXNzaW9uIGlzIG5vdCBSRUFEX09OTFkiCisgICAgICAgICAgICApOworICAgICAgICAgICAgZm9yIHRwIGluIHBmLnRyYWNlLml0ZXIoKSB7CisgICAgICAgICAgICAgICAgZW5zdXJlISh0cC5wZXJtaXNzaW9uKCkgPT0gUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9PTkxZLAorICAgICAgICAgICAgICAgICJiYWQgcGFyc2VkIGZsYWc6IGZsYWcgaXMgaXNfZml4ZWRfcmVhZF9vbmx5IGJ1dCBhIHRyYWNlcG9pbnQncyBwZXJtaXNzaW9uIGlzIG5vdCBSRUFEX09OTFkiCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIC8vLyBHZXQgdGhlIGZpbGUgcGF0aCBvZiB0aGUgY29ycmVzcG9uZGluZyBmbGFnIGRlY2xhcmF0aW9uCisgICAgcHViIGZuIHBhdGhfdG9fZGVjbGFyYXRpb24ocGY6ICZQcm90b1BhcnNlZEZsYWcpIC0+ICZzdHIgeworICAgICAgICBkZWJ1Z19hc3NlcnQhKCFwZi50cmFjZS5pc19lbXB0eSgpKTsKKyAgICAgICAgcGYudHJhY2VbMF0uc291cmNlKCkKKyAgICB9Cit9CisKKy8vLyBVdGlsaXR5IG1vZHVsZSBmb3IgcGFyc2VkX2ZsYWdzIHByb3RvCitwdWIgbW9kIHBhcnNlZF9mbGFncyB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBhbnlob3c6OmJhaWw7CisgICAgdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKKworICAgIC8vLyBDb25zdHJ1Y3QgYSBwcm90byBpbnN0YW5jZSBmcm9tIGEgYmluYXJ5IHByb3RvIGJ5dGVzCisgICAgcHViIGZuIHRyeV9mcm9tX2JpbmFyeV9wcm90byhieXRlczogJlt1OF0pIC0+IFJlc3VsdDxQcm90b1BhcnNlZEZsYWdzPiB7CisgICAgICAgIGxldCBtZXNzYWdlOiBQcm90b1BhcnNlZEZsYWdzID0gcHJvdG9idWY6Ok1lc3NhZ2U6OnBhcnNlX2Zyb21fYnl0ZXMoYnl0ZXMpPzsKKyAgICAgICAgdmVyaWZ5X2ZpZWxkcygmbWVzc2FnZSk/OworICAgICAgICBPayhtZXNzYWdlKQorICAgIH0KKworICAgIC8vLyBFbnN1cmUgdGhlIHByb3RvIGluc3RhbmNlIGlzIHZhbGlkIGJ5IGNoZWNraW5nIGl0cyBmaWVsZHMKKyAgICBwdWIgZm4gdmVyaWZ5X2ZpZWxkcyhwZjogJlByb3RvUGFyc2VkRmxhZ3MpIC0+IFJlc3VsdDwoKT4geworICAgICAgICB1c2UgY3JhdGU6OnBhcnNlZF9mbGFnOjpwYXRoX3RvX2RlY2xhcmF0aW9uOworCisgICAgICAgIGxldCBtdXQgcHJldmlvdXM6IE9wdGlvbjwmUHJvdG9QYXJzZWRGbGFnPiA9IE5vbmU7CisgICAgICAgIGZvciBwYXJzZWRfZmxhZyBpbiBwZi5wYXJzZWRfZmxhZy5pdGVyKCkgeworICAgICAgICAgICAgaWYgbGV0IFNvbWUocHJldikgPSBwcmV2aW91cyB7CisgICAgICAgICAgICAgICAgbGV0IGEgPSBjcmVhdGVfc29ydGluZ19rZXkocHJldik7CisgICAgICAgICAgICAgICAgbGV0IGIgPSBjcmVhdGVfc29ydGluZ19rZXkocGFyc2VkX2ZsYWcpOworICAgICAgICAgICAgICAgIG1hdGNoIGEuY21wKCZiKSB7CisgICAgICAgICAgICAgICAgICAgIE9yZGVyaW5nOjpMZXNzID0+IHt9CisgICAgICAgICAgICAgICAgICAgIE9yZGVyaW5nOjpFcXVhbCA9PiBiYWlsISgKKyAgICAgICAgICAgICAgICAgICAgICAgICJiYWQgcGFyc2VkIGZsYWdzOiBkdXBsaWNhdGUgZmxhZyB7fSAoZGVmaW5lZCBpbiB7fSBhbmQge30pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGEsCisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoX3RvX2RlY2xhcmF0aW9uKHByZXYpLAorICAgICAgICAgICAgICAgICAgICAgICAgcGF0aF90b19kZWNsYXJhdGlvbihwYXJzZWRfZmxhZykKKyAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgT3JkZXJpbmc6OkdyZWF0ZXIgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgYmFpbCEoImJhZCBwYXJzZWQgZmxhZ3M6IG5vdCBzb3J0ZWQ6IHt9IGNvbWVzIGJlZm9yZSB7fSIsIGEsIGIpCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdXBlcjo6cGFyc2VkX2ZsYWc6OnZlcmlmeV9maWVsZHMocGFyc2VkX2ZsYWcpPzsKKyAgICAgICAgICAgIHByZXZpb3VzID0gU29tZShwYXJzZWRfZmxhZyk7CisgICAgICAgIH0KKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgLy8vIE1lcmdlIG11bHRpcGUgcGFyc2VkX2ZsYWdzIHByb3RvCisgICAgcHViIGZuIG1lcmdlKHBhcnNlZF9mbGFnczogVmVjPFByb3RvUGFyc2VkRmxhZ3M+LCBkZWR1cDogYm9vbCkgLT4gUmVzdWx0PFByb3RvUGFyc2VkRmxhZ3M+IHsKKyAgICAgICAgbGV0IG11dCBtZXJnZWQgPSBQcm90b1BhcnNlZEZsYWdzOjpuZXcoKTsKKyAgICAgICAgZm9yIG11dCBwZnMgaW4gcGFyc2VkX2ZsYWdzLmludG9faXRlcigpIHsKKyAgICAgICAgICAgIG1lcmdlZC5wYXJzZWRfZmxhZy5hcHBlbmQoJm11dCBwZnMucGFyc2VkX2ZsYWcpOworICAgICAgICB9CisgICAgICAgIG1lcmdlZC5wYXJzZWRfZmxhZy5zb3J0X2J5X2NhY2hlZF9rZXkoY3JlYXRlX3NvcnRpbmdfa2V5KTsKKyAgICAgICAgaWYgZGVkdXAgeworICAgICAgICAgICAgLy8gRGVkdXBsaWNhdGUgaWRlbnRpY2FsIHByb3RvYnVmIG1lc3NhZ2VzLiAgTWVzc2FnZXMgd2l0aCB0aGUgc2FtZSBzb3J0aW5nIGtleSBidXQKKyAgICAgICAgICAgIC8vIGRpZmZlcmVudCBmaWVsZHMgKGluY2x1ZGluZyB0aGUgcGF0aCB0byB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGUpIHdpbGwgbm90IGJlCisgICAgICAgICAgICAvLyBkZWR1cGxpY2F0ZWQgYW5kIHRyaWdnZXIgYW4gZXJyb3IgaW4gdmVyaWZ5X2ZpZWxkcy4KKyAgICAgICAgICAgIG1lcmdlZC5wYXJzZWRfZmxhZy5kZWR1cCgpOworICAgICAgICB9CisgICAgICAgIHZlcmlmeV9maWVsZHMoJm1lcmdlZCk/OworICAgICAgICBPayhtZXJnZWQpCisgICAgfQorCisgICAgLy8vIFNvcnQgcGFyc2VkIGZsYWdzCisgICAgcHViIGZuIHNvcnRfcGFyc2VkX2ZsYWdzKHBmOiAmbXV0IFByb3RvUGFyc2VkRmxhZ3MpIHsKKyAgICAgICAgcGYucGFyc2VkX2ZsYWcuc29ydF9ieV9rZXkoY3JlYXRlX3NvcnRpbmdfa2V5KTsKKyAgICB9CisKKyAgICBmbiBjcmVhdGVfc29ydGluZ19rZXkocGY6ICZQcm90b1BhcnNlZEZsYWcpIC0+IFN0cmluZyB7CisgICAgICAgIHBmLmZ1bGx5X3F1YWxpZmllZF9uYW1lKCkKKyAgICB9Cit9CisKKy8vLyBQYXJzZWRGbGFnRXh0IHRyYWl0CitwdWIgdHJhaXQgUGFyc2VkRmxhZ0V4dCB7CisgICAgLy8vIFJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUKKyAgICBmbiBmdWxseV9xdWFsaWZpZWRfbmFtZSgmc2VsZikgLT4gU3RyaW5nOworfQorCitpbXBsIFBhcnNlZEZsYWdFeHQgZm9yIFByb3RvUGFyc2VkRmxhZyB7CisgICAgZm4gZnVsbHlfcXVhbGlmaWVkX25hbWUoJnNlbGYpIC0+IFN0cmluZyB7CisgICAgICAgIGZvcm1hdCEoInt9Lnt9Iiwgc2VsZi5wYWNrYWdlKCksIHNlbGYubmFtZSgpKQorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2ZsYWdfZGVjbGFyYXRpb25zX3RyeV9mcm9tX3RleHRfcHJvdG8oKSB7CisgICAgICAgIC8vIHZhbGlkIGlucHV0CisgICAgICAgIGxldCBmbGFnX2RlY2xhcmF0aW9ucyA9IGZsYWdfZGVjbGFyYXRpb25zOjp0cnlfZnJvbV90ZXh0X3Byb3RvKAorICAgICAgICAgICAgciMiCitwYWNrYWdlOiAiY29tLmZvby5iYXIiCitjb250YWluZXI6ICJzeXN0ZW0iCitmbGFnIHsKKyAgICBuYW1lOiAiZmlyc3QiCisgICAgbmFtZXNwYWNlOiAiZmlyc3RfbnMiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlyc3QgZmxhZy4iCisgICAgYnVnOiAiMTIzIgorICAgIGlzX2V4cG9ydGVkOiB0cnVlCit9CitmbGFnIHsKKyAgICBuYW1lOiAic2Vjb25kIgorICAgIG5hbWVzcGFjZTogInNlY29uZF9ucyIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBzZWNvbmQgZmxhZy4iCisgICAgYnVnOiAiYWJjIgorICAgIGlzX2ZpeGVkX3JlYWRfb25seTogdHJ1ZQorfQorIiMsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKGZsYWdfZGVjbGFyYXRpb25zLnBhY2thZ2UoKSwgImNvbS5mb28uYmFyIik7CisgICAgICAgIGFzc2VydF9lcSEoZmxhZ19kZWNsYXJhdGlvbnMuY29udGFpbmVyKCksICJzeXN0ZW0iKTsKKyAgICAgICAgbGV0IGZpcnN0ID0gZmxhZ19kZWNsYXJhdGlvbnMuZmxhZy5pdGVyKCkuZmluZCh8cGZ8IHBmLm5hbWUoKSA9PSAiZmlyc3QiKS51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxIShmaXJzdC5uYW1lKCksICJmaXJzdCIpOworICAgICAgICBhc3NlcnRfZXEhKGZpcnN0Lm5hbWVzcGFjZSgpLCAiZmlyc3RfbnMiKTsKKyAgICAgICAgYXNzZXJ0X2VxIShmaXJzdC5kZXNjcmlwdGlvbigpLCAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGZpcnN0IGZsYWcuIik7CisgICAgICAgIGFzc2VydF9lcSEoZmlyc3QuYnVnLCB2ZWMhWyIxMjMiXSk7CisgICAgICAgIGFzc2VydCEoIWZpcnN0LmlzX2ZpeGVkX3JlYWRfb25seSgpKTsKKyAgICAgICAgYXNzZXJ0IShmaXJzdC5pc19leHBvcnRlZCgpKTsKKyAgICAgICAgbGV0IHNlY29uZCA9IGZsYWdfZGVjbGFyYXRpb25zLmZsYWcuaXRlcigpLmZpbmQofHBmfCBwZi5uYW1lKCkgPT0gInNlY29uZCIpLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKHNlY29uZC5uYW1lKCksICJzZWNvbmQiKTsKKyAgICAgICAgYXNzZXJ0X2VxIShzZWNvbmQubmFtZXNwYWNlKCksICJzZWNvbmRfbnMiKTsKKyAgICAgICAgYXNzZXJ0X2VxIShzZWNvbmQuZGVzY3JpcHRpb24oKSwgIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBzZWNvbmQgZmxhZy4iKTsKKyAgICAgICAgYXNzZXJ0X2VxIShzZWNvbmQuYnVnLCB2ZWMhWyJhYmMiXSk7CisgICAgICAgIGFzc2VydCEoc2Vjb25kLmlzX2ZpeGVkX3JlYWRfb25seSgpKTsKKyAgICAgICAgYXNzZXJ0ISghc2Vjb25kLmlzX2V4cG9ydGVkKCkpOworCisgICAgICAgIC8vIHZhbGlkIGlucHV0OiBtaXNzaW5nIGNvbnRhaW5lciBpbiBmbGFnIGRlY2xhcmF0aW9ucyBpcyBzdXBwb3J0ZWQKKyAgICAgICAgbGV0IGZsYWdfZGVjbGFyYXRpb25zID0gZmxhZ19kZWNsYXJhdGlvbnM6OnRyeV9mcm9tX3RleHRfcHJvdG8oCisgICAgICAgICAgICByIyIKK3BhY2thZ2U6ICJjb20uZm9vLmJhciIKK2ZsYWcgeworICAgIG5hbWU6ICJmaXJzdCIKKyAgICBuYW1lc3BhY2U6ICJmaXJzdF9ucyIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaXJzdCBmbGFnLiIKKyAgICBidWc6ICIxMjMiCit9CisiIywKKyAgICAgICAgKQorICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEoZmxhZ19kZWNsYXJhdGlvbnMuY29udGFpbmVyKCksICIiKTsKKyAgICAgICAgYXNzZXJ0ISghZmxhZ19kZWNsYXJhdGlvbnMuaGFzX2NvbnRhaW5lcigpKTsKKworICAgICAgICAvLyBiYWQgaW5wdXQ6IG1pc3NpbmcgcGFja2FnZSBpbiBmbGFnIGRlY2xhcmF0aW9ucworICAgICAgICBsZXQgZXJyb3IgPSBmbGFnX2RlY2xhcmF0aW9uczo6dHJ5X2Zyb21fdGV4dF9wcm90bygKKyAgICAgICAgICAgIHIjIgorY29udGFpbmVyOiAic3lzdGVtIgorZmxhZyB7CisgICAgbmFtZTogImZpcnN0IgorICAgIG5hbWVzcGFjZTogImZpcnN0X25zIgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGZpcnN0IGZsYWcuIgorfQorZmxhZyB7CisgICAgbmFtZTogInNlY29uZCIKKyAgICBuYW1lc3BhY2U6ICJzZWNvbmRfbnMiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgc2Vjb25kIGZsYWcuIgorfQorIiMsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcF9lcnIoKTsKKyAgICAgICAgYXNzZXJ0X2VxIShmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLCAiYmFkIGZsYWcgZGVjbGFyYXRpb25zOiBtaXNzaW5nIHBhY2thZ2UiKTsKKworICAgICAgICAvLyBiYWQgaW5wdXQ6IG1pc3NpbmcgbmFtZXNwYWNlIGluIGZsYWcgZGVjbGFyYXRpb24KKyAgICAgICAgbGV0IGVycm9yID0gZmxhZ19kZWNsYXJhdGlvbnM6OnRyeV9mcm9tX3RleHRfcHJvdG8oCisgICAgICAgICAgICByIyIKK3BhY2thZ2U6ICJjb20uZm9vLmJhciIKK2NvbnRhaW5lcjogInN5c3RlbSIKK2ZsYWcgeworICAgIG5hbWU6ICJmaXJzdCIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaXJzdCBmbGFnLiIKK30KK2ZsYWcgeworICAgIG5hbWU6ICJzZWNvbmQiCisgICAgbmFtZXNwYWNlOiAic2Vjb25kX25zIgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNlY29uZCBmbGFnLiIKK30KKyIjLAorICAgICAgICApCisgICAgICAgIC51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoZm9ybWF0ISgiezo/fSIsIGVycm9yKSwgImJhZCBmbGFnIGRlY2xhcmF0aW9uOiBtaXNzaW5nIG5hbWVzcGFjZSIpOworCisgICAgICAgIC8vIGJhZCBpbnB1dDogYmFkIHBhY2thZ2UgbmFtZSBpbiBmbGFnIGRlY2xhcmF0aW9ucworICAgICAgICBsZXQgZXJyb3IgPSBmbGFnX2RlY2xhcmF0aW9uczo6dHJ5X2Zyb21fdGV4dF9wcm90bygKKyAgICAgICAgICAgIHIjIgorcGFja2FnZTogIl9jb20uRk9PX19CQVIiCitjb250YWluZXI6ICJzeXN0ZW0iCitmbGFnIHsKKyAgICBuYW1lOiAiZmlyc3QiCisgICAgbmFtZXNwYWNlOiAiZmlyc3RfbnMiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlyc3QgZmxhZy4iCit9CitmbGFnIHsKKyAgICBuYW1lOiAic2Vjb25kIgorICAgIG5hbWVzcGFjZTogInNlY29uZF9ucyIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBzZWNvbmQgZmxhZy4iCit9CisiIywKKyAgICAgICAgKQorICAgICAgICAudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnQhKGZvcm1hdCEoIns6P30iLCBlcnJvcikuY29udGFpbnMoImJhZCBmbGFnIGRlY2xhcmF0aW9uczogYmFkIHBhY2thZ2UiKSk7CisKKyAgICAgICAgLy8gYmFkIGlucHV0OiBiYWQgbmFtZSBpbiBmbGFnIGRlY2xhcmF0aW9uCisgICAgICAgIGxldCBlcnJvciA9IGZsYWdfZGVjbGFyYXRpb25zOjp0cnlfZnJvbV90ZXh0X3Byb3RvKAorICAgICAgICAgICAgciMiCitwYWNrYWdlOiAiY29tLmZvby5iYXIiCitjb250YWluZXI6ICJzeXN0ZW0iCitmbGFnIHsKKyAgICBuYW1lOiAiRklSU1QiCisgICAgbmFtZXNwYWNlOiAiZmlyc3RfbnMiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlyc3QgZmxhZy4iCit9CitmbGFnIHsKKyAgICBuYW1lOiAic2Vjb25kIgorICAgIG5hbWVzcGFjZTogInNlY29uZF9ucyIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBzZWNvbmQgZmxhZy4iCit9CisiIywKKyAgICAgICAgKQorICAgICAgICAudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnQhKGZvcm1hdCEoIns6P30iLCBlcnJvcikuY29udGFpbnMoImJhZCBmbGFnIGRlY2xhcmF0aW9uOiBiYWQgbmFtZSIpKTsKKworICAgICAgICAvLyBiYWQgaW5wdXQ6IG5vIGJ1ZyBlbnRyaWVzIGluIGZsYWcgZGVjbGFyYXRpb24KKyAgICAgICAgbGV0IGVycm9yID0gZmxhZ19kZWNsYXJhdGlvbnM6OnRyeV9mcm9tX3RleHRfcHJvdG8oCisgICAgICAgICAgICByIyIKK3BhY2thZ2U6ICJjb20uZm9vLmJhciIKK2NvbnRhaW5lcjogInN5c3RlbSIKK2ZsYWcgeworICAgIG5hbWU6ICJmaXJzdCIKKyAgICBuYW1lc3BhY2U6ICJmaXJzdF9ucyIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaXJzdCBmbGFnLiIKK30KKyIjLAorICAgICAgICApCisgICAgICAgIC51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydCEoZm9ybWF0ISgiezo/fSIsIGVycm9yKS5jb250YWlucygiYmFkIGZsYWcgZGVjbGFyYXRpb246IGV4YWN0bHkgb25lIGJ1ZyByZXF1aXJlZCIpKTsKKworICAgICAgICAvLyBiYWQgaW5wdXQ6IG11bHRpcGxlIGJ1ZyBlbnRyaWVzIGluIGZsYWcgZGVjbGFyYXRpb24KKyAgICAgICAgbGV0IGVycm9yID0gZmxhZ19kZWNsYXJhdGlvbnM6OnRyeV9mcm9tX3RleHRfcHJvdG8oCisgICAgICAgICAgICByIyIKK3BhY2thZ2U6ICJjb20uZm9vLmJhciIKK2NvbnRhaW5lcjogInN5c3RlbSIKK2ZsYWcgeworICAgIG5hbWU6ICJmaXJzdCIKKyAgICBuYW1lc3BhY2U6ICJmaXJzdF9ucyIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaXJzdCBmbGFnLiIKKyAgICBidWc6ICIxMjMiCisgICAgYnVnOiAiYWJjIgorfQorIiMsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcF9lcnIoKTsKKyAgICAgICAgYXNzZXJ0IShmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLmNvbnRhaW5zKCJiYWQgZmxhZyBkZWNsYXJhdGlvbjogZXhhY3RseSBvbmUgYnVnIHJlcXVpcmVkIikpOworCisgICAgICAgIC8vIGJhZCBpbnB1dDogaW52YWxpZCBjb250YWluZXIgbmFtZSBpbiBmbGFnIGRlY2xhcmF0aW9uCisgICAgICAgIGxldCBlcnJvciA9IGZsYWdfZGVjbGFyYXRpb25zOjp0cnlfZnJvbV90ZXh0X3Byb3RvKAorICAgICAgICAgICAgciMiCitwYWNrYWdlOiAiY29tLmZvby5iYXIiCitjb250YWluZXI6ICJfX2JhZF9iYWRfY29udGFpbmVyLmNvbSIKK2ZsYWcgeworICAgIG5hbWU6ICJmaXJzdCIKKyAgICBuYW1lc3BhY2U6ICJmaXJzdF9ucyIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaXJzdCBmbGFnLiIKKyAgICBidWc6ICIxMjMiCisgICAgYnVnOiAiYWJjIgorfQorIiMsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcF9lcnIoKTsKKyAgICAgICAgYXNzZXJ0IShmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLmNvbnRhaW5zKCJiYWQgZmxhZyBkZWNsYXJhdGlvbnM6IGJhZCBjb250YWluZXIiKSk7CisKKyAgICAgICAgLy8gVE9ETyhiLzMxMjc2OTcxMCk6IFZlcmlmeSBlcnJvciB3aGVuIGNvbnRhaW5lciBpcyBtaXNzaW5nLgorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2ZsYWdfdmFsdWVzX3RyeV9mcm9tX3RleHRfcHJvdG8oKSB7CisgICAgICAgIC8vIHZhbGlkIGlucHV0CisgICAgICAgIGxldCBmbGFnX3ZhbHVlcyA9IGZsYWdfdmFsdWVzOjp0cnlfZnJvbV90ZXh0X3Byb3RvKAorICAgICAgICAgICAgciMiCitmbGFnX3ZhbHVlIHsKKyAgICBwYWNrYWdlOiAiY29tLmZpcnN0IgorICAgIG5hbWU6ICJmaXJzdCIKKyAgICBzdGF0ZTogRElTQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKK30KK2ZsYWdfdmFsdWUgeworICAgIHBhY2thZ2U6ICJjb20uc2Vjb25kIgorICAgIG5hbWU6ICJzZWNvbmQiCisgICAgc3RhdGU6IEVOQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX1dSSVRFCit9CisiIywKKyAgICAgICAgKQorICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBmaXJzdCA9IGZsYWdfdmFsdWVzLmZsYWdfdmFsdWUuaXRlcigpLmZpbmQofGZ2fCBmdi5uYW1lKCkgPT0gImZpcnN0IikudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEoZmlyc3QucGFja2FnZSgpLCAiY29tLmZpcnN0Iik7CisgICAgICAgIGFzc2VydF9lcSEoZmlyc3QubmFtZSgpLCAiZmlyc3QiKTsKKyAgICAgICAgYXNzZXJ0X2VxIShmaXJzdC5zdGF0ZSgpLCBQcm90b0ZsYWdTdGF0ZTo6RElTQUJMRUQpOworICAgICAgICBhc3NlcnRfZXEhKGZpcnN0LnBlcm1pc3Npb24oKSwgUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9PTkxZKTsKKyAgICAgICAgbGV0IHNlY29uZCA9IGZsYWdfdmFsdWVzLmZsYWdfdmFsdWUuaXRlcigpLmZpbmQofGZ2fCBmdi5uYW1lKCkgPT0gInNlY29uZCIpLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKHNlY29uZC5wYWNrYWdlKCksICJjb20uc2Vjb25kIik7CisgICAgICAgIGFzc2VydF9lcSEoc2Vjb25kLm5hbWUoKSwgInNlY29uZCIpOworICAgICAgICBhc3NlcnRfZXEhKHNlY29uZC5zdGF0ZSgpLCBQcm90b0ZsYWdTdGF0ZTo6RU5BQkxFRCk7CisgICAgICAgIGFzc2VydF9lcSEoc2Vjb25kLnBlcm1pc3Npb24oKSwgUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9XUklURSk7CisKKyAgICAgICAgLy8gYmFkIGlucHV0OiBiYWQgcGFja2FnZSBpbiBmbGFnIHZhbHVlCisgICAgICAgIGxldCBlcnJvciA9IGZsYWdfdmFsdWVzOjp0cnlfZnJvbV90ZXh0X3Byb3RvKAorICAgICAgICAgICAgciMiCitmbGFnX3ZhbHVlIHsKKyAgICBwYWNrYWdlOiAiQ09NLkZJUlNUIgorICAgIG5hbWU6ICJmaXJzdCIKKyAgICBzdGF0ZTogRElTQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKK30KKyIjLAorICAgICAgICApCisgICAgICAgIC51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydCEoZm9ybWF0ISgiezo/fSIsIGVycm9yKS5jb250YWlucygiYmFkIGZsYWcgdmFsdWU6IGJhZCBwYWNrYWdlIikpOworCisgICAgICAgIC8vIGJhZCBpbnB1dDogYmFkIG5hbWUgaW4gZmxhZyB2YWx1ZQorICAgICAgICBsZXQgZXJyb3IgPSBmbGFnX3ZhbHVlczo6dHJ5X2Zyb21fdGV4dF9wcm90bygKKyAgICAgICAgICAgIHIjIgorZmxhZ192YWx1ZSB7CisgICAgcGFja2FnZTogImNvbS5maXJzdCIKKyAgICBuYW1lOiAiRklSU1QiCisgICAgc3RhdGU6IERJU0FCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCit9CisiIywKKyAgICAgICAgKQorICAgICAgICAudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnQhKGZvcm1hdCEoIns6P30iLCBlcnJvcikuY29udGFpbnMoImJhZCBmbGFnIHZhbHVlOiBiYWQgbmFtZSIpKTsKKworICAgICAgICAvLyBiYWQgaW5wdXQ6IG1pc3Npbmcgc3RhdGUgaW4gZmxhZyB2YWx1ZQorICAgICAgICBsZXQgZXJyb3IgPSBmbGFnX3ZhbHVlczo6dHJ5X2Zyb21fdGV4dF9wcm90bygKKyAgICAgICAgICAgIHIjIgorZmxhZ192YWx1ZSB7CisgICAgcGFja2FnZTogImNvbS5maXJzdCIKKyAgICBuYW1lOiAiZmlyc3QiCisgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCit9CisiIywKKyAgICAgICAgKQorICAgICAgICAudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKGZvcm1hdCEoIns6P30iLCBlcnJvciksICJiYWQgZmxhZyB2YWx1ZTogbWlzc2luZyBzdGF0ZSIpOworCisgICAgICAgIC8vIGJhZCBpbnB1dDogbWlzc2luZyBwZXJtaXNzaW9uIGluIGZsYWcgdmFsdWUKKyAgICAgICAgbGV0IGVycm9yID0gZmxhZ192YWx1ZXM6OnRyeV9mcm9tX3RleHRfcHJvdG8oCisgICAgICAgICAgICByIyIKK2ZsYWdfdmFsdWUgeworICAgIHBhY2thZ2U6ICJjb20uZmlyc3QiCisgICAgbmFtZTogImZpcnN0IgorICAgIHN0YXRlOiBESVNBQkxFRAorfQorIiMsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcF9lcnIoKTsKKyAgICAgICAgYXNzZXJ0X2VxIShmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLCAiYmFkIGZsYWcgdmFsdWU6IG1pc3NpbmcgcGVybWlzc2lvbiIpOworICAgIH0KKworICAgIGZuIHRyeV9mcm9tX2JpbmFyeV9wcm90b19mcm9tX3RleHRfcHJvdG8odGV4dF9wcm90bzogJnN0cikgLT4gUmVzdWx0PFByb3RvUGFyc2VkRmxhZ3M+IHsKKyAgICAgICAgdXNlIHByb3RvYnVmOjpNZXNzYWdlOworCisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3M6IFByb3RvUGFyc2VkRmxhZ3MgPSB0cnlfZnJvbV90ZXh0X3Byb3RvKHRleHRfcHJvdG8pPzsKKyAgICAgICAgbGV0IG11dCBiaW5hcnlfcHJvdG8gPSBWZWM6Om5ldygpOworICAgICAgICBwYXJzZWRfZmxhZ3Mud3JpdGVfdG9fdmVjKCZtdXQgYmluYXJ5X3Byb3RvKT87CisgICAgICAgIHBhcnNlZF9mbGFnczo6dHJ5X2Zyb21fYmluYXJ5X3Byb3RvKCZiaW5hcnlfcHJvdG8pCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfcGFyc2VkX2ZsYWdzX3RyeV9mcm9tX3RleHRfcHJvdG8oKSB7CisgICAgICAgIC8vIHZhbGlkIGlucHV0CisgICAgICAgIGxldCB0ZXh0X3Byb3RvID0gciMiCitwYXJzZWRfZmxhZyB7CisgICAgcGFja2FnZTogImNvbS5maXJzdCIKKyAgICBuYW1lOiAiZmlyc3QiCisgICAgbmFtZXNwYWNlOiAiZmlyc3RfbnMiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlyc3QgZmxhZy4iCisgICAgYnVnOiAiU09NRV9CVUciCisgICAgc3RhdGU6IERJU0FCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgICAgdHJhY2UgeworICAgICAgICBzb3VyY2U6ICJmbGFncy5kZWNsYXJhdGlvbnMiCisgICAgICAgIHN0YXRlOiBESVNBQkxFRAorICAgICAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgICB9CisgICAgY29udGFpbmVyOiAic3lzdGVtIgorfQorcGFyc2VkX2ZsYWcgeworICAgIHBhY2thZ2U6ICJjb20uc2Vjb25kIgorICAgIG5hbWU6ICJzZWNvbmQiCisgICAgbmFtZXNwYWNlOiAic2Vjb25kX25zIgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNlY29uZCBmbGFnLiIKKyAgICBidWc6ICJTT01FX0JVRyIKKyAgICBzdGF0ZTogRU5BQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorICAgIHRyYWNlIHsKKyAgICAgICAgc291cmNlOiAiZmxhZ3MuZGVjbGFyYXRpb25zIgorICAgICAgICBzdGF0ZTogRElTQUJMRUQKKyAgICAgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgICAgfQorICAgIHRyYWNlIHsKKyAgICAgICAgc291cmNlOiAiZmxhZ3MudmFsdWVzIgorICAgICAgICBzdGF0ZTogRU5BQkxFRAorICAgICAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgICB9CisgICAgaXNfZml4ZWRfcmVhZF9vbmx5OiB0cnVlCisgICAgY29udGFpbmVyOiAic3lzdGVtIgorfQorIiM7CisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPSB0cnlfZnJvbV9iaW5hcnlfcHJvdG9fZnJvbV90ZXh0X3Byb3RvKHRleHRfcHJvdG8pLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKHBhcnNlZF9mbGFncy5wYXJzZWRfZmxhZy5sZW4oKSwgMik7CisgICAgICAgIGxldCBzZWNvbmQgPSBwYXJzZWRfZmxhZ3MucGFyc2VkX2ZsYWcuaXRlcigpLmZpbmQofGZ2fCBmdi5uYW1lKCkgPT0gInNlY29uZCIpLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKHNlY29uZC5wYWNrYWdlKCksICJjb20uc2Vjb25kIik7CisgICAgICAgIGFzc2VydF9lcSEoc2Vjb25kLm5hbWUoKSwgInNlY29uZCIpOworICAgICAgICBhc3NlcnRfZXEhKHNlY29uZC5uYW1lc3BhY2UoKSwgInNlY29uZF9ucyIpOworICAgICAgICBhc3NlcnRfZXEhKHNlY29uZC5kZXNjcmlwdGlvbigpLCAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNlY29uZCBmbGFnLiIpOworICAgICAgICBhc3NlcnRfZXEhKHNlY29uZC5idWcsIHZlYyFbIlNPTUVfQlVHIl0pOworICAgICAgICBhc3NlcnRfZXEhKHNlY29uZC5zdGF0ZSgpLCBQcm90b0ZsYWdTdGF0ZTo6RU5BQkxFRCk7CisgICAgICAgIGFzc2VydF9lcSEoc2Vjb25kLnBlcm1pc3Npb24oKSwgUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9PTkxZKTsKKyAgICAgICAgYXNzZXJ0X2VxISgyLCBzZWNvbmQudHJhY2UubGVuKCkpOworICAgICAgICBhc3NlcnRfZXEhKHNlY29uZC50cmFjZVswXS5zb3VyY2UoKSwgImZsYWdzLmRlY2xhcmF0aW9ucyIpOworICAgICAgICBhc3NlcnRfZXEhKHNlY29uZC50cmFjZVswXS5zdGF0ZSgpLCBQcm90b0ZsYWdTdGF0ZTo6RElTQUJMRUQpOworICAgICAgICBhc3NlcnRfZXEhKHNlY29uZC50cmFjZVswXS5wZXJtaXNzaW9uKCksIFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfT05MWSk7CisgICAgICAgIGFzc2VydF9lcSEoc2Vjb25kLnRyYWNlWzFdLnNvdXJjZSgpLCAiZmxhZ3MudmFsdWVzIik7CisgICAgICAgIGFzc2VydF9lcSEoc2Vjb25kLnRyYWNlWzFdLnN0YXRlKCksIFByb3RvRmxhZ1N0YXRlOjpFTkFCTEVEKTsKKyAgICAgICAgYXNzZXJ0X2VxIShzZWNvbmQudHJhY2VbMV0ucGVybWlzc2lvbigpLCBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX09OTFkpOworICAgICAgICBhc3NlcnQhKHNlY29uZC5pc19maXhlZF9yZWFkX29ubHkoKSk7CisKKyAgICAgICAgLy8gdmFsaWQgaW5wdXQ6IGVtcHR5CisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPSB0cnlfZnJvbV9iaW5hcnlfcHJvdG9fZnJvbV90ZXh0X3Byb3RvKCIiKS51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0IShwYXJzZWRfZmxhZ3MucGFyc2VkX2ZsYWcuaXNfZW1wdHkoKSk7CisKKyAgICAgICAgLy8gYmFkIGlucHV0OiBlbXB0eSB0cmFjZQorICAgICAgICBsZXQgdGV4dF9wcm90byA9IHIjIgorcGFyc2VkX2ZsYWcgeworICAgIHBhY2thZ2U6ICJjb20uZmlyc3QiCisgICAgbmFtZTogImZpcnN0IgorICAgIG5hbWVzcGFjZTogImZpcnN0X25zIgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGZpcnN0IGZsYWcuIgorICAgIHN0YXRlOiBESVNBQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorICAgIGNvbnRhaW5lcjogInN5c3RlbSIKK30KKyIjOworICAgICAgICBsZXQgZXJyb3IgPSB0cnlfZnJvbV9iaW5hcnlfcHJvdG9fZnJvbV90ZXh0X3Byb3RvKHRleHRfcHJvdG8pLnVud3JhcF9lcnIoKTsKKyAgICAgICAgYXNzZXJ0X2VxIShmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLCAiYmFkIHBhcnNlZCBmbGFnOiBlbXB0eSB0cmFjZSIpOworCisgICAgICAgIC8vIGJhZCBpbnB1dDogbWlzc2luZyBuYW1lc3BhY2UgaW4gcGFyc2VkX2ZsYWcKKyAgICAgICAgbGV0IHRleHRfcHJvdG8gPSByIyIKK3BhcnNlZF9mbGFnIHsKKyAgICBwYWNrYWdlOiAiY29tLmZpcnN0IgorICAgIG5hbWU6ICJmaXJzdCIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaXJzdCBmbGFnLiIKKyAgICBzdGF0ZTogRElTQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgICB0cmFjZSB7CisgICAgICAgIHNvdXJjZTogImZsYWdzLmRlY2xhcmF0aW9ucyIKKyAgICAgICAgc3RhdGU6IERJU0FCTEVECisgICAgICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorICAgIH0KKyAgICBjb250YWluZXI6ICJzeXN0ZW0iCit9CisiIzsKKyAgICAgICAgbGV0IGVycm9yID0gdHJ5X2Zyb21fYmluYXJ5X3Byb3RvX2Zyb21fdGV4dF9wcm90byh0ZXh0X3Byb3RvKS51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoZm9ybWF0ISgiezo/fSIsIGVycm9yKSwgImJhZCBwYXJzZWQgZmxhZzogbWlzc2luZyBuYW1lc3BhY2UiKTsKKworICAgICAgICAvLyBiYWQgaW5wdXQ6IHBhcnNlZF9mbGFnIG5vdCBzb3J0ZWQgYnkgcGFja2FnZQorICAgICAgICBsZXQgdGV4dF9wcm90byA9IHIjIgorcGFyc2VkX2ZsYWcgeworICAgIHBhY2thZ2U6ICJiYmIuYmJiIgorICAgIG5hbWU6ICJmaXJzdCIKKyAgICBuYW1lc3BhY2U6ICJmaXJzdF9ucyIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaXJzdCBmbGFnLiIKKyAgICBidWc6ICIiCisgICAgc3RhdGU6IERJU0FCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgICAgdHJhY2UgeworICAgICAgICBzb3VyY2U6ICJmbGFncy5kZWNsYXJhdGlvbnMiCisgICAgICAgIHN0YXRlOiBESVNBQkxFRAorICAgICAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgICB9CisgICAgY29udGFpbmVyOiAic3lzdGVtIgorfQorcGFyc2VkX2ZsYWcgeworICAgIHBhY2thZ2U6ICJhYWEuYWFhIgorICAgIG5hbWU6ICJzZWNvbmQiCisgICAgbmFtZXNwYWNlOiAic2Vjb25kX25zIgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNlY29uZCBmbGFnLiIKKyAgICBidWc6ICIiCisgICAgc3RhdGU6IEVOQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX1dSSVRFCisgICAgdHJhY2UgeworICAgICAgICBzb3VyY2U6ICJmbGFncy5kZWNsYXJhdGlvbnMiCisgICAgICAgIHN0YXRlOiBESVNBQkxFRAorICAgICAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgICB9CisgICAgY29udGFpbmVyOiAic3lzdGVtIgorfQorIiM7CisgICAgICAgIGxldCBlcnJvciA9IHRyeV9mcm9tX2JpbmFyeV9wcm90b19mcm9tX3RleHRfcHJvdG8odGV4dF9wcm90bykudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVycm9yKSwKKyAgICAgICAgICAgICJiYWQgcGFyc2VkIGZsYWdzOiBub3Qgc29ydGVkOiBiYmIuYmJiLmZpcnN0IGNvbWVzIGJlZm9yZSBhYWEuYWFhLnNlY29uZCIKKyAgICAgICAgKTsKKworICAgICAgICAvLyBiYWQgaW5wdXQ6IHBhcnNlZF9mbGFnIG5vdCBzb3J0ZWQgYnkgbmFtZQorICAgICAgICBsZXQgdGV4dF9wcm90byA9IHIjIgorcGFyc2VkX2ZsYWcgeworICAgIHBhY2thZ2U6ICJjb20uZm9vIgorICAgIG5hbWU6ICJiYmIiCisgICAgbmFtZXNwYWNlOiAiZmlyc3RfbnMiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlyc3QgZmxhZy4iCisgICAgYnVnOiAiIgorICAgIHN0YXRlOiBESVNBQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorICAgIHRyYWNlIHsKKyAgICAgICAgc291cmNlOiAiZmxhZ3MuZGVjbGFyYXRpb25zIgorICAgICAgICBzdGF0ZTogRElTQUJMRUQKKyAgICAgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgICAgfQorICAgIGNvbnRhaW5lcjogInN5c3RlbSIKK30KK3BhcnNlZF9mbGFnIHsKKyAgICBwYWNrYWdlOiAiY29tLmZvbyIKKyAgICBuYW1lOiAiYWFhIgorICAgIG5hbWVzcGFjZTogInNlY29uZF9ucyIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBzZWNvbmQgZmxhZy4iCisgICAgYnVnOiAiIgorICAgIHN0YXRlOiBFTkFCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9XUklURQorICAgIHRyYWNlIHsKKyAgICAgICAgc291cmNlOiAiZmxhZ3MuZGVjbGFyYXRpb25zIgorICAgICAgICBzdGF0ZTogRElTQUJMRUQKKyAgICAgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgICAgfQorICAgIGNvbnRhaW5lcjogInN5c3RlbSIKK30KKyIjOworICAgICAgICBsZXQgZXJyb3IgPSB0cnlfZnJvbV9iaW5hcnlfcHJvdG9fZnJvbV90ZXh0X3Byb3RvKHRleHRfcHJvdG8pLnVud3JhcF9lcnIoKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIGZvcm1hdCEoIns6P30iLCBlcnJvciksCisgICAgICAgICAgICAiYmFkIHBhcnNlZCBmbGFnczogbm90IHNvcnRlZDogY29tLmZvby5iYmIgY29tZXMgYmVmb3JlIGNvbS5mb28uYWFhIgorICAgICAgICApOworCisgICAgICAgIC8vIGJhZCBpbnB1dDogZHVwbGljYXRlIGZsYWdzCisgICAgICAgIGxldCB0ZXh0X3Byb3RvID0gciMiCitwYXJzZWRfZmxhZyB7CisgICAgcGFja2FnZTogImNvbS5mb28iCisgICAgbmFtZTogImJhciIKKyAgICBuYW1lc3BhY2U6ICJmaXJzdF9ucyIKKyAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmaXJzdCBmbGFnLiIKKyAgICBidWc6ICIiCisgICAgc3RhdGU6IERJU0FCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgICAgdHJhY2UgeworICAgICAgICBzb3VyY2U6ICJmbGFncy5kZWNsYXJhdGlvbnMiCisgICAgICAgIHN0YXRlOiBESVNBQkxFRAorICAgICAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgICB9CisgICAgY29udGFpbmVyOiAic3lzdGVtIgorfQorcGFyc2VkX2ZsYWcgeworICAgIHBhY2thZ2U6ICJjb20uZm9vIgorICAgIG5hbWU6ICJiYXIiCisgICAgbmFtZXNwYWNlOiAic2Vjb25kX25zIgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNlY29uZCBmbGFnLiIKKyAgICBidWc6ICIiCisgICAgc3RhdGU6IEVOQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX1dSSVRFCisgICAgdHJhY2UgeworICAgICAgICBzb3VyY2U6ICJmbGFncy5kZWNsYXJhdGlvbnMiCisgICAgICAgIHN0YXRlOiBESVNBQkxFRAorICAgICAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgICB9CisgICAgY29udGFpbmVyOiAic3lzdGVtIgorfQorIiM7CisgICAgICAgIGxldCBlcnJvciA9IHRyeV9mcm9tX2JpbmFyeV9wcm90b19mcm9tX3RleHRfcHJvdG8odGV4dF9wcm90bykudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKGZvcm1hdCEoIns6P30iLCBlcnJvciksICJiYWQgcGFyc2VkIGZsYWdzOiBkdXBsaWNhdGUgZmxhZyBjb20uZm9vLmJhciAoZGVmaW5lZCBpbiBmbGFncy5kZWNsYXJhdGlvbnMgYW5kIGZsYWdzLmRlY2xhcmF0aW9ucykiKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9wYXJzZWRfZmxhZ19wYXRoX3RvX2RlY2xhcmF0aW9uKCkgeworICAgICAgICBsZXQgdGV4dF9wcm90byA9IHIjIgorcGFyc2VkX2ZsYWcgeworICAgIHBhY2thZ2U6ICJjb20uZm9vIgorICAgIG5hbWU6ICJiYXIiCisgICAgbmFtZXNwYWNlOiAiZmlyc3RfbnMiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlyc3QgZmxhZy4iCisgICAgYnVnOiAiYi8xMjM0NTY3OCIKKyAgICBzdGF0ZTogRElTQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgICB0cmFjZSB7CisgICAgICAgIHNvdXJjZTogImZsYWdzLmRlY2xhcmF0aW9ucyIKKyAgICAgICAgc3RhdGU6IERJU0FCTEVECisgICAgICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorICAgIH0KKyAgICB0cmFjZSB7CisgICAgICAgIHNvdXJjZTogImZsYWdzLnZhbHVlcyIKKyAgICAgICAgc3RhdGU6IEVOQUJMRUQKKyAgICAgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgICAgfQorICAgIGNvbnRhaW5lcjogInN5c3RlbSIKK30KKyIjOworICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0gdHJ5X2Zyb21fYmluYXJ5X3Byb3RvX2Zyb21fdGV4dF9wcm90byh0ZXh0X3Byb3RvKS51bndyYXAoKTsKKyAgICAgICAgbGV0IHBhcnNlZF9mbGFnID0gJnBhcnNlZF9mbGFncy5wYXJzZWRfZmxhZ1swXTsKKyAgICAgICAgYXNzZXJ0X2VxIShjcmF0ZTo6cGFyc2VkX2ZsYWc6OnBhdGhfdG9fZGVjbGFyYXRpb24ocGFyc2VkX2ZsYWcpLCAiZmxhZ3MuZGVjbGFyYXRpb25zIik7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfcGFyc2VkX2ZsYWdzX21lcmdlKCkgeworICAgICAgICBsZXQgdGV4dF9wcm90byA9IHIjIgorcGFyc2VkX2ZsYWcgeworICAgIHBhY2thZ2U6ICJjb20uZmlyc3QiCisgICAgbmFtZTogImZpcnN0IgorICAgIG5hbWVzcGFjZTogImZpcnN0X25zIgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGZpcnN0IGZsYWcuIgorICAgIGJ1ZzogImEiCisgICAgc3RhdGU6IERJU0FCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgICAgdHJhY2UgeworICAgICAgICBzb3VyY2U6ICJmbGFncy5kZWNsYXJhdGlvbnMiCisgICAgICAgIHN0YXRlOiBESVNBQkxFRAorICAgICAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgICB9CisgICAgY29udGFpbmVyOiAic3lzdGVtIgorfQorcGFyc2VkX2ZsYWcgeworICAgIHBhY2thZ2U6ICJjb20uc2Vjb25kIgorICAgIG5hbWU6ICJzZWNvbmQiCisgICAgbmFtZXNwYWNlOiAic2Vjb25kX25zIgorICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNlY29uZCBmbGFnLiIKKyAgICBidWc6ICJiIgorICAgIHN0YXRlOiBFTkFCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9XUklURQorICAgIHRyYWNlIHsKKyAgICAgICAgc291cmNlOiAiZmxhZ3MuZGVjbGFyYXRpb25zIgorICAgICAgICBzdGF0ZTogRElTQUJMRUQKKyAgICAgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgICAgfQorICAgIGNvbnRhaW5lcjogInN5c3RlbSIKK30KKyIjOworICAgICAgICBsZXQgZXhwZWN0ZWQgPSB0cnlfZnJvbV9iaW5hcnlfcHJvdG9fZnJvbV90ZXh0X3Byb3RvKHRleHRfcHJvdG8pLnVud3JhcCgpOworCisgICAgICAgIGxldCB0ZXh0X3Byb3RvID0gciMiCitwYXJzZWRfZmxhZyB7CisgICAgcGFja2FnZTogImNvbS5maXJzdCIKKyAgICBuYW1lOiAiZmlyc3QiCisgICAgbmFtZXNwYWNlOiAiZmlyc3RfbnMiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlyc3QgZmxhZy4iCisgICAgYnVnOiAiYSIKKyAgICBzdGF0ZTogRElTQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKKyAgICB0cmFjZSB7CisgICAgICAgIHNvdXJjZTogImZsYWdzLmRlY2xhcmF0aW9ucyIKKyAgICAgICAgc3RhdGU6IERJU0FCTEVECisgICAgICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorICAgIH0KKyAgICBjb250YWluZXI6ICJzeXN0ZW0iCit9CisiIzsKKyAgICAgICAgbGV0IGZpcnN0ID0gdHJ5X2Zyb21fYmluYXJ5X3Byb3RvX2Zyb21fdGV4dF9wcm90byh0ZXh0X3Byb3RvKS51bndyYXAoKTsKKworICAgICAgICBsZXQgdGV4dF9wcm90byA9IHIjIgorcGFyc2VkX2ZsYWcgeworICAgIHBhY2thZ2U6ICJjb20uc2Vjb25kIgorICAgIG5hbWU6ICJzZWNvbmQiCisgICAgbmFtZXNwYWNlOiAic2Vjb25kX25zIgorICAgIGJ1ZzogImIiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgc2Vjb25kIGZsYWcuIgorICAgIHN0YXRlOiBFTkFCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9XUklURQorICAgIHRyYWNlIHsKKyAgICAgICAgc291cmNlOiAiZmxhZ3MuZGVjbGFyYXRpb25zIgorICAgICAgICBzdGF0ZTogRElTQUJMRUQKKyAgICAgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgICAgfQorICAgIGNvbnRhaW5lcjogInN5c3RlbSIKK30KKyIjOworICAgICAgICBsZXQgc2Vjb25kID0gdHJ5X2Zyb21fYmluYXJ5X3Byb3RvX2Zyb21fdGV4dF9wcm90byh0ZXh0X3Byb3RvKS51bndyYXAoKTsKKworICAgICAgICBsZXQgdGV4dF9wcm90byA9IHIjIgorcGFyc2VkX2ZsYWcgeworICAgIHBhY2thZ2U6ICJjb20uc2Vjb25kIgorICAgIG5hbWU6ICJzZWNvbmQiCisgICAgbmFtZXNwYWNlOiAic2Vjb25kX25zIgorICAgIGJ1ZzogImIiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgc2Vjb25kIGZsYWcuIgorICAgIHN0YXRlOiBFTkFCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9XUklURQorICAgIHRyYWNlIHsKKyAgICAgICAgc291cmNlOiAiZHVwbGljYXRlL2ZsYWdzLmRlY2xhcmF0aW9ucyIKKyAgICAgICAgc3RhdGU6IERJU0FCTEVECisgICAgICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorICAgIH0KK30KKyIjOworICAgICAgICBsZXQgc2Vjb25kX2R1cGxpY2F0ZSA9IHRyeV9mcm9tX2JpbmFyeV9wcm90b19mcm9tX3RleHRfcHJvdG8odGV4dF9wcm90bykudW53cmFwKCk7CisKKyAgICAgICAgLy8gYmFkIGNhc2VzCisKKyAgICAgICAgLy8gdHdvIG9mIHRoZSBzYW1lIGZsYWcgd2l0aCBkZWR1cCBkaXNhYmxlZAorICAgICAgICBsZXQgZXJyb3IgPSBwYXJzZWRfZmxhZ3M6Om1lcmdlKHZlYyFbZmlyc3QuY2xvbmUoKSwgZmlyc3QuY2xvbmUoKV0sIGZhbHNlKS51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoZm9ybWF0ISgiezo/fSIsIGVycm9yKSwgImJhZCBwYXJzZWQgZmxhZ3M6IGR1cGxpY2F0ZSBmbGFnIGNvbS5maXJzdC5maXJzdCAoZGVmaW5lZCBpbiBmbGFncy5kZWNsYXJhdGlvbnMgYW5kIGZsYWdzLmRlY2xhcmF0aW9ucykiKTsKKworICAgICAgICAvLyB0d28gY29uZmxpY3RpbmcgZmxhZ3Mgd2l0aCBkZWR1cCBkaXNhYmxlZAorICAgICAgICBsZXQgZXJyb3IgPQorICAgICAgICAgICAgcGFyc2VkX2ZsYWdzOjptZXJnZSh2ZWMhW3NlY29uZC5jbG9uZSgpLCBzZWNvbmRfZHVwbGljYXRlLmNsb25lKCldLCBmYWxzZSkudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKGZvcm1hdCEoIns6P30iLCBlcnJvciksICJiYWQgcGFyc2VkIGZsYWdzOiBkdXBsaWNhdGUgZmxhZyBjb20uc2Vjb25kLnNlY29uZCAoZGVmaW5lZCBpbiBmbGFncy5kZWNsYXJhdGlvbnMgYW5kIGR1cGxpY2F0ZS9mbGFncy5kZWNsYXJhdGlvbnMpIik7CisKKyAgICAgICAgLy8gdHdvIGNvbmZsaWN0aW5nIGZsYWdzIHdpdGggZGVkdXAgZW5hYmxlZAorICAgICAgICBsZXQgZXJyb3IgPQorICAgICAgICAgICAgcGFyc2VkX2ZsYWdzOjptZXJnZSh2ZWMhW3NlY29uZC5jbG9uZSgpLCBzZWNvbmRfZHVwbGljYXRlLmNsb25lKCldLCB0cnVlKS51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoZm9ybWF0ISgiezo/fSIsIGVycm9yKSwgImJhZCBwYXJzZWQgZmxhZ3M6IGR1cGxpY2F0ZSBmbGFnIGNvbS5zZWNvbmQuc2Vjb25kIChkZWZpbmVkIGluIGZsYWdzLmRlY2xhcmF0aW9ucyBhbmQgZHVwbGljYXRlL2ZsYWdzLmRlY2xhcmF0aW9ucykiKTsKKworICAgICAgICAvLyB2YWxpZCBjYXNlcworICAgICAgICBhc3NlcnQhKHBhcnNlZF9mbGFnczo6bWVyZ2UodmVjIVtdLCBmYWxzZSkudW53cmFwKCkucGFyc2VkX2ZsYWcuaXNfZW1wdHkoKSk7CisgICAgICAgIGFzc2VydCEocGFyc2VkX2ZsYWdzOjptZXJnZSh2ZWMhW10sIHRydWUpLnVud3JhcCgpLnBhcnNlZF9mbGFnLmlzX2VtcHR5KCkpOworICAgICAgICBhc3NlcnRfZXEhKGZpcnN0LCBwYXJzZWRfZmxhZ3M6Om1lcmdlKHZlYyFbZmlyc3QuY2xvbmUoKV0sIGZhbHNlKS51bndyYXAoKSk7CisgICAgICAgIGFzc2VydF9lcSEoZmlyc3QsIHBhcnNlZF9mbGFnczo6bWVyZ2UodmVjIVtmaXJzdC5jbG9uZSgpXSwgdHJ1ZSkudW53cmFwKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgZXhwZWN0ZWQsCisgICAgICAgICAgICBwYXJzZWRfZmxhZ3M6Om1lcmdlKHZlYyFbZmlyc3QuY2xvbmUoKSwgc2Vjb25kLmNsb25lKCldLCBmYWxzZSkudW53cmFwKCkKKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIGV4cGVjdGVkLAorICAgICAgICAgICAgcGFyc2VkX2ZsYWdzOjptZXJnZSh2ZWMhW2ZpcnN0LmNsb25lKCksIHNlY29uZC5jbG9uZSgpXSwgdHJ1ZSkudW53cmFwKCkKKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIGV4cGVjdGVkLAorICAgICAgICAgICAgcGFyc2VkX2ZsYWdzOjptZXJnZSh2ZWMhW3NlY29uZC5jbG9uZSgpLCBmaXJzdC5jbG9uZSgpXSwgZmFsc2UpLnVud3JhcCgpCisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICBleHBlY3RlZCwKKyAgICAgICAgICAgIHBhcnNlZF9mbGFnczo6bWVyZ2UodmVjIVtzZWNvbmQuY2xvbmUoKSwgZmlyc3QuY2xvbmUoKV0sIHRydWUpLnVud3JhcCgpCisgICAgICAgICk7CisKKyAgICAgICAgLy8gdHdvIGlkZW50aWNhbCBmbGFncyB3aXRoIGRlZHVwIGVuYWJsZWQKKyAgICAgICAgYXNzZXJ0X2VxIShmaXJzdCwgcGFyc2VkX2ZsYWdzOjptZXJnZSh2ZWMhW2ZpcnN0LmNsb25lKCksIGZpcnN0LmNsb25lKCldLCB0cnVlKS51bndyYXAoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NzVjN2IKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNjkgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKK30KKworcnVzdF9kZWZhdWx0cyB7CisgICAgbmFtZTogImFjb25maWdfc3RvcmFnZV9maWxlLmRlZmF1bHRzIiwKKyAgICBlZGl0aW9uOiAiMjAyMSIsCisgICAgbGludHM6ICJub25lIiwKKyAgICBydXN0bGliczogWworICAgICAgICAibGliYW55aG93IiwKKyAgICAgICAgImxpYnRoaXNlcnJvciIsCisgICAgICAgICJsaWJ0ZW1wZmlsZSIsCisgICAgICAgICJsaWJwcm90b2J1ZiIsCisgICAgICAgICJsaWJjbGFwIiwKKyAgICAgICAgImxpYmN4eCIsCisgICAgICAgICJsaWJhY29uZmlnX3N0b3JhZ2VfcHJvdG9zIiwKKyAgICAgICAgImxpYnNlcmRlIiwKKyAgICBdLAorfQorCitydXN0X2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJhY29uZmlnX3N0b3JhZ2VfZmlsZSIsCisgICAgY3JhdGVfbmFtZTogImFjb25maWdfc3RvcmFnZV9maWxlIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBkZWZhdWx0czogWyJhY29uZmlnX3N0b3JhZ2VfZmlsZS5kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsic3JjL2xpYi5ycyJdLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6YW55YXBleCIsCisgICAgXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBwcm9kdWN0X2F2YWlsYWJsZTogdHJ1ZSwKK30KKworcnVzdF9iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogImFjb25maWctc3RvcmFnZSIsCisgICAgZGVmYXVsdHM6IFsiYWNvbmZpZ19zdG9yYWdlX2ZpbGUuZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInNyYy9tYWluLnJzIl0sCisgICAgcnVzdGxpYnM6IFsKKyAgICAgICAgImxpYmFjb25maWdfc3RvcmFnZV9maWxlIiwKKyAgICAgICAgImxpYnNlcmRlX2pzb24iLAorICAgIF0sCit9CisKK3J1c3RfdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiYWNvbmZpZ19zdG9yYWdlX2ZpbGUudGVzdCIsCisgICAgdGVzdF9zdWl0ZXM6IFsiZ2VuZXJhbC10ZXN0cyJdLAorICAgIGRlZmF1bHRzOiBbImFjb25maWdfc3RvcmFnZV9maWxlLmRlZmF1bHRzIl0sCisgICAgc3JjczogWyJzcmMvbGliLnJzIl0sCit9CisKK3J1c3RfcHJvdG9idWYgeworICAgIG5hbWU6ICJsaWJhY29uZmlnX3N0b3JhZ2VfcHJvdG9zIiwKKyAgICBwcm90b3M6IFsicHJvdG9zL2Fjb25maWdfc3RvcmFnZV9tZXRhZGF0YS5wcm90byJdLAorICAgIGNyYXRlX25hbWU6ICJhY29uZmlnX3N0b3JhZ2VfcHJvdG9zIiwKKyAgICBzb3VyY2Vfc3RlbTogImFjb25maWdfc3RvcmFnZV9wcm90b3MiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6YW55YXBleCIsCisgICAgXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBwcm9kdWN0X2F2YWlsYWJsZTogdHJ1ZSwKK30KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmFjb25maWdfc3RvcmFnZV9wcm90b3NfY2MiLAorICAgIHByb3RvOiB7CisgICAgICAgIGV4cG9ydF9wcm90b19oZWFkZXJzOiB0cnVlLAorICAgICAgICB0eXBlOiAibGl0ZSIsCisgICAgfSwKKyAgICBzcmNzOiBbInByb3Rvcy9hY29uZmlnX3N0b3JhZ2VfbWV0YWRhdGEucHJvdG8iXSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOmFueWFwZXgiLAorICAgIF0sCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgcHJvZHVjdF9hdmFpbGFibGU6IHRydWUsCisgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAorfQorCisvLyBjeHggc291cmNlIGNvZGVnZW4gZnJvbSBydXN0IGFwaQorZ2VucnVsZSB7CisgICAgbmFtZTogImxpYmN4eF9hY29uZmlnX3N0b3JhZ2VfZmlsZV9icmlkZ2VfY29kZSIsCisgICAgdG9vbHM6IFsiY3h4YnJpZGdlIl0sCisgICAgY21kOiAiJChsb2NhdGlvbiBjeHhicmlkZ2UpICQoaW4pID4gJChvdXQpIiwKKyAgICBzcmNzOiBbInNyYy9saWIucnMiXSwKKyAgICBvdXQ6IFsiYWNvbmZpZ19zdG9yYWdlL2xpYi5ycy5jYyJdLAorfQorCisvLyBjeHggaGVhZGVyIGNvZGVnZW4gZnJvbSBydXN0IGFwaQorZ2VucnVsZSB7CisgICAgbmFtZTogImxpYmN4eF9hY29uZmlnX3N0b3JhZ2VfZmlsZV9icmlkZ2VfaGVhZGVyIiwKKyAgICB0b29sczogWyJjeHhicmlkZ2UiXSwKKyAgICBjbWQ6ICIkKGxvY2F0aW9uIGN4eGJyaWRnZSkgJChpbikgLS1oZWFkZXIgPiAkKG91dCkiLAorICAgIHNyY3M6IFsic3JjL2xpYi5ycyJdLAorICAgIG91dDogWyJhY29uZmlnX3N0b3JhZ2UvbGliLnJzLmgiXSwKK30KKworLy8gYSBzdGF0aWMgY2MgbGliIGJhc2VkIG9uIGdlbmVyYXRlZCBjb2RlCitydXN0X2ZmaV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJhY29uZmlnX3N0b3JhZ2VfZmlsZV9jeHhfYnJpZGdlIiwKKyAgICBjcmF0ZV9uYW1lOiAiYWNvbmZpZ19zdG9yYWdlX2ZpbGVfY3h4X2JyaWRnZSIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBwcm9kdWN0X2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBzcmNzOiBbInNyYy9saWIucnMiXSwKKyAgICBkZWZhdWx0czogWyJhY29uZmlnX3N0b3JhZ2VfZmlsZS5kZWZhdWx0cyJdLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6YW55YXBleCIsCisgICAgXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCit9CisKKy8vIHN0b3JhZ2UgZmlsZSBwYXJzZSBhcGkgY2MgaW50ZXJmYWNlCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliYWNvbmZpZ19zdG9yYWdlX2ZpbGVfY2MiLAorICAgIHNyY3M6IFsiYWNvbmZpZ19zdG9yYWdlX2ZpbGUuY3BwIl0sCisgICAgZ2VuZXJhdGVkX2hlYWRlcnM6IFsKKyAgICAgICAgImN4eC1icmlkZ2UtaGVhZGVyIiwKKyAgICAgICAgImxpYmN4eF9hY29uZmlnX3N0b3JhZ2VfZmlsZV9icmlkZ2VfaGVhZGVyIiwKKyAgICBdLAorICAgIGdlbmVyYXRlZF9zb3VyY2VzOiBbImxpYmN4eF9hY29uZmlnX3N0b3JhZ2VfZmlsZV9icmlkZ2VfY29kZSJdLAorICAgIHdob2xlX3N0YXRpY19saWJzOiBbImxpYmFjb25maWdfc3RvcmFnZV9maWxlX2N4eF9icmlkZ2UiXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHByb2R1Y3RfYXZhaWxhYmxlOiB0cnVlLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICBdLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6YW55YXBleCIsCisgICAgXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAorfQorCisvLyBzdG9yYWdlIGZpbGUgcGFyc2UgYXBpIGphdmEgbGlicmFyeQoramF2YV9saWJyYXJ5IHsKKyAgICBuYW1lOiAiYWNvbmZpZ19zdG9yYWdlX2ZpbGVfamF2YSIsCisgICAgc3JjczogWworICAgICAgICAic3Jjcy8qKi8qLmphdmEiLAorICAgIF0sCisgICAgc2RrX3ZlcnNpb246ICJjb3JlX2N1cnJlbnQiLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOmFueWFwZXgiLAorICAgIF0sCit9CisKKy8vIHN0b3JhZ2UgZmlsZSBwYXJzZSBhcGkgamF2YSBsaWJyYXJ5IGZvciBjb3JlIGxpYnJhcnkKK2phdmFfbGlicmFyeSB7CisgICAgbmFtZTogImFjb25maWdfc3RvcmFnZV9maWxlX2phdmFfbm9uZSIsCisgICAgc3JjczogWworICAgICAgICAic3Jjcy8qKi8qLmphdmEiLAorICAgIF0sCisgICAgc2RrX3ZlcnNpb246ICJub25lIiwKKyAgICBzeXN0ZW1fbW9kdWxlczogImNvcmUtYWxsLXN5c3RlbS1tb2R1bGVzIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvQ2FyZ28udG9tbCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvQ2FyZ28udG9tbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDA1NTc4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9DYXJnby50b21sCkBAIC0wLDAgKzEsMjYgQEAKK1twYWNrYWdlXQorbmFtZSA9ICJhY29uZmlnX3N0b3JhZ2VfZmlsZSIKK3ZlcnNpb24gPSAiMC4xLjAiCitlZGl0aW9uID0gIjIwMjEiCisKK1tmZWF0dXJlc10KK2RlZmF1bHQgPSBbImNhcmdvIl0KK2NhcmdvID0gW10KKworW2RlcGVuZGVuY2llc10KK2FueWhvdyA9ICIxLjAuNjkiCitwcm90b2J1ZiA9ICIzLjIuMCIKK3RlbXBmaWxlID0gIjMuOS4wIgordGhpc2Vycm9yID0gIjEuMC41NiIKK2NsYXAgPSB7IHZlcnNpb24gPSAiNC4xLjgiLCBmZWF0dXJlcyA9IFsiZGVyaXZlIl0gfQorY3h4ID0gIjEuMCIKK3NlcmRlID0geyB2ZXJzaW9uID0gIjEuMC4xNTIiLCBmZWF0dXJlcyA9IFsiZGVyaXZlIl0gfQorc2VyZGVfanNvbiA9ICIxLjAuOTMiCisKK1tbYmluXV0KK25hbWUgPSAiYWNvbmZpZy1zdG9yYWdlIgorcGF0aCA9ICJzcmMvbWFpbi5ycyIKKworW2J1aWxkLWRlcGVuZGVuY2llc10KK3Byb3RvYnVmLWNvZGVnZW4gPSAiMy4yLjAiCitjeHgtYnVpbGQgPSAiMS4wIgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9hY29uZmlnX3N0b3JhZ2VfZmlsZS5jcHAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL2Fjb25maWdfc3RvcmFnZV9maWxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWYwMjRiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9hY29uZmlnX3N0b3JhZ2VfZmlsZS5jcHAKQEAgLTAsMCArMSw2MSBAQAorI2luY2x1ZGUgInJ1c3QvY3h4LmgiCisjaW5jbHVkZSAiYWNvbmZpZ19zdG9yYWdlL2xpYi5ycy5oIgorCisjaW5jbHVkZSAiYWNvbmZpZ19zdG9yYWdlL2Fjb25maWdfc3RvcmFnZV9maWxlLmhwcCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmJhc2U7CisKK25hbWVzcGFjZSBhY29uZmlnX3N0b3JhZ2UgeworCitSZXN1bHQ8c3RkOjp2ZWN0b3I8RmxhZ1ZhbHVlU3VtbWFyeT4+IGxpc3RfZmxhZ3MoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhY2thZ2VfbWFwLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbGFnX21hcCwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmxhZ192YWwpIHsKKyAgYXV0byBmbGFnX2xpc3RfY3h4ID0gbGlzdF9mbGFnc19jeHgocnVzdDo6U3RyKHBhY2thZ2VfbWFwLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydXN0OjpTdHIoZmxhZ19tYXAuY19zdHIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1c3Q6OlN0cihmbGFnX3ZhbC5jX3N0cigpKSk7CisgIGlmIChmbGFnX2xpc3RfY3h4LnF1ZXJ5X3N1Y2Nlc3MpIHsKKyAgICBhdXRvIGZsYWdfbGlzdCA9IHN0ZDo6dmVjdG9yPEZsYWdWYWx1ZVN1bW1hcnk+KCk7CisgICAgZm9yIChjb25zdCBhdXRvJiBmbGFnX2N4eCA6IGZsYWdfbGlzdF9jeHguZmxhZ3MpIHsKKyAgICAgIGF1dG8gZmxhZyA9IEZsYWdWYWx1ZVN1bW1hcnkoKTsKKyAgICAgIGZsYWcucGFja2FnZV9uYW1lID0gc3RkOjpzdHJpbmcoZmxhZ19jeHgucGFja2FnZV9uYW1lKTsKKyAgICAgIGZsYWcuZmxhZ19uYW1lID0gc3RkOjpzdHJpbmcoZmxhZ19jeHguZmxhZ19uYW1lKTsKKyAgICAgIGZsYWcuZmxhZ192YWx1ZSA9IHN0ZDo6c3RyaW5nKGZsYWdfY3h4LmZsYWdfdmFsdWUpOworICAgICAgZmxhZy52YWx1ZV90eXBlID0gc3RkOjpzdHJpbmcoZmxhZ19jeHgudmFsdWVfdHlwZSk7CisgICAgICBmbGFnX2xpc3QucHVzaF9iYWNrKGZsYWcpOworICAgIH0KKyAgICByZXR1cm4gZmxhZ19saXN0OworICB9IGVsc2UgeworICAgIHJldHVybiBFcnJvcigpIDw8IGZsYWdfbGlzdF9jeHguZXJyb3JfbWVzc2FnZTsKKyAgfQorfQorCitSZXN1bHQ8c3RkOjp2ZWN0b3I8RmxhZ1ZhbHVlQW5kSW5mb1N1bW1hcnk+PiBsaXN0X2ZsYWdzX3dpdGhfaW5mbygKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZV9tYXAsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZsYWdfbWFwLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbGFnX3ZhbCwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmxhZ19pbmZvKSB7CisgIGF1dG8gZmxhZ19saXN0X2N4eCA9IGxpc3RfZmxhZ3Nfd2l0aF9pbmZvX2N4eChydXN0OjpTdHIocGFja2FnZV9tYXAuY19zdHIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydXN0OjpTdHIoZmxhZ19tYXAuY19zdHIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydXN0OjpTdHIoZmxhZ192YWwuY19zdHIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydXN0OjpTdHIoZmxhZ19pbmZvLmNfc3RyKCkpKTsKKyAgaWYgKGZsYWdfbGlzdF9jeHgucXVlcnlfc3VjY2VzcykgeworICAgIGF1dG8gZmxhZ19saXN0ID0gc3RkOjp2ZWN0b3I8RmxhZ1ZhbHVlQW5kSW5mb1N1bW1hcnk+KCk7CisgICAgZm9yIChjb25zdCBhdXRvJiBmbGFnX2N4eCA6IGZsYWdfbGlzdF9jeHguZmxhZ3MpIHsKKyAgICAgIGF1dG8gZmxhZyA9IEZsYWdWYWx1ZUFuZEluZm9TdW1tYXJ5KCk7CisgICAgICBmbGFnLnBhY2thZ2VfbmFtZSA9IHN0ZDo6c3RyaW5nKGZsYWdfY3h4LnBhY2thZ2VfbmFtZSk7CisgICAgICBmbGFnLmZsYWdfbmFtZSA9IHN0ZDo6c3RyaW5nKGZsYWdfY3h4LmZsYWdfbmFtZSk7CisgICAgICBmbGFnLmZsYWdfdmFsdWUgPSBzdGQ6OnN0cmluZyhmbGFnX2N4eC5mbGFnX3ZhbHVlKTsKKyAgICAgIGZsYWcudmFsdWVfdHlwZSA9IHN0ZDo6c3RyaW5nKGZsYWdfY3h4LnZhbHVlX3R5cGUpOworICAgICAgZmxhZy5pc19yZWFkd3JpdGUgPSBmbGFnX2N4eC5pc19yZWFkd3JpdGU7CisgICAgICBmbGFnLmhhc19zZXJ2ZXJfb3ZlcnJpZGUgPSBmbGFnX2N4eC5oYXNfc2VydmVyX292ZXJyaWRlOworICAgICAgZmxhZy5oYXNfbG9jYWxfb3ZlcnJpZGUgPSBmbGFnX2N4eC5oYXNfbG9jYWxfb3ZlcnJpZGU7CisgICAgICBmbGFnX2xpc3QucHVzaF9iYWNrKGZsYWcpOworICAgIH0KKyAgICByZXR1cm4gZmxhZ19saXN0OworICB9IGVsc2UgeworICAgIHJldHVybiBFcnJvcigpIDw8IGZsYWdfbGlzdF9jeHguZXJyb3JfbWVzc2FnZTsKKyAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBhY29uZmlnX3N0b3JhZ2UKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvYnVpbGQucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL2J1aWxkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYWRlMmEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL2J1aWxkLnJzCkBAIC0wLDAgKzEsMTkgQEAKK3VzZSBwcm90b2J1Zl9jb2RlZ2VuOjpDb2RlZ2VuOworCitmbiBtYWluKCkgeworICAgIGxldCBwcm90b19maWxlcyA9IHZlYyFbInByb3Rvcy9hY29uZmlnX3N0b3JhZ2VfbWV0YWRhdGEucHJvdG8iXTsKKworICAgIC8vIHRlbGwgY2FyZ28gdG8gb25seSByZS1ydW4gdGhlIGJ1aWxkIHNjcmlwdCBpZiBhbnkgb2YgdGhlIHByb3RvIGZpbGVzIGhhcyBjaGFuZ2VkCisgICAgZm9yIHBhdGggaW4gJnByb3RvX2ZpbGVzIHsKKyAgICAgICAgcHJpbnRsbiEoImNhcmdvOnJlcnVuLWlmLWNoYW5nZWQ9e30iLCBwYXRoKTsKKyAgICB9CisKKyAgICBDb2RlZ2VuOjpuZXcoKQorICAgICAgICAucHVyZSgpCisgICAgICAgIC5pbmNsdWRlKCJwcm90b3MiKQorICAgICAgICAuaW5wdXRzKHByb3RvX2ZpbGVzKQorICAgICAgICAuY2FyZ29fb3V0X2RpcigiYWNvbmZpZ19zdG9yYWdlX3Byb3RvcyIpCisgICAgICAgIC5ydW5fZnJvbV9zY3JpcHQoKTsKKworICAgIGxldCBfID0gY3h4X2J1aWxkOjpicmlkZ2UoInNyYy9saWIucnMiKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvaW5jbHVkZS9hY29uZmlnX3N0b3JhZ2UvYWNvbmZpZ19zdG9yYWdlX2ZpbGUuaHBwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9pbmNsdWRlL2Fjb25maWdfc3RvcmFnZS9hY29uZmlnX3N0b3JhZ2VfZmlsZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYzY2RiMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvaW5jbHVkZS9hY29uZmlnX3N0b3JhZ2UvYWNvbmZpZ19zdG9yYWdlX2ZpbGUuaHBwCkBAIC0wLDAgKzEsNDggQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcmVzdWx0Lmg+CisKK25hbWVzcGFjZSBhY29uZmlnX3N0b3JhZ2UgeworCisvLy8gRmxhZyB2YWx1ZSBzdW1tYXJ5IGZvciBhIGZsYWcKK3N0cnVjdCBGbGFnVmFsdWVTdW1tYXJ5IHsKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lOworICBzdGQ6OnN0cmluZyBmbGFnX25hbWU7CisgIHN0ZDo6c3RyaW5nIGZsYWdfdmFsdWU7CisgIHN0ZDo6c3RyaW5nIHZhbHVlX3R5cGU7Cit9OworCisvLy8gTGlzdCBhbGwgZmxhZyB2YWx1ZXMKKy8vLyBcaW5wdXQgcGFja2FnZV9tYXA6IHBhY2thZ2UgbWFwIGZpbGUKKy8vLyBcaW5wdXQgZmxhZ19tYXA6IGZsYWcgbWFwIGZpbGUKKy8vLyBcaW5wdXQgZmxhZ192YWw6IGZsYWcgdmFsdWUgZmlsZQorYW5kcm9pZDo6YmFzZTo6UmVzdWx0PHN0ZDo6dmVjdG9yPEZsYWdWYWx1ZVN1bW1hcnk+PiBsaXN0X2ZsYWdzKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYWNrYWdlX21hcCwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmxhZ19tYXAsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZsYWdfdmFsKTsKKworLy8vIEZsYWcgdmFsdWUgYW5kIGluZm8gc3VtbWFyeSBmb3IgYSBmbGFnCitzdHJ1Y3QgRmxhZ1ZhbHVlQW5kSW5mb1N1bW1hcnkgeworICBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWU7CisgIHN0ZDo6c3RyaW5nIGZsYWdfbmFtZTsKKyAgc3RkOjpzdHJpbmcgZmxhZ192YWx1ZTsKKyAgc3RkOjpzdHJpbmcgdmFsdWVfdHlwZTsKKyAgYm9vbCBpc19yZWFkd3JpdGU7CisgIGJvb2wgaGFzX3NlcnZlcl9vdmVycmlkZTsKKyAgYm9vbCBoYXNfbG9jYWxfb3ZlcnJpZGU7Cit9OworCisvLy8gTGlzdCBhbGwgZmxhZyB2YWx1ZXMgd2l0aCB0aGVpciBmbGFnIGluZm8KKy8vLyBcaW5wdXQgcGFja2FnZV9tYXA6IHBhY2thZ2UgbWFwIGZpbGUKKy8vLyBcaW5wdXQgZmxhZ19tYXA6IGZsYWcgbWFwIGZpbGUKKy8vLyBcaW5wdXQgZmxhZ192YWw6IGZsYWcgdmFsdWUgZmlsZQorLy8vIFxpbnB1dCBmbGFnX2luZm86IGZsYWcgaW5mbyBmaWxlCithbmRyb2lkOjpiYXNlOjpSZXN1bHQ8c3RkOjp2ZWN0b3I8RmxhZ1ZhbHVlQW5kSW5mb1N1bW1hcnk+PiBsaXN0X2ZsYWdzX3dpdGhfaW5mbygKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZV9tYXAsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZsYWdfbWFwLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbGFnX3ZhbCwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmxhZ19pbmZvKTsKKworfS8vIG5hbWVzcGFjZSBhY29uZmlnX3N0b3JhZ2UKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvcHJvdG9zL2Fjb25maWdfc3RvcmFnZV9tZXRhZGF0YS5wcm90byBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvcHJvdG9zL2Fjb25maWdfc3RvcmFnZV9tZXRhZGF0YS5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWMxYzdmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9wcm90b3MvYWNvbmZpZ19zdG9yYWdlX21ldGFkYXRhLnByb3RvCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisKKy8vIFRoaXMgaXMgdGhlIHNjaGVtYSBkZWZpbml0aW9uIGZvciBhY29uZmlnIGZpbGVzLiBNb2RpZmljYXRpb25zIG5lZWQgdG8gYmUKKy8vIGVpdGhlciBiYWNrd2FyZHMgY29tcGF0aWJsZSwgb3IgaW5jbHVkZSB1cGRhdGVzIHRvIGFsbCBhY29uZmlnIGZpbGVzIGluIHRoZQorLy8gQW5kcm9pZCB0cmVlLgorCitzeW50YXggPSAicHJvdG8yIjsKKworcGFja2FnZSBhbmRyb2lkLmFjb25maWdfc3RvcmFnZV9tZXRhZGF0YTsKKworbWVzc2FnZSBzdG9yYWdlX2ZpbGVfaW5mbyB7CisgIG9wdGlvbmFsIHVpbnQzMiB2ZXJzaW9uID0gMTsKKyAgb3B0aW9uYWwgc3RyaW5nIGNvbnRhaW5lciA9IDI7CisgIG9wdGlvbmFsIHN0cmluZyBwYWNrYWdlX21hcCA9IDM7CisgIG9wdGlvbmFsIHN0cmluZyBmbGFnX21hcCA9IDQ7CisgIG9wdGlvbmFsIHN0cmluZyBmbGFnX3ZhbCA9IDU7CisgIG9wdGlvbmFsIHN0cmluZyBmbGFnX2luZm8gPSA2OworICBvcHRpb25hbCBpbnQ2NCB0aW1lc3RhbXAgPSA3OworfQorCittZXNzYWdlIHN0b3JhZ2VfZmlsZXMgeworICByZXBlYXRlZCBzdG9yYWdlX2ZpbGVfaW5mbyBmaWxlcyA9IDE7Cit9OwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvZmxhZ19pbmZvLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvZmxhZ19pbmZvLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMTY4MzQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9mbGFnX2luZm8ucnMKQEAgLTAsMCArMSwyNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyEgZmxhZyBpbmZvIG1vZHVsZSBkZWZpbmVzIHRoZSBmbGFnIGluZm8gZmlsZSBmb3JtYXQgYW5kIG1ldGhvZHMgZm9yIHNlcmlhbGl6YXRpb24KKy8vISBhbmQgZGVzZXJpYWxpemF0aW9uCisKK3VzZSBjcmF0ZTo6e3JlYWRfc3RyX2Zyb21fYnl0ZXMsIHJlYWRfdTMyX2Zyb21fYnl0ZXMsIHJlYWRfdThfZnJvbV9ieXRlc307Cit1c2UgY3JhdGU6OntBY29uZmlnU3RvcmFnZUVycm9yLCBTdG9yYWdlRmlsZVR5cGV9OwordXNlIGFueWhvdzo6YW55aG93OwordXNlIHNlcmRlOjp7RGVzZXJpYWxpemUsIFNlcmlhbGl6ZX07Cit1c2Ugc3RkOjpmbXQ7CisKKy8vLyBGbGFnIGluZm8gaGVhZGVyIHN0cnVjdAorI1tkZXJpdmUoUGFydGlhbEVxLCBTZXJpYWxpemUsIERlc2VyaWFsaXplKV0KK3B1YiBzdHJ1Y3QgRmxhZ0luZm9IZWFkZXIgeworICAgIHB1YiB2ZXJzaW9uOiB1MzIsCisgICAgcHViIGNvbnRhaW5lcjogU3RyaW5nLAorICAgIHB1YiBmaWxlX3R5cGU6IHU4LAorICAgIHB1YiBmaWxlX3NpemU6IHUzMiwKKyAgICBwdWIgbnVtX2ZsYWdzOiB1MzIsCisgICAgcHViIGJvb2xlYW5fZmxhZ19vZmZzZXQ6IHUzMiwKK30KKworLy8vIEltcGxlbWVudCBkZWJ1ZyBwcmludCB0cmFpdCBmb3IgaGVhZGVyCitpbXBsIGZtdDo6RGVidWcgZm9yIEZsYWdJbmZvSGVhZGVyIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgZm10OjpGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKyAgICAgICAgd3JpdGVsbiEoCisgICAgICAgICAgICBmLAorICAgICAgICAgICAgIlZlcnNpb246IHt9LCBDb250YWluZXI6IHt9LCBGaWxlIFR5cGU6IHs6P30sIEZpbGUgU2l6ZToge30iLAorICAgICAgICAgICAgc2VsZi52ZXJzaW9uLAorICAgICAgICAgICAgc2VsZi5jb250YWluZXIsCisgICAgICAgICAgICBTdG9yYWdlRmlsZVR5cGU6OnRyeV9mcm9tKHNlbGYuZmlsZV90eXBlKSwKKyAgICAgICAgICAgIHNlbGYuZmlsZV9zaXplCisgICAgICAgICk/OworICAgICAgICB3cml0ZWxuISgKKyAgICAgICAgICAgIGYsCisgICAgICAgICAgICAiTnVtIG9mIEZsYWdzOiB7fSwgQm9vbGVhbiBGbGFnIE9mZnNldDp7fSIsCisgICAgICAgICAgICBzZWxmLm51bV9mbGFncywgc2VsZi5ib29sZWFuX2ZsYWdfb2Zmc2V0CisgICAgICAgICk/OworICAgICAgICBPaygoKSkKKyAgICB9Cit9CisKK2ltcGwgRmxhZ0luZm9IZWFkZXIgeworICAgIC8vLyBTZXJpYWxpemUgdG8gYnl0ZXMKKyAgICBwdWIgZm4gaW50b19ieXRlcygmc2VsZikgLT4gVmVjPHU4PiB7CisgICAgICAgIGxldCBtdXQgcmVzdWx0ID0gVmVjOjpuZXcoKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCZzZWxmLnZlcnNpb24udG9fbGVfYnl0ZXMoKSk7CisgICAgICAgIGxldCBjb250YWluZXJfYnl0ZXMgPSBzZWxmLmNvbnRhaW5lci5hc19ieXRlcygpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJihjb250YWluZXJfYnl0ZXMubGVuKCkgYXMgdTMyKS50b19sZV9ieXRlcygpKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKGNvbnRhaW5lcl9ieXRlcyk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmc2VsZi5maWxlX3R5cGUudG9fbGVfYnl0ZXMoKSk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmc2VsZi5maWxlX3NpemUudG9fbGVfYnl0ZXMoKSk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmc2VsZi5udW1fZmxhZ3MudG9fbGVfYnl0ZXMoKSk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmc2VsZi5ib29sZWFuX2ZsYWdfb2Zmc2V0LnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQKKyAgICB9CisKKyAgICAvLy8gRGVzZXJpYWxpemUgZnJvbSBieXRlcworICAgIHB1YiBmbiBmcm9tX2J5dGVzKGJ5dGVzOiAmW3U4XSkgLT4gUmVzdWx0PFNlbGYsIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICAgICAgbGV0IG11dCBoZWFkID0gMDsKKyAgICAgICAgbGV0IGxpc3QgPSBTZWxmIHsKKyAgICAgICAgICAgIHZlcnNpb246IHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/LAorICAgICAgICAgICAgY29udGFpbmVyOiByZWFkX3N0cl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPywKKyAgICAgICAgICAgIGZpbGVfdHlwZTogcmVhZF91OF9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPywKKyAgICAgICAgICAgIGZpbGVfc2l6ZTogcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8sCisgICAgICAgICAgICBudW1fZmxhZ3M6IHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/LAorICAgICAgICAgICAgYm9vbGVhbl9mbGFnX29mZnNldDogcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8sCisgICAgICAgIH07CisgICAgICAgIGlmIGxpc3QuZmlsZV90eXBlICE9IFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ0luZm8gYXMgdTggeworICAgICAgICAgICAgcmV0dXJuIEVycihBY29uZmlnU3RvcmFnZUVycm9yOjpCeXRlc1BhcnNlRmFpbChhbnlob3chKAorICAgICAgICAgICAgICAgICJiaW5hcnkgZmlsZSBpcyBub3QgYSBmbGFnIGluZm8gZmlsZSIKKyAgICAgICAgICAgICkpKTsKKyAgICAgICAgfQorICAgICAgICBPayhsaXN0KQorICAgIH0KK30KKworLy8vIGJpdCBmaWVsZCBmb3IgZmxhZyBpbmZvCisjW2Rlcml2ZShDbG9uZSwgRGVidWcsIFBhcnRpYWxFcSwgRXEsIFNlcmlhbGl6ZSwgRGVzZXJpYWxpemUpXQorcHViIGVudW0gRmxhZ0luZm9CaXQgeworICAgIEhhc1NlcnZlck92ZXJyaWRlID0gMSA8PCAwLAorICAgIElzUmVhZFdyaXRlID0gMSA8PCAxLAorICAgIEhhc0xvY2FsT3ZlcnJpZGUgPSAxIDw8IDIsCit9CisKKy8vLyBGbGFnIGluZm8gbm9kZSBzdHJ1Y3QKKyNbZGVyaXZlKFBhcnRpYWxFcSwgQ2xvbmUsIFNlcmlhbGl6ZSwgRGVzZXJpYWxpemUpXQorcHViIHN0cnVjdCBGbGFnSW5mb05vZGUgeworICAgIHB1YiBhdHRyaWJ1dGVzOiB1OCwKK30KKworLy8vIEltcGxlbWVudCBkZWJ1ZyBwcmludCB0cmFpdCBmb3Igbm9kZQoraW1wbCBmbXQ6OkRlYnVnIGZvciBGbGFnSW5mb05vZGUgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBmbXQ6OkZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICB3cml0ZWxuISgKKyAgICAgICAgICAgIGYsCisgICAgICAgICAgICAicmVhZHdyaXRlOiB7fSwgc2VydmVyIG92ZXJyaWRlOiB7fSwgbG9jYWwgb3ZlcnJpZGU6IHt9IiwKKyAgICAgICAgICAgIHNlbGYuYXR0cmlidXRlcyAmIChGbGFnSW5mb0JpdDo6SXNSZWFkV3JpdGUgYXMgdTgpICE9IDAsCisgICAgICAgICAgICBzZWxmLmF0dHJpYnV0ZXMgJiAoRmxhZ0luZm9CaXQ6Okhhc1NlcnZlck92ZXJyaWRlIGFzIHU4KSAhPSAwLAorICAgICAgICAgICAgc2VsZi5hdHRyaWJ1dGVzICYgKEZsYWdJbmZvQml0OjpIYXNMb2NhbE92ZXJyaWRlIGFzIHU4KSAhPSAwLAorICAgICAgICApPzsKKyAgICAgICAgT2soKCkpCisgICAgfQorfQorCitpbXBsIEZsYWdJbmZvTm9kZSB7CisgICAgLy8vIFNlcmlhbGl6ZSB0byBieXRlcworICAgIHB1YiBmbiBpbnRvX2J5dGVzKCZzZWxmKSAtPiBWZWM8dTg+IHsKKyAgICAgICAgbGV0IG11dCByZXN1bHQgPSBWZWM6Om5ldygpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYuYXR0cmlidXRlcy50b19sZV9ieXRlcygpKTsKKyAgICAgICAgcmVzdWx0CisgICAgfQorCisgICAgLy8vIERlc2VyaWFsaXplIGZyb20gYnl0ZXMKKyAgICBwdWIgZm4gZnJvbV9ieXRlcyhieXRlczogJlt1OF0pIC0+IFJlc3VsdDxTZWxmLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgICAgIGxldCBtdXQgaGVhZCA9IDA7CisgICAgICAgIGxldCBub2RlID0gU2VsZiB7IGF0dHJpYnV0ZXM6IHJlYWRfdThfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8gfTsKKyAgICAgICAgT2sobm9kZSkKKyAgICB9CisKKyAgICAvLy8gQ3JlYXRlIGZsYWcgaW5mbyBub2RlCisgICAgcHViIGZuIGNyZWF0ZShpc19mbGFnX3J3OiBib29sKSAtPiBTZWxmIHsKKyAgICAgICAgU2VsZiB7IGF0dHJpYnV0ZXM6IGlmIGlzX2ZsYWdfcncgeyBGbGFnSW5mb0JpdDo6SXNSZWFkV3JpdGUgYXMgdTggfSBlbHNlIHsgMHU4IH0gfQorICAgIH0KK30KKworLy8vIEZsYWcgaW5mbyBsaXN0IHN0cnVjdAorI1tkZXJpdmUoUGFydGlhbEVxLCBTZXJpYWxpemUsIERlc2VyaWFsaXplKV0KK3B1YiBzdHJ1Y3QgRmxhZ0luZm9MaXN0IHsKKyAgICBwdWIgaGVhZGVyOiBGbGFnSW5mb0hlYWRlciwKKyAgICBwdWIgbm9kZXM6IFZlYzxGbGFnSW5mb05vZGU+LAorfQorCisvLy8gSW1wbGVtZW50IGRlYnVnIHByaW50IHRyYWl0IGZvciBmbGFnIGluZm8gbGlzdAoraW1wbCBmbXQ6OkRlYnVnIGZvciBGbGFnSW5mb0xpc3QgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBmbXQ6OkZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICB3cml0ZWxuIShmLCAiSGVhZGVyOiIpPzsKKyAgICAgICAgd3JpdGUhKGYsICJ7Oj99Iiwgc2VsZi5oZWFkZXIpPzsKKyAgICAgICAgd3JpdGVsbiEoZiwgIk5vZGVzOiIpPzsKKyAgICAgICAgZm9yIG5vZGUgaW4gc2VsZi5ub2Rlcy5pdGVyKCkgeworICAgICAgICAgICAgd3JpdGUhKGYsICJ7Oj99Iiwgbm9kZSk/OworICAgICAgICB9CisgICAgICAgIE9rKCgpKQorICAgIH0KK30KKworaW1wbCBGbGFnSW5mb0xpc3QgeworICAgIC8vLyBTZXJpYWxpemUgdG8gYnl0ZXMKKyAgICBwdWIgZm4gaW50b19ieXRlcygmc2VsZikgLT4gVmVjPHU4PiB7CisgICAgICAgIFsKKyAgICAgICAgICAgIHNlbGYuaGVhZGVyLmludG9fYnl0ZXMoKSwKKyAgICAgICAgICAgIHNlbGYubm9kZXMuaXRlcigpLm1hcCh8dnwgdi5pbnRvX2J5dGVzKCkpLmNvbGxlY3Q6OjxWZWM8Xz4+KCkuY29uY2F0KCksCisgICAgICAgIF0KKyAgICAgICAgLmNvbmNhdCgpCisgICAgfQorCisgICAgLy8vIERlc2VyaWFsaXplIGZyb20gYnl0ZXMKKyAgICBwdWIgZm4gZnJvbV9ieXRlcyhieXRlczogJlt1OF0pIC0+IFJlc3VsdDxTZWxmLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgICAgIGxldCBoZWFkZXIgPSBGbGFnSW5mb0hlYWRlcjo6ZnJvbV9ieXRlcyhieXRlcyk/OworICAgICAgICBsZXQgbnVtX2ZsYWdzID0gaGVhZGVyLm51bV9mbGFnczsKKyAgICAgICAgbGV0IG11dCBoZWFkID0gaGVhZGVyLmludG9fYnl0ZXMoKS5sZW4oKTsKKyAgICAgICAgbGV0IG5vZGVzID0gKDAuLm51bV9mbGFncykKKyAgICAgICAgICAgIC5tYXAofF98IHsKKyAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IEZsYWdJbmZvTm9kZTo6ZnJvbV9ieXRlcygmYnl0ZXNbaGVhZC4uXSk/OworICAgICAgICAgICAgICAgIGhlYWQgKz0gbm9kZS5pbnRvX2J5dGVzKCkubGVuKCk7CisgICAgICAgICAgICAgICAgT2sobm9kZSkKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgICAuY29sbGVjdDo6PFJlc3VsdDxWZWM8Xz4sIEFjb25maWdTdG9yYWdlRXJyb3I+PigpCisgICAgICAgICAgICAubWFwX2Vycih8ZXJybXNnfCB7CisgICAgICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6Qnl0ZXNQYXJzZUZhaWwoYW55aG93ISgKKyAgICAgICAgICAgICAgICAgICAgImZhaWwgdG8gcGFyc2UgZmxhZyBpbmZvIGxpc3Q6IHt9IiwKKyAgICAgICAgICAgICAgICAgICAgZXJybXNnCisgICAgICAgICAgICAgICAgKSkKKyAgICAgICAgICAgIH0pPzsKKyAgICAgICAgbGV0IGxpc3QgPSBTZWxmIHsgaGVhZGVyLCBub2RlcyB9OworICAgICAgICBPayhsaXN0KQorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKyAgICB1c2UgY3JhdGU6OnsKKyAgICAgICAgdGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QsIERFRkFVTFRfRklMRV9WRVJTSU9OLCBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiwKKyAgICB9OworCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhlIHZhbHVlIGxpc3Qgc2VyaWFsaXphdGlvbgorICAgIC8vIFRPRE86IGIvMzc2MTA4MjY4IC0gVXNlIHBhcmFtZXRlcml6ZWQgdGVzdHMuCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3Rfc2VyaWFsaXphdGlvbl9kZWZhdWx0KCkgeworICAgICAgICBsZXQgZmxhZ19pbmZvX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdChERUZBVUxUX0ZJTEVfVkVSU0lPTik7CisKKyAgICAgICAgbGV0IGhlYWRlcjogJkZsYWdJbmZvSGVhZGVyID0gJmZsYWdfaW5mb19saXN0LmhlYWRlcjsKKyAgICAgICAgbGV0IHJlaW50ZXJwcmV0ZWRfaGVhZGVyID0gRmxhZ0luZm9IZWFkZXI6OmZyb21fYnl0ZXMoJmhlYWRlci5pbnRvX2J5dGVzKCkpOworICAgICAgICBhc3NlcnQhKHJlaW50ZXJwcmV0ZWRfaGVhZGVyLmlzX29rKCkpOworICAgICAgICBhc3NlcnRfZXEhKGhlYWRlciwgJnJlaW50ZXJwcmV0ZWRfaGVhZGVyLnVud3JhcCgpKTsKKworICAgICAgICBsZXQgbm9kZXM6ICZWZWM8RmxhZ0luZm9Ob2RlPiA9ICZmbGFnX2luZm9fbGlzdC5ub2RlczsKKyAgICAgICAgZm9yIG5vZGUgaW4gbm9kZXMuaXRlcigpIHsKKyAgICAgICAgICAgIGxldCByZWludGVycHJldGVkX25vZGUgPSBGbGFnSW5mb05vZGU6OmZyb21fYnl0ZXMoJm5vZGUuaW50b19ieXRlcygpKS51bndyYXAoKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEobm9kZSwgJnJlaW50ZXJwcmV0ZWRfbm9kZSk7CisgICAgICAgIH0KKworICAgICAgICBsZXQgZmxhZ19pbmZvX2J5dGVzID0gZmxhZ19pbmZvX2xpc3QuaW50b19ieXRlcygpOworICAgICAgICBsZXQgcmVpbnRlcnByZXRlZF9pbmZvX2xpc3QgPSBGbGFnSW5mb0xpc3Q6OmZyb21fYnl0ZXMoJmZsYWdfaW5mb19ieXRlcyk7CisgICAgICAgIGFzc2VydCEocmVpbnRlcnByZXRlZF9pbmZvX2xpc3QuaXNfb2soKSk7CisgICAgICAgIGFzc2VydF9lcSEoJmZsYWdfaW5mb19saXN0LCAmcmVpbnRlcnByZXRlZF9pbmZvX2xpc3QudW53cmFwKCkpOworICAgICAgICBhc3NlcnRfZXEhKGZsYWdfaW5mb19ieXRlcy5sZW4oKSBhcyB1MzIsIGhlYWRlci5maWxlX3NpemUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3NlcmlhbGl6YXRpb25fbWF4KCkgeworICAgICAgICBsZXQgZmxhZ19pbmZvX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdChNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTik7CisKKyAgICAgICAgbGV0IGhlYWRlcjogJkZsYWdJbmZvSGVhZGVyID0gJmZsYWdfaW5mb19saXN0LmhlYWRlcjsKKyAgICAgICAgbGV0IHJlaW50ZXJwcmV0ZWRfaGVhZGVyID0gRmxhZ0luZm9IZWFkZXI6OmZyb21fYnl0ZXMoJmhlYWRlci5pbnRvX2J5dGVzKCkpOworICAgICAgICBhc3NlcnQhKHJlaW50ZXJwcmV0ZWRfaGVhZGVyLmlzX29rKCkpOworICAgICAgICBhc3NlcnRfZXEhKGhlYWRlciwgJnJlaW50ZXJwcmV0ZWRfaGVhZGVyLnVud3JhcCgpKTsKKworICAgICAgICBsZXQgbm9kZXM6ICZWZWM8RmxhZ0luZm9Ob2RlPiA9ICZmbGFnX2luZm9fbGlzdC5ub2RlczsKKyAgICAgICAgZm9yIG5vZGUgaW4gbm9kZXMuaXRlcigpIHsKKyAgICAgICAgICAgIGxldCByZWludGVycHJldGVkX25vZGUgPSBGbGFnSW5mb05vZGU6OmZyb21fYnl0ZXMoJm5vZGUuaW50b19ieXRlcygpKS51bndyYXAoKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEobm9kZSwgJnJlaW50ZXJwcmV0ZWRfbm9kZSk7CisgICAgICAgIH0KKworICAgICAgICBsZXQgZmxhZ19pbmZvX2J5dGVzID0gZmxhZ19pbmZvX2xpc3QuaW50b19ieXRlcygpOworICAgICAgICBsZXQgcmVpbnRlcnByZXRlZF9pbmZvX2xpc3QgPSBGbGFnSW5mb0xpc3Q6OmZyb21fYnl0ZXMoJmZsYWdfaW5mb19ieXRlcyk7CisgICAgICAgIGFzc2VydCEocmVpbnRlcnByZXRlZF9pbmZvX2xpc3QuaXNfb2soKSk7CisgICAgICAgIGFzc2VydF9lcSEoJmZsYWdfaW5mb19saXN0LCAmcmVpbnRlcnByZXRlZF9pbmZvX2xpc3QudW53cmFwKCkpOworICAgICAgICBhc3NlcnRfZXEhKGZsYWdfaW5mb19ieXRlcy5sZW4oKSBhcyB1MzIsIGhlYWRlci5maWxlX3NpemUpOworICAgIH0KKworICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRoYXQgdmVyc2lvbiBudW1iZXIgc2hvdWxkIGJlIGF0IHRoZSB0b3Agb2Ygc2VyaWFsaXplZAorICAgIC8vIGJ5dGVzCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfdmVyc2lvbl9udW1iZXIoKSB7CisgICAgICAgIGxldCBmbGFnX2luZm9fbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0KERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgbGV0IGJ5dGVzID0gJmZsYWdfaW5mb19saXN0LmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IG11dCBoZWFkID0gMDsKKyAgICAgICAgbGV0IHZlcnNpb25fZnJvbV9maWxlID0gcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKS51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxISh2ZXJzaW9uX2Zyb21fZmlsZSwgREVGQVVMVF9GSUxFX1ZFUlNJT04pOworICAgIH0KKworICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIGZpbGUgdHlwZSBjaGVjaworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2ZpbGVfdHlwZV9jaGVjaygpIHsKKyAgICAgICAgbGV0IG11dCBmbGFnX2luZm9fbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0KERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgZmxhZ19pbmZvX2xpc3QuaGVhZGVyLmZpbGVfdHlwZSA9IDEyM3U4OworICAgICAgICBsZXQgZXJyb3IgPSBGbGFnSW5mb0xpc3Q6OmZyb21fYnl0ZXMoJmZsYWdfaW5mb19saXN0LmludG9fYnl0ZXMoKSkudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVycm9yKSwKKyAgICAgICAgICAgIGZvcm1hdCEoIkJ5dGVzUGFyc2VGYWlsKGJpbmFyeSBmaWxlIGlzIG5vdCBhIGZsYWcgaW5mbyBmaWxlKSIpCisgICAgICAgICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvZmxhZ190YWJsZS5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL2ZsYWdfdGFibGUucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZiZWUwMgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL2ZsYWdfdGFibGUucnMKQEAgLTAsMCArMSwyOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyEgZmxhZyB0YWJsZSBtb2R1bGUgZGVmaW5lcyB0aGUgZmxhZyB0YWJsZSBmaWxlIGZvcm1hdCBhbmQgbWV0aG9kcyBmb3Igc2VyaWFsaXphdGlvbgorLy8hIGFuZCBkZXNlcmlhbGl6YXRpb24KKwordXNlIGNyYXRlOjp7CisgICAgZ2V0X2J1Y2tldF9pbmRleCwgcmVhZF9zdHJfZnJvbV9ieXRlcywgcmVhZF91MTZfZnJvbV9ieXRlcywgcmVhZF91MzJfZnJvbV9ieXRlcywKKyAgICByZWFkX3U4X2Zyb21fYnl0ZXMsCit9OwordXNlIGNyYXRlOjp7QWNvbmZpZ1N0b3JhZ2VFcnJvciwgU3RvcmFnZUZpbGVUeXBlLCBTdG9yZWRGbGFnVHlwZX07Cit1c2UgYW55aG93Ojphbnlob3c7Cit1c2Ugc2VyZGU6OntEZXNlcmlhbGl6ZSwgU2VyaWFsaXplfTsKK3VzZSBzdGQ6OmZtdDsKKworLy8vIEZsYWcgdGFibGUgaGVhZGVyIHN0cnVjdAorI1tkZXJpdmUoUGFydGlhbEVxLCBTZXJpYWxpemUsIERlc2VyaWFsaXplKV0KK3B1YiBzdHJ1Y3QgRmxhZ1RhYmxlSGVhZGVyIHsKKyAgICBwdWIgdmVyc2lvbjogdTMyLAorICAgIHB1YiBjb250YWluZXI6IFN0cmluZywKKyAgICBwdWIgZmlsZV90eXBlOiB1OCwKKyAgICBwdWIgZmlsZV9zaXplOiB1MzIsCisgICAgcHViIG51bV9mbGFnczogdTMyLAorICAgIHB1YiBidWNrZXRfb2Zmc2V0OiB1MzIsCisgICAgcHViIG5vZGVfb2Zmc2V0OiB1MzIsCit9CisKKy8vLyBJbXBsZW1lbnQgZGVidWcgcHJpbnQgdHJhaXQgZm9yIGhlYWRlcgoraW1wbCBmbXQ6OkRlYnVnIGZvciBGbGFnVGFibGVIZWFkZXIgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBmbXQ6OkZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICB3cml0ZWxuISgKKyAgICAgICAgICAgIGYsCisgICAgICAgICAgICAiVmVyc2lvbjoge30sIENvbnRhaW5lcjoge30sIEZpbGUgVHlwZTogezo/fSwgRmlsZSBTaXplOiB7fSIsCisgICAgICAgICAgICBzZWxmLnZlcnNpb24sCisgICAgICAgICAgICBzZWxmLmNvbnRhaW5lciwKKyAgICAgICAgICAgIFN0b3JhZ2VGaWxlVHlwZTo6dHJ5X2Zyb20oc2VsZi5maWxlX3R5cGUpLAorICAgICAgICAgICAgc2VsZi5maWxlX3NpemUKKyAgICAgICAgKT87CisgICAgICAgIHdyaXRlbG4hKAorICAgICAgICAgICAgZiwKKyAgICAgICAgICAgICJOdW0gb2YgRmxhZ3M6IHt9LCBCdWNrZXQgT2Zmc2V0Ont9LCBOb2RlIE9mZnNldDoge30iLAorICAgICAgICAgICAgc2VsZi5udW1fZmxhZ3MsIHNlbGYuYnVja2V0X29mZnNldCwgc2VsZi5ub2RlX29mZnNldAorICAgICAgICApPzsKKyAgICAgICAgT2soKCkpCisgICAgfQorfQorCitpbXBsIEZsYWdUYWJsZUhlYWRlciB7CisgICAgLy8vIFNlcmlhbGl6ZSB0byBieXRlcworICAgIHB1YiBmbiBpbnRvX2J5dGVzKCZzZWxmKSAtPiBWZWM8dTg+IHsKKyAgICAgICAgbGV0IG11dCByZXN1bHQgPSBWZWM6Om5ldygpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYudmVyc2lvbi50b19sZV9ieXRlcygpKTsKKyAgICAgICAgbGV0IGNvbnRhaW5lcl9ieXRlcyA9IHNlbGYuY29udGFpbmVyLmFzX2J5dGVzKCk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmKGNvbnRhaW5lcl9ieXRlcy5sZW4oKSBhcyB1MzIpLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoY29udGFpbmVyX2J5dGVzKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCZzZWxmLmZpbGVfdHlwZS50b19sZV9ieXRlcygpKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCZzZWxmLmZpbGVfc2l6ZS50b19sZV9ieXRlcygpKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCZzZWxmLm51bV9mbGFncy50b19sZV9ieXRlcygpKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCZzZWxmLmJ1Y2tldF9vZmZzZXQudG9fbGVfYnl0ZXMoKSk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmc2VsZi5ub2RlX29mZnNldC50b19sZV9ieXRlcygpKTsKKyAgICAgICAgcmVzdWx0CisgICAgfQorCisgICAgLy8vIERlc2VyaWFsaXplIGZyb20gYnl0ZXMKKyAgICBwdWIgZm4gZnJvbV9ieXRlcyhieXRlczogJlt1OF0pIC0+IFJlc3VsdDxTZWxmLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgICAgIGxldCBtdXQgaGVhZCA9IDA7CisgICAgICAgIGxldCB0YWJsZSA9IFNlbGYgeworICAgICAgICAgICAgdmVyc2lvbjogcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8sCisgICAgICAgICAgICBjb250YWluZXI6IHJlYWRfc3RyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/LAorICAgICAgICAgICAgZmlsZV90eXBlOiByZWFkX3U4X2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/LAorICAgICAgICAgICAgZmlsZV9zaXplOiByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPywKKyAgICAgICAgICAgIG51bV9mbGFnczogcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8sCisgICAgICAgICAgICBidWNrZXRfb2Zmc2V0OiByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPywKKyAgICAgICAgICAgIG5vZGVfb2Zmc2V0OiByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPywKKyAgICAgICAgfTsKKyAgICAgICAgaWYgdGFibGUuZmlsZV90eXBlICE9IFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ01hcCBhcyB1OCB7CisgICAgICAgICAgICByZXR1cm4gRXJyKEFjb25maWdTdG9yYWdlRXJyb3I6OkJ5dGVzUGFyc2VGYWlsKGFueWhvdyEoCisgICAgICAgICAgICAgICAgImJpbmFyeSBmaWxlIGlzIG5vdCBhIGZsYWcgbWFwIgorICAgICAgICAgICAgKSkpOworICAgICAgICB9CisgICAgICAgIE9rKHRhYmxlKQorICAgIH0KK30KKworLy8vIEZsYWcgdGFibGUgbm9kZSBzdHJ1Y3QKKyNbZGVyaXZlKFBhcnRpYWxFcSwgQ2xvbmUsIFNlcmlhbGl6ZSwgRGVzZXJpYWxpemUpXQorcHViIHN0cnVjdCBGbGFnVGFibGVOb2RlIHsKKyAgICBwdWIgcGFja2FnZV9pZDogdTMyLAorICAgIHB1YiBmbGFnX25hbWU6IFN0cmluZywKKyAgICBwdWIgZmxhZ190eXBlOiBTdG9yZWRGbGFnVHlwZSwKKyAgICAvLyB3aXRoaW4gcGFja2FnZSBmbGFnIGluZGV4IG9mIHRoaXMgZmxhZyB0eXBlCisgICAgcHViIGZsYWdfaW5kZXg6IHUxNiwKKyAgICBwdWIgbmV4dF9vZmZzZXQ6IE9wdGlvbjx1MzI+LAorfQorCisvLy8gSW1wbGVtZW50IGRlYnVnIHByaW50IHRyYWl0IGZvciBub2RlCitpbXBsIGZtdDo6RGVidWcgZm9yIEZsYWdUYWJsZU5vZGUgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBmbXQ6OkZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICB3cml0ZWxuISgKKyAgICAgICAgICAgIGYsCisgICAgICAgICAgICAiUGFja2FnZSBJZDoge30sIEZsYWc6IHt9LCBUeXBlOiB7Oj99LCBJbmRleDoge30sIE5leHQ6IHs6P30iLAorICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2lkLCBzZWxmLmZsYWdfbmFtZSwgc2VsZi5mbGFnX3R5cGUsIHNlbGYuZmxhZ19pbmRleCwgc2VsZi5uZXh0X29mZnNldAorICAgICAgICApPzsKKyAgICAgICAgT2soKCkpCisgICAgfQorfQorCitpbXBsIEZsYWdUYWJsZU5vZGUgeworICAgIC8vLyBTZXJpYWxpemUgdG8gYnl0ZXMKKyAgICBwdWIgZm4gaW50b19ieXRlcygmc2VsZikgLT4gVmVjPHU4PiB7CisgICAgICAgIGxldCBtdXQgcmVzdWx0ID0gVmVjOjpuZXcoKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCZzZWxmLnBhY2thZ2VfaWQudG9fbGVfYnl0ZXMoKSk7CisgICAgICAgIGxldCBuYW1lX2J5dGVzID0gc2VsZi5mbGFnX25hbWUuYXNfYnl0ZXMoKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCYobmFtZV9ieXRlcy5sZW4oKSBhcyB1MzIpLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UobmFtZV9ieXRlcyk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmKHNlbGYuZmxhZ190eXBlIGFzIHUxNikudG9fbGVfYnl0ZXMoKSk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmc2VsZi5mbGFnX2luZGV4LnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYubmV4dF9vZmZzZXQudW53cmFwX29yKDApLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQKKyAgICB9CisKKyAgICAvLy8gRGVzZXJpYWxpemUgZnJvbSBieXRlcworICAgIHB1YiBmbiBmcm9tX2J5dGVzKGJ5dGVzOiAmW3U4XSkgLT4gUmVzdWx0PFNlbGYsIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICAgICAgbGV0IG11dCBoZWFkID0gMDsKKyAgICAgICAgbGV0IG5vZGUgPSBTZWxmIHsKKyAgICAgICAgICAgIHBhY2thZ2VfaWQ6IHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/LAorICAgICAgICAgICAgZmxhZ19uYW1lOiByZWFkX3N0cl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPywKKyAgICAgICAgICAgIGZsYWdfdHlwZTogU3RvcmVkRmxhZ1R5cGU6OnRyeV9mcm9tKHJlYWRfdTE2X2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/KT8sCisgICAgICAgICAgICBmbGFnX2luZGV4OiByZWFkX3UxNl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPywKKyAgICAgICAgICAgIG5leHRfb2Zmc2V0OiBtYXRjaCByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPyB7CisgICAgICAgICAgICAgICAgMCA9PiBOb25lLAorICAgICAgICAgICAgICAgIHZhbCA9PiBTb21lKHZhbCksCisgICAgICAgICAgICB9LAorICAgICAgICB9OworICAgICAgICBPayhub2RlKQorICAgIH0KKworICAgIC8vLyBDYWxjdWxhdGUgbm9kZSBidWNrZXQgaW5kZXgKKyAgICBwdWIgZm4gZmluZF9idWNrZXRfaW5kZXgocGFja2FnZV9pZDogdTMyLCBmbGFnX25hbWU6ICZzdHIsIG51bV9idWNrZXRzOiB1MzIpIC0+IHUzMiB7CisgICAgICAgIGxldCBmdWxsX2ZsYWdfbmFtZSA9IHBhY2thZ2VfaWQudG9fc3RyaW5nKCkgKyAiLyIgKyBmbGFnX25hbWU7CisgICAgICAgIGdldF9idWNrZXRfaW5kZXgoZnVsbF9mbGFnX25hbWUuYXNfYnl0ZXMoKSwgbnVtX2J1Y2tldHMpCisgICAgfQorfQorCisjW2Rlcml2ZShQYXJ0aWFsRXEsIFNlcmlhbGl6ZSwgRGVzZXJpYWxpemUpXQorcHViIHN0cnVjdCBGbGFnVGFibGUgeworICAgIHB1YiBoZWFkZXI6IEZsYWdUYWJsZUhlYWRlciwKKyAgICBwdWIgYnVja2V0czogVmVjPE9wdGlvbjx1MzI+PiwKKyAgICBwdWIgbm9kZXM6IFZlYzxGbGFnVGFibGVOb2RlPiwKK30KKworLy8vIEltcGxlbWVudCBkZWJ1ZyBwcmludCB0cmFpdCBmb3IgZmxhZyB0YWJsZQoraW1wbCBmbXQ6OkRlYnVnIGZvciBGbGFnVGFibGUgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBmbXQ6OkZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICB3cml0ZWxuIShmLCAiSGVhZGVyOiIpPzsKKyAgICAgICAgd3JpdGUhKGYsICJ7Oj99Iiwgc2VsZi5oZWFkZXIpPzsKKyAgICAgICAgd3JpdGVsbiEoZiwgIkJ1Y2tldHM6Iik/OworICAgICAgICB3cml0ZWxuIShmLCAiezo/fSIsIHNlbGYuYnVja2V0cyk/OworICAgICAgICB3cml0ZWxuIShmLCAiTm9kZXM6Iik/OworICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLm5vZGVzLml0ZXIoKSB7CisgICAgICAgICAgICB3cml0ZSEoZiwgIns6P30iLCBub2RlKT87CisgICAgICAgIH0KKyAgICAgICAgT2soKCkpCisgICAgfQorfQorCisvLy8gRmxhZyB0YWJsZSBzdHJ1Y3QKK2ltcGwgRmxhZ1RhYmxlIHsKKyAgICAvLy8gU2VyaWFsaXplIHRvIGJ5dGVzCisgICAgcHViIGZuIGludG9fYnl0ZXMoJnNlbGYpIC0+IFZlYzx1OD4geworICAgICAgICBbCisgICAgICAgICAgICBzZWxmLmhlYWRlci5pbnRvX2J5dGVzKCksCisgICAgICAgICAgICBzZWxmLmJ1Y2tldHMuaXRlcigpLm1hcCh8dnwgdi51bndyYXBfb3IoMCkudG9fbGVfYnl0ZXMoKSkuY29sbGVjdDo6PFZlYzxfPj4oKS5jb25jYXQoKSwKKyAgICAgICAgICAgIHNlbGYubm9kZXMuaXRlcigpLm1hcCh8dnwgdi5pbnRvX2J5dGVzKCkpLmNvbGxlY3Q6OjxWZWM8Xz4+KCkuY29uY2F0KCksCisgICAgICAgIF0KKyAgICAgICAgLmNvbmNhdCgpCisgICAgfQorCisgICAgLy8vIERlc2VyaWFsaXplIGZyb20gYnl0ZXMKKyAgICBwdWIgZm4gZnJvbV9ieXRlcyhieXRlczogJlt1OF0pIC0+IFJlc3VsdDxTZWxmLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgICAgIGxldCBoZWFkZXIgPSBGbGFnVGFibGVIZWFkZXI6OmZyb21fYnl0ZXMoYnl0ZXMpPzsKKyAgICAgICAgbGV0IG51bV9mbGFncyA9IGhlYWRlci5udW1fZmxhZ3M7CisgICAgICAgIGxldCBudW1fYnVja2V0cyA9IGNyYXRlOjpnZXRfdGFibGVfc2l6ZShudW1fZmxhZ3MpPzsKKyAgICAgICAgbGV0IG11dCBoZWFkID0gaGVhZGVyLmludG9fYnl0ZXMoKS5sZW4oKTsKKyAgICAgICAgbGV0IGJ1Y2tldHMgPSAoMC4ubnVtX2J1Y2tldHMpCisgICAgICAgICAgICAubWFwKHxffCBtYXRjaCByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpLnVud3JhcCgpIHsKKyAgICAgICAgICAgICAgICAwID0+IE5vbmUsCisgICAgICAgICAgICAgICAgdmFsID0+IFNvbWUodmFsKSwKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgICAuY29sbGVjdCgpOworICAgICAgICBsZXQgbm9kZXMgPSAoMC4ubnVtX2ZsYWdzKQorICAgICAgICAgICAgLm1hcCh8X3wgeworICAgICAgICAgICAgICAgIGxldCBub2RlID0gRmxhZ1RhYmxlTm9kZTo6ZnJvbV9ieXRlcygmYnl0ZXNbaGVhZC4uXSk/OworICAgICAgICAgICAgICAgIGhlYWQgKz0gbm9kZS5pbnRvX2J5dGVzKCkubGVuKCk7CisgICAgICAgICAgICAgICAgT2sobm9kZSkKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgICAuY29sbGVjdDo6PFJlc3VsdDxWZWM8Xz4sIEFjb25maWdTdG9yYWdlRXJyb3I+PigpCisgICAgICAgICAgICAubWFwX2Vycih8ZXJybXNnfCB7CisgICAgICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6Qnl0ZXNQYXJzZUZhaWwoYW55aG93ISgiZmFpbCB0byBwYXJzZSBmbGFnIHRhYmxlOiB7fSIsIGVycm1zZykpCisgICAgICAgICAgICB9KT87CisKKyAgICAgICAgbGV0IHRhYmxlID0gU2VsZiB7IGhlYWRlciwgYnVja2V0cywgbm9kZXMgfTsKKyAgICAgICAgT2sodGFibGUpCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBjcmF0ZTo6eworICAgICAgICB0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9mbGFnX3RhYmxlLCBERUZBVUxUX0ZJTEVfVkVSU0lPTiwgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04sCisgICAgfTsKKworICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRoZSB0YWJsZSBzZXJpYWxpemF0aW9uCisgICAgLy8gVE9ETzogYi8zNzYxMDgyNjggLSBVc2UgcGFyYW1ldGVyaXplZCB0ZXN0cy4KKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9zZXJpYWxpemF0aW9uX2RlZmF1bHQoKSB7CisgICAgICAgIGxldCBmbGFnX3RhYmxlID0gY3JlYXRlX3Rlc3RfZmxhZ190YWJsZShERUZBVUxUX0ZJTEVfVkVSU0lPTik7CisKKyAgICAgICAgbGV0IGhlYWRlcjogJkZsYWdUYWJsZUhlYWRlciA9ICZmbGFnX3RhYmxlLmhlYWRlcjsKKyAgICAgICAgbGV0IHJlaW50ZXJwcmV0ZWRfaGVhZGVyID0gRmxhZ1RhYmxlSGVhZGVyOjpmcm9tX2J5dGVzKCZoZWFkZXIuaW50b19ieXRlcygpKTsKKyAgICAgICAgYXNzZXJ0IShyZWludGVycHJldGVkX2hlYWRlci5pc19vaygpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShoZWFkZXIsICZyZWludGVycHJldGVkX2hlYWRlci51bndyYXAoKSk7CisKKyAgICAgICAgbGV0IG5vZGVzOiAmVmVjPEZsYWdUYWJsZU5vZGU+ID0gJmZsYWdfdGFibGUubm9kZXM7CisgICAgICAgIGZvciBub2RlIGluIG5vZGVzLml0ZXIoKSB7CisgICAgICAgICAgICBsZXQgcmVpbnRlcnByZXRlZF9ub2RlID0gRmxhZ1RhYmxlTm9kZTo6ZnJvbV9ieXRlcygmbm9kZS5pbnRvX2J5dGVzKCkpLnVud3JhcCgpOworICAgICAgICAgICAgYXNzZXJ0X2VxIShub2RlLCAmcmVpbnRlcnByZXRlZF9ub2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIGxldCBmbGFnX3RhYmxlX2J5dGVzID0gZmxhZ190YWJsZS5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCByZWludGVycHJldGVkX3RhYmxlID0gRmxhZ1RhYmxlOjpmcm9tX2J5dGVzKCZmbGFnX3RhYmxlX2J5dGVzKTsKKyAgICAgICAgYXNzZXJ0IShyZWludGVycHJldGVkX3RhYmxlLmlzX29rKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZmbGFnX3RhYmxlLCAmcmVpbnRlcnByZXRlZF90YWJsZS51bndyYXAoKSk7CisgICAgICAgIGFzc2VydF9lcSEoZmxhZ190YWJsZV9ieXRlcy5sZW4oKSBhcyB1MzIsIGhlYWRlci5maWxlX3NpemUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3NlcmlhbGl6YXRpb25fbWF4KCkgeworICAgICAgICBsZXQgZmxhZ190YWJsZSA9IGNyZWF0ZV90ZXN0X2ZsYWdfdGFibGUoTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04pOworCisgICAgICAgIGxldCBoZWFkZXI6ICZGbGFnVGFibGVIZWFkZXIgPSAmZmxhZ190YWJsZS5oZWFkZXI7CisgICAgICAgIGxldCByZWludGVycHJldGVkX2hlYWRlciA9IEZsYWdUYWJsZUhlYWRlcjo6ZnJvbV9ieXRlcygmaGVhZGVyLmludG9fYnl0ZXMoKSk7CisgICAgICAgIGFzc2VydCEocmVpbnRlcnByZXRlZF9oZWFkZXIuaXNfb2soKSk7CisgICAgICAgIGFzc2VydF9lcSEoaGVhZGVyLCAmcmVpbnRlcnByZXRlZF9oZWFkZXIudW53cmFwKCkpOworCisgICAgICAgIGxldCBub2RlczogJlZlYzxGbGFnVGFibGVOb2RlPiA9ICZmbGFnX3RhYmxlLm5vZGVzOworICAgICAgICBmb3Igbm9kZSBpbiBub2Rlcy5pdGVyKCkgeworICAgICAgICAgICAgbGV0IHJlaW50ZXJwcmV0ZWRfbm9kZSA9IEZsYWdUYWJsZU5vZGU6OmZyb21fYnl0ZXMoJm5vZGUuaW50b19ieXRlcygpKS51bndyYXAoKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEobm9kZSwgJnJlaW50ZXJwcmV0ZWRfbm9kZSk7CisgICAgICAgIH0KKworICAgICAgICBsZXQgZmxhZ190YWJsZV9ieXRlcyA9IGZsYWdfdGFibGUuaW50b19ieXRlcygpOworICAgICAgICBsZXQgcmVpbnRlcnByZXRlZF90YWJsZSA9IEZsYWdUYWJsZTo6ZnJvbV9ieXRlcygmZmxhZ190YWJsZV9ieXRlcyk7CisgICAgICAgIGFzc2VydCEocmVpbnRlcnByZXRlZF90YWJsZS5pc19vaygpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmZmxhZ190YWJsZSwgJnJlaW50ZXJwcmV0ZWRfdGFibGUudW53cmFwKCkpOworICAgICAgICBhc3NlcnRfZXEhKGZsYWdfdGFibGVfYnl0ZXMubGVuKCkgYXMgdTMyLCBoZWFkZXIuZmlsZV9zaXplKTsKKyAgICB9CisKKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biB0aGF0IHZlcnNpb24gbnVtYmVyIHNob3VsZCBiZSBhdCB0aGUgdG9wIG9mIHNlcmlhbGl6ZWQKKyAgICAvLyBieXRlcworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3ZlcnNpb25fbnVtYmVyKCkgeworICAgICAgICBsZXQgZmxhZ190YWJsZSA9IGNyZWF0ZV90ZXN0X2ZsYWdfdGFibGUoREVGQVVMVF9GSUxFX1ZFUlNJT04pOworICAgICAgICBsZXQgYnl0ZXMgPSAmZmxhZ190YWJsZS5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCBtdXQgaGVhZCA9IDA7CisgICAgICAgIGxldCB2ZXJzaW9uX2Zyb21fZmlsZSA9IHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCkudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEodmVyc2lvbl9mcm9tX2ZpbGUsIERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICB9CisKKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBmaWxlIHR5cGUgY2hlY2sKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9maWxlX3R5cGVfY2hlY2soKSB7CisgICAgICAgIGxldCBtdXQgZmxhZ190YWJsZSA9IGNyZWF0ZV90ZXN0X2ZsYWdfdGFibGUoREVGQVVMVF9GSUxFX1ZFUlNJT04pOworICAgICAgICBmbGFnX3RhYmxlLmhlYWRlci5maWxlX3R5cGUgPSAxMjN1ODsKKyAgICAgICAgbGV0IGVycm9yID0gRmxhZ1RhYmxlOjpmcm9tX2J5dGVzKCZmbGFnX3RhYmxlLmludG9fYnl0ZXMoKSkudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVycm9yKSwKKyAgICAgICAgICAgIGZvcm1hdCEoIkJ5dGVzUGFyc2VGYWlsKGJpbmFyeSBmaWxlIGlzIG5vdCBhIGZsYWcgbWFwKSIpCisgICAgICAgICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvZmxhZ192YWx1ZS5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL2ZsYWdfdmFsdWUucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWExNGJlYwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL2ZsYWdfdmFsdWUucnMKQEAgLTAsMCArMSwxOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyEgZmxhZyB2YWx1ZSBtb2R1bGUgZGVmaW5lcyB0aGUgZmxhZyB2YWx1ZSBmaWxlIGZvcm1hdCBhbmQgbWV0aG9kcyBmb3Igc2VyaWFsaXphdGlvbgorLy8hIGFuZCBkZXNlcmlhbGl6YXRpb24KKwordXNlIGNyYXRlOjp7cmVhZF9zdHJfZnJvbV9ieXRlcywgcmVhZF91MzJfZnJvbV9ieXRlcywgcmVhZF91OF9mcm9tX2J5dGVzfTsKK3VzZSBjcmF0ZTo6e0Fjb25maWdTdG9yYWdlRXJyb3IsIFN0b3JhZ2VGaWxlVHlwZX07Cit1c2UgYW55aG93Ojphbnlob3c7Cit1c2Ugc2VyZGU6OntEZXNlcmlhbGl6ZSwgU2VyaWFsaXplfTsKK3VzZSBzdGQ6OmZtdDsKKworLy8vIEZsYWcgdmFsdWUgaGVhZGVyIHN0cnVjdAorI1tkZXJpdmUoUGFydGlhbEVxLCBTZXJpYWxpemUsIERlc2VyaWFsaXplKV0KK3B1YiBzdHJ1Y3QgRmxhZ1ZhbHVlSGVhZGVyIHsKKyAgICBwdWIgdmVyc2lvbjogdTMyLAorICAgIHB1YiBjb250YWluZXI6IFN0cmluZywKKyAgICBwdWIgZmlsZV90eXBlOiB1OCwKKyAgICBwdWIgZmlsZV9zaXplOiB1MzIsCisgICAgcHViIG51bV9mbGFnczogdTMyLAorICAgIHB1YiBib29sZWFuX3ZhbHVlX29mZnNldDogdTMyLAorfQorCisvLy8gSW1wbGVtZW50IGRlYnVnIHByaW50IHRyYWl0IGZvciBoZWFkZXIKK2ltcGwgZm10OjpEZWJ1ZyBmb3IgRmxhZ1ZhbHVlSGVhZGVyIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgZm10OjpGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKyAgICAgICAgd3JpdGVsbiEoCisgICAgICAgICAgICBmLAorICAgICAgICAgICAgIlZlcnNpb246IHt9LCBDb250YWluZXI6IHt9LCBGaWxlIFR5cGU6IHs6P30sIEZpbGUgU2l6ZToge30iLAorICAgICAgICAgICAgc2VsZi52ZXJzaW9uLAorICAgICAgICAgICAgc2VsZi5jb250YWluZXIsCisgICAgICAgICAgICBTdG9yYWdlRmlsZVR5cGU6OnRyeV9mcm9tKHNlbGYuZmlsZV90eXBlKSwKKyAgICAgICAgICAgIHNlbGYuZmlsZV9zaXplCisgICAgICAgICk/OworICAgICAgICB3cml0ZWxuISgKKyAgICAgICAgICAgIGYsCisgICAgICAgICAgICAiTnVtIG9mIEZsYWdzOiB7fSwgVmFsdWUgT2Zmc2V0Ont9IiwKKyAgICAgICAgICAgIHNlbGYubnVtX2ZsYWdzLCBzZWxmLmJvb2xlYW5fdmFsdWVfb2Zmc2V0CisgICAgICAgICk/OworICAgICAgICBPaygoKSkKKyAgICB9Cit9CisKK2ltcGwgRmxhZ1ZhbHVlSGVhZGVyIHsKKyAgICAvLy8gU2VyaWFsaXplIHRvIGJ5dGVzCisgICAgcHViIGZuIGludG9fYnl0ZXMoJnNlbGYpIC0+IFZlYzx1OD4geworICAgICAgICBsZXQgbXV0IHJlc3VsdCA9IFZlYzo6bmV3KCk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmc2VsZi52ZXJzaW9uLnRvX2xlX2J5dGVzKCkpOworICAgICAgICBsZXQgY29udGFpbmVyX2J5dGVzID0gc2VsZi5jb250YWluZXIuYXNfYnl0ZXMoKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCYoY29udGFpbmVyX2J5dGVzLmxlbigpIGFzIHUzMikudG9fbGVfYnl0ZXMoKSk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZShjb250YWluZXJfYnl0ZXMpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYuZmlsZV90eXBlLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYuZmlsZV9zaXplLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYubnVtX2ZsYWdzLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYuYm9vbGVhbl92YWx1ZV9vZmZzZXQudG9fbGVfYnl0ZXMoKSk7CisgICAgICAgIHJlc3VsdAorICAgIH0KKworICAgIC8vLyBEZXNlcmlhbGl6ZSBmcm9tIGJ5dGVzCisgICAgcHViIGZuIGZyb21fYnl0ZXMoYnl0ZXM6ICZbdThdKSAtPiBSZXN1bHQ8U2VsZiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgICAgICBsZXQgbXV0IGhlYWQgPSAwOworICAgICAgICBsZXQgbGlzdCA9IFNlbGYgeworICAgICAgICAgICAgdmVyc2lvbjogcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8sCisgICAgICAgICAgICBjb250YWluZXI6IHJlYWRfc3RyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/LAorICAgICAgICAgICAgZmlsZV90eXBlOiByZWFkX3U4X2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/LAorICAgICAgICAgICAgZmlsZV9zaXplOiByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPywKKyAgICAgICAgICAgIG51bV9mbGFnczogcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8sCisgICAgICAgICAgICBib29sZWFuX3ZhbHVlX29mZnNldDogcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8sCisgICAgICAgIH07CisgICAgICAgIGlmIGxpc3QuZmlsZV90eXBlICE9IFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCBhcyB1OCB7CisgICAgICAgICAgICByZXR1cm4gRXJyKEFjb25maWdTdG9yYWdlRXJyb3I6OkJ5dGVzUGFyc2VGYWlsKGFueWhvdyEoCisgICAgICAgICAgICAgICAgImJpbmFyeSBmaWxlIGlzIG5vdCBhIGZsYWcgdmFsdWUgZmlsZSIKKyAgICAgICAgICAgICkpKTsKKyAgICAgICAgfQorICAgICAgICBPayhsaXN0KQorICAgIH0KK30KKworLy8vIEZsYWcgdmFsdWUgbGlzdCBzdHJ1Y3QKKyNbZGVyaXZlKFBhcnRpYWxFcSwgU2VyaWFsaXplLCBEZXNlcmlhbGl6ZSldCitwdWIgc3RydWN0IEZsYWdWYWx1ZUxpc3QgeworICAgIHB1YiBoZWFkZXI6IEZsYWdWYWx1ZUhlYWRlciwKKyAgICBwdWIgYm9vbGVhbnM6IFZlYzxib29sPiwKK30KKworLy8vIEltcGxlbWVudCBkZWJ1ZyBwcmludCB0cmFpdCBmb3IgZmxhZyB2YWx1ZQoraW1wbCBmbXQ6OkRlYnVnIGZvciBGbGFnVmFsdWVMaXN0IHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgZm10OjpGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKyAgICAgICAgd3JpdGVsbiEoZiwgIkhlYWRlcjoiKT87CisgICAgICAgIHdyaXRlIShmLCAiezo/fSIsIHNlbGYuaGVhZGVyKT87CisgICAgICAgIHdyaXRlbG4hKGYsICJWYWx1ZXM6Iik/OworICAgICAgICB3cml0ZWxuIShmLCAiezo/fSIsIHNlbGYuYm9vbGVhbnMpPzsKKyAgICAgICAgT2soKCkpCisgICAgfQorfQorCitpbXBsIEZsYWdWYWx1ZUxpc3QgeworICAgIC8vLyBTZXJpYWxpemUgdG8gYnl0ZXMKKyAgICBwdWIgZm4gaW50b19ieXRlcygmc2VsZikgLT4gVmVjPHU4PiB7CisgICAgICAgIFsKKyAgICAgICAgICAgIHNlbGYuaGVhZGVyLmludG9fYnl0ZXMoKSwKKyAgICAgICAgICAgIHNlbGYuYm9vbGVhbnMuaXRlcigpLm1hcCh8JnZ8IHU4Ojpmcm9tKHYpLnRvX2xlX2J5dGVzKCkpLmNvbGxlY3Q6OjxWZWM8Xz4+KCkuY29uY2F0KCksCisgICAgICAgIF0KKyAgICAgICAgLmNvbmNhdCgpCisgICAgfQorCisgICAgLy8vIERlc2VyaWFsaXplIGZyb20gYnl0ZXMKKyAgICBwdWIgZm4gZnJvbV9ieXRlcyhieXRlczogJlt1OF0pIC0+IFJlc3VsdDxTZWxmLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgICAgIGxldCBoZWFkZXIgPSBGbGFnVmFsdWVIZWFkZXI6OmZyb21fYnl0ZXMoYnl0ZXMpPzsKKyAgICAgICAgbGV0IG51bV9mbGFncyA9IGhlYWRlci5udW1fZmxhZ3M7CisgICAgICAgIGxldCBtdXQgaGVhZCA9IGhlYWRlci5pbnRvX2J5dGVzKCkubGVuKCk7CisgICAgICAgIGxldCBib29sZWFucyA9CisgICAgICAgICAgICAoMC4ubnVtX2ZsYWdzKS5tYXAofF98IHJlYWRfdThfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKS51bndyYXAoKSA9PSAxKS5jb2xsZWN0KCk7CisgICAgICAgIGxldCBsaXN0ID0gU2VsZiB7IGhlYWRlciwgYm9vbGVhbnMgfTsKKyAgICAgICAgT2sobGlzdCkKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIGNyYXRlOjp7CisgICAgICAgIHRlc3RfdXRpbHM6OmNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCwgREVGQVVMVF9GSUxFX1ZFUlNJT04sIE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OLAorICAgIH07CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhlIHZhbHVlIGxpc3Qgc2VyaWFsaXphdGlvbgorICAgIC8vIFRPRE86IGIvMzc2MTA4MjY4IC0gVXNlIHBhcmFtZXRlcml6ZWQgdGVzdHMuCisgICAgZm4gdGVzdF9zZXJpYWxpemF0aW9uX2RlZmF1bHQoKSB7CisgICAgICAgIGxldCBmbGFnX3ZhbHVlX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pOworCisgICAgICAgIGxldCBoZWFkZXI6ICZGbGFnVmFsdWVIZWFkZXIgPSAmZmxhZ192YWx1ZV9saXN0LmhlYWRlcjsKKyAgICAgICAgbGV0IHJlaW50ZXJwcmV0ZWRfaGVhZGVyID0gRmxhZ1ZhbHVlSGVhZGVyOjpmcm9tX2J5dGVzKCZoZWFkZXIuaW50b19ieXRlcygpKTsKKyAgICAgICAgYXNzZXJ0IShyZWludGVycHJldGVkX2hlYWRlci5pc19vaygpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShoZWFkZXIsICZyZWludGVycHJldGVkX2hlYWRlci51bndyYXAoKSk7CisKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVfYnl0ZXMgPSBmbGFnX3ZhbHVlX2xpc3QuaW50b19ieXRlcygpOworICAgICAgICBsZXQgcmVpbnRlcnByZXRlZF92YWx1ZV9saXN0ID0gRmxhZ1ZhbHVlTGlzdDo6ZnJvbV9ieXRlcygmZmxhZ192YWx1ZV9ieXRlcyk7CisgICAgICAgIGFzc2VydCEocmVpbnRlcnByZXRlZF92YWx1ZV9saXN0LmlzX29rKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZmbGFnX3ZhbHVlX2xpc3QsICZyZWludGVycHJldGVkX3ZhbHVlX2xpc3QudW53cmFwKCkpOworICAgICAgICBhc3NlcnRfZXEhKGZsYWdfdmFsdWVfYnl0ZXMubGVuKCkgYXMgdTMyLCBoZWFkZXIuZmlsZV9zaXplKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhlIHZhbHVlIGxpc3Qgc2VyaWFsaXphdGlvbgorICAgIGZuIHRlc3Rfc2VyaWFsaXphdGlvbl9tYXgoKSB7CisgICAgICAgIGxldCBmbGFnX3ZhbHVlX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04pOworCisgICAgICAgIGxldCBoZWFkZXI6ICZGbGFnVmFsdWVIZWFkZXIgPSAmZmxhZ192YWx1ZV9saXN0LmhlYWRlcjsKKyAgICAgICAgbGV0IHJlaW50ZXJwcmV0ZWRfaGVhZGVyID0gRmxhZ1ZhbHVlSGVhZGVyOjpmcm9tX2J5dGVzKCZoZWFkZXIuaW50b19ieXRlcygpKTsKKyAgICAgICAgYXNzZXJ0IShyZWludGVycHJldGVkX2hlYWRlci5pc19vaygpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShoZWFkZXIsICZyZWludGVycHJldGVkX2hlYWRlci51bndyYXAoKSk7CisKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVfYnl0ZXMgPSBmbGFnX3ZhbHVlX2xpc3QuaW50b19ieXRlcygpOworICAgICAgICBsZXQgcmVpbnRlcnByZXRlZF92YWx1ZV9saXN0ID0gRmxhZ1ZhbHVlTGlzdDo6ZnJvbV9ieXRlcygmZmxhZ192YWx1ZV9ieXRlcyk7CisgICAgICAgIGFzc2VydCEocmVpbnRlcnByZXRlZF92YWx1ZV9saXN0LmlzX29rKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZmbGFnX3ZhbHVlX2xpc3QsICZyZWludGVycHJldGVkX3ZhbHVlX2xpc3QudW53cmFwKCkpOworICAgICAgICBhc3NlcnRfZXEhKGZsYWdfdmFsdWVfYnl0ZXMubGVuKCkgYXMgdTMyLCBoZWFkZXIuZmlsZV9zaXplKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhhdCB2ZXJzaW9uIG51bWJlciBzaG91bGQgYmUgYXQgdGhlIHRvcCBvZiBzZXJpYWxpemVkCisgICAgLy8gYnl0ZXMKKyAgICBmbiB0ZXN0X3ZlcnNpb25fbnVtYmVyKCkgeworICAgICAgICBsZXQgZmxhZ192YWx1ZV9saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0KERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgbGV0IGJ5dGVzID0gJmZsYWdfdmFsdWVfbGlzdC5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCBtdXQgaGVhZCA9IDA7CisgICAgICAgIGxldCB2ZXJzaW9uX2Zyb21fZmlsZSA9IHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCkudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEodmVyc2lvbl9mcm9tX2ZpbGUsIERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gZmlsZSB0eXBlIGNoZWNrCisgICAgZm4gdGVzdF9maWxlX3R5cGVfY2hlY2soKSB7CisgICAgICAgIGxldCBtdXQgZmxhZ192YWx1ZV9saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0KERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgZmxhZ192YWx1ZV9saXN0LmhlYWRlci5maWxlX3R5cGUgPSAxMjN1ODsKKyAgICAgICAgbGV0IGVycm9yID0gRmxhZ1ZhbHVlTGlzdDo6ZnJvbV9ieXRlcygmZmxhZ192YWx1ZV9saXN0LmludG9fYnl0ZXMoKSkudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVycm9yKSwKKyAgICAgICAgICAgIGZvcm1hdCEoIkJ5dGVzUGFyc2VGYWlsKGJpbmFyeSBmaWxlIGlzIG5vdCBhIGZsYWcgdmFsdWUgZmlsZSkiKQorICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL2xpYi5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL2xpYi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTkxMzIwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvbGliLnJzCkBAIC0wLDAgKzEsNzE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8hIGBhY29uZmlnX3N0b3JhZ2VfZmlsZWAgaXMgYSBjcmF0ZSB0aGF0IGRlZmluZXMgYWNvbmZpZyBzdG9yYWdlIGZpbGUgZm9ybWF0LCBpdAorLy8hIGFsc28gaW5jbHVkZXMgYXBpcyB0byByZWFkIGZsYWdzIGZyb20gc3RvcmFnZSBmaWxlcy4gSXQgcHJvdmlkZXMgdGhyZWUgYXBpcyB0bworLy8hIGludGVyZmFjZSB3aXRoIHN0b3JhZ2UgZmlsZXM6CisvLyEKKy8vISAxLCBmdW5jdGlvbiB0byBnZXQgcGFja2FnZSBmbGFnIHZhbHVlIHN0YXJ0IG9mZnNldAorLy8hIHB1YiBmbiBnZXRfcGFja2FnZV9vZmZzZXQoY29udGFpbmVyOiAmc3RyLCBwYWNrYWdlOiAmc3RyKSAtPiBgUmVzdWx0PE9wdGlvbjxQYWNrYWdlT2Zmc2V0Pj4+YAorLy8hCisvLyEgMiwgZnVuY3Rpb24gdG8gZ2V0IGZsYWcgb2Zmc2V0IHdpdGhpbiBhIHNwZWNpZmljIHBhY2thZ2UKKy8vISBwdWIgZm4gZ2V0X2ZsYWdfb2Zmc2V0KGNvbnRhaW5lcjogJnN0ciwgcGFja2FnZV9pZDogdTMyLCBmbGFnOiAmc3RyKSAtPiBgUmVzdWx0PE9wdGlvbjx1MTY+Pj5gCisvLyEKKy8vISAzLCBmdW5jdGlvbiB0byBnZXQgdGhlIGFjdHVhbCBmbGFnIHZhbHVlIGdpdmVuIHRoZSBnbG9iYWwgb2Zmc2V0IChjb21iaW5lZCBwYWNrYWdlIGFuZAorLy8hIGZsYWcgb2Zmc2V0KS4KKy8vISBwdWIgZm4gZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZShjb250YWluZXI6ICZzdHIsIG9mZnNldDogdTMyKSAtPiBgUmVzdWx0PGJvb2w+YAorLy8hCisvLyEgTm90ZSB0aGVzZSBhcmUgbG93IGxldmVsIGFwaXMgdGhhdCBhcmUgZXhwZWN0ZWQgdG8gYmUgb25seSB1c2VkIGluIGF1dG8gZ2VuZXJhdGVkIGZsYWcKKy8vISBhcGlzLiBETyBOT1QgRElSRUNUTFkgVVNFIFRIRVNFIEFQSVMgSU4gWU9VUiBTT1VSQ0UgQ09ERS4gRm9yIGF1dG8gZ2VuZXJhdGVkIGZsYWcgYXBpcworLy8hIHBsZWFzZSByZWZlciB0byB0aGUgZzNkb2MgZ28vYW5kcm9pZC1mbGFncworCitwdWIgbW9kIGZsYWdfaW5mbzsKK3B1YiBtb2QgZmxhZ190YWJsZTsKK3B1YiBtb2QgZmxhZ192YWx1ZTsKK3B1YiBtb2QgcGFja2FnZV90YWJsZTsKK3B1YiBtb2QgcHJvdG9zOworcHViIG1vZCBzaXBfaGFzaGVyMTM7CitwdWIgbW9kIHRlc3RfdXRpbHM7CisKK3VzZSBhbnlob3c6OmFueWhvdzsKK3VzZSBzZXJkZTo6e0Rlc2VyaWFsaXplLCBTZXJpYWxpemV9OwordXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKK3VzZSBzdGQ6OmZzOjpGaWxlOwordXNlIHN0ZDo6aGFzaDo6SGFzaGVyOwordXNlIHN0ZDo6aW86OlJlYWQ7CisKK3B1YiB1c2UgY3JhdGU6OmZsYWdfaW5mbzo6e0ZsYWdJbmZvQml0LCBGbGFnSW5mb0hlYWRlciwgRmxhZ0luZm9MaXN0LCBGbGFnSW5mb05vZGV9OworcHViIHVzZSBjcmF0ZTo6ZmxhZ190YWJsZTo6e0ZsYWdUYWJsZSwgRmxhZ1RhYmxlSGVhZGVyLCBGbGFnVGFibGVOb2RlfTsKK3B1YiB1c2UgY3JhdGU6OmZsYWdfdmFsdWU6OntGbGFnVmFsdWVIZWFkZXIsIEZsYWdWYWx1ZUxpc3R9OworcHViIHVzZSBjcmF0ZTo6cGFja2FnZV90YWJsZTo6e1BhY2thZ2VUYWJsZSwgUGFja2FnZVRhYmxlSGVhZGVyLCBQYWNrYWdlVGFibGVOb2RlfTsKK3B1YiB1c2UgY3JhdGU6OnNpcF9oYXNoZXIxMzo6U2lwSGFzaGVyMTM7CisKK3VzZSBjcmF0ZTo6QWNvbmZpZ1N0b3JhZ2VFcnJvcjo6eworICAgIEJ5dGVzUGFyc2VGYWlsLCBIYXNoVGFibGVTaXplTGltaXQsIEludmFsaWRGbGFnVmFsdWVUeXBlLCBJbnZhbGlkU3RvcmVkRmxhZ1R5cGUsCit9OworCisvLy8gVGhlIG1heCBzdG9yYWdlIGZpbGUgdmVyc2lvbiBmcm9tIHdoaWNoIHdlIGNhbiBzYWZlbHkgcmVhZC93cml0ZS4gTWF5IGJlCisvLy8gZXhwZXJpbWVudGFsLgorcHViIGNvbnN0IE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OOiB1MzIgPSAyOworCisvLy8gVGhlIG5ld2VzdCBmdWxseS1yZWxlYXNlZCB2ZXJzaW9uLiBVbmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCwgdGhpcyBpcyB0aGUKKy8vLyB2ZXJzaW9uIHdlIHdpbGwgd3JpdGUuCitwdWIgY29uc3QgREVGQVVMVF9GSUxFX1ZFUlNJT046IHUzMiA9IDE7CisKKy8vLyBHb29kIGhhc2ggdGFibGUgcHJpbWUgbnVtYmVyCitwdWIoY3JhdGUpIGNvbnN0IEhBU0hfUFJJTUVTOiBbdTMyOyAyOV0gPSBbCisgICAgNywgMTcsIDI5LCA1MywgOTcsIDE5MywgMzg5LCA3NjksIDE1NDMsIDMwNzksIDYxNTEsIDEyMjg5LCAyNDU5MywgNDkxNTcsIDk4MzE3LCAxOTY2MTMsIDM5MzI0MSwKKyAgICA3ODY0MzMsIDE1NzI4NjksIDMxNDU3MzksIDYyOTE0NjksIDEyNTgyOTE3LCAyNTE2NTg0MywgNTAzMzE2NTMsIDEwMDY2MzMxOSwgMjAxMzI2NjExLAorICAgIDQwMjY1MzE4OSwgODA1MzA2NDU3LCAxNjEwNjEyNzQxLAorXTsKKworLy8vIFN0b3JhZ2UgZmlsZSB0eXBlIGVudW0KKyNbZGVyaXZlKENsb25lLCBEZWJ1ZywgUGFydGlhbEVxLCBFcSldCitwdWIgZW51bSBTdG9yYWdlRmlsZVR5cGUgeworICAgIFBhY2thZ2VNYXAgPSAwLAorICAgIEZsYWdNYXAgPSAxLAorICAgIEZsYWdWYWwgPSAyLAorICAgIEZsYWdJbmZvID0gMywKK30KKworaW1wbCBUcnlGcm9tPCZzdHI+IGZvciBTdG9yYWdlRmlsZVR5cGUgeworICAgIHR5cGUgRXJyb3IgPSBhbnlob3c6OkVycm9yOworCisgICAgZm4gdHJ5X2Zyb20odmFsdWU6ICZzdHIpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8U2VsZiwgU2VsZjo6RXJyb3I+IHsKKyAgICAgICAgbWF0Y2ggdmFsdWUgeworICAgICAgICAgICAgInBhY2thZ2VfbWFwIiA9PiBPayhTZWxmOjpQYWNrYWdlTWFwKSwKKyAgICAgICAgICAgICJmbGFnX21hcCIgPT4gT2soU2VsZjo6RmxhZ01hcCksCisgICAgICAgICAgICAiZmxhZ192YWwiID0+IE9rKFNlbGY6OkZsYWdWYWwpLAorICAgICAgICAgICAgImZsYWdfaW5mbyIgPT4gT2soU2VsZjo6RmxhZ0luZm8pLAorICAgICAgICAgICAgXyA9PiBFcnIoYW55aG93ISgKKyAgICAgICAgICAgICAgICAiSW52YWxpZCBzdG9yYWdlIGZpbGUgdHlwZSwgdmFsaWQgdHlwZXMgYXJlIHBhY2thZ2VfbWFwfGZsYWdfbWFwfGZsYWdfdmFsfGZsYWdfaW5mbyIKKyAgICAgICAgICAgICkpLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIFRyeUZyb208dTg+IGZvciBTdG9yYWdlRmlsZVR5cGUgeworICAgIHR5cGUgRXJyb3IgPSBhbnlob3c6OkVycm9yOworCisgICAgZm4gdHJ5X2Zyb20odmFsdWU6IHU4KSAtPiBSZXN1bHQ8U2VsZiwgU2VsZjo6RXJyb3I+IHsKKyAgICAgICAgbWF0Y2ggdmFsdWUgeworICAgICAgICAgICAgeCBpZiB4ID09IFNlbGY6OlBhY2thZ2VNYXAgYXMgdTggPT4gT2soU2VsZjo6UGFja2FnZU1hcCksCisgICAgICAgICAgICB4IGlmIHggPT0gU2VsZjo6RmxhZ01hcCBhcyB1OCA9PiBPayhTZWxmOjpGbGFnTWFwKSwKKyAgICAgICAgICAgIHggaWYgeCA9PSBTZWxmOjpGbGFnVmFsIGFzIHU4ID0+IE9rKFNlbGY6OkZsYWdWYWwpLAorICAgICAgICAgICAgeCBpZiB4ID09IFNlbGY6OkZsYWdJbmZvIGFzIHU4ID0+IE9rKFNlbGY6OkZsYWdJbmZvKSwKKyAgICAgICAgICAgIF8gPT4gRXJyKGFueWhvdyEoIkludmFsaWQgc3RvcmFnZSBmaWxlIHR5cGUiKSksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBGbGFnIHR5cGUgZW51bSBhcyBzdG9yZWQgYnkgc3RvcmFnZSBmaWxlCisvLy8gT05MWSBBUFBFTkQsIE5FVkVSIFJFTU9WRSBGT1IgQkFDS1dBUkQgQ09NUEFUSUJJTElUWS4gVEhFIE1BWCBJUyBVMTYuCisjW2Rlcml2ZShDbG9uZSwgQ29weSwgRGVidWcsIFBhcnRpYWxFcSwgRXEsIFNlcmlhbGl6ZSwgRGVzZXJpYWxpemUpXQorcHViIGVudW0gU3RvcmVkRmxhZ1R5cGUgeworICAgIFJlYWRXcml0ZUJvb2xlYW4gPSAwLAorICAgIFJlYWRPbmx5Qm9vbGVhbiA9IDEsCisgICAgRml4ZWRSZWFkT25seUJvb2xlYW4gPSAyLAorfQorCitpbXBsIFRyeUZyb208dTE2PiBmb3IgU3RvcmVkRmxhZ1R5cGUgeworICAgIHR5cGUgRXJyb3IgPSBBY29uZmlnU3RvcmFnZUVycm9yOworCisgICAgZm4gdHJ5X2Zyb20odmFsdWU6IHUxNikgLT4gUmVzdWx0PFNlbGYsIFNlbGY6OkVycm9yPiB7CisgICAgICAgIG1hdGNoIHZhbHVlIHsKKyAgICAgICAgICAgIHggaWYgeCA9PSBTZWxmOjpSZWFkV3JpdGVCb29sZWFuIGFzIHUxNiA9PiBPayhTZWxmOjpSZWFkV3JpdGVCb29sZWFuKSwKKyAgICAgICAgICAgIHggaWYgeCA9PSBTZWxmOjpSZWFkT25seUJvb2xlYW4gYXMgdTE2ID0+IE9rKFNlbGY6OlJlYWRPbmx5Qm9vbGVhbiksCisgICAgICAgICAgICB4IGlmIHggPT0gU2VsZjo6Rml4ZWRSZWFkT25seUJvb2xlYW4gYXMgdTE2ID0+IE9rKFNlbGY6OkZpeGVkUmVhZE9ubHlCb29sZWFuKSwKKyAgICAgICAgICAgIF8gPT4gRXJyKEludmFsaWRTdG9yZWRGbGFnVHlwZShhbnlob3chKCJJbnZhbGlkIHN0b3JlZCBmbGFnIHR5cGUiKSkpLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gRmxhZyB2YWx1ZSB0eXBlIGVudW0sIG9uZSBGbGFnVmFsdWVUeXBlIG1hcHMgdG8gbWFueSBTdG9yZWRGbGFnVHlwZQorLy8vIE9OTFkgQVBQRU5ELCBORVZFUiBSRU1PVkUgRk9SIEJBQ0tXQVJEIENPTVBBVElCSUxJVFkuIFRIRSBNQVggSVMgVTE2CisjW2Rlcml2ZShDbG9uZSwgQ29weSwgRGVidWcsIFBhcnRpYWxFcSwgRXEpXQorcHViIGVudW0gRmxhZ1ZhbHVlVHlwZSB7CisgICAgQm9vbGVhbiA9IDAsCit9CisKK2ltcGwgVHJ5RnJvbTxTdG9yZWRGbGFnVHlwZT4gZm9yIEZsYWdWYWx1ZVR5cGUgeworICAgIHR5cGUgRXJyb3IgPSBBY29uZmlnU3RvcmFnZUVycm9yOworCisgICAgZm4gdHJ5X2Zyb20odmFsdWU6IFN0b3JlZEZsYWdUeXBlKSAtPiBSZXN1bHQ8U2VsZiwgU2VsZjo6RXJyb3I+IHsKKyAgICAgICAgbWF0Y2ggdmFsdWUgeworICAgICAgICAgICAgU3RvcmVkRmxhZ1R5cGU6OlJlYWRXcml0ZUJvb2xlYW4gPT4gT2soU2VsZjo6Qm9vbGVhbiksCisgICAgICAgICAgICBTdG9yZWRGbGFnVHlwZTo6UmVhZE9ubHlCb29sZWFuID0+IE9rKFNlbGY6OkJvb2xlYW4pLAorICAgICAgICAgICAgU3RvcmVkRmxhZ1R5cGU6OkZpeGVkUmVhZE9ubHlCb29sZWFuID0+IE9rKFNlbGY6OkJvb2xlYW4pLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIFRyeUZyb208dTE2PiBmb3IgRmxhZ1ZhbHVlVHlwZSB7CisgICAgdHlwZSBFcnJvciA9IEFjb25maWdTdG9yYWdlRXJyb3I7CisKKyAgICBmbiB0cnlfZnJvbSh2YWx1ZTogdTE2KSAtPiBSZXN1bHQ8U2VsZiwgU2VsZjo6RXJyb3I+IHsKKyAgICAgICAgbWF0Y2ggdmFsdWUgeworICAgICAgICAgICAgeCBpZiB4ID09IFNlbGY6OkJvb2xlYW4gYXMgdTE2ID0+IE9rKFNlbGY6OkJvb2xlYW4pLAorICAgICAgICAgICAgXyA9PiBFcnIoSW52YWxpZEZsYWdWYWx1ZVR5cGUoYW55aG93ISgiSW52YWxpZCBmbGFnIHZhbHVlIHR5cGUiKSkpLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gU3RvcmFnZSBxdWVyeSBhcGkgZXJyb3IKKyNbbm9uX2V4aGF1c3RpdmVdCisjW2Rlcml2ZSh0aGlzZXJyb3I6OkVycm9yLCBEZWJ1ZyldCitwdWIgZW51bSBBY29uZmlnU3RvcmFnZUVycm9yIHsKKyAgICAjW2Vycm9yKCJmYWlsZWQgdG8gcmVhZCB0aGUgZmlsZSIpXQorICAgIEZpbGVSZWFkRmFpbCgjW3NvdXJjZV0gYW55aG93OjpFcnJvciksCisKKyAgICAjW2Vycm9yKCJmYWlsIHRvIHBhcnNlIHByb3RvYnVmIildCisgICAgUHJvdG9idWZQYXJzZUZhaWwoI1tzb3VyY2VdIGFueWhvdzo6RXJyb3IpLAorCisgICAgI1tlcnJvcigic3RvcmFnZSBmaWxlcyBub3QgZm91bmQgZm9yIHRoaXMgY29udGFpbmVyIildCisgICAgU3RvcmFnZUZpbGVOb3RGb3VuZCgjW3NvdXJjZV0gYW55aG93OjpFcnJvciksCisKKyAgICAjW2Vycm9yKCJmYWlsIHRvIG1hcCBzdG9yYWdlIGZpbGUiKV0KKyAgICBNYXBGaWxlRmFpbCgjW3NvdXJjZV0gYW55aG93OjpFcnJvciksCisKKyAgICAjW2Vycm9yKCJmYWlsIHRvIGdldCBtYXBwZWQgZmlsZSIpXQorICAgIE9idGFpbk1hcHBlZEZpbGVGYWlsKCNbc291cmNlXSBhbnlob3c6OkVycm9yKSwKKworICAgICNbZXJyb3IoImZhaWwgdG8gZmx1c2ggbWFwcGVkIHN0b3JhZ2UgZmlsZSIpXQorICAgIE1hcEZsdXNoRmFpbCgjW3NvdXJjZV0gYW55aG93OjpFcnJvciksCisKKyAgICAjW2Vycm9yKCJudW1iZXIgb2YgaXRlbXMgaW4gaGFzaCB0YWJsZSBleGNlZWQgbGltaXQiKV0KKyAgICBIYXNoVGFibGVTaXplTGltaXQoI1tzb3VyY2VdIGFueWhvdzo6RXJyb3IpLAorCisgICAgI1tlcnJvcigiZmFpbGVkIHRvIHBhcnNlIGJ5dGVzIGludG8gZGF0YSIpXQorICAgIEJ5dGVzUGFyc2VGYWlsKCNbc291cmNlXSBhbnlob3c6OkVycm9yKSwKKworICAgICNbZXJyb3IoImNhbm5vdCBwYXJzZSBzdG9yYWdlIGZpbGVzIHdpdGggYSBoaWdoZXIgdmVyc2lvbiIpXQorICAgIEhpZ2hlclN0b3JhZ2VGaWxlVmVyc2lvbigjW3NvdXJjZV0gYW55aG93OjpFcnJvciksCisKKyAgICAjW2Vycm9yKCJpbnZhbGlkIHN0b3JhZ2UgZmlsZSBieXRlIG9mZnNldCIpXQorICAgIEludmFsaWRTdG9yYWdlRmlsZU9mZnNldCgjW3NvdXJjZV0gYW55aG93OjpFcnJvciksCisKKyAgICAjW2Vycm9yKCJmYWlsZWQgdG8gY3JlYXRlIGZpbGUiKV0KKyAgICBGaWxlQ3JlYXRpb25GYWlsKCNbc291cmNlXSBhbnlob3c6OkVycm9yKSwKKworICAgICNbZXJyb3IoImludmFsaWQgc3RvcmVkIGZsYWcgdHlwZSIpXQorICAgIEludmFsaWRTdG9yZWRGbGFnVHlwZSgjW3NvdXJjZV0gYW55aG93OjpFcnJvciksCisKKyAgICAjW2Vycm9yKCJpbnZhbGlkIGZsYWcgdmFsdWUgdHlwZSIpXQorICAgIEludmFsaWRGbGFnVmFsdWVUeXBlKCNbc291cmNlXSBhbnlob3c6OkVycm9yKSwKK30KKworLy8vIEdldCB0aGUgcmlnaHQgaGFzaCB0YWJsZSBzaXplIGdpdmVuIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSB0YWJsZS4gVXNlIGEKKy8vLyBsb2FkIGZhY3RvciBvZiAwLjUgZm9yIHBlcmZvcm1hbmNlLgorcHViIGZuIGdldF90YWJsZV9zaXplKGVudHJpZXM6IHUzMikgLT4gUmVzdWx0PHUzMiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIEhBU0hfUFJJTUVTCisgICAgICAgIC5pdGVyKCkKKyAgICAgICAgLmZpbmQofCYmbnVtfCBudW0gPj0gMiAqIGVudHJpZXMpCisgICAgICAgIC5jb3BpZWQoKQorICAgICAgICAub2tfb3IoSGFzaFRhYmxlU2l6ZUxpbWl0KGFueWhvdyEoIk51bWJlciBvZiBpdGVtcyBpbiBhIGhhc2ggdGFibGUgZXhjZWVkcyBsaW1pdCIpKSkKK30KKworLy8vIEdldCB0aGUgY29ycmVzcG9uZGluZyBidWNrZXQgaW5kZXggZ2l2ZW4gdGhlIGtleSBhbmQgbnVtYmVyIG9mIGJ1Y2tldHMKK3B1YihjcmF0ZSkgZm4gZ2V0X2J1Y2tldF9pbmRleCh2YWw6ICZbdThdLCBudW1fYnVja2V0czogdTMyKSAtPiB1MzIgeworICAgIGxldCBtdXQgcyA9IFNpcEhhc2hlcjEzOjpuZXcoKTsKKyAgICBzLndyaXRlKHZhbCk7CisgICAgcy53cml0ZV91OCgweGZmKTsKKyAgICBsZXQgcmV0ID0gKHMuZmluaXNoKCkgJSBudW1fYnVja2V0cyBhcyB1NjQpIGFzIHUzMjsKKyAgICByZXQKK30KKworLy8vIFJlYWQgYW5kIHBhcnNlIGJ5dGVzIGFzIHU4CitwdWIgZm4gcmVhZF91OF9mcm9tX2J5dGVzKGJ1ZjogJlt1OF0sIGhlYWQ6ICZtdXQgdXNpemUpIC0+IFJlc3VsdDx1OCwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIGxldCB2YWwgPQorICAgICAgICB1ODo6ZnJvbV9sZV9ieXRlcyhidWZbKmhlYWQuLipoZWFkICsgMV0udHJ5X2ludG8oKS5tYXBfZXJyKHxlcnJtc2d8IHsKKyAgICAgICAgICAgIEJ5dGVzUGFyc2VGYWlsKGFueWhvdyEoImZhaWwgdG8gcGFyc2UgdTggZnJvbSBieXRlczoge30iLCBlcnJtc2cpKQorICAgICAgICB9KT8pOworICAgICpoZWFkICs9IDE7CisgICAgT2sodmFsKQorfQorCisvLy8gUmVhZCBhbmQgcGFyc2UgYnl0ZXMgYXMgdTE2CitwdWIoY3JhdGUpIGZuIHJlYWRfdTE2X2Zyb21fYnl0ZXMoCisgICAgYnVmOiAmW3U4XSwKKyAgICBoZWFkOiAmbXV0IHVzaXplLAorKSAtPiBSZXN1bHQ8dTE2LCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgbGV0IHZhbCA9CisgICAgICAgIHUxNjo6ZnJvbV9sZV9ieXRlcyhidWZbKmhlYWQuLipoZWFkICsgMl0udHJ5X2ludG8oKS5tYXBfZXJyKHxlcnJtc2d8IHsKKyAgICAgICAgICAgIEJ5dGVzUGFyc2VGYWlsKGFueWhvdyEoImZhaWwgdG8gcGFyc2UgdTE2IGZyb20gYnl0ZXM6IHt9IiwgZXJybXNnKSkKKyAgICAgICAgfSk/KTsKKyAgICAqaGVhZCArPSAyOworICAgIE9rKHZhbCkKK30KKworLy8vIFJlYWQgYW5kIHBhcnNlIHRoZSBmaXJzdCA0IGJ5dGVzIG9mIGJ1ZiBhcyB1MzIuCitwdWIgZm4gcmVhZF91MzJfZnJvbV9zdGFydF9vZl9ieXRlcyhidWY6ICZbdThdKSAtPiBSZXN1bHQ8dTMyLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgcmVhZF91MzJfZnJvbV9ieXRlcyhidWYsICZtdXQgMCkKK30KKworLy8vIFJlYWQgYW5kIHBhcnNlIGJ5dGVzIGFzIHUzMgorcHViIGZuIHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnVmOiAmW3U4XSwgaGVhZDogJm11dCB1c2l6ZSkgLT4gUmVzdWx0PHUzMiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIGxldCB2YWwgPQorICAgICAgICB1MzI6OmZyb21fbGVfYnl0ZXMoYnVmWypoZWFkLi4qaGVhZCArIDRdLnRyeV9pbnRvKCkubWFwX2Vycih8ZXJybXNnfCB7CisgICAgICAgICAgICBCeXRlc1BhcnNlRmFpbChhbnlob3chKCJmYWlsIHRvIHBhcnNlIHUzMiBmcm9tIGJ5dGVzOiB7fSIsIGVycm1zZykpCisgICAgICAgIH0pPyk7CisgICAgKmhlYWQgKz0gNDsKKyAgICBPayh2YWwpCit9CisKKy8vIFJlYWQgYW5kIHBhcnNlIGJ5dGVzIGFzIHU2NAorcHViIGZuIHJlYWRfdTY0X2Zyb21fYnl0ZXMoYnVmOiAmW3U4XSwgaGVhZDogJm11dCB1c2l6ZSkgLT4gUmVzdWx0PHU2NCwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIGxldCB2YWwgPQorICAgICAgICB1NjQ6OmZyb21fbGVfYnl0ZXMoYnVmWypoZWFkLi4qaGVhZCArIDhdLnRyeV9pbnRvKCkubWFwX2Vycih8ZXJybXNnfCB7CisgICAgICAgICAgICBCeXRlc1BhcnNlRmFpbChhbnlob3chKCJmYWlsIHRvIHBhcnNlIHU2NCBmcm9tIGJ5dGVzOiB7fSIsIGVycm1zZykpCisgICAgICAgIH0pPyk7CisgICAgKmhlYWQgKz0gODsKKyAgICBPayh2YWwpCit9CisKKy8vLyBSZWFkIGFuZCBwYXJzZSBieXRlcyBhcyBzdHJpbmcKK3B1YihjcmF0ZSkgZm4gcmVhZF9zdHJfZnJvbV9ieXRlcygKKyAgICBidWY6ICZbdThdLAorICAgIGhlYWQ6ICZtdXQgdXNpemUsCispIC0+IFJlc3VsdDxTdHJpbmcsIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICBsZXQgbnVtX2J5dGVzID0gcmVhZF91MzJfZnJvbV9ieXRlcyhidWYsIGhlYWQpPyBhcyB1c2l6ZTsKKyAgICBsZXQgdmFsID0gU3RyaW5nOjpmcm9tX3V0ZjgoYnVmWypoZWFkLi4qaGVhZCArIG51bV9ieXRlc10udG9fdmVjKCkpCisgICAgICAgIC5tYXBfZXJyKHxlcnJtc2d8IEJ5dGVzUGFyc2VGYWlsKGFueWhvdyEoImZhaWwgdG8gcGFyc2Ugc3RyaW5nIGZyb20gYnl0ZXM6IHt9IiwgZXJybXNnKSkpPzsKKyAgICAqaGVhZCArPSBudW1fYnl0ZXM7CisgICAgT2sodmFsKQorfQorCisvLy8gUmVhZCBpbiBzdG9yYWdlIGZpbGUgYXMgYnl0ZXMKK3B1YiBmbiByZWFkX2ZpbGVfdG9fYnl0ZXMoZmlsZV9wYXRoOiAmc3RyKSAtPiBSZXN1bHQ8VmVjPHU4PiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIGxldCBtdXQgZmlsZSA9IEZpbGU6Om9wZW4oZmlsZV9wYXRoKS5tYXBfZXJyKHxlcnJtc2d8IHsKKyAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6RmlsZVJlYWRGYWlsKGFueWhvdyEoIkZhaWxlZCB0byBvcGVuIGZpbGUge306IHt9IiwgZmlsZV9wYXRoLCBlcnJtc2cpKQorICAgIH0pPzsKKyAgICBsZXQgbXV0IGJ1ZmZlciA9IFZlYzo6bmV3KCk7CisgICAgZmlsZS5yZWFkX3RvX2VuZCgmbXV0IGJ1ZmZlcikubWFwX2Vycih8ZXJybXNnfCB7CisgICAgICAgIEFjb25maWdTdG9yYWdlRXJyb3I6OkZpbGVSZWFkRmFpbChhbnlob3chKAorICAgICAgICAgICAgIkZhaWxlZCB0byByZWFkIGJ5dGVzIGZyb20gZmlsZSB7fToge30iLAorICAgICAgICAgICAgZmlsZV9wYXRoLAorICAgICAgICAgICAgZXJybXNnCisgICAgICAgICkpCisgICAgfSk/OworICAgIE9rKGJ1ZmZlcikKK30KKworLy8vIEZsYWcgdmFsdWUgc3VtbWFyeQorI1tkZXJpdmUoRGVidWcsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IEZsYWdWYWx1ZVN1bW1hcnkgeworICAgIHB1YiBwYWNrYWdlX25hbWU6IFN0cmluZywKKyAgICBwdWIgZmxhZ19uYW1lOiBTdHJpbmcsCisgICAgcHViIGZsYWdfdmFsdWU6IFN0cmluZywKKyAgICBwdWIgdmFsdWVfdHlwZTogU3RvcmVkRmxhZ1R5cGUsCit9CisKKy8vLyBMaXN0IGZsYWcgdmFsdWVzIGZyb20gc3RvcmFnZSBmaWxlcworcHViIGZuIGxpc3RfZmxhZ3MoCisgICAgcGFja2FnZV9tYXA6ICZzdHIsCisgICAgZmxhZ19tYXA6ICZzdHIsCisgICAgZmxhZ192YWw6ICZzdHIsCispIC0+IFJlc3VsdDxWZWM8RmxhZ1ZhbHVlU3VtbWFyeT4sIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICBsZXQgcGFja2FnZV90YWJsZSA9IFBhY2thZ2VUYWJsZTo6ZnJvbV9ieXRlcygmcmVhZF9maWxlX3RvX2J5dGVzKHBhY2thZ2VfbWFwKT8pPzsKKyAgICBsZXQgZmxhZ190YWJsZSA9IEZsYWdUYWJsZTo6ZnJvbV9ieXRlcygmcmVhZF9maWxlX3RvX2J5dGVzKGZsYWdfbWFwKT8pPzsKKyAgICBsZXQgZmxhZ192YWx1ZV9saXN0ID0gRmxhZ1ZhbHVlTGlzdDo6ZnJvbV9ieXRlcygmcmVhZF9maWxlX3RvX2J5dGVzKGZsYWdfdmFsKT8pPzsKKworICAgIGxldCBtdXQgcGFja2FnZV9pbmZvID0gdmVjIVsoIiIsIDApOyBwYWNrYWdlX3RhYmxlLmhlYWRlci5udW1fcGFja2FnZXMgYXMgdXNpemVdOworICAgIGZvciBub2RlIGluIHBhY2thZ2VfdGFibGUubm9kZXMuaXRlcigpIHsKKyAgICAgICAgcGFja2FnZV9pbmZvW25vZGUucGFja2FnZV9pZCBhcyB1c2l6ZV0gPSAoJm5vZGUucGFja2FnZV9uYW1lLCBub2RlLmJvb2xlYW5fc3RhcnRfaW5kZXgpOworICAgIH0KKworICAgIGxldCBtdXQgZmxhZ3MgPSBWZWM6Om5ldygpOworICAgIGZvciBub2RlIGluIGZsYWdfdGFibGUubm9kZXMuaXRlcigpIHsKKyAgICAgICAgbGV0IChwYWNrYWdlX25hbWUsIGJvb2xlYW5fc3RhcnRfaW5kZXgpID0gcGFja2FnZV9pbmZvW25vZGUucGFja2FnZV9pZCBhcyB1c2l6ZV07CisgICAgICAgIGxldCBmbGFnX2luZGV4ID0gYm9vbGVhbl9zdGFydF9pbmRleCArIG5vZGUuZmxhZ19pbmRleCBhcyB1MzI7CisgICAgICAgIGxldCBmbGFnX3ZhbHVlID0gZmxhZ192YWx1ZV9saXN0LmJvb2xlYW5zW2ZsYWdfaW5kZXggYXMgdXNpemVdOworICAgICAgICBmbGFncy5wdXNoKEZsYWdWYWx1ZVN1bW1hcnkgeworICAgICAgICAgICAgcGFja2FnZV9uYW1lOiBTdHJpbmc6OmZyb20ocGFja2FnZV9uYW1lKSwKKyAgICAgICAgICAgIGZsYWdfbmFtZTogbm9kZS5mbGFnX25hbWUuY2xvbmUoKSwKKyAgICAgICAgICAgIGZsYWdfdmFsdWU6IGZsYWdfdmFsdWUudG9fc3RyaW5nKCksCisgICAgICAgICAgICB2YWx1ZV90eXBlOiBub2RlLmZsYWdfdHlwZSwKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgZmxhZ3Muc29ydF9ieSh8djEsIHYyfCBtYXRjaCB2MS5wYWNrYWdlX25hbWUuY21wKCZ2Mi5wYWNrYWdlX25hbWUpIHsKKyAgICAgICAgT3JkZXJpbmc6OkVxdWFsID0+IHYxLmZsYWdfbmFtZS5jbXAoJnYyLmZsYWdfbmFtZSksCisgICAgICAgIG90aGVyID0+IG90aGVyLAorICAgIH0pOworICAgIE9rKGZsYWdzKQorfQorCisvLy8gRmxhZyB2YWx1ZSBhbmQgaW5mbyBzdW1tYXJ5CisjW2Rlcml2ZShEZWJ1ZywgUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgRmxhZ1ZhbHVlQW5kSW5mb1N1bW1hcnkgeworICAgIHB1YiBwYWNrYWdlX25hbWU6IFN0cmluZywKKyAgICBwdWIgZmxhZ19uYW1lOiBTdHJpbmcsCisgICAgcHViIGZsYWdfdmFsdWU6IFN0cmluZywKKyAgICBwdWIgdmFsdWVfdHlwZTogU3RvcmVkRmxhZ1R5cGUsCisgICAgcHViIGlzX3JlYWR3cml0ZTogYm9vbCwKKyAgICBwdWIgaGFzX3NlcnZlcl9vdmVycmlkZTogYm9vbCwKKyAgICBwdWIgaGFzX2xvY2FsX292ZXJyaWRlOiBib29sLAorfQorCisvLy8gTGlzdCBmbGFnIHZhbHVlcyBhbmQgaW5mbyBmcm9tIHN0b3JhZ2UgZmlsZXMKK3B1YiBmbiBsaXN0X2ZsYWdzX3dpdGhfaW5mbygKKyAgICBwYWNrYWdlX21hcDogJnN0ciwKKyAgICBmbGFnX21hcDogJnN0ciwKKyAgICBmbGFnX3ZhbDogJnN0ciwKKyAgICBmbGFnX2luZm86ICZzdHIsCispIC0+IFJlc3VsdDxWZWM8RmxhZ1ZhbHVlQW5kSW5mb1N1bW1hcnk+LCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgbGV0IHBhY2thZ2VfdGFibGUgPSBQYWNrYWdlVGFibGU6OmZyb21fYnl0ZXMoJnJlYWRfZmlsZV90b19ieXRlcyhwYWNrYWdlX21hcCk/KT87CisgICAgbGV0IGZsYWdfdGFibGUgPSBGbGFnVGFibGU6OmZyb21fYnl0ZXMoJnJlYWRfZmlsZV90b19ieXRlcyhmbGFnX21hcCk/KT87CisgICAgbGV0IGZsYWdfdmFsdWVfbGlzdCA9IEZsYWdWYWx1ZUxpc3Q6OmZyb21fYnl0ZXMoJnJlYWRfZmlsZV90b19ieXRlcyhmbGFnX3ZhbCk/KT87CisgICAgbGV0IGZsYWdfaW5mbyA9IEZsYWdJbmZvTGlzdDo6ZnJvbV9ieXRlcygmcmVhZF9maWxlX3RvX2J5dGVzKGZsYWdfaW5mbyk/KT87CisKKyAgICBsZXQgbXV0IHBhY2thZ2VfaW5mbyA9IHZlYyFbKCIiLCAwKTsgcGFja2FnZV90YWJsZS5oZWFkZXIubnVtX3BhY2thZ2VzIGFzIHVzaXplXTsKKyAgICBmb3Igbm9kZSBpbiBwYWNrYWdlX3RhYmxlLm5vZGVzLml0ZXIoKSB7CisgICAgICAgIHBhY2thZ2VfaW5mb1tub2RlLnBhY2thZ2VfaWQgYXMgdXNpemVdID0gKCZub2RlLnBhY2thZ2VfbmFtZSwgbm9kZS5ib29sZWFuX3N0YXJ0X2luZGV4KTsKKyAgICB9CisKKyAgICBsZXQgbXV0IGZsYWdzID0gVmVjOjpuZXcoKTsKKyAgICBmb3Igbm9kZSBpbiBmbGFnX3RhYmxlLm5vZGVzLml0ZXIoKSB7CisgICAgICAgIGxldCAocGFja2FnZV9uYW1lLCBib29sZWFuX3N0YXJ0X2luZGV4KSA9IHBhY2thZ2VfaW5mb1tub2RlLnBhY2thZ2VfaWQgYXMgdXNpemVdOworICAgICAgICBsZXQgZmxhZ19pbmRleCA9IGJvb2xlYW5fc3RhcnRfaW5kZXggKyBub2RlLmZsYWdfaW5kZXggYXMgdTMyOworICAgICAgICBsZXQgZmxhZ192YWx1ZSA9IGZsYWdfdmFsdWVfbGlzdC5ib29sZWFuc1tmbGFnX2luZGV4IGFzIHVzaXplXTsKKyAgICAgICAgbGV0IGZsYWdfYXR0cmlidXRlID0gZmxhZ19pbmZvLm5vZGVzW2ZsYWdfaW5kZXggYXMgdXNpemVdLmF0dHJpYnV0ZXM7CisgICAgICAgIGZsYWdzLnB1c2goRmxhZ1ZhbHVlQW5kSW5mb1N1bW1hcnkgeworICAgICAgICAgICAgcGFja2FnZV9uYW1lOiBTdHJpbmc6OmZyb20ocGFja2FnZV9uYW1lKSwKKyAgICAgICAgICAgIGZsYWdfbmFtZTogbm9kZS5mbGFnX25hbWUuY2xvbmUoKSwKKyAgICAgICAgICAgIGZsYWdfdmFsdWU6IGZsYWdfdmFsdWUudG9fc3RyaW5nKCksCisgICAgICAgICAgICB2YWx1ZV90eXBlOiBub2RlLmZsYWdfdHlwZSwKKyAgICAgICAgICAgIGlzX3JlYWR3cml0ZTogZmxhZ19hdHRyaWJ1dGUgJiAoRmxhZ0luZm9CaXQ6OklzUmVhZFdyaXRlIGFzIHU4KSAhPSAwLAorICAgICAgICAgICAgaGFzX3NlcnZlcl9vdmVycmlkZTogZmxhZ19hdHRyaWJ1dGUgJiAoRmxhZ0luZm9CaXQ6Okhhc1NlcnZlck92ZXJyaWRlIGFzIHU4KSAhPSAwLAorICAgICAgICAgICAgaGFzX2xvY2FsX292ZXJyaWRlOiBmbGFnX2F0dHJpYnV0ZSAmIChGbGFnSW5mb0JpdDo6SGFzTG9jYWxPdmVycmlkZSBhcyB1OCkgIT0gMCwKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgZmxhZ3Muc29ydF9ieSh8djEsIHYyfCBtYXRjaCB2MS5wYWNrYWdlX25hbWUuY21wKCZ2Mi5wYWNrYWdlX25hbWUpIHsKKyAgICAgICAgT3JkZXJpbmc6OkVxdWFsID0+IHYxLmZsYWdfbmFtZS5jbXAoJnYyLmZsYWdfbmFtZSksCisgICAgICAgIG90aGVyID0+IG90aGVyLAorICAgIH0pOworICAgIE9rKGZsYWdzKQorfQorCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KKy8vIENDIElOVEVSTE9QCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KKworLy8gRXhwb3J0ZWQgcnVzdCBkYXRhIHN0cnVjdHVyZSBhbmQgbWV0aG9kcywgYysrIGNvZGUgd2lsbCBiZSBnZW5lcmF0ZWQKKyNbY3h4OjpicmlkZ2VdCittb2QgZmZpIHsKKyAgICAvLy8gZmxhZyB2YWx1ZSBzdW1tYXJ5IGN4eCByZXR1cm4KKyAgICBwdWIgc3RydWN0IEZsYWdWYWx1ZVN1bW1hcnlDWFggeworICAgICAgICBwdWIgcGFja2FnZV9uYW1lOiBTdHJpbmcsCisgICAgICAgIHB1YiBmbGFnX25hbWU6IFN0cmluZywKKyAgICAgICAgcHViIGZsYWdfdmFsdWU6IFN0cmluZywKKyAgICAgICAgcHViIHZhbHVlX3R5cGU6IFN0cmluZywKKyAgICB9CisKKyAgICAvLy8gZmxhZyB2YWx1ZSBhbmQgaW5mbyBzdW1tYXJ5IGN4eCByZXR1cm4KKyAgICBwdWIgc3RydWN0IEZsYWdWYWx1ZUFuZEluZm9TdW1tYXJ5Q1hYIHsKKyAgICAgICAgcHViIHBhY2thZ2VfbmFtZTogU3RyaW5nLAorICAgICAgICBwdWIgZmxhZ19uYW1lOiBTdHJpbmcsCisgICAgICAgIHB1YiBmbGFnX3ZhbHVlOiBTdHJpbmcsCisgICAgICAgIHB1YiB2YWx1ZV90eXBlOiBTdHJpbmcsCisgICAgICAgIHB1YiBpc19yZWFkd3JpdGU6IGJvb2wsCisgICAgICAgIHB1YiBoYXNfc2VydmVyX292ZXJyaWRlOiBib29sLAorICAgICAgICBwdWIgaGFzX2xvY2FsX292ZXJyaWRlOiBib29sLAorICAgIH0KKworICAgIC8vLyBsaXN0IGZsYWcgcmVzdWx0IGN4eCByZXR1cm4KKyAgICBwdWIgc3RydWN0IExpc3RGbGFnVmFsdWVSZXN1bHRDWFggeworICAgICAgICBwdWIgcXVlcnlfc3VjY2VzczogYm9vbCwKKyAgICAgICAgcHViIGVycm9yX21lc3NhZ2U6IFN0cmluZywKKyAgICAgICAgcHViIGZsYWdzOiBWZWM8RmxhZ1ZhbHVlU3VtbWFyeUNYWD4sCisgICAgfQorCisgICAgLy8vIGxpc3QgZmxhZyB3aXRoIGluZm8gcmVzdWx0IGN4eCByZXR1cm4KKyAgICBwdWIgc3RydWN0IExpc3RGbGFnVmFsdWVBbmRJbmZvUmVzdWx0Q1hYIHsKKyAgICAgICAgcHViIHF1ZXJ5X3N1Y2Nlc3M6IGJvb2wsCisgICAgICAgIHB1YiBlcnJvcl9tZXNzYWdlOiBTdHJpbmcsCisgICAgICAgIHB1YiBmbGFnczogVmVjPEZsYWdWYWx1ZUFuZEluZm9TdW1tYXJ5Q1hYPiwKKyAgICB9CisKKyAgICAvLyBSdXN0IGV4cG9ydCB0byBjKysKKyAgICBleHRlcm4gIlJ1c3QiIHsKKyAgICAgICAgcHViIGZuIGxpc3RfZmxhZ3NfY3h4KAorICAgICAgICAgICAgcGFja2FnZV9tYXA6ICZzdHIsCisgICAgICAgICAgICBmbGFnX21hcDogJnN0ciwKKyAgICAgICAgICAgIGZsYWdfdmFsOiAmc3RyLAorICAgICAgICApIC0+IExpc3RGbGFnVmFsdWVSZXN1bHRDWFg7CisKKyAgICAgICAgcHViIGZuIGxpc3RfZmxhZ3Nfd2l0aF9pbmZvX2N4eCgKKyAgICAgICAgICAgIHBhY2thZ2VfbWFwOiAmc3RyLAorICAgICAgICAgICAgZmxhZ19tYXA6ICZzdHIsCisgICAgICAgICAgICBmbGFnX3ZhbDogJnN0ciwKKyAgICAgICAgICAgIGZsYWdfaW5mbzogJnN0ciwKKyAgICAgICAgKSAtPiBMaXN0RmxhZ1ZhbHVlQW5kSW5mb1Jlc3VsdENYWDsKKyAgICB9Cit9CisKKy8vLyBpbXBsZW1lbnQgZmxhZyB2YWx1ZSBzdW1tYXJ5IGN4eCByZXR1cm4gdHlwZQoraW1wbCBmZmk6OkZsYWdWYWx1ZVN1bW1hcnlDWFggeworICAgIHB1YihjcmF0ZSkgZm4gbmV3KHN1bW1hcnk6IEZsYWdWYWx1ZVN1bW1hcnkpIC0+IFNlbGYgeworICAgICAgICBTZWxmIHsKKyAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogc3VtbWFyeS5wYWNrYWdlX25hbWUsCisgICAgICAgICAgICBmbGFnX25hbWU6IHN1bW1hcnkuZmxhZ19uYW1lLAorICAgICAgICAgICAgZmxhZ192YWx1ZTogc3VtbWFyeS5mbGFnX3ZhbHVlLAorICAgICAgICAgICAgdmFsdWVfdHlwZTogZm9ybWF0ISgiezo/fSIsIHN1bW1hcnkudmFsdWVfdHlwZSksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBpbXBsZW1lbnQgZmxhZyB2YWx1ZSBhbmQgaW5mbyBzdW1tYXJ5IGN4eCByZXR1cm4gdHlwZQoraW1wbCBmZmk6OkZsYWdWYWx1ZUFuZEluZm9TdW1tYXJ5Q1hYIHsKKyAgICBwdWIoY3JhdGUpIGZuIG5ldyhzdW1tYXJ5OiBGbGFnVmFsdWVBbmRJbmZvU3VtbWFyeSkgLT4gU2VsZiB7CisgICAgICAgIFNlbGYgeworICAgICAgICAgICAgcGFja2FnZV9uYW1lOiBzdW1tYXJ5LnBhY2thZ2VfbmFtZSwKKyAgICAgICAgICAgIGZsYWdfbmFtZTogc3VtbWFyeS5mbGFnX25hbWUsCisgICAgICAgICAgICBmbGFnX3ZhbHVlOiBzdW1tYXJ5LmZsYWdfdmFsdWUsCisgICAgICAgICAgICB2YWx1ZV90eXBlOiBmb3JtYXQhKCJ7Oj99Iiwgc3VtbWFyeS52YWx1ZV90eXBlKSwKKyAgICAgICAgICAgIGlzX3JlYWR3cml0ZTogc3VtbWFyeS5pc19yZWFkd3JpdGUsCisgICAgICAgICAgICBoYXNfc2VydmVyX292ZXJyaWRlOiBzdW1tYXJ5Lmhhc19zZXJ2ZXJfb3ZlcnJpZGUsCisgICAgICAgICAgICBoYXNfbG9jYWxfb3ZlcnJpZGU6IHN1bW1hcnkuaGFzX2xvY2FsX292ZXJyaWRlLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gaW1wbGVtZW50IGxpc3QgZmxhZyBjeHggaW50ZXJsb3AKK3B1YiBmbiBsaXN0X2ZsYWdzX2N4eCgKKyAgICBwYWNrYWdlX21hcDogJnN0ciwKKyAgICBmbGFnX21hcDogJnN0ciwKKyAgICBmbGFnX3ZhbDogJnN0ciwKKykgLT4gZmZpOjpMaXN0RmxhZ1ZhbHVlUmVzdWx0Q1hYIHsKKyAgICBtYXRjaCBsaXN0X2ZsYWdzKHBhY2thZ2VfbWFwLCBmbGFnX21hcCwgZmxhZ192YWwpIHsKKyAgICAgICAgT2soc3VtbWFyeSkgPT4gZmZpOjpMaXN0RmxhZ1ZhbHVlUmVzdWx0Q1hYIHsKKyAgICAgICAgICAgIHF1ZXJ5X3N1Y2Nlc3M6IHRydWUsCisgICAgICAgICAgICBlcnJvcl9tZXNzYWdlOiBTdHJpbmc6Om5ldygpLAorICAgICAgICAgICAgZmxhZ3M6IHN1bW1hcnkuaW50b19pdGVyKCkubWFwKGZmaTo6RmxhZ1ZhbHVlU3VtbWFyeUNYWDo6bmV3KS5jb2xsZWN0KCksCisgICAgICAgIH0sCisgICAgICAgIEVycihlcnJtc2cpID0+IGZmaTo6TGlzdEZsYWdWYWx1ZVJlc3VsdENYWCB7CisgICAgICAgICAgICBxdWVyeV9zdWNjZXNzOiBmYWxzZSwKKyAgICAgICAgICAgIGVycm9yX21lc3NhZ2U6IGZvcm1hdCEoIns6P30iLCBlcnJtc2cpLAorICAgICAgICAgICAgZmxhZ3M6IFZlYzo6bmV3KCksCisgICAgICAgIH0sCisgICAgfQorfQorCisvLy8gaW1wbGVtZW50IGxpc3QgZmxhZyB3aXRoIGluZm8gY3h4IGludGVybG9wCitwdWIgZm4gbGlzdF9mbGFnc193aXRoX2luZm9fY3h4KAorICAgIHBhY2thZ2VfbWFwOiAmc3RyLAorICAgIGZsYWdfbWFwOiAmc3RyLAorICAgIGZsYWdfdmFsOiAmc3RyLAorICAgIGZsYWdfaW5mbzogJnN0ciwKKykgLT4gZmZpOjpMaXN0RmxhZ1ZhbHVlQW5kSW5mb1Jlc3VsdENYWCB7CisgICAgbWF0Y2ggbGlzdF9mbGFnc193aXRoX2luZm8ocGFja2FnZV9tYXAsIGZsYWdfbWFwLCBmbGFnX3ZhbCwgZmxhZ19pbmZvKSB7CisgICAgICAgIE9rKHN1bW1hcnkpID0+IGZmaTo6TGlzdEZsYWdWYWx1ZUFuZEluZm9SZXN1bHRDWFggeworICAgICAgICAgICAgcXVlcnlfc3VjY2VzczogdHJ1ZSwKKyAgICAgICAgICAgIGVycm9yX21lc3NhZ2U6IFN0cmluZzo6bmV3KCksCisgICAgICAgICAgICBmbGFnczogc3VtbWFyeS5pbnRvX2l0ZXIoKS5tYXAoZmZpOjpGbGFnVmFsdWVBbmRJbmZvU3VtbWFyeUNYWDo6bmV3KS5jb2xsZWN0KCksCisgICAgICAgIH0sCisgICAgICAgIEVycihlcnJtc2cpID0+IGZmaTo6TGlzdEZsYWdWYWx1ZUFuZEluZm9SZXN1bHRDWFggeworICAgICAgICAgICAgcXVlcnlfc3VjY2VzczogZmFsc2UsCisgICAgICAgICAgICBlcnJvcl9tZXNzYWdlOiBmb3JtYXQhKCJ7Oj99IiwgZXJybXNnKSwKKyAgICAgICAgICAgIGZsYWdzOiBWZWM6Om5ldygpLAorICAgICAgICB9LAorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKyAgICB1c2UgY3JhdGU6OnRlc3RfdXRpbHM6OnsKKyAgICAgICAgY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QsIGNyZWF0ZV90ZXN0X2ZsYWdfdGFibGUsIGNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCwKKyAgICAgICAgY3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZSwgd3JpdGVfYnl0ZXNfdG9fdGVtcF9maWxlLAorICAgIH07CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhlIGZsYWcgbGlzdCBhcGkKKyAgICBmbiB0ZXN0X2xpc3RfZmxhZygpIHsKKyAgICAgICAgbGV0IHBhY2thZ2VfdGFibGUgPQorICAgICAgICAgICAgd3JpdGVfYnl0ZXNfdG9fdGVtcF9maWxlKCZjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlKERFRkFVTFRfRklMRV9WRVJTSU9OKS5pbnRvX2J5dGVzKCkpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpOworICAgICAgICBsZXQgZmxhZ190YWJsZSA9CisgICAgICAgICAgICB3cml0ZV9ieXRlc190b190ZW1wX2ZpbGUoJmNyZWF0ZV90ZXN0X2ZsYWdfdGFibGUoREVGQVVMVF9GSUxFX1ZFUlNJT04pLmludG9fYnl0ZXMoKSkKKyAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBmbGFnX3ZhbHVlX2xpc3QgPSB3cml0ZV9ieXRlc190b190ZW1wX2ZpbGUoCisgICAgICAgICAgICAmY3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0KERFRkFVTFRfRklMRV9WRVJTSU9OKS5pbnRvX2J5dGVzKCksCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcCgpOworCisgICAgICAgIGxldCBwYWNrYWdlX3RhYmxlX3BhdGggPSBwYWNrYWdlX3RhYmxlLnBhdGgoKS5kaXNwbGF5KCkudG9fc3RyaW5nKCk7CisgICAgICAgIGxldCBmbGFnX3RhYmxlX3BhdGggPSBmbGFnX3RhYmxlLnBhdGgoKS5kaXNwbGF5KCkudG9fc3RyaW5nKCk7CisgICAgICAgIGxldCBmbGFnX3ZhbHVlX2xpc3RfcGF0aCA9IGZsYWdfdmFsdWVfbGlzdC5wYXRoKCkuZGlzcGxheSgpLnRvX3N0cmluZygpOworCisgICAgICAgIGxldCBmbGFncyA9CisgICAgICAgICAgICBsaXN0X2ZsYWdzKCZwYWNrYWdlX3RhYmxlX3BhdGgsICZmbGFnX3RhYmxlX3BhdGgsICZmbGFnX3ZhbHVlX2xpc3RfcGF0aCkudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZCA9IFsKKyAgICAgICAgICAgIEZsYWdWYWx1ZVN1bW1hcnkgeworICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogU3RyaW5nOjpmcm9tKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiksCisgICAgICAgICAgICAgICAgZmxhZ19uYW1lOiBTdHJpbmc6OmZyb20oImRpc2FibGVkX3J3IiksCisgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTogU3RvcmVkRmxhZ1R5cGU6OlJlYWRXcml0ZUJvb2xlYW4sCisgICAgICAgICAgICAgICAgZmxhZ192YWx1ZTogU3RyaW5nOjpmcm9tKCJmYWxzZSIpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEZsYWdWYWx1ZVN1bW1hcnkgeworICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogU3RyaW5nOjpmcm9tKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiksCisgICAgICAgICAgICAgICAgZmxhZ19uYW1lOiBTdHJpbmc6OmZyb20oImVuYWJsZWRfcm8iKSwKKyAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOiBTdG9yZWRGbGFnVHlwZTo6UmVhZE9ubHlCb29sZWFuLAorICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU6IFN0cmluZzo6ZnJvbSgidHJ1ZSIpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEZsYWdWYWx1ZVN1bW1hcnkgeworICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogU3RyaW5nOjpmcm9tKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiksCisgICAgICAgICAgICAgICAgZmxhZ19uYW1lOiBTdHJpbmc6OmZyb20oImVuYWJsZWRfcnciKSwKKyAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOiBTdG9yZWRGbGFnVHlwZTo6UmVhZFdyaXRlQm9vbGVhbiwKKyAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlOiBTdHJpbmc6OmZyb20oInRydWUiKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBGbGFnVmFsdWVTdW1tYXJ5IHsKKyAgICAgICAgICAgICAgICBwYWNrYWdlX25hbWU6IFN0cmluZzo6ZnJvbSgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIpLAorICAgICAgICAgICAgICAgIGZsYWdfbmFtZTogU3RyaW5nOjpmcm9tKCJkaXNhYmxlZF9ydyIpLAorICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU6IFN0b3JlZEZsYWdUeXBlOjpSZWFkV3JpdGVCb29sZWFuLAorICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU6IFN0cmluZzo6ZnJvbSgiZmFsc2UiKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBGbGFnVmFsdWVTdW1tYXJ5IHsKKyAgICAgICAgICAgICAgICBwYWNrYWdlX25hbWU6IFN0cmluZzo6ZnJvbSgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIpLAorICAgICAgICAgICAgICAgIGZsYWdfbmFtZTogU3RyaW5nOjpmcm9tKCJlbmFibGVkX2ZpeGVkX3JvIiksCisgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTogU3RvcmVkRmxhZ1R5cGU6OkZpeGVkUmVhZE9ubHlCb29sZWFuLAorICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU6IFN0cmluZzo6ZnJvbSgidHJ1ZSIpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEZsYWdWYWx1ZVN1bW1hcnkgeworICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogU3RyaW5nOjpmcm9tKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIiksCisgICAgICAgICAgICAgICAgZmxhZ19uYW1lOiBTdHJpbmc6OmZyb20oImVuYWJsZWRfcm8iKSwKKyAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOiBTdG9yZWRGbGFnVHlwZTo6UmVhZE9ubHlCb29sZWFuLAorICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU6IFN0cmluZzo6ZnJvbSgidHJ1ZSIpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEZsYWdWYWx1ZVN1bW1hcnkgeworICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogU3RyaW5nOjpmcm9tKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IiksCisgICAgICAgICAgICAgICAgZmxhZ19uYW1lOiBTdHJpbmc6OmZyb20oImVuYWJsZWRfZml4ZWRfcm8iKSwKKyAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOiBTdG9yZWRGbGFnVHlwZTo6Rml4ZWRSZWFkT25seUJvb2xlYW4sCisgICAgICAgICAgICAgICAgZmxhZ192YWx1ZTogU3RyaW5nOjpmcm9tKCJ0cnVlIiksCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgRmxhZ1ZhbHVlU3VtbWFyeSB7CisgICAgICAgICAgICAgICAgcGFja2FnZV9uYW1lOiBTdHJpbmc6OmZyb20oImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiKSwKKyAgICAgICAgICAgICAgICBmbGFnX25hbWU6IFN0cmluZzo6ZnJvbSgiZW5hYmxlZF9ydyIpLAorICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU6IFN0b3JlZEZsYWdUeXBlOjpSZWFkV3JpdGVCb29sZWFuLAorICAgICAgICAgICAgICAgIGZsYWdfdmFsdWU6IFN0cmluZzo6ZnJvbSgidHJ1ZSIpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgXTsKKyAgICAgICAgYXNzZXJ0X2VxIShmbGFncywgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biB0aGUgZmxhZyBsaXN0IHdpdGggaW5mbyBhcGkKKyAgICBmbiB0ZXN0X2xpc3RfZmxhZ193aXRoX2luZm8oKSB7CisgICAgICAgIGxldCBwYWNrYWdlX3RhYmxlID0KKyAgICAgICAgICAgIHdyaXRlX2J5dGVzX3RvX3RlbXBfZmlsZSgmY3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZShERUZBVUxUX0ZJTEVfVkVSU0lPTikuaW50b19ieXRlcygpKQorICAgICAgICAgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IGZsYWdfdGFibGUgPQorICAgICAgICAgICAgd3JpdGVfYnl0ZXNfdG9fdGVtcF9maWxlKCZjcmVhdGVfdGVzdF9mbGFnX3RhYmxlKERFRkFVTFRfRklMRV9WRVJTSU9OKS5pbnRvX2J5dGVzKCkpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpOworICAgICAgICBsZXQgZmxhZ192YWx1ZV9saXN0ID0gd3JpdGVfYnl0ZXNfdG9fdGVtcF9maWxlKAorICAgICAgICAgICAgJmNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdChERUZBVUxUX0ZJTEVfVkVSU0lPTikuaW50b19ieXRlcygpLAorICAgICAgICApCisgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IGZsYWdfaW5mb19saXN0ID0gd3JpdGVfYnl0ZXNfdG9fdGVtcF9maWxlKAorICAgICAgICAgICAgJmNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0KERFRkFVTFRfRklMRV9WRVJTSU9OKS5pbnRvX2J5dGVzKCksCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcCgpOworCisgICAgICAgIGxldCBwYWNrYWdlX3RhYmxlX3BhdGggPSBwYWNrYWdlX3RhYmxlLnBhdGgoKS5kaXNwbGF5KCkudG9fc3RyaW5nKCk7CisgICAgICAgIGxldCBmbGFnX3RhYmxlX3BhdGggPSBmbGFnX3RhYmxlLnBhdGgoKS5kaXNwbGF5KCkudG9fc3RyaW5nKCk7CisgICAgICAgIGxldCBmbGFnX3ZhbHVlX2xpc3RfcGF0aCA9IGZsYWdfdmFsdWVfbGlzdC5wYXRoKCkuZGlzcGxheSgpLnRvX3N0cmluZygpOworICAgICAgICBsZXQgZmxhZ19pbmZvX2xpc3RfcGF0aCA9IGZsYWdfaW5mb19saXN0LnBhdGgoKS5kaXNwbGF5KCkudG9fc3RyaW5nKCk7CisKKyAgICAgICAgbGV0IGZsYWdzID0gbGlzdF9mbGFnc193aXRoX2luZm8oCisgICAgICAgICAgICAmcGFja2FnZV90YWJsZV9wYXRoLAorICAgICAgICAgICAgJmZsYWdfdGFibGVfcGF0aCwKKyAgICAgICAgICAgICZmbGFnX3ZhbHVlX2xpc3RfcGF0aCwKKyAgICAgICAgICAgICZmbGFnX2luZm9fbGlzdF9wYXRoLAorICAgICAgICApCisgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkID0gWworICAgICAgICAgICAgRmxhZ1ZhbHVlQW5kSW5mb1N1bW1hcnkgeworICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogU3RyaW5nOjpmcm9tKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiksCisgICAgICAgICAgICAgICAgZmxhZ19uYW1lOiBTdHJpbmc6OmZyb20oImRpc2FibGVkX3J3IiksCisgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTogU3RvcmVkRmxhZ1R5cGU6OlJlYWRXcml0ZUJvb2xlYW4sCisgICAgICAgICAgICAgICAgZmxhZ192YWx1ZTogU3RyaW5nOjpmcm9tKCJmYWxzZSIpLAorICAgICAgICAgICAgICAgIGlzX3JlYWR3cml0ZTogdHJ1ZSwKKyAgICAgICAgICAgICAgICBoYXNfc2VydmVyX292ZXJyaWRlOiBmYWxzZSwKKyAgICAgICAgICAgICAgICBoYXNfbG9jYWxfb3ZlcnJpZGU6IGZhbHNlLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEZsYWdWYWx1ZUFuZEluZm9TdW1tYXJ5IHsKKyAgICAgICAgICAgICAgICBwYWNrYWdlX25hbWU6IFN0cmluZzo6ZnJvbSgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpLAorICAgICAgICAgICAgICAgIGZsYWdfbmFtZTogU3RyaW5nOjpmcm9tKCJlbmFibGVkX3JvIiksCisgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTogU3RvcmVkRmxhZ1R5cGU6OlJlYWRPbmx5Qm9vbGVhbiwKKyAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlOiBTdHJpbmc6OmZyb20oInRydWUiKSwKKyAgICAgICAgICAgICAgICBpc19yZWFkd3JpdGU6IGZhbHNlLAorICAgICAgICAgICAgICAgIGhhc19zZXJ2ZXJfb3ZlcnJpZGU6IGZhbHNlLAorICAgICAgICAgICAgICAgIGhhc19sb2NhbF9vdmVycmlkZTogZmFsc2UsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgRmxhZ1ZhbHVlQW5kSW5mb1N1bW1hcnkgeworICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogU3RyaW5nOjpmcm9tKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiksCisgICAgICAgICAgICAgICAgZmxhZ19uYW1lOiBTdHJpbmc6OmZyb20oImVuYWJsZWRfcnciKSwKKyAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOiBTdG9yZWRGbGFnVHlwZTo6UmVhZFdyaXRlQm9vbGVhbiwKKyAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlOiBTdHJpbmc6OmZyb20oInRydWUiKSwKKyAgICAgICAgICAgICAgICBpc19yZWFkd3JpdGU6IHRydWUsCisgICAgICAgICAgICAgICAgaGFzX3NlcnZlcl9vdmVycmlkZTogZmFsc2UsCisgICAgICAgICAgICAgICAgaGFzX2xvY2FsX292ZXJyaWRlOiBmYWxzZSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBGbGFnVmFsdWVBbmRJbmZvU3VtbWFyeSB7CisgICAgICAgICAgICAgICAgcGFja2FnZV9uYW1lOiBTdHJpbmc6OmZyb20oImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiKSwKKyAgICAgICAgICAgICAgICBmbGFnX25hbWU6IFN0cmluZzo6ZnJvbSgiZGlzYWJsZWRfcnciKSwKKyAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOiBTdG9yZWRGbGFnVHlwZTo6UmVhZFdyaXRlQm9vbGVhbiwKKyAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlOiBTdHJpbmc6OmZyb20oImZhbHNlIiksCisgICAgICAgICAgICAgICAgaXNfcmVhZHdyaXRlOiB0cnVlLAorICAgICAgICAgICAgICAgIGhhc19zZXJ2ZXJfb3ZlcnJpZGU6IGZhbHNlLAorICAgICAgICAgICAgICAgIGhhc19sb2NhbF9vdmVycmlkZTogZmFsc2UsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgRmxhZ1ZhbHVlQW5kSW5mb1N1bW1hcnkgeworICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogU3RyaW5nOjpmcm9tKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIiksCisgICAgICAgICAgICAgICAgZmxhZ19uYW1lOiBTdHJpbmc6OmZyb20oImVuYWJsZWRfZml4ZWRfcm8iKSwKKyAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOiBTdG9yZWRGbGFnVHlwZTo6Rml4ZWRSZWFkT25seUJvb2xlYW4sCisgICAgICAgICAgICAgICAgZmxhZ192YWx1ZTogU3RyaW5nOjpmcm9tKCJ0cnVlIiksCisgICAgICAgICAgICAgICAgaXNfcmVhZHdyaXRlOiBmYWxzZSwKKyAgICAgICAgICAgICAgICBoYXNfc2VydmVyX292ZXJyaWRlOiBmYWxzZSwKKyAgICAgICAgICAgICAgICBoYXNfbG9jYWxfb3ZlcnJpZGU6IGZhbHNlLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEZsYWdWYWx1ZUFuZEluZm9TdW1tYXJ5IHsKKyAgICAgICAgICAgICAgICBwYWNrYWdlX25hbWU6IFN0cmluZzo6ZnJvbSgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIpLAorICAgICAgICAgICAgICAgIGZsYWdfbmFtZTogU3RyaW5nOjpmcm9tKCJlbmFibGVkX3JvIiksCisgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTogU3RvcmVkRmxhZ1R5cGU6OlJlYWRPbmx5Qm9vbGVhbiwKKyAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlOiBTdHJpbmc6OmZyb20oInRydWUiKSwKKyAgICAgICAgICAgICAgICBpc19yZWFkd3JpdGU6IGZhbHNlLAorICAgICAgICAgICAgICAgIGhhc19zZXJ2ZXJfb3ZlcnJpZGU6IGZhbHNlLAorICAgICAgICAgICAgICAgIGhhc19sb2NhbF9vdmVycmlkZTogZmFsc2UsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgRmxhZ1ZhbHVlQW5kSW5mb1N1bW1hcnkgeworICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZTogU3RyaW5nOjpmcm9tKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IiksCisgICAgICAgICAgICAgICAgZmxhZ19uYW1lOiBTdHJpbmc6OmZyb20oImVuYWJsZWRfZml4ZWRfcm8iKSwKKyAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOiBTdG9yZWRGbGFnVHlwZTo6Rml4ZWRSZWFkT25seUJvb2xlYW4sCisgICAgICAgICAgICAgICAgZmxhZ192YWx1ZTogU3RyaW5nOjpmcm9tKCJ0cnVlIiksCisgICAgICAgICAgICAgICAgaXNfcmVhZHdyaXRlOiBmYWxzZSwKKyAgICAgICAgICAgICAgICBoYXNfc2VydmVyX292ZXJyaWRlOiBmYWxzZSwKKyAgICAgICAgICAgICAgICBoYXNfbG9jYWxfb3ZlcnJpZGU6IGZhbHNlLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEZsYWdWYWx1ZUFuZEluZm9TdW1tYXJ5IHsKKyAgICAgICAgICAgICAgICBwYWNrYWdlX25hbWU6IFN0cmluZzo6ZnJvbSgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIpLAorICAgICAgICAgICAgICAgIGZsYWdfbmFtZTogU3RyaW5nOjpmcm9tKCJlbmFibGVkX3J3IiksCisgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTogU3RvcmVkRmxhZ1R5cGU6OlJlYWRXcml0ZUJvb2xlYW4sCisgICAgICAgICAgICAgICAgZmxhZ192YWx1ZTogU3RyaW5nOjpmcm9tKCJ0cnVlIiksCisgICAgICAgICAgICAgICAgaXNfcmVhZHdyaXRlOiB0cnVlLAorICAgICAgICAgICAgICAgIGhhc19zZXJ2ZXJfb3ZlcnJpZGU6IGZhbHNlLAorICAgICAgICAgICAgICAgIGhhc19sb2NhbF9vdmVycmlkZTogZmFsc2UsCisgICAgICAgICAgICB9LAorICAgICAgICBdOworICAgICAgICBhc3NlcnRfZXEhKGZsYWdzLCBleHBlY3RlZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvbWFpbi5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL21haW4ucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTljZmQxOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL21haW4ucnMKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyEgYGFjb25maWctc3RvcmFnZWAgaXMgYSBkZWJ1Z2dpbmcgdG9vbCB0byBwYXJzZSBzdG9yYWdlIGZpbGVzCisKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6eworICAgIGxpc3RfZmxhZ3MsIGxpc3RfZmxhZ3Nfd2l0aF9pbmZvLCByZWFkX2ZpbGVfdG9fYnl0ZXMsIEFjb25maWdTdG9yYWdlRXJyb3IsIEZsYWdJbmZvTGlzdCwKKyAgICBGbGFnVGFibGUsIEZsYWdWYWx1ZUxpc3QsIFBhY2thZ2VUYWJsZSwgU3RvcmFnZUZpbGVUeXBlLAorfTsKK3VzZSBjbGFwOjp7YnVpbGRlcjo6QXJnQWN0aW9uLCBBcmcsIENvbW1hbmR9OwordXNlIHNlcmRlOjpTZXJpYWxpemU7Cit1c2Ugc2VyZGVfanNvbjsKK3VzZSBzdGQ6OmZtdDsKK3VzZSBzdGQ6OmZzOwordXNlIHN0ZDo6ZnM6OkZpbGU7Cit1c2Ugc3RkOjppbzo6V3JpdGU7CisKKy8qKgorICogVXNhZ2UgRXhhbXBsZXMKKyAqCisgKiBQcmludCBmaWxlOgorICogJCBhY29uZmlnLXN0b3JhZ2UgcHJpbnQgLS1maWxlPXBhdGgvdG8vZmxhZy5tYXAgLS10eXBlPWZsYWdfbWFwCisgKgorICogTGlzdCBmbGFnczoKKyAqICQgYWNvbmZpZy1zdG9yYWdlIGxpc3QgLS1mbGFnLW1hcD1wYXRoL3RvL2ZsYWcubWFwIFwKKyAqIC0tZmxhZy12YWw9cGF0aC90by9mbGFnLnZhbCAtLXBhY2thZ2UtbWFwPXBhdGgvdG8vcGFja2FnZS5tYXAKKyAqCisgKiBXcml0ZSBiaW5hcnkgZmlsZSBmb3IgdGVzdGluZzoKKyAqICQgYWNvbmZpZy1zdG9yYWdlIHByaW50IC0tZmlsZT1wYXRoL3RvL2ZsYWcubWFwIC0tdHlwZT1mbGFnX21hcCAtLWZvcm1hdD1qc29uID4gZmxhZ19tYXAuanNvbgorICogJCB2aW0gZmxhZ19tYXAuanNvbiAvLyBNYW51YWxseSBtYWtlIHVwZGF0ZXMKKyAqICQgYWNvbmZpZy1zdG9yYWdlIHdyaXRlLWJ5dGVzIC0taW5wdXQtZmlsZT1mbGFnX21hcC5qc29uIC0tb3V0cHV0LWZpbGU9cGF0aC90by9mbGFnLm1hcCAtLXR5cGU9ZmxhZ19tYXAKKyAqLworZm4gY2xpKCkgLT4gQ29tbWFuZCB7CisgICAgQ29tbWFuZDo6bmV3KCJhY29uZmlnLXN0b3JhZ2UiKQorICAgICAgICAuc3ViY29tbWFuZF9yZXF1aXJlZCh0cnVlKQorICAgICAgICAuc3ViY29tbWFuZCgKKyAgICAgICAgICAgIENvbW1hbmQ6Om5ldygicHJpbnQiKQorICAgICAgICAgICAgICAgIC5hcmcoQXJnOjpuZXcoImZpbGUiKS5sb25nKCJmaWxlIikucmVxdWlyZWQodHJ1ZSkuYWN0aW9uKEFyZ0FjdGlvbjo6U2V0KSkKKyAgICAgICAgICAgICAgICAuYXJnKAorICAgICAgICAgICAgICAgICAgICBBcmc6Om5ldygidHlwZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAubG9uZygidHlwZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAucmVxdWlyZWQodHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV9wYXJzZXIofHM6ICZzdHJ8IFN0b3JhZ2VGaWxlVHlwZTo6dHJ5X2Zyb20ocykpLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJmb3JtYXQiKS5sb25nKCJmb3JtYXQiKS5yZXF1aXJlZChmYWxzZSkuYWN0aW9uKEFyZ0FjdGlvbjo6U2V0KSksCisgICAgICAgICkKKyAgICAgICAgLnN1YmNvbW1hbmQoCisgICAgICAgICAgICBDb21tYW5kOjpuZXcoImxpc3QiKQorICAgICAgICAgICAgICAgIC5hcmcoCisgICAgICAgICAgICAgICAgICAgIEFyZzo6bmV3KCJwYWNrYWdlLW1hcCIpCisgICAgICAgICAgICAgICAgICAgICAgICAubG9uZygicGFja2FnZS1tYXAiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnJlcXVpcmVkKHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWN0aW9uKEFyZ0FjdGlvbjo6U2V0KSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgLmFyZyhBcmc6Om5ldygiZmxhZy1tYXAiKS5sb25nKCJmbGFnLW1hcCIpLnJlcXVpcmVkKHRydWUpLmFjdGlvbihBcmdBY3Rpb246OlNldCkpCisgICAgICAgICAgICAgICAgLmFyZyhBcmc6Om5ldygiZmxhZy12YWwiKS5sb25nKCJmbGFnLXZhbCIpLnJlcXVpcmVkKHRydWUpLmFjdGlvbihBcmdBY3Rpb246OlNldCkpCisgICAgICAgICAgICAgICAgLmFyZygKKyAgICAgICAgICAgICAgICAgICAgQXJnOjpuZXcoImZsYWctaW5mbyIpLmxvbmcoImZsYWctaW5mbyIpLnJlcXVpcmVkKGZhbHNlKS5hY3Rpb24oQXJnQWN0aW9uOjpTZXQpLAorICAgICAgICAgICAgICAgICksCisgICAgICAgICkKKyAgICAgICAgLnN1YmNvbW1hbmQoCisgICAgICAgICAgICBDb21tYW5kOjpuZXcoIndyaXRlLWJ5dGVzIikKKyAgICAgICAgICAgICAgICAvLyBXaGVyZSB0byB3cml0ZSB0aGUgb3V0cHV0IGJ5dGVzLiBTdWdnZXN0IHRvIHVzZSB0aGUgU3RvcmFnZUZpbGVUeXBlIG5hbWVzIChlLmcuIGZsYWcubWFwKS4KKyAgICAgICAgICAgICAgICAuYXJnKAorICAgICAgICAgICAgICAgICAgICBBcmc6Om5ldygib3V0cHV0LWZpbGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmxvbmcoIm91dHB1dC1maWxlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1aXJlZCh0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFjdGlvbihBcmdBY3Rpb246OlNldCksCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIC8vIElucHV0IGZpbGUgc2hvdWxkIGJlIGpzb24uCisgICAgICAgICAgICAgICAgLmFyZygKKyAgICAgICAgICAgICAgICAgICAgQXJnOjpuZXcoImlucHV0LWZpbGUiKS5sb25nKCJpbnB1dC1maWxlIikucmVxdWlyZWQodHJ1ZSkuYWN0aW9uKEFyZ0FjdGlvbjo6U2V0KSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgLmFyZygKKyAgICAgICAgICAgICAgICAgICAgQXJnOjpuZXcoInR5cGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmxvbmcoInR5cGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnJlcXVpcmVkKHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVfcGFyc2VyKHxzOiAmc3RyfCBTdG9yYWdlRmlsZVR5cGU6OnRyeV9mcm9tKHMpKSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICApCit9CisKK2ZuIHByaW50X3N0b3JhZ2VfZmlsZSgKKyAgICBmaWxlX3BhdGg6ICZzdHIsCisgICAgZmlsZV90eXBlOiAmU3RvcmFnZUZpbGVUeXBlLAorICAgIGFzX2pzb246IGJvb2wsCispIC0+IFJlc3VsdDwoKSwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIGxldCBieXRlcyA9IHJlYWRfZmlsZV90b19ieXRlcyhmaWxlX3BhdGgpPzsKKyAgICBtYXRjaCBmaWxlX3R5cGUgeworICAgICAgICBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXAgPT4geworICAgICAgICAgICAgbGV0IHBhY2thZ2VfdGFibGUgPSBQYWNrYWdlVGFibGU6OmZyb21fYnl0ZXMoJmJ5dGVzKT87CisgICAgICAgICAgICBwcmludGxuISgie30iLCB0b19wcmludF9mb3JtYXQocGFja2FnZV90YWJsZSwgYXNfanNvbikpOworICAgICAgICB9CisgICAgICAgIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ01hcCA9PiB7CisgICAgICAgICAgICBsZXQgZmxhZ190YWJsZSA9IEZsYWdUYWJsZTo6ZnJvbV9ieXRlcygmYnl0ZXMpPzsKKyAgICAgICAgICAgIHByaW50bG4hKCJ7fSIsIHRvX3ByaW50X2Zvcm1hdChmbGFnX3RhYmxlLCBhc19qc29uKSk7CisgICAgICAgIH0KKyAgICAgICAgU3RvcmFnZUZpbGVUeXBlOjpGbGFnVmFsID0+IHsKKyAgICAgICAgICAgIGxldCBmbGFnX3ZhbHVlID0gRmxhZ1ZhbHVlTGlzdDo6ZnJvbV9ieXRlcygmYnl0ZXMpPzsKKyAgICAgICAgICAgIHByaW50bG4hKCJ7fSIsIHRvX3ByaW50X2Zvcm1hdChmbGFnX3ZhbHVlLCBhc19qc29uKSk7CisgICAgICAgIH0KKyAgICAgICAgU3RvcmFnZUZpbGVUeXBlOjpGbGFnSW5mbyA9PiB7CisgICAgICAgICAgICBsZXQgZmxhZ19pbmZvID0gRmxhZ0luZm9MaXN0Ojpmcm9tX2J5dGVzKCZieXRlcyk/OworICAgICAgICAgICAgcHJpbnRsbiEoInt9IiwgdG9fcHJpbnRfZm9ybWF0KGZsYWdfaW5mbywgYXNfanNvbikpOworICAgICAgICB9CisgICAgfQorICAgIE9rKCgpKQorfQorCitmbiB0b19wcmludF9mb3JtYXQ8VD4oZmlsZV9jb250ZW50czogVCwgYXNfanNvbjogYm9vbCkgLT4gU3RyaW5nCit3aGVyZQorICAgIFQ6IFNlcmlhbGl6ZSArIGZtdDo6RGVidWcsCit7CisgICAgaWYgYXNfanNvbiB7CisgICAgICAgIHNlcmRlX2pzb246OnRvX3N0cmluZygmZmlsZV9jb250ZW50cykudW53cmFwKCkKKyAgICB9IGVsc2UgeworICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZmlsZV9jb250ZW50cykKKyAgICB9Cit9CisKK2ZuIG1haW4oKSAtPiBSZXN1bHQ8KCksIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICBsZXQgbWF0Y2hlcyA9IGNsaSgpLmdldF9tYXRjaGVzKCk7CisgICAgbWF0Y2ggbWF0Y2hlcy5zdWJjb21tYW5kKCkgeworICAgICAgICBTb21lKCgicHJpbnQiLCBzdWJfbWF0Y2hlcykpID0+IHsKKyAgICAgICAgICAgIGxldCBmaWxlX3BhdGggPSBzdWJfbWF0Y2hlcy5nZXRfb25lOjo8U3RyaW5nPigiZmlsZSIpLnVud3JhcCgpOworICAgICAgICAgICAgbGV0IGZpbGVfdHlwZSA9IHN1Yl9tYXRjaGVzLmdldF9vbmU6OjxTdG9yYWdlRmlsZVR5cGU+KCJ0eXBlIikudW53cmFwKCk7CisgICAgICAgICAgICBsZXQgZm9ybWF0ID0gc3ViX21hdGNoZXMuZ2V0X29uZTo6PFN0cmluZz4oImZvcm1hdCIpOworICAgICAgICAgICAgbGV0IGFzX2pzb246IGJvb2wgPSBmb3JtYXQgPT0gU29tZSgmImpzb24iLnRvX3N0cmluZygpKTsKKyAgICAgICAgICAgIHByaW50X3N0b3JhZ2VfZmlsZShmaWxlX3BhdGgsIGZpbGVfdHlwZSwgYXNfanNvbik/CisgICAgICAgIH0KKyAgICAgICAgU29tZSgoImxpc3QiLCBzdWJfbWF0Y2hlcykpID0+IHsKKyAgICAgICAgICAgIGxldCBwYWNrYWdlX21hcCA9IHN1Yl9tYXRjaGVzLmdldF9vbmU6OjxTdHJpbmc+KCJwYWNrYWdlLW1hcCIpLnVud3JhcCgpOworICAgICAgICAgICAgbGV0IGZsYWdfbWFwID0gc3ViX21hdGNoZXMuZ2V0X29uZTo6PFN0cmluZz4oImZsYWctbWFwIikudW53cmFwKCk7CisgICAgICAgICAgICBsZXQgZmxhZ192YWwgPSBzdWJfbWF0Y2hlcy5nZXRfb25lOjo8U3RyaW5nPigiZmxhZy12YWwiKS51bndyYXAoKTsKKyAgICAgICAgICAgIGxldCBmbGFnX2luZm8gPSBzdWJfbWF0Y2hlcy5nZXRfb25lOjo8U3RyaW5nPigiZmxhZy1pbmZvIik7CisgICAgICAgICAgICBtYXRjaCBmbGFnX2luZm8geworICAgICAgICAgICAgICAgIFNvbWUoaW5mb19maWxlKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGxldCBmbGFncyA9IGxpc3RfZmxhZ3Nfd2l0aF9pbmZvKHBhY2thZ2VfbWFwLCBmbGFnX21hcCwgZmxhZ192YWwsIGluZm9fZmlsZSk/OworICAgICAgICAgICAgICAgICAgICBmb3IgZmxhZyBpbiBmbGFncy5pdGVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRsbiEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ7fSB7fSB7fSB7Oj99IElzUmVhZFdyaXRlOiB7fSwgSGFzU2VydmVyT3ZlcnJpZGU6IHt9LCBIYXNMb2NhbE92ZXJyaWRlOiB7fSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcucGFja2FnZV9uYW1lLCBmbGFnLmZsYWdfbmFtZSwgZmxhZy5mbGFnX3ZhbHVlLCBmbGFnLnZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcuaXNfcmVhZHdyaXRlLCBmbGFnLmhhc19zZXJ2ZXJfb3ZlcnJpZGUsIGZsYWcuaGFzX2xvY2FsX292ZXJyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTm9uZSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGxldCBmbGFncyA9IGxpc3RfZmxhZ3MocGFja2FnZV9tYXAsIGZsYWdfbWFwLCBmbGFnX3ZhbCk/OworICAgICAgICAgICAgICAgICAgICBmb3IgZmxhZyBpbiBmbGFncy5pdGVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRsbiEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInt9IHt9IHt9IHs6P30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcucGFja2FnZV9uYW1lLCBmbGFnLmZsYWdfbmFtZSwgZmxhZy5mbGFnX3ZhbHVlLCBmbGFnLnZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIENvbnZlcnRzIEpTT04gb2YgdGhlIGZpbGUgaW50byByYXcgYnl0ZXMgKGFzIGlzIHVzZWQgb24tZGV2aWNlKS4KKyAgICAgICAgLy8gSW50ZW5kZWQgdG8gZ2VuZXJhdGUvZWFzaWx5IHVwZGF0ZSB0aGVzZSBmaWxlcyBmb3IgdGVzdGluZy4KKyAgICAgICAgU29tZSgoIndyaXRlLWJ5dGVzIiwgc3ViX21hdGNoZXMpKSA9PiB7CisgICAgICAgICAgICBsZXQgaW5wdXRfZmlsZV9wYXRoID0gc3ViX21hdGNoZXMuZ2V0X29uZTo6PFN0cmluZz4oImlucHV0LWZpbGUiKS51bndyYXAoKTsKKyAgICAgICAgICAgIGxldCBpbnB1dF9qc29uID0gZnM6OnJlYWRfdG9fc3RyaW5nKGlucHV0X2ZpbGVfcGF0aCkudW53cmFwKCk7CisKKyAgICAgICAgICAgIGxldCBmaWxlX3R5cGUgPSBzdWJfbWF0Y2hlcy5nZXRfb25lOjo8U3RvcmFnZUZpbGVUeXBlPigidHlwZSIpLnVud3JhcCgpOworICAgICAgICAgICAgbGV0IG91dHB1dF9ieXRlczogVmVjPHU4PjsKKyAgICAgICAgICAgIG1hdGNoIGZpbGVfdHlwZSB7CisgICAgICAgICAgICAgICAgU3RvcmFnZUZpbGVUeXBlOjpGbGFnVmFsID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3Q6IEZsYWdWYWx1ZUxpc3QgPSBzZXJkZV9qc29uOjpmcm9tX3N0cigmaW5wdXRfanNvbikudW53cmFwKCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dF9ieXRlcyA9IGxpc3QuaW50b19ieXRlcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdG9yYWdlRmlsZVR5cGU6OkZsYWdJbmZvID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3Q6IEZsYWdJbmZvTGlzdCA9IHNlcmRlX2pzb246OmZyb21fc3RyKCZpbnB1dF9qc29uKS51bndyYXAoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2J5dGVzID0gbGlzdC5pbnRvX2J5dGVzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ01hcCA9PiB7CisgICAgICAgICAgICAgICAgICAgIGxldCB0YWJsZTogRmxhZ1RhYmxlID0gc2VyZGVfanNvbjo6ZnJvbV9zdHIoJmlucHV0X2pzb24pLnVud3JhcCgpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRfYnl0ZXMgPSB0YWJsZS5pbnRvX2J5dGVzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0b3JhZ2VGaWxlVHlwZTo6UGFja2FnZU1hcCA9PiB7CisgICAgICAgICAgICAgICAgICAgIGxldCB0YWJsZTogUGFja2FnZVRhYmxlID0gc2VyZGVfanNvbjo6ZnJvbV9zdHIoJmlucHV0X2pzb24pLnVud3JhcCgpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRfYnl0ZXMgPSB0YWJsZS5pbnRvX2J5dGVzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZXQgb3V0cHV0X2ZpbGVfcGF0aCA9IHN1Yl9tYXRjaGVzLmdldF9vbmU6OjxTdHJpbmc+KCJvdXRwdXQtZmlsZSIpLnVud3JhcCgpOworICAgICAgICAgICAgbGV0IGZpbGUgPSBGaWxlOjpjcmVhdGUob3V0cHV0X2ZpbGVfcGF0aCk7CisgICAgICAgICAgICBpZiBmaWxlLmlzX2VycigpIHsKKyAgICAgICAgICAgICAgICBwYW5pYyEoImNhbid0IG1ha2UgZmlsZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGV0IF8gPSBmaWxlLnVud3JhcCgpLndyaXRlX2FsbCgmb3V0cHV0X2J5dGVzKTsKKyAgICAgICAgfQorICAgICAgICBfID0+IHVucmVhY2hhYmxlISgpLAorICAgIH0KKyAgICBPaygoKSkKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL3BhY2thZ2VfdGFibGUucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9wYWNrYWdlX3RhYmxlLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMzU3YzcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9wYWNrYWdlX3RhYmxlLnJzCkBAIC0wLDAgKzEsMzc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8hIHBhY2thZ2UgdGFibGUgbW9kdWxlIGRlZmluZXMgdGhlIHBhY2thZ2UgdGFibGUgZmlsZSBmb3JtYXQgYW5kIG1ldGhvZHMgZm9yIHNlcmlhbGl6YXRpb24KKy8vISBhbmQgZGVzZXJpYWxpemF0aW9uCisKK3VzZSBjcmF0ZTo6eworICAgIGdldF9idWNrZXRfaW5kZXgsIHJlYWRfc3RyX2Zyb21fYnl0ZXMsIHJlYWRfdTMyX2Zyb21fYnl0ZXMsIHJlYWRfdTY0X2Zyb21fYnl0ZXMsCisgICAgcmVhZF91OF9mcm9tX2J5dGVzLAorfTsKK3VzZSBjcmF0ZTo6e0Fjb25maWdTdG9yYWdlRXJyb3IsIFN0b3JhZ2VGaWxlVHlwZX07Cit1c2UgYW55aG93Ojphbnlob3c7Cit1c2Ugc2VyZGU6OntEZXNlcmlhbGl6ZSwgU2VyaWFsaXplfTsKK3VzZSBzdGQ6OmZtdDsKKworLy8vIFBhY2thZ2UgdGFibGUgaGVhZGVyIHN0cnVjdAorI1tkZXJpdmUoUGFydGlhbEVxLCBTZXJpYWxpemUsIERlc2VyaWFsaXplKV0KK3B1YiBzdHJ1Y3QgUGFja2FnZVRhYmxlSGVhZGVyIHsKKyAgICBwdWIgdmVyc2lvbjogdTMyLAorICAgIHB1YiBjb250YWluZXI6IFN0cmluZywKKyAgICBwdWIgZmlsZV90eXBlOiB1OCwKKyAgICBwdWIgZmlsZV9zaXplOiB1MzIsCisgICAgcHViIG51bV9wYWNrYWdlczogdTMyLAorICAgIHB1YiBidWNrZXRfb2Zmc2V0OiB1MzIsCisgICAgcHViIG5vZGVfb2Zmc2V0OiB1MzIsCit9CisKKy8vLyBJbXBsZW1lbnQgZGVidWcgcHJpbnQgdHJhaXQgZm9yIGhlYWRlcgoraW1wbCBmbXQ6OkRlYnVnIGZvciBQYWNrYWdlVGFibGVIZWFkZXIgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBmbXQ6OkZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICB3cml0ZWxuISgKKyAgICAgICAgICAgIGYsCisgICAgICAgICAgICAiVmVyc2lvbjoge30sIENvbnRhaW5lcjoge30sIEZpbGUgVHlwZTogezo/fSwgRmlsZSBTaXplOiB7fSIsCisgICAgICAgICAgICBzZWxmLnZlcnNpb24sCisgICAgICAgICAgICBzZWxmLmNvbnRhaW5lciwKKyAgICAgICAgICAgIFN0b3JhZ2VGaWxlVHlwZTo6dHJ5X2Zyb20oc2VsZi5maWxlX3R5cGUpLAorICAgICAgICAgICAgc2VsZi5maWxlX3NpemUKKyAgICAgICAgKT87CisgICAgICAgIHdyaXRlbG4hKAorICAgICAgICAgICAgZiwKKyAgICAgICAgICAgICJOdW0gb2YgUGFja2FnZXM6IHt9LCBCdWNrZXQgT2Zmc2V0Ont9LCBOb2RlIE9mZnNldDoge30iLAorICAgICAgICAgICAgc2VsZi5udW1fcGFja2FnZXMsIHNlbGYuYnVja2V0X29mZnNldCwgc2VsZi5ub2RlX29mZnNldAorICAgICAgICApPzsKKyAgICAgICAgT2soKCkpCisgICAgfQorfQorCitpbXBsIFBhY2thZ2VUYWJsZUhlYWRlciB7CisgICAgLy8vIFNlcmlhbGl6ZSB0byBieXRlcworICAgIHB1YiBmbiBpbnRvX2J5dGVzKCZzZWxmKSAtPiBWZWM8dTg+IHsKKyAgICAgICAgbGV0IG11dCByZXN1bHQgPSBWZWM6Om5ldygpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYudmVyc2lvbi50b19sZV9ieXRlcygpKTsKKyAgICAgICAgbGV0IGNvbnRhaW5lcl9ieXRlcyA9IHNlbGYuY29udGFpbmVyLmFzX2J5dGVzKCk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmKGNvbnRhaW5lcl9ieXRlcy5sZW4oKSBhcyB1MzIpLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoY29udGFpbmVyX2J5dGVzKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCZzZWxmLmZpbGVfdHlwZS50b19sZV9ieXRlcygpKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCZzZWxmLmZpbGVfc2l6ZS50b19sZV9ieXRlcygpKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCZzZWxmLm51bV9wYWNrYWdlcy50b19sZV9ieXRlcygpKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCZzZWxmLmJ1Y2tldF9vZmZzZXQudG9fbGVfYnl0ZXMoKSk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmc2VsZi5ub2RlX29mZnNldC50b19sZV9ieXRlcygpKTsKKyAgICAgICAgcmVzdWx0CisgICAgfQorCisgICAgLy8vIERlc2VyaWFsaXplIGZyb20gYnl0ZXMKKyAgICBwdWIgZm4gZnJvbV9ieXRlcyhieXRlczogJlt1OF0pIC0+IFJlc3VsdDxTZWxmLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgICAgIGxldCBtdXQgaGVhZCA9IDA7CisgICAgICAgIGxldCB0YWJsZSA9IFNlbGYgeworICAgICAgICAgICAgdmVyc2lvbjogcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8sCisgICAgICAgICAgICBjb250YWluZXI6IHJlYWRfc3RyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/LAorICAgICAgICAgICAgZmlsZV90eXBlOiByZWFkX3U4X2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/LAorICAgICAgICAgICAgZmlsZV9zaXplOiByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPywKKyAgICAgICAgICAgIG51bV9wYWNrYWdlczogcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8sCisgICAgICAgICAgICBidWNrZXRfb2Zmc2V0OiByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPywKKyAgICAgICAgICAgIG5vZGVfb2Zmc2V0OiByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPywKKyAgICAgICAgfTsKKyAgICAgICAgaWYgdGFibGUuZmlsZV90eXBlICE9IFN0b3JhZ2VGaWxlVHlwZTo6UGFja2FnZU1hcCBhcyB1OCB7CisgICAgICAgICAgICByZXR1cm4gRXJyKEFjb25maWdTdG9yYWdlRXJyb3I6OkJ5dGVzUGFyc2VGYWlsKGFueWhvdyEoCisgICAgICAgICAgICAgICAgImJpbmFyeSBmaWxlIGlzIG5vdCBhIHBhY2thZ2UgbWFwIgorICAgICAgICAgICAgKSkpOworICAgICAgICB9CisgICAgICAgIE9rKHRhYmxlKQorICAgIH0KK30KKworLy8vIFBhY2thZ2UgdGFibGUgbm9kZSBzdHJ1Y3QKKyNbZGVyaXZlKFBhcnRpYWxFcSwgU2VyaWFsaXplLCBEZXNlcmlhbGl6ZSldCitwdWIgc3RydWN0IFBhY2thZ2VUYWJsZU5vZGUgeworICAgIHB1YiBwYWNrYWdlX25hbWU6IFN0cmluZywKKyAgICBwdWIgcGFja2FnZV9pZDogdTMyLAorICAgIHB1YiBmaW5nZXJwcmludDogdTY0LAorICAgIC8vIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYm9vbGVhbiBmbGFnIGluIHRoaXMgYWNvbmZpZyBwYWNrYWdlIGFtb25nIGFsbCBib29sZWFuCisgICAgLy8gZmxhZ3MgaW4gdGhpcyBjb250YWluZXIuCisgICAgcHViIGJvb2xlYW5fc3RhcnRfaW5kZXg6IHUzMiwKKyAgICBwdWIgbmV4dF9vZmZzZXQ6IE9wdGlvbjx1MzI+LAorfQorCisvLy8gSW1wbGVtZW50IGRlYnVnIHByaW50IHRyYWl0IGZvciBub2RlCitpbXBsIGZtdDo6RGVidWcgZm9yIFBhY2thZ2VUYWJsZU5vZGUgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBmbXQ6OkZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICB3cml0ZWxuISgKKyAgICAgICAgICAgIGYsCisgICAgICAgICAgICAiUGFja2FnZToge30sIElkOiB7fSwgRmluZ2VycHJpbnQ6IHt9LCBCb29sZWFuIGZsYWcgc3RhcnQgaW5kZXg6IHt9LCBOZXh0OiB7Oj99IiwKKyAgICAgICAgICAgIHNlbGYucGFja2FnZV9uYW1lLAorICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2lkLAorICAgICAgICAgICAgc2VsZi5maW5nZXJwcmludCwKKyAgICAgICAgICAgIHNlbGYuYm9vbGVhbl9zdGFydF9pbmRleCwKKyAgICAgICAgICAgIHNlbGYubmV4dF9vZmZzZXQKKyAgICAgICAgKT87CisgICAgICAgIE9rKCgpKQorICAgIH0KK30KKworaW1wbCBQYWNrYWdlVGFibGVOb2RlIHsKKyAgICAvLy8gU2VyaWFsaXplIHRvIGJ5dGVzCisgICAgcHViIGZuIGludG9fYnl0ZXMoJnNlbGYsIHZlcnNpb246IHUzMikgLT4gVmVjPHU4PiB7CisgICAgICAgIG1hdGNoIHZlcnNpb24geworICAgICAgICAgICAgMSA9PiBTZWxmOjppbnRvX2J5dGVzX3YxKHNlbGYpLAorICAgICAgICAgICAgMiA9PiBTZWxmOjppbnRvX2J5dGVzX3YyKHNlbGYpLAorICAgICAgICAgICAgLy8gVE9ETyhiLzMxNjM1NzY4Nik6IGludG9fYnl0ZXMgc2hvdWxkIHJldHVybiBhIFJlc3VsdC4KKyAgICAgICAgICAgIF8gPT4gU2VsZjo6aW50b19ieXRlc192Migmc2VsZiksCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiBpbnRvX2J5dGVzX3YxKCZzZWxmKSAtPiBWZWM8dTg+IHsKKyAgICAgICAgbGV0IG11dCByZXN1bHQgPSBWZWM6Om5ldygpOworICAgICAgICBsZXQgbmFtZV9ieXRlcyA9IHNlbGYucGFja2FnZV9uYW1lLmFzX2J5dGVzKCk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmKG5hbWVfYnl0ZXMubGVuKCkgYXMgdTMyKS50b19sZV9ieXRlcygpKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKG5hbWVfYnl0ZXMpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYucGFja2FnZV9pZC50b19sZV9ieXRlcygpKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCZzZWxmLmJvb2xlYW5fc3RhcnRfaW5kZXgudG9fbGVfYnl0ZXMoKSk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmc2VsZi5uZXh0X29mZnNldC51bndyYXBfb3IoMCkudG9fbGVfYnl0ZXMoKSk7CisgICAgICAgIHJlc3VsdAorICAgIH0KKworICAgIGZuIGludG9fYnl0ZXNfdjIoJnNlbGYpIC0+IFZlYzx1OD4geworICAgICAgICBsZXQgbXV0IHJlc3VsdCA9IFZlYzo6bmV3KCk7CisgICAgICAgIGxldCBuYW1lX2J5dGVzID0gc2VsZi5wYWNrYWdlX25hbWUuYXNfYnl0ZXMoKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCYobmFtZV9ieXRlcy5sZW4oKSBhcyB1MzIpLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UobmFtZV9ieXRlcyk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmc2VsZi5wYWNrYWdlX2lkLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYuZmluZ2VycHJpbnQudG9fbGVfYnl0ZXMoKSk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmc2VsZi5ib29sZWFuX3N0YXJ0X2luZGV4LnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYubmV4dF9vZmZzZXQudW53cmFwX29yKDApLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQKKyAgICB9CisKKyAgICAvLy8gRGVzZXJpYWxpemUgZnJvbSBieXRlcyBiYXNlZCBvbiBmaWxlIHZlcnNpb24uCisgICAgcHViIGZuIGZyb21fYnl0ZXMoYnl0ZXM6ICZbdThdLCB2ZXJzaW9uOiB1MzIpIC0+IFJlc3VsdDxTZWxmLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgICAgIG1hdGNoIHZlcnNpb24geworICAgICAgICAgICAgMSA9PiBTZWxmOjpmcm9tX2J5dGVzX3YxKGJ5dGVzKSwKKyAgICAgICAgICAgIDIgPT4gU2VsZjo6ZnJvbV9ieXRlc192MihieXRlcyksCisgICAgICAgICAgICBfID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRXJyKEFjb25maWdTdG9yYWdlRXJyb3I6OkJ5dGVzUGFyc2VGYWlsKGFueWhvdyEoCisgICAgICAgICAgICAgICAgICAgICJCaW5hcnkgZmlsZSBpcyBhbiB1bnN1cHBvcnRlZCB2ZXJzaW9uOiB7fSIsCisgICAgICAgICAgICAgICAgICAgIHZlcnNpb24KKyAgICAgICAgICAgICAgICApKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIGZyb21fYnl0ZXNfdjEoYnl0ZXM6ICZbdThdKSAtPiBSZXN1bHQ8U2VsZiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgICAgICBsZXQgbXV0IGhlYWQgPSAwOworICAgICAgICBsZXQgcGFja2FnZV9uYW1lID0gcmVhZF9zdHJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT87CisgICAgICAgIGxldCBwYWNrYWdlX2lkID0gcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT87CisgICAgICAgIC8vIHYxIGRvZXMgbm90IGhhdmUgZmluZ2VycHJpbnQsIHNvIGp1c3Qgc2V0IHRvIDAuCisgICAgICAgIGxldCBmaW5nZXJwcmludDogdTY0ID0gMDsKKyAgICAgICAgbGV0IGJvb2xlYW5fc3RhcnRfaW5kZXggPSByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPzsKKyAgICAgICAgbGV0IG5leHRfb2Zmc2V0ID0gbWF0Y2ggcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8geworICAgICAgICAgICAgMCA9PiBOb25lLAorICAgICAgICAgICAgdmFsID0+IFNvbWUodmFsKSwKKyAgICAgICAgfTsKKworICAgICAgICBsZXQgbm9kZSA9IFNlbGYgeyBwYWNrYWdlX25hbWUsIHBhY2thZ2VfaWQsIGZpbmdlcnByaW50LCBib29sZWFuX3N0YXJ0X2luZGV4LCBuZXh0X29mZnNldCB9OworICAgICAgICBPayhub2RlKQorICAgIH0KKworICAgIGZuIGZyb21fYnl0ZXNfdjIoYnl0ZXM6ICZbdThdKSAtPiBSZXN1bHQ8U2VsZiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgICAgICBsZXQgbXV0IGhlYWQgPSAwOworICAgICAgICBsZXQgcGFja2FnZV9uYW1lID0gcmVhZF9zdHJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT87CisgICAgICAgIGxldCBwYWNrYWdlX2lkID0gcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT87CisgICAgICAgIGxldCBmaW5nZXJwcmludCA9IHJlYWRfdTY0X2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/OworICAgICAgICBsZXQgYm9vbGVhbl9zdGFydF9pbmRleCA9IHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/OworICAgICAgICBsZXQgbmV4dF9vZmZzZXQgPSBtYXRjaCByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPyB7CisgICAgICAgICAgICAwID0+IE5vbmUsCisgICAgICAgICAgICB2YWwgPT4gU29tZSh2YWwpLAorICAgICAgICB9OworCisgICAgICAgIGxldCBub2RlID0gU2VsZiB7IHBhY2thZ2VfbmFtZSwgcGFja2FnZV9pZCwgZmluZ2VycHJpbnQsIGJvb2xlYW5fc3RhcnRfaW5kZXgsIG5leHRfb2Zmc2V0IH07CisgICAgICAgIE9rKG5vZGUpCisgICAgfQorCisgICAgLy8vIEdldCB0aGUgYnVja2V0IGluZGV4IGZvciBhIHBhY2thZ2UgdGFibGUgbm9kZSwgZGVmaW5lZCBpdCBoZXJlIHNvIHRoZQorICAgIC8vLyBjb25zdHJ1Y3Rpb24gc2lkZSAoYWNvbmZpZyBiaW5hcnkpIGFuZCBjb25zdW1wdGlvbiBzaWRlIChmbGFnIHJlYWQgbGliKQorICAgIC8vLyB1c2UgdGhlIHNhbWUgbWV0aG9kIG9mIGhhc2hpbmcKKyAgICBwdWIgZm4gZmluZF9idWNrZXRfaW5kZXgocGFja2FnZTogJnN0ciwgbnVtX2J1Y2tldHM6IHUzMikgLT4gdTMyIHsKKyAgICAgICAgZ2V0X2J1Y2tldF9pbmRleChwYWNrYWdlLmFzX2J5dGVzKCksIG51bV9idWNrZXRzKQorICAgIH0KK30KKworLy8vIFBhY2thZ2UgdGFibGUgc3RydWN0CisjW2Rlcml2ZShQYXJ0aWFsRXEsIFNlcmlhbGl6ZSwgRGVzZXJpYWxpemUpXQorcHViIHN0cnVjdCBQYWNrYWdlVGFibGUgeworICAgIHB1YiBoZWFkZXI6IFBhY2thZ2VUYWJsZUhlYWRlciwKKyAgICBwdWIgYnVja2V0czogVmVjPE9wdGlvbjx1MzI+PiwKKyAgICBwdWIgbm9kZXM6IFZlYzxQYWNrYWdlVGFibGVOb2RlPiwKK30KKworLy8vIEltcGxlbWVudCBkZWJ1ZyBwcmludCB0cmFpdCBmb3IgcGFja2FnZSB0YWJsZQoraW1wbCBmbXQ6OkRlYnVnIGZvciBQYWNrYWdlVGFibGUgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBmbXQ6OkZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICB3cml0ZWxuIShmLCAiSGVhZGVyOiIpPzsKKyAgICAgICAgd3JpdGUhKGYsICJ7Oj99Iiwgc2VsZi5oZWFkZXIpPzsKKyAgICAgICAgd3JpdGVsbiEoZiwgIkJ1Y2tldHM6Iik/OworICAgICAgICB3cml0ZWxuIShmLCAiezo/fSIsIHNlbGYuYnVja2V0cyk/OworICAgICAgICB3cml0ZWxuIShmLCAiTm9kZXM6Iik/OworICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLm5vZGVzLml0ZXIoKSB7CisgICAgICAgICAgICB3cml0ZSEoZiwgIns6P30iLCBub2RlKT87CisgICAgICAgIH0KKyAgICAgICAgT2soKCkpCisgICAgfQorfQorCitpbXBsIFBhY2thZ2VUYWJsZSB7CisgICAgLy8vIFNlcmlhbGl6ZSB0byBieXRlcworICAgIHB1YiBmbiBpbnRvX2J5dGVzKCZzZWxmKSAtPiBWZWM8dTg+IHsKKyAgICAgICAgWworICAgICAgICAgICAgc2VsZi5oZWFkZXIuaW50b19ieXRlcygpLAorICAgICAgICAgICAgc2VsZi5idWNrZXRzLml0ZXIoKS5tYXAofHZ8IHYudW53cmFwX29yKDApLnRvX2xlX2J5dGVzKCkpLmNvbGxlY3Q6OjxWZWM8Xz4+KCkuY29uY2F0KCksCisgICAgICAgICAgICBzZWxmLm5vZGVzCisgICAgICAgICAgICAgICAgLml0ZXIoKQorICAgICAgICAgICAgICAgIC5tYXAofHZ8IHYuaW50b19ieXRlcyhzZWxmLmhlYWRlci52ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICAuY29sbGVjdDo6PFZlYzxfPj4oKQorICAgICAgICAgICAgICAgIC5jb25jYXQoKSwKKyAgICAgICAgXQorICAgICAgICAuY29uY2F0KCkKKyAgICB9CisKKyAgICAvLy8gRGVzZXJpYWxpemUgZnJvbSBieXRlcworICAgIHB1YiBmbiBmcm9tX2J5dGVzKGJ5dGVzOiAmW3U4XSkgLT4gUmVzdWx0PFNlbGYsIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICAgICAgbGV0IGhlYWRlciA9IFBhY2thZ2VUYWJsZUhlYWRlcjo6ZnJvbV9ieXRlcyhieXRlcyk/OworICAgICAgICBsZXQgbnVtX3BhY2thZ2VzID0gaGVhZGVyLm51bV9wYWNrYWdlczsKKyAgICAgICAgbGV0IG51bV9idWNrZXRzID0gY3JhdGU6OmdldF90YWJsZV9zaXplKG51bV9wYWNrYWdlcyk/OworICAgICAgICBsZXQgbXV0IGhlYWQgPSBoZWFkZXIuaW50b19ieXRlcygpLmxlbigpOworICAgICAgICBsZXQgYnVja2V0cyA9ICgwLi5udW1fYnVja2V0cykKKyAgICAgICAgICAgIC5tYXAofF98IG1hdGNoIHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCkudW53cmFwKCkgeworICAgICAgICAgICAgICAgIDAgPT4gTm9uZSwKKyAgICAgICAgICAgICAgICB2YWwgPT4gU29tZSh2YWwpLAorICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIC5jb2xsZWN0KCk7CisgICAgICAgIGxldCBub2RlcyA9ICgwLi5udW1fcGFja2FnZXMpCisgICAgICAgICAgICAubWFwKHxffCB7CisgICAgICAgICAgICAgICAgbGV0IG5vZGUgPSBQYWNrYWdlVGFibGVOb2RlOjpmcm9tX2J5dGVzKCZieXRlc1toZWFkLi5dLCBoZWFkZXIudmVyc2lvbik/OworICAgICAgICAgICAgICAgIGhlYWQgKz0gbm9kZS5pbnRvX2J5dGVzKGhlYWRlci52ZXJzaW9uKS5sZW4oKTsKKyAgICAgICAgICAgICAgICBPayhub2RlKQorICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIC5jb2xsZWN0Ojo8UmVzdWx0PFZlYzxfPiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4+KCkKKyAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJtc2d8IHsKKyAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZUVycm9yOjpCeXRlc1BhcnNlRmFpbChhbnlob3chKAorICAgICAgICAgICAgICAgICAgICAiZmFpbCB0byBwYXJzZSBwYWNrYWdlIHRhYmxlOiB7fSIsCisgICAgICAgICAgICAgICAgICAgIGVycm1zZworICAgICAgICAgICAgICAgICkpCisgICAgICAgICAgICB9KT87CisKKyAgICAgICAgbGV0IHRhYmxlID0gU2VsZiB7IGhlYWRlciwgYnVja2V0cywgbm9kZXMgfTsKKyAgICAgICAgT2sodGFibGUpCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBjcmF0ZTo6dGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZTsKKyAgICB1c2UgY3JhdGU6OntyZWFkX3UzMl9mcm9tX3N0YXJ0X29mX2J5dGVzLCBERUZBVUxUX0ZJTEVfVkVSU0lPTiwgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT059OworCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRoZSB0YWJsZSBzZXJpYWxpemF0aW9uCisgICAgLy8gVE9ETzogYi8zNzYxMDgyNjggLSBVc2UgcGFyYW1ldGVyaXplZCB0ZXN0cy4KKyAgICBmbiB0ZXN0X3NlcmlhbGl6YXRpb25fZGVmYXVsdCgpIHsKKyAgICAgICAgbGV0IHBhY2thZ2VfdGFibGUgPSBjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlKERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgbGV0IGhlYWRlcjogJlBhY2thZ2VUYWJsZUhlYWRlciA9ICZwYWNrYWdlX3RhYmxlLmhlYWRlcjsKKyAgICAgICAgbGV0IHJlaW50ZXJwcmV0ZWRfaGVhZGVyID0gUGFja2FnZVRhYmxlSGVhZGVyOjpmcm9tX2J5dGVzKCZoZWFkZXIuaW50b19ieXRlcygpKTsKKyAgICAgICAgYXNzZXJ0IShyZWludGVycHJldGVkX2hlYWRlci5pc19vaygpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShoZWFkZXIsICZyZWludGVycHJldGVkX2hlYWRlci51bndyYXAoKSk7CisKKyAgICAgICAgbGV0IG5vZGVzOiAmVmVjPFBhY2thZ2VUYWJsZU5vZGU+ID0gJnBhY2thZ2VfdGFibGUubm9kZXM7CisgICAgICAgIGZvciBub2RlIGluIG5vZGVzLml0ZXIoKSB7CisgICAgICAgICAgICBsZXQgcmVpbnRlcnByZXRlZF9ub2RlID0KKyAgICAgICAgICAgICAgICBQYWNrYWdlVGFibGVOb2RlOjpmcm9tX2J5dGVzKCZub2RlLmludG9fYnl0ZXMoaGVhZGVyLnZlcnNpb24pLCBoZWFkZXIudmVyc2lvbikKKyAgICAgICAgICAgICAgICAgICAgLnVud3JhcCgpOworICAgICAgICAgICAgYXNzZXJ0X2VxIShub2RlLCAmcmVpbnRlcnByZXRlZF9ub2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIGxldCBwYWNrYWdlX3RhYmxlX2J5dGVzID0gcGFja2FnZV90YWJsZS5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCByZWludGVycHJldGVkX3RhYmxlID0gUGFja2FnZVRhYmxlOjpmcm9tX2J5dGVzKCZwYWNrYWdlX3RhYmxlX2J5dGVzKTsKKyAgICAgICAgYXNzZXJ0IShyZWludGVycHJldGVkX3RhYmxlLmlzX29rKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZwYWNrYWdlX3RhYmxlLCAmcmVpbnRlcnByZXRlZF90YWJsZS51bndyYXAoKSk7CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZV90YWJsZV9ieXRlcy5sZW4oKSBhcyB1MzIsIGhlYWRlci5maWxlX3NpemUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3NlcmlhbGl6YXRpb25fbWF4KCkgeworICAgICAgICBsZXQgcGFja2FnZV90YWJsZSA9IGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04pOworICAgICAgICBsZXQgaGVhZGVyOiAmUGFja2FnZVRhYmxlSGVhZGVyID0gJnBhY2thZ2VfdGFibGUuaGVhZGVyOworICAgICAgICBsZXQgcmVpbnRlcnByZXRlZF9oZWFkZXIgPSBQYWNrYWdlVGFibGVIZWFkZXI6OmZyb21fYnl0ZXMoJmhlYWRlci5pbnRvX2J5dGVzKCkpOworICAgICAgICBhc3NlcnQhKHJlaW50ZXJwcmV0ZWRfaGVhZGVyLmlzX29rKCkpOworICAgICAgICBhc3NlcnRfZXEhKGhlYWRlciwgJnJlaW50ZXJwcmV0ZWRfaGVhZGVyLnVud3JhcCgpKTsKKworICAgICAgICBsZXQgbm9kZXM6ICZWZWM8UGFja2FnZVRhYmxlTm9kZT4gPSAmcGFja2FnZV90YWJsZS5ub2RlczsKKyAgICAgICAgZm9yIG5vZGUgaW4gbm9kZXMuaXRlcigpIHsKKyAgICAgICAgICAgIGxldCByZWludGVycHJldGVkX25vZGUgPQorICAgICAgICAgICAgICAgIFBhY2thZ2VUYWJsZU5vZGU6OmZyb21fYnl0ZXMoJm5vZGUuaW50b19ieXRlcyhoZWFkZXIudmVyc2lvbiksIGhlYWRlci52ZXJzaW9uKQorICAgICAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKG5vZGUsICZyZWludGVycHJldGVkX25vZGUpOworICAgICAgICB9CisKKyAgICAgICAgbGV0IHBhY2thZ2VfdGFibGVfYnl0ZXMgPSBwYWNrYWdlX3RhYmxlLmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IHJlaW50ZXJwcmV0ZWRfdGFibGUgPSBQYWNrYWdlVGFibGU6OmZyb21fYnl0ZXMoJnBhY2thZ2VfdGFibGVfYnl0ZXMpOworICAgICAgICBhc3NlcnQhKHJlaW50ZXJwcmV0ZWRfdGFibGUuaXNfb2soKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnBhY2thZ2VfdGFibGUsICZyZWludGVycHJldGVkX3RhYmxlLnVud3JhcCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX3RhYmxlX2J5dGVzLmxlbigpIGFzIHUzMiwgaGVhZGVyLmZpbGVfc2l6ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRoYXQgdmVyc2lvbiBudW1iZXIgc2hvdWxkIGJlIGF0IHRoZSB0b3Agb2Ygc2VyaWFsaXplZAorICAgIC8vIGJ5dGVzCisgICAgZm4gdGVzdF92ZXJzaW9uX251bWJlcigpIHsKKyAgICAgICAgbGV0IHBhY2thZ2VfdGFibGUgPSBjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlKERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgbGV0IGJ5dGVzID0gJnBhY2thZ2VfdGFibGUuaW50b19ieXRlcygpOworICAgICAgICBsZXQgdW5wYWNrZWRfdmVyc2lvbiA9IHJlYWRfdTMyX2Zyb21fc3RhcnRfb2ZfYnl0ZXMoYnl0ZXMpLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKHVucGFja2VkX3ZlcnNpb24sIERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9yb3VuZF90cmlwX2RlZmF1bHQoKSB7CisgICAgICAgIGxldCB0YWJsZTogUGFja2FnZVRhYmxlID0gY3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZShERUZBVUxUX0ZJTEVfVkVSU0lPTik7CisgICAgICAgIGxldCB0YWJsZV9ieXRlcyA9IHRhYmxlLmludG9fYnl0ZXMoKTsKKworICAgICAgICBsZXQgcmVpbnRlcnByZXRlZF90YWJsZSA9IFBhY2thZ2VUYWJsZTo6ZnJvbV9ieXRlcygmdGFibGVfYnl0ZXMpLnVud3JhcCgpOworCisgICAgICAgIGFzc2VydF9lcSEodGFibGUsIHJlaW50ZXJwcmV0ZWRfdGFibGUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3JvdW5kX3RyaXBfbWF4KCkgeworICAgICAgICBsZXQgdGFibGU6IFBhY2thZ2VUYWJsZSA9IGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04pOworICAgICAgICBsZXQgdGFibGVfYnl0ZXMgPSB0YWJsZS5pbnRvX2J5dGVzKCk7CisKKyAgICAgICAgbGV0IHJlaW50ZXJwcmV0ZWRfdGFibGUgPSBQYWNrYWdlVGFibGU6OmZyb21fYnl0ZXMoJnRhYmxlX2J5dGVzKS51bndyYXAoKTsKKworICAgICAgICBhc3NlcnRfZXEhKHRhYmxlLCByZWludGVycHJldGVkX3RhYmxlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gZmlsZSB0eXBlIGNoZWNrCisgICAgZm4gdGVzdF9maWxlX3R5cGVfY2hlY2soKSB7CisgICAgICAgIGxldCBtdXQgcGFja2FnZV90YWJsZSA9IGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoREVGQVVMVF9GSUxFX1ZFUlNJT04pOworICAgICAgICBwYWNrYWdlX3RhYmxlLmhlYWRlci5maWxlX3R5cGUgPSAxMjN1ODsKKyAgICAgICAgbGV0IGVycm9yID0gUGFja2FnZVRhYmxlOjpmcm9tX2J5dGVzKCZwYWNrYWdlX3RhYmxlLmludG9fYnl0ZXMoKSkudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVycm9yKSwKKyAgICAgICAgICAgIGZvcm1hdCEoIkJ5dGVzUGFyc2VGYWlsKGJpbmFyeSBmaWxlIGlzIG5vdCBhIHBhY2thZ2UgbWFwKSIpCisgICAgICAgICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvcHJvdG9zLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvcHJvdG9zLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiODYyMDUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9wcm90b3MucnMKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBXaGVuIGJ1aWxkaW5nIHdpdGggdGhlIEFuZHJvaWQgdG9vbC1jaGFpbgorLy8KKy8vICAgLSBhbiBleHRlcm5hbCBjcmF0ZSBgYWNvbmZpZ19zdG9yYWdlX21ldGFkYXRhX3Byb3Rvc2Agd2lsbCBiZSBnZW5lcmF0ZWQKKy8vICAgLSB0aGUgZmVhdHVyZSAiY2FyZ28iIHdpbGwgYmUgZGlzYWJsZWQKKy8vCisvLyBXaGVuIGJ1aWxkaW5nIHdpdGggY2FyZ28KKy8vCisvLyAgIC0gYSBsb2NhbCBzdWItbW9kdWxlIHdpbGwgYmUgZ2VuZXJhdGVkIGluIE9VVF9ESVIgYW5kIGluY2x1ZGVkIGluIHRoaXMgZmlsZQorLy8gICAtIHRoZSBmZWF0dXJlICJjYXJnbyIgd2lsbCBiZSBlbmFibGVkCisvLworLy8gVGhpcyBtb2R1bGUgaGlkZXMgdGhlc2UgZGlmZmVyZW5jZXMgZnJvbSB0aGUgcmVzdCBvZiB0aGUgY29kZWJhc2UuCisKKy8vIC0tLS0gV2hlbiBidWlsZGluZyB3aXRoIHRoZSBBbmRyb2lkIHRvb2wtY2hhaW4gLS0tLQorI1tjZmcobm90KGZlYXR1cmUgPSAiY2FyZ28iKSldCittb2QgYXV0b19nZW5lcmF0ZWQgeworICAgIHB1YiB1c2UgYWNvbmZpZ19zdG9yYWdlX3Byb3Rvczo6YWNvbmZpZ19zdG9yYWdlX21ldGFkYXRhIGFzIFByb3RvU3RvcmFnZTsKKyAgICBwdWIgdXNlIFByb3RvU3RvcmFnZTo6U3RvcmFnZV9maWxlX2luZm8gYXMgUHJvdG9TdG9yYWdlRmlsZUluZm87CisgICAgcHViIHVzZSBQcm90b1N0b3JhZ2U6OlN0b3JhZ2VfZmlsZXMgYXMgUHJvdG9TdG9yYWdlRmlsZXM7Cit9CisKKy8vIC0tLS0gV2hlbiBidWlsZGluZyB3aXRoIGNhcmdvIC0tLS0KKyNbY2ZnKGZlYXR1cmUgPSAiY2FyZ28iKV0KK21vZCBhdXRvX2dlbmVyYXRlZCB7CisgICAgLy8gaW5jbHVkZSEgc3RhdGVtZW50cyBzaG91bGQgYmUgYXZvaWRlZCAoYmVjYXVzZSB0aGV5IGltcG9ydCBmaWxlIGNvbnRlbnRzIHZlcmJhdGltKSwgYnV0CisgICAgLy8gYmVjYXVzZSB0aGlzIGlzIG9ubHkgdXNlZCBkdXJpbmcgbG9jYWwgZGV2ZWxvcG1lbnQsIGFuZCBvbmx5IGlmIHVzaW5nIGNhcmdvIGluc3RlYWQgb2YgdGhlCisgICAgLy8gQW5kcm9pZCB0b29sLWNoYWluLCB3ZSBhbGxvdyBpdAorICAgIGluY2x1ZGUhKGNvbmNhdCEoZW52ISgiT1VUX0RJUiIpLCAiL2Fjb25maWdfc3RvcmFnZV9wcm90b3MvbW9kLnJzIikpOworICAgIHB1YiB1c2UgYWNvbmZpZ19zdG9yYWdlX21ldGFkYXRhOjpTdG9yYWdlX2ZpbGVfaW5mbyBhcyBQcm90b1N0b3JhZ2VGaWxlSW5mbzsKKyAgICBwdWIgdXNlIGFjb25maWdfc3RvcmFnZV9tZXRhZGF0YTo6U3RvcmFnZV9maWxlcyBhcyBQcm90b1N0b3JhZ2VGaWxlczsKK30KKworLy8gLS0tLSBDb21tb24gZm9yIGJvdGggdGhlIEFuZHJvaWQgdG9vbC1jaGFpbiBhbmQgY2FyZ28gLS0tLQorcHViIHVzZSBhdXRvX2dlbmVyYXRlZDo6KjsKKwordXNlIGFueWhvdzo6UmVzdWx0OwordXNlIHByb3RvYnVmOjpNZXNzYWdlOwordXNlIHN0ZDo6aW86OldyaXRlOwordXNlIHRlbXBmaWxlOjpOYW1lZFRlbXBGaWxlOworCitwdWIgbW9kIHN0b3JhZ2VfcmVjb3JkX3BiIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIGFueWhvdzo6ZW5zdXJlOworCisgICAgcHViIGZuIHRyeV9mcm9tX2JpbmFyeV9wcm90byhieXRlczogJlt1OF0pIC0+IFJlc3VsdDxQcm90b1N0b3JhZ2VGaWxlcz4geworICAgICAgICBsZXQgbWVzc2FnZTogUHJvdG9TdG9yYWdlRmlsZXMgPSBwcm90b2J1Zjo6TWVzc2FnZTo6cGFyc2VfZnJvbV9ieXRlcyhieXRlcyk/OworICAgICAgICB2ZXJpZnlfZmllbGRzKCZtZXNzYWdlKT87CisgICAgICAgIE9rKG1lc3NhZ2UpCisgICAgfQorCisgICAgcHViIGZuIHZlcmlmeV9maWVsZHMoc3RvcmFnZV9maWxlczogJlByb3RvU3RvcmFnZUZpbGVzKSAtPiBSZXN1bHQ8KCk+IHsKKyAgICAgICAgZm9yIHN0b3JhZ2VfZmlsZV9pbmZvIGluIHN0b3JhZ2VfZmlsZXMuZmlsZXMuaXRlcigpIHsKKyAgICAgICAgICAgIGVuc3VyZSEoCisgICAgICAgICAgICAgICAgIXN0b3JhZ2VfZmlsZV9pbmZvLnBhY2thZ2VfbWFwKCkuaXNfZW1wdHkoKSwKKyAgICAgICAgICAgICAgICAiaW52YWxpZCBzdG9yYWdlIGZpbGUgcmVjb3JkOiBtaXNzaW5nIHBhY2thZ2UgbWFwIGZpbGUgZm9yIGNvbnRhaW5lciB7fSIsCisgICAgICAgICAgICAgICAgc3RvcmFnZV9maWxlX2luZm8uY29udGFpbmVyKCkKKyAgICAgICAgICAgICk7CisgICAgICAgICAgICBlbnN1cmUhKAorICAgICAgICAgICAgICAgICFzdG9yYWdlX2ZpbGVfaW5mby5mbGFnX21hcCgpLmlzX2VtcHR5KCksCisgICAgICAgICAgICAgICAgImludmFsaWQgc3RvcmFnZSBmaWxlIHJlY29yZDogbWlzc2luZyBmbGFnIG1hcCBmaWxlIGZvciBjb250YWluZXIge30iLAorICAgICAgICAgICAgICAgIHN0b3JhZ2VfZmlsZV9pbmZvLmNvbnRhaW5lcigpCisgICAgICAgICAgICApOworICAgICAgICAgICAgZW5zdXJlISgKKyAgICAgICAgICAgICAgICAhc3RvcmFnZV9maWxlX2luZm8uZmxhZ192YWwoKS5pc19lbXB0eSgpLAorICAgICAgICAgICAgICAgICJpbnZhbGlkIHN0b3JhZ2UgZmlsZSByZWNvcmQ6IG1pc3NpbmcgZmxhZyB2YWwgZmlsZSBmb3IgY29udGFpbmVyIHt9IiwKKyAgICAgICAgICAgICAgICBzdG9yYWdlX2ZpbGVfaW5mby5jb250YWluZXIoKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBwdWIgZm4gZ2V0X2JpbmFyeV9wcm90b19mcm9tX3RleHRfcHJvdG8odGV4dF9wcm90bzogJnN0cikgLT4gUmVzdWx0PFZlYzx1OD4+IHsKKyAgICAgICAgbGV0IHN0b3JhZ2VfZmlsZXM6IFByb3RvU3RvcmFnZUZpbGVzID0gcHJvdG9idWY6OnRleHRfZm9ybWF0OjpwYXJzZV9mcm9tX3N0cih0ZXh0X3Byb3RvKT87CisgICAgICAgIGxldCBtdXQgYmluYXJ5X3Byb3RvID0gVmVjOjpuZXcoKTsKKyAgICAgICAgc3RvcmFnZV9maWxlcy53cml0ZV90b192ZWMoJm11dCBiaW5hcnlfcHJvdG8pPzsKKyAgICAgICAgT2soYmluYXJ5X3Byb3RvKQorICAgIH0KKworICAgIHB1YiBmbiB3cml0ZV9wcm90b190b190ZW1wX2ZpbGUodGV4dF9wcm90bzogJnN0cikgLT4gUmVzdWx0PE5hbWVkVGVtcEZpbGU+IHsKKyAgICAgICAgbGV0IGJ5dGVzID0gZ2V0X2JpbmFyeV9wcm90b19mcm9tX3RleHRfcHJvdG8odGV4dF9wcm90bykudW53cmFwKCk7CisgICAgICAgIGxldCBtdXQgZmlsZSA9IE5hbWVkVGVtcEZpbGU6Om5ldygpPzsKKyAgICAgICAgbGV0IF8gPSBmaWxlLndyaXRlX2FsbCgmYnl0ZXMpOworICAgICAgICBPayhmaWxlKQorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3BhcnNlX3N0b3JhZ2VfcmVjb3JkX3BiKCkgeworICAgICAgICBsZXQgdGV4dF9wcm90byA9IHIjIgorZmlsZXMgeworICAgIHZlcnNpb246IDAKKyAgICBjb250YWluZXI6ICJzeXN0ZW0iCisgICAgcGFja2FnZV9tYXA6ICIvc3lzdGVtL2V0Yy9wYWNrYWdlLm1hcCIKKyAgICBmbGFnX21hcDogIi9zeXN0ZW0vZXRjL2ZsYWcubWFwIgorICAgIGZsYWdfdmFsOiAiL21ldGFkYXRhL2Fjb25maWcvc3lzdGVtLnZhbCIKKyAgICB0aW1lc3RhbXA6IDEyMzQ1Cit9CitmaWxlcyB7CisgICAgdmVyc2lvbjogMQorICAgIGNvbnRhaW5lcjogInByb2R1Y3QiCisgICAgcGFja2FnZV9tYXA6ICIvcHJvZHVjdC9ldGMvcGFja2FnZS5tYXAiCisgICAgZmxhZ19tYXA6ICIvcHJvZHVjdC9ldGMvZmxhZy5tYXAiCisgICAgZmxhZ192YWw6ICIvbWV0YWRhdGEvYWNvbmZpZy9wcm9kdWN0LnZhbCIKKyAgICB0aW1lc3RhbXA6IDU0MzIxCit9CisiIzsKKyAgICAgICAgbGV0IGJpbmFyeV9wcm90b19ieXRlcyA9CisgICAgICAgICAgICBzdG9yYWdlX3JlY29yZF9wYjo6Z2V0X2JpbmFyeV9wcm90b19mcm9tX3RleHRfcHJvdG8odGV4dF9wcm90bykudW53cmFwKCk7CisgICAgICAgIGxldCBzdG9yYWdlX2ZpbGVzID0gc3RvcmFnZV9yZWNvcmRfcGI6OnRyeV9mcm9tX2JpbmFyeV9wcm90bygmYmluYXJ5X3Byb3RvX2J5dGVzKS51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxIShzdG9yYWdlX2ZpbGVzLmZpbGVzLmxlbigpLCAyKTsKKyAgICAgICAgbGV0IHN5c3RlbV9maWxlID0gJnN0b3JhZ2VfZmlsZXMuZmlsZXNbMF07CisgICAgICAgIGFzc2VydF9lcSEoc3lzdGVtX2ZpbGUudmVyc2lvbigpLCAwKTsKKyAgICAgICAgYXNzZXJ0X2VxIShzeXN0ZW1fZmlsZS5jb250YWluZXIoKSwgInN5c3RlbSIpOworICAgICAgICBhc3NlcnRfZXEhKHN5c3RlbV9maWxlLnBhY2thZ2VfbWFwKCksICIvc3lzdGVtL2V0Yy9wYWNrYWdlLm1hcCIpOworICAgICAgICBhc3NlcnRfZXEhKHN5c3RlbV9maWxlLmZsYWdfbWFwKCksICIvc3lzdGVtL2V0Yy9mbGFnLm1hcCIpOworICAgICAgICBhc3NlcnRfZXEhKHN5c3RlbV9maWxlLmZsYWdfdmFsKCksICIvbWV0YWRhdGEvYWNvbmZpZy9zeXN0ZW0udmFsIik7CisgICAgICAgIGFzc2VydF9lcSEoc3lzdGVtX2ZpbGUudGltZXN0YW1wKCksIDEyMzQ1KTsKKyAgICAgICAgbGV0IHByb2R1Y3RfZmlsZSA9ICZzdG9yYWdlX2ZpbGVzLmZpbGVzWzFdOworICAgICAgICBhc3NlcnRfZXEhKHByb2R1Y3RfZmlsZS52ZXJzaW9uKCksIDEpOworICAgICAgICBhc3NlcnRfZXEhKHByb2R1Y3RfZmlsZS5jb250YWluZXIoKSwgInByb2R1Y3QiKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwcm9kdWN0X2ZpbGUucGFja2FnZV9tYXAoKSwgIi9wcm9kdWN0L2V0Yy9wYWNrYWdlLm1hcCIpOworICAgICAgICBhc3NlcnRfZXEhKHByb2R1Y3RfZmlsZS5mbGFnX21hcCgpLCAiL3Byb2R1Y3QvZXRjL2ZsYWcubWFwIik7CisgICAgICAgIGFzc2VydF9lcSEocHJvZHVjdF9maWxlLmZsYWdfdmFsKCksICIvbWV0YWRhdGEvYWNvbmZpZy9wcm9kdWN0LnZhbCIpOworICAgICAgICBhc3NlcnRfZXEhKHByb2R1Y3RfZmlsZS50aW1lc3RhbXAoKSwgNTQzMjEpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3BhcnNlX2ludmFsaWRfc3RvcmFnZV9yZWNvcmRfcGIoKSB7CisgICAgICAgIGxldCB0ZXh0X3Byb3RvID0gciMiCitmaWxlcyB7CisgICAgdmVyc2lvbjogMAorICAgIGNvbnRhaW5lcjogInN5c3RlbSIKKyAgICBwYWNrYWdlX21hcDogIiIKKyAgICBmbGFnX21hcDogIi9zeXN0ZW0vZXRjL2ZsYWcubWFwIgorICAgIGZsYWdfdmFsOiAiL21ldGFkYXRhL2Fjb25maWcvc3lzdGVtLnZhbCIKKyAgICB0aW1lc3RhbXA6IDEyMzQ1Cit9CisiIzsKKyAgICAgICAgbGV0IGJpbmFyeV9wcm90b19ieXRlcyA9CisgICAgICAgICAgICBzdG9yYWdlX3JlY29yZF9wYjo6Z2V0X2JpbmFyeV9wcm90b19mcm9tX3RleHRfcHJvdG8odGV4dF9wcm90bykudW53cmFwKCk7CisgICAgICAgIGxldCBlcnIgPSBzdG9yYWdlX3JlY29yZF9wYjo6dHJ5X2Zyb21fYmluYXJ5X3Byb3RvKCZiaW5hcnlfcHJvdG9fYnl0ZXMpLnVud3JhcF9lcnIoKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIGZvcm1hdCEoIns6P30iLCBlcnIpLAorICAgICAgICAgICAgImludmFsaWQgc3RvcmFnZSBmaWxlIHJlY29yZDogbWlzc2luZyBwYWNrYWdlIG1hcCBmaWxlIGZvciBjb250YWluZXIgc3lzdGVtIgorICAgICAgICApOworCisgICAgICAgIGxldCB0ZXh0X3Byb3RvID0gciMiCitmaWxlcyB7CisgICAgdmVyc2lvbjogMAorICAgIGNvbnRhaW5lcjogInN5c3RlbSIKKyAgICBwYWNrYWdlX21hcDogIi9zeXN0ZW0vZXRjL3BhY2thZ2UubWFwIgorICAgIGZsYWdfbWFwOiAiIgorICAgIGZsYWdfdmFsOiAiL21ldGFkYXRhL2Fjb25maWcvc3lzdGVtLnZhbCIKKyAgICB0aW1lc3RhbXA6IDEyMzQ1Cit9CisiIzsKKyAgICAgICAgbGV0IGJpbmFyeV9wcm90b19ieXRlcyA9CisgICAgICAgICAgICBzdG9yYWdlX3JlY29yZF9wYjo6Z2V0X2JpbmFyeV9wcm90b19mcm9tX3RleHRfcHJvdG8odGV4dF9wcm90bykudW53cmFwKCk7CisgICAgICAgIGxldCBlcnIgPSBzdG9yYWdlX3JlY29yZF9wYjo6dHJ5X2Zyb21fYmluYXJ5X3Byb3RvKCZiaW5hcnlfcHJvdG9fYnl0ZXMpLnVud3JhcF9lcnIoKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIGZvcm1hdCEoIns6P30iLCBlcnIpLAorICAgICAgICAgICAgImludmFsaWQgc3RvcmFnZSBmaWxlIHJlY29yZDogbWlzc2luZyBmbGFnIG1hcCBmaWxlIGZvciBjb250YWluZXIgc3lzdGVtIgorICAgICAgICApOworCisgICAgICAgIGxldCB0ZXh0X3Byb3RvID0gciMiCitmaWxlcyB7CisgICAgdmVyc2lvbjogMAorICAgIGNvbnRhaW5lcjogInN5c3RlbSIKKyAgICBwYWNrYWdlX21hcDogIi9zeXN0ZW0vZXRjL3BhY2thZ2UubWFwIgorICAgIGZsYWdfbWFwOiAiL3N5c3RlbS9ldGMvZmxhZy5tYXAiCisgICAgZmxhZ192YWw6ICIiCisgICAgdGltZXN0YW1wOiAxMjM0NQorfQorIiM7CisgICAgICAgIGxldCBiaW5hcnlfcHJvdG9fYnl0ZXMgPQorICAgICAgICAgICAgc3RvcmFnZV9yZWNvcmRfcGI6OmdldF9iaW5hcnlfcHJvdG9fZnJvbV90ZXh0X3Byb3RvKHRleHRfcHJvdG8pLnVud3JhcCgpOworICAgICAgICBsZXQgZXJyID0gc3RvcmFnZV9yZWNvcmRfcGI6OnRyeV9mcm9tX2JpbmFyeV9wcm90bygmYmluYXJ5X3Byb3RvX2J5dGVzKS51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZXJyKSwKKyAgICAgICAgICAgICJpbnZhbGlkIHN0b3JhZ2UgZmlsZSByZWNvcmQ6IG1pc3NpbmcgZmxhZyB2YWwgZmlsZSBmb3IgY29udGFpbmVyIHN5c3RlbSIKKyAgICAgICAgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9zaXBfaGFzaGVyMTMucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9zaXBfaGFzaGVyMTMucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlMzE3NQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL3NpcF9oYXNoZXIxMy5ycwpAQCAtMCwwICsxLDMyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vISBBbiBpbXBsZW1lbnRhdGlvbiBvZiBTaXBIYXNoMTMKKwordXNlIHN0ZDo6Y21wOwordXNlIHN0ZDo6bWVtOwordXNlIHN0ZDo6cHRyOwordXNlIHN0ZDo6c2xpY2U7CisKK3VzZSBzdGQ6Omhhc2g6Okhhc2hlcjsKKworLy8vIEFuIGltcGxlbWVudGF0aW9uIG9mIFNpcEhhc2ggMi00LgorLy8vCisjW2Rlcml2ZShEZWJ1ZywgQ2xvbmUsIERlZmF1bHQpXQorcHViIHN0cnVjdCBTaXBIYXNoZXIxMyB7CisgICAgazA6IHU2NCwKKyAgICBrMTogdTY0LAorICAgIGxlbmd0aDogdXNpemUsIC8vIGhvdyBtYW55IGJ5dGVzIHdlJ3ZlIHByb2Nlc3NlZAorICAgIHN0YXRlOiBTdGF0ZSwgIC8vIGhhc2ggU3RhdGUKKyAgICB0YWlsOiB1NjQsICAgICAvLyB1bnByb2Nlc3NlZCBieXRlcyBsZQorICAgIG50YWlsOiB1c2l6ZSwgIC8vIGhvdyBtYW55IGJ5dGVzIGluIHRhaWwgYXJlIHZhbGlkCit9CisKKyNbZGVyaXZlKERlYnVnLCBDbG9uZSwgQ29weSwgRGVmYXVsdCldCisjW3JlcHIoQyldCitzdHJ1Y3QgU3RhdGUgeworICAgIC8vIHYwLCB2MiBhbmQgdjEsIHYzIHNob3cgdXAgaW4gcGFpcnMgaW4gdGhlIGFsZ29yaXRobSwKKyAgICAvLyBhbmQgc2ltZCBpbXBsZW1lbnRhdGlvbnMgb2YgU2lwSGFzaCB3aWxsIHVzZSB2ZWN0b3JzCisgICAgLy8gb2YgdjAyIGFuZCB2MTMuIEJ5IHBsYWNpbmcgdGhlbSBpbiB0aGlzIG9yZGVyIGluIHRoZSBzdHJ1Y3QsCisgICAgLy8gdGhlIGNvbXBpbGVyIGNhbiBwaWNrIHVwIG9uIGp1c3QgYSBmZXcgc2ltZCBvcHRpbWl6YXRpb25zIGJ5IGl0c2VsZi4KKyAgICB2MDogdTY0LAorICAgIHYyOiB1NjQsCisgICAgdjE6IHU2NCwKKyAgICB2MzogdTY0LAorfQorCittYWNyb19ydWxlcyEgY29tcHJlc3MgeworICAgICgkc3RhdGU6ZXhwcikgPT4ge3sKKyAgICAgICAgY29tcHJlc3MhKCRzdGF0ZS52MCwgJHN0YXRlLnYxLCAkc3RhdGUudjIsICRzdGF0ZS52MykKKyAgICB9fTsKKyAgICAoJHYwOmV4cHIsICR2MTpleHByLCAkdjI6ZXhwciwgJHYzOmV4cHIpID0+IHt7CisgICAgICAgICR2MCA9ICR2MC53cmFwcGluZ19hZGQoJHYxKTsKKyAgICAgICAgJHYxID0gJHYxLnJvdGF0ZV9sZWZ0KDEzKTsKKyAgICAgICAgJHYxIF49ICR2MDsKKyAgICAgICAgJHYwID0gJHYwLnJvdGF0ZV9sZWZ0KDMyKTsKKyAgICAgICAgJHYyID0gJHYyLndyYXBwaW5nX2FkZCgkdjMpOworICAgICAgICAkdjMgPSAkdjMucm90YXRlX2xlZnQoMTYpOworICAgICAgICAkdjMgXj0gJHYyOworICAgICAgICAkdjAgPSAkdjAud3JhcHBpbmdfYWRkKCR2Myk7CisgICAgICAgICR2MyA9ICR2My5yb3RhdGVfbGVmdCgyMSk7CisgICAgICAgICR2MyBePSAkdjA7CisgICAgICAgICR2MiA9ICR2Mi53cmFwcGluZ19hZGQoJHYxKTsKKyAgICAgICAgJHYxID0gJHYxLnJvdGF0ZV9sZWZ0KDE3KTsKKyAgICAgICAgJHYxIF49ICR2MjsKKyAgICAgICAgJHYyID0gJHYyLnJvdGF0ZV9sZWZ0KDMyKTsKKyAgICB9fTsKK30KKworLy8vIExvYWQgYW4gaW50ZWdlciBvZiB0aGUgZGVzaXJlZCB0eXBlIGZyb20gYSBieXRlIHN0cmVhbSwgaW4gTEUgb3JkZXIuIFVzZXMKKy8vLyBgY29weV9ub25vdmVybGFwcGluZ2AgdG8gbGV0IHRoZSBjb21waWxlciBnZW5lcmF0ZSB0aGUgbW9zdCBlZmZpY2llbnQgd2F5CisvLy8gdG8gbG9hZCBpdCBmcm9tIGEgcG9zc2libHkgdW5hbGlnbmVkIGFkZHJlc3MuCisvLy8KKy8vLyBVbnNhZmUgYmVjYXVzZTogdW5jaGVja2VkIGluZGV4aW5nIGF0IGkuLmkrc2l6ZV9vZihpbnRfdHkpCittYWNyb19ydWxlcyEgbG9hZF9pbnRfbGUgeworICAgICgkYnVmOmV4cHIsICRpOmV4cHIsICRpbnRfdHk6aWRlbnQpID0+IHt7CisgICAgICAgIGRlYnVnX2Fzc2VydCEoJGkgKyBtZW06OnNpemVfb2Y6OjwkaW50X3R5PigpIDw9ICRidWYubGVuKCkpOworICAgICAgICBsZXQgbXV0IGRhdGEgPSAwIGFzICRpbnRfdHk7CisgICAgICAgIHB0cjo6Y29weV9ub25vdmVybGFwcGluZygKKyAgICAgICAgICAgICRidWYuZ2V0X3VuY2hlY2tlZCgkaSksCisgICAgICAgICAgICAmbXV0IGRhdGEgYXMgKm11dCBfIGFzICptdXQgdTgsCisgICAgICAgICAgICBtZW06OnNpemVfb2Y6OjwkaW50X3R5PigpLAorICAgICAgICApOworICAgICAgICBkYXRhLnRvX2xlKCkKKyAgICB9fTsKK30KKworLy8vIExvYWQgYW4gdTY0IHVzaW5nIHVwIHRvIDcgYnl0ZXMgb2YgYSBieXRlIHNsaWNlLgorLy8vCisvLy8gVW5zYWZlIGJlY2F1c2U6IHVuY2hlY2tlZCBpbmRleGluZyBhdCBzdGFydC4uc3RhcnQrbGVuCisjW2lubGluZV0KK3Vuc2FmZSBmbiB1OHRvNjRfbGUoYnVmOiAmW3U4XSwgc3RhcnQ6IHVzaXplLCBsZW46IHVzaXplKSAtPiB1NjQgeworICAgIGRlYnVnX2Fzc2VydCEobGVuIDwgOCk7CisgICAgbGV0IG11dCBpID0gMDsgLy8gY3VycmVudCBieXRlIGluZGV4IChmcm9tIExTQikgaW4gdGhlIG91dHB1dCB1NjQKKyAgICBsZXQgbXV0IG91dCA9IDA7CisgICAgaWYgaSArIDMgPCBsZW4geworICAgICAgICBvdXQgPSBsb2FkX2ludF9sZSEoYnVmLCBzdGFydCArIGksIHUzMikgYXMgdTY0OworICAgICAgICBpICs9IDQ7CisgICAgfQorICAgIGlmIGkgKyAxIDwgbGVuIHsKKyAgICAgICAgb3V0IHw9IChsb2FkX2ludF9sZSEoYnVmLCBzdGFydCArIGksIHUxNikgYXMgdTY0KSA8PCAoaSAqIDgpOworICAgICAgICBpICs9IDIKKyAgICB9CisgICAgaWYgaSA8IGxlbiB7CisgICAgICAgIG91dCB8PSAoKmJ1Zi5nZXRfdW5jaGVja2VkKHN0YXJ0ICsgaSkgYXMgdTY0KSA8PCAoaSAqIDgpOworICAgICAgICBpICs9IDE7CisgICAgfQorICAgIGRlYnVnX2Fzc2VydF9lcSEoaSwgbGVuKTsKKyAgICBvdXQKK30KKworaW1wbCBTaXBIYXNoZXIxMyB7CisgICAgLy8vIENyZWF0ZXMgYSBuZXcgYFNpcEhhc2hlcjEzYCB3aXRoIHRoZSB0d28gaW5pdGlhbCBrZXlzIHNldCB0byAwLgorICAgICNbaW5saW5lXQorICAgIHB1YiBmbiBuZXcoKSAtPiBTaXBIYXNoZXIxMyB7CisgICAgICAgIFNpcEhhc2hlcjEzOjpuZXdfd2l0aF9rZXlzKDAsIDApCisgICAgfQorCisgICAgLy8vIENyZWF0ZXMgYSBgU2lwSGFzaGVyMTNgIHRoYXQgaXMga2V5ZWQgb2ZmIHRoZSBwcm92aWRlZCBrZXlzLgorICAgICNbaW5saW5lXQorICAgIHB1YiBmbiBuZXdfd2l0aF9rZXlzKGtleTA6IHU2NCwga2V5MTogdTY0KSAtPiBTaXBIYXNoZXIxMyB7CisgICAgICAgIGxldCBtdXQgc2lwX2hhc2hlciA9IFNpcEhhc2hlcjEzIHsKKyAgICAgICAgICAgIGswOiBrZXkwLAorICAgICAgICAgICAgazE6IGtleTEsCisgICAgICAgICAgICBsZW5ndGg6IDAsCisgICAgICAgICAgICBzdGF0ZTogU3RhdGUgeyB2MDogMCwgdjE6IDAsIHYyOiAwLCB2MzogMCB9LAorICAgICAgICAgICAgdGFpbDogMCwKKyAgICAgICAgICAgIG50YWlsOiAwLAorICAgICAgICB9OworICAgICAgICBzaXBfaGFzaGVyLnJlc2V0KCk7CisgICAgICAgIHNpcF9oYXNoZXIKKyAgICB9CisKKyAgICAjW2lubGluZV0KKyAgICBmbiBjX3JvdW5kcyhzdGF0ZTogJm11dCBTdGF0ZSkgeworICAgICAgICBjb21wcmVzcyEoc3RhdGUpOworICAgIH0KKworICAgICNbaW5saW5lXQorICAgIGZuIGRfcm91bmRzKHN0YXRlOiAmbXV0IFN0YXRlKSB7CisgICAgICAgIGNvbXByZXNzIShzdGF0ZSk7CisgICAgICAgIGNvbXByZXNzIShzdGF0ZSk7CisgICAgICAgIGNvbXByZXNzIShzdGF0ZSk7CisgICAgfQorCisgICAgI1tpbmxpbmVdCisgICAgZm4gcmVzZXQoJm11dCBzZWxmKSB7CisgICAgICAgIHNlbGYubGVuZ3RoID0gMDsKKyAgICAgICAgc2VsZi5zdGF0ZS52MCA9IHNlbGYuazAgXiAweDczNmY2ZDY1NzA3MzY1NzU7CisgICAgICAgIHNlbGYuc3RhdGUudjEgPSBzZWxmLmsxIF4gMHg2NDZmNzI2MTZlNjQ2ZjZkOworICAgICAgICBzZWxmLnN0YXRlLnYyID0gc2VsZi5rMCBeIDB4NmM3OTY3NjU2ZTY1NzI2MTsKKyAgICAgICAgc2VsZi5zdGF0ZS52MyA9IHNlbGYuazEgXiAweDc0NjU2NDYyNzk3NDY1NzM7CisgICAgICAgIHNlbGYubnRhaWwgPSAwOworICAgIH0KKworICAgIC8vIFNwZWNpYWxpemVkIHdyaXRlIGZ1bmN0aW9uIHRoYXQgaXMgb25seSB2YWxpZCBmb3IgYnVmZmVycyB3aXRoIGxlbiA8PSA4LgorICAgIC8vIEl0J3MgdXNlZCB0byBmb3JjZSBpbmxpbmluZyBvZiB3cml0ZV91OCBhbmQgd3JpdGVfdXNpemUsIHRob3NlIHdvdWxkIG5vcm1hbGx5IGJlIGlubGluZWQKKyAgICAvLyBleGNlcHQgZm9yIGNvbXBvc2l0ZSB0eXBlcyAodGhhdCBpbmNsdWRlcyBzbGljZXMgYW5kIHN0ciBoYXNoaW5nIGJlY2F1c2Ugb2YgZGVsaW1pdGVyKS4KKyAgICAvLyBXaXRob3V0IHRoaXMgZXh0cmEgcHVzaCB0aGUgY29tcGlsZXIgaXMgdmVyeSByZWx1Y3RhbnQgdG8gaW5saW5lIGRlbGltaXRlciB3cml0ZXMsCisgICAgLy8gZGVncmFkaW5nIHBlcmZvcm1hbmNlIHN1YnN0YW50aWFsbHkgZm9yIHRoZSBtb3N0IGNvbW1vbiB1c2UgY2FzZXMuCisgICAgI1tpbmxpbmVdCisgICAgZm4gc2hvcnRfd3JpdGUoJm11dCBzZWxmLCBtc2c6ICZbdThdKSB7CisgICAgICAgIGRlYnVnX2Fzc2VydCEobXNnLmxlbigpIDw9IDgpOworICAgICAgICBsZXQgbGVuZ3RoID0gbXNnLmxlbigpOworICAgICAgICBzZWxmLmxlbmd0aCArPSBsZW5ndGg7CisKKyAgICAgICAgbGV0IG5lZWRlZCA9IDggLSBzZWxmLm50YWlsOworICAgICAgICBsZXQgZmlsbCA9IGNtcDo6bWluKGxlbmd0aCwgbmVlZGVkKTsKKyAgICAgICAgaWYgZmlsbCA9PSA4IHsKKyAgICAgICAgICAgIC8vIHNhZmUgdG8gY2FsbCBzaW5jZSBtc2cgaGFzbid0IGJlZW4gbG9hZGVkCisgICAgICAgICAgICBzZWxmLnRhaWwgPSB1bnNhZmUgeyBsb2FkX2ludF9sZSEobXNnLCAwLCB1NjQpIH07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBzYWZlIHRvIGNhbGwgc2luY2UgbXNnIGhhc24ndCBiZWVuIGxvYWRlZCwgYW5kIGZpbGwgPD0gbXNnLmxlbigpCisgICAgICAgICAgICBzZWxmLnRhaWwgfD0gdW5zYWZlIHsgdTh0bzY0X2xlKG1zZywgMCwgZmlsbCkgfSA8PCAoOCAqIHNlbGYubnRhaWwpOworICAgICAgICAgICAgaWYgbGVuZ3RoIDwgbmVlZGVkIHsKKyAgICAgICAgICAgICAgICBzZWxmLm50YWlsICs9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2VsZi5zdGF0ZS52MyBePSBzZWxmLnRhaWw7CisgICAgICAgIFNlbGY6OmNfcm91bmRzKCZtdXQgc2VsZi5zdGF0ZSk7CisgICAgICAgIHNlbGYuc3RhdGUudjAgXj0gc2VsZi50YWlsOworCisgICAgICAgIC8vIEJ1ZmZlcmVkIHRhaWwgaXMgbm93IGZsdXNoZWQsIHByb2Nlc3MgbmV3IGlucHV0LgorICAgICAgICBzZWxmLm50YWlsID0gbGVuZ3RoIC0gbmVlZGVkOworICAgICAgICAvLyBzYWZlIHRvIGNhbGwgc2luY2UgbnVtYmVyIG9mIGBuZWVkZWRgIGJ5dGVzIGhhcyBiZWVuIGxvYWRlZAorICAgICAgICAvLyBhbmQgc2VsZi5udGFpbCArIG5lZWRlZCA9PSBtc2cubGVuKCkKKyAgICAgICAgc2VsZi50YWlsID0gdW5zYWZlIHsgdTh0bzY0X2xlKG1zZywgbmVlZGVkLCBzZWxmLm50YWlsKSB9OworICAgIH0KK30KKworaW1wbCBIYXNoZXIgZm9yIFNpcEhhc2hlcjEzIHsKKyAgICAvLyBzZWUgc2hvcnRfd3JpdGUgY29tbWVudCBmb3IgZXhwbGFuYXRpb24KKyAgICAjW2lubGluZV0KKyAgICBmbiB3cml0ZV91c2l6ZSgmbXV0IHNlbGYsIGk6IHVzaXplKSB7CisgICAgICAgIC8vIHNhZmUgdG8gY2FsbCwgc2luY2UgY29udmVydCB0aGUgcG9pbnRlciB0byB1OAorICAgICAgICBsZXQgYnl0ZXMgPSB1bnNhZmUgeworICAgICAgICAgICAgc2xpY2U6OmZyb21fcmF3X3BhcnRzKCZpIGFzICpjb25zdCB1c2l6ZSBhcyAqY29uc3QgdTgsIG1lbTo6c2l6ZV9vZjo6PHVzaXplPigpKQorICAgICAgICB9OworICAgICAgICBzZWxmLnNob3J0X3dyaXRlKGJ5dGVzKTsKKyAgICB9CisKKyAgICAvLyBzZWUgc2hvcnRfd3JpdGUgY29tbWVudCBmb3IgZXhwbGFuYXRpb24KKyAgICAjW2lubGluZV0KKyAgICBmbiB3cml0ZV91OCgmbXV0IHNlbGYsIGk6IHU4KSB7CisgICAgICAgIHNlbGYuc2hvcnRfd3JpdGUoJltpXSk7CisgICAgfQorCisgICAgI1tpbmxpbmVdCisgICAgZm4gd3JpdGUoJm11dCBzZWxmLCBtc2c6ICZbdThdKSB7CisgICAgICAgIGxldCBsZW5ndGggPSBtc2cubGVuKCk7CisgICAgICAgIHNlbGYubGVuZ3RoICs9IGxlbmd0aDsKKworICAgICAgICBsZXQgbXV0IG5lZWRlZCA9IDA7CisKKyAgICAgICAgLy8gbG9hZGluZyB1bnByb2Nlc3NlZCBieXRlIGZyb20gbGFzdCB3cml0ZQorICAgICAgICBpZiBzZWxmLm50YWlsICE9IDAgeworICAgICAgICAgICAgbmVlZGVkID0gOCAtIHNlbGYubnRhaWw7CisgICAgICAgICAgICAvLyBzYWZlIHRvIGNhbGwsIHNpbmNlIG1zZyBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQKKyAgICAgICAgICAgIC8vIGFuZCBjbXA6Om1pbihsZW5ndGgsIG5lZWRlZCkgPCA4CisgICAgICAgICAgICBzZWxmLnRhaWwgfD0gdW5zYWZlIHsgdTh0bzY0X2xlKG1zZywgMCwgY21wOjptaW4obGVuZ3RoLCBuZWVkZWQpKSB9IDw8IDggKiBzZWxmLm50YWlsOworICAgICAgICAgICAgaWYgbGVuZ3RoIDwgbmVlZGVkIHsKKyAgICAgICAgICAgICAgICBzZWxmLm50YWlsICs9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUudjMgXj0gc2VsZi50YWlsOworICAgICAgICAgICAgICAgIFNlbGY6OmNfcm91bmRzKCZtdXQgc2VsZi5zdGF0ZSk7CisgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZS52MCBePSBzZWxmLnRhaWw7CisgICAgICAgICAgICAgICAgc2VsZi5udGFpbCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBCdWZmZXJlZCB0YWlsIGlzIG5vdyBmbHVzaGVkLCBwcm9jZXNzIG5ldyBpbnB1dC4KKyAgICAgICAgbGV0IGxlbiA9IGxlbmd0aCAtIG5lZWRlZDsKKyAgICAgICAgbGV0IGxlZnQgPSBsZW4gJiAweDc7CisKKyAgICAgICAgbGV0IG11dCBpID0gbmVlZGVkOworICAgICAgICB3aGlsZSBpIDwgbGVuIC0gbGVmdCB7CisgICAgICAgICAgICAvLyBzYWZlIHRvIGNhbGwgc2luY2UgaWYgaSA8IGxlbiAtIGxlZnQsIGl0IG1lYW5zIG1zZyBoYXMgYXQgbGVhc3QgMSBieXRlIHRvIGxvYWQKKyAgICAgICAgICAgIGxldCBtaSA9IHVuc2FmZSB7IGxvYWRfaW50X2xlIShtc2csIGksIHU2NCkgfTsKKworICAgICAgICAgICAgc2VsZi5zdGF0ZS52MyBePSBtaTsKKyAgICAgICAgICAgIFNlbGY6OmNfcm91bmRzKCZtdXQgc2VsZi5zdGF0ZSk7CisgICAgICAgICAgICBzZWxmLnN0YXRlLnYwIF49IG1pOworCisgICAgICAgICAgICBpICs9IDg7CisgICAgICAgIH0KKworICAgICAgICAvLyBzYWZlIHRvIGNhbGwgc2luY2UgaWYgbGVmdCA9PSAwLCBzaW5jZSB0aGlzIGNhbGwgd2lsbCBsb2FkIG5vdGhpbmcKKyAgICAgICAgLy8gaWYgbGVmdCA+IDAsIGl0IG1lYW5zIHRoZXJlIGFyZSBudW1iZXIgb2YgYGxlZnRgIGJ5dGVzIGluIG1zZworICAgICAgICBzZWxmLnRhaWwgPSB1bnNhZmUgeyB1OHRvNjRfbGUobXNnLCBpLCBsZWZ0KSB9OworICAgICAgICBzZWxmLm50YWlsID0gbGVmdDsKKyAgICB9CisKKyAgICAjW2lubGluZV0KKyAgICBmbiBmaW5pc2goJnNlbGYpIC0+IHU2NCB7CisgICAgICAgIGxldCBtdXQgc3RhdGUgPSBzZWxmLnN0YXRlOworCisgICAgICAgIGxldCBiOiB1NjQgPSAoKHNlbGYubGVuZ3RoIGFzIHU2NCAmIDB4ZmYpIDw8IDU2KSB8IHNlbGYudGFpbDsKKworICAgICAgICBzdGF0ZS52MyBePSBiOworICAgICAgICBTZWxmOjpjX3JvdW5kcygmbXV0IHN0YXRlKTsKKyAgICAgICAgc3RhdGUudjAgXj0gYjsKKworICAgICAgICBzdGF0ZS52MiBePSAweGZmOworICAgICAgICBTZWxmOjpkX3JvdW5kcygmbXV0IHN0YXRlKTsKKworICAgICAgICBzdGF0ZS52MCBeIHN0YXRlLnYxIF4gc3RhdGUudjIgXiBzdGF0ZS52MworICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKworICAgIHVzZSBzdGQ6Omhhc2g6OntIYXNoLCBIYXNoZXJ9OworICAgIHVzZSBzdGQ6OnN0cmluZzo6U3RyaW5nOworCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRoZSB2YWx1ZSBsaXN0IHNlcmlhbGl6YXRpb24KKyAgICBmbiB0ZXN0X3NpcF9oYXNoMTNfc3RyaW5nX2hhc2goKSB7CisgICAgICAgIGxldCBtdXQgc2lwX2hhc2gxMyA9IFNpcEhhc2hlcjEzOjpuZXcoKTsKKyAgICAgICAgbGV0IHRlc3Rfc3RyMSA9IFN0cmluZzo6ZnJvbSgiY29tLmdvb2dsZS5hbmRyb2lkLnRlc3QiKTsKKyAgICAgICAgdGVzdF9zdHIxLmhhc2goJm11dCBzaXBfaGFzaDEzKTsKKyAgICAgICAgYXNzZXJ0X2VxISgxNzg5ODgzODY2OTA2NzA2NzU4NSwgc2lwX2hhc2gxMy5maW5pc2goKSk7CisKKyAgICAgICAgbGV0IHRlc3Rfc3RyMiA9IFN0cmluZzo6ZnJvbSgiYWRmYWRmYWRmIGFkZmFmYWRhZGYgMTIzMTI0MTI0MSIpOworICAgICAgICB0ZXN0X3N0cjIuaGFzaCgmbXV0IHNpcF9oYXNoMTMpOworICAgICAgICBhc3NlcnRfZXEhKDEzNTQzNTE4OTg3NjcyODg5MzEwLCBzaXBfaGFzaDEzLmZpbmlzaCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9zaXBfaGFzaDEzX3dyaXRlKCkgeworICAgICAgICBsZXQgbXV0IHNpcF9oYXNoMTMgPSBTaXBIYXNoZXIxMzo6bmV3KCk7CisgICAgICAgIGxldCB0ZXN0X3N0cjEgPSBTdHJpbmc6OmZyb20oImNvbS5nb29nbGUuYW5kcm9pZC50ZXN0Iik7CisgICAgICAgIHNpcF9oYXNoMTMud3JpdGUodGVzdF9zdHIxLmFzX2J5dGVzKCkpOworICAgICAgICBzaXBfaGFzaDEzLndyaXRlX3U4KDB4ZmYpOworICAgICAgICBhc3NlcnRfZXEhKDE3ODk4ODM4NjY5MDY3MDY3NTg1LCBzaXBfaGFzaDEzLmZpbmlzaCgpKTsKKworICAgICAgICBsZXQgbXV0IHNpcF9oYXNoMTMyID0gU2lwSGFzaGVyMTM6Om5ldygpOworICAgICAgICBsZXQgdGVzdF9zdHIxID0gU3RyaW5nOjpmcm9tKCJjb20uZ29vZ2xlLmFuZHJvaWQudGVzdCIpOworICAgICAgICBzaXBfaGFzaDEzMi53cml0ZSh0ZXN0X3N0cjEuYXNfYnl0ZXMoKSk7CisgICAgICAgIGFzc2VydF9lcSEoOTY4NTQ0MDk2OTY4NTIwOTAyNSwgc2lwX2hhc2gxMzIuZmluaXNoKCkpOworICAgICAgICBzaXBfaGFzaDEzMi53cml0ZSh0ZXN0X3N0cjEuYXNfYnl0ZXMoKSk7CisgICAgICAgIGFzc2VydF9lcSEoNjcxOTY5NDE3NjY2MjczNjU2OCwgc2lwX2hhc2gxMzIuZmluaXNoKCkpOworCisgICAgICAgIGxldCBtdXQgc2lwX2hhc2gxMzMgPSBTaXBIYXNoZXIxMzo6bmV3KCk7CisgICAgICAgIGxldCB0ZXN0X3N0cjIgPSBTdHJpbmc6OmZyb20oImFiY2RlZmciKTsKKyAgICAgICAgdGVzdF9zdHIyLmhhc2goJm11dCBzaXBfaGFzaDEzMyk7CisgICAgICAgIGFzc2VydF9lcSEoMjQ5MjE2MTA0NzMyNzY0MDI5Nywgc2lwX2hhc2gxMzMuZmluaXNoKCkpOworCisgICAgICAgIGxldCBtdXQgc2lwX2hhc2gxMzQgPSBTaXBIYXNoZXIxMzo6bmV3KCk7CisgICAgICAgIGxldCB0ZXN0X3N0cjMgPSBTdHJpbmc6OmZyb20oImFiY2RlZmdoIik7CisgICAgICAgIHRlc3Rfc3RyMy5oYXNoKCZtdXQgc2lwX2hhc2gxMzQpOworICAgICAgICBhc3NlcnRfZXEhKDY2ODk5MjczNzA0MzU1NTQzMjYsIHNpcF9oYXNoMTM0LmZpbmlzaCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9zaXBfaGFzaDEzX3dyaXRlX3Nob3J0KCkgeworICAgICAgICBsZXQgbXV0IHNpcF9oYXNoMTMgPSBTaXBIYXNoZXIxMzo6bmV3KCk7CisgICAgICAgIHNpcF9oYXNoMTMud3JpdGVfdTgoMHg2MSk7CisgICAgICAgIGFzc2VydF9lcSEoNDY0NDQxNzE4NTYwMzMyODAxOSwgc2lwX2hhc2gxMy5maW5pc2goKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvdGVzdF91dGlscy5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL3Rlc3RfdXRpbHMucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M2MDNkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL3Rlc3RfdXRpbHMucnMKQEAgLTAsMCArMSwxODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2UgY3JhdGU6OmZsYWdfaW5mbzo6e0ZsYWdJbmZvSGVhZGVyLCBGbGFnSW5mb0xpc3QsIEZsYWdJbmZvTm9kZX07Cit1c2UgY3JhdGU6OmZsYWdfdGFibGU6OntGbGFnVGFibGUsIEZsYWdUYWJsZUhlYWRlciwgRmxhZ1RhYmxlTm9kZX07Cit1c2UgY3JhdGU6OmZsYWdfdmFsdWU6OntGbGFnVmFsdWVIZWFkZXIsIEZsYWdWYWx1ZUxpc3R9OwordXNlIGNyYXRlOjpwYWNrYWdlX3RhYmxlOjp7UGFja2FnZVRhYmxlLCBQYWNrYWdlVGFibGVIZWFkZXIsIFBhY2thZ2VUYWJsZU5vZGV9OwordXNlIGNyYXRlOjp7QWNvbmZpZ1N0b3JhZ2VFcnJvciwgU3RvcmFnZUZpbGVUeXBlLCBTdG9yZWRGbGFnVHlwZX07CisKK3VzZSBhbnlob3c6OmFueWhvdzsKK3VzZSBzdGQ6OmlvOjpXcml0ZTsKK3VzZSB0ZW1wZmlsZTo6TmFtZWRUZW1wRmlsZTsKKworcHViIGZuIGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUodmVyc2lvbjogdTMyKSAtPiBQYWNrYWdlVGFibGUgeworICAgIGxldCBoZWFkZXIgPSBQYWNrYWdlVGFibGVIZWFkZXIgeworICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uLAorICAgICAgICBjb250YWluZXI6IFN0cmluZzo6ZnJvbSgibW9ja3VwIiksCisgICAgICAgIGZpbGVfdHlwZTogU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwIGFzIHU4LAorICAgICAgICBmaWxlX3NpemU6IG1hdGNoIHZlcnNpb24geworICAgICAgICAgICAgMSA9PiAyMDksCisgICAgICAgICAgICAyID0+IDIzMywKKyAgICAgICAgICAgIF8gPT4gcGFuaWMhKCJVbnN1cHBvcnRlZCB2ZXJzaW9uLiIpLAorICAgICAgICB9LAorICAgICAgICBudW1fcGFja2FnZXM6IDMsCisgICAgICAgIGJ1Y2tldF9vZmZzZXQ6IDMxLAorICAgICAgICBub2RlX29mZnNldDogNTksCisgICAgfTsKKyAgICBsZXQgYnVja2V0czogVmVjPE9wdGlvbjx1MzI+PiA9IG1hdGNoIHZlcnNpb24geworICAgICAgICAxID0+IHZlYyFbU29tZSg1OSksIE5vbmUsIE5vbmUsIFNvbWUoMTA5KSwgTm9uZSwgTm9uZSwgTm9uZV0sCisgICAgICAgIDIgPT4gdmVjIVtTb21lKDU5KSwgTm9uZSwgTm9uZSwgU29tZSgxMTcpLCBOb25lLCBOb25lLCBOb25lXSwKKyAgICAgICAgXyA9PiBwYW5pYyEoIlVuc3VwcG9ydGVkIHZlcnNpb24uIiksCisgICAgfTsKKyAgICBsZXQgZmlyc3Rfbm9kZSA9IFBhY2thZ2VUYWJsZU5vZGUgeworICAgICAgICBwYWNrYWdlX25hbWU6IFN0cmluZzo6ZnJvbSgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIpLAorICAgICAgICBwYWNrYWdlX2lkOiAxLAorICAgICAgICBmaW5nZXJwcmludDogbWF0Y2ggdmVyc2lvbiB7CisgICAgICAgICAgICAxID0+IDAsCisgICAgICAgICAgICAyID0+IDQ0MzE5NDA1MDIyNzQ4NTc5NjR1NjQsCisgICAgICAgICAgICBfID0+IHBhbmljISgiVW5zdXBwb3J0ZWQgdmVyc2lvbi4iKSwKKyAgICAgICAgfSwKKyAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleDogMywKKyAgICAgICAgbmV4dF9vZmZzZXQ6IE5vbmUsCisgICAgfTsKKyAgICBsZXQgc2Vjb25kX25vZGUgPSBQYWNrYWdlVGFibGVOb2RlIHsKKyAgICAgICAgcGFja2FnZV9uYW1lOiBTdHJpbmc6OmZyb20oImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiKSwKKyAgICAgICAgcGFja2FnZV9pZDogMCwKKyAgICAgICAgZmluZ2VycHJpbnQ6IG1hdGNoIHZlcnNpb24geworICAgICAgICAgICAgMSA9PiAwLAorICAgICAgICAgICAgMiA9PiAxNTI0ODk0ODUxMDU5MDE1ODA4NnU2NCwKKyAgICAgICAgICAgIF8gPT4gcGFuaWMhKCJVbnN1cHBvcnRlZCB2ZXJzaW9uLiIpLAorICAgICAgICB9LAorICAgICAgICBib29sZWFuX3N0YXJ0X2luZGV4OiAwLAorICAgICAgICBuZXh0X29mZnNldDogbWF0Y2ggdmVyc2lvbiB7CisgICAgICAgICAgICAxID0+IFNvbWUoMTU5KSwKKyAgICAgICAgICAgIDIgPT4gU29tZSgxNzUpLAorICAgICAgICAgICAgXyA9PiBwYW5pYyEoIlVuc3VwcG9ydGVkIHZlcnNpb24uIiksCisgICAgICAgIH0sCisgICAgfTsKKyAgICBsZXQgdGhpcmRfbm9kZSA9IFBhY2thZ2VUYWJsZU5vZGUgeworICAgICAgICBwYWNrYWdlX25hbWU6IFN0cmluZzo6ZnJvbSgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIpLAorICAgICAgICBwYWNrYWdlX2lkOiAyLAorICAgICAgICBmaW5nZXJwcmludDogbWF0Y2ggdmVyc2lvbiB7CisgICAgICAgICAgICAxID0+IDAsCisgICAgICAgICAgICAyID0+IDE2MjMzMjI5OTE3NzExNjIyMzc1dTY0LAorICAgICAgICAgICAgXyA9PiBwYW5pYyEoIlVuc3VwcG9ydGVkIHZlcnNpb24uIiksCisgICAgICAgIH0sCisgICAgICAgIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDYsCisgICAgICAgIG5leHRfb2Zmc2V0OiBOb25lLAorICAgIH07CisgICAgbGV0IG5vZGVzID0gdmVjIVtmaXJzdF9ub2RlLCBzZWNvbmRfbm9kZSwgdGhpcmRfbm9kZV07CisgICAgUGFja2FnZVRhYmxlIHsgaGVhZGVyLCBidWNrZXRzLCBub2RlcyB9Cit9CisKK2ltcGwgRmxhZ1RhYmxlTm9kZSB7CisgICAgLy8gY3JlYXRlIHRlc3QgYmFzZWxpbmUsIHN5bnRhY3RpYyBzdWdhcgorICAgIGZuIG5ld19leHBlY3RlZCgKKyAgICAgICAgcGFja2FnZV9pZDogdTMyLAorICAgICAgICBmbGFnX25hbWU6ICZzdHIsCisgICAgICAgIGZsYWdfdHlwZTogdTE2LAorICAgICAgICBmbGFnX2luZGV4OiB1MTYsCisgICAgICAgIG5leHRfb2Zmc2V0OiBPcHRpb248dTMyPiwKKyAgICApIC0+IFNlbGYgeworICAgICAgICBTZWxmIHsKKyAgICAgICAgICAgIHBhY2thZ2VfaWQsCisgICAgICAgICAgICBmbGFnX25hbWU6IGZsYWdfbmFtZS50b19zdHJpbmcoKSwKKyAgICAgICAgICAgIGZsYWdfdHlwZTogU3RvcmVkRmxhZ1R5cGU6OnRyeV9mcm9tKGZsYWdfdHlwZSkudW53cmFwKCksCisgICAgICAgICAgICBmbGFnX2luZGV4LAorICAgICAgICAgICAgbmV4dF9vZmZzZXQsCisgICAgICAgIH0KKyAgICB9Cit9CisKK3B1YiBmbiBjcmVhdGVfdGVzdF9mbGFnX3RhYmxlKHZlcnNpb246IHUzMikgLT4gRmxhZ1RhYmxlIHsKKyAgICBsZXQgaGVhZGVyID0gRmxhZ1RhYmxlSGVhZGVyIHsKKyAgICAgICAgdmVyc2lvbjogdmVyc2lvbiwKKyAgICAgICAgY29udGFpbmVyOiBTdHJpbmc6OmZyb20oIm1vY2t1cCIpLAorICAgICAgICBmaWxlX3R5cGU6IFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ01hcCBhcyB1OCwKKyAgICAgICAgZmlsZV9zaXplOiAzMjEsCisgICAgICAgIG51bV9mbGFnczogOCwKKyAgICAgICAgYnVja2V0X29mZnNldDogMzEsCisgICAgICAgIG5vZGVfb2Zmc2V0OiA5OSwKKyAgICB9OworICAgIGxldCBidWNrZXRzOiBWZWM8T3B0aW9uPHUzMj4+ID0gdmVjIVsKKyAgICAgICAgU29tZSg5OSksCisgICAgICAgIFNvbWUoMTI1KSwKKyAgICAgICAgTm9uZSwKKyAgICAgICAgTm9uZSwKKyAgICAgICAgTm9uZSwKKyAgICAgICAgTm9uZSwKKyAgICAgICAgU29tZSgxNzcpLAorICAgICAgICBTb21lKDIwNCksCisgICAgICAgIE5vbmUsCisgICAgICAgIFNvbWUoMjYyKSwKKyAgICAgICAgTm9uZSwKKyAgICAgICAgTm9uZSwKKyAgICAgICAgTm9uZSwKKyAgICAgICAgTm9uZSwKKyAgICAgICAgTm9uZSwKKyAgICAgICAgU29tZSgyOTQpLAorICAgICAgICBOb25lLAorICAgIF07CisgICAgbGV0IG5vZGVzID0gdmVjIVsKKyAgICAgICAgRmxhZ1RhYmxlTm9kZTo6bmV3X2V4cGVjdGVkKDAsICJlbmFibGVkX3JvIiwgMSwgMSwgTm9uZSksCisgICAgICAgIEZsYWdUYWJsZU5vZGU6Om5ld19leHBlY3RlZCgwLCAiZW5hYmxlZF9ydyIsIDAsIDIsIFNvbWUoMTUxKSksCisgICAgICAgIEZsYWdUYWJsZU5vZGU6Om5ld19leHBlY3RlZCgyLCAiZW5hYmxlZF9ydyIsIDAsIDEsIE5vbmUpLAorICAgICAgICBGbGFnVGFibGVOb2RlOjpuZXdfZXhwZWN0ZWQoMSwgImRpc2FibGVkX3J3IiwgMCwgMCwgTm9uZSksCisgICAgICAgIEZsYWdUYWJsZU5vZGU6Om5ld19leHBlY3RlZCgxLCAiZW5hYmxlZF9maXhlZF9ybyIsIDIsIDEsIFNvbWUoMjM2KSksCisgICAgICAgIEZsYWdUYWJsZU5vZGU6Om5ld19leHBlY3RlZCgxLCAiZW5hYmxlZF9ybyIsIDEsIDIsIE5vbmUpLAorICAgICAgICBGbGFnVGFibGVOb2RlOjpuZXdfZXhwZWN0ZWQoMiwgImVuYWJsZWRfZml4ZWRfcm8iLCAyLCAwLCBOb25lKSwKKyAgICAgICAgRmxhZ1RhYmxlTm9kZTo6bmV3X2V4cGVjdGVkKDAsICJkaXNhYmxlZF9ydyIsIDAsIDAsIE5vbmUpLAorICAgIF07CisgICAgRmxhZ1RhYmxlIHsgaGVhZGVyLCBidWNrZXRzLCBub2RlcyB9Cit9CisKK3B1YiBmbiBjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QodmVyc2lvbjogdTMyKSAtPiBGbGFnVmFsdWVMaXN0IHsKKyAgICBsZXQgaGVhZGVyID0gRmxhZ1ZhbHVlSGVhZGVyIHsKKyAgICAgICAgdmVyc2lvbjogdmVyc2lvbiwKKyAgICAgICAgY29udGFpbmVyOiBTdHJpbmc6OmZyb20oIm1vY2t1cCIpLAorICAgICAgICBmaWxlX3R5cGU6IFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCBhcyB1OCwKKyAgICAgICAgZmlsZV9zaXplOiAzNSwKKyAgICAgICAgbnVtX2ZsYWdzOiA4LAorICAgICAgICBib29sZWFuX3ZhbHVlX29mZnNldDogMjcsCisgICAgfTsKKyAgICBsZXQgYm9vbGVhbnM6IFZlYzxib29sPiA9IHZlYyFbZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlXTsKKyAgICBGbGFnVmFsdWVMaXN0IHsgaGVhZGVyLCBib29sZWFucyB9Cit9CisKK3B1YiBmbiBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdCh2ZXJzaW9uOiB1MzIpIC0+IEZsYWdJbmZvTGlzdCB7CisgICAgbGV0IGhlYWRlciA9IEZsYWdJbmZvSGVhZGVyIHsKKyAgICAgICAgdmVyc2lvbjogdmVyc2lvbiwKKyAgICAgICAgY29udGFpbmVyOiBTdHJpbmc6OmZyb20oIm1vY2t1cCIpLAorICAgICAgICBmaWxlX3R5cGU6IFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ0luZm8gYXMgdTgsCisgICAgICAgIGZpbGVfc2l6ZTogMzUsCisgICAgICAgIG51bV9mbGFnczogOCwKKyAgICAgICAgYm9vbGVhbl9mbGFnX29mZnNldDogMjcsCisgICAgfTsKKyAgICBsZXQgaXNfZmxhZ19ydyA9IFt0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZV07CisgICAgbGV0IG5vZGVzID0gaXNfZmxhZ19ydy5pdGVyKCkubWFwKHwmcnd8IEZsYWdJbmZvTm9kZTo6Y3JlYXRlKHJ3KSkuY29sbGVjdCgpOworICAgIEZsYWdJbmZvTGlzdCB7IGhlYWRlciwgbm9kZXMgfQorfQorCitwdWIgZm4gd3JpdGVfYnl0ZXNfdG9fdGVtcF9maWxlKGJ5dGVzOiAmW3U4XSkgLT4gUmVzdWx0PE5hbWVkVGVtcEZpbGUsIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICBsZXQgbXV0IGZpbGUgPSBOYW1lZFRlbXBGaWxlOjpuZXcoKS5tYXBfZXJyKHxffCB7CisgICAgICAgIEFjb25maWdTdG9yYWdlRXJyb3I6OkZpbGVDcmVhdGlvbkZhaWwoYW55aG93ISgiRmFpbGVkIHRvIGNyZWF0ZSB0ZW1wIGZpbGUiKSkKKyAgICB9KT87CisgICAgbGV0IF8gPSBmaWxlLndyaXRlX2FsbCgmYnl0ZXMpOworICAgIE9rKGZpbGUpCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24uamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9BY29uZmlnU3RvcmFnZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNGM1NWQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7CisKKy8qKgorICogRXhjZXB0aW9uIHRocm93biB3aGVuIGFuIGVycm9yIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgQWNvbmZpZyBTdG9yYWdlLgorICoKKyAqIDxwPlRoaXMgZXhjZXB0aW9uIGluZGljYXRlcyBhIGdlbmVyYWwgcHJvYmxlbSB3aXRoIEFjb25maWcgU3RvcmFnZSwgc3VjaCBhcyBhbiBpbmFiaWxpdHkgdG8gcmVhZAorICogb3Igd3JpdGUgZGF0YS4KKyAqLworcHVibGljIGNsYXNzIEFjb25maWdTdG9yYWdlRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisKKyAgICAvKiogR2VuZXJpYyBlcnJvciBjb2RlIGluZGljYXRpbmcgYW4gdW5zcGVjaWZpZWQgQWNvbmZpZyBTdG9yYWdlIGVycm9yLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0dFTkVSSUMgPSAwOworCisgICAgLyoqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBBY29uZmlnIFN0b3JhZ2Ugc3lzdGVtIGlzIG5vdCBmb3VuZCBvbiB0aGUgZGV2aWNlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1NUT1JBR0VfU1lTVEVNX05PVF9GT1VORCA9IDE7CisKKyAgICAvKiogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlcXVlc3RlZCBjb25maWd1cmF0aW9uIHBhY2thZ2UgaXMgbm90IGZvdW5kLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1BBQ0tBR0VfTk9UX0ZPVU5EID0gMjsKKworICAgIC8qKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lciBpcyBub3QgZm91bmQuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfQ09OVEFJTkVSX05PVF9GT1VORCA9IDM7CisKKyAgICAvKiogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgdGhlIEFjb25maWcgU3RvcmFnZSBmaWxlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0NBTk5PVF9SRUFEX1NUT1JBR0VfRklMRSA9IDQ7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9GSUxFX0ZJTkdFUlBSSU5UX01JU01BVENIID0gNTsKKworICAgIHByaXZhdGUgZmluYWwgaW50IG1FcnJvckNvZGU7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbn0gd2l0aCBhIGdlbmVyaWMgZXJyb3IgY29kZSBhbmQgdGhlIHNwZWNpZmllZAorICAgICAqIGRldGFpbCBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIG1zZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgICAgIHN1cGVyKG1zZyk7CisgICAgICAgIG1FcnJvckNvZGUgPSBFUlJPUl9HRU5FUklDOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEFjb25maWdTdG9yYWdlRXhjZXB0aW9ufSB3aXRoIGEgZ2VuZXJpYyBlcnJvciBjb2RlLCB0aGUgc3BlY2lmaWVkCisgICAgICogZGV0YWlsIG1lc3NhZ2UsIGFuZCBjYXVzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2cgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gY2F1c2UgVGhlIGNhdXNlIG9mIHRoaXMgZXhjZXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIobXNnLCBjYXVzZSk7CisgICAgICAgIG1FcnJvckNvZGUgPSBFUlJPUl9HRU5FUklDOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEFjb25maWdTdG9yYWdlRXhjZXB0aW9ufSB3aXRoIHRoZSBzcGVjaWZpZWQgZXJyb3IgY29kZSBhbmQgZGV0YWlsCisgICAgICogbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvckNvZGUgVGhlIGVycm9yIGNvZGUgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSBtc2cgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24oaW50IGVycm9yQ29kZSwgU3RyaW5nIG1zZykgeworICAgICAgICBzdXBlcihtc2cpOworICAgICAgICBtRXJyb3JDb2RlID0gZXJyb3JDb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEFjb25maWdTdG9yYWdlRXhjZXB0aW9ufSB3aXRoIHRoZSBzcGVjaWZpZWQgZXJyb3IgY29kZSwgZGV0YWlsCisgICAgICogbWVzc2FnZSwgYW5kIGNhdXNlLgorICAgICAqCisgICAgICogQHBhcmFtIGVycm9yQ29kZSBUaGUgZXJyb3IgY29kZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHBhcmFtIG1zZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSBjYXVzZSBUaGUgY2F1c2Ugb2YgdGhpcyBleGNlcHRpb24uCisgICAgICovCisgICAgcHVibGljIEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKGludCBlcnJvckNvZGUsIFN0cmluZyBtc2csIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihtc2csIGNhdXNlKTsKKyAgICAgICAgbUVycm9yQ29kZSA9IGVycm9yQ29kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBlcnJvciBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGVycm9yIGNvZGUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRFcnJvckNvZGUoKSB7CisgICAgICAgIHJldHVybiBtRXJyb3JDb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLCBpbmNsdWRpbmcgdGhlIGVycm9yIGNvZGUgYW5kIHRoZSBvcmlnaW5hbAorICAgICAqIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBlcnJvciBtZXNzYWdlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIGVycm9yU3RyaW5nKCkgKyAiOiAiICsgc3VwZXIuZ2V0TWVzc2FnZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBlcnJvciBjb2RlIHN0cmluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBlcnJvclN0cmluZygpIHsKKyAgICAgICAgc3dpdGNoIChtRXJyb3JDb2RlKSB7CisgICAgICAgICAgICBjYXNlIEVSUk9SX0dFTkVSSUM6CisgICAgICAgICAgICAgICAgcmV0dXJuICJFUlJPUl9HRU5FUklDIjsKKyAgICAgICAgICAgIGNhc2UgRVJST1JfU1RPUkFHRV9TWVNURU1fTk9UX0ZPVU5EOgorICAgICAgICAgICAgICAgIHJldHVybiAiRVJST1JfU1RPUkFHRV9TWVNURU1fTk9UX0ZPVU5EIjsKKyAgICAgICAgICAgIGNhc2UgRVJST1JfUEFDS0FHRV9OT1RfRk9VTkQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJFUlJPUl9QQUNLQUdFX05PVF9GT1VORCI7CisgICAgICAgICAgICBjYXNlIEVSUk9SX0NPTlRBSU5FUl9OT1RfRk9VTkQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJFUlJPUl9DT05UQUlORVJfTk9UX0ZPVU5EIjsKKyAgICAgICAgICAgIGNhc2UgRVJST1JfQ0FOTk9UX1JFQURfU1RPUkFHRV9GSUxFOgorICAgICAgICAgICAgICAgIHJldHVybiAiRVJST1JfQ0FOTk9UX1JFQURfU1RPUkFHRV9GSUxFIjsKKyAgICAgICAgICAgIGNhc2UgRVJST1JfRklMRV9GSU5HRVJQUklOVF9NSVNNQVRDSDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkVSUk9SX0ZJTEVfRklOR0VSUFJJTlRfTUlTTUFUQ0giOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIjxVbmtub3duIGVycm9yIGNvZGUgIiArIG1FcnJvckNvZGUgKyAiPiI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvQnl0ZUJ1ZmZlclJlYWRlci5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0J5dGVCdWZmZXJSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmJjYjg1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0J5dGVCdWZmZXJSZWFkZXIuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZTsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKKworcHVibGljIGNsYXNzIEJ5dGVCdWZmZXJSZWFkZXIgeworCisgICAgcHJpdmF0ZSBCeXRlQnVmZmVyIG1CeXRlQnVmZmVyOworCisgICAgcHVibGljIEJ5dGVCdWZmZXJSZWFkZXIoQnl0ZUJ1ZmZlciBieXRlQnVmZmVyKSB7CisgICAgICAgIHRoaXMubUJ5dGVCdWZmZXIgPSBieXRlQnVmZmVyOworICAgICAgICB0aGlzLm1CeXRlQnVmZmVyLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHJlYWRCeXRlKCkgeworICAgICAgICByZXR1cm4gQnl0ZS50b1Vuc2lnbmVkSW50KG1CeXRlQnVmZmVyLmdldCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHJlYWRTaG9ydCgpIHsKKyAgICAgICAgcmV0dXJuIFNob3J0LnRvVW5zaWduZWRJbnQobUJ5dGVCdWZmZXIuZ2V0U2hvcnQoKSk7CisgICAgfQorCisgICAgcHVibGljIGludCByZWFkSW50KCkgeworICAgICAgICByZXR1cm4gdGhpcy5tQnl0ZUJ1ZmZlci5nZXRJbnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyByZWFkTG9uZygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubUJ5dGVCdWZmZXIuZ2V0TG9uZygpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZygpIHsKKyAgICAgICAgaW50IGxlbmd0aCA9IHJlYWRJbnQoKTsKKyAgICAgICAgaWYgKGxlbmd0aCA+IDEwMjQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlN0cmluZyBsZW5ndGggZXhjZWVkcyBtYXhpbXVtIGFsbG93ZWQgc2l6ZSAoMTAyNCBieXRlcyk6ICIgKyBsZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgICAgIG1CeXRlQnVmZmVyLmdldChieXRlcywgMCwgbGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgcmVhZEJ5dGUoaW50IGkpIHsKKyAgICAgICAgcmV0dXJuIEJ5dGUudG9VbnNpZ25lZEludChtQnl0ZUJ1ZmZlci5nZXQoaSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvc2l0aW9uKGludCBuZXdQb3NpdGlvbikgeworICAgICAgICBtQnl0ZUJ1ZmZlci5wb3NpdGlvbihuZXdQb3NpdGlvbik7CisgICAgfQorCisgICAgcHVibGljIGludCBwb3NpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1CeXRlQnVmZmVyLnBvc2l0aW9uKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZpbGVUeXBlLmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvRmlsZVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzU0ODczCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZpbGVUeXBlLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7CisKK3B1YmxpYyBlbnVtIEZpbGVUeXBlIHsKKyAgICBQQUNLQUdFX01BUCgwKSwKKyAgICBGTEFHX01BUCgxKSwKKyAgICBGTEFHX1ZBTCgyKSwKKyAgICBGTEFHX0lORk8oMyk7CisKKyAgICBwdWJsaWMgZmluYWwgaW50IHR5cGU7CisKKyAgICBGaWxlVHlwZShpbnQgdHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRmlsZVR5cGUgZnJvbUludChpbnQgaW5kZXgpIHsKKyAgICAgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIHJldHVybiBQQUNLQUdFX01BUDsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICByZXR1cm4gRkxBR19NQVA7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZMQUdfVkFMOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHJldHVybiBGTEFHX0lORk87CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgcmV0dXJuICJQQUNLQUdFX01BUCI7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgcmV0dXJuICJGTEFHX01BUCI7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgcmV0dXJuICJGTEFHX1ZBTCI7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgcmV0dXJuICJGTEFHX0lORk8iOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gInVucmVjb2duaXplZCB0eXBlIjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GbGFnVGFibGUuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GbGFnVGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTc4NDRhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZsYWdUYWJsZS5qYXZhCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZTsKKworaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworCitwdWJsaWMgY2xhc3MgRmxhZ1RhYmxlIHsKKworICAgIHByaXZhdGUgSGVhZGVyIG1IZWFkZXI7CisgICAgcHJpdmF0ZSBCeXRlQnVmZmVyUmVhZGVyIG1SZWFkZXI7CisKKyAgICBwdWJsaWMgc3RhdGljIEZsYWdUYWJsZSBmcm9tQnl0ZXMoQnl0ZUJ1ZmZlciBieXRlcykgeworICAgICAgICBGbGFnVGFibGUgZmxhZ1RhYmxlID0gbmV3IEZsYWdUYWJsZSgpOworICAgICAgICBmbGFnVGFibGUubVJlYWRlciA9IG5ldyBCeXRlQnVmZmVyUmVhZGVyKGJ5dGVzKTsKKyAgICAgICAgZmxhZ1RhYmxlLm1IZWFkZXIgPSBIZWFkZXIuZnJvbUJ5dGVzKGZsYWdUYWJsZS5tUmVhZGVyKTsKKworICAgICAgICByZXR1cm4gZmxhZ1RhYmxlOworICAgIH0KKworICAgIHB1YmxpYyBOb2RlIGdldChpbnQgcGFja2FnZUlkLCBTdHJpbmcgZmxhZ05hbWUpIHsKKyAgICAgICAgaW50IG51bUJ1Y2tldHMgPSAobUhlYWRlci5tTm9kZU9mZnNldCAtIG1IZWFkZXIubUJ1Y2tldE9mZnNldCkgLyA0OworICAgICAgICBpbnQgYnVja2V0SW5kZXggPSBUYWJsZVV0aWxzLmdldEJ1Y2tldEluZGV4KG1ha2VLZXkocGFja2FnZUlkLCBmbGFnTmFtZSksIG51bUJ1Y2tldHMpOworICAgICAgICBpbnQgbmV3UG9zaXRpb24gPSBtSGVhZGVyLm1CdWNrZXRPZmZzZXQgKyBidWNrZXRJbmRleCAqIDQ7CisgICAgICAgIGlmIChuZXdQb3NpdGlvbiA+PSBtSGVhZGVyLm1Ob2RlT2Zmc2V0KSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIG1SZWFkZXIucG9zaXRpb24obmV3UG9zaXRpb24pOworICAgICAgICBpbnQgbm9kZUluZGV4ID0gbVJlYWRlci5yZWFkSW50KCk7CisgICAgICAgIGlmIChub2RlSW5kZXggPCBtSGVhZGVyLm1Ob2RlT2Zmc2V0IHx8IG5vZGVJbmRleCA+PSBtSGVhZGVyLm1GaWxlU2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAobm9kZUluZGV4ICE9IC0xKSB7CisgICAgICAgICAgICBtUmVhZGVyLnBvc2l0aW9uKG5vZGVJbmRleCk7CisgICAgICAgICAgICBOb2RlIG5vZGUgPSBOb2RlLmZyb21CeXRlcyhtUmVhZGVyKTsKKyAgICAgICAgICAgIGlmIChPYmplY3RzLmVxdWFscyhmbGFnTmFtZSwgbm9kZS5tRmxhZ05hbWUpICYmIHBhY2thZ2VJZCA9PSBub2RlLm1QYWNrYWdlSWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGVJbmRleCA9IG5vZGUubU5leHRPZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgSGVhZGVyIGdldEhlYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1IZWFkZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIG1ha2VLZXkoaW50IHBhY2thZ2VJZCwgU3RyaW5nIGZsYWdOYW1lKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgcmV0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgcmV0dXJuIHJldC5hcHBlbmQocGFja2FnZUlkKS5hcHBlbmQoJy8nKS5hcHBlbmQoZmxhZ05hbWUpLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSGVhZGVyIHsKKworICAgICAgICBwcml2YXRlIGludCBtVmVyc2lvbjsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbUNvbnRhaW5lcjsKKyAgICAgICAgcHJpdmF0ZSBGaWxlVHlwZSBtRmlsZVR5cGU7CisgICAgICAgIHByaXZhdGUgaW50IG1GaWxlU2l6ZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbU51bUZsYWdzOworICAgICAgICBwcml2YXRlIGludCBtQnVja2V0T2Zmc2V0OworICAgICAgICBwcml2YXRlIGludCBtTm9kZU9mZnNldDsKKworICAgICAgICBwdWJsaWMgc3RhdGljIEhlYWRlciBmcm9tQnl0ZXMoQnl0ZUJ1ZmZlclJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgICAgIEhlYWRlciBoZWFkZXIgPSBuZXcgSGVhZGVyKCk7CisgICAgICAgICAgICBoZWFkZXIubVZlcnNpb24gPSByZWFkZXIucmVhZEludCgpOworICAgICAgICAgICAgaGVhZGVyLm1Db250YWluZXIgPSByZWFkZXIucmVhZFN0cmluZygpOworICAgICAgICAgICAgaGVhZGVyLm1GaWxlVHlwZSA9IEZpbGVUeXBlLmZyb21JbnQocmVhZGVyLnJlYWRCeXRlKCkpOworICAgICAgICAgICAgaGVhZGVyLm1GaWxlU2l6ZSA9IHJlYWRlci5yZWFkSW50KCk7CisgICAgICAgICAgICBoZWFkZXIubU51bUZsYWdzID0gcmVhZGVyLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGhlYWRlci5tQnVja2V0T2Zmc2V0ID0gcmVhZGVyLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGhlYWRlci5tTm9kZU9mZnNldCA9IHJlYWRlci5yZWFkSW50KCk7CisKKyAgICAgICAgICAgIGlmIChoZWFkZXIubUZpbGVUeXBlICE9IEZpbGVUeXBlLkZMQUdfTUFQKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKCJiaW5hcnkgZmlsZSBpcyBub3QgYSBmbGFnIG1hcCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gaGVhZGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRWZXJzaW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIG1WZXJzaW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250YWluZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvbnRhaW5lcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBGaWxlVHlwZSBnZXRGaWxlVHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmlsZVR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldEZpbGVTaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIG1GaWxlU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TnVtRmxhZ3MoKSB7CisgICAgICAgICAgICByZXR1cm4gbU51bUZsYWdzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRCdWNrZXRPZmZzZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUJ1Y2tldE9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Tm9kZU9mZnNldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTm9kZU9mZnNldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9kZSB7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbUZsYWdOYW1lOworICAgICAgICBwcml2YXRlIEZsYWdUeXBlIG1GbGFnVHlwZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVBhY2thZ2VJZDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUZsYWdJbmRleDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbU5leHRPZmZzZXQ7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBOb2RlIGZyb21CeXRlcyhCeXRlQnVmZmVyUmVhZGVyIHJlYWRlcikgeworICAgICAgICAgICAgTm9kZSBub2RlID0gbmV3IE5vZGUoKTsKKyAgICAgICAgICAgIG5vZGUubVBhY2thZ2VJZCA9IHJlYWRlci5yZWFkSW50KCk7CisgICAgICAgICAgICBub2RlLm1GbGFnTmFtZSA9IHJlYWRlci5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBub2RlLm1GbGFnVHlwZSA9IEZsYWdUeXBlLmZyb21JbnQocmVhZGVyLnJlYWRTaG9ydCgpKTsKKyAgICAgICAgICAgIG5vZGUubUZsYWdJbmRleCA9IHJlYWRlci5yZWFkU2hvcnQoKTsKKyAgICAgICAgICAgIG5vZGUubU5leHRPZmZzZXQgPSByZWFkZXIucmVhZEludCgpOworICAgICAgICAgICAgbm9kZS5tTmV4dE9mZnNldCA9IG5vZGUubU5leHRPZmZzZXQgPT0gMCA/IC0xIDogbm9kZS5tTmV4dE9mZnNldDsKKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKG1GbGFnTmFtZSwgbUZsYWdUeXBlLCBtUGFja2FnZUlkLCBtRmxhZ0luZGV4LCBtTmV4dE9mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIGlmICh0aGlzID09IG9iaikgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgIShvYmogaW5zdGFuY2VvZiBOb2RlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTm9kZSBvdGhlciA9IChOb2RlKSBvYmo7CisgICAgICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbHMobUZsYWdOYW1lLCBvdGhlci5tRmxhZ05hbWUpCisgICAgICAgICAgICAgICAgICAgICYmIE9iamVjdHMuZXF1YWxzKG1GbGFnVHlwZSwgb3RoZXIubUZsYWdUeXBlKQorICAgICAgICAgICAgICAgICAgICAmJiBtUGFja2FnZUlkID09IG90aGVyLm1QYWNrYWdlSWQKKyAgICAgICAgICAgICAgICAgICAgJiYgbUZsYWdJbmRleCA9PSBvdGhlci5tRmxhZ0luZGV4CisgICAgICAgICAgICAgICAgICAgICYmIG1OZXh0T2Zmc2V0ID09IG90aGVyLm1OZXh0T2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRGbGFnTmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmxhZ05hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmxhZ1R5cGUgZ2V0RmxhZ1R5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUZsYWdUeXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRQYWNrYWdlSWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVBhY2thZ2VJZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0RmxhZ0luZGV4KCkgeworICAgICAgICAgICAgcmV0dXJuIG1GbGFnSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldE5leHRPZmZzZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbU5leHRPZmZzZXQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvRmxhZ1R5cGUuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GbGFnVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NWUyZDkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvRmxhZ1R5cGUuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZTsKKworcHVibGljIGVudW0gRmxhZ1R5cGUgeworICAgIFJlYWRXcml0ZUJvb2xlYW4gKDApLAorICAgIFJlYWRPbmx5Qm9vbGVhbigxKSwKKyAgICBGaXhlZFJlYWRPbmx5Qm9vbGVhbigyKTsKKworICAgIHB1YmxpYyBmaW5hbCBpbnQgdHlwZTsKKworICAgIEZsYWdUeXBlKGludCB0eXBlKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBGbGFnVHlwZSBmcm9tSW50KGludCBpbmRleCkgeworICAgICAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlYWRXcml0ZUJvb2xlYW47CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlYWRPbmx5Qm9vbGVhbjsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gRml4ZWRSZWFkT25seUJvb2xlYW47CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZsYWdWYWx1ZUxpc3QuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GbGFnVmFsdWVMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkzNDM2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GbGFnVmFsdWVMaXN0LmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCitwdWJsaWMgY2xhc3MgRmxhZ1ZhbHVlTGlzdCB7CisKKyAgICBwcml2YXRlIEhlYWRlciBtSGVhZGVyOworICAgIHByaXZhdGUgQnl0ZUJ1ZmZlclJlYWRlciBtUmVhZGVyOworCisgICAgcHVibGljIHN0YXRpYyBGbGFnVmFsdWVMaXN0IGZyb21CeXRlcyhCeXRlQnVmZmVyIGJ5dGVzKSB7CisgICAgICAgIEZsYWdWYWx1ZUxpc3QgZmxhZ1ZhbHVlTGlzdCA9IG5ldyBGbGFnVmFsdWVMaXN0KCk7CisgICAgICAgIGZsYWdWYWx1ZUxpc3QubVJlYWRlciA9IG5ldyBCeXRlQnVmZmVyUmVhZGVyKGJ5dGVzKTsKKyAgICAgICAgZmxhZ1ZhbHVlTGlzdC5tSGVhZGVyID0gSGVhZGVyLmZyb21CeXRlcyhmbGFnVmFsdWVMaXN0Lm1SZWFkZXIpOworICAgICAgICByZXR1cm4gZmxhZ1ZhbHVlTGlzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gbVJlYWRlci5yZWFkQnl0ZShtSGVhZGVyLm1Cb29sZWFuVmFsdWVPZmZzZXQgKyBpbmRleCkgPT0gMTsKKyAgICB9CisKKyAgICBwdWJsaWMgSGVhZGVyIGdldEhlYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1IZWFkZXI7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICByZXR1cm4gbUhlYWRlci5tTnVtRmxhZ3M7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIZWFkZXIgeworCisgICAgICAgIHByaXZhdGUgaW50IG1WZXJzaW9uOworICAgICAgICBwcml2YXRlIFN0cmluZyBtQ29udGFpbmVyOworICAgICAgICBwcml2YXRlIEZpbGVUeXBlIG1GaWxlVHlwZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUZpbGVTaXplOworICAgICAgICBwcml2YXRlIGludCBtTnVtRmxhZ3M7CisgICAgICAgIHByaXZhdGUgaW50IG1Cb29sZWFuVmFsdWVPZmZzZXQ7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBIZWFkZXIgZnJvbUJ5dGVzKEJ5dGVCdWZmZXJSZWFkZXIgcmVhZGVyKSB7CisgICAgICAgICAgICBIZWFkZXIgaGVhZGVyID0gbmV3IEhlYWRlcigpOworICAgICAgICAgICAgaGVhZGVyLm1WZXJzaW9uID0gcmVhZGVyLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGhlYWRlci5tQ29udGFpbmVyID0gcmVhZGVyLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIGhlYWRlci5tRmlsZVR5cGUgPSBGaWxlVHlwZS5mcm9tSW50KHJlYWRlci5yZWFkQnl0ZSgpKTsKKyAgICAgICAgICAgIGhlYWRlci5tRmlsZVNpemUgPSByZWFkZXIucmVhZEludCgpOworICAgICAgICAgICAgaGVhZGVyLm1OdW1GbGFncyA9IHJlYWRlci5yZWFkSW50KCk7CisgICAgICAgICAgICBoZWFkZXIubUJvb2xlYW5WYWx1ZU9mZnNldCA9IHJlYWRlci5yZWFkSW50KCk7CisKKyAgICAgICAgICAgIGlmIChoZWFkZXIubUZpbGVUeXBlICE9IEZpbGVUeXBlLkZMQUdfVkFMKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKCJiaW5hcnkgZmlsZSBpcyBub3QgYSBmbGFnIHZhbHVlIGZpbGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGhlYWRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtVmVyc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGFpbmVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db250YWluZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmlsZVR5cGUgZ2V0RmlsZVR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUZpbGVUeXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRGaWxlU2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmlsZVNpemU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldE51bUZsYWdzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1OdW1GbGFnczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Qm9vbGVhblZhbHVlT2Zmc2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1Cb29sZWFuVmFsdWVPZmZzZXQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvUGFja2FnZVRhYmxlLmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvUGFja2FnZVRhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3YzJjYQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9QYWNrYWdlVGFibGUuamF2YQpAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworCitwdWJsaWMgY2xhc3MgUGFja2FnZVRhYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSU5HRVJQUklOVF9CWVRFUyA9IDg7CisgICAgLy8gaW50OiBtUGFja2FnZUlkICsgaW50OiBtQm9vbGVhblN0YXJ0SW5kZXggKyBpbnQ6IG1OZXh0T2Zmc2V0CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PREVfU0tJUF9CWVRFUyA9IDEyOworCisgICAgcHJpdmF0ZSBIZWFkZXIgbUhlYWRlcjsKKyAgICBwcml2YXRlIEJ5dGVCdWZmZXJSZWFkZXIgbVJlYWRlcjsKKworICAgIHB1YmxpYyBzdGF0aWMgUGFja2FnZVRhYmxlIGZyb21CeXRlcyhCeXRlQnVmZmVyIGJ5dGVzKSB7CisgICAgICAgIFBhY2thZ2VUYWJsZSBwYWNrYWdlVGFibGUgPSBuZXcgUGFja2FnZVRhYmxlKCk7CisgICAgICAgIHBhY2thZ2VUYWJsZS5tUmVhZGVyID0gbmV3IEJ5dGVCdWZmZXJSZWFkZXIoYnl0ZXMpOworICAgICAgICBwYWNrYWdlVGFibGUubUhlYWRlciA9IEhlYWRlci5mcm9tQnl0ZXMocGFja2FnZVRhYmxlLm1SZWFkZXIpOworCisgICAgICAgIHJldHVybiBwYWNrYWdlVGFibGU7CisgICAgfQorCisgICAgcHVibGljIE5vZGUgZ2V0KFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICBpbnQgbnVtQnVja2V0cyA9IChtSGVhZGVyLm1Ob2RlT2Zmc2V0IC0gbUhlYWRlci5tQnVja2V0T2Zmc2V0KSAvIDQ7CisgICAgICAgIGludCBidWNrZXRJbmRleCA9IFRhYmxlVXRpbHMuZ2V0QnVja2V0SW5kZXgocGFja2FnZU5hbWUuZ2V0Qnl0ZXMoVVRGXzgpLCBudW1CdWNrZXRzKTsKKyAgICAgICAgaW50IG5ld1Bvc2l0aW9uID0gbUhlYWRlci5tQnVja2V0T2Zmc2V0ICsgYnVja2V0SW5kZXggKiA0OworICAgICAgICBpZiAobmV3UG9zaXRpb24gPj0gbUhlYWRlci5tTm9kZU9mZnNldCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgbVJlYWRlci5wb3NpdGlvbihuZXdQb3NpdGlvbik7CisgICAgICAgIGludCBub2RlSW5kZXggPSBtUmVhZGVyLnJlYWRJbnQoKTsKKworICAgICAgICBpZiAobm9kZUluZGV4IDwgbUhlYWRlci5tTm9kZU9mZnNldCB8fCBub2RlSW5kZXggPj0gbUhlYWRlci5tRmlsZVNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKG5vZGVJbmRleCAhPSAtMSkgeworICAgICAgICAgICAgbVJlYWRlci5wb3NpdGlvbihub2RlSW5kZXgpOworICAgICAgICAgICAgTm9kZSBub2RlID0gTm9kZS5mcm9tQnl0ZXMobVJlYWRlciwgbUhlYWRlci5tVmVyc2lvbik7CisgICAgICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbHMocGFja2FnZU5hbWUsIG5vZGUubVBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZUluZGV4ID0gbm9kZS5tTmV4dE9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UGFja2FnZUxpc3QoKSB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KG1IZWFkZXIubU51bVBhY2thZ2VzKTsKKyAgICAgICAgbVJlYWRlci5wb3NpdGlvbihtSGVhZGVyLm1Ob2RlT2Zmc2V0KTsKKyAgICAgICAgaW50IGZpbmdlcnByaW50Qnl0ZXMgPSBtSGVhZGVyLm1WZXJzaW9uID09IDEgPyAwIDogRklOR0VSUFJJTlRfQllURVM7CisgICAgICAgIGludCBza2lwQnl0ZXMgPSBmaW5nZXJwcmludEJ5dGVzICsgTk9ERV9TS0lQX0JZVEVTOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1IZWFkZXIubU51bVBhY2thZ2VzOyBpKyspIHsKKyAgICAgICAgICAgIGxpc3QuYWRkKG1SZWFkZXIucmVhZFN0cmluZygpKTsKKyAgICAgICAgICAgIG1SZWFkZXIucG9zaXRpb24obVJlYWRlci5wb3NpdGlvbigpICsgc2tpcEJ5dGVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGlzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgSGVhZGVyIGdldEhlYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1IZWFkZXI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIZWFkZXIgeworCisgICAgICAgIHByaXZhdGUgaW50IG1WZXJzaW9uOworICAgICAgICBwcml2YXRlIFN0cmluZyBtQ29udGFpbmVyOworICAgICAgICBwcml2YXRlIEZpbGVUeXBlIG1GaWxlVHlwZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUZpbGVTaXplOworICAgICAgICBwcml2YXRlIGludCBtTnVtUGFja2FnZXM7CisgICAgICAgIHByaXZhdGUgaW50IG1CdWNrZXRPZmZzZXQ7CisgICAgICAgIHByaXZhdGUgaW50IG1Ob2RlT2Zmc2V0OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIEhlYWRlciBmcm9tQnl0ZXMoQnl0ZUJ1ZmZlclJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgICAgIEhlYWRlciBoZWFkZXIgPSBuZXcgSGVhZGVyKCk7CisgICAgICAgICAgICBoZWFkZXIubVZlcnNpb24gPSByZWFkZXIucmVhZEludCgpOworICAgICAgICAgICAgaGVhZGVyLm1Db250YWluZXIgPSByZWFkZXIucmVhZFN0cmluZygpOworICAgICAgICAgICAgaGVhZGVyLm1GaWxlVHlwZSA9IEZpbGVUeXBlLmZyb21JbnQocmVhZGVyLnJlYWRCeXRlKCkpOworICAgICAgICAgICAgaGVhZGVyLm1GaWxlU2l6ZSA9IHJlYWRlci5yZWFkSW50KCk7CisgICAgICAgICAgICBoZWFkZXIubU51bVBhY2thZ2VzID0gcmVhZGVyLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGhlYWRlci5tQnVja2V0T2Zmc2V0ID0gcmVhZGVyLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGhlYWRlci5tTm9kZU9mZnNldCA9IHJlYWRlci5yZWFkSW50KCk7CisKKyAgICAgICAgICAgIGlmIChoZWFkZXIubUZpbGVUeXBlICE9IEZpbGVUeXBlLlBBQ0tBR0VfTUFQKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKCJiaW5hcnkgZmlsZSBpcyBub3QgYSBwYWNrYWdlIG1hcCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gaGVhZGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRWZXJzaW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIG1WZXJzaW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250YWluZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvbnRhaW5lcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBGaWxlVHlwZSBnZXRGaWxlVHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmlsZVR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldEZpbGVTaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIG1GaWxlU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TnVtUGFja2FnZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbU51bVBhY2thZ2VzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRCdWNrZXRPZmZzZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUJ1Y2tldE9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Tm9kZU9mZnNldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTm9kZU9mZnNldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9kZSB7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVBhY2thZ2VOYW1lOworICAgICAgICBwcml2YXRlIGludCBtUGFja2FnZUlkOworICAgICAgICBwcml2YXRlIGxvbmcgbVBhY2thZ2VGaW5nZXJwcmludDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUJvb2xlYW5TdGFydEluZGV4OworICAgICAgICBwcml2YXRlIGludCBtTmV4dE9mZnNldDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1IYXNQYWNrYWdlRmluZ2VycHJpbnQ7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgTm9kZSBmcm9tQnl0ZXMoQnl0ZUJ1ZmZlclJlYWRlciByZWFkZXIsIGludCB2ZXJzaW9uKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHZlcnNpb24pIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmcm9tQnl0ZXNWMShyZWFkZXIpOworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb21CeXRlc1YyKHJlYWRlcik7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgLy8gRG8gd2Ugd2FudCB0byB0aHJvdyBoZXJlPworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5vZGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIE5vZGUgZnJvbUJ5dGVzVjEoQnl0ZUJ1ZmZlclJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgICAgIE5vZGUgbm9kZSA9IG5ldyBOb2RlKCk7CisgICAgICAgICAgICBub2RlLm1QYWNrYWdlTmFtZSA9IHJlYWRlci5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBub2RlLm1QYWNrYWdlSWQgPSByZWFkZXIucmVhZEludCgpOworICAgICAgICAgICAgbm9kZS5tQm9vbGVhblN0YXJ0SW5kZXggPSByZWFkZXIucmVhZEludCgpOworICAgICAgICAgICAgbm9kZS5tTmV4dE9mZnNldCA9IHJlYWRlci5yZWFkSW50KCk7CisgICAgICAgICAgICBub2RlLm1OZXh0T2Zmc2V0ID0gbm9kZS5tTmV4dE9mZnNldCA9PSAwID8gLTEgOiBub2RlLm1OZXh0T2Zmc2V0OworICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBOb2RlIGZyb21CeXRlc1YyKEJ5dGVCdWZmZXJSZWFkZXIgcmVhZGVyKSB7CisgICAgICAgICAgICBOb2RlIG5vZGUgPSBuZXcgTm9kZSgpOworICAgICAgICAgICAgbm9kZS5tUGFja2FnZU5hbWUgPSByZWFkZXIucmVhZFN0cmluZygpOworICAgICAgICAgICAgbm9kZS5tUGFja2FnZUlkID0gcmVhZGVyLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIG5vZGUubVBhY2thZ2VGaW5nZXJwcmludCA9IHJlYWRlci5yZWFkTG9uZygpOworICAgICAgICAgICAgbm9kZS5tQm9vbGVhblN0YXJ0SW5kZXggPSByZWFkZXIucmVhZEludCgpOworICAgICAgICAgICAgbm9kZS5tTmV4dE9mZnNldCA9IHJlYWRlci5yZWFkSW50KCk7CisgICAgICAgICAgICBub2RlLm1OZXh0T2Zmc2V0ID0gbm9kZS5tTmV4dE9mZnNldCA9PSAwID8gLTEgOiBub2RlLm1OZXh0T2Zmc2V0OworICAgICAgICAgICAgbm9kZS5tSGFzUGFja2FnZUZpbmdlcnByaW50ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKG1QYWNrYWdlTmFtZSwgbVBhY2thZ2VJZCwgbUJvb2xlYW5TdGFydEluZGV4LCBtTmV4dE9mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIGlmICh0aGlzID09IG9iaikgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgIShvYmogaW5zdGFuY2VvZiBOb2RlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTm9kZSBvdGhlciA9IChOb2RlKSBvYmo7CisgICAgICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbHMobVBhY2thZ2VOYW1lLCBvdGhlci5tUGFja2FnZU5hbWUpCisgICAgICAgICAgICAgICAgICAgICYmIG1QYWNrYWdlSWQgPT0gb3RoZXIubVBhY2thZ2VJZAorICAgICAgICAgICAgICAgICAgICAmJiBtQm9vbGVhblN0YXJ0SW5kZXggPT0gb3RoZXIubUJvb2xlYW5TdGFydEluZGV4CisgICAgICAgICAgICAgICAgICAgICYmIG1OZXh0T2Zmc2V0ID09IG90aGVyLm1OZXh0T2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUGFja2FnZU5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFBhY2thZ2VJZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUGFja2FnZUlkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0UGFja2FnZUZpbmdlcnByaW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1QYWNrYWdlRmluZ2VycHJpbnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldEJvb2xlYW5TdGFydEluZGV4KCkgeworICAgICAgICAgICAgcmV0dXJuIG1Cb29sZWFuU3RhcnRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TmV4dE9mZnNldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTmV4dE9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1BhY2thZ2VGaW5nZXJwcmludCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtSGFzUGFja2FnZUZpbmdlcnByaW50OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1NpcEhhc2hlcjEzLmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvU2lwSGFzaGVyMTMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDcxNGVlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1NpcEhhc2hlcjEzLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlOworCitwdWJsaWMgY2xhc3MgU2lwSGFzaGVyMTMgeworICAgIHN0YXRpYyBjbGFzcyBTdGF0ZSB7CisgICAgICAgIHByaXZhdGUgbG9uZyB2MDsKKyAgICAgICAgcHJpdmF0ZSBsb25nIHYyOworICAgICAgICBwcml2YXRlIGxvbmcgdjE7CisgICAgICAgIHByaXZhdGUgbG9uZyB2MzsKKworICAgICAgICBwdWJsaWMgU3RhdGUobG9uZyBrMCwgbG9uZyBrMSkgeworICAgICAgICAgICAgdjAgPSBrMCBeIDB4NzM2ZjZkNjU3MDczNjU3NUw7CisgICAgICAgICAgICB2MSA9IGsxIF4gMHg2NDZmNzI2MTZlNjQ2ZjZkTDsKKyAgICAgICAgICAgIHYyID0gazAgXiAweDZjNzk2NzY1NmU2NTcyNjFMOworICAgICAgICAgICAgdjMgPSBrMSBeIDB4NzQ2NTY0NjI3OTc0NjU3M0w7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjb21wcmVzcyhsb25nIG0pIHsKKyAgICAgICAgICAgIHYzIF49IG07CisgICAgICAgICAgICBjUm91bmRzKCk7CisgICAgICAgICAgICB2MCBePSBtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgZmluaXNoKCkgeworICAgICAgICAgICAgdjIgXj0gMHhmZjsKKyAgICAgICAgICAgIGRSb3VuZHMoKTsKKyAgICAgICAgICAgIHJldHVybiB2MCBeIHYxIF4gdjIgXiB2MzsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjUm91bmRzKCkgeworICAgICAgICAgICAgdjAgKz0gdjE7CisgICAgICAgICAgICB2MSA9IExvbmcucm90YXRlTGVmdCh2MSwgMTMpOworICAgICAgICAgICAgdjEgXj0gdjA7CisgICAgICAgICAgICB2MCA9IExvbmcucm90YXRlTGVmdCh2MCwgMzIpOworICAgICAgICAgICAgdjIgKz0gdjM7CisgICAgICAgICAgICB2MyA9IExvbmcucm90YXRlTGVmdCh2MywgMTYpOworICAgICAgICAgICAgdjMgXj0gdjI7CisgICAgICAgICAgICB2MCArPSB2MzsKKyAgICAgICAgICAgIHYzID0gTG9uZy5yb3RhdGVMZWZ0KHYzLCAyMSk7CisgICAgICAgICAgICB2MyBePSB2MDsKKyAgICAgICAgICAgIHYyICs9IHYxOworICAgICAgICAgICAgdjEgPSBMb25nLnJvdGF0ZUxlZnQodjEsIDE3KTsKKyAgICAgICAgICAgIHYxIF49IHYyOworICAgICAgICAgICAgdjIgPSBMb25nLnJvdGF0ZUxlZnQodjIsIDMyKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBkUm91bmRzKCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgICAgICB2MCArPSB2MTsKKyAgICAgICAgICAgICAgICB2MSA9IExvbmcucm90YXRlTGVmdCh2MSwgMTMpOworICAgICAgICAgICAgICAgIHYxIF49IHYwOworICAgICAgICAgICAgICAgIHYwID0gTG9uZy5yb3RhdGVMZWZ0KHYwLCAzMik7CisgICAgICAgICAgICAgICAgdjIgKz0gdjM7CisgICAgICAgICAgICAgICAgdjMgPSBMb25nLnJvdGF0ZUxlZnQodjMsIDE2KTsKKyAgICAgICAgICAgICAgICB2MyBePSB2MjsKKyAgICAgICAgICAgICAgICB2MCArPSB2MzsKKyAgICAgICAgICAgICAgICB2MyA9IExvbmcucm90YXRlTGVmdCh2MywgMjEpOworICAgICAgICAgICAgICAgIHYzIF49IHYwOworICAgICAgICAgICAgICAgIHYyICs9IHYxOworICAgICAgICAgICAgICAgIHYxID0gTG9uZy5yb3RhdGVMZWZ0KHYxLCAxNyk7CisgICAgICAgICAgICAgICAgdjEgXj0gdjI7CisgICAgICAgICAgICAgICAgdjIgPSBMb25nLnJvdGF0ZUxlZnQodjIsIDMyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBoYXNoKGJ5dGVbXSBkYXRhKSB7CisgICAgICAgIFN0YXRlIHN0YXRlID0gbmV3IFN0YXRlKDAsIDApOworICAgICAgICBpbnQgbGVuID0gZGF0YS5sZW5ndGg7CisgICAgICAgIGludCBsZWZ0ID0gbGVuICYgMHg3OworICAgICAgICBpbnQgaW5kZXggPSAwOworCisgICAgICAgIHdoaWxlIChpbmRleCA8IGxlbiAtIGxlZnQpIHsKKyAgICAgICAgICAgIGxvbmcgbWkgPSBsb2FkTGUoZGF0YSwgaW5kZXgsIDgpOworICAgICAgICAgICAgaW5kZXggKz0gODsKKyAgICAgICAgICAgIHN0YXRlLmNvbXByZXNzKG1pKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBhZGRpbmcgdGhlIGVuZCB3aXRoIDB4ZmYgdG8gYmUgY29uc2lzdGVudCB3aXRoIHJ1c3QKKyAgICAgICAgbG9uZyBtID0gKDB4ZmZMIDw8IChsZWZ0ICogOCkpIHwgbG9hZExlKGRhdGEsIGluZGV4LCBsZWZ0KTsKKyAgICAgICAgaWYgKGxlZnQgPT0gMHg3KSB7CisgICAgICAgICAgICAvLyBjb21wcmVzcyB0aGUgbSB3LTIKKyAgICAgICAgICAgIHN0YXRlLmNvbXByZXNzKG0pOworICAgICAgICAgICAgbSA9IDBMOworICAgICAgICB9CisgICAgICAgIC8vIGxlbiBhZGRzIDEgc2luY2UgcGFkZGVkIDB4ZmYKKyAgICAgICAgbSB8PSAoKChsZW4gKyAxKSAmIDB4ZmZMKSA8PCA1Nik7CisgICAgICAgIHN0YXRlLmNvbXByZXNzKG0pOworCisgICAgICAgIHJldHVybiBzdGF0ZS5maW5pc2goKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIGxvYWRMZShieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IHNpemUpIHsKKyAgICAgICAgbG9uZyBtID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIG0gfD0gKGRhdGFbaSArIG9mZnNldF0gJiAweGZmTCkgPDwgKGkgKiA4KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvU3RvcmFnZUZpbGVQcm92aWRlci5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1N0b3JhZ2VGaWxlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzVhYzM2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1N0b3JhZ2VGaWxlUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7CisKK2ltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKK2ltcG9ydCBqYXZhLm5pby5NYXBwZWRCeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsOworaW1wb3J0IGphdmEubmlvLmZpbGUuRGlyZWN0b3J5U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5Ob1N1Y2hGaWxlRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOworaW1wb3J0IGphdmEubmlvLmZpbGUuU3RhbmRhcmRPcGVuT3B0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKiogQGhpZGUgKi8KK3B1YmxpYyBjbGFzcyBTdG9yYWdlRmlsZVByb3ZpZGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX01BUF9QQVRIID0gIi9tZXRhZGF0YS9hY29uZmlnL21hcHMvIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9CT09UX1BBVEggPSAiL21ldGFkYXRhL2Fjb25maWcvYm9vdC8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTUFQX0ZJTEVfRVhUID0gIi5wYWNrYWdlLm1hcCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZNQVBfRklMRV9FWFQgPSAiLmZsYWcubWFwIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMX0ZJTEVfRVhUID0gIi52YWwiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0b3JhZ2VGaWxlUHJvdmlkZXIgREVGQVVMVF9JTlNUQU5DRSA9CisgICAgICAgICAgICBuZXcgU3RvcmFnZUZpbGVQcm92aWRlcihERUZBVUxUX01BUF9QQVRILCBERUZBVUxUX0JPT1RfUEFUSCk7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtTWFwUGF0aDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQm9vdFBhdGg7CisKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0b3JhZ2VGaWxlUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgeworICAgICAgICByZXR1cm4gREVGQVVMVF9JTlNUQU5DRTsKKyAgICB9CisKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgU3RvcmFnZUZpbGVQcm92aWRlcihTdHJpbmcgbWFwUGF0aCwgU3RyaW5nIGJvb3RQYXRoKSB7CisgICAgICAgIG1NYXBQYXRoID0gbWFwUGF0aDsKKyAgICAgICAgbUJvb3RQYXRoID0gYm9vdFBhdGg7CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBsaXN0Q29udGFpbmVycyhTdHJpbmdbXSBleGNsdWRlcykgeworICAgICAgICBMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIFNldDxTdHJpbmc+IHNldCA9IG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdChleGNsdWRlcykpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBEaXJlY3RvcnlTdHJlYW08UGF0aD4gc3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgRmlsZXMubmV3RGlyZWN0b3J5U3RyZWFtKFBhdGhzLmdldChtTWFwUGF0aCksICIqIiArIFBNQVBfRklMRV9FWFQpOworICAgICAgICAgICAgZm9yIChQYXRoIGVudHJ5IDogc3RyZWFtKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZW50cnkuZ2V0RmlsZU5hbWUoKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIFN0cmluZyBjb250YWluZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGZpbGVOYW1lLmxlbmd0aCgpIC0gUE1BUF9GSUxFX0VYVC5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgaWYgKCFzZXQuY29udGFpbnMoY29udGFpbmVyKSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGNvbnRhaW5lcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChOb1N1Y2hGaWxlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkZhaWwgdG8gbGlzdCBtYXAgZmlsZXMgaW4gcGF0aCAlcyIsIG1NYXBQYXRoKSwgZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBQYWNrYWdlVGFibGUgZ2V0UGFja2FnZVRhYmxlKFN0cmluZyBjb250YWluZXIpIHsKKyAgICAgICAgcmV0dXJuIFBhY2thZ2VUYWJsZS5mcm9tQnl0ZXMoCisgICAgICAgICAgICAgICAgbWFwU3RvcmFnZUZpbGUoCisgICAgICAgICAgICAgICAgICAgICAgICBQYXRocy5nZXQobU1hcFBhdGgsIGNvbnRhaW5lciArIFBNQVBfRklMRV9FWFQpLCBGaWxlVHlwZS5QQUNLQUdFX01BUCkpOworICAgIH0KKworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBGbGFnVGFibGUgZ2V0RmxhZ1RhYmxlKFN0cmluZyBjb250YWluZXIpIHsKKyAgICAgICAgcmV0dXJuIEZsYWdUYWJsZS5mcm9tQnl0ZXMoCisgICAgICAgICAgICAgICAgbWFwU3RvcmFnZUZpbGUoUGF0aHMuZ2V0KG1NYXBQYXRoLCBjb250YWluZXIgKyBGTUFQX0ZJTEVfRVhUKSwgRmlsZVR5cGUuRkxBR19NQVApKTsKKyAgICB9CisKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgRmxhZ1ZhbHVlTGlzdCBnZXRGbGFnVmFsdWVMaXN0KFN0cmluZyBjb250YWluZXIpIHsKKyAgICAgICAgcmV0dXJuIEZsYWdWYWx1ZUxpc3QuZnJvbUJ5dGVzKAorICAgICAgICAgICAgICAgIG1hcFN0b3JhZ2VGaWxlKFBhdGhzLmdldChtQm9vdFBhdGgsIGNvbnRhaW5lciArIFZBTF9GSUxFX0VYVCksIEZpbGVUeXBlLkZMQUdfVkFMKSk7CisgICAgfQorCisgICAgLy8gTWFwIGEgc3RvcmFnZSBmaWxlIGdpdmVuIGZpbGUgcGF0aAorICAgIHByaXZhdGUgc3RhdGljIE1hcHBlZEJ5dGVCdWZmZXIgbWFwU3RvcmFnZUZpbGUoUGF0aCBmaWxlLCBGaWxlVHlwZSB0eXBlKSB7CisgICAgICAgIEZpbGVDaGFubmVsIGNoYW5uZWwgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hhbm5lbCA9IEZpbGVDaGFubmVsLm9wZW4oZmlsZSwgU3RhbmRhcmRPcGVuT3B0aW9uLlJFQUQpOworICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWwubWFwKEZpbGVDaGFubmVsLk1hcE1vZGUuUkVBRF9PTkxZLCAwLCBjaGFubmVsLnNpemUoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIEFjb25maWdTdG9yYWdlRXhjZXB0aW9uLkVSUk9SX0NBTk5PVF9SRUFEX1NUT1JBR0VfRklMRSwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiRmFpbCB0byBtbWFwIHN0b3JhZ2UgJXMgZmlsZSAlcyIsIHR5cGUudG9TdHJpbmcoKSwgZmlsZSksCisgICAgICAgICAgICAgICAgICAgIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcXVpZXRseURpc3Bvc2UoY2hhbm5lbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHF1aWV0bHlEaXNwb3NlKENsb3NlYWJsZSBjbG9zYWJsZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGNsb3NhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjbG9zYWJsZS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBjYXJlLCBhdCBsZWFzdCBhcyBvZiBub3cKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9UYWJsZVV0aWxzLmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvVGFibGVVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMTY4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvVGFibGVVdGlscy5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlOworCitwdWJsaWMgY2xhc3MgVGFibGVVdGlscyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBIQVNIX1BSSU1FUyA9CisgICAgICAgICAgICBuZXcgaW50W10geworICAgICAgICAgICAgICAgIDcsCisgICAgICAgICAgICAgICAgMTcsCisgICAgICAgICAgICAgICAgMjksCisgICAgICAgICAgICAgICAgNTMsCisgICAgICAgICAgICAgICAgOTcsCisgICAgICAgICAgICAgICAgMTkzLAorICAgICAgICAgICAgICAgIDM4OSwKKyAgICAgICAgICAgICAgICA3NjksCisgICAgICAgICAgICAgICAgMTU0MywKKyAgICAgICAgICAgICAgICAzMDc5LAorICAgICAgICAgICAgICAgIDYxNTEsCisgICAgICAgICAgICAgICAgMTIyODksCisgICAgICAgICAgICAgICAgMjQ1OTMsCisgICAgICAgICAgICAgICAgNDkxNTcsCisgICAgICAgICAgICAgICAgOTgzMTcsCisgICAgICAgICAgICAgICAgMTk2NjEzLAorICAgICAgICAgICAgICAgIDM5MzI0MSwKKyAgICAgICAgICAgICAgICA3ODY0MzMsCisgICAgICAgICAgICAgICAgMTU3Mjg2OSwKKyAgICAgICAgICAgICAgICAzMTQ1NzM5LAorICAgICAgICAgICAgICAgIDYyOTE0NjksCisgICAgICAgICAgICAgICAgMTI1ODI5MTcsCisgICAgICAgICAgICAgICAgMjUxNjU4NDMsCisgICAgICAgICAgICAgICAgNTAzMzE2NTMsCisgICAgICAgICAgICAgICAgMTAwNjYzMzE5LAorICAgICAgICAgICAgICAgIDIwMTMyNjYxMSwKKyAgICAgICAgICAgICAgICA0MDI2NTMxODksCisgICAgICAgICAgICAgICAgODA1MzA2NDU3LAorICAgICAgICAgICAgICAgIDE2MTA2MTI3NDEKKyAgICAgICAgICAgIH07CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRUYWJsZVNpemUoaW50IG51bUVudHJpZXMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA6IEhBU0hfUFJJTUVTKSB7CisgICAgICAgICAgICBpZiAoaSA8IDIgKiBudW1FbnRyaWVzKSBjb250aW51ZTsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbigiTnVtYmVyIG9mIGl0ZW1zIGluIGEgaGFzaCB0YWJsZSBleGNlZWRzIGxpbWl0Iik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0QnVja2V0SW5kZXgoYnl0ZVtdIHZhbCwgaW50IG51bUJ1Y2tldHMpIHsKKyAgICAgICAgbG9uZyBoYXNoVmFsID0gU2lwSGFzaGVyMTMuaGFzaCh2YWwpOworICAgICAgICByZXR1cm4gKGludCkgTG9uZy5yZW1haW5kZXJVbnNpZ25lZChoYXNoVmFsLCBudW1CdWNrZXRzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL0FuZHJvaWQuYnAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ0NmQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDU1IEBACitjY190ZXN0IHsKKyAgICBuYW1lOiAiYWNvbmZpZ19zdG9yYWdlX2ZpbGUudGVzdC5jcHAiLAorICAgIHRlYW06ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX2NvcmVfZXhwZXJpbWVudHMiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInN0b3JhZ2VfZmlsZV90ZXN0LmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliZ21vY2siLAorICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX2ZpbGVfY2MiLAorICAgICAgICAibGliYmFzZSIsCisgICAgXSwKKyAgICBkYXRhOiBbCisgICAgICAgICJkYXRhL3YxL3BhY2thZ2VfdjEubWFwIiwKKyAgICAgICAgImRhdGEvdjEvZmxhZ192MS5tYXAiLAorICAgICAgICAiZGF0YS92MS9mbGFnX3YxLnZhbCIsCisgICAgICAgICJkYXRhL3YxL2ZsYWdfdjEuaW5mbyIsCisgICAgICAgICJkYXRhL3YyL3BhY2thZ2VfdjIubWFwIiwKKyAgICAgICAgImRhdGEvdjIvZmxhZ192Mi5tYXAiLAorICAgICAgICAiZGF0YS92Mi9mbGFnX3YyLnZhbCIsCisgICAgICAgICJkYXRhL3YyL2ZsYWdfdjIuaW5mbyIsCisgICAgXSwKKyAgICB0ZXN0X3N1aXRlczogWworICAgICAgICAiZGV2aWNlLXRlc3RzIiwKKyAgICAgICAgImdlbmVyYWwtdGVzdHMiLAorICAgIF0sCit9CisKK2FuZHJvaWRfdGVzdCB7CisgICAgbmFtZTogImFjb25maWdfc3RvcmFnZV9maWxlLnRlc3QuamF2YSIsCisgICAgdGVhbTogInRyZW5keV90ZWFtX2FuZHJvaWRfY29yZV9leHBlcmltZW50cyIsCisgICAgc3JjczogWworICAgICAgICAic3Jjcy8qKi8qLmphdmEiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWR4LnRlc3QucnVubmVyIiwKKyAgICAgICAgImp1bml0IiwKKyAgICAgICAgImFjb25maWdfc3RvcmFnZV9maWxlX2phdmEiLAorICAgIF0sCisgICAgdGVzdF9jb25maWc6ICJBbmRyb2lkU3RvcmFnZUphdmVUZXN0LnhtbCIsCisgICAgc2RrX3ZlcnNpb246ICJ0ZXN0X2N1cnJlbnQiLAorICAgIGRhdGE6IFsKKyAgICAgICAgImRhdGEvdjEvcGFja2FnZV92MS5tYXAiLAorICAgICAgICAiZGF0YS92MS9mbGFnX3YxLm1hcCIsCisgICAgICAgICJkYXRhL3YxL2ZsYWdfdjEudmFsIiwKKyAgICAgICAgImRhdGEvdjEvZmxhZ192MS5pbmZvIiwKKyAgICAgICAgImRhdGEvdjIvcGFja2FnZV92Mi5tYXAiLAorICAgICAgICAiZGF0YS92Mi9mbGFnX3YyLm1hcCIsCisgICAgICAgICJkYXRhL3YyL2ZsYWdfdjIudmFsIiwKKyAgICAgICAgImRhdGEvdjIvZmxhZ192Mi5pbmZvIiwKKyAgICBdLAorICAgIHRlc3Rfc3VpdGVzOiBbCisgICAgICAgICJnZW5lcmFsLXRlc3RzIiwKKyAgICBdLAorICAgIGphcmphcl9ydWxlczogImphcmphci50eHQiLAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMDE4NzkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgfiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICB+CisgIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICB+CisgIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgfgorICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdCI+CisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdCIgLz4KKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvQW5kcm9pZFN0b3JhZ2VKYXZlVGVzdC54bWwgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL0FuZHJvaWRTdG9yYWdlSmF2ZVRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYzIzOGUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL0FuZHJvaWRTdG9yYWdlSmF2ZVRlc3QueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIH4gQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAgfgorICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgfgorICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIH4KKyAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgIC0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgYWNvbmZpZyBzdG9yYWdlIGphdmEgdGVzdHMiPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJhY29uZmlnX3N0b3JhZ2VfZmlsZS50ZXN0LmphdmEuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLmNvbXBhdGliaWxpdHkuY29tbW9uLnRyYWRlZmVkLnRhcmdldHByZXAuRmlsZVB1c2hlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9InBhY2thZ2VfdjEubWFwLT4vZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19zdG9yYWdlX2ZpbGVfdGVzdF9qYXZhL3Rlc3RkYXRhL21vY2sudjEucGFja2FnZS5tYXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9ImZsYWdfdjEubWFwLT4vZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19zdG9yYWdlX2ZpbGVfdGVzdF9qYXZhL3Rlc3RkYXRhL21vY2sudjEuZmxhZy5tYXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9ImZsYWdfdjEudmFsLT4vZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19zdG9yYWdlX2ZpbGVfdGVzdF9qYXZhL3Rlc3RkYXRhL21vY2sudjEudmFsIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJmbGFnX3YxLmluZm8tPi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX3N0b3JhZ2VfZmlsZV90ZXN0X2phdmEvdGVzdGRhdGEvbW9jay52MS5pbmZvIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJwYWNrYWdlX3YyLm1hcC0+L2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfc3RvcmFnZV9maWxlX3Rlc3RfamF2YS90ZXN0ZGF0YS9tb2NrLnYyLnBhY2thZ2UubWFwIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJmbGFnX3YyLm1hcC0+L2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfc3RvcmFnZV9maWxlX3Rlc3RfamF2YS90ZXN0ZGF0YS9tb2NrLnYyLmZsYWcubWFwIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJmbGFnX3YyLnZhbC0+L2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfc3RvcmFnZV9maWxlX3Rlc3RfamF2YS90ZXN0ZGF0YS9tb2NrLnYyLnZhbCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iZmxhZ192Mi5pbmZvLT4vZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19zdG9yYWdlX2ZpbGVfdGVzdF9qYXZhL3Rlc3RkYXRhL21vY2sudjIuaW5mbyIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwb3N0LXB1c2giIHZhbHVlPSJjaG1vZCArciAvZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19zdG9yYWdlX2ZpbGVfdGVzdF9qYXZhL3Rlc3RkYXRhLyIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjFtIiAvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZGF0YS92MS9mbGFnX3YxLmluZm8gYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2RhdGEvdjEvZmxhZ192MS5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMjNlZGYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2RhdGEvdjEvZmxhZ192MS5pbmZvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZGF0YS92MS9mbGFnX3YxLm1hcCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZGF0YS92MS9mbGFnX3YxLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODY4ZjUzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEubWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZGF0YS92MS9mbGFnX3YxLnZhbCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZGF0YS92MS9mbGFnX3YxLnZhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDIwM2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEudmFsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZGF0YS92MS9wYWNrYWdlX3YxLm1hcCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZGF0YS92MS9wYWNrYWdlX3YxLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzQ2YTAzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9kYXRhL3YxL3BhY2thZ2VfdjEubWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZGF0YS92Mi9mbGFnX3YyLmluZm8gYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2RhdGEvdjIvZmxhZ192Mi5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYjdmZGUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2RhdGEvdjIvZmxhZ192Mi5pbmZvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZGF0YS92Mi9mbGFnX3YyLm1hcCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZGF0YS92Mi9mbGFnX3YyLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjQ2ODVjCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9kYXRhL3YyL2ZsYWdfdjIubWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZGF0YS92Mi9mbGFnX3YyLnZhbCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZGF0YS92Mi9mbGFnX3YyLnZhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2Q0NzUwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9kYXRhL3YyL2ZsYWdfdjIudmFsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZGF0YS92Mi9wYWNrYWdlX3YyLm1hcCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZGF0YS92Mi9wYWNrYWdlX3YyLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTlmOTVlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9kYXRhL3YyL3BhY2thZ2VfdjIubWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvamFyamFyLnR4dCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvamFyamFyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDk1MmVjCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9qYXJqYXIudHh0CkBAIC0wLDAgKzEsMTcgQEAKK3J1bGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24gYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdC5BY29uZmlnU3RvcmFnZUV4Y2VwdGlvbgorcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GbGFnVGFibGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdC5GbGFnVGFibGUKK3J1bGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuUGFja2FnZVRhYmxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuUGFja2FnZVRhYmxlCitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkJ5dGVCdWZmZXJSZWFkZXIgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdC5CeXRlQnVmZmVyUmVhZGVyCitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdUeXBlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuRmxhZ1R5cGUKK3J1bGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuU2lwSGFzaGVyMTMgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdC5TaXBIYXNoZXIxMworcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GaWxlVHlwZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0LkZpbGVUeXBlCitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdWYWx1ZUxpc3QgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdC5GbGFnVmFsdWVMaXN0CitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlRhYmxlVXRpbHMgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdC5UYWJsZVV0aWxzCitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkFjb25maWdQYWNrYWdlSW1wbCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0LkFjb25maWdQYWNrYWdlSW1wbAorcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5TdG9yYWdlRmlsZVByb3ZpZGVyIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuU3RvcmFnZUZpbGVQcm92aWRlcgorCisKK3J1bGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1RhYmxlJCogYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdC5GbGFnVGFibGUkQDEKK3J1bGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuUGFja2FnZVRhYmxlJCogYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdC5QYWNrYWdlVGFibGUkQDEKK3J1bGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1ZhbHVlTGlzdCQqIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuRmxhZ1ZhbHVlTGlzdEAxCitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlNpcEhhc2hlcjEzJCogYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdC5TaXBIYXNoZXIxM0AxCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvQnl0ZUJ1ZmZlclJlYWRlclRlc3QuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9CeXRlQnVmZmVyUmVhZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YTgxNjYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvQnl0ZUJ1ZmZlclJlYWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuQnl0ZUJ1ZmZlclJlYWRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CisKK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBCeXRlQnVmZmVyUmVhZGVyVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkQnl0ZSgpIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDEpOworICAgICAgICBieXRlIGV4cGVjdCA9IDEwOworICAgICAgICBidWZmZXIucHV0KGV4cGVjdCkucmV3aW5kKCk7CisKKyAgICAgICAgQnl0ZUJ1ZmZlclJlYWRlciByZWFkZXIgPSBuZXcgQnl0ZUJ1ZmZlclJlYWRlcihidWZmZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0LCByZWFkZXIucmVhZEJ5dGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFNob3J0KCkgeworICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoNCk7CisgICAgICAgIGJ1ZmZlci5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTik7CisgICAgICAgIHNob3J0IGV4cGVjdCA9IFNob3J0Lk1BWF9WQUxVRTsKKyAgICAgICAgYnVmZmVyLnB1dFNob3J0KGV4cGVjdCkucmV3aW5kKCk7CisKKyAgICAgICAgQnl0ZUJ1ZmZlclJlYWRlciByZWFkZXIgPSBuZXcgQnl0ZUJ1ZmZlclJlYWRlcihidWZmZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0LCByZWFkZXIucmVhZFNob3J0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRJbnQoKSB7CisgICAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg0KTsKKyAgICAgICAgYnVmZmVyLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKKyAgICAgICAgaW50IGV4cGVjdCA9IDEwMDAwOworICAgICAgICBidWZmZXIucHV0SW50KGV4cGVjdCkucmV3aW5kKCk7CisKKyAgICAgICAgQnl0ZUJ1ZmZlclJlYWRlciByZWFkZXIgPSBuZXcgQnl0ZUJ1ZmZlclJlYWRlcihidWZmZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0LCByZWFkZXIucmVhZEludCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkU3RyaW5nKCkgeworICAgICAgICBTdHJpbmcgZXhwZWN0ID0gInRlc3QgcmVhZCBzdHJpbmciOworICAgICAgICBieXRlW10gYnl0ZXMgPSBleHBlY3QuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisKKyAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGV4cGVjdC5sZW5ndGgoKSAqIDIgKyA0KTsKKyAgICAgICAgYnVmZmVyLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKKyAgICAgICAgYnVmZmVyLnB1dEludChleHBlY3QubGVuZ3RoKCkpLnB1dChieXRlcykucmV3aW5kKCk7CisKKyAgICAgICAgQnl0ZUJ1ZmZlclJlYWRlciByZWFkZXIgPSBuZXcgQnl0ZUJ1ZmZlclJlYWRlcihidWZmZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3QsIHJlYWRlci5yZWFkU3RyaW5nKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9GbGFnVGFibGVUZXN0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvRmxhZ1RhYmxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNDY1YjYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvRmxhZ1RhYmxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmlsZVR5cGU7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1RhYmxlOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdUeXBlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEZsYWdUYWJsZVRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmxhZ1RhYmxlX3JpZ2h0SGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZsYWdUYWJsZSBmbGFnVGFibGUgPSBGbGFnVGFibGUuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdEZsYWdNYXBCeXRlQnVmZmVyKDEpKTsKKyAgICAgICAgRmxhZ1RhYmxlLkhlYWRlciBoZWFkZXIgPSBmbGFnVGFibGUuZ2V0SGVhZGVyKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBoZWFkZXIuZ2V0VmVyc2lvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtb2NrdXAiLCBoZWFkZXIuZ2V0Q29udGFpbmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRmlsZVR5cGUuRkxBR19NQVAsIGhlYWRlci5nZXRGaWxlVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMyMSwgaGVhZGVyLmdldEZpbGVTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoOCwgaGVhZGVyLmdldE51bUZsYWdzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMzEsIGhlYWRlci5nZXRCdWNrZXRPZmZzZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg5OSwgaGVhZGVyLmdldE5vZGVPZmZzZXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmxhZ1RhYmxlX3JpZ2h0Tm9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGbGFnVGFibGUgZmxhZ1RhYmxlID0gRmxhZ1RhYmxlLmZyb21CeXRlcyhUZXN0RGF0YVV0aWxzLmdldFRlc3RGbGFnTWFwQnl0ZUJ1ZmZlcigxKSk7CisKKyAgICAgICAgRmxhZ1RhYmxlLk5vZGUgbm9kZTEgPSBmbGFnVGFibGUuZ2V0KDAsICJlbmFibGVkX3JvIik7CisgICAgICAgIEZsYWdUYWJsZS5Ob2RlIG5vZGUyID0gZmxhZ1RhYmxlLmdldCgwLCAiZW5hYmxlZF9ydyIpOworICAgICAgICBGbGFnVGFibGUuTm9kZSBub2RlMyA9IGZsYWdUYWJsZS5nZXQoMiwgImVuYWJsZWRfcnciKTsKKyAgICAgICAgRmxhZ1RhYmxlLk5vZGUgbm9kZTQgPSBmbGFnVGFibGUuZ2V0KDEsICJkaXNhYmxlZF9ydyIpOworICAgICAgICBGbGFnVGFibGUuTm9kZSBub2RlNSA9IGZsYWdUYWJsZS5nZXQoMSwgImVuYWJsZWRfZml4ZWRfcm8iKTsKKyAgICAgICAgRmxhZ1RhYmxlLk5vZGUgbm9kZTYgPSBmbGFnVGFibGUuZ2V0KDEsICJlbmFibGVkX3JvIik7CisgICAgICAgIEZsYWdUYWJsZS5Ob2RlIG5vZGU3ID0gZmxhZ1RhYmxlLmdldCgyLCAiZW5hYmxlZF9maXhlZF9ybyIpOworICAgICAgICBGbGFnVGFibGUuTm9kZSBub2RlOCA9IGZsYWdUYWJsZS5nZXQoMCwgImRpc2FibGVkX3J3Iik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbmFibGVkX3JvIiwgbm9kZTEuZ2V0RmxhZ05hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZW5hYmxlZF9ydyIsIG5vZGUyLmdldEZsYWdOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVuYWJsZWRfcnciLCBub2RlMy5nZXRGbGFnTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkaXNhYmxlZF9ydyIsIG5vZGU0LmdldEZsYWdOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVuYWJsZWRfZml4ZWRfcm8iLCBub2RlNS5nZXRGbGFnTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbmFibGVkX3JvIiwgbm9kZTYuZ2V0RmxhZ05hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZW5hYmxlZF9maXhlZF9ybyIsIG5vZGU3LmdldEZsYWdOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImRpc2FibGVkX3J3Iiwgbm9kZTguZ2V0RmxhZ05hbWUoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vZGUxLmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vZGUyLmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG5vZGUzLmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5vZGU0LmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5vZGU1LmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5vZGU2LmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG5vZGU3LmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vZGU4LmdldFBhY2thZ2VJZCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoRmxhZ1R5cGUuUmVhZE9ubHlCb29sZWFuLCBub2RlMS5nZXRGbGFnVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZsYWdUeXBlLlJlYWRXcml0ZUJvb2xlYW4sIG5vZGUyLmdldEZsYWdUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRmxhZ1R5cGUuUmVhZFdyaXRlQm9vbGVhbiwgbm9kZTMuZ2V0RmxhZ1R5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhGbGFnVHlwZS5SZWFkV3JpdGVCb29sZWFuLCBub2RlNC5nZXRGbGFnVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZsYWdUeXBlLkZpeGVkUmVhZE9ubHlCb29sZWFuLCBub2RlNS5nZXRGbGFnVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZsYWdUeXBlLlJlYWRPbmx5Qm9vbGVhbiwgbm9kZTYuZ2V0RmxhZ1R5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhGbGFnVHlwZS5GaXhlZFJlYWRPbmx5Qm9vbGVhbiwgbm9kZTcuZ2V0RmxhZ1R5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhGbGFnVHlwZS5SZWFkV3JpdGVCb29sZWFuLCBub2RlOC5nZXRGbGFnVHlwZSgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbm9kZTEuZ2V0RmxhZ0luZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbm9kZTIuZ2V0RmxhZ0luZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbm9kZTMuZ2V0RmxhZ0luZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbm9kZTQuZ2V0RmxhZ0luZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbm9kZTUuZ2V0RmxhZ0luZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbm9kZTYuZ2V0RmxhZ0luZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbm9kZTcuZ2V0RmxhZ0luZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbm9kZTguZ2V0RmxhZ0luZGV4KCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygtMSwgbm9kZTEuZ2V0TmV4dE9mZnNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDE1MSwgbm9kZTIuZ2V0TmV4dE9mZnNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBub2RlMy5nZXROZXh0T2Zmc2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIG5vZGU0LmdldE5leHRPZmZzZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMzYsIG5vZGU1LmdldE5leHRPZmZzZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgbm9kZTYuZ2V0TmV4dE9mZnNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBub2RlNy5nZXROZXh0T2Zmc2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIG5vZGU4LmdldE5leHRPZmZzZXQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL0ZsYWdWYWx1ZUxpc3RUZXN0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvRmxhZ1ZhbHVlTGlzdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDZkZjdkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL0ZsYWdWYWx1ZUxpc3RUZXN0LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmlsZVR5cGU7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1RhYmxlOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdWYWx1ZUxpc3Q7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuUGFja2FnZVRhYmxlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIEZsYWdWYWx1ZUxpc3RUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZsYWdWYWx1ZUxpc3RfcmlnaHRIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmxhZ1ZhbHVlTGlzdCBmbGFnVmFsdWVMaXN0ID0KKyAgICAgICAgICAgICAgICBGbGFnVmFsdWVMaXN0LmZyb21CeXRlcyhUZXN0RGF0YVV0aWxzLmdldFRlc3RGbGFnVmFsQnl0ZUJ1ZmZlcigxKSk7CisgICAgICAgIEZsYWdWYWx1ZUxpc3QuSGVhZGVyIGhlYWRlciA9IGZsYWdWYWx1ZUxpc3QuZ2V0SGVhZGVyKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBoZWFkZXIuZ2V0VmVyc2lvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtb2NrdXAiLCBoZWFkZXIuZ2V0Q29udGFpbmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRmlsZVR5cGUuRkxBR19WQUwsIGhlYWRlci5nZXRGaWxlVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDM1LCBoZWFkZXIuZ2V0RmlsZVNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg4LCBoZWFkZXIuZ2V0TnVtRmxhZ3MoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyNywgaGVhZGVyLmdldEJvb2xlYW5WYWx1ZU9mZnNldCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGbGFnVmFsdWVMaXN0X3JpZ2h0Tm9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGbGFnVmFsdWVMaXN0IGZsYWdWYWx1ZUxpc3QgPQorICAgICAgICAgICAgICAgIEZsYWdWYWx1ZUxpc3QuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdEZsYWdWYWxCeXRlQnVmZmVyKDEpKTsKKworICAgICAgICBib29sZWFuW10gZXhwZWN0ZWQgPSBuZXcgYm9vbGVhbltdIHtmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUsIHRydWUsIHRydWV9OworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBmbGFnVmFsdWVMaXN0LnNpemUoKSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFnVmFsdWVMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRbaV0sIGZsYWdWYWx1ZUxpc3QuZ2V0Qm9vbGVhbihpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGbGFnVmFsdWVMaXN0X2dldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFBhY2thZ2VUYWJsZSBwYWNrYWdlVGFibGUgPQorICAgICAgICAgICAgICAgIFBhY2thZ2VUYWJsZS5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0UGFja2FnZU1hcEJ5dGVCdWZmZXIoMSkpOworICAgICAgICBGbGFnVGFibGUgZmxhZ1RhYmxlID0gRmxhZ1RhYmxlLmZyb21CeXRlcyhUZXN0RGF0YVV0aWxzLmdldFRlc3RGbGFnTWFwQnl0ZUJ1ZmZlcigxKSk7CisKKyAgICAgICAgRmxhZ1ZhbHVlTGlzdCBmbGFnVmFsdWVMaXN0ID0KKyAgICAgICAgICAgICAgICBGbGFnVmFsdWVMaXN0LmZyb21CeXRlcyhUZXN0RGF0YVV0aWxzLmdldFRlc3RGbGFnVmFsQnl0ZUJ1ZmZlcigxKSk7CisKKyAgICAgICAgUGFja2FnZVRhYmxlLk5vZGUgcE5vZGUgPSBwYWNrYWdlVGFibGUuZ2V0KCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIik7CisgICAgICAgIEZsYWdUYWJsZS5Ob2RlIGZOb2RlID0gZmxhZ1RhYmxlLmdldChwTm9kZS5nZXRQYWNrYWdlSWQoKSwgImVuYWJsZWRfcnciKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmbGFnVmFsdWVMaXN0LmdldEJvb2xlYW4ocE5vZGUuZ2V0Qm9vbGVhblN0YXJ0SW5kZXgoKSArIGZOb2RlLmdldEZsYWdJbmRleCgpKSk7CisKKyAgICAgICAgcE5vZGUgPSBwYWNrYWdlVGFibGUuZ2V0KCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80Iik7CisgICAgICAgIGZOb2RlID0gZmxhZ1RhYmxlLmdldChwTm9kZS5nZXRQYWNrYWdlSWQoKSwgImVuYWJsZWRfZml4ZWRfcm8iKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmbGFnVmFsdWVMaXN0LmdldEJvb2xlYW4ocE5vZGUuZ2V0Qm9vbGVhblN0YXJ0SW5kZXgoKSArIGZOb2RlLmdldEZsYWdJbmRleCgpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL1BhY2thZ2VUYWJsZVRlc3QuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9QYWNrYWdlVGFibGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEyY2UzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9QYWNrYWdlVGFibGVUZXN0LmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZpbGVUeXBlOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlBhY2thZ2VUYWJsZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitAUnVuV2l0aChKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgUGFja2FnZVRhYmxlVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlVGFibGVfcmlnaHRIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUGFja2FnZVRhYmxlIHBhY2thZ2VUYWJsZSA9CisgICAgICAgICAgICAgICAgUGFja2FnZVRhYmxlLmZyb21CeXRlcyhUZXN0RGF0YVV0aWxzLmdldFRlc3RQYWNrYWdlTWFwQnl0ZUJ1ZmZlcigxKSk7CisgICAgICAgIFBhY2thZ2VUYWJsZS5IZWFkZXIgaGVhZGVyID0gcGFja2FnZVRhYmxlLmdldEhlYWRlcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaGVhZGVyLmdldFZlcnNpb24oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibW9ja3VwIiwgaGVhZGVyLmdldENvbnRhaW5lcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbGVUeXBlLlBBQ0tBR0VfTUFQLCBoZWFkZXIuZ2V0RmlsZVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDksIGhlYWRlci5nZXRGaWxlU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGhlYWRlci5nZXROdW1QYWNrYWdlcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMxLCBoZWFkZXIuZ2V0QnVja2V0T2Zmc2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNTksIGhlYWRlci5nZXROb2RlT2Zmc2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhY2thZ2VUYWJsZV9yaWdodEhlYWRlcl92MigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQYWNrYWdlVGFibGUgcGFja2FnZVRhYmxlID0KKyAgICAgICAgICAgICAgICBQYWNrYWdlVGFibGUuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdFBhY2thZ2VNYXBCeXRlQnVmZmVyKDIpKTsKKyAgICAgICAgUGFja2FnZVRhYmxlLkhlYWRlciBoZWFkZXIgPSBwYWNrYWdlVGFibGUuZ2V0SGVhZGVyKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBoZWFkZXIuZ2V0VmVyc2lvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtb2NrdXAiLCBoZWFkZXIuZ2V0Q29udGFpbmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRmlsZVR5cGUuUEFDS0FHRV9NQVAsIGhlYWRlci5nZXRGaWxlVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIzMywgaGVhZGVyLmdldEZpbGVTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgaGVhZGVyLmdldE51bVBhY2thZ2VzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMzEsIGhlYWRlci5nZXRCdWNrZXRPZmZzZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg1OSwgaGVhZGVyLmdldE5vZGVPZmZzZXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZVRhYmxlX3JpZ2h0Tm9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQYWNrYWdlVGFibGUgcGFja2FnZVRhYmxlID0KKyAgICAgICAgICAgICAgICBQYWNrYWdlVGFibGUuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdFBhY2thZ2VNYXBCeXRlQnVmZmVyKDEpKTsKKworICAgICAgICBQYWNrYWdlVGFibGUuTm9kZSBub2RlMSA9IHBhY2thZ2VUYWJsZS5nZXQoImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiKTsKKyAgICAgICAgUGFja2FnZVRhYmxlLk5vZGUgbm9kZTIgPSBwYWNrYWdlVGFibGUuZ2V0KCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIik7CisgICAgICAgIFBhY2thZ2VUYWJsZS5Ob2RlIG5vZGU0ID0gcGFja2FnZVRhYmxlLmdldCgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIpOworCisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsIG5vZGUxLmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiLCBub2RlMi5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80Iiwgbm9kZTQuZ2V0UGFja2FnZU5hbWUoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vZGUxLmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5vZGUyLmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG5vZGU0LmdldFBhY2thZ2VJZCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbm9kZTEuZ2V0Qm9vbGVhblN0YXJ0SW5kZXgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBub2RlMi5nZXRCb29sZWFuU3RhcnRJbmRleCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDYsIG5vZGU0LmdldEJvb2xlYW5TdGFydEluZGV4KCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygxNTksIG5vZGUxLmdldE5leHRPZmZzZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgbm9kZTIuZ2V0TmV4dE9mZnNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBub2RlNC5nZXROZXh0T2Zmc2V0KCkpOworCisgICAgICAgIGFzc2VydEZhbHNlKG5vZGUxLmhhc1BhY2thZ2VGaW5nZXJwcmludCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uobm9kZTIuaGFzUGFja2FnZUZpbmdlcnByaW50KCkpOworICAgICAgICBhc3NlcnRGYWxzZShub2RlNC5oYXNQYWNrYWdlRmluZ2VycHJpbnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZVRhYmxlX3JpZ2h0Tm9kZV92MigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQYWNrYWdlVGFibGUgcGFja2FnZVRhYmxlID0KKyAgICAgICAgICAgICAgICBQYWNrYWdlVGFibGUuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdFBhY2thZ2VNYXBCeXRlQnVmZmVyKDIpKTsKKworICAgICAgICBQYWNrYWdlVGFibGUuTm9kZSBub2RlMSA9IHBhY2thZ2VUYWJsZS5nZXQoImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiKTsKKyAgICAgICAgUGFja2FnZVRhYmxlLk5vZGUgbm9kZTIgPSBwYWNrYWdlVGFibGUuZ2V0KCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIik7CisgICAgICAgIFBhY2thZ2VUYWJsZS5Ob2RlIG5vZGU0ID0gcGFja2FnZVRhYmxlLmdldCgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIpOworCisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsIG5vZGUxLmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiLCBub2RlMi5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80Iiwgbm9kZTQuZ2V0UGFja2FnZU5hbWUoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vZGUxLmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5vZGUyLmdldFBhY2thZ2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG5vZGU0LmdldFBhY2thZ2VJZCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbm9kZTEuZ2V0Qm9vbGVhblN0YXJ0SW5kZXgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBub2RlMi5nZXRCb29sZWFuU3RhcnRJbmRleCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDYsIG5vZGU0LmdldEJvb2xlYW5TdGFydEluZGV4KCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygxNzUsIG5vZGUxLmdldE5leHRPZmZzZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgbm9kZTIuZ2V0TmV4dE9mZnNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBub2RlNC5nZXROZXh0T2Zmc2V0KCkpOworCisgICAgICAgIGFzc2VydFRydWUobm9kZTEuaGFzUGFja2FnZUZpbmdlcnByaW50KCkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGUyLmhhc1BhY2thZ2VGaW5nZXJwcmludCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShub2RlNC5oYXNQYWNrYWdlRmluZ2VycHJpbnQoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0zMTk3Nzk1NTYzMTE5MzkzNTMwTCwgbm9kZTEuZ2V0UGFja2FnZUZpbmdlcnByaW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDQzMTk0MDUwMjI3NDg1Nzk2NEwsIG5vZGUyLmdldFBhY2thZ2VGaW5nZXJwcmludCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0yMjEzNTE0MTU1OTk3OTI5MjQxTCwgbm9kZTQuZ2V0UGFja2FnZUZpbmdlcnByaW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhY2thZ2VUYWJsZV9nZXRQYWNrYWdlTGlzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQYWNrYWdlVGFibGUgcGFja2FnZVRhYmxlID0KKyAgICAgICAgICAgICAgICBQYWNrYWdlVGFibGUuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdFBhY2thZ2VNYXBCeXRlQnVmZmVyKDIpKTsKKyAgICAgICAgU2V0PFN0cmluZz4gcGFja2FnZXMgPSBuZXcgSGFzaFNldDw+KHBhY2thZ2VUYWJsZS5nZXRQYWNrYWdlTGlzdCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHBhY2thZ2VzLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUocGFja2FnZXMuY29udGFpbnMoImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiKSk7CisgICAgICAgIGFzc2VydFRydWUocGFja2FnZXMuY29udGFpbnMoImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiKSk7CisgICAgICAgIGFzc2VydFRydWUocGFja2FnZXMuY29udGFpbnMoImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiKSk7CisKKyAgICAgICAgcGFja2FnZVRhYmxlID0gUGFja2FnZVRhYmxlLmZyb21CeXRlcyhUZXN0RGF0YVV0aWxzLmdldFRlc3RQYWNrYWdlTWFwQnl0ZUJ1ZmZlcigxKSk7CisgICAgICAgIHBhY2thZ2VzID0gbmV3IEhhc2hTZXQ8PihwYWNrYWdlVGFibGUuZ2V0UGFja2FnZUxpc3QoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBwYWNrYWdlcy5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKHBhY2thZ2VzLmNvbnRhaW5zKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIikpOworICAgICAgICBhc3NlcnRUcnVlKHBhY2thZ2VzLmNvbnRhaW5zKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIikpOworICAgICAgICBhc3NlcnRUcnVlKHBhY2thZ2VzLmNvbnRhaW5zKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9TaXBIYXNoZXIxM1Rlc3QuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9TaXBIYXNoZXIxM1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDYyMGQyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL1NpcEhhc2hlcjEzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKKworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlNpcEhhc2hlcjEzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIFNpcEhhc2hlcjEzVGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2lwSGFzaF9oYXNoU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyB0ZXN0U3RyID0gImNvbS5nb29nbGUuYW5kcm9pZC50ZXN0IjsKKyAgICAgICAgbG9uZyByZXN1bHQgPSBTaXBIYXNoZXIxMy5oYXNoKHRlc3RTdHIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDB4Rjg2NTcyRUZGOUM0QTBDMUwsIHJlc3VsdCk7CisKKyAgICAgICAgdGVzdFN0ciA9ICJhYmNkZWZnIjsKKyAgICAgICAgcmVzdWx0ID0gU2lwSGFzaGVyMTMuaGFzaCh0ZXN0U3RyLmdldEJ5dGVzKFVURl84KSk7CisgICAgICAgIGFzc2VydEVxdWFscygweDIyOTVFRjQ0QkQwNzhBRTlMLCByZXN1bHQpOworCisgICAgICAgIHRlc3RTdHIgPSAiYWJjZGVmZ2giOworICAgICAgICByZXN1bHQgPSBTaXBIYXNoZXIxMy5oYXNoKHRlc3RTdHIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDB4NUNENzY1N0ZBN0Y5NkMxNkwsIHJlc3VsdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL1N0b3JhZ2VGaWxlUHJvdmlkZXJUZXN0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvU3RvcmFnZUZpbGVQcm92aWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjcyMGY5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL1N0b3JhZ2VGaWxlUHJvdmlkZXJUZXN0LmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GbGFnVGFibGU7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1ZhbHVlTGlzdDsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5QYWNrYWdlVGFibGU7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuU3RvcmFnZUZpbGVQcm92aWRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7CisKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitAUnVuV2l0aChKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgU3RvcmFnZUZpbGVQcm92aWRlclRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0bGlzdENvbnRhaW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RvcmFnZUZpbGVQcm92aWRlciBwID0KKyAgICAgICAgICAgICAgICBuZXcgU3RvcmFnZUZpbGVQcm92aWRlcihUZXN0RGF0YVV0aWxzLlRFU1REQVRBX1BBVEgsIFRlc3REYXRhVXRpbHMuVEVTVERBVEFfUEFUSCk7CisgICAgICAgIFN0cmluZ1tdIGV4Y2x1ZGVzID0ge307CisgICAgICAgIExpc3Q8U3RyaW5nPiBjb250YWluZXJzID0gcC5saXN0Q29udGFpbmVycyhleGNsdWRlcyk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBjb250YWluZXJzLnNpemUoKSk7CisKKyAgICAgICAgZXhjbHVkZXMgPSBuZXcgU3RyaW5nW10geyJtb2NrLnYxIn07CisgICAgICAgIGNvbnRhaW5lcnMgPSBwLmxpc3RDb250YWluZXJzKGV4Y2x1ZGVzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvbnRhaW5lcnMuc2l6ZSgpKTsKKworICAgICAgICBwID0gbmV3IFN0b3JhZ2VGaWxlUHJvdmlkZXIoImZha2UvcGF0aC8iLCAiZmFrZS9wYXRoLyIpOworICAgICAgICBjb250YWluZXJzID0gcC5saXN0Q29udGFpbmVycyhleGNsdWRlcyk7CisgICAgICAgIGFzc2VydFRydWUoY29udGFpbmVycy5pc0VtcHR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvYWRGaWxlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdG9yYWdlRmlsZVByb3ZpZGVyIHAgPQorICAgICAgICAgICAgICAgIG5ldyBTdG9yYWdlRmlsZVByb3ZpZGVyKFRlc3REYXRhVXRpbHMuVEVTVERBVEFfUEFUSCwgVGVzdERhdGFVdGlscy5URVNUREFUQV9QQVRIKTsKKyAgICAgICAgUGFja2FnZVRhYmxlIHB0ID0gcC5nZXRQYWNrYWdlVGFibGUoIm1vY2sudjEiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwdCk7CisgICAgICAgIEZsYWdUYWJsZSBmID0gcC5nZXRGbGFnVGFibGUoIm1vY2sudjEiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChmKTsKKyAgICAgICAgRmxhZ1ZhbHVlTGlzdCB2ID0gcC5nZXRGbGFnVmFsdWVMaXN0KCJtb2NrLnYxIik7CisgICAgICAgIGFzc2VydE5vdE51bGwodik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL1Rlc3REYXRhVXRpbHMuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9UZXN0RGF0YVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg4OTcxZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9UZXN0RGF0YVV0aWxzLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworcHVibGljIGZpbmFsIGNsYXNzIFRlc3REYXRhVXRpbHMgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BBQ0tBR0VfTUFQX1BBVEggPSAibW9jay52JWQucGFja2FnZS5tYXAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0ZMQUdfTUFQX1BBVEggPSAibW9jay52JWQuZmxhZy5tYXAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0ZMQUdfVkFMX1BBVEggPSAibW9jay52JWQudmFsIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9GTEFHX0lORk9fUEFUSCA9ICJtb2NrLnYlZC5pbmZvIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1REQVRBX1BBVEggPSAiL2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfc3RvcmFnZV9maWxlX3Rlc3RfamF2YS90ZXN0ZGF0YS8iOworCisgICAgcHVibGljIHN0YXRpYyBCeXRlQnVmZmVyIGdldFRlc3RQYWNrYWdlTWFwQnl0ZUJ1ZmZlcihpbnQgdmVyc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZWFkRmlsZShURVNUREFUQV9QQVRIICsgU3RyaW5nLmZvcm1hdChURVNUX1BBQ0tBR0VfTUFQX1BBVEgsIHZlcnNpb24pKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEJ5dGVCdWZmZXIgZ2V0VGVzdEZsYWdNYXBCeXRlQnVmZmVyKGludCB2ZXJzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJlYWRGaWxlKFRFU1REQVRBX1BBVEggKyBTdHJpbmcuZm9ybWF0KFRFU1RfRkxBR19NQVBfUEFUSCwgdmVyc2lvbikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQnl0ZUJ1ZmZlciBnZXRUZXN0RmxhZ1ZhbEJ5dGVCdWZmZXIoaW50IHZlcnNpb24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmVhZEZpbGUoVEVTVERBVEFfUEFUSCArIFN0cmluZy5mb3JtYXQoVEVTVF9GTEFHX1ZBTF9QQVRILCB2ZXJzaW9uKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBCeXRlQnVmZmVyIGdldFRlc3RGbGFnSW5mb0J5dGVCdWZmZXIoaW50IHZlcnNpb24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmVhZEZpbGUoVEVTVERBVEFfUEFUSCArIFN0cmluZy5mb3JtYXQoVEVTVF9GTEFHX0lORk9fUEFUSCwgdmVyc2lvbikpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEJ5dGVCdWZmZXIgcmVhZEZpbGUoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChpbnB1dC5yZWFkQWxsQnl0ZXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zdG9yYWdlX2ZpbGVfdGVzdC5jcHAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3N0b3JhZ2VfZmlsZV90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzAwOGFmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zdG9yYWdlX2ZpbGVfdGVzdC5jcHAKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9yZXN1bHQuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgImFjb25maWdfc3RvcmFnZS9hY29uZmlnX3N0b3JhZ2VfZmlsZS5ocHAiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpiYXNlOwordXNpbmcgbmFtZXNwYWNlIGFjb25maWdfc3RvcmFnZTsKKwordm9pZCB2ZXJpZnlfdmFsdWUoY29uc3QgRmxhZ1ZhbHVlU3VtbWFyeSYgZmxhZywgY29uc3Qgc3RkOjpzdHJpbmcmIHBhY2thZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbGFnX25hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbGFnX3ZhbCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZV90eXBlKSB7CisgIEFTU0VSVF9FUShmbGFnLnBhY2thZ2VfbmFtZSwgcGFja2FnZV9uYW1lKTsKKyAgQVNTRVJUX0VRKGZsYWcuZmxhZ19uYW1lLCBmbGFnX25hbWUpOworICBBU1NFUlRfRVEoZmxhZy5mbGFnX3ZhbHVlLCBmbGFnX3ZhbCk7CisgIEFTU0VSVF9FUShmbGFnLnZhbHVlX3R5cGUsIHZhbHVlX3R5cGUpOworfQorCit2b2lkIHZlcmlmeV92YWx1ZV9pbmZvKGNvbnN0IEZsYWdWYWx1ZUFuZEluZm9TdW1tYXJ5JiBmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmxhZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmxhZ192YWwsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZV90eXBlLCBib29sIGlzX3JlYWR3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfc2VydmVyX292ZXJyaWRlLCBib29sIGhhc19sb2NhbF9vdmVycmlkZSkgeworICBBU1NFUlRfRVEoZmxhZy5wYWNrYWdlX25hbWUsIHBhY2thZ2VfbmFtZSk7CisgIEFTU0VSVF9FUShmbGFnLmZsYWdfbmFtZSwgZmxhZ19uYW1lKTsKKyAgQVNTRVJUX0VRKGZsYWcuZmxhZ192YWx1ZSwgZmxhZ192YWwpOworICBBU1NFUlRfRVEoZmxhZy52YWx1ZV90eXBlLCB2YWx1ZV90eXBlKTsKKyAgQVNTRVJUX0VRKGZsYWcuaXNfcmVhZHdyaXRlLCBpc19yZWFkd3JpdGUpOworICBBU1NFUlRfRVEoZmxhZy5oYXNfc2VydmVyX292ZXJyaWRlLCBoYXNfc2VydmVyX292ZXJyaWRlKTsKKyAgQVNTRVJUX0VRKGZsYWcuaGFzX2xvY2FsX292ZXJyaWRlLCBoYXNfbG9jYWxfb3ZlcnJpZGUpOworfQorCitSZXN1bHQ8c3RkOjp2ZWN0b3I8RmxhZ1ZhbHVlU3VtbWFyeT4+IGdldF9mbGFnX2xpc3RfcmVzdWx0KAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHZlcnNpb24pIHsKKyAgYXV0byBjb25zdCB0ZXN0X2Jhc2VfZGlyID0gR2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpOworICBhdXRvIGNvbnN0IHRlc3RfZGlyID0gdGVzdF9iYXNlX2RpciArICIvZGF0YS92IiArIHZlcnNpb247CisgIGF1dG8gY29uc3QgcGFja2FnZV9tYXAgPSB0ZXN0X2RpciArICIvcGFja2FnZV92IiArIHZlcnNpb24gKyAiLm1hcCI7CisgIGF1dG8gY29uc3QgZmxhZ19tYXAgPSB0ZXN0X2RpciArICIvZmxhZ192IiArIHZlcnNpb24gKyAiLm1hcCI7CisgIGF1dG8gY29uc3QgZmxhZ192YWwgPSB0ZXN0X2RpciArICIvZmxhZ192IiArIHZlcnNpb24gKyAiLnZhbCI7CisgIHJldHVybiBhY29uZmlnX3N0b3JhZ2U6Omxpc3RfZmxhZ3MocGFja2FnZV9tYXAsIGZsYWdfbWFwLCBmbGFnX3ZhbCk7Cit9CisKK1Jlc3VsdDxzdGQ6OnZlY3RvcjxGbGFnVmFsdWVBbmRJbmZvU3VtbWFyeT4+IGdldF9mbGFnX2xpc3RfcmVzdWx0X3dpdGhfaW5mbygKKyAgICBjb25zdCBzdGQ6OnN0cmluZyB2ZXJzaW9uKSB7CisgIGF1dG8gY29uc3QgdGVzdF9iYXNlX2RpciA9IEdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKTsKKyAgYXV0byBjb25zdCB0ZXN0X2RpciA9IHRlc3RfYmFzZV9kaXIgKyAiL2RhdGEvdiIgKyB2ZXJzaW9uOworICBhdXRvIGNvbnN0IHBhY2thZ2VfbWFwID0gdGVzdF9kaXIgKyAiL3BhY2thZ2VfdiIgKyB2ZXJzaW9uICsgIi5tYXAiOworICBhdXRvIGNvbnN0IGZsYWdfbWFwID0gdGVzdF9kaXIgKyAiL2ZsYWdfdiIgKyB2ZXJzaW9uICsgIi5tYXAiOworICBhdXRvIGNvbnN0IGZsYWdfdmFsID0gdGVzdF9kaXIgKyAiL2ZsYWdfdiIgKyB2ZXJzaW9uICsgIi52YWwiOworICBhdXRvIGNvbnN0IGZsYWdfaW5mbyA9IHRlc3RfZGlyICsgIi9mbGFnX3YiICsgdmVyc2lvbiArICIuaW5mbyI7CisgIHJldHVybiBhY29uZmlnX3N0b3JhZ2U6Omxpc3RfZmxhZ3Nfd2l0aF9pbmZvKHBhY2thZ2VfbWFwLCBmbGFnX21hcCwgZmxhZ192YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdfaW5mbyk7Cit9CisKK1RFU1QoQWNvbmZpZ1N0b3JhZ2VGaWxlVGVzdCwgdGVzdF9saXN0X2ZsYWcpIHsKKyAgYXV0byBmbGFnX2xpc3RfcmVzdWx0ID0gZ2V0X2ZsYWdfbGlzdF9yZXN1bHQoIjEiKTsKKyAgQVNTRVJUX1RSVUUoZmxhZ19saXN0X3Jlc3VsdC5vaygpKTsKKworICBhdXRvIGNvbnN0JiBmbGFnX2xpc3QgPSAqZmxhZ19saXN0X3Jlc3VsdDsKKyAgQVNTRVJUX0VRKGZsYWdfbGlzdC5zaXplKCksIDgpOworICB2ZXJpZnlfdmFsdWUoZmxhZ19saXN0WzBdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsCisgICAgICAgICAgICAgICAiZGlzYWJsZWRfcnciLCAiZmFsc2UiLCAiUmVhZFdyaXRlQm9vbGVhbiIpOworICB2ZXJpZnlfdmFsdWUoZmxhZ19saXN0WzFdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsICJlbmFibGVkX3JvIiwKKyAgICAgICAgICAgICAgICJ0cnVlIiwgIlJlYWRPbmx5Qm9vbGVhbiIpOworICB2ZXJpZnlfdmFsdWUoZmxhZ19saXN0WzJdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsICJlbmFibGVkX3J3IiwKKyAgICAgICAgICAgICAgICJ0cnVlIiwgIlJlYWRXcml0ZUJvb2xlYW4iKTsKKyAgdmVyaWZ5X3ZhbHVlKGZsYWdfbGlzdFszXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiLAorICAgICAgICAgICAgICAgImRpc2FibGVkX3J3IiwgImZhbHNlIiwgIlJlYWRXcml0ZUJvb2xlYW4iKTsKKyAgdmVyaWZ5X3ZhbHVlKGZsYWdfbGlzdFs0XSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiLAorICAgICAgICAgICAgICAgImVuYWJsZWRfZml4ZWRfcm8iLCAidHJ1ZSIsICJGaXhlZFJlYWRPbmx5Qm9vbGVhbiIpOworICB2ZXJpZnlfdmFsdWUoZmxhZ19saXN0WzVdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIsICJlbmFibGVkX3JvIiwKKyAgICAgICAgICAgICAgICJ0cnVlIiwgIlJlYWRPbmx5Qm9vbGVhbiIpOworICB2ZXJpZnlfdmFsdWUoZmxhZ19saXN0WzZdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIsCisgICAgICAgICAgICAgICAiZW5hYmxlZF9maXhlZF9ybyIsICJ0cnVlIiwgIkZpeGVkUmVhZE9ubHlCb29sZWFuIik7CisgIHZlcmlmeV92YWx1ZShmbGFnX2xpc3RbN10sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IiwgImVuYWJsZWRfcnciLAorICAgICAgICAgICAgICAgInRydWUiLCAiUmVhZFdyaXRlQm9vbGVhbiIpOworfQorCisvLyBUT0RPOiBiLzM3NjI1NjQ3MiAtIFVzZSBwYXJhbWV0ZXJpemVkIHRlc3RzLgorVEVTVChBY29uZmlnU3RvcmFnZUZpbGVUZXN0LCB0ZXN0X2xpc3RfZmxhZ192MikgeworICBhdXRvIGZsYWdfbGlzdF9yZXN1bHQgPSBnZXRfZmxhZ19saXN0X3Jlc3VsdCgiMiIpOworICBBU1NFUlRfVFJVRShmbGFnX2xpc3RfcmVzdWx0Lm9rKCkpOworCisgIGF1dG8gY29uc3QmIGZsYWdfbGlzdCA9ICpmbGFnX2xpc3RfcmVzdWx0OworICBBU1NFUlRfRVEoZmxhZ19saXN0LnNpemUoKSwgOCk7CisgIHZlcmlmeV92YWx1ZShmbGFnX2xpc3RbMF0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiwKKyAgICAgICAgICAgICAgICJkaXNhYmxlZF9ydyIsICJmYWxzZSIsICJSZWFkV3JpdGVCb29sZWFuIik7CisgIHZlcmlmeV92YWx1ZShmbGFnX2xpc3RbMV0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiwgImVuYWJsZWRfcm8iLAorICAgICAgICAgICAgICAgInRydWUiLCAiUmVhZE9ubHlCb29sZWFuIik7CisgIHZlcmlmeV92YWx1ZShmbGFnX2xpc3RbMl0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiwgImVuYWJsZWRfcnciLAorICAgICAgICAgICAgICAgInRydWUiLCAiUmVhZFdyaXRlQm9vbGVhbiIpOworICB2ZXJpZnlfdmFsdWUoZmxhZ19saXN0WzNdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIsCisgICAgICAgICAgICAgICAiZGlzYWJsZWRfcnciLCAiZmFsc2UiLCAiUmVhZFdyaXRlQm9vbGVhbiIpOworICB2ZXJpZnlfdmFsdWUoZmxhZ19saXN0WzRdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIsCisgICAgICAgICAgICAgICAiZW5hYmxlZF9maXhlZF9ybyIsICJ0cnVlIiwgIkZpeGVkUmVhZE9ubHlCb29sZWFuIik7CisgIHZlcmlmeV92YWx1ZShmbGFnX2xpc3RbNV0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIiwgImVuYWJsZWRfcm8iLAorICAgICAgICAgICAgICAgInRydWUiLCAiUmVhZE9ubHlCb29sZWFuIik7CisgIHZlcmlmeV92YWx1ZShmbGFnX2xpc3RbNl0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IiwKKyAgICAgICAgICAgICAgICJlbmFibGVkX2ZpeGVkX3JvIiwgInRydWUiLCAiRml4ZWRSZWFkT25seUJvb2xlYW4iKTsKKyAgdmVyaWZ5X3ZhbHVlKGZsYWdfbGlzdFs3XSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiLCAiZW5hYmxlZF9ydyIsCisgICAgICAgICAgICAgICAidHJ1ZSIsICJSZWFkV3JpdGVCb29sZWFuIik7Cit9CisKK1RFU1QoQWNvbmZpZ1N0b3JhZ2VGaWxlVGVzdCwgdGVzdF9saXN0X2ZsYWdfd2l0aF9pbmZvKSB7CisgIGF1dG8gZmxhZ19saXN0X3Jlc3VsdCA9IGdldF9mbGFnX2xpc3RfcmVzdWx0X3dpdGhfaW5mbygiMSIpOworICBBU1NFUlRfVFJVRShmbGFnX2xpc3RfcmVzdWx0Lm9rKCkpOworCisgIGF1dG8gY29uc3QmIGZsYWdfbGlzdCA9ICpmbGFnX2xpc3RfcmVzdWx0OworICBBU1NFUlRfRVEoZmxhZ19saXN0LnNpemUoKSwgOCk7CisgIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFswXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiLAorICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZWRfcnciLCAiZmFsc2UiLCAiUmVhZFdyaXRlQm9vbGVhbiIsIHRydWUsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFsxXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiLAorICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZF9ybyIsICJ0cnVlIiwgIlJlYWRPbmx5Qm9vbGVhbiIsIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICB2ZXJpZnlfdmFsdWVfaW5mbyhmbGFnX2xpc3RbMl0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiwKKyAgICAgICAgICAgICAgICAgICAgImVuYWJsZWRfcnciLCAidHJ1ZSIsICJSZWFkV3JpdGVCb29sZWFuIiwgdHJ1ZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgdmVyaWZ5X3ZhbHVlX2luZm8oZmxhZ19saXN0WzNdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIsCisgICAgICAgICAgICAgICAgICAgICJkaXNhYmxlZF9ydyIsICJmYWxzZSIsICJSZWFkV3JpdGVCb29sZWFuIiwgdHJ1ZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgdmVyaWZ5X3ZhbHVlX2luZm8oZmxhZ19saXN0WzRdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIsCisgICAgICAgICAgICAgICAgICAgICJlbmFibGVkX2ZpeGVkX3JvIiwgInRydWUiLCAiRml4ZWRSZWFkT25seUJvb2xlYW4iLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKKyAgdmVyaWZ5X3ZhbHVlX2luZm8oZmxhZ19saXN0WzVdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIsCisgICAgICAgICAgICAgICAgICAgICJlbmFibGVkX3JvIiwgInRydWUiLCAiUmVhZE9ubHlCb29sZWFuIiwgZmFsc2UsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFs2XSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiLAorICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZF9maXhlZF9ybyIsICJ0cnVlIiwgIkZpeGVkUmVhZE9ubHlCb29sZWFuIiwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7CisgIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFs3XSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiLAorICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZF9ydyIsICJ0cnVlIiwgIlJlYWRXcml0ZUJvb2xlYW4iLCB0cnVlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworfQorCitURVNUKEFjb25maWdTdG9yYWdlRmlsZVRlc3QsIHRlc3RfbGlzdF9mbGFnX3dpdGhfaW5mb192MikgeworICBhdXRvIGZsYWdfbGlzdF9yZXN1bHQgPSBnZXRfZmxhZ19saXN0X3Jlc3VsdF93aXRoX2luZm8oIjIiKTsKKyAgQVNTRVJUX1RSVUUoZmxhZ19saXN0X3Jlc3VsdC5vaygpKTsKKworICBhdXRvIGNvbnN0JiBmbGFnX2xpc3QgPSAqZmxhZ19saXN0X3Jlc3VsdDsKKyAgQVNTRVJUX0VRKGZsYWdfbGlzdC5zaXplKCksIDgpOworICB2ZXJpZnlfdmFsdWVfaW5mbyhmbGFnX2xpc3RbMF0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiwKKyAgICAgICAgICAgICAgICAgICAgImRpc2FibGVkX3J3IiwgImZhbHNlIiwgIlJlYWRXcml0ZUJvb2xlYW4iLCB0cnVlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICB2ZXJpZnlfdmFsdWVfaW5mbyhmbGFnX2xpc3RbMV0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiwKKyAgICAgICAgICAgICAgICAgICAgImVuYWJsZWRfcm8iLCAidHJ1ZSIsICJSZWFkT25seUJvb2xlYW4iLCBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgdmVyaWZ5X3ZhbHVlX2luZm8oZmxhZ19saXN0WzJdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsCisgICAgICAgICAgICAgICAgICAgICJlbmFibGVkX3J3IiwgInRydWUiLCAiUmVhZFdyaXRlQm9vbGVhbiIsIHRydWUsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFszXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiLAorICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZWRfcnciLCAiZmFsc2UiLCAiUmVhZFdyaXRlQm9vbGVhbiIsIHRydWUsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFs0XSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiLAorICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZF9maXhlZF9ybyIsICJ0cnVlIiwgIkZpeGVkUmVhZE9ubHlCb29sZWFuIiwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7CisgIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFs1XSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiLAorICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZF9ybyIsICJ0cnVlIiwgIlJlYWRPbmx5Qm9vbGVhbiIsIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICB2ZXJpZnlfdmFsdWVfaW5mbyhmbGFnX2xpc3RbNl0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IiwKKyAgICAgICAgICAgICAgICAgICAgImVuYWJsZWRfZml4ZWRfcm8iLCAidHJ1ZSIsICJGaXhlZFJlYWRPbmx5Qm9vbGVhbiIsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpOworICB2ZXJpZnlfdmFsdWVfaW5mbyhmbGFnX2xpc3RbN10sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IiwKKyAgICAgICAgICAgICAgICAgICAgImVuYWJsZWRfcnciLCAidHJ1ZSIsICJSZWFkV3JpdGVCb29sZWFuIiwgdHJ1ZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL0FuZHJvaWQuYnAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MzQxYjkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTcwIEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCit9CisKK3J1c3RfZGVmYXVsdHMgeworICAgIG5hbWU6ICJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkuZGVmYXVsdHMiLAorICAgIGVkaXRpb246ICIyMDIxIiwKKyAgICBsaW50czogIm5vbmUiLAorICAgIHNyY3M6IFsic3JjL2xpYi5ycyJdLAorICAgIHJ1c3RsaWJzOiBbCisgICAgICAgICJsaWJhbnlob3ciLAorICAgICAgICAibGlibWVtbWFwMiIsCisgICAgICAgICJsaWJjeHgiLAorICAgICAgICAibGlidGhpc2Vycm9yIiwKKyAgICAgICAgImxpYmFjb25maWdfc3RvcmFnZV9maWxlIiwKKyAgICBdLAorfQorCitydXN0X2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkiLAorICAgIGNyYXRlX25hbWU6ICJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIGRlZmF1bHRzOiBbImFjb25maWdfc3RvcmFnZV9yZWFkX2FwaS5kZWZhdWx0cyJdLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6YW55YXBleCIsCisgICAgXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCit9CisKK3J1c3RfdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpLnRlc3QiLAorICAgIHRlc3Rfc3VpdGVzOiBbImdlbmVyYWwtdGVzdHMiXSwKKyAgICBkZWZhdWx0czogWyJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkuZGVmYXVsdHMiXSwKKyAgICBydXN0bGliczogWworICAgICAgICAibGlicmFuZCIsCisgICAgXSwKKyAgICBkYXRhOiBbCisgICAgICAgICJ0ZXN0cy9kYXRhL3YxL3BhY2thZ2VfdjEubWFwIiwKKyAgICAgICAgInRlc3RzL2RhdGEvdjEvZmxhZ192MS5tYXAiLAorICAgICAgICAidGVzdHMvZGF0YS92MS9mbGFnX3YxLnZhbCIsCisgICAgICAgICJ0ZXN0cy9kYXRhL3YxL2ZsYWdfdjEuaW5mbyIsCisgICAgXSwKK30KKworLy8gY3h4IHNvdXJjZSBjb2RlZ2VuIGZyb20gcnVzdCBhcGkKK2dlbnJ1bGUgeworICAgIG5hbWU6ICJsaWJjeHhfYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX2JyaWRnZV9jb2RlIiwKKyAgICB0b29sczogWyJjeHhicmlkZ2UiXSwKKyAgICBjbWQ6ICIkKGxvY2F0aW9uIGN4eGJyaWRnZSkgJChpbikgPiAkKG91dCkiLAorICAgIHNyY3M6IFsic3JjL2xpYi5ycyJdLAorICAgIG91dDogWyJhY29uZmlnX3N0b3JhZ2UvbGliLnJzLmNjIl0sCit9CisKKy8vIGN4eCBoZWFkZXIgY29kZWdlbiBmcm9tIHJ1c3QgYXBpCitnZW5ydWxlIHsKKyAgICBuYW1lOiAibGliY3h4X2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9icmlkZ2VfaGVhZGVyIiwKKyAgICB0b29sczogWyJjeHhicmlkZ2UiXSwKKyAgICBjbWQ6ICIkKGxvY2F0aW9uIGN4eGJyaWRnZSkgJChpbikgLS1oZWFkZXIgPiAkKG91dCkiLAorICAgIHNyY3M6IFsic3JjL2xpYi5ycyJdLAorICAgIG91dDogWyJhY29uZmlnX3N0b3JhZ2UvbGliLnJzLmgiXSwKK30KKworLy8gYSBzdGF0aWMgY2MgbGliIGJhc2VkIG9uIGdlbmVyYXRlZCBjb2RlCitydXN0X2ZmaV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlfY3h4X2JyaWRnZSIsCisgICAgY3JhdGVfbmFtZTogImFjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9jeHhfYnJpZGdlIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHByb2R1Y3RfYXZhaWxhYmxlOiB0cnVlLAorICAgIGRlZmF1bHRzOiBbImFjb25maWdfc3RvcmFnZV9yZWFkX2FwaS5kZWZhdWx0cyJdLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6YW55YXBleCIsCisgICAgXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCit9CisKKy8vIGZsYWcgcmVhZCBhcGkgY2MgaW50ZXJmYWNlCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX2NjIiwKKyAgICBzcmNzOiBbImFjb25maWdfc3RvcmFnZV9yZWFkX2FwaS5jcHAiXSwKKyAgICBnZW5lcmF0ZWRfaGVhZGVyczogWworICAgICAgICAiY3h4LWJyaWRnZS1oZWFkZXIiLAorICAgICAgICAibGliY3h4X2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9icmlkZ2VfaGVhZGVyIiwKKyAgICBdLAorICAgIGdlbmVyYXRlZF9zb3VyY2VzOiBbImxpYmN4eF9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlfYnJpZGdlX2NvZGUiXSwKKyAgICB3aG9sZV9zdGF0aWNfbGliczogWyJsaWJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlfY3h4X2JyaWRnZSJdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICBdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgcHJvZHVjdF9hdmFpbGFibGU6IHRydWUsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTphbnlhcGV4IiwKKyAgICBdLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgbGludXg6IHsKKyAgICAgICAgICAgIHZlcnNpb25fc2NyaXB0OiAibGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX2NjLm1hcCIsCisgICAgICAgIH0sCisgICAgfSwKKyAgICBkb3VibGVfbG9hZGFibGU6IHRydWUsCisgICAgYWZkbzogdHJ1ZSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJhY29uZmlnX2xpYl9jY19zaGFyZWRfbGluay5kZWZhdWx0cyIsCisgICAgc2hhcmVkX2xpYnM6IHNlbGVjdChyZWxlYXNlX2ZsYWcoIlJFTEVBU0VfUkVBRF9GUk9NX05FV19TVE9SQUdFIiksIHsKKyAgICAgICAgdHJ1ZTogWyJsaWJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlfY2MiXSwKKyAgICAgICAgZGVmYXVsdDogW10sCisgICAgfSksCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiYWNvbmZpZ19saWJfY2Nfc3RhdGljX2xpbmsuZGVmYXVsdHMiLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlfY2MiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorfQorCitydXN0X2ZmaV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlfcnVzdF9qbmkiLAorICAgIGNyYXRlX25hbWU6ICJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlfcnVzdF9qbmkiLAorICAgIHNyY3M6IFsic3Jjcy9saWIucnMiXSwKKyAgICBydXN0bGliczogWworICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX2ZpbGUiLAorICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpIiwKKyAgICAgICAgImxpYmFueWhvdyIsCisgICAgICAgICJsaWJqbmkiLAorICAgIF0sCisgICAgcHJlZmVyX3JsaWI6IHRydWUsCit9CisKK2phdmFfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmFjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9qYXZhIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0Fjb25maWdTdG9yYWdlUmVhZEFQSS5qYXZhIiwKKyAgICAgICAgInNyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvRmxhZ1JlYWRDb250ZXh0LmphdmEiLAorICAgICAgICAic3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9QYWNrYWdlUmVhZENvbnRleHQuamF2YSIsCisgICAgXSwKKyAgICByZXF1aXJlZDogWyJsaWJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlfcnVzdF9qbmkiXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICJVcHNpZGVEb3duQ2FrZSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6YW55YXBleCIsCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICBdLAorfQorCitqYXZhX2xpYnJhcnkgeworICAgIG5hbWU6ICJhY29uZmlnX3N0b3JhZ2VfcmVhZGVyX2phdmEiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInNyY3MvYW5kcm9pZC9vcy9mbGFnZ2luZy8qLmphdmEiLAorICAgIF0sCisgICAgbGliczogWworICAgICAgICAidW5zdXBwb3J0ZWRhcHB1c2FnZSIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYWNvbmZpZ19zdG9yYWdlX2ZpbGVfamF2YSIsCisgICAgXSwKKyAgICBzZGtfdmVyc2lvbjogImN1cnJlbnQiLAorICAgIHZpc2liaWxpdHk6IFsKKyAgICAgICAgIi8vZnJhbWV3b3Jrcy9iYXNlIiwKKyAgICAgICAgIi8vYnVpbGQvbWFrZS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL0NhcmdvLnRvbWwgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9DYXJnby50b21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMjdlNGIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9DYXJnby50b21sCkBAIC0wLDAgKzEsMjAgQEAKK1twYWNrYWdlXQorbmFtZSA9ICJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkiCit2ZXJzaW9uID0gIjAuMS4wIgorZWRpdGlvbiA9ICIyMDIxIgorCitbZmVhdHVyZXNdCitkZWZhdWx0ID0gWyJjYXJnbyJdCitjYXJnbyA9IFtdCisKK1tkZXBlbmRlbmNpZXNdCityYW5kID0gIjAuOC41IgorYW55aG93ID0gIjEuMC42OSIKK21lbW1hcDIgPSAiMC44LjAiCitjeHggPSAiMS4wIgordGhpc2Vycm9yID0gIjEuMC41NiIKK2Fjb25maWdfc3RvcmFnZV9maWxlID0geyBwYXRoID0gIi4uL2Fjb25maWdfc3RvcmFnZV9maWxlIiB9CisKK1tidWlsZC1kZXBlbmRlbmNpZXNdCitwcm90b2J1Zi1jb2RlZ2VuID0gIjMuMi4wIgorY3h4LWJ1aWxkID0gIjEuMCIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS5jcHAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMGM0ZTEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkuY3BwCkBAIC0wLDAgKzEsMjAzIEBACisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJydXN0L2N4eC5oIgorI2luY2x1ZGUgImFjb25maWdfc3RvcmFnZS9saWIucnMuaCIKKyNpbmNsdWRlICJhY29uZmlnX3N0b3JhZ2UvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpLmhwcCIKKworbmFtZXNwYWNlIGFjb25maWdfc3RvcmFnZSB7CisKKy8vLyBTdG9yYWdlIGxvY2F0aW9uIHBiIGZpbGUKK3N0YXRpYyBjb25zdGV4cHIgY2hhciBrU3RvcmFnZURpcltdID0gIi9tZXRhZGF0YS9hY29uZmlnIjsKKworLy8vIGRlc3RydWN0b3IKK01hcHBlZFN0b3JhZ2VGaWxlOjp+TWFwcGVkU3RvcmFnZUZpbGUoKSB7CisgIG11bm1hcChmaWxlX3B0ciwgZmlsZV9zaXplKTsKK30KKworLy8vIEdldCBzdG9yYWdlIGZpbGUgcGF0aAorc3RhdGljIFJlc3VsdDxzdGQ6OnN0cmluZz4gZmluZF9zdG9yYWdlX2ZpbGUoCisgICAgc3RkOjpzdHJpbmcgY29uc3QmIHN0b3JhZ2VfZGlyLAorICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBjb250YWluZXIsCisgICAgU3RvcmFnZUZpbGVUeXBlIGZpbGVfdHlwZSkgeworICBzd2l0Y2goZmlsZV90eXBlKSB7CisgICAgY2FzZSBTdG9yYWdlRmlsZVR5cGU6OnBhY2thZ2VfbWFwOgorICAgICAgcmV0dXJuIHN0b3JhZ2VfZGlyICsgIi9tYXBzLyIgKyBjb250YWluZXIgKyAiLnBhY2thZ2UubWFwIjsKKyAgICBjYXNlIFN0b3JhZ2VGaWxlVHlwZTo6ZmxhZ19tYXA6CisgICAgICByZXR1cm4gc3RvcmFnZV9kaXIgKyAiL21hcHMvIiArIGNvbnRhaW5lciArICIuZmxhZy5tYXAiOworICAgIGNhc2UgU3RvcmFnZUZpbGVUeXBlOjpmbGFnX3ZhbDoKKyAgICAgIHJldHVybiBzdG9yYWdlX2RpciArICIvYm9vdC8iICsgY29udGFpbmVyICsgIi52YWwiOworICAgIGNhc2UgU3RvcmFnZUZpbGVUeXBlOjpmbGFnX2luZm86CisgICAgICByZXR1cm4gc3RvcmFnZV9kaXIgKyAiL2Jvb3QvIiArIGNvbnRhaW5lciArICIuaW5mbyI7CisgICAgZGVmYXVsdDoKKyAgICAgIGF1dG8gcmVzdWx0ID0gUmVzdWx0PHN0ZDo6c3RyaW5nPigpOworICAgICAgcmVzdWx0LmVycm1zZyA9ICJJbnZhbGlkIHN0b3JhZ2UgZmlsZSB0eXBlIjsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KKworbmFtZXNwYWNlIHByaXZhdGVfaW50ZXJuYWxfYXBpIHsKKworLy8vIEdldCBtYXBwZWQgZmlsZSBpbXBsZW1lbnRhdGlvbi4KK1Jlc3VsdDxNYXBwZWRTdG9yYWdlRmlsZSo+IGdldF9tYXBwZWRfZmlsZV9pbXBsKAorICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdG9yYWdlX2RpciwKKyAgICBzdGQ6OnN0cmluZyBjb25zdCYgY29udGFpbmVyLAorICAgIFN0b3JhZ2VGaWxlVHlwZSBmaWxlX3R5cGUpIHsKKyAgYXV0byBmaWxlX3Jlc3VsdCA9IGZpbmRfc3RvcmFnZV9maWxlKHN0b3JhZ2VfZGlyLCBjb250YWluZXIsIGZpbGVfdHlwZSk7CisgIGlmICghZmlsZV9yZXN1bHQub2soKSkgeworICAgIGF1dG8gcmVzdWx0ID0gUmVzdWx0PE1hcHBlZFN0b3JhZ2VGaWxlKj4oKTsKKyAgICByZXN1bHQuZXJybXNnID0gZmlsZV9yZXN1bHQuZXJyb3IoKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIHJldHVybiBtYXBfc3RvcmFnZV9maWxlKCpmaWxlX3Jlc3VsdCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIHByaXZhdGUgaW50ZXJuYWwgYXBpCisKKy8vLyBNYXAgYSBzdG9yYWdlIGZpbGUKK1Jlc3VsdDxNYXBwZWRTdG9yYWdlRmlsZSo+IG1hcF9zdG9yYWdlX2ZpbGUoc3RkOjpzdHJpbmcgY29uc3QmIGZpbGUpIHsKKyAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIHVmZChvcGVuKGZpbGUuY19zdHIoKSwgT19DTE9FWEVDIHwgT19OT0ZPTExPVyB8IE9fUkRPTkxZKSk7CisgIGlmICh1ZmQuZ2V0KCkgPT0gLTEpIHsKKyAgICBhdXRvIHJlc3VsdCA9IFJlc3VsdDxNYXBwZWRTdG9yYWdlRmlsZSo+KCk7CisgICAgcmVzdWx0LmVycm1zZyA9IHN0ZDo6c3RyaW5nKCJmYWlsZWQgdG8gb3BlbiAiKSArIGZpbGUgKyAiOiAiICsgc3RyZXJyb3IoZXJybm8pOworICAgIHJldHVybiByZXN1bHQ7CisgIH07CisKKyAgc3RydWN0IHN0YXQgZmRfc3RhdDsKKyAgaWYgKGZzdGF0KHVmZC5nZXQoKSwgJmZkX3N0YXQpIDwgMCkgeworICAgIGF1dG8gcmVzdWx0ID0gUmVzdWx0PE1hcHBlZFN0b3JhZ2VGaWxlKj4oKTsKKyAgICByZXN1bHQuZXJybXNnID0gc3RkOjpzdHJpbmcoImZzdGF0IGZhaWxlZDogIikgKyBzdHJlcnJvcihlcnJubyk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBzaXplX3QgZmlsZV9zaXplID0gZmRfc3RhdC5zdF9zaXplOworCisgIHZvaWQqIGNvbnN0IG1hcF9yZXN1bHQgPSBtbWFwKG51bGxwdHIsIGZpbGVfc2l6ZSwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCB1ZmQuZ2V0KCksIDApOworICBpZiAobWFwX3Jlc3VsdCA9PSBNQVBfRkFJTEVEKSB7CisgICAgYXV0byByZXN1bHQgPSBSZXN1bHQ8TWFwcGVkU3RvcmFnZUZpbGUqPigpOworICAgIHJlc3VsdC5lcnJtc2cgPSBzdGQ6OnN0cmluZygibW1hcCBmYWlsZWQ6ICIpICsgc3RyZXJyb3IoZXJybm8pOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBhdXRvIG1hcHBlZF9maWxlID0gbmV3IE1hcHBlZFN0b3JhZ2VGaWxlKCk7CisgIG1hcHBlZF9maWxlLT5maWxlX3B0ciA9IG1hcF9yZXN1bHQ7CisgIG1hcHBlZF9maWxlLT5maWxlX3NpemUgPSBmaWxlX3NpemU7CisKKyAgcmV0dXJuIG1hcHBlZF9maWxlOworfQorCisvLy8gTWFwIGZyb20gU3RvcmVkRmxhZ1R5cGUgdG8gRmxhZ1ZhbHVlVHlwZQorUmVzdWx0PEZsYWdWYWx1ZVR5cGU+IG1hcF90b19mbGFnX3ZhbHVlX3R5cGUoCisgICAgU3RvcmVkRmxhZ1R5cGUgc3RvcmVkX3R5cGUpIHsKKyAgc3dpdGNoIChzdG9yZWRfdHlwZSkgeworICAgIGNhc2UgU3RvcmVkRmxhZ1R5cGU6OlJlYWRXcml0ZUJvb2xlYW46CisgICAgY2FzZSBTdG9yZWRGbGFnVHlwZTo6UmVhZE9ubHlCb29sZWFuOgorICAgIGNhc2UgU3RvcmVkRmxhZ1R5cGU6OkZpeGVkUmVhZE9ubHlCb29sZWFuOgorICAgICAgcmV0dXJuIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW47CisgICAgZGVmYXVsdDoKKyAgICAgIGF1dG8gcmVzdWx0ID0gUmVzdWx0PEZsYWdWYWx1ZVR5cGU+KCk7CisgICAgICByZXN1bHQuZXJybXNnID0gIlVuc3VwcG9ydGVkIHN0b3JlZCBmbGFnIHR5cGUiOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQorCisvLy8gR2V0IG1hcHBlZCBzdG9yYWdlIGZpbGUKK1Jlc3VsdDxNYXBwZWRTdG9yYWdlRmlsZSo+IGdldF9tYXBwZWRfZmlsZSgKKyAgICBzdGQ6OnN0cmluZyBjb25zdCYgY29udGFpbmVyLAorICAgIFN0b3JhZ2VGaWxlVHlwZSBmaWxlX3R5cGUpIHsKKyAgcmV0dXJuIHByaXZhdGVfaW50ZXJuYWxfYXBpOjpnZXRfbWFwcGVkX2ZpbGVfaW1wbCgKKyAgICAgIGtTdG9yYWdlRGlyLCBjb250YWluZXIsIGZpbGVfdHlwZSk7Cit9CisKKy8vLyBHZXQgc3RvcmFnZSBmaWxlIHZlcnNpb24gbnVtYmVyCitSZXN1bHQ8dWludDMyX3Q+IGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbigKKyAgICBzdGQ6OnN0cmluZyBjb25zdCYgZmlsZV9wYXRoKSB7CisgIGF1dG8gdmVyc2lvbl9jeHggPSBnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb25fY3h4KAorICAgICAgcnVzdDo6U3RyKGZpbGVfcGF0aC5jX3N0cigpKSk7CisgIGlmICh2ZXJzaW9uX2N4eC5xdWVyeV9zdWNjZXNzKSB7CisgICAgcmV0dXJuIHZlcnNpb25fY3h4LnZlcnNpb25fbnVtYmVyOworICB9IGVsc2UgeworICAgIGF1dG8gcmVzdWx0ID0gUmVzdWx0PHVpbnQzMl90PigpOworICAgIHJlc3VsdC5lcnJtc2cgPSB2ZXJzaW9uX2N4eC5lcnJvcl9tZXNzYWdlLmNfc3RyKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQorCisvLy8gR2V0IHBhY2thZ2UgY29udGV4dAorUmVzdWx0PFBhY2thZ2VSZWFkQ29udGV4dD4gZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KAorICAgIE1hcHBlZFN0b3JhZ2VGaWxlIGNvbnN0JiBmaWxlLAorICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBwYWNrYWdlKSB7CisgIGF1dG8gY29udGVudCA9IHJ1c3Q6OlNsaWNlPGNvbnN0IHVpbnQ4X3Q+KAorICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdCo+KGZpbGUuZmlsZV9wdHIpLCBmaWxlLmZpbGVfc2l6ZSk7CisgIGF1dG8gY29udGV4dF9jeHggPSBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHRfY3h4KGNvbnRlbnQsIHJ1c3Q6OlN0cihwYWNrYWdlLmNfc3RyKCkpKTsKKyAgaWYgKGNvbnRleHRfY3h4LnF1ZXJ5X3N1Y2Nlc3MpIHsKKyAgICBhdXRvIGNvbnRleHQgPSBQYWNrYWdlUmVhZENvbnRleHQoKTsKKyAgICBjb250ZXh0LnBhY2thZ2VfZXhpc3RzID0gY29udGV4dF9jeHgucGFja2FnZV9leGlzdHM7CisgICAgY29udGV4dC5wYWNrYWdlX2lkID0gY29udGV4dF9jeHgucGFja2FnZV9pZDsKKyAgICBjb250ZXh0LmJvb2xlYW5fc3RhcnRfaW5kZXggPSBjb250ZXh0X2N4eC5ib29sZWFuX3N0YXJ0X2luZGV4OworICAgIHJldHVybiBjb250ZXh0OworICB9IGVsc2UgeworICAgIGF1dG8gcmVzdWx0ID0gUmVzdWx0PFBhY2thZ2VSZWFkQ29udGV4dD4oKTsKKyAgICByZXN1bHQuZXJybXNnID0gY29udGV4dF9jeHguZXJyb3JfbWVzc2FnZS5jX3N0cigpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KKworLy8vIEdldCBmbGFnIHJlYWQgY29udGV4dAorUmVzdWx0PEZsYWdSZWFkQ29udGV4dD4gZ2V0X2ZsYWdfcmVhZF9jb250ZXh0KAorICAgIE1hcHBlZFN0b3JhZ2VGaWxlIGNvbnN0JiBmaWxlLAorICAgIHVpbnQzMl90IHBhY2thZ2VfaWQsCisgICAgc3RkOjpzdHJpbmcgY29uc3QmIGZsYWdfbmFtZSl7CisgIGF1dG8gY29udGVudCA9IHJ1c3Q6OlNsaWNlPGNvbnN0IHVpbnQ4X3Q+KAorICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdCo+KGZpbGUuZmlsZV9wdHIpLCBmaWxlLmZpbGVfc2l6ZSk7CisgIGF1dG8gY29udGV4dF9jeHggPSBnZXRfZmxhZ19yZWFkX2NvbnRleHRfY3h4KGNvbnRlbnQsIHBhY2thZ2VfaWQsIHJ1c3Q6OlN0cihmbGFnX25hbWUuY19zdHIoKSkpOworICBpZiAoY29udGV4dF9jeHgucXVlcnlfc3VjY2VzcykgeworICAgIGF1dG8gY29udGV4dCA9IEZsYWdSZWFkQ29udGV4dCgpOworICAgIGNvbnRleHQuZmxhZ19leGlzdHMgPSBjb250ZXh0X2N4eC5mbGFnX2V4aXN0czsKKyAgICBjb250ZXh0LmZsYWdfdHlwZSA9IHN0YXRpY19jYXN0PFN0b3JlZEZsYWdUeXBlPihjb250ZXh0X2N4eC5mbGFnX3R5cGUpOworICAgIGNvbnRleHQuZmxhZ19pbmRleCA9IGNvbnRleHRfY3h4LmZsYWdfaW5kZXg7CisgICAgcmV0dXJuIGNvbnRleHQ7CisgIH0gZWxzZSB7CisgICAgYXV0byByZXN1bHQgPSBSZXN1bHQ8RmxhZ1JlYWRDb250ZXh0PigpOworICAgIHJlc3VsdC5lcnJtc2cgPSBjb250ZXh0X2N4eC5lcnJvcl9tZXNzYWdlLmNfc3RyKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQorCisvLy8gR2V0IGJvb2xlYW4gZmxhZyB2YWx1ZQorUmVzdWx0PGJvb2w+IGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoCisgICAgTWFwcGVkU3RvcmFnZUZpbGUgY29uc3QmIGZpbGUsCisgICAgdWludDMyX3QgaW5kZXgpIHsKKyAgYXV0byBjb250ZW50ID0gcnVzdDo6U2xpY2U8Y29uc3QgdWludDhfdD4oCisgICAgICBzdGF0aWNfY2FzdDx1aW50OF90Kj4oZmlsZS5maWxlX3B0ciksIGZpbGUuZmlsZV9zaXplKTsKKyAgYXV0byB2YWx1ZV9jeHggPSBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlX2N4eChjb250ZW50LCBpbmRleCk7CisgIGlmICh2YWx1ZV9jeHgucXVlcnlfc3VjY2VzcykgeworICAgIHJldHVybiB2YWx1ZV9jeHguZmxhZ192YWx1ZTsKKyAgfSBlbHNlIHsKKyAgICBhdXRvIHJlc3VsdCA9IFJlc3VsdDxib29sPigpOworICAgIHJlc3VsdC5lcnJtc2cgPSB2YWx1ZV9jeHguZXJyb3JfbWVzc2FnZS5jX3N0cigpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KKworLy8vIEdldCBib29sZWFuIGZsYWcgYXR0cmlidXRlCitSZXN1bHQ8dWludDhfdD4gZ2V0X2ZsYWdfYXR0cmlidXRlKAorICAgIE1hcHBlZFN0b3JhZ2VGaWxlIGNvbnN0JiBmaWxlLAorICAgIEZsYWdWYWx1ZVR5cGUgdmFsdWVfdHlwZSwKKyAgICB1aW50MzJfdCBpbmRleCkgeworICBhdXRvIGNvbnRlbnQgPSBydXN0OjpTbGljZTxjb25zdCB1aW50OF90PigKKyAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3QqPihmaWxlLmZpbGVfcHRyKSwgZmlsZS5maWxlX3NpemUpOworICBhdXRvIGluZm9fY3h4ID0gZ2V0X2ZsYWdfYXR0cmlidXRlX2N4eCgKKyAgICAgIGNvbnRlbnQsIHN0YXRpY19jYXN0PHVpbnQxNl90Pih2YWx1ZV90eXBlKSwgaW5kZXgpOworICBpZiAoaW5mb19jeHgucXVlcnlfc3VjY2VzcykgeworICAgIHJldHVybiBpbmZvX2N4eC5mbGFnX2F0dHJpYnV0ZTsKKyAgfSBlbHNlIHsKKyAgICBhdXRvIHJlc3VsdCA9IFJlc3VsdDx1aW50OF90PigpOworICAgIHJlc3VsdC5lcnJtc2cgPSBpbmZvX2N4eC5lcnJvcl9tZXNzYWdlLmNfc3RyKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfQorfSAvLyBuYW1lc3BhY2UgYWNvbmZpZ19zdG9yYWdlCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9idWlsZC5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL2J1aWxkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMWFhNTMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9idWlsZC5ycwpAQCAtMCwwICsxLDQgQEAKK2ZuIG1haW4oKSB7CisgICAgbGV0IF8gPSBjeHhfYnVpbGQ6OmJyaWRnZSgic3JjL2xpYi5ycyIpOworICAgIHByaW50bG4hKCJjYXJnbzpyZXJ1bi1pZi1jaGFuZ2VkPXNyYy9saWIucnMiKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL2luY2x1ZGUvYWNvbmZpZ19zdG9yYWdlL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS5ocHAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9pbmNsdWRlL2Fjb25maWdfc3RvcmFnZS9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MDkzNWIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9pbmNsdWRlL2Fjb25maWdfc3RvcmFnZS9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkuaHBwCkBAIC0wLDAgKzEsMTcxIEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgYWNvbmZpZ19zdG9yYWdlIHsKKworLy8vIFN0b3JhZ2UgZmlsZSB0eXBlIGVudW0sIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgb25lIGRlZmluZWQgaW4KKy8vLyBhY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvbGliLnJzCitlbnVtIFN0b3JhZ2VGaWxlVHlwZSB7CisgIHBhY2thZ2VfbWFwLAorICBmbGFnX21hcCwKKyAgZmxhZ192YWwsCisgIGZsYWdfaW5mbworfTsKKworLy8vIEZsYWcgdHlwZSBlbnVtLCB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIG9uZSBkZWZpbmVkIGluCisvLy8gYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL2xpYi5ycworZW51bSBTdG9yZWRGbGFnVHlwZSB7CisgIFJlYWRXcml0ZUJvb2xlYW4gPSAwLAorICBSZWFkT25seUJvb2xlYW4gPSAxLAorICBGaXhlZFJlYWRPbmx5Qm9vbGVhbiA9IDIsCit9OworCisvLy8gRmxhZyB2YWx1ZSB0eXBlIGVudW0sIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgb25lIGRlZmluZWQgaW4KKy8vLyBhY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvbGliLnJzCitlbnVtIEZsYWdWYWx1ZVR5cGUgeworICBCb29sZWFuID0gMCwKK307CisKKy8vLyBGbGFnIGluZm8gZW51bSwgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSBvbmUgZGVmaW5lZCBpbgorLy8vIGFjb25maWdfc3RvcmFnZV9maWxlL3NyYy9mbGFnX2luZm8ucnMKK2VudW0gRmxhZ0luZm9CaXQgeworICBIYXNTZXJ2ZXJPdmVycmlkZSA9IDE8PDAsCisgIElzUmVhZFdyaXRlID0gMTw8MSwKKyAgSGFzTG9jYWxPdmVycmlkZSA9IDE8PDIsCit9OworCisvLy8gTWFwcGVkIHN0b3JhZ2UgZmlsZQorc3RydWN0IE1hcHBlZFN0b3JhZ2VGaWxlIHsKKyAgdm9pZCogZmlsZV9wdHI7CisgIHNpemVfdCBmaWxlX3NpemU7CisgIHZpcnR1YWwgfk1hcHBlZFN0b3JhZ2VGaWxlKCk7Cit9OworCisvLy8gUGFja2FnZSByZWFkIGNvbnRleHQgcXVlcnkgcmVzdWx0CitzdHJ1Y3QgUGFja2FnZVJlYWRDb250ZXh0IHsKKyAgYm9vbCBwYWNrYWdlX2V4aXN0czsKKyAgdWludDMyX3QgcGFja2FnZV9pZDsKKyAgdWludDMyX3QgYm9vbGVhbl9zdGFydF9pbmRleDsKK307CisKKy8vLyBGbGFnIHJlYWQgY29udGV4dCBxdWVyeSByZXN1bHQKK3N0cnVjdCBGbGFnUmVhZENvbnRleHQgeworICBib29sIGZsYWdfZXhpc3RzOworICBTdG9yZWRGbGFnVHlwZSBmbGFnX3R5cGU7CisgIHVpbnQxNl90IGZsYWdfaW5kZXg7Cit9OworCisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY2xhc3MgUmVzdWx0IHsKKyAgcHVibGljOgorCisgIFJlc3VsdCgpCisgICAgICA6IGRhdGEoKQorICAgICAgLCBlcnJtc2coKQorICAgICAgLCBoYXNfZGF0YShmYWxzZSkKKyAge30KKworICBSZXN1bHQoVCBjb25zdCYgdmFsdWUpCisgICAgICA6IGRhdGEodmFsdWUpCisgICAgICAsIGVycm1zZygpCisgICAgICAsIGhhc19kYXRhKHRydWUpCisgIHt9CisKKyAgYm9vbCBvaygpIHsKKyAgICByZXR1cm4gaGFzX2RhdGE7CisgIH0KKworICBUJiBvcGVyYXRvciooKSB7CisgICAgYXNzZXJ0KGhhc19kYXRhKTsKKyAgICByZXR1cm4gZGF0YTsKKyAgfQorCisgIFQqIG9wZXJhdG9yLT4oKSB7CisgICAgYXNzZXJ0KGhhc19kYXRhKTsKKyAgICByZXR1cm4gJmRhdGE7CisgIH0KKworICBzdGQ6OnN0cmluZyBjb25zdCYgZXJyb3IoKSB7CisgICAgYXNzZXJ0KCFoYXNfZGF0YSk7CisgICAgcmV0dXJuIGVycm1zZzsKKyAgfQorCisgIFQgZGF0YTsKKyAgc3RkOjpzdHJpbmcgZXJybXNnOworICBib29sIGhhc19kYXRhOworfTsKKworLy8vIERPIE5PVCBVU0UgQVBJUyBJTiBUSEUgRk9MTE9XSU5HIE5BTUVTUEFDRSBESVJFQ1RMWQorbmFtZXNwYWNlIHByaXZhdGVfaW50ZXJuYWxfYXBpIHsKKworUmVzdWx0PE1hcHBlZFN0b3JhZ2VGaWxlKj4gZ2V0X21hcHBlZF9maWxlX2ltcGwoCisgICAgc3RkOjpzdHJpbmcgY29uc3QmIHBiX2ZpbGUsCisgICAgc3RkOjpzdHJpbmcgY29uc3QmIGNvbnRhaW5lciwKKyAgICBTdG9yYWdlRmlsZVR5cGUgZmlsZV90eXBlKTsKK30gLy8gbmFtZXNwYWNlIHByaXZhdGVfaW50ZXJuYWxfYXBpCisKKy8vLyBNYXAgYSBzdG9yYWdlIGZpbGUKK1Jlc3VsdDxNYXBwZWRTdG9yYWdlRmlsZSo+IG1hcF9zdG9yYWdlX2ZpbGUoCisgICAgc3RkOjpzdHJpbmcgY29uc3QmIGZpbGUpOworCisKKy8vLyBNYXAgZnJvbSBTdG9yZWRGbGFnVHlwZSB0byBGbGFnVmFsdWVUeXBlCisvLy8gXGlucHV0IHN0b3JlZF90eXBlOiBzdG9yZWQgZmxhZyB0eXBlIGluIHRoZSBzdG9yYWdlIGZpbGUKKy8vLyBccmV0dXJucyB0aGUgZmxhZyB2YWx1ZSB0eXBlIGVudW0KK1Jlc3VsdDxGbGFnVmFsdWVUeXBlPiBtYXBfdG9fZmxhZ192YWx1ZV90eXBlKAorICAgIFN0b3JlZEZsYWdUeXBlIHN0b3JlZF90eXBlKTsKKworLy8vIEdldCBtYXBwZWQgc3RvcmFnZSBmaWxlCisvLy8gXGlucHV0IGNvbnRhaW5lcjogc3RvYXJnZSBjb250YWluZXIgbmFtZQorLy8vIFxpbnB1dCBmaWxlX3R5cGU6IHN0b3JhZ2UgZmlsZSB0eXBlIGVudW0KKy8vLyBccmV0dXJucyBhIE1hcHBlZFN0b3JhZ2VGaWxlUXVlcnkKK1Jlc3VsdDxNYXBwZWRTdG9yYWdlRmlsZSo+IGdldF9tYXBwZWRfZmlsZSgKKyAgICBzdGQ6OnN0cmluZyBjb25zdCYgY29udGFpbmVyLAorICAgIFN0b3JhZ2VGaWxlVHlwZSBmaWxlX3R5cGUpOworCisvLy8gR2V0IHN0b3JhZ2UgZmlsZSB2ZXJzaW9uIG51bWJlcgorLy8vIFxpbnB1dCBmaWxlX3BhdGg6IHRoZSBwYXRoIHRvIHRoZSBzdG9yYWdlIGZpbGUKKy8vLyBccmV0dXJucyB0aGUgc3RvcmFnZSBmaWxlIHZlcnNpb24KK1Jlc3VsdDx1aW50MzJfdD4gZ2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKAorICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBmaWxlX3BhdGgpOworCisvLy8gR2V0IHBhY2thZ2UgcmVhZCBjb250ZXh0CisvLy8gXGlucHV0IGZpbGU6IG1hcHBlZCBzdG9yYWdlIGZpbGUKKy8vLyBcaW5wdXQgcGFja2FnZTogdGhlIGZsYWcgcGFja2FnZSBuYW1lCisvLy8gXHJldHVybnMgYSBwYWNrYWdlIHJlYWQgY29udGV4dAorUmVzdWx0PFBhY2thZ2VSZWFkQ29udGV4dD4gZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KAorICAgIE1hcHBlZFN0b3JhZ2VGaWxlIGNvbnN0JiBmaWxlLAorICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBwYWNrYWdlKTsKKworLy8vIEdldCBmbGFnIHJlYWQgY29udGV4dAorLy8vIFxpbnB1dCBmaWxlOiBtYXBwZWQgc3RvcmFnZSBmaWxlCisvLy8gXGlucHV0IHBhY2thZ2VfaWQ6IHRoZSBmbGFnIHBhY2thZ2UgaWQgb2J0YWluZWQgZnJvbSBwYWNrYWdlIG9mZnNldCBxdWVyeQorLy8vIFxpbnB1dCBmbGFnX25hbWU6IGZsYWcgbmFtZQorLy8vIFxyZXR1cm5zIHRoZSBmbGFnIHJlYWQgY29udGV4dAorUmVzdWx0PEZsYWdSZWFkQ29udGV4dD4gZ2V0X2ZsYWdfcmVhZF9jb250ZXh0KAorICAgIE1hcHBlZFN0b3JhZ2VGaWxlIGNvbnN0JiBmaWxlLAorICAgIHVpbnQzMl90IHBhY2thZ2VfaWQsCisgICAgc3RkOjpzdHJpbmcgY29uc3QmIGZsYWdfbmFtZSk7CisKKy8vLyBHZXQgYm9vbGVhbiBmbGFnIHZhbHVlCisvLy8gXGlucHV0IGZpbGU6IG1hcHBlZCBzdG9yYWdlIGZpbGUKKy8vLyBcaW5wdXQgaW5kZXg6IHRoZSBib29sZWFuIGZsYWcgaW5kZXggaW4gdGhlIGZpbGUKKy8vLyBccmV0dXJucyB0aGUgYm9vbGVhbiBmbGFnIHZhbHVlCitSZXN1bHQ8Ym9vbD4gZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgKKyAgICBNYXBwZWRTdG9yYWdlRmlsZSBjb25zdCYgZmlsZSwKKyAgICB1aW50MzJfdCBpbmRleCk7CisKKy8vLyBHZXQgYm9vbGVhbiBmbGFnIGF0dHJpYnV0ZQorLy8vIFxpbnB1dCBmaWxlOiBtYXBwZWQgc3RvcmFnZSBmaWxlCisvLy8gXGlucHV0IHZhbHVlX3R5cGU6IGZsYWcgdmFsdWUgdHlwZQorLy8vIFxpbnB1dCBpbmRleDogdGhlIGJvb2xlYW4gZmxhZyBpbmRleCBpbiB0aGUgZmlsZQorLy8vIFxyZXR1cm5zIHRoZSBib29sZWFuIGZsYWcgYXR0cmlidXRlCitSZXN1bHQ8dWludDhfdD4gZ2V0X2ZsYWdfYXR0cmlidXRlKAorICAgIE1hcHBlZFN0b3JhZ2VGaWxlIGNvbnN0JiBmaWxlLAorICAgIEZsYWdWYWx1ZVR5cGUgdmFsdWVfdHlwZSwKKyAgICB1aW50MzJfdCBpbmRleCk7Cit9IC8vIG5hbWVzcGFjZSBhY29uZmlnX3N0b3JhZ2UKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL2xpYmFjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9jYy5tYXAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9saWJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlfY2MubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNDdlMGIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9saWJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlfY2MubWFwCkBAIC0wLDAgKzEsMTEgQEAKK0xJQkFDT05GSUdfU1RPUkFHRV9SRUFEX0FQSV9DQyB7CisgICMgRXhwb3J0IGV2ZXJ5dGhpbmcgaW4gdGhlIGFjb25maWdfc3RvcmFnZSBuYW1lc3BhY2UuIFRoaXMgaW5jbHVkZXMgYm90aCB0aGUKKyAgIyBwdWJsaWMgQVBJIGFuZCBsaWJyYXJ5IGludGVybmFscy4KKyAgZ2xvYmFsOgorICAgIGV4dGVybiAiQysrIiB7CisgICAgICAgIGFjb25maWdfc3RvcmFnZTo6KjsKKyAgICB9OworICAjIEhpZGUgZXZlcnl0aGluZyBlbHNlLgorICBsb2NhbDoKKyAgICAqOworfTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9mbGFnX2luZm9fcXVlcnkucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvZmxhZ19pbmZvX3F1ZXJ5LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YjYxOTMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvZmxhZ19pbmZvX3F1ZXJ5LnJzCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8hIGZsYWcgdmFsdWUgcXVlcnkgbW9kdWxlIGRlZmluZXMgdGhlIGZsYWcgdmFsdWUgZmlsZSByZWFkIGZyb20gbWFwcGVkIGJ5dGVzCisKK3VzZSBjcmF0ZTo6QWNvbmZpZ1N0b3JhZ2VFcnJvcjsKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6eworICAgIGZsYWdfaW5mbzo6RmxhZ0luZm9IZWFkZXIsIHJlYWRfdThfZnJvbV9ieXRlcywgRmxhZ1ZhbHVlVHlwZSwgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04sCit9OwordXNlIGFueWhvdzo6YW55aG93OworCisvLy8gR2V0IGZsYWcgYXR0cmlidXRlIGJpdGZpZWxkCitwdWIgZm4gZmluZF9mbGFnX2F0dHJpYnV0ZSgKKyAgICBidWY6ICZbdThdLAorICAgIGZsYWdfdHlwZTogRmxhZ1ZhbHVlVHlwZSwKKyAgICBmbGFnX2luZGV4OiB1MzIsCispIC0+IFJlc3VsdDx1OCwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIGxldCBpbnRlcnByZXRlZF9oZWFkZXIgPSBGbGFnSW5mb0hlYWRlcjo6ZnJvbV9ieXRlcyhidWYpPzsKKyAgICBpZiBpbnRlcnByZXRlZF9oZWFkZXIudmVyc2lvbiA+IE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OIHsKKyAgICAgICAgcmV0dXJuIEVycihBY29uZmlnU3RvcmFnZUVycm9yOjpIaWdoZXJTdG9yYWdlRmlsZVZlcnNpb24oYW55aG93ISgKKyAgICAgICAgICAgICJDYW5ub3QgcmVhZCBzdG9yYWdlIGZpbGUgd2l0aCBhIGhpZ2hlciB2ZXJzaW9uIG9mIHt9IHdpdGggbGliIHZlcnNpb24ge30iLAorICAgICAgICAgICAgaW50ZXJwcmV0ZWRfaGVhZGVyLnZlcnNpb24sCisgICAgICAgICAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTgorICAgICAgICApKSk7CisgICAgfQorCisgICAgLy8gZ2V0IGJ5dGUgb2Zmc2V0IHRvIHRoZSBmbGFnIGluZm8KKyAgICBsZXQgbXV0IGhlYWQgPSBtYXRjaCBmbGFnX3R5cGUgeworICAgICAgICBGbGFnVmFsdWVUeXBlOjpCb29sZWFuID0+IChpbnRlcnByZXRlZF9oZWFkZXIuYm9vbGVhbl9mbGFnX29mZnNldCArIGZsYWdfaW5kZXgpIGFzIHVzaXplLAorICAgIH07CisKKyAgICBpZiBoZWFkID49IGludGVycHJldGVkX2hlYWRlci5maWxlX3NpemUgYXMgdXNpemUgeworICAgICAgICByZXR1cm4gRXJyKEFjb25maWdTdG9yYWdlRXJyb3I6OkludmFsaWRTdG9yYWdlRmlsZU9mZnNldChhbnlob3chKAorICAgICAgICAgICAgIkZsYWcgaW5mbyBvZmZzZXQgZ29lcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZmlsZS4iCisgICAgICAgICkpKTsKKyAgICB9CisKKyAgICBsZXQgdmFsID0gcmVhZF91OF9mcm9tX2J5dGVzKGJ1ZiwgJm11dCBoZWFkKT87CisgICAgT2sodmFsKQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6eworICAgICAgICB0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdCwgRmxhZ0luZm9CaXQsIERFRkFVTFRfRklMRV9WRVJTSU9OLAorICAgIH07CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gcXVlcnkgaWYgZmxhZyBoYXMgc2VydmVyIG92ZXJyaWRlCisgICAgZm4gdGVzdF9pc19mbGFnX3N0aWNreSgpIHsKKyAgICAgICAgbGV0IGZsYWdfaW5mb19saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pLmludG9fYnl0ZXMoKTsKKyAgICAgICAgZm9yIG9mZnNldCBpbiAwLi44IHsKKyAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPQorICAgICAgICAgICAgICAgIGZpbmRfZmxhZ19hdHRyaWJ1dGUoJmZsYWdfaW5mb19saXN0Wy4uXSwgRmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgb2Zmc2V0KS51bndyYXAoKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEoKGF0dHJpYnV0ZSAmIEZsYWdJbmZvQml0OjpIYXNTZXJ2ZXJPdmVycmlkZSBhcyB1OCkgIT0gMHU4LCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gcXVlcnkgaWYgZmxhZyBpcyByZWFkd3JpdGUKKyAgICBmbiB0ZXN0X2lzX2ZsYWdfcmVhZHdyaXRlKCkgeworICAgICAgICBsZXQgZmxhZ19pbmZvX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdChERUZBVUxUX0ZJTEVfVkVSU0lPTikuaW50b19ieXRlcygpOworICAgICAgICBsZXQgYmFzZWxpbmU6IFZlYzxib29sPiA9IHZlYyFbdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWVdOworICAgICAgICBmb3Igb2Zmc2V0IGluIDAuLjggeworICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZSA9CisgICAgICAgICAgICAgICAgZmluZF9mbGFnX2F0dHJpYnV0ZSgmZmxhZ19pbmZvX2xpc3RbLi5dLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBvZmZzZXQpLnVud3JhcCgpOworICAgICAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgICAgICAoYXR0cmlidXRlICYgRmxhZ0luZm9CaXQ6OklzUmVhZFdyaXRlIGFzIHU4KSAhPSAwdTgsCisgICAgICAgICAgICAgICAgYmFzZWxpbmVbb2Zmc2V0IGFzIHVzaXplXQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBxdWVyeSBpZiBmbGFnIGhhcyBsb2NhbCBvdmVycmlkZQorICAgIGZuIHRlc3RfZmxhZ19oYXNfb3ZlcnJpZGUoKSB7CisgICAgICAgIGxldCBmbGFnX2luZm9fbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0KERFRkFVTFRfRklMRV9WRVJTSU9OKS5pbnRvX2J5dGVzKCk7CisgICAgICAgIGZvciBvZmZzZXQgaW4gMC4uOCB7CisgICAgICAgICAgICBsZXQgYXR0cmlidXRlID0KKyAgICAgICAgICAgICAgICBmaW5kX2ZsYWdfYXR0cmlidXRlKCZmbGFnX2luZm9fbGlzdFsuLl0sIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIG9mZnNldCkudW53cmFwKCk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKChhdHRyaWJ1dGUgJiBGbGFnSW5mb0JpdDo6SGFzTG9jYWxPdmVycmlkZSBhcyB1OCkgIT0gMHU4LCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gcXVlcnkgYmV5b25kIHRoZSBlbmQgb2YgYm9vbGVhbiBzZWN0aW9uCisgICAgZm4gdGVzdF9ib29sZWFuX291dF9vZl9yYW5nZSgpIHsKKyAgICAgICAgbGV0IGZsYWdfaW5mb19saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pLmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IGVycm9yID0KKyAgICAgICAgICAgIGZpbmRfZmxhZ19hdHRyaWJ1dGUoJmZsYWdfaW5mb19saXN0Wy4uXSwgRmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgOCkudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVycm9yKSwKKyAgICAgICAgICAgICJJbnZhbGlkU3RvcmFnZUZpbGVPZmZzZXQoRmxhZyBpbmZvIG9mZnNldCBnb2VzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlLikiCisgICAgICAgICk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHF1ZXJ5IGVycm9yIHdoZW4gZmlsZSBoYXMgYSBoaWdoZXIgdmVyc2lvbgorICAgIGZuIHRlc3RfaGlnaGVyX3ZlcnNpb25fc3RvcmFnZV9maWxlKCkgeworICAgICAgICBsZXQgbXV0IGluZm9fbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0KERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgaW5mb19saXN0LmhlYWRlci52ZXJzaW9uID0gTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04gKyAxOworICAgICAgICBsZXQgZmxhZ19pbmZvID0gaW5mb19saXN0LmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IGVycm9yID0gZmluZF9mbGFnX2F0dHJpYnV0ZSgmZmxhZ19pbmZvWy4uXSwgRmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgNCkudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVycm9yKSwKKyAgICAgICAgICAgIGZvcm1hdCEoCisgICAgICAgICAgICAgICAgIkhpZ2hlclN0b3JhZ2VGaWxlVmVyc2lvbihDYW5ub3QgcmVhZCBzdG9yYWdlIGZpbGUgd2l0aCBhIGhpZ2hlciB2ZXJzaW9uIG9mIHt9IHdpdGggbGliIHZlcnNpb24ge30pIiwKKyAgICAgICAgICAgICAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiArIDEsCisgICAgICAgICAgICAgICAgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04KKyAgICAgICAgICAgICkKKyAgICAgICAgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvZmxhZ190YWJsZV9xdWVyeS5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9mbGFnX3RhYmxlX3F1ZXJ5LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlODdhY2MKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvZmxhZ190YWJsZV9xdWVyeS5ycwpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vISBmbGFnIHRhYmxlIHF1ZXJ5IG1vZHVsZSBkZWZpbmVzIHRoZSBmbGFnIHRhYmxlIGZpbGUgcmVhZCBmcm9tIG1hcHBlZCBieXRlcworCit1c2UgY3JhdGU6OkFjb25maWdTdG9yYWdlRXJyb3I7Cit1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OnsKKyAgICBmbGFnX3RhYmxlOjpGbGFnVGFibGVIZWFkZXIsIGZsYWdfdGFibGU6OkZsYWdUYWJsZU5vZGUsIHJlYWRfdTMyX2Zyb21fYnl0ZXMsIFN0b3JlZEZsYWdUeXBlLAorICAgIE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OLAorfTsKK3VzZSBhbnlob3c6OmFueWhvdzsKKworLy8vIEZsYWcgdGFibGUgcXVlcnkgcmV0dXJuCisjW2Rlcml2ZShQYXJ0aWFsRXEsIERlYnVnKV0KK3B1YiBzdHJ1Y3QgRmxhZ1JlYWRDb250ZXh0IHsKKyAgICBwdWIgZmxhZ190eXBlOiBTdG9yZWRGbGFnVHlwZSwKKyAgICBwdWIgZmxhZ19pbmRleDogdTE2LAorfQorCisvLy8gUXVlcnkgZmxhZyByZWFkIGNvbnRleHQ6IGZsYWcgdHlwZSBhbmQgd2l0aGluIHBhY2thZ2UgZmxhZyBpbmRleAorcHViIGZuIGZpbmRfZmxhZ19yZWFkX2NvbnRleHQoCisgICAgYnVmOiAmW3U4XSwKKyAgICBwYWNrYWdlX2lkOiB1MzIsCisgICAgZmxhZzogJnN0ciwKKykgLT4gUmVzdWx0PE9wdGlvbjxGbGFnUmVhZENvbnRleHQ+LCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgbGV0IGludGVycHJldGVkX2hlYWRlciA9IEZsYWdUYWJsZUhlYWRlcjo6ZnJvbV9ieXRlcyhidWYpPzsKKyAgICBpZiBpbnRlcnByZXRlZF9oZWFkZXIudmVyc2lvbiA+IE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OIHsKKyAgICAgICAgcmV0dXJuIEVycihBY29uZmlnU3RvcmFnZUVycm9yOjpIaWdoZXJTdG9yYWdlRmlsZVZlcnNpb24oYW55aG93ISgKKyAgICAgICAgICAgICJDYW5ub3QgcmVhZCBzdG9yYWdlIGZpbGUgd2l0aCBhIGhpZ2hlciB2ZXJzaW9uIG9mIHt9IHdpdGggbGliIHZlcnNpb24ge30iLAorICAgICAgICAgICAgaW50ZXJwcmV0ZWRfaGVhZGVyLnZlcnNpb24sCisgICAgICAgICAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTgorICAgICAgICApKSk7CisgICAgfQorCisgICAgbGV0IG51bV9idWNrZXRzID0gKGludGVycHJldGVkX2hlYWRlci5ub2RlX29mZnNldCAtIGludGVycHJldGVkX2hlYWRlci5idWNrZXRfb2Zmc2V0KSAvIDQ7CisgICAgbGV0IGJ1Y2tldF9pbmRleCA9IEZsYWdUYWJsZU5vZGU6OmZpbmRfYnVja2V0X2luZGV4KHBhY2thZ2VfaWQsIGZsYWcsIG51bV9idWNrZXRzKTsKKworICAgIGxldCBtdXQgcG9zID0gKGludGVycHJldGVkX2hlYWRlci5idWNrZXRfb2Zmc2V0ICsgNCAqIGJ1Y2tldF9pbmRleCkgYXMgdXNpemU7CisgICAgbGV0IG11dCBmbGFnX25vZGVfb2Zmc2V0ID0gcmVhZF91MzJfZnJvbV9ieXRlcyhidWYsICZtdXQgcG9zKT8gYXMgdXNpemU7CisgICAgaWYgZmxhZ19ub2RlX29mZnNldCA8IGludGVycHJldGVkX2hlYWRlci5ub2RlX29mZnNldCBhcyB1c2l6ZQorICAgICAgICB8fCBmbGFnX25vZGVfb2Zmc2V0ID49IGludGVycHJldGVkX2hlYWRlci5maWxlX3NpemUgYXMgdXNpemUKKyAgICB7CisgICAgICAgIHJldHVybiBPayhOb25lKTsKKyAgICB9CisKKyAgICBsb29wIHsKKyAgICAgICAgbGV0IGludGVycHJldGVkX25vZGUgPSBGbGFnVGFibGVOb2RlOjpmcm9tX2J5dGVzKCZidWZbZmxhZ19ub2RlX29mZnNldC4uXSk/OworICAgICAgICBpZiBpbnRlcnByZXRlZF9ub2RlLnBhY2thZ2VfaWQgPT0gcGFja2FnZV9pZCAmJiBpbnRlcnByZXRlZF9ub2RlLmZsYWdfbmFtZSA9PSBmbGFnIHsKKyAgICAgICAgICAgIHJldHVybiBPayhTb21lKEZsYWdSZWFkQ29udGV4dCB7CisgICAgICAgICAgICAgICAgZmxhZ190eXBlOiBpbnRlcnByZXRlZF9ub2RlLmZsYWdfdHlwZSwKKyAgICAgICAgICAgICAgICBmbGFnX2luZGV4OiBpbnRlcnByZXRlZF9ub2RlLmZsYWdfaW5kZXgsCisgICAgICAgICAgICB9KSk7CisgICAgICAgIH0KKyAgICAgICAgbWF0Y2ggaW50ZXJwcmV0ZWRfbm9kZS5uZXh0X29mZnNldCB7CisgICAgICAgICAgICBTb21lKG9mZnNldCkgPT4gZmxhZ19ub2RlX29mZnNldCA9IG9mZnNldCBhcyB1c2l6ZSwKKyAgICAgICAgICAgIE5vbmUgPT4gcmV0dXJuIE9rKE5vbmUpLAorICAgICAgICB9CisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6e3Rlc3RfdXRpbHM6OmNyZWF0ZV90ZXN0X2ZsYWdfdGFibGUsIERFRkFVTFRfRklMRV9WRVJTSU9OfTsKKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biB0YWJsZSBxdWVyeQorICAgIGZuIHRlc3RfZmxhZ19xdWVyeSgpIHsKKyAgICAgICAgbGV0IGZsYWdfdGFibGUgPSBjcmVhdGVfdGVzdF9mbGFnX3RhYmxlKERFRkFVTFRfRklMRV9WRVJTSU9OKS5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCBiYXNlbGluZSA9IHZlYyFbCisgICAgICAgICAgICAoMCwgImVuYWJsZWRfcm8iLCBTdG9yZWRGbGFnVHlwZTo6UmVhZE9ubHlCb29sZWFuLCAxdTE2KSwKKyAgICAgICAgICAgICgwLCAiZW5hYmxlZF9ydyIsIFN0b3JlZEZsYWdUeXBlOjpSZWFkV3JpdGVCb29sZWFuLCAydTE2KSwKKyAgICAgICAgICAgICgyLCAiZW5hYmxlZF9ydyIsIFN0b3JlZEZsYWdUeXBlOjpSZWFkV3JpdGVCb29sZWFuLCAxdTE2KSwKKyAgICAgICAgICAgICgxLCAiZGlzYWJsZWRfcnciLCBTdG9yZWRGbGFnVHlwZTo6UmVhZFdyaXRlQm9vbGVhbiwgMHUxNiksCisgICAgICAgICAgICAoMSwgImVuYWJsZWRfZml4ZWRfcm8iLCBTdG9yZWRGbGFnVHlwZTo6Rml4ZWRSZWFkT25seUJvb2xlYW4sIDF1MTYpLAorICAgICAgICAgICAgKDEsICJlbmFibGVkX3JvIiwgU3RvcmVkRmxhZ1R5cGU6OlJlYWRPbmx5Qm9vbGVhbiwgMnUxNiksCisgICAgICAgICAgICAoMiwgImVuYWJsZWRfZml4ZWRfcm8iLCBTdG9yZWRGbGFnVHlwZTo6Rml4ZWRSZWFkT25seUJvb2xlYW4sIDB1MTYpLAorICAgICAgICAgICAgKDAsICJkaXNhYmxlZF9ydyIsIFN0b3JlZEZsYWdUeXBlOjpSZWFkV3JpdGVCb29sZWFuLCAwdTE2KSwKKyAgICAgICAgXTsKKyAgICAgICAgZm9yIChwYWNrYWdlX2lkLCBmbGFnX25hbWUsIGZsYWdfdHlwZSwgZmxhZ19pbmRleCkgaW4gYmFzZWxpbmUuaW50b19pdGVyKCkgeworICAgICAgICAgICAgbGV0IGZsYWdfY29udGV4dCA9CisgICAgICAgICAgICAgICAgZmluZF9mbGFnX3JlYWRfY29udGV4dCgmZmxhZ190YWJsZVsuLl0sIHBhY2thZ2VfaWQsIGZsYWdfbmFtZSkudW53cmFwKCkudW53cmFwKCk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKGZsYWdfY29udGV4dC5mbGFnX3R5cGUsIGZsYWdfdHlwZSk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKGZsYWdfY29udGV4dC5mbGFnX2luZGV4LCBmbGFnX2luZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biB0YWJsZSBxdWVyeSBvZiBhIG5vbiBleGlzdCBmbGFnCisgICAgZm4gdGVzdF9ub3RfZXhpc3RlZF9mbGFnX3F1ZXJ5KCkgeworICAgICAgICBsZXQgZmxhZ190YWJsZSA9IGNyZWF0ZV90ZXN0X2ZsYWdfdGFibGUoREVGQVVMVF9GSUxFX1ZFUlNJT04pLmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IGZsYWdfY29udGV4dCA9IGZpbmRfZmxhZ19yZWFkX2NvbnRleHQoJmZsYWdfdGFibGVbLi5dLCAxLCAiZGlzYWJsZWRfZml4ZWRfcm8iKS51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxIShmbGFnX2NvbnRleHQsIE5vbmUpOworICAgICAgICBsZXQgZmxhZ19jb250ZXh0ID0gZmluZF9mbGFnX3JlYWRfY29udGV4dCgmZmxhZ190YWJsZVsuLl0sIDIsICJkaXNhYmxlZF9ydyIpLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKGZsYWdfY29udGV4dCwgTm9uZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHF1ZXJ5IGVycm9yIHdoZW4gZmlsZSBoYXMgYSBoaWdoZXIgdmVyc2lvbgorICAgIGZuIHRlc3RfaGlnaGVyX3ZlcnNpb25fc3RvcmFnZV9maWxlKCkgeworICAgICAgICBsZXQgbXV0IHRhYmxlID0gY3JlYXRlX3Rlc3RfZmxhZ190YWJsZShERUZBVUxUX0ZJTEVfVkVSU0lPTik7CisgICAgICAgIHRhYmxlLmhlYWRlci52ZXJzaW9uID0gTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04gKyAxOworICAgICAgICBsZXQgZmxhZ190YWJsZSA9IHRhYmxlLmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IGVycm9yID0gZmluZF9mbGFnX3JlYWRfY29udGV4dCgmZmxhZ190YWJsZVsuLl0sIDAsICJlbmFibGVkX3JvIikudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVycm9yKSwKKyAgICAgICAgICAgIGZvcm1hdCEoCisgICAgICAgICAgICAgICAgIkhpZ2hlclN0b3JhZ2VGaWxlVmVyc2lvbihDYW5ub3QgcmVhZCBzdG9yYWdlIGZpbGUgd2l0aCBhIGhpZ2hlciB2ZXJzaW9uIG9mIHt9IHdpdGggbGliIHZlcnNpb24ge30pIiwKKyAgICAgICAgICAgICAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiArIDEsCisgICAgICAgICAgICAgICAgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04KKyAgICAgICAgICAgICkKKyAgICAgICAgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvZmxhZ192YWx1ZV9xdWVyeS5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9mbGFnX3ZhbHVlX3F1ZXJ5LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZjU2OTIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvZmxhZ192YWx1ZV9xdWVyeS5ycwpAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8hIGZsYWcgdmFsdWUgcXVlcnkgbW9kdWxlIGRlZmluZXMgdGhlIGZsYWcgdmFsdWUgZmlsZSByZWFkIGZyb20gbWFwcGVkIGJ5dGVzCisKK3VzZSBjcmF0ZTo6QWNvbmZpZ1N0b3JhZ2VFcnJvcjsKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6eworICAgIGZsYWdfdmFsdWU6OkZsYWdWYWx1ZUhlYWRlciwgcmVhZF91OF9mcm9tX2J5dGVzLCBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiwKK307Cit1c2UgYW55aG93Ojphbnlob3c7CisKKy8vLyBRdWVyeSBmbGFnIHZhbHVlCitwdWIgZm4gZmluZF9ib29sZWFuX2ZsYWdfdmFsdWUoYnVmOiAmW3U4XSwgZmxhZ19pbmRleDogdTMyKSAtPiBSZXN1bHQ8Ym9vbCwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIGxldCBpbnRlcnByZXRlZF9oZWFkZXIgPSBGbGFnVmFsdWVIZWFkZXI6OmZyb21fYnl0ZXMoYnVmKT87CisgICAgaWYgaW50ZXJwcmV0ZWRfaGVhZGVyLnZlcnNpb24gPiBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiB7CisgICAgICAgIHJldHVybiBFcnIoQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6SGlnaGVyU3RvcmFnZUZpbGVWZXJzaW9uKGFueWhvdyEoCisgICAgICAgICAgICAiQ2Fubm90IHJlYWQgc3RvcmFnZSBmaWxlIHdpdGggYSBoaWdoZXIgdmVyc2lvbiBvZiB7fSB3aXRoIGxpYiB2ZXJzaW9uIHt9IiwKKyAgICAgICAgICAgIGludGVycHJldGVkX2hlYWRlci52ZXJzaW9uLAorICAgICAgICAgICAgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04KKyAgICAgICAgKSkpOworICAgIH0KKworICAgIC8vIEZpbmQgYnl0ZSBvZmZzZXQgdG8gdGhlIGZsYWcgdmFsdWUsIGVhY2ggYm9vbGVhbiBmbGFnIGNvc3Qgb25lIGJ5dGUgdG8gc3RvcmUKKyAgICBsZXQgbXV0IGhlYWQgPSAoaW50ZXJwcmV0ZWRfaGVhZGVyLmJvb2xlYW5fdmFsdWVfb2Zmc2V0ICsgZmxhZ19pbmRleCkgYXMgdXNpemU7CisgICAgaWYgaGVhZCA+PSBpbnRlcnByZXRlZF9oZWFkZXIuZmlsZV9zaXplIGFzIHVzaXplIHsKKyAgICAgICAgcmV0dXJuIEVycihBY29uZmlnU3RvcmFnZUVycm9yOjpJbnZhbGlkU3RvcmFnZUZpbGVPZmZzZXQoYW55aG93ISgKKyAgICAgICAgICAgICJGbGFnIHZhbHVlIG9mZnNldCBnb2VzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlLiIKKyAgICAgICAgKSkpOworICAgIH0KKworICAgIGxldCB2YWwgPSByZWFkX3U4X2Zyb21fYnl0ZXMoYnVmLCAmbXV0IGhlYWQpPzsKKyAgICBPayh2YWwgPT0gMSkKK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKyAgICB1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6Ont0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QsIERFRkFVTFRfRklMRV9WRVJTSU9OfTsKKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBmbGFnIHZhbHVlIHF1ZXJ5CisgICAgZm4gdGVzdF9mbGFnX3ZhbHVlX3F1ZXJ5KCkgeworICAgICAgICBsZXQgZmxhZ192YWx1ZV9saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0KERFRkFVTFRfRklMRV9WRVJTSU9OKS5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCBiYXNlbGluZTogVmVjPGJvb2w+ID0gdmVjIVtmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUsIHRydWUsIHRydWVdOworICAgICAgICBmb3IgKG9mZnNldCwgZXhwZWN0ZWRfdmFsdWUpIGluIGJhc2VsaW5lLmludG9faXRlcigpLmVudW1lcmF0ZSgpIHsKKyAgICAgICAgICAgIGxldCBmbGFnX3ZhbHVlID0gZmluZF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsdWVfbGlzdFsuLl0sIG9mZnNldCBhcyB1MzIpLnVud3JhcCgpOworICAgICAgICAgICAgYXNzZXJ0X2VxIShmbGFnX3ZhbHVlLCBleHBlY3RlZF92YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gcXVlcnkgYmV5b25kIHRoZSBlbmQgb2YgYm9vbGVhbiBzZWN0aW9uCisgICAgZm4gdGVzdF9ib29sZWFuX291dF9vZl9yYW5nZSgpIHsKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVfbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdChERUZBVUxUX0ZJTEVfVkVSU0lPTikuaW50b19ieXRlcygpOworICAgICAgICBsZXQgZXJyb3IgPSBmaW5kX2Jvb2xlYW5fZmxhZ192YWx1ZSgmZmxhZ192YWx1ZV9saXN0Wy4uXSwgOCkudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVycm9yKSwKKyAgICAgICAgICAgICJJbnZhbGlkU3RvcmFnZUZpbGVPZmZzZXQoRmxhZyB2YWx1ZSBvZmZzZXQgZ29lcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZmlsZS4pIgorICAgICAgICApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBxdWVyeSBlcnJvciB3aGVuIGZpbGUgaGFzIGEgaGlnaGVyIHZlcnNpb24KKyAgICBmbiB0ZXN0X2hpZ2hlcl92ZXJzaW9uX3N0b3JhZ2VfZmlsZSgpIHsKKyAgICAgICAgbGV0IG11dCB2YWx1ZV9saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0KERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgdmFsdWVfbGlzdC5oZWFkZXIudmVyc2lvbiA9IE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OICsgMTsKKyAgICAgICAgbGV0IGZsYWdfdmFsdWUgPSB2YWx1ZV9saXN0LmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IGVycm9yID0gZmluZF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsdWVbLi5dLCA0KS51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLAorICAgICAgICAgICAgZm9ybWF0ISgKKyAgICAgICAgICAgICAgICAiSGlnaGVyU3RvcmFnZUZpbGVWZXJzaW9uKENhbm5vdCByZWFkIHN0b3JhZ2UgZmlsZSB3aXRoIGEgaGlnaGVyIHZlcnNpb24gb2Yge30gd2l0aCBsaWIgdmVyc2lvbiB7fSkiLAorICAgICAgICAgICAgICAgIE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OICsgMSwKKyAgICAgICAgICAgICAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTgorICAgICAgICAgICAgKQorICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9saWIucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvbGliLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzY2M5ZDQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvbGliLnJzCkBAIC0wLDAgKzEsNTE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8hIGBhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlgIGlzIGEgY3JhdGUgdGhhdCBkZWZpbmVzIHJlYWQgYXBpcyB0byByZWFkIGZsYWdzIGZyb20gc3RvcmFnZQorLy8hIGZpbGVzLiBJdCBwcm92aWRlcyBmb3VyIGFwaXMgdG8gaW50ZXJmYWNlIHdpdGggc3RvcmFnZSBmaWxlczoKKy8vIQorLy8hIDEsIGZ1bmN0aW9uIHRvIGdldCBwYWNrYWdlIHJlYWQgY29udGV4dAorLy8hIHB1YiBmbiBnZXRfcGFja2FnZXJfcmVhZF9jb250ZXh0KGNvbnRhaW5lcjogJnN0ciwgcGFja2FnZTogJnN0cikKKy8vISAtPiBgUmVzdWx0PE9wdGlvbjxQYWNrYWdlUmVhZENvbnRleHQ+Pj5gCisvLyEKKy8vISAyLCBmdW5jdGlvbiB0byBnZXQgZmxhZyByZWFkIGNvbnRleHQKKy8vISBwdWIgZm4gZ2V0X2ZsYWdfcmVhZF9jb250ZXh0KGNvbnRhaW5lcjogJnN0ciwgcGFja2FnZV9pZDogdTMyLCBmbGFnOiAmc3RyKQorLy8hIC0+IGBSZXN1bHQ8T3B0aW9uPEZsYWdSZWFkQ29udGV4dD4+PmAKKy8vIQorLy8hIDMsIGZ1bmN0aW9uIHRvIGdldCB0aGUgYWN0dWFsIGZsYWcgdmFsdWUgZ2l2ZW4gdGhlIGdsb2JhbCBpbmRleCAoY29tYmluZWQgcGFja2FnZSBhbmQKKy8vISBmbGFnIGluZGV4KS4KKy8vISBwdWIgZm4gZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZShjb250YWluZXI6ICZzdHIsIG9mZnNldDogdTMyKSAtPiBgUmVzdWx0PGJvb2w+YAorLy8hCisvLyEgNCwgZnVuY3Rpb24gdG8gZ2V0IHN0b3JhZ2UgZmlsZSB2ZXJzaW9uIHdpdGhvdXQgbW1hcHBpbmcgdGhlIGZpbGUuCisvLyEgcHViIGZuIGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbihmaWxlX3BhdGg6ICZzdHIpIC0+IFJlc3VsdDx1MzIsIEFjb25maWdTdG9yYWdlRXJyb3I+CisvLyEKKy8vISBOb3RlIHRoZXNlIGFyZSBsb3cgbGV2ZWwgYXBpcyB0aGF0IGFyZSBleHBlY3RlZCB0byBiZSBvbmx5IHVzZWQgaW4gYXV0byBnZW5lcmF0ZWQgZmxhZworLy8hIGFwaXMuIERPIE5PVCBESVJFQ1RMWSBVU0UgVEhFU0UgQVBJUyBJTiBZT1VSIFNPVVJDRSBDT0RFLiBGb3IgYXV0byBnZW5lcmF0ZWQgZmxhZyBhcGlzCisvLyEgcGxlYXNlIHJlZmVyIHRvIHRoZSBnM2RvYyBnby9hbmRyb2lkLWZsYWdzCisKK3B1YiBtb2QgZmxhZ19pbmZvX3F1ZXJ5OworcHViIG1vZCBmbGFnX3RhYmxlX3F1ZXJ5OworcHViIG1vZCBmbGFnX3ZhbHVlX3F1ZXJ5OworcHViIG1vZCBtYXBwZWRfZmlsZTsKK3B1YiBtb2QgcGFja2FnZV90YWJsZV9xdWVyeTsKKworcHViIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6e0Fjb25maWdTdG9yYWdlRXJyb3IsIEZsYWdWYWx1ZVR5cGUsIFN0b3JhZ2VGaWxlVHlwZX07CitwdWIgdXNlIGZsYWdfdGFibGVfcXVlcnk6OkZsYWdSZWFkQ29udGV4dDsKK3B1YiB1c2UgbWFwcGVkX2ZpbGU6Om1hcF9maWxlOworcHViIHVzZSBwYWNrYWdlX3RhYmxlX3F1ZXJ5OjpQYWNrYWdlUmVhZENvbnRleHQ7CisKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6cmVhZF91MzJfZnJvbV9ieXRlczsKK3VzZSBmbGFnX2luZm9fcXVlcnk6OmZpbmRfZmxhZ19hdHRyaWJ1dGU7Cit1c2UgZmxhZ190YWJsZV9xdWVyeTo6ZmluZF9mbGFnX3JlYWRfY29udGV4dDsKK3VzZSBmbGFnX3ZhbHVlX3F1ZXJ5OjpmaW5kX2Jvb2xlYW5fZmxhZ192YWx1ZTsKK3VzZSBwYWNrYWdlX3RhYmxlX3F1ZXJ5OjpmaW5kX3BhY2thZ2VfcmVhZF9jb250ZXh0OworCit1c2UgYW55aG93Ojphbnlob3c7CitwdWIgdXNlIG1lbW1hcDI6Ok1tYXA7Cit1c2Ugc3RkOjpmczo6RmlsZTsKK3VzZSBzdGQ6OmlvOjpSZWFkOworCisvLy8gU3RvcmFnZSBmaWxlIGxvY2F0aW9uCitwdWIgY29uc3QgU1RPUkFHRV9MT0NBVElPTjogJnN0ciA9ICIvbWV0YWRhdGEvYWNvbmZpZyI7CisKKy8vLyBHZXQgcmVhZCBvbmx5IG1hcHBlZCBzdG9yYWdlIGZpbGVzLgorLy8vCisvLy8gXGlucHV0IGNvbnRhaW5lcjogdGhlIGZsYWcgcGFja2FnZSBjb250YWluZXIKKy8vLyBcaW5wdXQgZmlsZV90eXBlOiBzdG9hcmdlIGZpbGUgdHlwZSBlbnVtCisvLy8gXHJldHVybiBhIHJlc3VsdCBvZiByZWFkIG9ubHkgbWFwcGVkIGZpbGUKKy8vLworLy8vICMgU2FmZXR5CisvLy8KKy8vLyBUaGUgbWVtb3J5IG1hcHBlZCBmaWxlIG1heSBoYXZlIHVuZGVmaW5lZCBiZWhhdmlvciBpZiB0aGVyZSBhcmUgd3JpdGVzIHRvIHRoaXMKKy8vLyBmaWxlIGFmdGVyIGJlaW5nIG1hcHBlZC4gRW5zdXJlIG5vIHdyaXRlcyBjYW4gaGFwcGVuIHRvIHRoaXMgZmlsZSB3aGlsZSB0aGlzCisvLy8gbWFwcGluZyBzdGF5cyBhbGl2ZS4KK3B1YiB1bnNhZmUgZm4gZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUoCisgICAgY29udGFpbmVyOiAmc3RyLAorICAgIGZpbGVfdHlwZTogU3RvcmFnZUZpbGVUeXBlLAorKSAtPiBSZXN1bHQ8TW1hcCwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIHVuc2FmZSB7IGNyYXRlOjptYXBwZWRfZmlsZTo6Z2V0X21hcHBlZF9maWxlKFNUT1JBR0VfTE9DQVRJT04sIGNvbnRhaW5lciwgZmlsZV90eXBlKSB9Cit9CisKKy8vLyBHZXQgcGFja2FnZSByZWFkIGNvbnRleHQgZm9yIGEgc3BlY2lmaWMgcGFja2FnZS4KKy8vLworLy8vIFxpbnB1dCBmaWxlOiBtYXBwZWQgcGFja2FnZSBmaWxlCisvLy8gXGlucHV0IHBhY2thZ2U6IHBhY2thZ2UgbmFtZQorLy8vCisvLy8gXHJldHVybgorLy8vIElmIGEgcGFja2FnZSBpcyBmb3VuZCwgaXQgcmV0dXJucyBPayhTb21lKFBhY2thZ2VSZWFkQ29udGV4dCkpCisvLy8gSWYgYSBwYWNrYWdlIGlzIG5vdCBmb3VuZCwgaXQgcmV0dXJucyBPayhOb25lKQorLy8vIElmIGVycm9ycyBvdXQsIGl0IHJldHVybnMgYW4gRXJyKGVycm1zZykKK3B1YiBmbiBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoCisgICAgZmlsZTogJk1tYXAsCisgICAgcGFja2FnZTogJnN0ciwKKykgLT4gUmVzdWx0PE9wdGlvbjxQYWNrYWdlUmVhZENvbnRleHQ+LCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgZmluZF9wYWNrYWdlX3JlYWRfY29udGV4dChmaWxlLCBwYWNrYWdlKQorfQorCisvLy8gR2V0IGZsYWcgcmVhZCBjb250ZXh0IGZvciBhIHNwZWNpZmljIGZsYWcuCisvLy8KKy8vLyBcaW5wdXQgZmlsZTogbWFwcGVkIGZsYWcgZmlsZQorLy8vIFxpbnB1dCBwYWNrYWdlX2lkOiBwYWNrYWdlIGlkIG9idGFpbmVkIGZyb20gcGFja2FnZSBtYXBwaW5nIGZpbGUKKy8vLyBcaW5wdXQgZmxhZzogZmxhZyBuYW1lCisvLy8KKy8vLyBccmV0dXJuCisvLy8gSWYgYSBmbGFnIGlzIGZvdW5kLCBpdCByZXR1cm5zIE9rKFNvbWUoRmxhZ1JlYWRDb250ZXh0KSkKKy8vLyBJZiBhIGZsYWcgaXMgbm90IGZvdW5kLCBpdCByZXR1cm5zIE9rKE5vbmUpCisvLy8gSWYgZXJyb3JzIG91dCwgaXQgcmV0dXJucyBhbiBFcnIoZXJybXNnKQorcHViIGZuIGdldF9mbGFnX3JlYWRfY29udGV4dCgKKyAgICBmaWxlOiAmTW1hcCwKKyAgICBwYWNrYWdlX2lkOiB1MzIsCisgICAgZmxhZzogJnN0ciwKKykgLT4gUmVzdWx0PE9wdGlvbjxGbGFnUmVhZENvbnRleHQ+LCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgZmluZF9mbGFnX3JlYWRfY29udGV4dChmaWxlLCBwYWNrYWdlX2lkLCBmbGFnKQorfQorCisvLy8gR2V0IHRoZSBib29sZWFuIGZsYWcgdmFsdWUuCisvLy8KKy8vLyBcaW5wdXQgZmlsZTogYSBieXRlIHNsaWNlLCBjYW4gYmUgZWl0aGVyICZNbWFwIG9yICZNYXBNdXQKKy8vLyBcaW5wdXQgaW5kZXg6IGJvb2xlYW4gZmxhZyBvZmZzZXQKKy8vLworLy8vIFxyZXR1cm4KKy8vLyBJZiB0aGUgcHJvdmlkZSBvZmZzZXQgaXMgdmFsaWQsIGl0IHJldHVybnMgdGhlIGJvb2xlYW4gZmxhZyB2YWx1ZSwgb3RoZXJ3aXNlIGl0CisvLy8gcmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZS4KK3B1YiBmbiBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKGZpbGU6ICZbdThdLCBpbmRleDogdTMyKSAtPiBSZXN1bHQ8Ym9vbCwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIGZpbmRfYm9vbGVhbl9mbGFnX3ZhbHVlKGZpbGUsIGluZGV4KQorfQorCisvLy8gR2V0IHN0b3JhZ2UgZmlsZSB2ZXJzaW9uIG51bWJlcgorLy8vCisvLy8gVGhpcyBmdW5jdGlvbiB3b3VsZCByZWFkIHRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIHRoZSBmaWxlIGFuZCBpbnRlcnByZXQgaXQgYXMgdGhlCisvLy8gdmVyc2lvbiBudW1iZXIgb2YgdGhlIGZpbGUuIFRoZXJlIGFyZSB1bml0IHRlc3RzIGluIGFjb25maWdfc3RvcmFnZV9maWxlIGNyYXRlIHRvCisvLy8gbG9jayBkb3duIHRoYXQgZm9yIGFsbCBzdG9yYWdlIGZpbGVzLCB0aGUgZmlyc3QgZm91ciBieXRlcyB3aWxsIGJlIHRoZSB2ZXJzaW9uCisvLy8gbnVtYmVyIG9mIHRoZSBzdG9yYWdlIGZpbGUKK3B1YiBmbiBnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb24oZmlsZV9wYXRoOiAmc3RyKSAtPiBSZXN1bHQ8dTMyLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgbGV0IG11dCBmaWxlID0gRmlsZTo6b3BlbihmaWxlX3BhdGgpLm1hcF9lcnIofGVycm1zZ3wgeworICAgICAgICBBY29uZmlnU3RvcmFnZUVycm9yOjpGaWxlUmVhZEZhaWwoYW55aG93ISgiRmFpbGVkIHRvIG9wZW4gZmlsZSB7fToge30iLCBmaWxlX3BhdGgsIGVycm1zZykpCisgICAgfSk/OworICAgIGxldCBtdXQgYnVmZmVyID0gWzA7IDRdOworICAgIGZpbGUucmVhZCgmbXV0IGJ1ZmZlcikubWFwX2Vycih8ZXJybXNnfCB7CisgICAgICAgIEFjb25maWdTdG9yYWdlRXJyb3I6OkZpbGVSZWFkRmFpbChhbnlob3chKAorICAgICAgICAgICAgIkZhaWxlZCB0byByZWFkIDQgYnl0ZXMgZnJvbSBmaWxlIHt9OiB7fSIsCisgICAgICAgICAgICBmaWxlX3BhdGgsCisgICAgICAgICAgICBlcnJtc2cKKyAgICAgICAgKSkKKyAgICB9KT87CisgICAgbGV0IG11dCBoZWFkID0gMDsKKyAgICByZWFkX3UzMl9mcm9tX2J5dGVzKCZidWZmZXIsICZtdXQgaGVhZCkKK30KKworLy8vIEdldCB0aGUgZmxhZyBhdHRyaWJ1dGUuCisvLy8KKy8vLyBcaW5wdXQgZmlsZTogYSBieXRlIHNsaWNlLCBjYW4gYmUgZWl0aGVyICZNbWFwIG9yICZNYXBNdXQKKy8vLyBcaW5wdXQgZmxhZ190eXBlOiBmbGFnIHZhbHVlIHR5cGUKKy8vLyBcaW5wdXQgZmxhZ19pbmRleDogZmxhZyBpbmRleAorLy8vCisvLy8gXHJldHVybgorLy8vIElmIHRoZSBwcm92aWRlIG9mZnNldCBpcyB2YWxpZCwgaXQgcmV0dXJucyB0aGUgZmxhZyBhdHRyaWJ1dGUgYml0ZmlsZWQsIG90aGVyd2lzZSBpdAorLy8vIHJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UuCitwdWIgZm4gZ2V0X2ZsYWdfYXR0cmlidXRlKAorICAgIGZpbGU6ICZbdThdLAorICAgIGZsYWdfdHlwZTogRmxhZ1ZhbHVlVHlwZSwKKyAgICBmbGFnX2luZGV4OiB1MzIsCispIC0+IFJlc3VsdDx1OCwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIGZpbmRfZmxhZ19hdHRyaWJ1dGUoZmlsZSwgZmxhZ190eXBlLCBmbGFnX2luZGV4KQorfQorCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KKy8vIENDIElOVEVSTE9QCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KKworLy8gRXhwb3J0ZWQgcnVzdCBkYXRhIHN0cnVjdHVyZSBhbmQgbWV0aG9kcywgYysrIGNvZGUgd2lsbCBiZSBnZW5lcmF0ZWQKKyNbY3h4OjpicmlkZ2VdCittb2QgZmZpIHsKKyAgICAvLyBTdG9yYWdlIGZpbGUgdmVyc2lvbiBxdWVyeSByZXR1cm4gZm9yIGNjIGludGVybG9wCisgICAgcHViIHN0cnVjdCBWZXJzaW9uTnVtYmVyUXVlcnlDWFggeworICAgICAgICBwdWIgcXVlcnlfc3VjY2VzczogYm9vbCwKKyAgICAgICAgcHViIGVycm9yX21lc3NhZ2U6IFN0cmluZywKKyAgICAgICAgcHViIHZlcnNpb25fbnVtYmVyOiB1MzIsCisgICAgfQorCisgICAgLy8gUGFja2FnZSB0YWJsZSBxdWVyeSByZXR1cm4gZm9yIGNjIGludGVybG9wCisgICAgcHViIHN0cnVjdCBQYWNrYWdlUmVhZENvbnRleHRRdWVyeUNYWCB7CisgICAgICAgIHB1YiBxdWVyeV9zdWNjZXNzOiBib29sLAorICAgICAgICBwdWIgZXJyb3JfbWVzc2FnZTogU3RyaW5nLAorICAgICAgICBwdWIgcGFja2FnZV9leGlzdHM6IGJvb2wsCisgICAgICAgIHB1YiBwYWNrYWdlX2lkOiB1MzIsCisgICAgICAgIHB1YiBib29sZWFuX3N0YXJ0X2luZGV4OiB1MzIsCisgICAgfQorCisgICAgLy8gRmxhZyB0YWJsZSBxdWVyeSByZXR1cm4gZm9yIGNjIGludGVybG9wCisgICAgcHViIHN0cnVjdCBGbGFnUmVhZENvbnRleHRRdWVyeUNYWCB7CisgICAgICAgIHB1YiBxdWVyeV9zdWNjZXNzOiBib29sLAorICAgICAgICBwdWIgZXJyb3JfbWVzc2FnZTogU3RyaW5nLAorICAgICAgICBwdWIgZmxhZ19leGlzdHM6IGJvb2wsCisgICAgICAgIHB1YiBmbGFnX3R5cGU6IHUxNiwKKyAgICAgICAgcHViIGZsYWdfaW5kZXg6IHUxNiwKKyAgICB9CisKKyAgICAvLyBGbGFnIHZhbHVlIHF1ZXJ5IHJldHVybiBmb3IgY2MgaW50ZXJsb3AKKyAgICBwdWIgc3RydWN0IEJvb2xlYW5GbGFnVmFsdWVRdWVyeUNYWCB7CisgICAgICAgIHB1YiBxdWVyeV9zdWNjZXNzOiBib29sLAorICAgICAgICBwdWIgZXJyb3JfbWVzc2FnZTogU3RyaW5nLAorICAgICAgICBwdWIgZmxhZ192YWx1ZTogYm9vbCwKKyAgICB9CisKKyAgICAvLyBGbGFnIGluZm8gcXVlcnkgcmV0dXJuIGZvciBjYyBpbnRlcmxvcAorICAgIHB1YiBzdHJ1Y3QgRmxhZ0F0dHJpYnV0ZVF1ZXJ5Q1hYIHsKKyAgICAgICAgcHViIHF1ZXJ5X3N1Y2Nlc3M6IGJvb2wsCisgICAgICAgIHB1YiBlcnJvcl9tZXNzYWdlOiBTdHJpbmcsCisgICAgICAgIHB1YiBmbGFnX2F0dHJpYnV0ZTogdTgsCisgICAgfQorCisgICAgLy8gUnVzdCBleHBvcnQgdG8gYysrCisgICAgZXh0ZXJuICJSdXN0IiB7CisgICAgICAgIHB1YiBmbiBnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb25fY3h4KGZpbGVfcGF0aDogJnN0cikgLT4gVmVyc2lvbk51bWJlclF1ZXJ5Q1hYOworCisgICAgICAgIHB1YiBmbiBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHRfY3h4KAorICAgICAgICAgICAgZmlsZTogJlt1OF0sCisgICAgICAgICAgICBwYWNrYWdlOiAmc3RyLAorICAgICAgICApIC0+IFBhY2thZ2VSZWFkQ29udGV4dFF1ZXJ5Q1hYOworCisgICAgICAgIHB1YiBmbiBnZXRfZmxhZ19yZWFkX2NvbnRleHRfY3h4KAorICAgICAgICAgICAgZmlsZTogJlt1OF0sCisgICAgICAgICAgICBwYWNrYWdlX2lkOiB1MzIsCisgICAgICAgICAgICBmbGFnOiAmc3RyLAorICAgICAgICApIC0+IEZsYWdSZWFkQ29udGV4dFF1ZXJ5Q1hYOworCisgICAgICAgIHB1YiBmbiBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlX2N4eChmaWxlOiAmW3U4XSwgb2Zmc2V0OiB1MzIpIC0+IEJvb2xlYW5GbGFnVmFsdWVRdWVyeUNYWDsKKworICAgICAgICBwdWIgZm4gZ2V0X2ZsYWdfYXR0cmlidXRlX2N4eCgKKyAgICAgICAgICAgIGZpbGU6ICZbdThdLAorICAgICAgICAgICAgZmxhZ190eXBlOiB1MTYsCisgICAgICAgICAgICBmbGFnX2luZGV4OiB1MzIsCisgICAgICAgICkgLT4gRmxhZ0F0dHJpYnV0ZVF1ZXJ5Q1hYOworICAgIH0KK30KKworLy8vIEltcGxlbWVudCB0aGUgcGFja2FnZSBvZmZzZXQgaW50ZXJsb3AgcmV0dXJuIHR5cGUsIGNyZWF0ZSBmcm9tIGFjdHVhbCBwYWNrYWdlIG9mZnNldCBhcGkgcmV0dXJuIHR5cGUKK2ltcGwgZmZpOjpQYWNrYWdlUmVhZENvbnRleHRRdWVyeUNYWCB7CisgICAgcHViKGNyYXRlKSBmbiBuZXcoCisgICAgICAgIG9mZnNldF9yZXN1bHQ6IFJlc3VsdDxPcHRpb248UGFja2FnZVJlYWRDb250ZXh0PiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4sCisgICAgKSAtPiBTZWxmIHsKKyAgICAgICAgbWF0Y2ggb2Zmc2V0X3Jlc3VsdCB7CisgICAgICAgICAgICBPayhvZmZzZXRfb3B0KSA9PiBtYXRjaCBvZmZzZXRfb3B0IHsKKyAgICAgICAgICAgICAgICBTb21lKG9mZnNldCkgPT4gU2VsZiB7CisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5X3N1Y2Nlc3M6IHRydWUsCisgICAgICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2U6IFN0cmluZzo6ZnJvbSgiIiksCisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VfZXhpc3RzOiB0cnVlLAorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlX2lkOiBvZmZzZXQucGFja2FnZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleDogb2Zmc2V0LmJvb2xlYW5fc3RhcnRfaW5kZXgsCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBOb25lID0+IFNlbGYgeworICAgICAgICAgICAgICAgICAgICBxdWVyeV9zdWNjZXNzOiB0cnVlLAorICAgICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlOiBTdHJpbmc6OmZyb20oIiIpLAorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlX2V4aXN0czogZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VfaWQ6IDAsCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDAsCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBFcnIoZXJybXNnKSA9PiBTZWxmIHsKKyAgICAgICAgICAgICAgICBxdWVyeV9zdWNjZXNzOiBmYWxzZSwKKyAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlOiBmb3JtYXQhKCJ7Oj99IiwgZXJybXNnKSwKKyAgICAgICAgICAgICAgICBwYWNrYWdlX2V4aXN0czogZmFsc2UsCisgICAgICAgICAgICAgICAgcGFja2FnZV9pZDogMCwKKyAgICAgICAgICAgICAgICBib29sZWFuX3N0YXJ0X2luZGV4OiAwLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIEltcGxlbWVudCB0aGUgZmxhZyBvZmZzZXQgaW50ZXJsb3AgcmV0dXJuIHR5cGUsIGNyZWF0ZSBmcm9tIGFjdHVhbCBmbGFnIG9mZnNldCBhcGkgcmV0dXJuIHR5cGUKK2ltcGwgZmZpOjpGbGFnUmVhZENvbnRleHRRdWVyeUNYWCB7CisgICAgcHViKGNyYXRlKSBmbiBuZXcob2Zmc2V0X3Jlc3VsdDogUmVzdWx0PE9wdGlvbjxGbGFnUmVhZENvbnRleHQ+LCBBY29uZmlnU3RvcmFnZUVycm9yPikgLT4gU2VsZiB7CisgICAgICAgIG1hdGNoIG9mZnNldF9yZXN1bHQgeworICAgICAgICAgICAgT2sob2Zmc2V0X29wdCkgPT4gbWF0Y2ggb2Zmc2V0X29wdCB7CisgICAgICAgICAgICAgICAgU29tZShvZmZzZXQpID0+IFNlbGYgeworICAgICAgICAgICAgICAgICAgICBxdWVyeV9zdWNjZXNzOiB0cnVlLAorICAgICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlOiBTdHJpbmc6OmZyb20oIiIpLAorICAgICAgICAgICAgICAgICAgICBmbGFnX2V4aXN0czogdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ190eXBlOiBvZmZzZXQuZmxhZ190eXBlIGFzIHUxNiwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ19pbmRleDogb2Zmc2V0LmZsYWdfaW5kZXgsCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBOb25lID0+IFNlbGYgeworICAgICAgICAgICAgICAgICAgICBxdWVyeV9zdWNjZXNzOiB0cnVlLAorICAgICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlOiBTdHJpbmc6OmZyb20oIiIpLAorICAgICAgICAgICAgICAgICAgICBmbGFnX2V4aXN0czogZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIGZsYWdfdHlwZTogMHUxNiwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ19pbmRleDogMHUxNiwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEVycihlcnJtc2cpID0+IFNlbGYgeworICAgICAgICAgICAgICAgIHF1ZXJ5X3N1Y2Nlc3M6IGZhbHNlLAorICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2U6IGZvcm1hdCEoIns6P30iLCBlcnJtc2cpLAorICAgICAgICAgICAgICAgIGZsYWdfZXhpc3RzOiBmYWxzZSwKKyAgICAgICAgICAgICAgICBmbGFnX3R5cGU6IDB1MTYsCisgICAgICAgICAgICAgICAgZmxhZ19pbmRleDogMHUxNiwKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBJbXBsZW1lbnQgdGhlIGZsYWcgdmFsdWUgaW50ZXJsb3AgcmV0dXJuIHR5cGUsIGNyZWF0ZSBmcm9tIGFjdHVhbCBmbGFnIHZhbHVlIGFwaSByZXR1cm4gdHlwZQoraW1wbCBmZmk6OkJvb2xlYW5GbGFnVmFsdWVRdWVyeUNYWCB7CisgICAgcHViKGNyYXRlKSBmbiBuZXcodmFsdWVfcmVzdWx0OiBSZXN1bHQ8Ym9vbCwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4pIC0+IFNlbGYgeworICAgICAgICBtYXRjaCB2YWx1ZV9yZXN1bHQgeworICAgICAgICAgICAgT2sodmFsdWUpID0+IHsKKyAgICAgICAgICAgICAgICBTZWxmIHsgcXVlcnlfc3VjY2VzczogdHJ1ZSwgZXJyb3JfbWVzc2FnZTogU3RyaW5nOjpmcm9tKCIiKSwgZmxhZ192YWx1ZTogdmFsdWUgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgRXJyKGVycm1zZykgPT4gU2VsZiB7CisgICAgICAgICAgICAgICAgcXVlcnlfc3VjY2VzczogZmFsc2UsCisgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZTogZm9ybWF0ISgiezo/fSIsIGVycm1zZyksCisgICAgICAgICAgICAgICAgZmxhZ192YWx1ZTogZmFsc2UsCisgICAgICAgICAgICB9LAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gSW1wbGVtZW50IHRoZSBmbGFnIGluZm8gaW50ZXJsb3AgcmV0dXJuIHR5cGUsIGNyZWF0ZSBmcm9tIGFjdHVhbCBmbGFnIGluZm8gYXBpIHJldHVybiB0eXBlCitpbXBsIGZmaTo6RmxhZ0F0dHJpYnV0ZVF1ZXJ5Q1hYIHsKKyAgICBwdWIoY3JhdGUpIGZuIG5ldyhpbmZvX3Jlc3VsdDogUmVzdWx0PHU4LCBBY29uZmlnU3RvcmFnZUVycm9yPikgLT4gU2VsZiB7CisgICAgICAgIG1hdGNoIGluZm9fcmVzdWx0IHsKKyAgICAgICAgICAgIE9rKGluZm8pID0+IHsKKyAgICAgICAgICAgICAgICBTZWxmIHsgcXVlcnlfc3VjY2VzczogdHJ1ZSwgZXJyb3JfbWVzc2FnZTogU3RyaW5nOjpmcm9tKCIiKSwgZmxhZ19hdHRyaWJ1dGU6IGluZm8gfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgRXJyKGVycm1zZykgPT4gU2VsZiB7CisgICAgICAgICAgICAgICAgcXVlcnlfc3VjY2VzczogZmFsc2UsCisgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZTogZm9ybWF0ISgiezo/fSIsIGVycm1zZyksCisgICAgICAgICAgICAgICAgZmxhZ19hdHRyaWJ1dGU6IDB1OCwKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBJbXBsZW1lbnQgdGhlIHN0b3JhZ2UgdmVyc2lvbiBudW1iZXIgaW50ZXJsb3AgcmV0dXJuIHR5cGUsIGNyZWF0ZSBmcm9tIGFjdHVhbCB2ZXJzaW9uIG51bWJlcgorLy8vIGFwaSByZXR1cm4gdHlwZQoraW1wbCBmZmk6OlZlcnNpb25OdW1iZXJRdWVyeUNYWCB7CisgICAgcHViKGNyYXRlKSBmbiBuZXcodmVyc2lvbl9yZXN1bHQ6IFJlc3VsdDx1MzIsIEFjb25maWdTdG9yYWdlRXJyb3I+KSAtPiBTZWxmIHsKKyAgICAgICAgbWF0Y2ggdmVyc2lvbl9yZXN1bHQgeworICAgICAgICAgICAgT2sodmVyc2lvbikgPT4gU2VsZiB7CisgICAgICAgICAgICAgICAgcXVlcnlfc3VjY2VzczogdHJ1ZSwKKyAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlOiBTdHJpbmc6OmZyb20oIiIpLAorICAgICAgICAgICAgICAgIHZlcnNpb25fbnVtYmVyOiB2ZXJzaW9uLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEVycihlcnJtc2cpID0+IFNlbGYgeworICAgICAgICAgICAgICAgIHF1ZXJ5X3N1Y2Nlc3M6IGZhbHNlLAorICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2U6IGZvcm1hdCEoIns6P30iLCBlcnJtc2cpLAorICAgICAgICAgICAgICAgIHZlcnNpb25fbnVtYmVyOiAwLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIEdldCBwYWNrYWdlIHJlYWQgY29udGV4dCBjYyBpbnRlcmxvcAorcHViIGZuIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dF9jeHgoZmlsZTogJlt1OF0sIHBhY2thZ2U6ICZzdHIpIC0+IGZmaTo6UGFja2FnZVJlYWRDb250ZXh0UXVlcnlDWFggeworICAgIGZmaTo6UGFja2FnZVJlYWRDb250ZXh0UXVlcnlDWFg6Om5ldyhmaW5kX3BhY2thZ2VfcmVhZF9jb250ZXh0KGZpbGUsIHBhY2thZ2UpKQorfQorCisvLy8gR2V0IGZsYWcgcmVhZCBjb250ZXh0IGNjIGludGVybG9wCitwdWIgZm4gZ2V0X2ZsYWdfcmVhZF9jb250ZXh0X2N4eCgKKyAgICBmaWxlOiAmW3U4XSwKKyAgICBwYWNrYWdlX2lkOiB1MzIsCisgICAgZmxhZzogJnN0ciwKKykgLT4gZmZpOjpGbGFnUmVhZENvbnRleHRRdWVyeUNYWCB7CisgICAgZmZpOjpGbGFnUmVhZENvbnRleHRRdWVyeUNYWDo6bmV3KGZpbmRfZmxhZ19yZWFkX2NvbnRleHQoZmlsZSwgcGFja2FnZV9pZCwgZmxhZykpCit9CisKKy8vLyBHZXQgYm9vbGVhbiBmbGFnIHZhbHVlIGNjIGludGVybG9wCitwdWIgZm4gZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZV9jeHgoZmlsZTogJlt1OF0sIG9mZnNldDogdTMyKSAtPiBmZmk6OkJvb2xlYW5GbGFnVmFsdWVRdWVyeUNYWCB7CisgICAgZmZpOjpCb29sZWFuRmxhZ1ZhbHVlUXVlcnlDWFg6Om5ldyhmaW5kX2Jvb2xlYW5fZmxhZ192YWx1ZShmaWxlLCBvZmZzZXQpKQorfQorCisvLy8gR2V0IGZsYWcgYXR0cmlidXRlIGNjIGludGVybG9wCitwdWIgZm4gZ2V0X2ZsYWdfYXR0cmlidXRlX2N4eCgKKyAgICBmaWxlOiAmW3U4XSwKKyAgICBmbGFnX3R5cGU6IHUxNiwKKyAgICBmbGFnX2luZGV4OiB1MzIsCispIC0+IGZmaTo6RmxhZ0F0dHJpYnV0ZVF1ZXJ5Q1hYIHsKKyAgICBtYXRjaCBGbGFnVmFsdWVUeXBlOjp0cnlfZnJvbShmbGFnX3R5cGUpIHsKKyAgICAgICAgT2sodmFsdWVfdHlwZSkgPT4geworICAgICAgICAgICAgZmZpOjpGbGFnQXR0cmlidXRlUXVlcnlDWFg6Om5ldyhmaW5kX2ZsYWdfYXR0cmlidXRlKGZpbGUsIHZhbHVlX3R5cGUsIGZsYWdfaW5kZXgpKQorICAgICAgICB9CisgICAgICAgIEVycihlcnJtc2cpID0+IGZmaTo6RmxhZ0F0dHJpYnV0ZVF1ZXJ5Q1hYOjpuZXcoRXJyKGVycm1zZykpLAorICAgIH0KK30KKworLy8vIEdldCBzdG9yYWdlIHZlcnNpb24gbnVtYmVyIGNjIGludGVybG9wCitwdWIgZm4gZ2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uX2N4eChmaWxlX3BhdGg6ICZzdHIpIC0+IGZmaTo6VmVyc2lvbk51bWJlclF1ZXJ5Q1hYIHsKKyAgICBmZmk6OlZlcnNpb25OdW1iZXJRdWVyeUNYWDo6bmV3KGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbihmaWxlX3BhdGgpKQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBjcmF0ZTo6bWFwcGVkX2ZpbGU6OmdldF9tYXBwZWRfZmlsZTsKKyAgICB1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OntGbGFnSW5mb0JpdCwgU3RvcmVkRmxhZ1R5cGV9OworICAgIHVzZSByYW5kOjpSbmc7CisgICAgdXNlIHN0ZDo6ZnM7CisKKyAgICBmbiBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKCkgLT4gU3RyaW5nIHsKKyAgICAgICAgbGV0IG11dCBybmcgPSByYW5kOjp0aHJlYWRfcm5nKCk7CisgICAgICAgIGxldCBudW1iZXI6IHUzMiA9IHJuZy5nZW4oKTsKKyAgICAgICAgbGV0IHN0b3JhZ2VfZGlyID0gU3RyaW5nOjpmcm9tKCIvdG1wLyIpICsgJm51bWJlci50b19zdHJpbmcoKTsKKyAgICAgICAgaWYgc3RkOjpmczo6bWV0YWRhdGEoJnN0b3JhZ2VfZGlyKS5pc19vaygpIHsKKyAgICAgICAgICAgIGZzOjpyZW1vdmVfZGlyX2FsbCgmc3RvcmFnZV9kaXIpLnVud3JhcCgpOworICAgICAgICB9CisgICAgICAgIGxldCBtYXBzX2RpciA9IHN0b3JhZ2VfZGlyLmNsb25lKCkgKyAiL21hcHMiOworICAgICAgICBsZXQgYm9vdF9kaXIgPSBzdG9yYWdlX2Rpci5jbG9uZSgpICsgIi9ib290IjsKKyAgICAgICAgZnM6OmNyZWF0ZV9kaXIoJnN0b3JhZ2VfZGlyKS51bndyYXAoKTsKKyAgICAgICAgZnM6OmNyZWF0ZV9kaXIoJm1hcHNfZGlyKS51bndyYXAoKTsKKyAgICAgICAgZnM6OmNyZWF0ZV9kaXIoJmJvb3RfZGlyKS51bndyYXAoKTsKKworICAgICAgICBsZXQgcGFja2FnZV9tYXAgPSBzdG9yYWdlX2Rpci5jbG9uZSgpICsgIi9tYXBzL21vY2t1cC5wYWNrYWdlLm1hcCI7CisgICAgICAgIGxldCBmbGFnX21hcCA9IHN0b3JhZ2VfZGlyLmNsb25lKCkgKyAiL21hcHMvbW9ja3VwLmZsYWcubWFwIjsKKyAgICAgICAgbGV0IGZsYWdfdmFsID0gc3RvcmFnZV9kaXIuY2xvbmUoKSArICIvYm9vdC9tb2NrdXAudmFsIjsKKyAgICAgICAgbGV0IGZsYWdfaW5mbyA9IHN0b3JhZ2VfZGlyLmNsb25lKCkgKyAiL2Jvb3QvbW9ja3VwLmluZm8iOworICAgICAgICBmczo6Y29weSgiLi90ZXN0cy9kYXRhL3YxL3BhY2thZ2VfdjEubWFwIiwgJnBhY2thZ2VfbWFwKS51bndyYXAoKTsKKyAgICAgICAgZnM6OmNvcHkoIi4vdGVzdHMvZGF0YS92MS9mbGFnX3YxLm1hcCIsICZmbGFnX21hcCkudW53cmFwKCk7CisgICAgICAgIGZzOjpjb3B5KCIuL3Rlc3RzL2RhdGEvdjEvZmxhZ192MS52YWwiLCAmZmxhZ192YWwpLnVud3JhcCgpOworICAgICAgICBmczo6Y29weSgiLi90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEuaW5mbyIsICZmbGFnX2luZm8pLnVud3JhcCgpOworCisgICAgICAgIHJldHVybiBzdG9yYWdlX2RpcjsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gZmxhZyBwYWNrYWdlIHJlYWQgY29udGV4dCBxdWVyeQorICAgIGZuIHRlc3RfcGFja2FnZV9jb250ZXh0X3F1ZXJ5KCkgeworICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKCk7CisgICAgICAgIGxldCBwYWNrYWdlX21hcHBlZF9maWxlID0gdW5zYWZlIHsKKyAgICAgICAgICAgIGdldF9tYXBwZWRfZmlsZSgmc3RvcmFnZV9kaXIsICJtb2NrdXAiLCBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXApLnVud3JhcCgpCisgICAgICAgIH07CisKKyAgICAgICAgbGV0IHBhY2thZ2VfY29udGV4dCA9CisgICAgICAgICAgICBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfbWFwcGVkX2ZpbGUsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIikKKyAgICAgICAgICAgICAgICAudW53cmFwKCkKKyAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPQorICAgICAgICAgICAgUGFja2FnZVJlYWRDb250ZXh0IHsgcGFja2FnZV9pZDogMCwgYm9vbGVhbl9zdGFydF9pbmRleDogMCwgZmluZ2VycHJpbnQ6IDAgfTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHQsIGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCk7CisKKyAgICAgICAgbGV0IHBhY2thZ2VfY29udGV4dCA9CisgICAgICAgICAgICBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfbWFwcGVkX2ZpbGUsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIikKKyAgICAgICAgICAgICAgICAudW53cmFwKCkKKyAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPQorICAgICAgICAgICAgUGFja2FnZVJlYWRDb250ZXh0IHsgcGFja2FnZV9pZDogMSwgYm9vbGVhbl9zdGFydF9pbmRleDogMywgZmluZ2VycHJpbnQ6IDAgfTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHQsIGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCk7CisKKyAgICAgICAgbGV0IHBhY2thZ2VfY29udGV4dCA9CisgICAgICAgICAgICBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfbWFwcGVkX2ZpbGUsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IikKKyAgICAgICAgICAgICAgICAudW53cmFwKCkKKyAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPQorICAgICAgICAgICAgUGFja2FnZVJlYWRDb250ZXh0IHsgcGFja2FnZV9pZDogMiwgYm9vbGVhbl9zdGFydF9pbmRleDogNiwgZmluZ2VycHJpbnQ6IDAgfTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHQsIGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIGZsYWcgcmVhZCBjb250ZXh0IHF1ZXJ5CisgICAgZm4gdGVzdF9mbGFnX2NvbnRleHRfcXVlcnkoKSB7CisgICAgICAgIGxldCBzdG9yYWdlX2RpciA9IGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoKTsKKyAgICAgICAgbGV0IGZsYWdfbWFwcGVkX2ZpbGUgPQorICAgICAgICAgICAgdW5zYWZlIHsgZ2V0X21hcHBlZF9maWxlKCZzdG9yYWdlX2RpciwgIm1vY2t1cCIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ01hcCkudW53cmFwKCkgfTsKKworICAgICAgICBsZXQgYmFzZWxpbmUgPSB2ZWMhWworICAgICAgICAgICAgKDAsICJlbmFibGVkX3JvIiwgU3RvcmVkRmxhZ1R5cGU6OlJlYWRPbmx5Qm9vbGVhbiwgMXUxNiksCisgICAgICAgICAgICAoMCwgImVuYWJsZWRfcnciLCBTdG9yZWRGbGFnVHlwZTo6UmVhZFdyaXRlQm9vbGVhbiwgMnUxNiksCisgICAgICAgICAgICAoMiwgImVuYWJsZWRfcnciLCBTdG9yZWRGbGFnVHlwZTo6UmVhZFdyaXRlQm9vbGVhbiwgMXUxNiksCisgICAgICAgICAgICAoMSwgImRpc2FibGVkX3J3IiwgU3RvcmVkRmxhZ1R5cGU6OlJlYWRXcml0ZUJvb2xlYW4sIDB1MTYpLAorICAgICAgICAgICAgKDEsICJlbmFibGVkX2ZpeGVkX3JvIiwgU3RvcmVkRmxhZ1R5cGU6OkZpeGVkUmVhZE9ubHlCb29sZWFuLCAxdTE2KSwKKyAgICAgICAgICAgICgxLCAiZW5hYmxlZF9ybyIsIFN0b3JlZEZsYWdUeXBlOjpSZWFkT25seUJvb2xlYW4sIDJ1MTYpLAorICAgICAgICAgICAgKDIsICJlbmFibGVkX2ZpeGVkX3JvIiwgU3RvcmVkRmxhZ1R5cGU6OkZpeGVkUmVhZE9ubHlCb29sZWFuLCAwdTE2KSwKKyAgICAgICAgICAgICgwLCAiZGlzYWJsZWRfcnciLCBTdG9yZWRGbGFnVHlwZTo6UmVhZFdyaXRlQm9vbGVhbiwgMHUxNiksCisgICAgICAgIF07CisgICAgICAgIGZvciAocGFja2FnZV9pZCwgZmxhZ19uYW1lLCBmbGFnX3R5cGUsIGZsYWdfaW5kZXgpIGluIGJhc2VsaW5lLmludG9faXRlcigpIHsKKyAgICAgICAgICAgIGxldCBmbGFnX2NvbnRleHQgPQorICAgICAgICAgICAgICAgIGdldF9mbGFnX3JlYWRfY29udGV4dCgmZmxhZ19tYXBwZWRfZmlsZSwgcGFja2FnZV9pZCwgZmxhZ19uYW1lKS51bndyYXAoKS51bndyYXAoKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEoZmxhZ19jb250ZXh0LmZsYWdfdHlwZSwgZmxhZ190eXBlKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEoZmxhZ19jb250ZXh0LmZsYWdfaW5kZXgsIGZsYWdfaW5kZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIGZsYWcgdmFsdWUgcXVlcnkKKyAgICBmbiB0ZXN0X2ZsYWdfdmFsdWVfcXVlcnkoKSB7CisgICAgICAgIGxldCBzdG9yYWdlX2RpciA9IGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoKTsKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVfZmlsZSA9CisgICAgICAgICAgICB1bnNhZmUgeyBnZXRfbWFwcGVkX2ZpbGUoJnN0b3JhZ2VfZGlyLCAibW9ja3VwIiwgU3RvcmFnZUZpbGVUeXBlOjpGbGFnVmFsKS51bndyYXAoKSB9OworICAgICAgICBsZXQgYmFzZWxpbmU6IFZlYzxib29sPiA9IHZlYyFbZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlXTsKKyAgICAgICAgZm9yIChvZmZzZXQsIGV4cGVjdGVkX3ZhbHVlKSBpbiBiYXNlbGluZS5pbnRvX2l0ZXIoKS5lbnVtZXJhdGUoKSB7CisgICAgICAgICAgICBsZXQgZmxhZ192YWx1ZSA9IGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsdWVfZmlsZSwgb2Zmc2V0IGFzIHUzMikudW53cmFwKCk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKGZsYWdfdmFsdWUsIGV4cGVjdGVkX3ZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG9udyBmbGFnIGluZm8gcXVlcnkKKyAgICBmbiB0ZXN0X2ZsYWdfaW5mb19xdWVyeSgpIHsKKyAgICAgICAgbGV0IHN0b3JhZ2VfZGlyID0gY3JlYXRlX3Rlc3Rfc3RvcmFnZV9maWxlcygpOworICAgICAgICBsZXQgZmxhZ19pbmZvX2ZpbGUgPQorICAgICAgICAgICAgdW5zYWZlIHsgZ2V0X21hcHBlZF9maWxlKCZzdG9yYWdlX2RpciwgIm1vY2t1cCIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ0luZm8pLnVud3JhcCgpIH07CisgICAgICAgIGxldCBpc19ydzogVmVjPGJvb2w+ID0gdmVjIVt0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZV07CisgICAgICAgIGZvciAob2Zmc2V0LCBleHBlY3RlZF92YWx1ZSkgaW4gaXNfcncuaW50b19pdGVyKCkuZW51bWVyYXRlKCkgeworICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZSA9CisgICAgICAgICAgICAgICAgZ2V0X2ZsYWdfYXR0cmlidXRlKCZmbGFnX2luZm9fZmlsZSwgRmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgb2Zmc2V0IGFzIHUzMikudW53cmFwKCk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKChhdHRyaWJ1dGUgJiBGbGFnSW5mb0JpdDo6SXNSZWFkV3JpdGUgYXMgdTgpICE9IDB1OCwgZXhwZWN0ZWRfdmFsdWUpOworICAgICAgICAgICAgYXNzZXJ0ISgoYXR0cmlidXRlICYgRmxhZ0luZm9CaXQ6Okhhc1NlcnZlck92ZXJyaWRlIGFzIHU4KSA9PSAwdTgpOworICAgICAgICAgICAgYXNzZXJ0ISgoYXR0cmlidXRlICYgRmxhZ0luZm9CaXQ6Okhhc0xvY2FsT3ZlcnJpZGUgYXMgdTgpID09IDB1OCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gZmxhZyBzdG9yYWdlIGZpbGUgdmVyc2lvbiBudW1iZXIgcXVlcnkgYXBpCisgICAgZm4gdGVzdF9zdG9yYWdlX3ZlcnNpb25fcXVlcnkoKSB7CisgICAgICAgIGFzc2VydF9lcSEoZ2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKCIuL3Rlc3RzL2RhdGEvdjEvcGFja2FnZV92MS5tYXAiKS51bndyYXAoKSwgMSk7CisgICAgICAgIGFzc2VydF9lcSEoZ2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKCIuL3Rlc3RzL2RhdGEvdjEvZmxhZ192MS5tYXAiKS51bndyYXAoKSwgMSk7CisgICAgICAgIGFzc2VydF9lcSEoZ2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKCIuL3Rlc3RzL2RhdGEvdjEvZmxhZ192MS52YWwiKS51bndyYXAoKSwgMSk7CisgICAgICAgIGFzc2VydF9lcSEoZ2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKCIuL3Rlc3RzL2RhdGEvdjEvZmxhZ192MS5pbmZvIikudW53cmFwKCksIDEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9tYXBwZWRfZmlsZS5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9tYXBwZWRfZmlsZS5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGUyNjllCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3JjL21hcHBlZF9maWxlLnJzCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNlIGFueWhvdzo6YW55aG93OwordXNlIG1lbW1hcDI6Ok1tYXA7Cit1c2Ugc3RkOjpmczo6RmlsZTsKKwordXNlIGNyYXRlOjpBY29uZmlnU3RvcmFnZUVycm9yOjp7c2VsZiwgRmlsZVJlYWRGYWlsLCBNYXBGaWxlRmFpbCwgU3RvcmFnZUZpbGVOb3RGb3VuZH07Cit1c2UgY3JhdGU6OlN0b3JhZ2VGaWxlVHlwZTsKKworLy8vIEdldCB0aGUgcmVhZCBvbmx5IG1lbW9yeSBtYXBwaW5nIG9mIGEgc3RvcmFnZSBmaWxlCisvLy8KKy8vLyAjIFNhZmV0eQorLy8vCisvLy8gVGhlIG1lbW9yeSBtYXBwZWQgZmlsZSBtYXkgaGF2ZSB1bmRlZmluZWQgYmVoYXZpb3IgaWYgdGhlcmUgYXJlIHdyaXRlcyB0byB0aGlzCisvLy8gZmlsZSBhZnRlciBiZWluZyBtYXBwZWQuIEVuc3VyZSBubyB3cml0ZXMgY2FuIGhhcHBlbiB0byB0aGlzIGZpbGUgd2hpbGUgdGhpcworLy8vIG1hcHBpbmcgc3RheXMgYWxpdmUuCitwdWIgdW5zYWZlIGZuIG1hcF9maWxlKGZpbGVfcGF0aDogJnN0cikgLT4gUmVzdWx0PE1tYXAsIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICBsZXQgZmlsZSA9IEZpbGU6Om9wZW4oZmlsZV9wYXRoKQorICAgICAgICAubWFwX2Vycih8ZXJybXNnfCBGaWxlUmVhZEZhaWwoYW55aG93ISgiRmFpbGVkIHRvIG9wZW4gZmlsZSB7fToge30iLCBmaWxlX3BhdGgsIGVycm1zZykpKT87CisgICAgdW5zYWZlIHsKKyAgICAgICAgbGV0IG1hcHBlZF9maWxlID0gTW1hcDo6bWFwKCZmaWxlKS5tYXBfZXJyKHxlcnJtc2d8IHsKKyAgICAgICAgICAgIE1hcEZpbGVGYWlsKGFueWhvdyEoImZhaWwgdG8gbWFwIHN0b3JhZ2UgZmlsZSB7fToge30iLCBmaWxlX3BhdGgsIGVycm1zZykpCisgICAgICAgIH0pPzsKKyAgICAgICAgT2sobWFwcGVkX2ZpbGUpCisgICAgfQorfQorCisvLy8gR2V0IGEgbWFwcGVkIHN0b3JhZ2UgZmlsZSBnaXZlbiB0aGUgY29udGFpbmVyIGFuZCBmaWxlIHR5cGUKKy8vLworLy8vICMgU2FmZXR5CisvLy8KKy8vLyBUaGUgbWVtb3J5IG1hcHBlZCBmaWxlIG1heSBoYXZlIHVuZGVmaW5lZCBiZWhhdmlvciBpZiB0aGVyZSBhcmUgd3JpdGVzIHRvIHRoaXMKKy8vLyBmaWxlIGFmdGVyIGJlaW5nIG1hcHBlZC4gRW5zdXJlIG5vIHdyaXRlcyBjYW4gaGFwcGVuIHRvIHRoaXMgZmlsZSB3aGlsZSB0aGlzCisvLy8gbWFwcGluZyBzdGF5cyBhbGl2ZS4KK3B1YiB1bnNhZmUgZm4gZ2V0X21hcHBlZF9maWxlKAorICAgIHN0b3JhZ2VfZGlyOiAmc3RyLAorICAgIGNvbnRhaW5lcjogJnN0ciwKKyAgICBmaWxlX3R5cGU6IFN0b3JhZ2VGaWxlVHlwZSwKKykgLT4gUmVzdWx0PE1tYXAsIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICBsZXQgc3RvcmFnZV9maWxlID0gbWF0Y2ggZmlsZV90eXBlIHsKKyAgICAgICAgU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwID0+IHsKKyAgICAgICAgICAgIFN0cmluZzo6ZnJvbShzdG9yYWdlX2RpcikgKyAiL21hcHMvIiArIGNvbnRhaW5lciArICIucGFja2FnZS5tYXAiCisgICAgICAgIH0KKyAgICAgICAgU3RvcmFnZUZpbGVUeXBlOjpGbGFnTWFwID0+IFN0cmluZzo6ZnJvbShzdG9yYWdlX2RpcikgKyAiL21hcHMvIiArIGNvbnRhaW5lciArICIuZmxhZy5tYXAiLAorICAgICAgICBTdG9yYWdlRmlsZVR5cGU6OkZsYWdWYWwgPT4gU3RyaW5nOjpmcm9tKHN0b3JhZ2VfZGlyKSArICIvYm9vdC8iICsgY29udGFpbmVyICsgIi52YWwiLAorICAgICAgICBTdG9yYWdlRmlsZVR5cGU6OkZsYWdJbmZvID0+IFN0cmluZzo6ZnJvbShzdG9yYWdlX2RpcikgKyAiL2Jvb3QvIiArIGNvbnRhaW5lciArICIuaW5mbyIsCisgICAgfTsKKyAgICBpZiBzdGQ6OmZzOjptZXRhZGF0YSgmc3RvcmFnZV9maWxlKS5pc19lcnIoKSB7CisgICAgICAgIHJldHVybiBFcnIoU3RvcmFnZUZpbGVOb3RGb3VuZChhbnlob3chKCJzdG9yYWdlIGZpbGUge30gZG9lcyBub3QgZXhpc3QiLCBzdG9yYWdlX2ZpbGUpKSk7CisgICAgfQorICAgIHVuc2FmZSB7IG1hcF9maWxlKCZzdG9yYWdlX2ZpbGUpIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKyAgICB1c2UgcmFuZDo6Um5nOworICAgIHVzZSBzdGQ6OmZzOworICAgIHVzZSBzdGQ6OmlvOjpSZWFkOworCisgICAgZm4gbWFwX2FuZF92ZXJpZnkoc3RvcmFnZV9kaXI6ICZzdHIsIGZpbGVfdHlwZTogU3RvcmFnZUZpbGVUeXBlLCBhY3R1YWxfZmlsZTogJnN0cikgeworICAgICAgICBsZXQgbXV0IG9wZW5lZF9maWxlID0gRmlsZTo6b3BlbihhY3R1YWxfZmlsZSkudW53cmFwKCk7CisgICAgICAgIGxldCBtdXQgY29udGVudCA9IFZlYzo6bmV3KCk7CisgICAgICAgIG9wZW5lZF9maWxlLnJlYWRfdG9fZW5kKCZtdXQgY29udGVudCkudW53cmFwKCk7CisgICAgICAgIGxldCBtbWFwZWRfZmlsZSA9IHVuc2FmZSB7IGdldF9tYXBwZWRfZmlsZShzdG9yYWdlX2RpciwgIm1vY2t1cCIsIGZpbGVfdHlwZSkudW53cmFwKCkgfTsKKyAgICAgICAgYXNzZXJ0X2VxIShtbWFwZWRfZmlsZVsuLl0sIGNvbnRlbnRbLi5dKTsKKyAgICB9CisKKyAgICBmbiBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKCkgLT4gU3RyaW5nIHsKKyAgICAgICAgbGV0IG11dCBybmcgPSByYW5kOjp0aHJlYWRfcm5nKCk7CisgICAgICAgIGxldCBudW1iZXI6IHUzMiA9IHJuZy5nZW4oKTsKKyAgICAgICAgbGV0IHN0b3JhZ2VfZGlyID0gU3RyaW5nOjpmcm9tKCIvdG1wLyIpICsgJm51bWJlci50b19zdHJpbmcoKTsKKyAgICAgICAgaWYgc3RkOjpmczo6bWV0YWRhdGEoJnN0b3JhZ2VfZGlyKS5pc19vaygpIHsKKyAgICAgICAgICAgIGZzOjpyZW1vdmVfZGlyX2FsbCgmc3RvcmFnZV9kaXIpLnVud3JhcCgpOworICAgICAgICB9CisgICAgICAgIGxldCBtYXBzX2RpciA9IHN0b3JhZ2VfZGlyLmNsb25lKCkgKyAiL21hcHMiOworICAgICAgICBsZXQgYm9vdF9kaXIgPSBzdG9yYWdlX2Rpci5jbG9uZSgpICsgIi9ib290IjsKKyAgICAgICAgZnM6OmNyZWF0ZV9kaXIoJnN0b3JhZ2VfZGlyKS51bndyYXAoKTsKKyAgICAgICAgZnM6OmNyZWF0ZV9kaXIoJm1hcHNfZGlyKS51bndyYXAoKTsKKyAgICAgICAgZnM6OmNyZWF0ZV9kaXIoJmJvb3RfZGlyKS51bndyYXAoKTsKKworICAgICAgICBsZXQgcGFja2FnZV9tYXAgPSBzdG9yYWdlX2Rpci5jbG9uZSgpICsgIi9tYXBzL21vY2t1cC5wYWNrYWdlLm1hcCI7CisgICAgICAgIGxldCBmbGFnX21hcCA9IHN0b3JhZ2VfZGlyLmNsb25lKCkgKyAiL21hcHMvbW9ja3VwLmZsYWcubWFwIjsKKyAgICAgICAgbGV0IGZsYWdfdmFsID0gc3RvcmFnZV9kaXIuY2xvbmUoKSArICIvYm9vdC9tb2NrdXAudmFsIjsKKyAgICAgICAgbGV0IGZsYWdfaW5mbyA9IHN0b3JhZ2VfZGlyLmNsb25lKCkgKyAiL2Jvb3QvbW9ja3VwLmluZm8iOworICAgICAgICBmczo6Y29weSgiLi90ZXN0cy9kYXRhL3YxL3BhY2thZ2VfdjEubWFwIiwgJnBhY2thZ2VfbWFwKS51bndyYXAoKTsKKyAgICAgICAgZnM6OmNvcHkoIi4vdGVzdHMvZGF0YS92MS9mbGFnX3YxLm1hcCIsICZmbGFnX21hcCkudW53cmFwKCk7CisgICAgICAgIGZzOjpjb3B5KCIuL3Rlc3RzL2RhdGEvdjEvZmxhZ192MS52YWwiLCAmZmxhZ192YWwpLnVud3JhcCgpOworICAgICAgICBmczo6Y29weSgiLi90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEuaW5mbyIsICZmbGFnX2luZm8pLnVud3JhcCgpOworCisgICAgICAgIHJldHVybiBzdG9yYWdlX2RpcjsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9tYXBwZWRfZmlsZV9jb250ZW50cygpIHsKKyAgICAgICAgbGV0IHN0b3JhZ2VfZGlyID0gY3JlYXRlX3Rlc3Rfc3RvcmFnZV9maWxlcygpOworICAgICAgICBtYXBfYW5kX3ZlcmlmeSgmc3RvcmFnZV9kaXIsIFN0b3JhZ2VGaWxlVHlwZTo6UGFja2FnZU1hcCwgIi4vdGVzdHMvZGF0YS92MS9wYWNrYWdlX3YxLm1hcCIpOworICAgICAgICBtYXBfYW5kX3ZlcmlmeSgmc3RvcmFnZV9kaXIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ01hcCwgIi4vdGVzdHMvZGF0YS92MS9mbGFnX3YxLm1hcCIpOworICAgICAgICBtYXBfYW5kX3ZlcmlmeSgmc3RvcmFnZV9kaXIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCwgIi4vdGVzdHMvZGF0YS92MS9mbGFnX3YxLnZhbCIpOworICAgICAgICBtYXBfYW5kX3ZlcmlmeSgmc3RvcmFnZV9kaXIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ0luZm8sICIuL3Rlc3RzL2RhdGEvdjEvZmxhZ192MS5pbmZvIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3JjL3BhY2thZ2VfdGFibGVfcXVlcnkucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvcGFja2FnZV90YWJsZV9xdWVyeS5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjA2NjhmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3JjL3BhY2thZ2VfdGFibGVfcXVlcnkucnMKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyEgcGFja2FnZSB0YWJsZSBxdWVyeSBtb2R1bGUgZGVmaW5lcyB0aGUgcGFja2FnZSB0YWJsZSBmaWxlIHJlYWQgZnJvbSBtYXBwZWQgYnl0ZXMKKwordXNlIGNyYXRlOjpBY29uZmlnU3RvcmFnZUVycm9yOwordXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7CisgICAgcGFja2FnZV90YWJsZTo6UGFja2FnZVRhYmxlSGVhZGVyLCBwYWNrYWdlX3RhYmxlOjpQYWNrYWdlVGFibGVOb2RlLCByZWFkX3UzMl9mcm9tX2J5dGVzLAorICAgIE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OLAorfTsKK3VzZSBhbnlob3c6OmFueWhvdzsKKworLy8vIFBhY2thZ2UgdGFibGUgcXVlcnkgcmV0dXJuCisjW2Rlcml2ZShQYXJ0aWFsRXEsIERlYnVnKV0KK3B1YiBzdHJ1Y3QgUGFja2FnZVJlYWRDb250ZXh0IHsKKyAgICBwdWIgcGFja2FnZV9pZDogdTMyLAorICAgIHB1YiBib29sZWFuX3N0YXJ0X2luZGV4OiB1MzIsCisgICAgcHViIGZpbmdlcnByaW50OiB1NjQsCit9CisKKy8vLyBRdWVyeSBwYWNrYWdlIHJlYWQgY29udGV4dDogcGFja2FnZSBpZCBhbmQgc3RhcnQgaW5kZXgKK3B1YiBmbiBmaW5kX3BhY2thZ2VfcmVhZF9jb250ZXh0KAorICAgIGJ1ZjogJlt1OF0sCisgICAgcGFja2FnZTogJnN0ciwKKykgLT4gUmVzdWx0PE9wdGlvbjxQYWNrYWdlUmVhZENvbnRleHQ+LCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgbGV0IGludGVycHJldGVkX2hlYWRlciA9IFBhY2thZ2VUYWJsZUhlYWRlcjo6ZnJvbV9ieXRlcyhidWYpPzsKKyAgICBpZiBpbnRlcnByZXRlZF9oZWFkZXIudmVyc2lvbiA+IE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OIHsKKyAgICAgICAgcmV0dXJuIEVycihBY29uZmlnU3RvcmFnZUVycm9yOjpIaWdoZXJTdG9yYWdlRmlsZVZlcnNpb24oYW55aG93ISgKKyAgICAgICAgICAgICJDYW5ub3QgcmVhZCBzdG9yYWdlIGZpbGUgd2l0aCBhIGhpZ2hlciB2ZXJzaW9uIG9mIHt9IHdpdGggbGliIHZlcnNpb24ge30iLAorICAgICAgICAgICAgaW50ZXJwcmV0ZWRfaGVhZGVyLnZlcnNpb24sCisgICAgICAgICAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTgorICAgICAgICApKSk7CisgICAgfQorCisgICAgbGV0IG51bV9idWNrZXRzID0gKGludGVycHJldGVkX2hlYWRlci5ub2RlX29mZnNldCAtIGludGVycHJldGVkX2hlYWRlci5idWNrZXRfb2Zmc2V0KSAvIDQ7CisgICAgbGV0IGJ1Y2tldF9pbmRleCA9IFBhY2thZ2VUYWJsZU5vZGU6OmZpbmRfYnVja2V0X2luZGV4KHBhY2thZ2UsIG51bV9idWNrZXRzKTsKKworICAgIGxldCBtdXQgcG9zID0gKGludGVycHJldGVkX2hlYWRlci5idWNrZXRfb2Zmc2V0ICsgNCAqIGJ1Y2tldF9pbmRleCkgYXMgdXNpemU7CisgICAgbGV0IG11dCBwYWNrYWdlX25vZGVfb2Zmc2V0ID0gcmVhZF91MzJfZnJvbV9ieXRlcyhidWYsICZtdXQgcG9zKT8gYXMgdXNpemU7CisgICAgaWYgcGFja2FnZV9ub2RlX29mZnNldCA8IGludGVycHJldGVkX2hlYWRlci5ub2RlX29mZnNldCBhcyB1c2l6ZQorICAgICAgICB8fCBwYWNrYWdlX25vZGVfb2Zmc2V0ID49IGludGVycHJldGVkX2hlYWRlci5maWxlX3NpemUgYXMgdXNpemUKKyAgICB7CisgICAgICAgIHJldHVybiBPayhOb25lKTsKKyAgICB9CisKKyAgICBsb29wIHsKKyAgICAgICAgbGV0IGludGVycHJldGVkX25vZGUgPQorICAgICAgICAgICAgUGFja2FnZVRhYmxlTm9kZTo6ZnJvbV9ieXRlcygmYnVmW3BhY2thZ2Vfbm9kZV9vZmZzZXQuLl0sIGludGVycHJldGVkX2hlYWRlci52ZXJzaW9uKT87CisgICAgICAgIGlmIGludGVycHJldGVkX25vZGUucGFja2FnZV9uYW1lID09IHBhY2thZ2UgeworICAgICAgICAgICAgcmV0dXJuIE9rKFNvbWUoUGFja2FnZVJlYWRDb250ZXh0IHsKKyAgICAgICAgICAgICAgICBwYWNrYWdlX2lkOiBpbnRlcnByZXRlZF9ub2RlLnBhY2thZ2VfaWQsCisgICAgICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleDogaW50ZXJwcmV0ZWRfbm9kZS5ib29sZWFuX3N0YXJ0X2luZGV4LAorICAgICAgICAgICAgICAgIGZpbmdlcnByaW50OiBpbnRlcnByZXRlZF9ub2RlLmZpbmdlcnByaW50LAorICAgICAgICAgICAgfSkpOworICAgICAgICB9CisgICAgICAgIG1hdGNoIGludGVycHJldGVkX25vZGUubmV4dF9vZmZzZXQgeworICAgICAgICAgICAgU29tZShvZmZzZXQpID0+IHBhY2thZ2Vfbm9kZV9vZmZzZXQgPSBvZmZzZXQgYXMgdXNpemUsCisgICAgICAgICAgICBOb25lID0+IHJldHVybiBPayhOb25lKSwKKyAgICAgICAgfQorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKyAgICB1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6Ont0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlLCBERUZBVUxUX0ZJTEVfVkVSU0lPTn07CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGFibGUgcXVlcnkKKyAgICBmbiB0ZXN0X3BhY2thZ2VfcXVlcnkoKSB7CisgICAgICAgIGxldCBwYWNrYWdlX3RhYmxlID0gY3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZShERUZBVUxUX0ZJTEVfVkVSU0lPTikuaW50b19ieXRlcygpOworICAgICAgICBsZXQgcGFja2FnZV9jb250ZXh0ID0KKyAgICAgICAgICAgIGZpbmRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfdGFibGVbLi5dLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpOworICAgICAgICBsZXQgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0ID0KKyAgICAgICAgICAgIFBhY2thZ2VSZWFkQ29udGV4dCB7IHBhY2thZ2VfaWQ6IDAsIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDAsIGZpbmdlcnByaW50OiAwIH07CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZV9jb250ZXh0LCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQpOworICAgICAgICBsZXQgcGFja2FnZV9jb250ZXh0ID0KKyAgICAgICAgICAgIGZpbmRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfdGFibGVbLi5dLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpOworICAgICAgICBsZXQgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0ID0KKyAgICAgICAgICAgIFBhY2thZ2VSZWFkQ29udGV4dCB7IHBhY2thZ2VfaWQ6IDEsIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDMsIGZpbmdlcnByaW50OiAwIH07CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZV9jb250ZXh0LCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQpOworICAgICAgICBsZXQgcGFja2FnZV9jb250ZXh0ID0KKyAgICAgICAgICAgIGZpbmRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfdGFibGVbLi5dLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpOworICAgICAgICBsZXQgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0ID0KKyAgICAgICAgICAgIFBhY2thZ2VSZWFkQ29udGV4dCB7IHBhY2thZ2VfaWQ6IDIsIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDYsIGZpbmdlcnByaW50OiAwIH07CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZV9jb250ZXh0LCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biB0YWJsZSBxdWVyeQorICAgIGZuIHRlc3RfcGFja2FnZV9xdWVyeV92MigpIHsKKyAgICAgICAgbGV0IHBhY2thZ2VfdGFibGUgPSBjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlKDIpLmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IHBhY2thZ2VfY29udGV4dCA9CisgICAgICAgICAgICBmaW5kX3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX3RhYmxlWy4uXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiKQorICAgICAgICAgICAgICAgIC51bndyYXAoKQorICAgICAgICAgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCA9IFBhY2thZ2VSZWFkQ29udGV4dCB7CisgICAgICAgICAgICBwYWNrYWdlX2lkOiAwLAorICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleDogMCwKKyAgICAgICAgICAgIGZpbmdlcnByaW50OiAxNTI0ODk0ODUxMDU5MDE1ODA4NnU2NCwKKyAgICAgICAgfTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHQsIGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCk7CisgICAgICAgIGxldCBwYWNrYWdlX2NvbnRleHQgPQorICAgICAgICAgICAgZmluZF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV90YWJsZVsuLl0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIikKKyAgICAgICAgICAgICAgICAudW53cmFwKCkKKyAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPSBQYWNrYWdlUmVhZENvbnRleHQgeworICAgICAgICAgICAgcGFja2FnZV9pZDogMSwKKyAgICAgICAgICAgIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDMsCisgICAgICAgICAgICBmaW5nZXJwcmludDogNDQzMTk0MDUwMjI3NDg1Nzk2NHU2NCwKKyAgICAgICAgfTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHQsIGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCk7CisgICAgICAgIGxldCBwYWNrYWdlX2NvbnRleHQgPQorICAgICAgICAgICAgZmluZF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV90YWJsZVsuLl0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IikKKyAgICAgICAgICAgICAgICAudW53cmFwKCkKKyAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPSBQYWNrYWdlUmVhZENvbnRleHQgeworICAgICAgICAgICAgcGFja2FnZV9pZDogMiwKKyAgICAgICAgICAgIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDYsCisgICAgICAgICAgICBmaW5nZXJwcmludDogMTYyMzMyMjk5MTc3MTE2MjIzNzV1NjQsCisgICAgICAgIH07CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZV9jb250ZXh0LCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biB0YWJsZSBxdWVyeSBvZiBhIG5vbiBleGlzdCBwYWNrYWdlCisgICAgZm4gdGVzdF9ub3RfZXhpc3RlZF9wYWNrYWdlX3F1ZXJ5KCkgeworICAgICAgICAvLyB0aGlzIHdpbGwgbGFuZCBhdCBhbiBlbXB0eSBidWNrZXQKKyAgICAgICAgbGV0IHBhY2thZ2VfdGFibGUgPSBjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlKERFRkFVTFRfRklMRV9WRVJTSU9OKS5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCBwYWNrYWdlX2NvbnRleHQgPQorICAgICAgICAgICAgZmluZF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV90YWJsZVsuLl0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8zIikKKyAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZV9jb250ZXh0LCBOb25lKTsKKyAgICAgICAgLy8gdGhpcyB3aWxsIGxhbmQgYXQgdGhlIGVuZCBvZiBhIGxpbmtlZCBsaXN0CisgICAgICAgIGxldCBwYWNrYWdlX2NvbnRleHQgPQorICAgICAgICAgICAgZmluZF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV90YWJsZVsuLl0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF81IikKKyAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZV9jb250ZXh0LCBOb25lKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gcXVlcnkgZXJyb3Igd2hlbiBmaWxlIGhhcyBhIGhpZ2hlciB2ZXJzaW9uCisgICAgZm4gdGVzdF9oaWdoZXJfdmVyc2lvbl9zdG9yYWdlX2ZpbGUoKSB7CisgICAgICAgIGxldCBtdXQgdGFibGUgPSBjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlKERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgdGFibGUuaGVhZGVyLnZlcnNpb24gPSBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiArIDE7CisgICAgICAgIGxldCBwYWNrYWdlX3RhYmxlID0gdGFibGUuaW50b19ieXRlcygpOworICAgICAgICBsZXQgZXJyb3IgPQorICAgICAgICAgICAgZmluZF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV90YWJsZVsuLl0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIikKKyAgICAgICAgICAgICAgICAudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVycm9yKSwKKyAgICAgICAgICAgIGZvcm1hdCEoCisgICAgICAgICAgICAgICAgIkhpZ2hlclN0b3JhZ2VGaWxlVmVyc2lvbihDYW5ub3QgcmVhZCBzdG9yYWdlIGZpbGUgd2l0aCBhIGhpZ2hlciB2ZXJzaW9uIG9mIHt9IHdpdGggbGliIHZlcnNpb24ge30pIiwKKyAgICAgICAgICAgICAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiArIDEsCisgICAgICAgICAgICAgICAgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04KKyAgICAgICAgICAgICkKKyAgICAgICAgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0Fjb25maWdTdG9yYWdlUmVhZEFQSS5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9BY29uZmlnU3RvcmFnZVJlYWRBUEkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTBjMmI4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9BY29uZmlnU3RvcmFnZVJlYWRBUEkuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7CisKK2ltcG9ydCBkYWx2aWsuYW5ub3RhdGlvbi5vcHRpbWl6YXRpb24uRmFzdE5hdGl2ZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlT3JkZXI7CitpbXBvcnQgamF2YS5uaW8uTWFwcGVkQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKKworcHVibGljIGNsYXNzIEFjb25maWdTdG9yYWdlUmVhZEFQSSB7CisKKyAgICAvLyBTdG9yYWdlIGZpbGUgZGlyIG9uIGRldmljZQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9SQUdFRElSID0gIi9tZXRhZGF0YS9hY29uZmlnIjsKKworICAgIC8vIFN0b2FyZ2UgZmlsZSB0eXBlCisgICAgcHVibGljIGVudW0gU3RvcmFnZUZpbGVUeXBlIHsKKyAgICAgICAgUEFDS0FHRV9NQVAsCisgICAgICAgIEZMQUdfTUFQLAorICAgICAgICBGTEFHX1ZBTCwKKyAgICAgICAgRkxBR19JTkZPCisgICAgfQorCisgICAgLy8gTWFwIGEgc3RvcmFnZSBmaWxlIGdpdmVuIGZpbGUgcGF0aAorICAgIHB1YmxpYyBzdGF0aWMgTWFwcGVkQnl0ZUJ1ZmZlciBtYXBTdG9yYWdlRmlsZShTdHJpbmcgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICAgIEZpbGVDaGFubmVsIGNoYW5uZWwgPSBzdHJlYW0uZ2V0Q2hhbm5lbCgpOworICAgICAgICByZXR1cm4gY2hhbm5lbC5tYXAoRmlsZUNoYW5uZWwuTWFwTW9kZS5SRUFEX09OTFksIDAsIGNoYW5uZWwuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvLyBNYXAgYSBzdG9yYWdlIGZpbGUgZ2l2ZW4gY29udGFpbmVyIGFuZCBmaWxlIHR5cGUKKyAgICBwdWJsaWMgc3RhdGljIE1hcHBlZEJ5dGVCdWZmZXIgZ2V0TWFwcGVkRmlsZShTdHJpbmcgY29udGFpbmVyLCBTdG9yYWdlRmlsZVR5cGUgdHlwZSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBQQUNLQUdFX01BUDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFwU3RvcmFnZUZpbGUoU1RPUkFHRURJUiArICIvbWFwcy8iICsgY29udGFpbmVyICsgIi5wYWNrYWdlLm1hcCIpOworICAgICAgICAgICAgY2FzZSBGTEFHX01BUDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFwU3RvcmFnZUZpbGUoU1RPUkFHRURJUiArICIvbWFwcy8iICsgY29udGFpbmVyICsgIi5mbGFnLm1hcCIpOworICAgICAgICAgICAgY2FzZSBGTEFHX1ZBTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFwU3RvcmFnZUZpbGUoU1RPUkFHRURJUiArICIvYm9vdC8iICsgY29udGFpbmVyICsgIi52YWwiKTsKKyAgICAgICAgICAgIGNhc2UgRkxBR19JTkZPOgorICAgICAgICAgICAgICAgIHJldHVybiBtYXBTdG9yYWdlRmlsZShTVE9SQUdFRElSICsgIi9ib290LyIgKyBjb250YWluZXIgKyAiLmluZm8iKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJJbnZhbGlkIHN0b3JhZ2UgZmlsZSB0eXBlIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBKTkkgaW50ZXJmYWNlIHRvIGdldCBwYWNrYWdlIHJlYWQgY29udGV4dAorICAgIC8vIEBwYXJhbSBtYXBwZWRGaWxlOiBtZW1vcnkgbWFwcGVkIHBhY2thZ2UgbWFwIGZpbGUKKyAgICAvLyBAcGFyYW0gcGFja2FnZU5hbWU6IHBhY2thZ2UgbmFtZQorICAgIC8vIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIHBhc3NlZCBpbiBmaWxlIGlzIG5vdCBhIHZhbGlkIHBhY2thZ2UgbWFwIGZpbGUKKyAgICBARmFzdE5hdGl2ZQorICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBCeXRlQnVmZmVyIGdldFBhY2thZ2VSZWFkQ29udGV4dEltcGwoCisgICAgICAgICAgICBCeXRlQnVmZmVyIG1hcHBlZEZpbGUsIFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLy8gQVBJIHRvIGdldCBwYWNrYWdlIHJlYWQgY29udGV4dAorICAgIC8vIEBwYXJhbSBtYXBwZWRGaWxlOiBtZW1vcnkgbWFwcGVkIHBhY2thZ2UgbWFwIGZpbGUKKyAgICAvLyBAcGFyYW0gcGFja2FnZU5hbWU6IHBhY2thZ2UgbmFtZQorICAgIC8vIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIHBhc3NlZCBpbiBmaWxlIGlzIG5vdCBhIHZhbGlkIHBhY2thZ2UgbWFwIGZpbGUKKyAgICBwdWJsaWMgc3RhdGljIFBhY2thZ2VSZWFkQ29udGV4dCBnZXRQYWNrYWdlUmVhZENvbnRleHQoCisgICAgICAgICAgICBCeXRlQnVmZmVyIG1hcHBlZEZpbGUsIFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBnZXRQYWNrYWdlUmVhZENvbnRleHRJbXBsKG1hcHBlZEZpbGUsIHBhY2thZ2VOYW1lKTsKKyAgICAgICAgYnVmZmVyLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKKyAgICAgICAgcmV0dXJuIG5ldyBQYWNrYWdlUmVhZENvbnRleHQoYnVmZmVyLmdldEludCgpLCBidWZmZXIuZ2V0SW50KDQpKTsKKyAgICB9CisKKyAgICAvLyBKTkkgaW50ZXJmYWNlIHRvIGdldCBmbGFnIHJlYWQgY29udGV4dAorICAgIC8vIEBwYXJhbSBtYXBwZWRGaWxlOiBtZW1vcnkgbWFwcGVkIGZsYWcgbWFwIGZpbGUKKyAgICAvLyBAcGFyYW0gcGFja2FnZUlkOiBwYWNrYWdlIGlkIHRvIHJlcHJlc2VudCBhIHNwZWNpZmljIHBhY2thZ2UsIG9idGFpbmVkIGZyb20KKyAgICAvLyBwYWNrYWdlIG1hcCBmaWxlCisgICAgLy8gQHBhcmFtIGZsYWdOYW1lOiBmbGFnIG5hbWUKKyAgICAvLyBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBwYXNzZWQgaW4gZmlsZSBpcyBub3QgYSB2YWxpZCBmbGFnIG1hcCBmaWxlCisgICAgQEZhc3ROYXRpdmUKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgQnl0ZUJ1ZmZlciBnZXRGbGFnUmVhZENvbnRleHRJbXBsKAorICAgICAgICAgICAgQnl0ZUJ1ZmZlciBtYXBwZWRGaWxlLCBpbnQgcGFja2FnZUlkLCBTdHJpbmcgZmxhZ05hbWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8vIEFQSSB0byBnZXQgZmxhZyByZWFkIGNvbnRleHQKKyAgICAvLyBAcGFyYW0gbWFwcGVkRmlsZTogbWVtb3J5IG1hcHBlZCBmbGFnIG1hcCBmaWxlCisgICAgLy8gQHBhcmFtIHBhY2thZ2VJZDogcGFja2FnZSBpZCB0byByZXByZXNlbnQgYSBzcGVjaWZpYyBwYWNrYWdlLCBvYnRhaW5lZCBmcm9tCisgICAgLy8gcGFja2FnZSBtYXAgZmlsZQorICAgIC8vIEBwYXJhbSBmbGFnTmFtZTogZmxhZyBuYW1lCisgICAgLy8gQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgcGFzc2VkIGluIGZpbGUgaXMgbm90IGEgdmFsaWQgZmxhZyBtYXAgZmlsZQorICAgIHB1YmxpYyBzdGF0aWMgRmxhZ1JlYWRDb250ZXh0IGdldEZsYWdSZWFkQ29udGV4dCgKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgbWFwcGVkRmlsZSwgaW50IHBhY2thZ2VJZCwgU3RyaW5nIGZsYWdOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IGdldEZsYWdSZWFkQ29udGV4dEltcGwobWFwcGVkRmlsZSwgcGFja2FnZUlkLCBmbGFnTmFtZSk7CisgICAgICAgIGJ1ZmZlci5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTik7CisgICAgICAgIHJldHVybiBuZXcgRmxhZ1JlYWRDb250ZXh0KGJ1ZmZlci5nZXRJbnQoKSwgYnVmZmVyLmdldEludCg0KSk7CisgICAgfQorCisgICAgLy8gSk5JIGludGVyZmFjZSB0byBnZXQgYm9vbGVhbiBmbGFnIHZhbHVlCisgICAgLy8gQHBhcmFtIG1hcHBlZEZpbGU6IG1lbW9yeSBtYXBwZWQgZmxhZyB2YWx1ZSBmaWxlCisgICAgLy8gQHBhcmFtIGZsYWdJbmRleDogZmxhZyBnbG9iYWwgaW5kZXggaW4gdGhlIGZsYWcgdmFsdWUgYXJyYXkKKyAgICAvLyBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBwYXNzZWQgaW4gZmlsZSBpcyBub3QgYSB2YWxpZCBmbGFnIHZhbHVlIGZpbGUgb3IgdGhlCisgICAgLy8gZmxhZyBpbmRleCB3ZW50IG92ZXIgdGhlIGZpbGUgYm91bmRhcnkuCisgICAgQEZhc3ROYXRpdmUKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBib29sZWFuIGdldEJvb2xlYW5GbGFnVmFsdWUoQnl0ZUJ1ZmZlciBtYXBwZWRGaWxlLCBpbnQgZmxhZ0luZGV4KQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgQEZhc3ROYXRpdmUKKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBsb25nIGhhc2goU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICBzdGF0aWMgeworICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoImFjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9ydXN0X2puaSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvRmxhZ1JlYWRDb250ZXh0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZsYWdSZWFkQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNTU5YTkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZsYWdSZWFkQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7CisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcHVibGljIGNsYXNzIEZsYWdSZWFkQ29udGV4dCB7CisgICAgcHVibGljIFN0b3JlZEZsYWdUeXBlIG1GbGFnVHlwZTsKKyAgICBwdWJsaWMgaW50IG1GbGFnSW5kZXg7CisKKyAgICBwdWJsaWMgRmxhZ1JlYWRDb250ZXh0KGludCBmbGFnVHlwZSwKKyAgICAgICAgICAgIGludCBmbGFnSW5kZXgpIHsKKyAgICAgICAgbUZsYWdUeXBlID0gU3RvcmVkRmxhZ1R5cGUuZnJvbUludGVnZXIoZmxhZ1R5cGUpOworICAgICAgICBtRmxhZ0luZGV4ID0gZmxhZ0luZGV4OworICAgIH0KKworICAgIC8vIEZsYWcgdHlwZSBlbnVtLCBjb25zaXN0ZW50IHdpdGggdGhlIGRlZmluaXRpb24gaW4gYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL2xpYi5ycworICAgIHB1YmxpYyBlbnVtIFN0b3JlZEZsYWdUeXBlIHsKKyAgICAgICAgUmVhZFdyaXRlQm9vbGVhbiwKKyAgICAgICAgUmVhZE9ubHlCb29sZWFuLAorICAgICAgICBGaXhlZFJlYWRPbmx5Qm9vbGVhbjsKKworICAgICAgICBwdWJsaWMgc3RhdGljIFN0b3JlZEZsYWdUeXBlIGZyb21JbnRlZ2VyKGludCB4KSB7CisgICAgICAgICAgICBzd2l0Y2goeCkgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlYWRXcml0ZUJvb2xlYW47CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVhZE9ubHlCb29sZWFuOworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZpeGVkUmVhZE9ubHlCb29sZWFuOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9QYWNrYWdlUmVhZENvbnRleHQuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvUGFja2FnZVJlYWRDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc4MWQ5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvUGFja2FnZVJlYWRDb250ZXh0LmphdmEKQEAgLTAsMCArMSwyNyBAQAorcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZTsKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwdWJsaWMgY2xhc3MgUGFja2FnZVJlYWRDb250ZXh0IHsKKyAgICBwdWJsaWMgaW50IG1QYWNrYWdlSWQ7CisgICAgcHVibGljIGludCBtQm9vbGVhblN0YXJ0SW5kZXg7CisKKyAgICBwdWJsaWMgUGFja2FnZVJlYWRDb250ZXh0KGludCBwYWNrYWdlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYm9vbGVhblN0YXJ0SW5kZXgpIHsKKyAgICAgICAgbVBhY2thZ2VJZCA9IHBhY2thZ2VJZDsKKyAgICAgICAgbUJvb2xlYW5TdGFydEluZGV4ID0gYm9vbGVhblN0YXJ0SW5kZXg7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3Jjcy9hbmRyb2lkL29zL2ZsYWdnaW5nL1BsYXRmb3JtQWNvbmZpZ1BhY2thZ2UuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvYW5kcm9pZC9vcy9mbGFnZ2luZy9QbGF0Zm9ybUFjb25maWdQYWNrYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZiZTU2NwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvYW5kcm9pZC9vcy9mbGFnZ2luZy9QbGF0Zm9ybUFjb25maWdQYWNrYWdlLmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQub3MuZmxhZ2dpbmc7CisKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5BY29uZmlnU3RvcmFnZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GbGFnVGFibGU7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1ZhbHVlTGlzdDsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5QYWNrYWdlVGFibGU7CitpbXBvcnQgYW5kcm9pZC5jb21wYXQuYW5ub3RhdGlvbi5VbnN1cHBvcnRlZEFwcFVzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKK2ltcG9ydCBqYXZhLm5pby5NYXBwZWRCeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5TdGFuZGFyZE9wZW5PcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEFuIHtAY29kZSBhY29uZmlnfSBwYWNrYWdlIGNvbnRhaW5pbmcgdGhlIGVuYWJsZWQgc3RhdGUgb2YgaXRzIGZsYWdzLgorICoKKyAqIDxwPjxzdHJvbmc+Tm90ZTogdGhpcyBpcyBpbnRlbmRlZCBvbmx5IHRvIGJlIHVzZWQgYnkgZ2VuZXJhdGVkIGNvZGUuIFRvIGRldGVybWluZSBpZiBhIGdpdmVuIGZsYWcKKyAqIGlzIGVuYWJsZWQgaW4gYXBwIGNvZGUsIHRoZSBnZW5lcmF0ZWQgYW5kcm9pZCBmbGFncyBzaG91bGQgYmUgdXNlZC48L3N0cm9uZz4KKyAqCisgKiA8cD5UaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVhZCB0aGUgZmxhZyBmcm9tIHBsYXRmb3JtIEFjb25maWcgUGFja2FnZS5FYWNoIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MKKyAqIHdpbGwgY2FjaGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBvbmUgcGFja2FnZS4gVG8gcmVhZCBmbGFncyBmcm9tIGEgZGlmZmVyZW50IHBhY2thZ2UsIGEgbmV3CisgKiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHNob3VsZCBiZSB7QGxpbmsgI2xvYWQgbG9hZGVkfS4KKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgUGxhdGZvcm1BY29uZmlnUGFja2FnZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJQbGF0Zm9ybUFjb25maWdQYWNrYWdlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQX1BBVEggPSAiL21ldGFkYXRhL2Fjb25maWcvbWFwcy8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCT09UX1BBVEggPSAiL21ldGFkYXRhL2Fjb25maWcvYm9vdC8iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgUGFja2FnZVRhYmxlPiBzUGFja2FnZVRhYmxlQ2FjaGUgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICBwcml2YXRlIEZsYWdUYWJsZSBtRmxhZ1RhYmxlOworICAgIHByaXZhdGUgRmxhZ1ZhbHVlTGlzdCBtRmxhZ1ZhbHVlTGlzdDsKKworICAgIHByaXZhdGUgaW50IG1QYWNrYWdlQm9vbGVhblN0YXJ0T2Zmc2V0ID0gLTE7CisgICAgcHJpdmF0ZSBpbnQgbVBhY2thZ2VJZCA9IC0xOworCisgICAgcHJpdmF0ZSBQbGF0Zm9ybUFjb25maWdQYWNrYWdlKCkge30KKworICAgIC8qKiBAaGlkZSAqLworICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBQTEFURk9STV9QQUNLQUdFX01BUF9GSUxFUyA9CisgICAgICAgICAgICBTZXQub2YoInN5c3RlbS5wYWNrYWdlLm1hcCIsICJ2ZW5kb3IucGFja2FnZS5tYXAiLCAicHJvZHVjdC5wYWNrYWdlLm1hcCIpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgZm9yIChTdHJpbmcgcGYgOiBQTEFURk9STV9QQUNLQUdFX01BUF9GSUxFUykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBQYWNrYWdlVGFibGUgcFRhYmxlID0gUGFja2FnZVRhYmxlLmZyb21CeXRlcyhtYXBTdG9yYWdlRmlsZShNQVBfUEFUSCArIHBmKSk7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcGFja2FnZU5hbWUgOiBwVGFibGUuZ2V0UGFja2FnZUxpc3QoKSkgeworICAgICAgICAgICAgICAgICAgICBzUGFja2FnZVRhYmxlQ2FjaGUucHV0KHBhY2thZ2VOYW1lLCBwVGFibGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gcGFzcworICAgICAgICAgICAgICAgIExvZy53KFRBRywgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWRzIGEgcGxhdGZvcm0gQWNvbmZpZyBQYWNrYWdlIGZyb20gQWNvbmZpZyBTdG9yYWdlLgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgYXR0ZW1wdHMgdG8gbG9hZCB0aGUgc3BlY2lmaWVkIHBsYXRmb3JtIEFjb25maWcgcGFja2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSBUaGUgbmFtZSBvZiB0aGUgQWNvbmZpZyBwYWNrYWdlIHRvIGxvYWQuCisgICAgICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgUGxhdGZvcm1BY29uZmlnUGFja2FnZX0sIHdoaWNoIG1heSBiZSBlbXB0eSBpZiB0aGUgcGFja2FnZSBpcworICAgICAqICAgICBub3QgZm91bmQgaW4gdGhlIGNvbnRhaW5lci4gTnVsbCBpZiB0aGUgcGFja2FnZSBpcyBub3QgZm91bmQgaW4gcGxhdGZvcm0gcGFydGl0aW9ucy4KKyAgICAgKiBAdGhyb3dzIEFjb25maWdTdG9yYWdlUmVhZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciByZWFkaW5nIGZyb20gQWNvbmZpZyBTdG9yYWdlLCBzdWNoCisgICAgICogICAgIGFzIGlmIHRoZSBzdG9yYWdlIHN5c3RlbSBpcyBub3QgZm91bmQsIG9yIHRoZXJlIGlzIGFuIGVycm9yIHJlYWRpbmcgdGhlIHN0b3JhZ2UgZmlsZS4gVGhlCisgICAgICogICAgIHNwZWNpZmljIGVycm9yIGNvZGUgY2FuIGJlIGdvdCB1c2luZyB7QGxpbmsgQWNvbmZpZ1N0b3JhZ2VSZWFkRXhjZXB0aW9uI2dldEVycm9yQ29kZSgpfS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgcHVibGljIHN0YXRpYyBQbGF0Zm9ybUFjb25maWdQYWNrYWdlIGxvYWQoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQbGF0Zm9ybUFjb25maWdQYWNrYWdlIGFjb25maWdQYWNrYWdlID0gbmV3IFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2UoKTsKKyAgICAgICAgICAgIFBhY2thZ2VUYWJsZSBwVGFibGUgPSBzUGFja2FnZVRhYmxlQ2FjaGUuZ2V0KHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIGlmIChwVGFibGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUGFja2FnZVRhYmxlLk5vZGUgcE5vZGUgPSBwVGFibGUuZ2V0KHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIFN0cmluZyBjb250YWluZXIgPSBwVGFibGUuZ2V0SGVhZGVyKCkuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgICAgICBhY29uZmlnUGFja2FnZS5tRmxhZ1RhYmxlID0KKyAgICAgICAgICAgICAgICAgICAgRmxhZ1RhYmxlLmZyb21CeXRlcyhtYXBTdG9yYWdlRmlsZShNQVBfUEFUSCArIGNvbnRhaW5lciArICIuZmxhZy5tYXAiKSk7CisgICAgICAgICAgICBhY29uZmlnUGFja2FnZS5tRmxhZ1ZhbHVlTGlzdCA9CisgICAgICAgICAgICAgICAgICAgIEZsYWdWYWx1ZUxpc3QuZnJvbUJ5dGVzKG1hcFN0b3JhZ2VGaWxlKEJPT1RfUEFUSCArIGNvbnRhaW5lciArICIudmFsIikpOworICAgICAgICAgICAgYWNvbmZpZ1BhY2thZ2UubVBhY2thZ2VCb29sZWFuU3RhcnRPZmZzZXQgPSBwTm9kZS5nZXRCb29sZWFuU3RhcnRJbmRleCgpOworICAgICAgICAgICAgYWNvbmZpZ1BhY2thZ2UubVBhY2thZ2VJZCA9IHBOb2RlLmdldFBhY2thZ2VJZCgpOworICAgICAgICAgICAgcmV0dXJuIGFjb25maWdQYWNrYWdlOworICAgICAgICB9IGNhdGNoIChBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQWNvbmZpZ1N0b3JhZ2VSZWFkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBlLmdldEVycm9yQ29kZSgpLCAiRmFpbCB0byBjcmVhdGUgQWNvbmZpZ1BhY2thZ2UiLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBY29uZmlnU3RvcmFnZVJlYWRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIEFjb25maWdTdG9yYWdlUmVhZEV4Y2VwdGlvbi5FUlJPUl9HRU5FUklDLAorICAgICAgICAgICAgICAgICAgICAiRmFpbCB0byBjcmVhdGUgUGxhdGZvcm1BY29uZmlnUGFja2FnZSIsCisgICAgICAgICAgICAgICAgICAgIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBhIGJvb2xlYW4gZmxhZy4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIHJldHJpZXZlcyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmbGFnLiBJZiB0aGUgZmxhZyBleGlzdHMgd2l0aGluIHRoZQorICAgICAqIGxvYWRlZCBBY29uZmlnIFBhY2thZ2UsIGl0cyB2YWx1ZSBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlLCB0aGUgcHJvdmlkZWQgYGRlZmF1bHRWYWx1ZWAgaXMKKyAgICAgKiByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbGFnTmFtZSBUaGUgbmFtZSBvZiB0aGUgZmxhZyAoZXhjbHVkaW5nIGFueSBwYWNrYWdlIG5hbWUgcHJlZml4KS4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIGZsYWcgaXMgbm90IGZvdW5kLgorICAgICAqIEByZXR1cm4gVGhlIGJvb2xlYW4gdmFsdWUgb2YgdGhlIGZsYWcsIG9yIGBkZWZhdWx0VmFsdWVgIGlmIHRoZSBmbGFnIGlzIG5vdCBmb3VuZC4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbkZsYWdWYWx1ZShTdHJpbmcgZmxhZ05hbWUsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIEZsYWdUYWJsZS5Ob2RlIGZOb2RlID0gbUZsYWdUYWJsZS5nZXQobVBhY2thZ2VJZCwgZmxhZ05hbWUpOworICAgICAgICBpZiAoZk5vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUZsYWdWYWx1ZUxpc3QuZ2V0Qm9vbGVhbihmTm9kZS5nZXRGbGFnSW5kZXgoKSArIG1QYWNrYWdlQm9vbGVhblN0YXJ0T2Zmc2V0KTsKKyAgICB9CisKKyAgICAvLyBNYXAgYSBzdG9yYWdlIGZpbGUgZ2l2ZW4gZmlsZSBwYXRoCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwcGVkQnl0ZUJ1ZmZlciBtYXBTdG9yYWdlRmlsZShTdHJpbmcgZmlsZSkgeworICAgICAgICBGaWxlQ2hhbm5lbCBjaGFubmVsID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNoYW5uZWwgPSBGaWxlQ2hhbm5lbC5vcGVuKFBhdGhzLmdldChmaWxlKSwgU3RhbmRhcmRPcGVuT3B0aW9uLlJFQUQpOworICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWwubWFwKEZpbGVDaGFubmVsLk1hcE1vZGUuUkVBRF9PTkxZLCAwLCBjaGFubmVsLnNpemUoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQWNvbmZpZ1N0b3JhZ2VSZWFkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZVJlYWRFeGNlcHRpb24uRVJST1JfQ0FOTk9UX1JFQURfU1RPUkFHRV9GSUxFLAorICAgICAgICAgICAgICAgICAgICAiRmFpbCB0byBtbWFwIHN0b3JhZ2UiLAorICAgICAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHF1aWV0bHlEaXNwb3NlKGNoYW5uZWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBxdWlldGx5RGlzcG9zZShDbG9zZWFibGUgY2xvc2FibGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChjbG9zYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2xvc2FibGUuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gY2FyZSwgYXQgbGVhc3QgYXMgb2Ygbm93CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvb3MvZmxhZ2dpbmcvUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsLmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvb3MvZmxhZ2dpbmcvUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU0ZTY4YgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvYW5kcm9pZC9vcy9mbGFnZ2luZy9QbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5vcy5mbGFnZ2luZzsKKworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkFjb25maWdTdG9yYWdlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdWYWx1ZUxpc3Q7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuUGFja2FnZVRhYmxlOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlN0b3JhZ2VGaWxlUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5jb21wYXQuYW5ub3RhdGlvbi5VbnN1cHBvcnRlZEFwcFVzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuU3RyaWN0TW9kZTsKKworLyoqCisgKiBBbiB7QGNvZGUgYWNvbmZpZ30gcGFja2FnZSBjb250YWluaW5nIHRoZSBlbmFibGVkIHN0YXRlIG9mIGl0cyBmbGFncy4KKyAqCisgKiA8cD48c3Ryb25nPk5vdGU6IHRoaXMgaXMgaW50ZW5kZWQgb25seSB0byBiZSB1c2VkIGJ5IGdlbmVyYXRlZCBjb2RlLiBUbyBkZXRlcm1pbmUgaWYgYSBnaXZlbiBmbGFnCisgKiBpcyBlbmFibGVkIGluIGFwcCBjb2RlLCB0aGUgZ2VuZXJhdGVkIGFuZHJvaWQgZmxhZ3Mgc2hvdWxkIGJlIHVzZWQuPC9zdHJvbmc+CisgKgorICogPHA+VGhpcyBjbGFzcyBpcyBub3QgcGFydCBvZiB0aGUgcHVibGljIEFQSSBhbmQgc2hvdWxkIGJlIHVzZWQgYnkgQWNub2ZpZyBGbGFnIGludGVybmFsbHkgPC9iPiBJdAorICogaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5IGFuZCB3aWxsIGJlIGNoYW5nZWQgb3IgcmVtb3ZlZCB3aXRob3V0IG5vdGljZS4KKyAqCisgKiA8cD5UaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVhZCB0aGUgZmxhZyBmcm9tIEFjb25maWcgUGFja2FnZS5FYWNoIGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2lsbAorICogY2FjaGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBvbmUgcGFja2FnZS4gVG8gcmVhZCBmbGFncyBmcm9tIGEgZGlmZmVyZW50IHBhY2thZ2UsIGEgbmV3IGluc3RhbmNlCisgKiBvZiB0aGlzIGNsYXNzIHNob3VsZCBiZSB7QGxpbmsgI2xvYWQgbG9hZGVkfS4KKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsIHsKKworICAgIHByaXZhdGUgZmluYWwgRmxhZ1ZhbHVlTGlzdCBtRmxhZ1ZhbHVlTGlzdDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtUGFja2FnZUJvb2xlYW5TdGFydE9mZnNldDsKKworICAgIHByaXZhdGUgUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsKAorICAgICAgICAgICAgRmxhZ1ZhbHVlTGlzdCBmbGFnVmFsdWVMaXN0LCBpbnQgcGFja2FnZUJvb2xlYW5TdGFydE9mZnNldCkgeworICAgICAgICB0aGlzLm1GbGFnVmFsdWVMaXN0ID0gZmxhZ1ZhbHVlTGlzdDsKKyAgICAgICAgdGhpcy5tUGFja2FnZUJvb2xlYW5TdGFydE9mZnNldCA9IHBhY2thZ2VCb29sZWFuU3RhcnRPZmZzZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZHMgYW4gQWNvbmZpZyBwYWNrYWdlIGZyb20gdGhlIHNwZWNpZmllZCBjb250YWluZXIgYW5kIHZlcmlmaWVzIGl0cyBmaW5nZXJwcmludC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2Ugb25seSBhbmQgbWF5IGJlIGNoYW5nZWQgb3IgcmVtb3ZlZCB3aXRob3V0CisgICAgICogbm90aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgbmFtZSBvZiB0aGUgY29udGFpbmVyLgorICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSBUaGUgbmFtZSBvZiB0aGUgQWNvbmZpZyBwYWNrYWdlLgorICAgICAqIEBwYXJhbSBwYWNrYWdlRmluZ2VycHJpbnQgVGhlIGV4cGVjdGVkIGZpbmdlcnByaW50IG9mIHRoZSBwYWNrYWdlLgorICAgICAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbH0gcmVwcmVzZW50aW5nIHRoZSBsb2FkZWQKKyAgICAgKiAgICAgcGFja2FnZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgcHVibGljIHN0YXRpYyBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwgbG9hZCgKKyAgICAgICAgICAgIFN0cmluZyBjb250YWluZXIsIFN0cmluZyBwYWNrYWdlTmFtZSwgbG9uZyBwYWNrYWdlRmluZ2VycHJpbnQpIHsKKyAgICAgICAgcmV0dXJuIGxvYWQoCisgICAgICAgICAgICAgICAgY29udGFpbmVyLAorICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgIHBhY2thZ2VGaW5nZXJwcmludCwKKyAgICAgICAgICAgICAgICBTdG9yYWdlRmlsZVByb3ZpZGVyLmdldERlZmF1bHRQcm92aWRlcigpKTsKKyAgICB9CisKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbCBsb2FkKAorICAgICAgICAgICAgU3RyaW5nIGNvbnRhaW5lciwKKyAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgIGxvbmcgcGFja2FnZUZpbmdlcnByaW50LAorICAgICAgICAgICAgU3RvcmFnZUZpbGVQcm92aWRlciBmaWxlUHJvdmlkZXIpIHsKKyAgICAgICAgU3RyaWN0TW9kZS5UaHJlYWRQb2xpY3kgb2xkUG9saWN5ID0gU3RyaWN0TW9kZS5hbGxvd1RocmVhZERpc2tSZWFkcygpOworICAgICAgICBQYWNrYWdlVGFibGUuTm9kZSBwTm9kZSA9IG51bGw7CisgICAgICAgIEZsYWdWYWx1ZUxpc3Qgdkxpc3QgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcE5vZGUgPSBmaWxlUHJvdmlkZXIuZ2V0UGFja2FnZVRhYmxlKGNvbnRhaW5lcikuZ2V0KHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIHZMaXN0ID0gZmlsZVByb3ZpZGVyLmdldEZsYWdWYWx1ZUxpc3QoY29udGFpbmVyKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIFN0cmljdE1vZGUuc2V0VGhyZWFkUG9saWN5KG9sZFBvbGljeSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocE5vZGUgPT0gbnVsbCB8fCB2TGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIEFjb25maWdTdG9yYWdlRXhjZXB0aW9uLkVSUk9SX1BBQ0tBR0VfTk9UX0ZPVU5ELAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGFja2FnZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpbiBjb250YWluZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb250YWluZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBjYW5ub3QgYmUgZm91bmQgb24gdGhlIGRldmljZSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwTm9kZS5oYXNQYWNrYWdlRmluZ2VycHJpbnQoKSAmJiBwYWNrYWdlRmluZ2VycHJpbnQgIT0gcE5vZGUuZ2V0UGFja2FnZUZpbmdlcnByaW50KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24uRVJST1JfRklMRV9GSU5HRVJQUklOVF9NSVNNQVRDSCwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBhY2thZ2VOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaW4gY29udGFpbmVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29udGFpbmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgY2Fubm90IGJlIGZvdW5kIG9uIHRoZSBkZXZpY2UiKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbCh2TGlzdCwgcE5vZGUuZ2V0Qm9vbGVhblN0YXJ0SW5kZXgoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBhIGJvb2xlYW4gZmxhZyB1c2luZyBpdHMgaW5kZXguCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkgYW5kIG1heSBiZSBjaGFuZ2VkIG9yIHJlbW92ZWQgd2l0aG91dAorICAgICAqIG5vdGljZS4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIHJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSBmbGFnIHdpdGhpbiB0aGUgbG9hZGVkIEFjb25maWcgcGFja2FnZSB1c2luZyBpdHMKKyAgICAgKiBpbmRleC4gVGhlIGluZGV4IGlzIGdlbmVyYXRlZCBhdCBidWlsZCB0aW1lIGFuZCBtYXkgdmFyeSBiZXR3ZWVuIGJ1aWxkcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGZsYWcgd2l0aGluIHRoZSBwYWNrYWdlLgorICAgICAqIEByZXR1cm4gVGhlIGJvb2xlYW4gdmFsdWUgb2YgdGhlIGZsYWcuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5GbGFnVmFsdWUoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBtRmxhZ1ZhbHVlTGlzdC5nZXRCb29sZWFuKGluZGV4ICsgbVBhY2thZ2VCb29sZWFuU3RhcnRPZmZzZXQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvbGliLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3Jjcy9saWIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVmMTJiYgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvbGliLnJzCkBAIC0wLDAgKzEsMTg5IEBACisvLyEgYWNvbmZpZyBzdG9yYWdlIHJlYWQgYXBpIGphdmEgcnVzdCBpbnRlcmxvcAorCit1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OlNpcEhhc2hlcjEzOwordXNlIGFjb25maWdfc3RvcmFnZV9yZWFkX2FwaTo6ZmxhZ190YWJsZV9xdWVyeTo6ZmluZF9mbGFnX3JlYWRfY29udGV4dDsKK3VzZSBhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGk6OmZsYWdfdmFsdWVfcXVlcnk6OmZpbmRfYm9vbGVhbl9mbGFnX3ZhbHVlOwordXNlIGFjb25maWdfc3RvcmFnZV9yZWFkX2FwaTo6cGFja2FnZV90YWJsZV9xdWVyeTo6ZmluZF9wYWNrYWdlX3JlYWRfY29udGV4dDsKK3VzZSBhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGk6OntGbGFnUmVhZENvbnRleHQsIFBhY2thZ2VSZWFkQ29udGV4dH07CisKK3VzZSBhbnlob3c6OlJlc3VsdDsKK3VzZSBqbmk6Om9iamVjdHM6OntKQnl0ZUJ1ZmZlciwgSkNsYXNzLCBKU3RyaW5nfTsKK3VzZSBqbmk6OnN5czo6e2pib29sZWFuLCBqaW50LCBqbG9uZ307Cit1c2Ugam5pOjpKTklFbnY7Cit1c2Ugc3RkOjpoYXNoOjpIYXNoZXI7CisKKy8vLyBDYWxsIHJ1c3QgZmluZCBwYWNrYWdlIHJlYWQgY29udGV4dAorZm4gZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0X2phdmEoCisgICAgZW52OiAmbXV0IEpOSUVudiwKKyAgICBmaWxlOiBKQnl0ZUJ1ZmZlciwKKyAgICBwYWNrYWdlOiBKU3RyaW5nLAorKSAtPiBSZXN1bHQ8T3B0aW9uPFBhY2thZ2VSZWFkQ29udGV4dD4+IHsKKyAgICAvLyBTQUZFVFk6CisgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgdGhlIHBhY2thZ2UgbmFtZSBpcyBndWFyYW50ZWVkIHRvIGJlIGEgamF2YSBzdHJpbmcKKyAgICBsZXQgcGFja2FnZV9uYW1lOiBTdHJpbmcgPSB1bnNhZmUgeyBlbnYuZ2V0X3N0cmluZ191bmNoZWNrZWQoJnBhY2thZ2UpPy5pbnRvKCkgfTsKKyAgICBsZXQgYnVmZmVyX3B0ciA9IGVudi5nZXRfZGlyZWN0X2J1ZmZlcl9hZGRyZXNzKCZmaWxlKT87CisgICAgbGV0IGJ1ZmZlcl9zaXplID0gZW52LmdldF9kaXJlY3RfYnVmZmVyX2NhcGFjaXR5KCZmaWxlKT87CisgICAgLy8gU0FGRVRZOgorICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBlbnN1cmVkIGFzIG9ubHkgbm9uIG51bGwgTWVtb3J5TWFwcGVkQnVmZmVyIHdpbGwgYmUgcGFzc2VkIGluLAorICAgIC8vIHNvIHRoZSBjb252ZXJzaW9uIHRvIHNsaWNlIGlzIGd1YXJhbnRlZWQgdG8gYmUgdmFsaWQKKyAgICBsZXQgYnVmZmVyID0gdW5zYWZlIHsgc3RkOjpzbGljZTo6ZnJvbV9yYXdfcGFydHMoYnVmZmVyX3B0ciwgYnVmZmVyX3NpemUpIH07CisgICAgT2soZmluZF9wYWNrYWdlX3JlYWRfY29udGV4dChidWZmZXIsICZwYWNrYWdlX25hbWUpPykKK30KKworLy8vIEdldCBwYWNrYWdlIHJlYWQgY29udGV4dCBKTkkKKyNbbm9fbWFuZ2xlXQorI1thbGxvdyh1bnVzZWQpXQorcHViIGV4dGVybiAic3lzdGVtIiBmbiBKYXZhX2FuZHJvaWRfYWNvbmZpZ19zdG9yYWdlX0Fjb25maWdTdG9yYWdlUmVhZEFQSV9nZXRQYWNrYWdlUmVhZENvbnRleHRJbXBsPAorICAgICdsb2NhbCwKKz4oCisgICAgbXV0IGVudjogSk5JRW52PCdsb2NhbD4sCisgICAgY2xhc3M6IEpDbGFzczwnbG9jYWw+LAorICAgIGZpbGU6IEpCeXRlQnVmZmVyPCdsb2NhbD4sCisgICAgcGFja2FnZTogSlN0cmluZzwnbG9jYWw+LAorKSAtPiBKQnl0ZUJ1ZmZlcjwnbG9jYWw+IHsKKyAgICBsZXQgbXV0IHBhY2thZ2VfaWQgPSAtMTsKKyAgICBsZXQgbXV0IGJvb2xlYW5fc3RhcnRfaW5kZXggPSAtMTsKKworICAgIG1hdGNoIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dF9qYXZhKCZtdXQgZW52LCBmaWxlLCBwYWNrYWdlKSB7CisgICAgICAgIE9rKGNvbnRleHRfb3B0KSA9PiB7CisgICAgICAgICAgICBpZiBsZXQgU29tZShjb250ZXh0KSA9IGNvbnRleHRfb3B0IHsKKyAgICAgICAgICAgICAgICBwYWNrYWdlX2lkID0gY29udGV4dC5wYWNrYWdlX2lkIGFzIGkzMjsKKyAgICAgICAgICAgICAgICBib29sZWFuX3N0YXJ0X2luZGV4ID0gY29udGV4dC5ib29sZWFuX3N0YXJ0X2luZGV4IGFzIGkzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBFcnIoZXJybXNnKSA9PiB7CisgICAgICAgICAgICBlbnYudGhyb3coKCJqYXZhL2lvL0lPRXhjZXB0aW9uIiwgZXJybXNnLnRvX3N0cmluZygpKSkuZXhwZWN0KCJmYWlsZWQgdG8gdGhyb3ciKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGxldCBtdXQgYnl0ZXMgPSBWZWM6Om5ldygpOworICAgIGJ5dGVzLmV4dGVuZF9mcm9tX3NsaWNlKCZwYWNrYWdlX2lkLnRvX2xlX2J5dGVzKCkpOworICAgIGJ5dGVzLmV4dGVuZF9mcm9tX3NsaWNlKCZib29sZWFuX3N0YXJ0X2luZGV4LnRvX2xlX2J5dGVzKCkpOworICAgIGxldCAoYWRkciwgbGVuKSA9IHsKKyAgICAgICAgbGV0IGJ1ZiA9IGJ5dGVzLmxlYWsoKTsKKyAgICAgICAgKGJ1Zi5hc19tdXRfcHRyKCksIGJ1Zi5sZW4oKSkKKyAgICB9OworICAgIC8vIFNBRkVUWToKKyAgICAvLyBUaGUgc2FmZXR5IGhlcmUgaXMgZW5zdXJlZCBhcyB0aGUgY29udGVudCBpcyBlbnN1cmVkIHRvIGJlIHZhbGlkCisgICAgdW5zYWZlIHsgZW52Lm5ld19kaXJlY3RfYnl0ZV9idWZmZXIoYWRkciwgbGVuKS5leHBlY3QoImZhaWxlZCB0byBjcmVhdGUgYnl0ZSBidWZmZXIiKSB9Cit9CisKKy8vLyBDYWxsIHJ1c3QgZmluZCBmbGFnIHJlYWQgY29udGV4dAorZm4gZ2V0X2ZsYWdfcmVhZF9jb250ZXh0X2phdmEoCisgICAgZW52OiAmbXV0IEpOSUVudiwKKyAgICBmaWxlOiBKQnl0ZUJ1ZmZlciwKKyAgICBwYWNrYWdlX2lkOiBqaW50LAorICAgIGZsYWc6IEpTdHJpbmcsCispIC0+IFJlc3VsdDxPcHRpb248RmxhZ1JlYWRDb250ZXh0Pj4geworICAgIC8vIFNBRkVUWToKKyAgICAvLyBUaGUgc2FmZXR5IGhlcmUgaXMgZW5zdXJlZCBhcyB0aGUgZmxhZyBuYW1lIGlzIGd1YXJhbnRlZWQgdG8gYmUgYSBqYXZhIHN0cmluZworICAgIGxldCBmbGFnX25hbWU6IFN0cmluZyA9IHVuc2FmZSB7IGVudi5nZXRfc3RyaW5nX3VuY2hlY2tlZCgmZmxhZyk/LmludG8oKSB9OworICAgIGxldCBidWZmZXJfcHRyID0gZW52LmdldF9kaXJlY3RfYnVmZmVyX2FkZHJlc3MoJmZpbGUpPzsKKyAgICBsZXQgYnVmZmVyX3NpemUgPSBlbnYuZ2V0X2RpcmVjdF9idWZmZXJfY2FwYWNpdHkoJmZpbGUpPzsKKyAgICAvLyBTQUZFVFk6CisgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgb25seSBub24gbnVsbCBNZW1vcnlNYXBwZWRCdWZmZXIgd2lsbCBiZSBwYXNzZWQgaW4sCisgICAgLy8gc28gdGhlIGNvbnZlcnNpb24gdG8gc2xpY2UgaXMgZ3VhcmFudGVlZCB0byBiZSB2YWxpZAorICAgIGxldCBidWZmZXIgPSB1bnNhZmUgeyBzdGQ6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cyhidWZmZXJfcHRyLCBidWZmZXJfc2l6ZSkgfTsKKyAgICBPayhmaW5kX2ZsYWdfcmVhZF9jb250ZXh0KGJ1ZmZlciwgcGFja2FnZV9pZCBhcyB1MzIsICZmbGFnX25hbWUpPykKK30KKworLy8vIEdldCBmbGFnIHJlYWQgY29udGV4dCBKTkkKKyNbbm9fbWFuZ2xlXQorI1thbGxvdyh1bnVzZWQpXQorcHViIGV4dGVybiAic3lzdGVtIiBmbiBKYXZhX2FuZHJvaWRfYWNvbmZpZ19zdG9yYWdlX0Fjb25maWdTdG9yYWdlUmVhZEFQSV9nZXRGbGFnUmVhZENvbnRleHRJbXBsPAorICAgICdsb2NhbCwKKz4oCisgICAgbXV0IGVudjogSk5JRW52PCdsb2NhbD4sCisgICAgY2xhc3M6IEpDbGFzczwnbG9jYWw+LAorICAgIGZpbGU6IEpCeXRlQnVmZmVyPCdsb2NhbD4sCisgICAgcGFja2FnZV9pZDogamludCwKKyAgICBmbGFnOiBKU3RyaW5nPCdsb2NhbD4sCispIC0+IEpCeXRlQnVmZmVyPCdsb2NhbD4geworICAgIGxldCBtdXQgZmxhZ190eXBlID0gLTE7CisgICAgbGV0IG11dCBmbGFnX2luZGV4ID0gLTE7CisKKyAgICBtYXRjaCBnZXRfZmxhZ19yZWFkX2NvbnRleHRfamF2YSgmbXV0IGVudiwgZmlsZSwgcGFja2FnZV9pZCwgZmxhZykgeworICAgICAgICBPayhjb250ZXh0X29wdCkgPT4geworICAgICAgICAgICAgaWYgbGV0IFNvbWUoY29udGV4dCkgPSBjb250ZXh0X29wdCB7CisgICAgICAgICAgICAgICAgZmxhZ190eXBlID0gY29udGV4dC5mbGFnX3R5cGUgYXMgaTMyOworICAgICAgICAgICAgICAgIGZsYWdfaW5kZXggPSBjb250ZXh0LmZsYWdfaW5kZXggYXMgaTMyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEVycihlcnJtc2cpID0+IHsKKyAgICAgICAgICAgIGVudi50aHJvdygoImphdmEvaW8vSU9FeGNlcHRpb24iLCBlcnJtc2cudG9fc3RyaW5nKCkpKS5leHBlY3QoImZhaWxlZCB0byB0aHJvdyIpOworICAgICAgICB9CisgICAgfQorCisgICAgbGV0IG11dCBieXRlcyA9IFZlYzo6bmV3KCk7CisgICAgYnl0ZXMuZXh0ZW5kX2Zyb21fc2xpY2UoJmZsYWdfdHlwZS50b19sZV9ieXRlcygpKTsKKyAgICBieXRlcy5leHRlbmRfZnJvbV9zbGljZSgmZmxhZ19pbmRleC50b19sZV9ieXRlcygpKTsKKyAgICBsZXQgKGFkZHIsIGxlbikgPSB7CisgICAgICAgIGxldCBidWYgPSBieXRlcy5sZWFrKCk7CisgICAgICAgIChidWYuYXNfbXV0X3B0cigpLCBidWYubGVuKCkpCisgICAgfTsKKyAgICAvLyBTQUZFVFk6CisgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgdGhlIGNvbnRlbnQgaXMgZW5zdXJlZCB0byBiZSB2YWxpZAorICAgIHVuc2FmZSB7IGVudi5uZXdfZGlyZWN0X2J5dGVfYnVmZmVyKGFkZHIsIGxlbikuZXhwZWN0KCJmYWlsZWQgdG8gY3JlYXRlIGJ5dGUgYnVmZmVyIikgfQorfQorCisvLy8gQ2FsbCBydXN0IGZpbmQgYm9vbGVhbiBmbGFnIHZhbHVlCitmbiBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlX2phdmEoCisgICAgZW52OiAmbXV0IEpOSUVudiwKKyAgICBmaWxlOiBKQnl0ZUJ1ZmZlciwKKyAgICBmbGFnX2luZGV4OiBqaW50LAorKSAtPiBSZXN1bHQ8Ym9vbD4geworICAgIGxldCBidWZmZXJfcHRyID0gZW52LmdldF9kaXJlY3RfYnVmZmVyX2FkZHJlc3MoJmZpbGUpPzsKKyAgICBsZXQgYnVmZmVyX3NpemUgPSBlbnYuZ2V0X2RpcmVjdF9idWZmZXJfY2FwYWNpdHkoJmZpbGUpPzsKKyAgICAvLyBTQUZFVFk6CisgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgb25seSBub24gbnVsbCBNZW1vcnlNYXBwZWRCdWZmZXIgd2lsbCBiZSBwYXNzZWQgaW4sCisgICAgLy8gc28gdGhlIGNvbnZlcnNpb24gdG8gc2xpY2UgaXMgZ3VhcmFudGVlZCB0byBiZSB2YWxpZAorICAgIGxldCBidWZmZXIgPSB1bnNhZmUgeyBzdGQ6OnNsaWNlOjpmcm9tX3Jhd19wYXJ0cyhidWZmZXJfcHRyLCBidWZmZXJfc2l6ZSkgfTsKKyAgICBPayhmaW5kX2Jvb2xlYW5fZmxhZ192YWx1ZShidWZmZXIsIGZsYWdfaW5kZXggYXMgdTMyKT8pCit9CisKKy8vLyBHZXQgZmxhZyB2YWx1ZSBKTkkKKyNbbm9fbWFuZ2xlXQorI1thbGxvdyh1bnVzZWQpXQorcHViIGV4dGVybiAic3lzdGVtIiBmbiBKYXZhX2FuZHJvaWRfYWNvbmZpZ19zdG9yYWdlX0Fjb25maWdTdG9yYWdlUmVhZEFQSV9nZXRCb29sZWFuRmxhZ1ZhbHVlPAorICAgICdsb2NhbCwKKz4oCisgICAgbXV0IGVudjogSk5JRW52PCdsb2NhbD4sCisgICAgY2xhc3M6IEpDbGFzczwnbG9jYWw+LAorICAgIGZpbGU6IEpCeXRlQnVmZmVyPCdsb2NhbD4sCisgICAgZmxhZ19pbmRleDogamludCwKKykgLT4gamJvb2xlYW4geworICAgIG1hdGNoIGdldF9ib29sZWFuX2ZsYWdfdmFsdWVfamF2YSgmbXV0IGVudiwgZmlsZSwgZmxhZ19pbmRleCkgeworICAgICAgICBPayh2YWx1ZSkgPT4gdmFsdWUgYXMgdTgsCisgICAgICAgIEVycihlcnJtc2cpID0+IHsKKyAgICAgICAgICAgIGVudi50aHJvdygoImphdmEvaW8vSU9FeGNlcHRpb24iLCBlcnJtc2cudG9fc3RyaW5nKCkpKS5leHBlY3QoImZhaWxlZCB0byB0aHJvdyIpOworICAgICAgICAgICAgMHU4CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBHZXQgZmxhZyB2YWx1ZSBKTkkKKyNbbm9fbWFuZ2xlXQorI1thbGxvdyh1bnVzZWQpXQorcHViIGV4dGVybiAic3lzdGVtIiBmbiBKYXZhX2FuZHJvaWRfYWNvbmZpZ19zdG9yYWdlX0Fjb25maWdTdG9yYWdlUmVhZEFQSV9oYXNoPCdsb2NhbD4oCisgICAgbXV0IGVudjogSk5JRW52PCdsb2NhbD4sCisgICAgY2xhc3M6IEpDbGFzczwnbG9jYWw+LAorICAgIHBhY2thZ2VfbmFtZTogSlN0cmluZzwnbG9jYWw+LAorKSAtPiBqbG9uZyB7CisgICAgbWF0Y2ggc2lwaGFzaGVyMTNfaGFzaCgmbXV0IGVudiwgcGFja2FnZV9uYW1lKSB7CisgICAgICAgIE9rKHZhbHVlKSA9PiB2YWx1ZSBhcyBqbG9uZywKKyAgICAgICAgRXJyKGVycm1zZykgPT4geworICAgICAgICAgICAgZW52LnRocm93KCgiamF2YS9pby9JT0V4Y2VwdGlvbiIsIGVycm1zZy50b19zdHJpbmcoKSkpLmV4cGVjdCgiZmFpbGVkIHRvIHRocm93Iik7CisgICAgICAgICAgICAwaTY0CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ZuIHNpcGhhc2hlcjEzX2hhc2goZW52OiAmbXV0IEpOSUVudiwgcGFja2FnZV9uYW1lOiBKU3RyaW5nKSAtPiBSZXN1bHQ8dTY0PiB7CisgICAgLy8gU0FGRVRZOgorICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBlbnN1cmVkIGFzIHRoZSBmbGFnIG5hbWUgaXMgZ3VhcmFudGVlZCB0byBiZSBhIGphdmEgc3RyaW5nCisgICAgbGV0IGZsYWdfbmFtZTogU3RyaW5nID0gdW5zYWZlIHsgZW52LmdldF9zdHJpbmdfdW5jaGVja2VkKCZwYWNrYWdlX25hbWUpPy5pbnRvKCkgfTsKKyAgICBsZXQgbXV0IHMgPSBTaXBIYXNoZXIxMzo6bmV3KCk7CisgICAgcy53cml0ZShmbGFnX25hbWUuYXNfYnl0ZXMoKSk7CisgICAgcy53cml0ZV91OCgweGZmKTsKKyAgICBPayhzLmZpbmlzaCgpKQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvQWNvbmZpZ1N0b3JhZ2VSZWFkRnVuY3Rpb25hbFRlc3QueG1sIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvQWNvbmZpZ1N0b3JhZ2VSZWFkRnVuY3Rpb25hbFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNTAwNjAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9BY29uZmlnU3RvcmFnZVJlYWRGdW5jdGlvbmFsVGVzdC54bWwKQEAgLTAsMCArMSw1MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgYWNvbmZpZyBzdG9yYWdlIHJlYWQgamF2YSBhcGkgdGVzdHMiPgorICAgIDwhLS0gTmVlZCByb290IHRvIHN0YXJ0IHZpcnR1YWxpemF0aW9uc2VydmljZSAtLT4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlJvb3RUYXJnZXRQcmVwYXJlciIvPgorCisgICAgPCEtLSBQcmVwYXJlIHRlc3QgZGlyZWN0b3JpZXMuIC0tPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUnVuQ29tbWFuZFRhcmdldFByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0aHJvdy1pZi1jbWQtZmFpbCIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVuLWNvbW1hbmQiIHZhbHVlPSJta2RpciAtcCAvZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19qYXZhX2FwaSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZWFyZG93bi1jb21tYW5kIiB2YWx1ZT0icm0gLXJmIC9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX2phdmFfYXBpIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5UZXN0QXBwSW5zdGFsbFNldHVwIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9ImFjb25maWdfc3RvcmFnZV9yZWFkX2Z1bmN0aW9uYWwuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5EaXNhYmxlU0VMaW51eFRhcmdldFByZXBhcmVyIiAvPgorCisgICAgPCEtLSBUZXN0IGRhdGEgZmlsZXMgLS0+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJhYm9ydC1vbi1wdXNoLWZhaWx1cmUiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIga2V5PSJwYWNrYWdlX3YxLm1hcCIKKyAgICAgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfamF2YV9hcGlfdGVzdC9tYXBzL21vY2t1cC5wYWNrYWdlLm1hcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiIGtleT0iZmxhZ192MS5tYXAiCisgICAgICAgICAgICAgICAgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX2phdmFfYXBpX3Rlc3QvbWFwcy9tb2NrdXAuZmxhZy5tYXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIiBrZXk9ImZsYWdfdjEudmFsIgorICAgICAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19qYXZhX2FwaV90ZXN0L2Jvb3QvbW9ja3VwLnZhbCIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVubmVyIiB2YWx1ZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bnRpbWUtaGludCIgdmFsdWU9IjFtIiAvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9BY29uZmlnU3RvcmFnZVJlYWRVbml0VGVzdC54bWwgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9BY29uZmlnU3RvcmFnZVJlYWRVbml0VGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUyOGRkNQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL0Fjb25maWdTdG9yYWdlUmVhZFVuaXRUZXN0LnhtbApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICB+IENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgIH4KKyAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIH4KKyAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICB+CisgIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAtLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IGFjb25maWcgc3RvcmFnZSBqYXZhIHRlc3RzIj4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iYWNvbmZpZ19zdG9yYWdlX3JlYWRfdW5pdC5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5GaWxlUHVzaGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0icGFja2FnZV92Mi5tYXAtPi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX3N0b3JhZ2VfcmVhZF91bml0L3Rlc3RkYXRhL21vY2t1cC5wYWNrYWdlLm1hcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iZmxhZ192Mi5tYXAtPi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX3N0b3JhZ2VfcmVhZF91bml0L3Rlc3RkYXRhL21vY2t1cC5mbGFnLm1hcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iZmxhZ192Mi52YWwtPi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX3N0b3JhZ2VfcmVhZF91bml0L3Rlc3RkYXRhL21vY2t1cC52YWwiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9ImZsYWdfdjIuaW5mby0+L2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfc3RvcmFnZV9yZWFkX3VuaXQvdGVzdGRhdGEvbW9ja3VwLmluZm8iIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icG9zdC1wdXNoIiB2YWx1ZT0iY2htb2QgK3IgL2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfc3RvcmFnZV9yZWFkX3VuaXQvdGVzdGRhdGEvIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMW0iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvQW5kcm9pZC5icCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAyMzI1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw5OSBAQAorZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAicmVhZF9hcGlfdGVzdF9zdG9yYWdlX2ZpbGVzIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJkYXRhL3YxL3BhY2thZ2VfdjEubWFwIiwKKyAgICAgICAgImRhdGEvdjEvZmxhZ192MS5tYXAiLAorICAgICAgICAiZGF0YS92MS9mbGFnX3YxLnZhbCIsCisgICAgICAgICJkYXRhL3YxL2ZsYWdfdjEuaW5mbyIsCisgICAgICAgICJkYXRhL3YyL3BhY2thZ2VfdjIubWFwIiwKKyAgICAgICAgImRhdGEvdjIvZmxhZ192Mi5tYXAiLAorICAgICAgICAiZGF0YS92Mi9mbGFnX3YyLnZhbCIsCisgICAgICAgICJkYXRhL3YyL2ZsYWdfdjIuaW5mbyIsCisgICAgXSwKK30KKworcnVzdF90ZXN0IHsKKyAgICBuYW1lOiAiYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpLnRlc3QucnVzdCIsCisgICAgc3JjczogWworICAgICAgICAic3RvcmFnZV9yZWFkX2FwaV90ZXN0LnJzIiwKKyAgICBdLAorICAgIHJ1c3RsaWJzOiBbCisgICAgICAgICJsaWJhbnlob3ciLAorICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX2ZpbGUiLAorICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpIiwKKyAgICAgICAgImxpYnJhbmQiLAorICAgIF0sCisgICAgZGF0YTogWworICAgICAgICAiOnJlYWRfYXBpX3Rlc3Rfc3RvcmFnZV9maWxlcyIsCisgICAgXSwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkudGVzdC5jcHAiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInN0b3JhZ2VfcmVhZF9hcGlfdGVzdC5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmdtb2NrIiwKKyAgICAgICAgImxpYmFjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9jYyIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKyAgICBkYXRhOiBbCisgICAgICAgICI6cmVhZF9hcGlfdGVzdF9zdG9yYWdlX2ZpbGVzIiwKKyAgICBdLAorICAgIHRlc3Rfc3VpdGVzOiBbCisgICAgICAgICJkZXZpY2UtdGVzdHMiLAorICAgICAgICAiZ2VuZXJhbC10ZXN0cyIsCisgICAgXSwKK30KKworYW5kcm9pZF90ZXN0IHsKKyAgICBuYW1lOiAiYWNvbmZpZ19zdG9yYWdlX3JlYWRfZnVuY3Rpb25hbCIsCisgICAgc3JjczogWworICAgICAgICAiZnVuY3Rpb25hbC9zcmNzLyoqLyouamF2YSIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYWNvbmZpZ19kZXZpY2VfcGF0aHNfamF2YSIsCisgICAgICAgICJhY29uZmlnX3N0b3JhZ2VfZmlsZV9qYXZhIiwKKyAgICAgICAgImFuZHJvaWR4LnRlc3QucnVsZXMiLAorICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX2phdmEiLAorICAgICAgICAianVuaXQiLAorICAgIF0sCisgICAgam5pX2xpYnM6IFsKKyAgICAgICAgImxpYmFjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9ydXN0X2puaSIsCisgICAgXSwKKyAgICBkYXRhOiBbCisgICAgICAgICI6cmVhZF9hcGlfdGVzdF9zdG9yYWdlX2ZpbGVzIiwKKyAgICBdLAorICAgIHBsYXRmb3JtX2FwaXM6IHRydWUsCisgICAgY2VydGlmaWNhdGU6ICJwbGF0Zm9ybSIsCisgICAgdGVzdF9zdWl0ZXM6IFsKKyAgICAgICAgImdlbmVyYWwtdGVzdHMiLAorICAgIF0sCisgICAgdGVzdF9jb25maWc6ICJBY29uZmlnU3RvcmFnZVJlYWRGdW5jdGlvbmFsVGVzdC54bWwiLAorICAgIHRlYW06ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX2NvcmVfZXhwZXJpbWVudHMiLAorfQorCithbmRyb2lkX3Rlc3QgeworICAgIG5hbWU6ICJhY29uZmlnX3N0b3JhZ2VfcmVhZF91bml0IiwKKyAgICB0ZWFtOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9jb3JlX2V4cGVyaW1lbnRzIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJ1bml0L3NyY3MvKiovKi5qYXZhIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkeC50ZXN0LnJ1bm5lciIsCisgICAgICAgICJqdW5pdCIsCisgICAgICAgICJhY29uZmlnX3N0b3JhZ2VfcmVhZGVyX2phdmEiLAorICAgIF0sCisgICAgc2RrX3ZlcnNpb246ICJ0ZXN0X2N1cnJlbnQiLAorICAgIGRhdGE6IFsKKyAgICAgICAgIjpyZWFkX2FwaV90ZXN0X3N0b3JhZ2VfZmlsZXMiLAorICAgIF0sCisgICAgdGVzdF9zdWl0ZXM6IFsKKyAgICAgICAgImdlbmVyYWwtdGVzdHMiLAorICAgIF0sCisgICAgdGVzdF9jb25maWc6ICJBY29uZmlnU3RvcmFnZVJlYWRVbml0VGVzdC54bWwiLAorICAgIGphcmphcl9ydWxlczogImphcmphci50eHQiLAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUwMTg3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgfiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICB+CisgIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICB+CisgIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgfgorICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdCI+CisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdCIgLz4KKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2RhdGEvdjEvZmxhZ192MS5pbmZvIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZGF0YS92MS9mbGFnX3YxLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIyM2VkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2RhdGEvdjEvZmxhZ192MS5pbmZvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2RhdGEvdjEvZmxhZ192MS5tYXAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NjhmNTMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEubWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2RhdGEvdjEvZmxhZ192MS52YWwgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEudmFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMjAzZDQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEudmFsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2RhdGEvdjEvcGFja2FnZV92MS5tYXAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9kYXRhL3YxL3BhY2thZ2VfdjEubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNDZhMDMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9kYXRhL3YxL3BhY2thZ2VfdjEubWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2RhdGEvdjIvZmxhZ192Mi5pbmZvIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZGF0YS92Mi9mbGFnX3YyLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiN2ZkZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2RhdGEvdjIvZmxhZ192Mi5pbmZvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2RhdGEvdjIvZmxhZ192Mi5tYXAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9kYXRhL3YyL2ZsYWdfdjIubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNDY4NWMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9kYXRhL3YyL2ZsYWdfdjIubWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2RhdGEvdjIvZmxhZ192Mi52YWwgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9kYXRhL3YyL2ZsYWdfdjIudmFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZDQ3NTAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9kYXRhL3YyL2ZsYWdfdjIudmFsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2RhdGEvdjIvcGFja2FnZV92Mi5tYXAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9kYXRhL3YyL3BhY2thZ2VfdjIubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOWY5NWUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9kYXRhL3YyL3BhY2thZ2VfdjIubWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2Z1bmN0aW9uYWwvc3Jjcy9BY29uZmlnU3RvcmFnZVJlYWRBUElUZXN0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9mdW5jdGlvbmFsL3NyY3MvQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NTcwNDgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9mdW5jdGlvbmFsL3NyY3MvQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuRGV2aWNlUHJvdG9zOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5uYW5vLkFjb25maWcucGFyc2VkX2ZsYWc7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdSZWFkQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GbGFnUmVhZENvbnRleHQuU3RvcmVkRmxhZ1R5cGU7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuUGFja2FnZVJlYWRDb250ZXh0OworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlNpcEhhc2hlcjEzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uTWFwcGVkQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitAUnVuV2l0aChKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJVGVzdCB7CisKKyAgICBwcml2YXRlIFN0cmluZyBtU3RvcmFnZURpciA9ICIvZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19qYXZhX2FwaV90ZXN0IjsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhY2thZ2VDb250ZXh0UXVlcnkoKSB7CisgICAgICAgIE1hcHBlZEJ5dGVCdWZmZXIgcGFja2FnZU1hcCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYWNrYWdlTWFwID0KKyAgICAgICAgICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLm1hcFN0b3JhZ2VGaWxlKG1TdG9yYWdlRGlyICsgIi9tYXBzL21vY2t1cC5wYWNrYWdlLm1hcCIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleC50b1N0cmluZygpLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShwYWNrYWdlTWFwICE9IG51bGwpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQYWNrYWdlUmVhZENvbnRleHQgY29udGV4dCA9CisgICAgICAgICAgICAgICAgICAgIEFjb25maWdTdG9yYWdlUmVhZEFQSS5nZXRQYWNrYWdlUmVhZENvbnRleHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU1hcCwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0Lm1QYWNrYWdlSWQsIDApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQubUJvb2xlYW5TdGFydEluZGV4LCAwKTsKKworICAgICAgICAgICAgY29udGV4dCA9CisgICAgICAgICAgICAgICAgICAgIEFjb25maWdTdG9yYWdlUmVhZEFQSS5nZXRQYWNrYWdlUmVhZENvbnRleHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU1hcCwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0Lm1QYWNrYWdlSWQsIDEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQubUJvb2xlYW5TdGFydEluZGV4LCAzKTsKKworICAgICAgICAgICAgY29udGV4dCA9CisgICAgICAgICAgICAgICAgICAgIEFjb25maWdTdG9yYWdlUmVhZEFQSS5nZXRQYWNrYWdlUmVhZENvbnRleHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU1hcCwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0Lm1QYWNrYWdlSWQsIDIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQubUJvb2xlYW5TdGFydEluZGV4LCA2KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZXgudG9TdHJpbmcoKSwgZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uRXhpc3RQYWNrYWdlQ29udGV4dFF1ZXJ5KCkgeworICAgICAgICBNYXBwZWRCeXRlQnVmZmVyIHBhY2thZ2VNYXAgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGFja2FnZU1hcCA9CisgICAgICAgICAgICAgICAgICAgIEFjb25maWdTdG9yYWdlUmVhZEFQSS5tYXBTdG9yYWdlRmlsZShtU3RvcmFnZURpciArICIvbWFwcy9tb2NrdXAucGFja2FnZS5tYXAiKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZXgudG9TdHJpbmcoKSwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUocGFja2FnZU1hcCAhPSBudWxsKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgUGFja2FnZVJlYWRDb250ZXh0IGNvbnRleHQgPQorICAgICAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZVJlYWRBUEkuZ2V0UGFja2FnZVJlYWRDb250ZXh0KHBhY2thZ2VNYXAsICJ1bmtub3duIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5tUGFja2FnZUlkLCAtMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5tQm9vbGVhblN0YXJ0SW5kZXgsIC0xKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZXgudG9TdHJpbmcoKSwgZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmxhZ0NvbnRleHRRdWVyeSgpIHsKKyAgICAgICAgTWFwcGVkQnl0ZUJ1ZmZlciBmbGFnTWFwID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZsYWdNYXAgPSBBY29uZmlnU3RvcmFnZVJlYWRBUEkubWFwU3RvcmFnZUZpbGUobVN0b3JhZ2VEaXIgKyAiL21hcHMvbW9ja3VwLmZsYWcubWFwIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGV4LnRvU3RyaW5nKCksIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKGZsYWdNYXAgIT0gbnVsbCk7CisKKyAgICAgICAgY2xhc3MgQmFzZWxpbmUgeworICAgICAgICAgICAgcHVibGljIGludCBtUGFja2FnZUlkOworICAgICAgICAgICAgcHVibGljIFN0cmluZyBtRmxhZ05hbWU7CisgICAgICAgICAgICBwdWJsaWMgU3RvcmVkRmxhZ1R5cGUgbUZsYWdUeXBlOworICAgICAgICAgICAgcHVibGljIGludCBtRmxhZ0luZGV4OworCisgICAgICAgICAgICBwdWJsaWMgQmFzZWxpbmUoCisgICAgICAgICAgICAgICAgICAgIGludCBwYWNrYWdlSWQsIFN0cmluZyBmbGFnTmFtZSwgU3RvcmVkRmxhZ1R5cGUgZmxhZ1R5cGUsIGludCBmbGFnSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBtUGFja2FnZUlkID0gcGFja2FnZUlkOworICAgICAgICAgICAgICAgIG1GbGFnTmFtZSA9IGZsYWdOYW1lOworICAgICAgICAgICAgICAgIG1GbGFnVHlwZSA9IGZsYWdUeXBlOworICAgICAgICAgICAgICAgIG1GbGFnSW5kZXggPSBmbGFnSW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBMaXN0PEJhc2VsaW5lPiBiYXNlbGluZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGJhc2VsaW5lcy5hZGQobmV3IEJhc2VsaW5lKDAsICJlbmFibGVkX3JvIiwgU3RvcmVkRmxhZ1R5cGUuUmVhZE9ubHlCb29sZWFuLCAxKSk7CisgICAgICAgIGJhc2VsaW5lcy5hZGQobmV3IEJhc2VsaW5lKDAsICJlbmFibGVkX3J3IiwgU3RvcmVkRmxhZ1R5cGUuUmVhZFdyaXRlQm9vbGVhbiwgMikpOworICAgICAgICBiYXNlbGluZXMuYWRkKG5ldyBCYXNlbGluZSgyLCAiZW5hYmxlZF9ydyIsIFN0b3JlZEZsYWdUeXBlLlJlYWRXcml0ZUJvb2xlYW4sIDEpKTsKKyAgICAgICAgYmFzZWxpbmVzLmFkZChuZXcgQmFzZWxpbmUoMSwgImRpc2FibGVkX3J3IiwgU3RvcmVkRmxhZ1R5cGUuUmVhZFdyaXRlQm9vbGVhbiwgMCkpOworICAgICAgICBiYXNlbGluZXMuYWRkKG5ldyBCYXNlbGluZSgxLCAiZW5hYmxlZF9maXhlZF9ybyIsIFN0b3JlZEZsYWdUeXBlLkZpeGVkUmVhZE9ubHlCb29sZWFuLCAxKSk7CisgICAgICAgIGJhc2VsaW5lcy5hZGQobmV3IEJhc2VsaW5lKDEsICJlbmFibGVkX3JvIiwgU3RvcmVkRmxhZ1R5cGUuUmVhZE9ubHlCb29sZWFuLCAyKSk7CisgICAgICAgIGJhc2VsaW5lcy5hZGQobmV3IEJhc2VsaW5lKDIsICJlbmFibGVkX2ZpeGVkX3JvIiwgU3RvcmVkRmxhZ1R5cGUuRml4ZWRSZWFkT25seUJvb2xlYW4sIDApKTsKKyAgICAgICAgYmFzZWxpbmVzLmFkZChuZXcgQmFzZWxpbmUoMCwgImRpc2FibGVkX3J3IiwgU3RvcmVkRmxhZ1R5cGUuUmVhZFdyaXRlQm9vbGVhbiwgMCkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3IgKEJhc2VsaW5lIGJhc2VsaW5lIDogYmFzZWxpbmVzKSB7CisgICAgICAgICAgICAgICAgRmxhZ1JlYWRDb250ZXh0IGNvbnRleHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLmdldEZsYWdSZWFkQ29udGV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ01hcCwgYmFzZWxpbmUubVBhY2thZ2VJZCwgYmFzZWxpbmUubUZsYWdOYW1lKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5tRmxhZ1R5cGUsIGJhc2VsaW5lLm1GbGFnVHlwZSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQubUZsYWdJbmRleCwgYmFzZWxpbmUubUZsYWdJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGV4LnRvU3RyaW5nKCksIGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vbkV4aXN0RmxhZ0NvbnRleHRRdWVyeSgpIHsKKyAgICAgICAgTWFwcGVkQnl0ZUJ1ZmZlciBmbGFnTWFwID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZsYWdNYXAgPSBBY29uZmlnU3RvcmFnZVJlYWRBUEkubWFwU3RvcmFnZUZpbGUobVN0b3JhZ2VEaXIgKyAiL21hcHMvbW9ja3VwLmZsYWcubWFwIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGV4LnRvU3RyaW5nKCksIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKGZsYWdNYXAgIT0gbnVsbCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZsYWdSZWFkQ29udGV4dCBjb250ZXh0ID0KKyAgICAgICAgICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLmdldEZsYWdSZWFkQ29udGV4dChmbGFnTWFwLCAwLCAidW5rbm93biIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQubUZsYWdUeXBlLCBudWxsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0Lm1GbGFnSW5kZXgsIC0xKTsKKworICAgICAgICAgICAgY29udGV4dCA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5nZXRGbGFnUmVhZENvbnRleHQoZmxhZ01hcCwgMywgImVuYWJsZWRfcm8iKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0Lm1GbGFnVHlwZSwgbnVsbCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5tRmxhZ0luZGV4LCAtMSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGV4LnRvU3RyaW5nKCksIGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJvb2xlYW5GbGFnVmFsdWVRdWVyeSgpIHsKKyAgICAgICAgTWFwcGVkQnl0ZUJ1ZmZlciBmbGFnVmFsID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZsYWdWYWwgPSBBY29uZmlnU3RvcmFnZVJlYWRBUEkubWFwU3RvcmFnZUZpbGUobVN0b3JhZ2VEaXIgKyAiL2Jvb3QvbW9ja3VwLnZhbCIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleC50b1N0cmluZygpLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShmbGFnVmFsICE9IG51bGwpOworCisgICAgICAgIGJvb2xlYW5bXSBiYXNlbGluZXMgPSB7ZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlfTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyArK2kpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQm9vbGVhbiB2YWx1ZSA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5nZXRCb29sZWFuRmxhZ1ZhbHVlKGZsYWdWYWwsIGkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgYmFzZWxpbmVzW2ldKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleC50b1N0cmluZygpLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQm9vbGVhbkZsYWdWYWx1ZVF1ZXJ5KCkgeworICAgICAgICBNYXBwZWRCeXRlQnVmZmVyIGZsYWdWYWwgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmxhZ1ZhbCA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5tYXBTdG9yYWdlRmlsZShtU3RvcmFnZURpciArICIvYm9vdC9tb2NrdXAudmFsIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGV4LnRvU3RyaW5nKCksIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKGZsYWdWYWwgIT0gbnVsbCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJvb2xlYW4gdmFsdWUgPSBBY29uZmlnU3RvcmFnZVJlYWRBUEkuZ2V0Qm9vbGVhbkZsYWdWYWx1ZShmbGFnVmFsLCA5KTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoInNob3VsZCB0aHJvdyIsIGZhbHNlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZEVycm1zZyA9ICJpbnZhbGlkIHN0b3JhZ2UgZmlsZSBieXRlIG9mZnNldCI7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGV4LnRvU3RyaW5nKCksIGV4LnRvU3RyaW5nKCkuY29udGFpbnMoZXhwZWN0ZWRFcnJtc2cpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJ1c3RKYXZhRXF1YWxIYXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxwYXJzZWRfZmxhZz4gZmxhZ3MgPSBEZXZpY2VQcm90b3MubG9hZEFuZFBhcnNlRmxhZ1Byb3RvcygpOworICAgICAgICBmb3IgKHBhcnNlZF9mbGFnIGZsYWcgOiBmbGFncykgeworICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gZmxhZy5wYWNrYWdlXzsKKyAgICAgICAgICAgIFN0cmluZyBmbGFnTmFtZSA9IGZsYWcubmFtZTsKKyAgICAgICAgICAgIGxvbmcgckhhc2ggPSBBY29uZmlnU3RvcmFnZVJlYWRBUEkuaGFzaChwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBsb25nIGpIYXNoID0gU2lwSGFzaGVyMTMuaGFzaChwYWNrYWdlTmFtZS5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhySGFzaCwgakhhc2gpOworCisgICAgICAgICAgICBTdHJpbmcgZnVsbEZsYWdOYW1lID0gcGFja2FnZU5hbWUgKyAiLyIgKyBmbGFnTmFtZTsKKyAgICAgICAgICAgIHJIYXNoID0gQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLmhhc2goZnVsbEZsYWdOYW1lKTsKKyAgICAgICAgICAgIGpIYXNoID0gU2lwSGFzaGVyMTMuaGFzaChmdWxsRmxhZ05hbWUuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMockhhc2gsIGpIYXNoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2Z1bmN0aW9uYWwvc3Jjcy9QbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWxUZXN0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9mdW5jdGlvbmFsL3NyY3MvUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MzJmZjYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9mdW5jdGlvbmFsL3NyY3MvUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRocm93czsKKworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5EZXZpY2VQcm90b3M7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLm5hbm8uQWNvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcubmFuby5BY29uZmlnLnBhcnNlZF9mbGFnOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdUYWJsZTsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GbGFnVmFsdWVMaXN0OworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlBhY2thZ2VUYWJsZTsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5TdG9yYWdlRmlsZVByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQuaW50ZXJuYWwuYWNvbmZpZy5zdG9yYWdlLkFjb25maWdTdG9yYWdlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuZmxhZ2dpbmcuUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitAUnVuV2l0aChKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBQTEFURk9STV9DT05UQUlORVJTID0gU2V0Lm9mKCJzeXN0ZW0iLCAidmVuZG9yIiwgInByb2R1Y3QiKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbF9sb2FkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxwYXJzZWRfZmxhZz4gZmxhZ3MgPSBEZXZpY2VQcm90b3MubG9hZEFuZFBhcnNlRmxhZ1Byb3RvcygpOworICAgICAgICBNYXA8U3RyaW5nLCBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWw+IHJlYWRlck1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgU3RvcmFnZUZpbGVQcm92aWRlciBmcCA9IFN0b3JhZ2VGaWxlUHJvdmlkZXIuZ2V0RGVmYXVsdFByb3ZpZGVyKCk7CisKKyAgICAgICAgZm9yIChwYXJzZWRfZmxhZyBmbGFnIDogZmxhZ3MpIHsKKyAgICAgICAgICAgIGlmIChmbGFnLnBlcm1pc3Npb24gPT0gQWNvbmZpZy5SRUFEX09OTFkgJiYgZmxhZy5zdGF0ZSA9PSBBY29uZmlnLkRJU0FCTEVEKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgY29udGFpbmVyID0gZmxhZy5jb250YWluZXI7CisgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBmbGFnLnBhY2thZ2VfOworICAgICAgICAgICAgU3RyaW5nIGZsYWdOYW1lID0gZmxhZy5uYW1lOworICAgICAgICAgICAgaWYgKCFQTEFURk9STV9DT05UQUlORVJTLmNvbnRhaW5zKGNvbnRhaW5lcikpIGNvbnRpbnVlOworCisgICAgICAgICAgICBQYWNrYWdlVGFibGUgcFRhYmxlID0gZnAuZ2V0UGFja2FnZVRhYmxlKGNvbnRhaW5lcik7CisgICAgICAgICAgICBQYWNrYWdlVGFibGUuTm9kZSBwTm9kZSA9IHBUYWJsZS5nZXQocGFja2FnZU5hbWUpOworICAgICAgICAgICAgRmxhZ1RhYmxlIGZUYWJsZSA9IGZwLmdldEZsYWdUYWJsZShjb250YWluZXIpOworICAgICAgICAgICAgRmxhZ1RhYmxlLk5vZGUgZk5vZGUgPSBmVGFibGUuZ2V0KHBOb2RlLmdldFBhY2thZ2VJZCgpLCBmbGFnTmFtZSk7CisgICAgICAgICAgICBGbGFnVmFsdWVMaXN0IGZMaXN0ID0gZnAuZ2V0RmxhZ1ZhbHVlTGlzdChjb250YWluZXIpOworCisgICAgICAgICAgICBpbnQgaW5kZXggPSBwTm9kZS5nZXRCb29sZWFuU3RhcnRJbmRleCgpICsgZk5vZGUuZ2V0RmxhZ0luZGV4KCk7CisgICAgICAgICAgICBib29sZWFuIHJWYWwgPSBmTGlzdC5nZXRCb29sZWFuKGluZGV4KTsKKworICAgICAgICAgICAgbG9uZyBmaW5nZXJwcmludCA9IHBOb2RlLmdldFBhY2thZ2VGaW5nZXJwcmludCgpOworCisgICAgICAgICAgICBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwgcmVhZGVyID0gcmVhZGVyTWFwLmdldChwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBpZiAocmVhZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZWFkZXIgPSBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwubG9hZChjb250YWluZXIsIHBhY2thZ2VOYW1lLCBmaW5nZXJwcmludCk7CisgICAgICAgICAgICAgICAgcmVhZGVyTWFwLnB1dChwYWNrYWdlTmFtZSwgcmVhZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2xlYW4galZhbCA9IHJlYWRlci5nZXRCb29sZWFuRmxhZ1ZhbHVlKGZOb2RlLmdldEZsYWdJbmRleCgpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJWYWwsIGpWYWwpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGxhdGZvcm1BY29uZmlnUGFja2FnZV9sb2FkX3dpdGhFcnJvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIGNvbnRhaW5lciBub3QgZm91bmQgZmFrZV9jb250YWluZXIKKyAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24gZSA9CisgICAgICAgICAgICAgICAgYXNzZXJ0VGhyb3dzKAorICAgICAgICAgICAgICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwubG9hZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFrZV9jb250YWluZXIiLCAiZmFrZV9wYWNrYWdlIiwgMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24uRVJST1JfQ0FOTk9UX1JFQURfU1RPUkFHRV9GSUxFLCBlLmdldEVycm9yQ29kZSgpKTsKKworICAgICAgICAvLyBwYWNrYWdlIG5vdCBmb3VuZAorICAgICAgICBlID0KKyAgICAgICAgICAgICAgICBhc3NlcnRUaHJvd3MoCisgICAgICAgICAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+IFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbC5sb2FkKCJzeXN0ZW0iLCAiZmFrZV9jb250YWluZXIiLCAwKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbi5FUlJPUl9QQUNLQUdFX05PVF9GT1VORCwgZS5nZXRFcnJvckNvZGUoKSk7CisKKyAgICAgICAgLy8gZmluZ2VycHJpbnQgZG9lc24ndCBtYXRjaAorICAgICAgICBMaXN0PHBhcnNlZF9mbGFnPiBmbGFncyA9IERldmljZVByb3Rvcy5sb2FkQW5kUGFyc2VGbGFnUHJvdG9zKCk7CisgICAgICAgIFN0b3JhZ2VGaWxlUHJvdmlkZXIgZnAgPSBTdG9yYWdlRmlsZVByb3ZpZGVyLmdldERlZmF1bHRQcm92aWRlcigpOworCisgICAgICAgIHBhcnNlZF9mbGFnIGZsYWcgPSBmbGFncy5nZXQoMCk7CisKKyAgICAgICAgU3RyaW5nIGNvbnRhaW5lciA9IGZsYWcuY29udGFpbmVyOworICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBmbGFnLnBhY2thZ2VfOworICAgICAgICBib29sZWFuIHZhbHVlID0gZmxhZy5zdGF0ZSA9PSBBY29uZmlnLkVOQUJMRUQ7CisKKyAgICAgICAgUGFja2FnZVRhYmxlIHBUYWJsZSA9IGZwLmdldFBhY2thZ2VUYWJsZShjb250YWluZXIpOworICAgICAgICBQYWNrYWdlVGFibGUuTm9kZSBwTm9kZSA9IHBUYWJsZS5nZXQocGFja2FnZU5hbWUpOworCisgICAgICAgIGlmIChwTm9kZS5oYXNQYWNrYWdlRmluZ2VycHJpbnQoKSkgeworICAgICAgICAgICAgbG9uZyBmaW5nZXJwcmludCA9IHBOb2RlLmdldFBhY2thZ2VGaW5nZXJwcmludCgpOworICAgICAgICAgICAgZSA9CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRocm93cygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsLmxvYWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciwgcGFja2FnZU5hbWUsIGZpbmdlcnByaW50ICsgMSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEFjb25maWdTdG9yYWdlRXhjZXB0aW9uLkVSUk9SX0ZJTEVfRklOR0VSUFJJTlRfTUlTTUFUQ0gsIGUuZ2V0RXJyb3JDb2RlKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZnVuY3Rpb25hbC9zcmNzL1BsYXRmb3JtQWNvbmZpZ1BhY2thZ2VUZXN0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9mdW5jdGlvbmFsL3NyY3MvUGxhdGZvcm1BY29uZmlnUGFja2FnZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWJjMmM5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZnVuY3Rpb25hbC9zcmNzL1BsYXRmb3JtQWNvbmZpZ1BhY2thZ2VUZXN0LmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworCitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLkRldmljZVByb3RvczsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcubmFuby5BY29uZmlnOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5uYW5vLkFjb25maWcucGFyc2VkX2ZsYWc7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1RhYmxlOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdWYWx1ZUxpc3Q7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuUGFja2FnZVRhYmxlOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlN0b3JhZ2VGaWxlUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5mbGFnZ2luZy5QbGF0Zm9ybUFjb25maWdQYWNrYWdlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitAUnVuV2l0aChKVW5pdDQuY2xhc3MpCitwdWJsaWMgY2xhc3MgUGxhdGZvcm1BY29uZmlnUGFja2FnZVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gUExBVEZPUk1fQ09OVEFJTkVSUyA9IFNldC5vZigic3lzdGVtIiwgInZlbmRvciIsICJwcm9kdWN0Iik7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF0Zm9ybUFjb25maWdQYWNrYWdlX2xvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBMaXN0PHBhcnNlZF9mbGFnPiBmbGFncyA9IERldmljZVByb3Rvcy5sb2FkQW5kUGFyc2VGbGFnUHJvdG9zKCk7CisgICAgICAgIE1hcDxTdHJpbmcsIFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2U+IHJlYWRlck1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgU3RvcmFnZUZpbGVQcm92aWRlciBmcCA9IFN0b3JhZ2VGaWxlUHJvdmlkZXIuZ2V0RGVmYXVsdFByb3ZpZGVyKCk7CisKKyAgICAgICAgZm9yIChwYXJzZWRfZmxhZyBmbGFnIDogZmxhZ3MpIHsKKyAgICAgICAgICAgIGlmIChmbGFnLnBlcm1pc3Npb24gPT0gQWNvbmZpZy5SRUFEX09OTFkgJiYgZmxhZy5zdGF0ZSA9PSBBY29uZmlnLkRJU0FCTEVEKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgY29udGFpbmVyID0gZmxhZy5jb250YWluZXI7CisgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBmbGFnLnBhY2thZ2VfOworICAgICAgICAgICAgU3RyaW5nIGZsYWdOYW1lID0gZmxhZy5uYW1lOworICAgICAgICAgICAgaWYgKCFQTEFURk9STV9DT05UQUlORVJTLmNvbnRhaW5zKGNvbnRhaW5lcikpIGNvbnRpbnVlOworCisgICAgICAgICAgICBQYWNrYWdlVGFibGUgcFRhYmxlID0gZnAuZ2V0UGFja2FnZVRhYmxlKGNvbnRhaW5lcik7CisgICAgICAgICAgICBQYWNrYWdlVGFibGUuTm9kZSBwTm9kZSA9IHBUYWJsZS5nZXQocGFja2FnZU5hbWUpOworICAgICAgICAgICAgRmxhZ1RhYmxlIGZUYWJsZSA9IGZwLmdldEZsYWdUYWJsZShjb250YWluZXIpOworICAgICAgICAgICAgRmxhZ1RhYmxlLk5vZGUgZk5vZGUgPSBmVGFibGUuZ2V0KHBOb2RlLmdldFBhY2thZ2VJZCgpLCBmbGFnTmFtZSk7CisgICAgICAgICAgICBGbGFnVmFsdWVMaXN0IGZMaXN0ID0gZnAuZ2V0RmxhZ1ZhbHVlTGlzdChjb250YWluZXIpOworCisgICAgICAgICAgICBpbnQgaW5kZXggPSBwTm9kZS5nZXRCb29sZWFuU3RhcnRJbmRleCgpICsgZk5vZGUuZ2V0RmxhZ0luZGV4KCk7CisgICAgICAgICAgICBib29sZWFuIHJWYWwgPSBmTGlzdC5nZXRCb29sZWFuKGluZGV4KTsKKworICAgICAgICAgICAgbG9uZyBmaW5nZXJwcmludCA9IHBOb2RlLmdldFBhY2thZ2VGaW5nZXJwcmludCgpOworCisgICAgICAgICAgICBQbGF0Zm9ybUFjb25maWdQYWNrYWdlIHJlYWRlciA9IHJlYWRlck1hcC5nZXQocGFja2FnZU5hbWUpOworICAgICAgICAgICAgaWYgKHJlYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVhZGVyID0gUGxhdGZvcm1BY29uZmlnUGFja2FnZS5sb2FkKHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgICAgICByZWFkZXJNYXAucHV0KHBhY2thZ2VOYW1lLCByZWFkZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbGVhbiBqVmFsID0gcmVhZGVyLmdldEJvb2xlYW5GbGFnVmFsdWUoZmxhZ05hbWUsICFyVmFsKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJWYWwsIGpWYWwpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGxhdGZvcm1BY29uZmlnUGFja2FnZV9sb2FkX3dpdGhFcnJvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIHBhY2thZ2Ugbm90IGZvdW5kCisgICAgICAgIGFzc2VydE51bGwoUGxhdGZvcm1BY29uZmlnUGFja2FnZS5sb2FkKCJmYWtlX2NvbnRhaW5lciIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9qYXJqYXIudHh0IGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvamFyamFyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTI1MGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvamFyamFyLnR4dApAQCAtMCwwICsxLDE5IEBACitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkFjb25maWdTdG9yYWdlRXhjZXB0aW9uIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24KK3J1bGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1RhYmxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuRmxhZ1RhYmxlCitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlBhY2thZ2VUYWJsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0LlBhY2thZ2VUYWJsZQorcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5CeXRlQnVmZmVyUmVhZGVyIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuQnl0ZUJ1ZmZlclJlYWRlcgorcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GbGFnVHlwZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0LkZsYWdUeXBlCitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlNpcEhhc2hlcjEzIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuU2lwSGFzaGVyMTMKK3J1bGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmlsZVR5cGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdC5GaWxlVHlwZQorcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GbGFnVmFsdWVMaXN0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuRmxhZ1ZhbHVlTGlzdAorcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5UYWJsZVV0aWxzIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuVGFibGVVdGlscworcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5BY29uZmlnUGFja2FnZUltcGwgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdC5BY29uZmlnUGFja2FnZUltcGwKK3J1bGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuU3RvcmFnZUZpbGVQcm92aWRlciBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0LlN0b3JhZ2VGaWxlUHJvdmlkZXIKKworCitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdUYWJsZSQqIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuRmxhZ1RhYmxlJEAxCitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlBhY2thZ2VUYWJsZSQqIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuUGFja2FnZVRhYmxlJEAxCitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdWYWx1ZUxpc3QkKiBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0LkZsYWdWYWx1ZUxpc3RAMQorcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5TaXBIYXNoZXIxMyQqIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuU2lwSGFzaGVyMTNAMQorCitydWxlIGFuZHJvaWQub3MuZmxhZ2dpbmcuUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9zdG9yYWdlX3JlYWRfYXBpX3Rlc3QuY3BwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvc3RvcmFnZV9yZWFkX2FwaV90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mjg5ZmFhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvc3RvcmFnZV9yZWFkX2FwaV90ZXN0LmNwcApAQCAtMCwwICsxLDI0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxjc3RkaW8+CisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgImFjb25maWdfc3RvcmFnZS9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkuaHBwIgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcmVzdWx0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpiYXNlOworCituYW1lc3BhY2UgYXBpID0gYWNvbmZpZ19zdG9yYWdlOworbmFtZXNwYWNlIHByaXZhdGVfYXBpID0gYWNvbmZpZ19zdG9yYWdlOjpwcml2YXRlX2ludGVybmFsX2FwaTsKKworY2xhc3MgQWNvbmZpZ1N0b3JhZ2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICBSZXN1bHQ8dm9pZD4gY29weV9maWxlKHN0ZDo6c3RyaW5nIGNvbnN0JiBzcmNfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgZHN0X2ZpbGUpIHsKKyAgICBhdXRvIGNvbnRlbnQgPSBzdGQ6OnN0cmluZygpOworICAgIGlmICghUmVhZEZpbGVUb1N0cmluZyhzcmNfZmlsZSwgJmNvbnRlbnQpKSB7CisgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiZmFpbGVkIHRvIHJlYWQgZmlsZTogIiA8PCBzcmNfZmlsZTsKKyAgICB9CisgICAgaWYgKCFXcml0ZVN0cmluZ1RvRmlsZShjb250ZW50LCBkc3RfZmlsZSkpIHsKKyAgICAgIHJldHVybiBFcnJvcigpIDw8ICJmYWlsZWQgdG8gY29weSBmaWxlOiAiIDw8IGRzdF9maWxlOworICAgIH0KKyAgICByZXR1cm4ge307CisgIH0KKworICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIGF1dG8gY29uc3QgdGVzdF9iYXNlX2RpciA9IGFuZHJvaWQ6OmJhc2U6OkdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKTsKKyAgICBhdXRvIGNvbnN0IHRlc3RfZGlyID0gdGVzdF9iYXNlX2RpciArICIvZGF0YS92MSI7CisgICAgc3RvcmFnZV9kaXIgPSBzdGQ6OnN0cmluZyhyb290X2Rpci5wYXRoKTsKKyAgICBhdXRvIG1hcHNfZGlyID0gc3RvcmFnZV9kaXIgKyAiL21hcHMiOworICAgIGF1dG8gYm9vdF9kaXIgPSBzdG9yYWdlX2RpciArICIvYm9vdCI7CisgICAgbWtkaXIobWFwc19kaXIuY19zdHIoKSwgMDc3NSk7CisgICAgbWtkaXIoYm9vdF9kaXIuY19zdHIoKSwgMDc3NSk7CisgICAgcGFja2FnZV9tYXAgPSBzdGQ6OnN0cmluZyhtYXBzX2RpcikgKyAiL21vY2t1cC5wYWNrYWdlLm1hcCI7CisgICAgZmxhZ19tYXAgPSBzdGQ6OnN0cmluZyhtYXBzX2RpcikgKyAiL21vY2t1cC5mbGFnLm1hcCI7CisgICAgZmxhZ192YWwgPSBzdGQ6OnN0cmluZyhib290X2RpcikgKyAiL21vY2t1cC52YWwiOworICAgIGZsYWdfaW5mbyA9IHN0ZDo6c3RyaW5nKGJvb3RfZGlyKSArICIvbW9ja3VwLmluZm8iOworICAgIGNvcHlfZmlsZSh0ZXN0X2RpciArICIvcGFja2FnZV92MS5tYXAiLCBwYWNrYWdlX21hcCk7CisgICAgY29weV9maWxlKHRlc3RfZGlyICsgIi9mbGFnX3YxLm1hcCIsIGZsYWdfbWFwKTsKKyAgICBjb3B5X2ZpbGUodGVzdF9kaXIgKyAiL2ZsYWdfdjEudmFsIiwgZmxhZ192YWwpOworICAgIGNvcHlfZmlsZSh0ZXN0X2RpciArICIvZmxhZ192MS5pbmZvIiwgZmxhZ19pbmZvKTsKKyAgfQorCisgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgc3RkOjpyZW1vdmUocGFja2FnZV9tYXAuY19zdHIoKSk7CisgICAgc3RkOjpyZW1vdmUoZmxhZ19tYXAuY19zdHIoKSk7CisgICAgc3RkOjpyZW1vdmUoZmxhZ192YWwuY19zdHIoKSk7CisgICAgc3RkOjpyZW1vdmUoZmxhZ19pbmZvLmNfc3RyKCkpOworICB9CisKKyAgVGVtcG9yYXJ5RGlyIHJvb3RfZGlyOworICBzdGQ6OnN0cmluZyBzdG9yYWdlX2RpcjsKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9tYXA7CisgIHN0ZDo6c3RyaW5nIGZsYWdfbWFwOworICBzdGQ6OnN0cmluZyBmbGFnX3ZhbDsKKyAgc3RkOjpzdHJpbmcgZmxhZ19pbmZvOworfTsKKworLy8vIFRlc3QgdG8gbG9jayBkb3duIHN0b3JhZ2UgZmlsZSB2ZXJzaW9uIHF1ZXJ5IGFwaQorVEVTVF9GKEFjb25maWdTdG9yYWdlVGVzdCwgdGVzdF9zdG9yYWdlX3ZlcnNpb25fcXVlcnkpIHsKKyAgYXV0byB2ZXJzaW9uID0gYXBpOjpnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb24ocGFja2FnZV9tYXApOworICBBU1NFUlRfVFJVRSh2ZXJzaW9uLm9rKCkpOworICBBU1NFUlRfRVEoKnZlcnNpb24sIDEpOworICB2ZXJzaW9uID0gYXBpOjpnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb24oZmxhZ19tYXApOworICBBU1NFUlRfVFJVRSh2ZXJzaW9uLm9rKCkpOworICBBU1NFUlRfRVEoKnZlcnNpb24sIDEpOworICB2ZXJzaW9uID0gYXBpOjpnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb24oZmxhZ192YWwpOworICBBU1NFUlRfVFJVRSh2ZXJzaW9uLm9rKCkpOworICBBU1NFUlRfRVEoKnZlcnNpb24sIDEpOworICB2ZXJzaW9uID0gYXBpOjpnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb24oZmxhZ19pbmZvKTsKKyAgQVNTRVJUX1RSVUUodmVyc2lvbi5vaygpKTsKKyAgQVNTRVJUX0VRKCp2ZXJzaW9uLCAxKTsKK30KKworLy8vIE5lZ2F0aXZlIHRlc3QgdG8gbG9jayBkb3duIHRoZSBlcnJvciB3aGVuIG1hcHBpbmcgbm9uZSBleGlzdCBzdG9yYWdlIGZpbGVzCitURVNUX0YoQWNvbmZpZ1N0b3JhZ2VUZXN0LCB0ZXN0X25vbmVfZXhpc3Rfc3RvcmFnZV9maWxlX21hcHBpbmcpIHsKKyAgYXV0byBtYXBwZWRfZmlsZV9yZXN1bHQgPSBwcml2YXRlX2FwaTo6Z2V0X21hcHBlZF9maWxlX2ltcGwoCisgICAgICBzdG9yYWdlX2RpciwgInZlbmRvciIsIGFwaTo6U3RvcmFnZUZpbGVUeXBlOjpwYWNrYWdlX21hcCk7CisgIEFTU0VSVF9GQUxTRShtYXBwZWRfZmlsZV9yZXN1bHQub2soKSk7CisgIEFTU0VSVF9FUShtYXBwZWRfZmlsZV9yZXN1bHQuZXJyb3IoKSwKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCJmYWlsZWQgdG8gb3BlbiAiKSArIHN0b3JhZ2VfZGlyCisgICAgICAgICAgICArICIvbWFwcy92ZW5kb3IucGFja2FnZS5tYXA6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiKTsKK30KKworLy8vIFRlc3QgdG8gbG9jayBkb3duIHN0b3JhZ2UgcGFja2FnZSBjb250ZXh0IHF1ZXJ5IGFwaQorVEVTVF9GKEFjb25maWdTdG9yYWdlVGVzdCwgdGVzdF9wYWNrYWdlX2NvbnRleHRfcXVlcnkpIHsKKyAgYXV0byBtYXBwZWRfZmlsZV9yZXN1bHQgPSBwcml2YXRlX2FwaTo6Z2V0X21hcHBlZF9maWxlX2ltcGwoCisgICAgICBzdG9yYWdlX2RpciwgIm1vY2t1cCIsIGFwaTo6U3RvcmFnZUZpbGVUeXBlOjpwYWNrYWdlX21hcCk7CisgIEFTU0VSVF9UUlVFKG1hcHBlZF9maWxlX3Jlc3VsdC5vaygpKTsKKyAgYXV0byBtYXBwZWRfZmlsZSA9IHN0ZDo6dW5pcXVlX3B0cjxhcGk6Ok1hcHBlZFN0b3JhZ2VGaWxlPigqbWFwcGVkX2ZpbGVfcmVzdWx0KTsKKworICBhdXRvIGNvbnRleHQgPSBhcGk6OmdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgKKyAgICAgICptYXBwZWRfZmlsZSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiKTsKKyAgQVNTRVJUX1RSVUUoY29udGV4dC5vaygpKTsKKyAgQVNTRVJUX1RSVUUoY29udGV4dC0+cGFja2FnZV9leGlzdHMpOworICBBU1NFUlRfRVEoY29udGV4dC0+cGFja2FnZV9pZCwgMCk7CisgIEFTU0VSVF9FUShjb250ZXh0LT5ib29sZWFuX3N0YXJ0X2luZGV4LCAwKTsKKworICBjb250ZXh0ID0gYXBpOjpnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoCisgICAgICAqbWFwcGVkX2ZpbGUsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIik7CisgIEFTU0VSVF9UUlVFKGNvbnRleHQub2soKSk7CisgIEFTU0VSVF9UUlVFKGNvbnRleHQtPnBhY2thZ2VfZXhpc3RzKTsKKyAgQVNTRVJUX0VRKGNvbnRleHQtPnBhY2thZ2VfaWQsIDEpOworICBBU1NFUlRfRVEoY29udGV4dC0+Ym9vbGVhbl9zdGFydF9pbmRleCwgMyk7CisKKyAgY29udGV4dCA9IGFwaTo6Z2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KAorICAgICAgKm1hcHBlZF9maWxlLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIpOworICBBU1NFUlRfVFJVRShjb250ZXh0Lm9rKCkpOworICBBU1NFUlRfVFJVRShjb250ZXh0LT5wYWNrYWdlX2V4aXN0cyk7CisgIEFTU0VSVF9FUShjb250ZXh0LT5wYWNrYWdlX2lkLCAyKTsKKyAgQVNTRVJUX0VRKGNvbnRleHQtPmJvb2xlYW5fc3RhcnRfaW5kZXgsIDYpOworfQorCisvLy8gVGVzdCB0byBsb2NrIGRvd24gd2hlbiBxdWVyeWluZyBub25lIGV4aXN0IHBhY2thZ2UKK1RFU1RfRihBY29uZmlnU3RvcmFnZVRlc3QsIHRlc3Rfbm9uZV9leGlzdGVudF9wYWNrYWdlX2NvbnRleHRfcXVlcnkpIHsKKyAgYXV0byBtYXBwZWRfZmlsZV9yZXN1bHQgPSBwcml2YXRlX2FwaTo6Z2V0X21hcHBlZF9maWxlX2ltcGwoCisgICAgICBzdG9yYWdlX2RpciwgIm1vY2t1cCIsIGFwaTo6U3RvcmFnZUZpbGVUeXBlOjpwYWNrYWdlX21hcCk7CisgIEFTU0VSVF9UUlVFKG1hcHBlZF9maWxlX3Jlc3VsdC5vaygpKTsKKyAgYXV0byBtYXBwZWRfZmlsZSA9IHN0ZDo6dW5pcXVlX3B0cjxhcGk6Ok1hcHBlZFN0b3JhZ2VGaWxlPigqbWFwcGVkX2ZpbGVfcmVzdWx0KTsKKworICBhdXRvIGNvbnRleHQgPSBhcGk6OmdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgKKyAgICAgICptYXBwZWRfZmlsZSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzMiKTsKKyAgQVNTRVJUX1RSVUUoY29udGV4dC5vaygpKTsKKyAgQVNTRVJUX0ZBTFNFKGNvbnRleHQtPnBhY2thZ2VfZXhpc3RzKTsKK30KKworLy8vIFRlc3QgdG8gbG9jayBkb3duIHN0b3JhZ2UgZmxhZyBjb250ZXh0IHF1ZXJ5IGFwaQorVEVTVF9GKEFjb25maWdTdG9yYWdlVGVzdCwgdGVzdF9mbGFnX2NvbnRleHRfcXVlcnkpIHsKKyAgYXV0byBtYXBwZWRfZmlsZV9yZXN1bHQgPSBwcml2YXRlX2FwaTo6Z2V0X21hcHBlZF9maWxlX2ltcGwoCisgICAgICBzdG9yYWdlX2RpciwgIm1vY2t1cCIsIGFwaTo6U3RvcmFnZUZpbGVUeXBlOjpmbGFnX21hcCk7CisgIEFTU0VSVF9UUlVFKG1hcHBlZF9maWxlX3Jlc3VsdC5vaygpKTsKKyAgYXV0byBtYXBwZWRfZmlsZSA9IHN0ZDo6dW5pcXVlX3B0cjxhcGk6Ok1hcHBlZFN0b3JhZ2VGaWxlPigqbWFwcGVkX2ZpbGVfcmVzdWx0KTsKKworICBhdXRvIGJhc2VsaW5lID0gc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxpbnQsIHN0ZDo6c3RyaW5nLCBhcGk6OlN0b3JlZEZsYWdUeXBlLCBpbnQ+PnsKKyAgICB7MCwgImVuYWJsZWRfcm8iLCBhcGk6OlN0b3JlZEZsYWdUeXBlOjpSZWFkT25seUJvb2xlYW4sIDF9LAorICAgIHswLCAiZW5hYmxlZF9ydyIsIGFwaTo6U3RvcmVkRmxhZ1R5cGU6OlJlYWRXcml0ZUJvb2xlYW4sIDJ9LAorICAgIHsyLCAiZW5hYmxlZF9ydyIsIGFwaTo6U3RvcmVkRmxhZ1R5cGU6OlJlYWRXcml0ZUJvb2xlYW4sIDF9LAorICAgIHsxLCAiZGlzYWJsZWRfcnciLCBhcGk6OlN0b3JlZEZsYWdUeXBlOjpSZWFkV3JpdGVCb29sZWFuLCAwfSwKKyAgICB7MSwgImVuYWJsZWRfZml4ZWRfcm8iLCBhcGk6OlN0b3JlZEZsYWdUeXBlOjpGaXhlZFJlYWRPbmx5Qm9vbGVhbiwgMX0sCisgICAgezEsICJlbmFibGVkX3JvIiwgYXBpOjpTdG9yZWRGbGFnVHlwZTo6UmVhZE9ubHlCb29sZWFuLCAyfSwKKyAgICB7MiwgImVuYWJsZWRfZml4ZWRfcm8iLCBhcGk6OlN0b3JlZEZsYWdUeXBlOjpGaXhlZFJlYWRPbmx5Qm9vbGVhbiwgMH0sCisgICAgezAsICJkaXNhYmxlZF9ydyIsIGFwaTo6U3RvcmVkRmxhZ1R5cGU6OlJlYWRXcml0ZUJvb2xlYW4sIDB9LAorICB9OworICBmb3IgKGF1dG8gY29uc3QmW3BhY2thZ2VfaWQsIGZsYWdfbmFtZSwgZmxhZ190eXBlLCBmbGFnX2luZGV4XSA6IGJhc2VsaW5lKSB7CisgICAgYXV0byBjb250ZXh0ID0gYXBpOjpnZXRfZmxhZ19yZWFkX2NvbnRleHQoKm1hcHBlZF9maWxlLCBwYWNrYWdlX2lkLCBmbGFnX25hbWUpOworICAgIEFTU0VSVF9UUlVFKGNvbnRleHQub2soKSk7CisgICAgQVNTRVJUX1RSVUUoY29udGV4dC0+ZmxhZ19leGlzdHMpOworICAgIEFTU0VSVF9FUShjb250ZXh0LT5mbGFnX3R5cGUsIGZsYWdfdHlwZSk7CisgICAgQVNTRVJUX0VRKGNvbnRleHQtPmZsYWdfaW5kZXgsIGZsYWdfaW5kZXgpOworICB9Cit9CisKKy8vLyBUZXN0IHRvIGxvY2sgZG93biB3aGVuIHF1ZXJ5aW5nIG5vbmUgZXhpc3QgZmxhZworVEVTVF9GKEFjb25maWdTdG9yYWdlVGVzdCwgdGVzdF9ub25lX2V4aXN0ZW50X2ZsYWdfY29udGV4dF9xdWVyeSkgeworICBhdXRvIG1hcHBlZF9maWxlX3Jlc3VsdCA9IHByaXZhdGVfYXBpOjpnZXRfbWFwcGVkX2ZpbGVfaW1wbCgKKyAgICAgIHN0b3JhZ2VfZGlyLCAibW9ja3VwIiwgYXBpOjpTdG9yYWdlRmlsZVR5cGU6OmZsYWdfbWFwKTsKKyAgQVNTRVJUX1RSVUUobWFwcGVkX2ZpbGVfcmVzdWx0Lm9rKCkpOworICBhdXRvIG1hcHBlZF9maWxlID0gc3RkOjp1bmlxdWVfcHRyPGFwaTo6TWFwcGVkU3RvcmFnZUZpbGU+KCptYXBwZWRfZmlsZV9yZXN1bHQpOworCisgIGF1dG8gY29udGV4dCA9IGFwaTo6Z2V0X2ZsYWdfcmVhZF9jb250ZXh0KCptYXBwZWRfZmlsZSwgMCwgIm5vbmVfZXhpc3QiKTsKKyAgQVNTRVJUX1RSVUUoY29udGV4dC5vaygpKTsKKyAgQVNTRVJUX0ZBTFNFKGNvbnRleHQtPmZsYWdfZXhpc3RzKTsKKworICBjb250ZXh0ID0gYXBpOjpnZXRfZmxhZ19yZWFkX2NvbnRleHQoKm1hcHBlZF9maWxlLCAzLCAiZW5hYmxlZF9ybyIpOworICBBU1NFUlRfVFJVRShjb250ZXh0Lm9rKCkpOworICBBU1NFUlRfRkFMU0UoY29udGV4dC0+ZmxhZ19leGlzdHMpOworfQorCisvLy8gVGVzdCB0byBsb2NrIGRvd24gc3RvcmFnZSBmbGFnIHZhbHVlIHF1ZXJ5IGFwaQorVEVTVF9GKEFjb25maWdTdG9yYWdlVGVzdCwgdGVzdF9ib29sZWFuX2ZsYWdfdmFsdWVfcXVlcnkpIHsKKyAgYXV0byBtYXBwZWRfZmlsZV9yZXN1bHQgPSBwcml2YXRlX2FwaTo6Z2V0X21hcHBlZF9maWxlX2ltcGwoCisgICAgICBzdG9yYWdlX2RpciwgIm1vY2t1cCIsIGFwaTo6U3RvcmFnZUZpbGVUeXBlOjpmbGFnX3ZhbCk7CisgIEFTU0VSVF9UUlVFKG1hcHBlZF9maWxlX3Jlc3VsdC5vaygpKTsKKyAgYXV0byBtYXBwZWRfZmlsZSA9IHN0ZDo6dW5pcXVlX3B0cjxhcGk6Ok1hcHBlZFN0b3JhZ2VGaWxlPigqbWFwcGVkX2ZpbGVfcmVzdWx0KTsKKworICBhdXRvIGV4cGVjdGVkX3ZhbHVlID0gc3RkOjp2ZWN0b3I8Ym9vbD57CisgICAgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlfTsKKyAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IDg7ICsraW5kZXgpIHsKKyAgICBhdXRvIHZhbHVlID0gYXBpOjpnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCptYXBwZWRfZmlsZSwgaW5kZXgpOworICAgIEFTU0VSVF9UUlVFKHZhbHVlLm9rKCkpOworICAgIEFTU0VSVF9FUSgqdmFsdWUsIGV4cGVjdGVkX3ZhbHVlW2luZGV4XSk7CisgIH0KK30KKworLy8vIE5lZ2F0aXZlIHRlc3QgdG8gbG9jayBkb3duIHRoZSBlcnJvciB3aGVuIHF1ZXJ5aW5nIGZsYWcgdmFsdWUgb3V0IG9mIHJhbmdlCitURVNUX0YoQWNvbmZpZ1N0b3JhZ2VUZXN0LCB0ZXN0X2ludmFsaWRfYm9vbGVhbl9mbGFnX3ZhbHVlX3F1ZXJ5KSB7CisgIGF1dG8gbWFwcGVkX2ZpbGVfcmVzdWx0ID0gcHJpdmF0ZV9hcGk6OmdldF9tYXBwZWRfZmlsZV9pbXBsKAorICAgICAgc3RvcmFnZV9kaXIsICJtb2NrdXAiLCBhcGk6OlN0b3JhZ2VGaWxlVHlwZTo6ZmxhZ192YWwpOworICBBU1NFUlRfVFJVRShtYXBwZWRfZmlsZV9yZXN1bHQub2soKSk7CisgIGF1dG8gbWFwcGVkX2ZpbGUgPSBzdGQ6OnVuaXF1ZV9wdHI8YXBpOjpNYXBwZWRTdG9yYWdlRmlsZT4oKm1hcHBlZF9maWxlX3Jlc3VsdCk7CisKKyAgYXV0byB2YWx1ZSA9IGFwaTo6Z2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgqbWFwcGVkX2ZpbGUsIDgpOworICBBU1NFUlRfRkFMU0UodmFsdWUub2soKSk7CisgIEFTU0VSVF9FUSh2YWx1ZS5lcnJvcigpLAorICAgICAgICAgICAgc3RkOjpzdHJpbmcoIkludmFsaWRTdG9yYWdlRmlsZU9mZnNldChGbGFnIHZhbHVlIG9mZnNldCBnb2VzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlLikiKSk7Cit9CisKKy8vLyBUZXN0IHRvIGxvY2sgZG93biBzdG9yYWdlIGZsYWcgaW5mbyBxdWVyeSBhcGkKK1RFU1RfRihBY29uZmlnU3RvcmFnZVRlc3QsIHRlc3RfYm9vbGVhbl9mbGFnX2luZm9fcXVlcnkpIHsKKyAgYXV0byBtYXBwZWRfZmlsZV9yZXN1bHQgPSBwcml2YXRlX2FwaTo6Z2V0X21hcHBlZF9maWxlX2ltcGwoCisgICAgICBzdG9yYWdlX2RpciwgIm1vY2t1cCIsIGFwaTo6U3RvcmFnZUZpbGVUeXBlOjpmbGFnX2luZm8pOworICBBU1NFUlRfVFJVRShtYXBwZWRfZmlsZV9yZXN1bHQub2soKSk7CisgIGF1dG8gbWFwcGVkX2ZpbGUgPSBzdGQ6OnVuaXF1ZV9wdHI8YXBpOjpNYXBwZWRTdG9yYWdlRmlsZT4oKm1hcHBlZF9maWxlX3Jlc3VsdCk7CisKKyAgYXV0byBleHBlY3RlZF92YWx1ZSA9IHN0ZDo6dmVjdG9yPGJvb2w+eworICAgIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlfTsKKyAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IDg7ICsraW5kZXgpIHsKKyAgICBhdXRvIGF0dHJpYnV0ZSA9IGFwaTo6Z2V0X2ZsYWdfYXR0cmlidXRlKCptYXBwZWRfZmlsZSwgYXBpOjpGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBpbmRleCk7CisgICAgQVNTRVJUX1RSVUUoYXR0cmlidXRlLm9rKCkpOworICAgIEFTU0VSVF9FUSgqYXR0cmlidXRlICYgc3RhdGljX2Nhc3Q8dWludDhfdD4oYXBpOjpGbGFnSW5mb0JpdDo6SGFzU2VydmVyT3ZlcnJpZGUpLCAwKTsKKyAgICBBU1NFUlRfRVEoKCphdHRyaWJ1dGUgJiBzdGF0aWNfY2FzdDx1aW50OF90PihhcGk6OkZsYWdJbmZvQml0OjpJc1JlYWRXcml0ZSkpICE9IDAsCisgICAgICAgICAgICAgIGV4cGVjdGVkX3ZhbHVlW2luZGV4XSk7CisgICAgQVNTRVJUX0VRKCphdHRyaWJ1dGUgJiBzdGF0aWNfY2FzdDx1aW50OF90PihhcGk6OkZsYWdJbmZvQml0OjpIYXNMb2NhbE92ZXJyaWRlKSwgMCk7CisgIH0KK30KKworLy8vIE5lZ2F0aXZlIHRlc3QgdG8gbG9jayBkb3duIHRoZSBlcnJvciB3aGVuIHF1ZXJ5aW5nIGZsYWcgaW5mbyBvdXQgb2YgcmFuZ2UKK1RFU1RfRihBY29uZmlnU3RvcmFnZVRlc3QsIHRlc3RfaW52YWxpZF9ib29sZWFuX2ZsYWdfaW5mb19xdWVyeSkgeworICBhdXRvIG1hcHBlZF9maWxlX3Jlc3VsdCA9IHByaXZhdGVfYXBpOjpnZXRfbWFwcGVkX2ZpbGVfaW1wbCgKKyAgICAgIHN0b3JhZ2VfZGlyLCAibW9ja3VwIiwgYXBpOjpTdG9yYWdlRmlsZVR5cGU6OmZsYWdfaW5mbyk7CisgIEFTU0VSVF9UUlVFKG1hcHBlZF9maWxlX3Jlc3VsdC5vaygpKTsKKyAgYXV0byBtYXBwZWRfZmlsZSA9IHN0ZDo6dW5pcXVlX3B0cjxhcGk6Ok1hcHBlZFN0b3JhZ2VGaWxlPigqbWFwcGVkX2ZpbGVfcmVzdWx0KTsKKworICBhdXRvIGF0dHJpYnV0ZSA9IGFwaTo6Z2V0X2ZsYWdfYXR0cmlidXRlKCptYXBwZWRfZmlsZSwgYXBpOjpGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCA4KTsKKyAgQVNTRVJUX0ZBTFNFKGF0dHJpYnV0ZS5vaygpKTsKKyAgQVNTRVJUX0VRKGF0dHJpYnV0ZS5lcnJvcigpLAorICAgICAgICAgICAgc3RkOjpzdHJpbmcoIkludmFsaWRTdG9yYWdlRmlsZU9mZnNldChGbGFnIGluZm8gb2Zmc2V0IGdvZXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGZpbGUuKSIpKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL3N0b3JhZ2VfcmVhZF9hcGlfdGVzdC5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL3N0b3JhZ2VfcmVhZF9hcGlfdGVzdC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYThlZGYzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvc3RvcmFnZV9yZWFkX2FwaV90ZXN0LnJzCkBAIC0wLDAgKzEsMjYyIEBACisjW2NmZyhub3QoZmVhdHVyZSA9ICJjYXJnbyIpKV0KK21vZCBhY29uZmlnX3N0b3JhZ2VfcnVzdF90ZXN0IHsKKyAgICB1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OntGbGFnSW5mb0JpdCwgRmxhZ1ZhbHVlVHlwZSwgU3RvcmFnZUZpbGVUeXBlLCBTdG9yZWRGbGFnVHlwZX07CisgICAgdXNlIGFjb25maWdfc3RvcmFnZV9yZWFkX2FwaTo6eworICAgICAgICBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlLCBnZXRfZmxhZ19hdHRyaWJ1dGUsIGdldF9mbGFnX3JlYWRfY29udGV4dCwKKyAgICAgICAgZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0LCBnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb24sIG1hcHBlZF9maWxlOjpnZXRfbWFwcGVkX2ZpbGUsCisgICAgICAgIFBhY2thZ2VSZWFkQ29udGV4dCwKKyAgICB9OworICAgIHVzZSByYW5kOjpSbmc7CisgICAgdXNlIHN0ZDo6ZnM7CisKKyAgICBmbiBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKHZlcnNpb246IHUzMikgLT4gU3RyaW5nIHsKKyAgICAgICAgbGV0IG11dCBybmcgPSByYW5kOjp0aHJlYWRfcm5nKCk7CisgICAgICAgIGxldCBudW1iZXI6IHUzMiA9IHJuZy5nZW4oKTsKKyAgICAgICAgbGV0IHN0b3JhZ2VfZGlyID0gU3RyaW5nOjpmcm9tKCIvdG1wLyIpICsgJm51bWJlci50b19zdHJpbmcoKTsKKyAgICAgICAgaWYgc3RkOjpmczo6bWV0YWRhdGEoJnN0b3JhZ2VfZGlyKS5pc19vaygpIHsKKyAgICAgICAgICAgIGZzOjpyZW1vdmVfZGlyX2FsbCgmc3RvcmFnZV9kaXIpLnVud3JhcCgpOworICAgICAgICB9CisgICAgICAgIGxldCBtYXBzX2RpciA9IHN0b3JhZ2VfZGlyLmNsb25lKCkgKyAiL21hcHMiOworICAgICAgICBsZXQgYm9vdF9kaXIgPSBzdG9yYWdlX2Rpci5jbG9uZSgpICsgIi9ib290IjsKKyAgICAgICAgZnM6OmNyZWF0ZV9kaXIoJnN0b3JhZ2VfZGlyKS51bndyYXAoKTsKKyAgICAgICAgZnM6OmNyZWF0ZV9kaXIobWFwc19kaXIpLnVud3JhcCgpOworICAgICAgICBmczo6Y3JlYXRlX2Rpcihib290X2RpcikudW53cmFwKCk7CisKKyAgICAgICAgbGV0IHBhY2thZ2VfbWFwID0gc3RvcmFnZV9kaXIuY2xvbmUoKSArICIvbWFwcy9tb2NrdXAucGFja2FnZS5tYXAiOworICAgICAgICBsZXQgZmxhZ19tYXAgPSBzdG9yYWdlX2Rpci5jbG9uZSgpICsgIi9tYXBzL21vY2t1cC5mbGFnLm1hcCI7CisgICAgICAgIGxldCBmbGFnX3ZhbCA9IHN0b3JhZ2VfZGlyLmNsb25lKCkgKyAiL2Jvb3QvbW9ja3VwLnZhbCI7CisgICAgICAgIGxldCBmbGFnX2luZm8gPSBzdG9yYWdlX2Rpci5jbG9uZSgpICsgIi9ib290L21vY2t1cC5pbmZvIjsKKyAgICAgICAgZnM6OmNvcHkoZm9ybWF0ISgiLi9kYXRhL3Z7MH0vcGFja2FnZV92ezB9Lm1hcCIsIHZlcnNpb24pLCBwYWNrYWdlX21hcCkudW53cmFwKCk7CisgICAgICAgIGZzOjpjb3B5KGZvcm1hdCEoIi4vZGF0YS92ezB9L2ZsYWdfdnswfS5tYXAiLCB2ZXJzaW9uKSwgZmxhZ19tYXApLnVud3JhcCgpOworICAgICAgICBmczo6Y29weShmb3JtYXQhKCIuL2RhdGEvdnt9L2ZsYWdfdnswfS52YWwiLCB2ZXJzaW9uKSwgZmxhZ192YWwpLnVud3JhcCgpOworICAgICAgICBmczo6Y29weShmb3JtYXQhKCIuL2RhdGEvdnt9L2ZsYWdfdnswfS5pbmZvIiwgdmVyc2lvbiksIGZsYWdfaW5mbykudW53cmFwKCk7CisKKyAgICAgICAgc3RvcmFnZV9kaXIKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF91bmF2YWlsYWJsZV9zdG9yYWdlKCkgeworICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKDEpOworICAgICAgICAvLyBTQUZFVFk6CisgICAgICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBlbnN1cmVkIGFzIHRoZSB0ZXN0IHByb2Nlc3Mgd2lsbCBub3Qgd3JpdGUgdG8gdGVtcCBzdG9yYWdlIGZpbGUKKyAgICAgICAgbGV0IGVyciA9IHVuc2FmZSB7CisgICAgICAgICAgICBnZXRfbWFwcGVkX2ZpbGUoJnN0b3JhZ2VfZGlyLCAidmVuZG9yIiwgU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwKS51bndyYXBfZXJyKCkKKyAgICAgICAgfTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIGZvcm1hdCEoIns6P30iLCBlcnIpLAorICAgICAgICAgICAgZm9ybWF0ISgKKyAgICAgICAgICAgICAgICAiU3RvcmFnZUZpbGVOb3RGb3VuZChzdG9yYWdlIGZpbGUge30vbWFwcy92ZW5kb3IucGFja2FnZS5tYXAgZG9lcyBub3QgZXhpc3QpIiwKKyAgICAgICAgICAgICAgICBzdG9yYWdlX2RpcgorICAgICAgICAgICAgKQorICAgICAgICApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3BhY2thZ2VfY29udGV4dF9xdWVyeSgpIHsKKyAgICAgICAgbGV0IHN0b3JhZ2VfZGlyID0gY3JlYXRlX3Rlc3Rfc3RvcmFnZV9maWxlcygxKTsKKyAgICAgICAgLy8gU0FGRVRZOgorICAgICAgICAvLyBUaGUgc2FmZXR5IGhlcmUgaXMgZW5zdXJlZCBhcyB0aGUgdGVzdCBwcm9jZXNzIHdpbGwgbm90IHdyaXRlIHRvIHRlbXAgc3RvcmFnZSBmaWxlCisgICAgICAgIGxldCBwYWNrYWdlX21hcHBlZF9maWxlID0gdW5zYWZlIHsKKyAgICAgICAgICAgIGdldF9tYXBwZWRfZmlsZSgmc3RvcmFnZV9kaXIsICJtb2NrdXAiLCBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXApLnVud3JhcCgpCisgICAgICAgIH07CisKKyAgICAgICAgbGV0IHBhY2thZ2VfY29udGV4dCA9CisgICAgICAgICAgICBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfbWFwcGVkX2ZpbGUsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIikKKyAgICAgICAgICAgICAgICAudW53cmFwKCkKKyAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPQorICAgICAgICAgICAgUGFja2FnZVJlYWRDb250ZXh0IHsgcGFja2FnZV9pZDogMCwgYm9vbGVhbl9zdGFydF9pbmRleDogMCwgZmluZ2VycHJpbnQ6IDAgfTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHQsIGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCk7CisKKyAgICAgICAgbGV0IHBhY2thZ2VfY29udGV4dCA9CisgICAgICAgICAgICBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfbWFwcGVkX2ZpbGUsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIikKKyAgICAgICAgICAgICAgICAudW53cmFwKCkKKyAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPQorICAgICAgICAgICAgUGFja2FnZVJlYWRDb250ZXh0IHsgcGFja2FnZV9pZDogMSwgYm9vbGVhbl9zdGFydF9pbmRleDogMywgZmluZ2VycHJpbnQ6IDAgfTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHQsIGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCk7CisKKyAgICAgICAgbGV0IHBhY2thZ2VfY29udGV4dCA9CisgICAgICAgICAgICBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfbWFwcGVkX2ZpbGUsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IikKKyAgICAgICAgICAgICAgICAudW53cmFwKCkKKyAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPQorICAgICAgICAgICAgUGFja2FnZVJlYWRDb250ZXh0IHsgcGFja2FnZV9pZDogMiwgYm9vbGVhbl9zdGFydF9pbmRleDogNiwgZmluZ2VycHJpbnQ6IDAgfTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHQsIGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfcGFja2FnZV9jb250ZXh0X3F1ZXJ5X3dpdGhfZmluZ2VycHJpbnQoKSB7CisgICAgICAgIGxldCBzdG9yYWdlX2RpciA9IGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoMik7CisgICAgICAgIC8vIFNBRkVUWToKKyAgICAgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgdGhlIHRlc3QgcHJvY2VzcyB3aWxsIG5vdCB3cml0ZSB0byB0ZW1wIHN0b3JhZ2UgZmlsZQorICAgICAgICBsZXQgcGFja2FnZV9tYXBwZWRfZmlsZSA9IHVuc2FmZSB7CisgICAgICAgICAgICBnZXRfbWFwcGVkX2ZpbGUoJnN0b3JhZ2VfZGlyLCAibW9ja3VwIiwgU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwKS51bndyYXAoKQorICAgICAgICB9OworCisgICAgICAgIGxldCBwYWNrYWdlX2NvbnRleHQgPQorICAgICAgICAgICAgZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX21hcHBlZF9maWxlLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpOworICAgICAgICBsZXQgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0ID0gUGFja2FnZVJlYWRDb250ZXh0IHsKKyAgICAgICAgICAgIHBhY2thZ2VfaWQ6IDAsCisgICAgICAgICAgICBib29sZWFuX3N0YXJ0X2luZGV4OiAwLAorICAgICAgICAgICAgZmluZ2VycHJpbnQ6IDE1MjQ4OTQ4NTEwNTkwMTU4MDg2dTY0LAorICAgICAgICB9OworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VfY29udGV4dCwgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0KTsKKworICAgICAgICBsZXQgcGFja2FnZV9jb250ZXh0ID0KKyAgICAgICAgICAgIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV9tYXBwZWRfZmlsZSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiKQorICAgICAgICAgICAgICAgIC51bndyYXAoKQorICAgICAgICAgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCA9IFBhY2thZ2VSZWFkQ29udGV4dCB7CisgICAgICAgICAgICBwYWNrYWdlX2lkOiAxLAorICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleDogMywKKyAgICAgICAgICAgIGZpbmdlcnByaW50OiA0NDMxOTQwNTAyMjc0ODU3OTY0dTY0LAorICAgICAgICB9OworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VfY29udGV4dCwgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0KTsKKworICAgICAgICBsZXQgcGFja2FnZV9jb250ZXh0ID0KKyAgICAgICAgICAgIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV9tYXBwZWRfZmlsZSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiKQorICAgICAgICAgICAgICAgIC51bndyYXAoKQorICAgICAgICAgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCA9IFBhY2thZ2VSZWFkQ29udGV4dCB7CisgICAgICAgICAgICBwYWNrYWdlX2lkOiAyLAorICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleDogNiwKKyAgICAgICAgICAgIGZpbmdlcnByaW50OiAxNjIzMzIyOTkxNzcxMTYyMjM3NXU2NCwKKyAgICAgICAgfTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHQsIGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3Rfbm9uZV9leGlzdF9wYWNrYWdlX2NvbnRleHRfcXVlcnkoKSB7CisgICAgICAgIGxldCBzdG9yYWdlX2RpciA9IGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoMSk7CisgICAgICAgIC8vIFNBRkVUWToKKyAgICAgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgdGhlIHRlc3QgcHJvY2VzcyB3aWxsIG5vdCB3cml0ZSB0byB0ZW1wIHN0b3JhZ2UgZmlsZQorICAgICAgICBsZXQgcGFja2FnZV9tYXBwZWRfZmlsZSA9IHVuc2FmZSB7CisgICAgICAgICAgICBnZXRfbWFwcGVkX2ZpbGUoJnN0b3JhZ2VfZGlyLCAibW9ja3VwIiwgU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwKS51bndyYXAoKQorICAgICAgICB9OworCisgICAgICAgIGxldCBwYWNrYWdlX2NvbnRleHRfb3B0aW9uID0KKyAgICAgICAgICAgIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV9tYXBwZWRfZmlsZSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzMiKQorICAgICAgICAgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHRfb3B0aW9uLCBOb25lKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9mbGFnX2NvbnRleHRfcXVlcnkoKSB7CisgICAgICAgIGxldCBzdG9yYWdlX2RpciA9IGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoMSk7CisgICAgICAgIC8vIFNBRkVUWToKKyAgICAgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgdGhlIHRlc3QgcHJvY2VzcyB3aWxsIG5vdCB3cml0ZSB0byB0ZW1wIHN0b3JhZ2UgZmlsZQorICAgICAgICBsZXQgZmxhZ19tYXBwZWRfZmlsZSA9CisgICAgICAgICAgICB1bnNhZmUgeyBnZXRfbWFwcGVkX2ZpbGUoJnN0b3JhZ2VfZGlyLCAibW9ja3VwIiwgU3RvcmFnZUZpbGVUeXBlOjpGbGFnTWFwKS51bndyYXAoKSB9OworCisgICAgICAgIGxldCBiYXNlbGluZSA9IHZlYyFbCisgICAgICAgICAgICAoMCwgImVuYWJsZWRfcm8iLCBTdG9yZWRGbGFnVHlwZTo6UmVhZE9ubHlCb29sZWFuLCAxdTE2KSwKKyAgICAgICAgICAgICgwLCAiZW5hYmxlZF9ydyIsIFN0b3JlZEZsYWdUeXBlOjpSZWFkV3JpdGVCb29sZWFuLCAydTE2KSwKKyAgICAgICAgICAgICgyLCAiZW5hYmxlZF9ydyIsIFN0b3JlZEZsYWdUeXBlOjpSZWFkV3JpdGVCb29sZWFuLCAxdTE2KSwKKyAgICAgICAgICAgICgxLCAiZGlzYWJsZWRfcnciLCBTdG9yZWRGbGFnVHlwZTo6UmVhZFdyaXRlQm9vbGVhbiwgMHUxNiksCisgICAgICAgICAgICAoMSwgImVuYWJsZWRfZml4ZWRfcm8iLCBTdG9yZWRGbGFnVHlwZTo6Rml4ZWRSZWFkT25seUJvb2xlYW4sIDF1MTYpLAorICAgICAgICAgICAgKDEsICJlbmFibGVkX3JvIiwgU3RvcmVkRmxhZ1R5cGU6OlJlYWRPbmx5Qm9vbGVhbiwgMnUxNiksCisgICAgICAgICAgICAoMiwgImVuYWJsZWRfZml4ZWRfcm8iLCBTdG9yZWRGbGFnVHlwZTo6Rml4ZWRSZWFkT25seUJvb2xlYW4sIDB1MTYpLAorICAgICAgICAgICAgKDAsICJkaXNhYmxlZF9ydyIsIFN0b3JlZEZsYWdUeXBlOjpSZWFkV3JpdGVCb29sZWFuLCAwdTE2KSwKKyAgICAgICAgXTsKKyAgICAgICAgZm9yIChwYWNrYWdlX2lkLCBmbGFnX25hbWUsIGZsYWdfdHlwZSwgZmxhZ19pbmRleCkgaW4gYmFzZWxpbmUuaW50b19pdGVyKCkgeworICAgICAgICAgICAgbGV0IGZsYWdfY29udGV4dCA9CisgICAgICAgICAgICAgICAgZ2V0X2ZsYWdfcmVhZF9jb250ZXh0KCZmbGFnX21hcHBlZF9maWxlLCBwYWNrYWdlX2lkLCBmbGFnX25hbWUpLnVud3JhcCgpLnVud3JhcCgpOworICAgICAgICAgICAgYXNzZXJ0X2VxIShmbGFnX2NvbnRleHQuZmxhZ190eXBlLCBmbGFnX3R5cGUpOworICAgICAgICAgICAgYXNzZXJ0X2VxIShmbGFnX2NvbnRleHQuZmxhZ19pbmRleCwgZmxhZ19pbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9ub25lX2V4aXN0X2ZsYWdfY29udGV4dF9xdWVyeSgpIHsKKyAgICAgICAgbGV0IHN0b3JhZ2VfZGlyID0gY3JlYXRlX3Rlc3Rfc3RvcmFnZV9maWxlcygxKTsKKyAgICAgICAgLy8gU0FGRVRZOgorICAgICAgICAvLyBUaGUgc2FmZXR5IGhlcmUgaXMgZW5zdXJlZCBhcyB0aGUgdGVzdCBwcm9jZXNzIHdpbGwgbm90IHdyaXRlIHRvIHRlbXAgc3RvcmFnZSBmaWxlCisgICAgICAgIGxldCBmbGFnX21hcHBlZF9maWxlID0KKyAgICAgICAgICAgIHVuc2FmZSB7IGdldF9tYXBwZWRfZmlsZSgmc3RvcmFnZV9kaXIsICJtb2NrdXAiLCBTdG9yYWdlRmlsZVR5cGU6OkZsYWdNYXApLnVud3JhcCgpIH07CisgICAgICAgIGxldCBmbGFnX2NvbnRleHRfb3B0aW9uID0KKyAgICAgICAgICAgIGdldF9mbGFnX3JlYWRfY29udGV4dCgmZmxhZ19tYXBwZWRfZmlsZSwgMCwgIm5vbmVfZXhpc3QiKS51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxIShmbGFnX2NvbnRleHRfb3B0aW9uLCBOb25lKTsKKworICAgICAgICBsZXQgZmxhZ19jb250ZXh0X29wdGlvbiA9CisgICAgICAgICAgICBnZXRfZmxhZ19yZWFkX2NvbnRleHQoJmZsYWdfbWFwcGVkX2ZpbGUsIDMsICJlbmFibGVkX3JvIikudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEoZmxhZ19jb250ZXh0X29wdGlvbiwgTm9uZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfYm9vbGVhbl9mbGFnX3ZhbHVlX3F1ZXJ5KCkgeworICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKDEpOworICAgICAgICAvLyBTQUZFVFk6CisgICAgICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBlbnN1cmVkIGFzIHRoZSB0ZXN0IHByb2Nlc3Mgd2lsbCBub3Qgd3JpdGUgdG8gdGVtcCBzdG9yYWdlIGZpbGUKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVfZmlsZSA9CisgICAgICAgICAgICB1bnNhZmUgeyBnZXRfbWFwcGVkX2ZpbGUoJnN0b3JhZ2VfZGlyLCAibW9ja3VwIiwgU3RvcmFnZUZpbGVUeXBlOjpGbGFnVmFsKS51bndyYXAoKSB9OworICAgICAgICBsZXQgYmFzZWxpbmU6IFZlYzxib29sPiA9IHZlYyFbZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlXTsKKyAgICAgICAgZm9yIChvZmZzZXQsIGV4cGVjdGVkX3ZhbHVlKSBpbiBiYXNlbGluZS5pbnRvX2l0ZXIoKS5lbnVtZXJhdGUoKSB7CisgICAgICAgICAgICBsZXQgZmxhZ192YWx1ZSA9IGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsdWVfZmlsZSwgb2Zmc2V0IGFzIHUzMikudW53cmFwKCk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKGZsYWdfdmFsdWUsIGV4cGVjdGVkX3ZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2ludmFsaWRfYm9vbGVhbl9mbGFnX3ZhbHVlX3F1ZXJ5KCkgeworICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKDEpOworICAgICAgICAvLyBTQUZFVFk6CisgICAgICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBlbnN1cmVkIGFzIHRoZSB0ZXN0IHByb2Nlc3Mgd2lsbCBub3Qgd3JpdGUgdG8gdGVtcCBzdG9yYWdlIGZpbGUKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVfZmlsZSA9CisgICAgICAgICAgICB1bnNhZmUgeyBnZXRfbWFwcGVkX2ZpbGUoJnN0b3JhZ2VfZGlyLCAibW9ja3VwIiwgU3RvcmFnZUZpbGVUeXBlOjpGbGFnVmFsKS51bndyYXAoKSB9OworICAgICAgICBsZXQgZXJyID0gZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgmZmxhZ192YWx1ZV9maWxlLCA4dTMyKS51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZXJyKSwKKyAgICAgICAgICAgICJJbnZhbGlkU3RvcmFnZUZpbGVPZmZzZXQoRmxhZyB2YWx1ZSBvZmZzZXQgZ29lcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZmlsZS4pIgorICAgICAgICApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2ZsYWdfaW5mb19xdWVyeSgpIHsKKyAgICAgICAgbGV0IHN0b3JhZ2VfZGlyID0gY3JlYXRlX3Rlc3Rfc3RvcmFnZV9maWxlcygxKTsKKyAgICAgICAgLy8gU0FGRVRZOgorICAgICAgICAvLyBUaGUgc2FmZXR5IGhlcmUgaXMgZW5zdXJlZCBhcyB0aGUgdGVzdCBwcm9jZXNzIHdpbGwgbm90IHdyaXRlIHRvIHRlbXAgc3RvcmFnZSBmaWxlCisgICAgICAgIGxldCBmbGFnX2luZm9fZmlsZSA9CisgICAgICAgICAgICB1bnNhZmUgeyBnZXRfbWFwcGVkX2ZpbGUoJnN0b3JhZ2VfZGlyLCAibW9ja3VwIiwgU3RvcmFnZUZpbGVUeXBlOjpGbGFnSW5mbykudW53cmFwKCkgfTsKKyAgICAgICAgbGV0IGlzX3J3OiBWZWM8Ym9vbD4gPSB2ZWMhW3RydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlXTsKKyAgICAgICAgZm9yIChvZmZzZXQsIGV4cGVjdGVkX3ZhbHVlKSBpbiBpc19ydy5pbnRvX2l0ZXIoKS5lbnVtZXJhdGUoKSB7CisgICAgICAgICAgICBsZXQgYXR0cmlidXRlID0KKyAgICAgICAgICAgICAgICBnZXRfZmxhZ19hdHRyaWJ1dGUoJmZsYWdfaW5mb19maWxlLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBvZmZzZXQgYXMgdTMyKS51bndyYXAoKTsKKyAgICAgICAgICAgIGFzc2VydCEoKGF0dHJpYnV0ZSAmIEZsYWdJbmZvQml0OjpIYXNTZXJ2ZXJPdmVycmlkZSBhcyB1OCkgPT0gMHU4KTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEoKGF0dHJpYnV0ZSAmIEZsYWdJbmZvQml0OjpJc1JlYWRXcml0ZSBhcyB1OCkgIT0gMHU4LCBleHBlY3RlZF92YWx1ZSk7CisgICAgICAgICAgICBhc3NlcnQhKChhdHRyaWJ1dGUgJiBGbGFnSW5mb0JpdDo6SGFzTG9jYWxPdmVycmlkZSBhcyB1OCkgPT0gMHU4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2ludmFsaWRfYm9vbGVhbl9mbGFnX2luZm9fcXVlcnkoKSB7CisgICAgICAgIGxldCBzdG9yYWdlX2RpciA9IGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoMSk7CisgICAgICAgIC8vIFNBRkVUWToKKyAgICAgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgdGhlIHRlc3QgcHJvY2VzcyB3aWxsIG5vdCB3cml0ZSB0byB0ZW1wIHN0b3JhZ2UgZmlsZQorICAgICAgICBsZXQgZmxhZ19pbmZvX2ZpbGUgPQorICAgICAgICAgICAgdW5zYWZlIHsgZ2V0X21hcHBlZF9maWxlKCZzdG9yYWdlX2RpciwgIm1vY2t1cCIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ0luZm8pLnVud3JhcCgpIH07CisgICAgICAgIGxldCBlcnIgPSBnZXRfZmxhZ19hdHRyaWJ1dGUoJmZsYWdfaW5mb19maWxlLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCA4dTMyKS51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZXJyKSwKKyAgICAgICAgICAgICJJbnZhbGlkU3RvcmFnZUZpbGVPZmZzZXQoRmxhZyBpbmZvIG9mZnNldCBnb2VzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlLikiCisgICAgICAgICk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3Rfc3RvcmFnZV92ZXJzaW9uX3F1ZXJ5X3YxKCkgeworICAgICAgICBhc3NlcnRfZXEhKGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbigiLi9kYXRhL3YxL3BhY2thZ2VfdjEubWFwIikudW53cmFwKCksIDEpOworICAgICAgICBhc3NlcnRfZXEhKGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbigiLi9kYXRhL3YxL2ZsYWdfdjEubWFwIikudW53cmFwKCksIDEpOworICAgICAgICBhc3NlcnRfZXEhKGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbigiLi9kYXRhL3YxL2ZsYWdfdjEudmFsIikudW53cmFwKCksIDEpOworICAgICAgICBhc3NlcnRfZXEhKGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbigiLi9kYXRhL3YxL2ZsYWdfdjEuaW5mbyIpLnVud3JhcCgpLCAxKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9zdG9yYWdlX3ZlcnNpb25fcXVlcnlfdjIoKSB7CisgICAgICAgIGFzc2VydF9lcSEoZ2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKCIuL2RhdGEvdjIvcGFja2FnZV92Mi5tYXAiKS51bndyYXAoKSwgMik7CisgICAgICAgIGFzc2VydF9lcSEoZ2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKCIuL2RhdGEvdjIvZmxhZ192Mi5tYXAiKS51bndyYXAoKSwgMik7CisgICAgICAgIGFzc2VydF9lcSEoZ2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKCIuL2RhdGEvdjIvZmxhZ192Mi52YWwiKS51bndyYXAoKSwgMik7CisgICAgICAgIGFzc2VydF9lcSEoZ2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKCIuL2RhdGEvdjIvZmxhZ192Mi5pbmZvIikudW53cmFwKCksIDIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL3VuaXQvc3Jjcy9QbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWxUZXN0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy91bml0L3NyY3MvUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYzNkZTIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy91bml0L3NyY3MvUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRocm93czsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuUGFja2FnZVRhYmxlOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlN0b3JhZ2VGaWxlUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5mbGFnZ2luZy5QbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7CisKK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWxUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1REQVRBX1BBVEggPQorICAgICAgICAgICAgIi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX3N0b3JhZ2VfcmVhZF91bml0L3Rlc3RkYXRhLyI7CisKKyAgICBwcml2YXRlIFN0b3JhZ2VGaWxlUHJvdmlkZXIgcHI7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CisgICAgICAgIHByID0gbmV3IFN0b3JhZ2VGaWxlUHJvdmlkZXIoVEVTVERBVEFfUEFUSCwgVEVTVERBVEFfUEFUSCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZF9jb250YWluZXJfcGFja2FnZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQYWNrYWdlVGFibGUgcGFja2FnZVRhYmxlID0gcHIuZ2V0UGFja2FnZVRhYmxlKCJtb2NrdXAiKTsKKworICAgICAgICBQYWNrYWdlVGFibGUuTm9kZSBub2RlMSA9IHBhY2thZ2VUYWJsZS5nZXQoImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiKTsKKworICAgICAgICBsb25nIGZpbmdlcnByaW50ID0gbm9kZTEuZ2V0UGFja2FnZUZpbmdlcnByaW50KCk7CisgICAgICAgIFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbCBwID0KKyAgICAgICAgICAgICAgICBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwubG9hZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJtb2NrdXAiLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsIGZpbmdlcnByaW50LCBwcik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZF9jb250YWluZXJfcGFja2FnZV9lcnJvcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQYWNrYWdlVGFibGUgcGFja2FnZVRhYmxlID0gcHIuZ2V0UGFja2FnZVRhYmxlKCJtb2NrdXAiKTsKKyAgICAgICAgUGFja2FnZVRhYmxlLk5vZGUgbm9kZTEgPSBwYWNrYWdlVGFibGUuZ2V0KCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIik7CisgICAgICAgIGxvbmcgZmluZ2VycHJpbnQgPSBub2RlMS5nZXRQYWNrYWdlRmluZ2VycHJpbnQoKTsKKyAgICAgICAgLy8gY2Fubm90IGZpbmQgcGFja2FnZQorICAgICAgICBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbiBlID0KKyAgICAgICAgICAgICAgICBhc3NlcnRUaHJvd3MoCisgICAgICAgICAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbC5sb2FkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2NrdXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZ2VycHJpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFjb25maWdTdG9yYWdlRXhjZXB0aW9uLkVSUk9SX1BBQ0tBR0VfTk9UX0ZPVU5ELCBlLmdldEVycm9yQ29kZSgpKTsKKworICAgICAgICAvLyBjYW5ub3QgZmluZCBjb250YWluZXIKKyAgICAgICAgZSA9CisgICAgICAgICAgICAgICAgYXNzZXJ0VGhyb3dzKAorICAgICAgICAgICAgICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwubG9hZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5nZXJwcmludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24uRVJST1JfQ0FOTk9UX1JFQURfU1RPUkFHRV9GSUxFLCBlLmdldEVycm9yQ29kZSgpKTsKKworICAgICAgICBlID0KKyAgICAgICAgICAgICAgICBhc3NlcnRUaHJvd3MoCisgICAgICAgICAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbC5sb2FkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZ2VycHJpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFjb25maWdTdG9yYWdlRXhjZXB0aW9uLkVSUk9SX0NBTk5PVF9SRUFEX1NUT1JBR0VfRklMRSwgZS5nZXRFcnJvckNvZGUoKSk7CisKKyAgICAgICAgLy8gZmluZ2VycHJpbnQgZG9lc24ndCBtYXRjaAorICAgICAgICBlID0KKyAgICAgICAgICAgICAgICBhc3NlcnRUaHJvd3MoCisgICAgICAgICAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbC5sb2FkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2NrdXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5nZXJwcmludCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgIC8vIEFjb25maWdTdG9yYWdlRXhjZXB0aW9uLkVSUk9SX0ZJTEVfRklOR0VSUFJJTlRfTUlTTUFUQ0gsCisgICAgICAgICAgICAgICAgNSwgZS5nZXRFcnJvckNvZGUoKSk7CisKKyAgICAgICAgLy8gbmV3IHN0b3JhZ2UgZG9lc24ndCBleGlzdAorICAgICAgICBwciA9IG5ldyBTdG9yYWdlRmlsZVByb3ZpZGVyKCJmYWtlL3BhdGgvIiwgImZha2UvcGF0aC8iKTsKKyAgICAgICAgZSA9CisgICAgICAgICAgICAgICAgYXNzZXJ0VGhyb3dzKAorICAgICAgICAgICAgICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwubG9hZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9ja3VwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZ2VycHJpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFjb25maWdTdG9yYWdlRXhjZXB0aW9uLkVSUk9SX0NBTk5PVF9SRUFEX1NUT1JBR0VfRklMRSwgZS5nZXRFcnJvckNvZGUoKSk7CisKKyAgICAgICAgLy8gZmlsZSByZWFkIGlzc3VlCisgICAgICAgIHByID0gbmV3IFN0b3JhZ2VGaWxlUHJvdmlkZXIoVEVTVERBVEFfUEFUSCwgImZha2UvcGF0aC8iKTsKKyAgICAgICAgZSA9CisgICAgICAgICAgICAgICAgYXNzZXJ0VGhyb3dzKAorICAgICAgICAgICAgICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwubG9hZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9ja3VwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZ2VycHJpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFjb25maWdTdG9yYWdlRXhjZXB0aW9uLkVSUk9SX0NBTk5PVF9SRUFEX1NUT1JBR0VfRklMRSwgZS5nZXRFcnJvckNvZGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Qm9vbGVhbkZsYWdWYWx1ZV9pbmRleCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQYWNrYWdlVGFibGUgcGFja2FnZVRhYmxlID0gcHIuZ2V0UGFja2FnZVRhYmxlKCJtb2NrdXAiKTsKKyAgICAgICAgUGFja2FnZVRhYmxlLk5vZGUgbm9kZTEgPSBwYWNrYWdlVGFibGUuZ2V0KCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIik7CisgICAgICAgIGxvbmcgZmluZ2VycHJpbnQgPSBub2RlMS5nZXRQYWNrYWdlRmluZ2VycHJpbnQoKTsKKyAgICAgICAgUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsIHAgPQorICAgICAgICAgICAgICAgIFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbC5sb2FkKAorICAgICAgICAgICAgICAgICAgICAgICAgIm1vY2t1cCIsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiwgZmluZ2VycHJpbnQsIHByKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocC5nZXRCb29sZWFuRmxhZ1ZhbHVlKDApKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwLmdldEJvb2xlYW5GbGFnVmFsdWUoMSkpOworICAgICAgICBhc3NlcnRUcnVlKHAuZ2V0Qm9vbGVhbkZsYWdWYWx1ZSgyKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL0FuZHJvaWQuYnAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yzg4MmI0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw4OCBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbIkFuZHJvaWQtQXBhY2hlLTIuMCJdLAorfQorCitydXN0X2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS5kZWZhdWx0cyIsCisgICAgZWRpdGlvbjogIjIwMjEiLAorICAgIGxpbnRzOiAibm9uZSIsCisgICAgc3JjczogWyJzcmMvbGliLnJzIl0sCisgICAgcnVzdGxpYnM6IFsKKyAgICAgICAgImxpYmFueWhvdyIsCisgICAgICAgICJsaWJ0ZW1wZmlsZSIsCisgICAgICAgICJsaWJtZW1tYXAyIiwKKyAgICAgICAgImxpYmN4eCIsCisgICAgICAgICJsaWJ0aGlzZXJyb3IiLAorICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX2ZpbGUiLAorICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpIiwKKyAgICBdLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjM0IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTphbnlhcGV4IiwKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgIF0sCit9CisKK3J1c3RfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmFjb25maWdfc3RvcmFnZV93cml0ZV9hcGkiLAorICAgIGNyYXRlX25hbWU6ICJhY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBkZWZhdWx0czogWyJhY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpLmRlZmF1bHRzIl0sCit9CisKK3J1c3RfdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS50ZXN0IiwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCisgICAgZGVmYXVsdHM6IFsiYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS5kZWZhdWx0cyJdLAorICAgIGRhdGE6IFsKKyAgICAgICAgInRlc3RzL2ZsYWcudmFsIiwKKyAgICAgICAgInRlc3RzL2ZsYWcuaW5mbyIsCisgICAgXSwKKyAgICBydXN0bGliczogWworICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpIiwKKyAgICBdLAorfQorCisvLyBjeHggc291cmNlIGNvZGVnZW4gZnJvbSBydXN0IGFwaQorZ2VucnVsZSB7CisgICAgbmFtZTogImxpYmN4eF9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpX2JyaWRnZV9jb2RlIiwKKyAgICB0b29sczogWyJjeHhicmlkZ2UiXSwKKyAgICBjbWQ6ICIkKGxvY2F0aW9uIGN4eGJyaWRnZSkgJChpbikgPiAkKG91dCkiLAorICAgIHNyY3M6IFsic3JjL2xpYi5ycyJdLAorICAgIG91dDogWyJhY29uZmlnX3N0b3JhZ2UvbGliLnJzLmNjIl0sCit9CisKKy8vIGN4eCBoZWFkZXIgY29kZWdlbiBmcm9tIHJ1c3QgYXBpCitnZW5ydWxlIHsKKyAgICBuYW1lOiAibGliY3h4X2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGlfYnJpZGdlX2hlYWRlciIsCisgICAgdG9vbHM6IFsiY3h4YnJpZGdlIl0sCisgICAgY21kOiAiJChsb2NhdGlvbiBjeHhicmlkZ2UpICQoaW4pIC0taGVhZGVyID4gJChvdXQpIiwKKyAgICBzcmNzOiBbInNyYy9saWIucnMiXSwKKyAgICBvdXQ6IFsiYWNvbmZpZ19zdG9yYWdlL2xpYi5ycy5oIl0sCit9CisKKy8vIGEgc3RhdGljIGNjIGxpYiBiYXNlZCBvbiBnZW5lcmF0ZWQgY29kZQorcnVzdF9mZmlfc3RhdGljIHsKKyAgICBuYW1lOiAibGliYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaV9jeHhfYnJpZGdlIiwKKyAgICBjcmF0ZV9uYW1lOiAiYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaV9jeHhfYnJpZGdlIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBkZWZhdWx0czogWyJhY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpLmRlZmF1bHRzIl0sCit9CisKKy8vIGZsYWcgd3JpdGUgYXBpIGNjIGludGVyZmFjZQorY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJhY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpX2NjIiwKKyAgICBzcmNzOiBbImFjb25maWdfc3RvcmFnZV93cml0ZV9hcGkuY3BwIl0sCisgICAgZ2VuZXJhdGVkX2hlYWRlcnM6IFsKKyAgICAgICAgImN4eC1icmlkZ2UtaGVhZGVyIiwKKyAgICAgICAgImxpYmN4eF9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpX2JyaWRnZV9oZWFkZXIiLAorICAgIF0sCisgICAgZ2VuZXJhdGVkX3NvdXJjZXM6IFsibGliY3h4X2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGlfYnJpZGdlX2NvZGUiXSwKKyAgICB3aG9sZV9zdGF0aWNfbGliczogWyJsaWJhY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpX2N4eF9icmlkZ2UiXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX2NjIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvQ2FyZ28udG9tbCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9DYXJnby50b21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZTZlZGYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvQ2FyZ28udG9tbApAQCAtMCwwICsxLDIwIEBACitbcGFja2FnZV0KK25hbWUgPSAiYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaSIKK3ZlcnNpb24gPSAiMC4xLjAiCitlZGl0aW9uID0gIjIwMjEiCisKK1tmZWF0dXJlc10KK2RlZmF1bHQgPSBbImNhcmdvIl0KK2NhcmdvID0gW10KKworW2RlcGVuZGVuY2llc10KK2FueWhvdyA9ICIxLjAuNjkiCitjeHggPSAiMS4wIgorbWVtbWFwMiA9ICIwLjguMCIKK3RlbXBmaWxlID0gIjMuOS4wIgordGhpc2Vycm9yID0gIjEuMC41NiIKK2Fjb25maWdfc3RvcmFnZV9maWxlID0geyBwYXRoID0gIi4uL2Fjb25maWdfc3RvcmFnZV9maWxlIiB9CithY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkgPSB7IHBhdGggPSAiLi4vYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpIiB9CisKK1tidWlsZC1kZXBlbmRlbmNpZXNdCitjeHgtYnVpbGQgPSAiMS4wIgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkuY3BwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYThmYTIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS5jcHAKQEAgLTAsMCArMSwxMDMgQEAKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisKKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgInJ1c3QvY3h4LmgiCisjaW5jbHVkZSAiYWNvbmZpZ19zdG9yYWdlL2xpYi5ycy5oIgorI2luY2x1ZGUgImFjb25maWdfc3RvcmFnZS9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpLmhwcCIKKworbmFtZXNwYWNlIGFjb25maWdfc3RvcmFnZSB7CisKKy8vLyBNYXAgYSBzdG9yYWdlIGZpbGUKK2FuZHJvaWQ6OmJhc2U6OlJlc3VsdDxNdXRhYmxlTWFwcGVkU3RvcmFnZUZpbGUgKj4gbWFwX211dGFibGVfc3RvcmFnZV9maWxlKAorICAgIHN0ZDo6c3RyaW5nIGNvbnN0ICZmaWxlKSB7CisgIHN0cnVjdCBzdGF0IGZpbGVfc3RhdDsKKyAgaWYgKHN0YXQoZmlsZS5jX3N0cigpLCAmZmlsZV9zdGF0KSA8IDApIHsKKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6RXJybm9FcnJvcigpIDw8ICJzdGF0IGZhaWxlZCI7CisgIH0KKworICBpZiAoKGZpbGVfc3RhdC5zdF9tb2RlICYgKFNfSVdVU1IgfCBTX0lXR1JQIHwgU19JV09USCkpID09IDApIHsKKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6RXJyb3IoKSA8PCAiY2Fubm90IG1hcCBub253cml0ZWFibGUgZmlsZSI7CisgIH0KKworICBzaXplX3QgZmlsZV9zaXplID0gZmlsZV9zdGF0LnN0X3NpemU7CisKKyAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIHVmZChvcGVuKGZpbGUuY19zdHIoKSwgT19SRFdSIHwgT19OT0ZPTExPVyB8IE9fQ0xPRVhFQykpOworICBpZiAodWZkLmdldCgpID09IC0xKSB7CisgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkVycm5vRXJyb3IoKSA8PCAiZmFpbGVkIHRvIG9wZW4gIiA8PCBmaWxlOworICB9OworCisgIHZvaWQgKmNvbnN0IG1hcF9yZXN1bHQgPQorICAgICAgbW1hcChudWxscHRyLCBmaWxlX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIHVmZC5nZXQoKSwgMCk7CisgIGlmIChtYXBfcmVzdWx0ID09IE1BUF9GQUlMRUQpIHsKKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6RXJybm9FcnJvcigpIDw8ICJtbWFwIGZhaWxlZCI7CisgIH0KKworICBhdXRvIG1hcHBlZF9maWxlID0gbmV3IE11dGFibGVNYXBwZWRTdG9yYWdlRmlsZSgpOworICBtYXBwZWRfZmlsZS0+ZmlsZV9wdHIgPSBtYXBfcmVzdWx0OworICBtYXBwZWRfZmlsZS0+ZmlsZV9zaXplID0gZmlsZV9zaXplOworCisgIHJldHVybiBtYXBwZWRfZmlsZTsKK30KKworLy8vIFNldCBib29sZWFuIGZsYWcgdmFsdWUKK2FuZHJvaWQ6OmJhc2U6OlJlc3VsdDx2b2lkPiBzZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKAorICAgIGNvbnN0IE11dGFibGVNYXBwZWRTdG9yYWdlRmlsZSAmZmlsZSwKKyAgICB1aW50MzJfdCBvZmZzZXQsCisgICAgYm9vbCB2YWx1ZSkgeworICBhdXRvIGNvbnRlbnQgPSBydXN0OjpTbGljZTx1aW50OF90PigKKyAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4oZmlsZS5maWxlX3B0ciksIGZpbGUuZmlsZV9zaXplKTsKKyAgYXV0byB1cGRhdGVfY3h4ID0gdXBkYXRlX2Jvb2xlYW5fZmxhZ192YWx1ZV9jeHgoY29udGVudCwgb2Zmc2V0LCB2YWx1ZSk7CisgIGlmICghdXBkYXRlX2N4eC51cGRhdGVfc3VjY2VzcykgeworICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpFcnJvcigpIDw8IHVwZGF0ZV9jeHguZXJyb3JfbWVzc2FnZS5jX3N0cigpOworICB9CisgIGlmICghbXN5bmMoc3RhdGljX2Nhc3Q8dWludDhfdCAqPihmaWxlLmZpbGVfcHRyKSArIHVwZGF0ZV9jeHgub2Zmc2V0LCAxLCBNU19TWU5DKSkgeworICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpFcnJub0Vycm9yKCkgPDwgIm1zeW5jIGZhaWxlZCI7CisgIH0KKyAgcmV0dXJuIHt9OworfQorCisvLy8gU2V0IGlmIGZsYWcgaGFzIHNlcnZlciBvdmVycmlkZQorYW5kcm9pZDo6YmFzZTo6UmVzdWx0PHZvaWQ+IHNldF9mbGFnX2hhc19zZXJ2ZXJfb3ZlcnJpZGUoCisgICAgY29uc3QgTXV0YWJsZU1hcHBlZFN0b3JhZ2VGaWxlICZmaWxlLAorICAgIEZsYWdWYWx1ZVR5cGUgdmFsdWVfdHlwZSwKKyAgICB1aW50MzJfdCBvZmZzZXQsCisgICAgYm9vbCB2YWx1ZSkgeworICBhdXRvIGNvbnRlbnQgPSBydXN0OjpTbGljZTx1aW50OF90PigKKyAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4oZmlsZS5maWxlX3B0ciksIGZpbGUuZmlsZV9zaXplKTsKKyAgYXV0byB1cGRhdGVfY3h4ID0gdXBkYXRlX2ZsYWdfaGFzX3NlcnZlcl9vdmVycmlkZV9jeHgoCisgICAgICBjb250ZW50LCBzdGF0aWNfY2FzdDx1aW50MTZfdD4odmFsdWVfdHlwZSksIG9mZnNldCwgdmFsdWUpOworICBpZiAoIXVwZGF0ZV9jeHgudXBkYXRlX3N1Y2Nlc3MpIHsKKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6RXJyb3IoKSA8PCB1cGRhdGVfY3h4LmVycm9yX21lc3NhZ2UuY19zdHIoKTsKKyAgfQorICBpZiAoIW1zeW5jKHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4oZmlsZS5maWxlX3B0cikgKyB1cGRhdGVfY3h4Lm9mZnNldCwgMSwgTVNfU1lOQykpIHsKKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6RXJybm9FcnJvcigpIDw8ICJtc3luYyBmYWlsZWQiOworICB9CisgIHJldHVybiB7fTsKK30KKworLy8vIFNldCBpZiBmbGFnIGhhcyBsb2NhbCBvdmVycmlkZQorYW5kcm9pZDo6YmFzZTo6UmVzdWx0PHZvaWQ+IHNldF9mbGFnX2hhc19sb2NhbF9vdmVycmlkZSgKKyAgICBjb25zdCBNdXRhYmxlTWFwcGVkU3RvcmFnZUZpbGUgJmZpbGUsCisgICAgRmxhZ1ZhbHVlVHlwZSB2YWx1ZV90eXBlLAorICAgIHVpbnQzMl90IG9mZnNldCwKKyAgICBib29sIHZhbHVlKSB7CisgIGF1dG8gY29udGVudCA9IHJ1c3Q6OlNsaWNlPHVpbnQ4X3Q+KAorICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdCAqPihmaWxlLmZpbGVfcHRyKSwgZmlsZS5maWxlX3NpemUpOworICBhdXRvIHVwZGF0ZV9jeHggPSB1cGRhdGVfZmxhZ19oYXNfbG9jYWxfb3ZlcnJpZGVfY3h4KAorICAgICAgY29udGVudCwgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHZhbHVlX3R5cGUpLCBvZmZzZXQsIHZhbHVlKTsKKyAgaWYgKCF1cGRhdGVfY3h4LnVwZGF0ZV9zdWNjZXNzKSB7CisgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkVycm9yKCkgPDwgdXBkYXRlX2N4eC5lcnJvcl9tZXNzYWdlLmNfc3RyKCk7CisgIH0KKyAgaWYgKCFtc3luYyhzdGF0aWNfY2FzdDx1aW50OF90ICo+KGZpbGUuZmlsZV9wdHIpICsgdXBkYXRlX2N4eC5vZmZzZXQsIDEsIE1TX1NZTkMpKSB7CisgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkVycm5vRXJyb3IoKSA8PCAibXN5bmMgZmFpbGVkIjsKKyAgfQorICByZXR1cm4ge307Cit9CisKK30gLy8gbmFtZXNwYWNlIGFjb25maWdfc3RvcmFnZQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL2J1aWxkLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL2J1aWxkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMWFhNTMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvYnVpbGQucnMKQEAgLTAsMCArMSw0IEBACitmbiBtYWluKCkgeworICAgIGxldCBfID0gY3h4X2J1aWxkOjpicmlkZ2UoInNyYy9saWIucnMiKTsKKyAgICBwcmludGxuISgiY2FyZ286cmVydW4taWYtY2hhbmdlZD1zcmMvbGliLnJzIik7Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvaW5jbHVkZS9hY29uZmlnX3N0b3JhZ2UvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS5ocHAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvaW5jbHVkZS9hY29uZmlnX3N0b3JhZ2UvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBhNTE4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9pbmNsdWRlL2Fjb25maWdfc3RvcmFnZS9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpLmhwcApAQCAtMCwwICsxLDM5IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9yZXN1bHQuaD4KKyNpbmNsdWRlIDxhY29uZmlnX3N0b3JhZ2UvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpLmhwcD4KKworCituYW1lc3BhY2UgYWNvbmZpZ19zdG9yYWdlIHsKKworLy8vIE1hcHBlZCBmbGFnIHZhbHVlIGZpbGUKK3N0cnVjdCBNdXRhYmxlTWFwcGVkU3RvcmFnZUZpbGUgOiBNYXBwZWRTdG9yYWdlRmlsZSB7fTsKKworLy8vIE1hcCBhIHN0b3JhZ2UgZmlsZQorYW5kcm9pZDo6YmFzZTo6UmVzdWx0PE11dGFibGVNYXBwZWRTdG9yYWdlRmlsZSo+IG1hcF9tdXRhYmxlX3N0b3JhZ2VfZmlsZSgKKyAgICBzdGQ6OnN0cmluZyBjb25zdCYgZmlsZSk7CisKKy8vLyBTZXQgYm9vbGVhbiBmbGFnIHZhbHVlCithbmRyb2lkOjpiYXNlOjpSZXN1bHQ8dm9pZD4gc2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgKKyAgICBjb25zdCBNdXRhYmxlTWFwcGVkU3RvcmFnZUZpbGUmIGZpbGUsCisgICAgdWludDMyX3Qgb2Zmc2V0LAorICAgIGJvb2wgdmFsdWUpOworCisvLy8gU2V0IGlmIGZsYWcgaGFzIHNlcnZlciBvdmVycmlkZQorYW5kcm9pZDo6YmFzZTo6UmVzdWx0PHZvaWQ+IHNldF9mbGFnX2hhc19zZXJ2ZXJfb3ZlcnJpZGUoCisgICAgY29uc3QgTXV0YWJsZU1hcHBlZFN0b3JhZ2VGaWxlJiBmaWxlLAorICAgIEZsYWdWYWx1ZVR5cGUgdmFsdWVfdHlwZSwKKyAgICB1aW50MzJfdCBvZmZzZXQsCisgICAgYm9vbCB2YWx1ZSk7CisKKy8vLyBTZXQgaWYgZmxhZyBoYXMgbG9jYWwgb3ZlcnJpZGUKK2FuZHJvaWQ6OmJhc2U6OlJlc3VsdDx2b2lkPiBzZXRfZmxhZ19oYXNfbG9jYWxfb3ZlcnJpZGUoCisgICAgY29uc3QgTXV0YWJsZU1hcHBlZFN0b3JhZ2VGaWxlJiBmaWxlLAorICAgIEZsYWdWYWx1ZVR5cGUgdmFsdWVfdHlwZSwKKyAgICB1aW50MzJfdCBvZmZzZXQsCisgICAgYm9vbCB2YWx1ZSk7CisKK30gLy8gbmFtZXNwYWNlIGFjb25maWdfc3RvcmFnZQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3NyYy9mbGFnX2luZm9fdXBkYXRlLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3NyYy9mbGFnX2luZm9fdXBkYXRlLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MjExMDUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvc3JjL2ZsYWdfaW5mb191cGRhdGUucnMKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyEgZmxhZyBpbmZvIHVwZGF0ZSBtb2R1bGUgZGVmaW5lcyB0aGUgZmxhZyBpbmZvIGZpbGUgd3JpdGUgdG8gbWFwcGVkIGJ5dGVzCisKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6eworICAgIHJlYWRfdThfZnJvbV9ieXRlcywgQWNvbmZpZ1N0b3JhZ2VFcnJvciwgRmxhZ0luZm9CaXQsIEZsYWdJbmZvSGVhZGVyLCBGbGFnVmFsdWVUeXBlLAorICAgIE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OLAorfTsKK3VzZSBhbnlob3c6OmFueWhvdzsKKworZm4gZ2V0X2ZsYWdfaW5mb19vZmZzZXQoCisgICAgYnVmOiAmbXV0IFt1OF0sCisgICAgZmxhZ190eXBlOiBGbGFnVmFsdWVUeXBlLAorICAgIGZsYWdfaW5kZXg6IHUzMiwKKykgLT4gUmVzdWx0PHVzaXplLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgbGV0IGludGVycHJldGVkX2hlYWRlciA9IEZsYWdJbmZvSGVhZGVyOjpmcm9tX2J5dGVzKGJ1Zik/OworICAgIGlmIGludGVycHJldGVkX2hlYWRlci52ZXJzaW9uID4gTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04geworICAgICAgICByZXR1cm4gRXJyKEFjb25maWdTdG9yYWdlRXJyb3I6OkhpZ2hlclN0b3JhZ2VGaWxlVmVyc2lvbihhbnlob3chKAorICAgICAgICAgICAgIkNhbm5vdCB3cml0ZSB0byBzdG9yYWdlIGZpbGUgd2l0aCBhIGhpZ2hlciB2ZXJzaW9uIG9mIHt9IHdpdGggbGliIHZlcnNpb24ge30iLAorICAgICAgICAgICAgaW50ZXJwcmV0ZWRfaGVhZGVyLnZlcnNpb24sCisgICAgICAgICAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTgorICAgICAgICApKSk7CisgICAgfQorCisgICAgLy8gZ2V0IGJ5dGUgb2Zmc2V0IHRvIHRoZSBmbGFnIGluZm8KKyAgICBsZXQgaGVhZCA9IG1hdGNoIGZsYWdfdHlwZSB7CisgICAgICAgIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4gPT4gKGludGVycHJldGVkX2hlYWRlci5ib29sZWFuX2ZsYWdfb2Zmc2V0ICsgZmxhZ19pbmRleCkgYXMgdXNpemUsCisgICAgfTsKKworICAgIGlmIGhlYWQgPj0gaW50ZXJwcmV0ZWRfaGVhZGVyLmZpbGVfc2l6ZSBhcyB1c2l6ZSB7CisgICAgICAgIHJldHVybiBFcnIoQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6SW52YWxpZFN0b3JhZ2VGaWxlT2Zmc2V0KGFueWhvdyEoCisgICAgICAgICAgICAiRmxhZyB2YWx1ZSBvZmZzZXQgZ29lcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZmlsZS4iCisgICAgICAgICkpKTsKKyAgICB9CisKKyAgICBPayhoZWFkKQorfQorCitmbiBnZXRfZmxhZ19hdHRyaWJ1dGVfYW5kX29mZnNldCgKKyAgICBidWY6ICZtdXQgW3U4XSwKKyAgICBmbGFnX3R5cGU6IEZsYWdWYWx1ZVR5cGUsCisgICAgZmxhZ19pbmRleDogdTMyLAorKSAtPiBSZXN1bHQ8KHU4LCB1c2l6ZSksIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICBsZXQgaGVhZCA9IGdldF9mbGFnX2luZm9fb2Zmc2V0KGJ1ZiwgZmxhZ190eXBlLCBmbGFnX2luZGV4KT87CisgICAgbGV0IG11dCBwb3MgPSBoZWFkOworICAgIGxldCBhdHRyaWJ1dGUgPSByZWFkX3U4X2Zyb21fYnl0ZXMoYnVmLCAmbXV0IHBvcyk/OworICAgIE9rKChhdHRyaWJ1dGUsIGhlYWQpKQorfQorCisvLy8gU2V0IGlmIGZsYWcgaGFzIHNlcnZlciBvdmVycmlkZQorcHViIGZuIHVwZGF0ZV9mbGFnX2hhc19zZXJ2ZXJfb3ZlcnJpZGUoCisgICAgYnVmOiAmbXV0IFt1OF0sCisgICAgZmxhZ190eXBlOiBGbGFnVmFsdWVUeXBlLAorICAgIGZsYWdfaW5kZXg6IHUzMiwKKyAgICB2YWx1ZTogYm9vbCwKKykgLT4gUmVzdWx0PHVzaXplLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgbGV0IChhdHRyaWJ1dGUsIGhlYWQpID0gZ2V0X2ZsYWdfYXR0cmlidXRlX2FuZF9vZmZzZXQoYnVmLCBmbGFnX3R5cGUsIGZsYWdfaW5kZXgpPzsKKyAgICBsZXQgaGFzX292ZXJyaWRlID0gKGF0dHJpYnV0ZSAmIChGbGFnSW5mb0JpdDo6SGFzU2VydmVyT3ZlcnJpZGUgYXMgdTgpKSAhPSAwOworICAgIGlmIGhhc19vdmVycmlkZSAhPSB2YWx1ZSB7CisgICAgICAgIGJ1ZltoZWFkXSA9IChhdHRyaWJ1dGUgXiBGbGFnSW5mb0JpdDo6SGFzU2VydmVyT3ZlcnJpZGUgYXMgdTgpLnRvX2xlX2J5dGVzKClbMF07CisgICAgfQorICAgIE9rKGhlYWQpCit9CisKKy8vLyBTZXQgaWYgZmxhZyBoYXMgbG9jYWwgb3ZlcnJpZGUKK3B1YiBmbiB1cGRhdGVfZmxhZ19oYXNfbG9jYWxfb3ZlcnJpZGUoCisgICAgYnVmOiAmbXV0IFt1OF0sCisgICAgZmxhZ190eXBlOiBGbGFnVmFsdWVUeXBlLAorICAgIGZsYWdfaW5kZXg6IHUzMiwKKyAgICB2YWx1ZTogYm9vbCwKKykgLT4gUmVzdWx0PHVzaXplLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgbGV0IChhdHRyaWJ1dGUsIGhlYWQpID0gZ2V0X2ZsYWdfYXR0cmlidXRlX2FuZF9vZmZzZXQoYnVmLCBmbGFnX3R5cGUsIGZsYWdfaW5kZXgpPzsKKyAgICBsZXQgaGFzX292ZXJyaWRlID0gKGF0dHJpYnV0ZSAmIChGbGFnSW5mb0JpdDo6SGFzTG9jYWxPdmVycmlkZSBhcyB1OCkpICE9IDA7CisgICAgaWYgaGFzX292ZXJyaWRlICE9IHZhbHVlIHsKKyAgICAgICAgYnVmW2hlYWRdID0gKGF0dHJpYnV0ZSBeIEZsYWdJbmZvQml0OjpIYXNMb2NhbE92ZXJyaWRlIGFzIHU4KS50b19sZV9ieXRlcygpWzBdOworICAgIH0KKyAgICBPayhoZWFkKQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6e3Rlc3RfdXRpbHM6OmNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0LCBERUZBVUxUX0ZJTEVfVkVSU0lPTn07CisgICAgdXNlIGFjb25maWdfc3RvcmFnZV9yZWFkX2FwaTo6ZmxhZ19pbmZvX3F1ZXJ5OjpmaW5kX2ZsYWdfYXR0cmlidXRlOworCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIGhhcyBzZXJ2ZXIgb3ZlcnJpZGUgdXBkYXRlCisgICAgZm4gdGVzdF91cGRhdGVfZmxhZ19oYXNfc2VydmVyX292ZXJyaWRlKCkgeworICAgICAgICBsZXQgZmxhZ19pbmZvX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdChERUZBVUxUX0ZJTEVfVkVSU0lPTik7CisgICAgICAgIGxldCBtdXQgYnVmID0gZmxhZ19pbmZvX2xpc3QuaW50b19ieXRlcygpOworICAgICAgICBmb3IgaSBpbiAwLi5mbGFnX2luZm9fbGlzdC5oZWFkZXIubnVtX2ZsYWdzIHsKKyAgICAgICAgICAgIHVwZGF0ZV9mbGFnX2hhc19zZXJ2ZXJfb3ZlcnJpZGUoJm11dCBidWYsIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIGksIHRydWUpLnVud3JhcCgpOworICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZSA9IGZpbmRfZmxhZ19hdHRyaWJ1dGUoJmJ1ZiwgRmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgaSkudW53cmFwKCk7CisgICAgICAgICAgICBhc3NlcnQhKChhdHRyaWJ1dGUgJiAoRmxhZ0luZm9CaXQ6Okhhc1NlcnZlck92ZXJyaWRlIGFzIHU4KSkgIT0gMCk7CisgICAgICAgICAgICB1cGRhdGVfZmxhZ19oYXNfc2VydmVyX292ZXJyaWRlKCZtdXQgYnVmLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBpLCBmYWxzZSkudW53cmFwKCk7CisgICAgICAgICAgICBsZXQgYXR0cmlidXRlID0gZmluZF9mbGFnX2F0dHJpYnV0ZSgmYnVmLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBpKS51bndyYXAoKTsKKyAgICAgICAgICAgIGFzc2VydCEoKGF0dHJpYnV0ZSAmIChGbGFnSW5mb0JpdDo6SGFzU2VydmVyT3ZlcnJpZGUgYXMgdTgpKSA9PSAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBoYXMgbG9jYWwgb3ZlcnJpZGUgdXBkYXRlCisgICAgZm4gdGVzdF91cGRhdGVfZmxhZ19oYXNfbG9jYWxfb3ZlcnJpZGUoKSB7CisgICAgICAgIGxldCBmbGFnX2luZm9fbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0KERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgbGV0IG11dCBidWYgPSBmbGFnX2luZm9fbGlzdC5pbnRvX2J5dGVzKCk7CisgICAgICAgIGZvciBpIGluIDAuLmZsYWdfaW5mb19saXN0LmhlYWRlci5udW1fZmxhZ3MgeworICAgICAgICAgICAgdXBkYXRlX2ZsYWdfaGFzX2xvY2FsX292ZXJyaWRlKCZtdXQgYnVmLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBpLCB0cnVlKS51bndyYXAoKTsKKyAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPSBmaW5kX2ZsYWdfYXR0cmlidXRlKCZidWYsIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIGkpLnVud3JhcCgpOworICAgICAgICAgICAgYXNzZXJ0ISgoYXR0cmlidXRlICYgKEZsYWdJbmZvQml0OjpIYXNMb2NhbE92ZXJyaWRlIGFzIHU4KSkgIT0gMCk7CisgICAgICAgICAgICB1cGRhdGVfZmxhZ19oYXNfbG9jYWxfb3ZlcnJpZGUoJm11dCBidWYsIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIGksIGZhbHNlKS51bndyYXAoKTsKKyAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPSBmaW5kX2ZsYWdfYXR0cmlidXRlKCZidWYsIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIGkpLnVud3JhcCgpOworICAgICAgICAgICAgYXNzZXJ0ISgoYXR0cmlidXRlICYgKEZsYWdJbmZvQml0OjpIYXNMb2NhbE92ZXJyaWRlIGFzIHU4KSkgPT0gMCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvc3JjL2ZsYWdfdmFsdWVfdXBkYXRlLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3NyYy9mbGFnX3ZhbHVlX3VwZGF0ZS5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzcyZGI5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3NyYy9mbGFnX3ZhbHVlX3VwZGF0ZS5ycwpAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8hIGZsYWcgdmFsdWUgdXBkYXRlIG1vZHVsZSBkZWZpbmVzIHRoZSBmbGFnIHZhbHVlIGZpbGUgd3JpdGUgdG8gbWFwcGVkIGJ5dGVzCisKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6e0Fjb25maWdTdG9yYWdlRXJyb3IsIEZsYWdWYWx1ZUhlYWRlciwgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT059OwordXNlIGFueWhvdzo6YW55aG93OworCisvLy8gU2V0IGZsYWcgdmFsdWUKK3B1YiBmbiB1cGRhdGVfYm9vbGVhbl9mbGFnX3ZhbHVlKAorICAgIGJ1ZjogJm11dCBbdThdLAorICAgIGZsYWdfaW5kZXg6IHUzMiwKKyAgICBmbGFnX3ZhbHVlOiBib29sLAorKSAtPiBSZXN1bHQ8dXNpemUsIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICBsZXQgaW50ZXJwcmV0ZWRfaGVhZGVyID0gRmxhZ1ZhbHVlSGVhZGVyOjpmcm9tX2J5dGVzKGJ1Zik/OworICAgIGlmIGludGVycHJldGVkX2hlYWRlci52ZXJzaW9uID4gTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04geworICAgICAgICByZXR1cm4gRXJyKEFjb25maWdTdG9yYWdlRXJyb3I6OkhpZ2hlclN0b3JhZ2VGaWxlVmVyc2lvbihhbnlob3chKAorICAgICAgICAgICAgIkNhbm5vdCB3cml0ZSB0byBzdG9yYWdlIGZpbGUgd2l0aCBhIGhpZ2hlciB2ZXJzaW9uIG9mIHt9IHdpdGggbGliIHZlcnNpb24ge30iLAorICAgICAgICAgICAgaW50ZXJwcmV0ZWRfaGVhZGVyLnZlcnNpb24sCisgICAgICAgICAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTgorICAgICAgICApKSk7CisgICAgfQorCisgICAgLy8gZ2V0IGJ5dGUgb2Zmc2V0IHRvIHRoZSBmbGFnCisgICAgbGV0IGhlYWQgPSAoaW50ZXJwcmV0ZWRfaGVhZGVyLmJvb2xlYW5fdmFsdWVfb2Zmc2V0ICsgZmxhZ19pbmRleCkgYXMgdXNpemU7CisgICAgaWYgaGVhZCA+PSBpbnRlcnByZXRlZF9oZWFkZXIuZmlsZV9zaXplIGFzIHVzaXplIHsKKyAgICAgICAgcmV0dXJuIEVycihBY29uZmlnU3RvcmFnZUVycm9yOjpJbnZhbGlkU3RvcmFnZUZpbGVPZmZzZXQoYW55aG93ISgKKyAgICAgICAgICAgICJGbGFnIHZhbHVlIG9mZnNldCBnb2VzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlLiIKKyAgICAgICAgKSkpOworICAgIH0KKworICAgIGJ1ZltoZWFkXSA9IHU4Ojpmcm9tKGZsYWdfdmFsdWUpLnRvX2xlX2J5dGVzKClbMF07CisgICAgT2soaGVhZCkKK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKyAgICB1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6Ont0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QsIERFRkFVTFRfRklMRV9WRVJTSU9OfTsKKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBmbGFnIHZhbHVlIHVwZGF0ZQorICAgIGZuIHRlc3RfYm9vbGVhbl9mbGFnX3ZhbHVlX3VwZGF0ZSgpIHsKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVfbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdChERUZBVUxUX0ZJTEVfVkVSU0lPTik7CisgICAgICAgIGxldCB2YWx1ZV9vZmZzZXQgPSBmbGFnX3ZhbHVlX2xpc3QuaGVhZGVyLmJvb2xlYW5fdmFsdWVfb2Zmc2V0OworICAgICAgICBsZXQgbXV0IGNvbnRlbnQgPSBmbGFnX3ZhbHVlX2xpc3QuaW50b19ieXRlcygpOworICAgICAgICBsZXQgdHJ1ZV9ieXRlID0gdTg6OmZyb20odHJ1ZSkudG9fbGVfYnl0ZXMoKVswXTsKKyAgICAgICAgbGV0IGZhbHNlX2J5dGUgPSB1ODo6ZnJvbShmYWxzZSkudG9fbGVfYnl0ZXMoKVswXTsKKworICAgICAgICBmb3IgaSBpbiAwLi5mbGFnX3ZhbHVlX2xpc3QuaGVhZGVyLm51bV9mbGFncyB7CisgICAgICAgICAgICBsZXQgb2Zmc2V0ID0gKHZhbHVlX29mZnNldCArIGkpIGFzIHVzaXplOworICAgICAgICAgICAgdXBkYXRlX2Jvb2xlYW5fZmxhZ192YWx1ZSgmbXV0IGNvbnRlbnQsIGksIHRydWUpLnVud3JhcCgpOworICAgICAgICAgICAgYXNzZXJ0X2VxIShjb250ZW50W29mZnNldF0sIHRydWVfYnl0ZSk7CisgICAgICAgICAgICB1cGRhdGVfYm9vbGVhbl9mbGFnX3ZhbHVlKCZtdXQgY29udGVudCwgaSwgZmFsc2UpLnVud3JhcCgpOworICAgICAgICAgICAgYXNzZXJ0X2VxIShjb250ZW50W29mZnNldF0sIGZhbHNlX2J5dGUpOworICAgICAgICB9CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHVwZGF0ZSBiZXlvbmQgdGhlIGVuZCBvZiBib29sZWFuIHNlY3Rpb24KKyAgICBmbiB0ZXN0X2Jvb2xlYW5fb3V0X29mX3JhbmdlKCkgeworICAgICAgICBsZXQgbXV0IGZsYWdfdmFsdWVfbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdChERUZBVUxUX0ZJTEVfVkVSU0lPTikuaW50b19ieXRlcygpOworICAgICAgICBsZXQgZXJyb3IgPSB1cGRhdGVfYm9vbGVhbl9mbGFnX3ZhbHVlKCZtdXQgZmxhZ192YWx1ZV9saXN0Wy4uXSwgOCwgdHJ1ZSkudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVycm9yKSwKKyAgICAgICAgICAgICJJbnZhbGlkU3RvcmFnZUZpbGVPZmZzZXQoRmxhZyB2YWx1ZSBvZmZzZXQgZ29lcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZmlsZS4pIgorICAgICAgICApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBxdWVyeSBlcnJvciB3aGVuIGZpbGUgaGFzIGEgaGlnaGVyIHZlcnNpb24KKyAgICBmbiB0ZXN0X2hpZ2hlcl92ZXJzaW9uX3N0b3JhZ2VfZmlsZSgpIHsKKyAgICAgICAgbGV0IG11dCB2YWx1ZV9saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0KERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgdmFsdWVfbGlzdC5oZWFkZXIudmVyc2lvbiA9IE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OICsgMTsKKyAgICAgICAgbGV0IG11dCBmbGFnX3ZhbHVlID0gdmFsdWVfbGlzdC5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCBlcnJvciA9IHVwZGF0ZV9ib29sZWFuX2ZsYWdfdmFsdWUoJm11dCBmbGFnX3ZhbHVlWy4uXSwgNCwgdHJ1ZSkudW53cmFwX2VycigpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVycm9yKSwKKyAgICAgICAgICAgIGZvcm1hdCEoCisgICAgICAgICAgICAgICAgIkhpZ2hlclN0b3JhZ2VGaWxlVmVyc2lvbihDYW5ub3Qgd3JpdGUgdG8gc3RvcmFnZSBmaWxlIHdpdGggYSBoaWdoZXIgdmVyc2lvbiBvZiB7fSB3aXRoIGxpYiB2ZXJzaW9uIHt9KSIsCisgICAgICAgICAgICAgICAgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04gKyAxLAorICAgICAgICAgICAgICAgIE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OCisgICAgICAgICAgICApCisgICAgICAgICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3NyYy9saWIucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvc3JjL2xpYi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWJiNDFmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3NyYy9saWIucnMKQEAgLTAsMCArMSwzMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyEgYGFjb25maWdfc3RvcmFnZV93cml0ZV9hcGlgIGlzIGEgY3JhdGUgdGhhdCBkZWZpbmVzIHdyaXRlIGFwaXMgdG8gdXBkYXRlIGZsYWcgdmFsdWUKKy8vISBpbiBzdG9yYWdlIGZpbGUuIEl0IHByb3ZpZGVzIG9uZSBhcGkgdG8gaW50ZXJmYWNlIHdpdGggc3RvcmFnZSBmaWxlcy4KKworcHViIG1vZCBmbGFnX2luZm9fdXBkYXRlOworcHViIG1vZCBmbGFnX3ZhbHVlX3VwZGF0ZTsKK3B1YiBtb2QgbWFwcGVkX2ZpbGU7CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RfdXRpbHM7CisKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6e0Fjb25maWdTdG9yYWdlRXJyb3IsIEZsYWdWYWx1ZVR5cGV9OworCit1c2UgYW55aG93Ojphbnlob3c7Cit1c2UgbWVtbWFwMjo6TW1hcE11dDsKKworLy8vIEdldCByZWFkIHdyaXRlIG1hcHBlZCBzdG9yYWdlIGZpbGVzLgorLy8vCisvLy8gXGlucHV0IGZpbGVfcGF0aDogcGF0aCB0byB0aGUgc3RvcmFnZSBmaWxlCisvLy8KKy8vLyAjIFNhZmV0eQorLy8vCisvLy8gVGhlIG1lbW9yeSBtYXBwZWQgZmlsZSBtYXkgaGF2ZSB1bmRlZmluZWQgYmVoYXZpb3IgaWYgdGhlcmUgYXJlIHdyaXRlcyB0byB0aGlzCisvLy8gZmlsZSBub3QgdGhydSB0aGlzIG1lbW9yeSBtYXBwZWQgZmlsZSBvciB0aGVyZSBhcmUgY29uY3VycmVudCB3cml0ZXMgdG8gdGhpcworLy8vIG1lbW9yeSBtYXBwZWQgZmlsZS4gRW5zdXJlIGFsbCB3cml0ZXMgdG8gdGhlIHVuZGVybHlpbmcgZmlsZSBhcmUgdGhydSB0aGlzIG1lbW9yeQorLy8vIG1hcHBlZCBmaWxlIGFuZCB0aGVyZSBhcmUgbm8gY29uY3VycmVudCB3cml0ZXMuCitwdWIgdW5zYWZlIGZuIG1hcF9tdXRhYmxlX3N0b3JhZ2VfZmlsZShmaWxlX3BhdGg6ICZzdHIpIC0+IFJlc3VsdDxNbWFwTXV0LCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgY3JhdGU6Om1hcHBlZF9maWxlOjptYXBfZmlsZShmaWxlX3BhdGgpCit9CisKKy8vLyBTZXQgYm9vbGVhbiBmbGFnIHZhbHVlIHRocnUgbWFwcGVkIGZpbGUgYW5kIGZsdXNoIHRoZSBjaGFuZ2UgdG8gZmlsZQorLy8vCisvLy8gXGlucHV0IG1hcHBlZF9maWxlOiB0aGUgbWFwcGVkIGZsYWcgdmFsdWUgZmlsZQorLy8vIFxpbnB1dCBpbmRleDogZmxhZyBpbmRleAorLy8vIFxpbnB1dCB2YWx1ZTogdXBkYXRlZCBmbGFnIHZhbHVlCisvLy8gXHJldHVybiBhIHJlc3VsdCBvZiAoKQorLy8vCitwdWIgZm4gc2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgKKyAgICBmaWxlOiAmbXV0IE1tYXBNdXQsCisgICAgaW5kZXg6IHUzMiwKKyAgICB2YWx1ZTogYm9vbCwKKykgLT4gUmVzdWx0PCgpLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgY3JhdGU6OmZsYWdfdmFsdWVfdXBkYXRlOjp1cGRhdGVfYm9vbGVhbl9mbGFnX3ZhbHVlKGZpbGUsIGluZGV4LCB2YWx1ZSk/OworICAgIGZpbGUuZmx1c2goKS5tYXBfZXJyKHxlcnJtc2d8IHsKKyAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6TWFwRmx1c2hGYWlsKGFueWhvdyEoImZhaWwgdG8gZmx1c2ggc3RvcmFnZSBmaWxlOiB7fSIsIGVycm1zZykpCisgICAgfSkKK30KKworLy8vIFNldCBpZiBmbGFnIGlzIGhhcyBzZXJ2ZXIgb3ZlcnJpZGUgdGhydSBtYXBwZWQgZmlsZSBhbmQgZmx1c2ggdGhlIGNoYW5nZSB0byBmaWxlCisvLy8KKy8vLyBcaW5wdXQgbWFwcGVkX2ZpbGU6IHRoZSBtYXBwZWQgZmxhZyBpbmZvIGZpbGUKKy8vLyBcaW5wdXQgaW5kZXg6IGZsYWcgaW5kZXgKKy8vLyBcaW5wdXQgdmFsdWU6IHVwZGF0ZWQgZmxhZyBoYXMgc2VydmVyIG92ZXJyaWRlIHZhbHVlCisvLy8gXHJldHVybiBhIHJlc3VsdCBvZiAoKQorLy8vCitwdWIgZm4gc2V0X2ZsYWdfaGFzX3NlcnZlcl9vdmVycmlkZSgKKyAgICBmaWxlOiAmbXV0IE1tYXBNdXQsCisgICAgZmxhZ190eXBlOiBGbGFnVmFsdWVUeXBlLAorICAgIGluZGV4OiB1MzIsCisgICAgdmFsdWU6IGJvb2wsCispIC0+IFJlc3VsdDwoKSwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIGNyYXRlOjpmbGFnX2luZm9fdXBkYXRlOjp1cGRhdGVfZmxhZ19oYXNfc2VydmVyX292ZXJyaWRlKGZpbGUsIGZsYWdfdHlwZSwgaW5kZXgsIHZhbHVlKT87CisgICAgZmlsZS5mbHVzaCgpLm1hcF9lcnIofGVycm1zZ3wgeworICAgICAgICBBY29uZmlnU3RvcmFnZUVycm9yOjpNYXBGbHVzaEZhaWwoYW55aG93ISgiZmFpbCB0byBmbHVzaCBzdG9yYWdlIGZpbGU6IHt9IiwgZXJybXNnKSkKKyAgICB9KQorfQorCisvLy8gU2V0IGlmIGZsYWcgaGFzIGxvY2FsIG92ZXJyaWRlIHRocnUgbWFwcGVkIGZpbGUgYW5kIGZsdXNoIHRoZSBjaGFuZ2UgdG8gZmlsZQorLy8vCisvLy8gXGlucHV0IG1hcHBlZF9maWxlOiB0aGUgbWFwcGVkIGZsYWcgaW5mbyBmaWxlCisvLy8gXGlucHV0IGluZGV4OiBmbGFnIGluZGV4CisvLy8gXGlucHV0IHZhbHVlOiB1cGRhdGVkIGZsYWcgaGFzIGxvY2FsIG92ZXJyaWRlIHZhbHVlCisvLy8gXHJldHVybiBhIHJlc3VsdCBvZiAoKQorLy8vCitwdWIgZm4gc2V0X2ZsYWdfaGFzX2xvY2FsX292ZXJyaWRlKAorICAgIGZpbGU6ICZtdXQgTW1hcE11dCwKKyAgICBmbGFnX3R5cGU6IEZsYWdWYWx1ZVR5cGUsCisgICAgaW5kZXg6IHUzMiwKKyAgICB2YWx1ZTogYm9vbCwKKykgLT4gUmVzdWx0PCgpLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgY3JhdGU6OmZsYWdfaW5mb191cGRhdGU6OnVwZGF0ZV9mbGFnX2hhc19sb2NhbF9vdmVycmlkZShmaWxlLCBmbGFnX3R5cGUsIGluZGV4LCB2YWx1ZSk/OworICAgIGZpbGUuZmx1c2goKS5tYXBfZXJyKHxlcnJtc2d8IHsKKyAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6TWFwRmx1c2hGYWlsKGFueWhvdyEoImZhaWwgdG8gZmx1c2ggc3RvcmFnZSBmaWxlOiB7fSIsIGVycm1zZykpCisgICAgfSkKK30KKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCisvLyBDQyBJTlRFUkxPUAorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCisKKy8vIEV4cG9ydGVkIHJ1c3QgZGF0YSBzdHJ1Y3R1cmUgYW5kIG1ldGhvZHMsIGMrKyBjb2RlIHdpbGwgYmUgZ2VuZXJhdGVkCisjW2N4eDo6YnJpZGdlXQorbW9kIGZmaSB7CisgICAgLy8gRmxhZyB2YWx1ZSB1cGRhdGUgcmV0dXJuIGZvciBjYyBpbnRlcmxvcAorICAgIHB1YiBzdHJ1Y3QgQm9vbGVhbkZsYWdWYWx1ZVVwZGF0ZUNYWCB7CisgICAgICAgIHB1YiB1cGRhdGVfc3VjY2VzczogYm9vbCwKKyAgICAgICAgcHViIG9mZnNldDogdXNpemUsCisgICAgICAgIHB1YiBlcnJvcl9tZXNzYWdlOiBTdHJpbmcsCisgICAgfQorCisgICAgLy8gRmxhZyBoYXMgc2VydmVyIG92ZXJyaWRlIHVwZGF0ZSByZXR1cm4gZm9yIGNjIGludGVybG9wCisgICAgcHViIHN0cnVjdCBGbGFnSGFzU2VydmVyT3ZlcnJpZGVVcGRhdGVDWFggeworICAgICAgICBwdWIgdXBkYXRlX3N1Y2Nlc3M6IGJvb2wsCisgICAgICAgIHB1YiBvZmZzZXQ6IHVzaXplLAorICAgICAgICBwdWIgZXJyb3JfbWVzc2FnZTogU3RyaW5nLAorICAgIH0KKworICAgIC8vIEZsYWcgaGFzIGxvY2FsIG92ZXJyaWRlIHVwZGF0ZSByZXR1cm4gZm9yIGNjIGludGVybG9wCisgICAgcHViIHN0cnVjdCBGbGFnSGFzTG9jYWxPdmVycmlkZVVwZGF0ZUNYWCB7CisgICAgICAgIHB1YiB1cGRhdGVfc3VjY2VzczogYm9vbCwKKyAgICAgICAgcHViIG9mZnNldDogdXNpemUsCisgICAgICAgIHB1YiBlcnJvcl9tZXNzYWdlOiBTdHJpbmcsCisgICAgfQorCisgICAgLy8gUnVzdCBleHBvcnQgdG8gYysrCisgICAgZXh0ZXJuICJSdXN0IiB7CisgICAgICAgIHB1YiBmbiB1cGRhdGVfYm9vbGVhbl9mbGFnX3ZhbHVlX2N4eCgKKyAgICAgICAgICAgIGZpbGU6ICZtdXQgW3U4XSwKKyAgICAgICAgICAgIG9mZnNldDogdTMyLAorICAgICAgICAgICAgdmFsdWU6IGJvb2wsCisgICAgICAgICkgLT4gQm9vbGVhbkZsYWdWYWx1ZVVwZGF0ZUNYWDsKKworICAgICAgICBwdWIgZm4gdXBkYXRlX2ZsYWdfaGFzX3NlcnZlcl9vdmVycmlkZV9jeHgoCisgICAgICAgICAgICBmaWxlOiAmbXV0IFt1OF0sCisgICAgICAgICAgICBmbGFnX3R5cGU6IHUxNiwKKyAgICAgICAgICAgIG9mZnNldDogdTMyLAorICAgICAgICAgICAgdmFsdWU6IGJvb2wsCisgICAgICAgICkgLT4gRmxhZ0hhc1NlcnZlck92ZXJyaWRlVXBkYXRlQ1hYOworCisgICAgICAgIHB1YiBmbiB1cGRhdGVfZmxhZ19oYXNfbG9jYWxfb3ZlcnJpZGVfY3h4KAorICAgICAgICAgICAgZmlsZTogJm11dCBbdThdLAorICAgICAgICAgICAgZmxhZ190eXBlOiB1MTYsCisgICAgICAgICAgICBvZmZzZXQ6IHUzMiwKKyAgICAgICAgICAgIHZhbHVlOiBib29sLAorICAgICAgICApIC0+IEZsYWdIYXNMb2NhbE92ZXJyaWRlVXBkYXRlQ1hYOworICAgIH0KK30KKworcHViKGNyYXRlKSBmbiB1cGRhdGVfYm9vbGVhbl9mbGFnX3ZhbHVlX2N4eCgKKyAgICBmaWxlOiAmbXV0IFt1OF0sCisgICAgb2Zmc2V0OiB1MzIsCisgICAgdmFsdWU6IGJvb2wsCispIC0+IGZmaTo6Qm9vbGVhbkZsYWdWYWx1ZVVwZGF0ZUNYWCB7CisgICAgbWF0Y2ggY3JhdGU6OmZsYWdfdmFsdWVfdXBkYXRlOjp1cGRhdGVfYm9vbGVhbl9mbGFnX3ZhbHVlKGZpbGUsIG9mZnNldCwgdmFsdWUpIHsKKyAgICAgICAgT2soaGVhZCkgPT4gZmZpOjpCb29sZWFuRmxhZ1ZhbHVlVXBkYXRlQ1hYIHsKKyAgICAgICAgICAgIHVwZGF0ZV9zdWNjZXNzOiB0cnVlLAorICAgICAgICAgICAgb2Zmc2V0OiBoZWFkLAorICAgICAgICAgICAgZXJyb3JfbWVzc2FnZTogU3RyaW5nOjpmcm9tKCIiKSwKKyAgICAgICAgfSwKKyAgICAgICAgRXJyKGVycm1zZykgPT4gZmZpOjpCb29sZWFuRmxhZ1ZhbHVlVXBkYXRlQ1hYIHsKKyAgICAgICAgICAgIHVwZGF0ZV9zdWNjZXNzOiBmYWxzZSwKKyAgICAgICAgICAgIG9mZnNldDogdXNpemU6Ok1BWCwKKyAgICAgICAgICAgIGVycm9yX21lc3NhZ2U6IGZvcm1hdCEoIns6P30iLCBlcnJtc2cpLAorICAgICAgICB9LAorICAgIH0KK30KKworcHViKGNyYXRlKSBmbiB1cGRhdGVfZmxhZ19oYXNfc2VydmVyX292ZXJyaWRlX2N4eCgKKyAgICBmaWxlOiAmbXV0IFt1OF0sCisgICAgZmxhZ190eXBlOiB1MTYsCisgICAgb2Zmc2V0OiB1MzIsCisgICAgdmFsdWU6IGJvb2wsCispIC0+IGZmaTo6RmxhZ0hhc1NlcnZlck92ZXJyaWRlVXBkYXRlQ1hYIHsKKyAgICBtYXRjaCBGbGFnVmFsdWVUeXBlOjp0cnlfZnJvbShmbGFnX3R5cGUpIHsKKyAgICAgICAgT2sodmFsdWVfdHlwZSkgPT4geworICAgICAgICAgICAgbWF0Y2ggY3JhdGU6OmZsYWdfaW5mb191cGRhdGU6OnVwZGF0ZV9mbGFnX2hhc19zZXJ2ZXJfb3ZlcnJpZGUoCisgICAgICAgICAgICAgICAgZmlsZSwgdmFsdWVfdHlwZSwgb2Zmc2V0LCB2YWx1ZSwKKyAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIE9rKGhlYWQpID0+IGZmaTo6RmxhZ0hhc1NlcnZlck92ZXJyaWRlVXBkYXRlQ1hYIHsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlX3N1Y2Nlc3M6IHRydWUsCisgICAgICAgICAgICAgICAgICAgIG9mZnNldDogaGVhZCwKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZTogU3RyaW5nOjpmcm9tKCIiKSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIEVycihlcnJtc2cpID0+IGZmaTo6RmxhZ0hhc1NlcnZlck92ZXJyaWRlVXBkYXRlQ1hYIHsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlX3N1Y2Nlc3M6IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHVzaXplOjpNQVgsCisgICAgICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2U6IGZvcm1hdCEoIns6P30iLCBlcnJtc2cpLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRXJyKGVycm1zZykgPT4gZmZpOjpGbGFnSGFzU2VydmVyT3ZlcnJpZGVVcGRhdGVDWFggeworICAgICAgICAgICAgdXBkYXRlX3N1Y2Nlc3M6IGZhbHNlLAorICAgICAgICAgICAgb2Zmc2V0OiB1c2l6ZTo6TUFYLAorICAgICAgICAgICAgZXJyb3JfbWVzc2FnZTogZm9ybWF0ISgiezo/fSIsIGVycm1zZyksCisgICAgICAgIH0sCisgICAgfQorfQorCitwdWIoY3JhdGUpIGZuIHVwZGF0ZV9mbGFnX2hhc19sb2NhbF9vdmVycmlkZV9jeHgoCisgICAgZmlsZTogJm11dCBbdThdLAorICAgIGZsYWdfdHlwZTogdTE2LAorICAgIG9mZnNldDogdTMyLAorICAgIHZhbHVlOiBib29sLAorKSAtPiBmZmk6OkZsYWdIYXNMb2NhbE92ZXJyaWRlVXBkYXRlQ1hYIHsKKyAgICBtYXRjaCBGbGFnVmFsdWVUeXBlOjp0cnlfZnJvbShmbGFnX3R5cGUpIHsKKyAgICAgICAgT2sodmFsdWVfdHlwZSkgPT4geworICAgICAgICAgICAgbWF0Y2ggY3JhdGU6OmZsYWdfaW5mb191cGRhdGU6OnVwZGF0ZV9mbGFnX2hhc19sb2NhbF9vdmVycmlkZSgKKyAgICAgICAgICAgICAgICBmaWxlLCB2YWx1ZV90eXBlLCBvZmZzZXQsIHZhbHVlLAorICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgT2soaGVhZCkgPT4gZmZpOjpGbGFnSGFzTG9jYWxPdmVycmlkZVVwZGF0ZUNYWCB7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9zdWNjZXNzOiB0cnVlLAorICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IGhlYWQsCisgICAgICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2U6IFN0cmluZzo6ZnJvbSgiIiksCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBFcnIoZXJybXNnKSA9PiBmZmk6OkZsYWdIYXNMb2NhbE92ZXJyaWRlVXBkYXRlQ1hYIHsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlX3N1Y2Nlc3M6IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHVzaXplOjpNQVgsCisgICAgICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2U6IGZvcm1hdCEoIns6P30iLCBlcnJtc2cpLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRXJyKGVycm1zZykgPT4gZmZpOjpGbGFnSGFzTG9jYWxPdmVycmlkZVVwZGF0ZUNYWCB7CisgICAgICAgICAgICB1cGRhdGVfc3VjY2VzczogZmFsc2UsCisgICAgICAgICAgICBvZmZzZXQ6IHVzaXplOjpNQVgsCisgICAgICAgICAgICBlcnJvcl9tZXNzYWdlOiBmb3JtYXQhKCJ7Oj99IiwgZXJybXNnKSwKKyAgICAgICAgfSwKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIGNyYXRlOjp0ZXN0X3V0aWxzOjpjb3B5X3RvX3RlbXBfZmlsZTsKKyAgICB1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OkZsYWdJbmZvQml0OworICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGk6OmZsYWdfaW5mb19xdWVyeTo6ZmluZF9mbGFnX2F0dHJpYnV0ZTsKKyAgICB1c2UgYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpOjpmbGFnX3ZhbHVlX3F1ZXJ5OjpmaW5kX2Jvb2xlYW5fZmxhZ192YWx1ZTsKKyAgICB1c2Ugc3RkOjpmczo6RmlsZTsKKyAgICB1c2Ugc3RkOjppbzo6UmVhZDsKKworICAgIGZuIGdldF9ib29sZWFuX2ZsYWdfdmFsdWVfYXRfb2Zmc2V0KGZpbGU6ICZzdHIsIG9mZnNldDogdTMyKSAtPiBib29sIHsKKyAgICAgICAgbGV0IG11dCBmID0gRmlsZTo6b3BlbigmZmlsZSkudW53cmFwKCk7CisgICAgICAgIGxldCBtdXQgYnl0ZXMgPSBWZWM6Om5ldygpOworICAgICAgICBmLnJlYWRfdG9fZW5kKCZtdXQgYnl0ZXMpLnVud3JhcCgpOworICAgICAgICBmaW5kX2Jvb2xlYW5fZmxhZ192YWx1ZSgmYnl0ZXMsIG9mZnNldCkudW53cmFwKCkKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9zZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCkgeworICAgICAgICBsZXQgZmxhZ192YWx1ZV9maWxlID0gY29weV90b190ZW1wX2ZpbGUoIi4vdGVzdHMvZmxhZy52YWwiLCBmYWxzZSkudW53cmFwKCk7CisgICAgICAgIGxldCBmbGFnX3ZhbHVlX3BhdGggPSBmbGFnX3ZhbHVlX2ZpbGUucGF0aCgpLmRpc3BsYXkoKS50b19zdHJpbmcoKTsKKworICAgICAgICAvLyBTQUZFVFk6CisgICAgICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBndWFyYW50ZWVkIGFzIG9ubHkgdGhpcyBzaW5nbGUgdGhyZWFkZWQgdGVzdCBwcm9jZXNzIHdpbGwKKyAgICAgICAgLy8gd3JpdGUgdG8gdGhpcyBmaWxlCisgICAgICAgIHVuc2FmZSB7CisgICAgICAgICAgICBsZXQgbXV0IGZpbGUgPSBtYXBfbXV0YWJsZV9zdG9yYWdlX2ZpbGUoJmZsYWdfdmFsdWVfcGF0aCkudW53cmFwKCk7CisgICAgICAgICAgICBmb3IgaSBpbiAwLi44IHsKKyAgICAgICAgICAgICAgICBzZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZtdXQgZmlsZSwgaSwgdHJ1ZSkudW53cmFwKCk7CisgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZV9hdF9vZmZzZXQoJmZsYWdfdmFsdWVfcGF0aCwgaSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0X2VxISh2YWx1ZSwgdHJ1ZSk7CisKKyAgICAgICAgICAgICAgICBzZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZtdXQgZmlsZSwgaSwgZmFsc2UpLnVud3JhcCgpOworICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGdldF9ib29sZWFuX2ZsYWdfdmFsdWVfYXRfb2Zmc2V0KCZmbGFnX3ZhbHVlX3BhdGgsIGkpOworICAgICAgICAgICAgICAgIGFzc2VydF9lcSEodmFsdWUsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIGdldF9mbGFnX2F0dHJpYnV0ZV9hdF9vZmZzZXQoZmlsZTogJnN0ciwgdmFsdWVfdHlwZTogRmxhZ1ZhbHVlVHlwZSwgb2Zmc2V0OiB1MzIpIC0+IHU4IHsKKyAgICAgICAgbGV0IG11dCBmID0gRmlsZTo6b3BlbigmZmlsZSkudW53cmFwKCk7CisgICAgICAgIGxldCBtdXQgYnl0ZXMgPSBWZWM6Om5ldygpOworICAgICAgICBmLnJlYWRfdG9fZW5kKCZtdXQgYnl0ZXMpLnVud3JhcCgpOworICAgICAgICBmaW5kX2ZsYWdfYXR0cmlidXRlKCZieXRlcywgdmFsdWVfdHlwZSwgb2Zmc2V0KS51bndyYXAoKQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3NldF9mbGFnX2hhc19zZXJ2ZXJfb3ZlcnJpZGUoKSB7CisgICAgICAgIGxldCBmbGFnX2luZm9fZmlsZSA9IGNvcHlfdG9fdGVtcF9maWxlKCIuL3Rlc3RzL2ZsYWcuaW5mbyIsIGZhbHNlKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGZsYWdfaW5mb19wYXRoID0gZmxhZ19pbmZvX2ZpbGUucGF0aCgpLmRpc3BsYXkoKS50b19zdHJpbmcoKTsKKworICAgICAgICAvLyBTQUZFVFk6CisgICAgICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBndWFyYW50ZWVkIGFzIG9ubHkgdGhpcyBzaW5nbGUgdGhyZWFkZWQgdGVzdCBwcm9jZXNzIHdpbGwKKyAgICAgICAgLy8gd3JpdGUgdG8gdGhpcyBmaWxlCisgICAgICAgIHVuc2FmZSB7CisgICAgICAgICAgICBsZXQgbXV0IGZpbGUgPSBtYXBfbXV0YWJsZV9zdG9yYWdlX2ZpbGUoJmZsYWdfaW5mb19wYXRoKS51bndyYXAoKTsKKyAgICAgICAgICAgIGZvciBpIGluIDAuLjggeworICAgICAgICAgICAgICAgIHNldF9mbGFnX2hhc19zZXJ2ZXJfb3ZlcnJpZGUoJm11dCBmaWxlLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBpLCB0cnVlKS51bndyYXAoKTsKKyAgICAgICAgICAgICAgICBsZXQgYXR0cmlidXRlID0KKyAgICAgICAgICAgICAgICAgICAgZ2V0X2ZsYWdfYXR0cmlidXRlX2F0X29mZnNldCgmZmxhZ19pbmZvX3BhdGgsIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIGkpOworICAgICAgICAgICAgICAgIGFzc2VydCEoKGF0dHJpYnV0ZSAmIChGbGFnSW5mb0JpdDo6SGFzU2VydmVyT3ZlcnJpZGUgYXMgdTgpKSAhPSAwKTsKKyAgICAgICAgICAgICAgICBzZXRfZmxhZ19oYXNfc2VydmVyX292ZXJyaWRlKCZtdXQgZmlsZSwgRmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgaSwgZmFsc2UpLnVud3JhcCgpOworICAgICAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPQorICAgICAgICAgICAgICAgICAgICBnZXRfZmxhZ19hdHRyaWJ1dGVfYXRfb2Zmc2V0KCZmbGFnX2luZm9fcGF0aCwgRmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgaSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0ISgoYXR0cmlidXRlICYgKEZsYWdJbmZvQml0OjpIYXNTZXJ2ZXJPdmVycmlkZSBhcyB1OCkpID09IDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3Rfc2V0X2ZsYWdfaGFzX2xvY2FsX292ZXJyaWRlKCkgeworICAgICAgICBsZXQgZmxhZ19pbmZvX2ZpbGUgPSBjb3B5X3RvX3RlbXBfZmlsZSgiLi90ZXN0cy9mbGFnLmluZm8iLCBmYWxzZSkudW53cmFwKCk7CisgICAgICAgIGxldCBmbGFnX2luZm9fcGF0aCA9IGZsYWdfaW5mb19maWxlLnBhdGgoKS5kaXNwbGF5KCkudG9fc3RyaW5nKCk7CisKKyAgICAgICAgLy8gU0FGRVRZOgorICAgICAgICAvLyBUaGUgc2FmZXR5IGhlcmUgaXMgZ3VhcmFudGVlZCBhcyBvbmx5IHRoaXMgc2luZ2xlIHRocmVhZGVkIHRlc3QgcHJvY2VzcyB3aWxsCisgICAgICAgIC8vIHdyaXRlIHRvIHRoaXMgZmlsZQorICAgICAgICB1bnNhZmUgeworICAgICAgICAgICAgbGV0IG11dCBmaWxlID0gbWFwX211dGFibGVfc3RvcmFnZV9maWxlKCZmbGFnX2luZm9fcGF0aCkudW53cmFwKCk7CisgICAgICAgICAgICBmb3IgaSBpbiAwLi44IHsKKyAgICAgICAgICAgICAgICBzZXRfZmxhZ19oYXNfbG9jYWxfb3ZlcnJpZGUoJm11dCBmaWxlLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBpLCB0cnVlKS51bndyYXAoKTsKKyAgICAgICAgICAgICAgICBsZXQgYXR0cmlidXRlID0KKyAgICAgICAgICAgICAgICAgICAgZ2V0X2ZsYWdfYXR0cmlidXRlX2F0X29mZnNldCgmZmxhZ19pbmZvX3BhdGgsIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIGkpOworICAgICAgICAgICAgICAgIGFzc2VydCEoKGF0dHJpYnV0ZSAmIChGbGFnSW5mb0JpdDo6SGFzTG9jYWxPdmVycmlkZSBhcyB1OCkpICE9IDApOworICAgICAgICAgICAgICAgIHNldF9mbGFnX2hhc19sb2NhbF9vdmVycmlkZSgmbXV0IGZpbGUsIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIGksIGZhbHNlKS51bndyYXAoKTsKKyAgICAgICAgICAgICAgICBsZXQgYXR0cmlidXRlID0KKyAgICAgICAgICAgICAgICAgICAgZ2V0X2ZsYWdfYXR0cmlidXRlX2F0X29mZnNldCgmZmxhZ19pbmZvX3BhdGgsIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIGkpOworICAgICAgICAgICAgICAgIGFzc2VydCEoKGF0dHJpYnV0ZSAmIChGbGFnSW5mb0JpdDo6SGFzTG9jYWxPdmVycmlkZSBhcyB1OCkpID09IDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3NyYy9tYXBwZWRfZmlsZS5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvbWFwcGVkX2ZpbGUucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAxZDZiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvbWFwcGVkX2ZpbGUucnMKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2UgYW55aG93Ojphbnlob3c7Cit1c2UgbWVtbWFwMjo6TW1hcE11dDsKK3VzZSBzdGQ6OmZzOjp7c2VsZiwgT3Blbk9wdGlvbnN9OworCit1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OkFjb25maWdTdG9yYWdlRXJyb3I6OntzZWxmLCBGaWxlUmVhZEZhaWwsIE1hcEZpbGVGYWlsfTsKKworLy8vIEdldCB0aGUgbXV0YWJsZSBtZW1vcnkgbWFwcGluZyBvZiBhIHN0b3JhZ2UgZmlsZQorLy8vCisvLy8gIyBTYWZldHkKKy8vLworLy8vIFRoZSBtZW1vcnkgbWFwcGVkIGZpbGUgbWF5IGhhdmUgdW5kZWZpbmVkIGJlaGF2aW9yIGlmIHRoZXJlIGFyZSB3cml0ZXMgdG8gdGhpcworLy8vIGZpbGUgbm90IHRocnUgdGhpcyBtZW1vcnkgbWFwcGVkIGZpbGUgb3IgdGhlcmUgYXJlIGNvbmN1cnJlbnQgd3JpdGVzIHRvIHRoaXMKKy8vLyBtZW1vcnkgbWFwcGVkIGZpbGUuIEVuc3VyZSBhbGwgd3JpdGVzIHRvIHRoZSB1bmRlcmx5aW5nIGZpbGUgYXJlIHRocnUgdGhpcyBtZW1vcnkKKy8vLyBtYXBwZWQgZmlsZSBhbmQgdGhlcmUgYXJlIG5vIGNvbmN1cnJlbnQgd3JpdGVzLgorcHViKGNyYXRlKSB1bnNhZmUgZm4gbWFwX2ZpbGUoZmlsZV9wYXRoOiAmc3RyKSAtPiBSZXN1bHQ8TW1hcE11dCwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIC8vIG1ha2Ugc3VyZSBmaWxlIGhhcyByZWFkIHdyaXRlIHBlcm1pc3Npb24KKyAgICBsZXQgcGVybXMgPSBmczo6bWV0YWRhdGEoZmlsZV9wYXRoKS51bndyYXAoKS5wZXJtaXNzaW9ucygpOworICAgIGlmIHBlcm1zLnJlYWRvbmx5KCkgeworICAgICAgICByZXR1cm4gRXJyKE1hcEZpbGVGYWlsKGFueWhvdyEoImZhaWwgdG8gbWFwIG5vbiByZWFkIHdyaXRlIHN0b3JhZ2UgZmlsZSB7fSIsIGZpbGVfcGF0aCkpKTsKKyAgICB9CisKKyAgICBsZXQgZmlsZSA9CisgICAgICAgIE9wZW5PcHRpb25zOjpuZXcoKS5yZWFkKHRydWUpLndyaXRlKHRydWUpLm9wZW4oZmlsZV9wYXRoKS5tYXBfZXJyKHxlcnJtc2d8IHsKKyAgICAgICAgICAgIEZpbGVSZWFkRmFpbChhbnlob3chKCJGYWlsZWQgdG8gb3BlbiBmaWxlIHt9OiB7fSIsIGZpbGVfcGF0aCwgZXJybXNnKSkKKyAgICAgICAgfSk/OworCisgICAgdW5zYWZlIHsKKyAgICAgICAgbGV0IG1hcHBlZF9maWxlID0gTW1hcE11dDo6bWFwX211dCgmZmlsZSkubWFwX2Vycih8ZXJybXNnfCB7CisgICAgICAgICAgICBNYXBGaWxlRmFpbChhbnlob3chKCJmYWlsIHRvIG1hcCBzdG9yYWdlIGZpbGUge306IHt9IiwgZmlsZV9wYXRoLCBlcnJtc2cpKQorICAgICAgICB9KT87CisgICAgICAgIE9rKG1hcHBlZF9maWxlKQorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKyAgICB1c2UgY3JhdGU6OnRlc3RfdXRpbHM6OmNvcHlfdG9fdGVtcF9maWxlOworICAgIHVzZSBzdGQ6OmlvOjpSZWFkOworCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfbWFwcGVkX2ZpbGVfY29udGVudHMoKSB7CisgICAgICAgIGxldCBtdXQgcndfdmFsX2ZpbGUgPSBjb3B5X3RvX3RlbXBfZmlsZSgiLi90ZXN0cy9mbGFnLnZhbCIsIGZhbHNlKS51bndyYXAoKTsKKyAgICAgICAgbGV0IG11dCByd19pbmZvX2ZpbGUgPSBjb3B5X3RvX3RlbXBfZmlsZSgiLi90ZXN0cy9mbGFnLmluZm8iLCBmYWxzZSkudW53cmFwKCk7CisgICAgICAgIGxldCBmbGFnX3ZhbCA9IHJ3X3ZhbF9maWxlLnBhdGgoKS5kaXNwbGF5KCkudG9fc3RyaW5nKCk7CisgICAgICAgIGxldCBmbGFnX2luZm8gPSByd19pbmZvX2ZpbGUucGF0aCgpLmRpc3BsYXkoKS50b19zdHJpbmcoKTsKKworICAgICAgICBsZXQgbXV0IGNvbnRlbnQgPSBWZWM6Om5ldygpOworICAgICAgICByd192YWxfZmlsZS5yZWFkX3RvX2VuZCgmbXV0IGNvbnRlbnQpLnVud3JhcCgpOworCisgICAgICAgIC8vIFNBRkVUWToKKyAgICAgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGd1YXJhbnRlZWQgaGVyZSBhcyBubyB3cml0ZXMgaGFwcGVucyB0byB0aGlzIHRlbXAgZmlsZQorICAgICAgICB1bnNhZmUgeworICAgICAgICAgICAgbGV0IG1tYXBlZF9maWxlID0gbWFwX2ZpbGUoJmZsYWdfdmFsKS51bndyYXAoKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEobW1hcGVkX2ZpbGVbLi5dLCBjb250ZW50Wy4uXSk7CisgICAgICAgIH0KKworICAgICAgICBsZXQgbXV0IGNvbnRlbnQgPSBWZWM6Om5ldygpOworICAgICAgICByd19pbmZvX2ZpbGUucmVhZF90b19lbmQoJm11dCBjb250ZW50KS51bndyYXAoKTsKKworICAgICAgICAvLyBTQUZFVFk6CisgICAgICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBndWFyYW50ZWVkIGhlcmUgYXMgbm8gd3JpdGVzIGhhcHBlbnMgdG8gdGhpcyB0ZW1wIGZpbGUKKyAgICAgICAgdW5zYWZlIHsKKyAgICAgICAgICAgIGxldCBtbWFwZWRfZmlsZSA9IG1hcF9maWxlKCZmbGFnX2luZm8pLnVud3JhcCgpOworICAgICAgICAgICAgYXNzZXJ0X2VxIShtbWFwZWRfZmlsZVsuLl0sIGNvbnRlbnRbLi5dKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X21hcHBlZF9yZWFkX29ubHlfZmlsZSgpIHsKKyAgICAgICAgbGV0IHJvX3ZhbF9maWxlID0gY29weV90b190ZW1wX2ZpbGUoIi4vdGVzdHMvZmxhZy52YWwiLCB0cnVlKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGZsYWdfdmFsID0gcm9fdmFsX2ZpbGUucGF0aCgpLmRpc3BsYXkoKS50b19zdHJpbmcoKTsKKworICAgICAgICAvLyBTQUZFVFk6CisgICAgICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBndWFyYW50ZWVkIGhlcmUgYXMgbm8gd3JpdGVzIGhhcHBlbnMgdG8gdGhpcyB0ZW1wIGZpbGUKKyAgICAgICAgdW5zYWZlIHsKKyAgICAgICAgICAgIGxldCBlcnJvciA9IG1hcF9maWxlKCZmbGFnX3ZhbCkudW53cmFwX2VycigpOworICAgICAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLAorICAgICAgICAgICAgICAgIGZvcm1hdCEoIk1hcEZpbGVGYWlsKGZhaWwgdG8gbWFwIG5vbiByZWFkIHdyaXRlIHN0b3JhZ2UgZmlsZSB7fSkiLCBmbGFnX3ZhbCkKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvc3JjL3Rlc3RfdXRpbHMucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvc3JjL3Rlc3RfdXRpbHMucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZlMmUyMgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvdGVzdF91dGlscy5ycwpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNlIGFueWhvdzo6UmVzdWx0OwordXNlIHN0ZDo6ZnM7Cit1c2UgdGVtcGZpbGU6Ok5hbWVkVGVtcEZpbGU7CisKKy8vLyBDcmVhdGUgdGVtcCBmaWxlIGNvcHkKK3B1YihjcmF0ZSkgZm4gY29weV90b190ZW1wX2ZpbGUoc291cmNlX2ZpbGU6ICZzdHIsIHJlYWRfb25seTogYm9vbCkgLT4gUmVzdWx0PE5hbWVkVGVtcEZpbGU+IHsKKyAgICBsZXQgZmlsZSA9IE5hbWVkVGVtcEZpbGU6Om5ldygpPzsKKyAgICBmczo6Y29weShzb3VyY2VfZmlsZSwgZmlsZS5wYXRoKCkpPzsKKyAgICBpZiByZWFkX29ubHkgeworICAgICAgICBsZXQgZmlsZV9uYW1lID0gZmlsZS5wYXRoKCkuZGlzcGxheSgpLnRvX3N0cmluZygpOworICAgICAgICBsZXQgbXV0IHBlcm1zID0gZnM6Om1ldGFkYXRhKGZpbGVfbmFtZSkudW53cmFwKCkucGVybWlzc2lvbnMoKTsKKyAgICAgICAgcGVybXMuc2V0X3JlYWRvbmx5KHRydWUpOworICAgICAgICBmczo6c2V0X3Blcm1pc3Npb25zKGZpbGUucGF0aCgpLCBwZXJtcy5jbG9uZSgpKS51bndyYXAoKTsKKyAgICB9CisgICAgT2soZmlsZSkKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS90ZXN0cy9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUwOGRhYwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDcgQEAKK3J1c3RfdGVzdCB7CisgICAgbmFtZTogImFjb25maWdfc3RvcmFnZV93cml0ZV9hcGkudGVzdC5ydXN0IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJzdG9yYWdlX3dyaXRlX2FwaV90ZXN0LnJzIiwKKyAgICBdLAorICAgIHJ1c3RsaWJzOiBbCisgICAgICAgICJsaWJhbnlob3ciLAorICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX2ZpbGUiLAorICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpIiwKKyAgICAgICAgImxpYmFjb25maWdfc3RvcmFnZV93cml0ZV9hcGkiLAorICAgICAgICAibGlicHJvdG9idWYiLAorICAgICAgICAibGlidGVtcGZpbGUiLAorICAgIF0sCisgICAgZGF0YTogWworICAgICAgICAiZmxhZy52YWwiLAorICAgICAgICAiZmxhZy5pbmZvIiwKKyAgICBdLAorICAgIHRlc3Rfc3VpdGVzOiBbImdlbmVyYWwtdGVzdHMiXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogImFjb25maWdfc3RvcmFnZV93cml0ZV9hcGkudGVzdC5jcHAiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInN0b3JhZ2Vfd3JpdGVfYXBpX3Rlc3QuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJnbW9jayIsCisgICAgICAgICJsaWJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlfY2MiLAorICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaV9jYyIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKyAgICBkYXRhOiBbCisgICAgICAgICJmbGFnLnZhbCIsCisgICAgICAgICJmbGFnLmluZm8iLAorICAgIF0sCisgICAgdGVzdF9zdWl0ZXM6IFsKKyAgICAgICAgImRldmljZS10ZXN0cyIsCisgICAgICAgICJnZW5lcmFsLXRlc3RzIiwKKyAgICBdLAorICAgIGdlbmVyYXRlZF9oZWFkZXJzOiBbCisgICAgICAgICJjeHgtYnJpZGdlLWhlYWRlciIsCisgICAgICAgICJsaWJjeHhfYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpX2JyaWRnZV9oZWFkZXIiLAorICAgIF0sCisgICAgZ2VuZXJhdGVkX3NvdXJjZXM6IFsibGliY3h4X2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9icmlkZ2VfY29kZSJdLAorICAgIHdob2xlX3N0YXRpY19saWJzOiBbImxpYmFjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9jeHhfYnJpZGdlIl0sCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvdGVzdHMvZmxhZy5pbmZvIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3Rlc3RzL2ZsYWcuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjIzZWRmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3Rlc3RzL2ZsYWcuaW5mbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvdGVzdHMvZmxhZy52YWwgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvdGVzdHMvZmxhZy52YWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyMDNkNAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS90ZXN0cy9mbGFnLnZhbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvdGVzdHMvc3RvcmFnZV93cml0ZV9hcGlfdGVzdC5jcHAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvdGVzdHMvc3RvcmFnZV93cml0ZV9hcGlfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMzZjVhMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS90ZXN0cy9zdG9yYWdlX3dyaXRlX2FwaV90ZXN0LmNwcApAQCAtMCwwICsxLDIyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNzdGRpbz4KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSAiYWNvbmZpZ19zdG9yYWdlL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS5ocHAiCisjaW5jbHVkZSAiYWNvbmZpZ19zdG9yYWdlL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkuaHBwIgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcmVzdWx0Lmg+CisKKyNpbmNsdWRlICJydXN0L2N4eC5oIgorI2luY2x1ZGUgImFjb25maWdfc3RvcmFnZS9saWIucnMuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmJhc2U7CisKK25hbWVzcGFjZSBhcGkgPSBhY29uZmlnX3N0b3JhZ2U7CituYW1lc3BhY2UgcHJpdmF0ZV9hcGkgPSBhY29uZmlnX3N0b3JhZ2U6OnByaXZhdGVfaW50ZXJuYWxfYXBpOworCitjbGFzcyBBY29uZmlnU3RvcmFnZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIFJlc3VsdDxzdGQ6OnN0cmluZz4gY29weV90b19yd190ZW1wX2ZpbGUoc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZV9maWxlKSB7CisgICAgYXV0byB0ZW1wX2ZpbGUgPSBzdGQ6OnN0cmluZyhzdGQ6OnRtcG5hbShudWxscHRyKSk7CisgICAgYXV0byBjb250ZW50ID0gc3RkOjpzdHJpbmcoKTsKKyAgICBpZiAoIVJlYWRGaWxlVG9TdHJpbmcoc291cmNlX2ZpbGUsICZjb250ZW50KSkgeworICAgICAgcmV0dXJuIEVycm9yKCkgPDwgImZhaWxlZCB0byByZWFkIGZpbGU6ICIgPDwgc291cmNlX2ZpbGU7CisgICAgfQorICAgIGlmICghV3JpdGVTdHJpbmdUb0ZpbGUoY29udGVudCwgdGVtcF9maWxlKSkgeworICAgICAgcmV0dXJuIEVycm9yKCkgPDwgImZhaWxlZCB0byBjb3B5IGZpbGU6ICIgPDwgc291cmNlX2ZpbGU7CisgICAgfQorICAgIGlmIChjaG1vZCh0ZW1wX2ZpbGUuY19zdHIoKSwKKyAgICAgICAgICAgICAgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RIIHwgU19JV1VTUiB8IFNfSVdHUlAgfCBTX0lXT1RIKSA9PSAtMSkgeworICAgICAgcmV0dXJuIEVycm9yKCkgPDwgImZhaWxlZCB0byBjaG1vZCI7CisgICAgfQorICAgIHJldHVybiB0ZW1wX2ZpbGU7CisgIH0KKworICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIGF1dG8gY29uc3QgdGVzdF9kaXIgPSBhbmRyb2lkOjpiYXNlOjpHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCk7CisgICAgZmxhZ192YWwgPSAqY29weV90b19yd190ZW1wX2ZpbGUodGVzdF9kaXIgKyAiL2ZsYWcudmFsIik7CisgICAgZmxhZ19pbmZvID0gKmNvcHlfdG9fcndfdGVtcF9maWxlKHRlc3RfZGlyICsgIi9mbGFnLmluZm8iKTsKKyAgfQorCisgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgc3RkOjpyZW1vdmUoZmxhZ192YWwuY19zdHIoKSk7CisgICAgc3RkOjpyZW1vdmUoZmxhZ19pbmZvLmNfc3RyKCkpOworICB9CisKKyAgc3RkOjpzdHJpbmcgZmxhZ192YWw7CisgIHN0ZDo6c3RyaW5nIGZsYWdfaW5mbzsKK307CisKKy8vLyBOZWdhdGl2ZSB0ZXN0IHRvIGxvY2sgZG93biB0aGUgZXJyb3Igd2hlbiBtYXBwaW5nIGEgbm9uIHdyaXRlYWJsZSBzdG9yYWdlIGZpbGUKK1RFU1RfRihBY29uZmlnU3RvcmFnZVRlc3QsIHRlc3Rfbm9uX3dyaXRhYmxlX3N0b3JhZ2VfZmlsZV9tYXBwaW5nKSB7CisgIEFTU0VSVF9UUlVFKGNobW9kKGZsYWdfdmFsLmNfc3RyKCksIFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCkgIT0gLTEpOworICBhdXRvIG1hcHBlZF9maWxlX3Jlc3VsdCA9IGFwaTo6bWFwX211dGFibGVfc3RvcmFnZV9maWxlKGZsYWdfdmFsKTsKKyAgQVNTRVJUX0ZBTFNFKG1hcHBlZF9maWxlX3Jlc3VsdC5vaygpKTsKKyAgYXV0byBpdCA9IG1hcHBlZF9maWxlX3Jlc3VsdC5lcnJvcigpLm1lc3NhZ2UoKS5maW5kKCJjYW5ub3QgbWFwIG5vbndyaXRlYWJsZSBmaWxlIik7CisgIEFTU0VSVF9UUlVFKGl0ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSA8PCBtYXBwZWRfZmlsZV9yZXN1bHQuZXJyb3IoKS5tZXNzYWdlKCk7Cit9CisKKy8vLyBUZXN0IHRvIGxvY2sgZG93biBzdG9yYWdlIGZsYWcgdmFsdWUgdXBkYXRlIGFwaQorVEVTVF9GKEFjb25maWdTdG9yYWdlVGVzdCwgdGVzdF9ib29sZWFuX2ZsYWdfdmFsdWVfdXBkYXRlKSB7CisgIGF1dG8gbWFwcGVkX2ZpbGVfcmVzdWx0ID0gYXBpOjptYXBfbXV0YWJsZV9zdG9yYWdlX2ZpbGUoZmxhZ192YWwpOworICBBU1NFUlRfVFJVRShtYXBwZWRfZmlsZV9yZXN1bHQub2soKSk7CisgIGF1dG8gbWFwcGVkX2ZpbGUgPSBzdGQ6OnVuaXF1ZV9wdHI8YXBpOjpNdXRhYmxlTWFwcGVkU3RvcmFnZUZpbGU+KCptYXBwZWRfZmlsZV9yZXN1bHQpOworCisgIGZvciAoaW50IG9mZnNldCA9IDA7IG9mZnNldCA8IDg7ICsrb2Zmc2V0KSB7CisgICAgYXV0byB1cGRhdGVfcmVzdWx0ID0gYXBpOjpzZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCptYXBwZWRfZmlsZSwgb2Zmc2V0LCB0cnVlKTsKKyAgICBBU1NFUlRfVFJVRSh1cGRhdGVfcmVzdWx0Lm9rKCkpOworICAgIGF1dG8gdmFsdWUgPSBhcGk6OmdldF9ib29sZWFuX2ZsYWdfdmFsdWUoKm1hcHBlZF9maWxlLCBvZmZzZXQpOworICAgIEFTU0VSVF9UUlVFKHZhbHVlLm9rKCkpOworICAgIEFTU0VSVF9UUlVFKCp2YWx1ZSk7CisgIH0KKworICAvLyBsb2FkIHRoZSBmaWxlIG9uIGRpc2sgYW5kIGNoZWNrIGhhcyBiZWVuIHVwZGF0ZWQKKyAgc3RkOjppZnN0cmVhbSBmaWxlKGZsYWdfdmFsLCBzdGQ6Omlvczo6YmluYXJ5IHwgc3RkOjppb3M6OmF0ZSk7CisgIHN0ZDo6c3RyZWFtc2l6ZSBzaXplID0gZmlsZS50ZWxsZygpOworICBmaWxlLnNlZWtnKDAsIHN0ZDo6aW9zOjpiZWcpOworCisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZmZlcihzaXplKTsKKyAgZmlsZS5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihidWZmZXIuZGF0YSgpKSwgc2l6ZSk7CisKKyAgYXV0byBjb250ZW50ID0gcnVzdDo6U2xpY2U8Y29uc3QgdWludDhfdD4oCisgICAgICBidWZmZXIuZGF0YSgpLCBtYXBwZWRfZmlsZS0+ZmlsZV9zaXplKTsKKworICBmb3IgKGludCBvZmZzZXQgPSAwOyBvZmZzZXQgPCA4OyArK29mZnNldCkgeworICAgIGF1dG8gdmFsdWVfY3h4ID0gZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZV9jeHgoY29udGVudCwgb2Zmc2V0KTsKKyAgICBBU1NFUlRfVFJVRSh2YWx1ZV9jeHgucXVlcnlfc3VjY2Vzcyk7CisgICAgQVNTRVJUX1RSVUUodmFsdWVfY3h4LmZsYWdfdmFsdWUpOworICB9Cit9CisKKy8vLyBOZWdhdGl2ZSB0ZXN0IHRvIGxvY2sgZG93biB0aGUgZXJyb3Igd2hlbiBxdWVyeWluZyBmbGFnIHZhbHVlIG91dCBvZiByYW5nZQorVEVTVF9GKEFjb25maWdTdG9yYWdlVGVzdCwgdGVzdF9pbnZhbGlkX2Jvb2xlYW5fZmxhZ192YWx1ZV91cGRhdGUpIHsKKyAgYXV0byBtYXBwZWRfZmlsZV9yZXN1bHQgPSBhcGk6Om1hcF9tdXRhYmxlX3N0b3JhZ2VfZmlsZShmbGFnX3ZhbCk7CisgIEFTU0VSVF9UUlVFKG1hcHBlZF9maWxlX3Jlc3VsdC5vaygpKTsKKyAgYXV0byBtYXBwZWRfZmlsZSA9IHN0ZDo6dW5pcXVlX3B0cjxhcGk6Ok11dGFibGVNYXBwZWRTdG9yYWdlRmlsZT4oKm1hcHBlZF9maWxlX3Jlc3VsdCk7CisgIGF1dG8gdXBkYXRlX3Jlc3VsdCA9IGFwaTo6c2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgqbWFwcGVkX2ZpbGUsIDgsIHRydWUpOworICBBU1NFUlRfRkFMU0UodXBkYXRlX3Jlc3VsdC5vaygpKTsKKyAgQVNTRVJUX0VRKHVwZGF0ZV9yZXN1bHQuZXJyb3IoKS5tZXNzYWdlKCksCisgICAgICAgICAgICBzdGQ6OnN0cmluZygiSW52YWxpZFN0b3JhZ2VGaWxlT2Zmc2V0KEZsYWcgdmFsdWUgb2Zmc2V0IGdvZXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGZpbGUuKSIpKTsKK30KKworLy8vIFRlc3QgdG8gbG9jayBkb3duIHN0b3JhZ2UgZmxhZyBoYXMgc2VydmVyIG92ZXJyaWRlIHVwZGF0ZSBhcGkKK1RFU1RfRihBY29uZmlnU3RvcmFnZVRlc3QsIHRlc3RfZmxhZ19oYXNfc2VydmVyX292ZXJyaWRlX3VwZGF0ZSkgeworICBhdXRvIG1hcHBlZF9maWxlX3Jlc3VsdCA9IGFwaTo6bWFwX211dGFibGVfc3RvcmFnZV9maWxlKGZsYWdfaW5mbyk7CisgIEFTU0VSVF9UUlVFKG1hcHBlZF9maWxlX3Jlc3VsdC5vaygpKTsKKyAgYXV0byBtYXBwZWRfZmlsZSA9IHN0ZDo6dW5pcXVlX3B0cjxhcGk6Ok11dGFibGVNYXBwZWRTdG9yYWdlRmlsZT4oKm1hcHBlZF9maWxlX3Jlc3VsdCk7CisKKyAgZm9yIChpbnQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgODsgKytvZmZzZXQpIHsKKyAgICBhdXRvIHVwZGF0ZV9yZXN1bHQgPSBhcGk6OnNldF9mbGFnX2hhc19zZXJ2ZXJfb3ZlcnJpZGUoCisgICAgICAgICptYXBwZWRfZmlsZSwgYXBpOjpGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBvZmZzZXQsIHRydWUpOworICAgIEFTU0VSVF9UUlVFKHVwZGF0ZV9yZXN1bHQub2soKSkgPDwgdXBkYXRlX3Jlc3VsdC5lcnJvcigpOworICAgIGF1dG8gYXR0cmlidXRlID0gYXBpOjpnZXRfZmxhZ19hdHRyaWJ1dGUoCisgICAgICAgICptYXBwZWRfZmlsZSwgYXBpOjpGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBvZmZzZXQpOworICAgIEFTU0VSVF9UUlVFKGF0dHJpYnV0ZS5vaygpKTsKKyAgICBBU1NFUlRfVFJVRSgqYXR0cmlidXRlICYgYXBpOjpGbGFnSW5mb0JpdDo6SGFzU2VydmVyT3ZlcnJpZGUpOworICB9CisKKyAgLy8gbG9hZCB0aGUgZmlsZSBvbiBkaXNrIGFuZCBjaGVjayBoYXMgYmVlbiB1cGRhdGVkCisgIHN0ZDo6aWZzdHJlYW0gZmlsZShmbGFnX2luZm8sIHN0ZDo6aW9zOjpiaW5hcnkgfCBzdGQ6Omlvczo6YXRlKTsKKyAgc3RkOjpzdHJlYW1zaXplIHNpemUgPSBmaWxlLnRlbGxnKCk7CisgIGZpbGUuc2Vla2coMCwgc3RkOjppb3M6OmJlZyk7CisKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmZmVyKHNpemUpOworICBmaWxlLnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KGJ1ZmZlci5kYXRhKCkpLCBzaXplKTsKKworICBhdXRvIGNvbnRlbnQgPSBydXN0OjpTbGljZTxjb25zdCB1aW50OF90PigKKyAgICAgIGJ1ZmZlci5kYXRhKCksIG1hcHBlZF9maWxlLT5maWxlX3NpemUpOworCisgIGZvciAoaW50IG9mZnNldCA9IDA7IG9mZnNldCA8IDg7ICsrb2Zmc2V0KSB7CisgICAgYXV0byBhdHRyaWJ1dGUgPSBnZXRfZmxhZ19hdHRyaWJ1dGVfY3h4KGNvbnRlbnQsIGFwaTo6RmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgb2Zmc2V0KTsKKyAgICBBU1NFUlRfVFJVRShhdHRyaWJ1dGUucXVlcnlfc3VjY2Vzcyk7CisgICAgQVNTRVJUX1RSVUUoYXR0cmlidXRlLmZsYWdfYXR0cmlidXRlICYgYXBpOjpGbGFnSW5mb0JpdDo6SGFzU2VydmVyT3ZlcnJpZGUpOworICB9CisKKyAgZm9yIChpbnQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgODsgKytvZmZzZXQpIHsKKyAgICBhdXRvIHVwZGF0ZV9yZXN1bHQgPSBhcGk6OnNldF9mbGFnX2hhc19zZXJ2ZXJfb3ZlcnJpZGUoCisgICAgICAgICptYXBwZWRfZmlsZSwgYXBpOjpGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBvZmZzZXQsIGZhbHNlKTsKKyAgICBBU1NFUlRfVFJVRSh1cGRhdGVfcmVzdWx0Lm9rKCkpOworICAgIGF1dG8gYXR0cmlidXRlID0gYXBpOjpnZXRfZmxhZ19hdHRyaWJ1dGUoCisgICAgICAgICptYXBwZWRfZmlsZSwgYXBpOjpGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBvZmZzZXQpOworICAgIEFTU0VSVF9UUlVFKGF0dHJpYnV0ZS5vaygpKTsKKyAgICBBU1NFUlRfRkFMU0UoKmF0dHJpYnV0ZSAmIGFwaTo6RmxhZ0luZm9CaXQ6Okhhc1NlcnZlck92ZXJyaWRlKTsKKyAgfQorCisgIHN0ZDo6aWZzdHJlYW0gZmlsZTIoZmxhZ19pbmZvLCBzdGQ6Omlvczo6YmluYXJ5KTsKKyAgYnVmZmVyLmNsZWFyKCk7CisgIGZpbGUyLnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KGJ1ZmZlci5kYXRhKCkpLCBzaXplKTsKKyAgZm9yIChpbnQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgODsgKytvZmZzZXQpIHsKKyAgICBhdXRvIGF0dHJpYnV0ZSA9IGdldF9mbGFnX2F0dHJpYnV0ZV9jeHgoY29udGVudCwgYXBpOjpGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBvZmZzZXQpOworICAgIEFTU0VSVF9UUlVFKGF0dHJpYnV0ZS5xdWVyeV9zdWNjZXNzKTsKKyAgICBBU1NFUlRfRkFMU0UoYXR0cmlidXRlLmZsYWdfYXR0cmlidXRlICYgYXBpOjpGbGFnSW5mb0JpdDo6SGFzU2VydmVyT3ZlcnJpZGUpOworICB9Cit9CisKKy8vLyBUZXN0IHRvIGxvY2sgZG93biBzdG9yYWdlIGZsYWcgaGFzIGxvY2FsIG92ZXJyaWRlIHVwZGF0ZSBhcGkKK1RFU1RfRihBY29uZmlnU3RvcmFnZVRlc3QsIHRlc3RfZmxhZ19oYXNfbG9jYWxfb3ZlcnJpZGVfdXBkYXRlKSB7CisgIGF1dG8gbWFwcGVkX2ZpbGVfcmVzdWx0ID0gYXBpOjptYXBfbXV0YWJsZV9zdG9yYWdlX2ZpbGUoZmxhZ19pbmZvKTsKKyAgQVNTRVJUX1RSVUUobWFwcGVkX2ZpbGVfcmVzdWx0Lm9rKCkpOworICBhdXRvIG1hcHBlZF9maWxlID0gc3RkOjp1bmlxdWVfcHRyPGFwaTo6TXV0YWJsZU1hcHBlZFN0b3JhZ2VGaWxlPigqbWFwcGVkX2ZpbGVfcmVzdWx0KTsKKworICBmb3IgKGludCBvZmZzZXQgPSAwOyBvZmZzZXQgPCA4OyArK29mZnNldCkgeworICAgIGF1dG8gdXBkYXRlX3Jlc3VsdCA9IGFwaTo6c2V0X2ZsYWdfaGFzX2xvY2FsX292ZXJyaWRlKAorICAgICAgICAqbWFwcGVkX2ZpbGUsIGFwaTo6RmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgb2Zmc2V0LCB0cnVlKTsKKyAgICBBU1NFUlRfVFJVRSh1cGRhdGVfcmVzdWx0Lm9rKCkpOworICAgIGF1dG8gYXR0cmlidXRlID0gYXBpOjpnZXRfZmxhZ19hdHRyaWJ1dGUoCisgICAgICAgICptYXBwZWRfZmlsZSwgYXBpOjpGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBvZmZzZXQpOworICAgIEFTU0VSVF9UUlVFKGF0dHJpYnV0ZS5vaygpKTsKKyAgICBBU1NFUlRfVFJVRSgqYXR0cmlidXRlICYgYXBpOjpGbGFnSW5mb0JpdDo6SGFzTG9jYWxPdmVycmlkZSk7CisgIH0KKworICAvLyBsb2FkIHRoZSBmaWxlIG9uIGRpc2sgYW5kIGNoZWNrIGhhcyBiZWVuIHVwZGF0ZWQKKyAgc3RkOjppZnN0cmVhbSBmaWxlKGZsYWdfaW5mbywgc3RkOjppb3M6OmJpbmFyeSB8IHN0ZDo6aW9zOjphdGUpOworICBzdGQ6OnN0cmVhbXNpemUgc2l6ZSA9IGZpbGUudGVsbGcoKTsKKyAgZmlsZS5zZWVrZygwLCBzdGQ6Omlvczo6YmVnKTsKKworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXIoc2l6ZSk7CisgIGZpbGUucmVhZChyZWludGVycHJldF9jYXN0PGNoYXIgKj4oYnVmZmVyLmRhdGEoKSksIHNpemUpOworCisgIGF1dG8gY29udGVudCA9IHJ1c3Q6OlNsaWNlPGNvbnN0IHVpbnQ4X3Q+KAorICAgICAgYnVmZmVyLmRhdGEoKSwgbWFwcGVkX2ZpbGUtPmZpbGVfc2l6ZSk7CisKKyAgZm9yIChpbnQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgODsgKytvZmZzZXQpIHsKKyAgICBhdXRvIGF0dHJpYnV0ZSA9IGdldF9mbGFnX2F0dHJpYnV0ZV9jeHgoY29udGVudCwgYXBpOjpGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBvZmZzZXQpOworICAgIEFTU0VSVF9UUlVFKGF0dHJpYnV0ZS5xdWVyeV9zdWNjZXNzKTsKKyAgICBBU1NFUlRfVFJVRShhdHRyaWJ1dGUuZmxhZ19hdHRyaWJ1dGUgJiBhcGk6OkZsYWdJbmZvQml0OjpIYXNMb2NhbE92ZXJyaWRlKTsKKyAgfQorCisgIGZvciAoaW50IG9mZnNldCA9IDA7IG9mZnNldCA8IDg7ICsrb2Zmc2V0KSB7CisgICAgYXV0byB1cGRhdGVfcmVzdWx0ID0gYXBpOjpzZXRfZmxhZ19oYXNfbG9jYWxfb3ZlcnJpZGUoCisgICAgICAgICptYXBwZWRfZmlsZSwgYXBpOjpGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBvZmZzZXQsIGZhbHNlKTsKKyAgICBBU1NFUlRfVFJVRSh1cGRhdGVfcmVzdWx0Lm9rKCkpOworICAgIGF1dG8gYXR0cmlidXRlID0gYXBpOjpnZXRfZmxhZ19hdHRyaWJ1dGUoCisgICAgICAgICptYXBwZWRfZmlsZSwgYXBpOjpGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBvZmZzZXQpOworICAgIEFTU0VSVF9UUlVFKGF0dHJpYnV0ZS5vaygpKTsKKyAgICBBU1NFUlRfRkFMU0UoKmF0dHJpYnV0ZSAmIGFwaTo6RmxhZ0luZm9CaXQ6Okhhc0xvY2FsT3ZlcnJpZGUpOworICB9CisKKyAgc3RkOjppZnN0cmVhbSBmaWxlMihmbGFnX2luZm8sIHN0ZDo6aW9zOjpiaW5hcnkpOworICBidWZmZXIuY2xlYXIoKTsKKyAgZmlsZTIucmVhZChyZWludGVycHJldF9jYXN0PGNoYXIgKj4oYnVmZmVyLmRhdGEoKSksIHNpemUpOworICBmb3IgKGludCBvZmZzZXQgPSAwOyBvZmZzZXQgPCA4OyArK29mZnNldCkgeworICAgIGF1dG8gYXR0cmlidXRlID0gZ2V0X2ZsYWdfYXR0cmlidXRlX2N4eChjb250ZW50LCBhcGk6OkZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIG9mZnNldCk7CisgICAgQVNTRVJUX1RSVUUoYXR0cmlidXRlLnF1ZXJ5X3N1Y2Nlc3MpOworICAgIEFTU0VSVF9GQUxTRShhdHRyaWJ1dGUuZmxhZ19hdHRyaWJ1dGUgJiBhcGk6OkZsYWdJbmZvQml0OjpIYXNMb2NhbE92ZXJyaWRlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3Rlc3RzL3N0b3JhZ2Vfd3JpdGVfYXBpX3Rlc3QucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvdGVzdHMvc3RvcmFnZV93cml0ZV9hcGlfdGVzdC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjc1NjlkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3Rlc3RzL3N0b3JhZ2Vfd3JpdGVfYXBpX3Rlc3QucnMKQEAgLTAsMCArMSwxMDIgQEAKKyNbY2ZnKG5vdChmZWF0dXJlID0gImNhcmdvIikpXQorbW9kIGFjb25maWdfc3RvcmFnZV93cml0ZV9hcGlfdGVzdCB7CisgICAgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7RmxhZ0luZm9CaXQsIEZsYWdWYWx1ZVR5cGV9OworICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGk6OmZsYWdfaW5mb19xdWVyeTo6ZmluZF9mbGFnX2F0dHJpYnV0ZTsKKyAgICB1c2UgYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpOjpmbGFnX3ZhbHVlX3F1ZXJ5OjpmaW5kX2Jvb2xlYW5fZmxhZ192YWx1ZTsKKyAgICB1c2UgYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaTo6eworICAgICAgICBtYXBfbXV0YWJsZV9zdG9yYWdlX2ZpbGUsIHNldF9ib29sZWFuX2ZsYWdfdmFsdWUsIHNldF9mbGFnX2hhc19sb2NhbF9vdmVycmlkZSwKKyAgICAgICAgc2V0X2ZsYWdfaGFzX3NlcnZlcl9vdmVycmlkZSwKKyAgICB9OworCisgICAgdXNlIHN0ZDo6ZnM6OntzZWxmLCBGaWxlfTsKKyAgICB1c2Ugc3RkOjppbzo6UmVhZDsKKyAgICB1c2UgdGVtcGZpbGU6Ok5hbWVkVGVtcEZpbGU7CisKKyAgICAvLy8gQ3JlYXRlIHRlbXAgZmlsZSBjb3B5CisgICAgZm4gY29weV90b190ZW1wX3J3X2ZpbGUoc291cmNlX2ZpbGU6ICZzdHIpIC0+IE5hbWVkVGVtcEZpbGUgeworICAgICAgICBsZXQgZmlsZSA9IE5hbWVkVGVtcEZpbGU6Om5ldygpLnVud3JhcCgpOworICAgICAgICBmczo6Y29weShzb3VyY2VfZmlsZSwgZmlsZS5wYXRoKCkpLnVud3JhcCgpOworICAgICAgICBmaWxlCisgICAgfQorCisgICAgLy8vIEdldCBib29sZWFuIGZsYWcgdmFsdWUgZnJvbSBvZmZzZXQKKyAgICBmbiBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlX2F0X29mZnNldChmaWxlOiAmc3RyLCBvZmZzZXQ6IHUzMikgLT4gYm9vbCB7CisgICAgICAgIGxldCBtdXQgZiA9IEZpbGU6Om9wZW4oZmlsZSkudW53cmFwKCk7CisgICAgICAgIGxldCBtdXQgYnl0ZXMgPSBWZWM6Om5ldygpOworICAgICAgICBmLnJlYWRfdG9fZW5kKCZtdXQgYnl0ZXMpLnVud3JhcCgpOworICAgICAgICBmaW5kX2Jvb2xlYW5fZmxhZ192YWx1ZSgmYnl0ZXMsIG9mZnNldCkudW53cmFwKCkKKyAgICB9CisKKyAgICAvLy8gR2V0IGZsYWcgYXR0cmlidXRlIGF0IG9mZnNldAorICAgIGZuIGdldF9mbGFnX2F0dHJpYnV0ZV9hdF9vZmZzZXQoZmlsZTogJnN0ciwgdmFsdWVfdHlwZTogRmxhZ1ZhbHVlVHlwZSwgb2Zmc2V0OiB1MzIpIC0+IHU4IHsKKyAgICAgICAgbGV0IG11dCBmID0gRmlsZTo6b3BlbihmaWxlKS51bndyYXAoKTsKKyAgICAgICAgbGV0IG11dCBieXRlcyA9IFZlYzo6bmV3KCk7CisgICAgICAgIGYucmVhZF90b19lbmQoJm11dCBieXRlcykudW53cmFwKCk7CisgICAgICAgIGZpbmRfZmxhZ19hdHRyaWJ1dGUoJmJ5dGVzLCB2YWx1ZV90eXBlLCBvZmZzZXQpLnVud3JhcCgpCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIC8vLyBUZXN0IHRvIGxvY2sgZG93biBmbGFnIHZhbHVlIHVwZGF0ZSBhcGkKKyAgICBmbiB0ZXN0X2Jvb2xlYW5fZmxhZ192YWx1ZV91cGRhdGUoKSB7CisgICAgICAgIGxldCBmbGFnX3ZhbHVlX2ZpbGUgPSBjb3B5X3RvX3RlbXBfcndfZmlsZSgiLi9mbGFnLnZhbCIpOworICAgICAgICBsZXQgZmxhZ192YWx1ZV9wYXRoID0gZmxhZ192YWx1ZV9maWxlLnBhdGgoKS5kaXNwbGF5KCkudG9fc3RyaW5nKCk7CisKKyAgICAgICAgLy8gU0FGRVRZOgorICAgICAgICAvLyBUaGUgc2FmZXR5IGhlcmUgaXMgZW5zdXJlZCBhcyBvbmx5IHRoaXMgc2luZ2xlIHRocmVhZGVkIHRlc3QgcHJvY2VzcyB3aWxsCisgICAgICAgIC8vIHdyaXRlIHRvIHRoaXMgZmlsZQorICAgICAgICBsZXQgbXV0IGZpbGUgPSB1bnNhZmUgeyBtYXBfbXV0YWJsZV9zdG9yYWdlX2ZpbGUoJmZsYWdfdmFsdWVfcGF0aCkudW53cmFwKCkgfTsKKyAgICAgICAgZm9yIGkgaW4gMC4uOCB7CisgICAgICAgICAgICBzZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZtdXQgZmlsZSwgaSwgdHJ1ZSkudW53cmFwKCk7CisgICAgICAgICAgICBsZXQgdmFsdWUgPSBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlX2F0X29mZnNldCgmZmxhZ192YWx1ZV9wYXRoLCBpKTsKKyAgICAgICAgICAgIGFzc2VydCEodmFsdWUpOworCisgICAgICAgICAgICBzZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZtdXQgZmlsZSwgaSwgZmFsc2UpLnVud3JhcCgpOworICAgICAgICAgICAgbGV0IHZhbHVlID0gZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZV9hdF9vZmZzZXQoJmZsYWdfdmFsdWVfcGF0aCwgaSk7CisgICAgICAgICAgICBhc3NlcnQhKCF2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8vIFRlc3QgdG8gbG9jayBkb3duIGZsYWcgaGFzIHNlcnZlciBvdmVycmlkZSB1cGRhdGUgYXBpCisgICAgZm4gdGVzdF9zZXRfZmxhZ19oYXNfc2VydmVyX292ZXJyaWRlKCkgeworICAgICAgICBsZXQgZmxhZ19pbmZvX2ZpbGUgPSBjb3B5X3RvX3RlbXBfcndfZmlsZSgiLi9mbGFnLmluZm8iKTsKKyAgICAgICAgbGV0IGZsYWdfaW5mb19wYXRoID0gZmxhZ19pbmZvX2ZpbGUucGF0aCgpLmRpc3BsYXkoKS50b19zdHJpbmcoKTsKKworICAgICAgICAvLyBTQUZFVFk6CisgICAgICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBlbnN1cmVkIGFzIG9ubHkgdGhpcyBzaW5nbGUgdGhyZWFkZWQgdGVzdCBwcm9jZXNzIHdpbGwKKyAgICAgICAgLy8gd3JpdGUgdG8gdGhpcyBmaWxlCisgICAgICAgIGxldCBtdXQgZmlsZSA9IHVuc2FmZSB7IG1hcF9tdXRhYmxlX3N0b3JhZ2VfZmlsZSgmZmxhZ19pbmZvX3BhdGgpLnVud3JhcCgpIH07CisgICAgICAgIGZvciBpIGluIDAuLjggeworICAgICAgICAgICAgc2V0X2ZsYWdfaGFzX3NlcnZlcl9vdmVycmlkZSgmbXV0IGZpbGUsIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIGksIHRydWUpLnVud3JhcCgpOworICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZSA9CisgICAgICAgICAgICAgICAgZ2V0X2ZsYWdfYXR0cmlidXRlX2F0X29mZnNldCgmZmxhZ19pbmZvX3BhdGgsIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIGkpOworICAgICAgICAgICAgYXNzZXJ0ISgoYXR0cmlidXRlICYgKEZsYWdJbmZvQml0OjpIYXNTZXJ2ZXJPdmVycmlkZSBhcyB1OCkpICE9IDApOworICAgICAgICAgICAgc2V0X2ZsYWdfaGFzX3NlcnZlcl9vdmVycmlkZSgmbXV0IGZpbGUsIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIGksIGZhbHNlKS51bndyYXAoKTsKKyAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPQorICAgICAgICAgICAgICAgIGdldF9mbGFnX2F0dHJpYnV0ZV9hdF9vZmZzZXQoJmZsYWdfaW5mb19wYXRoLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBpKTsKKyAgICAgICAgICAgIGFzc2VydCEoKGF0dHJpYnV0ZSAmIChGbGFnSW5mb0JpdDo6SGFzU2VydmVyT3ZlcnJpZGUgYXMgdTgpKSA9PSAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICAvLy8gVGVzdCB0byBsb2NrIGRvd24gZmxhZyBoYXMgbG9jYWwgb3ZlcnJpZGUgdXBkYXRlIGFwaQorICAgIGZuIHRlc3Rfc2V0X2ZsYWdfaGFzX2xvY2FsX292ZXJyaWRlKCkgeworICAgICAgICBsZXQgZmxhZ19pbmZvX2ZpbGUgPSBjb3B5X3RvX3RlbXBfcndfZmlsZSgiLi9mbGFnLmluZm8iKTsKKyAgICAgICAgbGV0IGZsYWdfaW5mb19wYXRoID0gZmxhZ19pbmZvX2ZpbGUucGF0aCgpLmRpc3BsYXkoKS50b19zdHJpbmcoKTsKKworICAgICAgICAvLyBTQUZFVFk6CisgICAgICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBlbnN1cmVkIGFzIG9ubHkgdGhpcyBzaW5nbGUgdGhyZWFkZWQgdGVzdCBwcm9jZXNzIHdpbGwKKyAgICAgICAgLy8gd3JpdGUgdG8gdGhpcyBmaWxlCisgICAgICAgIGxldCBtdXQgZmlsZSA9IHVuc2FmZSB7IG1hcF9tdXRhYmxlX3N0b3JhZ2VfZmlsZSgmZmxhZ19pbmZvX3BhdGgpLnVud3JhcCgpIH07CisgICAgICAgIGZvciBpIGluIDAuLjggeworICAgICAgICAgICAgc2V0X2ZsYWdfaGFzX2xvY2FsX292ZXJyaWRlKCZtdXQgZmlsZSwgRmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgaSwgdHJ1ZSkudW53cmFwKCk7CisgICAgICAgICAgICBsZXQgYXR0cmlidXRlID0KKyAgICAgICAgICAgICAgICBnZXRfZmxhZ19hdHRyaWJ1dGVfYXRfb2Zmc2V0KCZmbGFnX2luZm9fcGF0aCwgRmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgaSk7CisgICAgICAgICAgICBhc3NlcnQhKChhdHRyaWJ1dGUgJiAoRmxhZ0luZm9CaXQ6Okhhc0xvY2FsT3ZlcnJpZGUgYXMgdTgpKSAhPSAwKTsKKyAgICAgICAgICAgIHNldF9mbGFnX2hhc19sb2NhbF9vdmVycmlkZSgmbXV0IGZpbGUsIEZsYWdWYWx1ZVR5cGU6OkJvb2xlYW4sIGksIGZhbHNlKS51bndyYXAoKTsKKyAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPQorICAgICAgICAgICAgICAgIGdldF9mbGFnX2F0dHJpYnV0ZV9hdF9vZmZzZXQoJmZsYWdfaW5mb19wYXRoLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBpKTsKKyAgICAgICAgICAgIGFzc2VydCEoKGF0dHJpYnV0ZSAmIChGbGFnSW5mb0JpdDo6SGFzTG9jYWxPdmVycmlkZSBhcyB1OCkpID09IDApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hZmxhZ3MvQW5kcm9pZC5icCBiL3Rvb2xzL2Fjb25maWcvYWZsYWdzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQxOTc1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWZsYWdzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0MyBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbIkFuZHJvaWQtQXBhY2hlLTIuMCJdLAorfQorCitydXN0X2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiYWZsYWdzLmRlZmF1bHRzIiwKKyAgICBlZGl0aW9uOiAiMjAyMSIsCisgICAgY2xpcHB5X2xpbnRzOiAiYW5kcm9pZCIsCisgICAgbGludHM6ICJhbmRyb2lkIiwKKyAgICBzcmNzOiBbInNyYy9tYWluLnJzIl0sCisgICAgcnVzdGxpYnM6IFsKKyAgICAgICAgImxpYmFjb25maWdfZGV2aWNlX3BhdGhzIiwKKyAgICAgICAgImxpYmFjb25maWdfZmxhZ3MiLAorICAgICAgICAibGliYWNvbmZpZ19wcm90b3MiLAorICAgICAgICAibGliYWNvbmZpZ2RfcHJvdG9zX3J1c3QiLAorICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpIiwKKyAgICAgICAgImxpYmFjb25maWdfc3RvcmFnZV9maWxlIiwKKyAgICAgICAgImxpYmFueWhvdyIsCisgICAgICAgICJsaWJjbGFwIiwKKyAgICAgICAgImxpYm5peCIsCisgICAgICAgICJsaWJwcm90b2J1ZiIsCisgICAgICAgICJsaWJyZWdleCIsCisgICAgICAgIC8vIFRPRE86IGIvMzcxMDIxMTc0IHJlbW92ZSB0aGlzIGZha2UgZGVwZW5kZW5jeSBvbmNlIHdlIGZpbmQgYSBwcm9wZXIgc3RyYXRlZ3kgdG8KKyAgICAgICAgLy8gZGVhbCB3aXRoIHRlc3QgYWNvbmZpZyBsaWJzIGFyZSBub3QgcHJlc2VudCBpbiBzdG9yYWdlIGJlY2F1c2UgdGhleSBhcmUgbmV2ZXIgdXNlZAorICAgICAgICAvLyBieSB0aGUgYWN0dWFsIGJ1aWxkCisgICAgICAgICJsaWJhY29uZmlnX3Rlc3RfcnVzdF9saWJyYXJ5IiwKKyAgICBdLAorfQorCitydXN0X2JpbmFyeSB7CisgICAgbmFtZTogImFmbGFncyIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgZGVmYXVsdHM6IFsiYWZsYWdzLmRlZmF1bHRzIl0sCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgIF0sCit9CisKK3J1c3RfdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiYWZsYWdzLnRlc3QiLAorICAgIGRlZmF1bHRzOiBbImFmbGFncy5kZWZhdWx0cyJdLAorICAgIHRlc3Rfc3VpdGVzOiBbImdlbmVyYWwtdGVzdHMiXSwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWZsYWdzL0NhcmdvLnRvbWwgYi90b29scy9hY29uZmlnL2FmbGFncy9DYXJnby50b21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMWUyMzIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2FmbGFncy9DYXJnby50b21sCkBAIC0wLDAgKzEsMTggQEAKK1twYWNrYWdlXQorbmFtZSA9ICJhZmxhZ3MiCit2ZXJzaW9uID0gIjAuMS4wIgorZWRpdGlvbiA9ICIyMDIxIgorCitbZGVwZW5kZW5jaWVzXQorYW55aG93ID0gIjEuMC42OSIKK3Bhc3RlID0gIjEuMC4xMSIKK3Byb3RvYnVmID0gIjMuMi4wIgorcmVnZXggPSAiMS4xMC4zIgorYWNvbmZpZ19wcm90b3MgPSB7IHBhdGggPSAiLi4vYWNvbmZpZ19wcm90b3MiIH0KK2Fjb25maWdkX3Byb3RvcyA9IHsgdmVyc2lvbiA9ICIwLjEuMCIsIHBhdGggPSAiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbW9kdWxlcy9Db25maWdJbmZyYXN0cnVjdHVyZS9hY29uZmlnZC9wcm90byJ9CituaXggPSB7IHZlcnNpb24gPSAiMC4yOC4wIiwgZmVhdHVyZXMgPSBbInVzZXIiXSB9CithY29uZmlnX3N0b3JhZ2VfZmlsZSA9IHsgdmVyc2lvbiA9ICIwLjEuMCIsIHBhdGggPSAiLi4vYWNvbmZpZ19zdG9yYWdlX2ZpbGUiIH0KK2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaSA9IHsgdmVyc2lvbiA9ICIwLjEuMCIsIHBhdGggPSAiLi4vYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpIiB9CitjbGFwID0ge3ZlcnNpb24gPSAiNC41LjIiIH0KK2Fjb25maWdfZGV2aWNlX3BhdGhzID0geyB2ZXJzaW9uID0gIjAuMS4wIiwgcGF0aCA9ICIuLi9hY29uZmlnX2RldmljZV9wYXRocyIgfQorYWNvbmZpZ19mbGFncyA9IHsgdmVyc2lvbiA9ICIwLjEuMCIsIHBhdGggPSAiLi4vYWNvbmZpZ19mbGFncyIgfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hZmxhZ3Mvc3JjL2Fjb25maWdfc3RvcmFnZV9zb3VyY2UucnMgYi90b29scy9hY29uZmlnL2FmbGFncy9zcmMvYWNvbmZpZ19zdG9yYWdlX3NvdXJjZS5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjY4MDdhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hZmxhZ3Mvc3JjL2Fjb25maWdfc3RvcmFnZV9zb3VyY2UucnMKQEAgLTAsMCArMSwxNjcgQEAKK3VzZSBjcmF0ZTo6bG9hZF9wcm90b3M7Cit1c2UgY3JhdGU6OntGbGFnLCBGbGFnU291cmNlfTsKK3VzZSBjcmF0ZTo6e0ZsYWdQZXJtaXNzaW9uLCBGbGFnVmFsdWUsIFZhbHVlUGlja2VkRnJvbX07Cit1c2UgYWNvbmZpZ2RfcHJvdG9zOjp7CisgICAgUHJvdG9GbGFnUXVlcnlSZXR1cm5NZXNzYWdlLCBQcm90b0xpc3RTdG9yYWdlTWVzc2FnZSwgUHJvdG9MaXN0U3RvcmFnZU1lc3NhZ2VNc2csCisgICAgUHJvdG9TdG9yYWdlUmVxdWVzdE1lc3NhZ2UsIFByb3RvU3RvcmFnZVJlcXVlc3RNZXNzYWdlTXNnLCBQcm90b1N0b3JhZ2VSZXF1ZXN0TWVzc2FnZXMsCisgICAgUHJvdG9TdG9yYWdlUmV0dXJuTWVzc2FnZSwgUHJvdG9TdG9yYWdlUmV0dXJuTWVzc2FnZU1zZywgUHJvdG9TdG9yYWdlUmV0dXJuTWVzc2FnZXMsCit9OwordXNlIGFueWhvdzo6YW55aG93OwordXNlIGFueWhvdzo6UmVzdWx0OwordXNlIHByb3RvYnVmOjpNZXNzYWdlOwordXNlIHByb3RvYnVmOjpTcGVjaWFsRmllbGRzOwordXNlIHN0ZDo6Y29sbGVjdGlvbnM6Okhhc2hNYXA7Cit1c2Ugc3RkOjppbzo6e1JlYWQsIFdyaXRlfTsKK3VzZSBzdGQ6Om5ldDo6U2h1dGRvd247Cit1c2Ugc3RkOjpvczo6dW5peDo6bmV0OjpVbml4U3RyZWFtOworCitwdWIgc3RydWN0IEFjb25maWdTdG9yYWdlU291cmNlIHt9CisKK3N0YXRpYyBBQ09ORklHRF9TWVNURU1fU09DS0VUX05BTUU6ICZzdHIgPSAiL2Rldi9zb2NrZXQvYWNvbmZpZ2Rfc3lzdGVtIjsKK3N0YXRpYyBBQ09ORklHRF9NQUlOTElORV9TT0NLRVRfTkFNRTogJnN0ciA9ICIvZGV2L3NvY2tldC9hY29uZmlnZF9tYWlubGluZSI7CisKK2VudW0gQWNvbmZpZ2RTb2NrZXQgeworICAgIFN5c3RlbSwKKyAgICBNYWlubGluZSwKK30KKworaW1wbCBBY29uZmlnZFNvY2tldCB7CisgICAgcHViIGZuIG5hbWUoJnNlbGYpIC0+ICZzdHIgeworICAgICAgICBtYXRjaCBzZWxmIHsKKyAgICAgICAgICAgIEFjb25maWdkU29ja2V0OjpTeXN0ZW0gPT4gQUNPTkZJR0RfU1lTVEVNX1NPQ0tFVF9OQU1FLAorICAgICAgICAgICAgQWNvbmZpZ2RTb2NrZXQ6Ok1haW5saW5lID0+IEFDT05GSUdEX01BSU5MSU5FX1NPQ0tFVF9OQU1FLAorICAgICAgICB9CisgICAgfQorfQorCitmbiBsb2FkX2ZsYWdfdG9fY29udGFpbmVyKCkgLT4gUmVzdWx0PEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+PiB7CisgICAgT2sobG9hZF9wcm90b3M6OmxvYWQoKT8uaW50b19pdGVyKCkubWFwKHxwfCAocC5xdWFsaWZpZWRfbmFtZSgpLCBwLmNvbnRhaW5lcikpLmNvbGxlY3QoKSkKK30KKworZm4gY29udmVydChtc2c6IFByb3RvRmxhZ1F1ZXJ5UmV0dXJuTWVzc2FnZSwgY29udGFpbmVyczogJkhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KSAtPiBSZXN1bHQ8RmxhZz4geworICAgIGxldCAodmFsdWUsIHZhbHVlX3BpY2tlZF9mcm9tKSA9IG1hdGNoICgKKyAgICAgICAgJm1zZy5ib290X2ZsYWdfdmFsdWUsCisgICAgICAgIG1zZy5kZWZhdWx0X2ZsYWdfdmFsdWUsCisgICAgICAgIG1zZy5sb2NhbF9mbGFnX3ZhbHVlLAorICAgICAgICBtc2cuaGFzX2xvY2FsX292ZXJyaWRlLAorICAgICkgeworICAgICAgICAoXywgXywgU29tZShsb2NhbCksIFNvbWUoaGFzX2xvY2FsKSkgaWYgaGFzX2xvY2FsID0+IHsKKyAgICAgICAgICAgIChGbGFnVmFsdWU6OnRyeV9mcm9tKGxvY2FsLmFzX3N0cigpKT8sIFZhbHVlUGlja2VkRnJvbTo6TG9jYWwpCisgICAgICAgIH0KKyAgICAgICAgKFNvbWUoYm9vdCksIFNvbWUoZGVmYXVsdCksIF8sIF8pID0+IHsKKyAgICAgICAgICAgIGxldCB2YWx1ZSA9IEZsYWdWYWx1ZTo6dHJ5X2Zyb20oYm9vdC5hc19zdHIoKSk/OworICAgICAgICAgICAgaWYgKmJvb3QgPT0gZGVmYXVsdCB7CisgICAgICAgICAgICAgICAgKHZhbHVlLCBWYWx1ZVBpY2tlZEZyb206OkRlZmF1bHQpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICh2YWx1ZSwgVmFsdWVQaWNrZWRGcm9tOjpTZXJ2ZXIpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgXyA9PiByZXR1cm4gRXJyKGFueWhvdyEoIm1pc3Npbmcgb3ZlcnJpZGUiKSksCisgICAgfTsKKworICAgIGxldCBzdGFnZWRfdmFsdWUgPSBtYXRjaCAobXNnLmJvb3RfZmxhZ192YWx1ZSwgbXNnLnNlcnZlcl9mbGFnX3ZhbHVlLCBtc2cuaGFzX3NlcnZlcl9vdmVycmlkZSkgeworICAgICAgICAoU29tZShib290KSwgU29tZShzZXJ2ZXIpLCBfKSBpZiBib290ID09IHNlcnZlciA9PiBOb25lLAorICAgICAgICAoU29tZShib290KSwgU29tZShzZXJ2ZXIpLCBTb21lKGhhc19zZXJ2ZXIpKSBpZiBib290ICE9IHNlcnZlciAmJiBoYXNfc2VydmVyID0+IHsKKyAgICAgICAgICAgIFNvbWUoRmxhZ1ZhbHVlOjp0cnlfZnJvbShzZXJ2ZXIuYXNfc3RyKCkpPykKKyAgICAgICAgfQorICAgICAgICBfID0+IE5vbmUsCisgICAgfTsKKworICAgIGxldCBwZXJtaXNzaW9uID0gbWF0Y2ggbXNnLmlzX3JlYWR3cml0ZSB7CisgICAgICAgIFNvbWUoaXNfcmVhZHdyaXRlKSA9PiB7CisgICAgICAgICAgICBpZiBpc19yZWFkd3JpdGUgeworICAgICAgICAgICAgICAgIEZsYWdQZXJtaXNzaW9uOjpSZWFkV3JpdGUKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRmxhZ1Blcm1pc3Npb246OlJlYWRPbmx5CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgTm9uZSA9PiByZXR1cm4gRXJyKGFueWhvdyEoIm1pc3NpbmcgcGVybWlzc2lvbiIpKSwKKyAgICB9OworCisgICAgbGV0IG5hbWUgPSBtc2cuZmxhZ19uYW1lLm9rX29yKGFueWhvdyEoIm1pc3NpbmcgZmxhZyBuYW1lIikpPzsKKyAgICBsZXQgcGFja2FnZSA9IG1zZy5wYWNrYWdlX25hbWUub2tfb3IoYW55aG93ISgibWlzc2luZyBwYWNrYWdlIG5hbWUiKSk/OworICAgIGxldCBxdWFsaWZpZWRfbmFtZSA9IGZvcm1hdCEoIntwYWNrYWdlfS57bmFtZX0iKTsKKyAgICBPayhGbGFnIHsKKyAgICAgICAgbmFtZSwKKyAgICAgICAgcGFja2FnZSwKKyAgICAgICAgdmFsdWUsCisgICAgICAgIHBlcm1pc3Npb24sCisgICAgICAgIHZhbHVlX3BpY2tlZF9mcm9tLAorICAgICAgICBzdGFnZWRfdmFsdWUsCisgICAgICAgIGNvbnRhaW5lcjogY29udGFpbmVycworICAgICAgICAgICAgLmdldCgmcXVhbGlmaWVkX25hbWUpCisgICAgICAgICAgICAuY2xvbmVkKCkKKyAgICAgICAgICAgIC51bndyYXBfb3JfZWxzZSh8fCAiPG5vIGNvbnRhaW5lcj4iLnRvX3N0cmluZygpKQorICAgICAgICAgICAgLnRvX3N0cmluZygpLAorICAgICAgICAvLyBUT0RPOiByZW1vdmUgb25jZSBEZXZpY2VDb25maWcgaXMgbm90IGluIHRoZSBDTEkuCisgICAgICAgIG5hbWVzcGFjZTogIi0iLnRvX3N0cmluZygpLAorICAgIH0pCit9CisKK2ZuIHJlYWRfZnJvbV9zb2NrZXQoc29ja2V0OiBBY29uZmlnZFNvY2tldCkgLT4gUmVzdWx0PFZlYzxQcm90b0ZsYWdRdWVyeVJldHVybk1lc3NhZ2U+PiB7CisgICAgbGV0IG1lc3NhZ2VzID0gUHJvdG9TdG9yYWdlUmVxdWVzdE1lc3NhZ2VzIHsKKyAgICAgICAgbXNnczogdmVjIVtQcm90b1N0b3JhZ2VSZXF1ZXN0TWVzc2FnZSB7CisgICAgICAgICAgICBtc2c6IFNvbWUoUHJvdG9TdG9yYWdlUmVxdWVzdE1lc3NhZ2VNc2c6Okxpc3RTdG9yYWdlTWVzc2FnZShQcm90b0xpc3RTdG9yYWdlTWVzc2FnZSB7CisgICAgICAgICAgICAgICAgbXNnOiBTb21lKFByb3RvTGlzdFN0b3JhZ2VNZXNzYWdlTXNnOjpBbGwodHJ1ZSkpLAorICAgICAgICAgICAgICAgIHNwZWNpYWxfZmllbGRzOiBTcGVjaWFsRmllbGRzOjpuZXcoKSwKKyAgICAgICAgICAgIH0pKSwKKyAgICAgICAgICAgIHNwZWNpYWxfZmllbGRzOiBTcGVjaWFsRmllbGRzOjpuZXcoKSwKKyAgICAgICAgfV0sCisgICAgICAgIHNwZWNpYWxfZmllbGRzOiBTcGVjaWFsRmllbGRzOjpuZXcoKSwKKyAgICB9OworCisgICAgbGV0IG11dCBzb2NrZXQgPSBVbml4U3RyZWFtOjpjb25uZWN0KHNvY2tldC5uYW1lKCkpPzsKKworICAgIGxldCBtZXNzYWdlX2J1ZmZlciA9IG1lc3NhZ2VzLndyaXRlX3RvX2J5dGVzKCk/OworICAgIGxldCBtdXQgbWVzc2FnZV9sZW5ndGhfYnVmZmVyOiBbdTg7IDRdID0gWzA7IDRdOworICAgIGxldCBtZXNzYWdlX3NpemUgPSAmbWVzc2FnZV9idWZmZXIubGVuKCk7CisgICAgbWVzc2FnZV9sZW5ndGhfYnVmZmVyWzBdID0gKG1lc3NhZ2Vfc2l6ZSA+PiAyNCkgYXMgdTg7CisgICAgbWVzc2FnZV9sZW5ndGhfYnVmZmVyWzFdID0gKG1lc3NhZ2Vfc2l6ZSA+PiAxNikgYXMgdTg7CisgICAgbWVzc2FnZV9sZW5ndGhfYnVmZmVyWzJdID0gKG1lc3NhZ2Vfc2l6ZSA+PiA4KSBhcyB1ODsKKyAgICBtZXNzYWdlX2xlbmd0aF9idWZmZXJbM10gPSAqbWVzc2FnZV9zaXplIGFzIHU4OworICAgIHNvY2tldC53cml0ZV9hbGwoJm1lc3NhZ2VfbGVuZ3RoX2J1ZmZlcik/OworICAgIHNvY2tldC53cml0ZV9hbGwoJm1lc3NhZ2VfYnVmZmVyKT87CisgICAgc29ja2V0LnNodXRkb3duKFNodXRkb3duOjpXcml0ZSk/OworCisgICAgbGV0IG11dCByZXNwb25zZV9sZW5ndGhfYnVmZmVyOiBbdTg7IDRdID0gWzA7IDRdOworICAgIHNvY2tldC5yZWFkX2V4YWN0KCZtdXQgcmVzcG9uc2VfbGVuZ3RoX2J1ZmZlcik/OworICAgIGxldCByZXNwb25zZV9sZW5ndGggPSB1MzI6OmZyb21fYmVfYnl0ZXMocmVzcG9uc2VfbGVuZ3RoX2J1ZmZlcikgYXMgdXNpemU7CisgICAgbGV0IG11dCByZXNwb25zZV9idWZmZXIgPSB2ZWMhWzA7IHJlc3BvbnNlX2xlbmd0aF07CisgICAgc29ja2V0LnJlYWRfZXhhY3QoJm11dCByZXNwb25zZV9idWZmZXIpPzsKKworICAgIGxldCByZXNwb25zZTogUHJvdG9TdG9yYWdlUmV0dXJuTWVzc2FnZXMgPQorICAgICAgICBwcm90b2J1Zjo6TWVzc2FnZTo6cGFyc2VfZnJvbV9ieXRlcygmcmVzcG9uc2VfYnVmZmVyKT87CisKKyAgICBtYXRjaCByZXNwb25zZS5tc2dzLmFzX3NsaWNlKCkgeworICAgICAgICBbUHJvdG9TdG9yYWdlUmV0dXJuTWVzc2FnZSB7CisgICAgICAgICAgICBtc2c6IFNvbWUoUHJvdG9TdG9yYWdlUmV0dXJuTWVzc2FnZU1zZzo6TGlzdFN0b3JhZ2VNZXNzYWdlKGxpc3Rfc3RvcmFnZV9tZXNzYWdlKSksCisgICAgICAgICAgICAuLgorICAgICAgICB9XSA9PiBPayhsaXN0X3N0b3JhZ2VfbWVzc2FnZS5mbGFncy5jbG9uZSgpKSwKKyAgICAgICAgXyA9PiBFcnIoYW55aG93ISgidW5leHBlY3RlZCByZXNwb25zZSBmcm9tIGFjb25maWdkIikpLAorICAgIH0KK30KKworaW1wbCBGbGFnU291cmNlIGZvciBBY29uZmlnU3RvcmFnZVNvdXJjZSB7CisgICAgZm4gbGlzdF9mbGFncygpIC0+IFJlc3VsdDxWZWM8RmxhZz4+IHsKKyAgICAgICAgbGV0IGNvbnRhaW5lcnMgPSBsb2FkX2ZsYWdfdG9fY29udGFpbmVyKCk/OworICAgICAgICBsZXQgc3lzdGVtX21lc3NhZ2VzID0gcmVhZF9mcm9tX3NvY2tldChBY29uZmlnZFNvY2tldDo6U3lzdGVtKTsKKyAgICAgICAgbGV0IG1haW5saW5lX21lc3NhZ2VzID0gcmVhZF9mcm9tX3NvY2tldChBY29uZmlnZFNvY2tldDo6TWFpbmxpbmUpOworCisgICAgICAgIGxldCBtdXQgYWxsX21lc3NhZ2VzID0gdmVjIVtdOworICAgICAgICBpZiBsZXQgT2soc3lzdGVtX21lc3NhZ2VzKSA9IHN5c3RlbV9tZXNzYWdlcyB7CisgICAgICAgICAgICBhbGxfbWVzc2FnZXMuZXh0ZW5kX2Zyb21fc2xpY2UoJnN5c3RlbV9tZXNzYWdlcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgbGV0IE9rKG1haW5saW5lX21lc3NhZ2VzKSA9IG1haW5saW5lX21lc3NhZ2VzIHsKKyAgICAgICAgICAgIGFsbF9tZXNzYWdlcy5leHRlbmRfZnJvbV9zbGljZSgmbWFpbmxpbmVfbWVzc2FnZXMpOworICAgICAgICB9CisKKyAgICAgICAgYWxsX21lc3NhZ2VzCisgICAgICAgICAgICAuaW50b19pdGVyKCkKKyAgICAgICAgICAgIC5tYXAofHF1ZXJ5X21lc3NhZ2V8IGNvbnZlcnQocXVlcnlfbWVzc2FnZS5jbG9uZSgpLCAmY29udGFpbmVycykpCisgICAgICAgICAgICAuY29sbGVjdCgpCisgICAgfQorCisgICAgZm4gb3ZlcnJpZGVfZmxhZyhfbmFtZXNwYWNlOiAmc3RyLCBfcXVhbGlmaWVkX25hbWU6ICZzdHIsIF92YWx1ZTogJnN0cikgLT4gUmVzdWx0PCgpPiB7CisgICAgICAgIHRvZG8hKCkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2FmbGFncy9zcmMvZGV2aWNlX2NvbmZpZ19zb3VyY2UucnMgYi90b29scy9hY29uZmlnL2FmbGFncy9zcmMvZGV2aWNlX2NvbmZpZ19zb3VyY2UucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2YWIyOAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWZsYWdzL3NyYy9kZXZpY2VfY29uZmlnX3NvdXJjZS5ycwpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzZSBjcmF0ZTo6bG9hZF9wcm90b3M7Cit1c2UgY3JhdGU6OntGbGFnLCBGbGFnU291cmNlLCBGbGFnVmFsdWUsIFZhbHVlUGlja2VkRnJvbX07CisKK3VzZSBhbnlob3c6Onthbnlob3csIGJhaWwsIFJlc3VsdH07Cit1c2UgcmVnZXg6OlJlZ2V4OwordXNlIHN0ZDo6Y29sbGVjdGlvbnM6Okhhc2hNYXA7Cit1c2Ugc3RkOjpwcm9jZXNzOjpDb21tYW5kOwordXNlIHN0ZDo6c3RyOworCitwdWIgc3RydWN0IERldmljZUNvbmZpZ1NvdXJjZSB7fQorCitmbiBwYXJzZV9kZXZpY2VfY29uZmlnKHJhdzogJnN0cikgLT4gUmVzdWx0PEhhc2hNYXA8U3RyaW5nLCBGbGFnVmFsdWU+PiB7CisgICAgbGV0IG11dCBmbGFncyA9IEhhc2hNYXA6Om5ldygpOworICAgIGxldCByZWdleCA9IFJlZ2V4OjpuZXcociIoP20pXihbW1s6YWxudW06XV1fXSsvW1tbOmFsbnVtOl1dX1wuXSspPSh0cnVlfGZhbHNlKSQiKT87CisgICAgZm9yIGNhcHR1cmUgaW4gcmVnZXguY2FwdHVyZXNfaXRlcihyYXcpIHsKKyAgICAgICAgbGV0IGtleSA9CisgICAgICAgICAgICBjYXB0dXJlLmdldCgxKS5va19vcihhbnlob3chKCJpbnZhbGlkIGRldmljZV9jb25maWcgb3V0cHV0IikpPy5hc19zdHIoKS50b19zdHJpbmcoKTsKKyAgICAgICAgbGV0IHZhbHVlID0gRmxhZ1ZhbHVlOjp0cnlfZnJvbSgKKyAgICAgICAgICAgIGNhcHR1cmUuZ2V0KDIpLm9rX29yKGFueWhvdyEoImludmFsaWQgZGV2aWNlX2NvbmZpZyBvdXRwdXQiKSk/LmFzX3N0cigpLAorICAgICAgICApPzsKKyAgICAgICAgZmxhZ3MuaW5zZXJ0KGtleSwgdmFsdWUpOworICAgIH0KKyAgICBPayhmbGFncykKK30KKworZm4gcmVhZF9kZXZpY2VfY29uZmlnX291dHB1dChjb21tYW5kOiAmWyZzdHJdKSAtPiBSZXN1bHQ8U3RyaW5nPiB7CisgICAgbGV0IG91dHB1dCA9IENvbW1hbmQ6Om5ldygiL3N5c3RlbS9iaW4vZGV2aWNlX2NvbmZpZyIpLmFyZ3MoY29tbWFuZCkub3V0cHV0KCk/OworICAgIGlmICFvdXRwdXQuc3RhdHVzLnN1Y2Nlc3MoKSB7CisgICAgICAgIGxldCByZWFzb24gPSBtYXRjaCBvdXRwdXQuc3RhdHVzLmNvZGUoKSB7CisgICAgICAgICAgICBTb21lKGNvZGUpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgb3V0cHV0ID0gc3RyOjpmcm9tX3V0ZjgoJm91dHB1dC5zdGRvdXQpPzsKKyAgICAgICAgICAgICAgICBpZiAhb3V0cHV0LmlzX2VtcHR5KCkgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQhKCJleGl0IGNvZGUge2NvZGV9LCBvdXRwdXQgd2FzIHtvdXRwdXR9IikKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQhKCJleGl0IGNvZGUge2NvZGV9IikKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBOb25lID0+ICJ0ZXJtaW5hdGVkIGJ5IHNpZ25hbCIudG9fc3RyaW5nKCksCisgICAgICAgIH07CisgICAgICAgIGJhaWwhKCJmYWlsZWQgdG8gYWNjZXNzIGZsYWcgc3RvcmFnZToge30iLCByZWFzb24pOworICAgIH0KKyAgICBPayhzdHI6OmZyb21fdXRmOCgmb3V0cHV0LnN0ZG91dCk/LnRvX3N0cmluZygpKQorfQorCitmbiByZWFkX2RldmljZV9jb25maWdfZmxhZ3MoKSAtPiBSZXN1bHQ8SGFzaE1hcDxTdHJpbmcsIEZsYWdWYWx1ZT4+IHsKKyAgICBsZXQgbGlzdF9vdXRwdXQgPSByZWFkX2RldmljZV9jb25maWdfb3V0cHV0KCZbImxpc3QiXSk/OworICAgIHBhcnNlX2RldmljZV9jb25maWcoJmxpc3Rfb3V0cHV0KQorfQorCisvLy8gUGFyc2UgdGhlIGxpc3Qgb2YgbmV3bGluZS1zZXBhcmF0ZWQgc3RhZ2VkIGZsYWdzLgorLy8vCisvLy8gVGhlIG91dHB1dCBpcyBhIG5ld2xpbmUtc2VwYWFyYXRlZCBsaXN0IG9mIGVudHJpZXMgd2hpY2ggZm9sbG93IHRoaXMgZm9ybWF0OgorLy8vICAgYG5hbWVzcGFjZSpmbGFnbmFtZT12YWx1ZWAKKy8vLworLy8vIFRoZSByZXN1bHRpbmcgbWFwIG1hcHMgZnJvbSBgbmFtZXNwYWNlL2ZsYWduYW1lYCB0byBgdmFsdWVgLCBpZiBhIHN0YWdlZCBmbGFnIGV4aXN0cyBmb3IKKy8vLyBgbmFtZXNwYWNlL2ZsYWduYW1lYC4KK2ZuIHBhcnNlX3N0YWdlZF9mbGFncyhyYXc6ICZzdHIpIC0+IFJlc3VsdDxIYXNoTWFwPFN0cmluZywgRmxhZ1ZhbHVlPj4geworICAgIGxldCBtdXQgZmxhZ3MgPSBIYXNoTWFwOjpuZXcoKTsKKyAgICBmb3IgbGluZSBpbiByYXcuc3BsaXQoJ1xuJykgeworICAgICAgICBtYXRjaCAobGluZS5maW5kKCcqJyksIGxpbmUuZmluZCgnPScpKSB7CisgICAgICAgICAgICAoU29tZShzdGFyX2luZGV4KSwgU29tZShlcXVhbF9pbmRleCkpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgbmFtZXNwYWNlID0gJmxpbmVbLi5zdGFyX2luZGV4XTsKKyAgICAgICAgICAgICAgICBsZXQgZmxhZyA9ICZsaW5lW3N0YXJfaW5kZXggKyAxLi5lcXVhbF9pbmRleF07CisgICAgICAgICAgICAgICAgaWYgbGV0IE9rKHZhbHVlKSA9IEZsYWdWYWx1ZTo6dHJ5X2Zyb20oJmxpbmVbZXF1YWxfaW5kZXggKyAxLi5dKSB7CisgICAgICAgICAgICAgICAgICAgIGZsYWdzLmluc2VydChuYW1lc3BhY2UudG9fb3duZWQoKSArICIvIiArIGZsYWcsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfID0+IGNvbnRpbnVlLAorICAgICAgICB9OworICAgIH0KKyAgICBPayhmbGFncykKK30KKworZm4gcmVhZF9zdGFnZWRfZmxhZ3MoKSAtPiBSZXN1bHQ8SGFzaE1hcDxTdHJpbmcsIEZsYWdWYWx1ZT4+IHsKKyAgICBsZXQgc3RhZ2VkX2ZsYWdzX291dHB1dCA9IHJlYWRfZGV2aWNlX2NvbmZpZ19vdXRwdXQoJlsibGlzdCIsICJzdGFnZWQiXSk/OworICAgIHBhcnNlX3N0YWdlZF9mbGFncygmc3RhZ2VkX2ZsYWdzX291dHB1dCkKK30KKworZm4gcmVjb25jaWxlKAorICAgIHBiX2ZsYWdzOiAmW0ZsYWddLAorICAgIGRjX2ZsYWdzOiBIYXNoTWFwPFN0cmluZywgRmxhZ1ZhbHVlPiwKKyAgICBzdGFnZWRfZmxhZ3M6IEhhc2hNYXA8U3RyaW5nLCBGbGFnVmFsdWU+LAorKSAtPiBWZWM8RmxhZz4geworICAgIHBiX2ZsYWdzCisgICAgICAgIC5pdGVyKCkKKyAgICAgICAgLm1hcCh8ZnwgeworICAgICAgICAgICAgbGV0IHNlcnZlcl9vdmVycmlkZSA9IGRjX2ZsYWdzLmdldCgmZm9ybWF0ISgie30ve30iLCBmLm5hbWVzcGFjZSwgZi5xdWFsaWZpZWRfbmFtZSgpKSk7CisgICAgICAgICAgICBsZXQgKHZhbHVlX3BpY2tlZF9mcm9tLCBzZWxlY3RlZF92YWx1ZSkgPSBtYXRjaCBzZXJ2ZXJfb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIFNvbWUodmFsdWUpIGlmICp2YWx1ZSAhPSBmLnZhbHVlID0+IChWYWx1ZVBpY2tlZEZyb206OlNlcnZlciwgKnZhbHVlKSwKKyAgICAgICAgICAgICAgICBfID0+IChWYWx1ZVBpY2tlZEZyb206OkRlZmF1bHQsIGYudmFsdWUpLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIEZsYWcgeyB2YWx1ZV9waWNrZWRfZnJvbSwgdmFsdWU6IHNlbGVjdGVkX3ZhbHVlLCAuLmYuY2xvbmUoKSB9CisgICAgICAgIH0pCisgICAgICAgIC5tYXAofGZ8IHsKKyAgICAgICAgICAgIGxldCBzdGFnZWRfdmFsdWUgPSBzdGFnZWRfZmxhZ3MKKyAgICAgICAgICAgICAgICAuZ2V0KCZmb3JtYXQhKCJ7fS97fSIsIGYubmFtZXNwYWNlLCBmLnF1YWxpZmllZF9uYW1lKCkpKQorICAgICAgICAgICAgICAgIC5tYXAofHZhbHVlfCBpZiAqdmFsdWUgIT0gZi52YWx1ZSB7IFNvbWUoKnZhbHVlKSB9IGVsc2UgeyBOb25lIH0pCisgICAgICAgICAgICAgICAgLnVud3JhcF9vcihOb25lKTsKKyAgICAgICAgICAgIEZsYWcgeyBzdGFnZWRfdmFsdWUsIC4uZiB9CisgICAgICAgIH0pCisgICAgICAgIC5jb2xsZWN0KCkKK30KKworaW1wbCBGbGFnU291cmNlIGZvciBEZXZpY2VDb25maWdTb3VyY2UgeworICAgIGZuIGxpc3RfZmxhZ3MoKSAtPiBSZXN1bHQ8VmVjPEZsYWc+PiB7CisgICAgICAgIGxldCBwYl9mbGFncyA9IGxvYWRfcHJvdG9zOjpsb2FkKCk/OworICAgICAgICBsZXQgZGNfZmxhZ3MgPSByZWFkX2RldmljZV9jb25maWdfZmxhZ3MoKT87CisgICAgICAgIGxldCBzdGFnZWRfZmxhZ3MgPSByZWFkX3N0YWdlZF9mbGFncygpPzsKKworICAgICAgICBsZXQgZmxhZ3MgPSByZWNvbmNpbGUoJnBiX2ZsYWdzLCBkY19mbGFncywgc3RhZ2VkX2ZsYWdzKTsKKyAgICAgICAgT2soZmxhZ3MpCisgICAgfQorCisgICAgZm4gb3ZlcnJpZGVfZmxhZyhuYW1lc3BhY2U6ICZzdHIsIHF1YWxpZmllZF9uYW1lOiAmc3RyLCB2YWx1ZTogJnN0cikgLT4gUmVzdWx0PCgpPiB7CisgICAgICAgIHJlYWRfZGV2aWNlX2NvbmZpZ19vdXRwdXQoJlsicHV0IiwgbmFtZXNwYWNlLCBxdWFsaWZpZWRfbmFtZSwgdmFsdWVdKS5tYXAofF98ICgpKQorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3BhcnNlX2RldmljZV9jb25maWcoKSB7CisgICAgICAgIGxldCBpbnB1dCA9IHIjIgorbmFtZXNwYWNlX29uZS9jb20uZm9vLmJhci5mbGFnX29uZT10cnVlCituYW1lc3BhY2Vfb25lL2NvbS5mb28uYmFyLmZsYWdfdHdvPWZhbHNlCityYW5kb21fbm9pc2U7CituYW1lc3BhY2VfdHdvL2FuZHJvaWQuZmxhZ19vbmU9dHJ1ZQorbmFtZXNwYWNlX3R3by9hbmRyb2lkLmZsYWdfdHdvPW5vbnNlbnNlCisiIzsKKyAgICAgICAgbGV0IGV4cGVjdGVkID0gSGFzaE1hcDo6ZnJvbShbCisgICAgICAgICAgICAoIm5hbWVzcGFjZV9vbmUvY29tLmZvby5iYXIuZmxhZ19vbmUiLnRvX3N0cmluZygpLCBGbGFnVmFsdWU6OkVuYWJsZWQpLAorICAgICAgICAgICAgKCJuYW1lc3BhY2Vfb25lL2NvbS5mb28uYmFyLmZsYWdfdHdvIi50b19zdHJpbmcoKSwgRmxhZ1ZhbHVlOjpEaXNhYmxlZCksCisgICAgICAgICAgICAoIm5hbWVzcGFjZV90d28vYW5kcm9pZC5mbGFnX29uZSIudG9fc3RyaW5nKCksIEZsYWdWYWx1ZTo6RW5hYmxlZCksCisgICAgICAgIF0pOworICAgICAgICBsZXQgYWN0dWFsID0gcGFyc2VfZGV2aWNlX2NvbmZpZyhpbnB1dCkudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hZmxhZ3Mvc3JjL2xvYWRfcHJvdG9zLnJzIGIvdG9vbHMvYWNvbmZpZy9hZmxhZ3Mvc3JjL2xvYWRfcHJvdG9zLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YWM4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2FmbGFncy9zcmMvbG9hZF9wcm90b3MucnMKQEAgLTAsMCArMSw3MiBAQAordXNlIGNyYXRlOjp7RmxhZywgRmxhZ1Blcm1pc3Npb24sIEZsYWdWYWx1ZSwgVmFsdWVQaWNrZWRGcm9tfTsKK3VzZSBhY29uZmlnX3Byb3Rvczo6UHJvdG9GbGFnUGVybWlzc2lvbiBhcyBQcm90b1Blcm1pc3Npb247Cit1c2UgYWNvbmZpZ19wcm90b3M6OlByb3RvRmxhZ1N0YXRlIGFzIFByb3RvU3RhdGU7Cit1c2UgYWNvbmZpZ19wcm90b3M6OlByb3RvUGFyc2VkRmxhZzsKK3VzZSBhY29uZmlnX3Byb3Rvczo6UHJvdG9QYXJzZWRGbGFnczsKK3VzZSBhbnlob3c6OlJlc3VsdDsKK3VzZSBzdGQ6OmZzOwordXNlIHN0ZDo6cGF0aDo6UGF0aDsKKworLy8gVE9ETyhiLzMyOTg3NTU3OCk6IHVzZSBjb250YWluZXIgZmllbGQgZGlyZWN0bHkgaW5zdGVhZCBvZiBpbmZlcnJpbmcuCitmbiBpbmZlcl9jb250YWluZXIocGF0aDogJlBhdGgpIC0+IFN0cmluZyB7CisgICAgbGV0IHBhdGhfc3RyID0gcGF0aC50b19zdHJpbmdfbG9zc3koKTsKKyAgICBwYXRoX3N0cgorICAgICAgICAuc3RyaXBfcHJlZml4KCIvYXBleC8iKQorICAgICAgICAub3JfZWxzZSh8fCBwYXRoX3N0ci5zdHJpcF9wcmVmaXgoJy8nKSkKKyAgICAgICAgLnVud3JhcF9vcigmcGF0aF9zdHIpCisgICAgICAgIC5zdHJpcF9zdWZmaXgoIi9ldGMvYWNvbmZpZ19mbGFncy5wYiIpCisgICAgICAgIC51bndyYXBfb3IoJnBhdGhfc3RyKQorICAgICAgICAudG9fc3RyaW5nKCkKK30KKworZm4gY29udmVydF9wYXJzZWRfZmxhZyhwYXRoOiAmUGF0aCwgZmxhZzogJlByb3RvUGFyc2VkRmxhZykgLT4gRmxhZyB7CisgICAgbGV0IG5hbWVzcGFjZSA9IGZsYWcubmFtZXNwYWNlKCkudG9fc3RyaW5nKCk7CisgICAgbGV0IHBhY2thZ2UgPSBmbGFnLnBhY2thZ2UoKS50b19zdHJpbmcoKTsKKyAgICBsZXQgbmFtZSA9IGZsYWcubmFtZSgpLnRvX3N0cmluZygpOworCisgICAgbGV0IHZhbHVlID0gbWF0Y2ggZmxhZy5zdGF0ZSgpIHsKKyAgICAgICAgUHJvdG9TdGF0ZTo6RU5BQkxFRCA9PiBGbGFnVmFsdWU6OkVuYWJsZWQsCisgICAgICAgIFByb3RvU3RhdGU6OkRJU0FCTEVEID0+IEZsYWdWYWx1ZTo6RGlzYWJsZWQsCisgICAgfTsKKworICAgIGxldCBwZXJtaXNzaW9uID0gbWF0Y2ggZmxhZy5wZXJtaXNzaW9uKCkgeworICAgICAgICBQcm90b1Blcm1pc3Npb246OlJFQURfT05MWSA9PiBGbGFnUGVybWlzc2lvbjo6UmVhZE9ubHksCisgICAgICAgIFByb3RvUGVybWlzc2lvbjo6UkVBRF9XUklURSA9PiBGbGFnUGVybWlzc2lvbjo6UmVhZFdyaXRlLAorICAgIH07CisKKyAgICBGbGFnIHsKKyAgICAgICAgbmFtZXNwYWNlLAorICAgICAgICBwYWNrYWdlLAorICAgICAgICBuYW1lLAorICAgICAgICBjb250YWluZXI6IGluZmVyX2NvbnRhaW5lcihwYXRoKSwKKyAgICAgICAgdmFsdWUsCisgICAgICAgIHN0YWdlZF92YWx1ZTogTm9uZSwKKyAgICAgICAgcGVybWlzc2lvbiwKKyAgICAgICAgdmFsdWVfcGlja2VkX2Zyb206IFZhbHVlUGlja2VkRnJvbTo6RGVmYXVsdCwKKyAgICB9Cit9CisKK3B1YihjcmF0ZSkgZm4gbG9hZCgpIC0+IFJlc3VsdDxWZWM8RmxhZz4+IHsKKyAgICBsZXQgbXV0IHJlc3VsdCA9IFZlYzo6bmV3KCk7CisKKyAgICBsZXQgcGF0aHMgPSBhY29uZmlnX2RldmljZV9wYXRoczo6cGFyc2VkX2ZsYWdzX3Byb3RvX3BhdGhzKCk/OworICAgIGZvciBwYXRoIGluIHBhdGhzIHsKKyAgICAgICAgbGV0IE9rKGJ5dGVzKSA9IGZzOjpyZWFkKCZwYXRoKSBlbHNlIHsKKyAgICAgICAgICAgIGVwcmludGxuISgid2FybmluZzogZmFpbGVkIHRvIHJlYWQgezo/fSIsIHBhdGgpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH07CisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3M6IFByb3RvUGFyc2VkRmxhZ3MgPSBwcm90b2J1Zjo6TWVzc2FnZTo6cGFyc2VfZnJvbV9ieXRlcygmYnl0ZXMpPzsKKyAgICAgICAgZm9yIGZsYWcgaW4gcGFyc2VkX2ZsYWdzLnBhcnNlZF9mbGFnIHsKKyAgICAgICAgICAgIC8vIFRPRE8oYi8zMzQ5NTQ3NDgpOiBlbmZvcmNlIG9uZS1jb250YWluZXItcGVyLWZsYWcgaW52YXJpYW50LgorICAgICAgICAgICAgcmVzdWx0LnB1c2goY29udmVydF9wYXJzZWRfZmxhZygmcGF0aCwgJmZsYWcpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBPayhyZXN1bHQpCit9CisKK3B1YihjcmF0ZSkgZm4gbGlzdF9jb250YWluZXJzKCkgLT4gUmVzdWx0PFZlYzxTdHJpbmc+PiB7CisgICAgT2soYWNvbmZpZ19kZXZpY2VfcGF0aHM6OnBhcnNlZF9mbGFnc19wcm90b19wYXRocygpPworICAgICAgICAuaW50b19pdGVyKCkKKyAgICAgICAgLm1hcCh8cHwgaW5mZXJfY29udGFpbmVyKCZwKSkKKyAgICAgICAgLmNvbGxlY3QoKSkKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWZsYWdzL3NyYy9tYWluLnJzIGIvdG9vbHMvYWNvbmZpZy9hZmxhZ3Mvc3JjL21haW4ucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRhZjJhNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWZsYWdzL3NyYy9tYWluLnJzCkBAIC0wLDAgKzEsNDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8hIGBhZmxhZ3NgIGlzIGEgZGV2aWNlIGJpbmFyeSB0byByZWFkIGFuZCB3cml0ZSBhY29uZmlnIGZsYWdzLgorCit1c2Ugc3RkOjplbnY7Cit1c2Ugc3RkOjpwcm9jZXNzOjp7Q29tbWFuZCBhcyBPc0NvbW1hbmQsIFN0ZGlvfTsKKwordXNlIGFueWhvdzo6e2FueWhvdywgZW5zdXJlLCBSZXN1bHR9OwordXNlIGNsYXA6OlBhcnNlcjsKKworbW9kIGRldmljZV9jb25maWdfc291cmNlOwordXNlIGRldmljZV9jb25maWdfc291cmNlOjpEZXZpY2VDb25maWdTb3VyY2U7CisKK21vZCBhY29uZmlnX3N0b3JhZ2Vfc291cmNlOwordXNlIGFjb25maWdfc3RvcmFnZV9zb3VyY2U6OkFjb25maWdTdG9yYWdlU291cmNlOworCittb2QgbG9hZF9wcm90b3M7CisKKyNbZGVyaXZlKENsb25lLCBQYXJ0aWFsRXEsIERlYnVnKV0KK2VudW0gRmxhZ1Blcm1pc3Npb24geworICAgIFJlYWRPbmx5LAorICAgIFJlYWRXcml0ZSwKK30KKworaW1wbCBzdGQ6OmZtdDo6RGlzcGxheSBmb3IgRmxhZ1Blcm1pc3Npb24geworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBzdGQ6OmZtdDo6Rm9ybWF0dGVyPCdfPikgLT4gc3RkOjpmbXQ6OlJlc3VsdCB7CisgICAgICAgIHdyaXRlISgKKyAgICAgICAgICAgIGYsCisgICAgICAgICAgICAie30iLAorICAgICAgICAgICAgbWF0Y2ggJnNlbGYgeworICAgICAgICAgICAgICAgIFNlbGY6OlJlYWRPbmx5ID0+ICJyZWFkLW9ubHkiLAorICAgICAgICAgICAgICAgIFNlbGY6OlJlYWRXcml0ZSA9PiAicmVhZC13cml0ZSIsCisgICAgICAgICAgICB9CisgICAgICAgICkKKyAgICB9Cit9CisKKyNbZGVyaXZlKENsb25lLCBEZWJ1ZyldCitlbnVtIFZhbHVlUGlja2VkRnJvbSB7CisgICAgRGVmYXVsdCwKKyAgICBTZXJ2ZXIsCisgICAgTG9jYWwsCit9CisKK2ltcGwgc3RkOjpmbXQ6OkRpc3BsYXkgZm9yIFZhbHVlUGlja2VkRnJvbSB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IHN0ZDo6Zm10OjpGb3JtYXR0ZXI8J18+KSAtPiBzdGQ6OmZtdDo6UmVzdWx0IHsKKyAgICAgICAgd3JpdGUhKAorICAgICAgICAgICAgZiwKKyAgICAgICAgICAgICJ7fSIsCisgICAgICAgICAgICBtYXRjaCAmc2VsZiB7CisgICAgICAgICAgICAgICAgU2VsZjo6RGVmYXVsdCA9PiAiZGVmYXVsdCIsCisgICAgICAgICAgICAgICAgU2VsZjo6U2VydmVyID0+ICJzZXJ2ZXIiLAorICAgICAgICAgICAgICAgIFNlbGY6OkxvY2FsID0+ICJsb2NhbCIsCisgICAgICAgICAgICB9CisgICAgICAgICkKKyAgICB9Cit9CisKKyNbZGVyaXZlKENsb25lLCBDb3B5LCBQYXJ0aWFsRXEsIEVxLCBEZWJ1ZyldCitlbnVtIEZsYWdWYWx1ZSB7CisgICAgRW5hYmxlZCwKKyAgICBEaXNhYmxlZCwKK30KKworaW1wbCBUcnlGcm9tPCZzdHI+IGZvciBGbGFnVmFsdWUgeworICAgIHR5cGUgRXJyb3IgPSBhbnlob3c6OkVycm9yOworCisgICAgZm4gdHJ5X2Zyb20odmFsdWU6ICZzdHIpIC0+IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8U2VsZiwgU2VsZjo6RXJyb3I+IHsKKyAgICAgICAgbWF0Y2ggdmFsdWUgeworICAgICAgICAgICAgInRydWUiIHwgImVuYWJsZWQiID0+IE9rKFNlbGY6OkVuYWJsZWQpLAorICAgICAgICAgICAgImZhbHNlIiB8ICJkaXNhYmxlZCIgPT4gT2soU2VsZjo6RGlzYWJsZWQpLAorICAgICAgICAgICAgXyA9PiBFcnIoYW55aG93ISgiY2Fubm90IGNvbnZlcnQgc3RyaW5nICd7fScgdG8gRmxhZ1ZhbHVlIiwgdmFsdWUpKSwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBzdGQ6OmZtdDo6RGlzcGxheSBmb3IgRmxhZ1ZhbHVlIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgc3RkOjpmbXQ6OkZvcm1hdHRlcjwnXz4pIC0+IHN0ZDo6Zm10OjpSZXN1bHQgeworICAgICAgICB3cml0ZSEoCisgICAgICAgICAgICBmLAorICAgICAgICAgICAgInt9IiwKKyAgICAgICAgICAgIG1hdGNoICZzZWxmIHsKKyAgICAgICAgICAgICAgICBTZWxmOjpFbmFibGVkID0+ICJlbmFibGVkIiwKKyAgICAgICAgICAgICAgICBTZWxmOjpEaXNhYmxlZCA9PiAiZGlzYWJsZWQiLAorICAgICAgICAgICAgfQorICAgICAgICApCisgICAgfQorfQorCisjW2Rlcml2ZShDbG9uZSwgRGVidWcpXQorc3RydWN0IEZsYWcgeworICAgIG5hbWVzcGFjZTogU3RyaW5nLAorICAgIG5hbWU6IFN0cmluZywKKyAgICBwYWNrYWdlOiBTdHJpbmcsCisgICAgY29udGFpbmVyOiBTdHJpbmcsCisgICAgdmFsdWU6IEZsYWdWYWx1ZSwKKyAgICBzdGFnZWRfdmFsdWU6IE9wdGlvbjxGbGFnVmFsdWU+LAorICAgIHBlcm1pc3Npb246IEZsYWdQZXJtaXNzaW9uLAorICAgIHZhbHVlX3BpY2tlZF9mcm9tOiBWYWx1ZVBpY2tlZEZyb20sCit9CisKK2ltcGwgRmxhZyB7CisgICAgZm4gcXVhbGlmaWVkX25hbWUoJnNlbGYpIC0+IFN0cmluZyB7CisgICAgICAgIGZvcm1hdCEoInt9Lnt9Iiwgc2VsZi5wYWNrYWdlLCBzZWxmLm5hbWUpCisgICAgfQorCisgICAgZm4gZGlzcGxheV9zdGFnZWRfdmFsdWUoJnNlbGYpIC0+IFN0cmluZyB7CisgICAgICAgIG1hdGNoICgmc2VsZi5wZXJtaXNzaW9uLCBzZWxmLnN0YWdlZF92YWx1ZSkgeworICAgICAgICAgICAgKEZsYWdQZXJtaXNzaW9uOjpSZWFkT25seSwgXykgPT4gIi0iLnRvX3N0cmluZygpLAorICAgICAgICAgICAgKEZsYWdQZXJtaXNzaW9uOjpSZWFkV3JpdGUsIE5vbmUpID0+ICItIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgIChGbGFnUGVybWlzc2lvbjo6UmVhZFdyaXRlLCBTb21lKHYpKSA9PiBmb3JtYXQhKCIoLT57fSkiLCB2KSwKKyAgICAgICAgfQorICAgIH0KK30KKwordHJhaXQgRmxhZ1NvdXJjZSB7CisgICAgZm4gbGlzdF9mbGFncygpIC0+IFJlc3VsdDxWZWM8RmxhZz4+OworICAgIGZuIG92ZXJyaWRlX2ZsYWcobmFtZXNwYWNlOiAmc3RyLCBxdWFsaWZpZWRfbmFtZTogJnN0ciwgdmFsdWU6ICZzdHIpIC0+IFJlc3VsdDwoKT47Cit9CisKK2VudW0gRmxhZ1NvdXJjZVR5cGUgeworICAgIERldmljZUNvbmZpZywKKyAgICBBY29uZmlnU3RvcmFnZSwKK30KKworY29uc3QgQUJPVVRfVEVYVDogJnN0ciA9ICJUb29sIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIGZsYWdzLgorCitSb3dzIGluIHRoZSB0YWJsZSBmcm9tIHRoZSBgbGlzdGAgY29tbWFuZCBmb2xsb3cgdGhpcyBmb3JtYXQ6CisKKyAgcGFja2FnZSBmbGFnX25hbWUgdmFsdWUgcHJvdmVuYW5jZSBwZXJtaXNzaW9uIGNvbnRhaW5lcgorCisgICogYHBhY2thZ2VgOiBwYWNrYWdlIHNldCBmb3IgdGhpcyBmbGFnIGluIGl0cyAuYWNvbmZpZyBkZWZpbml0aW9uLgorICAqIGBmbGFnX25hbWVgOiBmbGFnIG5hbWUsIGFsc28gc2V0IGluIGRlZmluaXRpb24uCisgICogYHZhbHVlYDogdGhlIHZhbHVlIHJlYWQgZnJvbSB0aGUgZmxhZy4KKyAgKiBgc3RhZ2VkX3ZhbHVlYDogdGhlIHZhbHVlIG9uIG5leHQgYm9vdDoKKyAgICArIGAtYDogc2FtZSBhcyBjdXJyZW50IHZhbHVlCisgICAgKyBgKC0+ZW5hYmxlZCkgZmxpcHBlZCB0byBlbmFibGVkIG9uIGJvb3QuCisgICAgKyBgKC0+ZGlzYWJsZWQpIGZsaXBwZWQgdG8gZGlzYWJsZWQgb24gYm9vdC4KKyAgKiBgcHJvdmVuYW5jZWA6IG9uZSBvZjoKKyAgICArIGBkZWZhdWx0YDogdGhlIGZsYWcgdmFsdWUgY29tZXMgZnJvbSBpdHMgYnVpbGQtdGltZSBkZWZhdWx0LgorICAgICsgYHNlcnZlcmA6IHRoZSBmbGFnIHZhbHVlIGNvbWVzIGZyb20gYSBzZXJ2ZXIgb3ZlcnJpZGUuCisgICogYHBlcm1pc3Npb25gOiByZWFkLXdyaXRlIG9yIHJlYWQtb25seS4KKyAgKiBgY29udGFpbmVyYDogdGhlIGNvbnRhaW5lciBmb3IgdGhlIGZsYWcsIGNvbmZpZ3VyZWQgaW4gaXRzIGRlZmluaXRpb24uCisiOworCisjW2Rlcml2ZShQYXJzZXIsIERlYnVnKV0KKyNbY2xhcChsb25nX2Fib3V0PUFCT1VUX1RFWFQpXQorc3RydWN0IENsaSB7CisgICAgI1tjbGFwKHN1YmNvbW1hbmQpXQorICAgIGNvbW1hbmQ6IENvbW1hbmQsCit9CisKKyNbZGVyaXZlKFBhcnNlciwgRGVidWcpXQorZW51bSBDb21tYW5kIHsKKyAgICAvLy8gTGlzdCBhbGwgYWNvbmZpZyBmbGFncyBvbiB0aGlzIGRldmljZS4KKyAgICBMaXN0IHsKKyAgICAgICAgLy8vIE9wdGlvbmFsbHkgZmlsdGVyIGJ5IGNvbnRhaW5lciBuYW1lLgorICAgICAgICAjW2NsYXAoc2hvcnQgPSAnYycsIGxvbmcgPSAiY29udGFpbmVyIildCisgICAgICAgIGNvbnRhaW5lcjogT3B0aW9uPFN0cmluZz4sCisgICAgfSwKKworICAgIC8vLyBFbmFibGUgYW4gYWNvbmZpZyBmbGFnIG9uIHRoaXMgZGV2aWNlLCBvbiB0aGUgbmV4dCBib290LgorICAgIEVuYWJsZSB7CisgICAgICAgIC8vLyA8cGFja2FnZT4uPGZsYWdfbmFtZT4KKyAgICAgICAgcXVhbGlmaWVkX25hbWU6IFN0cmluZywKKyAgICB9LAorCisgICAgLy8vIERpc2FibGUgYW4gYWNvbmZpZyBmbGFnIG9uIHRoaXMgZGV2aWNlLCBvbiB0aGUgbmV4dCBib290LgorICAgIERpc2FibGUgeworICAgICAgICAvLy8gPHBhY2thZ2U+LjxmbGFnX25hbWU+CisgICAgICAgIHF1YWxpZmllZF9uYW1lOiBTdHJpbmcsCisgICAgfSwKKworICAgIC8vLyBEaXNwbGF5IHdoaWNoIGZsYWcgc3RvcmFnZSBiYWNrcyBhY29uZmlnIGZsYWdzLgorICAgIFdoaWNoQmFja2luZywKK30KKworc3RydWN0IFBhZGRpbmdJbmZvIHsKKyAgICBsb25nZXN0X2ZsYWdfY29sOiB1c2l6ZSwKKyAgICBsb25nZXN0X3ZhbF9jb2w6IHVzaXplLAorICAgIGxvbmdlc3Rfc3RhZ2VkX3ZhbF9jb2w6IHVzaXplLAorICAgIGxvbmdlc3RfdmFsdWVfcGlja2VkX2Zyb21fY29sOiB1c2l6ZSwKKyAgICBsb25nZXN0X3Blcm1pc3Npb25fY29sOiB1c2l6ZSwKK30KKworc3RydWN0IEZpbHRlciB7CisgICAgY29udGFpbmVyOiBPcHRpb248U3RyaW5nPiwKK30KKworaW1wbCBGaWx0ZXIgeworICAgIGZuIGFwcGx5KCZzZWxmLCBmbGFnczogJltGbGFnXSkgLT4gVmVjPEZsYWc+IHsKKyAgICAgICAgZmxhZ3MKKyAgICAgICAgICAgIC5pdGVyKCkKKyAgICAgICAgICAgIC5maWx0ZXIofGZsYWd8IG1hdGNoICZzZWxmLmNvbnRhaW5lciB7CisgICAgICAgICAgICAgICAgU29tZShjKSA9PiBmbGFnLmNvbnRhaW5lciA9PSAqYywKKyAgICAgICAgICAgICAgICBOb25lID0+IHRydWUsCisgICAgICAgICAgICB9KQorICAgICAgICAgICAgLmNsb25lZCgpCisgICAgICAgICAgICAuY29sbGVjdCgpCisgICAgfQorfQorCitmbiBmb3JtYXRfZmxhZ19yb3coZmxhZzogJkZsYWcsIGluZm86ICZQYWRkaW5nSW5mbykgLT4gU3RyaW5nIHsKKyAgICBsZXQgZnVsbF9uYW1lID0gZmxhZy5xdWFsaWZpZWRfbmFtZSgpOworICAgIGxldCBwMCA9IGluZm8ubG9uZ2VzdF9mbGFnX2NvbCArIDE7CisKKyAgICBsZXQgdmFsID0gZmxhZy52YWx1ZS50b19zdHJpbmcoKTsKKyAgICBsZXQgcDEgPSBpbmZvLmxvbmdlc3RfdmFsX2NvbCArIDE7CisKKyAgICBsZXQgc3RhZ2VkX3ZhbCA9IGZsYWcuZGlzcGxheV9zdGFnZWRfdmFsdWUoKTsKKyAgICBsZXQgcDIgPSBpbmZvLmxvbmdlc3Rfc3RhZ2VkX3ZhbF9jb2wgKyAxOworCisgICAgbGV0IHZhbHVlX3BpY2tlZF9mcm9tID0gZmxhZy52YWx1ZV9waWNrZWRfZnJvbS50b19zdHJpbmcoKTsKKyAgICBsZXQgcDMgPSBpbmZvLmxvbmdlc3RfdmFsdWVfcGlja2VkX2Zyb21fY29sICsgMTsKKworICAgIGxldCBwZXJtID0gZmxhZy5wZXJtaXNzaW9uLnRvX3N0cmluZygpOworICAgIGxldCBwNCA9IGluZm8ubG9uZ2VzdF9wZXJtaXNzaW9uX2NvbCArIDE7CisKKyAgICBsZXQgY29udGFpbmVyID0gJmZsYWcuY29udGFpbmVyOworCisgICAgZm9ybWF0ISgKKyAgICAgICAgIntmdWxsX25hbWU6cDAkfXt2YWw6cDEkfXtzdGFnZWRfdmFsOnAyJH17dmFsdWVfcGlja2VkX2Zyb206cDMkfXtwZXJtOnA0JH17Y29udGFpbmVyfVxuIgorICAgICkKK30KKworZm4gc2V0X2ZsYWcocXVhbGlmaWVkX25hbWU6ICZzdHIsIHZhbHVlOiAmc3RyKSAtPiBSZXN1bHQ8KCk+IHsKKyAgICBsZXQgZmxhZ3NfYmluZGluZyA9IERldmljZUNvbmZpZ1NvdXJjZTo6bGlzdF9mbGFncygpPzsKKyAgICBsZXQgZmxhZyA9IGZsYWdzX2JpbmRpbmcuaXRlcigpLmZpbmQofGZ8IGYucXVhbGlmaWVkX25hbWUoKSA9PSBxdWFsaWZpZWRfbmFtZSkub2tfb3IoCisgICAgICAgIGFueWhvdyEoIm5vIGFjb25maWcgZmxhZyAne3F1YWxpZmllZF9uYW1lfScuIERvZXMgdGhlIGZsYWcgaGF2ZSBhbiAuYWNvbmZpZyBkZWZpbml0aW9uPyIpLAorICAgICk/OworCisgICAgZW5zdXJlIShmbGFnLnBlcm1pc3Npb24gPT0gRmxhZ1Blcm1pc3Npb246OlJlYWRXcml0ZSwKKyAgICAgICAgICAgIGZvcm1hdCEoImNvdWxkIG5vdCB3cml0ZSBmbGFnICd7cXVhbGlmaWVkX25hbWV9JywgaXQgaXMgcmVhZC1vbmx5IGZvciB0aGUgY3VycmVudCByZWxlYXNlIGNvbmZpZ3VyYXRpb24uIikpOworCisgICAgRGV2aWNlQ29uZmlnU291cmNlOjpvdmVycmlkZV9mbGFnKCZmbGFnLm5hbWVzcGFjZSwgcXVhbGlmaWVkX25hbWUsIHZhbHVlKT87CisKKyAgICBPaygoKSkKK30KKworZm4gbGlzdChzb3VyY2VfdHlwZTogRmxhZ1NvdXJjZVR5cGUsIGNvbnRhaW5lcjogT3B0aW9uPFN0cmluZz4pIC0+IFJlc3VsdDxTdHJpbmc+IHsKKyAgICBsZXQgZmxhZ3NfdW5maWx0ZXJlZCA9IG1hdGNoIHNvdXJjZV90eXBlIHsKKyAgICAgICAgRmxhZ1NvdXJjZVR5cGU6OkRldmljZUNvbmZpZyA9PiBEZXZpY2VDb25maWdTb3VyY2U6Omxpc3RfZmxhZ3MoKT8sCisgICAgICAgIEZsYWdTb3VyY2VUeXBlOjpBY29uZmlnU3RvcmFnZSA9PiBBY29uZmlnU3RvcmFnZVNvdXJjZTo6bGlzdF9mbGFncygpPywKKyAgICB9OworCisgICAgaWYgbGV0IFNvbWUocmVmIGMpID0gY29udGFpbmVyIHsKKyAgICAgICAgZW5zdXJlISgKKyAgICAgICAgICAgIGxvYWRfcHJvdG9zOjpsaXN0X2NvbnRhaW5lcnMoKT8uY29udGFpbnMoYyksCisgICAgICAgICAgICBmb3JtYXQhKCJjb250YWluZXIgJ3t9JyBub3QgZm91bmQiLCAmYykKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBsZXQgZmxhZ3MgPSAoRmlsdGVyIHsgY29udGFpbmVyIH0pLmFwcGx5KCZmbGFnc191bmZpbHRlcmVkKTsKKyAgICBsZXQgcGFkZGluZ19pbmZvID0gUGFkZGluZ0luZm8geworICAgICAgICBsb25nZXN0X2ZsYWdfY29sOiBmbGFncy5pdGVyKCkubWFwKHxmfCBmLnF1YWxpZmllZF9uYW1lKCkubGVuKCkpLm1heCgpLnVud3JhcF9vcigwKSwKKyAgICAgICAgbG9uZ2VzdF92YWxfY29sOiBmbGFncy5pdGVyKCkubWFwKHxmfCBmLnZhbHVlLnRvX3N0cmluZygpLmxlbigpKS5tYXgoKS51bndyYXBfb3IoMCksCisgICAgICAgIGxvbmdlc3Rfc3RhZ2VkX3ZhbF9jb2w6IGZsYWdzCisgICAgICAgICAgICAuaXRlcigpCisgICAgICAgICAgICAubWFwKHxmfCBmLmRpc3BsYXlfc3RhZ2VkX3ZhbHVlKCkubGVuKCkpCisgICAgICAgICAgICAubWF4KCkKKyAgICAgICAgICAgIC51bndyYXBfb3IoMCksCisgICAgICAgIGxvbmdlc3RfdmFsdWVfcGlja2VkX2Zyb21fY29sOiBmbGFncworICAgICAgICAgICAgLml0ZXIoKQorICAgICAgICAgICAgLm1hcCh8ZnwgZi52YWx1ZV9waWNrZWRfZnJvbS50b19zdHJpbmcoKS5sZW4oKSkKKyAgICAgICAgICAgIC5tYXgoKQorICAgICAgICAgICAgLnVud3JhcF9vcigwKSwKKyAgICAgICAgbG9uZ2VzdF9wZXJtaXNzaW9uX2NvbDogZmxhZ3MKKyAgICAgICAgICAgIC5pdGVyKCkKKyAgICAgICAgICAgIC5tYXAofGZ8IGYucGVybWlzc2lvbi50b19zdHJpbmcoKS5sZW4oKSkKKyAgICAgICAgICAgIC5tYXgoKQorICAgICAgICAgICAgLnVud3JhcF9vcigwKSwKKyAgICB9OworCisgICAgbGV0IG11dCByZXN1bHQgPSBTdHJpbmc6OmZyb20oIiIpOworICAgIGZvciBmbGFnIGluIGZsYWdzIHsKKyAgICAgICAgbGV0IHJvdyA9IGZvcm1hdF9mbGFnX3JvdygmZmxhZywgJnBhZGRpbmdfaW5mbyk7CisgICAgICAgIHJlc3VsdC5wdXNoX3N0cigmcm93KTsKKyAgICB9CisgICAgT2socmVzdWx0KQorfQorCitmbiBkaXNwbGF5X3doaWNoX2JhY2tpbmcoKSAtPiBTdHJpbmcgeworICAgIGlmIGFjb25maWdfZmxhZ3M6OmF1dG9fZ2VuZXJhdGVkOjplbmFibGVfb25seV9uZXdfc3RvcmFnZSgpIHsKKyAgICAgICAgImFjb25maWdfc3RvcmFnZSIudG9fc3RyaW5nKCkKKyAgICB9IGVsc2UgeworICAgICAgICAiZGV2aWNlX2NvbmZpZyIudG9fc3RyaW5nKCkKKyAgICB9Cit9CisKK2ZuIGludm9rZV91cGRhdGFibGVfYWZsYWdzKCkgeworICAgIGxldCB1cGRhdGFibGVfY29tbWFuZCA9ICIvYXBleC9jb20uYW5kcm9pZC5jb25maWdpbmZyYXN0cnVjdHVyZS9iaW4vYWZsYWdzX3VwZGF0YWJsZSI7CisKKyAgICBsZXQgYXJnczogVmVjPFN0cmluZz4gPSBlbnY6OmFyZ3MoKS5jb2xsZWN0KCk7CisgICAgbGV0IGNvbW1hbmRfYXJncyA9IGlmIGFyZ3MubGVuKCkgPj0gMiB7ICZhcmdzWzEuLl0gfSBlbHNlIHsgJlsiLS1oZWxwIi50b19zdHJpbmcoKV0gfTsKKworICAgIGxldCBtdXQgY2hpbGQgPSBPc0NvbW1hbmQ6Om5ldyh1cGRhdGFibGVfY29tbWFuZCk7CisgICAgZm9yIGFyZyBpbiBjb21tYW5kX2FyZ3MgeworICAgICAgICBjaGlsZC5hcmcoYXJnKTsKKyAgICB9CisKKyAgICBsZXQgb3V0cHV0ID0gY2hpbGQKKyAgICAgICAgLnN0ZGluKFN0ZGlvOjpwaXBlZCgpKQorICAgICAgICAuc3Rkb3V0KFN0ZGlvOjpwaXBlZCgpKQorICAgICAgICAuc3Bhd24oKQorICAgICAgICAuZXhwZWN0KCJmYWlsZWQgdG8gZXhlY3V0ZSBjaGlsZCIpCisgICAgICAgIC53YWl0X3dpdGhfb3V0cHV0KCkKKyAgICAgICAgLmV4cGVjdCgiZmFpbGVkIHRvIGV4ZWN1dGUgY29tbWFuZCIpOworCisgICAgcHJpbnRsbiEoInt9IiwgU3RyaW5nOjpmcm9tX3V0ZjhfbG9zc3koJm91dHB1dC5zdGRvdXQpLnRyaW0oKSk7Cit9CisKK2ZuIG1haW4oKSAtPiBSZXN1bHQ8KCk+IHsKKyAgICBpZiBhY29uZmlnX2ZsYWdzOjphdXRvX2dlbmVyYXRlZDo6aW52b2tlX3VwZGF0YWJsZV9hZmxhZ3MoKSB7CisgICAgICAgIGludm9rZV91cGRhdGFibGVfYWZsYWdzKCk7CisgICAgICAgIHJldHVybiBPaygoKSk7CisgICAgfQorCisgICAgZW5zdXJlIShuaXg6OnVuaXN0ZDo6VWlkOjpjdXJyZW50KCkuaXNfcm9vdCgpLCAibXVzdCBiZSByb290Iik7CisKKyAgICBsZXQgY2xpID0gQ2xpOjpwYXJzZSgpOworICAgIGxldCBvdXRwdXQgPSBtYXRjaCBjbGkuY29tbWFuZCB7CisgICAgICAgIENvbW1hbmQ6Okxpc3QgeyBjb250YWluZXIgfSA9PiB7CisgICAgICAgICAgICBpZiBhY29uZmlnX2ZsYWdzOjphdXRvX2dlbmVyYXRlZDo6ZW5hYmxlX29ubHlfbmV3X3N0b3JhZ2UoKSB7CisgICAgICAgICAgICAgICAgbGlzdChGbGFnU291cmNlVHlwZTo6QWNvbmZpZ1N0b3JhZ2UsIGNvbnRhaW5lcikKKyAgICAgICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgYW55aG93ISgiY291bGQgbm90IGxpc3QgZmxhZ3M6IHtlcnJ9IikpCisgICAgICAgICAgICAgICAgICAgIC5tYXAoU29tZSkKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGlzdChGbGFnU291cmNlVHlwZTo6RGV2aWNlQ29uZmlnLCBjb250YWluZXIpLm1hcChTb21lKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIENvbW1hbmQ6OkVuYWJsZSB7IHF1YWxpZmllZF9uYW1lIH0gPT4gc2V0X2ZsYWcoJnF1YWxpZmllZF9uYW1lLCAidHJ1ZSIpLm1hcCh8X3wgTm9uZSksCisgICAgICAgIENvbW1hbmQ6OkRpc2FibGUgeyBxdWFsaWZpZWRfbmFtZSB9ID0+IHNldF9mbGFnKCZxdWFsaWZpZWRfbmFtZSwgImZhbHNlIikubWFwKHxffCBOb25lKSwKKyAgICAgICAgQ29tbWFuZDo6V2hpY2hCYWNraW5nID0+IE9rKFNvbWUoZGlzcGxheV93aGljaF9iYWNraW5nKCkpKSwKKyAgICB9OworICAgIG1hdGNoIG91dHB1dCB7CisgICAgICAgIE9rKFNvbWUodGV4dCkpID0+IHByaW50bG4hKCJ7dGV4dH0iKSwKKyAgICAgICAgT2soTm9uZSkgPT4gKCksCisgICAgICAgIEVycihtZXNzYWdlKSA9PiBwcmludGxuISgiRXJyb3I6IHttZXNzYWdlfSIpLAorICAgIH0KKworICAgIE9rKCgpKQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN1cGVyOjoqOworCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfZmlsdGVyX2NvbnRhaW5lcigpIHsKKyAgICAgICAgbGV0IGZsYWdzID0gdmVjIVsKKyAgICAgICAgICAgIEZsYWcgeworICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogIm5hbWVzcGFjZSIudG9fc3RyaW5nKCksCisgICAgICAgICAgICAgICAgbmFtZTogInRlc3QxIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBwYWNrYWdlOiAicGFja2FnZSIudG9fc3RyaW5nKCksCisgICAgICAgICAgICAgICAgdmFsdWU6IEZsYWdWYWx1ZTo6RGlzYWJsZWQsCisgICAgICAgICAgICAgICAgc3RhZ2VkX3ZhbHVlOiBOb25lLAorICAgICAgICAgICAgICAgIHBlcm1pc3Npb246IEZsYWdQZXJtaXNzaW9uOjpSZWFkV3JpdGUsCisgICAgICAgICAgICAgICAgdmFsdWVfcGlja2VkX2Zyb206IFZhbHVlUGlja2VkRnJvbTo6RGVmYXVsdCwKKyAgICAgICAgICAgICAgICBjb250YWluZXI6ICJzeXN0ZW0iLnRvX3N0cmluZygpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEZsYWcgeworICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogIm5hbWVzcGFjZSIudG9fc3RyaW5nKCksCisgICAgICAgICAgICAgICAgbmFtZTogInRlc3QyIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBwYWNrYWdlOiAicGFja2FnZSIudG9fc3RyaW5nKCksCisgICAgICAgICAgICAgICAgdmFsdWU6IEZsYWdWYWx1ZTo6RGlzYWJsZWQsCisgICAgICAgICAgICAgICAgc3RhZ2VkX3ZhbHVlOiBOb25lLAorICAgICAgICAgICAgICAgIHBlcm1pc3Npb246IEZsYWdQZXJtaXNzaW9uOjpSZWFkV3JpdGUsCisgICAgICAgICAgICAgICAgdmFsdWVfcGlja2VkX2Zyb206IFZhbHVlUGlja2VkRnJvbTo6RGVmYXVsdCwKKyAgICAgICAgICAgICAgICBjb250YWluZXI6ICJub3Rfc3lzdGVtIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBGbGFnIHsKKyAgICAgICAgICAgICAgICBuYW1lc3BhY2U6ICJuYW1lc3BhY2UiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgICAgIG5hbWU6ICJ0ZXN0MyIudG9fc3RyaW5nKCksCisgICAgICAgICAgICAgICAgcGFja2FnZTogInBhY2thZ2UiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgICAgIHZhbHVlOiBGbGFnVmFsdWU6OkRpc2FibGVkLAorICAgICAgICAgICAgICAgIHN0YWdlZF92YWx1ZTogTm9uZSwKKyAgICAgICAgICAgICAgICBwZXJtaXNzaW9uOiBGbGFnUGVybWlzc2lvbjo6UmVhZFdyaXRlLAorICAgICAgICAgICAgICAgIHZhbHVlX3BpY2tlZF9mcm9tOiBWYWx1ZVBpY2tlZEZyb206OkRlZmF1bHQsCisgICAgICAgICAgICAgICAgY29udGFpbmVyOiAic3lzdGVtIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxISgoRmlsdGVyIHsgY29udGFpbmVyOiBTb21lKCJzeXN0ZW0iLnRvX3N0cmluZygpKSB9KS5hcHBseSgmZmxhZ3MpLmxlbigpLCAyKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9maWx0ZXJfbm9fY29udGFpbmVyKCkgeworICAgICAgICBsZXQgZmxhZ3MgPSB2ZWMhWworICAgICAgICAgICAgRmxhZyB7CisgICAgICAgICAgICAgICAgbmFtZXNwYWNlOiAibmFtZXNwYWNlIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBuYW1lOiAidGVzdDEiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgICAgIHBhY2thZ2U6ICJwYWNrYWdlIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICB2YWx1ZTogRmxhZ1ZhbHVlOjpEaXNhYmxlZCwKKyAgICAgICAgICAgICAgICBzdGFnZWRfdmFsdWU6IE5vbmUsCisgICAgICAgICAgICAgICAgcGVybWlzc2lvbjogRmxhZ1Blcm1pc3Npb246OlJlYWRXcml0ZSwKKyAgICAgICAgICAgICAgICB2YWx1ZV9waWNrZWRfZnJvbTogVmFsdWVQaWNrZWRGcm9tOjpEZWZhdWx0LAorICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogInN5c3RlbSIudG9fc3RyaW5nKCksCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgRmxhZyB7CisgICAgICAgICAgICAgICAgbmFtZXNwYWNlOiAibmFtZXNwYWNlIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBuYW1lOiAidGVzdDIiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgICAgIHBhY2thZ2U6ICJwYWNrYWdlIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICB2YWx1ZTogRmxhZ1ZhbHVlOjpEaXNhYmxlZCwKKyAgICAgICAgICAgICAgICBzdGFnZWRfdmFsdWU6IE5vbmUsCisgICAgICAgICAgICAgICAgcGVybWlzc2lvbjogRmxhZ1Blcm1pc3Npb246OlJlYWRXcml0ZSwKKyAgICAgICAgICAgICAgICB2YWx1ZV9waWNrZWRfZnJvbTogVmFsdWVQaWNrZWRGcm9tOjpEZWZhdWx0LAorICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogIm5vdF9zeXN0ZW0iLnRvX3N0cmluZygpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEZsYWcgeworICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogIm5hbWVzcGFjZSIudG9fc3RyaW5nKCksCisgICAgICAgICAgICAgICAgbmFtZTogInRlc3QzIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBwYWNrYWdlOiAicGFja2FnZSIudG9fc3RyaW5nKCksCisgICAgICAgICAgICAgICAgdmFsdWU6IEZsYWdWYWx1ZTo6RGlzYWJsZWQsCisgICAgICAgICAgICAgICAgc3RhZ2VkX3ZhbHVlOiBOb25lLAorICAgICAgICAgICAgICAgIHBlcm1pc3Npb246IEZsYWdQZXJtaXNzaW9uOjpSZWFkV3JpdGUsCisgICAgICAgICAgICAgICAgdmFsdWVfcGlja2VkX2Zyb206IFZhbHVlUGlja2VkRnJvbTo6RGVmYXVsdCwKKyAgICAgICAgICAgICAgICBjb250YWluZXI6ICJzeXN0ZW0iLnRvX3N0cmluZygpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXEhKChGaWx0ZXIgeyBjb250YWluZXI6IE5vbmUgfSkuYXBwbHkoJmZsYWdzKS5sZW4oKSwgMyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvQW5kcm9pZC5icCBiL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM1YjdjNQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1NSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2phdmFfbGlicmFyeSB7CisgICAgbmFtZTogImZha2VfZGV2aWNlX2NvbmZpZyIsCisgICAgc3JjczogWworICAgICAgICAic3JjLyoqLyouamF2YSIsCisgICAgXSwKKyAgICBzZGtfdmVyc2lvbjogIm5vbmUiLAorICAgIHN5c3RlbV9tb2R1bGVzOiAiY29yZS1hbGwtc3lzdGVtLW1vZHVsZXMiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIGlzX3N0dWJzX21vZHVsZTogdHJ1ZSwKK30KKworamF2YV9saWJyYXJ5IHsKKyAgICBuYW1lOiAic3RyaWN0X21vZGVfc3R1YiIsCisgICAgc3JjczogWworICAgICAgICAic3JjL2FuZHJvaWQvb3MvU3RyaWN0TW9kZS5qYXZhIiwKKyAgICBdLAorICAgIHNka192ZXJzaW9uOiAiY29yZV9jdXJyZW50IiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBpc19zdHVic19tb2R1bGU6IHRydWUsCit9CisKK2phdmFfbGlicmFyeSB7CisgICAgbmFtZTogImFjb25maWdfc3RvcmFnZV9zdHViIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmMvYW5kcm9pZC9vcy9mbGFnZ2luZy8qKi8qLmphdmEiLAorICAgIF0sCisgICAgc2RrX3ZlcnNpb246ICJjb3JlX2N1cnJlbnQiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIGlzX3N0dWJzX21vZHVsZTogdHJ1ZSwKK30KKworamF2YV9saWJyYXJ5IHsKKyAgICBuYW1lOiAiYWNvbmZpZ19zdG9yYWdlX3N0dWJfbm9uZSIsCisgICAgc3JjczogWworICAgICAgICAic3JjL2FuZHJvaWQvb3MvZmxhZ2dpbmcvKiovKi5qYXZhIiwKKyAgICBdLAorICAgIHNka192ZXJzaW9uOiAibm9uZSIsCisgICAgc3lzdGVtX21vZHVsZXM6ICJjb3JlLWFsbC1zeXN0ZW0tbW9kdWxlcyIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgaXNfc3R1YnNfbW9kdWxlOiB0cnVlLAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvQmluZGVyLmphdmEgYi90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9CaW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTIzMTNkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvQmluZGVyLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5vczsKKworcHVibGljIGNsYXNzIEJpbmRlciB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIGNsZWFyQ2FsbGluZ0lkZW50aXR5KCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlN0dWIhIik7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGxvbmcgdG9rZW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJTdHViISIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL29zL0J1aWxkLmphdmEgYi90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9CdWlsZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYzcyZmIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9CdWlsZC5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQub3M7CisKK3B1YmxpYyBjbGFzcyBCdWlsZCB7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWRVJTSU9OIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0RLX0lOVCA9IDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvU3RyaWN0TW9kZS5qYXZhIGIvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvU3RyaWN0TW9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MTYyNTIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9TdHJpY3RNb2RlLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5vczsKKworcHVibGljIGNsYXNzIFN0cmljdE1vZGUgeworICAgIHB1YmxpYyBzdGF0aWMgVGhyZWFkUG9saWN5IGFsbG93VGhyZWFkRGlza1JlYWRzKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlN0dWIhIik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFRocmVhZFBvbGljeShmaW5hbCBUaHJlYWRQb2xpY3kgcG9saWN5KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiU3R1YiEiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFRocmVhZFBvbGljeSB7fQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvZmxhZ2dpbmcvQWNvbmZpZ1BhY2thZ2UuamF2YSBiL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL29zL2ZsYWdnaW5nL0Fjb25maWdQYWNrYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NhYzUxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL29zL2ZsYWdnaW5nL0Fjb25maWdQYWNrYWdlLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5vcy5mbGFnZ2luZzsKKworLyoKKyAqIFRoaXMgY2xhc3MgYWxsb3dzIGdlbmVyYXRlZCBhY29uZmlnIGNvZGUgdG8gY29tcGlsZSBpbmRlcGVuZGVudGx5IG9mIHRoZSBmcmFtZXdvcmsuCisgKi8KK3B1YmxpYyBjbGFzcyBBY29uZmlnUGFja2FnZSB7CisgICAgcHVibGljIHN0YXRpYyBBY29uZmlnUGFja2FnZSBsb2FkKFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlN0dWIhIik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbkZsYWdWYWx1ZShTdHJpbmcgZmxhZ05hbWUsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiU3R1YiEiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9mbGFnZ2luZy9BY29uZmlnUGFja2FnZUludGVybmFsLmphdmEgYi90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9mbGFnZ2luZy9BY29uZmlnUGFja2FnZUludGVybmFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA4NDA0OAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL29zL2ZsYWdnaW5nL0Fjb25maWdQYWNrYWdlSW50ZXJuYWwuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm9zLmZsYWdnaW5nOworCisvKgorICogVGhpcyBjbGFzcyBhbGxvd3MgZ2VuZXJhdGVkIGFjb25maWcgY29kZSB0byBjb21waWxlIGluZGVwZW5kZW50bHkgb2YgdGhlIGZyYW1ld29yay4KKyAqLworcHVibGljIGNsYXNzIEFjb25maWdQYWNrYWdlSW50ZXJuYWwgeworCisgICAgcHVibGljIHN0YXRpYyBBY29uZmlnUGFja2FnZUludGVybmFsIGxvYWQoCisgICAgICAgICAgICBTdHJpbmcgY29udGFpbmVyLCBTdHJpbmcgcGFja2FnZU5hbWUsIGxvbmcgcGFja2FnZUZpbmdlcnByaW50KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiU3R1YiEiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuRmxhZ1ZhbHVlKGludCBpbmRleCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlN0dWIhIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvZmxhZ2dpbmcvUGxhdGZvcm1BY29uZmlnUGFja2FnZS5qYXZhIGIvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvZmxhZ2dpbmcvUGxhdGZvcm1BY29uZmlnUGFja2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNzlmN2QKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9mbGFnZ2luZy9QbGF0Zm9ybUFjb25maWdQYWNrYWdlLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5vcy5mbGFnZ2luZzsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qCisgKiBUaGlzIGNsYXNzIGFsbG93cyBnZW5lcmF0ZWQgYWNvbmZpZyBjb2RlIHRvIGNvbXBpbGUgaW5kZXBlbmRlbnRseSBvZiB0aGUgZnJhbWV3b3JrLgorICovCitwdWJsaWMgY2xhc3MgUGxhdGZvcm1BY29uZmlnUGFja2FnZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IFBMQVRGT1JNX1BBQ0tBR0VfTUFQX0ZJTEVTID0KKyAgICAgICAgICAgIFNldC5vZigic3lzdGVtLnBhY2thZ2UubWFwIiwgInZlbmRvci5wYWNrYWdlLm1hcCIsICJwcm9kdWN0LnBhY2thZ2UubWFwIik7CisKKyAgICBwdWJsaWMgc3RhdGljIFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2UgbG9hZChTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJTdHViISIpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5GbGFnVmFsdWUoU3RyaW5nIGZsYWdOYW1lLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlN0dWIhIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvZmxhZ2dpbmcvUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsLmphdmEgYi90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9mbGFnZ2luZy9QbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODNiMjUxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvZmxhZ2dpbmcvUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5vcy5mbGFnZ2luZzsKKworLyoKKyAqIFRoaXMgY2xhc3MgYWxsb3dzIGdlbmVyYXRlZCBhY29uZmlnIGNvZGUgdG8gY29tcGlsZSBpbmRlcGVuZGVudGx5IG9mIHRoZSBmcmFtZXdvcmsuCisgKi8KK3B1YmxpYyBjbGFzcyBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwgeworCisgICAgcHVibGljIHN0YXRpYyBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwgbG9hZCgKKyAgICAgICAgICAgIFN0cmluZyBjb250YWluZXIsIFN0cmluZyBwYWNrYWdlTmFtZSwgbG9uZyBwYWNrYWdlRmluZ2VycHJpbnQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJTdHViISIpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5GbGFnVmFsdWUoaW50IGluZGV4KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiU3R1YiEiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9wcm92aWRlci9EZXZpY2VDb25maWcuamF2YSBiL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL0RldmljZUNvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYjA3YWMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9wcm92aWRlci9EZXZpY2VDb25maWcuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnByb3ZpZGVyOworCisvKgorICogVGhpcyBjbGFzcyBhbGxvd3MgZ2VuZXJhdGVkIGFjb25maWcgY29kZSB0byBjb21waWxlIGluZGVwZW5kZW50bHkgb2YgdGhlIGZyYW1ld29yay4KKyAqLworcHVibGljIGNsYXNzIERldmljZUNvbmZpZyB7CisJcHJpdmF0ZSBEZXZpY2VDb25maWcoKSB7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIG5zLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBkZWYpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBzdGF0aWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZy4uLiBuYW1lcykgeworCQlyZXR1cm4gbmV3IFByb3BlcnRpZXMoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIFByb3BlcnRpZXMgeworCQlwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBuYW1lLCBib29sZWFuIGRlZikgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvdXRpbC9Mb2cuamF2YSBiL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL3V0aWwvTG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlkZTY4MAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL3V0aWwvTG9nLmphdmEKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSBhbmRyb2lkLnV0aWw7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBMb2cgeworICAgIHB1YmxpYyBzdGF0aWMgaW50IGkoU3RyaW5nIHRhZywgU3RyaW5nIG1zZykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCB3KFN0cmluZyB0YWcsIFN0cmluZyBtc2cpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgZShTdHJpbmcgdGFnLCBTdHJpbmcgbXNnKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGUoU3RyaW5nIHRhZywgU3RyaW5nIG1zZywgVGhyb3dhYmxlIHRyKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvb3ZlcnJpZGVmbGFncy9vdmVycmlkZWZsYWdzLnB5IGIvdG9vbHMvYWNvbmZpZy9vdmVycmlkZWZsYWdzL292ZXJyaWRlZmxhZ3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM1NWMyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvb3ZlcnJpZGVmbGFncy9vdmVycmlkZWZsYWdzLnB5CkBAIC0wLDAgKzEsMTI3IEBACisjIS91c3IvYmluL2VudiBweXRob24zCisjCisjIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIiIiQ3JlYXRlIEFjb25maWcgdmFsdWUgYnVpbGRpbmcgcnVsZXMuCisKK1RoaXMgc2NyaXB0IHdpbGwgaGVscCB0byBjcmVhdGUgQWNvbmZpZyBmbGFnIHZhbHVlIGJ1aWxkaW5nIHJ1bGVzLiBJdCB3aWxsCitwYXJzZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gaW4gdGhlIHZhbHVlIGZpbGUgdG8gY3JlYXRlIHRoZSBidWlsZGluZyBydWxlcywgYnV0CitpdCB3aWxsIG5vdCB2YWxpZGF0ZSB0aGUgdmFsdWUgZmlsZS4gVGhlIHZhbGlkYXRpb24gd2lsbCBkZWZlciB0byB0aGUgYnVpbGRpbmcKK3N5c3RlbS4KKyIiIgorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBwYXRobGliCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKKworCitfVkFMVUVfTElTVF9URU1QTEFURTogc3RyID0gIiIiCitBQ09ORklHX1ZBTFVFU19MSVNUX0xPQ0FMID0gW3t9XQorIiIiCisKK19BQ09ORklHX1ZBTFVFU19URU1QTEFURTogc3RyID0gIiIiCithY29uZmlnX3ZhbHVlcyB7eworICAgIG5hbWU6ICJ7fSIsCisgICAgcGFja2FnZTogInt9IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJ7fSIsCisgICAgXQorfX0KKyIiIgorCitfQUNPTkZJR19WQUxVRVNfTkFNRV9TVUZGSVg6IHN0ciA9ICJhY29uZmlnLWxvY2FsLW92ZXJyaWRlLXt9IgorCitfUEFDS0FHRV9SRUdFWCA9IHJlLmNvbXBpbGUociJecGFja2FnZVw6XHMqXCIoW1x3XGRcLl0rKVwiIikKK19BTkRST0lEX0JQX0ZJTEVfTkFNRSA9IHIiQW5kcm9pZC5icCIKKworCitkZWYgX3BhcnNlX3BhY2thZ2VzKGZpbGU6IHBhdGhsaWIuUGF0aCkgLT4gc2V0W3N0cl06CisgIHBhY2thZ2VzID0gc2V0KCkKKyAgd2l0aCBvcGVuKGZpbGUpIGFzIGY6CisgICAgZm9yIGxpbmUgaW4gZjoKKyAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAgICAgIHBhY2thZ2VfbWF0Y2ggPSBfUEFDS0FHRV9SRUdFWC5tYXRjaChsaW5lKQorICAgICAgaWYgcGFja2FnZV9tYXRjaCBpcyBOb25lOgorICAgICAgICBjb250aW51ZQorICAgICAgcGFja2FnZV9uYW1lID0gcGFja2FnZV9tYXRjaC5ncm91cCgxKQorICAgICAgcGFja2FnZXMuYWRkKHBhY2thZ2VfbmFtZSkKKworICByZXR1cm4gcGFja2FnZXMKKworCitkZWYgX2NyZWF0ZV9hbmRyb2lkX2JwKHBhY2thZ2VzOiBzZXRbc3RyXSwgZmlsZV9uYW1lOiBzdHIpIC0+IHN0cjoKKyAgYW5kcm9pZF9icCA9ICIiCisgIHZhbHVlX2xpc3QgPSAiLFxuICAgICIuam9pbigKKyAgICAgIG1hcChmJyJ7X0FDT05GSUdfVkFMVUVTX05BTUVfU1VGRklYfSInLmZvcm1hdCwgcGFja2FnZXMpCisgICkKKyAgaWYgdmFsdWVfbGlzdDoKKyAgICB2YWx1ZV9saXN0ID0gIlxuICAgICIgKyB2YWx1ZV9saXN0ICsgIlxuIgorICBhbmRyb2lkX2JwICs9IF9WQUxVRV9MSVNUX1RFTVBMQVRFLmZvcm1hdCh2YWx1ZV9saXN0KSArICJcbiIKKworICBmb3IgcGFja2FnZSBpbiBwYWNrYWdlczoKKyAgICBhbmRyb2lkX2JwICs9IF9BQ09ORklHX1ZBTFVFU19URU1QTEFURS5mb3JtYXQoCisgICAgICAgIF9BQ09ORklHX1ZBTFVFU19OQU1FX1NVRkZJWC5mb3JtYXQocGFja2FnZSksIHBhY2thZ2UsIGZpbGVfbmFtZQorICAgICkKKyAgICBhbmRyb2lkX2JwICs9ICJcbiIKKworICByZXR1cm4gYW5kcm9pZF9icAorCisKK2RlZiBfd3JpdGVfYW5kcm9pZF9icChuZXdfYW5kcm9pZF9icDogc3RyLCBvdXQ6IHBhdGhsaWIuUGF0aCkgLT4gTm9uZToKKyAgaWYgbm90IG91dC5pc19kaXIoKToKKyAgICBvdXQubWtkaXIocGFyZW50cz1UcnVlLCBleGlzdF9vaz1UcnVlKQorCisgIG91dHB1dCA9IG91dC5qb2lucGF0aChfQU5EUk9JRF9CUF9GSUxFX05BTUUpCisgIHdpdGggb3BlbihvdXRwdXQsICJyKyIsIGVuY29kaW5nPSJ1dGY4IikgYXMgZmlsZToKKyAgICBsaW5lcyA9IFtdCisgICAgZm9yIGxpbmUgaW4gZmlsZToKKyAgICAgIGxpbmUgPSBsaW5lLnJzdHJpcCgiXG4iKQorICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCJBQ09ORklHX1ZBTFVFU19MSVNUX0xPQ0FMIik6CisgICAgICAgIGJyZWFrCisgICAgICBsaW5lcy5hcHBlbmQobGluZSkKKyAgICAjIE92ZXJ3cml0ZSB0aGUgZmlsZSB3aXRoIHRoZSB1cGRhdGVkIGNvbnRlbnRzLgorICAgIGZpbGUuc2VlaygwKQorICAgIGZpbGUudHJ1bmNhdGUoKQorICAgIGZpbGUud3JpdGUoIlxuIi5qb2luKGxpbmVzKSkKKyAgICBmaWxlLndyaXRlKG5ld19hbmRyb2lkX2JwKQorCisKK2RlZiBtYWluKGFyZ3MpOgorICAiIiJQcm9ncmFtIGVudHJ5IHBvaW50LiIiIgorICBhcmdzX3BhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgYXJnc19wYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgIi0tb3ZlcnJpZGVzIiwKKyAgICAgIHJlcXVpcmVkPVRydWUsCisgICAgICBoZWxwPSJUaGUgcGF0aCB0byBvdmVycmlkZSBmaWxlLiIsCisgICkKKyAgYXJnc19wYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgIi0tb3V0IiwKKyAgICAgIHJlcXVpcmVkPVRydWUsCisgICAgICBoZWxwPSJUaGUgcGF0aCB0byBvdXRwdXQgZGlyZWN0b3J5LiIsCisgICkKKworICBhcmdzID0gYXJnc19wYXJzZXIucGFyc2VfYXJncyhhcmdzKQorICBmaWxlID0gcGF0aGxpYi5QYXRoKGFyZ3Mub3ZlcnJpZGVzKQorICBvdXQgPSBwYXRobGliLlBhdGgoYXJncy5vdXQpCisgIGlmIG5vdCBmaWxlLmlzX2ZpbGUoKToKKyAgICByYWlzZSBGaWxlTm90Rm91bmRFcnJvcihmIkZpbGUgJ3tmaWxlfScgaXMgbm90IGZvdW5kIikKKworICBwYWNrYWdlcyA9IF9wYXJzZV9wYWNrYWdlcyhmaWxlKQorICBuZXdfYW5kcm9pZF9icCA9IF9jcmVhdGVfYW5kcm9pZF9icChwYWNrYWdlcywgZmlsZS5uYW1lKQorICBfd3JpdGVfYW5kcm9pZF9icChuZXdfYW5kcm9pZF9icCwgb3V0KQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgIG1haW4oc3lzLmFyZ3ZbMTpdKQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9wcmludGZsYWdzL0FuZHJvaWQuYnAgYi90b29scy9hY29uZmlnL3ByaW50ZmxhZ3MvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjdiY2EzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9wcmludGZsYWdzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMSBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbIkFuZHJvaWQtQXBhY2hlLTIuMCJdLAorfQorCitydXN0X2RlZmF1bHRzIHsKKyAgICBuYW1lOiAicHJpbnRmbGFncy5kZWZhdWx0cyIsCisgICAgZWRpdGlvbjogIjIwMjEiLAorICAgIGNsaXBweV9saW50czogImFuZHJvaWQiLAorICAgIGxpbnRzOiAiYW5kcm9pZCIsCisgICAgc3JjczogWyJzcmMvbWFpbi5ycyJdLAorICAgIHJ1c3RsaWJzOiBbCisgICAgICAgICJsaWJhY29uZmlnX3Byb3RvcyIsCisgICAgICAgICJsaWJhbnlob3ciLAorICAgICAgICAibGlicHJvdG9idWYiLAorICAgICAgICAibGlicmVnZXgiLAorICAgIF0sCit9CisKK3J1c3RfYmluYXJ5IHsKKyAgICBuYW1lOiAicHJpbnRmbGFncyIsCisgICAgZGVmYXVsdHM6IFsicHJpbnRmbGFncy5kZWZhdWx0cyJdLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICBdLAorfQorCitydXN0X3Rlc3RfaG9zdCB7CisgICAgbmFtZTogInByaW50ZmxhZ3MudGVzdCIsCisgICAgZGVmYXVsdHM6IFsicHJpbnRmbGFncy5kZWZhdWx0cyJdLAorICAgIHRlc3Rfc3VpdGVzOiBbImdlbmVyYWwtdGVzdHMiXSwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvcHJpbnRmbGFncy9DYXJnby50b21sIGIvdG9vbHMvYWNvbmZpZy9wcmludGZsYWdzL0NhcmdvLnRvbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMxM2Y1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvcHJpbnRmbGFncy9DYXJnby50b21sCkBAIC0wLDAgKzEsMTUgQEAKK1twYWNrYWdlXQorbmFtZSA9ICJwcmludGZsYWdzIgordmVyc2lvbiA9ICIwLjEuMCIKK2VkaXRpb24gPSAiMjAyMSIKKworW2ZlYXR1cmVzXQorZGVmYXVsdCA9IFsiY2FyZ28iXQorY2FyZ28gPSBbXQorCitbZGVwZW5kZW5jaWVzXQorYW55aG93ID0gIjEuMC42OSIKK3Bhc3RlID0gIjEuMC4xMSIKK3Byb3RvYnVmID0gIjMuMi4wIgorcmVnZXggPSAiMS4xMC4zIgorYWNvbmZpZ19wcm90b3MgPSB7IHBhdGggPSAiLi4vYWNvbmZpZ19wcm90b3MiIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvcHJpbnRmbGFncy9zcmMvbWFpbi5ycyBiL3Rvb2xzL2Fjb25maWcvcHJpbnRmbGFncy9zcmMvbWFpbi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODM4YjUxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9wcmludGZsYWdzL3NyYy9tYWluLnJzCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8hIGBwcmludGZsYWdzYCBpcyBhIGRldmljZSBiaW5hcnkgdG8gcHJpbnQgZmVhdHVyZSBmbGFncy4KKwordXNlIGFjb25maWdfcHJvdG9zOjpQcm90b0ZsYWdTdGF0ZSBhcyBTdGF0ZTsKK3VzZSBhY29uZmlnX3Byb3Rvczo6UHJvdG9QYXJzZWRGbGFnczsKK3VzZSBhbnlob3c6OntiYWlsLCBDb250ZXh0LCBSZXN1bHR9OwordXNlIHJlZ2V4OjpSZWdleDsKK3VzZSBzdGQ6OmNvbGxlY3Rpb25zOjpCVHJlZU1hcDsKK3VzZSBzdGQ6OmNvbGxlY3Rpb25zOjpIYXNoTWFwOwordXNlIHN0ZDo6cHJvY2Vzczo6Q29tbWFuZDsKK3VzZSBzdGQ6Ontmcywgc3RyfTsKKworZm4gcGFyc2VfZGV2aWNlX2NvbmZpZyhyYXc6ICZzdHIpIC0+IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHsKKyAgICBsZXQgbXV0IGZsYWdzID0gSGFzaE1hcDo6bmV3KCk7CisgICAgbGV0IHJlZ2V4ID0gUmVnZXg6Om5ldyhyIig/bSleKFtbWzphbG51bTpdXV9dKy9bW1s6YWxudW06XV1fXC5dKyk9KHRydWV8ZmFsc2UpJCIpLnVud3JhcCgpOworICAgIGZvciBjYXB0dXJlIGluIHJlZ2V4LmNhcHR1cmVzX2l0ZXIocmF3KSB7CisgICAgICAgIGxldCBrZXkgPSBjYXB0dXJlLmdldCgxKS51bndyYXAoKS5hc19zdHIoKS50b19zdHJpbmcoKTsKKyAgICAgICAgbGV0IHZhbHVlID0gbWF0Y2ggY2FwdHVyZS5nZXQoMikudW53cmFwKCkuYXNfc3RyKCkgeworICAgICAgICAgICAgInRydWUiID0+IGZvcm1hdCEoIns6P30gKGRldmljZV9jb25maWcpIiwgU3RhdGU6OkVOQUJMRUQpLAorICAgICAgICAgICAgImZhbHNlIiA9PiBmb3JtYXQhKCJ7Oj99IChkZXZpY2VfY29uZmlnKSIsIFN0YXRlOjpESVNBQkxFRCksCisgICAgICAgICAgICBfID0+IHBhbmljISgpLAorICAgICAgICB9OworICAgICAgICBmbGFncy5pbnNlcnQoa2V5LCB2YWx1ZSk7CisgICAgfQorICAgIGZsYWdzCit9CisKK2ZuIHh4ZChieXRlczogJlt1OF0pIC0+IFN0cmluZyB7CisgICAgbGV0IG4gPSA4Lm1pbihieXRlcy5sZW4oKSk7CisgICAgbGV0IG11dCB2ID0gVmVjOjp3aXRoX2NhcGFjaXR5KG4pOworICAgIGZvciBieXRlIGluIGJ5dGVzLml0ZXIoKS50YWtlKG4pIHsKKyAgICAgICAgdi5wdXNoKGZvcm1hdCEoIns6MDJ4fSIsIGJ5dGUpKTsKKyAgICB9CisgICAgbGV0IHRyYWlsZXIgPSBtYXRjaCBieXRlcy5sZW4oKSB7CisgICAgICAgIDAuLj04ID0+ICIiLAorICAgICAgICBfID0+ICIgLi4iLAorICAgIH07CisgICAgZm9ybWF0ISgiW3t9e31dIiwgdi5qb2luKCIgIiksIHRyYWlsZXIpCit9CisKK2ZuIG1haW4oKSAtPiBSZXN1bHQ8KCk+IHsKKyAgICAvLyByZWFkIGRldmljZV9jb25maWcKKyAgICBsZXQgb3V0cHV0ID0gQ29tbWFuZDo6bmV3KCIvc3lzdGVtL2Jpbi9kZXZpY2VfY29uZmlnIikuYXJnKCJsaXN0Iikub3V0cHV0KCk/OworICAgIGlmICFvdXRwdXQuc3RhdHVzLnN1Y2Nlc3MoKSB7CisgICAgICAgIGxldCByZWFzb24gPSBtYXRjaCBvdXRwdXQuc3RhdHVzLmNvZGUoKSB7CisgICAgICAgICAgICBTb21lKGNvZGUpID0+IGZvcm1hdCEoImV4aXQgY29kZSB7fSIsIGNvZGUpLAorICAgICAgICAgICAgTm9uZSA9PiAidGVybWluYXRlZCBieSBzaWduYWwiLnRvX3N0cmluZygpLAorICAgICAgICB9OworICAgICAgICBiYWlsISgiZmFpbGVkIHRvIGV4ZWN1dGUgZGV2aWNlX2NvbmZpZzoge30iLCByZWFzb24pOworICAgIH0KKyAgICBsZXQgZGNfc3Rkb3V0ID0gc3RyOjpmcm9tX3V0ZjgoJm91dHB1dC5zdGRvdXQpPzsKKyAgICBsZXQgZGV2aWNlX2NvbmZpZ19mbGFncyA9IHBhcnNlX2RldmljZV9jb25maWcoZGNfc3Rkb3V0KTsKKworICAgIC8vIHJlYWQgYWNvbmZpZ19mbGFncy5wYiBmaWxlcworICAgIGxldCBhcGV4X3BhdHRlcm4gPSBSZWdleDo6bmV3KHIiXi9hcGV4L1teQF0rXC5bXkBdKyQiKS51bndyYXAoKTsKKyAgICBsZXQgbXV0IG1vdW50X3BvaW50cyA9IHZlYyFbCisgICAgICAgICJzeXN0ZW0iLnRvX3N0cmluZygpLAorICAgICAgICAic3lzdGVtX2V4dCIudG9fc3RyaW5nKCksCisgICAgICAgICJwcm9kdWN0Ii50b19zdHJpbmcoKSwKKyAgICAgICAgInZlbmRvciIudG9fc3RyaW5nKCksCisgICAgXTsKKyAgICBmb3IgYXBleCBpbiBmczo6cmVhZF9kaXIoIi9hcGV4Iik/IHsKKyAgICAgICAgbGV0IHBhdGhfbmFtZSA9IGFwZXg/LnBhdGgoKS5kaXNwbGF5KCkudG9fc3RyaW5nKCk7CisgICAgICAgIGlmIGxldCBTb21lKGNhbm9uaWNhbF9wYXRoKSA9IGFwZXhfcGF0dGVybi5jYXB0dXJlcygmcGF0aF9uYW1lKSB7CisgICAgICAgICAgICBtb3VudF9wb2ludHMucHVzaChjYW5vbmljYWxfcGF0aC5nZXQoMCkudW53cmFwKCkuYXNfc3RyKCkudG9fb3duZWQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsZXQgbXV0IGZsYWdzOiBCVHJlZU1hcDxTdHJpbmcsIFZlYzxTdHJpbmc+PiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICBmb3IgbW91bnRfcG9pbnQgaW4gbW91bnRfcG9pbnRzIHsKKyAgICAgICAgbGV0IHBhdGggPSBmb3JtYXQhKCIve30vZXRjL2Fjb25maWdfZmxhZ3MucGIiLCBtb3VudF9wb2ludCk7CisgICAgICAgIGxldCBPayhieXRlcykgPSBmczo6cmVhZCgmcGF0aCkgZWxzZSB7CisgICAgICAgICAgICBlcHJpbnRsbiEoIndhcm5pbmc6IGZhaWxlZCB0byByZWFkIHt9IiwgcGF0aCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfTsKKyAgICAgICAgbGV0IHBhcnNlZF9mbGFnczogUHJvdG9QYXJzZWRGbGFncyA9IHByb3RvYnVmOjpNZXNzYWdlOjpwYXJzZV9mcm9tX2J5dGVzKCZieXRlcykKKyAgICAgICAgICAgIC53aXRoX2NvbnRleHQofHwgeworICAgICAgICAgICAgICAgIGZvcm1hdCEoImZhaWxlZCB0byBwYXJzZSB7fSAoe30sIHt9IGJ5dGUocykpIiwgcGF0aCwgeHhkKCZieXRlcyksIGJ5dGVzLmxlbigpKQorICAgICAgICAgICAgfSk/OworICAgICAgICBmb3IgZmxhZyBpbiBwYXJzZWRfZmxhZ3MucGFyc2VkX2ZsYWcgeworICAgICAgICAgICAgbGV0IGtleSA9IGZvcm1hdCEoInt9L3t9Lnt9IiwgZmxhZy5uYW1lc3BhY2UoKSwgZmxhZy5wYWNrYWdlKCksIGZsYWcubmFtZSgpKTsKKyAgICAgICAgICAgIGxldCB2YWx1ZSA9IGZvcm1hdCEoIns6P30gKyB7Oj99ICh7fSkiLCBmbGFnLnBlcm1pc3Npb24oKSwgZmxhZy5zdGF0ZSgpLCBtb3VudF9wb2ludCk7CisgICAgICAgICAgICBmbGFncy5lbnRyeShrZXkpLm9yX2RlZmF1bHQoKS5wdXNoKHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHByaW50IGZsYWdzCisgICAgZm9yIChrZXksIG11dCB2YWx1ZSkgaW4gZmxhZ3MgeworICAgICAgICBpZiBsZXQgU29tZShkY192YWx1ZSkgPSBkZXZpY2VfY29uZmlnX2ZsYWdzLmdldCgma2V5KSB7CisgICAgICAgICAgICB2YWx1ZS5wdXNoKGRjX3ZhbHVlLnRvX3N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGxuISgie306IHt9Iiwga2V5LCB2YWx1ZS5qb2luKCIsICIpKTsKKyAgICB9CisKKyAgICBPaygoKSkKK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3BhcnNlX2RldmljZV9jb25maWcoKSB7CisgICAgICAgIGxldCBpbnB1dCA9IHIjIgorbmFtZXNwYWNlX29uZS9jb20uZm9vLmJhci5mbGFnX29uZT10cnVlCituYW1lc3BhY2Vfb25lL2NvbS5mb28uYmFyLmZsYWdfdHdvPWZhbHNlCityYW5kb21fbm9pc2U7CituYW1lc3BhY2VfdHdvL2FuZHJvaWQuZmxhZ19vbmU9dHJ1ZQorbmFtZXNwYWNlX3R3by9hbmRyb2lkLmZsYWdfdHdvPW5vbnNlbnNlCisiIzsKKyAgICAgICAgbGV0IGV4cGVjdGVkID0gSGFzaE1hcDo6ZnJvbShbCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgIm5hbWVzcGFjZV9vbmUvY29tLmZvby5iYXIuZmxhZ19vbmUiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgICAgICJFTkFCTEVEIChkZXZpY2VfY29uZmlnKSIudG9fc3RyaW5nKCksCisgICAgICAgICAgICApLAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICJuYW1lc3BhY2Vfb25lL2NvbS5mb28uYmFyLmZsYWdfdHdvIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAiRElTQUJMRUQgKGRldmljZV9jb25maWcpIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoIm5hbWVzcGFjZV90d28vYW5kcm9pZC5mbGFnX29uZSIudG9fc3RyaW5nKCksICJFTkFCTEVEIChkZXZpY2VfY29uZmlnKSIudG9fc3RyaW5nKCkpLAorICAgICAgICBdKTsKKyAgICAgICAgbGV0IGFjdHVhbCA9IHBhcnNlX2RldmljZV9jb25maWcoaW5wdXQpOworICAgICAgICBhc3NlcnRfZXEhKGV4cGVjdGVkLCBhY3R1YWwpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3h4ZCgpIHsKKyAgICAgICAgbGV0IGlucHV0ID0gWzB4MCwgMHgxLCAweDIsIDB4MywgMHg0LCAweDUsIDB4NiwgMHg3LCAweDgsIDB4OV07CisgICAgICAgIGFzc2VydF9lcSEoIltdIiwgJnh4ZCgmaW5wdXRbMC4uMF0pKTsKKyAgICAgICAgYXNzZXJ0X2VxISgiWzAwXSIsICZ4eGQoJmlucHV0WzAuLjFdKSk7CisgICAgICAgIGFzc2VydF9lcSEoIlswMCAwMV0iLCAmeHhkKCZpbnB1dFswLi4yXSkpOworICAgICAgICBhc3NlcnRfZXEhKCJbMDAgMDEgMDIgMDMgMDQgMDUgMDZdIiwgJnh4ZCgmaW5wdXRbMC4uN10pKTsKKyAgICAgICAgYXNzZXJ0X2VxISgiWzAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3XSIsICZ4eGQoJmlucHV0WzAuLjhdKSk7CisgICAgICAgIGFzc2VydF9lcSEoIlswMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyAuLl0iLCAmeHhkKCZpbnB1dFswLi45XSkpOworICAgICAgICBhc3NlcnRfZXEhKCJbMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcgLi5dIiwgJnh4ZCgmaW5wdXQpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL3J1c3RmbXQudG9tbCBiL3Rvb2xzL2Fjb25maWcvcnVzdGZtdC50b21sCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjI5MWU5OWIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL3J1c3RmbXQudG9tbApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9zb29uZy9zY3JpcHRzL3J1c3RmbXQudG9tbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL2F1dG9fZ2VuX3Rlc3RfY29uZmlnLnB5IGIvdG9vbHMvYXV0b19nZW5fdGVzdF9jb25maWcucHkKaW5kZXggY2U2NDE2MC4uZDU0YzQxMiAxMDA3NTUKLS0tIGEvdG9vbHMvYXV0b19nZW5fdGVzdF9jb25maWcucHkKKysrIGIvdG9vbHMvYXV0b19nZW5fdGVzdF9jb25maWcucHkKQEAgLTE3LDYgKzE3LDggQEAKICIiIkEgdG9vbCB0byBnZW5lcmF0ZSBUcmFkZUZlZCB0ZXN0IGNvbmZpZyBmaWxlLgogIiIiCiAKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IHJlCiBpbXBvcnQgb3MKIGltcG9ydCBzaHV0aWwKIGltcG9ydCBzeXMKQEAgLTMyLDYgKzM0LDcgQEAKIFBMQUNFSE9MREVSX1BBQ0tBR0UgPSAne1BBQ0tBR0V9JwogUExBQ0VIT0xERVJfUlVOTkVSID0gJ3tSVU5ORVJ9JwogUExBQ0VIT0xERVJfVEVTVF9UWVBFID0gJ3tURVNUX1RZUEV9JworUExBQ0VIT0xERVJfRVhUUkFfVEVTVF9SVU5ORVJfQ09ORklHUyA9ICd7RVhUUkFfVEVTVF9SVU5ORVJfQ09ORklHU30nCiAKIAogZGVmIG1haW4oYXJndik6CkBAIC00Miw0MiArNDUsODcgQEAKICAgUmV0dXJuczoKICAgICAwIGlmIG5vIGVycm9yLCBvdGhlcndpc2UgMS4KICAgIiIiCi0gIGlmIGxlbihhcmd2KSAhPSA0IGFuZCBsZW4oYXJndikgIT0gNjoKLSAgICBzeXMuc3RkZXJyLndyaXRlKAotICAgICAgICAnSW52YWxpZCBhcmd1bWVudHMuIFRoZSBzY3JpcHQgcmVxdWlyZXMgNCBhcmd1bWVudHMgZm9yIGZpbGUgcGF0aHM6ICcKLSAgICAgICAgJ3RhcmdldF9jb25maWcgYW5kcm9pZF9tYW5pZmVzdCBlbXB0eV9jb25maWcgJwotICAgICAgICAnaW5zdHJ1bWVudGF0aW9uX3Rlc3RfY29uZmlnX3RlbXBsYXRlICcKLSAgICAgICAgJ2FuZCAyIG9wdGlvbmFsIGFyZ3VtZW50cyBmb3IgZXh0cmEgY29uZmlnczogJwotICAgICAgICAnLS1leHRyYS1jb25maWdzIFwnRVhUUkFfQ09ORklHU1wnLlxuJykKLSAgICByZXR1cm4gMQogCi0gIHRhcmdldF9jb25maWcgPSBhcmd2WzBdCi0gIGFuZHJvaWRfbWFuaWZlc3QgPSBhcmd2WzFdCi0gIGVtcHR5X2NvbmZpZyA9IGFyZ3ZbMl0KLSAgaW5zdHJ1bWVudGF0aW9uX3Rlc3RfY29uZmlnX3RlbXBsYXRlID0gYXJndlszXQotICBleHRyYV9jb25maWdzID0gJ1xuJy5qb2luKGFyZ3ZbNV0uc3BsaXQoJ1xcbicpKSBpZiBsZW4oYXJndikgPT0gNiBlbHNlICcnCisgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICJ0YXJnZXRfY29uZmlnIiwKKyAgICAgIGhlbHA9IlBhdGggdG8gdGhlIGdlbmVyYXRlZCBvdXRwdXQgY29uZmlnLiIpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAiYW5kcm9pZF9tYW5pZmVzdCIsCisgICAgICBoZWxwPSJQYXRoIHRvIEFuZHJvaWRNYW5pZmVzdC54bWwgb3Igb3V0cHV0IG9mICdhYXB0MiBkdW1wIHhtbHRyZWUnIHdpdGggLnhtbHRyZWUgZXh0ZW5zaW9uLiIpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAiZW1wdHlfY29uZmlnIiwKKyAgICAgIGhlbHA9IlBhdGggdG8gdGhlIGVtcHR5IGNvbmZpZyB0ZW1wbGF0ZS4iKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgImluc3RydW1lbnRhdGlvbl90ZXN0X2NvbmZpZ190ZW1wbGF0ZSIsCisgICAgICBoZWxwPSJQYXRoIHRvIHRoZSBpbnN0cnVtZW50YXRpb24gdGVzdCBjb25maWcgdGVtcGxhdGUuIikKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1leHRyYS1jb25maWdzIiwgZGVmYXVsdD0iIikKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1leHRyYS10ZXN0LXJ1bm5lci1jb25maWdzIiwgZGVmYXVsdD0iIikKKyAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3YpCiAKLSAgbWFuaWZlc3QgPSBwYXJzZShhbmRyb2lkX21hbmlmZXN0KQotICBpbnN0cnVtZW50YXRpb25fZWxlbWVudHMgPSBtYW5pZmVzdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5zdHJ1bWVudGF0aW9uJykKLSAgbWFuaWZlc3RfZWxlbWVudHMgPSBtYW5pZmVzdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbWFuaWZlc3QnKQotICBpZiBsZW4oaW5zdHJ1bWVudGF0aW9uX2VsZW1lbnRzKSAhPSAxIG9yIGxlbihtYW5pZmVzdF9lbGVtZW50cykgIT0gMToKLSAgICAjIEZhaWxlZCB0byBsb2NhdGUgaW5zdHJ1bWVudGF0aW9uIG9yIG1hbmlmZXN0IGVsZW1lbnQgaW4gQW5kcm9pZE1hbmlmZXN0LgotICAgICMgZmlsZS4gRW1wdHkgdGVzdCBjb25maWcgZmlsZSB3aWxsIGJlIGNyZWF0ZWQuCi0gICAgc2h1dGlsLmNvcHlmaWxlKGVtcHR5X2NvbmZpZywgdGFyZ2V0X2NvbmZpZykKLSAgICByZXR1cm4gMAorICB0YXJnZXRfY29uZmlnID0gYXJncy50YXJnZXRfY29uZmlnCisgIGFuZHJvaWRfbWFuaWZlc3QgPSBhcmdzLmFuZHJvaWRfbWFuaWZlc3QKKyAgZW1wdHlfY29uZmlnID0gYXJncy5lbXB0eV9jb25maWcKKyAgaW5zdHJ1bWVudGF0aW9uX3Rlc3RfY29uZmlnX3RlbXBsYXRlID0gYXJncy5pbnN0cnVtZW50YXRpb25fdGVzdF9jb25maWdfdGVtcGxhdGUKKyAgZXh0cmFfY29uZmlncyA9ICdcbicuam9pbihhcmdzLmV4dHJhX2NvbmZpZ3Muc3BsaXQoJ1xcbicpKQorICBleHRyYV90ZXN0X3J1bm5lcl9jb25maWdzID0gJ1xuJy5qb2luKGFyZ3MuZXh0cmFfdGVzdF9ydW5uZXJfY29uZmlncy5zcGxpdCgnXFxuJykpCiAKICAgbW9kdWxlID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKHRhcmdldF9jb25maWcpKVswXQotICBpbnN0cnVtZW50YXRpb24gPSBpbnN0cnVtZW50YXRpb25fZWxlbWVudHNbMF0KLSAgbWFuaWZlc3QgPSBtYW5pZmVzdF9lbGVtZW50c1swXQotICBpZiBBVFRSSUJVVEVfTEFCRUwgaW4gaW5zdHJ1bWVudGF0aW9uLmF0dHJpYnV0ZXM6Ci0gICAgbGFiZWwgPSBpbnN0cnVtZW50YXRpb24uYXR0cmlidXRlc1tBVFRSSUJVVEVfTEFCRUxdLnZhbHVlCi0gIGVsc2U6CisKKyAgIyBJZiB0aGUgQW5kcm9pZE1hbmlmZXN0LnhtbCBpcyBub3QgYXZhaWxhYmxlLCBidXQgdGhlIEFQSyBpcywgdGhpcyB0b29sIGFsc28KKyAgIyBhY2NlcHRzIHRoZSBvdXRwdXQgb2YgYGFhcHQyIGR1bXAgeG1sdHJlZSA8YXBrPiBBbmRyb2lkTWFuaWZlc3QueG1sYCB3cml0dGVuCisgICMgaW50byBhIGZpbGUuIFRoaXMgaXMgYSBjdXN0b20gc3RydWN0dXJlZCBhYXB0MiBvdXRwdXQgLSBub3QgcmF3IFhNTCEKKyAgaWYgYW5kcm9pZF9tYW5pZmVzdC5lbmRzd2l0aCgiLnhtbHRyZWUiKToKICAgICBsYWJlbCA9IG1vZHVsZQotICBydW5uZXIgPSBpbnN0cnVtZW50YXRpb24uYXR0cmlidXRlc1tBVFRSSUJVVEVfUlVOTkVSXS52YWx1ZQotICBwYWNrYWdlID0gbWFuaWZlc3QuYXR0cmlidXRlc1tBVFRSSUJVVEVfUEFDS0FHRV0udmFsdWUKKyAgICB3aXRoIG9wZW4oYW5kcm9pZF9tYW5pZmVzdCwgZW5jb2Rpbmc9InV0Zi04IikgYXMgbWFuaWZlc3Q6CisgICAgICAjIGUuZy4gQTogcGFja2FnZT0iYW5kcm9pZC50ZXN0LmV4YW1wbGUuaGVsbG93b3JsZCIgKFJhdzogImFuZHJvaWQudGVzdC5leGFtcGxlLmhlbGxvd29ybGQiKQorICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisgICAgICBwYXR0ZXJuID0gcmUuY29tcGlsZShyIlwoUmF3OlxzXCIoLiopXCJcKSQiKQorICAgICAgY3Vycl9lbGVtZW50ID0gTm9uZQorICAgICAgZm9yIGxpbmUgaW4gbWFuaWZlc3Q6CisgICAgICAgIGN1cnJfbGluZSA9IGxpbmUuc3RyaXAoKQorICAgICAgICBpZiBjdXJyX2xpbmUuc3RhcnRzd2l0aCgiRToiKToKKyAgICAgICAgICAjIGUuZy4gIkU6IGluc3RydW1lbnRhdGlvbiAobGluZT05KSIKKyAgICAgICAgICAjICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXgorICAgICAgICAgIGN1cnJfZWxlbWVudCA9IGN1cnJfbGluZS5zcGxpdCgiICIpWzFdCisgICAgICAgIGlmIGN1cnJfZWxlbWVudCA9PSAiaW5zdHJ1bWVudGF0aW9uIjoKKyAgICAgICAgICBpZiBBVFRSSUJVVEVfUlVOTkVSIGluIGN1cnJfbGluZToKKyAgICAgICAgICAgIHJ1bm5lciA9ICByZS5maW5kYWxsKHBhdHRlcm4sIGN1cnJfbGluZSlbMF0KKyAgICAgICAgICBpZiBBVFRSSUJVVEVfTEFCRUwgaW4gY3Vycl9saW5lOgorICAgICAgICAgICAgbGFiZWwgPSByZS5maW5kYWxsKHBhdHRlcm4sIGN1cnJfbGluZSlbMF0KKyAgICAgICAgaWYgY3Vycl9lbGVtZW50ID09ICJtYW5pZmVzdCI6CisgICAgICAgICAgaWYgQVRUUklCVVRFX1BBQ0tBR0UgaW4gY3Vycl9saW5lOgorICAgICAgICAgICAgcGFja2FnZSA9IHJlLmZpbmRhbGwocGF0dGVybiwgY3Vycl9saW5lKVswXQorCisgICAgaWYgbm90IChydW5uZXIgYW5kIGxhYmVsIGFuZCBwYWNrYWdlKToKKyAgICAgICMgRmFpbGVkIHRvIGxvY2F0ZSBpbnN0cnVtZW50YXRpb24gb3IgbWFuaWZlc3QgZWxlbWVudCBpbiBBbmRyb2lkTWFuaWZlc3QuCisgICAgICAjIGZpbGUuIEVtcHR5IHRlc3QgY29uZmlnIGZpbGUgd2lsbCBiZSBjcmVhdGVkLgorICAgICAgc2h1dGlsLmNvcHlmaWxlKGVtcHR5X2NvbmZpZywgdGFyZ2V0X2NvbmZpZykKKyAgICAgIHJldHVybiAwCisKKyAgZWxzZToKKyAgICAjIElmIHRoZSBBbmRyb2lkTWFuaWZlc3QueG1sIGZpbGUgaXMgZGlyZWN0bHkgYXZhaWxhYmxlLCByZWFkIGl0IGFzIGFuIFhNTCBmaWxlLgorICAgIG1hbmlmZXN0ID0gcGFyc2UoYW5kcm9pZF9tYW5pZmVzdCkKKyAgICBpbnN0cnVtZW50YXRpb25fZWxlbWVudHMgPSBtYW5pZmVzdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5zdHJ1bWVudGF0aW9uJykKKyAgICBtYW5pZmVzdF9lbGVtZW50cyA9IG1hbmlmZXN0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdtYW5pZmVzdCcpCisgICAgaWYgbGVuKGluc3RydW1lbnRhdGlvbl9lbGVtZW50cykgIT0gMSBvciBsZW4obWFuaWZlc3RfZWxlbWVudHMpICE9IDE6CisgICAgICAjIEZhaWxlZCB0byBsb2NhdGUgaW5zdHJ1bWVudGF0aW9uIG9yIG1hbmlmZXN0IGVsZW1lbnQgaW4gQW5kcm9pZE1hbmlmZXN0LgorICAgICAgIyBmaWxlLiBFbXB0eSB0ZXN0IGNvbmZpZyBmaWxlIHdpbGwgYmUgY3JlYXRlZC4KKyAgICAgIHNodXRpbC5jb3B5ZmlsZShlbXB0eV9jb25maWcsIHRhcmdldF9jb25maWcpCisgICAgICByZXR1cm4gMAorCisgICAgaW5zdHJ1bWVudGF0aW9uID0gaW5zdHJ1bWVudGF0aW9uX2VsZW1lbnRzWzBdCisgICAgbWFuaWZlc3QgPSBtYW5pZmVzdF9lbGVtZW50c1swXQorICAgIGlmIEFUVFJJQlVURV9MQUJFTCBpbiBpbnN0cnVtZW50YXRpb24uYXR0cmlidXRlczoKKyAgICAgIGxhYmVsID0gaW5zdHJ1bWVudGF0aW9uLmF0dHJpYnV0ZXNbQVRUUklCVVRFX0xBQkVMXS52YWx1ZQorICAgIGVsc2U6CisgICAgICBsYWJlbCA9IG1vZHVsZQorICAgIHJ1bm5lciA9IGluc3RydW1lbnRhdGlvbi5hdHRyaWJ1dGVzW0FUVFJJQlVURV9SVU5ORVJdLnZhbHVlCisgICAgcGFja2FnZSA9IG1hbmlmZXN0LmF0dHJpYnV0ZXNbQVRUUklCVVRFX1BBQ0tBR0VdLnZhbHVlCisKICAgdGVzdF90eXBlID0gKCdJbnN0cnVtZW50YXRpb25UZXN0JwotICAgICAgICAgICAgICAgaWYgcnVubmVyLmVuZHN3aXRoKCcuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcicpCi0gICAgICAgICAgICAgICBlbHNlICdBbmRyb2lkSlVuaXRUZXN0JykKKyAgICAgICAgICAgICAgaWYgcnVubmVyLmVuZHN3aXRoKCcuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcicpCisgICAgICAgICAgICAgIGVsc2UgJ0FuZHJvaWRKVW5pdFRlc3QnKQogCiAgIHdpdGggb3BlbihpbnN0cnVtZW50YXRpb25fdGVzdF9jb25maWdfdGVtcGxhdGUpIGFzIHRlbXBsYXRlOgogICAgIGNvbmZpZyA9IHRlbXBsYXRlLnJlYWQoKQpAQCAtODYsNiArMTM0LDcgQEAKICAgICBjb25maWcgPSBjb25maWcucmVwbGFjZShQTEFDRUhPTERFUl9QQUNLQUdFLCBwYWNrYWdlKQogICAgIGNvbmZpZyA9IGNvbmZpZy5yZXBsYWNlKFBMQUNFSE9MREVSX1RFU1RfVFlQRSwgdGVzdF90eXBlKQogICAgIGNvbmZpZyA9IGNvbmZpZy5yZXBsYWNlKFBMQUNFSE9MREVSX0VYVFJBX0NPTkZJR1MsIGV4dHJhX2NvbmZpZ3MpCisgICAgY29uZmlnID0gY29uZmlnLnJlcGxhY2UoUExBQ0VIT0xERVJfRVhUUkFfVEVTVF9SVU5ORVJfQ09ORklHUywgZXh0cmFfdGVzdF9ydW5uZXJfY29uZmlncykKICAgICBjb25maWcgPSBjb25maWcucmVwbGFjZShQTEFDRUhPTERFUl9SVU5ORVIsIHJ1bm5lcikKICAgICB3aXRoIG9wZW4odGFyZ2V0X2NvbmZpZywgJ3cnKSBhcyBjb25maWdfZmlsZToKICAgICAgIGNvbmZpZ19maWxlLndyaXRlKGNvbmZpZykKZGlmZiAtLWdpdCBhL3Rvb2xzL2F1dG9fZ2VuX3Rlc3RfY29uZmlnX3Rlc3QucHkgYi90b29scy9hdXRvX2dlbl90ZXN0X2NvbmZpZ190ZXN0LnB5CmluZGV4IDUxYTg1ODMuLmI3ZWYwYjAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2F1dG9fZ2VuX3Rlc3RfY29uZmlnX3Rlc3QucHkKKysrIGIvdG9vbHMvYXV0b19nZW5fdGVzdF9jb25maWdfdGVzdC5weQpAQCAtMzAsNiArMzAsMjQgQEAKIDwvbWFuaWZlc3Q+CiAiIiIKIAorWE1MVFJFRV9KVU5JVF9URVNUID0gIiIiTjogYW5kcm9pZD1odHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQgKGxpbmU9MikKKyAgRTogbWFuaWZlc3QgKGxpbmU9MikKKyAgICBBOiBwYWNrYWdlPSJjb20uYW5kcm9pZC5teS50ZXN0cy54IiAoUmF3OiAiY29tLmFuZHJvaWQubXkudGVzdHMueCIpCisgICAgICBFOiBpbnN0cnVtZW50YXRpb24gKGxpbmU9OSkKKyAgICAgICAgQTogaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkOmxhYmVsKDB4MDEwMTAwMDEpPSJUZXN0TW9kdWxlIiAoUmF3OiAiVGVzdE1vZHVsZSIpCisgICAgICAgIEE6IGh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZDpuYW1lKDB4MDEwMTAwMDMpPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiIChSYXc6ICJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiKQorICAgICAgICBBOiBodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQ6dGFyZ2V0UGFja2FnZSgweDAxMDEwMDIxKT0iY29tLmFuZHJvaWQubXkudGVzdHMiIChSYXc6ICJjb20uYW5kcm9pZC5teS50ZXN0cyIpCisiIiIKKworWE1MVFJFRV9JTlNUUlVNRU5UQVRJT05fVEVTVCA9ICIiIk46IGFuZHJvaWQ9aHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIChsaW5lPTIpCisgIEU6IG1hbmlmZXN0IChsaW5lPTIpCisgICAgQTogcGFja2FnZT0iY29tLmFuZHJvaWQubXkudGVzdHMueCIgKFJhdzogImNvbS5hbmRyb2lkLm15LnRlc3RzLngiKQorICAgICAgRTogaW5zdHJ1bWVudGF0aW9uIChsaW5lPTkpCisgICAgICAgIEE6IGh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZDpsYWJlbCgweDAxMDEwMDAxKT0iVGVzdE1vZHVsZSIgKFJhdzogIlRlc3RNb2R1bGUiKQorICAgICAgICBBOiBodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQ6bmFtZSgweDAxMDEwMDAzKT0iYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiIChSYXc6ICJhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIpCisgICAgICAgIEE6IGh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZDp0YXJnZXRQYWNrYWdlKDB4MDEwMTAwMjEpPSJjb20uYW5kcm9pZC5teS50ZXN0cyIgKFJhdzogImNvbS5hbmRyb2lkLm15LnRlc3RzIikKKyIiIgorCiBNQU5JRkVTVF9KVU5JVF9URVNUID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLm15LnRlc3RzLngiPgpAQCAtNDUsMTIgKzYzLDEyIEBACiAgICAgPGluc3RydW1lbnRhdGlvbgogICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIgogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLm15LnRlc3RzIgotICAgICAgICBhbmRyb2lkOmxhYmVsPSJNeSBUZXN0cyIgLz4KKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iVGVzdE1vZHVsZSIgLz4KIDwvbWFuaWZlc3Q+CiAiIiIKIAogRVhQRUNURURfSlVOSVRfVEVTVF9DT05GSUcgPSAiIiI8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogCiAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC02Niw3ICs4NCwxMSBAQAogLS0+CiA8IS0tIFRoaXMgdGVzdCBjb25maWcgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZC4gLS0+CiA8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iUnVucyBUZXN0TW9kdWxlLiI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImFwY3QiIC8+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImFwY3QtaW5zdHJ1bWVudGF0aW9uIiAvPgorCiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LWZpbGUtbmFtZSIgdmFsdWU9IlRlc3RNb2R1bGUuYXBrIiAvPgogICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgogCkBAIC03OCw3ICsxMDAsNyBAQAogIiIiCiAKIEVYUEVDVEVEX0lOU1RSVU1FTlRBVElPTl9URVNUX0NPTkZJRyA9ICIiIjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAKICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTkzLDggKzExNSwxMiBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPCEtLSBUaGlzIHRlc3QgY29uZmlnIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQuIC0tPgotPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlJ1bnMgTXkgVGVzdHMuIj4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJSdW5zIFRlc3RNb2R1bGUuIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iYXBjdCIgLz4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iYXBjdC1pbnN0cnVtZW50YXRpb24iIC8+CisKICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLnN1aXRlLlN1aXRlQXBrSW5zdGFsbGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwLWFwa3MiIHZhbHVlPSJ0cnVlIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iVGVzdE1vZHVsZS5hcGsiIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAKQEAgLTEwNSwxMSArMTMxLDU4IEBACiA8L2NvbmZpZ3VyYXRpb24+CiAiIiIKIAotVE9PTFNfRElSID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCi1FTVBUWV9URVNUX0NPTkZJRyA9IG9zLnBhdGguam9pbigKLSAgICBUT09MU19ESVIsICcuLicsICdjb3JlJywgJ2VtcHR5X3Rlc3RfY29uZmlnLnhtbCcpCi1JTlNUUlVNRU5UQVRJT05fVEVTVF9DT05GSUdfVEVNUExBVEUgPSBvcy5wYXRoLmpvaW4oCi0gICAgVE9PTFNfRElSLCAnLi4nLCAnY29yZScsICdpbnN0cnVtZW50YXRpb25fdGVzdF9jb25maWdfdGVtcGxhdGUueG1sJykKK0VNUFRZX1RFU1RfQ09ORklHX0NPTlRFTlQgPSAiIiI8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBObyBBbmRyb2lkVGVzdC54bWwgd2FzIHByb3ZpZGVkIGFuZCB0aGUgbWFuaWZlc3QgZG9lcyBub3QgaW5jbHVkZQorICAgICBpbnN0cnVtZW50YXRpb24sIGhlbmNlIHRoaXMgYXBrIGlzIG5vdCBpbnN0cnVtZW50YWJsZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkVtcHR5IENvbmZpZ3VyYXRpb24iIC8+CisiIiIKKworSU5TVFJVTUVOVEFUSU9OX1RFU1RfQ09ORklHX1RFTVBMQVRFX0NPTlRFTlQgPSAiIiI8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBUaGlzIHRlc3QgY29uZmlnIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQuIC0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlJ1bnMge0xBQkVMfS4iPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJhcGN0IiAvPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJhcGN0LWluc3RydW1lbnRhdGlvbiIgLz4KK3tFWFRSQV9DT05GSUdTfQorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuc3VpdGUuU3VpdGVBcGtJbnN0YWxsZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAtYXBrcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJ7TU9EVUxFfS5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUue1RFU1RfVFlQRX0iID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0ie1BBQ0tBR0V9IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bm5lciIgdmFsdWU9IntSVU5ORVJ9IiAvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KKyIiIgogCiAKIGNsYXNzIEF1dG9HZW5UZXN0Q29uZmlnVW5pdHRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTEyMCw2ICsxOTMsMTYgQEAKICAgICBzZWxmLnRlc3RfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCiAgICAgc2VsZi5jb25maWdfZmlsZSA9IG9zLnBhdGguam9pbihzZWxmLnRlc3RfZGlyLCBURVNUX01PRFVMRSArICcuY29uZmlnJykKICAgICBzZWxmLm1hbmlmZXN0X2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0X2RpciwgJ0FuZHJvaWRNYW5pZmVzdC54bWwnKQorICAgIHNlbGYueG1sdHJlZV9maWxlID0gb3MucGF0aC5qb2luKHNlbGYudGVzdF9kaXIsIFRFU1RfTU9EVUxFICsgJy54bWx0cmVlJykKKyAgICBzZWxmLmVtcHR5X3Rlc3RfY29uZmlnX2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0X2RpciwgJ2VtcHR5LmNvbmZpZycpCisgICAgc2VsZi5pbnN0cnVtZW50YXRpb25fdGVzdF9jb25maWdfdGVtcGxhdGVfZmlsZSA9IG9zLnBhdGguam9pbigKKyAgICAgICAgc2VsZi50ZXN0X2RpciwgJ2luc3RydW1lbnRhdGlvbi5jb25maWcnKQorCisgICAgd2l0aCBvcGVuKHNlbGYuZW1wdHlfdGVzdF9jb25maWdfZmlsZSwgJ3cnKSBhcyBmOgorICAgICAgZi53cml0ZShFTVBUWV9URVNUX0NPTkZJR19DT05URU5UKQorCisgICAgd2l0aCBvcGVuKHNlbGYuaW5zdHJ1bWVudGF0aW9uX3Rlc3RfY29uZmlnX3RlbXBsYXRlX2ZpbGUsICd3JykgYXMgZjoKKyAgICAgIGYud3JpdGUoSU5TVFJVTUVOVEFUSU9OX1RFU1RfQ09ORklHX1RFTVBMQVRFX0NPTlRFTlQpCiAKICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICIiIkNsZWFudXAgdGhlIHRlc3QgZGlyZWN0b3J5LiIiIgpAQCAtMTMzLDExICsyMTYsMTEgQEAKIAogICAgIGFyZ3YgPSBbc2VsZi5jb25maWdfZmlsZSwKICAgICAgICAgICAgIHNlbGYubWFuaWZlc3RfZmlsZSwKLSAgICAgICAgICAgIEVNUFRZX1RFU1RfQ09ORklHLAotICAgICAgICAgICAgSU5TVFJVTUVOVEFUSU9OX1RFU1RfQ09ORklHX1RFTVBMQVRFXQorICAgICAgICAgICAgc2VsZi5lbXB0eV90ZXN0X2NvbmZpZ19maWxlLAorICAgICAgICAgICAgc2VsZi5pbnN0cnVtZW50YXRpb25fdGVzdF9jb25maWdfdGVtcGxhdGVfZmlsZV0KICAgICBhdXRvX2dlbl90ZXN0X2NvbmZpZy5tYWluKGFyZ3YpCiAgICAgd2l0aCBvcGVuKHNlbGYuY29uZmlnX2ZpbGUpIGFzIGNvbmZpZ19maWxlOgotICAgICAgd2l0aCBvcGVuKEVNUFRZX1RFU1RfQ09ORklHKSBhcyBlbXB0eV9jb25maWc6CisgICAgICB3aXRoIG9wZW4oc2VsZi5lbXB0eV90ZXN0X2NvbmZpZ19maWxlKSBhcyBlbXB0eV9jb25maWc6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29uZmlnX2ZpbGUucmVhZCgpLCBlbXB0eV9jb25maWcucmVhZCgpKQogCiAgIGRlZiB0ZXN0Q3JlYXRlSlVuaXRUZXN0Q29uZmlnKHNlbGYpOgpAQCAtMTQ4LDggKzIzMSw4IEBACiAKICAgICBhcmd2ID0gW3NlbGYuY29uZmlnX2ZpbGUsCiAgICAgICAgICAgICBzZWxmLm1hbmlmZXN0X2ZpbGUsCi0gICAgICAgICAgICBFTVBUWV9URVNUX0NPTkZJRywKLSAgICAgICAgICAgIElOU1RSVU1FTlRBVElPTl9URVNUX0NPTkZJR19URU1QTEFURV0KKyAgICAgICAgICAgIHNlbGYuZW1wdHlfdGVzdF9jb25maWdfZmlsZSwKKyAgICAgICAgICAgIHNlbGYuaW5zdHJ1bWVudGF0aW9uX3Rlc3RfY29uZmlnX3RlbXBsYXRlX2ZpbGVdCiAgICAgYXV0b19nZW5fdGVzdF9jb25maWcubWFpbihhcmd2KQogICAgIHdpdGggb3BlbihzZWxmLmNvbmZpZ19maWxlKSBhcyBjb25maWdfZmlsZToKICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29uZmlnX2ZpbGUucmVhZCgpLCBFWFBFQ1RFRF9KVU5JVF9URVNUX0NPTkZJRykKQEAgLTE2Miw4ICsyNDUsMzcgQEAKIAogICAgIGFyZ3YgPSBbc2VsZi5jb25maWdfZmlsZSwKICAgICAgICAgICAgIHNlbGYubWFuaWZlc3RfZmlsZSwKLSAgICAgICAgICAgIEVNUFRZX1RFU1RfQ09ORklHLAotICAgICAgICAgICAgSU5TVFJVTUVOVEFUSU9OX1RFU1RfQ09ORklHX1RFTVBMQVRFXQorICAgICAgICAgICAgc2VsZi5lbXB0eV90ZXN0X2NvbmZpZ19maWxlLAorICAgICAgICAgICAgc2VsZi5pbnN0cnVtZW50YXRpb25fdGVzdF9jb25maWdfdGVtcGxhdGVfZmlsZV0KKyAgICBhdXRvX2dlbl90ZXN0X2NvbmZpZy5tYWluKGFyZ3YpCisgICAgd2l0aCBvcGVuKHNlbGYuY29uZmlnX2ZpbGUpIGFzIGNvbmZpZ19maWxlOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICBjb25maWdfZmlsZS5yZWFkKCksIEVYUEVDVEVEX0lOU1RSVU1FTlRBVElPTl9URVNUX0NPTkZJRykKKworICBkZWYgdGVzdENyZWF0ZUpVbml0VGVzdENvbmZpZ1dpdGhYTUxUcmVlKHNlbGYpOgorICAgICIiIlRlc3QgY3JlYXRpbmcgdGVzdCBjb25maWcgZm9yIEFuZHJvaWRKVW5pdFRlc3QuCisgICAgIiIiCisgICAgd2l0aCBvcGVuKHNlbGYueG1sdHJlZV9maWxlLCAndycpIGFzIGY6CisgICAgICBmLndyaXRlKFhNTFRSRUVfSlVOSVRfVEVTVCkKKworICAgIGFyZ3YgPSBbc2VsZi5jb25maWdfZmlsZSwKKyAgICAgICAgICAgIHNlbGYueG1sdHJlZV9maWxlLAorICAgICAgICAgICAgc2VsZi5lbXB0eV90ZXN0X2NvbmZpZ19maWxlLAorICAgICAgICAgICAgc2VsZi5pbnN0cnVtZW50YXRpb25fdGVzdF9jb25maWdfdGVtcGxhdGVfZmlsZV0KKyAgICBhdXRvX2dlbl90ZXN0X2NvbmZpZy5tYWluKGFyZ3YpCisgICAgd2l0aCBvcGVuKHNlbGYuY29uZmlnX2ZpbGUpIGFzIGNvbmZpZ19maWxlOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb25maWdfZmlsZS5yZWFkKCksIEVYUEVDVEVEX0pVTklUX1RFU1RfQ09ORklHKQorCisgIGRlZiB0ZXN0Q3JlYXRlSW5zdHJ1bWVudGF0aW9uVGVzdENvbmZpZ1dpdGhYTUxUcmVlKHNlbGYpOgorICAgICIiIlRlc3QgY3JlYXRpbmcgdGVzdCBjb25maWcgZm9yIEluc3RydW1lbnRhdGlvblRlc3QuCisgICAgIiIiCisgICAgd2l0aCBvcGVuKHNlbGYueG1sdHJlZV9maWxlLCAndycpIGFzIGY6CisgICAgICBmLndyaXRlKFhNTFRSRUVfSU5TVFJVTUVOVEFUSU9OX1RFU1QpCisKKyAgICBhcmd2ID0gW3NlbGYuY29uZmlnX2ZpbGUsCisgICAgICAgICAgICBzZWxmLnhtbHRyZWVfZmlsZSwKKyAgICAgICAgICAgIHNlbGYuZW1wdHlfdGVzdF9jb25maWdfZmlsZSwKKyAgICAgICAgICAgIHNlbGYuaW5zdHJ1bWVudGF0aW9uX3Rlc3RfY29uZmlnX3RlbXBsYXRlX2ZpbGVdCiAgICAgYXV0b19nZW5fdGVzdF9jb25maWcubWFpbihhcmd2KQogICAgIHdpdGggb3BlbihzZWxmLmNvbmZpZ19maWxlKSBhcyBjb25maWdfZmlsZToKICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCmRpZmYgLS1naXQgYS90b29scy9idWlsZGluZm8uc2ggYi90b29scy9idWlsZGluZm8uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyZTM2ZGYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvYnVpbGRpbmZvLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIyEvYmluL2Jhc2gKLQotZWNobyAiIyBiZWdpbiBidWlsZCBwcm9wZXJ0aWVzIgotZWNobyAiIyBhdXRvZ2VuZXJhdGVkIGJ5IGJ1aWxkaW5mby5zaCIKLQotIyBUaGUgcm8uYnVpbGQuaWQgd2lsbCBiZSBzZXQgZHluYW1pY2FsbHkgYnkgaW5pdCwgYnkgYXBwZW5kaW5nIHRoZSB1bmlxdWUgdmJtZXRhIGRpZ2VzdC4KLWlmIFsgIiRCT0FSRF9VU0VfVkJNRVRBX0RJR1RFU1RfSU5fRklOR0VSUFJJTlQiID0gInRydWUiIF0gOyB0aGVuCi0gIGVjaG8gInJvLmJ1aWxkLmxlZ2FjeS5pZD0kQlVJTERfSUQiCi1lbHNlCi0gIGVjaG8gInJvLmJ1aWxkLmlkPSRCVUlMRF9JRCIKLWZpCi1lY2hvICJyby5idWlsZC5kaXNwbGF5LmlkPSRCVUlMRF9ESVNQTEFZX0lEIgotZWNobyAicm8uYnVpbGQudmVyc2lvbi5pbmNyZW1lbnRhbD0kQlVJTERfTlVNQkVSIgotZWNobyAicm8uYnVpbGQudmVyc2lvbi5zZGs9JFBMQVRGT1JNX1NES19WRVJTSU9OIgotZWNobyAicm8uYnVpbGQudmVyc2lvbi5wcmV2aWV3X3Nkaz0kUExBVEZPUk1fUFJFVklFV19TREtfVkVSU0lPTiIKLWVjaG8gInJvLmJ1aWxkLnZlcnNpb24ucHJldmlld19zZGtfZmluZ2VycHJpbnQ9JFBMQVRGT1JNX1BSRVZJRVdfU0RLX0ZJTkdFUlBSSU5UIgotZWNobyAicm8uYnVpbGQudmVyc2lvbi5jb2RlbmFtZT0kUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSIKLWVjaG8gInJvLmJ1aWxkLnZlcnNpb24uYWxsX2NvZGVuYW1lcz0kUExBVEZPUk1fVkVSU0lPTl9BTExfQ09ERU5BTUVTIgotZWNobyAicm8uYnVpbGQudmVyc2lvbi5rbm93bl9jb2RlbmFtZXM9JFBMQVRGT1JNX1ZFUlNJT05fS05PV05fQ09ERU5BTUVTIgotZWNobyAicm8uYnVpbGQudmVyc2lvbi5yZWxlYXNlPSRQTEFURk9STV9WRVJTSU9OX0xBU1RfU1RBQkxFIgotZWNobyAicm8uYnVpbGQudmVyc2lvbi5yZWxlYXNlX29yX2NvZGVuYW1lPSRQTEFURk9STV9WRVJTSU9OIgotZWNobyAicm8uYnVpbGQudmVyc2lvbi5yZWxlYXNlX29yX3ByZXZpZXdfZGlzcGxheT0kUExBVEZPUk1fRElTUExBWV9WRVJTSU9OIgotZWNobyAicm8uYnVpbGQudmVyc2lvbi5zZWN1cml0eV9wYXRjaD0kUExBVEZPUk1fU0VDVVJJVFlfUEFUQ0giCi1lY2hvICJyby5idWlsZC52ZXJzaW9uLmJhc2Vfb3M9JFBMQVRGT1JNX0JBU0VfT1MiCi1lY2hvICJyby5idWlsZC52ZXJzaW9uLm1pbl9zdXBwb3J0ZWRfdGFyZ2V0X3Nkaz0kUExBVEZPUk1fTUlOX1NVUFBPUlRFRF9UQVJHRVRfU0RLX1ZFUlNJT04iCi1lY2hvICJyby5idWlsZC5kYXRlPWAkREFURWAiCi1lY2hvICJyby5idWlsZC5kYXRlLnV0Yz1gJERBVEUgKyVzYCIKLWVjaG8gInJvLmJ1aWxkLnR5cGU9JFRBUkdFVF9CVUlMRF9UWVBFIgotZWNobyAicm8uYnVpbGQudXNlcj0kQlVJTERfVVNFUk5BTUUiCi1lY2hvICJyby5idWlsZC5ob3N0PSRCVUlMRF9IT1NUTkFNRSIKLWVjaG8gInJvLmJ1aWxkLnRhZ3M9JEJVSUxEX1ZFUlNJT05fVEFHUyIKLWVjaG8gInJvLmJ1aWxkLmZsYXZvcj0kVEFSR0VUX0JVSUxEX0ZMQVZPUiIKLQotIyBUaGVzZSB2YWx1ZXMgYXJlIGRlcHJlY2F0ZWQsIHVzZSAicm8ucHJvZHVjdC5jcHUuYWJpbGlzdCIKLSMgaW5zdGVhZCAoc2VlIGJlbG93KS4KLWVjaG8gIiMgcm8ucHJvZHVjdC5jcHUuYWJpIGFuZCByby5wcm9kdWN0LmNwdS5hYmkyIGFyZSBvYnNvbGV0ZSwiCi1lY2hvICIjIHVzZSByby5wcm9kdWN0LmNwdS5hYmlsaXN0IGluc3RlYWQuIgotZWNobyAicm8ucHJvZHVjdC5jcHUuYWJpPSRUQVJHRVRfQ1BVX0FCSSIKLWlmIFsgLW4gIiRUQVJHRVRfQ1BVX0FCSTIiIF0gOyB0aGVuCi0gIGVjaG8gInJvLnByb2R1Y3QuY3B1LmFiaTI9JFRBUkdFVF9DUFVfQUJJMiIKLWZpCi0KLWlmIFsgLW4gIiRQUk9EVUNUX0RFRkFVTFRfTE9DQUxFIiBdIDsgdGhlbgotICBlY2hvICJyby5wcm9kdWN0LmxvY2FsZT0kUFJPRFVDVF9ERUZBVUxUX0xPQ0FMRSIKLWZpCi1lY2hvICJyby53aWZpLmNoYW5uZWxzPSRQUk9EVUNUX0RFRkFVTFRfV0lGSV9DSEFOTkVMUyIKLQotZWNobyAiIyByby5idWlsZC5wcm9kdWN0IGlzIG9ic29sZXRlOyB1c2Ugcm8ucHJvZHVjdC5kZXZpY2UiCi1lY2hvICJyby5idWlsZC5wcm9kdWN0PSRUQVJHRVRfREVWSUNFIgotCi1lY2hvICIjIERvIG5vdCB0cnkgdG8gcGFyc2UgZGVzY3JpcHRpb24gb3IgdGh1bWJwcmludCIKLWVjaG8gInJvLmJ1aWxkLmRlc2NyaXB0aW9uPSRQUklWQVRFX0JVSUxEX0RFU0MiCi1pZiBbIC1uICIkQlVJTERfVEhVTUJQUklOVCIgXSA7IHRoZW4KLSAgZWNobyAicm8uYnVpbGQudGh1bWJwcmludD0kQlVJTERfVEhVTUJQUklOVCIKLWZpCi0KLWVjaG8gIiMgZW5kIGJ1aWxkIHByb3BlcnRpZXMiCmRpZmYgLS1naXQgYS90b29scy9jaGFyYWN0ZXJpc3RpY3NfcnJvX2dlbmVyYXRvci5weSBiL3Rvb2xzL2NoYXJhY3RlcmlzdGljc19ycm9fZ2VuZXJhdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmODczZWUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9jaGFyYWN0ZXJpc3RpY3NfcnJvX2dlbmVyYXRvci5weQpAQCAtMCwwICsxLDE1IEBACisjIS91c3IvYmluL2VudiBweXRob24zCitpbXBvcnQgc3lzCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaWYgbGVuKHN5cy5hcmd2KSAhPSAzOgorICAgICAgICBzeXMuZXhpdChmInVzYWdlOiB7c3lzX2FyZ3ZbMF19IHRhcmdldF9wYWNrYWdlX25hbWUgb3V0cHV0XG4iKQorICAgIHdpdGggb3BlbihzeXMuYXJndlsyXSwgInciKSBhcyBmOgorICAgICAgICBmLndyaXRlKGYnJyc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorICAgICAgICAgICAgICAgIDxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIHBhY2thZ2U9IntzeXMuYXJndlsxXX0uYXV0b19nZW5lcmF0ZWRfY2hhcmFjdGVyaXN0aWNzX3JybyI+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6aGFzQ29kZT0iZmFsc2UiIC8+CisgICAgPG92ZXJsYXkgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJ7c3lzLmFyZ3ZbMV19IgorICAgICAgICAgICAgIGFuZHJvaWQ6aXNTdGF0aWM9InRydWUiCisgICAgICAgICAgICAgYW5kcm9pZDpwcmlvcml0eT0iMCIgLz4KKzwvbWFuaWZlc3Q+CisnJycpCmRpZmYgLS1naXQgYS90b29scy9jaGVjay1mbGFnZ2VkLWFwaXMvQW5kcm9pZC5icCBiL3Rvb2xzL2NoZWNrLWZsYWdnZWQtYXBpcy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYzljOGUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9jaGVjay1mbGFnZ2VkLWFwaXMvQW5kcm9pZC5icApAQCAtMCwwICsxLDUxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSB7CisgICAgZGVmYXVsdF90ZWFtOiAidHJlbmR5X3RlYW1fdXBkYXRhYmxlX3Nka19hcGlzIiwKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCit9CisKK2phdmFfZGVmYXVsdHMgeworICAgIG5hbWU6ICJjaGVjay1mbGFnZ2VkLWFwaXMtZGVmYXVsdHMiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInNyYy9jb20vYW5kcm9pZC9jaGVja2ZsYWdnZWRhcGlzL01haW4ua3QiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmFjb25maWdfamF2YV9wcm90b19saXRlIiwKKyAgICAgICAgIm1ldGFsYXZhLXNpZ25hdHVyZS1yZWFkZXIiLAorICAgICAgICAibWV0YWxhdmEtdG9vbHMtY29tbW9uLW0yLWRlcHMiLAorICAgIF0sCit9CisKK2phdmFfYmluYXJ5X2hvc3QgeworICAgIG5hbWU6ICJjaGVjay1mbGFnZ2VkLWFwaXMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJjaGVjay1mbGFnZ2VkLWFwaXMtZGVmYXVsdHMiLAorICAgIF0sCisgICAgbWFpbl9jbGFzczogImNvbS5hbmRyb2lkLmNoZWNrZmxhZ2dlZGFwaXMuTWFpbiIsCit9CisKK2phdmFfdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiY2hlY2stZmxhZ2dlZC1hcGlzLXRlc3QiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJjaGVjay1mbGFnZ2VkLWFwaXMtZGVmYXVsdHMiLAorICAgIF0sCisgICAgc3JjczogWworICAgICAgICAic3JjL2NvbS9hbmRyb2lkL2NoZWNrZmxhZ2dlZGFwaXMvQ2hlY2tGbGFnZ2VkQXBpc1Rlc3Qua3QiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImp1bml0IiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvY2hlY2stZmxhZ2dlZC1hcGlzL09XTkVSUyBiL3Rvb2xzL2NoZWNrLWZsYWdnZWQtYXBpcy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg5ZTIxZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2NoZWNrLWZsYWdnZWQtYXBpcy9PV05FUlMKQEAgLTAsMCArMSw0IEBACithbWhrQGdvb2dsZS5jb20KK2d1cnByZWV0Z3NAZ29vZ2xlLmNvbQorbWljaGFlbHdyQGdvb2dsZS5jb20KK3BhdWxkdWZmaW5AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvdG9vbHMvY2hlY2stZmxhZ2dlZC1hcGlzL2NoZWNrLWZsYWdnZWQtYXBpcy5zaCBiL3Rvb2xzL2NoZWNrLWZsYWdnZWQtYXBpcy9jaGVjay1mbGFnZ2VkLWFwaXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODA3OGNkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2NoZWNrLWZsYWdnZWQtYXBpcy9jaGVjay1mbGFnZ2VkLWFwaXMuc2gKQEAgLTAsMCArMSwxMzYgQEAKKyMhL2Jpbi9iYXNoCisKKyMgQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgUnVuIGNoZWNrLWZsYWdnZWQtYXBpcyBmb3IgcHVibGljIEFQSXMgYW5kIHRoZSB0aHJlZSBAU3lzdGVtQXBpIGZsYXZvdXJzLgorIworIyBUaGlzIHNjcmlwdCBleHBlY3RzIGFuIGFyZ3VtZW50IHRvIHRlbGwgaXQgd2hpY2ggc3ViY29tbWFuZCBvZgorIyBjaGVjay1mbGFnZ2VkLWFwaXMgdG8gZXhlY3V0ZS4gUnVuIHRoZSBzY3JpcHQgd2l0aG91dCBhbnkgYXJndW1lbnRzIHRvIHNlZQorIyB0aGUgdmFsaWQgb3B0aW9ucy4KKyMKKyMgUmVtZW1iZXIgdG8gbHVuY2ggdG8gc2VsZWN0IHRoZSByZWxldmFudCByZWxlYXNlIGNvbmZpZyBiZWZvcmUgcnVubmluZyB0aGlzIHNjcmlwdC4KKworc291cmNlICQoY2QgJChkaXJuYW1lICRCQVNIX1NPVVJDRSkgJj4gL2Rldi9udWxsICYmIHB3ZCkvLi4vLi4vc2hlbGxfdXRpbHMuc2gKK3JlcXVpcmVfdG9wCisKK1BVQkxJQ19YTUxfVkVSU0lPTlM9b3V0L3RhcmdldC9jb21tb24vb2JqL1BBQ0tBR0lORy9hcGlfdmVyc2lvbnNfcHVibGljX2dlbmVyYXRlZC1hcGktdmVyc2lvbnMueG1sCitTWVNURU1fWE1MX1ZFUlNJT05TPW91dC90YXJnZXQvY29tbW9uL29iai9QQUNLQUdJTkcvYXBpX3ZlcnNpb25zX3N5c3RlbV9nZW5lcmF0ZWQtYXBpLXZlcnNpb25zLnhtbAorU1lTVEVNX1NFUlZFUl9YTUxfVkVSU09OUz1vdXQvdGFyZ2V0L2NvbW1vbi9vYmovUEFDS0FHSU5HL2FwaV92ZXJzaW9uc19zeXN0ZW1fc2VydmVyX2NvbXBsZXRlX2dlbmVyYXRlZC1hcGktdmVyc2lvbnMueG1sCitNT0RVTEVfTElCX1hNTF9WRVJTSU9OUz1vdXQvdGFyZ2V0L2NvbW1vbi9vYmovUEFDS0FHSU5HL2FwaV92ZXJzaW9uc19tb2R1bGVfbGliX2NvbXBsZXRlX2dlbmVyYXRlZC1hcGktdmVyc2lvbnMueG1sCisKK2Z1bmN0aW9uIG0oKSB7CisgICAgJChnZXR0b3ApL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1idWlsZC1tb2RlIC0tYWxsLW1vZHVsZXMgLS1kaXI9IiQocHdkKSIgIiRAIgorfQorCitmdW5jdGlvbiBidWlsZCgpIHsKKyAgICBtIFwKKyAgICAgICAgY2hlY2stZmxhZ2dlZC1hcGlzIFwKKyAgICAgICAgYWxsX2Fjb25maWdfZGVjbGFyYXRpb25zIFwKKyAgICAgICAgZnJhbWV3b3Jrcy1iYXNlLWFwaS1jdXJyZW50LnR4dCBcCisgICAgICAgIGZyYW1ld29ya3MtYmFzZS1hcGktc3lzdGVtLWN1cnJlbnQudHh0IFwKKyAgICAgICAgZnJhbWV3b3Jrcy1iYXNlLWFwaS1zeXN0ZW0tc2VydmVyLWN1cnJlbnQudHh0IFwKKyAgICAgICAgZnJhbWV3b3Jrcy1iYXNlLWFwaS1tb2R1bGUtbGliLWN1cnJlbnQudHh0IFwKKyAgICAgICAgJFBVQkxJQ19YTUxfVkVSU0lPTlMgXAorICAgICAgICAkU1lTVEVNX1hNTF9WRVJTSU9OUyBcCisgICAgICAgICRTWVNURU1fU0VSVkVSX1hNTF9WRVJTT05TIFwKKyAgICAgICAgJE1PRFVMRV9MSUJfWE1MX1ZFUlNJT05TCit9CisKK2Z1bmN0aW9uIG5vb3AoKSB7CisgICAgdHJ1ZQorfQorCitmdW5jdGlvbiBhbmluamEoKSB7CisgICAgbG9jYWwgVD0iJChnZXR0b3ApIgorICAgIChcY2QgIiR7VH0iICYmIHByZWJ1aWx0cy9idWlsZC10b29scy9saW51eC14ODYvYmluL25pbmphIC1mIG91dC9jb21iaW5lZC0ke1RBUkdFVF9QUk9EVUNUfS5uaW5qYSAiJEAiKQorfQorCitmdW5jdGlvbiBwYXRoX3RvX2FwaV9zaWduYXR1cmVfZmlsZSB7CisgICAgYW5pbmphIC10IHF1ZXJ5IGRldmljZV8iJDEiX2FsbF90YXJnZXRzIHwgZ3JlcCAtQTEgLWUgaW5wdXQ6IHwgdGFpbCAtbjEKK30KKworZnVuY3Rpb24gcnVuX2NoZWNrKCkgeworICAgIGxvY2FsIGVycm9ycz0wCisKKyAgICBlY2hvICIjIGN1cnJlbnQiCisgICAgY2hlY2stZmxhZ2dlZC1hcGlzIGNoZWNrIFwKKyAgICAgICAgLS1hcGktc2lnbmF0dXJlICQocGF0aF90b19hcGlfc2lnbmF0dXJlX2ZpbGUgImZyYW1ld29ya3MtYmFzZS1hcGktY3VycmVudC50eHQiKSBcCisgICAgICAgIC0tZmxhZy12YWx1ZXMgJChnZXR0b3ApL291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9hbGxfYWNvbmZpZ19kZWNsYXJhdGlvbnMucGIgXAorICAgICAgICAtLWFwaS12ZXJzaW9ucyAkUFVCTElDX1hNTF9WRVJTSU9OUworICAgICgoIGVycm9ycyArPSAkPyApKQorCisgICAgZWNobworICAgIGVjaG8gIiMgc3lzdGVtLWN1cnJlbnQiCisgICAgY2hlY2stZmxhZ2dlZC1hcGlzIGNoZWNrIFwKKyAgICAgICAgLS1hcGktc2lnbmF0dXJlICQocGF0aF90b19hcGlfc2lnbmF0dXJlX2ZpbGUgImZyYW1ld29ya3MtYmFzZS1hcGktc3lzdGVtLWN1cnJlbnQudHh0IikgXAorICAgICAgICAtLWZsYWctdmFsdWVzICQoZ2V0dG9wKS9vdXQvc29vbmcvLmludGVybWVkaWF0ZXMvYWxsX2Fjb25maWdfZGVjbGFyYXRpb25zLnBiIFwKKyAgICAgICAgLS1hcGktdmVyc2lvbnMgJFNZU1RFTV9YTUxfVkVSU0lPTlMKKyAgICAoKCBlcnJvcnMgKz0gJD8gKSkKKworICAgIGVjaG8KKyAgICBlY2hvICIjIHN5c3RlbS1zZXJ2ZXItY3VycmVudCIKKyAgICBjaGVjay1mbGFnZ2VkLWFwaXMgY2hlY2sgXAorICAgICAgICAtLWFwaS1zaWduYXR1cmUgJChwYXRoX3RvX2FwaV9zaWduYXR1cmVfZmlsZSAiZnJhbWV3b3Jrcy1iYXNlLWFwaS1zeXN0ZW0tc2VydmVyLWN1cnJlbnQudHh0IikgXAorICAgICAgICAtLWZsYWctdmFsdWVzICQoZ2V0dG9wKS9vdXQvc29vbmcvLmludGVybWVkaWF0ZXMvYWxsX2Fjb25maWdfZGVjbGFyYXRpb25zLnBiIFwKKyAgICAgICAgLS1hcGktdmVyc2lvbnMgJFNZU1RFTV9TRVJWRVJfWE1MX1ZFUlNPTlMKKyAgICAoKCBlcnJvcnMgKz0gJD8gKSkKKworICAgIGVjaG8KKyAgICBlY2hvICIjIG1vZHVsZS1saWIiCisgICAgY2hlY2stZmxhZ2dlZC1hcGlzIGNoZWNrIFwKKyAgICAgICAgLS1hcGktc2lnbmF0dXJlICQocGF0aF90b19hcGlfc2lnbmF0dXJlX2ZpbGUgImZyYW1ld29ya3MtYmFzZS1hcGktbW9kdWxlLWxpYi1jdXJyZW50LnR4dCIpIFwKKyAgICAgICAgLS1mbGFnLXZhbHVlcyAkKGdldHRvcCkvb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2FsbF9hY29uZmlnX2RlY2xhcmF0aW9ucy5wYiBcCisgICAgICAgIC0tYXBpLXZlcnNpb25zICRNT0RVTEVfTElCX1hNTF9WRVJTSU9OUworICAgICgoIGVycm9ycyArPSAkPyApKQorCisgICAgcmV0dXJuICRlcnJvcnMKK30KKworZnVuY3Rpb24gcnVuX2xpc3QoKSB7CisgICAgZWNobyAiIyBjdXJyZW50IgorICAgIGNoZWNrLWZsYWdnZWQtYXBpcyBsaXN0IFwKKyAgICAgICAgLS1hcGktc2lnbmF0dXJlICQocGF0aF90b19hcGlfc2lnbmF0dXJlX2ZpbGUgImZyYW1ld29ya3MtYmFzZS1hcGktY3VycmVudC50eHQiKSBcCisgICAgICAgIC0tZmxhZy12YWx1ZXMgJChnZXR0b3ApL291dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9hbGxfYWNvbmZpZ19kZWNsYXJhdGlvbnMucGIKKworICAgIGVjaG8KKyAgICBlY2hvICIjIHN5c3RlbS1jdXJyZW50IgorICAgIGNoZWNrLWZsYWdnZWQtYXBpcyBsaXN0IFwKKyAgICAgICAgLS1hcGktc2lnbmF0dXJlICQocGF0aF90b19hcGlfc2lnbmF0dXJlX2ZpbGUgImZyYW1ld29ya3MtYmFzZS1hcGktc3lzdGVtLWN1cnJlbnQudHh0IikgXAorICAgICAgICAtLWZsYWctdmFsdWVzICQoZ2V0dG9wKS9vdXQvc29vbmcvLmludGVybWVkaWF0ZXMvYWxsX2Fjb25maWdfZGVjbGFyYXRpb25zLnBiCisKKyAgICBlY2hvCisgICAgZWNobyAiIyBzeXN0ZW0tc2VydmVyLWN1cnJlbnQiCisgICAgY2hlY2stZmxhZ2dlZC1hcGlzIGxpc3QgXAorICAgICAgICAtLWFwaS1zaWduYXR1cmUgJChwYXRoX3RvX2FwaV9zaWduYXR1cmVfZmlsZSAiZnJhbWV3b3Jrcy1iYXNlLWFwaS1zeXN0ZW0tc2VydmVyLWN1cnJlbnQudHh0IikgXAorICAgICAgICAtLWZsYWctdmFsdWVzICQoZ2V0dG9wKS9vdXQvc29vbmcvLmludGVybWVkaWF0ZXMvYWxsX2Fjb25maWdfZGVjbGFyYXRpb25zLnBiCisKKyAgICBlY2hvCisgICAgZWNobyAiIyBtb2R1bGUtbGliIgorICAgIGNoZWNrLWZsYWdnZWQtYXBpcyBsaXN0IFwKKyAgICAgICAgLS1hcGktc2lnbmF0dXJlICQocGF0aF90b19hcGlfc2lnbmF0dXJlX2ZpbGUgImZyYW1ld29ya3MtYmFzZS1hcGktbW9kdWxlLWxpYi1jdXJyZW50LnR4dCIpIFwKKyAgICAgICAgLS1mbGFnLXZhbHVlcyAkKGdldHRvcCkvb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2FsbF9hY29uZmlnX2RlY2xhcmF0aW9ucy5wYgorfQorCitidWlsZF9jbWQ9YnVpbGQKK2lmIFtbICIkMSIgPT0gIi0tc2tpcC1idWlsZCIgXV07IHRoZW4KKyAgICBidWlsZF9jbWQ9bm9vcAorICAgIHNoaWZ0IDEKK2ZpCisKK2Nhc2UgIiQxIiBpbgorICAgIGNoZWNrKSAkYnVpbGRfY21kICYmIHJ1bl9jaGVjayA7OworICAgIGxpc3QpICRidWlsZF9jbWQgJiYgcnVuX2xpc3QgOzsKKyAgICAqKSBlY2hvICJ1c2FnZTogJChiYXNlbmFtZSAkMCk6IFstLXNraXAtYnVpbGRdIGNoZWNrfGxpc3QiOyBleGl0IDEKK2VzYWMKZGlmZiAtLWdpdCBhL3Rvb2xzL2NoZWNrLWZsYWdnZWQtYXBpcy9zcmMvY29tL2FuZHJvaWQvY2hlY2tmbGFnZ2VkYXBpcy9DaGVja0ZsYWdnZWRBcGlzVGVzdC5rdCBiL3Rvb2xzL2NoZWNrLWZsYWdnZWQtYXBpcy9zcmMvY29tL2FuZHJvaWQvY2hlY2tmbGFnZ2VkYXBpcy9DaGVja0ZsYWdnZWRBcGlzVGVzdC5rdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDdhYzFkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvY2hlY2stZmxhZ2dlZC1hcGlzL3NyYy9jb20vYW5kcm9pZC9jaGVja2ZsYWdnZWRhcGlzL0NoZWNrRmxhZ2dlZEFwaXNUZXN0Lmt0CkBAIC0wLDAgKzEsMzgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuY2hlY2tmbGFnZ2VkYXBpcworCitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLkFjb25maWcKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuQWNvbmZpZy5mbGFnX3N0YXRlLkRJU0FCTEVECitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLkFjb25maWcuZmxhZ19zdGF0ZS5FTkFCTEVECitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbQoraW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbQoraW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzCitpbXBvcnQgb3JnLmp1bml0LlRlc3QKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGgKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQKKworcHJpdmF0ZSB2YWwgQVBJX1NJR05BVFVSRSA9CisgICAgIiIiCisgICAgICAvLyBTaWduYXR1cmUgZm9ybWF0OiAyLjAKKyAgICAgIHBhY2thZ2UgYW5kcm9pZCB7CisgICAgICAgIEBGbGFnZ2VkQXBpKCJhbmRyb2lkLmZsYWcuZm9vIikgcHVibGljIGZpbmFsIGNsYXNzIENsYXp6IHsKKyAgICAgICAgICBjdG9yIEBGbGFnZ2VkQXBpKCJhbmRyb2lkLmZsYWcuZm9vIikgcHVibGljIENsYXp6KCk7CisgICAgICAgICAgZmllbGQgQEZsYWdnZWRBcGkoImFuZHJvaWQuZmxhZy5mb28iKSBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT08gPSAxOyAvLyAweDEKKyAgICAgICAgICBtZXRob2QgQEZsYWdnZWRBcGkoImFuZHJvaWQuZmxhZy5mb28iKSBwdWJsaWMgaW50IGdldEVycm9yQ29kZSgpOworICAgICAgICAgIG1ldGhvZCBARmxhZ2dlZEFwaSgiYW5kcm9pZC5mbGFnLmZvbyIpIHB1YmxpYyBib29sZWFuIHNldERhdGEoaW50LCBpbnRbXVtdLCBATm9uTnVsbCBhbmRyb2lkLnV0aWwuVXRpbGl0eTxULCBVPik7CisgICAgICAgICAgbWV0aG9kIEBGbGFnZ2VkQXBpKCJhbmRyb2lkLmZsYWcuZm9vIikgcHVibGljIGJvb2xlYW4gc2V0VmFyaWFibGVEYXRhKGludCwgYW5kcm9pZC51dGlsLkF0b20uLi4pOworICAgICAgICAgIG1ldGhvZCBARmxhZ2dlZEFwaSgiYW5kcm9pZC5mbGFnLmZvbyIpIHB1YmxpYyBib29sZWFuIGlubmVyQ2xhc3NBcmcoYW5kcm9pZC5DbGF6ei5CdWlsZGVyKTsKKyAgICAgICAgfQorICAgICAgICBARmxhZ2dlZEFwaSgiYW5kcm9pZC5mbGFnLmJhciIpIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xhenouQnVpbGRlciB7CisgICAgICAgIH0KKyAgICAgIH0KKyIiIgorICAgICAgICAudHJpbSgpCisKK3ByaXZhdGUgdmFsIEFQSV9WRVJTSU9OUyA9CisgICAgIiIiCisgICAgICA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorICAgICAgPGFwaSB2ZXJzaW9uPSIzIj4KKyAgICAgICAgPGNsYXNzIG5hbWU9ImFuZHJvaWQvQ2xhenoiIHNpbmNlPSIxIj4KKyAgICAgICAgICA8ZXh0ZW5kcyBuYW1lPSJqYXZhL2xhbmcvT2JqZWN0Ii8+CisgICAgICAgICAgPG1ldGhvZCBuYW1lPSImbHQ7aW5pdD4oKVYiLz4KKyAgICAgICAgICA8ZmllbGQgbmFtZT0iRk9PIi8+CisgICAgICAgICAgPG1ldGhvZCBuYW1lPSJnZXRFcnJvckNvZGUoKUkiLz4KKyAgICAgICAgICA8bWV0aG9kIG5hbWU9InNldERhdGEoSVtbSUxhbmRyb2lkL3V0aWwvVXRpbGl0eTspWiIvPgorICAgICAgICAgIDxtZXRob2QgbmFtZT0ic2V0VmFyaWFibGVEYXRhKElbTGFuZHJvaWQvdXRpbC9BdG9tOylaIi8+CisgICAgICAgICAgPG1ldGhvZCBuYW1lPSJpbm5lckNsYXNzQXJnKExhbmRyb2lkL0NsYXp6JHsiJCJ9QnVpbGRlcjspIi8+CisgICAgICAgIDwvY2xhc3M+CisgICAgICAgIDxjbGFzcyBuYW1lPSJhbmRyb2lkL0NsYXp6JHsiJCJ9QnVpbGRlciIgc2luY2U9IjIiPgorICAgICAgICAgIDxleHRlbmRzIG5hbWU9ImphdmEvbGFuZy9PYmplY3QiLz4KKyAgICAgICAgPC9jbGFzcz4KKyAgICAgIDwvYXBpPgorIiIiCisgICAgICAgIC50cmltKCkKKworcHJpdmF0ZSBmdW4gZ2VuZXJhdGVGbGFnc1Byb3RvKAorICAgIGZvb1N0YXRlOiBBY29uZmlnLmZsYWdfc3RhdGUsCisgICAgYmFyU3RhdGU6IEFjb25maWcuZmxhZ19zdGF0ZQorKTogSW5wdXRTdHJlYW0geworICB2YWwgZm9vRmxhZyA9CisgICAgICBBY29uZmlnLnBhcnNlZF9mbGFnCisgICAgICAgICAgLm5ld0J1aWxkZXIoKQorICAgICAgICAgIC5zZXRQYWNrYWdlKCJhbmRyb2lkLmZsYWciKQorICAgICAgICAgIC5zZXROYW1lKCJmb28iKQorICAgICAgICAgIC5zZXRTdGF0ZShmb29TdGF0ZSkKKyAgICAgICAgICAuc2V0UGVybWlzc2lvbihBY29uZmlnLmZsYWdfcGVybWlzc2lvbi5SRUFEX09OTFkpCisgICAgICAgICAgLmJ1aWxkKCkKKyAgdmFsIGJhckZsYWcgPQorICAgICAgQWNvbmZpZy5wYXJzZWRfZmxhZworICAgICAgICAgIC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAuc2V0UGFja2FnZSgiYW5kcm9pZC5mbGFnIikKKyAgICAgICAgICAuc2V0TmFtZSgiYmFyIikKKyAgICAgICAgICAuc2V0U3RhdGUoYmFyU3RhdGUpCisgICAgICAgICAgLnNldFBlcm1pc3Npb24oQWNvbmZpZy5mbGFnX3Blcm1pc3Npb24uUkVBRF9PTkxZKQorICAgICAgICAgIC5idWlsZCgpCisgIHZhbCBmbGFncyA9CisgICAgICBBY29uZmlnLnBhcnNlZF9mbGFncy5uZXdCdWlsZGVyKCkuYWRkUGFyc2VkRmxhZyhmb29GbGFnKS5hZGRQYXJzZWRGbGFnKGJhckZsYWcpLmJ1aWxkKCkKKyAgdmFsIGJpbmFyeVByb3RvID0gQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkKKyAgZmxhZ3Mud3JpdGVUbyhiaW5hcnlQcm90bykKKyAgcmV0dXJuIEJ5dGVBcnJheUlucHV0U3RyZWFtKGJpbmFyeVByb3RvLnRvQnl0ZUFycmF5KCkpCit9CisKK0BSdW5XaXRoKEpVbml0NDo6Y2xhc3MpCitjbGFzcyBDaGVja0ZsYWdnZWRBcGlzVGVzdCB7CisgIEBUZXN0CisgIGZ1biB0ZXN0UGFyc2VBcGlTaWduYXR1cmUoKSB7CisgICAgdmFsIGV4cGVjdGVkID0KKyAgICAgICAgc2V0T2YoCisgICAgICAgICAgICBQYWlyKAorICAgICAgICAgICAgICAgIFN5bWJvbC5jcmVhdGVDbGFzcygiYW5kcm9pZC9DbGF6eiIsICJqYXZhL2xhbmcvT2JqZWN0Iiwgc2V0T2YoKSksCisgICAgICAgICAgICAgICAgRmxhZygiYW5kcm9pZC5mbGFnLmZvbyIpKSwKKyAgICAgICAgICAgIFBhaXIoU3ltYm9sLmNyZWF0ZU1ldGhvZCgiYW5kcm9pZC9DbGF6eiIsICJDbGF6eigpIiksIEZsYWcoImFuZHJvaWQuZmxhZy5mb28iKSksCisgICAgICAgICAgICBQYWlyKFN5bWJvbC5jcmVhdGVGaWVsZCgiYW5kcm9pZC9DbGF6eiIsICJGT08iKSwgRmxhZygiYW5kcm9pZC5mbGFnLmZvbyIpKSwKKyAgICAgICAgICAgIFBhaXIoU3ltYm9sLmNyZWF0ZU1ldGhvZCgiYW5kcm9pZC9DbGF6eiIsICJnZXRFcnJvckNvZGUoKSIpLCBGbGFnKCJhbmRyb2lkLmZsYWcuZm9vIikpLAorICAgICAgICAgICAgUGFpcigKKyAgICAgICAgICAgICAgICBTeW1ib2wuY3JlYXRlTWV0aG9kKCJhbmRyb2lkL0NsYXp6IiwgInNldERhdGEoSVtbSUxhbmRyb2lkL3V0aWwvVXRpbGl0eTspIiksCisgICAgICAgICAgICAgICAgRmxhZygiYW5kcm9pZC5mbGFnLmZvbyIpKSwKKyAgICAgICAgICAgIFBhaXIoCisgICAgICAgICAgICAgICAgU3ltYm9sLmNyZWF0ZU1ldGhvZCgiYW5kcm9pZC9DbGF6eiIsICJzZXRWYXJpYWJsZURhdGEoSVtMYW5kcm9pZC91dGlsL0F0b207KSIpLAorICAgICAgICAgICAgICAgIEZsYWcoImFuZHJvaWQuZmxhZy5mb28iKSksCisgICAgICAgICAgICBQYWlyKAorICAgICAgICAgICAgICAgIFN5bWJvbC5jcmVhdGVNZXRob2QoImFuZHJvaWQvQ2xhenoiLCAiaW5uZXJDbGFzc0FyZyhMYW5kcm9pZC9DbGF6ei9CdWlsZGVyOykiKSwKKyAgICAgICAgICAgICAgICBGbGFnKCJhbmRyb2lkLmZsYWcuZm9vIikpLAorICAgICAgICAgICAgUGFpcigKKyAgICAgICAgICAgICAgICBTeW1ib2wuY3JlYXRlQ2xhc3MoImFuZHJvaWQvQ2xhenovQnVpbGRlciIsICJqYXZhL2xhbmcvT2JqZWN0Iiwgc2V0T2YoKSksCisgICAgICAgICAgICAgICAgRmxhZygiYW5kcm9pZC5mbGFnLmJhciIpKSwKKyAgICAgICAgKQorICAgIHZhbCBhY3R1YWwgPSBwYXJzZUFwaVNpZ25hdHVyZSgiaW4tbWVtb3J5IiwgQVBJX1NJR05BVFVSRS5ieXRlSW5wdXRTdHJlYW0oKSkKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkKKyAgfQorCisgIEBUZXN0CisgIGZ1biB0ZXN0UGFyc2VBcGlTaWduYXR1cmVJbnRlcmZhY2VzSW5oZXJpdEZyb21KYXZhTGFuZ09iamVjdCgpIHsKKyAgICB2YWwgYXBpU2lnbmF0dXJlID0KKyAgICAgICAgIiIiCisgICAgICAgICAgLy8gU2lnbmF0dXJlIGZvcm1hdDogMi4wCisgICAgICAgICAgcGFja2FnZSBhbmRyb2lkIHsKKyAgICAgICAgICAgIEBGbGFnZ2VkQXBpKCJhbmRyb2lkLmZsYWcuZm9vIikgcHVibGljIGludGVyZmFjZSBJbnRlcmZhY2UgeworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgIiIiCisgICAgICAgICAgICAudHJpbSgpCisgICAgdmFsIGV4cGVjdGVkID0KKyAgICAgICAgc2V0T2YoCisgICAgICAgICAgICBQYWlyKAorICAgICAgICAgICAgICAgIFN5bWJvbC5jcmVhdGVDbGFzcygiYW5kcm9pZC9JbnRlcmZhY2UiLCAiamF2YS9sYW5nL09iamVjdCIsIHNldE9mKCkpLAorICAgICAgICAgICAgICAgIEZsYWcoImFuZHJvaWQuZmxhZy5mb28iKSkpCisgICAgdmFsIGFjdHVhbCA9IHBhcnNlQXBpU2lnbmF0dXJlKCJpbi1tZW1vcnkiLCBhcGlTaWduYXR1cmUuYnl0ZUlucHV0U3RyZWFtKCkpCisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpCisgIH0KKworICBAVGVzdAorICBmdW4gdGVzdFBhcnNlRmxhZ1ZhbHVlcygpIHsKKyAgICB2YWwgZXhwZWN0ZWQ6IE1hcDxGbGFnLCBCb29sZWFuPiA9CisgICAgICAgIG1hcE9mKEZsYWcoImFuZHJvaWQuZmxhZy5mb28iKSB0byB0cnVlLCBGbGFnKCJhbmRyb2lkLmZsYWcuYmFyIikgdG8gdHJ1ZSkKKyAgICB2YWwgYWN0dWFsID0gcGFyc2VGbGFnVmFsdWVzKGdlbmVyYXRlRmxhZ3NQcm90byhFTkFCTEVELCBFTkFCTEVEKSkKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkKKyAgfQorCisgIEBUZXN0CisgIGZ1biB0ZXN0UGFyc2VBcGlWZXJzaW9ucygpIHsKKyAgICB2YWwgZXhwZWN0ZWQ6IFNldDxTeW1ib2w+ID0KKyAgICAgICAgc2V0T2YoCisgICAgICAgICAgICBTeW1ib2wuY3JlYXRlQ2xhc3MoImFuZHJvaWQvQ2xhenoiLCAiamF2YS9sYW5nL09iamVjdCIsIHNldE9mKCkpLAorICAgICAgICAgICAgU3ltYm9sLmNyZWF0ZU1ldGhvZCgiYW5kcm9pZC9DbGF6eiIsICJDbGF6eigpIiksCisgICAgICAgICAgICBTeW1ib2wuY3JlYXRlRmllbGQoImFuZHJvaWQvQ2xhenoiLCAiRk9PIiksCisgICAgICAgICAgICBTeW1ib2wuY3JlYXRlTWV0aG9kKCJhbmRyb2lkL0NsYXp6IiwgImdldEVycm9yQ29kZSgpIiksCisgICAgICAgICAgICBTeW1ib2wuY3JlYXRlTWV0aG9kKCJhbmRyb2lkL0NsYXp6IiwgInNldERhdGEoSVtbSUxhbmRyb2lkL3V0aWwvVXRpbGl0eTspIiksCisgICAgICAgICAgICBTeW1ib2wuY3JlYXRlTWV0aG9kKCJhbmRyb2lkL0NsYXp6IiwgInNldFZhcmlhYmxlRGF0YShJW0xhbmRyb2lkL3V0aWwvQXRvbTspIiksCisgICAgICAgICAgICBTeW1ib2wuY3JlYXRlTWV0aG9kKCJhbmRyb2lkL0NsYXp6IiwgImlubmVyQ2xhc3NBcmcoTGFuZHJvaWQvQ2xhenovQnVpbGRlcjspIiksCisgICAgICAgICAgICBTeW1ib2wuY3JlYXRlQ2xhc3MoImFuZHJvaWQvQ2xhenovQnVpbGRlciIsICJqYXZhL2xhbmcvT2JqZWN0Iiwgc2V0T2YoKSksCisgICAgICAgICkKKyAgICB2YWwgYWN0dWFsID0gcGFyc2VBcGlWZXJzaW9ucyhBUElfVkVSU0lPTlMuYnl0ZUlucHV0U3RyZWFtKCkpCisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpCisgIH0KKworICBAVGVzdAorICBmdW4gdGVzdFBhcnNlQXBpVmVyc2lvbnNOZXN0ZWRDbGFzc2VzKCkgeworICAgIHZhbCBhcGlWZXJzaW9ucyA9CisgICAgICAgICIiIgorICAgICAgICAgIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CisgICAgICAgICAgPGFwaSB2ZXJzaW9uPSIzIj4KKyAgICAgICAgICAgIDxjbGFzcyBuYW1lPSJhbmRyb2lkL0NsYXp6JHsnJCd9Rm9vJHsnJCd9QmFyIiBzaW5jZT0iMSI+CisgICAgICAgICAgICAgIDxleHRlbmRzIG5hbWU9ImphdmEvbGFuZy9PYmplY3QiLz4KKyAgICAgICAgICAgICAgPG1ldGhvZCBuYW1lPSImbHQ7aW5pdD4oKVYiLz4KKyAgICAgICAgICAgIDwvY2xhc3M+CisgICAgICAgICAgPC9hcGk+CisgICAgICAgICIiIgorICAgICAgICAgICAgLnRyaW0oKQorICAgIHZhbCBleHBlY3RlZDogU2V0PFN5bWJvbD4gPQorICAgICAgICBzZXRPZigKKyAgICAgICAgICAgIFN5bWJvbC5jcmVhdGVDbGFzcygiYW5kcm9pZC9DbGF6ei9Gb28vQmFyIiwgImphdmEvbGFuZy9PYmplY3QiLCBzZXRPZigpKSwKKyAgICAgICAgICAgIFN5bWJvbC5jcmVhdGVNZXRob2QoImFuZHJvaWQvQ2xhenovRm9vL0JhciIsICJCYXIoKSIpLAorICAgICAgICApCisgICAgdmFsIGFjdHVhbCA9IHBhcnNlQXBpVmVyc2lvbnMoYXBpVmVyc2lvbnMuYnl0ZUlucHV0U3RyZWFtKCkpCisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpCisgIH0KKworICBAVGVzdAorICBmdW4gdGVzdEZpbmRFcnJvcnNOb0Vycm9ycygpIHsKKyAgICB2YWwgZXhwZWN0ZWQgPSBzZXRPZjxBcGlFcnJvcj4oKQorICAgIHZhbCBhY3R1YWwgPQorICAgICAgICBmaW5kRXJyb3JzKAorICAgICAgICAgICAgcGFyc2VBcGlTaWduYXR1cmUoImluLW1lbW9yeSIsIEFQSV9TSUdOQVRVUkUuYnl0ZUlucHV0U3RyZWFtKCkpLAorICAgICAgICAgICAgcGFyc2VGbGFnVmFsdWVzKGdlbmVyYXRlRmxhZ3NQcm90byhFTkFCTEVELCBFTkFCTEVEKSksCisgICAgICAgICAgICBwYXJzZUFwaVZlcnNpb25zKEFQSV9WRVJTSU9OUy5ieXRlSW5wdXRTdHJlYW0oKSkpCisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpCisgIH0KKworICBAVGVzdAorICBmdW4gdGVzdEZpbmRFcnJvcnNWZXJpZnlJbXBsZW1lbnRzKCkgeworICAgIHZhbCBhcGlTaWduYXR1cmUgPQorICAgICAgICAiIiIKKyAgICAgICAgICAvLyBTaWduYXR1cmUgZm9ybWF0OiAyLjAKKyAgICAgICAgICBwYWNrYWdlIGFuZHJvaWQgeworICAgICAgICAgICAgQEZsYWdnZWRBcGkoImFuZHJvaWQuZmxhZy5mb28iKSBwdWJsaWMgZmluYWwgY2xhc3MgQ2xhenogaW1wbGVtZW50cyBhbmRyb2lkLkludGVyZmFjZSB7CisgICAgICAgICAgICAgIG1ldGhvZCBARmxhZ2dlZEFwaSgiYW5kcm9pZC5mbGFnLmZvbyIpIHB1YmxpYyBib29sZWFuIGZvbygpOworICAgICAgICAgICAgICBtZXRob2QgQEZsYWdnZWRBcGkoImFuZHJvaWQuZmxhZy5mb28iKSBwdWJsaWMgYm9vbGVhbiBiYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgSW50ZXJmYWNlIHsKKyAgICAgICAgICAgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGJhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgIiIiCisgICAgICAgICAgICAudHJpbSgpCisKKyAgICB2YWwgYXBpVmVyc2lvbnMgPQorICAgICAgICAiIiIKKyAgICAgICAgICA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorICAgICAgICAgIDxhcGkgdmVyc2lvbj0iMyI+CisgICAgICAgICAgICA8Y2xhc3MgbmFtZT0iYW5kcm9pZC9DbGF6eiIgc2luY2U9IjEiPgorICAgICAgICAgICAgICA8ZXh0ZW5kcyBuYW1lPSJqYXZhL2xhbmcvT2JqZWN0Ii8+CisgICAgICAgICAgICAgIDxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQvSW50ZXJmYWNlIi8+CisgICAgICAgICAgICAgIDxtZXRob2QgbmFtZT0iZm9vKClaIi8+CisgICAgICAgICAgICA8L2NsYXNzPgorICAgICAgICAgICAgPGNsYXNzIG5hbWU9ImFuZHJvaWQvSW50ZXJmYWNlIiBzaW5jZT0iMSI+CisgICAgICAgICAgICAgIDxtZXRob2QgbmFtZT0iYmFyKClaIi8+CisgICAgICAgICAgICA8L2NsYXNzPgorICAgICAgICAgIDwvYXBpPgorICAgICAgICAiIiIKKyAgICAgICAgICAgIC50cmltKCkKKworICAgIHZhbCBleHBlY3RlZCA9IHNldE9mPEFwaUVycm9yPigpCisgICAgdmFsIGFjdHVhbCA9CisgICAgICAgIGZpbmRFcnJvcnMoCisgICAgICAgICAgICBwYXJzZUFwaVNpZ25hdHVyZSgiaW4tbWVtb3J5IiwgYXBpU2lnbmF0dXJlLmJ5dGVJbnB1dFN0cmVhbSgpKSwKKyAgICAgICAgICAgIHBhcnNlRmxhZ1ZhbHVlcyhnZW5lcmF0ZUZsYWdzUHJvdG8oRU5BQkxFRCwgRU5BQkxFRCkpLAorICAgICAgICAgICAgcGFyc2VBcGlWZXJzaW9ucyhhcGlWZXJzaW9ucy5ieXRlSW5wdXRTdHJlYW0oKSkpCisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpCisgIH0KKworICBAVGVzdAorICBmdW4gdGVzdEZpbmRFcnJvcnNWZXJpZnlTdXBlcmNsYXNzKCkgeworICAgIHZhbCBhcGlTaWduYXR1cmUgPQorICAgICAgICAiIiIKKyAgICAgICAgICAvLyBTaWduYXR1cmUgZm9ybWF0OiAyLjAKKyAgICAgICAgICBwYWNrYWdlIGFuZHJvaWQgeworICAgICAgICAgICAgQEZsYWdnZWRBcGkoImFuZHJvaWQuZmxhZy5mb28iKSBwdWJsaWMgZmluYWwgY2xhc3MgQyBleHRlbmRzIGFuZHJvaWQuQiB7CisgICAgICAgICAgICAgIG1ldGhvZCBARmxhZ2dlZEFwaSgiYW5kcm9pZC5mbGFnLmZvbyIpIHB1YmxpYyBib29sZWFuIGMoKTsKKyAgICAgICAgICAgICAgbWV0aG9kIEBGbGFnZ2VkQXBpKCJhbmRyb2lkLmZsYWcuZm9vIikgcHVibGljIGJvb2xlYW4gYigpOworICAgICAgICAgICAgICBtZXRob2QgQEZsYWdnZWRBcGkoImFuZHJvaWQuZmxhZy5mb28iKSBwdWJsaWMgYm9vbGVhbiBhKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgZmluYWwgY2xhc3MgQiBleHRlbmRzIGFuZHJvaWQuQSB7CisgICAgICAgICAgICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBiKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgZmluYWwgY2xhc3MgQSB7CisgICAgICAgICAgICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBhKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAiIiIKKyAgICAgICAgICAgIC50cmltKCkKKworICAgIHZhbCBhcGlWZXJzaW9ucyA9CisgICAgICAgICIiIgorICAgICAgICAgIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CisgICAgICAgICAgPGFwaSB2ZXJzaW9uPSIzIj4KKyAgICAgICAgICAgIDxjbGFzcyBuYW1lPSJhbmRyb2lkL0MiIHNpbmNlPSIxIj4KKyAgICAgICAgICAgICAgPGV4dGVuZHMgbmFtZT0iYW5kcm9pZC9CIi8+CisgICAgICAgICAgICAgIDxtZXRob2QgbmFtZT0iYygpWiIvPgorICAgICAgICAgICAgPC9jbGFzcz4KKyAgICAgICAgICAgIDxjbGFzcyBuYW1lPSJhbmRyb2lkL0IiIHNpbmNlPSIxIj4KKyAgICAgICAgICAgICAgPGV4dGVuZHMgbmFtZT0iYW5kcm9pZC9BIi8+CisgICAgICAgICAgICAgIDxtZXRob2QgbmFtZT0iYigpWiIvPgorICAgICAgICAgICAgPC9jbGFzcz4KKyAgICAgICAgICAgIDxjbGFzcyBuYW1lPSJhbmRyb2lkL0EiIHNpbmNlPSIxIj4KKyAgICAgICAgICAgICAgPG1ldGhvZCBuYW1lPSJhKClaIi8+CisgICAgICAgICAgICA8L2NsYXNzPgorICAgICAgICAgIDwvYXBpPgorICAgICAgICAiIiIKKyAgICAgICAgICAgIC50cmltKCkKKworICAgIHZhbCBleHBlY3RlZCA9IHNldE9mPEFwaUVycm9yPigpCisgICAgdmFsIGFjdHVhbCA9CisgICAgICAgIGZpbmRFcnJvcnMoCisgICAgICAgICAgICBwYXJzZUFwaVNpZ25hdHVyZSgiaW4tbWVtb3J5IiwgYXBpU2lnbmF0dXJlLmJ5dGVJbnB1dFN0cmVhbSgpKSwKKyAgICAgICAgICAgIHBhcnNlRmxhZ1ZhbHVlcyhnZW5lcmF0ZUZsYWdzUHJvdG8oRU5BQkxFRCwgRU5BQkxFRCkpLAorICAgICAgICAgICAgcGFyc2VBcGlWZXJzaW9ucyhhcGlWZXJzaW9ucy5ieXRlSW5wdXRTdHJlYW0oKSkpCisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpCisgIH0KKworICBAVGVzdAorICBmdW4gdGVzdE5lc3RlZEZsYWdzT3V0ZXJGbGFnV2lucygpIHsKKyAgICB2YWwgYXBpU2lnbmF0dXJlID0KKyAgICAgICAgIiIiCisgICAgICAgICAgLy8gU2lnbmF0dXJlIGZvcm1hdDogMi4wCisgICAgICAgICAgcGFja2FnZSBhbmRyb2lkIHsKKyAgICAgICAgICAgIEBGbGFnZ2VkQXBpKCJhbmRyb2lkLmZsYWcuZm9vIikgcHVibGljIGZpbmFsIGNsYXNzIEEgeworICAgICAgICAgICAgICBtZXRob2QgQEZsYWdnZWRBcGkoImFuZHJvaWQuZmxhZy5iYXIiKSBwdWJsaWMgYm9vbGVhbiBtZXRob2QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBGbGFnZ2VkQXBpKCJhbmRyb2lkLmZsYWcuYmFyIikgcHVibGljIGZpbmFsIGNsYXNzIEIgeworICAgICAgICAgICAgICBtZXRob2QgQEZsYWdnZWRBcGkoImFuZHJvaWQuZmxhZy5mb28iKSBwdWJsaWMgYm9vbGVhbiBtZXRob2QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICIiIgorICAgICAgICAgICAgLnRyaW0oKQorCisgICAgdmFsIGFwaVZlcnNpb25zID0KKyAgICAgICAgIiIiCisgICAgICAgICAgPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKyAgICAgICAgICA8YXBpIHZlcnNpb249IjMiPgorICAgICAgICAgICAgPGNsYXNzIG5hbWU9ImFuZHJvaWQvQiIgc2luY2U9IjEiPgorICAgICAgICAgICAgPGV4dGVuZHMgbmFtZT0iamF2YS9sYW5nL09iamVjdCIvPgorICAgICAgICAgICAgPC9jbGFzcz4KKyAgICAgICAgICA8L2FwaT4KKyAgICAgICAgIiIiCisgICAgICAgICAgICAudHJpbSgpCisKKyAgICB2YWwgZXhwZWN0ZWQgPSBzZXRPZjxBcGlFcnJvcj4oKQorICAgIHZhbCBhY3R1YWwgPQorICAgICAgICBmaW5kRXJyb3JzKAorICAgICAgICAgICAgcGFyc2VBcGlTaWduYXR1cmUoImluLW1lbW9yeSIsIGFwaVNpZ25hdHVyZS5ieXRlSW5wdXRTdHJlYW0oKSksCisgICAgICAgICAgICBwYXJzZUZsYWdWYWx1ZXMoZ2VuZXJhdGVGbGFnc1Byb3RvKERJU0FCTEVELCBFTkFCTEVEKSksCisgICAgICAgICAgICBwYXJzZUFwaVZlcnNpb25zKGFwaVZlcnNpb25zLmJ5dGVJbnB1dFN0cmVhbSgpKSkKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkKKyAgfQorCisgIEBUZXN0CisgIGZ1biB0ZXN0RmluZEVycm9yc0Rpc2FibGVkRmxhZ2dlZEFwaUlzUHJlc2VudCgpIHsKKyAgICB2YWwgZXhwZWN0ZWQgPQorICAgICAgICBzZXRPZjxBcGlFcnJvcj4oCisgICAgICAgICAgICBEaXNhYmxlZEZsYWdnZWRBcGlJc1ByZXNlbnRFcnJvcigKKyAgICAgICAgICAgICAgICBTeW1ib2wuY3JlYXRlQ2xhc3MoImFuZHJvaWQvQ2xhenoiLCAiamF2YS9sYW5nL09iamVjdCIsIHNldE9mKCkpLAorICAgICAgICAgICAgICAgIEZsYWcoImFuZHJvaWQuZmxhZy5mb28iKSksCisgICAgICAgICAgICBEaXNhYmxlZEZsYWdnZWRBcGlJc1ByZXNlbnRFcnJvcigKKyAgICAgICAgICAgICAgICBTeW1ib2wuY3JlYXRlTWV0aG9kKCJhbmRyb2lkL0NsYXp6IiwgIkNsYXp6KCkiKSwgRmxhZygiYW5kcm9pZC5mbGFnLmZvbyIpKSwKKyAgICAgICAgICAgIERpc2FibGVkRmxhZ2dlZEFwaUlzUHJlc2VudEVycm9yKAorICAgICAgICAgICAgICAgIFN5bWJvbC5jcmVhdGVGaWVsZCgiYW5kcm9pZC9DbGF6eiIsICJGT08iKSwgRmxhZygiYW5kcm9pZC5mbGFnLmZvbyIpKSwKKyAgICAgICAgICAgIERpc2FibGVkRmxhZ2dlZEFwaUlzUHJlc2VudEVycm9yKAorICAgICAgICAgICAgICAgIFN5bWJvbC5jcmVhdGVNZXRob2QoImFuZHJvaWQvQ2xhenoiLCAiZ2V0RXJyb3JDb2RlKCkiKSwgRmxhZygiYW5kcm9pZC5mbGFnLmZvbyIpKSwKKyAgICAgICAgICAgIERpc2FibGVkRmxhZ2dlZEFwaUlzUHJlc2VudEVycm9yKAorICAgICAgICAgICAgICAgIFN5bWJvbC5jcmVhdGVNZXRob2QoImFuZHJvaWQvQ2xhenoiLCAic2V0RGF0YShJW1tJTGFuZHJvaWQvdXRpbC9VdGlsaXR5OykiKSwKKyAgICAgICAgICAgICAgICBGbGFnKCJhbmRyb2lkLmZsYWcuZm9vIikpLAorICAgICAgICAgICAgRGlzYWJsZWRGbGFnZ2VkQXBpSXNQcmVzZW50RXJyb3IoCisgICAgICAgICAgICAgICAgU3ltYm9sLmNyZWF0ZU1ldGhvZCgiYW5kcm9pZC9DbGF6eiIsICJzZXRWYXJpYWJsZURhdGEoSVtMYW5kcm9pZC91dGlsL0F0b207KSIpLAorICAgICAgICAgICAgICAgIEZsYWcoImFuZHJvaWQuZmxhZy5mb28iKSksCisgICAgICAgICAgICBEaXNhYmxlZEZsYWdnZWRBcGlJc1ByZXNlbnRFcnJvcigKKyAgICAgICAgICAgICAgICBTeW1ib2wuY3JlYXRlTWV0aG9kKCJhbmRyb2lkL0NsYXp6IiwgImlubmVyQ2xhc3NBcmcoTGFuZHJvaWQvQ2xhenovQnVpbGRlcjspIiksCisgICAgICAgICAgICAgICAgRmxhZygiYW5kcm9pZC5mbGFnLmZvbyIpKSwKKyAgICAgICAgICAgIERpc2FibGVkRmxhZ2dlZEFwaUlzUHJlc2VudEVycm9yKAorICAgICAgICAgICAgICAgIFN5bWJvbC5jcmVhdGVDbGFzcygiYW5kcm9pZC9DbGF6ei9CdWlsZGVyIiwgImphdmEvbGFuZy9PYmplY3QiLCBzZXRPZigpKSwKKyAgICAgICAgICAgICAgICBGbGFnKCJhbmRyb2lkLmZsYWcuYmFyIikpLAorICAgICAgICApCisgICAgdmFsIGFjdHVhbCA9CisgICAgICAgIGZpbmRFcnJvcnMoCisgICAgICAgICAgICBwYXJzZUFwaVNpZ25hdHVyZSgiaW4tbWVtb3J5IiwgQVBJX1NJR05BVFVSRS5ieXRlSW5wdXRTdHJlYW0oKSksCisgICAgICAgICAgICBwYXJzZUZsYWdWYWx1ZXMoZ2VuZXJhdGVGbGFnc1Byb3RvKERJU0FCTEVELCBESVNBQkxFRCkpLAorICAgICAgICAgICAgcGFyc2VBcGlWZXJzaW9ucyhBUElfVkVSU0lPTlMuYnl0ZUlucHV0U3RyZWFtKCkpKQorICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKQorICB9CisKKyAgQFRlc3QKKyAgZnVuIHRlc3RMaXN0RmxhZ2dlZEFwaXMoKSB7CisgICAgdmFsIGV4cGVjdGVkID0KKyAgICAgICAgbGlzdE9mKAorICAgICAgICAgICAgImFuZHJvaWQuZmxhZy5iYXIgRElTQUJMRUQgYW5kcm9pZC9DbGF6ei9CdWlsZGVyIiwKKyAgICAgICAgICAgICJhbmRyb2lkLmZsYWcuZm9vIEVOQUJMRUQgYW5kcm9pZC9DbGF6eiIsCisgICAgICAgICAgICAiYW5kcm9pZC5mbGFnLmZvbyBFTkFCTEVEIGFuZHJvaWQvQ2xhenovQ2xhenooKSIsCisgICAgICAgICAgICAiYW5kcm9pZC5mbGFnLmZvbyBFTkFCTEVEIGFuZHJvaWQvQ2xhenovRk9PIiwKKyAgICAgICAgICAgICJhbmRyb2lkLmZsYWcuZm9vIEVOQUJMRUQgYW5kcm9pZC9DbGF6ei9nZXRFcnJvckNvZGUoKSIsCisgICAgICAgICAgICAiYW5kcm9pZC5mbGFnLmZvbyBFTkFCTEVEIGFuZHJvaWQvQ2xhenovaW5uZXJDbGFzc0FyZyhMYW5kcm9pZC9DbGF6ei9CdWlsZGVyOykiLAorICAgICAgICAgICAgImFuZHJvaWQuZmxhZy5mb28gRU5BQkxFRCBhbmRyb2lkL0NsYXp6L3NldERhdGEoSVtbSUxhbmRyb2lkL3V0aWwvVXRpbGl0eTspIiwKKyAgICAgICAgICAgICJhbmRyb2lkLmZsYWcuZm9vIEVOQUJMRUQgYW5kcm9pZC9DbGF6ei9zZXRWYXJpYWJsZURhdGEoSVtMYW5kcm9pZC91dGlsL0F0b207KSIpCisgICAgdmFsIGFjdHVhbCA9CisgICAgICAgIGxpc3RGbGFnZ2VkQXBpcygKKyAgICAgICAgICAgIHBhcnNlQXBpU2lnbmF0dXJlKCJpbi1tZW1vcnkiLCBBUElfU0lHTkFUVVJFLmJ5dGVJbnB1dFN0cmVhbSgpKSwKKyAgICAgICAgICAgIHBhcnNlRmxhZ1ZhbHVlcyhnZW5lcmF0ZUZsYWdzUHJvdG8oRU5BQkxFRCwgRElTQUJMRUQpKSkKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvY2hlY2stZmxhZ2dlZC1hcGlzL3NyYy9jb20vYW5kcm9pZC9jaGVja2ZsYWdnZWRhcGlzL01haW4ua3QgYi90b29scy9jaGVjay1mbGFnZ2VkLWFwaXMvc3JjL2NvbS9hbmRyb2lkL2NoZWNrZmxhZ2dlZGFwaXMvTWFpbi5rdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzIzYzIwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvY2hlY2stZmxhZ2dlZC1hcGlzL3NyYy9jb20vYW5kcm9pZC9jaGVja2ZsYWdnZWRhcGlzL01haW4ua3QKQEAgLTAsMCArMSw1MjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworQGZpbGU6SnZtTmFtZSgiTWFpbiIpCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY2hlY2tmbGFnZ2VkYXBpcworCitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLkFjb25maWcKK2ltcG9ydCBjb20uYW5kcm9pZC50b29scy5tZXRhbGF2YS5tb2RlbC5CYXNlSXRlbVZpc2l0b3IKK2ltcG9ydCBjb20uYW5kcm9pZC50b29scy5tZXRhbGF2YS5tb2RlbC5DYWxsYWJsZUl0ZW0KK2ltcG9ydCBjb20uYW5kcm9pZC50b29scy5tZXRhbGF2YS5tb2RlbC5DbGFzc0l0ZW0KK2ltcG9ydCBjb20uYW5kcm9pZC50b29scy5tZXRhbGF2YS5tb2RlbC5GaWVsZEl0ZW0KK2ltcG9ydCBjb20uYW5kcm9pZC50b29scy5tZXRhbGF2YS5tb2RlbC5JdGVtCitpbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubWV0YWxhdmEubW9kZWwudGV4dC5BcGlGaWxlCitpbXBvcnQgY29tLmdpdGh1Yi5hamFsdC5jbGlrdC5jb3JlLkNsaWt0Q29tbWFuZAoraW1wb3J0IGNvbS5naXRodWIuYWphbHQuY2xpa3QuY29yZS5Qcm9ncmFtUmVzdWx0CitpbXBvcnQgY29tLmdpdGh1Yi5hamFsdC5jbGlrdC5jb3JlLnN1YmNvbW1hbmRzCitpbXBvcnQgY29tLmdpdGh1Yi5hamFsdC5jbGlrdC5wYXJhbWV0ZXJzLm9wdGlvbnMuaGVscAoraW1wb3J0IGNvbS5naXRodWIuYWphbHQuY2xpa3QucGFyYW1ldGVycy5vcHRpb25zLm9wdGlvbgoraW1wb3J0IGNvbS5naXRodWIuYWphbHQuY2xpa3QucGFyYW1ldGVycy5vcHRpb25zLnJlcXVpcmVkCitpbXBvcnQgY29tLmdpdGh1Yi5hamFsdC5jbGlrdC5wYXJhbWV0ZXJzLnR5cGVzLnBhdGgKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeQoraW1wb3J0IG9yZy53M2MuZG9tLk5vZGUKKworLyoqCisgKiBDbGFzcyByZXByZXNlbnRpbmcgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgY2xhc3MsIG1ldGhvZCBvciBmaWVsZC4KKyAqCisgKiBUaGlzIHRvb2wgcmVhZHMgYSBtdWx0aXR1ZGUgb2YgaW5wdXQgZm9ybWF0cyBhbGwgb2Ygd2hpY2ggcmVwcmVzZW50cyB0aGUgZnVsbHkgcXVhbGlmaWVkIHBhdGggdG8KKyAqIGEgSmF2YSBzeW1ib2wgc2xpZ2h0bHkgZGlmZmVyZW50bHkuIFRvIGtlZXAgdGhpbmdzIGNvbnNpc3RlbnQsIGFsbCBwYXJzZWQgQVBJcyBhcmUgY29udmVydGVkIHRvCisgKiBTeW1ib2xzLgorICoKKyAqIFN5bWJvbHMgYXJlIGVuY29kZWQgdXNpbmcgdGhlIGZvcm1hdCBzaW1pbGFyIHRvIHRoZSBvbmUgZGVzY3JpYmVkIGluIHNlY3Rpb24gNC4zLjIgb2YgdGhlIEpWTQorICogc3BlYyBbMV0sIHRoYXQgaXMsICJwYWNrYWdlLmNsYXNzLmlubmVyLWNsYXNzLm1ldGhvZChpbnQsIGludFtdLCBhbmRyb2lkLnV0aWwuQ2xhenopIiBpcworICogcmVwcmVzZW50ZWQgYXMKKyAqIDxwcmU+CisgKiAgIHBhY2thZ2UuY2xhc3MuaW5uZXItY2xhc3MubWV0aG9kKElJW0xhbmRyb2lkL3V0aWwvQ2xheno7KQorICogPHByZT4KKyAqCisgKiBXaGVyZSBwb3NzaWJsZSwgdGhlIGZvcm1hdCBoYXMgYmVlbiBzaW1wbGlmaWVkICh0byBtYWtlIHRyYW5zbGF0aW9uIG9mIHRoZQorICogdmFyaW91cyBpbnB1dCBmb3JtYXRzIGVhc2llcik6IGZvciBpbnN0YW5jZSwgb25seSAvIGlzIHVzZWQgYXMgZGVsaW1pdGVyICgjCisgKiBhbmQgJCBhcmUgbmV2ZXIgdXNlZCkuCisgKgorICogMS4gaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlL3NwZWNzL2p2bXMvc2U3L2h0bWwvanZtcy00Lmh0bWwjanZtcy00LjMuMgorICovCitpbnRlcm5hbCBzZWFsZWQgY2xhc3MgU3ltYm9sIHsKKyAgY29tcGFuaW9uIG9iamVjdCB7CisgICAgcHJpdmF0ZSB2YWwgRk9SQklEREVOX0NIQVJTID0gbGlzdE9mKCcjJywgJyQnLCAnLicpCisKKyAgICBmdW4gY3JlYXRlQ2xhc3MoY2xheno6IFN0cmluZywgc3VwZXJjbGFzczogU3RyaW5nPywgaW50ZXJmYWNlczogU2V0PFN0cmluZz4pOiBTeW1ib2wgeworICAgICAgcmV0dXJuIENsYXNzU3ltYm9sKAorICAgICAgICAgIHRvSW50ZXJuYWxGb3JtYXQoY2xhenopLAorICAgICAgICAgIHN1cGVyY2xhc3M/LmxldCB7IHRvSW50ZXJuYWxGb3JtYXQoaXQpIH0sCisgICAgICAgICAgaW50ZXJmYWNlcy5tYXAgeyB0b0ludGVybmFsRm9ybWF0KGl0KSB9LnRvU2V0KCkpCisgICAgfQorCisgICAgZnVuIGNyZWF0ZUZpZWxkKGNsYXp6OiBTdHJpbmcsIGZpZWxkOiBTdHJpbmcpOiBTeW1ib2wgeworICAgICAgcmVxdWlyZSghZmllbGQuY29udGFpbnMoIigiKSAmJiAhZmllbGQuY29udGFpbnMoIikiKSkKKyAgICAgIHJldHVybiBNZW1iZXJTeW1ib2wodG9JbnRlcm5hbEZvcm1hdChjbGF6eiksIHRvSW50ZXJuYWxGb3JtYXQoZmllbGQpKQorICAgIH0KKworICAgIGZ1biBjcmVhdGVNZXRob2QoY2xheno6IFN0cmluZywgbWV0aG9kOiBTdHJpbmcpOiBTeW1ib2wgeworICAgICAgcmV0dXJuIE1lbWJlclN5bWJvbCh0b0ludGVybmFsRm9ybWF0KGNsYXp6KSwgdG9JbnRlcm5hbEZvcm1hdChtZXRob2QpKQorICAgIH0KKworICAgIHByb3RlY3RlZCBmdW4gdG9JbnRlcm5hbEZvcm1hdChuYW1lOiBTdHJpbmcpOiBTdHJpbmcgeworICAgICAgdmFyIGludGVybmFsTmFtZSA9IG5hbWUKKyAgICAgIGZvciAoY2ggaW4gRk9SQklEREVOX0NIQVJTKSB7CisgICAgICAgIGludGVybmFsTmFtZSA9IGludGVybmFsTmFtZS5yZXBsYWNlKGNoLCAnLycpCisgICAgICB9CisgICAgICByZXR1cm4gaW50ZXJuYWxOYW1lCisgICAgfQorICB9CisKKyAgYWJzdHJhY3QgZnVuIHRvUHJldHR5U3RyaW5nKCk6IFN0cmluZworfQorCitpbnRlcm5hbCBkYXRhIGNsYXNzIENsYXNzU3ltYm9sKAorICAgIHZhbCBjbGF6ejogU3RyaW5nLAorICAgIHZhbCBzdXBlcmNsYXNzOiBTdHJpbmc/LAorICAgIHZhbCBpbnRlcmZhY2VzOiBTZXQ8U3RyaW5nPgorKSA6IFN5bWJvbCgpIHsKKyAgb3ZlcnJpZGUgZnVuIHRvUHJldHR5U3RyaW5nKCk6IFN0cmluZyA9ICIkY2xhenoiCit9CisKK2ludGVybmFsIGRhdGEgY2xhc3MgTWVtYmVyU3ltYm9sKHZhbCBjbGF6ejogU3RyaW5nLCB2YWwgbWVtYmVyOiBTdHJpbmcpIDogU3ltYm9sKCkgeworICBvdmVycmlkZSBmdW4gdG9QcmV0dHlTdHJpbmcoKTogU3RyaW5nID0gIiRjbGF6ei8kbWVtYmVyIgorfQorCisvKioKKyAqIENsYXNzIHJlcHJlc2VudGluZyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYW4gYWNvbmZpZyBmbGFnLgorICoKKyAqIFRoaXMgaW5jbHVkZXMgYm90aCB0aGUgZmxhZydzIHBhY2thZ2UgYW5kIG5hbWUsIHNlcGFyYXRlZCBieSBhIGRvdCwgZS5nLjoKKyAqIDxwcmU+CisgKiAgIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9ybworICogPHByZT4KKyAqLworQEp2bUlubGluZQoraW50ZXJuYWwgdmFsdWUgY2xhc3MgRmxhZyh2YWwgbmFtZTogU3RyaW5nKSB7CisgIG92ZXJyaWRlIGZ1biB0b1N0cmluZygpOiBTdHJpbmcgPSBuYW1lLnRvU3RyaW5nKCkKK30KKworaW50ZXJuYWwgc2VhbGVkIGNsYXNzIEFwaUVycm9yIHsKKyAgYWJzdHJhY3QgdmFsIHN5bWJvbDogU3ltYm9sCisgIGFic3RyYWN0IHZhbCBmbGFnOiBGbGFnCit9CisKK2ludGVybmFsIGRhdGEgY2xhc3MgRW5hYmxlZEZsYWdnZWRBcGlOb3RQcmVzZW50RXJyb3IoCisgICAgb3ZlcnJpZGUgdmFsIHN5bWJvbDogU3ltYm9sLAorICAgIG92ZXJyaWRlIHZhbCBmbGFnOiBGbGFnCispIDogQXBpRXJyb3IoKSB7CisgIG92ZXJyaWRlIGZ1biB0b1N0cmluZygpOiBTdHJpbmcgeworICAgIHJldHVybiAiZXJyb3I6IGVuYWJsZWQgQEZsYWdnZWRBcGkgbm90IHByZXNlbnQgaW4gYnVpbHQgYXJ0aWZhY3Q6IHN5bWJvbD0ke3N5bWJvbC50b1ByZXR0eVN0cmluZygpfSBmbGFnPSRmbGFnIgorICB9Cit9CisKK2ludGVybmFsIGRhdGEgY2xhc3MgRGlzYWJsZWRGbGFnZ2VkQXBpSXNQcmVzZW50RXJyb3IoCisgICAgb3ZlcnJpZGUgdmFsIHN5bWJvbDogU3ltYm9sLAorICAgIG92ZXJyaWRlIHZhbCBmbGFnOiBGbGFnCispIDogQXBpRXJyb3IoKSB7CisgIG92ZXJyaWRlIGZ1biB0b1N0cmluZygpOiBTdHJpbmcgeworICAgIHJldHVybiAiZXJyb3I6IGRpc2FibGVkIEBGbGFnZ2VkQXBpIGlzIHByZXNlbnQgaW4gYnVpbHQgYXJ0aWZhY3Q6IHN5bWJvbD0ke3N5bWJvbC50b1ByZXR0eVN0cmluZygpfSBmbGFnPSRmbGFnIgorICB9Cit9CisKK2ludGVybmFsIGRhdGEgY2xhc3MgVW5rbm93bkZsYWdFcnJvcihvdmVycmlkZSB2YWwgc3ltYm9sOiBTeW1ib2wsIG92ZXJyaWRlIHZhbCBmbGFnOiBGbGFnKSA6CisgICAgQXBpRXJyb3IoKSB7CisgIG92ZXJyaWRlIGZ1biB0b1N0cmluZygpOiBTdHJpbmcgeworICAgIHJldHVybiAiZXJyb3I6IHVua25vd24gZmxhZzogc3ltYm9sPSR7c3ltYm9sLnRvUHJldHR5U3RyaW5nKCl9IGZsYWc9JGZsYWciCisgIH0KK30KKwordmFsIEFSR19BUElfU0lHTkFUVVJFID0gIi0tYXBpLXNpZ25hdHVyZSIKK3ZhbCBBUkdfQVBJX1NJR05BVFVSRV9IRUxQID0KKyAgICAiIiIKK1BhdGggdG8gQVBJIHNpZ25hdHVyZSBmaWxlLgorVXN1YWxseSBuYW1lZCAqY3VycmVudC50eHQuCitUaXA6IGBtIGZyYW1ld29ya3MtYmFzZS1hcGktY3VycmVudC50eHRgIHdpbGwgZ2VuZXJhdGUgYSBmaWxlIHRoYXQgaW5jbHVkZXMgYWxsIHBsYXRmb3JtIGFuZCBtYWlubGluZSBBUElzLgorIiIiCisKK3ZhbCBBUkdfRkxBR19WQUxVRVMgPSAiLS1mbGFnLXZhbHVlcyIKK3ZhbCBBUkdfRkxBR19WQUxVRVNfSEVMUCA9CisgICAgIiIiCitQYXRoIHRvIGFjb25maWcgcGFyc2VkX2ZsYWdzIGJpbmFyeSBwcm90byBmaWxlLgorVGlwOiBgbSBhbGxfYWNvbmZpZ19kZWNsYXJhdGlvbnNgIHdpbGwgZ2VuZXJhdGUgYSBmaWxlIHRoYXQgaW5jbHVkZXMgYWxsIGluZm9ybWF0aW9uIGFib3V0IGFsbCBmbGFncy4KKyIiIgorCit2YWwgQVJHX0FQSV9WRVJTSU9OUyA9ICItLWFwaS12ZXJzaW9ucyIKK3ZhbCBBUkdfQVBJX1ZFUlNJT05TX0hFTFAgPQorICAgICIiIgorUGF0aCB0byBBUEkgdmVyc2lvbnMgWE1MIGZpbGUuCitVc3VhbGx5IG5hbWVkIHhtbC12ZXJzaW9ucy54bWwuCitUaXA6IGBtIHNkayBkaXN0YCB3aWxsIGdlbmVyYXRlIGEgZmlsZSB0aGF0IGluY2x1ZGVzIGFsbCBwbGF0Zm9ybSBhbmQgbWFpbmxpbmUgQVBJcy4KKyIiIgorCitjbGFzcyBNYWluQ29tbWFuZCA6IENsaWt0Q29tbWFuZCgpIHsKKyAgb3ZlcnJpZGUgZnVuIHJ1bigpIHt9Cit9CisKK2NsYXNzIENoZWNrQ29tbWFuZCA6CisgICAgQ2xpa3RDb21tYW5kKAorICAgICAgICBoZWxwID0KKyAgICAgICAgICAgICIiIgorQ2hlY2sgdGhhdCBhbGwgZmxhZ2dlZCBBUElzIGFyZSB1c2VkIGluIHRoZSBjb3JyZWN0IHdheS4KKworVGhpcyB0b29sIHJlYWRzIHRoZSBBUEkgc2lnbmF0dXJlIGZpbGUgYW5kIGNoZWNrcyB0aGF0IGFsbCBmbGFnZ2VkIEFQSXMgYXJlIHVzZWQgaW4gdGhlIGNvcnJlY3Qgd2F5LgorCitUaGUgdG9vbCB3aWxsIGV4aXQgd2l0aCBhIG5vbi16ZXJvIGV4aXQgY29kZSBpZiBhbnkgZmxhZ2dlZCBBUElzIGFyZSBmb3VuZCB0byBiZSB1c2VkIGluIHRoZSBpbmNvcnJlY3Qgd2F5LgorIiIiKSB7CisgIHByaXZhdGUgdmFsIGFwaVNpZ25hdHVyZVBhdGggYnkKKyAgICAgIG9wdGlvbihBUkdfQVBJX1NJR05BVFVSRSkKKyAgICAgICAgICAuaGVscChBUkdfQVBJX1NJR05BVFVSRV9IRUxQKQorICAgICAgICAgIC5wYXRoKG11c3RFeGlzdCA9IHRydWUsIGNhbkJlRGlyID0gZmFsc2UsIG11c3RCZVJlYWRhYmxlID0gdHJ1ZSkKKyAgICAgICAgICAucmVxdWlyZWQoKQorICBwcml2YXRlIHZhbCBmbGFnVmFsdWVzUGF0aCBieQorICAgICAgb3B0aW9uKEFSR19GTEFHX1ZBTFVFUykKKyAgICAgICAgICAuaGVscChBUkdfRkxBR19WQUxVRVNfSEVMUCkKKyAgICAgICAgICAucGF0aChtdXN0RXhpc3QgPSB0cnVlLCBjYW5CZURpciA9IGZhbHNlLCBtdXN0QmVSZWFkYWJsZSA9IHRydWUpCisgICAgICAgICAgLnJlcXVpcmVkKCkKKyAgcHJpdmF0ZSB2YWwgYXBpVmVyc2lvbnNQYXRoIGJ5CisgICAgICBvcHRpb24oQVJHX0FQSV9WRVJTSU9OUykKKyAgICAgICAgICAuaGVscChBUkdfQVBJX1ZFUlNJT05TX0hFTFApCisgICAgICAgICAgLnBhdGgobXVzdEV4aXN0ID0gdHJ1ZSwgY2FuQmVEaXIgPSBmYWxzZSwgbXVzdEJlUmVhZGFibGUgPSB0cnVlKQorICAgICAgICAgIC5yZXF1aXJlZCgpCisKKyAgb3ZlcnJpZGUgZnVuIHJ1bigpIHsKKyAgICB2YWwgZmxhZ2dlZFN5bWJvbHMgPQorICAgICAgICBhcGlTaWduYXR1cmVQYXRoLnRvRmlsZSgpLmlucHV0U3RyZWFtKCkudXNlIHsKKyAgICAgICAgICBwYXJzZUFwaVNpZ25hdHVyZShhcGlTaWduYXR1cmVQYXRoLnRvU3RyaW5nKCksIGl0KQorICAgICAgICB9CisgICAgdmFsIGZsYWdzID0gZmxhZ1ZhbHVlc1BhdGgudG9GaWxlKCkuaW5wdXRTdHJlYW0oKS51c2UgeyBwYXJzZUZsYWdWYWx1ZXMoaXQpIH0KKyAgICB2YWwgZXhwb3J0ZWRTeW1ib2xzID0gYXBpVmVyc2lvbnNQYXRoLnRvRmlsZSgpLmlucHV0U3RyZWFtKCkudXNlIHsgcGFyc2VBcGlWZXJzaW9ucyhpdCkgfQorICAgIHZhbCBlcnJvcnMgPSBmaW5kRXJyb3JzKGZsYWdnZWRTeW1ib2xzLCBmbGFncywgZXhwb3J0ZWRTeW1ib2xzKQorICAgIGZvciAoZSBpbiBlcnJvcnMpIHsKKyAgICAgIHByaW50bG4oZSkKKyAgICB9CisgICAgdGhyb3cgUHJvZ3JhbVJlc3VsdChlcnJvcnMuc2l6ZSkKKyAgfQorfQorCitjbGFzcyBMaXN0Q29tbWFuZCA6CisgICAgQ2xpa3RDb21tYW5kKAorICAgICAgICBoZWxwID0KKyAgICAgICAgICAgICIiIgorTGlzdCBhbGwgZmxhZ2dlZCBBUElzIGFuZCBjb3JyZXNwb25kaW5nIGZsYWdzLgorCitUaGUgb3V0cHV0IGZvcm1hdCBpcyAiPGZ1bGx5LXF1YWxpZmllZC1uYW1lLW9mLWZsYWc+IDxzdGF0ZS1vZi1mbGFnPiA8QVBJPiIsIG9uZSBsaW5lIHBlciBBUEkuCisKK1RoZSBvdXRwdXQgY2FuIGJlIHBvc3QtcHJvY2Vzc2VkIGJ5IGUuZy4gcGlwaW5nIGl0IHRvIGdyZXAgdG8gZmlsdGVyIG91dCBvbmx5IGVuYWJsZWQgQVBJcywgb3IgYWxsIEFQSXMgZ3VhcmRlZCBieSBhIGdpdmVuIGZsYWcuCisiIiIpIHsKKyAgcHJpdmF0ZSB2YWwgYXBpU2lnbmF0dXJlUGF0aCBieQorICAgICAgb3B0aW9uKEFSR19BUElfU0lHTkFUVVJFKQorICAgICAgICAgIC5oZWxwKEFSR19BUElfU0lHTkFUVVJFX0hFTFApCisgICAgICAgICAgLnBhdGgobXVzdEV4aXN0ID0gdHJ1ZSwgY2FuQmVEaXIgPSBmYWxzZSwgbXVzdEJlUmVhZGFibGUgPSB0cnVlKQorICAgICAgICAgIC5yZXF1aXJlZCgpCisgIHByaXZhdGUgdmFsIGZsYWdWYWx1ZXNQYXRoIGJ5CisgICAgICBvcHRpb24oQVJHX0ZMQUdfVkFMVUVTKQorICAgICAgICAgIC5oZWxwKEFSR19GTEFHX1ZBTFVFU19IRUxQKQorICAgICAgICAgIC5wYXRoKG11c3RFeGlzdCA9IHRydWUsIGNhbkJlRGlyID0gZmFsc2UsIG11c3RCZVJlYWRhYmxlID0gdHJ1ZSkKKyAgICAgICAgICAucmVxdWlyZWQoKQorCisgIG92ZXJyaWRlIGZ1biBydW4oKSB7CisgICAgdmFsIGZsYWdnZWRTeW1ib2xzID0KKyAgICAgICAgYXBpU2lnbmF0dXJlUGF0aC50b0ZpbGUoKS5pbnB1dFN0cmVhbSgpLnVzZSB7CisgICAgICAgICAgcGFyc2VBcGlTaWduYXR1cmUoYXBpU2lnbmF0dXJlUGF0aC50b1N0cmluZygpLCBpdCkKKyAgICAgICAgfQorICAgIHZhbCBmbGFncyA9IGZsYWdWYWx1ZXNQYXRoLnRvRmlsZSgpLmlucHV0U3RyZWFtKCkudXNlIHsgcGFyc2VGbGFnVmFsdWVzKGl0KSB9CisgICAgdmFsIG91dHB1dCA9IGxpc3RGbGFnZ2VkQXBpcyhmbGFnZ2VkU3ltYm9scywgZmxhZ3MpCisgICAgaWYgKG91dHB1dC5pc05vdEVtcHR5KCkpIHsKKyAgICAgIHByaW50bG4ob3V0cHV0LmpvaW5Ub1N0cmluZygiXG4iKSkKKyAgICB9CisgIH0KK30KKworaW50ZXJuYWwgZnVuIHBhcnNlQXBpU2lnbmF0dXJlKHBhdGg6IFN0cmluZywgaW5wdXQ6IElucHV0U3RyZWFtKTogU2V0PFBhaXI8U3ltYm9sLCBGbGFnPj4geworICB2YWwgb3V0cHV0ID0gbXV0YWJsZVNldE9mPFBhaXI8U3ltYm9sLCBGbGFnPj4oKQorICB2YWwgdmlzaXRvciA9CisgICAgICBvYmplY3QgOiBCYXNlSXRlbVZpc2l0b3IoKSB7CisgICAgICAgIG92ZXJyaWRlIGZ1biB2aXNpdENsYXNzKGNsczogQ2xhc3NJdGVtKSB7CisgICAgICAgICAgZ2V0RmxhZ09yTnVsbChjbHMpPy5sZXQgeyBmbGFnIC0+CisgICAgICAgICAgICB2YWwgc3ltYm9sID0KKyAgICAgICAgICAgICAgICBTeW1ib2wuY3JlYXRlQ2xhc3MoCisgICAgICAgICAgICAgICAgICAgIGNscy5iYXNlbGluZUVsZW1lbnRJZCgpLAorICAgICAgICAgICAgICAgICAgICBpZiAoY2xzLmlzSW50ZXJmYWNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAiamF2YS9sYW5nL09iamVjdCIKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICBjbHMuc3VwZXJDbGFzcygpPy5iYXNlbGluZUVsZW1lbnRJZCgpCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIGNscy5hbGxJbnRlcmZhY2VzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAgeyBpdC5iYXNlbGluZUVsZW1lbnRJZCgpIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIgeyBpdCAhPSBjbHMuYmFzZWxpbmVFbGVtZW50SWQoKSB9CisgICAgICAgICAgICAgICAgICAgICAgICAudG9TZXQoKSkKKyAgICAgICAgICAgIG91dHB1dC5hZGQoUGFpcihzeW1ib2wsIGZsYWcpKQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG92ZXJyaWRlIGZ1biB2aXNpdEZpZWxkKGZpZWxkOiBGaWVsZEl0ZW0pIHsKKyAgICAgICAgICBnZXRGbGFnT3JOdWxsKGZpZWxkKT8ubGV0IHsgZmxhZyAtPgorICAgICAgICAgICAgdmFsIHN5bWJvbCA9CisgICAgICAgICAgICAgICAgU3ltYm9sLmNyZWF0ZUZpZWxkKGZpZWxkLmNvbnRhaW5pbmdDbGFzcygpLmJhc2VsaW5lRWxlbWVudElkKCksIGZpZWxkLm5hbWUoKSkKKyAgICAgICAgICAgIG91dHB1dC5hZGQoUGFpcihzeW1ib2wsIGZsYWcpKQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG92ZXJyaWRlIGZ1biB2aXNpdENhbGxhYmxlKGNhbGxhYmxlOiBDYWxsYWJsZUl0ZW0pIHsKKyAgICAgICAgICBnZXRGbGFnT3JOdWxsKGNhbGxhYmxlKT8ubGV0IHsgZmxhZyAtPgorICAgICAgICAgICAgdmFsIGNhbGxhYmxlU2lnbmF0dXJlID0gYnVpbGRTdHJpbmcgeworICAgICAgICAgICAgICBhcHBlbmQoY2FsbGFibGUubmFtZSgpKQorICAgICAgICAgICAgICBhcHBlbmQoIigiKQorICAgICAgICAgICAgICBjYWxsYWJsZS5wYXJhbWV0ZXJzKCkuam9pblRvKHRoaXMsIHNlcGFyYXRvciA9ICIiKSB7IGl0LnR5cGUoKS5pbnRlcm5hbE5hbWUoKSB9CisgICAgICAgICAgICAgIGFwcGVuZCgiKSIpCisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWwgc3ltYm9sID0gU3ltYm9sLmNyZWF0ZU1ldGhvZChjYWxsYWJsZS5jb250YWluaW5nQ2xhc3MoKS5xdWFsaWZpZWROYW1lKCksIGNhbGxhYmxlU2lnbmF0dXJlKQorICAgICAgICAgICAgb3V0cHV0LmFkZChQYWlyKHN5bWJvbCwgZmxhZykpCisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmdW4gZ2V0RmxhZ09yTnVsbChpdGVtOiBJdGVtKTogRmxhZz8geworICAgICAgICAgIHJldHVybiBpdGVtLm1vZGlmaWVycworICAgICAgICAgICAgICAuZmluZEFubm90YXRpb24oImFuZHJvaWQuYW5ub3RhdGlvbi5GbGFnZ2VkQXBpIikKKyAgICAgICAgICAgICAgPy5maW5kQXR0cmlidXRlKCJ2YWx1ZSIpCisgICAgICAgICAgICAgID8udmFsdWUKKyAgICAgICAgICAgICAgPy5sZXQgeyBGbGFnKGl0LnZhbHVlKCkgYXMgU3RyaW5nKSB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgdmFsIGNvZGViYXNlID0gQXBpRmlsZS5wYXJzZUFwaShwYXRoLCBpbnB1dCkKKyAgY29kZWJhc2UuYWNjZXB0KHZpc2l0b3IpCisgIHJldHVybiBvdXRwdXQKK30KKworaW50ZXJuYWwgZnVuIHBhcnNlRmxhZ1ZhbHVlcyhpbnB1dDogSW5wdXRTdHJlYW0pOiBNYXA8RmxhZywgQm9vbGVhbj4geworICB2YWwgcGFyc2VkRmxhZ3MgPSBBY29uZmlnLnBhcnNlZF9mbGFncy5wYXJzZUZyb20oaW5wdXQpLmdldFBhcnNlZEZsYWdMaXN0KCkKKyAgcmV0dXJuIHBhcnNlZEZsYWdzLmFzc29jaWF0ZUJ5KAorICAgICAgeyBGbGFnKCIke2l0LmdldFBhY2thZ2UoKX0uJHtpdC5nZXROYW1lKCl9IikgfSwKKyAgICAgIHsgaXQuZ2V0U3RhdGUoKSA9PSBBY29uZmlnLmZsYWdfc3RhdGUuRU5BQkxFRCB9KQorfQorCitpbnRlcm5hbCBmdW4gcGFyc2VBcGlWZXJzaW9ucyhpbnB1dDogSW5wdXRTdHJlYW0pOiBTZXQ8U3ltYm9sPiB7CisgIGZ1biBOb2RlLmdldEF0dHJpYnV0ZShuYW1lOiBTdHJpbmcpOiBTdHJpbmc/ID0gZ2V0QXR0cmlidXRlcygpPy5nZXROYW1lZEl0ZW0obmFtZSk/LmdldE5vZGVWYWx1ZSgpCisKKyAgdmFsIG91dHB1dCA9IG11dGFibGVTZXRPZjxTeW1ib2w+KCkKKyAgdmFsIGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkKKyAgdmFsIHBhcnNlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCkKKyAgdmFsIGRvY3VtZW50ID0gcGFyc2VyLnBhcnNlKGlucHV0KQorCisgIHZhbCBjbGFzc2VzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImNsYXNzIikKKyAgLy8ga3RmbXQgZG9lc24ndCB1bmRlcnN0YW5kIHRoZSBgLi48YCByYW5nZSBzeW50YXg7IGV4cGxpY2l0bHkgY2FsbCAucmFuZ2VVbnRpbCBpbnN0ZWFkCisgIGZvciAoaSBpbiAwLnJhbmdlVW50aWwoY2xhc3Nlcy5nZXRMZW5ndGgoKSkpIHsKKyAgICB2YWwgY2xzID0gY2xhc3Nlcy5pdGVtKGkpCisgICAgdmFsIGNsYXNzTmFtZSA9CisgICAgICAgIHJlcXVpcmVOb3ROdWxsKGNscy5nZXRBdHRyaWJ1dGUoIm5hbWUiKSkgeworICAgICAgICAgICJCYWQgWE1MOiA8Y2xhc3M+IGVsZW1lbnQgd2l0aG91dCBuYW1lIGF0dHJpYnV0ZSIKKyAgICAgICAgfQorICAgIHZhciBzdXBlcmNsYXNzOiBTdHJpbmc/ID0gbnVsbAorICAgIHZhbCBpbnRlcmZhY2VzID0gbXV0YWJsZVNldE9mPFN0cmluZz4oKQorICAgIHZhbCBjaGlsZHJlbiA9IGNscy5nZXRDaGlsZE5vZGVzKCkKKyAgICBmb3IgKGogaW4gMC5yYW5nZVVudGlsKGNoaWxkcmVuLmdldExlbmd0aCgpKSkgeworICAgICAgdmFsIGNoaWxkID0gY2hpbGRyZW4uaXRlbShqKQorICAgICAgd2hlbiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKSkgeworICAgICAgICAiZXh0ZW5kcyIgLT4geworICAgICAgICAgIHN1cGVyY2xhc3MgPQorICAgICAgICAgICAgICByZXF1aXJlTm90TnVsbChjaGlsZC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSkgeworICAgICAgICAgICAgICAgICJCYWQgWE1MOiA8ZXh0ZW5kcz4gZWxlbWVudCB3aXRob3V0IG5hbWUgYXR0cmlidXRlIgorICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgImltcGxlbWVudHMiIC0+IHsKKyAgICAgICAgICB2YWwgaW50ZXJmYWNlTmFtZSA9CisgICAgICAgICAgICAgIHJlcXVpcmVOb3ROdWxsKGNoaWxkLmdldEF0dHJpYnV0ZSgibmFtZSIpKSB7CisgICAgICAgICAgICAgICAgIkJhZCBYTUw6IDxpbXBsZW1lbnRzPiBlbGVtZW50IHdpdGhvdXQgbmFtZSBhdHRyaWJ1dGUiCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICBpbnRlcmZhY2VzLmFkZChpbnRlcmZhY2VOYW1lKQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIG91dHB1dC5hZGQoU3ltYm9sLmNyZWF0ZUNsYXNzKGNsYXNzTmFtZSwgc3VwZXJjbGFzcywgaW50ZXJmYWNlcykpCisgIH0KKworICB2YWwgZmllbGRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZpZWxkIikKKyAgLy8ga3RmbXQgZG9lc24ndCB1bmRlcnN0YW5kIHRoZSBgLi48YCByYW5nZSBzeW50YXg7IGV4cGxpY2l0bHkgY2FsbCAucmFuZ2VVbnRpbCBpbnN0ZWFkCisgIGZvciAoaSBpbiAwLnJhbmdlVW50aWwoZmllbGRzLmdldExlbmd0aCgpKSkgeworICAgIHZhbCBmaWVsZCA9IGZpZWxkcy5pdGVtKGkpCisgICAgdmFsIGZpZWxkTmFtZSA9CisgICAgICAgIHJlcXVpcmVOb3ROdWxsKGZpZWxkLmdldEF0dHJpYnV0ZSgibmFtZSIpKSB7CisgICAgICAgICAgIkJhZCBYTUw6IDxmaWVsZD4gZWxlbWVudCB3aXRob3V0IG5hbWUgYXR0cmlidXRlIgorICAgICAgICB9CisgICAgdmFsIGNsYXNzTmFtZSA9CisgICAgICAgIHJlcXVpcmVOb3ROdWxsKGZpZWxkLmdldFBhcmVudE5vZGUoKT8uZ2V0QXR0cmlidXRlKCJuYW1lIikpIHsKKyAgICAgICAgICAiQmFkIFhNTDogdG9wIGxldmVsIDxmaWVsZD4gZWxlbWVudCIKKyAgICAgICAgfQorICAgIG91dHB1dC5hZGQoU3ltYm9sLmNyZWF0ZUZpZWxkKGNsYXNzTmFtZSwgZmllbGROYW1lKSkKKyAgfQorCisgIHZhbCBtZXRob2RzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm1ldGhvZCIpCisgIC8vIGt0Zm10IGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgYC4uPGAgcmFuZ2Ugc3ludGF4OyBleHBsaWNpdGx5IGNhbGwgLnJhbmdlVW50aWwgaW5zdGVhZAorICBmb3IgKGkgaW4gMC5yYW5nZVVudGlsKG1ldGhvZHMuZ2V0TGVuZ3RoKCkpKSB7CisgICAgdmFsIG1ldGhvZCA9IG1ldGhvZHMuaXRlbShpKQorICAgIHZhbCBtZXRob2RTaWduYXR1cmUgPQorICAgICAgICByZXF1aXJlTm90TnVsbChtZXRob2QuZ2V0QXR0cmlidXRlKCJuYW1lIikpIHsKKyAgICAgICAgICAiQmFkIFhNTDogPG1ldGhvZD4gZWxlbWVudCB3aXRob3V0IG5hbWUgYXR0cmlidXRlIgorICAgICAgICB9CisgICAgdmFsIG1ldGhvZFNpZ25hdHVyZVBhcnRzID0gbWV0aG9kU2lnbmF0dXJlLnNwbGl0KFJlZ2V4KCJcXCh8XFwpIikpCisgICAgaWYgKG1ldGhvZFNpZ25hdHVyZVBhcnRzLnNpemUgIT0gMykgeworICAgICAgdGhyb3cgRXhjZXB0aW9uKCJCYWQgWE1MOiBtZXRob2Qgc2lnbmF0dXJlICckbWV0aG9kU2lnbmF0dXJlJyIpCisgICAgfQorICAgIHZhciAobWV0aG9kTmFtZSwgbWV0aG9kQXJncywgXykgPSBtZXRob2RTaWduYXR1cmVQYXJ0cworICAgIHZhbCBwYWNrYWdlQW5kQ2xhc3NOYW1lID0KKyAgICAgICAgcmVxdWlyZU5vdE51bGwobWV0aG9kLmdldFBhcmVudE5vZGUoKT8uZ2V0QXR0cmlidXRlKCJuYW1lIikpIHsKKyAgICAgICAgICAgICAgIkJhZCBYTUw6IHRvcCBsZXZlbCA8bWV0aG9kPiBlbGVtZW50LCBvciA8Y2xhc3M+IGVsZW1lbnQgbWlzc2luZyBuYW1lIGF0dHJpYnV0ZSIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC5yZXBsYWNlKCIkIiwgIi8iKQorICAgIGlmIChtZXRob2ROYW1lID09ICI8aW5pdD4iKSB7CisgICAgICBtZXRob2ROYW1lID0gcGFja2FnZUFuZENsYXNzTmFtZS5zcGxpdCgiLyIpLmxhc3QoKQorICAgIH0KKyAgICBvdXRwdXQuYWRkKFN5bWJvbC5jcmVhdGVNZXRob2QocGFja2FnZUFuZENsYXNzTmFtZSwgIiRtZXRob2ROYW1lKCRtZXRob2RBcmdzKSIpKQorICB9CisKKyAgcmV0dXJuIG91dHB1dAorfQorCisvKioKKyAqIEZpbmQgZXJyb3JzIGluIHRoZSBnaXZlbiBkYXRhLgorICoKKyAqIEBwYXJhbSBmbGFnZ2VkU3ltYm9sc0luU291cmNlIHRoZSBzZXQgb2Ygc3ltYm9scyB0aGF0IGFyZSBmbGFnZ2VkIGluIHRoZSBzb3VyY2UgY29kZQorICogQHBhcmFtIGZsYWdzIHRoZSBzZXQgb2YgZmxhZ3MgYW5kIHRoZWlyIHZhbHVlcworICogQHBhcmFtIHN5bWJvbHNJbk91dHB1dCB0aGUgc2V0IG9mIHN5bWJvbHMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgb3V0cHV0CisgKiBAcmV0dXJuIHRoZSBzZXQgb2YgZXJyb3JzIGZvdW5kCisgKi8KK2ludGVybmFsIGZ1biBmaW5kRXJyb3JzKAorICAgIGZsYWdnZWRTeW1ib2xzSW5Tb3VyY2U6IFNldDxQYWlyPFN5bWJvbCwgRmxhZz4+LAorICAgIGZsYWdzOiBNYXA8RmxhZywgQm9vbGVhbj4sCisgICAgc3ltYm9sc0luT3V0cHV0OiBTZXQ8U3ltYm9sPgorKTogU2V0PEFwaUVycm9yPiB7CisgIGZ1biBTZXQ8U3ltYm9sPi5jb250YWluc1N5bWJvbChzeW1ib2w6IFN5bWJvbCk6IEJvb2xlYW4geworICAgIC8vIHRyaXZpYWwgY2FzZTogdGhlIHN5bWJvbCBpcyBleHBsaWNpdGx5IGxpc3RlZCBpbiBhcGktdmVyc2lvbnMueG1sCisgICAgaWYgKGNvbnRhaW5zKHN5bWJvbCkpIHsKKyAgICAgIHJldHVybiB0cnVlCisgICAgfQorCisgICAgLy8gbm9uLXRyaXZpYWwgY2FzZTogdGhlIHN5bWJvbCBjb3VsZCBiZSBwYXJ0IG9mIHRoZSBzdXJyb3VuZGluZyBjbGFzcycKKyAgICAvLyBzdXBlciBjbGFzcyBvciBpbnRlcmZhY2VzCisgICAgdmFsIChjbGFzc05hbWUsIG1lbWJlck5hbWUpID0KKyAgICAgICAgd2hlbiAoc3ltYm9sKSB7CisgICAgICAgICAgaXMgQ2xhc3NTeW1ib2wgLT4gcmV0dXJuIGZhbHNlCisgICAgICAgICAgaXMgTWVtYmVyU3ltYm9sIC0+IHsKKyAgICAgICAgICAgIFBhaXIoc3ltYm9sLmNsYXp6LCBzeW1ib2wubWVtYmVyKQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIHZhbCBjbGF6eiA9IGZpbmQgeyBpdCBpcyBDbGFzc1N5bWJvbCAmJiBpdC5jbGF6eiA9PSBjbGFzc05hbWUgfSBhcz8gQ2xhc3NTeW1ib2w/CisgICAgaWYgKGNsYXp6ID09IG51bGwpIHsKKyAgICAgIHJldHVybiBmYWxzZQorICAgIH0KKworICAgIGZvciAoaW50ZXJmYWNlTmFtZSBpbiBjbGF6ei5pbnRlcmZhY2VzKSB7CisgICAgICAvLyBjcmVhdGVNZXRob2QgaXMgdGhlIHNhbWUgYXMgY3JlYXRlRmllbGQsIGV4Y2VwdCBpdCBhbGxvd3MgcGFyZW50aGVzaXMKKyAgICAgIHZhbCBpbnRlcmZhY2VTeW1ib2wgPSBTeW1ib2wuY3JlYXRlTWV0aG9kKGludGVyZmFjZU5hbWUsIG1lbWJlck5hbWUpCisgICAgICBpZiAoY29udGFpbnMoaW50ZXJmYWNlU3ltYm9sKSkgeworICAgICAgICByZXR1cm4gdHJ1ZQorICAgICAgfQorICAgIH0KKworICAgIGlmIChjbGF6ei5zdXBlcmNsYXNzICE9IG51bGwpIHsKKyAgICAgIHZhbCBzdXBlcmNsYXNzU3ltYm9sID0gU3ltYm9sLmNyZWF0ZU1ldGhvZChjbGF6ei5zdXBlcmNsYXNzLCBtZW1iZXJOYW1lKQorICAgICAgcmV0dXJuIGNvbnRhaW5zU3ltYm9sKHN1cGVyY2xhc3NTeW1ib2wpCisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlCisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBmbGFnIGlzIGVuYWJsZWQgZm9yIHRoZSBnaXZlbiBzeW1ib2wuCisgICAqCisgICAqIEEgZmxhZ2dlZCBtZW1iZXIgaW5zaWRlIGEgZmxhZ2dlZCBjbGFzcyBpcyBpZ25vcmVkIChhbmQgdGhlIGZsYWcgdmFsdWUgY29uc2lkZXJlZCBkaXNhYmxlZCkgaWYKKyAgICogdGhlIGNsYXNzJyBmbGFnIGlzIGRpc2FibGVkLgorICAgKgorICAgKiBAcGFyYW0gc3ltYm9sIHRoZSBzeW1ib2wgdG8gY2hlY2sKKyAgICogQHBhcmFtIGZsYWcgdGhlIGZsYWcgdG8gY2hlY2sKKyAgICogQHJldHVybiB3aGV0aGVyIHRoZSBmbGFnIGlzIGVuYWJsZWQgZm9yIHRoZSBnaXZlbiBzeW1ib2wKKyAgICovCisgIGZ1biBpc0ZsYWdFbmFibGVkRm9yU3ltYm9sKHN5bWJvbDogU3ltYm9sLCBmbGFnOiBGbGFnKTogQm9vbGVhbiB7CisgICAgd2hlbiAoc3ltYm9sKSB7CisgICAgICBpcyBDbGFzc1N5bWJvbCAtPiByZXR1cm4gZmxhZ3MuZ2V0VmFsdWUoZmxhZykKKyAgICAgIGlzIE1lbWJlclN5bWJvbCAtPiB7CisgICAgICAgIHZhbCBtZW1iZXJGbGFnVmFsdWUgPSBmbGFncy5nZXRWYWx1ZShmbGFnKQorICAgICAgICBpZiAoIW1lbWJlckZsYWdWYWx1ZSkgeworICAgICAgICAgIHJldHVybiBmYWxzZQorICAgICAgICB9CisgICAgICAgIC8vIFNwZWNpYWwgY2FzZTogaWYgdGhlIE1lbWJlclN5bWJvbCdzIGZsYWcgaXMgZW5hYmxlZCwgYnV0IHRoZSBvdXRlcgorICAgICAgICAvLyBDbGFzc1N5bWJvbCdzIGZsYWcgKGlmIHRoZSBjbGFzcyBpcyBmbGFnZ2VkKSBpcyBkaXNhYmxlZCwgY29uc2lkZXIKKyAgICAgICAgLy8gdGhlIE1lbWJlclN5bWJvbCdzIGZsYWcgYXMgZGlzYWJsZWQ6CisgICAgICAgIC8vCisgICAgICAgIC8vICAgQEZsYWdnZWRBcGkodGhpcy1mbGFnLWlzLWRpc2FibGVkKSBDbGF6eiB7CisgICAgICAgIC8vICAgICAgIEBGbGFnZ2VkQXBpKHRoaXMtZmxhZy1pcy1lbmFibGVkKSBtZXRob2QoKTsgLy8gVGhlIENsYXp6JyBmbGFnICJ3aW5zIgorICAgICAgICAvLyAgIH0KKyAgICAgICAgLy8KKyAgICAgICAgLy8gTm90ZTogdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgaGFuZGxlIG5lc3RlZCBjbGFzc2VzLgorICAgICAgICB2YWwgY2xhc3NGbGFnVmFsdWUgPQorICAgICAgICAgICAgZmxhZ2dlZFN5bWJvbHNJblNvdXJjZQorICAgICAgICAgICAgICAgIC5maW5kIHsgaXQuZmlyc3QudG9QcmV0dHlTdHJpbmcoKSA9PSBzeW1ib2wuY2xhenogfQorICAgICAgICAgICAgICAgID8ubGV0IHsgZmxhZ3MuZ2V0VmFsdWUoaXQuc2Vjb25kKSB9CisgICAgICAgICAgICAgICAgPzogdHJ1ZQorICAgICAgICByZXR1cm4gY2xhc3NGbGFnVmFsdWUKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB2YWwgZXJyb3JzID0gbXV0YWJsZVNldE9mPEFwaUVycm9yPigpCisgIGZvciAoKHN5bWJvbCwgZmxhZykgaW4gZmxhZ2dlZFN5bWJvbHNJblNvdXJjZSkgeworICAgIHRyeSB7CisgICAgICBpZiAoaXNGbGFnRW5hYmxlZEZvclN5bWJvbChzeW1ib2wsIGZsYWcpKSB7CisgICAgICAgIGlmICghc3ltYm9sc0luT3V0cHV0LmNvbnRhaW5zU3ltYm9sKHN5bWJvbCkpIHsKKyAgICAgICAgICBlcnJvcnMuYWRkKEVuYWJsZWRGbGFnZ2VkQXBpTm90UHJlc2VudEVycm9yKHN5bWJvbCwgZmxhZykpCisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzeW1ib2xzSW5PdXRwdXQuY29udGFpbnNTeW1ib2woc3ltYm9sKSkgeworICAgICAgICAgIGVycm9ycy5hZGQoRGlzYWJsZWRGbGFnZ2VkQXBpSXNQcmVzZW50RXJyb3Ioc3ltYm9sLCBmbGFnKSkKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gY2F0Y2ggKGU6IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24pIHsKKyAgICAgIGVycm9ycy5hZGQoVW5rbm93bkZsYWdFcnJvcihzeW1ib2wsIGZsYWcpKQorICAgIH0KKyAgfQorICByZXR1cm4gZXJyb3JzCit9CisKKy8qKgorICogQ29sbGVjdCBhbGwga25vd24gaW5mbyBhYm91dCBhbGwgQEZsYWdnZWRBcGkgYW5ub3RhdGVkIEFQSXMuCisgKgorICogRWFjaCBBUEkgd2lsbCBiZSByZXByZXNlbnRlZCBhcyBhIFN0cmluZywgb24gdGhlIGZvcm1hdAorICogPHByZT4KKyAqICAgJmx0O2Z1bGx5LXF1YWxpZmllZC1uYW1lLW9mLWZsYWcmbHQ7ICZsdDtzdGF0ZS1vZi1mbGFnJmx0OyAmbHQ7QVBJJmx0OworICogPC9wcmU+CisgKgorICogQHBhcmFtIGZsYWdnZWRTeW1ib2xzSW5Tb3VyY2UgdGhlIHNldCBvZiBzeW1ib2xzIHRoYXQgYXJlIGZsYWdnZWQgaW4gdGhlIHNvdXJjZSBjb2RlCisgKiBAcGFyYW0gZmxhZ3MgdGhlIHNldCBvZiBmbGFncyBhbmQgdGhlaXIgdmFsdWVzCisgKiBAcmV0dXJuIGEgbGlzdCBvZiBTdHJpbmdzIGVuY29kaW5nIEFQSSBkYXRhIHVzaW5nIHRoZSBmb3JtYXQgZGVzY3JpYmVkIGFib3ZlLCBzb3J0ZWQKKyAqICAgYWxwaGFiZXRpY2FsbHkKKyAqLworaW50ZXJuYWwgZnVuIGxpc3RGbGFnZ2VkQXBpcygKKyAgICBmbGFnZ2VkU3ltYm9sc0luU291cmNlOiBTZXQ8UGFpcjxTeW1ib2wsIEZsYWc+PiwKKyAgICBmbGFnczogTWFwPEZsYWcsIEJvb2xlYW4+CispOiBMaXN0PFN0cmluZz4geworICB2YWwgb3V0cHV0ID0gbXV0YWJsZUxpc3RPZjxTdHJpbmc+KCkKKyAgZm9yICgoc3ltYm9sLCBmbGFnKSBpbiBmbGFnZ2VkU3ltYm9sc0luU291cmNlKSB7CisgICAgdmFsIGZsYWdTdGF0ZSA9CisgICAgICAgIHdoZW4gKGZsYWdzLmdldChmbGFnKSkgeworICAgICAgICAgIHRydWUgLT4gIkVOQUJMRUQiCisgICAgICAgICAgZmFsc2UgLT4gIkRJU0FCTEVEIgorICAgICAgICAgIG51bGwgLT4gIlVOS05PV04iCisgICAgICAgIH0KKyAgICBvdXRwdXQuYWRkKCIkZmxhZyAkZmxhZ1N0YXRlICR7c3ltYm9sLnRvUHJldHR5U3RyaW5nKCl9IikKKyAgfQorICBvdXRwdXQuc29ydCgpCisgIHJldHVybiBvdXRwdXQKK30KKworZnVuIG1haW4oYXJnczogQXJyYXk8U3RyaW5nPikgPSBNYWluQ29tbWFuZCgpLnN1YmNvbW1hbmRzKENoZWNrQ29tbWFuZCgpLCBMaXN0Q29tbWFuZCgpKS5tYWluKGFyZ3MpCmRpZmYgLS1naXQgYS90b29scy9jaGVja19lbGZfZmlsZS5weSBiL3Rvb2xzL2NoZWNrX2VsZl9maWxlLnB5CmluZGV4IDUxZWMyM2IuLjA2NDAwNDEgMTAwNzU1Ci0tLSBhL3Rvb2xzL2NoZWNrX2VsZl9maWxlLnB5CisrKyBiL3Rvb2xzL2NoZWNrX2VsZl9maWxlLnB5CkBAIC00Miw4ICs0Miw5IEBACiBfRU1fWDg2XzY0ID0gNjIKIF9FTV9BQVJDSDY0ID0gMTgzCiAKLV9LTk9XTl9NQUNISU5FUyA9IHtfRU1fMzg2LCBfRU1fQVJNLCBfRU1fWDg2XzY0LCBfRU1fQUFSQ0g2NH0KLQorXzMyX0JJVF9NQUNISU5FUyA9IHtfRU1fMzg2LCBfRU1fQVJNfQorXzY0X0JJVF9NQUNISU5FUyA9IHtfRU1fWDg2XzY0LCBfRU1fQUFSQ0g2NH0KK19LTk9XTl9NQUNISU5FUyA9IF8zMl9CSVRfTUFDSElORVMgfCBfNjRfQklUX01BQ0hJTkVTCiAKICMgRUxGIGhlYWRlciBzdHJ1Y3QKIF9FTEZfSEVBREVSX1NUUlVDVCA9ICgKQEAgLTY3LDcgKzY4LDcgQEAKIAogRUxGID0gY29sbGVjdGlvbnMubmFtZWR0dXBsZSgKICAgJ0VMRicsCi0gICgnZHRfc29uYW1lJywgJ2R0X25lZWRlZCcsICdpbXBvcnRlZCcsICdleHBvcnRlZCcsICdoZWFkZXInKSkKKyAgKCdhbGlnbm1lbnRzJywgJ2R0X3NvbmFtZScsICdkdF9uZWVkZWQnLCAnaW1wb3J0ZWQnLCAnZXhwb3J0ZWQnLCAnaGVhZGVyJykpCiAKIAogZGVmIF9nZXRfb3NfbmFtZSgpOgpAQCAtMTk1LDcgKzE5Niw4IEBACiAgIEBjbGFzc21ldGhvZAogICBkZWYgX3JlYWRfbGx2bV9yZWFkb2JqKGNscywgZWxmX2ZpbGVfcGF0aCwgaGVhZGVyLCBsbHZtX3JlYWRvYmopOgogICAgICIiIlJ1biBsbHZtLXJlYWRvYmogYW5kIHBhcnNlIHRoZSBvdXRwdXQuIiIiCi0gICAgY21kID0gW2xsdm1fcmVhZG9iaiwgJy0tZHluYW1pYy10YWJsZScsICctLWR5bi1zeW1ib2xzJywgZWxmX2ZpbGVfcGF0aF0KKyAgICBjbWQgPSBbbGx2bV9yZWFkb2JqLCAnLS1wcm9ncmFtLWhlYWRlcnMnLCAnLS1keW5hbWljLXRhYmxlJywKKyAgICAgICAgICAgJy0tZHluLXN5bWJvbHMnLCBlbGZfZmlsZV9wYXRoXQogICAgIG91dCA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KGNtZCwgdGV4dD1UcnVlKQogICAgIGxpbmVzID0gb3V0LnNwbGl0bGluZXMoKQogICAgIHJldHVybiBjbHMuX3BhcnNlX2xsdm1fcmVhZG9iaihlbGZfZmlsZV9wYXRoLCBoZWFkZXIsIGxpbmVzKQpAQCAtMjA1LDkgKzIwNyw1NiBAQAogICBkZWYgX3BhcnNlX2xsdm1fcmVhZG9iaihjbHMsIGVsZl9maWxlX3BhdGgsIGhlYWRlciwgbGluZXMpOgogICAgICIiIlBhcnNlIHRoZSBvdXRwdXQgb2YgbGx2bS1yZWFkb2JqLiIiIgogICAgIGxpbmVzX2l0ID0gaXRlcihsaW5lcykKKyAgICBhbGlnbm1lbnRzID0gY2xzLl9wYXJzZV9wcm9ncmFtX2hlYWRlcnMobGluZXNfaXQpCiAgICAgZHRfc29uYW1lLCBkdF9uZWVkZWQgPSBjbHMuX3BhcnNlX2R5bmFtaWNfdGFibGUoZWxmX2ZpbGVfcGF0aCwgbGluZXNfaXQpCiAgICAgaW1wb3J0ZWQsIGV4cG9ydGVkID0gY2xzLl9wYXJzZV9keW5hbWljX3N5bWJvbHMobGluZXNfaXQpCi0gICAgcmV0dXJuIEVMRihkdF9zb25hbWUsIGR0X25lZWRlZCwgaW1wb3J0ZWQsIGV4cG9ydGVkLCBoZWFkZXIpCisgICAgcmV0dXJuIEVMRihhbGlnbm1lbnRzLCBkdF9zb25hbWUsIGR0X25lZWRlZCwgaW1wb3J0ZWQsIGV4cG9ydGVkLCBoZWFkZXIpCisKKworICBfUFJPR1JBTV9IRUFERVJTX1NUQVJUX1BBVFRFUk4gPSAnUHJvZ3JhbUhlYWRlcnMgWycKKyAgX1BST0dSQU1fSEVBREVSU19FTkRfUEFUVEVSTiA9ICddJworICBfUFJPR1JBTV9IRUFERVJfU1RBUlRfUEFUVEVSTiA9ICdQcm9ncmFtSGVhZGVyIHsnCisgIF9QUk9HUkFNX0hFQURFUl9UWVBFX1BBVFRFUk4gPSByZS5jb21waWxlKCdeXFxzK1R5cGU6XFxzKyguKikkJykKKyAgX1BST0dSQU1fSEVBREVSX0FMSUdOX1BBVFRFUk4gPSByZS5jb21waWxlKCdeXFxzK0FsaWdubWVudDpcXHMrKC4qKSQnKQorICBfUFJPR1JBTV9IRUFERVJfRU5EX1BBVFRFUk4gPSAnfScKKworCisgIEBjbGFzc21ldGhvZAorICBkZWYgX3BhcnNlX3Byb2dyYW1faGVhZGVycyhjbHMsIGxpbmVzX2l0KToKKyAgICAiIiJQYXJzZSB0aGUgZHluYW1pYyB0YWJsZSBzZWN0aW9uLiIiIgorICAgIGFsaWdubWVudHMgPSBbXQorCisgICAgaWYgbm90IGNscy5fZmluZF9wcmVmaXgoY2xzLl9QUk9HUkFNX0hFQURFUlNfU1RBUlRfUEFUVEVSTiwgbGluZXNfaXQpOgorICAgICAgcmFpc2UgRUxGRXJyb3IoKQorCisgICAgZm9yIGxpbmUgaW4gbGluZXNfaXQ6CisgICAgICAjIFBhcnNlIGVhY2ggcHJvZ3JhbSBoZWFkZXIKKyAgICAgIGlmIGxpbmUuc3RyaXAoKSA9PSBjbHMuX1BST0dSQU1fSEVBREVSX1NUQVJUX1BBVFRFUk46CisgICAgICAgIHBfYWxpZ24gPSBOb25lCisgICAgICAgIHBfdHlwZSA9IE5vbmUKKyAgICAgICAgZm9yIGxpbmUgaW4gbGluZXNfaXQ6CisgICAgICAgICAgaWYgbGluZS5zdHJpcCgpID09IGNscy5fUFJPR1JBTV9IRUFERVJfRU5EX1BBVFRFUk46CisgICAgICAgICAgICBpZiBub3QgcF9hbGlnbjoKKyAgICAgICAgICAgICAgcmFpc2UgRUxGRXJyb3IoIkNvdWxkIG5vdCBwYXJzZSBhbGlnbm1lbnQgZnJvbSBwcm9ncmFtIGhlYWRlciEiKQorICAgICAgICAgICAgaWYgbm90IHBfdHlwZToKKyAgICAgICAgICAgICAgcmFpc2UgRUxGRXJyb3IoIkNvdWxkIG5vdCBwYXJzZSB0eXBlIGZyb20gcHJvZ3JhbSBoZWFkZXIhIikKKworICAgICAgICAgICAgaWYgcF90eXBlLnN0YXJ0c3dpdGgoIlBUX0xPQUQgIik6CisgICAgICAgICAgICAgIGFsaWdubWVudHMuYXBwZW5kKGludChwX2FsaWduKSkKKyAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICBtYXRjaCA9IGNscy5fUFJPR1JBTV9IRUFERVJfVFlQRV9QQVRURVJOLm1hdGNoKGxpbmUpCisgICAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICBwX3R5cGUgPSBtYXRjaC5ncm91cCgxKQorCisgICAgICAgICAgbWF0Y2ggPSBjbHMuX1BST0dSQU1fSEVBREVSX0FMSUdOX1BBVFRFUk4ubWF0Y2gobGluZSkKKyAgICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgIHBfYWxpZ24gPSBtYXRjaC5ncm91cCgxKQorCisgICAgICBpZiBsaW5lID09IGNscy5fUFJPR1JBTV9IRUFERVJTX0VORF9QQVRURVJOOgorICAgICAgICBicmVhaworCisgICAgcmV0dXJuIGFsaWdubWVudHMKIAogCiAgIF9EWU5BTUlDX1NFQ1RJT05fU1RBUlRfUEFUVEVSTiA9ICdEeW5hbWljU2VjdGlvbiBbJwpAQCAtNDM0LDYgKzQ4MywyOSBAQAogCiAgICAgICBzeXMuZXhpdCgyKQogCisgIGRlZiBjaGVja19tYXhfcGFnZV9zaXplKHNlbGYsIG1heF9wYWdlX3NpemUpOgorICAgIGlmIHNlbGYuX2ZpbGVfdW5kZXJfdGVzdC5oZWFkZXIuZV9tYWNoaW5lIGluIF8zMl9CSVRfTUFDSElORVM6CisgICAgICAjIFNraXAgdGVzdCBvbiAzMi1iaXQgbWFjaGluZXMuIDE2IEtCIHBhZ2VzIGlzIGFuIGFybTY0IGZlYXR1cmUKKyAgICAgICMgYW5kIG5vIDMyLWJpdCBzeXN0ZW1zIGluIEFuZHJvaWQgdXNlIGl0LgorICAgICAgcmV0dXJuCisKKyAgICBmb3IgYWxpZ25tZW50IGluIHNlbGYuX2ZpbGVfdW5kZXJfdGVzdC5hbGlnbm1lbnRzOgorICAgICAgaWYgYWxpZ25tZW50ICUgbWF4X3BhZ2Vfc2l6ZSAhPSAwOgorICAgICAgICBzZWxmLl9lcnJvcihmJ0xvYWQgc2VnbWVudCBoYXMgYWxpZ25tZW50IHthbGlnbm1lbnR9IGJ1dCAnCisgICAgICAgICAgICAgICAgICAgIGYne21heF9wYWdlX3NpemV9IHJlcXVpcmVkLicpCisgICAgICAgIHNlbGYuX25vdGUoKQorICAgICAgICBzZWxmLl9ub3RlKCdGaXggc3VnZ2VzdGlvbnM6JykKKyAgICAgICAgc2VsZi5fbm90ZShmJyAgdXNlIGxpbmtlciBmbGFnICItV2wsLXosbWF4LXBhZ2Utc2l6ZT17bWF4X3BhZ2Vfc2l6ZX0iICcKKyAgICAgICAgICAgICAgICAgICBmJ3doZW4gY29tcGlsaW5nIHRoaXMgbGliJykKKyAgICAgICAgc2VsZi5fbm90ZSgpCisgICAgICAgIHNlbGYuX25vdGUoJ0lmIHRoZSBmaXggYWJvdmUgZG9lc25cJ3Qgd29yaywgYnlwYXNzIHRoaXMgY2hlY2sgd2l0aDonKQorICAgICAgICBzZWxmLl9ub3RlKCcgIEFuZHJvaWQuYnA6IGlnbm9yZV9tYXhfcGFnZV9zaXplOiB0cnVlLCcpCisgICAgICAgIHNlbGYuX25vdGUoJyAgQW5kcm9pZC5tazogTE9DQUxfSUdOT1JFX01BWF9QQUdFX1NJWkUgOj0gdHJ1ZScpCisgICAgICAgIHNlbGYuX25vdGUoJyAgRGV2aWNlIG1rOiBQUk9EVUNUX0NIRUNLX1BSRUJVSUxUX01BWF9QQUdFX1NJWkUgOj0gZmFsc2UnKQorCisgICAgICAgICMgVE9ETzogaW5zdGVhZCBvZiBleGl0aW5nIGltbWVkaWF0ZWx5LCB3ZSBtYXkgd2FudCB0byBjb2xsZWN0IHRoZQorICAgICAgICAjIGVycm9ycyBmcm9tIGFsbCBjaGVja3MgYW5kIGVtaXQgdGhlbSBhdCBvbmNlCisgICAgICAgIHN5cy5leGl0KDIpCiAKICAgQHN0YXRpY21ldGhvZAogICBkZWYgX2ZpbmRfc3ltYm9sKGxpYiwgbmFtZSwgdmVyc2lvbik6CkBAIC01MTQsNiArNTg2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdJZ25vcmUgdGhlIGlucHV0IGZpbGUgd2l0aCB1bmtub3duIG1hY2hpbmUgSUQnKQogICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWFsbG93LXVuZGVmaW5lZC1zeW1ib2xzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdJZ25vcmUgdW5yZXNvbHZlZCB1bmRlZmluZWQgc3ltYm9scycpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tbWF4LXBhZ2Utc2l6ZScsIGFjdGlvbj0nc3RvcmUnLCB0eXBlPWludCwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdSZXF1aXJlZCBwYWdlIHNpemUgYWxpZ25tZW50IHN1cHBvcnQnKQogCiAgICMgT3RoZXIgb3B0aW9ucwogICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWxsdm0tcmVhZG9iaicsCkBAIC01NDIsNiArNjE2LDkgQEAKIAogICBjaGVja2VyLmNoZWNrX2R0X25lZWRlZChhcmdzLnN5c3RlbV9zaGFyZWRfbGliKQogCisgIGlmIGFyZ3MubWF4X3BhZ2Vfc2l6ZToKKyAgICBjaGVja2VyLmNoZWNrX21heF9wYWdlX3NpemUoYXJncy5tYXhfcGFnZV9zaXplKQorCiAgIGlmIG5vdCBhcmdzLmFsbG93X3VuZGVmaW5lZF9zeW1ib2xzOgogICAgIGNoZWNrZXIuY2hlY2tfc3ltYm9scygpCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2NoZWNrb3duZXJzLnB5IGIvdG9vbHMvY2hlY2tvd25lcnMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYwMzczMjEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvY2hlY2tvd25lcnMucHkKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0jIS91c3IvYmluL3B5dGhvbgotCi0iIiJQYXJzZSBhbmQgY2hlY2sgc3ludGF4IGVycm9ycyBvZiBhIGdpdmVuIE9XTkVSUyBmaWxlLiIiIgotCi1pbXBvcnQgYXJncGFyc2UKLWltcG9ydCByZQotaW1wb3J0IHN5cwotaW1wb3J0IHVybGxpYi5yZXF1ZXN0LCB1cmxsaWIucGFyc2UsIHVybGxpYi5lcnJvcgotaW1wb3J0IHVybGxpYi5yZXF1ZXN0LCB1cmxsaWIuZXJyb3IsIHVybGxpYi5wYXJzZQotCi1wYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj0nQ2hlY2sgT1dORVJTIGZpbGUgc3ludGF4JykKLXBhcnNlci5hZGRfYXJndW1lbnQoJy12JywgJy0tdmVyYm9zZScsIGRlc3Q9J3ZlcmJvc2UnLAotICAgICAgICAgICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLCBkZWZhdWx0PUZhbHNlLAotICAgICAgICAgICAgICAgICAgICBoZWxwPSdWZXJib3NlIG91dHB1dCB0byBkZWJ1ZycpCi1wYXJzZXIuYWRkX2FyZ3VtZW50KCctYycsICctLWNoZWNrX2FkZHJlc3MnLCBkZXN0PSdjaGVja19hZGRyZXNzJywKLSAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVmYXVsdD1GYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgaGVscD0nQ2hlY2sgZW1haWwgYWRkcmVzc2VzJykKLXBhcnNlci5hZGRfYXJndW1lbnQoZGVzdD0nb3duZXJzJywgbWV0YXZhcj0nT1dORVJTJywgbmFyZ3M9JysnLAotICAgICAgICAgICAgICAgICAgICBoZWxwPSdQYXRoIHRvIE9XTkVSUyBmaWxlJykKLWFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCi0KLWdlcnJpdF9zZXJ2ZXIgPSAnaHR0cHM6Ly9hbmRyb2lkLXJldmlldy5nb29nbGVzb3VyY2UuY29tJwotY2hlY2tlZF9hZGRyZXNzZXMgPSB7fQotCi0KLWRlZiBlY2hvKG1zZyk6Ci0gIGlmIGFyZ3MudmVyYm9zZToKLSAgICBwcmludChtc2cpCi0KLQotZGVmIGZpbmRfYWRkcmVzcyhhZGRyZXNzKToKLSAgaWYgYWRkcmVzcyBub3QgaW4gY2hlY2tlZF9hZGRyZXNzZXM6Ci0gICAgcmVxdWVzdCA9IChnZXJyaXRfc2VydmVyICsgJy9hY2NvdW50cy8/bj0xJnE9ZW1haWw6JwotICAgICAgICAgICAgICAgKyB1cmxsaWIucGFyc2UucXVvdGUoYWRkcmVzcykpCi0gICAgZWNobygnQ2hlY2tpbmcgZW1haWwgYWRkcmVzczogJyArIGFkZHJlc3MpCi0gICAgcmVzdWx0ID0gdXJsbGliLnJlcXVlc3QudXJsb3BlbihyZXF1ZXN0KS5yZWFkKCkKLSAgICBjaGVja2VkX2FkZHJlc3Nlc1thZGRyZXNzXSA9IHJlc3VsdC5maW5kKCciX2FjY291bnRfaWQiOicpID49IDAKLSAgICBpZiBjaGVja2VkX2FkZHJlc3Nlc1thZGRyZXNzXToKLSAgICAgIGVjaG8oJ0ZvdW5kIGVtYWlsIGFkZHJlc3M6ICcgKyBhZGRyZXNzKQotICByZXR1cm4gY2hlY2tlZF9hZGRyZXNzZXNbYWRkcmVzc10KLQotCi1kZWYgY2hlY2tfYWRkcmVzcyhmbmFtZSwgbnVtLCBhZGRyZXNzKToKLSAgaWYgZmluZF9hZGRyZXNzKGFkZHJlc3MpOgotICAgIHJldHVybiAwCi0gIHByaW50KCclczolZDogRVJST1I6IHVua25vd24gZW1haWwgYWRkcmVzczogJXMnICUgKGZuYW1lLCBudW0sIGFkZHJlc3MpKQotICByZXR1cm4gMQotCi0KLWRlZiBtYWluKCk6Ci0gICMgT25lIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBjaGVjayBhbGwgdmFsaWQgbGluZXMuCi0gIG5vcGFyZW50ID0gJ3NldCArbm9wYXJlbnQnCi0gIGVtYWlsID0gJyhbXkAgXStAW14gQF0rfFxcKiknCi0gIGVtYWlscyA9ICcoJXMoICosIColcykqKScgJSAoZW1haWwsIGVtYWlsKQotICBmaWxlX2RpcmVjdGl2ZSA9ICdmaWxlOiAqKFteIDpdKyAqOiAqKT9bXiBdKycKLSAgZGlyZWN0aXZlID0gJyglc3wlc3wlcyknICUgKGVtYWlscywgbm9wYXJlbnQsIGZpbGVfZGlyZWN0aXZlKQotICBnbG9iID0gJ1thLXpBLVowLTlfXFwuXFwtXFwqXFw/XSsnCi0gIGdsb2JzID0gJyglcyggKiwgKiVzKSopJyAlIChnbG9iLCBnbG9iKQotICBwZXJmaWxlID0gJ3Blci1maWxlICsnICsgZ2xvYnMgKyAnICo9IConICsgZGlyZWN0aXZlCi0gIGluY2x1ZGUgPSAnaW5jbHVkZSArKFteIDpdKyAqOiAqKT9bXiBdKycKLSAgcGF0cyA9ICcofCVzfCVzfCVzfCVzfCVzKSQnICUgKG5vcGFyZW50LCBlbWFpbCwgcGVyZmlsZSwgaW5jbHVkZSwgZmlsZV9kaXJlY3RpdmUpCi0gIHBhdHRlcm5zID0gcmUuY29tcGlsZShwYXRzKQotICBhZGRyZXNzX3BhdHRlcm4gPSByZS5jb21waWxlKCcoW15AIF0rQFteIEBdKyknKQotICBwZXJmaWxlX3BhdHRlcm4gPSByZS5jb21waWxlKCdwZXItZmlsZSArLio9KC4qKScpCi0KLSAgZXJyb3IgPSAwCi0gIGZvciBmbmFtZSBpbiBhcmdzLm93bmVyczoKLSAgICBlY2hvKCdDaGVja2luZyBmaWxlOiAnICsgZm5hbWUpCi0gICAgbnVtID0gMAotICAgIGZvciBsaW5lIGluIG9wZW4oZm5hbWUsICdyJyk6Ci0gICAgICBudW0gKz0gMQotICAgICAgc3RyaXBwZWRfbGluZSA9IHJlLnN1YignIy4qJCcsICcnLCBsaW5lKS5zdHJpcCgpCi0gICAgICBpZiBub3QgcGF0dGVybnMubWF0Y2goc3RyaXBwZWRfbGluZSk6Ci0gICAgICAgIGVycm9yICs9IDEKLSAgICAgICAgcHJpbnQoJyVzOiVkOiBFUlJPUjogdW5rbm93biBsaW5lIFslc10nICUgKGZuYW1lLCBudW0sIGxpbmUuc3RyaXAoKSkpCi0gICAgICBlbGlmIGFyZ3MuY2hlY2tfYWRkcmVzczoKLSAgICAgICAgaWYgcGVyZmlsZV9wYXR0ZXJuLm1hdGNoKHN0cmlwcGVkX2xpbmUpOgotICAgICAgICAgIGZvciBhZGRyIGluIHBlcmZpbGVfcGF0dGVybi5tYXRjaChzdHJpcHBlZF9saW5lKS5ncm91cCgxKS5zcGxpdCgnLCcpOgotICAgICAgICAgICAgYSA9IGFkZHIuc3RyaXAoKQotICAgICAgICAgICAgaWYgYSBhbmQgYSAhPSAnKic6Ci0gICAgICAgICAgICAgIGVycm9yICs9IGNoZWNrX2FkZHJlc3MoZm5hbWUsIG51bSwgYWRkci5zdHJpcCgpKQotICAgICAgICBlbGlmIGFkZHJlc3NfcGF0dGVybi5tYXRjaChzdHJpcHBlZF9saW5lKToKLSAgICAgICAgICBlcnJvciArPSBjaGVja19hZGRyZXNzKGZuYW1lLCBudW0sIHN0cmlwcGVkX2xpbmUpCi0gIHN5cy5leGl0KGVycm9yKQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICBtYWluKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL2NvbXBsaWFuY2UvY21kL3J0cmFjZS9ydHJhY2UuZ28gYi90b29scy9jb21wbGlhbmNlL2NtZC9ydHJhY2UvcnRyYWNlLmdvCmluZGV4IDY2N2NkY2UuLjNlN2U2OWIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2NvbXBsaWFuY2UvY21kL3J0cmFjZS9ydHJhY2UuZ28KKysrIGIvdG9vbHMvY29tcGxpYW5jZS9jbWQvcnRyYWNlL3J0cmFjZS5nbwpAQCAtOTMsMTcgKzkzLDE3IEBACiAJZmxhZ3MuVXNhZ2UgPSBmdW5jKCkgewogCQlmbXQuRnByaW50Zihvcy5TdGRlcnIsIGBVc2FnZTogJXMge29wdGlvbnN9IGZpbGUubWV0YV9saWMge2ZpbGUubWV0YV9saWMuLi59CiAKLU91dHB1dHMgYSBzcGFjZS1zZXBhcmF0ZWQgVGFyZ2V0IEFjdHNPbiBPcmlnaW4gQ29uZGl0aW9uIHR1cGxlIGZvciBlYWNoCi1yZXNvbHV0aW9uIGluIHRoZSBncmFwaC4gV2hlbiAtZG90IGZsYWcgZ2l2ZW4sIG91dHB1dHMgbm9kZXMgYW5kIGVkZ2VzCi1pbiBncmFwaHZpeiBkaXJlY3RlZCBncmFwaCBmb3JtYXQuCitDYWxjdWxhdGVzIHRoZSBzb3VyY2Utc2hhcmluZyByZXF1aXJlbWVudHMgaW4gcmV2ZXJzZSBzdGFydGluZyBhdCB0aGUKKy1ydHJhY2UgcHJvamVjdHMgb3IgbWV0YWRhdGEgZmlsZXMgdGhhdCBpbmhlcml0ZWQgc291cmNlLXNoYXJpbmcgYW5kCit3b3JraW5nIGJhY2sgdG8gdGhlIHRhcmdldHMgd2hlcmUgdGhlIHNvdXJjZS1zaGFyaW5nIHJlcXVpcm1lbWVudHMKK29yaWdpbmF0ZS4KIAotSWYgb25lIG9yIG1vcmUgJy1jIGNvbmRpdGlvbicgY29uZGl0aW9ucyBhcmUgZ2l2ZW4sIG91dHB1dHMgdGhlCi1yZXNvbHV0aW9uIGZvciB0aGUgdW5pb24gb2YgdGhlIGNvbmRpdGlvbnMuIE90aGVyd2lzZSwgb3V0cHV0cyB0aGUKLXJlc29sdXRpb24gZm9yIGFsbCBjb25kaXRpb25zLgorT3V0cHV0cyBhIHNwYWNlLXNlcGFyYXRlZCBwYWlyIHdoZXJlIHRoZSBmaXJzdCBmaWVsZCBpcyBhbiBvcmlnaW5hdGluZwordGFyZ2V0IHdpdGggb25lIG9yIG1vcmUgcmVzdHJpY3RlZCBjb25kaXRpb25zIGFuZCB3aGVyZSB0aGUgc2Vjb25kCitmaWVsZCBpcyBhIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSByZXN0cmljdGVkIGNvbmRpdGlvbnMuCiAKLUluIHBsYWluIHRleHQgbW9kZSwgd2hlbiAnLWxhYmVsX2NvbmRpdGlvbnMnIGlzIHJlcXVlc3RlZCwgdGhlIFRhcmdldAotYW5kIE9yaWdpbiBoYXZlIGNvbG9uLXNlcGFyYXRlZCBsaWNlbnNlIGNvbmRpdGlvbnMgYXBwZW5kZWQ6Ci1pLmUuIHRhcmdldDpjb25kaXRpb24xOmNvbmRpdGlvbjIgZXRjLgorT3V0cHV0cyBhIGNvdW50IG9mIHRoZSBvcmlnaW5hdGluZyB0YXJnZXRzLCBhbmQgaWYgdGhlIGNvdW50IGlzIHplcm8sCitvdXRwdXRzIGEgd2FybmluZyB0byBjaGVjayB0aGUgLXJ0cmFjZSBwcm9qZWN0cyBhbmQvb3IgZmlsZW5hbWVzLgogCiBPcHRpb25zOgogYCwgZmlsZXBhdGguQmFzZShvcy5BcmdzWzBdKSkKZGlmZiAtLWdpdCBhL3Rvb2xzL2NvbXBsaWFuY2UvY21kL3Nib20vc2JvbS5nbyBiL3Rvb2xzL2NvbXBsaWFuY2UvY21kL3Nib20vc2JvbS5nbwppbmRleCBjMzc4ZTM5Li5hNTM3NDFmIDEwMDY0NAotLS0gYS90b29scy9jb21wbGlhbmNlL2NtZC9zYm9tL3Nib20uZ28KKysrIGIvdG9vbHMvY29tcGxpYW5jZS9jbWQvc2JvbS9zYm9tLmdvCkBAIC0zNSw3ICszNSw3IEBACiAJImdpdGh1Yi5jb20vZ29vZ2xlL2JsdWVwcmludC9kZXB0b29scyIKIAogCSJnaXRodWIuY29tL3NwZHgvdG9vbHMtZ29sYW5nL2J1aWxkZXIvYnVpbGRlcjJ2MiIKLQkiZ2l0aHViLmNvbS9zcGR4L3Rvb2xzLWdvbGFuZy9qc29uIgorCXNwZHhfanNvbiAiZ2l0aHViLmNvbS9zcGR4L3Rvb2xzLWdvbGFuZy9qc29uIgogCSJnaXRodWIuY29tL3NwZHgvdG9vbHMtZ29sYW5nL3NwZHgvY29tbW9uIgogCXNwZHggImdpdGh1Yi5jb20vc3BkeC90b29scy1nb2xhbmcvc3BkeC92Ml8yIgogCSJnaXRodWIuY29tL3NwZHgvdG9vbHMtZ29sYW5nL3NwZHhsaWIiCkBAIC01NSw2ICs1NSw3IEBACiAJcHJvZHVjdCAgICAgIHN0cmluZwogCXN0cmlwUHJlZml4ICBbXXN0cmluZwogCWNyZWF0aW9uVGltZSBjcmVhdGlvblRpbWVHZXR0ZXIKKwlidWlsZGlkICAgICAgc3RyaW5nCiB9CiAKIGZ1bmMgKGN0eCBjb250ZXh0KSBzdHJpcChpbnN0YWxsUGF0aCBzdHJpbmcpIHN0cmluZyB7CkBAIC0xMjQsNiArMTI1LDcgQEAKIAlkZXBzRmlsZSA6PSBmbGFncy5TdHJpbmcoImQiLCAiIiwgIldoZXJlIHRvIHdyaXRlIHRoZSBkZXBzIGZpbGUiKQogCXByb2R1Y3QgOj0gZmxhZ3MuU3RyaW5nKCJwcm9kdWN0IiwgIiIsICJUaGUgbmFtZSBvZiB0aGUgcHJvZHVjdCBmb3Igd2hpY2ggdGhlIG5vdGljZSBpcyBnZW5lcmF0ZWQuIikKIAlzdHJpcFByZWZpeCA6PSBuZXdNdWx0aVN0cmluZyhmbGFncywgInN0cmlwX3ByZWZpeCIsICJQcmVmaXggdG8gcmVtb3ZlIGZyb20gcGF0aHMuIGkuZS4gcGF0aCB0byByb290IChtdWx0aXBsZSBhbGxvd2VkKSIpCisJYnVpbGRpZCA6PSBmbGFncy5TdHJpbmcoImJ1aWxkX2lkIiwgIiIsICJVbmlxdWVseSBpZGVudGlmaWVzIHRoZSBidWlsZC4gKGRlZmF1bHQgdGltZXN0YW1wKSIpCiAKIAlmbGFncy5QYXJzZShleHBhbmRlZEFyZ3MpCiAKQEAgLTE2Miw3ICsxNjQsNyBAQAogCQlvZmlsZSA9IG9idWYKIAl9CiAKLQljdHggOj0gJmNvbnRleHR7b2ZpbGUsIG9zLlN0ZGVyciwgY29tcGxpYW5jZS5GUywgKnByb2R1Y3QsICpzdHJpcFByZWZpeCwgYWN0dWFsVGltZX0KKwljdHggOj0gJmNvbnRleHR7b2ZpbGUsIG9zLlN0ZGVyciwgY29tcGxpYW5jZS5GUywgKnByb2R1Y3QsICpzdHJpcFByZWZpeCwgYWN0dWFsVGltZSwgKmJ1aWxkaWR9CiAKIAlzcGR4RG9jLCBkZXBzLCBlcnIgOj0gc2JvbUdlbmVyYXRvcihjdHgsIGZsYWdzLkFyZ3MoKS4uLikKIApAQCAtMjcyLDcgKzI3NCw3IEBACiAJdG4gKmNvbXBsaWFuY2UuVGFyZ2V0Tm9kZSkgKCpwcm9qZWN0bWV0YWRhdGEuUHJvamVjdE1ldGFkYXRhLCBlcnJvcikgewogCXBtcywgZXJyIDo9IHBtaXguTWV0YWRhdGFGb3JQcm9qZWN0cyh0bi5Qcm9qZWN0cygpLi4uKQogCWlmIGVyciAhPSBuaWwgewotCQlyZXR1cm4gbmlsLCBmbXQuRXJyb3JmKCJVbmFibGUgdG8gcmVhZCBwcm9qZWN0cyBmb3IgJXE6ICV3XG4iLCB0biwgZXJyKQorCQlyZXR1cm4gbmlsLCBmbXQuRXJyb3JmKCJVbmFibGUgdG8gcmVhZCBwcm9qZWN0cyBmb3IgJXE6ICV3XG4iLCB0bi5OYW1lKCksIGVycikKIAl9CiAJaWYgbGVuKHBtcykgPT0gMCB7CiAJCXJldHVybiBuaWwsIG5pbApAQCAtMzE3LDE0ICszMTksMjEgQEAKIH0KIAogLy8gZ2VuZXJhdGVTUERYTmFtZXNwYWNlIGdlbmVyYXRlcyBhIHVuaXF1ZSBTUERYIERvY3VtZW50IE5hbWVzcGFjZSB1c2luZyBhIFNIQTEgY2hlY2tzdW0KLS8vIGFuZCB0aGUgQ3JlYXRpb25JbmZvLkNyZWF0ZWQgZmllbGQgYXMgdGhlIGRhdGUuCi1mdW5jIGdlbmVyYXRlU1BEWE5hbWVzcGFjZShjcmVhdGVkIHN0cmluZykgc3RyaW5nIHsKLQkvLyBDb21wdXRlIGEgU0hBMSBjaGVja3N1bSBvZiB0aGUgQ3JlYXRpb25JbmZvLkNyZWF0ZWQgZmllbGQuCi0JaGFzaCA6PSBzaGExLlN1bShbXWJ5dGUoY3JlYXRlZCkpCi0JY2hlY2tzdW0gOj0gaGV4LkVuY29kZVRvU3RyaW5nKGhhc2hbOl0pCitmdW5jIGdlbmVyYXRlU1BEWE5hbWVzcGFjZShidWlsZGlkIHN0cmluZywgY3JlYXRlZCBzdHJpbmcsIGZpbGVzIC4uLnN0cmluZykgc3RyaW5nIHsKIAotCS8vIENvbWJpbmUgdGhlIGNoZWNrc3VtIGFuZCB0aW1lc3RhbXAgdG8gZ2VuZXJhdGUgdGhlIFNQRFggTmFtZXNwYWNlLgotCW5hbWVzcGFjZSA6PSBmbXQuU3ByaW50ZigiU1BEWFJlZi1ET0NVTUVOVC0lcy0lcyIsIGNyZWF0ZWQsIGNoZWNrc3VtKQorCXNlZWQgOj0gc3RyaW5ncy5Kb2luKGZpbGVzLCAiIikKKworCWlmIGJ1aWxkaWQgPT0gIiIgeworCQlzZWVkICs9IGNyZWF0ZWQKKwl9IGVsc2UgeworCQlzZWVkICs9IGJ1aWxkaWQKKwl9CisKKwkvLyBDb21wdXRlIGEgU0hBMSBjaGVja3N1bSBvZiB0aGUgc2VlZC4KKwloYXNoIDo9IHNoYTEuU3VtKFtdYnl0ZShzZWVkKSkKKwl1dWlkIDo9IGhleC5FbmNvZGVUb1N0cmluZyhoYXNoWzpdKQorCisJbmFtZXNwYWNlIDo9IGZtdC5TcHJpbnRmKCJTUERYUmVmLURPQ1VNRU5ULSVzIiwgdXVpZCkKIAogCXJldHVybiBuYW1lc3BhY2UKIH0KQEAgLTUyMyw3ICs1MzIsNyBAQAogCQlEYXRhTGljZW5zZTogICAgICAgIkNDMC0xLjAiLAogCQlTUERYSWRlbnRpZmllcjogICAgIkRPQ1VNRU5UIiwKIAkJRG9jdW1lbnROYW1lOiAgICAgIGRvY05hbWUsCi0JCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoY2kuQ3JlYXRlZCksCisJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoY3R4LmJ1aWxkaWQsIGNpLkNyZWF0ZWQsIGZpbGVzLi4uKSwKIAkJQ3JlYXRpb25JbmZvOiAgICAgIGNpLAogCQlQYWNrYWdlczogICAgICAgICAgcGtncywKIAkJUmVsYXRpb25zaGlwczogICAgIHJlbGF0aW9uc2hpcHMsCmRpZmYgLS1naXQgYS90b29scy9jb21wbGlhbmNlL2NtZC9zYm9tL3Nib21fdGVzdC5nbyBiL3Rvb2xzL2NvbXBsaWFuY2UvY21kL3Nib20vc2JvbV90ZXN0LmdvCmluZGV4IDY0NzJmNTEuLjEzYmE2NmQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2NvbXBsaWFuY2UvY21kL3Nib20vc2JvbV90ZXN0LmdvCisrKyBiL3Rvb2xzL2NvbXBsaWFuY2UvY21kL3Nib20vc2JvbV90ZXN0LmdvCkBAIC0yNSw2ICsyNSw3IEBACiAJInRpbWUiCiAKIAkiYW5kcm9pZC9zb29uZy90b29scy9jb21wbGlhbmNlIgorCiAJImdpdGh1Yi5jb20vc3BkeC90b29scy1nb2xhbmcvYnVpbGRlci9idWlsZGVyMnYyIgogCSJnaXRodWIuY29tL3NwZHgvdG9vbHMtZ29sYW5nL3NwZHgvY29tbW9uIgogCXNwZHggImdpdGh1Yi5jb20vc3BkeC90b29scy1nb2xhbmcvc3BkeC92Ml8yIgpAQCAtNTksNyArNjAsNyBAQAogCQkJCURhdGFMaWNlbnNlOiAgICAgICAiQ0MwLTEuMCIsCiAJCQkJU1BEWElkZW50aWZpZXI6ICAgICJET0NVTUVOVCIsCiAJCQkJRG9jdW1lbnROYW1lOiAgICAgICJ0ZXN0ZGF0YS1maXJzdHBhcnR5LWhpZ2hlc3QuYXBleCIsCi0JCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiMTk3MC0wMS0wMVQwMDowMDowMFoiKSwKKwkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIiLCAiMTk3MC0wMS0wMVQwMDowMDowMFoiLCAidGVzdGRhdGEvZmlyc3RwYXJ0eS9oaWdoZXN0LmFwZXgubWV0YV9saWMiKSwKIAkJCQlDcmVhdGlvbkluZm86ICAgICAgZ2V0Q3JlYXRpb25JbmZvKHQpLAogCQkJCVBhY2thZ2VzOiBbXSpzcGR4LlBhY2thZ2V7CiAJCQkJCXsKQEAgLTE4Nyw3ICsxODgsNyBAQAogCQkJCURhdGFMaWNlbnNlOiAgICAgICAiQ0MwLTEuMCIsCiAJCQkJU1BEWElkZW50aWZpZXI6ICAgICJET0NVTUVOVCIsCiAJCQkJRG9jdW1lbnROYW1lOiAgICAgICJ0ZXN0ZGF0YS1maXJzdHBhcnR5LWFwcGxpY2F0aW9uIiwKLQkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIxOTcwLTAxLTAxVDAwOjAwOjAwWiIpLAorCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIiIsICIxOTcwLTAxLTAxVDAwOjAwOjAwWiIsICJ0ZXN0ZGF0YS9maXJzdHBhcnR5L2FwcGxpY2F0aW9uLm1ldGFfbGljIiksCiAJCQkJQ3JlYXRpb25JbmZvOiAgICAgIGdldENyZWF0aW9uSW5mbyh0KSwKIAkJCQlQYWNrYWdlczogW10qc3BkeC5QYWNrYWdlewogCQkJCQl7CkBAIC0yNjYsNyArMjY3LDcgQEAKIAkJCQlEYXRhTGljZW5zZTogICAgICAgIkNDMC0xLjAiLAogCQkJCVNQRFhJZGVudGlmaWVyOiAgICAiRE9DVU1FTlQiLAogCQkJCURvY3VtZW50TmFtZTogICAgICAidGVzdGRhdGEtZmlyc3RwYXJ0eS1jb250YWluZXIuemlwIiwKLQkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIxOTcwLTAxLTAxVDAwOjAwOjAwWiIpLAorCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIiIsICIxOTcwLTAxLTAxVDAwOjAwOjAwWiIsICJ0ZXN0ZGF0YS9maXJzdHBhcnR5L2NvbnRhaW5lci56aXAubWV0YV9saWMiKSwKIAkJCQlDcmVhdGlvbkluZm86ICAgICAgZ2V0Q3JlYXRpb25JbmZvKHQpLAogCQkJCVBhY2thZ2VzOiBbXSpzcGR4LlBhY2thZ2V7CiAJCQkJCXsKQEAgLTM5NCw3ICszOTUsNyBAQAogCQkJCURhdGFMaWNlbnNlOiAgICAgICAiQ0MwLTEuMCIsCiAJCQkJU1BEWElkZW50aWZpZXI6ICAgICJET0NVTUVOVCIsCiAJCQkJRG9jdW1lbnROYW1lOiAgICAgICJ0ZXN0ZGF0YS1maXJzdHBhcnR5LWJpbi1iaW4xIiwKLQkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIxOTcwLTAxLTAxVDAwOjAwOjAwWiIpLAorCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIiIsICIxOTcwLTAxLTAxVDAwOjAwOjAwWiIsICJ0ZXN0ZGF0YS9maXJzdHBhcnR5L2Jpbi9iaW4xLm1ldGFfbGljIiksCiAJCQkJQ3JlYXRpb25JbmZvOiAgICAgIGdldENyZWF0aW9uSW5mbyh0KSwKIAkJCQlQYWNrYWdlczogW10qc3BkeC5QYWNrYWdlewogCQkJCQl7CkBAIC00NjAsNyArNDYxLDcgQEAKIAkJCQlEYXRhTGljZW5zZTogICAgICAgIkNDMC0xLjAiLAogCQkJCVNQRFhJZGVudGlmaWVyOiAgICAiRE9DVU1FTlQiLAogCQkJCURvY3VtZW50TmFtZTogICAgICAidGVzdGRhdGEtZmlyc3RwYXJ0eS1saWItbGliZC5zbyIsCi0JCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiMTk3MC0wMS0wMVQwMDowMDowMFoiKSwKKwkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIiLCAiMTk3MC0wMS0wMVQwMDowMDowMFoiLCAidGVzdGRhdGEvZmlyc3RwYXJ0eS9saWIvbGliZC5zby5tZXRhX2xpYyIpLAogCQkJCUNyZWF0aW9uSW5mbzogICAgICBnZXRDcmVhdGlvbkluZm8odCksCiAJCQkJUGFja2FnZXM6IFtdKnNwZHguUGFja2FnZXsKIAkJCQkJewpAQCAtNTAwLDcgKzUwMSw3IEBACiAJCQkJRGF0YUxpY2Vuc2U6ICAgICAgICJDQzAtMS4wIiwKIAkJCQlTUERYSWRlbnRpZmllcjogICAgIkRPQ1VNRU5UIiwKIAkJCQlEb2N1bWVudE5hbWU6ICAgICAgInRlc3RkYXRhLW5vdGljZS1oaWdoZXN0LmFwZXgiLAotCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiksCisJCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiIiwgIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiwgInRlc3RkYXRhL25vdGljZS9oaWdoZXN0LmFwZXgubWV0YV9saWMiKSwKIAkJCQlDcmVhdGlvbkluZm86ICAgICAgZ2V0Q3JlYXRpb25JbmZvKHQpLAogCQkJCVBhY2thZ2VzOiBbXSpzcGR4LlBhY2thZ2V7CiAJCQkJCXsKQEAgLTYzNCw3ICs2MzUsNyBAQAogCQkJCURhdGFMaWNlbnNlOiAgICAgICAiQ0MwLTEuMCIsCiAJCQkJU1BEWElkZW50aWZpZXI6ICAgICJET0NVTUVOVCIsCiAJCQkJRG9jdW1lbnROYW1lOiAgICAgICJ0ZXN0ZGF0YS1ub3RpY2UtY29udGFpbmVyLnppcCIsCi0JCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiMTk3MC0wMS0wMVQwMDowMDowMFoiKSwKKwkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIiLCAiMTk3MC0wMS0wMVQwMDowMDowMFoiLCAidGVzdGRhdGEvbm90aWNlL2NvbnRhaW5lci56aXAubWV0YV9saWMiKSwKIAkJCQlDcmVhdGlvbkluZm86ICAgICAgZ2V0Q3JlYXRpb25JbmZvKHQpLAogCQkJCVBhY2thZ2VzOiBbXSpzcGR4LlBhY2thZ2V7CiAJCQkJCXsKQEAgLTc2OCw3ICs3NjksNyBAQAogCQkJCURhdGFMaWNlbnNlOiAgICAgICAiQ0MwLTEuMCIsCiAJCQkJU1BEWElkZW50aWZpZXI6ICAgICJET0NVTUVOVCIsCiAJCQkJRG9jdW1lbnROYW1lOiAgICAgICJ0ZXN0ZGF0YS1ub3RpY2UtYXBwbGljYXRpb24iLAotCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiksCisJCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiIiwgIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiwgInRlc3RkYXRhL25vdGljZS9hcHBsaWNhdGlvbi5tZXRhX2xpYyIpLAogCQkJCUNyZWF0aW9uSW5mbzogICAgICBnZXRDcmVhdGlvbkluZm8odCksCiAJCQkJUGFja2FnZXM6IFtdKnNwZHguUGFja2FnZXsKIAkJCQkJewpAQCAtODUzLDcgKzg1NCw3IEBACiAJCQkJRGF0YUxpY2Vuc2U6ICAgICAgICJDQzAtMS4wIiwKIAkJCQlTUERYSWRlbnRpZmllcjogICAgIkRPQ1VNRU5UIiwKIAkJCQlEb2N1bWVudE5hbWU6ICAgICAgInRlc3RkYXRhLW5vdGljZS1iaW4tYmluMSIsCi0JCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiMTk3MC0wMS0wMVQwMDowMDowMFoiKSwKKwkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIiLCAiMTk3MC0wMS0wMVQwMDowMDowMFoiLCAidGVzdGRhdGEvbm90aWNlL2Jpbi9iaW4xLm1ldGFfbGljIiksCiAJCQkJQ3JlYXRpb25JbmZvOiAgICAgIGdldENyZWF0aW9uSW5mbyh0KSwKIAkJCQlQYWNrYWdlczogW10qc3BkeC5QYWNrYWdlewogCQkJCQl7CkBAIC05MjUsNyArOTI2LDcgQEAKIAkJCQlEYXRhTGljZW5zZTogICAgICAgIkNDMC0xLjAiLAogCQkJCVNQRFhJZGVudGlmaWVyOiAgICAiRE9DVU1FTlQiLAogCQkJCURvY3VtZW50TmFtZTogICAgICAidGVzdGRhdGEtbm90aWNlLWxpYi1saWJkLnNvIiwKLQkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIxOTcwLTAxLTAxVDAwOjAwOjAwWiIpLAorCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIiIsICIxOTcwLTAxLTAxVDAwOjAwOjAwWiIsICJ0ZXN0ZGF0YS9ub3RpY2UvbGliL2xpYmQuc28ubWV0YV9saWMiKSwKIAkJCQlDcmVhdGlvbkluZm86ICAgICAgZ2V0Q3JlYXRpb25JbmZvKHQpLAogCQkJCVBhY2thZ2VzOiBbXSpzcGR4LlBhY2thZ2V7CiAJCQkJCXsKQEAgLTk2NSw3ICs5NjYsNyBAQAogCQkJCURhdGFMaWNlbnNlOiAgICAgICAiQ0MwLTEuMCIsCiAJCQkJU1BEWElkZW50aWZpZXI6ICAgICJET0NVTUVOVCIsCiAJCQkJRG9jdW1lbnROYW1lOiAgICAgICJ0ZXN0ZGF0YS1yZWNpcHJvY2FsLWhpZ2hlc3QuYXBleCIsCi0JCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiMTk3MC0wMS0wMVQwMDowMDowMFoiKSwKKwkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIiLCAiMTk3MC0wMS0wMVQwMDowMDowMFoiLCAidGVzdGRhdGEvcmVjaXByb2NhbC9oaWdoZXN0LmFwZXgubWV0YV9saWMiKSwKIAkJCQlDcmVhdGlvbkluZm86ICAgICAgZ2V0Q3JlYXRpb25JbmZvKHQpLAogCQkJCVBhY2thZ2VzOiBbXSpzcGR4LlBhY2thZ2V7CiAJCQkJCXsKQEAgLTExMDUsNyArMTEwNiw3IEBACiAJCQkJRGF0YUxpY2Vuc2U6ICAgICAgICJDQzAtMS4wIiwKIAkJCQlTUERYSWRlbnRpZmllcjogICAgIkRPQ1VNRU5UIiwKIAkJCQlEb2N1bWVudE5hbWU6ICAgICAgInRlc3RkYXRhLXJlY2lwcm9jYWwtYXBwbGljYXRpb24iLAotCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiksCisJCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiIiwgIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiwgInRlc3RkYXRhL3JlY2lwcm9jYWwvYXBwbGljYXRpb24ubWV0YV9saWMiKSwKIAkJCQlDcmVhdGlvbkluZm86ICAgICAgZ2V0Q3JlYXRpb25JbmZvKHQpLAogCQkJCVBhY2thZ2VzOiBbXSpzcGR4LlBhY2thZ2V7CiAJCQkJCXsKQEAgLTExOTYsNyArMTE5Nyw3IEBACiAJCQkJRGF0YUxpY2Vuc2U6ICAgICAgICJDQzAtMS4wIiwKIAkJCQlTUERYSWRlbnRpZmllcjogICAgIkRPQ1VNRU5UIiwKIAkJCQlEb2N1bWVudE5hbWU6ICAgICAgInRlc3RkYXRhLXJlY2lwcm9jYWwtYmluLWJpbjEiLAotCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiksCisJCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiIiwgIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiwgInRlc3RkYXRhL3JlY2lwcm9jYWwvYmluL2JpbjEubWV0YV9saWMiKSwKIAkJCQlDcmVhdGlvbkluZm86ICAgICAgZ2V0Q3JlYXRpb25JbmZvKHQpLAogCQkJCVBhY2thZ2VzOiBbXSpzcGR4LlBhY2thZ2V7CiAJCQkJCXsKQEAgLTEyNjgsNyArMTI2OSw3IEBACiAJCQkJRGF0YUxpY2Vuc2U6ICAgICAgICJDQzAtMS4wIiwKIAkJCQlTUERYSWRlbnRpZmllcjogICAgIkRPQ1VNRU5UIiwKIAkJCQlEb2N1bWVudE5hbWU6ICAgICAgInRlc3RkYXRhLXJlY2lwcm9jYWwtbGliLWxpYmQuc28iLAotCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiksCisJCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiIiwgIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiwgInRlc3RkYXRhL3JlY2lwcm9jYWwvbGliL2xpYmQuc28ubWV0YV9saWMiKSwKIAkJCQlDcmVhdGlvbkluZm86ICAgICAgZ2V0Q3JlYXRpb25JbmZvKHQpLAogCQkJCVBhY2thZ2VzOiBbXSpzcGR4LlBhY2thZ2V7CiAJCQkJCXsKQEAgLTEzMDgsNyArMTMwOSw3IEBACiAJCQkJRGF0YUxpY2Vuc2U6ICAgICAgICJDQzAtMS4wIiwKIAkJCQlTUERYSWRlbnRpZmllcjogICAgIkRPQ1VNRU5UIiwKIAkJCQlEb2N1bWVudE5hbWU6ICAgICAgInRlc3RkYXRhLXJlc3RyaWN0ZWQtaGlnaGVzdC5hcGV4IiwKLQkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIxOTcwLTAxLTAxVDAwOjAwOjAwWiIpLAorCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIiIsICIxOTcwLTAxLTAxVDAwOjAwOjAwWiIsICJ0ZXN0ZGF0YS9yZXN0cmljdGVkL2hpZ2hlc3QuYXBleC5tZXRhX2xpYyIpLAogCQkJCUNyZWF0aW9uSW5mbzogICAgICBnZXRDcmVhdGlvbkluZm8odCksCiAJCQkJUGFja2FnZXM6IFtdKnNwZHguUGFja2FnZXsKIAkJCQkJewpAQCAtMTQ1NCw3ICsxNDU1LDcgQEAKIAkJCQlEYXRhTGljZW5zZTogICAgICAgIkNDMC0xLjAiLAogCQkJCVNQRFhJZGVudGlmaWVyOiAgICAiRE9DVU1FTlQiLAogCQkJCURvY3VtZW50TmFtZTogICAgICAidGVzdGRhdGEtcmVzdHJpY3RlZC1jb250YWluZXIuemlwIiwKLQkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIxOTcwLTAxLTAxVDAwOjAwOjAwWiIpLAorCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIiIsICIxOTcwLTAxLTAxVDAwOjAwOjAwWiIsICJ0ZXN0ZGF0YS9yZXN0cmljdGVkL2NvbnRhaW5lci56aXAubWV0YV9saWMiKSwKIAkJCQlDcmVhdGlvbkluZm86ICAgICAgZ2V0Q3JlYXRpb25JbmZvKHQpLAogCQkJCVBhY2thZ2VzOiBbXSpzcGR4LlBhY2thZ2V7CiAJCQkJCXsKQEAgLTE2MDAsNyArMTYwMSw3IEBACiAJCQkJRGF0YUxpY2Vuc2U6ICAgICAgICJDQzAtMS4wIiwKIAkJCQlTUERYSWRlbnRpZmllcjogICAgIkRPQ1VNRU5UIiwKIAkJCQlEb2N1bWVudE5hbWU6ICAgICAgInRlc3RkYXRhLXJlc3RyaWN0ZWQtYmluLWJpbjEiLAotCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiksCisJCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiIiwgIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiwgInRlc3RkYXRhL3Jlc3RyaWN0ZWQvYmluL2JpbjEubWV0YV9saWMiKSwKIAkJCQlDcmVhdGlvbkluZm86ICAgICAgZ2V0Q3JlYXRpb25JbmZvKHQpLAogCQkJCVBhY2thZ2VzOiBbXSpzcGR4LlBhY2thZ2V7CiAJCQkJCXsKQEAgLTE2NzgsNyArMTY3OSw3IEBACiAJCQkJRGF0YUxpY2Vuc2U6ICAgICAgICJDQzAtMS4wIiwKIAkJCQlTUERYSWRlbnRpZmllcjogICAgIkRPQ1VNRU5UIiwKIAkJCQlEb2N1bWVudE5hbWU6ICAgICAgInRlc3RkYXRhLXJlc3RyaWN0ZWQtbGliLWxpYmQuc28iLAotCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiksCisJCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiIiwgIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiwgInRlc3RkYXRhL3Jlc3RyaWN0ZWQvbGliL2xpYmQuc28ubWV0YV9saWMiKSwKIAkJCQlDcmVhdGlvbkluZm86ICAgICAgZ2V0Q3JlYXRpb25JbmZvKHQpLAogCQkJCVBhY2thZ2VzOiBbXSpzcGR4LlBhY2thZ2V7CiAJCQkJCXsKQEAgLTE3MTgsNyArMTcxOSw3IEBACiAJCQkJRGF0YUxpY2Vuc2U6ICAgICAgICJDQzAtMS4wIiwKIAkJCQlTUERYSWRlbnRpZmllcjogICAgIkRPQ1VNRU5UIiwKIAkJCQlEb2N1bWVudE5hbWU6ICAgICAgInRlc3RkYXRhLXByb3ByaWV0YXJ5LWhpZ2hlc3QuYXBleCIsCi0JCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiMTk3MC0wMS0wMVQwMDowMDowMFoiKSwKKwkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIiLCAiMTk3MC0wMS0wMVQwMDowMDowMFoiLCAidGVzdGRhdGEvcHJvcHJpZXRhcnkvaGlnaGVzdC5hcGV4Lm1ldGFfbGljIiksCiAJCQkJQ3JlYXRpb25JbmZvOiAgICAgIGdldENyZWF0aW9uSW5mbyh0KSwKIAkJCQlQYWNrYWdlczogW10qc3BkeC5QYWNrYWdlewogCQkJCQl7CkBAIC0xODY0LDcgKzE4NjUsNyBAQAogCQkJCURhdGFMaWNlbnNlOiAgICAgICAiQ0MwLTEuMCIsCiAJCQkJU1BEWElkZW50aWZpZXI6ICAgICJET0NVTUVOVCIsCiAJCQkJRG9jdW1lbnROYW1lOiAgICAgICJ0ZXN0ZGF0YS1wcm9wcmlldGFyeS1jb250YWluZXIuemlwIiwKLQkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIxOTcwLTAxLTAxVDAwOjAwOjAwWiIpLAorCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIiIsICIxOTcwLTAxLTAxVDAwOjAwOjAwWiIsICJ0ZXN0ZGF0YS9wcm9wcmlldGFyeS9jb250YWluZXIuemlwLm1ldGFfbGljIiksCiAJCQkJQ3JlYXRpb25JbmZvOiAgICAgIGdldENyZWF0aW9uSW5mbyh0KSwKIAkJCQlQYWNrYWdlczogW10qc3BkeC5QYWNrYWdlewogCQkJCQl7CkBAIC0yMDEwLDcgKzIwMTEsNyBAQAogCQkJCURhdGFMaWNlbnNlOiAgICAgICAiQ0MwLTEuMCIsCiAJCQkJU1BEWElkZW50aWZpZXI6ICAgICJET0NVTUVOVCIsCiAJCQkJRG9jdW1lbnROYW1lOiAgICAgICJ0ZXN0ZGF0YS1wcm9wcmlldGFyeS1hcHBsaWNhdGlvbiIsCi0JCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiMTk3MC0wMS0wMVQwMDowMDowMFoiKSwKKwkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIiLCAiMTk3MC0wMS0wMVQwMDowMDowMFoiLCAidGVzdGRhdGEvcHJvcHJpZXRhcnkvYXBwbGljYXRpb24ubWV0YV9saWMiKSwKIAkJCQlDcmVhdGlvbkluZm86ICAgICAgZ2V0Q3JlYXRpb25JbmZvKHQpLAogCQkJCVBhY2thZ2VzOiBbXSpzcGR4LlBhY2thZ2V7CiAJCQkJCXsKQEAgLTIxMDEsNyArMjEwMiw3IEBACiAJCQkJRGF0YUxpY2Vuc2U6ICAgICAgICJDQzAtMS4wIiwKIAkJCQlTUERYSWRlbnRpZmllcjogICAgIkRPQ1VNRU5UIiwKIAkJCQlEb2N1bWVudE5hbWU6ICAgICAgInRlc3RkYXRhLXByb3ByaWV0YXJ5LWJpbi1iaW4xIiwKLQkJCQlEb2N1bWVudE5hbWVzcGFjZTogZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIxOTcwLTAxLTAxVDAwOjAwOjAwWiIpLAorCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIiIsICIxOTcwLTAxLTAxVDAwOjAwOjAwWiIsICJ0ZXN0ZGF0YS9wcm9wcmlldGFyeS9iaW4vYmluMS5tZXRhX2xpYyIpLAogCQkJCUNyZWF0aW9uSW5mbzogICAgICBnZXRDcmVhdGlvbkluZm8odCksCiAJCQkJUGFja2FnZXM6IFtdKnNwZHguUGFja2FnZXsKIAkJCQkJewpAQCAtMjE3Myw3ICsyMTc0LDcgQEAKIAkJCQlEYXRhTGljZW5zZTogICAgICAgIkNDMC0xLjAiLAogCQkJCVNQRFhJZGVudGlmaWVyOiAgICAiRE9DVU1FTlQiLAogCQkJCURvY3VtZW50TmFtZTogICAgICAidGVzdGRhdGEtcHJvcHJpZXRhcnktbGliLWxpYmQuc28iLAotCQkJCURvY3VtZW50TmFtZXNwYWNlOiBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiksCisJCQkJRG9jdW1lbnROYW1lc3BhY2U6IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiIiwgIjE5NzAtMDEtMDFUMDA6MDA6MDBaIiwgInRlc3RkYXRhL3Byb3ByaWV0YXJ5L2xpYi9saWJkLnNvLm1ldGFfbGljIiksCiAJCQkJQ3JlYXRpb25JbmZvOiAgICAgIGdldENyZWF0aW9uSW5mbyh0KSwKIAkJCQlQYWNrYWdlczogW10qc3BkeC5QYWNrYWdlewogCQkJCQl7CkBAIC0yMjE1LDcgKzIyMTYsNyBAQAogCQkJCXJvb3RGaWxlcyA9IGFwcGVuZChyb290RmlsZXMsICJ0ZXN0ZGF0YS8iK3R0LmNvbmRpdGlvbisiLyIrcikKIAkJCX0KIAotCQkJY3R4IDo9IGNvbnRleHR7c3Rkb3V0LCBzdGRlcnIsIGNvbXBsaWFuY2UuR2V0RlModHQub3V0RGlyKSwgIiIsIFtdc3RyaW5ne3R0LnN0cmlwUHJlZml4fSwgZmFrZVRpbWV9CisJCQljdHggOj0gY29udGV4dHtzdGRvdXQsIHN0ZGVyciwgY29tcGxpYW5jZS5HZXRGUyh0dC5vdXREaXIpLCAiIiwgW11zdHJpbmd7dHQuc3RyaXBQcmVmaXh9LCBmYWtlVGltZSwgIiJ9CiAKIAkJCXNwZHhEb2MsIGRlcHMsIGVyciA6PSBzYm9tR2VuZXJhdG9yKCZjdHgsIHJvb3RGaWxlcy4uLikKIAkJCWlmIGVyciAhPSBuaWwgewpAQCAtMjI2Miw2ICsyMjYzLDk2IEBACiAJfQogfQogCitmdW5jIFRlc3RHZW5lcmF0ZVNQRFhOYW1lc3BhY2UodCAqdGVzdGluZy5UKSB7CisKKwlidWlsZElEMSA6PSAiZXhhbXBsZS0xIgorCWJ1aWxkSUQyIDo9ICJleGFtcGxlLTIiCisJZmlsZXMxIDo9ICJmaWxlMSIKKwl0aW1lc3RhbXAxIDo9ICIyMDIyLTA1LTAxIgorCXRpbWVzdGFtcDIgOj0gIjIwMjItMDUtMDIiCisJZmlsZXMyIDo9ICJmaWxlMiIKKworCS8vIFRlc3QgY2FzZSAxOiBkaWZmZXJlbnQgdGltZXN0YW1wcywgc2FtZSBmaWxlcworCW5zaDEgOj0gZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIiLCB0aW1lc3RhbXAxLCBmaWxlczEpCisJbnNoMiA6PSBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoIiIsIHRpbWVzdGFtcDIsIGZpbGVzMSkKKworCWlmIG5zaDEgPT0gIiIgeworCQl0LkVycm9yZigiZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCVzLCAlcywgJXMpOiBleHBlY3RlZCBub24tZW1wdHkgc3RyaW5nLCBidXQgZ290IGVtcHR5IHN0cmluZyIsICIiLCB0aW1lc3RhbXAxLCBmaWxlczEpCisJfQorCisJaWYgbnNoMiA9PSAiIiB7CisJCXQuRXJyb3JmKCJnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoJXMsICVzLCAlcyk6IGV4cGVjdGVkIG5vbi1lbXB0eSBzdHJpbmcsIGJ1dCBnb3QgZW1wdHkgc3RyaW5nIiwgIiIsIHRpbWVzdGFtcDIsIGZpbGVzMSkKKwl9CisKKwlpZiBuc2gxID09IG5zaDIgeworCQl0LkVycm9yZigiZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCVzLCAlcywgJXMpIGFuZCBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoJXMsICVzLCAlcyk6IGV4cGVjdGVkIGRpZmZlcmVudCBuYW1lc3BhY2UgaGFzaGVzLCBidXQgZ290IHRoZSBzYW1lIiwgIiIsIHRpbWVzdGFtcDEsIGZpbGVzMSwgIiIsIHRpbWVzdGFtcDIsIGZpbGVzMSkKKwl9CisKKwkvLyBUZXN0IGNhc2UgMjogZGlmZmVyZW50IGJ1aWxkIGlkcywgc2FtZSB0aW1lc3RhbXBzIGFuZCBmaWxlcworCW5zaDEgPSBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoYnVpbGRJRDEsIHRpbWVzdGFtcDEsIGZpbGVzMSkKKwluc2gyID0gZ2VuZXJhdGVTUERYTmFtZXNwYWNlKGJ1aWxkSUQyLCB0aW1lc3RhbXAxLCBmaWxlczEpCisKKwlpZiBuc2gxID09ICIiIHsKKwkJdC5FcnJvcmYoImdlbmVyYXRlU1BEWE5hbWVzcGFjZSglcywgJXMsICVzKTogZXhwZWN0ZWQgbm9uLWVtcHR5IHN0cmluZywgYnV0IGdvdCBlbXB0eSBzdHJpbmciLCBidWlsZElEMSwgdGltZXN0YW1wMSwgZmlsZXMxKQorCX0KKworCWlmIG5zaDIgPT0gIiIgeworCQl0LkVycm9yZigiZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCVzLCAlcywgJXMpOiBleHBlY3RlZCBub24tZW1wdHkgc3RyaW5nLCBidXQgZ290IGVtcHR5IHN0cmluZyIsIGJ1aWxkSUQyLCB0aW1lc3RhbXAxLCBmaWxlczEpCisJfQorCisJaWYgbnNoMSA9PSBuc2gyIHsKKwkJdC5FcnJvcmYoImdlbmVyYXRlU1BEWE5hbWVzcGFjZSglcywgJXMsICVzKSBhbmQgZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCVzLCAlcywgJXMpOiBleHBlY3RlZCBkaWZmZXJlbnQgbmFtZXNwYWNlIGhhc2hlcywgYnV0IGdvdCB0aGUgc2FtZSIsIGJ1aWxkSUQxLCB0aW1lc3RhbXAxLCBmaWxlczEsIGJ1aWxkSUQyLCB0aW1lc3RhbXAxLCBmaWxlczEpCisJfQorCisJLy8gVGVzdCBjYXNlIDM6IHNhbWUgYnVpbGQgaWRzIGFuZCBmaWxlcywgZGlmZmVyZW50IHRpbWVzdGFtcHMKKwluc2gxID0gZ2VuZXJhdGVTUERYTmFtZXNwYWNlKGJ1aWxkSUQxLCB0aW1lc3RhbXAxLCBmaWxlczEpCisJbnNoMiA9IGdlbmVyYXRlU1BEWE5hbWVzcGFjZShidWlsZElEMSwgdGltZXN0YW1wMiwgZmlsZXMxKQorCisJaWYgbnNoMSA9PSAiIiB7CisJCXQuRXJyb3JmKCJnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoJXMsICVzLCAlcyk6IGV4cGVjdGVkIG5vbi1lbXB0eSBzdHJpbmcsIGJ1dCBnb3QgZW1wdHkgc3RyaW5nIiwgYnVpbGRJRDEsIHRpbWVzdGFtcDEsIGZpbGVzMSkKKwl9CisKKwlpZiBuc2gyID09ICIiIHsKKwkJdC5FcnJvcmYoImdlbmVyYXRlU1BEWE5hbWVzcGFjZSglcywgJXMsICVzKTogZXhwZWN0ZWQgbm9uLWVtcHR5IHN0cmluZywgYnV0IGdvdCBlbXB0eSBzdHJpbmciLCBidWlsZElEMSwgdGltZXN0YW1wMiwgZmlsZXMxKQorCX0KKworCWlmIG5zaDEgIT0gbnNoMiB7CisJCXQuRXJyb3JmKCJnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoJXMsICVzLCAlcykgYW5kIGdlbmVyYXRlU1BEWE5hbWVzcGFjZSglcywgJXMsICVzKTogZXhwZWN0ZWQgc2FtZSBuYW1lc3BhY2UgaGFzaGVzLCBidXQgZ290IGRpZmZlcmVudDogJXMgYW5kICVzIiwgYnVpbGRJRDEsIHRpbWVzdGFtcDEsIGZpbGVzMSwgYnVpbGRJRDIsIHRpbWVzdGFtcDEsIGZpbGVzMSwgbnNoMSwgbnNoMikKKwl9CisKKwkvLyBUZXN0IGNhc2UgNDogc2FtZSBidWlsZCBpZHMgYW5kIHRpbWVzdGFtcHMsIGRpZmZlcmVudCBmaWxlcworCW5zaDEgPSBnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoYnVpbGRJRDEsIHRpbWVzdGFtcDEsIGZpbGVzMSkKKwluc2gyID0gZ2VuZXJhdGVTUERYTmFtZXNwYWNlKGJ1aWxkSUQxLCB0aW1lc3RhbXAxLCBmaWxlczIpCisKKwlpZiBuc2gxID09ICIiIHsKKwkJdC5FcnJvcmYoImdlbmVyYXRlU1BEWE5hbWVzcGFjZSglcywgJXMsICVzKTogZXhwZWN0ZWQgbm9uLWVtcHR5IHN0cmluZywgYnV0IGdvdCBlbXB0eSBzdHJpbmciLCBidWlsZElEMSwgdGltZXN0YW1wMSwgZmlsZXMxKQorCX0KKworCWlmIG5zaDIgPT0gIiIgeworCQl0LkVycm9yZigiZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCVzLCAlcywgJXMpOiBleHBlY3RlZCBub24tZW1wdHkgc3RyaW5nLCBidXQgZ290IGVtcHR5IHN0cmluZyIsIGJ1aWxkSUQxLCB0aW1lc3RhbXAxLCBmaWxlczIpCisJfQorCisJaWYgbnNoMSA9PSBuc2gyIHsKKwkJdC5FcnJvcmYoImdlbmVyYXRlU1BEWE5hbWVzcGFjZSglcywgJXMsICVzKSBhbmQgZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCVzLCAlcywgJXMpOiBleHBlY3RlZCBkaWZmZXJlbnQgbmFtZXNwYWNlIGhhc2hlcywgYnV0IGdvdCB0aGUgc2FtZSIsIGJ1aWxkSUQxLCB0aW1lc3RhbXAxLCBmaWxlczEsIGJ1aWxkSUQxLCB0aW1lc3RhbXAxLCBmaWxlczIpCisJfQorCisJLy8gVGVzdCBjYXNlIDU6IGVtcHR5IGJ1aWxkIGlkcywgc2FtZSB0aW1lc3RhbXBzIGFuZCBkaWZmZXJlbnQgZmlsZXMKKwluc2gxID0gZ2VuZXJhdGVTUERYTmFtZXNwYWNlKCIiLCB0aW1lc3RhbXAxLCBmaWxlczEpCisJbnNoMiA9IGdlbmVyYXRlU1BEWE5hbWVzcGFjZSgiIiwgdGltZXN0YW1wMSwgZmlsZXMyKQorCisJaWYgbnNoMSA9PSAiIiB7CisJCXQuRXJyb3JmKCJnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoJXMsICVzLCAlcyk6IGV4cGVjdGVkIG5vbi1lbXB0eSBzdHJpbmcsIGJ1dCBnb3QgZW1wdHkgc3RyaW5nIiwgIiIsIHRpbWVzdGFtcDEsIGZpbGVzMSkKKwl9CisKKwlpZiBuc2gyID09ICIiIHsKKwkJdC5FcnJvcmYoImdlbmVyYXRlU1BEWE5hbWVzcGFjZSglcywgJXMsICVzKTogZXhwZWN0ZWQgbm9uLWVtcHR5IHN0cmluZywgYnV0IGdvdCBlbXB0eSBzdHJpbmciLCAiIiwgdGltZXN0YW1wMSwgZmlsZXMyKQorCX0KKworCWlmIG5zaDEgPT0gbnNoMiB7CisJCXQuRXJyb3JmKCJnZW5lcmF0ZVNQRFhOYW1lc3BhY2UoJXMsICVzLCAlcykgYW5kIGdlbmVyYXRlU1BEWE5hbWVzcGFjZSglcywgJXMsICVzKTogZXhwZWN0ZWQgZGlmZmVyZW50IG5hbWVzcGFjZSBoYXNoZXMsIGJ1dCBnb3QgdGhlIHNhbWUiLCAiIiwgdGltZXN0YW1wMSwgZmlsZXMxLCAiIiwgdGltZXN0YW1wMSwgZmlsZXMyKQorCX0KK30KKwogZnVuYyBnZXRDcmVhdGlvbkluZm8odCAqdGVzdGluZy5UKSAqc3BkeC5DcmVhdGlvbkluZm8gewogCWNpLCBlcnIgOj0gYnVpbGRlcjJ2Mi5CdWlsZENyZWF0aW9uSW5mb1NlY3Rpb24yXzIoIk9yZ2FuaXphdGlvbiIsICJHb29nbGUgTExDIiwgbmlsKQogCWlmIGVyciAhPSBuaWwgewpAQCAtMjI4NSw4ICsyMzc2LDggQEAKIAlpZiBkb2MuRG9jdW1lbnROYW1lID09ICIiIHsKIAkJcmV0dXJuIGZtdC5FcnJvcmYoIkRvY3VtZW50TmFtZTogZ290IG5vdGhpbmcsIHdhbnQgRG9jdW1lbnQgTmFtZSIpCiAJfQotCWlmIGZtdC5TcHJpbnRmKCIldiIsIGRvYy5DcmVhdGlvbkluZm8uQ3JlYXRvcnNbMV0uQ3JlYXRvcikgIT0gIkdvb2dsZSBMTEMiIHsKLQkJcmV0dXJuIGZtdC5FcnJvcmYoIkNyZWF0b3I6IGdvdCAldiwgd2FudCAgJ0dvb2dsZSBMTEMnIikKKwlpZiBjIDo9IGZtdC5TcHJpbnRmKCIldiIsIGRvYy5DcmVhdGlvbkluZm8uQ3JlYXRvcnNbMV0uQ3JlYXRvcik7IGMgIT0gIkdvb2dsZSBMTEMiIHsKKwkJcmV0dXJuIGZtdC5FcnJvcmYoIkNyZWF0b3I6IGdvdCAldiwgd2FudCAgJ0dvb2dsZSBMTEMnIiwgYykKIAl9CiAJXywgZXJyIDo9IHRpbWUuUGFyc2UodGltZS5SRkMzMzM5LCBkb2MuQ3JlYXRpb25JbmZvLkNyZWF0ZWQpCiAJaWYgZXJyICE9IG5pbCB7CmRpZmYgLS1naXQgYS90b29scy9jb21wbGlhbmNlL2dvLm1vZCBiL3Rvb2xzL2NvbXBsaWFuY2UvZ28ubW9kCmluZGV4IDA4ODkxNWEuLjUzMmVmZDQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2NvbXBsaWFuY2UvZ28ubW9kCisrKyBiL3Rvb2xzL2NvbXBsaWFuY2UvZ28ubW9kCkBAIC0xLDI2ICsxLDExIEBACitnbyAxLjIyCisKIG1vZHVsZSBhbmRyb2lkL3Nvb25nL3Rvb2xzL2NvbXBsaWFuY2UKIAotcmVxdWlyZSBnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1ZiB2MC4wLjAKLQotcmVwbGFjZSBnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1ZiB2MC4wLjAgPT4gLi4vLi4vLi4vLi4vZXh0ZXJuYWwvZ29sYW5nLXByb3RvYnVmCi0KIHJlcXVpcmUgKAotCWFuZHJvaWQvc29vbmcgdjAuMC4wCiAJZ2l0aHViLmNvbS9nb29nbGUvYmx1ZXByaW50IHYwLjAuMAorCWFuZHJvaWQvc29vbmcgdjAuMC4wCisJZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYgdjAuMC4wCisJZ2l0aHViLmNvbS9zcGR4L3Rvb2xzLWdvbGFuZyB2MC4wLjAKKwlnaXRodWIuY29tL2dvb2dsZS9nby1jbXAgdjAuMC4wCiApCi0KLXJlcXVpcmUgZ29sYW5nLm9yZy94L3hlcnJvcnMgdjAuMC4wLTIwMjIwNjA5MTQ0NDI5LTY1ZTY1NDE3YjAyZiAvLyBpbmRpcmVjdAotCi1yZXBsYWNlIGFuZHJvaWQvc29vbmcgdjAuMC4wID0+IC4uLy4uLy4uL3Nvb25nCi0KLXJlcGxhY2UgZ2l0aHViLmNvbS9nb29nbGUvYmx1ZXByaW50ID0+IC4uLy4uLy4uL2JsdWVwcmludAotCi0vLyBJbmRpcmVjdCBkZXBzIGZyb20gZ29sYW5nLXByb3RvYnVmCi1leGNsdWRlIGdpdGh1Yi5jb20vZ29sYW5nL3Byb3RvYnVmIHYxLjUuMAotCi1yZXBsYWNlIGdpdGh1Yi5jb20vZ29vZ2xlL2dvLWNtcCB2MC41LjUgPT4gLi4vLi4vLi4vLi4vZXh0ZXJuYWwvZ28tY21wCi0KLS8vIEluZGlyZWN0IGRlcCBmcm9tIGdvLWNtcAotZXhjbHVkZSBnb2xhbmcub3JnL3gveGVycm9ycyB2MC4wLjAtMjAxOTEyMDQxOTA1MzYtOWJkZmFiZTY4NTQzCi0KLWdvIDEuMTgKZGlmZiAtLWdpdCBhL3Rvb2xzL2NvbXBsaWFuY2UvZ28uc3VtIGIvdG9vbHMvY29tcGxpYW5jZS9nby5zdW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZTc2ZDkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvY29tcGxpYW5jZS9nby5zdW0KKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWdvbGFuZy5vcmcveC94ZXJyb3JzIHYwLjAuMC0yMDIyMDYwOTE0NDQyOS02NWU2NTQxN2IwMmYgaDE6dUY2cGFpUVFlYkxlU1hrclRxSHF6ME1YaFhYUzFLZ0Y0MWVVZEJOdnhLMD0KLWdvbGFuZy5vcmcveC94ZXJyb3JzIHYwLjAuMC0yMDIyMDYwOTE0NDQyOS02NWU2NTQxN2IwMmYvZ28ubW9kIGgxOks4K2doRzVXYUs5cU5xVTVLM0hkSUxmTUx5MWYzYU5ZRkkvd25sMTAwYTg9CmRpZmYgLS1naXQgYS90b29scy9jb21wbGlhbmNlL2dvLndvcmsgYi90b29scy9jb21wbGlhbmNlL2dvLndvcmsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA2ZTYxOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2NvbXBsaWFuY2UvZ28ud29yawpAQCAtMCwwICsxLDE4IEBACitnbyAxLjIzCisKK3VzZSAoCisJLgorCS4uLy4uLy4uLy4uL2J1aWxkL2JsdWVwcmludAorCS4uLy4uLy4uLy4uL2J1aWxkL3Nvb25nCisJLi4vLi4vLi4vLi4vZXh0ZXJuYWwvZ28tY21wCisJLi4vLi4vLi4vLi4vZXh0ZXJuYWwvZ29sYW5nLXByb3RvYnVmCisJLi4vLi4vLi4vLi4vZXh0ZXJuYWwvc3BkeC10b29scworKQorCityZXBsYWNlICgKKwlnaXRodWIuY29tL2dvb2dsZS9ibHVlcHJpbnQgdjAuMC4wID0+IC4uLy4uLy4uLy4uL2J1aWxkL2JsdWVwcmludAorCWFuZHJvaWQvc29vbmcgdjAuMC4wID0+IC4uLy4uLy4uLy4uL2J1aWxkL3Nvb25nCisJZ2l0aHViLmNvbS9nb29nbGUvZ28tY21wIHYwLjAuMCA9PiAuLi8uLi8uLi8uLi9leHRlcm5hbC9nby1jbXAKKwlnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1ZiB2MC4wLjAgPT4gLi4vLi4vLi4vLi4vZXh0ZXJuYWwvZ29sYW5nLXByb3RvYnVmCisJZ2l0aHViLmNvbS9zcGR4L3Rvb2xzLWdvbGFuZyB2MC4wLjAgPT4gLi4vLi4vLi4vLi4vZXh0ZXJuYWwvc3BkeC10b29scworKQpkaWZmIC0tZ2l0IGEvdG9vbHMvY29tcGxpYW5jZS9wcm9qZWN0bWV0YWRhdGEvcHJvamVjdG1ldGFkYXRhLmdvIGIvdG9vbHMvY29tcGxpYW5jZS9wcm9qZWN0bWV0YWRhdGEvcHJvamVjdG1ldGFkYXRhLmdvCmluZGV4IGIxMzdhMTIuLjMwYTYzMjUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2NvbXBsaWFuY2UvcHJvamVjdG1ldGFkYXRhL3Byb2plY3RtZXRhZGF0YS5nbworKysgYi90b29scy9jb21wbGlhbmNlL3Byb2plY3RtZXRhZGF0YS9wcm9qZWN0bWV0YWRhdGEuZ28KQEAgLTYzLDEyICs2MywxMiBAQAogCXJldHVybiBwbS5wcm9qZWN0CiB9CiAKLS8vIFByb2plY3ROYW1lIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHByb2plY3QuCisvLyBOYW1lIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHByb2plY3QuCiBmdW5jIChwbSAqUHJvamVjdE1ldGFkYXRhKSBOYW1lKCkgc3RyaW5nIHsKIAlyZXR1cm4gcG0ucHJvdG8uR2V0TmFtZSgpCiB9CiAKLS8vIFByb2plY3RWZXJzaW9uIHJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhlIHByb2plY3QgaWYgYXZhaWxhYmxlLgorLy8gVmVyc2lvbiByZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0IGlmIGF2YWlsYWJsZS4KIGZ1bmMgKHBtICpQcm9qZWN0TWV0YWRhdGEpIFZlcnNpb24oKSBzdHJpbmcgewogCXRwIDo9IHBtLnByb3RvLkdldFRoaXJkUGFydHkoKQogCWlmIHRwICE9IG5pbCB7CmRpZmYgLS1naXQgYS90b29scy9lZGl0X21vbml0b3IvQW5kcm9pZC5icCBiL3Rvb2xzL2VkaXRfbW9uaXRvci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YWM1YmYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lZGl0X21vbml0b3IvQW5kcm9pZC5icApAQCAtMCwwICsxLDExOCBAQAorLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gU2V0IG9mIGVycm9yIHByb25lIHJ1bGVzIHRvIGVuc3VyZSBjb2RlIHF1YWxpdHkKKy8vIFBhY2thZ2VMb2NhdGlvbiBjaGVjayByZXF1aXJlcyB0aGUgYW5kcm9pZENvbXBhdGlibGU9ZmFsc2Ugb3RoZXJ3aXNlIGl0IGRvZXMgbm90IGRvIGFueXRoaW5nLgorCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCisgICAgZGVmYXVsdF90ZWFtOiAidHJlbmR5X3RlYW1fYWR0ZSIsCit9CisKK3B5dGhvbl9saWJyYXJ5X2hvc3QgeworICAgIG5hbWU6ICJlZGl0X2V2ZW50X3Byb3RvIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJwcm90by9lZGl0X2V2ZW50LnByb3RvIiwKKyAgICBdLAorICAgIHByb3RvOiB7CisgICAgICAgIGNhbm9uaWNhbF9wYXRoX2Zyb21fcm9vdDogZmFsc2UsCisgICAgfSwKK30KKworcHl0aG9uX2xpYnJhcnlfaG9zdCB7CisgICAgbmFtZTogImVkaXRfbW9uaXRvcl9saWIiLAorICAgIHBrZ19wYXRoOiAiZWRpdF9tb25pdG9yIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJkYWVtb25fbWFuYWdlci5weSIsCisgICAgICAgICJlZGl0X21vbml0b3IucHkiLAorICAgICAgICAidXRpbHMucHkiLAorICAgIF0sCisgICAgbGliczogWworICAgICAgICAiYXN1aXRlX2NjX2NsaWVudCIsCisgICAgICAgICJlZGl0X2V2ZW50X3Byb3RvIiwKKyAgICAgICAgIndhdGNoZG9nIiwKKyAgICBdLAorfQorCitweXRob25fdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiZGFlbW9uX21hbmFnZXJfdGVzdCIsCisgICAgbWFpbjogImRhZW1vbl9tYW5hZ2VyX3Rlc3QucHkiLAorICAgIHBrZ19wYXRoOiAiZWRpdF9tb25pdG9yIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJkYWVtb25fbWFuYWdlcl90ZXN0LnB5IiwKKyAgICBdLAorICAgIGxpYnM6IFsKKyAgICAgICAgImVkaXRfbW9uaXRvcl9saWIiLAorICAgIF0sCisgICAgdGVzdF9vcHRpb25zOiB7CisgICAgICAgIHVuaXRfdGVzdDogdHJ1ZSwKKyAgICB9LAorfQorCitweXRob25fdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiZWRpdF9tb25pdG9yX3Rlc3QiLAorICAgIG1haW46ICJlZGl0X21vbml0b3JfdGVzdC5weSIsCisgICAgcGtnX3BhdGg6ICJlZGl0X21vbml0b3IiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImVkaXRfbW9uaXRvcl90ZXN0LnB5IiwKKyAgICBdLAorICAgIGxpYnM6IFsKKyAgICAgICAgImVkaXRfbW9uaXRvcl9saWIiLAorICAgIF0sCisgICAgdGVzdF9vcHRpb25zOiB7CisgICAgICAgIHVuaXRfdGVzdDogdHJ1ZSwKKyAgICB9LAorfQorCitweXRob25fdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiZWRpdF9tb25pdG9yX3V0aWxzX3Rlc3QiLAorICAgIG1haW46ICJ1dGlsc190ZXN0LnB5IiwKKyAgICBwa2dfcGF0aDogImVkaXRfbW9uaXRvciIsCisgICAgc3JjczogWworICAgICAgICAidXRpbHNfdGVzdC5weSIsCisgICAgXSwKKyAgICBsaWJzOiBbCisgICAgICAgICJlZGl0X21vbml0b3JfbGliIiwKKyAgICBdLAorICAgIHRlc3Rfb3B0aW9uczogeworICAgICAgICB1bml0X3Rlc3Q6IHRydWUsCisgICAgfSwKK30KKworcHl0aG9uX3Rlc3RfaG9zdCB7CisgICAgbmFtZTogImVkaXRfbW9uaXRvcl9pbnRlZ3JhdGlvbl90ZXN0IiwKKyAgICBtYWluOiAiZWRpdF9tb25pdG9yX2ludGVncmF0aW9uX3Rlc3QucHkiLAorICAgIHBrZ19wYXRoOiAidGVzdGRhdGEiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImVkaXRfbW9uaXRvcl9pbnRlZ3JhdGlvbl90ZXN0LnB5IiwKKyAgICBdLAorICAgIHRlc3Rfb3B0aW9uczogeworICAgICAgICB1bml0X3Rlc3Q6IHRydWUsCisgICAgfSwKKyAgICBkYXRhOiBbCisgICAgICAgICI6ZWRpdF9tb25pdG9yIiwKKyAgICBdLAorfQorCitweXRob25fYmluYXJ5X2hvc3QgeworICAgIG5hbWU6ICJlZGl0X21vbml0b3IiLAorICAgIHBrZ19wYXRoOiAiZWRpdF9tb25pdG9yIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJtYWluLnB5IiwKKyAgICBdLAorICAgIGxpYnM6IFsKKyAgICAgICAgImVkaXRfbW9uaXRvcl9saWIiLAorICAgIF0sCisgICAgbWFpbjogIm1haW4ucHkiLAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWRpdF9tb25pdG9yL09XTkVSUyBiL3Rvb2xzL2VkaXRfbW9uaXRvci9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYwZjM2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2VkaXRfbW9uaXRvci9PV05FUlMKQEAgLTAsMCArMSBAQAoraW5jbHVkZSBwbGF0Zm9ybS90b29scy9hc3VpdGU6L09XTkVSU19BRFRFX1RFQU0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9lZGl0X21vbml0b3IvZGFlbW9uX21hbmFnZXIucHkgYi90b29scy9lZGl0X21vbml0b3IvZGFlbW9uX21hbmFnZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q2NjZmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2VkaXRfbW9uaXRvci9kYWVtb25fbWFuYWdlci5weQpAQCAtMCwwICsxLDQ2MyBAQAorIyBDb3B5cmlnaHQgMjAyNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKK2ltcG9ydCBlcnJubworaW1wb3J0IGZjbnRsCitpbXBvcnQgZ2V0cGFzcworaW1wb3J0IGhhc2hsaWIKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBwYXRobGliCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBzaWduYWwKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB0aW1lCisKK2Zyb20gYXRlc3QubWV0cmljcyBpbXBvcnQgY2xlYXJjdXRfY2xpZW50Citmcm9tIGF0ZXN0LnByb3RvIGltcG9ydCBjbGllbnRhbmFseXRpY3NfcGIyCitmcm9tIGVkaXRfbW9uaXRvciBpbXBvcnQgdXRpbHMKK2Zyb20gcHJvdG8gaW1wb3J0IGVkaXRfZXZlbnRfcGIyCisKK0RFRkFVTFRfUFJPQ0VTU19URVJNSU5BVElPTl9USU1FT1VUX1NFQ09ORFMgPSA1CitERUZBVUxUX01PTklUT1JfSU5URVJWQUxfU0VDT05EUyA9IDUKK0RFRkFVTFRfTUVNT1JZX1VTQUdFX1RIUkVTSE9MRCA9IDAuMDIgICMgMiUgb2YgdG90YWwgbWVtb3J5CitERUZBVUxUX0NQVV9VU0FHRV9USFJFU0hPTEQgPSAyMDAKK0RFRkFVTFRfUkVCT09UX1RJTUVPVVRfU0VDT05EUyA9IDYwICogNjAgKiAyNAorQkxPQ0tfU0lHTl9GSUxFID0gImVkaXRfbW9uaXRvcl9ibG9ja19zaWduIgorIyBFbnVtIG9mIHRoZSBDbGVhcmN1dCBsb2cgc291cmNlIGRlZmluZWQgdW5kZXIKKyMgL2dvb2dsZTMvd2lyZWxlc3MvYW5kcm9pZC9wbGF5L3BsYXlsb2cvcHJvdG8vbG9nX3NvdXJjZV9lbnVtLnByb3RvCitMT0dfU09VUkNFID0gMjUyNAorCisKK2RlZiBkZWZhdWx0X2RhZW1vbl90YXJnZXQoKToKKyAgIiIiUGxhY2UgaG9sZGVyIGZvciB0aGUgZGVmYXVsdCBkYWVtb24gdGFyZ2V0LiIiIgorICBwcmludCgiZGVmYXVsdCBkYWVtb24gdGFyZ2V0IikKKworCitjbGFzcyBEYWVtb25NYW5hZ2VyOgorICAiIiJDbGFzcyB0byBtYW5hZ2UgYW5kIG1vbml0b3IgdGhlIGRhZW1vbiBydW4gYXMgYSBzdWJwcm9jZXNzLiIiIgorCisgIGRlZiBfX2luaXRfXygKKyAgICAgIHNlbGYsCisgICAgICBiaW5hcnlfcGF0aDogc3RyLAorICAgICAgZGFlbW9uX3RhcmdldDogY2FsbGFibGUgPSBkZWZhdWx0X2RhZW1vbl90YXJnZXQsCisgICAgICBkYWVtb25fYXJnczogdHVwbGUgPSAoKSwKKyAgICAgIGNjbGllbnQ6IGNsZWFyY3V0X2NsaWVudC5DbGVhcmN1dCB8IE5vbmUgPSBOb25lLAorICApOgorICAgIHNlbGYuYmluYXJ5X3BhdGggPSBiaW5hcnlfcGF0aAorICAgIHNlbGYuZGFlbW9uX3RhcmdldCA9IGRhZW1vbl90YXJnZXQKKyAgICBzZWxmLmRhZW1vbl9hcmdzID0gZGFlbW9uX2FyZ3MKKyAgICBzZWxmLmNjbGllbnQgPSBjY2xpZW50IG9yIGNsZWFyY3V0X2NsaWVudC5DbGVhcmN1dChMT0dfU09VUkNFKQorCisgICAgc2VsZi51c2VyX25hbWUgPSBnZXRwYXNzLmdldHVzZXIoKQorICAgIHNlbGYuaG9zdF9uYW1lID0gcGxhdGZvcm0ubm9kZSgpCisgICAgc2VsZi5zb3VyY2Vfcm9vdCA9IG9zLmVudmlyb24uZ2V0KCJBTkRST0lEX0JVSUxEX1RPUCIsICIiKQorICAgIHNlbGYucGlkID0gb3MuZ2V0cGlkKCkKKyAgICBzZWxmLmRhZW1vbl9wcm9jZXNzID0gTm9uZQorCisgICAgc2VsZi5tYXhfbWVtb3J5X3VzYWdlID0gMAorICAgIHNlbGYubWF4X2NwdV91c2FnZSA9IDAKKyAgICBzZWxmLnRvdGFsX21lbW9yeV9zaXplID0gb3Muc3lzY29uZigiU0NfUEFHRV9TSVpFIikgKiBvcy5zeXNjb25mKAorICAgICAgICAiU0NfUEhZU19QQUdFUyIKKyAgICApCisKKyAgICBwaWRfZmlsZV9kaXIgPSBwYXRobGliLlBhdGgodGVtcGZpbGUuZ2V0dGVtcGRpcigpKS5qb2lucGF0aCgiZWRpdF9tb25pdG9yIikKKyAgICBwaWRfZmlsZV9kaXIubWtkaXIocGFyZW50cz1UcnVlLCBleGlzdF9vaz1UcnVlKQorICAgIHNlbGYucGlkX2ZpbGVfcGF0aCA9IHNlbGYuX2dldF9waWRfZmlsZV9wYXRoKHBpZF9maWxlX2RpcikKKyAgICBzZWxmLmJsb2NrX3NpZ24gPSBwYXRobGliLlBhdGgodGVtcGZpbGUuZ2V0dGVtcGRpcigpKS5qb2lucGF0aCgKKyAgICAgICAgQkxPQ0tfU0lHTl9GSUxFCisgICAgKQorCisgIGRlZiBzdGFydChzZWxmKToKKyAgICAiIiJXcml0ZXMgdGhlIHBpZGZpbGUgYW5kIHN0YXJ0cyB0aGUgZGFlbW9uIHByb2Nlcy4iIiIKKyAgICBpZiBub3QgdXRpbHMuaXNfZmVhdHVyZV9lbmFibGVkKAorICAgICAgICAiZWRpdF9tb25pdG9yIiwKKyAgICAgICAgc2VsZi51c2VyX25hbWUsCisgICAgICAgICJFTkFCTEVfQU5EUk9JRF9FRElUX01PTklUT1IiLAorICAgICAgICAxMDAsCisgICAgKToKKyAgICAgIGxvZ2dpbmcud2FybmluZygiRWRpdCBtb25pdG9yIGlzIGRpc2FibGVkLCBleGl0aW5nLi4uIikKKyAgICAgIHJldHVybgorCisgICAgaWYgc2VsZi5ibG9ja19zaWduLmV4aXN0cygpOgorICAgICAgbG9nZ2luZy53YXJuaW5nKCJCbG9jayBzaWduIGZvdW5kLCBleGl0aW5nLi4uIikKKyAgICAgIHJldHVybgorCisgICAgaWYgc2VsZi5iaW5hcnlfcGF0aC5zdGFydHN3aXRoKCIvZ29vZ2xlL2NvZy8iKToKKyAgICAgIGxvZ2dpbmcud2FybmluZygiRWRpdCBtb25pdG9yIGZvciBjb2cgaXMgbm90IHN1cHBvcnRlZCwgZXhpdGluZy4uLiIpCisgICAgICByZXR1cm4KKworICAgIHNldHVwX2xvY2tfZmlsZSA9IHBhdGhsaWIuUGF0aCh0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkpLmpvaW5wYXRoKAorICAgICAgICBzZWxmLnBpZF9maWxlX3BhdGgubmFtZSArICIuc2V0dXAiCisgICAgKQorICAgIGxvZ2dpbmcuaW5mbygic2V0dXAgbG9jayBmaWxlOiAlcyIsIHNldHVwX2xvY2tfZmlsZSkKKyAgICB3aXRoIG9wZW4oc2V0dXBfbG9ja19maWxlLCAidyIpIGFzIGY6CisgICAgICB0cnk6CisgICAgICAgICMgQWNxdWlyZSBhbiBleGNsdXNpdmUgbG9jaworICAgICAgICBmY250bC5mbG9jayhmLCBmY250bC5MT0NLX0VYIHwgZmNudGwuTE9DS19OQikKKyAgICAgICAgc2VsZi5fc3RvcF9hbnlfZXhpc3RpbmdfaW5zdGFuY2UoKQorICAgICAgICBzZWxmLl93cml0ZV9waWRfdG9fcGlkZmlsZSgpCisgICAgICAgIHNlbGYuX3N0YXJ0X2RhZW1vbl9wcm9jZXNzKCkKKyAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgaWYgKAorICAgICAgICAgICAgaXNpbnN0YW5jZShlLCBJT0Vycm9yKSBhbmQgZS5lcnJubyA9PSBlcnJuby5FQUdBSU4KKyAgICAgICAgKTogICMgRmFpbGVkIHRvIGFjcXVpcmUgdGhlIGZpbGUgbG9jay4KKyAgICAgICAgICBsb2dnaW5nLndhcm5pbmcoIkFub3RoZXIgZWRpdCBtb25pdG9yIGlzIHN0YXJ0aW5nLCBleGl0aW5uZy4uLiIpCisgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oIkZhaWxlZCB0byBzdGFydCBkYWVtb24gbWFuYWdlciB3aXRoIGVycm9yICVzIiwgZSkKKyAgICAgICAgICBzZWxmLl9zZW5kX2Vycm9yX2V2ZW50X3RvX2NsZWFyY3V0KAorICAgICAgICAgICAgICBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuRkFJTEVEX1RPX1NUQVJUX0VESVRfTU9OSVRPUgorICAgICAgICAgICkKKyAgICAgICAgICByYWlzZSBlCisgICAgICBmaW5hbGx5OgorICAgICAgICAjIFJlbGVhc2UgdGhlIGxvY2sKKyAgICAgICAgZmNudGwuZmxvY2soZiwgZmNudGwuTE9DS19VTikKKworICBkZWYgbW9uaXRvcl9kYWVtb24oCisgICAgICBzZWxmLAorICAgICAgaW50ZXJ2YWw6IGludCA9IERFRkFVTFRfTU9OSVRPUl9JTlRFUlZBTF9TRUNPTkRTLAorICAgICAgbWVtb3J5X3RocmVzaG9sZDogZmxvYXQgPSBERUZBVUxUX01FTU9SWV9VU0FHRV9USFJFU0hPTEQsCisgICAgICBjcHVfdGhyZXNob2xkOiBmbG9hdCA9IERFRkFVTFRfQ1BVX1VTQUdFX1RIUkVTSE9MRCwKKyAgICAgIHJlYm9vdF90aW1lb3V0OiBpbnQgPSBERUZBVUxUX1JFQk9PVF9USU1FT1VUX1NFQ09ORFMsCisgICk6CisgICAgIiIiTW9uaXRzIHRoZSBkYWVtb24gcHJvY2VzcyBzdGF0dXMuCisKKyAgICBQZXJpb2RpY2FsbHkgY2hlY2sgdGhlIENQVS9NZW1vcnkgdXNhZ2Ugb2YgdGhlIGRhZW1vbiBwcm9jZXNzIGFzIGxvbmcgYXMgdGhlCisgICAgcHJvY2VzcyBpcyBzdGlsbCBydW5uaW5nIGFuZCBraWxsIHRoZSBwcm9jZXNzIGlmIHRoZSByZXNvdXJjZSB1c2FnZSBpcyBhYm92ZQorICAgIGdpdmVuIHRocmVzaG9sZHMuCisgICAgIiIiCisgICAgaWYgbm90IHNlbGYuZGFlbW9uX3Byb2Nlc3M6CisgICAgICByZXR1cm4KKworICAgIGxvZ2dpbmcuaW5mbygic3RhcnQgbW9uaXRvcmluZyBkYWVtb24gcHJvY2VzcyAlZC4iLCBzZWxmLmRhZW1vbl9wcm9jZXNzLnBpZCkKKyAgICByZWJvb3RfdGltZSA9IHRpbWUudGltZSgpICsgcmVib290X3RpbWVvdXQKKyAgICB3aGlsZSBzZWxmLmRhZW1vbl9wcm9jZXNzLmlzX2FsaXZlKCk6CisgICAgICBpZiB0aW1lLnRpbWUoKSA+IHJlYm9vdF90aW1lOgorICAgICAgICBzZWxmLnJlYm9vdCgpCisgICAgICB0cnk6CisgICAgICAgIG1lbW9yeV91c2FnZSA9IHNlbGYuX2dldF9wcm9jZXNzX21lbW9yeV9wZXJjZW50KHNlbGYuZGFlbW9uX3Byb2Nlc3MucGlkKQorICAgICAgICBzZWxmLm1heF9tZW1vcnlfdXNhZ2UgPSBtYXgoc2VsZi5tYXhfbWVtb3J5X3VzYWdlLCBtZW1vcnlfdXNhZ2UpCisKKyAgICAgICAgY3B1X3VzYWdlID0gc2VsZi5fZ2V0X3Byb2Nlc3NfY3B1X3BlcmNlbnQoc2VsZi5kYWVtb25fcHJvY2Vzcy5waWQpCisgICAgICAgIHNlbGYubWF4X2NwdV91c2FnZSA9IG1heChzZWxmLm1heF9jcHVfdXNhZ2UsIGNwdV91c2FnZSkKKworICAgICAgICB0aW1lLnNsZWVwKGludGVydmFsKQorICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAjIExvZ2dpbmcgdGhlIGVycm9yIGFuZCBjb250aW51ZS4KKyAgICAgICAgbG9nZ2luZy53YXJuaW5nKCJGYWlsZWQgdG8gbW9uaXRvciBkYWVtb24gcHJvY2VzcyB3aXRoIGVycm9yOiAlcyIsIGUpCisKKyAgICAgIGlmIHNlbGYubWF4X21lbW9yeV91c2FnZSA+PSBtZW1vcnlfdGhyZXNob2xkOgorICAgICAgICBzZWxmLl9zZW5kX2Vycm9yX2V2ZW50X3RvX2NsZWFyY3V0KAorICAgICAgICAgICAgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LktJTExFRF9EVUVfVE9fRVhDRUVERURfTUVNT1JZX1VTQUdFCisgICAgICAgICkKKyAgICAgICAgbG9nZ2luZy5lcnJvcigKKyAgICAgICAgICAgICJEYWVtb24gcHJvY2VzcyBpcyBjb25zdW1pbmcgdG9vIG11Y2ggbWVtb3J5LCByZWJvb3RpbmcuLi4iCisgICAgICAgICkKKyAgICAgICAgc2VsZi5yZWJvb3QoKQorCisgICAgICBpZiBzZWxmLm1heF9jcHVfdXNhZ2UgPj0gY3B1X3RocmVzaG9sZDoKKyAgICAgICAgc2VsZi5fc2VuZF9lcnJvcl9ldmVudF90b19jbGVhcmN1dCgKKyAgICAgICAgICAgIGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5LSUxMRURfRFVFX1RPX0VYQ0VFREVEX0NQVV9VU0FHRQorICAgICAgICApCisgICAgICAgIGxvZ2dpbmcuZXJyb3IoIkRhZW1vbiBwcm9jZXNzIGlzIGNvbnN1bWluZyB0b28gbXVjaCBjcHUsIGtpbGxpbmcuLi4iKQorICAgICAgICBzZWxmLl90ZXJtaW5hdGVfcHJvY2VzcyhzZWxmLmRhZW1vbl9wcm9jZXNzLnBpZCkKKworICAgIGxvZ2dpbmcuaW5mbygKKyAgICAgICAgIkRhZW1vbiBwcm9jZXNzICVkIHRlcm1pbmF0ZWQuIE1heCBtZW1vcnkgdXNhZ2U6ICVmLCBNYXggY3B1IgorICAgICAgICAiIHVzYWdlOiAlZi4iLAorICAgICAgICBzZWxmLmRhZW1vbl9wcm9jZXNzLnBpZCwKKyAgICAgICAgc2VsZi5tYXhfbWVtb3J5X3VzYWdlLAorICAgICAgICBzZWxmLm1heF9jcHVfdXNhZ2UsCisgICAgKQorCisgIGRlZiBzdG9wKHNlbGYpOgorICAgICIiIlN0b3BzIHRoZSBkYWVtb24gcHJvY2VzcyBhbmQgcmVtb3ZlcyB0aGUgcGlkZmlsZS4iIiIKKworICAgIGxvZ2dpbmcuaW5mbygiaW4gZGFlbW9uIG1hbmFnZXIgY2xlYW51cC4iKQorICAgIHRyeToKKyAgICAgIGlmIHNlbGYuZGFlbW9uX3Byb2Nlc3M6CisgICAgICAgICMgVGhlIGRhZW1vbiBwcm9jZXNzIG1pZ2h0IGFscmVhZHkgaW4gdGVybWluYXRpb24gcHJvY2VzcywKKyAgICAgICAgIyB3YWl0IHNvbWUgdGltZSBiZWZvcmUga2lsbCBpdCBleHBsaWNpdGx5LgorICAgICAgICBzZWxmLl93YWl0X2Zvcl9wcm9jZXNzX3Rlcm1pbmF0ZShzZWxmLmRhZW1vbl9wcm9jZXNzLnBpZCwgMSkKKyAgICAgICAgaWYgc2VsZi5kYWVtb25fcHJvY2Vzcy5pc19hbGl2ZSgpOgorICAgICAgICAgIHNlbGYuX3Rlcm1pbmF0ZV9wcm9jZXNzKHNlbGYuZGFlbW9uX3Byb2Nlc3MucGlkKQorICAgICAgc2VsZi5fcmVtb3ZlX3BpZGZpbGUoc2VsZi5waWQpCisgICAgICBsb2dnaW5nLmluZm8oIlN1Y2Nlc3NmdWxseSBzdG9wcGVkIGRhZW1vbiBtYW5hZ2VyLiIpCisgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgbG9nZ2luZy5leGNlcHRpb24oIkZhaWxlZCB0byBzdG9wIGRhZW1vbiBtYW5hZ2VyIHdpdGggZXJyb3IgJXMiLCBlKQorICAgICAgc2VsZi5fc2VuZF9lcnJvcl9ldmVudF90b19jbGVhcmN1dCgKKyAgICAgICAgICBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuRkFJTEVEX1RPX1NUT1BfRURJVF9NT05JVE9SCisgICAgICApCisgICAgICBzeXMuZXhpdCgxKQorICAgIGZpbmFsbHk6CisgICAgICBzZWxmLmNjbGllbnQuZmx1c2hfZXZlbnRzKCkKKworICBkZWYgcmVib290KHNlbGYpOgorICAgICIiIlJlYm9vdHMgdGhlIGN1cnJlbnQgcHJvY2Vzcy4KKworICAgIFN0b3BzIHRoZSBjdXJyZW50IGRhZW1vbiBtYW5hZ2VyIGFuZCByZWJvb3RzIHRoZSBlbnRpcmUgcHJvY2VzcyBiYXNlZCBvbgorICAgIHRoZSBiaW5hcnkgZmlsZS4gRXhpdHMgZGlyZWN0bHkgSWYgdGhlIGJpbmFyeSBmaWxlIG5vIGxvbmdlciBleGlzdHMuCisgICAgIiIiCisgICAgbG9nZ2luZy5pbmZvKCJSZWJvb3RpbmcgcHJvY2VzcyBiYXNlZCBvbiBiaW5hcnkgJXMuIiwgc2VsZi5iaW5hcnlfcGF0aCkKKworICAgICMgU3RvcCB0aGUgY3VycmVudCBkYWVtb24gbWFuYWdlciBmaXJzdC4KKyAgICBzZWxmLnN0b3AoKQorCisgICAgIyBJZiB0aGUgYmluYXJ5IG5vIGxvbmdlciBleGlzdHMsIGV4aXQgZGlyZWN0bHkuCisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYuYmluYXJ5X3BhdGgpOgorICAgICAgbG9nZ2luZy5pbmZvKCJiaW5hcnkgJXMgbm8gbG9uZ2VyIGV4aXN0cywgZXhpdGluZy4iLCBzZWxmLmJpbmFyeV9wYXRoKQorICAgICAgc3lzLmV4aXQoMCkKKworICAgIHRyeToKKyAgICAgIG9zLmV4ZWN2KHNlbGYuYmluYXJ5X3BhdGgsIHN5cy5hcmd2KQorICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICBsb2dnaW5nLmV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYm9vdCBwcm9jZXNzIHdpdGggZXJyb3I6ICVzLiIsIGUpCisgICAgICBzZWxmLl9zZW5kX2Vycm9yX2V2ZW50X3RvX2NsZWFyY3V0KAorICAgICAgICAgIGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5GQUlMRURfVE9fUkVCT09UX0VESVRfTU9OSVRPUgorICAgICAgKQorICAgICAgc3lzLmV4aXQoMSkgICMgSW5kaWNhdGUgYW4gZXJyb3Igb2NjdXJyZWQKKworICBkZWYgY2xlYW51cChzZWxmKToKKyAgICAiIiJXaXBlcyBvdXQgYWxsIGVkaXQgbW9uaXRvciBpbnN0YW5jZXMgaW4gdGhlIHN5c3RlbS4KKworICAgIFN0b3BzIGFsbCB0aGUgZXhpc3RpbmcgZWRpdCBtb25pdG9yIGluc3RhbmNlcyBhbmQgcGxhY2UgYSBibG9jayBzaWduCisgICAgdG8gcHJldmVudCBhbnkgZWRpdCBtb25pdG9yIHByb2Nlc3MgdG8gc3RhcnQuIFRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZAorICAgIGluIGVtZXJnZW5jeSBjYXNlIHdoZW4gdGhlcmUncyBzb21ldGhpbmcgZ29lcyB3cm9uZyB3aXRoIHRoZSBlZGl0IG1vbml0b3IKKyAgICB0aGF0IHJlcXVpcmVzIGltbWVkaWF0ZSBjbGVhbnVwIHRvIHByZXZlbnQgZGFtYW5nZXIgdG8gdGhlIHN5c3RlbS4KKyAgICAiIiIKKyAgICBsb2dnaW5nLmRlYnVnKCJTdGFydCBjbGVhbmluZyB1cCBhbGwgZXhpc3RpbmcgaW5zdGFuY2VzLiIpCisgICAgc2VsZi5fc2VuZF9lcnJvcl9ldmVudF90b19jbGVhcmN1dChlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuRk9SQ0VfQ0xFQU5VUCkKKworICAgIHRyeToKKyAgICAgICMgRmlyc3QgcGxhY2VzIGEgYmxvY2sgc2lnbiB0byBwcmV2ZW50IGFueSBlZGl0IG1vbml0b3IgcHJvY2VzcyB0byBzdGFydC4KKyAgICAgIHNlbGYuYmxvY2tfc2lnbi50b3VjaCgpCisgICAgZXhjZXB0IChGaWxlTm90Rm91bmRFcnJvciwgUGVybWlzc2lvbkVycm9yLCBPU0Vycm9yKToKKyAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKCJGYWlsZWQgdG8gcGxhY2UgdGhlIGJsb2NrIHNpZ24iKQorCisgICAgIyBGaW5kcyBhbmQga2lsbHMgYWxsIHRoZSBleGlzdGluZyBpbnN0YW5jZXMgb2YgZWRpdCBtb25pdG9yLgorICAgIGV4aXN0aW5nX2luc3RhbmNlc19waWRzID0gc2VsZi5fZmluZF9hbGxfaW5zdGFuY2VzX3BpZHMoKQorICAgIGZvciBwaWQgaW4gZXhpc3RpbmdfaW5zdGFuY2VzX3BpZHM6CisgICAgICBsb2dnaW5nLmluZm8oCisgICAgICAgICAgIkZvdW5kIGV4aXN0aW5nIGVkaXQgbW9uaXRvciBpbnN0YW5jZSB3aXRoIHBpZCAlZCwga2lsbGluZy4uLiIsIHBpZAorICAgICAgKQorICAgICAgdHJ5OgorICAgICAgICBzZWxmLl90ZXJtaW5hdGVfcHJvY2VzcyhwaWQpCisgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICBsb2dnaW5nLmV4Y2VwdGlvbigiRmFpbGVkIHRvIHRlcm1pbmF0ZSBwcm9jZXNzICVkIiwgcGlkKQorCisgIGRlZiBfc3RvcF9hbnlfZXhpc3RpbmdfaW5zdGFuY2Uoc2VsZik6CisgICAgaWYgbm90IHNlbGYucGlkX2ZpbGVfcGF0aC5leGlzdHMoKToKKyAgICAgIGxvZ2dpbmcuZGVidWcoIk5vIGV4aXN0aW5nIGluc3RhbmNlcy4iKQorICAgICAgcmV0dXJuCisKKyAgICBleF9waWQgPSBzZWxmLl9yZWFkX3BpZF9mcm9tX3BpZGZpbGUoKQorCisgICAgaWYgZXhfcGlkOgorICAgICAgbG9nZ2luZy5pbmZvKCJGb3VuZCBhbm90aGVyIGluc3RhbmNlIHdpdGggcGlkICVkLiIsIGV4X3BpZCkKKyAgICAgIHNlbGYuX3Rlcm1pbmF0ZV9wcm9jZXNzKGV4X3BpZCkKKyAgICAgIHNlbGYuX3JlbW92ZV9waWRmaWxlKGV4X3BpZCkKKworICBkZWYgX3JlYWRfcGlkX2Zyb21fcGlkZmlsZShzZWxmKSAtPiBpbnQgfCBOb25lOgorICAgIHRyeToKKyAgICAgIHdpdGggb3BlbihzZWxmLnBpZF9maWxlX3BhdGgsICJyIikgYXMgZjoKKyAgICAgICAgcmV0dXJuIGludChmLnJlYWQoKS5zdHJpcCgpKQorICAgIGV4Y2VwdCBGaWxlTm90Rm91bmRFcnJvciBhcyBlOgorICAgICAgbG9nZ2luZy53YXJuaW5nKCJwaWRmaWxlICVzIGRvZXMgbm90IGV4aXN0LiIsIHNlbGYucGlkX2ZpbGVfcGF0aCkKKyAgICAgIHJldHVybiBOb25lCisKKyAgZGVmIF93cml0ZV9waWRfdG9fcGlkZmlsZShzZWxmKToKKyAgICAiIiJDcmVhdGVzIGEgcGlkZmlsZSBhbmQgd3JpdGVzIHRoZSBjdXJyZW50IHBpZCB0byB0aGUgZmlsZS4KKworICAgIFJhaXNlIEZpbGVFeGlzdHNFcnJvciBpZiB0aGUgcGlkZmlsZSBhbHJlYWR5IGV4aXN0cy4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAjIFVzZSB0aGUgJ3gnIG1vZGUgdG8gb3BlbiB0aGUgZmlsZSBmb3IgZXhjbHVzaXZlIGNyZWF0aW9uCisgICAgICB3aXRoIG9wZW4oc2VsZi5waWRfZmlsZV9wYXRoLCAieCIpIGFzIGY6CisgICAgICAgIGYud3JpdGUoZiJ7c2VsZi5waWR9IikKKyAgICBleGNlcHQgRmlsZUV4aXN0c0Vycm9yIGFzIGU6CisgICAgICAjIFRoaXMgY291bGQgYmUgY2F1c2VkIGR1ZSB0byByYWNlIGNvbmRpdGlvbiB0aGF0IGEgdXNlciBpcyB0cnlpbmcKKyAgICAgICMgdG8gc3RhcnQgdHdvIGVkaXQgbW9uaXRvcnMgYXQgdGhlIHNhbWUgdGltZS4gT3IgYmVjYXVzZSB0aGVyZSBpcworICAgICAgIyBhbHJlYWR5IGFuIGV4aXN0aW5nIGVkaXQgbW9uaXRvciBydW5uaW5nIGFuZCB3ZSBjYW4gbm90IGtpbGwgaXQKKyAgICAgICMgZm9yIHNvbWUgcmVhc29uLgorICAgICAgbG9nZ2luZy5leGNlcHRpb24oInBpZGZpbGUgJXMgYWxyZWFkeSBleGlzdHMuIiwgc2VsZi5waWRfZmlsZV9wYXRoKQorICAgICAgcmFpc2UgZQorCisgIGRlZiBfc3RhcnRfZGFlbW9uX3Byb2Nlc3Moc2VsZik6CisgICAgIiIiU3RhcnRzIGEgc3VicHJvY2VzcyB0byBydW4gdGhlIGRhZW1vbi4iIiIKKyAgICBwID0gbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3MoCisgICAgICAgIHRhcmdldD1zZWxmLmRhZW1vbl90YXJnZXQsIGFyZ3M9c2VsZi5kYWVtb25fYXJncworICAgICkKKyAgICBwLmRhZW1vbiA9IFRydWUKKyAgICBwLnN0YXJ0KCkKKworICAgIGxvZ2dpbmcuaW5mbygiU3RhcnQgc3VicHJvY2VzcyB3aXRoIFBJRCAlZCIsIHAucGlkKQorICAgIHNlbGYuZGFlbW9uX3Byb2Nlc3MgPSBwCisKKyAgZGVmIF90ZXJtaW5hdGVfcHJvY2VzcygKKyAgICAgIHNlbGYsIHBpZDogaW50LCB0aW1lb3V0OiBpbnQgPSBERUZBVUxUX1BST0NFU1NfVEVSTUlOQVRJT05fVElNRU9VVF9TRUNPTkRTCisgICk6CisgICAgIiIiVGVybWluYXRlcyBhIHByb2Nlc3Mgd2l0aCBnaXZlbiBwaWQuCisKKyAgICBJdCBmaXJzdCBzZW5kcyBhIFNJR1RFUk0gdG8gdGhlIHByb2Nlc3MgdG8gYWxsb3cgaXQgZm9yIHByb3BlcgorICAgIHRlcm1pbmF0aW9uIHdpdGggYSB0aW1lb3V0LiBJZiB0aGUgcHJvY2VzcyBpcyBub3QgdGVybWluYXRlZCB3aXRoaW4KKyAgICB0aGUgdGltZW91dCwga2lsbHMgaXQgZm9yY2VmdWxseS4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICBvcy5raWxsKHBpZCwgc2lnbmFsLlNJR1RFUk0pCisgICAgICBpZiBub3Qgc2VsZi5fd2FpdF9mb3JfcHJvY2Vzc190ZXJtaW5hdGUocGlkLCB0aW1lb3V0KToKKyAgICAgICAgbG9nZ2luZy53YXJuaW5nKAorICAgICAgICAgICAgIlByb2Nlc3MgJWQgbm90IHRlcm1pbmF0ZWQgd2l0aGluIHRpbWVvdXQsIHRyeSBmb3JjZSBraWxsIiwgcGlkCisgICAgICAgICkKKyAgICAgICAgb3Mua2lsbChwaWQsIHNpZ25hbC5TSUdLSUxMKQorICAgIGV4Y2VwdCBQcm9jZXNzTG9va3VwRXJyb3I6CisgICAgICBsb2dnaW5nLmluZm8oIlByb2Nlc3Mgd2l0aCBQSUQgJWQgbm90IGZvdW5kIChhbHJlYWR5IHRlcm1pbmF0ZWQpIiwgcGlkKQorCisgIGRlZiBfd2FpdF9mb3JfcHJvY2Vzc190ZXJtaW5hdGUoc2VsZiwgcGlkOiBpbnQsIHRpbWVvdXQ6IGludCkgLT4gYm9vbDoKKyAgICBzdGFydF90aW1lID0gdGltZS50aW1lKCkKKworICAgIHdoaWxlIHRpbWUudGltZSgpIDwgc3RhcnRfdGltZSArIHRpbWVvdXQ6CisgICAgICBpZiBub3Qgc2VsZi5faXNfcHJvY2Vzc19hbGl2ZShwaWQpOgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgdGltZS5zbGVlcCgxKQorCisgICAgbG9nZ2luZy5lcnJvcigiUHJvY2VzcyAlZCBub3QgdGVybWluYXRlZCB3aXRoaW4gJWQgc2Vjb25kcy4iLCBwaWQsIHRpbWVvdXQpCisgICAgcmV0dXJuIEZhbHNlCisKKyAgZGVmIF9pc19wcm9jZXNzX2FsaXZlKHNlbGYsIHBpZDogaW50KSAtPiBib29sOgorICAgIHRyeToKKyAgICAgIG91dHB1dCA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KAorICAgICAgICAgIFsicHMiLCAiLXAiLCBzdHIocGlkKSwgIi1vIiwgInN0YXRlPSJdLCB0ZXh0PVRydWUKKyAgICAgICkuc3RyaXAoKQorICAgICAgc3RhdGUgPSBvdXRwdXQuc3BsaXQoKVswXQorICAgICAgcmV0dXJuIHN0YXRlICE9ICJaIiAgIyBDaGVjayBpZiB0aGUgc3RhdGUgaXMgbm90ICdaJyAoem9tYmllKQorICAgIGV4Y2VwdCBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcjoKKyAgICAgICMgUHJvY2VzcyBub3QgZm91bmQgKGFscmVhZHkgZGVhZCkuCisgICAgICByZXR1cm4gRmFsc2UKKyAgICBleGNlcHQgKEZpbGVOb3RGb3VuZEVycm9yLCBPU0Vycm9yLCBWYWx1ZUVycm9yKSBhcyBlOgorICAgICAgbG9nZ2luZy53YXJuaW5nKAorICAgICAgICAgICJVbmFibGUgdG8gY2hlY2sgdGhlIHN0YXR1cyBmb3IgcHJvY2VzcyAlZCB3aXRoIGVycm9yOiAlcy4iLCBwaWQsIGUKKyAgICAgICkKKyAgICAgIHJldHVybiBUcnVlCisKKyAgZGVmIF9yZW1vdmVfcGlkZmlsZShzZWxmLCBleHBlY3RlZF9waWQ6IGludCk6CisgICAgcmVjb3JkZWRfcGlkID0gc2VsZi5fcmVhZF9waWRfZnJvbV9waWRmaWxlKCkKKworICAgIGlmIHJlY29yZGVkX3BpZCBpcyBOb25lOgorICAgICAgbG9nZ2luZy5pbmZvKCJwaWQgZmlsZSAlcyBhbHJlYWR5IHJlbW92ZWQuIiwgc2VsZi5waWRfZmlsZV9wYXRoKQorICAgICAgcmV0dXJuCisKKyAgICBpZiByZWNvcmRlZF9waWQgIT0gZXhwZWN0ZWRfcGlkOgorICAgICAgbG9nZ2luZy53YXJuaW5nKAorICAgICAgICAgICJwaWQgZmlsZSBjb250YWlucyBwaWQgZnJvbSBhIGRpZmZlcmVudCBwcm9jZXNzLCBleHBlY3RlZCBwaWQ6ICVkLCIKKyAgICAgICAgICAiIGFjdHVhbCBwaWQ6ICVkLiIsCisgICAgICAgICAgZXhwZWN0ZWRfcGlkLAorICAgICAgICAgIHJlY29yZGVkX3BpZCwKKyAgICAgICkKKyAgICAgIHJldHVybgorCisgICAgbG9nZ2luZy5kZWJ1ZygicmVtb3ZpbmcgcGlkZmlsZSB3cml0dGVuIGJ5IHByb2Nlc3MgJXMiLCBleHBlY3RlZF9waWQpCisgICAgdHJ5OgorICAgICAgb3MucmVtb3ZlKHNlbGYucGlkX2ZpbGVfcGF0aCkKKyAgICBleGNlcHQgRmlsZU5vdEZvdW5kRXJyb3I6CisgICAgICBsb2dnaW5nLmluZm8oInBpZCBmaWxlICVzIGFscmVhZHkgcmVtb3ZlZC4iLCBzZWxmLnBpZF9maWxlX3BhdGgpCisKKyAgZGVmIF9nZXRfcGlkX2ZpbGVfcGF0aChzZWxmLCBwaWRfZmlsZV9kaXI6IHBhdGhsaWIuUGF0aCkgLT4gcGF0aGxpYi5QYXRoOgorICAgICIiIkdlbmVyYXRlcyB0aGUgcGF0aCB0byBzdG9yZSB0aGUgcGlkZmlsZS4KKworICAgIFRoZSBmaWxlIHBhdGggc2hvdWxkIGhhdmUgdGhlIGZvcm1hdCBvZiAiL3RtcC9lZGl0X21vbml0b3IveHh4eC5sb2NrIgorICAgIHdoZXJlIHh4eHggaXMgYSBoYXNoZWQgdmFsdWUgYmFzZWQgb24gdGhlIGJpbmFyeSBwYXRoIHRoYXQgc3RhcnRzIHRoZQorICAgIHByb2Nlc3MuCisgICAgIiIiCisgICAgaGFzaF9vYmplY3QgPSBoYXNobGliLnNoYTI1NigpCisgICAgaGFzaF9vYmplY3QudXBkYXRlKHNlbGYuYmluYXJ5X3BhdGguZW5jb2RlKCJ1dGYtOCIpKQorICAgIHBpZF9maWxlX3BhdGggPSBwaWRfZmlsZV9kaXIuam9pbnBhdGgoaGFzaF9vYmplY3QuaGV4ZGlnZXN0KCkgKyAiLmxvY2siKQorICAgIGxvZ2dpbmcuaW5mbygicGlkX2ZpbGVfcGF0aDogJXMiLCBwaWRfZmlsZV9wYXRoKQorCisgICAgcmV0dXJuIHBpZF9maWxlX3BhdGgKKworICBkZWYgX2dldF9wcm9jZXNzX21lbW9yeV9wZXJjZW50KHNlbGYsIHBpZDogaW50KSAtPiBmbG9hdDoKKyAgICB3aXRoIG9wZW4oZiIvcHJvYy97cGlkfS9zdGF0IiwgInIiKSBhcyBmOgorICAgICAgc3RhdF9kYXRhID0gZi5yZWFkbGluZSgpLnNwbGl0KCkKKyAgICAgICMgUlNTIGlzIHRoZSAyNHRoIGZpZWxkIGluIC9wcm9jL1twaWRdL3N0YXQKKyAgICAgIHJzc19wYWdlcyA9IGludChzdGF0X2RhdGFbMjNdKQorICAgICAgcHJvY2Vzc19tZW1vcnkgPSByc3NfcGFnZXMgKiA0ICogMTAyNCAgIyBDb252ZXJ0IHRvIGJ5dGVzCisKKyAgICByZXR1cm4gKAorICAgICAgICBwcm9jZXNzX21lbW9yeSAvIHNlbGYudG90YWxfbWVtb3J5X3NpemUKKyAgICAgICAgaWYgc2VsZi50b3RhbF9tZW1vcnlfc2l6ZQorICAgICAgICBlbHNlIDAuMAorICAgICkKKworICBkZWYgX2dldF9wcm9jZXNzX2NwdV9wZXJjZW50KHNlbGYsIHBpZDogaW50LCBpbnRlcnZhbDogaW50ID0gMSkgLT4gZmxvYXQ6CisgICAgdG90YWxfc3RhcnRfdGltZSA9IHNlbGYuX2dldF90b3RhbF9jcHVfdGltZShwaWQpCisgICAgd2l0aCBvcGVuKCIvcHJvYy91cHRpbWUiLCAiciIpIGFzIGY6CisgICAgICB1cHRpbWVfc3RhcnQgPSBmbG9hdChmLnJlYWRsaW5lKCkuc3BsaXQoKVswXSkKKworICAgIHRpbWUuc2xlZXAoaW50ZXJ2YWwpCisKKyAgICB0b3RhbF9lbmRfdGltZSA9IHNlbGYuX2dldF90b3RhbF9jcHVfdGltZShwaWQpCisgICAgd2l0aCBvcGVuKCIvcHJvYy91cHRpbWUiLCAiciIpIGFzIGY6CisgICAgICB1cHRpbWVfZW5kID0gZmxvYXQoZi5yZWFkbGluZSgpLnNwbGl0KClbMF0pCisKKyAgICByZXR1cm4gKAorICAgICAgICAodG90YWxfZW5kX3RpbWUgLSB0b3RhbF9zdGFydF90aW1lKSAvICh1cHRpbWVfZW5kIC0gdXB0aW1lX3N0YXJ0KSAqIDEwMAorICAgICkKKworICBkZWYgX2dldF90b3RhbF9jcHVfdGltZShzZWxmLCBwaWQ6IGludCkgLT4gZmxvYXQ6CisgICAgd2l0aCBvcGVuKGYiL3Byb2Mve3N0cihwaWQpfS9zdGF0IiwgInIiKSBhcyBmOgorICAgICAgc3RhdHMgPSBmLnJlYWRsaW5lKCkuc3BsaXQoKQorICAgICAgIyB1dGltZSBpcyB0aGUgMTR0aCBmaWVsZCBpbiAvcHJvYy9bcGlkXS9zdGF0IG1lYXN1cmVkIGluIGNsb2NrIHRpY2tzLgorICAgICAgdXRpbWUgPSBpbnQoc3RhdHNbMTNdKQorICAgICAgIyBzdGltZSBpcyB0aGUgMTV0aCBmaWVsZCBpbiAvcHJvYy9bcGlkXS9zdGF0IG1lYXN1cmVkIGluIGNsb2NrIHRpY2tzLgorICAgICAgc3RpbWUgPSBpbnQoc3RhdHNbMTRdKQorICAgICAgcmV0dXJuICh1dGltZSArIHN0aW1lKSAvIG9zLnN5c2NvbmYob3Muc3lzY29uZl9uYW1lc1siU0NfQ0xLX1RDSyJdKQorCisgIGRlZiBfZmluZF9hbGxfaW5zdGFuY2VzX3BpZHMoc2VsZikgLT4gbGlzdFtpbnRdOgorICAgIHBpZHMgPSBbXQorCisgICAgdHJ5OgorICAgICAgb3V0cHV0ID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoWyJwcyIsICItZWYiLCAiLS1uby1oZWFkZXJzIl0sIHRleHQ9VHJ1ZSkKKyAgICAgIGZvciBsaW5lIGluIG91dHB1dC5zcGxpdGxpbmVzKCk6CisgICAgICAgIHBhcnRzID0gbGluZS5zcGxpdCgpCisgICAgICAgIHByb2Nlc3NfcGF0aCA9IHBhcnRzWzddCisgICAgICAgIGlmIHBhdGhsaWIuUGF0aChwcm9jZXNzX3BhdGgpLm5hbWUgPT0gImVkaXRfbW9uaXRvciI6CisgICAgICAgICAgcGlkID0gaW50KHBhcnRzWzFdKQorICAgICAgICAgIGlmIHBpZCAhPSBzZWxmLnBpZDogICMgZXhjbHVkZSB0aGUgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICBwaWRzLmFwcGVuZChwaWQpCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKAorICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHBpZHMgb2YgZXhpc3RpbmcgZWRpdCBtb25pdG9ycyBmcm9tIHBzIGNvbW1hbmQuIgorICAgICAgKQorCisgICAgcmV0dXJuIHBpZHMKKworICBkZWYgX3NlbmRfZXJyb3JfZXZlbnRfdG9fY2xlYXJjdXQoc2VsZiwgZXJyb3JfdHlwZSk6CisgICAgZWRpdF9tb25pdG9yX2Vycm9yX2V2ZW50X3Byb3RvID0gZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50KAorICAgICAgICB1c2VyX25hbWU9c2VsZi51c2VyX25hbWUsCisgICAgICAgIGhvc3RfbmFtZT1zZWxmLmhvc3RfbmFtZSwKKyAgICAgICAgc291cmNlX3Jvb3Q9c2VsZi5zb3VyY2Vfcm9vdCwKKyAgICApCisgICAgZWRpdF9tb25pdG9yX2Vycm9yX2V2ZW50X3Byb3RvLmVkaXRfbW9uaXRvcl9lcnJvcl9ldmVudC5Db3B5RnJvbSgKKyAgICAgICAgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LkVkaXRNb25pdG9yRXJyb3JFdmVudChlcnJvcl90eXBlPWVycm9yX3R5cGUpCisgICAgKQorICAgIGxvZ19ldmVudCA9IGNsaWVudGFuYWx5dGljc19wYjIuTG9nRXZlbnQoCisgICAgICAgIGV2ZW50X3RpbWVfbXM9aW50KHRpbWUudGltZSgpICogMTAwMCksCisgICAgICAgIHNvdXJjZV9leHRlbnNpb249ZWRpdF9tb25pdG9yX2Vycm9yX2V2ZW50X3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCksCisgICAgKQorICAgIHNlbGYuY2NsaWVudC5sb2cobG9nX2V2ZW50KQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWRpdF9tb25pdG9yL2RhZW1vbl9tYW5hZ2VyX3Rlc3QucHkgYi90b29scy9lZGl0X21vbml0b3IvZGFlbW9uX21hbmFnZXJfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTI4OTY1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZWRpdF9tb25pdG9yL2RhZW1vbl9tYW5hZ2VyX3Rlc3QucHkKQEAgLTAsMCArMSw1MjQgQEAKKyMgQ29weXJpZ2h0IDIwMjQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIiIiVW5pdHRlc3RzIGZvciBEYWVtb25NYW5hZ2VyLiIiIgorCitpbXBvcnQgZmNudGwKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBwYXRobGliCitpbXBvcnQgc2lnbmFsCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdGltZQoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHVuaXR0ZXN0IGltcG9ydCBtb2NrCitmcm9tIGVkaXRfbW9uaXRvciBpbXBvcnQgZGFlbW9uX21hbmFnZXIKK2Zyb20gcHJvdG8gaW1wb3J0IGVkaXRfZXZlbnRfcGIyCisKKworVEVTVF9CSU5BUllfRklMRSA9ICcvcGF0aC90by90ZXN0X2JpbmFyeScKK1RFU1RfUElEX0ZJTEVfUEFUSCA9ICgKKyAgICAnNTg3MjM5YzJkMTA1MGFmZGY1NDUxMmUyZDc5OWYzYjkyOWY4NmI0MzU3NWViM2M3YjRiYWIxMDVkZDliZDI1ZS5sb2NrJworKQorCisKK2RlZiBzaW1wbGVfZGFlbW9uKG91dHB1dF9maWxlKToKKyAgd2l0aCBvcGVuKG91dHB1dF9maWxlLCAndycpIGFzIGY6CisgICAgZi53cml0ZSgncnVubmluZyBkYWVtb24gdGFyZ2V0JykKKworCitkZWYgbG9uZ19ydW5uaW5nX2RhZW1vbigpOgorICB3aGlsZSBUcnVlOgorICAgIHRpbWUuc2xlZXAoMSkKKworCitkZWYgbWVtb3J5X2NvbnN1bWVfZGFlbW9uX3RhcmdldChzaXplX21iKToKKyAgdHJ5OgorICAgIHNpemVfYnl0ZXMgPSBzaXplX21iICogMTAyNCAqIDEwMjQKKyAgICBkdW1teV9kYXRhID0gYnl0ZWFycmF5KHNpemVfYnl0ZXMpCisgICAgdGltZS5zbGVlcCgxMCkKKyAgZXhjZXB0IE1lbW9yeUVycm9yOgorICAgIHByaW50KGYnUHJvY2VzcyBmYWlsZWQgdG8gYWxsb2NhdGUge3NpemVfbWJ9IE1CIG9mIG1lbW9yeS4nKQorCisKK2RlZiBjcHVfY29uc3VtZV9kYWVtb25fdGFyZ2V0KHRhcmdldF91c2FnZV9wZXJjZW50KToKKyAgd2hpbGUgVHJ1ZToKKyAgICBzdGFydF90aW1lID0gdGltZS50aW1lKCkKKyAgICB3aGlsZSB0aW1lLnRpbWUoKSAtIHN0YXJ0X3RpbWUgPCB0YXJnZXRfdXNhZ2VfcGVyY2VudCAvIDEwMDoKKyAgICAgIHBhc3MgICMgQnVzeSBsb29wIHRvIGNvbnN1bWUgQ1BVCisKKyAgICAjIFNsZWVwIHRvIHJlZHVjZSBDUFUgdXNhZ2UKKyAgICB0aW1lLnNsZWVwKDEgLSB0YXJnZXRfdXNhZ2VfcGVyY2VudCAvIDEwMCkKKworCitjbGFzcyBEYWVtb25NYW5hZ2VyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgQGNsYXNzbWV0aG9kCisgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgc3VwZXIoKS5zZXRVcENsYXNzKCkKKyAgICAjIENvbmZpZ3VyZSB0byBwcmludCBsb2dnaW5nIHRvIHN0ZG91dC4KKyAgICBsb2dnaW5nLmJhc2ljQ29uZmlnKGZpbGVuYW1lPU5vbmUsIGxldmVsPWxvZ2dpbmcuREVCVUcpCisgICAgY29uc29sZSA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcihzeXMuc3Rkb3V0KQorICAgIGxvZ2dpbmcuZ2V0TG9nZ2VyKCcnKS5hZGRIYW5kbGVyKGNvbnNvbGUpCisKKyAgZGVmIHNldFVwKHNlbGYpOgorICAgIHN1cGVyKCkuc2V0VXAoKQorICAgIHNlbGYub3JpZ2luYWxfdGVtcGRpciA9IHRlbXBmaWxlLnRlbXBkaXIKKyAgICBzZWxmLndvcmtpbmdfZGlyID0gdGVtcGZpbGUuVGVtcG9yYXJ5RGlyZWN0b3J5KCkKKyAgICAjIFNldHMgdGhlIHRlbXBkaXIgdW5kZXIgdGhlIHdvcmtpbmcgZGlyIHNvIGFueSB0ZW1wIGZpbGVzIGNyZWF0ZWQgZHVyaW5nCisgICAgIyB0ZXN0cyB3aWxsIGJlIGNsZWFuZWQuCisgICAgdGVtcGZpbGUudGVtcGRpciA9IHNlbGYud29ya2luZ19kaXIubmFtZQorICAgIHNlbGYucGF0Y2ggPSBtb2NrLnBhdGNoLmRpY3QoCisgICAgICAgIG9zLmVudmlyb24sIHsnRU5BQkxFX0FORFJPSURfRURJVF9NT05JVE9SJzogJ3RydWUnfQorICAgICkKKyAgICBzZWxmLnBhdGNoLnN0YXJ0KCkKKworICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgIyBDbGVhbnMgdXAgYW55IGNoaWxkIHByb2Nlc3NlcyBsZWZ0IGJ5IHRoZSB0ZXN0cy4KKyAgICBzZWxmLl9jbGVhbnVwX2NoaWxkX3Byb2Nlc3NlcygpCisgICAgc2VsZi53b3JraW5nX2Rpci5jbGVhbnVwKCkKKyAgICAjIFJlc3RvcmVzIHRlbXBkaXIuCisgICAgdGVtcGZpbGUudGVtcGRpciA9IHNlbGYub3JpZ2luYWxfdGVtcGRpcgorICAgIHNlbGYucGF0Y2guc3RvcCgpCisgICAgc3VwZXIoKS50ZWFyRG93bigpCisKKyAgZGVmIHRlc3Rfc3RhcnRfc3VjY2Vzc193aXRoX25vX2V4aXN0aW5nX2luc3RhbmNlKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0X3J1bl9zaW1wbGVfZGFlbW9uX3N1Y2Nlc3MoKQorCisgIGRlZiB0ZXN0X3N0YXJ0X3N1Y2Nlc3Nfd2l0aF9leGlzdGluZ19pbnN0YW5jZV9ydW5uaW5nKHNlbGYpOgorICAgICMgQ3JlYXRlIGEgcnVubmluZyBkYWVtb24gc3VicHJvY2VzcworICAgIHAgPSBzZWxmLl9jcmVhdGVfZmFrZV9kZWFtb25fcHJvY2VzcygpCisKKyAgICBzZWxmLmFzc2VydF9ydW5fc2ltcGxlX2RhZW1vbl9zdWNjZXNzKCkKKyAgICBzZWxmLmFzc2VydF9ub19zdWJwcm9jZXNzX3J1bm5pbmcoKQorCisgIGRlZiB0ZXN0X3N0YXJ0X3N1Y2Nlc3Nfd2l0aF9leGlzdGluZ19pbnN0YW5jZV9hbHJlYWR5X2RlYWQoc2VsZik6CisgICAgIyBDcmVhdGUgYSBwaWRmaWxlIHdpdGggcGlkIHRoYXQgZG9lcyBub3QgZXhpc3QuCisgICAgcGlkX2ZpbGVfcGF0aF9kaXIgPSBwYXRobGliLlBhdGgoc2VsZi53b3JraW5nX2Rpci5uYW1lKS5qb2lucGF0aCgKKyAgICAgICAgJ2VkaXRfbW9uaXRvcicKKyAgICApCisgICAgcGlkX2ZpbGVfcGF0aF9kaXIubWtkaXIocGFyZW50cz1UcnVlLCBleGlzdF9vaz1UcnVlKQorICAgIHdpdGggb3BlbihwaWRfZmlsZV9wYXRoX2Rpci5qb2lucGF0aChURVNUX1BJRF9GSUxFX1BBVEgpLCAndycpIGFzIGY6CisgICAgICBmLndyaXRlKCcxMjM0NTYnKQorCisgICAgc2VsZi5hc3NlcnRfcnVuX3NpbXBsZV9kYWVtb25fc3VjY2VzcygpCisKKyAgZGVmIHRlc3Rfc3RhcnRfc3VjY2Vzc193aXRoX2V4aXN0aW5nX2luc3RhbmNlX2Zyb21fZGlmZmVyZW50X2JpbmFyeShzZWxmKToKKyAgICAjIEZpcnN0IHN0YXJ0IGFuIGluc3RhbmNlIGJhc2VkIG9uICJzb21lX2JpbmFyeV9wYXRoIgorICAgIGV4aXN0aW5nX2RtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcigKKyAgICAgICAgJ3NvbWVfYmluYXJ5X3BhdGgnLAorICAgICAgICBkYWVtb25fdGFyZ2V0PWxvbmdfcnVubmluZ19kYWVtb24sCisgICAgKQorICAgIGV4aXN0aW5nX2RtLnN0YXJ0KCkKKworICAgIHNlbGYuYXNzZXJ0X3J1bl9zaW1wbGVfZGFlbW9uX3N1Y2Nlc3MoKQorICAgIGV4aXN0aW5nX2RtLnN0b3AoKQorCisgIGRlZiB0ZXN0X3N0YXJ0X3JldHVybl9kaXJlY3RseV9pZl9ibG9ja19zaWduX2V4aXN0cyhzZWxmKToKKyAgICAjIENyZWF0ZXMgdGhlIGJsb2NrIHNpZ24uCisgICAgcGF0aGxpYi5QYXRoKHNlbGYud29ya2luZ19kaXIubmFtZSkuam9pbnBhdGgoCisgICAgICAgIGRhZW1vbl9tYW5hZ2VyLkJMT0NLX1NJR05fRklMRQorICAgICkudG91Y2goKQorCisgICAgZG0gPSBkYWVtb25fbWFuYWdlci5EYWVtb25NYW5hZ2VyKFRFU1RfQklOQVJZX0ZJTEUpCisgICAgZG0uc3RhcnQoKQorCisgICAgIyBWZXJpZnkgbm8gZGFlbW9uIHByb2Nlc3MgaXMgc3RhcnRlZC4KKyAgICBzZWxmLmFzc2VydElzTm9uZShkbS5kYWVtb25fcHJvY2VzcykKKworICBAbW9jay5wYXRjaC5kaWN0KAorICAgICAgb3MuZW52aXJvbiwgeydFTkFCTEVfQU5EUk9JRF9FRElUX01PTklUT1InOiAnZmFsc2UnfSwgY2xlYXI9VHJ1ZQorICApCisgIGRlZiB0ZXN0X3N0YXJ0X3JldHVybl9kaXJlY3RseV9pZl9kaXNhYmxlZChzZWxmKToKKyAgICBkbSA9IGRhZW1vbl9tYW5hZ2VyLkRhZW1vbk1hbmFnZXIoVEVTVF9CSU5BUllfRklMRSkKKyAgICBkbS5zdGFydCgpCisKKyAgICAjIFZlcmlmeSBubyBkYWVtb24gcHJvY2VzcyBpcyBzdGFydGVkLgorICAgIHNlbGYuYXNzZXJ0SXNOb25lKGRtLmRhZW1vbl9wcm9jZXNzKQorCisgIGRlZiB0ZXN0X3N0YXJ0X3JldHVybl9kaXJlY3RseV9pZl9pbl9jb2dfZW52KHNlbGYpOgorICAgIGRtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcigKKyAgICAgICAgJy9nb29nbGUvY29nL2Nsb3VkL3VzZXIvd29ya3NwYWNlL2VkaXRfbW9uaXRvcicKKyAgICApCisgICAgZG0uc3RhcnQoKQorCisgICAgIyBWZXJpZnkgbm8gZGFlbW9uIHByb2Nlc3MgaXMgc3RhcnRlZC4KKyAgICBzZWxmLmFzc2VydElzTm9uZShkbS5kYWVtb25fcHJvY2VzcykKKworICBkZWYgdGVzdF9zdGFydF9mYWlsZWRfb3RoZXJfaW5zdGFuY2VfaXNfc3RhcnRpbmcoc2VsZik6CisgICAgZiA9IG9wZW4oCisgICAgICAgIHBhdGhsaWIuUGF0aChzZWxmLndvcmtpbmdfZGlyLm5hbWUpLmpvaW5wYXRoKAorICAgICAgICAgICAgVEVTVF9QSURfRklMRV9QQVRIICsgJy5zZXR1cCcKKyAgICAgICAgKSwKKyAgICAgICAgJ3cnLAorICAgICkKKyAgICAjIEFjcXVpcmUgYW4gZXhjbHVzaXZlIGxvY2sKKyAgICBmY250bC5mbG9jayhmLCBmY250bC5MT0NLX0VYIHwgZmNudGwuTE9DS19OQikKKworICAgIGRtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcihURVNUX0JJTkFSWV9GSUxFKQorICAgIGRtLnN0YXJ0KCkKKworICAgICMgUmVsZWFzZSB0aGUgbG9jaworICAgIGZjbnRsLmZsb2NrKGYsIGZjbnRsLkxPQ0tfVU4pCisgICAgZi5jbG9zZSgpCisgICAgIyBWZXJpZnkgbm8gZGFlbW9uIHByb2Nlc3MgaXMgc3RhcnRlZC4KKyAgICBzZWxmLmFzc2VydElzTm9uZShkbS5kYWVtb25fcHJvY2VzcykKKworICBAbW9jay5wYXRjaCgnb3Mua2lsbCcpCisgIGRlZiB0ZXN0X3N0YXJ0X2ZhaWxlZF90b19raWxsX2V4aXN0aW5nX2luc3RhbmNlKHNlbGYsIG1vY2tfa2lsbCk6CisgICAgbW9ja19raWxsLnNpZGVfZWZmZWN0ID0gT1NFcnJvcignVW5rbm93biBPU0Vycm9yJykKKyAgICBwaWRfZmlsZV9wYXRoX2RpciA9IHBhdGhsaWIuUGF0aChzZWxmLndvcmtpbmdfZGlyLm5hbWUpLmpvaW5wYXRoKAorICAgICAgICAnZWRpdF9tb25pdG9yJworICAgICkKKyAgICBwaWRfZmlsZV9wYXRoX2Rpci5ta2RpcihwYXJlbnRzPVRydWUsIGV4aXN0X29rPVRydWUpCisgICAgd2l0aCBvcGVuKHBpZF9maWxlX3BhdGhfZGlyLmpvaW5wYXRoKFRFU1RfUElEX0ZJTEVfUEFUSCksICd3JykgYXMgZjoKKyAgICAgIGYud3JpdGUoJzEyMzQ1NicpCisKKyAgICBmYWtlX2NjbGllbnQgPSBGYWtlQ2xlYXJjdXRDbGllbnQoKQorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvcik6CisgICAgICBkbSA9IGRhZW1vbl9tYW5hZ2VyLkRhZW1vbk1hbmFnZXIoVEVTVF9CSU5BUllfRklMRSwgY2NsaWVudD1mYWtlX2NjbGllbnQpCisgICAgICBkbS5zdGFydCgpCisgICAgc2VsZi5fYXNzZXJ0X2Vycm9yX2V2ZW50X2xvZ2dlZCgKKyAgICAgICAgZmFrZV9jY2xpZW50LCBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuRkFJTEVEX1RPX1NUQVJUX0VESVRfTU9OSVRPUgorICAgICkKKworICBkZWYgdGVzdF9zdGFydF9mYWlsZWRfdG9fd3JpdGVfcGlkZmlsZShzZWxmKToKKyAgICBwaWRfZmlsZV9wYXRoX2RpciA9IHBhdGhsaWIuUGF0aChzZWxmLndvcmtpbmdfZGlyLm5hbWUpLmpvaW5wYXRoKAorICAgICAgICAnZWRpdF9tb25pdG9yJworICAgICkKKyAgICBwaWRfZmlsZV9wYXRoX2Rpci5ta2RpcihwYXJlbnRzPVRydWUsIGV4aXN0X29rPVRydWUpCisKKyAgICAjIE1ha2VzIHRoZSBkaXJlY3RvcnkgcmVhZC1vbmx5IHNvIHdyaXRlIHBpZGZpbGUgd2lsbCBmYWlsLgorICAgIG9zLmNobW9kKHBpZF9maWxlX3BhdGhfZGlyLCAwbzU1NSkKKworICAgIGZha2VfY2NsaWVudCA9IEZha2VDbGVhcmN1dENsaWVudCgpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhQZXJtaXNzaW9uRXJyb3IpOgorICAgICAgZG0gPSBkYWVtb25fbWFuYWdlci5EYWVtb25NYW5hZ2VyKFRFU1RfQklOQVJZX0ZJTEUsIGNjbGllbnQ9ZmFrZV9jY2xpZW50KQorICAgICAgZG0uc3RhcnQoKQorICAgIHNlbGYuX2Fzc2VydF9lcnJvcl9ldmVudF9sb2dnZWQoCisgICAgICAgIGZha2VfY2NsaWVudCwgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LkZBSUxFRF9UT19TVEFSVF9FRElUX01PTklUT1IKKyAgICApCisKKyAgZGVmIHRlc3Rfc3RhcnRfZmFpbGVkX3RvX3N0YXJ0X2RhZW1vbl9wcm9jZXNzKHNlbGYpOgorICAgIGZha2VfY2NsaWVudCA9IEZha2VDbGVhcmN1dENsaWVudCgpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgZG0gPSBkYWVtb25fbWFuYWdlci5EYWVtb25NYW5hZ2VyKAorICAgICAgICAgIFRFU1RfQklOQVJZX0ZJTEUsCisgICAgICAgICAgZGFlbW9uX3RhcmdldD0nd3JvbmdfdGFyZ2V0JywKKyAgICAgICAgICBkYWVtb25fYXJncz0oMSksCisgICAgICAgICAgY2NsaWVudD1mYWtlX2NjbGllbnQsCisgICAgICApCisgICAgICBkbS5zdGFydCgpCisgICAgc2VsZi5fYXNzZXJ0X2Vycm9yX2V2ZW50X2xvZ2dlZCgKKyAgICAgICAgZmFrZV9jY2xpZW50LCBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuRkFJTEVEX1RPX1NUQVJUX0VESVRfTU9OSVRPUgorICAgICkKKworICBAbW9jay5wYXRjaCgnb3MuZXhlY3YnKQorICBkZWYgdGVzdF9tb25pdG9yX3JlYm9vdF93aXRoX2hpZ2hfbWVtb3J5X3VzYWdlKHNlbGYsIG1vY2tfZXhlY3YpOgorICAgIGZha2VfY2NsaWVudCA9IEZha2VDbGVhcmN1dENsaWVudCgpCisgICAgYmluYXJ5X2ZpbGUgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoCisgICAgICAgIGRpcj1zZWxmLndvcmtpbmdfZGlyLm5hbWUsIGRlbGV0ZT1GYWxzZQorICAgICkKKworICAgIGRtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcigKKyAgICAgICAgYmluYXJ5X2ZpbGUubmFtZSwKKyAgICAgICAgZGFlbW9uX3RhcmdldD1tZW1vcnlfY29uc3VtZV9kYWVtb25fdGFyZ2V0LAorICAgICAgICBkYWVtb25fYXJncz0oMiwpLAorICAgICAgICBjY2xpZW50PWZha2VfY2NsaWVudCwKKyAgICApCisgICAgIyBzZXQgdGhlIGZha2UgdG90YWxfbWVtb3J5X3NpemUKKyAgICBkbS50b3RhbF9tZW1vcnlfc2l6ZSA9IDEwMCAqIDEwMjQgKiAxMDI0CisgICAgZG0uc3RhcnQoKQorICAgIGRtLm1vbml0b3JfZGFlbW9uKGludGVydmFsPTEpCisKKyAgICBzZWxmLmFzc2VydFRydWUoZG0ubWF4X21lbW9yeV91c2FnZSA+PSAwLjAyKQorICAgIHNlbGYuYXNzZXJ0X25vX3N1YnByb2Nlc3NfcnVubmluZygpCisgICAgc2VsZi5fYXNzZXJ0X2Vycm9yX2V2ZW50X2xvZ2dlZCgKKyAgICAgICAgZmFrZV9jY2xpZW50LAorICAgICAgICBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuS0lMTEVEX0RVRV9UT19FWENFRURFRF9NRU1PUllfVVNBR0UsCisgICAgKQorICAgIG1vY2tfZXhlY3YuYXNzZXJ0X2NhbGxlZF9vbmNlKCkKKworICBkZWYgdGVzdF9tb25pdG9yX2RhZW1vbl9zdWJwcm9jZXNzX2tpbGxlZF9oaWdoX2NwdV91c2FnZShzZWxmKToKKyAgICBmYWtlX2NjbGllbnQgPSBGYWtlQ2xlYXJjdXRDbGllbnQoKQorICAgIGRtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcigKKyAgICAgICAgVEVTVF9CSU5BUllfRklMRSwKKyAgICAgICAgZGFlbW9uX3RhcmdldD1jcHVfY29uc3VtZV9kYWVtb25fdGFyZ2V0LAorICAgICAgICBkYWVtb25fYXJncz0oMjAsKSwKKyAgICAgICAgY2NsaWVudD1mYWtlX2NjbGllbnQsCisgICAgKQorICAgIGRtLnN0YXJ0KCkKKyAgICBkbS5tb25pdG9yX2RhZW1vbihpbnRlcnZhbD0xLCBjcHVfdGhyZXNob2xkPTIwKQorCisgICAgc2VsZi5hc3NlcnRUcnVlKGRtLm1heF9jcHVfdXNhZ2UgPj0gMjApCisgICAgc2VsZi5hc3NlcnRfbm9fc3VicHJvY2Vzc19ydW5uaW5nKCkKKyAgICBzZWxmLl9hc3NlcnRfZXJyb3JfZXZlbnRfbG9nZ2VkKAorICAgICAgICBmYWtlX2NjbGllbnQsCisgICAgICAgIGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5LSUxMRURfRFVFX1RPX0VYQ0VFREVEX0NQVV9VU0FHRSwKKyAgICApCisKKyAgQG1vY2sucGF0Y2goJ3N1YnByb2Nlc3MuY2hlY2tfb3V0cHV0JykKKyAgZGVmIHRlc3RfbW9uaXRvcl9kYWVtb25fZmFpbGVkX2RvZXNfbm90X21hdHRlcihzZWxmLCBtb2NrX291dHB1dCk6CisgICAgbW9ja19vdXRwdXQuc2lkZV9lZmZlY3QgPSBPU0Vycm9yKCdVbmtub3duIE9TRXJyb3InKQorICAgIHNlbGYuYXNzZXJ0X3J1bl9zaW1wbGVfZGFlbW9uX3N1Y2Nlc3MoKQorCisgIEBtb2NrLnBhdGNoKCdvcy5leGVjdicpCisgIGRlZiB0ZXN0X21vbml0b3JfZGFlbW9uX3JlYm9vdF90cmlnZ2VyZWQoc2VsZiwgbW9ja19leGVjdik6CisgICAgYmluYXJ5X2ZpbGUgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoCisgICAgICAgIGRpcj1zZWxmLndvcmtpbmdfZGlyLm5hbWUsIGRlbGV0ZT1GYWxzZQorICAgICkKKworICAgIGRtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcigKKyAgICAgICAgYmluYXJ5X2ZpbGUubmFtZSwKKyAgICAgICAgZGFlbW9uX3RhcmdldD1sb25nX3J1bm5pbmdfZGFlbW9uLAorICAgICkKKyAgICBkbS5zdGFydCgpCisgICAgZG0ubW9uaXRvcl9kYWVtb24ocmVib290X3RpbWVvdXQ9MC41KQorICAgIG1vY2tfZXhlY3YuYXNzZXJ0X2NhbGxlZF9vbmNlKCkKKworICBkZWYgdGVzdF9zdG9wX3N1Y2Nlc3Moc2VsZik6CisgICAgZG0gPSBkYWVtb25fbWFuYWdlci5EYWVtb25NYW5hZ2VyKAorICAgICAgICBURVNUX0JJTkFSWV9GSUxFLCBkYWVtb25fdGFyZ2V0PWxvbmdfcnVubmluZ19kYWVtb24KKyAgICApCisgICAgZG0uc3RhcnQoKQorICAgIGRtLnN0b3AoKQorCisgICAgc2VsZi5hc3NlcnRfbm9fc3VicHJvY2Vzc19ydW5uaW5nKCkKKyAgICBzZWxmLmFzc2VydEZhbHNlKGRtLnBpZF9maWxlX3BhdGguZXhpc3RzKCkpCisKKyAgQG1vY2sucGF0Y2goJ29zLmtpbGwnKQorICBkZWYgdGVzdF9zdG9wX2ZhaWxlZF90b19raWxsX2RhZW1vbl9wcm9jZXNzKHNlbGYsIG1vY2tfa2lsbCk6CisgICAgbW9ja19raWxsLnNpZGVfZWZmZWN0ID0gT1NFcnJvcignVW5rbm93biBPU0Vycm9yJykKKyAgICBmYWtlX2NjbGllbnQgPSBGYWtlQ2xlYXJjdXRDbGllbnQoKQorICAgIGRtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcigKKyAgICAgICAgVEVTVF9CSU5BUllfRklMRSwKKyAgICAgICAgZGFlbW9uX3RhcmdldD1sb25nX3J1bm5pbmdfZGFlbW9uLAorICAgICAgICBjY2xpZW50PWZha2VfY2NsaWVudCwKKyAgICApCisKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUV4aXQpOgorICAgICAgZG0uc3RhcnQoKQorICAgICAgZG0uc3RvcCgpCisgICAgICBzZWxmLmFzc2VydFRydWUoZG0uZGFlbW9uX3Byb2Nlc3MuaXNfYWxpdmUoKSkKKyAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkbS5waWRfZmlsZV9wYXRoLmV4aXN0cygpKQorICAgIHNlbGYuX2Fzc2VydF9lcnJvcl9ldmVudF9sb2dnZWQoCisgICAgICAgIGZha2VfY2NsaWVudCwgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LkZBSUxFRF9UT19TVE9QX0VESVRfTU9OSVRPUgorICAgICkKKworICBAbW9jay5wYXRjaCgnb3MucmVtb3ZlJykKKyAgZGVmIHRlc3Rfc3RvcF9mYWlsZWRfdG9fcmVtb3ZlX3BpZGZpbGUoc2VsZiwgbW9ja19yZW1vdmUpOgorICAgIG1vY2tfcmVtb3ZlLnNpZGVfZWZmZWN0ID0gT1NFcnJvcignVW5rbm93biBPU0Vycm9yJykKKworICAgIGZha2VfY2NsaWVudCA9IEZha2VDbGVhcmN1dENsaWVudCgpCisgICAgZG0gPSBkYWVtb25fbWFuYWdlci5EYWVtb25NYW5hZ2VyKAorICAgICAgICBURVNUX0JJTkFSWV9GSUxFLAorICAgICAgICBkYWVtb25fdGFyZ2V0PWxvbmdfcnVubmluZ19kYWVtb24sCisgICAgICAgIGNjbGllbnQ9ZmFrZV9jY2xpZW50LAorICAgICkKKworICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoU3lzdGVtRXhpdCk6CisgICAgICBkbS5zdGFydCgpCisgICAgICBkbS5zdG9wKCkKKyAgICAgIHNlbGYuYXNzZXJ0X25vX3N1YnByb2Nlc3NfcnVubmluZygpCisgICAgICBzZWxmLmFzc2VydFRydWUoZG0ucGlkX2ZpbGVfcGF0aC5leGlzdHMoKSkKKworICAgIHNlbGYuX2Fzc2VydF9lcnJvcl9ldmVudF9sb2dnZWQoCisgICAgICAgIGZha2VfY2NsaWVudCwgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LkZBSUxFRF9UT19TVE9QX0VESVRfTU9OSVRPUgorICAgICkKKworICBAbW9jay5wYXRjaCgnb3MuZXhlY3YnKQorICBkZWYgdGVzdF9yZWJvb3Rfc3VjY2VzcyhzZWxmLCBtb2NrX2V4ZWN2KToKKyAgICBiaW5hcnlfZmlsZSA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgKKyAgICAgICAgZGlyPXNlbGYud29ya2luZ19kaXIubmFtZSwgZGVsZXRlPUZhbHNlCisgICAgKQorCisgICAgZG0gPSBkYWVtb25fbWFuYWdlci5EYWVtb25NYW5hZ2VyKAorICAgICAgICBiaW5hcnlfZmlsZS5uYW1lLCBkYWVtb25fdGFyZ2V0PWxvbmdfcnVubmluZ19kYWVtb24KKyAgICApCisgICAgZG0uc3RhcnQoKQorICAgIGRtLnJlYm9vdCgpCisKKyAgICAjIFZlcmlmaWVzIHRoZSBvbGQgcHJvY2VzcyBpcyBzdG9wcGVkCisgICAgc2VsZi5hc3NlcnRfbm9fc3VicHJvY2Vzc19ydW5uaW5nKCkKKyAgICBzZWxmLmFzc2VydEZhbHNlKGRtLnBpZF9maWxlX3BhdGguZXhpc3RzKCkpCisKKyAgICBtb2NrX2V4ZWN2LmFzc2VydF9jYWxsZWRfb25jZSgpCisKKyAgQG1vY2sucGF0Y2goJ29zLmV4ZWN2JykKKyAgZGVmIHRlc3RfcmVib290X2JpbmFyeV9ub19sb25nZXJfZXhpc3RzKHNlbGYsIG1vY2tfZXhlY3YpOgorICAgIGRtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcigKKyAgICAgICAgVEVTVF9CSU5BUllfRklMRSwgZGFlbW9uX3RhcmdldD1sb25nX3J1bm5pbmdfZGFlbW9uCisgICAgKQorICAgIGRtLnN0YXJ0KCkKKworICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoU3lzdGVtRXhpdCk6CisgICAgICBkbS5yZWJvb3QoKQorICAgICAgbW9ja19leGVjdi5hc3NlcnRfbm90X2NhbGxlZCgpCisgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtLmV4Y2VwdGlvbi5jb2RlLCAwKQorCisgIEBtb2NrLnBhdGNoKCdvcy5leGVjdicpCisgIGRlZiB0ZXN0X3JlYm9vdF9mYWlsZWQoc2VsZiwgbW9ja19leGVjdik6CisgICAgbW9ja19leGVjdi5zaWRlX2VmZmVjdCA9IE9TRXJyb3IoJ1Vua25vd24gT1NFcnJvcicpCisgICAgZmFrZV9jY2xpZW50ID0gRmFrZUNsZWFyY3V0Q2xpZW50KCkKKyAgICBiaW5hcnlfZmlsZSA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgKKyAgICAgICAgZGlyPXNlbGYud29ya2luZ19kaXIubmFtZSwgZGVsZXRlPUZhbHNlCisgICAgKQorCisgICAgZG0gPSBkYWVtb25fbWFuYWdlci5EYWVtb25NYW5hZ2VyKAorICAgICAgICBiaW5hcnlfZmlsZS5uYW1lLAorICAgICAgICBkYWVtb25fdGFyZ2V0PWxvbmdfcnVubmluZ19kYWVtb24sCisgICAgICAgIGNjbGllbnQ9ZmFrZV9jY2xpZW50LAorICAgICkKKyAgICBkbS5zdGFydCgpCisKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUV4aXQpOgorICAgICAgZG0ucmVib290KCkKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY20uZXhjZXB0aW9uLmNvZGUsIDEpCisgICAgc2VsZi5fYXNzZXJ0X2Vycm9yX2V2ZW50X2xvZ2dlZCgKKyAgICAgICAgZmFrZV9jY2xpZW50LCBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuRkFJTEVEX1RPX1JFQk9PVF9FRElUX01PTklUT1IKKyAgICApCisKKyAgQG1vY2sucGF0Y2goJ3N1YnByb2Nlc3MuY2hlY2tfb3V0cHV0JykKKyAgZGVmIHRlc3RfY2xlYW51cF9zdWNjZXNzKHNlbGYsIG1vY2tfY2hlY2tfb3V0cHV0KToKKyAgICBwID0gc2VsZi5fY3JlYXRlX2Zha2VfZGVhbW9uX3Byb2Nlc3MoKQorICAgIGZha2VfY2NsaWVudCA9IEZha2VDbGVhcmN1dENsaWVudCgpCisgICAgbW9ja19jaGVja19vdXRwdXQucmV0dXJuX3ZhbHVlID0gZid1c2VyIHtwLnBpZH0gMSAxIDEgMSAxIGVkaXRfbW9uaXRvciBhcmcnCisKKyAgICBkbSA9IGRhZW1vbl9tYW5hZ2VyLkRhZW1vbk1hbmFnZXIoCisgICAgICAgIFRFU1RfQklOQVJZX0ZJTEUsCisgICAgICAgIGRhZW1vbl90YXJnZXQ9bG9uZ19ydW5uaW5nX2RhZW1vbiwKKyAgICAgICAgY2NsaWVudD1mYWtlX2NjbGllbnQsCisgICAgKQorICAgIGRtLmNsZWFudXAoKQorCisgICAgc2VsZi5hc3NlcnRGYWxzZShwLmlzX2FsaXZlKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICBwYXRobGliLlBhdGgoc2VsZi53b3JraW5nX2Rpci5uYW1lKQorICAgICAgICAuam9pbnBhdGgoZGFlbW9uX21hbmFnZXIuQkxPQ0tfU0lHTl9GSUxFKQorICAgICAgICAuZXhpc3RzKCkKKyAgICApCisKKyAgZGVmIGFzc2VydF9ydW5fc2ltcGxlX2RhZW1vbl9zdWNjZXNzKHNlbGYpOgorICAgIGRhbW9uZV9vdXRwdXRfZmlsZSA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgKKyAgICAgICAgZGlyPXNlbGYud29ya2luZ19kaXIubmFtZSwgZGVsZXRlPUZhbHNlCisgICAgKQorICAgIGRtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcigKKyAgICAgICAgVEVTVF9CSU5BUllfRklMRSwKKyAgICAgICAgZGFlbW9uX3RhcmdldD1zaW1wbGVfZGFlbW9uLAorICAgICAgICBkYWVtb25fYXJncz0oZGFtb25lX291dHB1dF9maWxlLm5hbWUsKSwKKyAgICApCisgICAgZG0uc3RhcnQoKQorICAgIGRtLm1vbml0b3JfZGFlbW9uKGludGVydmFsPTEpCisKKyAgICAjIFZlcmlmaWVzIHRoZSBleHBlY3RlZCBwaWQgZmlsZSBpcyBjcmVhdGVkLgorICAgIGV4cGVjdGVkX3BpZF9maWxlX3BhdGggPSBwYXRobGliLlBhdGgoc2VsZi53b3JraW5nX2Rpci5uYW1lKS5qb2lucGF0aCgKKyAgICAgICAgJ2VkaXRfbW9uaXRvcicsIFRFU1RfUElEX0ZJTEVfUEFUSAorICAgICkKKyAgICBzZWxmLmFzc2VydFRydWUoZXhwZWN0ZWRfcGlkX2ZpbGVfcGF0aC5leGlzdHMoKSkKKworICAgICMgVmVyaWZ5IHRoZSBkYWVtb24gcHJvY2VzcyBpcyBleGVjdXRlZCBzdWNjZXNzZnVsbHkuCisgICAgd2l0aCBvcGVuKGRhbW9uZV9vdXRwdXRfZmlsZS5uYW1lLCAncicpIGFzIGY6CisgICAgICBjb250ZW50cyA9IGYucmVhZCgpCisgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnRlbnRzLCAncnVubmluZyBkYWVtb24gdGFyZ2V0JykKKworICBkZWYgYXNzZXJ0X25vX3N1YnByb2Nlc3NfcnVubmluZyhzZWxmKToKKyAgICBjaGlsZF9waWRzID0gc2VsZi5fZ2V0X2NoaWxkX3Byb2Nlc3Nlcyhvcy5nZXRwaWQoKSkKKyAgICBmb3IgY2hpbGRfcGlkIGluIGNoaWxkX3BpZHM6CisgICAgICBzZWxmLmFzc2VydEZhbHNlKAorICAgICAgICAgIHNlbGYuX2lzX3Byb2Nlc3NfYWxpdmUoY2hpbGRfcGlkKSwgZidwcm9jZXNzIHtjaGlsZF9waWR9IHN0aWxsIGFsaXZlJworICAgICAgKQorCisgIGRlZiBfZ2V0X2NoaWxkX3Byb2Nlc3NlcyhzZWxmLCBwYXJlbnRfcGlkOiBpbnQpIC0+IGxpc3RbaW50XToKKyAgICB0cnk6CisgICAgICBvdXRwdXQgPSBzdWJwcm9jZXNzLmNoZWNrX291dHB1dCgKKyAgICAgICAgICBbJ3BzJywgJy1vJywgJ3BpZCxwcGlkJywgJy0tbm8taGVhZGVycyddLCB0ZXh0PVRydWUKKyAgICAgICkKKworICAgICAgY2hpbGRfcHJvY2Vzc2VzID0gW10KKyAgICAgIGZvciBsaW5lIGluIG91dHB1dC5zcGxpdGxpbmVzKCk6CisgICAgICAgIHBpZCwgcHBpZCA9IGxpbmUuc3BsaXQoKQorICAgICAgICBpZiBpbnQocHBpZCkgPT0gcGFyZW50X3BpZDoKKyAgICAgICAgICBjaGlsZF9wcm9jZXNzZXMuYXBwZW5kKGludChwaWQpKQorICAgICAgcmV0dXJuIGNoaWxkX3Byb2Nlc3NlcworICAgIGV4Y2VwdCBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvciBhcyBlOgorICAgICAgc2VsZi5mYWlsKGYnZmFpbGVkIHRvIGdldCBjaGlsZCBwcm9jZXNzLCBlcnJvcjoge2V9JykKKworICBkZWYgX2lzX3Byb2Nlc3NfYWxpdmUoc2VsZiwgcGlkOiBpbnQpIC0+IGJvb2w6CisgICAgdHJ5OgorICAgICAgb3V0cHV0ID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoCisgICAgICAgICAgWydwcycsICctcCcsIHN0cihwaWQpLCAnLW8nLCAnc3RhdGU9J10sIHRleHQ9VHJ1ZQorICAgICAgKS5zdHJpcCgpCisgICAgICBzdGF0ZSA9IG91dHB1dC5zcGxpdCgpWzBdCisgICAgICByZXR1cm4gc3RhdGUgIT0gJ1onICAjIENoZWNrIGlmIHRoZSBzdGF0ZSBpcyBub3QgJ1onICh6b21iaWUpCisgICAgZXhjZXB0IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yOgorICAgICAgcmV0dXJuIEZhbHNlCisKKyAgZGVmIF9jbGVhbnVwX2NoaWxkX3Byb2Nlc3NlcyhzZWxmKToKKyAgICBjaGlsZF9waWRzID0gc2VsZi5fZ2V0X2NoaWxkX3Byb2Nlc3Nlcyhvcy5nZXRwaWQoKSkKKyAgICBmb3IgY2hpbGRfcGlkIGluIGNoaWxkX3BpZHM6CisgICAgICB0cnk6CisgICAgICAgIG9zLmtpbGwoY2hpbGRfcGlkLCBzaWduYWwuU0lHS0lMTCkKKyAgICAgIGV4Y2VwdCBQcm9jZXNzTG9va3VwRXJyb3I6CisgICAgICAgICMgcHJvY2VzcyBhbHJlYWR5IHRlcm1pbmF0ZWQKKyAgICAgICAgcGFzcworCisgIGRlZiBfY3JlYXRlX2Zha2VfZGVhbW9uX3Byb2Nlc3MoCisgICAgICBzZWxmLCBuYW1lOiBzdHIgPSBURVNUX1BJRF9GSUxFX1BBVEgKKyAgKSAtPiBtdWx0aXByb2Nlc3NpbmcuUHJvY2VzczoKKyAgICAjIENyZWF0ZSBhIGxvbmcgcnVubmluZyBzdWJwcm9jZXNzCisgICAgcCA9IG11bHRpcHJvY2Vzc2luZy5Qcm9jZXNzKHRhcmdldD1sb25nX3J1bm5pbmdfZGFlbW9uKQorICAgIHAuc3RhcnQoKQorCisgICAgIyBDcmVhdGUgdGhlIHBpZGZpbGUgd2l0aCB0aGUgc3VicHJvY2VzcyBwaWQKKyAgICBwaWRfZmlsZV9wYXRoX2RpciA9IHBhdGhsaWIuUGF0aChzZWxmLndvcmtpbmdfZGlyLm5hbWUpLmpvaW5wYXRoKAorICAgICAgICAnZWRpdF9tb25pdG9yJworICAgICkKKyAgICBwaWRfZmlsZV9wYXRoX2Rpci5ta2RpcihwYXJlbnRzPVRydWUsIGV4aXN0X29rPVRydWUpCisgICAgd2l0aCBvcGVuKHBpZF9maWxlX3BhdGhfZGlyLmpvaW5wYXRoKG5hbWUpLCAndycpIGFzIGY6CisgICAgICBmLndyaXRlKHN0cihwLnBpZCkpCisgICAgcmV0dXJuIHAKKworICBkZWYgX2Fzc2VydF9lcnJvcl9ldmVudF9sb2dnZWQoc2VsZiwgZmFrZV9jY2xpZW50LCBlcnJvcl90eXBlKToKKyAgICBlcnJvcl9ldmVudHMgPSBmYWtlX2NjbGllbnQuZ2V0X3NlbnRfZXZlbnRzKCkKKyAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oZXJyb3JfZXZlbnRzKSwgMSkKKyAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LkZyb21TdHJpbmcoCisgICAgICAgICAgICBlcnJvcl9ldmVudHNbMF0uc291cmNlX2V4dGVuc2lvbgorICAgICAgICApLmVkaXRfbW9uaXRvcl9lcnJvcl9ldmVudC5lcnJvcl90eXBlLAorICAgICAgICBlcnJvcl90eXBlLAorICAgICkKKworCitjbGFzcyBGYWtlQ2xlYXJjdXRDbGllbnQ6CisKKyAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgIHNlbGYucGVuZGluZ19sb2dfZXZlbnRzID0gW10KKyAgICBzZWxmLnNlbnRfbG9nX2V2ZW50ID0gW10KKworICBkZWYgbG9nKHNlbGYsIGxvZ19ldmVudCk6CisgICAgc2VsZi5wZW5kaW5nX2xvZ19ldmVudHMuYXBwZW5kKGxvZ19ldmVudCkKKworICBkZWYgZmx1c2hfZXZlbnRzKHNlbGYpOgorICAgIHNlbGYuc2VudF9sb2dfZXZlbnQuZXh0ZW5kKHNlbGYucGVuZGluZ19sb2dfZXZlbnRzKQorICAgIHNlbGYucGVuZGluZ19sb2dfZXZlbnRzLmNsZWFyKCkKKworICBkZWYgZ2V0X3NlbnRfZXZlbnRzKHNlbGYpOgorICAgIHJldHVybiBzZWxmLnNlbnRfbG9nX2V2ZW50ICsgc2VsZi5wZW5kaW5nX2xvZ19ldmVudHMKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL2VkaXRfbW9uaXRvci9lZGl0X21vbml0b3IucHkgYi90b29scy9lZGl0X21vbml0b3IvZWRpdF9tb25pdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNTI4ZTgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lZGl0X21vbml0b3IvZWRpdF9tb25pdG9yLnB5CkBAIC0wLDAgKzEsMjIwIEBACisjIENvcHlyaWdodCAyMDI0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworaW1wb3J0IGdldHBhc3MKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgbXVsdGlwcm9jZXNzaW5nLmNvbm5lY3Rpb24KK2ltcG9ydCBvcworaW1wb3J0IHBhdGhsaWIKK2ltcG9ydCBwbGF0Zm9ybQoraW1wb3J0IHRocmVhZGluZworaW1wb3J0IHRpbWUKKworZnJvbSBhdGVzdC5tZXRyaWNzIGltcG9ydCBjbGVhcmN1dF9jbGllbnQKK2Zyb20gYXRlc3QucHJvdG8gaW1wb3J0IGNsaWVudGFuYWx5dGljc19wYjIKK2Zyb20gcHJvdG8gaW1wb3J0IGVkaXRfZXZlbnRfcGIyCitmcm9tIHdhdGNoZG9nLmV2ZW50cyBpbXBvcnQgRmlsZVN5c3RlbUV2ZW50Citmcm9tIHdhdGNoZG9nLmV2ZW50cyBpbXBvcnQgUGF0dGVybk1hdGNoaW5nRXZlbnRIYW5kbGVyCitmcm9tIHdhdGNoZG9nLm9ic2VydmVycyBpbXBvcnQgT2JzZXJ2ZXIKKworIyBFbnVtIG9mIHRoZSBDbGVhcmN1dCBsb2cgc291cmNlIGRlZmluZWQgdW5kZXIKKyMgL2dvb2dsZTMvd2lyZWxlc3MvYW5kcm9pZC9wbGF5L3BsYXlsb2cvcHJvdG8vbG9nX3NvdXJjZV9lbnVtLnByb3RvCitMT0dfU09VUkNFID0gMjUyNAorREVGQVVMVF9GTFVTSF9JTlRFUlZBTF9TRUNPTkRTID0gNQorREVGQVVMVF9TSU5HTEVfRVZFTlRTX1NJWkVfVEhSRVNIT0xEID0gMTAwCisKKworY2xhc3MgQ2xlYXJjdXRFdmVudEhhbmRsZXIoUGF0dGVybk1hdGNoaW5nRXZlbnRIYW5kbGVyKToKKworICBkZWYgX19pbml0X18oCisgICAgICBzZWxmLAorICAgICAgcGF0aDogc3RyLAorICAgICAgZmx1c2hfaW50ZXJ2YWxfc2VjOiBpbnQsCisgICAgICBzaW5nbGVfZXZlbnRzX3NpemVfdGhyZXNob2xkOiBpbnQsCisgICAgICBpc19kcnlfcnVuOiBib29sID0gRmFsc2UsCisgICAgICBjY2xpZW50OiBjbGVhcmN1dF9jbGllbnQuQ2xlYXJjdXQgfCBOb25lID0gTm9uZSwKKyAgKToKKworICAgIHN1cGVyKCkuX19pbml0X18ocGF0dGVybnM9WyIqIl0sIGlnbm9yZV9kaXJlY3Rvcmllcz1UcnVlKQorICAgIHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGggPSBwYXRoCisgICAgc2VsZi5mbHVzaF9pbnRlcnZhbF9zZWMgPSBmbHVzaF9pbnRlcnZhbF9zZWMKKyAgICBzZWxmLnNpbmdsZV9ldmVudHNfc2l6ZV90aHJlc2hvbGQgPSBzaW5nbGVfZXZlbnRzX3NpemVfdGhyZXNob2xkCisgICAgc2VsZi5pc19kcnlfcnVuID0gaXNfZHJ5X3J1bgorICAgIHNlbGYuY2NsaWVudCA9IGNjbGllbnQgb3IgY2xlYXJjdXRfY2xpZW50LkNsZWFyY3V0KExPR19TT1VSQ0UpCisKKyAgICBzZWxmLnVzZXJfbmFtZSA9IGdldHBhc3MuZ2V0dXNlcigpCisgICAgc2VsZi5ob3N0X25hbWUgPSBwbGF0Zm9ybS5ub2RlKCkKKyAgICBzZWxmLnNvdXJjZV9yb290ID0gb3MuZW52aXJvbi5nZXQoIkFORFJPSURfQlVJTERfVE9QIiwgIiIpCisKKyAgICBzZWxmLnBlbmRpbmdfZXZlbnRzID0gW10KKyAgICBzZWxmLl9zY2hlZHVsZWRfbG9nX3RocmVhZCA9IE5vbmUKKyAgICBzZWxmLl9wZW5kaW5nX2V2ZW50c19sb2NrID0gdGhyZWFkaW5nLkxvY2soKQorCisgIGRlZiBvbl9tb3ZlZChzZWxmLCBldmVudDogRmlsZVN5c3RlbUV2ZW50KToKKyAgICBzZWxmLl9sb2dfZWRpdF9ldmVudChldmVudCwgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50Lk1PVkUpCisKKyAgZGVmIG9uX2NyZWF0ZWQoc2VsZiwgZXZlbnQ6IEZpbGVTeXN0ZW1FdmVudCk6CisgICAgc2VsZi5fbG9nX2VkaXRfZXZlbnQoZXZlbnQsIGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5DUkVBVEUpCisKKyAgZGVmIG9uX2RlbGV0ZWQoc2VsZiwgZXZlbnQ6IEZpbGVTeXN0ZW1FdmVudCk6CisgICAgc2VsZi5fbG9nX2VkaXRfZXZlbnQoZXZlbnQsIGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5ERUxFVEUpCisKKyAgZGVmIG9uX21vZGlmaWVkKHNlbGYsIGV2ZW50OiBGaWxlU3lzdGVtRXZlbnQpOgorICAgIHNlbGYuX2xvZ19lZGl0X2V2ZW50KGV2ZW50LCBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuTU9ESUZZKQorCisgIGRlZiBmbHVzaGFsbChzZWxmKToKKyAgICBsb2dnaW5nLmluZm8oImZsdXNoaW5nIGFsbCBwZW5kaW5nIGV2ZW50cy4iKQorICAgIGlmIHNlbGYuX3NjaGVkdWxlZF9sb2dfdGhyZWFkOgorICAgICAgbG9nZ2luZy5pbmZvKCJjYW5jZWxpbmcgbG9nIHRocmVhZCIpCisgICAgICBzZWxmLl9zY2hlZHVsZWRfbG9nX3RocmVhZC5jYW5jZWwoKQorICAgICAgc2VsZi5fc2NoZWR1bGVkX2xvZ190aHJlYWQgPSBOb25lCisKKyAgICBzZWxmLl9sb2dfY2xlYXJjdXRfZXZlbnRzKCkKKyAgICBzZWxmLmNjbGllbnQuZmx1c2hfZXZlbnRzKCkKKworICBkZWYgX2xvZ19lZGl0X2V2ZW50KAorICAgICAgc2VsZiwgZXZlbnQ6IEZpbGVTeXN0ZW1FdmVudCwgZWRpdF90eXBlOiBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuRWRpdFR5cGUKKyAgKToKKyAgICB0cnk6CisgICAgICBldmVudF90aW1lID0gdGltZS50aW1lKCkKKworICAgICAgaWYgc2VsZi5faXNfaGlkZGVuX2ZpbGUocGF0aGxpYi5QYXRoKGV2ZW50LnNyY19wYXRoKSk6CisgICAgICAgIGxvZ2dpbmcuZGVidWcoImlnbm9yZSBoaWRkZW4gZmlsZTogJXMuIiwgZXZlbnQuc3JjX3BhdGgpCisgICAgICAgIHJldHVybgorCisgICAgICBpZiBub3Qgc2VsZi5faXNfdW5kZXJfZ2l0X3Byb2plY3QocGF0aGxpYi5QYXRoKGV2ZW50LnNyY19wYXRoKSk6CisgICAgICAgIGxvZ2dpbmcuZGVidWcoCisgICAgICAgICAgICAiaWdub3JlIGZpbGUgJXMgd2hpY2ggZG9lcyBub3QgYmVsb25nIHRvIGEgZ2l0IHByb2plY3QiLAorICAgICAgICAgICAgZXZlbnQuc3JjX3BhdGgsCisgICAgICAgICkKKyAgICAgICAgcmV0dXJuCisKKyAgICAgIGxvZ2dpbmcuaW5mbygiJXM6ICVzIiwgZXZlbnQuZXZlbnRfdHlwZSwgZXZlbnQuc3JjX3BhdGgpCisKKyAgICAgIGV2ZW50X3Byb3RvID0gZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50KAorICAgICAgICAgIHVzZXJfbmFtZT1zZWxmLnVzZXJfbmFtZSwKKyAgICAgICAgICBob3N0X25hbWU9c2VsZi5ob3N0X25hbWUsCisgICAgICAgICAgc291cmNlX3Jvb3Q9c2VsZi5zb3VyY2Vfcm9vdCwKKyAgICAgICkKKyAgICAgIGV2ZW50X3Byb3RvLnNpbmdsZV9lZGl0X2V2ZW50LkNvcHlGcm9tKAorICAgICAgICAgIGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5TaW5nbGVFZGl0RXZlbnQoCisgICAgICAgICAgICAgIGZpbGVfcGF0aD1ldmVudC5zcmNfcGF0aCwgZWRpdF90eXBlPWVkaXRfdHlwZQorICAgICAgICAgICkKKyAgICAgICkKKyAgICAgIHdpdGggc2VsZi5fcGVuZGluZ19ldmVudHNfbG9jazoKKyAgICAgICAgc2VsZi5wZW5kaW5nX2V2ZW50cy5hcHBlbmQoKGV2ZW50X3Byb3RvLCBldmVudF90aW1lKSkKKyAgICAgICAgaWYgbm90IHNlbGYuX3NjaGVkdWxlZF9sb2dfdGhyZWFkOgorICAgICAgICAgIGxvZ2dpbmcuZGVidWcoCisgICAgICAgICAgICAgICJTY2hlZHVsaW5nIHRocmVhZCB0byBydW4gaW4gJWQgc2Vjb25kcyIsIHNlbGYuZmx1c2hfaW50ZXJ2YWxfc2VjCisgICAgICAgICAgKQorICAgICAgICAgIHNlbGYuX3NjaGVkdWxlZF9sb2dfdGhyZWFkID0gdGhyZWFkaW5nLlRpbWVyKAorICAgICAgICAgICAgICBzZWxmLmZsdXNoX2ludGVydmFsX3NlYywgc2VsZi5fbG9nX2NsZWFyY3V0X2V2ZW50cworICAgICAgICAgICkKKyAgICAgICAgICBzZWxmLl9zY2hlZHVsZWRfbG9nX3RocmVhZC5zdGFydCgpCisKKyAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgbG9nZ2luZy5leGNlcHRpb24oIkZhaWxlZCB0byBsb2cgZWRpdCBldmVudC4iKQorCisgIGRlZiBfaXNfaGlkZGVuX2ZpbGUoc2VsZiwgZmlsZV9wYXRoOiBwYXRobGliLlBhdGgpIC0+IGJvb2w6CisgICAgcmV0dXJuIGFueSgKKyAgICAgICAgcGFydC5zdGFydHN3aXRoKCIuIikKKyAgICAgICAgZm9yIHBhcnQgaW4gZmlsZV9wYXRoLnJlbGF0aXZlX3RvKHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGgpLnBhcnRzCisgICAgKQorCisgIGRlZiBfaXNfdW5kZXJfZ2l0X3Byb2plY3Qoc2VsZiwgZmlsZV9wYXRoOiBwYXRobGliLlBhdGgpIC0+IGJvb2w6CisgICAgcm9vdF9wYXRoID0gcGF0aGxpYi5QYXRoKHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGgpLnJlc29sdmUoKQorICAgIHJldHVybiBhbnkoCisgICAgICAgIHJvb3RfcGF0aC5qb2lucGF0aChkaXIpLmpvaW5wYXRoKCcuZ2l0JykuZXhpc3RzKCkKKyAgICAgICAgZm9yIGRpciBpbiBmaWxlX3BhdGgucmVsYXRpdmVfdG8ocm9vdF9wYXRoKS5wYXJlbnRzCisgICAgKQorCisgIGRlZiBfbG9nX2NsZWFyY3V0X2V2ZW50cyhzZWxmKToKKyAgICB3aXRoIHNlbGYuX3BlbmRpbmdfZXZlbnRzX2xvY2s6CisgICAgICBzZWxmLl9zY2hlZHVsZWRfbG9nX3RocmVhZCA9IE5vbmUKKyAgICAgIGVkaXRfZXZlbnRzID0gc2VsZi5wZW5kaW5nX2V2ZW50cworICAgICAgc2VsZi5wZW5kaW5nX2V2ZW50cyA9IFtdCisKKyAgICBwZW5kaW5nX2V2ZW50c19zaXplID0gbGVuKGVkaXRfZXZlbnRzKQorICAgIGlmIHBlbmRpbmdfZXZlbnRzX3NpemUgPiBzZWxmLnNpbmdsZV9ldmVudHNfc2l6ZV90aHJlc2hvbGQ6CisgICAgICBsb2dnaW5nLmluZm8oCisgICAgICAgICAgImdvdCAlZCBldmVudHMgaW4gJWQgc2Vjb25kcywgc2VuZGluZyBhZ2dyZWdhdGVkIGV2ZW50cyBpbnN0ZWFkIiwKKyAgICAgICAgICBwZW5kaW5nX2V2ZW50c19zaXplLAorICAgICAgICAgIHNlbGYuZmx1c2hfaW50ZXJ2YWxfc2VjLAorICAgICAgKQorICAgICAgYWdncmVnYXRlZF9ldmVudF90aW1lID0gZWRpdF9ldmVudHNbMF1bMV0KKyAgICAgIGFnZ3JlZ2F0ZWRfZXZlbnRfcHJvdG8gPSBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQoCisgICAgICAgICAgdXNlcl9uYW1lPXNlbGYudXNlcl9uYW1lLAorICAgICAgICAgIGhvc3RfbmFtZT1zZWxmLmhvc3RfbmFtZSwKKyAgICAgICAgICBzb3VyY2Vfcm9vdD1zZWxmLnNvdXJjZV9yb290LAorICAgICAgKQorICAgICAgYWdncmVnYXRlZF9ldmVudF9wcm90by5hZ2dyZWdhdGVkX2VkaXRfZXZlbnQuQ29weUZyb20oCisgICAgICAgICAgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LkFnZ3JlZ2F0ZWRFZGl0RXZlbnQoCisgICAgICAgICAgICAgIG51bV9lZGl0cz1wZW5kaW5nX2V2ZW50c19zaXplCisgICAgICAgICAgKQorICAgICAgKQorICAgICAgZWRpdF9ldmVudHMgPSBbKGFnZ3JlZ2F0ZWRfZXZlbnRfcHJvdG8sIGFnZ3JlZ2F0ZWRfZXZlbnRfdGltZSldCisKKyAgICBpZiBzZWxmLmlzX2RyeV9ydW46CisgICAgICBsb2dnaW5nLmluZm8oIlNlbnQgJWQgZWRpdCBldmVudHMgaW4gZHJ5IHJ1bi4iLCBsZW4oZWRpdF9ldmVudHMpKQorICAgICAgcmV0dXJuCisKKyAgICBmb3IgZXZlbnRfcHJvdG8sIGV2ZW50X3RpbWUgaW4gZWRpdF9ldmVudHM6CisgICAgICBsb2dfZXZlbnQgPSBjbGllbnRhbmFseXRpY3NfcGIyLkxvZ0V2ZW50KAorICAgICAgICAgIGV2ZW50X3RpbWVfbXM9aW50KGV2ZW50X3RpbWUgKiAxMDAwKSwKKyAgICAgICAgICBzb3VyY2VfZXh0ZW5zaW9uPWV2ZW50X3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCksCisgICAgICApCisgICAgICBzZWxmLmNjbGllbnQubG9nKGxvZ19ldmVudCkKKworICAgIGxvZ2dpbmcuaW5mbygic2VudCAlZCBlZGl0IGV2ZW50cyIsIGxlbihlZGl0X2V2ZW50cykpCisKKworZGVmIHN0YXJ0KAorICAgIHBhdGg6IHN0ciwKKyAgICBpc19kcnlfcnVuOiBib29sID0gRmFsc2UsCisgICAgZmx1c2hfaW50ZXJ2YWxfc2VjOiBpbnQgPSBERUZBVUxUX0ZMVVNIX0lOVEVSVkFMX1NFQ09ORFMsCisgICAgc2luZ2xlX2V2ZW50c19zaXplX3RocmVzaG9sZDogaW50ID0gREVGQVVMVF9TSU5HTEVfRVZFTlRTX1NJWkVfVEhSRVNIT0xELAorICAgIGNjbGllbnQ6IGNsZWFyY3V0X2NsaWVudC5DbGVhcmN1dCB8IE5vbmUgPSBOb25lLAorICAgIHBpcGVfc2VuZGVyOiBtdWx0aXByb2Nlc3NpbmcuY29ubmVjdGlvbi5Db25uZWN0aW9uIHwgTm9uZSA9IE5vbmUsCispOgorICAiIiJNZXRob2QgdG8gc3RhcnQgdGhlIGVkaXQgbW9uaXRvci4KKworICBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCB0byBzdGFydCB0aGUgZWRpdCBtb25pdG9yIGFzIGEgc3VicHJvY2VzcyBvZgorICB0aGUgZGFlbW9uIG1hbmFnZXIuCisKKyAgcGFyYW1zOgorICAgIHBhdGg6IFRoZSByb290IHBhdGggdG8gbW9uaXRvcgorICAgIGNjbGllbnQ6IFRoZSBjbGVhcmN1dCBjbGllbnQgdG8gc2VuZCB0aGUgZWRpdCBsb2dzLgorICAgIGNvbm46IHRoZSBzZW5kZXIgb2YgdGhlIHBpcGUgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZGVhbW9uIG1hbmFnZXIuCisgICIiIgorICBldmVudF9oYW5kbGVyID0gQ2xlYXJjdXRFdmVudEhhbmRsZXIoCisgICAgICBwYXRoLCBmbHVzaF9pbnRlcnZhbF9zZWMsIHNpbmdsZV9ldmVudHNfc2l6ZV90aHJlc2hvbGQsIGlzX2RyeV9ydW4sIGNjbGllbnQpCisgIG9ic2VydmVyID0gT2JzZXJ2ZXIoKQorCisgIGxvZ2dpbmcuaW5mbygiU3RhcnRpbmcgb2JzZXJ2ZXIgb24gcGF0aCAlcy4iLCBwYXRoKQorICBvYnNlcnZlci5zY2hlZHVsZShldmVudF9oYW5kbGVyLCBwYXRoLCByZWN1cnNpdmU9VHJ1ZSkKKyAgb2JzZXJ2ZXIuc3RhcnQoKQorICBsb2dnaW5nLmluZm8oIk9ic2VydmVyIHN0YXJ0ZWQuIikKKyAgaWYgcGlwZV9zZW5kZXI6CisgICAgcGlwZV9zZW5kZXIuc2VuZCgiT2JzZXJ2ZXIgc3RhcnRlZC4iKQorCisgIHRyeToKKyAgICB3aGlsZSBUcnVlOgorICAgICAgdGltZS5zbGVlcCgxKQorICBmaW5hbGx5OgorICAgIGV2ZW50X2hhbmRsZXIuZmx1c2hhbGwoKQorICAgIG9ic2VydmVyLnN0b3AoKQorICAgIG9ic2VydmVyLmpvaW4oKQorICAgIGlmIHBpcGVfc2VuZGVyOgorICAgICAgcGlwZV9zZW5kZXIuY2xvc2UoKQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWRpdF9tb25pdG9yL2VkaXRfbW9uaXRvcl9pbnRlZ3JhdGlvbl90ZXN0LnB5IGIvdG9vbHMvZWRpdF9tb25pdG9yL2VkaXRfbW9uaXRvcl9pbnRlZ3JhdGlvbl90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOWI5MzYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lZGl0X21vbml0b3IvZWRpdF9tb25pdG9yX2ludGVncmF0aW9uX3Rlc3QucHkKQEAgLTAsMCArMSwxNjkgQEAKKyMgQ29weXJpZ2h0IDIwMjQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIiIiSW50ZWdyYXRpb24gdGVzdHMgZm9yIEVkaXQgTW9uaXRvci4iIiIKKworaW1wb3J0IGdsb2IKK2Zyb20gaW1wb3J0bGliIGltcG9ydCByZXNvdXJjZXMKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBwYXRobGliCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc2lnbmFsCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdGltZQoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHVuaXR0ZXN0IGltcG9ydCBtb2NrCisKKworY2xhc3MgRWRpdE1vbml0b3JJbnRlZ3JhdGlvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIEBjbGFzc21ldGhvZAorICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgIHN1cGVyKCkuc2V0VXBDbGFzcygpCisgICAgIyBDb25maWd1cmUgdG8gcHJpbnQgbG9nZ2luZyB0byBzdGRvdXQuCisgICAgbG9nZ2luZy5iYXNpY0NvbmZpZyhmaWxlbmFtZT1Ob25lLCBsZXZlbD1sb2dnaW5nLkRFQlVHKQorICAgIGNvbnNvbGUgPSBsb2dnaW5nLlN0cmVhbUhhbmRsZXIoc3lzLnN0ZG91dCkKKyAgICBsb2dnaW5nLmdldExvZ2dlcigiIikuYWRkSGFuZGxlcihjb25zb2xlKQorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICBzdXBlcigpLnNldFVwKCkKKyAgICBzZWxmLndvcmtpbmdfZGlyID0gdGVtcGZpbGUuVGVtcG9yYXJ5RGlyZWN0b3J5KCkKKyAgICBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoID0gcGF0aGxpYi5QYXRoKHNlbGYud29ya2luZ19kaXIubmFtZSkuam9pbnBhdGgoCisgICAgICAgICJmaWxlcyIKKyAgICApCisgICAgc2VsZi5yb290X21vbml0b3JpbmdfcGF0aC5ta2RpcigpCisgICAgc2VsZi5lZGl0X21vbml0b3JfYmluYXJ5X3BhdGggPSBzZWxmLl9pbXBvcnRfZXhlY3V0YWJsZSgiZWRpdF9tb25pdG9yIikKKyAgICBzZWxmLnBhdGNoID0gbW9jay5wYXRjaC5kaWN0KAorICAgICAgICBvcy5lbnZpcm9uLCB7IkVOQUJMRV9BTkRST0lEX0VESVRfTU9OSVRPUiI6ICJ0cnVlIn0KKyAgICApCisgICAgc2VsZi5wYXRjaC5zdGFydCgpCisKKyAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgIHNlbGYucGF0Y2guc3RvcCgpCisgICAgc2VsZi53b3JraW5nX2Rpci5jbGVhbnVwKCkKKyAgICBzdXBlcigpLnRlYXJEb3duKCkKKworICBkZWYgdGVzdF9sb2dfc2luZ2xlX2VkaXRfZXZlbnRfc3VjY2VzcyhzZWxmKToKKyAgICBwID0gc2VsZi5fc3RhcnRfZWRpdF9tb25pdG9yX3Byb2Nlc3MoKQorCisgICAgIyBDcmVhdGUgdGhlIC5naXQgZmlsZSB1bmRlciB0aGUgbW9uaXRvcmluZyBkaXIuCisgICAgc2VsZi5yb290X21vbml0b3JpbmdfcGF0aC5qb2lucGF0aCgiLmdpdCIpLnRvdWNoKCkKKworICAgICMgQ3JlYXRlIGFuZCBtb2RpZnkgYSBmaWxlLgorICAgIHRlc3RfZmlsZSA9IHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGguam9pbnBhdGgoInRlc3QudHh0IikKKyAgICB3aXRoIG9wZW4odGVzdF9maWxlLCAidyIpIGFzIGY6CisgICAgICBmLndyaXRlKCJzb21ldGhpbmciKQorCisgICAgIyBNb3ZlIHRoZSBmaWxlLgorICAgIHRlc3RfZmlsZV9tb3ZlZCA9IHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGguam9pbnBhdGgoIm5ld190ZXN0LnR4dCIpCisgICAgdGVzdF9maWxlLnJlbmFtZSh0ZXN0X2ZpbGVfbW92ZWQpCisKKyAgICAjIERlbGV0ZSB0aGUgZmlsZS4KKyAgICB0ZXN0X2ZpbGVfbW92ZWQudW5saW5rKCkKKworICAgICMgR2l2ZSBzb21lIHRpbWUgZm9yIHRoZSBlZGl0IG1vbml0b3IgdG8gcmVjZWl2ZSB0aGUgZWRpdCBldmVudC4KKyAgICB0aW1lLnNsZWVwKDEpCisgICAgIyBTdG9wIHRoZSBlZGl0IG1vbml0b3IgYW5kIGZsdXNoIGFsbCBldmVudHMuCisgICAgb3Mua2lsbChwLnBpZCwgc2lnbmFsLlNJR0lOVCkKKyAgICBwLmNvbW11bmljYXRlKCkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZ2V0X2xvZ2dlZF9ldmVudHNfbnVtKCksIDQpCisKKyAgZGVmIHRlc3Rfc3RhcnRfbXVsdGlwbGVfZWRpdF9tb25pdG9yX29ubHlfb25lX3N0YXJ0ZWQoc2VsZik6CisgICAgcDEgPSBzZWxmLl9zdGFydF9lZGl0X21vbml0b3JfcHJvY2Vzcyh3YWl0X2Zvcl9vYnNlcnZlcl9zdGFydD1GYWxzZSkKKyAgICBwMiA9IHNlbGYuX3N0YXJ0X2VkaXRfbW9uaXRvcl9wcm9jZXNzKHdhaXRfZm9yX29ic2VydmVyX3N0YXJ0PUZhbHNlKQorICAgIHAzID0gc2VsZi5fc3RhcnRfZWRpdF9tb25pdG9yX3Byb2Nlc3Mod2FpdF9mb3Jfb2JzZXJ2ZXJfc3RhcnQ9RmFsc2UpCisKKyAgICBsaXZlX3Byb2Nlc3NlcyA9IHNlbGYuX2dldF9saXZlX3Byb2Nlc3NlcyhbcDEsIHAyLCBwM10pCisKKyAgICAjIENsZWFudXAgYWxsIGxpdmUgcHJvY2Vzc2VzLgorICAgIGZvciBwIGluIGxpdmVfcHJvY2Vzc2VzOgorICAgICAgb3Mua2lsbChwLnBpZCwgc2lnbmFsLlNJR0lOVCkKKyAgICAgIHAuY29tbXVuaWNhdGUoKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obGl2ZV9wcm9jZXNzZXMpLCAxKQorCisgIGRlZiBfc3RhcnRfZWRpdF9tb25pdG9yX3Byb2Nlc3Moc2VsZiwgd2FpdF9mb3Jfb2JzZXJ2ZXJfc3RhcnQ9VHJ1ZSk6CisgICAgY29tbWFuZCA9IGYiIiIKKyAgICBleHBvcnQgVE1QRElSPSJ7c2VsZi53b3JraW5nX2Rpci5uYW1lfSIKKyAgICB7c2VsZi5lZGl0X21vbml0b3JfYmluYXJ5X3BhdGh9IC0tcGF0aD17c2VsZi5yb290X21vbml0b3JpbmdfcGF0aH0gLS1kcnlfcnVuIiIiCisgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oCisgICAgICAgIGNvbW1hbmQsCisgICAgICAgIHNoZWxsPVRydWUsCisgICAgICAgIHRleHQ9VHJ1ZSwKKyAgICAgICAgc3RhcnRfbmV3X3Nlc3Npb249VHJ1ZSwKKyAgICAgICAgZXhlY3V0YWJsZT0iL2Jpbi9iYXNoIiwKKyAgICApCisgICAgaWYgd2FpdF9mb3Jfb2JzZXJ2ZXJfc3RhcnQ6CisgICAgICBzZWxmLl93YWl0X2Zvcl9vYnNlcnZlcl9zdGFydCh0aW1lX291dD01KQorCisgICAgcmV0dXJuIHAKKworICBkZWYgX3dhaXRfZm9yX29ic2VydmVyX3N0YXJ0KHNlbGYsIHRpbWVfb3V0KToKKyAgICBzdGFydF90aW1lID0gdGltZS50aW1lKCkKKworICAgIHdoaWxlIHRpbWUudGltZSgpIDwgc3RhcnRfdGltZSArIHRpbWVfb3V0OgorICAgICAgbG9nX2ZpbGVzID0gZ2xvYi5nbG9iKHNlbGYud29ya2luZ19kaXIubmFtZSArICIvZWRpdF9tb25pdG9yXyovKi5sb2ciKQorICAgICAgaWYgbG9nX2ZpbGVzOgorICAgICAgICB3aXRoIG9wZW4obG9nX2ZpbGVzWzBdLCAiciIpIGFzIGY6CisgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKKyAgICAgICAgICAgIGxvZ2dpbmcuZGVidWcoImluaXRpYWwgbG9nOiAlcyIsIGxpbmUpCisgICAgICAgICAgICBpZiBsaW5lLnJzdHJpcCgiXG4iKS5lbmRzd2l0aCgiT2JzZXJ2ZXIgc3RhcnRlZC4iKToKKyAgICAgICAgICAgICAgcmV0dXJuCisgICAgICBlbHNlOgorICAgICAgICB0aW1lLnNsZWVwKDEpCisKKyAgICBzZWxmLmZhaWwoZiJPYnNlcnZlciBub3Qgc3RhcnRlZCBpbiB7dGltZV9vdXR9IHNlY29uZHMuIikKKworICBkZWYgX2dldF9sb2dnZWRfZXZlbnRzX251bShzZWxmKToKKyAgICBsb2dfZmlsZXMgPSBnbG9iLmdsb2Ioc2VsZi53b3JraW5nX2Rpci5uYW1lICsgIi9lZGl0X21vbml0b3JfKi8qLmxvZyIpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obG9nX2ZpbGVzKSwgMSkKKworICAgIHdpdGggb3Blbihsb2dfZmlsZXNbMF0sICJyIikgYXMgZjoKKyAgICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgIGxvZ2dpbmcuZGVidWcoImNvbXBsZXRlIGxvZzogJXMiLCBsaW5lKQorICAgICAgICBpZiBsaW5lLnJzdHJpcCgiXG4iKS5lbmRzd2l0aCgiaW4gZHJ5IHJ1bi4iKToKKyAgICAgICAgICByZXR1cm4gaW50KGxpbmUuc3BsaXQoIjoiKVstMV0uc3BsaXQoIiAiKVsyXSkKKworICAgIHJldHVybiAwCisKKyAgZGVmIF9nZXRfbGl2ZV9wcm9jZXNzZXMoc2VsZiwgcHJvY2Vzc2VzKToKKyAgICBsaXZlX3Byb2Nlc3NlcyA9IFtdCisgICAgZm9yIHAgaW4gcHJvY2Vzc2VzOgorICAgICAgdHJ5OgorICAgICAgICBwLndhaXQodGltZW91dD01KQorICAgICAgZXhjZXB0IHN1YnByb2Nlc3MuVGltZW91dEV4cGlyZWQgYXMgZToKKyAgICAgICAgbGl2ZV9wcm9jZXNzZXMuYXBwZW5kKHApCisgICAgICAgIGxvZ2dpbmcuaW5mbygicHJvY2VzczogJWQgc3RpbGwgYWxpdmUuIiwgcC5waWQpCisgICAgICBlbHNlOgorICAgICAgICBsb2dnaW5nLmluZm8oInByb2Nlc3M6ICVkIHN0b3BwZWQuIiwgcC5waWQpCisgICAgcmV0dXJuIGxpdmVfcHJvY2Vzc2VzCisKKyAgZGVmIF9pbXBvcnRfZXhlY3V0YWJsZShzZWxmLCBleGVjdXRhYmxlX25hbWU6IHN0cikgLT4gcGF0aGxpYi5QYXRoOgorICAgIGJpbmFyeV9kaXIgPSBwYXRobGliLlBhdGgoc2VsZi53b3JraW5nX2Rpci5uYW1lKS5qb2lucGF0aCgiYmluYXJ5IikKKyAgICBiaW5hcnlfZGlyLm1rZGlyKCkKKyAgICBleGVjdXRhYmxlX3BhdGggPSBiaW5hcnlfZGlyLmpvaW5wYXRoKGV4ZWN1dGFibGVfbmFtZSkKKyAgICB3aXRoIHJlc291cmNlcy5hc19maWxlKAorICAgICAgICByZXNvdXJjZXMuZmlsZXMoInRlc3RkYXRhIikuam9pbnBhdGgoZXhlY3V0YWJsZV9uYW1lKQorICAgICkgYXMgYmluYXJ5OgorICAgICAgc2h1dGlsLmNvcHkoYmluYXJ5LCBleGVjdXRhYmxlX3BhdGgpCisgICAgZXhlY3V0YWJsZV9wYXRoLmNobW9kKDBvNzU1KQorICAgIHJldHVybiBleGVjdXRhYmxlX3BhdGgKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL2VkaXRfbW9uaXRvci9lZGl0X21vbml0b3JfdGVzdC5weSBiL3Rvb2xzL2VkaXRfbW9uaXRvci9lZGl0X21vbml0b3JfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGEzODcxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZWRpdF9tb25pdG9yL2VkaXRfbW9uaXRvcl90ZXN0LnB5CkBAIC0wLDAgKzEsMzAxIEBACisjIENvcHlyaWdodCAyMDI0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyIiIlVuaXR0ZXN0cyBmb3IgRWRpdCBNb25pdG9yLiIiIgorCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG11bHRpcHJvY2Vzc2luZworaW1wb3J0IG9zCitpbXBvcnQgcGF0aGxpYgoraW1wb3J0IHNpZ25hbAoraW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdGltZQoraW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gYXRlc3QucHJvdG8gaW1wb3J0IGNsaWVudGFuYWx5dGljc19wYjIKK2Zyb20gZWRpdF9tb25pdG9yIGltcG9ydCBlZGl0X21vbml0b3IKK2Zyb20gcHJvdG8gaW1wb3J0IGVkaXRfZXZlbnRfcGIyCisKKworY2xhc3MgRWRpdE1vbml0b3JUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBAY2xhc3NtZXRob2QKKyAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICBzdXBlcigpLnNldFVwQ2xhc3MoKQorICAgICMgQ29uZmlndXJlIHRvIHByaW50IGxvZ2dpbmcgdG8gc3Rkb3V0LgorICAgIGxvZ2dpbmcuYmFzaWNDb25maWcoZmlsZW5hbWU9Tm9uZSwgbGV2ZWw9bG9nZ2luZy5ERUJVRykKKyAgICBjb25zb2xlID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyKHN5cy5zdGRvdXQpCisgICAgbG9nZ2luZy5nZXRMb2dnZXIoJycpLmFkZEhhbmRsZXIoY29uc29sZSkKKworICBkZWYgc2V0VXAoc2VsZik6CisgICAgc3VwZXIoKS5zZXRVcCgpCisgICAgc2VsZi53b3JraW5nX2RpciA9IHRlbXBmaWxlLlRlbXBvcmFyeURpcmVjdG9yeSgpCisgICAgc2VsZi5yb290X21vbml0b3JpbmdfcGF0aCA9IHBhdGhsaWIuUGF0aChzZWxmLndvcmtpbmdfZGlyLm5hbWUpLmpvaW5wYXRoKAorICAgICAgICAnZmlsZXMnCisgICAgKQorICAgIHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGgubWtkaXIoKQorICAgIHNlbGYubG9nX2V2ZW50X2RpciA9IHBhdGhsaWIuUGF0aChzZWxmLndvcmtpbmdfZGlyLm5hbWUpLmpvaW5wYXRoKCdsb2dzJykKKyAgICBzZWxmLmxvZ19ldmVudF9kaXIubWtkaXIoKQorCisgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICBzZWxmLndvcmtpbmdfZGlyLmNsZWFudXAoKQorICAgIHN1cGVyKCkudGVhckRvd24oKQorCisgIGRlZiB0ZXN0X2xvZ19zaW5nbGVfZWRpdF9ldmVudF9zdWNjZXNzKHNlbGYpOgorICAgICMgQ3JlYXRlIHRoZSAuZ2l0IGZpbGUgdW5kZXIgdGhlIG1vbml0b3JpbmcgZGlyLgorICAgIHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGguam9pbnBhdGgoJy5naXQnKS50b3VjaCgpCisgICAgZmFrZV9jY2xpZW50ID0gRmFrZUNsZWFyY3V0Q2xpZW50KAorICAgICAgICBsb2dfb3V0cHV0X2ZpbGU9c2VsZi5sb2dfZXZlbnRfZGlyLmpvaW5wYXRoKCdsb2dzLm91dHB1dCcpCisgICAgKQorICAgIHAgPSBzZWxmLl9zdGFydF90ZXN0X2VkaXRfbW9uaXRvcl9wcm9jZXNzKGZha2VfY2NsaWVudCkKKworICAgICMgQ3JlYXRlIGFuZCBtb2RpZnkgYSBmaWxlLgorICAgIHRlc3RfZmlsZSA9IHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGguam9pbnBhdGgoJ3Rlc3QudHh0JykKKyAgICB3aXRoIG9wZW4odGVzdF9maWxlLCAndycpIGFzIGY6CisgICAgICBmLndyaXRlKCdzb21ldGhpbmcnKQorICAgICMgTW92ZSB0aGUgZmlsZS4KKyAgICB0ZXN0X2ZpbGVfbW92ZWQgPSBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLmpvaW5wYXRoKCduZXdfdGVzdC50eHQnKQorICAgIHRlc3RfZmlsZS5yZW5hbWUodGVzdF9maWxlX21vdmVkKQorICAgICMgRGVsZXRlIHRoZSBmaWxlLgorICAgIHRlc3RfZmlsZV9tb3ZlZC51bmxpbmsoKQorICAgICMgR2l2ZSBzb21lIHRpbWUgZm9yIHRoZSBlZGl0IG1vbml0b3IgdG8gcmVjZWl2ZSB0aGUgZWRpdCBldmVudC4KKyAgICB0aW1lLnNsZWVwKDEpCisgICAgIyBTdG9wIHRoZSBlZGl0IG1vbml0b3IgYW5kIGZsdXNoIGFsbCBldmVudHMuCisgICAgb3Mua2lsbChwLnBpZCwgc2lnbmFsLlNJR0lOVCkKKyAgICBwLmpvaW4oKQorCisgICAgbG9nZ2VkX2V2ZW50cyA9IHNlbGYuX2dldF9sb2dnZWRfZXZlbnRzKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsb2dnZWRfZXZlbnRzKSwgNCkKKyAgICBleHBlY3RlZF9jcmVhdGVfZXZlbnQgPSBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuU2luZ2xlRWRpdEV2ZW50KAorICAgICAgICBmaWxlX3BhdGg9c3RyKAorICAgICAgICAgICAgc2VsZi5yb290X21vbml0b3JpbmdfcGF0aC5qb2lucGF0aCgndGVzdC50eHQnKS5yZXNvbHZlKCkKKyAgICAgICAgKSwKKyAgICAgICAgZWRpdF90eXBlPWVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5DUkVBVEUsCisgICAgKQorICAgIGV4cGVjdGVkX21vZGlmeV9ldmVudCA9IGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5TaW5nbGVFZGl0RXZlbnQoCisgICAgICAgIGZpbGVfcGF0aD1zdHIoCisgICAgICAgICAgICBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLmpvaW5wYXRoKCd0ZXN0LnR4dCcpLnJlc29sdmUoKQorICAgICAgICApLAorICAgICAgICBlZGl0X3R5cGU9ZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50Lk1PRElGWSwKKyAgICApCisgICAgZXhwZWN0ZWRfbW92ZV9ldmVudCA9IGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5TaW5nbGVFZGl0RXZlbnQoCisgICAgICAgIGZpbGVfcGF0aD1zdHIoCisgICAgICAgICAgICBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLmpvaW5wYXRoKCd0ZXN0LnR4dCcpLnJlc29sdmUoKQorICAgICAgICApLAorICAgICAgICBlZGl0X3R5cGU9ZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50Lk1PVkUsCisgICAgKQorICAgIGV4cGVjdGVkX2RlbGV0ZV9ldmVudCA9IGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5TaW5nbGVFZGl0RXZlbnQoCisgICAgICAgIGZpbGVfcGF0aD1zdHIoCisgICAgICAgICAgICBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLmpvaW5wYXRoKCduZXdfdGVzdC50eHQnKS5yZXNvbHZlKCkKKyAgICAgICAgKSwKKyAgICAgICAgZWRpdF90eXBlPWVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5ERUxFVEUsCisgICAgKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGV4cGVjdGVkX2NyZWF0ZV9ldmVudCwKKyAgICAgICAgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LkZyb21TdHJpbmcoCisgICAgICAgICAgICBsb2dnZWRfZXZlbnRzWzBdLnNvdXJjZV9leHRlbnNpb24KKyAgICAgICAgKS5zaW5nbGVfZWRpdF9ldmVudCwKKyAgICApCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgZXhwZWN0ZWRfbW9kaWZ5X2V2ZW50LAorICAgICAgICBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuRnJvbVN0cmluZygKKyAgICAgICAgICAgIGxvZ2dlZF9ldmVudHNbMV0uc291cmNlX2V4dGVuc2lvbgorICAgICAgICApLnNpbmdsZV9lZGl0X2V2ZW50LAorICAgICkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBleHBlY3RlZF9tb3ZlX2V2ZW50LAorICAgICAgICBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuRnJvbVN0cmluZygKKyAgICAgICAgICAgIGxvZ2dlZF9ldmVudHNbMl0uc291cmNlX2V4dGVuc2lvbgorICAgICAgICApLnNpbmdsZV9lZGl0X2V2ZW50LAorICAgICkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBleHBlY3RlZF9kZWxldGVfZXZlbnQsCisgICAgICAgIGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5Gcm9tU3RyaW5nKAorICAgICAgICAgICAgbG9nZ2VkX2V2ZW50c1szXS5zb3VyY2VfZXh0ZW5zaW9uCisgICAgICAgICkuc2luZ2xlX2VkaXRfZXZlbnQsCisgICAgKQorCisKKyAgZGVmIHRlc3RfbG9nX2FnZ3JlZ2F0ZWRfZWRpdF9ldmVudF9zdWNjZXNzKHNlbGYpOgorICAgICMgQ3JlYXRlIHRoZSAuZ2l0IGZpbGUgdW5kZXIgdGhlIG1vbml0b3JpbmcgZGlyLgorICAgIHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGguam9pbnBhdGgoJy5naXQnKS50b3VjaCgpCisgICAgZmFrZV9jY2xpZW50ID0gRmFrZUNsZWFyY3V0Q2xpZW50KAorICAgICAgICBsb2dfb3V0cHV0X2ZpbGU9c2VsZi5sb2dfZXZlbnRfZGlyLmpvaW5wYXRoKCdsb2dzLm91dHB1dCcpCisgICAgKQorICAgIHAgPSBzZWxmLl9zdGFydF90ZXN0X2VkaXRfbW9uaXRvcl9wcm9jZXNzKGZha2VfY2NsaWVudCkKKworICAgICMgQ3JlYXRlIDYgdGVzdCBmaWxlcworICAgIGZvciBpIGluIHJhbmdlKDYpOgorICAgICAgdGVzdF9maWxlID0gc2VsZi5yb290X21vbml0b3JpbmdfcGF0aC5qb2lucGF0aCgndGVzdF8nICsgc3RyKGkpKQorICAgICAgdGVzdF9maWxlLnRvdWNoKCkKKworICAgICMgR2l2ZSBzb21lIHRpbWUgZm9yIHRoZSBlZGl0IG1vbml0b3IgdG8gcmVjZWl2ZSB0aGUgZWRpdCBldmVudC4KKyAgICB0aW1lLnNsZWVwKDEpCisgICAgIyBTdG9wIHRoZSBlZGl0IG1vbml0b3IgYW5kIGZsdXNoIGFsbCBldmVudHMuCisgICAgb3Mua2lsbChwLnBpZCwgc2lnbmFsLlNJR0lOVCkKKyAgICBwLmpvaW4oKQorCisgICAgbG9nZ2VkX2V2ZW50cyA9IHNlbGYuX2dldF9sb2dnZWRfZXZlbnRzKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsb2dnZWRfZXZlbnRzKSwgMSkKKworICAgIGV4cGVjdGVkX2FnZ3JlZ2F0ZWRfZWRpdF9ldmVudCA9ICgKKyAgICAgICAgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LkFnZ3JlZ2F0ZWRFZGl0RXZlbnQoCisgICAgICAgICAgICBudW1fZWRpdHM9NiwKKyAgICAgICAgKQorICAgICkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGV4cGVjdGVkX2FnZ3JlZ2F0ZWRfZWRpdF9ldmVudCwKKyAgICAgICAgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LkZyb21TdHJpbmcoCisgICAgICAgICAgICBsb2dnZWRfZXZlbnRzWzBdLnNvdXJjZV9leHRlbnNpb24KKyAgICAgICAgKS5hZ2dyZWdhdGVkX2VkaXRfZXZlbnQsCisgICAgKQorCisgIGRlZiB0ZXN0X2RvX25vdF9sb2dfZWRpdF9ldmVudF9mb3JfZGlyZWN0b3J5X2NoYW5nZShzZWxmKToKKyAgICAjIENyZWF0ZSB0aGUgLmdpdCBmaWxlIHVuZGVyIHRoZSBtb25pdG9yaW5nIGRpci4KKyAgICBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLmpvaW5wYXRoKCcuZ2l0JykudG91Y2goKQorICAgIGZha2VfY2NsaWVudCA9IEZha2VDbGVhcmN1dENsaWVudCgKKyAgICAgICAgbG9nX291dHB1dF9maWxlPXNlbGYubG9nX2V2ZW50X2Rpci5qb2lucGF0aCgnbG9ncy5vdXRwdXQnKQorICAgICkKKyAgICBwID0gc2VsZi5fc3RhcnRfdGVzdF9lZGl0X21vbml0b3JfcHJvY2VzcyhmYWtlX2NjbGllbnQpCisKKyAgICAjIENyZWF0ZSBhIHN1YiBkaXJlY3RvcnkKKyAgICBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLmpvaW5wYXRoKCd0ZXN0X2RpcicpLm1rZGlyKCkKKyAgICAjIEdpdmUgc29tZSB0aW1lIGZvciB0aGUgZWRpdCBtb25pdG9yIHRvIHJlY2VpdmUgdGhlIGVkaXQgZXZlbnQuCisgICAgdGltZS5zbGVlcCgxKQorICAgICMgU3RvcCB0aGUgZWRpdCBtb25pdG9yIGFuZCBmbHVzaCBhbGwgZXZlbnRzLgorICAgIG9zLmtpbGwocC5waWQsIHNpZ25hbC5TSUdJTlQpCisgICAgcC5qb2luKCkKKworICAgIGxvZ2dlZF9ldmVudHMgPSBzZWxmLl9nZXRfbG9nZ2VkX2V2ZW50cygpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obG9nZ2VkX2V2ZW50cyksIDApCisKKyAgZGVmIHRlc3RfZG9fbm90X2xvZ19lZGl0X2V2ZW50X2Zvcl9oaWRkZW5fZmlsZShzZWxmKToKKyAgICAjIENyZWF0ZSB0aGUgLmdpdCBmaWxlIHVuZGVyIHRoZSBtb25pdG9yaW5nIGRpci4KKyAgICBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLmpvaW5wYXRoKCcuZ2l0JykudG91Y2goKQorICAgIGZha2VfY2NsaWVudCA9IEZha2VDbGVhcmN1dENsaWVudCgKKyAgICAgICAgbG9nX291dHB1dF9maWxlPXNlbGYubG9nX2V2ZW50X2Rpci5qb2lucGF0aCgnbG9ncy5vdXRwdXQnKQorICAgICkKKyAgICBwID0gc2VsZi5fc3RhcnRfdGVzdF9lZGl0X21vbml0b3JfcHJvY2VzcyhmYWtlX2NjbGllbnQpCisKKyAgICAjIENyZWF0ZSBhIGhpZGRlbiBmaWxlLgorICAgIHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGguam9pbnBhdGgoJy50ZXN0LnR4dCcpLnRvdWNoKCkKKyAgICAjIENyZWF0ZSBhIGhpZGRlbiBkaXIuCisgICAgaGlkZGVuX2RpciA9IHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGguam9pbnBhdGgoJy50ZXN0JykKKyAgICBoaWRkZW5fZGlyLm1rZGlyKCkKKyAgICBoaWRkZW5fZGlyLmpvaW5wYXRoKCd0ZXN0LnR4dCcpLnRvdWNoKCkKKyAgICAjIEdpdmUgc29tZSB0aW1lIGZvciB0aGUgZWRpdCBtb25pdG9yIHRvIHJlY2VpdmUgdGhlIGVkaXQgZXZlbnQuCisgICAgdGltZS5zbGVlcCgxKQorICAgICMgU3RvcCB0aGUgZWRpdCBtb25pdG9yIGFuZCBmbHVzaCBhbGwgZXZlbnRzLgorICAgIG9zLmtpbGwocC5waWQsIHNpZ25hbC5TSUdJTlQpCisgICAgcC5qb2luKCkKKworICAgIGxvZ2dlZF9ldmVudHMgPSBzZWxmLl9nZXRfbG9nZ2VkX2V2ZW50cygpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obG9nZ2VkX2V2ZW50cyksIDApCisKKyAgZGVmIHRlc3RfZG9fbm90X2xvZ19lZGl0X2V2ZW50X2Zvcl9ub25fZ2l0X3Byb2plY3RfZmlsZShzZWxmKToKKyAgICBmYWtlX2NjbGllbnQgPSBGYWtlQ2xlYXJjdXRDbGllbnQoCisgICAgICAgIGxvZ19vdXRwdXRfZmlsZT1zZWxmLmxvZ19ldmVudF9kaXIuam9pbnBhdGgoJ2xvZ3Mub3V0cHV0JykKKyAgICApCisgICAgcCA9IHNlbGYuX3N0YXJ0X3Rlc3RfZWRpdF9tb25pdG9yX3Byb2Nlc3MoZmFrZV9jY2xpZW50KQorCisgICAgIyBDcmVhdGUgYSBmaWxlLgorICAgIHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGguam9pbnBhdGgoJ3Rlc3QudHh0JykudG91Y2goKQorICAgICMgQ3JlYXRlIGEgZmlsZSB1bmRlciBhIHN1YiBkaXIuCisgICAgc3ViX2RpciA9IHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGguam9pbnBhdGgoJy50ZXN0JykKKyAgICBzdWJfZGlyLm1rZGlyKCkKKyAgICBzdWJfZGlyLmpvaW5wYXRoKCd0ZXN0LnR4dCcpLnRvdWNoKCkKKyAgICAjIEdpdmUgc29tZSB0aW1lIGZvciB0aGUgZWRpdCBtb25pdG9yIHRvIHJlY2VpdmUgdGhlIGVkaXQgZXZlbnQuCisgICAgdGltZS5zbGVlcCgxKQorICAgICMgU3RvcCB0aGUgZWRpdCBtb25pdG9yIGFuZCBmbHVzaCBhbGwgZXZlbnRzLgorICAgIG9zLmtpbGwocC5waWQsIHNpZ25hbC5TSUdJTlQpCisgICAgcC5qb2luKCkKKworICAgIGxvZ2dlZF9ldmVudHMgPSBzZWxmLl9nZXRfbG9nZ2VkX2V2ZW50cygpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obG9nZ2VkX2V2ZW50cyksIDApCisKKyAgZGVmIHRlc3RfbG9nX2VkaXRfZXZlbnRfZmFpbChzZWxmKToKKyAgICAjIENyZWF0ZSB0aGUgLmdpdCBmaWxlIHVuZGVyIHRoZSBtb25pdG9yaW5nIGRpci4KKyAgICBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLmpvaW5wYXRoKCcuZ2l0JykudG91Y2goKQorICAgIGZha2VfY2NsaWVudCA9IEZha2VDbGVhcmN1dENsaWVudCgKKyAgICAgICAgbG9nX291dHB1dF9maWxlPXNlbGYubG9nX2V2ZW50X2Rpci5qb2lucGF0aCgnbG9ncy5vdXRwdXQnKSwKKyAgICAgICAgcmFpc2VfbG9nX2V4Y2VwdGlvbj1UcnVlLAorICAgICkKKyAgICBwID0gc2VsZi5fc3RhcnRfdGVzdF9lZGl0X21vbml0b3JfcHJvY2VzcyhmYWtlX2NjbGllbnQpCisKKyAgICAjIENyZWF0ZSBhIGZpbGUuCisgICAgc2VsZi5yb290X21vbml0b3JpbmdfcGF0aC5qb2lucGF0aCgndGVzdC50eHQnKS50b3VjaCgpCisgICAgIyBHaXZlIHNvbWUgdGltZSBmb3IgdGhlIGVkaXQgbW9uaXRvciB0byByZWNlaXZlIHRoZSBlZGl0IGV2ZW50LgorICAgIHRpbWUuc2xlZXAoMSkKKyAgICAjIFN0b3AgdGhlIGVkaXQgbW9uaXRvciBhbmQgZmx1c2ggYWxsIGV2ZW50cy4KKyAgICBvcy5raWxsKHAucGlkLCBzaWduYWwuU0lHSU5UKQorICAgIHAuam9pbigpCisKKyAgICBsb2dnZWRfZXZlbnRzID0gc2VsZi5fZ2V0X2xvZ2dlZF9ldmVudHMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxvZ2dlZF9ldmVudHMpLCAwKQorCisgIGRlZiBfc3RhcnRfdGVzdF9lZGl0X21vbml0b3JfcHJvY2VzcygKKyAgICAgIHNlbGYsIGNjbGllbnQKKyAgKSAtPiBtdWx0aXByb2Nlc3NpbmcuUHJvY2VzczoKKyAgICByZWNlaXZlciwgc2VuZGVyID0gbXVsdGlwcm9jZXNzaW5nLlBpcGUoKQorICAgICMgU3RhcnQgZWRpdCBtb25pdG9yIGluIGEgc3VicHJvY2Vzcy4KKyAgICBwID0gbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3MoCisgICAgICAgIHRhcmdldD1lZGl0X21vbml0b3Iuc3RhcnQsCisgICAgICAgIGFyZ3M9KHN0cihzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLnJlc29sdmUoKSksIEZhbHNlLCAwLjUsIDUsIGNjbGllbnQsIHNlbmRlciksCisgICAgKQorICAgIHAuZGFlbW9uID0gVHJ1ZQorICAgIHAuc3RhcnQoKQorCisgICAgIyBXYWl0IHVudGlsIG9ic2VydmVyIHN0YXJ0ZWQuCisgICAgcmVjZWl2ZWRfZGF0YSA9IHJlY2VpdmVyLnJlY3YoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlY2VpdmVkX2RhdGEsICdPYnNlcnZlciBzdGFydGVkLicpCisKKyAgICByZWNlaXZlci5jbG9zZSgpCisgICAgcmV0dXJuIHAKKworICBkZWYgX2dldF9sb2dnZWRfZXZlbnRzKHNlbGYpOgorICAgIHdpdGggb3BlbihzZWxmLmxvZ19ldmVudF9kaXIuam9pbnBhdGgoJ2xvZ3Mub3V0cHV0JyksICdyYicpIGFzIGY6CisgICAgICBkYXRhID0gZi5yZWFkKCkKKworICAgIHJldHVybiBbCisgICAgICAgIGNsaWVudGFuYWx5dGljc19wYjIuTG9nRXZlbnQuRnJvbVN0cmluZyhyZWNvcmQpCisgICAgICAgIGZvciByZWNvcmQgaW4gZGF0YS5zcGxpdChiJ1x4MDAnKQorICAgICAgICBpZiByZWNvcmQKKyAgICBdCisKKworY2xhc3MgRmFrZUNsZWFyY3V0Q2xpZW50OgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2dfb3V0cHV0X2ZpbGUsIHJhaXNlX2xvZ19leGNlcHRpb249RmFsc2UpOgorICAgIHNlbGYucGVuZGluZ19sb2dfZXZlbnRzID0gW10KKyAgICBzZWxmLnJhaXNlX2xvZ19leGNlcHRpb24gPSByYWlzZV9sb2dfZXhjZXB0aW9uCisgICAgc2VsZi5sb2dfb3V0cHV0X2ZpbGUgPSBsb2dfb3V0cHV0X2ZpbGUKKworICBkZWYgbG9nKHNlbGYsIGxvZ19ldmVudCk6CisgICAgaWYgc2VsZi5yYWlzZV9sb2dfZXhjZXB0aW9uOgorICAgICAgcmFpc2UgRXhjZXB0aW9uKCd1bmtub3duIGV4Y2VwdGlvbicpCisgICAgc2VsZi5wZW5kaW5nX2xvZ19ldmVudHMuYXBwZW5kKGxvZ19ldmVudCkKKworICBkZWYgZmx1c2hfZXZlbnRzKHNlbGYpOgorICAgIGRlbGltaXRlciA9IGInXHgwMCcgICMgVXNlIGEgbnVsbCBieXRlIGFzIHRoZSBkZWxpbWl0ZXIKKyAgICB3aXRoIG9wZW4oc2VsZi5sb2dfb3V0cHV0X2ZpbGUsICd3YicpIGFzIGY6CisgICAgICBmb3IgbG9nX2V2ZW50IGluIHNlbGYucGVuZGluZ19sb2dfZXZlbnRzOgorICAgICAgICBmLndyaXRlKGxvZ19ldmVudC5TZXJpYWxpemVUb1N0cmluZygpICsgZGVsaW1pdGVyKQorCisgICAgc2VsZi5wZW5kaW5nX2xvZ19ldmVudHMuY2xlYXIoKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWRpdF9tb25pdG9yL21haW4ucHkgYi90b29scy9lZGl0X21vbml0b3IvbWFpbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzJkMTgzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZWRpdF9tb25pdG9yL21haW4ucHkKQEAgLTAsMCArMSwxMTkgQEAKKyMgQ29weXJpZ2h0IDIwMjQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCitpbXBvcnQgc2lnbmFsCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKKworZnJvbSBlZGl0X21vbml0b3IgaW1wb3J0IGRhZW1vbl9tYW5hZ2VyCitmcm9tIGVkaXRfbW9uaXRvciBpbXBvcnQgZWRpdF9tb25pdG9yCisKKworZGVmIGNyZWF0ZV9hcmdfcGFyc2VyKCk6CisgICIiIkNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlZmF1bHQgYXJnIHBhcnNlci4iIiIKKworICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigKKyAgICAgIGRlc2NyaXB0aW9uPSgKKyAgICAgICAgICAnTW9uaXRvcnMgZWRpdHMgaW4gQW5kcm9pZCBzb3VyY2UgY29kZSBhbmQgdXBsb2FkcyB0aGUgZWRpdCBsb2dzLicKKyAgICAgICksCisgICAgICBhZGRfaGVscD1UcnVlLAorICAgICAgZm9ybWF0dGVyX2NsYXNzPWFyZ3BhcnNlLlJhd0Rlc2NyaXB0aW9uSGVscEZvcm1hdHRlciwKKyAgKQorCisgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAnLS1wYXRoJywKKyAgICAgIHR5cGU9c3RyLAorICAgICAgcmVxdWlyZWQ9VHJ1ZSwKKyAgICAgIGhlbHA9J1Jvb3QgcGF0aCB0byBtb25pdG9yIHRoZSBlZGl0IGV2ZW50cy4nLAorICApCisKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICctLWRyeV9ydW4nLAorICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgIGhlbHA9J0RyeSBydW4gdGhlIGVkaXQgbW9uaXRvci4gVGhpcyBzdGFydHMgdGhlIGVkaXQgbW9uaXRvciBwcm9jZXNzIHdpdGhvdXQgYWN0dWFsbHkgc2VuZCB0aGUgZWRpdCBsb2dzIHRvIGNsZWFyY3V0LicsCisgICkKKworICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgJy0tZm9yY2VfY2xlYW51cCcsCisgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgaGVscD0oCisgICAgICAgICAgJ0luc3RlYWQgb2Ygc3RhcnQgYSBuZXcgZWRpdCBtb25pdG9yLCBmb3JjZSBzdG9wIGFsbCBleGlzdGluZyBlZGl0JworICAgICAgICAgICcgbW9uaXRvcnMgaW4gdGhlIHN5c3RlbS4gVGhpcyBvcHRpb24gaXMgb25seSB1c2VkIGluIGVtZXJnZW50IGNhc2VzJworICAgICAgICAgICcgd2hlbiB3ZSB3YW50IHRvIHByZXZlbnQgdXNlciBkYW1hZ2UgYnkgdGhlIGVkaXQgbW9uaXRvci4nCisgICAgICApLAorICApCisKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICctLXZlcmJvc2UnLAorICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgIGhlbHA9KAorICAgICAgICAgICdMb2cgdmVyYm9zZSBpbmZvIGluIHRoZSBsb2cgZmlsZSBmb3IgZGVidWdnaW5nIHB1cnBvc2UuJworICAgICAgKSwKKyAgKQorCisgIHJldHVybiBwYXJzZXIKKworCitkZWYgY29uZmlndXJlX2xvZ2dpbmcodmVyYm9zZT1GYWxzZSk6CisgIHJvb3RfbG9nZ2luZ19kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKHByZWZpeD0nZWRpdF9tb25pdG9yXycpCisgIF8sIGxvZ19wYXRoID0gdGVtcGZpbGUubWtzdGVtcChkaXI9cm9vdF9sb2dnaW5nX2Rpciwgc3VmZml4PScubG9nJykKKworCisgIGxvZ19mbXQgPSAnJShhc2N0aW1lKXMuJShtc2VjcykwM2QgJShmaWxlbmFtZSlzOiUobGluZW5vKXM6JShsZXZlbG5hbWUpczogJShtZXNzYWdlKXMnCisgIGRhdGVfZm10ID0gJyVZLSVtLSVkICVIOiVNOiVTJworICBsb2dfbGV2ZWwgPSBsb2dnaW5nLkRFQlVHIGlmIHZlcmJvc2UgZWxzZSBsb2dnaW5nLklORk8KKworICBsb2dnaW5nLmJhc2ljQ29uZmlnKAorICAgICAgZmlsZW5hbWU9bG9nX3BhdGgsIGxldmVsPWxvZ19sZXZlbCwgZm9ybWF0PWxvZ19mbXQsIGRhdGVmbXQ9ZGF0ZV9mbXQKKyAgKQorICAjIEZpbHRlciBvdXQgbG9ncyBmcm9tIGlub3RpZnlfYnVmZiB0byBwcmV2ZW50IGxvZyBwb2xsdXRpb24uCisgIGxvZ2dpbmcuZ2V0TG9nZ2VyKCd3YXRjaGRvZy5vYnNlcnZlcnMuaW5vdGlmeV9idWZmZXInKS5hZGRGaWx0ZXIoCisgICAgICBsYW1iZGEgcmVjb3JkOiByZWNvcmQuZmlsZW5hbWUgIT0gJ2lub3RpZnlfYnVmZmVyLnB5JykKKyAgcHJpbnQoZidsb2dnaW5nIHRvIGZpbGUge2xvZ19wYXRofScpCisKKworZGVmIHRlcm1fc2lnbmFsX2hhbmRsZXIoX3NpZ25hbF9udW1iZXIsIF9mcmFtZSk6CisgIGxvZ2dpbmcuaW5mbygnUHJvY2VzcyAlZCByZWNlaXZlZCBTSUdURVJNLCBUZXJtaW5hdGluZy4uLicsIG9zLmdldHBpZCgpKQorICBzeXMuZXhpdCgwKQorCisKK2RlZiBtYWluKGFyZ3Y6IGxpc3Rbc3RyXSk6CisgIGFyZ3MgPSBjcmVhdGVfYXJnX3BhcnNlcigpLnBhcnNlX2FyZ3MoYXJndlsxOl0pCisgIGNvbmZpZ3VyZV9sb2dnaW5nKGFyZ3MudmVyYm9zZSkKKyAgaWYgYXJncy5kcnlfcnVuOgorICAgIGxvZ2dpbmcuaW5mbygnVGhpcyBpcyBhIGRyeSBydW4uJykKKyAgZG0gPSBkYWVtb25fbWFuYWdlci5EYWVtb25NYW5hZ2VyKAorICAgICAgYmluYXJ5X3BhdGg9YXJndlswXSwKKyAgICAgIGRhZW1vbl90YXJnZXQ9ZWRpdF9tb25pdG9yLnN0YXJ0LAorICAgICAgZGFlbW9uX2FyZ3M9KGFyZ3MucGF0aCwgYXJncy5kcnlfcnVuKSwKKyAgKQorCisgIHRyeToKKyAgICBpZiBhcmdzLmZvcmNlX2NsZWFudXA6CisgICAgICBkbS5jbGVhbnVwKCkKKyAgICBlbHNlOgorICAgICAgZG0uc3RhcnQoKQorICAgICAgZG0ubW9uaXRvcl9kYWVtb24oKQorICBleGNlcHQgRXhjZXB0aW9uOgorICAgIGxvZ2dpbmcuZXhjZXB0aW9uKCdVbmV4cGVjdGVkIGV4Y2VwdGlvbiByYWlzZWQgd2hlbiBydW4gZGFlbW9uLicpCisgIGZpbmFsbHk6CisgICAgZG0uc3RvcCgpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHVEVSTSwgdGVybV9zaWduYWxfaGFuZGxlcikKKyAgbWFpbihzeXMuYXJndikKZGlmZiAtLWdpdCBhL3Rvb2xzL2VkaXRfbW9uaXRvci9wcm90by9lZGl0X2V2ZW50LnByb3RvIGIvdG9vbHMvZWRpdF9tb25pdG9yL3Byb3RvL2VkaXRfZXZlbnQucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFjYzJlNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2VkaXRfbW9uaXRvci9wcm90by9lZGl0X2V2ZW50LnByb3RvCkBAIC0wLDAgKzEsNTcgQEAKK3N5bnRheCA9ICJwcm90bzMiOworCitwYWNrYWdlIHRvb2xzLmFzdWl0ZS5lZGl0X21vbml0b3I7CisKK21lc3NhZ2UgRWRpdEV2ZW50IHsKKyAgZW51bSBFZGl0VHlwZSB7CisgICAgVU5TVVBQT1JURURfVFlQRSA9IDA7CisgICAgQ1JFQVRFID0gMTsKKyAgICBNT0RJRlkgPSAyOworICAgIERFTEVURSA9IDM7CisgICAgTU9WRSA9IDQ7CisgIH0KKworICBlbnVtIEVycm9yVHlwZSB7CisgICAgVU5LTk9XTl9FUlJPUiA9IDA7CisgICAgRkFJTEVEX1RPX1NUQVJUX0VESVRfTU9OSVRPUiA9IDE7CisgICAgRkFJTEVEX1RPX1NUT1BfRURJVF9NT05JVE9SID0gMjsKKyAgICBGQUlMRURfVE9fUkVCT09UX0VESVRfTU9OSVRPUiA9IDM7CisgICAgS0lMTEVEX0RVRV9UT19FWENFRURFRF9NRU1PUllfVVNBR0UgPSA0OworICAgIEZPUkNFX0NMRUFOVVAgPSA1OworICAgIEtJTExFRF9EVUVfVE9fRVhDRUVERURfQ1BVX1VTQUdFID0gNjsKKyAgfQorCisgIC8vIEV2ZW50IHRoYXQgbG9ncyBhIHNpbmdsZSBlZGl0CisgIG1lc3NhZ2UgU2luZ2xlRWRpdEV2ZW50IHsKKyAgICAvLyBGdWxsIHBhdGggb2YgdGhlIGZpbGUgdGhhdCBlZGl0ZWQuCisgICAgc3RyaW5nIGZpbGVfcGF0aCA9IDE7CisgICAgLy8gVHlwZSBvZiB0aGUgZWRpdC4KKyAgICBFZGl0VHlwZSBlZGl0X3R5cGUgPSAyOworICB9CisKKyAgLy8gRXZlbnQgdGhhdCBsb2dzIGFnZ3JlZ2F0ZWQgaW5mbyBmb3IgYSBzZXQgb2YgZWRpdHMuCisgIG1lc3NhZ2UgQWdncmVnYXRlZEVkaXRFdmVudCB7CisgICAgaW50MzIgbnVtX2VkaXRzID0gMTsKKyAgfQorCisgIC8vIEV2ZW50IHRoYXQgbG9ncyBlcnJvcnMgaGFwcGVuZWQgaW4gdGhlIGVkaXQgbW9uaXRvci4KKyAgbWVzc2FnZSBFZGl0TW9uaXRvckVycm9yRXZlbnQgeworICAgIEVycm9yVHlwZSBlcnJvcl90eXBlID0gMTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBGSUVMRFMgRk9SIEVkaXRFdmVudAorICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gSW50ZXJuYWwgdXNlciBuYW1lLgorICBzdHJpbmcgdXNlcl9uYW1lID0gMTsKKyAgLy8gVGhlIHJvb3Qgb2YgQW5kcm9pZCBzb3VyY2UuCisgIHN0cmluZyBzb3VyY2Vfcm9vdCA9IDI7CisgIC8vIE5hbWUgb2YgdGhlIGhvc3Qgd29ya3N0YXRpb24uCisgIHN0cmluZyBob3N0X25hbWUgPSAzOworCisgIG9uZW9mIGV2ZW50IHsKKyAgICBTaW5nbGVFZGl0RXZlbnQgc2luZ2xlX2VkaXRfZXZlbnQgPSA0OworICAgIEFnZ3JlZ2F0ZWRFZGl0RXZlbnQgYWdncmVnYXRlZF9lZGl0X2V2ZW50ID0gNTsKKyAgICBFZGl0TW9uaXRvckVycm9yRXZlbnQgZWRpdF9tb25pdG9yX2Vycm9yX2V2ZW50ID0gNjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWRpdF9tb25pdG9yL3V0aWxzLnB5IGIvdG9vbHMvZWRpdF9tb25pdG9yL3V0aWxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ODk0OWQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lZGl0X21vbml0b3IvdXRpbHMucHkKQEAgLTAsMCArMSw1MyBAQAorIyBDb3B5cmlnaHQgMjAyNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgaGFzaGxpYgoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBvcworCisKK2RlZiBpc19mZWF0dXJlX2VuYWJsZWQoCisgICAgZmVhdHVyZV9uYW1lOiBzdHIsCisgICAgdXNlcl9uYW1lOiBzdHIsCisgICAgZW5hYmxlX2ZsYWc6IHN0ciA9IE5vbmUsCisgICAgcm9sbG91dF9wZXJjZW50OiBpbnQgPSAxMDAsCispIC0+IGJvb2w6CisgICIiIkRldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiBmZWF0dXJlIGlzIGVuYWJsZWQuCisKKyAgV2hldGhlciBhIGdpdmVuIGZlYXR1cmUgaXMgZW5hYmxlZCBvciBub3QgZGVwZW5kcyBvbiB0d28gZmxhZ3M6IDEpIHRoZQorICBlbmFibGVfZmxhZyB0aGF0IGV4cGxpY2l0bHkgZW5hYmxlL2Rpc2FibGUgdGhlIGZlYXR1cmUgYW5kIDIpIHRoZSByb2xsb3V0X2ZsYWcKKyAgdGhhdCBjb250cm9scyB0aGUgcm9sbG91dCBwZXJjZW50YWdlLgorCisgIEFyZ3M6CisgICAgZmVhdHVyZV9uYW1lOiBuYW1lIG9mIHRoZSBmZWF0dXJlLgorICAgIHVzZXJfbmFtZTogc3lzdGVtIHVzZXIgbmFtZS4KKyAgICBlbmFibGVfZmxhZzogbmFtZSBvZiB0aGUgZW52IHZhciB0aGF0IGVuYWJsZXMvZGlzYWJsZXMgdGhlIGZlYXR1cmUKKyAgICAgIGV4cGxpY2l0bHkuCisgICAgcm9sbG91dF9mbGc6IG5hbWUgb2YgdGhlIGVudiB2YXIgdGhhdCBjb250cm9scyB0aGUgcm9sbG91dCBwZXJjZW50YWdlLCB0aGUKKyAgICAgIHZhbHVlIHN0b3JlZCBpbiB0aGUgZW52IHZhciBzaG91bGQgYmUgYW4gaW50IGJldHdlZW4gMCBhbmQgMTAwIHN0cmluZworICAiIiIKKyAgaWYgZW5hYmxlX2ZsYWc6CisgICAgaWYgb3MuZW52aXJvbi5nZXQoZW5hYmxlX2ZsYWcsICIiKSA9PSAiZmFsc2UiOgorICAgICAgbG9nZ2luZy5pbmZvKCJmZWF0dXJlOiAlcyBpcyBkaXNhYmxlZCIsIGZlYXR1cmVfbmFtZSkKKyAgICAgIHJldHVybiBGYWxzZQorCisgICAgaWYgb3MuZW52aXJvbi5nZXQoZW5hYmxlX2ZsYWcsICIiKSA9PSAidHJ1ZSI6CisgICAgICBsb2dnaW5nLmluZm8oImZlYXR1cmU6ICVzIGlzIGVuYWJsZWQiLCBmZWF0dXJlX25hbWUpCisgICAgICByZXR1cm4gVHJ1ZQorCisgIGhhc2hfb2JqZWN0ID0gaGFzaGxpYi5zaGEyNTYoKQorICBoYXNoX29iamVjdC51cGRhdGUoKHVzZXJfbmFtZSArIGZlYXR1cmVfbmFtZSkuZW5jb2RlKCJ1dGYtOCIpKQorICBoYXNoX251bWJlciA9IGludChoYXNoX29iamVjdC5oZXhkaWdlc3QoKSwgMTYpICUgMTAwCisKKyAgcmV0dXJuIGhhc2hfbnVtYmVyIDwgcm9sbG91dF9wZXJjZW50CmRpZmYgLS1naXQgYS90b29scy9lZGl0X21vbml0b3IvdXRpbHNfdGVzdC5weSBiL3Rvb2xzL2VkaXRfbW9uaXRvci91dGlsc190ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMzBhYTEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lZGl0X21vbml0b3IvdXRpbHNfdGVzdC5weQpAQCAtMCwwICsxLDcxIEBACisjIENvcHlyaWdodCAyMDI0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyIiIlVuaXR0ZXN0cyBmb3IgZWRpdCBtb25pdG9yIHV0aWxzLiIiIgoraW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdW5pdHRlc3QgaW1wb3J0IG1vY2sKKworZnJvbSBlZGl0X21vbml0b3IgaW1wb3J0IHV0aWxzCisKK1RFU1RfVVNFUiA9ICd0ZXN0X3VzZXInCitURVNUX0ZFQVRVUkUgPSAndGVzdF9mZWF0dXJlJworRU5BQkxFX1RFU1RfRkVBVFVSRV9GTEFHID0gJ0VOQUJMRV9URVNUX0ZFQVRVUkUnCitST0xMT1VUX1RFU1RfRkVBVFVSRV9GTEFHID0gJ1JPTExPVVRfVEVTVF9GRUFUVVJFJworCisKK2NsYXNzIEVuYWJsZUZlYXR1cmVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgdGVzdF9mZWF0dXJlX2VuYWJsZWRfd2l0aG91dF9mbGFnKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1dGlscy5pc19mZWF0dXJlX2VuYWJsZWQoVEVTVF9GRUFUVVJFLCBURVNUX1VTRVIpKQorCisgIEBtb2NrLnBhdGNoLmRpY3Qob3MuZW52aXJvbiwge0VOQUJMRV9URVNUX0ZFQVRVUkVfRkxBRzogJ2ZhbHNlJ30sIGNsZWFyPVRydWUpCisgIGRlZiB0ZXN0X2ZlYXR1cmVfZGlzYWJsZWRfd2l0aF9mbGFnKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RmFsc2UoCisgICAgICAgIHV0aWxzLmlzX2ZlYXR1cmVfZW5hYmxlZCgKKyAgICAgICAgICAgIFRFU1RfRkVBVFVSRSwgVEVTVF9VU0VSLCBFTkFCTEVfVEVTVF9GRUFUVVJFX0ZMQUcKKyAgICAgICAgKQorICAgICkKKworICBAbW9jay5wYXRjaC5kaWN0KG9zLmVudmlyb24sIHtFTkFCTEVfVEVTVF9GRUFUVVJFX0ZMQUc6ICd0cnVlJ30sIGNsZWFyPVRydWUpCisgIGRlZiB0ZXN0X2ZlYXR1cmVfZW5hYmxlZF93aXRoX2ZsYWcoc2VsZik6CisgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICB1dGlscy5pc19mZWF0dXJlX2VuYWJsZWQoCisgICAgICAgICAgICBURVNUX0ZFQVRVUkUsIFRFU1RfVVNFUiwgRU5BQkxFX1RFU1RfRkVBVFVSRV9GTEFHCisgICAgICAgICkKKyAgICApCisKKyAgZGVmIHRlc3RfZmVhdHVyZV9lbmFibGVkX3dpdGhfcm9sbG91dF9wZXJjZW50YWdlKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgdXRpbHMuaXNfZmVhdHVyZV9lbmFibGVkKAorICAgICAgICAgICAgVEVTVF9GRUFUVVJFLAorICAgICAgICAgICAgVEVTVF9VU0VSLAorICAgICAgICAgICAgRU5BQkxFX1RFU1RfRkVBVFVSRV9GTEFHLAorICAgICAgICAgICAgOTAsCisgICAgICAgICkKKyAgICApCisKKyAgZGVmIHRlc3RfZmVhdHVyZV9kaXNhYmxlZF93aXRoX3JvbGxvdXRfcGVyY2VudGFnZShzZWxmKToKKyAgICBzZWxmLmFzc2VydEZhbHNlKAorICAgICAgICB1dGlscy5pc19mZWF0dXJlX2VuYWJsZWQoCisgICAgICAgICAgICBURVNUX0ZFQVRVUkUsCisgICAgICAgICAgICBURVNUX1VTRVIsCisgICAgICAgICAgICBFTkFCTEVfVEVTVF9GRUFUVVJFX0ZMQUcsCisgICAgICAgICAgICAxMCwKKyAgICAgICAgKQorICAgICkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL2VudnNldHVwL3J1bl9lbnZzZXR1cF90ZXN0cyBiL3Rvb2xzL2VudnNldHVwL3J1bl9lbnZzZXR1cF90ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41OTc3NDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZW52c2V0dXAvcnVuX2VudnNldHVwX3Rlc3RzCkBAIC0wLDAgKzEsMjI5IEBACisjIS91c3IvYmluL2VudiBweXRob24zCisKKyMgQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ltcG9ydCBvcworaW1wb3J0IHBhdGhsaWIKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCisKK1NPVVJDRV9FTlZTRVRVUD0ic291cmNlIGJ1aWxkL21ha2UvZW52c2V0dXAuc2ggJiYgIgorCitkZWYgdXBkYXRlX2Rpc3BsYXkoKToKKyAgICBzeXMuc3RkZXJyLndyaXRlKCJwYXNzZWRcbiIpCisKK2RlZiBnb190b19yb290KCk6CisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoImJ1aWxkL21ha2UvZW52c2V0dXAuc2giKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBvcy5nZXRjd2QoKSA9PSAiLyI6CisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJDYW4ndCBmaW5kIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlXG4iKTsKKyAgICAgICAgICAgIHByaW50KCJcbkZBSUxFRCIpCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICBvcy5jaGRpcigiLi4iKQorCitkZWYgaXNfdGVzdChuYW1lLCB0aGluZyk6CisgICAgaWYgbm90IGNhbGxhYmxlKHRoaW5nKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaWYgbmFtZSA9PSAidGVzdCI6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIHJldHVybiBuYW1lLnN0YXJ0c3dpdGgoInRlc3QiKQorCisKK2RlZiB0ZXN0KHNoZWxsLCBjb21tYW5kLCBleHBlY3RlZF9yZXR1cm4sIGV4cGVjdGVkX3N0ZG91dCwgZXhwZWN0ZWRfc3RkZXJyLCBleHBlY3RlZF9lbnYpOgorICAgIGNvbW1hbmQgKz0gIjsgX3JjPSQ/IgorICAgIGZvciBlbnYgaW4gZXhwZWN0ZWRfZW52LmtleXMoKToKKyAgICAgICAgY29tbWFuZCArPSBmIjsgZWNobyBFTlY6IHtlbnZ9PVxcXCIke2Vudn1cXFwiIgorICAgIGNvbW1hbmQgKz0gIjsgZXhpdCAkX3JjIgorCisgICAgY21kID0gW3NoZWxsLCAiLWMiLCBjb21tYW5kXQorICAgIHJlc3VsdCA9IHN1YnByb2Nlc3MucnVuKGNtZCwgY2FwdHVyZV9vdXRwdXQ9VHJ1ZSwgdGV4dD1UcnVlKQorCisgICAgc3RhdHVzID0gVHJ1ZQorCisgICAgaWYgcmVzdWx0LnJldHVybmNvZGUgIT0gZXhwZWN0ZWRfcmV0dXJuOgorICAgICAgICBwcmludCgpCisgICAgICAgIHByaW50KGYiRXhwZWN0ZWQgcmV0dXJuIGNvZGU6IHtleHBlY3RlZF9yZXR1cm59IikKKyAgICAgICAgcHJpbnQoZiJBY3R1YWwgcmV0dXJuIGNvZGU6ICAge3Jlc3VsdC5yZXR1cm5jb2RlfSIpCisgICAgICAgIHN0YXR1cyA9IEZhbHNlCisKKyAgICBwcmludGVkX3N0ZG91dCA9IEZhbHNlCisgICAgaWYgZXhwZWN0ZWRfc3Rkb3V0IGFuZCBleHBlY3RlZF9zdGRvdXQgbm90IGluIHJlc3VsdC5zdGRvdXQ6CisgICAgICAgIHByaW50KCkKKyAgICAgICAgcHJpbnQoZiJFeHBlY3RlZCBzdGRvdXQgdG8gY29udGFpbjpcbntleHBlY3RlZF9zdGRvdXR9IikKKyAgICAgICAgcHJpbnQoZiJcbkFjdHVhbCBzdGRvdXQ6XG57cmVzdWx0LnN0ZG91dH0iKQorICAgICAgICBwcmludGVkX3N0ZG91dCA9IFRydWUKKyAgICAgICAgc3RhdHVzID0gRmFsc2UKKworICAgIGlmIGV4cGVjdGVkX3N0ZGVyciBhbmQgZXhwZWN0ZWRfc3RkZXJyIG5vdCBpbiByZXN1bHQuc3RkZXJyOgorICAgICAgICBwcmludCgpCisgICAgICAgIHByaW50KGYiRXhwZWN0ZWQgc3RkZXJyIHRvIGNvbnRhaW46XG57ZXhwZWN0ZWRfc3RkZXJyfSIpCisgICAgICAgIHByaW50KGYiXG5BY3R1YWwgc3RkZXJyOlxue3Jlc3VsdC5zdGRlcnJ9IikKKyAgICAgICAgc3RhdHVzID0gRmFsc2UKKworICAgIGVudl9mYWlsdXJlID0gRmFsc2UKKyAgICBmb3IgaywgdiBpbiBleHBlY3RlZF9lbnYuaXRlbXMoKToKKyAgICAgICAgaWYgZiJ7a309XCJ7dn1cIiIgbm90IGluIHJlc3VsdC5zdGRvdXQ6CisgICAgICAgICAgICBwcmludCgpCisgICAgICAgICAgICBwcmludChmIkV4cGVjdGVkIGVudmlyb25tZW50IHZhcmlhYmxlIHtrfSB0byBiZToge3Z9IC0tLSB7a309XCJ7dn1cIiIpCisgICAgICAgICAgICBlbnZfZmFpbHVyZSA9IFRydWUKKyAgICAgICAgICAgIHN0YXR1cyA9IEZhbHNlCisKKyAgICBpZiBlbnZfZmFpbHVyZSBhbmQgbm90IHByaW50ZWRfc3Rkb3V0OgorICAgICAgICBwcmludCgpCisgICAgICAgIHByaW50KCJTZWUgc3Rkb3V0OiIpCisgICAgICAgIHByaW50KHJlc3VsdC5zdGRvdXQpCisKKyAgICBpZiBub3Qgc3RhdHVzOgorICAgICAgICBwcmludCgpCisgICAgICAgIHByaW50KCJDb21tYW5kIHRvIHJlcHJvZHVjZToiKQorICAgICAgICBwcmludChjb21tYW5kKQorICAgICAgICBwcmludCgpCisKKyAgICByZXR1cm4gc3RhdHVzCisKK05PX0xVTkNIID0geworICAgICJUQVJHRVRfUFJPRFVDVCI6ICIiLAorICAgICJUQVJHRVRfUkVMRUFTRSI6ICIiLAorICAgICJUQVJHRVRfQlVJTERfVkFSSUFOVCI6ICIiLAorfQorCitkZWYgdGVzdF9pbnZhbGlkX2x1bmNoX3RhcmdldChzaGVsbCk6CisgICAgcmV0dXJuIHRlc3Qoc2hlbGwsIFNPVVJDRV9FTlZTRVRVUCArICJsdW5jaCBpbnZhbGlkLXRydW5rX3N0YWdpbmctZW5nIiwKKyAgICAgICAgIGV4cGVjdGVkX3JldHVybj0xLCBleHBlY3RlZF9zdGRvdXQ9Tm9uZSwKKyAgICAgICAgIGV4cGVjdGVkX3N0ZGVycj0iQ2Fubm90IGxvY2F0ZSBjb25maWcgbWFrZWZpbGUgZm9yIHByb2R1Y3QiLAorICAgICAgICAgZXhwZWN0ZWRfZW52PU5PX0xVTkNIKQorCisKK2RlZiB0ZXN0X2Fvc3BfYXJtKHNoZWxsKToKKyAgICByZXR1cm4gdGVzdChzaGVsbCwgU09VUkNFX0VOVlNFVFVQICsgImx1bmNoIGFvc3BfYXJtLXRydW5rX3N0YWdpbmctZW5nIiwKKyAgICAgICAgIGV4cGVjdGVkX3JldHVybj0wLCBleHBlY3RlZF9zdGRvdXQ9Tm9uZSwgZXhwZWN0ZWRfc3RkZXJyPU5vbmUsCisgICAgICAgICBleHBlY3RlZF9lbnY9eworICAgICAgICAgICAgIlRBUkdFVF9QUk9EVUNUIjogImFvc3BfYXJtIiwKKyAgICAgICAgICAgICJUQVJHRVRfUkVMRUFTRSI6ICJ0cnVua19zdGFnaW5nIiwKKyAgICAgICAgICAgICJUQVJHRVRfQlVJTERfVkFSSUFOVCI6ICJlbmciLAorICAgICAgICB9KQorCisKK2RlZiB0ZXN0X2x1bmNoMl9lbXB0eShzaGVsbCk6CisgICAgcmV0dXJuIHRlc3Qoc2hlbGwsIFNPVVJDRV9FTlZTRVRVUCArICJsdW5jaDIiLAorICAgICAgICAgZXhwZWN0ZWRfcmV0dXJuPTEsIGV4cGVjdGVkX3N0ZG91dD1Ob25lLAorICAgICAgICAgZXhwZWN0ZWRfc3RkZXJyPSJObyB0YXJnZXQgc3BlY2lmaWVkLiBTZWUgbHVuY2ggLS1oZWxwIiwKKyAgICAgICAgIGV4cGVjdGVkX2Vudj1OT19MVU5DSCkKKworZGVmIHRlc3RfbHVuY2gyX2ZvdXJfcGFyYW1zKHNoZWxsKToKKyAgICByZXR1cm4gdGVzdChzaGVsbCwgU09VUkNFX0VOVlNFVFVQICsgImx1bmNoMiBhIGIgYyBkIiwKKyAgICAgICAgIGV4cGVjdGVkX3JldHVybj0xLCBleHBlY3RlZF9zdGRvdXQ9Tm9uZSwKKyAgICAgICAgIGV4cGVjdGVkX3N0ZGVycj0iVG9vIG1hbnkgcGFyYW1ldGVycyBnaXZlbi4gU2VlIGx1bmNoIC0taGVscCIsCisgICAgICAgICBleHBlY3RlZF9lbnY9Tk9fTFVOQ0gpCisKK2RlZiB0ZXN0X2x1bmNoMl9hb3NwX2FybShzaGVsbCk6CisgICAgcmV0dXJuIHRlc3Qoc2hlbGwsIFNPVVJDRV9FTlZTRVRVUCArICJsdW5jaDIgYW9zcF9hcm0iLAorICAgICAgICAgZXhwZWN0ZWRfcmV0dXJuPTAsIGV4cGVjdGVkX3N0ZG91dD0iPT09PT09PT09IiwgZXhwZWN0ZWRfc3RkZXJyPU5vbmUsCisgICAgICAgICBleHBlY3RlZF9lbnY9eworICAgICAgICAgICAgIlRBUkdFVF9QUk9EVUNUIjogImFvc3BfYXJtIiwKKyAgICAgICAgICAgICJUQVJHRVRfUkVMRUFTRSI6ICJ0cnVua19zdGFnaW5nIiwKKyAgICAgICAgICAgICJUQVJHRVRfQlVJTERfVkFSSUFOVCI6ICJlbmciLAorICAgICAgICB9KQorCitkZWYgdGVzdF9sdW5jaDJfYW9zcF9hcm1fdHJ1bmtfc3RhZ2luZyhzaGVsbCk6CisgICAgIyBTb21ld2hhdCB1bmZvcnR1bmF0ZSBiZWNhdXNlIHRydW5rX3N0YWdpbmcgaXMgdGhlIG9ubHkgY29uZmlnIGluCisgICAgIyBhb3NwIHNvIHdlIGNhbid0IHJlYWxseSB0ZXN0IHRoYXQgdGhpcyBpc24ndCBqdXN0IGdldHRpbmcgdGhlIGRlZmF1bHQKKyAgICByZXR1cm4gdGVzdChzaGVsbCwgU09VUkNFX0VOVlNFVFVQICsgImx1bmNoMiBhb3NwX2FybSB0cnVua19zdGFnaW5nIiwKKyAgICAgICAgIGV4cGVjdGVkX3JldHVybj0wLCBleHBlY3RlZF9zdGRvdXQ9Ij09PT09PT09PSIsIGV4cGVjdGVkX3N0ZGVycj1Ob25lLAorICAgICAgICAgZXhwZWN0ZWRfZW52PXsKKyAgICAgICAgICAgICJUQVJHRVRfUFJPRFVDVCI6ICJhb3NwX2FybSIsCisgICAgICAgICAgICAiVEFSR0VUX1JFTEVBU0UiOiAidHJ1bmtfc3RhZ2luZyIsCisgICAgICAgICAgICAiVEFSR0VUX0JVSUxEX1ZBUklBTlQiOiAiZW5nIiwKKyAgICAgICAgfSkKKworZGVmIHRlc3RfbHVuY2gyX2Fvc3BfYXJtX3RydW5rX3N0YWdpbmdfdXNlcmRlYnVnKHNoZWxsKToKKyAgICByZXR1cm4gdGVzdChzaGVsbCwgU09VUkNFX0VOVlNFVFVQICsgImx1bmNoMiBhb3NwX2FybSB0cnVua19zdGFnaW5nIHVzZXJkZWJ1ZyIsCisgICAgICAgICBleHBlY3RlZF9yZXR1cm49MCwgZXhwZWN0ZWRfc3Rkb3V0PSI9PT09PT09PT0iLCBleHBlY3RlZF9zdGRlcnI9Tm9uZSwKKyAgICAgICAgIGV4cGVjdGVkX2Vudj17CisgICAgICAgICAgICAiVEFSR0VUX1BST0RVQ1QiOiAiYW9zcF9hcm0iLAorICAgICAgICAgICAgIlRBUkdFVF9SRUxFQVNFIjogInRydW5rX3N0YWdpbmciLAorICAgICAgICAgICAgIlRBUkdFVF9CVUlMRF9WQVJJQU5UIjogInVzZXJkZWJ1ZyIsCisgICAgICAgIH0pCisKK2RlZiB0ZXN0X2xpc3RfcHJvZHVjdHMoc2hlbGwpOgorICAgIHJldHVybiB0ZXN0KHNoZWxsLCAiYnVpbGQvc29vbmcvYmluL2xpc3RfcHJvZHVjdHMiLAorICAgICAgICAgZXhwZWN0ZWRfcmV0dXJuPTAsIGV4cGVjdGVkX3N0ZG91dD0iYW9zcF9hcm0iLCBleHBlY3RlZF9zdGRlcnI9Tm9uZSwKKyAgICAgICAgIGV4cGVjdGVkX2Vudj1OT19MVU5DSCkKKworZGVmIHRlc3RfbGlzdF9yZWxlYXNlc19wYXJhbShzaGVsbCk6CisgICAgcmV0dXJuIHRlc3Qoc2hlbGwsICJidWlsZC9zb29uZy9iaW4vbGlzdF9yZWxlYXNlcyBhb3NwX2FybSIsCisgICAgICAgICBleHBlY3RlZF9yZXR1cm49MCwgZXhwZWN0ZWRfc3Rkb3V0PSJ0cnVua19zdGFnaW5nIiwgZXhwZWN0ZWRfc3RkZXJyPU5vbmUsCisgICAgICAgICBleHBlY3RlZF9lbnY9Tk9fTFVOQ0gpCisKK2RlZiB0ZXN0X2xpc3RfcmVsZWFzZXNfZW52KHNoZWxsKToKKyAgICByZXR1cm4gdGVzdChzaGVsbCwgIlRBUkdFVF9QUk9EVUNUPWFvc3BfYXJtIGJ1aWxkL3Nvb25nL2Jpbi9saXN0X3JlbGVhc2VzIiwKKyAgICAgICAgIGV4cGVjdGVkX3JldHVybj0wLCBleHBlY3RlZF9zdGRvdXQ9InRydW5rX3N0YWdpbmciLCBleHBlY3RlZF9zdGRlcnI9Tm9uZSwKKyAgICAgICAgIGV4cGVjdGVkX2Vudj1OT19MVU5DSCkKKworZGVmIHRlc3RfbGlzdF9yZWxlYXNlc19ub19wcm9kdWN0KHNoZWxsKToKKyAgICByZXR1cm4gdGVzdChzaGVsbCwgImJ1aWxkL3Nvb25nL2Jpbi9saXN0X3JlbGVhc2VzIiwKKyAgICAgICAgIGV4cGVjdGVkX3JldHVybj0xLCBleHBlY3RlZF9zdGRvdXQ9Tm9uZSwgZXhwZWN0ZWRfc3RkZXJyPU5vbmUsCisgICAgICAgICBleHBlY3RlZF9lbnY9Tk9fTFVOQ0gpCisKK2RlZiB0ZXN0X2xpc3RfdmFyaWFudHMoc2hlbGwpOgorICAgIHJldHVybiB0ZXN0KHNoZWxsLCAiYnVpbGQvc29vbmcvYmluL2xpc3RfdmFyaWFudHMiLAorICAgICAgICAgZXhwZWN0ZWRfcmV0dXJuPTAsIGV4cGVjdGVkX3N0ZG91dD0idXNlcmRlYnVnIiwgZXhwZWN0ZWRfc3RkZXJyPU5vbmUsCisgICAgICAgICBleHBlY3RlZF9lbnY9Tk9fTFVOQ0gpCisKKworZGVmIHRlc3RfZ2V0X2J1aWxkX3Zhcl9pbl9wYXRoKHNoZWxsKToKKyAgICByZXR1cm4gdGVzdChzaGVsbCwgU09VUkNFX0VOVlNFVFVQICsgIndoaWNoIGdldF9idWlsZF92YXIgIiwKKyAgICAgICAgIGV4cGVjdGVkX3JldHVybj0wLCBleHBlY3RlZF9zdGRvdXQ9InNvb25nL2JpbiIsIGV4cGVjdGVkX3N0ZGVycj1Ob25lLAorICAgICAgICAgZXhwZWN0ZWRfZW52PU5PX0xVTkNIKQorCisKKworVEVTVFM9c29ydGVkKFsobmFtZSwgdGhpbmcpIGZvciBuYW1lLCB0aGluZyBpbiBsb2NhbHMoKS5pdGVtcygpIGlmIGlzX3Rlc3QobmFtZSwgdGhpbmcpXSkKKworZGVmIG1haW4oKToKKyAgICBpZiBhbnkoW3guZW5kc3dpdGgoIi9zb29uZy9iaW4iKSBmb3IgeCBpbiBvcy5nZXRlbnYoIlBBVEgiKS5zcGxpdCgiOiIpXSk6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoInJ1bl9lbnZzZXR1cF90ZXN0cyBtdXN0IGJlIHJ1biBpbiBhIHNoZWxsIHRoYXQgaGFzIG5vdCBzb3VyY2VkIgorICAgICAgICAgICAgICAgICsgIiBlbnZzZXR1cC5zaFxuXG5GQUlMRURcbiIpCisgICAgICAgIHJldHVybiAxCisKKyAgICBnb190b19yb290KCkKKworICAgIHRlc3RzID0gVEVTVFMKKyAgICBpZiBsZW4oc3lzLmFyZ3YpID4gMToKKyAgICAgICAgdGVzdHMgPSBbKG5hbWUsIGZ1bmMpIGZvciBuYW1lLCBmdW5jIGluIHRlc3RzIGlmIG5hbWUgaW4gc3lzLmFyZ3ZdCisKKyAgICBzaGVsbHMgPSBbIi91c3IvYmluL2Jhc2giLCAiL3Vzci9iaW4venNoIl0KKyAgICB0b3RhbF9jb3VudCA9IGxlbih0ZXN0cykgKiBsZW4oc2hlbGxzKQorICAgIGluZGV4ID0gMQorICAgIGZhaWxlZF90ZXN0cyA9IDAKKworICAgIGZvciBuYW1lLCBmdW5jIGluIHRlc3RzOgorICAgICAgICBmb3Igc2hlbGwgaW4gc2hlbGxzOgorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZShmIlwzM1syS1xye2luZGV4fSBvZiB7dG90YWxfY291bnR9OiB7bmFtZX0gaW4ge3NoZWxsfSIpCisgICAgICAgICAgICBwYXNzZWQgPSBmdW5jKHNoZWxsKQorICAgICAgICAgICAgaWYgbm90IHBhc3NlZDoKKyAgICAgICAgICAgICAgICBmYWlsZWRfdGVzdHMgKz0gMQorICAgICAgICAgICAgaW5kZXggKz0gMQorCisgICAgaWYgZmFpbGVkX3Rlc3RzID4gMDoKKyAgICAgICAgcHJpbnQoZiJcblxuRkFJTEVEOiB7ZmFpbGVkX3Rlc3RzfSBvZiB7dG90YWxfY291bnR9IikKKyAgICAgICAgcmV0dXJuIDEKKyAgICBlbHNlOgorICAgICAgICBwcmludCgiXG5cblNVQ0NFU1MiKQorICAgICAgICByZXR1cm4gMAorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHN5cy5leGl0KG1haW4oKSkKZGlmZiAtLWdpdCBhL3Rvb2xzL2VudnNldHVwL3NwYW1fZm9yX2x1bmNoIGIvdG9vbHMvZW52c2V0dXAvc3BhbV9mb3JfbHVuY2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmUxNTBhNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2VudnNldHVwL3NwYW1fZm9yX2x1bmNoCkBAIC0wLDAgKzEsMzQgQEAKKyMhL2Jpbi9iYXNoCisKKyMgQ29weXJpZ2h0IDIwMjQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBUaGlzIGFkIGlzIGtpbmQgb2YgYmlnLCBzbyBvbmx5IHNob3cgaXQgaWYgdGhpcyBhcHBlYXJzIHRvIGJlIGEgY2xlYW4gYnVpbGQuCitzb3VyY2UgJChjZCAkKGRpcm5hbWUgJEJBU0hfU09VUkNFKSAmPiAvZGV2L251bGwgJiYgcHdkKS8uLi8uLi9zaGVsbF91dGlscy5zaAoraWYgW1sgISAtZSAkKGdldG91dGRpcikvc29vbmcvYnVpbGQuJHtUQVJHRVRfUFJPRFVDVH0ubmluamEgXV07IHRoZW4KKyAgZWNobworICBlY2hvICJ+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IgorICBlY2hvICIgIFdvbmRlcmluZyB3aGV0aGVyIHRvIHVzZSB1c2VyLCB1c2VyZGVidWcgb3IgZW5nPyIKKyAgZWNobworICBlY2hvICIgIHVzZXIgICAgICAgIFRoZSBidWlsZHMgdGhhdCBzaGlwIHRvIHVzZXJzLiBSZWR1Y2VkIGRlYnVnYWJpbGl0eS4iCisgIGVjaG8gIiAgdXNlcmRlYnVnICAgSGlnaCBmaWRlbGl0eSB0byB1c2VyIGJ1aWxkcyBidXQgd2l0aCBzb21lIGRlYnVnZ2luZyBvcHRpb25zIgorICBlY2hvICIgICAgICAgICAgICAgIGVuYWJsZWQuIEJlc3Qgc3VpdGVkIGZvciBwZXJmb3JtYW5jZSB0ZXN0aW5nIG9yIGRheS10by1kYXkgdXNlIgorICBlY2hvICIgICAgICAgICAgICAgIHdpdGggZGVidWdnaW5nIGVuYWJsZWQuIgorICBlY2hvICIgIGVuZyAgICAgICAgIE1vcmUgZGVidWdnaW5nIG9wdGlvbnMgZW5hYmxlZCBhbmQgZmFzdGVyIGJ1aWxkIHRpbWVzLCBidXQiCisgIGVjaG8gIiAgICAgICAgICAgICAgcnVudGltZSBwZXJmb3JtYW5jZSB0cmFkZW9mZnMuIEJlc3Qgc3VpdGVkIGZvciBkYXktdG8tZGF5IgorICBlY2hvICIgICAgICAgICAgICAgIGxvY2FsIGRldmVsb3BtZW50IHdoZW4gbm90IGRvaW5nIHBlcmZvcm1hbmNlIHRlc3RpbmcuIgorICBlY2hvICJ+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IgorICBlY2hvCitmaQorCmRpZmYgLS1naXQgYS90b29scy9ldmVudF9sb2dfdGFncy5weSBiL3Rvb2xzL2V2ZW50X2xvZ190YWdzLnB5CmluZGV4IGE2YWU5ZjEuLmU4NTliNmIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2V2ZW50X2xvZ190YWdzLnB5CisrKyBiL3Rvb2xzL2V2ZW50X2xvZ190YWdzLnB5CkBAIC0xNCwyMSArMTQsMjEgQEAKIAogIiIiQSBtb2R1bGUgZm9yIHJlYWRpbmcgYW5kIHBhcnNpbmcgZXZlbnQtbG9nLXRhZ3MgZmlsZXMuIiIiCiAKK2ltcG9ydCBkYXRhY2xhc3NlcwogaW1wb3J0IHJlCiBpbXBvcnQgc3lzCitmcm9tIHR5cGluZyBpbXBvcnQgT3B0aW9uYWwKIAotY2xhc3MgVGFnKG9iamVjdCk6Ci0gIF9fc2xvdHNfXyA9IFsidGFnbnVtIiwgInRhZ25hbWUiLCAiZGVzY3JpcHRpb24iLCAiZmlsZW5hbWUiLCAibGluZW51bSJdCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRhZ251bSwgdGFnbmFtZSwgZGVzY3JpcHRpb24sIGZpbGVuYW1lLCBsaW5lbnVtKToKLSAgICBzZWxmLnRhZ251bSA9IHRhZ251bQotICAgIHNlbGYudGFnbmFtZSA9IHRhZ25hbWUKLSAgICBzZWxmLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24KLSAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKLSAgICBzZWxmLmxpbmVudW0gPSBsaW5lbnVtCitAZGF0YWNsYXNzZXMuZGF0YWNsYXNzCitjbGFzcyBUYWc6CisgIHRhZ251bTogaW50CisgIHRhZ25hbWU6IHN0cgorICBkZXNjcmlwdGlvbjogT3B0aW9uYWxbc3RyXQorICBmaWxlbmFtZTogc3RyCisgIGxpbmVudW06IGludAogCiAKLWNsYXNzIFRhZ0ZpbGUob2JqZWN0KToKK2NsYXNzIFRhZ0ZpbGU6CiAgICIiIlJlYWQgYW4gaW5wdXQgZXZlbnQtbG9nLXRhZ3MgZmlsZS4iIiIKICAgZGVmIEFkZEVycm9yKHNlbGYsIG1zZywgbGluZW51bT1Ob25lKToKICAgICBpZiBsaW5lbnVtIGlzIE5vbmU6CkBAIC03NiwxNCArNzYsMTEgQEAKICAgICAgICAgICBzZWxmLm9wdGlvbnNbcGFydHNbMV1dID0gcGFydHNbMjpdCiAgICAgICAgICAgY29udGludWUKIAotICAgICAgICBpZiBwYXJ0c1swXSA9PSAiPyI6Ci0gICAgICAgICAgdGFnID0gTm9uZQotICAgICAgICBlbHNlOgotICAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHRhZyA9IGludChwYXJ0c1swXSkKLSAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgIHNlbGYuQWRkRXJyb3IoIlwiJXNcIiBpc24ndCBhbiBpbnRlZ2VyIHRhZyBvciAnPyciICUgKHBhcnRzWzBdLCkpCi0gICAgICAgICAgICBjb250aW51ZQorICAgICAgICB0cnk6CisgICAgICAgICAgdGFnID0gaW50KHBhcnRzWzBdKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICBzZWxmLkFkZEVycm9yKCJcIiVzXCIgaXNuJ3QgYW4gaW50ZWdlciB0YWciICUgKHBhcnRzWzBdLCkpCisgICAgICAgICAgY29udGludWUKIAogICAgICAgICB0YWduYW1lID0gcGFydHNbMV0KICAgICAgICAgaWYgbGVuKHBhcnRzKSA9PSAzOgpAQCAtMTI4LDggKzEyNSw4IEBACiAgICAgICBvdXQgPSBzeXMuc3Rkb3V0CiAgICAgICBvdXRwdXRfZmlsZSA9ICI8c3Rkb3V0PiIKICAgICBlbHNlOgotICAgICAgb3V0ID0gb3BlbihvdXRwdXRfZmlsZSwgIndiIikKLSAgICBvdXQud3JpdGUoc3RyLmVuY29kZShkYXRhKSkKKyAgICAgIG91dCA9IG9wZW4ob3V0cHV0X2ZpbGUsICJ3IikKKyAgICBvdXQud3JpdGUoZGF0YSkKICAgICBvdXQuY2xvc2UoKQogICBleGNlcHQgKElPRXJyb3IsIE9TRXJyb3IpIGFzIGU6CiAgICAgcHJpbnQoImZhaWxlZCB0byB3cml0ZSAlczogJXMiICUgKG91dHB1dF9maWxlLCBlKSwgZmlsZT1zeXMuc3RkZXJyKQpkaWZmIC0tZ2l0IGEvdG9vbHMvZmlsZWxpc3RkaWZmL0FuZHJvaWQuYnAgYi90b29scy9maWxlbGlzdGRpZmYvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODI2ZTUwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZmlsZWxpc3RkaWZmL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKK30KKworcHl0aG9uX2JpbmFyeV9ob3N0IHsKKyAgICBuYW1lOiAiZmlsZV9saXN0X2RpZmYiLAorICAgIHNyY3M6IFsiZmlsZV9saXN0X2RpZmYucHkiXSwKK30KKworcHJlYnVpbHRfZXRjX2hvc3QgeworICAgIG5hbWU6ICJzeXN0ZW1faW1hZ2VfZGlmZl9hbGxvd2xpc3QiLAorICAgIHNyYzogImFsbG93bGlzdCIsCit9CisKK3ByZWJ1aWx0X2V0Y19ob3N0IHsKKyAgICBuYW1lOiAic3lzdGVtX2ltYWdlX2RpZmZfYWxsb3dsaXN0X25leHQiLAorICAgIHNyYzogImFsbG93bGlzdF9uZXh0IiwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9PV05FUlMgYi90b29scy9maWxlbGlzdGRpZmYvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MGZiMTcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9maWxlbGlzdGRpZmYvT1dORVJTCkBAIC0wLDAgKzEgQEAKK3Blci1maWxlIGFsbG93bGlzdCA9IGp1c3Rpbnl1bkBnb29nbGUuY29tLCBqZW9uZ2lrQGdvb2dsZS5jb20sIGtpeW91bmdraW1AZ29vZ2xlLmNvbSwgaW5zZW9iQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9hbGxvd2xpc3QgYi90b29scy9maWxlbGlzdGRpZmYvYWxsb3dsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNzg1ODcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9maWxlbGlzdGRpZmYvYWxsb3dsaXN0CkBAIC0wLDAgKzEsNSBAQAorIyBLbm93biBkaWZmcyB0aGF0IGFyZSBpbnN0YWxsZWQgaW4gZWl0aGVyIHN5c3RlbSBpbWFnZSB3aXRoIHRoZSBjb25maWd1cmF0aW9uCisjIGIvMzUzNDI5NDIyCitpbml0LmVudmlyb24ucmMKKyMgYi8zMzgzNDIzODEKK2V0Yy9OT1RJQ0UueG1sLmd6CmRpZmYgLS1naXQgYS90b29scy9maWxlbGlzdGRpZmYvYWxsb3dsaXN0X25leHQgYi90b29scy9maWxlbGlzdGRpZmYvYWxsb3dsaXN0X25leHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY5MWM5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9hbGxvd2xpc3RfbmV4dApAQCAtMCwwICsxLDkgQEAKKyMgQWxsb3dsaXN0IG9ubHkgZm9yIHRoZSBuZXh0IHJlbGVhc2UgY29uZmlndXJhdGlvbi4KKyMgVE9ETyhiLzM2OTY3ODEyMik6IFRoZSBsaXN0IHdpbGwgYmUgY2xlYXJlZCB3aGVuIHRoZSB0cnVuayBjb25maWd1cmF0aW9ucyBhcmUKKyMgYXZhaWxhYmxlIHRvIHRoZSBuZXh0LgorCisjIEtBVEkgb25seSBpbnN0YWxsZWQgZmlsZXMKK2ZyYW1ld29yay9vYXQveDg2XzY0L2FwZXhAY29tLmFuZHJvaWQuY29tcG9zQGphdmFsaWJAc2VydmljZS1jb21wb3MuamFyQGNsYXNzZXMub2RleAorZnJhbWV3b3JrL29hdC94ODZfNjQvYXBleEBjb20uYW5kcm9pZC5jb21wb3NAamF2YWxpYkBzZXJ2aWNlLWNvbXBvcy5qYXJAY2xhc3Nlcy5vZGV4LmZzdl9tZXRhCitmcmFtZXdvcmsvb2F0L3g4Nl82NC9hcGV4QGNvbS5hbmRyb2lkLmNvbXBvc0BqYXZhbGliQHNlcnZpY2UtY29tcG9zLmphckBjbGFzc2VzLnZkZXgKK2ZyYW1ld29yay9vYXQveDg2XzY0L2FwZXhAY29tLmFuZHJvaWQuY29tcG9zQGphdmFsaWJAc2VydmljZS1jb21wb3MuamFyQGNsYXNzZXMudmRleC5mc3ZfbWV0YQpkaWZmIC0tZ2l0IGEvdG9vbHMvZmlsZWxpc3RkaWZmL2ZpbGVfbGlzdF9kaWZmLnB5IGIvdG9vbHMvZmlsZWxpc3RkaWZmL2ZpbGVfbGlzdF9kaWZmLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NDA4ZTgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9maWxlbGlzdGRpZmYvZmlsZV9saXN0X2RpZmYucHkKQEAgLTAsMCArMSw4MiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgc3lzCisKK0NPTE9SX1dBUk5JTkcgPSAnXDAzM1s5M20nCitDT0xPUl9FUlJPUiA9ICdcMDMzWzkxbScKK0NPTE9SX05PUk1BTCA9ICdcMDMzWzBtJworCitkZWYgZmluZF91bmlxdWVfaXRlbXMoa2F0aV9pbnN0YWxsZWRfZmlsZXMsIHNvb25nX2luc3RhbGxlZF9maWxlcywgc3lzdGVtX21vZHVsZV9uYW1lLCBhbGxvd2xpc3RzKToKKyAgICB3aXRoIG9wZW4oa2F0aV9pbnN0YWxsZWRfZmlsZXMsICdyJykgYXMga2F0aV9saXN0X2ZpbGUsIFwKKyAgICAgICAgICAgIG9wZW4oc29vbmdfaW5zdGFsbGVkX2ZpbGVzLCAncicpIGFzIHNvb25nX2xpc3RfZmlsZToKKyAgICAgICAga2F0aV9maWxlcyA9IHNldChrYXRpX2xpc3RfZmlsZS5yZWFkKCkuc3BsaXQoKSkKKyAgICAgICAgc29vbmdfZmlsZXMgPSBzZXQoc29vbmdfbGlzdF9maWxlLnJlYWQoKS5zcGxpdCgpKQorCisgICAgYWxsb3dlZF9maWxlcyA9IHNldCgpCisgICAgZm9yIGFsbG93bGlzdCBpbiBhbGxvd2xpc3RzOgorICAgICAgICB3aXRoIG9wZW4oYWxsb3dsaXN0LCAncicpIGFzIGFsbG93bGlzdF9maWxlOgorICAgICAgICAgICAgYWxsb3dlZF9maWxlcy51cGRhdGUoc2V0KGZpbHRlcihsYW1iZGEgeDogbGVuKHgpLCBtYXAobGFtYmRhIHg6IHgubHN0cmlwKCkuc3BsaXQoJyMnLDEpWzBdLnJzdHJpcCgpICwgYWxsb3dsaXN0X2ZpbGUucmVhZCgpLnNwbGl0KCdcbicpKSkpKQorCisgICAgZGVmIGlzX3Vua25vd25fZGlmZihmaWxlcGF0aCk6CisgICAgICAgIHJldHVybiBmaWxlcGF0aCBub3QgaW4gYWxsb3dlZF9maWxlcworCisgICAgZGVmIGlzX3VubmVjZXNzYXJ5X2FsbG93bGlzdChmaWxlcGF0aCk6CisgICAgICAgIHJldHVybiBmaWxlcGF0aCBub3QgaW4ga2F0aV9maWxlcy5zeW1tZXRyaWNfZGlmZmVyZW5jZShzb29uZ19maWxlcykKKworICAgIHVuaXF1ZV9pbl9rYXRpID0gc2V0KGZpbHRlcihpc191bmtub3duX2RpZmYsIGthdGlfZmlsZXMgLSBzb29uZ19maWxlcykpCisgICAgdW5pcXVlX2luX3Nvb25nID0gc2V0KGZpbHRlcihpc191bmtub3duX2RpZmYsIHNvb25nX2ZpbGVzIC0ga2F0aV9maWxlcykpCisgICAgdW5uZWNlc3NhcnlfYWxsb3dsaXN0cyA9IHNldChmaWx0ZXIoaXNfdW5uZWNlc3NhcnlfYWxsb3dsaXN0LCBhbGxvd2VkX2ZpbGVzKSkKKworICAgIGlmIHVuaXF1ZV9pbl9rYXRpOgorICAgICAgICBwcmludCgnJykKKyAgICAgICAgcHJpbnQoZid7Q09MT1JfRVJST1J9TWlzc2luZyByZXF1aXJlZCBtb2R1bGVzIGluIHtzeXN0ZW1fbW9kdWxlX25hbWV9IG1vZHVsZS57Q09MT1JfTk9STUFMfScpCisgICAgICAgIHByaW50KGYnVG8gcmVzb2x2ZSB0aGlzIGlzc3VlLCBwbGVhc2UgYWRkIHRoZSBtb2R1bGVzIHRvIHRoZSBBbmRyb2lkLmJwIGZpbGUgZm9yIHRoZSB7c3lzdGVtX21vZHVsZV9uYW1lfSB0byBpbnN0YWxsIHRoZSBmb2xsb3dpbmcgS0FUSSBvbmx5IGluc3RhbGxlZCBmaWxlcy4nKQorICAgICAgICBwcmludChmJ1lvdSBjYW4gZmluZCB0aGUgY29ycmVjdCBBbmRyb2lkLmJwIGZpbGUgdXNpbmcgdGhlIGNvbW1hbmQgImdvbW9kIHtzeXN0ZW1fbW9kdWxlX25hbWV9Ii4nKQorICAgICAgICBwcmludChmJ3tDT0xPUl9XQVJOSU5HfUtBVEkgb25seSBpbnN0YWxsZWQgZmlsZShzKTp7Q09MT1JfTk9STUFMfScpCisgICAgICAgIGZvciBpdGVtIGluIHNvcnRlZCh1bmlxdWVfaW5fa2F0aSk6CisgICAgICAgICAgICBwcmludCgnICAnK2l0ZW0pCisKKyAgICBpZiB1bmlxdWVfaW5fc29vbmc6CisgICAgICAgIHByaW50KCcnKQorICAgICAgICBwcmludChmJ3tDT0xPUl9FUlJPUn1NaXNzaW5nIHBhY2thZ2VzIGluIGJhc2Vfc3lzdGVtLm1rLntDT0xPUl9OT1JNQUx9JykKKyAgICAgICAgcHJpbnQoJ1BsZWFzZSBhZGQgcGFja2FnZXMgaW50byBidWlsZC9tYWtlL3RhcmdldC9wcm9kdWN0L2Jhc2Vfc3lzdGVtLm1rIG9yIGJ1aWxkL21ha2UvdG9vbHMvZmlsZWxpc3RkaWZmL2FsbG93bGlzdCB0byBpbnN0YWxsIG9yIHNraXAgdGhlIGZvbGxvd2luZyBTb29uZyBvbmx5IGluc3RhbGxlZCBmaWxlcy4nKQorICAgICAgICBwcmludChmJ3tDT0xPUl9XQVJOSU5HfVNvb25nIG9ubHkgaW5zdGFsbGVkIGZpbGUocyk6e0NPTE9SX05PUk1BTH0nKQorICAgICAgICBmb3IgaXRlbSBpbiBzb3J0ZWQodW5pcXVlX2luX3Nvb25nKToKKyAgICAgICAgICAgIHByaW50KCcgICcraXRlbSkKKworICAgIGlmIHVubmVjZXNzYXJ5X2FsbG93bGlzdHM6CisgICAgICAgIHByaW50KCcnKQorICAgICAgICBwcmludChmJ3tDT0xPUl9FUlJPUn1Vbm5lY2Vzc2FyeSBmaWxlcyBpbiBhbGxvd2xpc3Que0NPTE9SX05PUk1BTH0nKQorICAgICAgICBwcmludCgnUGxlYXNlIHJlbW92ZSB0aGVzZSBlbnRyaWVzIGZyb20gYnVpbGQvbWFrZS90b29scy9maWxlbGlzdGRpZmYvYWxsb3dsaXN0JykKKyAgICAgICAgZm9yIGl0ZW0gaW4gc29ydGVkKHVubmVjZXNzYXJ5X2FsbG93bGlzdHMpOgorICAgICAgICAgICAgcHJpbnQoJyAgJytpdGVtKQorCisKKyAgICBpZiB1bmlxdWVfaW5fa2F0aSBvciB1bmlxdWVfaW5fc29vbmcgb3IgdW5uZWNlc3NhcnlfYWxsb3dsaXN0czoKKyAgICAgICAgcHJpbnQoJycpCisgICAgICAgIHN5cy5leGl0KDEpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdrYXRpX2luc3RhbGxlZF9maWxlX2xpc3QnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ3Nvb25nX2luc3RhbGxlZF9maWxlX2xpc3QnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ3N5c3RlbV9tb2R1bGVfbmFtZScpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1hbGxvd2xpc3RzJywgbmFyZ3M9JyonLCBkZWZhdWx0PVtdKQorICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisKKyAgICBmaW5kX3VuaXF1ZV9pdGVtcyhhcmdzLmthdGlfaW5zdGFsbGVkX2ZpbGVfbGlzdCwgYXJncy5zb29uZ19pbnN0YWxsZWRfZmlsZV9saXN0LCBhcmdzLnN5c3RlbV9tb2R1bGVfbmFtZSwgYXJncy5hbGxvd2xpc3RzKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9PV05FUlMgYi90b29scy9maW5hbGl6YXRpb24vT1dORVJTCmluZGV4IDUxOGI2MGQuLmIwMGI3NzQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9PV05FUlMKKysrIGIvdG9vbHMvZmluYWxpemF0aW9uL09XTkVSUwpAQCAtMSw1ICsxLDcgQEAKIGluY2x1ZGUgcGxhdGZvcm0vYnVpbGQvc29vbmc6L09XTkVSUwotc21vcmVsYW5kQGdvb2dsZS5jb20KLWFsZXhidXlAZ29vZ2xlLmNvbQorYW1oa0Bnb29nbGUuY29tCitndXJwcmVldGdzQGdvb2dsZS5jb20KK21pY2hhZWx3ckBnb29nbGUuY29tCiBwYXRiQGdvb2dsZS5jb20KK3Ntb3JlbGFuZEBnb29nbGUuY29tCiB6eXlAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvdG9vbHMvZmluYWxpemF0aW9uL1JFQURNRS5tZCBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9SRUFETUUubWQKaW5kZXggNTAxZjI2MC4uNWUyYWVjZCAxMDA2NDQKLS0tIGEvdG9vbHMvZmluYWxpemF0aW9uL1JFQURNRS5tZAorKysgYi90b29scy9maW5hbGl6YXRpb24vUkVBRE1FLm1kCkBAIC0zLDIwICszLDI0IEBACiAKICMjIEF1dG9tYXRpb246CiAxLiBbRW52aXJvbm1lbnQgc2V0dXBdKC4vZW52aXJvbm1lbnQuc2gpLiBTZXQgdmFsdWVzIGZvciB2YXJpb3MgZmluYWxpemF0aW9uIGNvbnN0YW50cy4KLTIuIFtGaW5hbGl6ZSBTREtdKC4vZmluYWxpemUtYWlkbC12bmRrLXNkay1yZXNvdXJjZXMuc2gpLiBQcmVwYXJlIHRoZSBicmFuY2ggZm9yIFNESyByZWxlYXNlLiBTREsgY29udGFpbnMgQW5kcm9pZCBKYXZhIEFQSXMgYW5kIG90aGVyIHN0YWJsZSBBUElzLiBDb21tb25seSByZWZlcnJlZCBhcyBhIDFzdCBzdGVwLgotMy4gW0ZpbmFsaXplIEFuZHJvaWRdKC4vZmluYWxpemUtc2RrLXJlbC5zaCkuIE1hcmsgYnJhbmNoIGFzICJSRUwiLCBpLmUuIHByZXBhcmVzIGZvciBBbmRyb2lkIHJlbGVhc2UuIEFueSBzaWduZWQgYnVpbGQgY29udGFpbmluZyB0aGVzZSBjaGFuZ2VzIHdpbGwgYmUgY29uc2lkZXJlZCBhbiBvZmZpY2lhbCBBbmRyb2lkIFJlbGVhc2UuIFJlZmVycmVkIGFzIGEgMm5kIGZpbmFsaXphdGlvbiBzdGVwLgotNC4gW0ZpbmFsaXplIFNESyBhbmQgc3VibWl0XSguL3N0ZXAtMS5zaCkuIERvIFtGaW5hbGl6ZSBTREtdKC4vZmluYWxpemUtYWlkbC12bmRrLXNkay1yZXNvdXJjZXMuc2gpIHN0ZXAsIGNyZWF0ZSBDTHMsIG9yZ2FuaXplIHRoZW0gaW50byB0b3BpYyBhbmQgc2VuZCB0byBHZXJyaXQuCi0gIGEuIFtVcGRhdGUgU0RLIGFuZCBzdWJtaXRdKC4vdXBkYXRlLXN0ZXAtMS5zaCkuIFNhbWUgYXMgYWJvdmUsIGJ1dCB1cGRhdGVzIHRoZSBleGlzdGluZ3MgQ0xzLgotNS4gW0ZpbmFsaXplIEFuZHJvaWQgYW5kIHN1Ym1pdF0oLi9zdGVwLTIuc2gpLiBEbyBbRmluYWxpemUgQW5kcm9pZF0oLi9maW5hbGl6ZS1zZGstcmVsLnNoKSBzdGVwLCBjcmVhdGUgIENMcywgb3JnYW5pemUgdGhlbSBpbnRvIHRvcGljIGFuZCBzZW5kIHRvIEdlcnJpdC4KLSAgYS4gW1VwZGF0ZSBBbmRyb2lkIGFuZCBzdWJtaXRdKC4vdXBkYXRlLXN0ZXAtMi5zaCkuIFNhbWUgYXMgYWJvdmUsIGJ1dCB1cGRhdGVzIHRoZSBleGlzdGluZ3MgQ0xzLgorMS4gW0ZpbmFsaXplIFZJTlRGXSguL2ZpbmFsaXplLXZpbnRmLXJlc291cmNlcy5zaCkuIFByZXBhcmUgdGhlIGJyYW5jaCBmb3IgVklOVEYgcmVsZWFzZS4KKzEuIFtGaW5hbGl6ZSBTREtdKC4vZmluYWxpemUtc2RrLXJlc291cmNlcy5zaCkuIFByZXBhcmUgdGhlIGJyYW5jaCBmb3IgU0RLIHJlbGVhc2UuIFNESyBjb250YWlucyBBbmRyb2lkIEphdmEgQVBJcyBhbmQgb3RoZXIgc3RhYmxlIEFQSXMuIENvbW1vbmx5IHJlZmVycmVkIGFzIGEgMXN0IHN0ZXAuCisxLiBbRmluYWxpemUgQW5kcm9pZF0oLi9maW5hbGl6ZS1zZGstcmVsLnNoKS4gTWFyayBicmFuY2ggYXMgIlJFTCIsIGkuZS4gcHJlcGFyZXMgZm9yIEFuZHJvaWQgcmVsZWFzZS4gQW55IHNpZ25lZCBidWlsZCBjb250YWluaW5nIHRoZXNlIGNoYW5nZXMgd2lsbCBiZSBjb25zaWRlcmVkIGFuIG9mZmljaWFsIEFuZHJvaWQgUmVsZWFzZS4gUmVmZXJyZWQgYXMgYSAybmQgZmluYWxpemF0aW9uIHN0ZXAuCisxLiBbRmluYWxpemUgVklOVEYgYW5kIHN1Ym1pdF0oLi9zdGVwLTAuc2gpLiBEbyBGaW5hbGl6ZSBWSU5URiBzdGVwLCBjcmVhdGUgQ0xzLCBvcmdhbml6ZSB0aGVtIGludG8gdG9waWMgYW5kIHNlbmQgdG8gR2Vycml0LgorMS4gW0ZpbmFsaXplIFNESyBhbmQgc3VibWl0XSguL3N0ZXAtMS5zaCkuIERvIEZpbmFsaXplIFNESyBzdGVwLCBjcmVhdGUgQ0xzLCBvcmdhbml6ZSB0aGVtIGludG8gdG9waWMgYW5kIHNlbmQgdG8gR2Vycml0LgorMS4gW0ZpbmFsaXplIEFuZHJvaWQgYW5kIHN1Ym1pdF0oLi9zdGVwLTIuc2gpLiBEbyBbRmluYWxpemUgQW5kcm9pZF0oLi9maW5hbGl6ZS1zZGstcmVsLnNoKSBzdGVwLCBjcmVhdGUgIENMcywgb3JnYW5pemUgdGhlbSBpbnRvIHRvcGljIGFuZCBzZW5kIHRvIEdlcnJpdC4KIAogIyMgQ0k6CiBQZXJmb3JtZWQgaW4gYnVpbGQgdGFyZ2V0cyBpbiBGaW5hbGl6YXRpb24gYnJhbmNoZXMuCi0xLiBbRmluYWxpemF0aW9uIFN0ZXAgMSBmb3IgTWFpbiwgZ2l0X21haW4tZmluYS0xLXJlbGVhc2VdKGh0dHBzOi8vYW5kcm9pZC1idWlsZC5nb29nbGVwbGV4LmNvbS9idWlsZHMvYnJhbmNoZXMvZ2l0X21haW4tZmluYS0xLXJlbGVhc2UvZ3JpZCkuIFRlc3QgWzFzdCBzdGVwL0ZpbmFsaXplIFNES10oLi9maW5hbGl6ZS1haWRsLXZuZGstc2RrLXJlc291cmNlcy5zaCkuCi0yLiBbRmluYWxpemF0aW9uIFN0ZXAgMSBmb3IgVURDLCBnaXRfdWRjLWZpbmEtMS1yZWxlYXNlXShodHRwczovL2FuZHJvaWQtYnVpbGQuZ29vZ2xlcGxleC5jb20vYnVpbGRzL2JyYW5jaGVzL2dpdF91ZGMtZmluYS0xLXJlbGVhc2UvZ3JpZCkuIFNhbWUgYnV0IGZvciB1ZGMtZGV2LgotMy4gW0ZpbmFsaXphdGlvbiBTdGVwIDIgZm9yIE1haW4sIGdpdF9tYWluLWZpbmEtMi1yZWxlYXNlXShodHRwczovL2FuZHJvaWQtYnVpbGQuZ29vZ2xlcGxleC5jb20vYnVpbGRzL2JyYW5jaGVzL2dpdF9tYWluLWZpbmEtMi1yZWxlYXNlL2dyaWQpLiBUZXN0IFsxc3Qgc3RlcC9GaW5hbGl6ZSBTREtdKC4vZmluYWxpemUtYWlkbC12bmRrLXNkay1yZXNvdXJjZXMuc2gpIGFuZCBbMm5kIHN0ZXAvRmluYWxpemUgQW5kcm9pZF0oLi9maW5hbGl6ZS1zZGstcmVsLnNoKS4gVXNlIFtsb2NhbCBmaW5hbGl6YXRpb25dKC4vbG9jYWxvbmx5LXN0ZXBzLnNoKSB0byBidWlsZCBhbmQgY29weSBwcmVzdWJtaXRzLgotNC4gW0ZpbmFsaXphdGlvbiBTdGVwIDIgZm9yIFVEQywgZ2l0X3VkYy1maW5hLTItcmVsZWFzZV0oaHR0cHM6Ly9hbmRyb2lkLWJ1aWxkLmdvb2dsZXBsZXguY29tL2J1aWxkcy9icmFuY2hlcy9naXRfdWRjLWZpbmEtMi1yZWxlYXNlL2dyaWQpLiBTYW1lIGJ1dCBmb3IgdWRjLWRldi4KLTUuIFtMb2NhbCBmaW5hbGl6YXRpb24gc3RlcHNdKC4vbG9jYWxvbmx5LXN0ZXBzLnNoKSBhcmUgZG9uZSBvbmx5IGR1cmluZyBsb2NhbCB0ZXN0aW5nIG9yIGluIHRoZSBDSSBsYWIuIE5vcm1hbGx5IHRoZXNlIHN0ZXBzIHVzZSBhcnRpZmFjdHMgZnJvbSBvdGhlciBidWlsZHMuCisxLiBbRmluYWxpemF0aW9uIFN0ZXAgMCwgZ2l0X21haW4tZmluYS0wLXJlbGVhc2VdKGh0dHBzOi8vYW5kcm9pZC1idWlsZC5jb3JwLmdvb2dsZS5jb20vYnVpbGRfZXhwbG9yZXIvYnJhbmNoL2dpdF9tYWluLWZpbmEtMC1yZWxlYXNlKS4gVGVzdCBGaW5hbGl6ZSBWSU5URi4KKzEuIFtGaW5hbGl6YXRpb24gU3RlcCAxLCBnaXRfbWFpbi1maW5hLTEtcmVsZWFzZV0oaHR0cHM6Ly9hbmRyb2lkLWJ1aWxkLmNvcnAuZ29vZ2xlLmNvbS9idWlsZF9leHBsb3Jlci9icmFuY2gvZ2l0X21haW4tZmluYS0xLXJlbGVhc2UpLiBUZXN0IEZpbmFsaXplIFZJTlRGLCBGaW5hbGl6ZSBTREsuCisxLiBbRmluYWxpemF0aW9uIFN0ZXAgMiwgZ2l0X21haW4tZmluYS0yLXJlbGVhc2VdKGh0dHBzOi8vYW5kcm9pZC1idWlsZC5jb3JwLmdvb2dsZS5jb20vYnVpbGRfZXhwbG9yZXIvYnJhbmNoL2dpdF9tYWluLWZpbmEtMi1yZWxlYXNlKS4gVGVzdCBGaW5hbGl6ZSBWSU5URiwgRmluYWxpemUgU0RLLCBhbmQgWzJuZCBzdGVwL0ZpbmFsaXplIEFuZHJvaWRdKC4vZmluYWxpemUtc2RrLXJlbC5zaCkuIFVzZSBbbG9jYWwgZmluYWxpemF0aW9uXSguL2xvY2Fsb25seS1zdGVwcy5zaCkgdG8gYnVpbGQgYW5kIGNvcHkgcHJlc3VibWl0cy4KKzEuIFtMb2NhbCBmaW5hbGl6YXRpb24gc3RlcHNdKC4vbG9jYWxvbmx5LXN0ZXBzLnNoKSBhcmUgZG9uZSBvbmx5IGR1cmluZyBsb2NhbCB0ZXN0aW5nIG9yIGluIHRoZSBDSSBsYWIuIE5vcm1hbGx5IHRoZXNlIHN0ZXBzIHVzZSBhcnRpZmFjdHMgZnJvbSBvdGhlciBidWlsZHMuCiAKICMjIFV0aWxpdHk6CiBbRnVsbCBjbGVhbnVwXSguL2NsZWFudXAuc2gpLiBSZW1vdmUgYWxsIGxvY2FsIGNoYW5nZXMgYW5kIHN3aXRjaCBlYWNoIHByb2plY3QgaW50byBoZWFkLWxlc3Mgc3RhdGUuIFRoaXMgaXMgdGhlIGJlc3Qgc3RhdGUgdG8gc3luYy9yZWJhc2UvZmluYWxpemUgdGhlIGJyYW5jaC4KKworIyMgRHJ5IHJ1bjoKK1tGdWxsIGNsZWFudXBdKC4vZHJ5cnVuLWNsZWFudXAuc2gpLiBSZW1vdmUgYWxsIGxvY2FsIGNoYW5nZXMgYW5kIHN3aXRjaCBlYWNoIHByb2plY3QgaW50byBoZWFkLWxlc3Mgc3RhdGUuIEFsc28gcmVtb3ZlcyAiRHJ5UnVuIiBicmFuY2hlcy4KK1tTREtdKC4vZHJ5cnVuLXN0ZXAtMS5zaCkuIFBlcmZvcm0gU0RLIGZpbmFsaXphdGlvbiBhbmQgdXBsb2FkIHRoZSBDTHMgdG8gR2Vycml0LgorW1NESyBhbmQgUkVMXSguL2RyeXJ1bi1zdGVwLTEtYW5kLTIuc2gpLiBQZXJmb3JtIFNESyBmaW5hbGl6YXRpb24sIHBsdXMgYWxsIG5lY2Vzc2FyeSBjaGFuZ2VzIHRvIHN3aXRjaCBjb25maWd1cmF0aW9uIHRvIFJFTCwgYW5kIHVwbG9hZCB0aGUgQ0xzIHRvIEdlcnJpdC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9maW5hbGl6YXRpb24vYnVpbGQtc3RlcC0wLWFuZC1tLnNoIGIvdG9vbHMvZmluYWxpemF0aW9uL2J1aWxkLXN0ZXAtMC1hbmQtbS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ODQzODAwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZmluYWxpemF0aW9uL2J1aWxkLXN0ZXAtMC1hbmQtbS5zaApAQCAtMCwwICsxLDIwIEBACisKKyMhL2Jpbi9iYXNoCisjIENvcHlyaWdodCAyMDI0IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCitzZXQgLWV4CitmdW5jdGlvbiBoZWxwKCkgeworICAgIGVjaG8gIkZpbmFsaXplIFZJTlRGIGFuZCBidWlsZCBhIHRhcmdldCBmb3IgdGVzdC4iCisgICAgZWNobyAidXNhZ2U6ICQoYmFzZW5hbWUgIiQwIikgdGFyZ2V0IFtnb2Fscy4uLl0iCit9CitmdW5jdGlvbiBmaW5hbGl6ZV9tYWluX3N0ZXAwX2FuZF9tKCkgeworICAgIGlmIFsgJCMgPT0gMCBdIDsgdGhlbgorICAgICAgICBoZWxwCisgICAgICAgIGV4aXQgMQorICAgIGZpOworICAgIGxvY2FsIHRvcD0iJChkaXJuYW1lICIkMCIpIi8uLi8uLi8uLi8uLgorICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2J1aWxkLXN0ZXAtMC5zaAorICAgIGxvY2FsIG09IiR0b3AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSBUQVJHRVRfUFJPRFVDVD0kMSBUQVJHRVRfUkVMRUFTRT1maW5hXzAgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9dXNlcmRlYnVnIgorICAgICMgVGhpcyBjb21tYW5kIHRlc3RzIHRoZSByZWxlYXNlIHN0YXRlIGZvciBBSURMLgorICAgIEFJRExfRlJPWkVOX1JFTD10cnVlICRtICR7QDoyfQorfQorZmluYWxpemVfbWFpbl9zdGVwMF9hbmRfbSAkQApkaWZmIC0tZ2l0IGEvdG9vbHMvZmluYWxpemF0aW9uL2J1aWxkLXN0ZXAtMC5zaCBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9idWlsZC1zdGVwLTAuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmM0MWExOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9idWlsZC1zdGVwLTAuc2gKQEAgLTAsMCArMSwzMiBAQAorIyEvYmluL2Jhc2gKKyMgQ29weXJpZ2h0IDIwMjQgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworc2V0IC1leAorCitmdW5jdGlvbiBmaW5hbGl6ZV9tYWluX3N0ZXAwKCkgeworICAgIGxvY2FsIHRvcD0iJChkaXJuYW1lICIkMCIpIi8uLi8uLi8uLi8uLgorICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2Vudmlyb25tZW50LnNoCisKKyAgICBsb2NhbCBuZWVkX3ZpbnRmX2ZpbmFsaXplPWZhbHNlCisgICAgaWYgWyAiJEZJTkFMX1NUQVRFIiA9ICJ1bmZpbmFsaXplZCIgXSA7IHRoZW4KKyAgICAgICAgbmVlZF92aW50Zl9maW5hbGl6ZT10cnVlCisgICAgZWxzZQorICAgICAgICAjIGJ1aWxkLXN0ZXAtMC5zaCB0ZXN0cyB0aGUgdmludGYgZmluYWxpemF0aW9uIHN0ZXAgKHN0ZXAtMCkgd2hlbiB0aGUKKyAgICAgICAgIyBGSU5BTF9CT0FSRF9BUElfTEVWRUwgaXMgdGhlIHNhbWUgYXMgdGhlIFJFTEVBU0VfQk9BUkRfQVBJX0xFVkVMOyBhbmQKKyAgICAgICAgIyBSRUxFQVNFX0JPQVJEX0FQSV9MRVZFTF9GUk9aRU4gaXMgbm90IHRydWUgZnJvbSB0aGUgZmluYV8wIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICMgVGhlIEZJTkFMX0JPQVJEX0FQSV9MRVZFTCBtdXN0IGJlIHRoZSBuZXh0IHZlbmRvciBBUEkgbGV2ZWwgdG8gYmUgZmluYWxpemVkLgorICAgICAgICBsb2NhbCBib2FyZF9hcGlfbGV2ZWxfdmFycz0kKFRBUkdFVF9SRUxFQVNFPWZpbmFfMCAkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1kdW1wdmFycy1tb2RlIC12YXJzICJSRUxFQVNFX0JPQVJEX0FQSV9MRVZFTF9GUk9aRU4gUkVMRUFTRV9CT0FSRF9BUElfTEVWRUwiKQorICAgICAgICBsb2NhbCB0YXJnZXRfYm9hcmRfYXBpX2xldmVsX3ZhcnM9IlJFTEVBU0VfQk9BUkRfQVBJX0xFVkVMX0ZST1pFTj0nJworUkVMRUFTRV9CT0FSRF9BUElfTEVWRUw9JyRGSU5BTF9CT0FSRF9BUElfTEVWRUwnIgorICAgICAgICBpZiBbICIkYm9hcmRfYXBpX2xldmVsX3ZhcnMiID0gIiR0YXJnZXRfYm9hcmRfYXBpX2xldmVsX3ZhcnMiIF0gOyB0aGVuCisgICAgICAgICAgICBlY2hvIFRoZSB0YXJnZXQgaXMgYSBmaW5hbGl6YXRpb24gY2FuZGlkYXRlLgorICAgICAgICAgICAgbmVlZF92aW50Zl9maW5hbGl6ZT10cnVlCisgICAgICAgIGZpOworICAgIGZpOworCisgICAgaWYgWyAiJG5lZWRfdmludGZfZmluYWxpemUiID0gdHJ1ZSBdIDsgdGhlbiAgICAgICAgIyBWSU5URiBmaW5hbGl6YXRpb24KKyAgICAgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtdmludGYtcmVzb3VyY2VzLnNoICRACisgICAgZmk7Cit9CisKK2ZpbmFsaXplX21haW5fc3RlcDAgJEAKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9idWlsZC1zdGVwLTEtYW5kLTIuc2ggYi90b29scy9maW5hbGl6YXRpb24vYnVpbGQtc3RlcC0xLWFuZC0yLnNoCmluZGV4IDg0ZTI3ODIuLmNhMjI2NzggMTAwNzU1Ci0tLSBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9idWlsZC1zdGVwLTEtYW5kLTIuc2gKKysrIGIvdG9vbHMvZmluYWxpemF0aW9uL2J1aWxkLXN0ZXAtMS1hbmQtMi5zaApAQCAtNywxMSArNywxNiBAQAogICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2Vudmlyb25tZW50LnNoCiAKICAgICBpZiBbICIkRklOQUxfU1RBVEUiID0gInVuZmluYWxpemVkIiBdIDsgdGhlbgotICAgICAgICAjIFNESyBjb2RlbmFtZSAtPiBpbnQKLSAgICAgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtYWlkbC12bmRrLXNkay1yZXNvdXJjZXMuc2gKKyAgICAgICAgIyBWSU5URiBmaW5hbGl6YXRpb24KKyAgICAgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtdmludGYtcmVzb3VyY2VzLnNoCiAgICAgZmk7CiAKLSAgICBpZiBbICIkRklOQUxfU1RBVEUiID0gInVuZmluYWxpemVkIiBdIHx8IFsgIiRGSU5BTF9TVEFURSIgPSAic2RrIiBdIDsgdGhlbgorICAgIGlmIFsgIiRGSU5BTF9TVEFURSIgPSAidW5maW5hbGl6ZWQiIF0gfHwgWyAiJEZJTkFMX1NUQVRFIiA9ICJ2aW50ZiIgXSA7IHRoZW4KKyAgICAgICAgIyBTREsgY29kZW5hbWUgLT4gaW50CisgICAgICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLXNkay1yZXNvdXJjZXMuc2gKKyAgICBmaTsKKworICAgIGlmIFsgIiRGSU5BTF9TVEFURSIgPSAidW5maW5hbGl6ZWQiIF0gfHwgWyAiJEZJTkFMX1NUQVRFIiA9ICJ2aW50ZiIgXSB8fCBbICIkRklOQUxfU1RBVEUiID0gInNkayIgXSA7IHRoZW4KICAgICAgICAgIyBBREIsIFBsYXRmb3JtL01haW5saW5lIFNES3MgYnVpbGQgYW5kIG1vdmUgdG8gcHJlYnVpbHRzCiAgICAgICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2xvY2Fsb25seS1zdGVwcy5zaAogCmRpZmYgLS1naXQgYS90b29scy9maW5hbGl6YXRpb24vYnVpbGQtc3RlcC0xLWFuZC1tLnNoIGIvdG9vbHMvZmluYWxpemF0aW9uL2J1aWxkLXN0ZXAtMS1hbmQtbS5zaAppbmRleCAwZTcxMjlmLi44OGJiMzQ3IDEwMDc1NQotLS0gYS90b29scy9maW5hbGl6YXRpb24vYnVpbGQtc3RlcC0xLWFuZC1tLnNoCisrKyBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9idWlsZC1zdGVwLTEtYW5kLW0uc2gKQEAgLTksMTAgKzksOSBAQAogICAgIGxvY2FsIG09IiR0b3AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSBUQVJHRVRfUFJPRFVDVD1hb3NwX2FybTY0IFRBUkdFVF9CVUlMRF9WQVJJQU5UPXVzZXJkZWJ1ZyIKIAogICAgICMgVGhpcyBjb21tYW5kIHRlc3RzOgotICAgICMgICBUaGUgcmVsZWFzZSBzdGF0ZSBmb3IgQUlETC4KICAgICAjICAgQUJJIGRpZmZlcmVuY2UgYmV0d2VlbiB1c2VyIGFuZCB1c2VyZGVidWcgYnVpbGRzLgogICAgICMgICBSZXNvdXJjZS9TREsgZmluYWxpemF0aW9uLgotICAgIEFJRExfRlJPWkVOX1JFTD10cnVlICRtCisgICAgJG0KIH0KIAogZmluYWxpemVfbWFpbl9zdGVwMV9hbmRfbQpkaWZmIC0tZ2l0IGEvdG9vbHMvZmluYWxpemF0aW9uL2J1aWxkLXN0ZXAtMS5zaCBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9idWlsZC1zdGVwLTEuc2gKaW5kZXggM2Q1ZWFkYi4uNzI5NDY5OCAxMDA3NTUKLS0tIGEvdG9vbHMvZmluYWxpemF0aW9uL2J1aWxkLXN0ZXAtMS5zaAorKysgYi90b29scy9maW5hbGl6YXRpb24vYnVpbGQtc3RlcC0xLnNoCkBAIC03LDggKzcsMTMgQEAKICAgICBzb3VyY2UgJHRvcC9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9lbnZpcm9ubWVudC5zaAogCiAgICAgaWYgWyAiJEZJTkFMX1NUQVRFIiA9ICJ1bmZpbmFsaXplZCIgXSA7IHRoZW4KKyAgICAgICAgIyBWSU5URiBmaW5hbGl6YXRpb24KKyAgICAgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtdmludGYtcmVzb3VyY2VzLnNoCisgICAgZmk7CisKKyAgICBpZiBbICIkRklOQUxfU1RBVEUiID0gInVuZmluYWxpemVkIiBdIHx8IFsgIiRGSU5BTF9TVEFURSIgPSAidmludGYiIF0gOyB0aGVuCiAgICAgICAgICMgQnVpbGQgZmluYWxpemF0aW9uIGFydGlmYWN0cy4KLSAgICAgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtYWlkbC12bmRrLXNkay1yZXNvdXJjZXMuc2gKKyAgICAgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtc2RrLXJlc291cmNlcy5zaAogICAgIGZpOwogfQogCmRpZmYgLS1naXQgYS90b29scy9maW5hbGl6YXRpb24vY2xlYW51cC5zaCBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9jbGVhbnVwLnNoCmluZGV4IGNkODdiMWQuLmUyYTA1OTIgMTAwNzU1Ci0tLSBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9jbGVhbnVwLnNoCisrKyBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9jbGVhbnVwLnNoCkBAIC0xNCw4ICsxNCw4IEBACiAKICAgICByZXBvIGZvcmFsbCAtYyAnXAogICAgICAgICBnaXQgY2hlY2tvdXQgLiA7IGdpdCByZXZlcnQgLS1hYm9ydCA7IGdpdCBjbGVhbiAtZmR4IDtcCi0gICAgICAgIGdpdCBjaGVja291dCBAIDsgZ2l0IGJyYW5jaCBmaW5hLXN0ZXAxIC1EIDsgZ2l0IHJlc2V0IC0taGFyZDsgXAotICAgICAgICByZXBvIHN0YXJ0IGZpbmEtc3RlcDEgOyBnaXQgY2hlY2tvdXQgQCA7IGdpdCBiIGZpbmEtc3RlcDEgLUQgOycKKyAgICAgICAgZ2l0IGNoZWNrb3V0IEAgLS1kZXRhY2ggOyBnaXQgYnJhbmNoIGZpbmEtc3RlcDEgLUQgOyBnaXQgcmVzZXQgLS1oYXJkOyBcCisgICAgICAgIHJlcG8gc3RhcnQgZmluYS1zdGVwMSA7IGdpdCBjaGVja291dCBAIC0tZGV0YWNoIDsgZ2l0IGIgZmluYS1zdGVwMSAtRCA7JwogfQogCiBmaW5hbGl6ZV9yZXZlcnRfbG9jYWxfY2hhbmdlc19tYWluCmRpZmYgLS1naXQgYS90b29scy9maW5hbGl6YXRpb24vY29tbWFuZC1saW5lLW9wdGlvbnMuc2ggYi90b29scy9maW5hbGl6YXRpb24vY29tbWFuZC1saW5lLW9wdGlvbnMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ExZTA0OQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9jb21tYW5kLWxpbmUtb3B0aW9ucy5zaApAQCAtMCwwICsxLDkgQEAKK0FSR1Y9JChnZXRvcHQgLS1vcHRpb25zICcnIC0tbG9uZyBkcnktcnVuIC0tICIkQCIpCitldmFsIHNldCAtLSAiJEFSR1YiCit3aGlsZSB0cnVlOyBkbworICAgIGNhc2UgIiQxIiBpbgorICAgICAgICAtLWRyeS1ydW4pIHJlcG9fdXBsb2FkX2RyeV9ydW5fYXJnPSItLWRyeS1ydW4iOyByZXBvX2JyYW5jaD0iZmluYWxpemF0aW9uLWRyeS1ydW4iOyBzaGlmdCA7OworICAgICAgICAtLSkgc2hpZnQ7IGJyZWFrOzsKKyAgICAgICAgKikgYnJlYWsKKyAgICBlc2FjCitkb25lCmRpZmYgLS1naXQgYS90b29scy9maW5hbGl6YXRpb24vZHJ5cnVuLWNsZWFudXAuc2ggYi90b29scy9maW5hbGl6YXRpb24vZHJ5cnVuLWNsZWFudXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGRhZmZhZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9kcnlydW4tY2xlYW51cC5zaApAQCAtMCwwICsxLDI1IEBACisjIS9iaW4vYmFzaAorIyBCcmluZ3MgbG9jYWwgcmVwb3NpdG9yeSB0byBhIHJlbW90ZSBoZWFkIHN0YXRlLiBBbHNvIHJlbW92ZXMgYWxsIGRyeXJ1biBicmFuY2hlcy4KKworIyBzZXQgLWV4CisKK2Z1bmN0aW9uIGZpbmFsaXplX3JldmVydF9sb2NhbF9jaGFuZ2VzX21haW4oKSB7CisgICAgbG9jYWwgdG9wPSIkKGRpcm5hbWUgIiQwIikiLy4uLy4uLy4uLy4uCisgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZW52aXJvbm1lbnQuc2gKKworICAgIGxvY2FsIG09IiR0b3AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSBUQVJHRVRfUFJPRFVDVD1hb3NwX2FybTY0IFRBUkdFVF9CVUlMRF9WQVJJQU5UPXVzZXJkZWJ1ZyIKKworICAgICMgcmVtb3ZlIHRoZSBvdXQgZm9sZGVyCisgICAgJG0gY2xvYmJlcgorCisgICAgcmVwbyBzZWxmdXBkYXRlCisKKyAgICByZXBvIGZvcmFsbCAtYyAnXAorICAgICAgICBnaXQgY2hlY2tvdXQgLiA7IGdpdCByZXZlcnQgLS1hYm9ydCA7IGdpdCBjbGVhbiAtZmR4IDtcCisgICAgICAgIGdpdCBjaGVja291dCBAIC0tZGV0YWNoIDsgZ2l0IGJyYW5jaCBmaW5hLXN0ZXAxIC1EIDsgZ2l0IHJlc2V0IC0taGFyZDsgXAorICAgICAgICByZXBvIHN0YXJ0IGZpbmEtc3RlcDEgOyBnaXQgY2hlY2tvdXQgQCAtLWRldGFjaCA7IGdpdCBiIGZpbmEtc3RlcDEgLUQgOyBcCisgICAgICAgIGdpdCBiICRGSU5BTF9QTEFURk9STV9DT0RFTkFNRS1TREstRmluYWxpemF0aW9uLURyeVJ1biAtRDsgXAorICAgICAgICBnaXQgYiAkRklOQUxfUExBVEZPUk1fQ09ERU5BTUUtU0RLLUZpbmFsaXphdGlvbi1EcnlSdW4tUmVsIC1EOyAnCit9CisKK2ZpbmFsaXplX3JldmVydF9sb2NhbF9jaGFuZ2VzX21haW4KZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9kcnlydW4tc3RlcC0xLWFuZC0yLnNoIGIvdG9vbHMvZmluYWxpemF0aW9uL2RyeXJ1bi1zdGVwLTEtYW5kLTIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjg4M2JjYQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9kcnlydW4tc3RlcC0xLWFuZC0yLnNoCkBAIC0wLDAgKzEsMzkgQEAKKyMhL2Jpbi9iYXNoCisjIFNjcmlwdCB0byBwZXJmb3JtIDFzdCBhbmQgMm5kIHN0ZXAgb2YgQW5kcm9pZCBGaW5hbGl6YXRpb24sIGNyZWF0ZSBDTHMgYW5kIHVwbG9hZCB0byBHZXJyaXQuCisKK2Z1bmN0aW9uIGNvbW1pdF9zdGVwXzJfY2hhbmdlcygpIHsKKyAgICByZXBvIGZvcmFsbCAtYyAnXAorICAgICAgICBpZiBbWyAkKGdpdCBzdGF0dXMgLS1zaG9ydCkgXV07IHRoZW4KKyAgICAgICAgICAgIHJlcG8gc3RhcnQgIiRGSU5BTF9QTEFURk9STV9DT0RFTkFNRS1TREstRmluYWxpemF0aW9uLURyeVJ1bi1SZWwiIDsKKyAgICAgICAgICAgIGdpdCBhZGQgLUEgLiA7CisgICAgICAgICAgICBnaXQgY29tbWl0IC1tICIkRklOQUxfUExBVEZPUk1fQ09ERU5BTUUvJEZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OIGlzIG5vdyBSRUwiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgLW0gIklnbm9yZS1BT1NQLUZpcnN0OiAkRklOQUxfUExBVEZPUk1fQ09ERU5BTUUgRmluYWxpemF0aW9uCitCdWc6ICRGSU5BTF9CVUdfSUQKK1Rlc3Q6IGJ1aWxkIjsKKworICAgICAgICAgICAgcmVwbyB1cGxvYWQgLS1jYnIgLS1uby12ZXJpZnkgLW8gbm9rZXljaGVjayAtdCAteSAuIDsKKyAgICAgICAgZmknCit9CisKK2Z1bmN0aW9uIGZpbmFsaXplX3N0ZXBfMl9tYWluKCkgeworICAgIGxvY2FsIHRvcD0iJChkaXJuYW1lICIkMCIpIi8uLi8uLi8uLi8uLgorICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2Vudmlyb25tZW50LnNoCisKKyAgICBzb3VyY2UgJHRvcC9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS1zZGstcmVzb3VyY2VzLnNoCisKKyAgICBzb3VyY2UgJHRvcC9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9sb2NhbG9ubHktc3RlcHMuc2gKKworICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLXNkay1yZWwuc2gKKworICAgICMgbW92ZSBhbGwgY2hhbmdlcyB0byBmaW5hbGl6YXRpb24gYnJhbmNoL3RvcGljIGFuZCB1cGxvYWQgdG8gZ2Vycml0CisgICAgY29tbWl0X3N0ZXBfMl9jaGFuZ2VzCisKKyAgICAjIGJ1aWxkIHRvIGNvbmZpcm0gZXZlcnl0aGluZyBpcyBPSworICAgIGxvY2FsIG1fbmV4dD0iJHRvcC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlIFRBUkdFVF9SRUxFQVNFPW5leHQgVEFSR0VUX1BST0RVQ1Q9YW9zcF9hcm02NCBUQVJHRVRfQlVJTERfVkFSSUFOVD11c2VyZGVidWciCisgICAgJG1fbmV4dAorCisgICAgbG9jYWwgbV9maW5hPSIkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgVEFSR0VUX1JFTEVBU0U9ZmluYV8yIFRBUkdFVF9QUk9EVUNUPWFvc3BfYXJtNjQgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9dXNlcmRlYnVnIgorICAgICRtX2ZpbmEKK30KKworZmluYWxpemVfc3RlcF8yX21haW4KZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9kcnlydW4tc3RlcC0xLnNoIGIvdG9vbHMvZmluYWxpemF0aW9uL2RyeXJ1bi1zdGVwLTEuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGYyYmM2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9kcnlydW4tc3RlcC0xLnNoCkBAIC0wLDAgKzEsMzUgQEAKKyMhL2Jpbi9iYXNoCisjIFNjcmlwdCB0byBwZXJmb3JtIGEgZHJ5IHJ1biBvZiBzdGVwIDEgb2YgQW5kcm9pZCBGaW5hbGl6YXRpb24sIGNyZWF0ZSBDTHMgYW5kIHVwbG9hZCB0byBHZXJyaXQuCisKK2Z1bmN0aW9uIGNvbW1pdF9zdGVwXzFfY2hhbmdlcygpIHsKKyAgICByZXBvIGZvcmFsbCAtYyAnXAorICAgICAgICBpZiBbWyAkKGdpdCBzdGF0dXMgLS1zaG9ydCkgXV07IHRoZW4KKyAgICAgICAgICAgIHJlcG8gc3RhcnQgIiRGSU5BTF9QTEFURk9STV9DT0RFTkFNRS1TREstRmluYWxpemF0aW9uLURyeVJ1biIgOworICAgICAgICAgICAgZ2l0IGFkZCAtQSAuIDsKKyAgICAgICAgICAgIGdpdCBjb21taXQgLW0gIiRGSU5BTF9QTEFURk9STV9DT0RFTkFNRSBpcyBub3cgJEZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OIiBcCisgICAgICAgICAgICAgICAgICAgICAgIC1tICJJZ25vcmUtQU9TUC1GaXJzdDogJEZJTkFMX1BMQVRGT1JNX0NPREVOQU1FIEZpbmFsaXphdGlvbgorQnVnOiAkRklOQUxfQlVHX0lECitUZXN0OiBidWlsZCI7CisKKyAgICAgICAgICAgIHJlcG8gdXBsb2FkIC0tY2JyIC0tbm8tdmVyaWZ5IC1vIG5va2V5Y2hlY2sgLXQgLXkgLiA7CisgICAgICAgIGZpJworfQorCitmdW5jdGlvbiBmaW5hbGl6ZV9zdGVwXzFfbWFpbigpIHsKKyAgICBsb2NhbCB0b3A9IiQoZGlybmFtZSAiJDAiKSIvLi4vLi4vLi4vLi4KKyAgICBzb3VyY2UgJHRvcC9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9lbnZpcm9ubWVudC5zaAorCisgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtc2RrLXJlc291cmNlcy5zaAorCisgICAgIyBtb3ZlIGFsbCBjaGFuZ2VzIHRvIGZpbmFsaXphdGlvbiBicmFuY2gvdG9waWMgYW5kIHVwbG9hZCB0byBnZXJyaXQKKyAgICBjb21taXRfc3RlcF8xX2NoYW5nZXMKKworICAgICMgYnVpbGQgdG8gY29uZmlybSBldmVyeXRoaW5nIGlzIE9LCisgICAgbG9jYWwgbV9uZXh0PSIkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgVEFSR0VUX1JFTEVBU0U9bmV4dCBUQVJHRVRfUFJPRFVDVD1hb3NwX2FybTY0IFRBUkdFVF9CVUlMRF9WQVJJQU5UPXVzZXJkZWJ1ZyIKKyAgICAkbV9uZXh0CisKKyAgICBsb2NhbCBtX2ZpbmE9IiR0b3AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSBUQVJHRVRfUkVMRUFTRT1maW5hXzEgVEFSR0VUX1BST0RVQ1Q9YW9zcF9hcm02NCBUQVJHRVRfQlVJTERfVkFSSUFOVD11c2VyZGVidWciCisgICAgJG1fZmluYQorfQorCitmaW5hbGl6ZV9zdGVwXzFfbWFpbgpkaWZmIC0tZ2l0IGEvdG9vbHMvZmluYWxpemF0aW9uL2Vudmlyb25tZW50LnNoIGIvdG9vbHMvZmluYWxpemF0aW9uL2Vudmlyb25tZW50LnNoCmluZGV4IGQ5NWJlYTAuLmM3Njk4MGQgMTAwNzU1Ci0tLSBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9lbnZpcm9ubWVudC5zaAorKysgYi90b29scy9maW5hbGl6YXRpb24vZW52aXJvbm1lbnQuc2gKQEAgLTIsMjAgKzIsMzYgQEAKIAogc2V0IC1leAogCi1leHBvcnQgRklOQUxfQlVHX0lEPScyNzU0MDk5ODEnCitleHBvcnQgRklOQUxfQlVHX0lEPScwJyAjIENJIG9ubHkKIAotZXhwb3J0IEZJTkFMX1BMQVRGT1JNX0NPREVOQU1FPSdVcHNpZGVEb3duQ2FrZScKLWV4cG9ydCBDVVJSRU5UX1BMQVRGT1JNX0NPREVOQU1FPSdVcHNpZGVEb3duQ2FrZScKLWV4cG9ydCBGSU5BTF9QTEFURk9STV9DT0RFTkFNRV9KQVZBPSdVUFNJREVfRE9XTl9DQUtFJwotZXhwb3J0IEZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OPSczNCcKLWV4cG9ydCBGSU5BTF9QTEFURk9STV9WRVJTSU9OPScxNCcKK2V4cG9ydCBGSU5BTF9QTEFURk9STV9DT0RFTkFNRT0nVmFuaWxsYUljZUNyZWFtJworZXhwb3J0IENVUlJFTlRfUExBVEZPUk1fQ09ERU5BTUU9J1ZhbmlsbGFJY2VDcmVhbScKK2V4cG9ydCBGSU5BTF9QTEFURk9STV9DT0RFTkFNRV9KQVZBPSdWQU5JTExBX0lDRV9DUkVBTScKK2V4cG9ydCBGSU5BTF9QTEFURk9STV9WRVJTSU9OPScxNScKIAotZXhwb3J0IEZJTkFMX0JVSUxEX1BSRUZJWD0nVVAxQScKLQotZXhwb3J0IEZJTkFMX01BSU5MSU5FX0VYVEVOU0lPTj0nNycKKyMgU2V0IGFyYml0cmFyeSBsYXJnZSB2YWx1ZXMgZm9yIENJLgorIyBTREtfVkVSU0lPTiBuZWVkcyB0byBiZSA8NjEgKGxpbnQvbGlicy9saW50LWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL3Rvb2xzL2xpbnQvZGV0ZWN0b3IvYXBpL0FwaUNvbnN0cmFpbnQua3QpCisjIFRoZXJlIGFyZSBtdWx0aXBsZSBwbGFjZXMgd2hlcmUgd2UgcmVseSBvbiBuZXh0IFNESyB2ZXJzaW9uIHRvIGJlIHByZXZpb3VzICsgMSwgZS5nLiBSRVNPVVJDRVNfU0RLX0lOVC4KKyMgV2UgbWlnaHQgb3IgbWlnaHQgbm90IGZpeCB0aGlzIGluIGZ1dHVyZSwgYnV0IGZvciBub3cgbGV0J3Mga2VlcCBpdCArMS4KK2V4cG9ydCBGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTj0nMzUnCisjIEZlZWwgZnJlZSB0byByYW5kb21pemUgb25jZSBpbiBhIHdoaWxlIHRvIGRldGVjdCBidWdneSB2ZXJzaW9uIGRldGVjdGlvbiBjb2RlLgorZXhwb3J0IEZJTkFMX01BSU5MSU5FX0VYVEVOU0lPTj0nMTMnCiAKICMgT3B0aW9uczoKICMgJ3VuZmluYWxpemVkJyAtIGJyYW5jaCBpcyBpbiBkZXZlbG9wbWVudCBzdGF0ZSwKLSMgJ3NkaycgLSBTREsvQVBJIGlzIGZpbmFsaXplZAorIyAndmludGYnIC0gVklOVEYgaXMgZmluYWxpemVkCisjICdzZGsnIC0gVklOVEYgYW5kIFNESy9BUEkgYXJlIGZpbmFsaXplZAogIyAncmVsJyAtIGJyYW5jaCBpcyBmaW5hbGl6ZWQsIHN3aXRjaGVkIHRvIFJFTAogZXhwb3J0IEZJTkFMX1NUQVRFPSdyZWwnCisKK2V4cG9ydCBCVUlMRF9GUk9NX1NPVVJDRV9TVFVCPXRydWUKKworIyBGSU5BTCB2ZXJzaW9ucyBmb3IgVklOVEYKKyMgVE9ETyhiLzMyMzk4NTI5Nyk6IFRoZSB2ZXJzaW9uIG11c3QgbWF0Y2ggd2l0aCB0aGF0IGZyb20gdGhlIHJlbGVhc2UgY29uZmlndXJhdGlvbi4KKyMgSW5zdGVhZCBvZiBoYXJkY29kaW5nIHRoZSB2ZXJzaW9uIGhlcmUsIHJlYWQgaXQgZnJvbSBhIHJlbGVhc2UgY29uZmlndXJhdGlvbi4KK2V4cG9ydCBGSU5BTF9CT0FSRF9BUElfTEVWRUw9JzIwMjUwNCcKK2V4cG9ydCBGSU5BTF9DT1JSRVNQT05ESU5HX1ZFUlNJT05fTEVUVEVSPSdCJworZXhwb3J0IEZJTkFMX0NPUlJFU1BPTkRJTkdfUExBVEZPUk1fVkVSU0lPTj0nMTYnCitleHBvcnQgRklOQUxfTkVYVF9CT0FSRF9BUElfTEVWRUw9JzIwMjYwNCcKK2V4cG9ydCBGSU5BTF9ORVhUX0NPUlJFU1BPTkRJTkdfVkVSU0lPTl9MRVRURVI9J0MnCitleHBvcnQgRklOQUxfTkVYVF9DT1JSRVNQT05ESU5HX1NES19WRVJTSU9OPSczNycKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS1zZGstcmVsLnNoIGIvdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLXNkay1yZWwuc2gKaW5kZXggNmNmNDEyNC4uYzQ5Zjk3NCAxMDA3NTUKLS0tIGEvdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLXNkay1yZWwuc2gKKysrIGIvdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLXNkay1yZWwuc2gKQEAgLTQsMTkgKzQsMTMgQEAKIAogZnVuY3Rpb24gcmV2ZXJ0X2Ryb2lkc3R1YnNfaGFjaygpIHsKICAgICBpZiBncmVwIC1xICdTVE9QU0hJUDogUkVTVE9SRSBUSElTIExPR0lDIFdIRU4gREVDTEFSSU5HICJSRUwiIEJVSUxEJyAiJHRvcC9idWlsZC9zb29uZy9qYXZhL2Ryb2lkc3R1YnMuZ28iIDsgdGhlbgotICAgICAgICBnaXQgLUMgIiR0b3AvYnVpbGQvc29vbmciIGFwcGx5IC0tYWxsb3ctZW1wdHkgLi4vLi4vYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vYnVpbGRfc29vbmdfamF2YV9kcm9pZHN0dWJzLmdvLnJldmVydF9oYWNrLmRpZmYKLSAgICBmaQotfQotCi1mdW5jdGlvbiByZXZlcnRfcmVzb3VyY2VzX3Nka19pbnRfZml4KCkgewotICAgIGlmIGdyZXAgLXEgJ3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU09VUkNFU19TREtfSU5UID0gU0RLX0lOVDsnICIkdG9wL2ZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEvYW5kcm9pZC9vcy9CdWlsZC5qYXZhIiA7IHRoZW4KLSAgICAgICAgZ2l0IC1DICIkdG9wL2ZyYW1ld29ya3MvYmFzZSIgYXBwbHkgLS1hbGxvdy1lbXB0eSAuLi8uLi9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9mcmFtZXdvcmtzX2Jhc2UucmV2ZXJ0X3Jlc291cmNlX3Nka19pbnQuZGlmZgorICAgICAgICBwYXRjaCAtLXN0cmlwPTEgLS1uby1iYWNrdXAtaWYtbWlzbWF0Y2ggLS1kaXJlY3Rvcnk9IiR0b3AvYnVpbGQvc29vbmciIC0taW5wdXQ9Li4vLi4vYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vYnVpbGRfc29vbmdfamF2YV9kcm9pZHN0dWJzLmdvLnJldmVydF9oYWNrLmRpZmYKICAgICBmaQogfQogCiBmdW5jdGlvbiBhcHBseV9wcmVyZWxlYXNlX3Nka19oYWNrKCkgewogICAgIGlmICEgZ3JlcCAtcSAnU1RPUFNISVA6IGhhY2sgZm9yIHRoZSBwcmUtcmVsZWFzZSBTREsnICIkdG9wL2ZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL3BhcnNpbmcvRnJhbWV3b3JrUGFyc2luZ1BhY2thZ2VVdGlscy5qYXZhIiA7IHRoZW4KLSAgICAgICAgZ2l0IC1DICIkdG9wL2ZyYW1ld29ya3MvYmFzZSIgYXBwbHkgLS1hbGxvdy1lbXB0eSAuLi8uLi9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9mcmFtZXdvcmtzX2Jhc2UuYXBwbHlfaGFjay5kaWZmCisgICAgICAgIHBhdGNoIC0tc3RyaXA9MSAtLW5vLWJhY2t1cC1pZi1taXNtYXRjaCAtLWRpcmVjdG9yeT0iJHRvcC9mcmFtZXdvcmtzL2Jhc2UiIC0taW5wdXQ9Li4vLi4vYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZnJhbWV3b3Jrc19iYXNlLmFwcGx5X2hhY2suZGlmZgogICAgIGZpCiB9CiAKQEAgLTMwLDM2ICsyNCwxOCBAQAogICAgICMgbGV0IHRoZSBhcHBzIGJ1aWx0IHdpdGggcHJlLXJlbGVhc2UgU0RLIHBhcnNlCiAgICAgYXBwbHlfcHJlcmVsZWFzZV9zZGtfaGFjawogCi0gICAgIyBpbiBSRUwgbW9kZSwgcmVzb3VyY2VzIHdvdWxkIGNvcnJlY3RseSBzZXQgdGhlIHJlc291cmNlc19zZGtfaW50LCBubyBmaXggcmVxdWlyZWQKLSAgICByZXZlcnRfcmVzb3VyY2VzX3Nka19pbnRfZml4Ci0KLSAgICAjIGJ1aWxkL21ha2UvY29yZS92ZXJzaW9uX2RlZmF1bHRzLm1rCi0gICAgc2VkIC1pIC1lICJzL1BMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUuJHtGSU5BTF9CVUlMRF9QUkVGSVh9IDo9IC4qL1BMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUuJHtGSU5BTF9CVUlMRF9QUkVGSVh9IDo9IFJFTC9nIiAiJHRvcC9idWlsZC9tYWtlL2NvcmUvdmVyc2lvbl9kZWZhdWx0cy5tayIKLQogICAgICMgY3RzCi0gICAgZWNobyAiJEZJTkFMX1BMQVRGT1JNX1ZFUlNJT04iID4gIiR0b3AvY3RzL3Rlc3RzL3Rlc3RzL29zL2Fzc2V0cy9wbGF0Zm9ybV92ZXJzaW9ucy50eHQiCisgICAgaWYgISBncmVwIC1xICIke0ZJTkFMX1BMQVRGT1JNX1ZFUlNJT059IiAiJHRvcC9jdHMvdGVzdHMvdGVzdHMvb3MvYXNzZXRzL3BsYXRmb3JtX3ZlcnNpb25zLnR4dCIgOyB0aGVuCisgICAgICAgIGVjaG8gJHtGSU5BTF9QTEFURk9STV9WRVJTSU9OfSA+PiAiJHRvcC9jdHMvdGVzdHMvdGVzdHMvb3MvYXNzZXRzL3BsYXRmb3JtX3ZlcnNpb25zLnR4dCIKKyAgICBmaQogICAgIGlmIFsgIiRGSU5BTF9QTEFURk9STV9DT0RFTkFNRSIgIT0gIiRDVVJSRU5UX1BMQVRGT1JNX0NPREVOQU1FIiBdOyB0aGVuCiAgICAgICAgIGVjaG8gIiRDVVJSRU5UX1BMQVRGT1JNX0NPREVOQU1FIiA+PiAiLi9jdHMvdGVzdHMvdGVzdHMvb3MvYXNzZXRzL3BsYXRmb3JtX3ZlcnNpb25zLnR4dCIKICAgICBmaQogICAgIGdpdCAtQyAiJHRvcC9jdHMiIG12IGhvc3RzaWRldGVzdHMvdGhlbWUvYXNzZXRzLyR7RklOQUxfUExBVEZPUk1fQ09ERU5BTUV9IGhvc3RzaWRldGVzdHMvdGhlbWUvYXNzZXRzLyR7RklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT059CiAKLSAgICAjIHN5c3RlbS9zZXBvbGljeQotICAgIG1rZGlyIC1wICIkdG9wL3N5c3RlbS9zZXBvbGljeS9wcmVidWlsdHMvYXBpLyR7RklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT059LjAvIgotICAgIGNwIC1yICIkdG9wL3N5c3RlbS9zZXBvbGljeS9wdWJsaWMvIiAiJHRvcC9zeXN0ZW0vc2Vwb2xpY3kvcHJlYnVpbHRzL2FwaS8ke0ZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OfS4wLyIKLSAgICBjcCAtciAiJHRvcC9zeXN0ZW0vc2Vwb2xpY3kvcHJpdmF0ZS8iICIkdG9wL3N5c3RlbS9zZXBvbGljeS9wcmVidWlsdHMvYXBpLyR7RklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT059LjAvIgotCi0gICAgIyBwcmVidWlsdHMvYWJpLWR1bXBzL25kawotICAgIG1rZGlyIC1wICIkdG9wL3ByZWJ1aWx0cy9hYmktZHVtcHMvbmRrLyRGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTiIKLSAgICBjcCAtciAiJHRvcC9wcmVidWlsdHMvYWJpLWR1bXBzL25kay9jdXJyZW50LzY0LyIgIiR0b3AvcHJlYnVpbHRzL2FiaS1kdW1wcy9uZGsvJEZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OLyIKLQogICAgICMgcHJlYnVpbHRzL2FiaS1kdW1wcy9wbGF0Zm9ybQotICAgIG1rZGlyIC1wICIkdG9wL3ByZWJ1aWx0cy9hYmktZHVtcHMvcGxhdGZvcm0vJEZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OIgotICAgIGNwIC1yICIkdG9wL3ByZWJ1aWx0cy9hYmktZHVtcHMvcGxhdGZvcm0vY3VycmVudC82NC8iICIkdG9wL3ByZWJ1aWx0cy9hYmktZHVtcHMvcGxhdGZvcm0vJEZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OLyIKLQotICAgIGlmIFsgIiRGSU5BTF9TVEFURSIgIT0gInNkayIgXSA7IHRoZW4KLSAgICAgICAgIyBwcmVidWlsdHMvYWJpLWR1bXBzL3ZuZGsKLSAgICAgICAgbXYgIiR0b3AvcHJlYnVpbHRzL2FiaS1kdW1wcy92bmRrLyRDVVJSRU5UX1BMQVRGT1JNX0NPREVOQU1FIiAiJHRvcC9wcmVidWlsdHMvYWJpLWR1bXBzL3ZuZGsvJEZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OIgotICAgIGZpOworICAgICIkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2giIC0tbWFrZS1tb2RlIFRBUkdFVF9SRUxFQVNFPW5leHQgVEFSR0VUX1BST0RVQ1Q9YW9zcF9hcm02NCBUQVJHRVRfQlVJTERfVkFSSUFOVD11c2VyZGVidWcgY3JlYXRlX3JlZmVyZW5jZV9kdW1wcworICAgIEFORFJPSURfQlVJTERfVE9QPSIkdG9wIiAiJHRvcC9vdXQvaG9zdC9saW51eC14ODYvYmluL2NyZWF0ZV9yZWZlcmVuY2VfZHVtcHMiIC1yZWxlYXNlIG5leHQgLS1idWlsZC12YXJpYW50IHVzZXJkZWJ1ZyAtLWxpYi12YXJpYW50IEFQRVgKIH0KIAogZmluYWxpemVfc2RrX3JlbApkaWZmIC0tZ2l0IGEvdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLWFpZGwtdm5kay1zZGstcmVzb3VyY2VzLnNoIGIvdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLXNkay1yZXNvdXJjZXMuc2gKc2ltaWxhcml0eSBpbmRleCA2MCUKcmVuYW1lIGZyb20gdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLWFpZGwtdm5kay1zZGstcmVzb3VyY2VzLnNoCnJlbmFtZSB0byB0b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtc2RrLXJlc291cmNlcy5zaAppbmRleCAwNDkxNzAxLi4xMDI2NmVkIDEwMDc1NQotLS0gYS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtYWlkbC12bmRrLXNkay1yZXNvdXJjZXMuc2gKKysrIGIvdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLXNkay1yZXNvdXJjZXMuc2gKQEAgLTQsMTMgKzQsOCBAQAogCiBmdW5jdGlvbiBhcHBseV9kcm9pZHN0dWJzX2hhY2soKSB7CiAgICAgaWYgISBncmVwIC1xICdTVE9QU0hJUDogUkVTVE9SRSBUSElTIExPR0lDIFdIRU4gREVDTEFSSU5HICJSRUwiIEJVSUxEJyAiJHRvcC9idWlsZC9zb29uZy9qYXZhL2Ryb2lkc3R1YnMuZ28iIDsgdGhlbgotICAgICAgICBnaXQgLUMgIiR0b3AvYnVpbGQvc29vbmciIGFwcGx5IC0tYWxsb3ctZW1wdHkgLi4vLi4vYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vYnVpbGRfc29vbmdfamF2YV9kcm9pZHN0dWJzLmdvLmFwcGx5X2hhY2suZGlmZgotICAgIGZpCi19Ci0KLWZ1bmN0aW9uIGFwcGx5X3Jlc291cmNlc19zZGtfaW50X2ZpeCgpIHsKLSAgICBpZiAhIGdyZXAgLXEgJ3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU09VUkNFU19TREtfSU5UID0gU0RLX0lOVDsnICIkdG9wL2ZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEvYW5kcm9pZC9vcy9CdWlsZC5qYXZhIiA7IHRoZW4KLSAgICAgICAgZ2l0IC1DICIkdG9wL2ZyYW1ld29ya3MvYmFzZSIgYXBwbHkgLS1hbGxvdy1lbXB0eSAuLi8uLi9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9mcmFtZXdvcmtzX2Jhc2UuYXBwbHlfcmVzb3VyY2Vfc2RrX2ludC5kaWZmCisgICAgICAgIGxvY2FsIGJ1aWxkX3Nvb25nX2dpdF9yb290PSIkKHJlYWRsaW5rIC1mICR0b3AvYnVpbGQvc29vbmcpIgorICAgICAgICBwYXRjaCAtLXN0cmlwPTEgLS1uby1iYWNrdXAtaWYtbWlzbWF0Y2ggLS1kaXJlY3Rvcnk9IiRidWlsZF9zb29uZ19naXRfcm9vdCIgLS1pbnB1dD0uLi8uLi9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9idWlsZF9zb29uZ19qYXZhX2Ryb2lkc3R1YnMuZ28uYXBwbHlfaGFjay5kaWZmCiAgICAgZmkKIH0KIApAQCAtMzksNyArMzQsOCBAQAogICAgIGVjaG8gIiAgICAvKiogQ2hlY2tzIGlmIHRoZSBkZXZpY2UgaXMgcnVubmluZyBvbiBhIHJlbGVhc2UgdmVyc2lvbiBvZiBBbmRyb2lkICRGSU5BTF9QTEFURk9STV9DT0RFTkFNRSBvciBuZXdlciAqLwogICAgIEBDaGVja3NTZGtJbnRBdExlYXN0KGFwaSA9ICRGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTiAvKiBCVUlMRF9WRVJTSU9OX0NPREVTLiRGSU5BTF9QTEFURk9STV9DT0RFTkFNRSAqLykKICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdExlYXN0JHtGSU5BTF9QTEFURk9STV9DT0RFTkFNRTowOjF9KCkgewotICAgICAgICByZXR1cm4gU0RLX0lOVCA+PSAkRklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT047CisgICAgICAgIHJldHVybiBTREtfSU5UID49ICRGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTiB8fAorICAgICAgICAgICAgICAgIChTREtfSU5UID09ICQoKCRGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTiAtIDEpKSAmJiBpc0F0TGVhc3RQcmVSZWxlYXNlQ29kZW5hbWUoXCIkRklOQUxfUExBVEZPUk1fQ09ERU5BTUVcIikpOwogICAgIH0iID4gIiR0bXBmaWxlIgogCiAgICAgbG9jYWwgamF2YUZ1bmNSZWdleD0nXC9cKlwqW157XSppc0F0TGVhc3QnIiR7c2hvcnRDb2RlbmFtZX0iJygpIHtbXnt9XSp9JwpAQCAtNTMsNyArNDksMTEgQEAKICAgICAgICAgICAgZH0nICRqYXZhU2RrTGV2ZWwKIAogICAgIGVjaG8gIi8vIENoZWNrcyBpZiB0aGUgZGV2aWNlIGlzIHJ1bm5pbmcgb24gcmVsZWFzZSB2ZXJzaW9uIG9mIEFuZHJvaWQgJHtGSU5BTF9QTEFURk9STV9DT0RFTkFNRTowOjF9IG9yIG5ld2VyLgotaW5saW5lIGJvb2wgSXNBdExlYXN0JHtGSU5BTF9QTEFURk9STV9DT0RFTkFNRTowOjF9KCkgeyByZXR1cm4gYW5kcm9pZF9nZXRfZGV2aWNlX2FwaV9sZXZlbCgpID49ICRGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTjsgfSIgPiAiJHRtcGZpbGUiCitpbmxpbmUgYm9vbCBJc0F0TGVhc3Qke0ZJTkFMX1BMQVRGT1JNX0NPREVOQU1FOjA6MX0oKSB7CisgIHJldHVybiBhbmRyb2lkX2dldF9kZXZpY2VfYXBpX2xldmVsKCkgPj0gJEZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OIHx8CisgICAgICAgICAoYW5kcm9pZF9nZXRfZGV2aWNlX2FwaV9sZXZlbCgpID09ICQoKCRGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTiAtIDEpKSAmJgorICAgICAgICAgIGRldGFpbDo6SXNBdExlYXN0UHJlUmVsZWFzZUNvZGVuYW1lKFwiJEZJTkFMX1BMQVRGT1JNX0NPREVOQU1FXCIpKTsKK30iID4gIiR0bXBmaWxlIgogCiAgICAgbG9jYWwgY3BwRnVuY1JlZ2V4PSdcL1wvW157XSpJc0F0TGVhc3QnIiR7c2hvcnRDb2RlbmFtZX0iJygpIHtbXnt9XSp9JwogICAgIGxvY2FsIGNwcEZ1bmNSZXBsYWNlPSJOO047TjtOO047Tjsgcy8kY3BwRnVuY1JlZ2V4LyRtZXRob2RQbGFjZWhvbGRlci87IC8kY3BwRnVuY1JlZ2V4LyF7UDtEfTsiCkBAIC02NywxNiArNjcsNDAgQEAKICAgICBybSAiJHRtcGZpbGUiCiB9CiAKLWZ1bmN0aW9uIGZpbmFsaXplX2FpZGxfdm5ka19zZGtfcmVzb3VyY2VzKCkgeworZnVuY3Rpb24gYnVtcFNka0V4dGVuc2lvbnNWZXJzaW9uKCkgeworICAgIGxvY2FsIFNES0VYVD0icGFja2FnZXMvbW9kdWxlcy9TZGtFeHRlbnNpb25zLyIKKworICAgICMgVGhpcyB1c2VkIHRvIGNhbGwgYnVtcF9zZGsuc2ggdXRpbGl0eS4KKyAgICAjIEhvd2V2ZXIgZHVlIHRvIFRTLCB3ZSBoYXZlIHRvIGJ1aWxkIHRoZSBnZW5fc2RrIHdpdGggYSBjb3JyZWN0IHNldCBvZiBzZXR0aW5ncy4KKworICAgICMgIiR0b3AvcGFja2FnZXMvbW9kdWxlcy9TZGtFeHRlbnNpb25zL2dlbl9zZGsvYnVtcF9zZGsuc2giICR7RklOQUxfTUFJTkxJTkVfRVhURU5TSU9OfQorICAgICMgTGVhdmUgdGhlIGxhc3QgY29tbWl0IGFzIGEgc2V0IG9mIG1vZGlmaWVkIGZpbGVzLgorICAgICMgVGhlIGNvZGUgdG8gY3JlYXRlIGEgZmluYWxpemF0aW9uIHRvcGljIHdpbGwgcGljayBpdCB1cCBsYXRlci4KKyAgICAjIGdpdCAtQyAke1NES0VYVH0gcmVzZXQgSEVBRH4xCisKKyAgICBsb2NhbCBzZGs9IiR7RklOQUxfTUFJTkxJTkVfRVhURU5TSU9OfSIKKyAgICBsb2NhbCBtb2R1bGVzX2FyZz0KKworICAgIFRBUkdFVF9QUk9EVUNUPWFvc3BfYXJtNjQgXAorICAgICAgICBUQVJHRVRfUkVMRUFTRT1maW5hXzEgXAorICAgICAgICBUQVJHRVRfQlVJTERfVkFSSUFOVD11c2VyZGVidWcgXAorICAgICAgICBESVNUX0RJUj1vdXQvZGlzdCBcCisgICAgICAgICR0b3AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSAtLXNvb25nLW9ubHkgZ2VuX3NkaworCisgICAgQU5EUk9JRF9CVUlMRF9UT1A9IiR0b3AiIG91dC9zb29uZy9ob3N0L2xpbnV4LXg4Ni9iaW4vZ2VuX3NkayBcCisgICAgICAgIC0tZGF0YWJhc2UgJHtTREtFWFR9L2dlbl9zZGsvZXh0ZW5zaW9uc19kYi50ZXh0cGIgXAorICAgICAgICAtLWFjdGlvbiBuZXdfc2RrIFwKKyAgICAgICAgLS1zZGsgIiRzZGsiIFwKKyAgICAgICAgJG1vZHVsZXNfYXJnCit9CisKK2Z1bmN0aW9uIGZpbmFsaXplX3Nka19yZXNvdXJjZXMoKSB7CiAgICAgbG9jYWwgdG9wPSIkKGRpcm5hbWUgIiQwIikiLy4uLy4uLy4uLy4uCiAgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZW52aXJvbm1lbnQuc2gKIAogICAgIGxvY2FsIFNES19DT0RFTkFNRT0icHVibGljIHN0YXRpYyBmaW5hbCBpbnQgJEZJTkFMX1BMQVRGT1JNX0NPREVOQU1FX0pBVkEgPSBDVVJfREVWRUxPUE1FTlQ7IgogICAgIGxvY2FsIFNES19WRVJTSU9OPSJwdWJsaWMgc3RhdGljIGZpbmFsIGludCAkRklOQUxfUExBVEZPUk1fQ09ERU5BTUVfSkFWQSA9ICRGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTjsiCiAKLSAgICAjIGRlZmF1bHQgdGFyZ2V0IHRvIG1vZGlmeSB0cmVlIGFuZCBidWlsZCBTREsKLSAgICBsb2NhbCBtPSIkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgVEFSR0VUX1BST0RVQ1Q9YW9zcF9hcm02NCBUQVJHRVRfQlVJTERfVkFSSUFOVD11c2VyZGVidWcgRElTVF9ESVI9b3V0L2Rpc3QiCi0KICAgICAjIFRoZSBmdWxsIHByb2Nlc3MgY2FuIGJlIGZvdW5kIGF0IChJTlRFUk5BTCkgZ28vYW5kcm9pZC1zZGstZmluYWxpemF0aW9uLgogCiAgICAgIyBhcHBseSBkcm9pZHN0dWJzIGhhY2sgdG8gcHJldmVudCB0b29scyBmcm9tIGluY3JlbWVudGluZyBhbiBBUEkgdmVyc2lvbgpAQCAtODUsMzQgKzEwOSwxNiBAQAogICAgICMgYmlvbmljL05ESwogICAgIGZpbmFsaXplX2Jpb25pY19uZGsKIAotICAgICMgVk5ESyBkZWZpbml0aW9ucyBmb3IgbmV3IFNESyB2ZXJzaW9uCi0gICAgY3AgIiR0b3AvZGV2ZWxvcG1lbnQvdm5kay90b29scy9kZWZpbml0aW9uLXRvb2wvZGF0YXNldHMvdm5kay1saWItZXh0cmEtbGlzdC1jdXJyZW50LnR4dCIgXAotICAgICAgICIkdG9wL2RldmVsb3BtZW50L3ZuZGsvdG9vbHMvZGVmaW5pdGlvbi10b29sL2RhdGFzZXRzL3ZuZGstbGliLWV4dHJhLWxpc3QtJEZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OLnR4dCIKLQotICAgIEFJRExfVFJBTlNJVElWRV9GUkVFWkU9dHJ1ZSAkbSBhaWRsLWZyZWV6ZS1hcGkgY3JlYXRlX3JlZmVyZW5jZV9kdW1wcwotCi0gICAgIyBHZW5lcmF0ZSBBQkkgZHVtcHMKLSAgICBBTkRST0lEX0JVSUxEX1RPUD0iJHRvcCIgXAotICAgICAgICBvdXQvaG9zdC9saW51eC14ODYvYmluL2NyZWF0ZV9yZWZlcmVuY2VfZHVtcHMgXAotICAgICAgICAtcCBhb3NwX2FybTY0IC0tYnVpbGQtdmFyaWFudCB1c2VyCi0KLSAgICBlY2hvICJOT1RFOiBUSElTIElOVEVOVElPTkFMTFkgTUFZIEZBSUwgQU5EIFJFUEFJUiBJVFNFTEYgKHVudGlsICdET05FJykiCi0gICAgIyBVcGRhdGUgbmV3IHZlcnNpb25zIG9mIGZpbGVzLiBTZWUgdXBkYXRlLXZuZGstbGlzdC5zaCAod2hpY2ggcmVxdWlyZXMgZW52c2V0dXAuc2gpCi0gICAgJG0gY2hlY2stdm5kay1saXN0IHx8IFwKLSAgICAgICAgeyBjcCAkdG9wL291dC9zb29uZy92bmRrL3ZuZGsubGlicmFyaWVzLnR4dCAkdG9wL2J1aWxkL21ha2UvdGFyZ2V0L3Byb2R1Y3QvZ3NpL2N1cnJlbnQudHh0OyB9Ci0gICAgZWNobyAiRE9ORTogVEhJUyBJTlRFTlRJT05BTExZIE1BWSBGQUlMIEFORCBSRVBBSVIgSVRTRUxGIgotCiAgICAgIyBGaW5hbGl6ZSBTREsKIAogICAgICMgZnJhbWV3b3Jrcy9saWJzL21vZHVsZXMtdXRpbHMKICAgICBmaW5hbGl6ZV9tb2R1bGVzX3V0aWxzCiAKLSAgICAjIGJ1aWxkL21ha2UKLSAgICBsb2NhbCB2ZXJzaW9uX2RlZmF1bHRzPSIkdG9wL2J1aWxkL21ha2UvY29yZS92ZXJzaW9uX2RlZmF1bHRzLm1rIgotICAgIHNlZCAtaSAtZSAicy9QTEFURk9STV9TREtfVkVSU0lPTiA6PSAuKi9QTEFURk9STV9TREtfVkVSU0lPTiA6PSAke0ZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OfS9nIiAkdmVyc2lvbl9kZWZhdWx0cwotICAgIHNlZCAtaSAtZSAicy9QTEFURk9STV9WRVJTSU9OX0xBU1RfU1RBQkxFIDo9IC4qL1BMQVRGT1JNX1ZFUlNJT05fTEFTVF9TVEFCTEUgOj0gJHtGSU5BTF9QTEFURk9STV9WRVJTSU9OfS9nIiAkdmVyc2lvbl9kZWZhdWx0cwotICAgIHNlZCAtaSAtZSAicy9zZXBvbGljeV9tYWpvcl92ZXJzIDo9IC4qL3NlcG9saWN5X21ham9yX3ZlcnMgOj0gJHtGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTn0vZyIgIiR0b3AvYnVpbGQvbWFrZS9jb3JlL2NvbmZpZy5tayIKLSAgICBjcCAiJHRvcC9idWlsZC9tYWtlL3RhcmdldC9wcm9kdWN0L2dzaS9jdXJyZW50LnR4dCIgIiR0b3AvYnVpbGQvbWFrZS90YXJnZXQvcHJvZHVjdC9nc2kvJEZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OLnR4dCIKKyAgICAjIGRldmVsb3BtZW50L3NkaworICAgIGxvY2FsIHBsYXRmb3JtX3NvdXJjZT0iJHRvcC9kZXZlbG9wbWVudC9zZGsvcGxhdGZvcm1fc291cmNlLnByb3BfdGVtcGxhdGUiCisgICAgc2VkIC1pIC1lICdzL1BrZ1wuUmV2aXNpb24uKi9Qa2dcLlJldmlzaW9uPTEvZycgJHBsYXRmb3JtX3NvdXJjZQorICAgIGxvY2FsIGJ1aWxkX3Rvb2xzX3NvdXJjZT0iJHRvcC9kZXZlbG9wbWVudC9zZGsvYnVpbGRfdG9vbHNfc291cmNlLnByb3BfdGVtcGxhdGUiCisgICAgc2VkIC1pIC1lICdzL1BrZ1wuUmV2aXNpb24uKi9Qa2dcLlJldmlzaW9uPSR7UExBVEZPUk1fU0RLX1ZFUlNJT059LjAuMC9nJyAkYnVpbGRfdG9vbHNfc291cmNlCiAKICAgICAjIGJ1aWxkL3Nvb25nCiAgICAgbG9jYWwgY29kZW5hbWVfdmVyc2lvbj0iXCIke0ZJTkFMX1BMQVRGT1JNX0NPREVOQU1FfVwiOiAgICAgJHtGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTn0iCkBAIC0xMjEsOCArMTI3LDEyIEBACiAgICAgZmkKIAogICAgICMgY3RzCi0gICAgZWNobyAke0ZJTkFMX1BMQVRGT1JNX1ZFUlNJT059ID4gIiR0b3AvY3RzL3Rlc3RzL3Rlc3RzL29zL2Fzc2V0cy9wbGF0Zm9ybV9yZWxlYXNlcy50eHQiCi0gICAgc2VkIC1pIC1lICJzL0VYUEVDVEVEX1NESyA9ICQoKCR7RklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT059LTEpKS9FWFBFQ1RFRF9TREsgPSAke0ZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OfS9nIiAiJHRvcC9jdHMvdGVzdHMvdGVzdHMvb3Mvc3JjL2FuZHJvaWQvb3MvY3RzL0J1aWxkVmVyc2lvblRlc3QuamF2YSIKKyAgICBpZiAhIGdyZXAgLXEgIiR7RklOQUxfUExBVEZPUk1fVkVSU0lPTn0iICIkdG9wL2N0cy90ZXN0cy90ZXN0cy9vcy9hc3NldHMvcGxhdGZvcm1fcmVsZWFzZXMudHh0IiA7IHRoZW4KKyAgICAgICAgZWNobyAke0ZJTkFMX1BMQVRGT1JNX1ZFUlNJT059ID4+ICIkdG9wL2N0cy90ZXN0cy90ZXN0cy9vcy9hc3NldHMvcGxhdGZvcm1fcmVsZWFzZXMudHh0IgorICAgIGZpCisgICAgaWYgISBncmVwIC1xICIkKCgke0ZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OfS0xKSksICR7RklOQUxfUExBVEZPUk1fVkVSU0lPTn0iICIkdG9wL2N0cy90ZXN0cy90ZXN0cy9vcy9zcmMvYW5kcm9pZC9vcy9jdHMvQnVpbGRWZXJzaW9uVGVzdC5qYXZhIiA7IHRoZW4KKyAgICAgICAgc2VkIC1pIC1lICJzLy4qRVhQRUNURURfU0RLUyA9IExpc3Qub2YoLiokKCgke0ZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OfS0xKSkvJiwgJEZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OLyIgIiR0b3AvY3RzL3Rlc3RzL3Rlc3RzL29zL3NyYy9hbmRyb2lkL29zL2N0cy9CdWlsZFZlcnNpb25UZXN0LmphdmEiCisgICAgZmkKIAogICAgICMgbGliY29yZQogICAgIHNlZCAtaSAicyUkU0RLX0NPREVOQU1FJSRTREtfVkVSU0lPTiVnIiAiJHRvcC9saWJjb3JlL2RhbHZpay9zcmMvbWFpbi9qYXZhL2RhbHZpay9hbm5vdGF0aW9uL2NvbXBhdC9WZXJzaW9uQ29kZXMuamF2YSIKQEAgLTEzMSw2ICsxNDEsMTMgQEAKICAgICBsb2NhbCB2ZXJzaW9uX2NvZGVzPSIkdG9wL3BsYXRmb3JtX3Rlc3RpbmcvbGlicmFyaWVzL2NvbXBhdGliaWxpdHktY29tbW9uLXV0aWwvc3JjL2NvbS9hbmRyb2lkL2NvbXBhdGliaWxpdHkvY29tbW9uL3V0aWwvVmVyc2lvbkNvZGVzLmphdmEiCiAgICAgc2VkIC1pIC1lICIvPS4qJCgoJHtGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTn0tMSkpOy9hIFxcICAgICR7U0RLX1ZFUlNJT059IiAkdmVyc2lvbl9jb2RlcwogCisgICAgIyB0b29scy9wbGF0Zm9ybS1jb21wYXQKKyAgICBsb2NhbCBjbGFzczJub25zZGtsaXN0PSIkdG9wL3Rvb2xzL3BsYXRmb3JtLWNvbXBhdC9qYXZhL2NvbS9hbmRyb2lkL2NsYXNzMm5vbnNka2xpc3QvQ2xhc3MyTm9uU2RrTGlzdC5qYXZhIgorICAgIGlmICEgZ3JlcCAtcSAiXC4qbWFwLnB1dCgkKCgke0ZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OfSkpIiAkY2xhc3Mybm9uc2RrbGlzdCA7IHRoZW4KKyAgICAgIGxvY2FsIHNka192ZXJzaW9uPSJtYXAucHV0KCR7RklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT059LCBGTEFHX1VOU1VQUE9SVEVEKTsiCisgICAgICBzZWQgLWkgLWUgIi8uKm1hcC5wdXQoJCgoJHtGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTn0tMSkpL2EgXFwgICAgICAgICR7c2RrX3ZlcnNpb259IiAkY2xhc3Mybm9uc2RrbGlzdAorICAgIGZpCisKICAgICAjIEZpbmFsaXplIHJlc291cmNlcwogICAgICIkdG9wL2ZyYW1ld29ya3MvYmFzZS90b29scy9hYXB0Mi90b29scy9maW5hbGl6ZV9yZXMucHkiIFwKICAgICAgICAgICAgIiR0b3AvZnJhbWV3b3Jrcy9iYXNlL2NvcmUvcmVzL3Jlcy92YWx1ZXMvcHVibGljLXN0YWdpbmcueG1sIiBcCkBAIC0xMzgsMjQgKzE1NSwxOSBAQAogCiAgICAgIyBmcmFtZXdvcmtzL2Jhc2UKICAgICBzZWQgLWkgInMlJFNES19DT0RFTkFNRSUkU0RLX1ZFUlNJT04lZyIgIiR0b3AvZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YS9hbmRyb2lkL29zL0J1aWxkLmphdmEiCi0gICAgYXBwbHlfcmVzb3VyY2VzX3Nka19pbnRfZml4CiAgICAgc2VkIC1pIC1lICIvPS4qJCgoJHtGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTn0tMSkpLC9hIFxcICAgIFNES18ke0ZJTkFMX1BMQVRGT1JNX0NPREVOQU1FX0pBVkF9ID0gJHtGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTn0sIiAiJHRvcC9mcmFtZXdvcmtzL2Jhc2UvdG9vbHMvYWFwdC9TZGtDb25zdGFudHMuaCIKICAgICBzZWQgLWkgLWUgIi89LiokKCgke0ZJTkFMX1BMQVRGT1JNX1NES19WRVJTSU9OfS0xKSksL2EgXFwgIFNES18ke0ZJTkFMX1BMQVRGT1JNX0NPREVOQU1FX0pBVkF9ID0gJHtGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTn0sIiAiJHRvcC9mcmFtZXdvcmtzL2Jhc2UvdG9vbHMvYWFwdDIvU2RrQ29uc3RhbnRzLmgiCiAKICAgICAjIEJ1bXAgTWFpbmxpbmUgU0RLIGV4dGVuc2lvbiB2ZXJzaW9uLgotICAgIGxvY2FsIFNES0VYVD0icGFja2FnZXMvbW9kdWxlcy9TZGtFeHRlbnNpb25zLyIKLSAgICAiJHRvcC9wYWNrYWdlcy9tb2R1bGVzL1Nka0V4dGVuc2lvbnMvZ2VuX3Nkay9idW1wX3Nkay5zaCIgJHtGSU5BTF9NQUlOTElORV9FWFRFTlNJT059Ci0gICAgIyBMZWF2ZSB0aGUgbGFzdCBjb21taXQgYXMgYSBzZXQgb2YgbW9kaWZpZWQgZmlsZXMuCi0gICAgIyBUaGUgY29kZSB0byBjcmVhdGUgYSBmaW5hbGl6YXRpb24gdG9waWMgd2lsbCBwaWNrIGl0IHVwIGxhdGVyLgotICAgIGdpdCAtQyAke1NES0VYVH0gcmVzZXQgSEVBRH4xCisgICAgYnVtcFNka0V4dGVuc2lvbnNWZXJzaW9uCiAKLSAgICBsb2NhbCB2ZXJzaW9uX2RlZmF1bHRzPSIkdG9wL2J1aWxkL21ha2UvY29yZS92ZXJzaW9uX2RlZmF1bHRzLm1rIgotICAgIHNlZCAtaSAtZSAicy9QTEFURk9STV9TREtfRVhURU5TSU9OX1ZFUlNJT04gOj0gLiovUExBVEZPUk1fU0RLX0VYVEVOU0lPTl9WRVJTSU9OIDo9ICR7RklOQUxfTUFJTkxJTkVfRVhURU5TSU9OfS9nIiAkdmVyc2lvbl9kZWZhdWx0cworICAgICMgdGFyZ2V0IHRvIGJ1aWxkIFNESworICAgIGxvY2FsIHNka19tPSIkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgVEFSR0VUX1BST0RVQ1Q9YW9zcF9hcm02NCBUQVJHRVRfUkVMRUFTRT1maW5hXzEgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9dXNlcmRlYnVnIERJU1RfRElSPW91dC9kaXN0IgogCiAgICAgIyBGb3JjZSB1cGRhdGUgY3VycmVudC50eHQKLSAgICAkbSBjbG9iYmVyCi0gICAgJG0gdXBkYXRlLWFwaQorICAgICRzZGtfbSBjbG9iYmVyCisgICAgJHNka19tIHVwZGF0ZS1hcGkKIH0KIAotZmluYWxpemVfYWlkbF92bmRrX3Nka19yZXNvdXJjZXMKK2ZpbmFsaXplX3Nka19yZXNvdXJjZXMKIApkaWZmIC0tZ2l0IGEvdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLXZpbnRmLXJlc291cmNlcy5zaCBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS12aW50Zi1yZXNvdXJjZXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmE5Mjk1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS12aW50Zi1yZXNvdXJjZXMuc2gKQEAgLTAsMCArMSw4OSBAQAorIyEvYmluL2Jhc2gKKworc2V0IC1leAorCitmdW5jdGlvbiBmaW5hbGl6ZV92aW50Zl9yZXNvdXJjZXMoKSB7CisgICAgaWYgWyAkIyAtZ3QgMSBdOyB0aGVuCisgICAgICAgIGVjaG8gIk5vIGFyZ3VtZW50IG9yICctLXN0ZXBzX2Zvcl9idWlsZF90ZXN0X29ubHknIGlzIGFsbG93ZWQiCisgICAgICAgIGV4aXQgMQorICAgIGZpCisgICAgaWYgWyAkIyAtZXEgMSBdOyB0aGVuCisgICAgICAgIGlmIFsgIiQxIiA9PSAiLS1zdGVwc19mb3JfYnVpbGRfdGVzdF9vbmx5IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJUaGlzIGlzIG9ubHkgdG8gdmVyaWZ5IGJ1aWxkaW5nIGEgdGFyZ2V0LiIKKyAgICAgICAgICAgIGVjaG8gIlNraXAgTExOREsgQUJJIGR1bXAgYW5kIFZJTlRGIGNoZWNrLiIKKyAgICAgICAgICAgIGxvY2FsIGJ1aWxkX3Rlc3Rfb25seT10cnVlCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlVua25vd24gYXJndW1lbnQgJDEiCisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKKyAgICBmaQorCisgICAgbG9jYWwgdG9wPSIkKGRpcm5hbWUgIiQwIikiLy4uLy4uLy4uLy4uCisgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZW52aXJvbm1lbnQuc2gKKyAgICAjIGVudmlyb25tZW50IG5lZWRlZCB0byBidWlsZCBkZXBlbmRlbmNpZXMgYW5kIHJ1biBzY3JpcHRzCisgICAgIyBUaGVzZSBzaG91bGQgcmVtYWluIHRoZSBzYW1lIGZvciBhbGwgc3RlcHMgaGVyZSB0byBzcGVlZCB1cCBidWlsZCB0aW1lCisgICAgZXhwb3J0IEFORFJPSURfQlVJTERfVE9QPSIkdG9wIgorICAgIGV4cG9ydCBBTkRST0lEX0hPU1RfT1VUPSIkQU5EUk9JRF9CVUlMRF9UT1Avb3V0L2hvc3QvbGludXgteDg2IgorICAgIGV4cG9ydCBBTkRST0lEX1BST0RVQ1RfT1VUPSIkQU5EUk9JRF9CVUlMRF9UT1Avb3V0L3RhcmdldC9wcm9kdWN0L2dlbmVyaWNfYXJtNjQiCisgICAgZXhwb3J0IFBBVEg9IiRQQVRIOiRBTkRST0lEX0hPU1RfT1VUL2Jpbi8iCisgICAgZXhwb3J0IFRBUkdFVF9CVUlMRF9WQVJJQU5UPXVzZXJkZWJ1ZworICAgIGV4cG9ydCBESVNUX0RJUj1vdXQvZGlzdAorICAgIGV4cG9ydCBUQVJHRVRfUkVMRUFTRT1maW5hXzAKKyAgICBleHBvcnQgVEFSR0VUX1BST0RVQ1Q9YW9zcF9hcm02NAorCisgICAgIyBidWlsZC9zb29uZworICAgIGxvY2FsIHZlbmRvcl9hcGlfbGV2ZWxfbWFwPSJjYXNlICR7RklOQUxfTkVYVF9CT0FSRF9BUElfTEVWRUx9OiIKKyAgICBpZiAhIGdyZXAgLXEgIiR2ZW5kb3JfYXBpX2xldmVsX21hcCIgIiR0b3AvYnVpbGQvc29vbmcvYW5kcm9pZC92ZW5kb3JfYXBpX2xldmVscy5nbyIgOyB0aGVuCisgICAgICAgIHNlZCAtaSAtZSAiL2Nhc2UgJHtGSU5BTF9CT0FSRF9BUElfTEVWRUx9Oi97TjthIFxcXHQkdmVuZG9yX2FwaV9sZXZlbF9tYXBcblx0XHRzZGtWZXJzaW9uID0gJHtGSU5BTF9ORVhUX0NPUlJFU1BPTkRJTkdfU0RLX1ZFUlNJT059CisgICAgICAgIH0iICIkdG9wL2J1aWxkL3Nvb25nL2FuZHJvaWQvdmVuZG9yX2FwaV9sZXZlbHMuZ28iCisgICAgZmkKKworICAgICMgc3lzdGVtL3NlcG9saWN5CisgICAgIiR0b3Avc3lzdGVtL3NlcG9saWN5L3Rvb2xzL2ZpbmFsaXplLXZpbnRmLXJlc291cmNlcy5zaCIgIiR0b3AiICIkRklOQUxfQk9BUkRfQVBJX0xFVkVMIgorCisgICAgY3JlYXRlX25ld19jb21wYXRfbWF0cml4X2FuZF9rZXJuZWxfY29uZmlncyAkYnVpbGRfdGVzdF9vbmx5CisKKyAgICAjIHByZS1maW5hbGl6YXRpb24gYnVpbGQgdGFyZ2V0ICh0cnVuaykKKyAgICBsb2NhbCBhaWRsX209IiR0b3AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSIKKyAgICBBSURMX1RSQU5TSVRJVkVfRlJFRVpFPXRydWUgJGFpZGxfbSBhaWRsLWZyZWV6ZS1hcGkgY3JlYXRlX3JlZmVyZW5jZV9kdW1wcworCisgICAgaWYgISBbICIkYnVpbGRfdGVzdF9vbmx5IiA9ICJ0cnVlIiBdOyB0aGVuCisgICAgICAgICMgR2VuZXJhdGUgTExOREsgQUJJIGR1bXBzCisgICAgICAgICMgVGhpcyBjb21tYW5kIGRlcGVuZHMgb24gQU5EUk9JRF9CVUlMRF9UT1AKKyAgICAgICAgIiRBTkRST0lEX0hPU1RfT1VUL2Jpbi9jcmVhdGVfcmVmZXJlbmNlX2R1bXBzIiAtcmVsZWFzZSAiJFRBUkdFVF9SRUxFQVNFIiAtLWJ1aWxkLXZhcmlhbnQgIiRUQVJHRVRfQlVJTERfVkFSSUFOVCIgLS1saWItdmFyaWFudCBMTE5ESworICAgIGZpCit9CisKK2Z1bmN0aW9uIGNyZWF0ZV9uZXdfY29tcGF0X21hdHJpeF9hbmRfa2VybmVsX2NvbmZpZ3MoKSB7CisgICAgbG9jYWwgYnVpbGRfdGVzdF9vbmx5PSQxCisgICAgIyBUaGUgY29tcGF0aWJpbGl0eSBtYXRyaXggdmVyc2lvbnMgYXJlIGJ1bXBlZCBkdXJpbmcgdkZSQworICAgICMgVGhlc2Ugd2lsbCBjaGFuZ2UgZXZlcnkgdGltZSB3ZSBoYXZlIGEgbmV3IHZGUkMKKyAgICBsb2NhbCBDVVJSRU5UX0NPTVBBVElCSUxJVFlfTUFUUklYX0xFVkVMPSIkRklOQUxfQk9BUkRfQVBJX0xFVkVMIgorICAgIGxvY2FsIE5FWFRfQ09NUEFUSUJJTElUWV9NQVRSSVhfTEVWRUw9IiRGSU5BTF9ORVhUX0JPQVJEX0FQSV9MRVZFTCIKKyAgICAjIFRoZSBrZXJuZWwgY29uZmlncyBuZWVkIHRoZSBsZXR0ZXIgb2YgdGhlIEFuZHJvaWQgcmVsZWFzZQorICAgIGxvY2FsIENVUlJFTlRfUkVMRUFTRV9MRVRURVI9IiRGSU5BTF9DT1JSRVNQT05ESU5HX1ZFUlNJT05fTEVUVEVSIgorICAgIGxvY2FsIE5FWFRfUkVMRUFTRV9MRVRURVI9IiRGSU5BTF9ORVhUX0NPUlJFU1BPTkRJTkdfVkVSU0lPTl9MRVRURVIiCisKKworICAgICMgYnVpbGQgdGhlIHRhcmdldHMgcmVxdWlyZWQgYmVmb3JlIHRvdWNoaW5nIHRoZSBBbmRyb2lkLmJwL0FuZHJvaWQubWsgZmlsZXMKKyAgICBsb2NhbCBidWlsZF9jbWQ9IiR0b3AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSIKKyAgICAkYnVpbGRfY21kIGJwbW9kaWZ5CisKKyAgICAiJHRvcC9wcmVidWlsdHMvYnVpbGQtdG9vbHMvcGF0aC9saW51eC14ODYvcHl0aG9uMyIgIiR0b3AvaGFyZHdhcmUvaW50ZXJmYWNlcy9jb21wYXRpYmlsaXR5X21hdHJpY2VzL2J1bXAucHkiICIkQ1VSUkVOVF9DT01QQVRJQklMSVRZX01BVFJJWF9MRVZFTCIgIiRORVhUX0NPTVBBVElCSUxJVFlfTUFUUklYX0xFVkVMIiAiJENVUlJFTlRfUkVMRUFTRV9MRVRURVIiICIkTkVYVF9SRUxFQVNFX0xFVFRFUiIgIiRGSU5BTF9DT1JSRVNQT05ESU5HX1BMQVRGT1JNX1ZFUlNJT04iCisKKyAgICBpZiAhIFsgIiRidWlsZF90ZXN0X29ubHkiID0gInRydWUiIF07IHRoZW4KKyAgICAgICAgIyBGcmVlemUgdGhlIGN1cnJlbnQgZnJhbWV3b3JrIG1hbmlmZXN0IGZpbGUuIFRoaXMgcmVsaWVzIG9uIHRoZQorICAgICAgICAjIGFvc3BfY2ZfeDg2XzY0LXRydW5rX3N0YWdpbmcgYnVpbGQgdGFyZ2V0IHRvIGdldCB0aGUgcmlnaHQgbWFuaWZlc3QKKyAgICAgICAgIyBmcmFnbWVudHMgaW5zdGFsbGVkLgorICAgICAgICAiJHRvcC9zeXN0ZW0vbGliaGlkbC92aW50ZmRhdGEvZnJlZXplLnNoIiAiJENVUlJFTlRfQ09NUEFUSUJJTElUWV9NQVRSSVhfTEVWRUwiCisgICAgZmkKK30KKworZnVuY3Rpb24gZnJlZXplX2ZyYW1ld29ya19tYW5pZmVzdCgpIHsKKyAgIEFORFJPSURfUFJPRFVDVF9PVVQ9fi93b3Jrc3BhY2UvaW50ZXJuYWwvbWFpbi9vdXQvdGFyZ2V0L3Byb2R1Y3QvdnNvY194ODYgQU5EUk9JRF9CVUlMRF9UT1A9fi93b3Jrc3BhY2UvaW50ZXJuYWwvbWFpbiBBTkRST0lEX0hPU1RfT1VUPX4vd29ya3NwYWNlL2ludGVybmFsL21haW4vb3V0L2hvc3QvbGludXgteDg2IC4vZnJlZXplLnNoIDIwMjQwNAorCit9CisKKworZmluYWxpemVfdmludGZfcmVzb3VyY2VzICRACisKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9mcmFtZXdvcmtzX2Jhc2UuYXBwbHlfcmVzb3VyY2Vfc2RrX2ludC5kaWZmIGIvdG9vbHMvZmluYWxpemF0aW9uL2ZyYW1ld29ya3NfYmFzZS5hcHBseV9yZXNvdXJjZV9zZGtfaW50LmRpZmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNTc2ZDAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZmluYWxpemF0aW9uL2ZyYW1ld29ya3NfYmFzZS5hcHBseV9yZXNvdXJjZV9zZGtfaW50LmRpZmYKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1Gcm9tIGNkYjQ3ZmM5MGI4ZDY4NjBlYzFkYzVlZmFkYTFmOWNjZDQ3MTYxOGIgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCi1Gcm9tOiBBbGV4IEJ1eW55dHNreXkgPGFsZXhidXlAZ29vZ2xlLmNvbT4KLURhdGU6IFR1ZSwgMTEgQXByIDIwMjMgMjI6MTI6NDQgKzAwMDAKLVN1YmplY3Q6IFtQQVRDSF0gRG9uJ3QgZm9yY2UgKzEgZm9yIHJlc291cmNlIHJlc29sdXRpb24uCi0KLUJ1ZzogMjc3Njc0MDg4Ci1GaXhlczogMjc3Njc0MDg4Ci1UZXN0OiBib290cywgbm8gY3Jhc2hlcwotQ2hhbmdlLUlkOiBJMTdlNzQzYTBmMWNmNmY5OGZkZGQ0MGMzNThkZWE1YThiOWNjNzcyMwotLS0tCi0KLWRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9CdWlsZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvQnVpbGQuamF2YQotaW5kZXggZWI0NzE3MC4uNGQzZTkyYiAxMDA3NTUKLS0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0J1aWxkLmphdmEKLSsrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0J1aWxkLmphdmEKLUBAIC00OTMsNyArNDkzLDcgQEAKLSAgICAgICAgICAqIEBoaWRlCi0gICAgICAgICAgKi8KLSAgICAgICAgIEBUZXN0QXBpCi0tICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNPVVJDRVNfU0RLX0lOVCA9IFNES19JTlQgKyBBQ1RJVkVfQ09ERU5BTUVTLmxlbmd0aDsKLSsgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU09VUkNFU19TREtfSU5UID0gU0RLX0lOVDsKLSAKLSAgICAgICAgIC8qKgotICAgICAgICAgICogVGhlIGN1cnJlbnQgbG93ZXN0IHN1cHBvcnRlZCB2YWx1ZSBvZiBhcHAgdGFyZ2V0IFNESy4gQXBwbGljYXRpb25zIHRhcmdldGluZwpkaWZmIC0tZ2l0IGEvdG9vbHMvZmluYWxpemF0aW9uL2ZyYW1ld29ya3NfYmFzZS5yZXZlcnRfcmVzb3VyY2Vfc2RrX2ludC5kaWZmIGIvdG9vbHMvZmluYWxpemF0aW9uL2ZyYW1ld29ya3NfYmFzZS5yZXZlcnRfcmVzb3VyY2Vfc2RrX2ludC5kaWZmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWRlNDk5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9mcmFtZXdvcmtzX2Jhc2UucmV2ZXJ0X3Jlc291cmNlX3Nka19pbnQuZGlmZgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLUZyb20gYzdlNDYwYmIxOTA3MWQ4NjdjZDdjYTA0MjgyY2U0MjY5NGY0ZjM1OCBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKLUZyb206IEFsZXggQnV5bnl0c2t5eSA8YWxleGJ1eUBnb29nbGUuY29tPgotRGF0ZTogV2VkLCAxMiBBcHIgMjAyMyAwMTowNjoyNiArMDAwMAotU3ViamVjdDogW1BBVENIXSBSZXZlcnQgIkRvbid0IGZvcmNlICsxIGZvciByZXNvdXJjZSByZXNvbHV0aW9uLiIKLQotSXQncyBub3QgcmVxdWlyZWQgZm9yIG1hc3Rlci4KLQotVGhpcyByZXZlcnRzIGNvbW1pdCBmMWNiNjgzOTg4ZjgxNTc5YTc2ZGRiZjk5OTM4NDhhNGEwNmRkMjhjLgotCi1CdWc6IDI3NzY3NDA4OAotVGVzdDogYm9vdHMsIG5vIGNyYXNoZXMKLUNoYW5nZS1JZDogSWExNjkyNTQ4ZjI2NDk2ZmRjNmYxZTRmMDU1NzIxM2M3OTk2ZDY4MjMKLS0tLQotCi1kaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvQnVpbGQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0J1aWxkLmphdmEKLWluZGV4IDRkM2U5MmIuLmViNDcxNzAgMTAwNzU1Ci0tLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9CdWlsZC5qYXZhCi0rKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9CdWlsZC5qYXZhCi1AQCAtNDkzLDcgKzQ5Myw3IEBACi0gICAgICAgICAgKiBAaGlkZQotICAgICAgICAgICovCi0gICAgICAgICBAVGVzdEFwaQotLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTT1VSQ0VTX1NES19JTlQgPSBTREtfSU5UOwotKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTT1VSQ0VTX1NES19JTlQgPSBTREtfSU5UICsgQUNUSVZFX0NPREVOQU1FUy5sZW5ndGg7Ci0gCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFRoZSBjdXJyZW50IGxvd2VzdCBzdXBwb3J0ZWQgdmFsdWUgb2YgYXBwIHRhcmdldCBTREsuIEFwcGxpY2F0aW9ucyB0YXJnZXRpbmcKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9sb2NhbG9ubHktc3RlcHMuc2ggYi90b29scy9maW5hbGl6YXRpb24vbG9jYWxvbmx5LXN0ZXBzLnNoCmluZGV4IDYxMDdiM2UuLjk0ZWUzNjggMTAwNzU1Ci0tLSBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9sb2NhbG9ubHktc3RlcHMuc2gKKysrIGIvdG9vbHMvZmluYWxpemF0aW9uL2xvY2Fsb25seS1zdGVwcy5zaApAQCAtNywxNyArNywxOCBAQAogICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2Vudmlyb25tZW50LnNoCiAKICAgICAjIGRlZmF1bHQgdGFyZ2V0IHRvIG1vZGlmeSB0cmVlIGFuZCBidWlsZCBTREsKLSAgICBsb2NhbCBtPSIkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgVEFSR0VUX1BST0RVQ1Q9YW9zcF9hcm02NCBUQVJHRVRfQlVJTERfVkFSSUFOVD11c2VyZGVidWcgRElTVF9ESVI9b3V0L2Rpc3QiCisgICAgbG9jYWwgbT0iJHRvcC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlIFRBUkdFVF9QUk9EVUNUPWFvc3BfYXJtNjQgVEFSR0VUX1JFTEVBU0U9ZmluYV8xIFRBUkdFVF9CVUlMRF9WQVJJQU5UPXVzZXJkZWJ1ZyBESVNUX0RJUj1vdXQvZGlzdCIKIAogICAgICMgYWRiIGtleXMKLSAgICAkbSBhZGIKLSAgICBMT0dOQU1FPWFuZHJvaWQtZW5nIEhPU1ROQU1FPWdvb2dsZS5jb20gIiR0b3Avb3V0L2hvc3QvbGludXgteDg2L2Jpbi9hZGIiIGtleWdlbiAiJHRvcC92ZW5kb3IvZ29vZ2xlL3NlY3VyaXR5L2FkYi8ke0ZJTkFMX1BMQVRGT1JNX1ZFUlNJT059LmFkYl9rZXkiCisgICAgIyBUaGUga2V5cyBhcmUgYWxyZWFkeSBnZW5lcmF0ZWQgZm9yIEFuZHJvaWQgMTUuIEtlZXBpbmcgdGhlIGNvbW1hbmQgKGNvbW1lbnRlZCBvdXQpIGZvciBmdXR1cmUgcmVmZXJlbmNlLgorICAgICMgJG0gYWRiCisgICAgIyBMT0dOQU1FPWFuZHJvaWQtZW5nIEhPU1ROQU1FPWdvb2dsZS5jb20gIiR0b3Avb3V0L2hvc3QvbGludXgteDg2L2Jpbi9hZGIiIGtleWdlbiAiJHRvcC92ZW5kb3IvZ29vZ2xlL3NlY3VyaXR5L2FkYi8ke0ZJTkFMX1BMQVRGT1JNX1ZFUlNJT059LmFkYl9rZXkiCiAKICAgICAjIEJ1aWxkIFBsYXRmb3JtIFNES3MuCi0gICAgJHRvcC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlIFRBUkdFVF9QUk9EVUNUPXNkayBUQVJHRVRfQlVJTERfVkFSSUFOVD11c2VyZGVidWcgc2RrIGRpc3Qgc2RrX3JlcG8gRElTVF9ESVI9b3V0L2Rpc3QKKyAgICAkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgVEFSR0VUX1BST0RVQ1Q9c2RrIFRBUkdFVF9SRUxFQVNFPWZpbmFfMSBUQVJHRVRfQlVJTERfVkFSSUFOVD11c2VyZGVidWcgc2RrIGRpc3Qgc2RrX3JlcG8gRElTVF9ESVI9b3V0L2Rpc3QKIAogICAgICMgQnVpbGQgTW9kdWxlcyBTREtzLgotICAgIFRBUkdFVF9CVUlMRF9WQVJJQU5UPXVzZXJkZWJ1ZyBVTkJVTkRMRURfQlVJTERfU0RLU19GUk9NX1NPVVJDRT10cnVlIERJU1RfRElSPW91dC9kaXN0ICIkdG9wL3ZlbmRvci9nb29nbGUvYnVpbGQvbWFpbmxpbmVfbW9kdWxlc19zZGtzLnNoIgorICAgIFRBUkdFVF9SRUxFQVNFPWZpbmFfMSBUQVJHRVRfQlVJTERfVkFSSUFOVD11c2VyZGVidWcgVU5CVU5ETEVEX0JVSUxEX1NES1NfRlJPTV9TT1VSQ0U9dHJ1ZSBESVNUX0RJUj1vdXQvZGlzdCAiJHRvcC92ZW5kb3IvZ29vZ2xlL2J1aWxkL21haW5saW5lX21vZHVsZXNfc2Rrcy5zaCIgLS1idWlsZC1yZWxlYXNlPW5leHQKIAogICAgICMgVXBkYXRlIHByZWJ1aWx0cy4KICAgICAiJHRvcC9wcmVidWlsdHMvYnVpbGQtdG9vbHMvcGF0aC9saW51eC14ODYvcHl0aG9uMyIgLVcgaWdub3JlOjpEZXByZWNhdGlvbldhcm5pbmcgIiR0b3AvcHJlYnVpbHRzL3Nkay91cGRhdGVfcHJlYnVpbHRzLnB5IiAtLWxvY2FsX21vZGUgLWYgJHtGSU5BTF9QTEFURk9STV9TREtfVkVSU0lPTn0gLWUgJHtGSU5BTF9NQUlOTElORV9FWFRFTlNJT059IC0tYnVnIDEgMQpkaWZmIC0tZ2l0IGEvdG9vbHMvZmluYWxpemF0aW9uL3N0ZXAtMC5zaCBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9zdGVwLTAuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjA4N2Y2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9zdGVwLTAuc2gKQEAgLTAsMCArMSwzOSBAQAorIyEvYmluL2Jhc2gKKyMgQ29weXJpZ2h0IDIwMjQgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIyBTY3JpcHQgdG8gcGVyZm9ybSBhIDB0aCBzdGVwIG9mIEFuZHJvaWQgRmluYWxpemF0aW9uOiBWSU5URiBmaW5hbGl6YXRpb24sIGNyZWF0ZSBDTHMgYW5kIHVwbG9hZCB0byBHZXJyaXQuCisKK3NldCAtZXgKKworZnVuY3Rpb24gY29tbWl0X3N0ZXBfMF9jaGFuZ2VzKCkgeworICAgIHNldCArZQorICAgIHJlcG8gZm9yYWxsIC1jICdcCisgICAgICAgIGlmIFtbICQoZ2l0IHN0YXR1cyAtLXNob3J0KSBdXTsgdGhlbgorICAgICAgICAgICAgcmVwbyBzdGFydCAiJyRyZXBvX2JyYW5jaCciIDsKKyAgICAgICAgICAgIGdpdCBhZGQgLUEgLiA7CisgICAgICAgICAgICBnaXQgY29tbWl0IC1tICJWZW5kb3IgQVBJIGxldmVsICRGSU5BTF9CT0FSRF9BUElfTEVWRUwgaXMgbm93IGZyb3plbiIgXAorICAgICAgICAgICAgICAgICAgICAgICAtbSAiSWdub3JlLUFPU1AtRmlyc3Q6IFZJTlRGICRGSU5BTF9CT0FSRF9BUElfTEVWRUwgRmluYWxpemF0aW9uCitCdWc6ICRGSU5BTF9CVUdfSUQKK1Rlc3Q6IGJ1aWxkIjsKKyAgICAgICAgICAgIHJlcG8gdXBsb2FkICciJHJlcG9fdXBsb2FkX2RyeV9ydW5fYXJnIicgLS1jYnIgLS1uby12ZXJpZnkgLW8gbm9rZXljaGVjayAtdCAteSAuIDsKKyAgICAgICAgZmknCit9CisKK2Z1bmN0aW9uIGZpbmFsaXplX3N0ZXBfMF9tYWluKCkgeworICAgIGxvY2FsIHRvcD0iJChkaXJuYW1lICIkMCIpIi8uLi8uLi8uLi8uLgorICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2Vudmlyb25tZW50LnNoCisgICAgbG9jYWwgcmVwb19icmFuY2g9IlZJTlRGLSRGSU5BTF9CT0FSRF9BUElfTEVWRUwtRmluYWxpemF0aW9uIgorICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2NvbW1hbmQtbGluZS1vcHRpb25zLnNoCisKKyAgICBsb2NhbCBtPSIkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgVEFSR0VUX1JFTEVBU0U9bmV4dCBUQVJHRVRfUFJPRFVDVD1hb3NwX2FybTY0IFRBUkdFVF9CVUlMRF9WQVJJQU5UPXVzZXJkZWJ1ZyIKKworICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLXZpbnRmLXJlc291cmNlcy5zaAorCisgICAgIyBtb3ZlIGFsbCBjaGFuZ2VzIHRvIGZpbmFsaXphdGlvbiBicmFuY2gvdG9waWMgYW5kIHVwbG9hZCB0byBnZXJyaXQKKyAgICBjb21taXRfc3RlcF8wX2NoYW5nZXMKKworICAgICMgYnVpbGQgdG8gY29uZmlybSBldmVyeXRoaW5nIGlzIE9LCisgICAgQUlETF9GUk9aRU5fUkVMPXRydWUgJG0KK30KKworZmluYWxpemVfc3RlcF8wX21haW4gJEAKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9zdGVwLTEuc2ggYi90b29scy9maW5hbGl6YXRpb24vc3RlcC0xLnNoCmluZGV4IDBkZDRiM2EuLjczNmQ2NDEgMTAwNzU1Ci0tLSBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9zdGVwLTEuc2gKKysrIGIvdG9vbHMvZmluYWxpemF0aW9uL3N0ZXAtMS5zaApAQCAtNywzMCArNywzMyBAQAogICAgIHNldCArZQogICAgIHJlcG8gZm9yYWxsIC1jICdcCiAgICAgICAgIGlmIFtbICQoZ2l0IHN0YXR1cyAtLXNob3J0KSBdXTsgdGhlbgotICAgICAgICAgICAgcmVwbyBzdGFydCAiJEZJTkFMX1BMQVRGT1JNX0NPREVOQU1FLVNESy1GaW5hbGl6YXRpb24iIDsKKyAgICAgICAgICAgIHJlcG8gc3RhcnQgIickcmVwb19icmFuY2gnIiA7CiAgICAgICAgICAgICBnaXQgYWRkIC1BIC4gOwogICAgICAgICAgICAgZ2l0IGNvbW1pdCAtbSAiJEZJTkFMX1BMQVRGT1JNX0NPREVOQU1FIGlzIG5vdyAkRklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT04gYW5kIGV4dGVuc2lvbiB2ZXJzaW9uICRGSU5BTF9NQUlOTElORV9FWFRFTlNJT04iIFwKICAgICAgICAgICAgICAgICAgICAgICAgLW0gIklnbm9yZS1BT1NQLUZpcnN0OiAkRklOQUxfUExBVEZPUk1fQ09ERU5BTUUgRmluYWxpemF0aW9uCiBCdWc6ICRGSU5BTF9CVUdfSUQKIFRlc3Q6IGJ1aWxkIjsKLSAgICAgICAgICAgIHJlcG8gdXBsb2FkIC0tY2JyIC0tbm8tdmVyaWZ5IC1vIG5va2V5Y2hlY2sgLXQgLXkgLiA7CisgICAgICAgICAgICByZXBvIHVwbG9hZCAnIiRyZXBvX3VwbG9hZF9kcnlfcnVuX2FyZyInIC0tY2JyIC0tbm8tdmVyaWZ5IC1vIG5va2V5Y2hlY2sgLXQgLXkgLiA7CiAgICAgICAgIGZpJwogfQogCiBmdW5jdGlvbiBmaW5hbGl6ZV9zdGVwXzFfbWFpbigpIHsKICAgICBsb2NhbCB0b3A9IiQoZGlybmFtZSAiJDAiKSIvLi4vLi4vLi4vLi4KICAgICBzb3VyY2UgJHRvcC9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9lbnZpcm9ubWVudC5zaAorICAgIGxvY2FsIHJlcG9fYnJhbmNoPSIkRklOQUxfUExBVEZPUk1fQ09ERU5BTUUtU0RLLUZpbmFsaXphdGlvbiIKKyAgICBzb3VyY2UgJHRvcC9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9jb21tYW5kLWxpbmUtb3B0aW9ucy5zaAogCi0gICAgbG9jYWwgbT0iJHRvcC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlIFRBUkdFVF9QUk9EVUNUPWFvc3BfYXJtNjQgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9dXNlcmRlYnVnIgotCi0gICAgIyB2bmRrIGV0YyBmaW5hbGl6YXRpb24KLSAgICBzb3VyY2UgJHRvcC9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS1haWRsLXZuZGstc2RrLXJlc291cmNlcy5zaAorICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLXNkay1yZXNvdXJjZXMuc2gKIAogICAgICMgbW92ZSBhbGwgY2hhbmdlcyB0byBmaW5hbGl6YXRpb24gYnJhbmNoL3RvcGljIGFuZCB1cGxvYWQgdG8gZ2Vycml0CiAgICAgY29tbWl0X3N0ZXBfMV9jaGFuZ2VzCiAKICAgICAjIGJ1aWxkIHRvIGNvbmZpcm0gZXZlcnl0aGluZyBpcyBPSwotICAgIEFJRExfRlJPWkVOX1JFTD10cnVlICRtCisgICAgbG9jYWwgbV9uZXh0PSIkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgVEFSR0VUX1JFTEVBU0U9bmV4dCBUQVJHRVRfUFJPRFVDVD1hb3NwX2FybTY0IFRBUkdFVF9CVUlMRF9WQVJJQU5UPXVzZXJkZWJ1ZyIKKyAgICAkbV9uZXh0CisKKyAgICBsb2NhbCBtX2ZpbmE9IiR0b3AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSBUQVJHRVRfUkVMRUFTRT1maW5hXzEgVEFSR0VUX1BST0RVQ1Q9YW9zcF9hcm02NCBUQVJHRVRfQlVJTERfVkFSSUFOVD11c2VyZGVidWciCisgICAgJG1fZmluYQogfQogCi1maW5hbGl6ZV9zdGVwXzFfbWFpbgorZmluYWxpemVfc3RlcF8xX21haW4gJEAKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9zdGVwLTIuc2ggYi90b29scy9maW5hbGl6YXRpb24vc3RlcC0yLnNoCmluZGV4IGQwYjI0YWUuLjUyZTM4ODcgMTAwNzU1Ci0tLSBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9zdGVwLTIuc2gKKysrIGIvdG9vbHMvZmluYWxpemF0aW9uL3N0ZXAtMi5zaApAQCAtNCwyMiArNCwyMiBAQAogZnVuY3Rpb24gY29tbWl0X3N0ZXBfMl9jaGFuZ2VzKCkgewogICAgIHJlcG8gZm9yYWxsIC1jICdcCiAgICAgICAgIGlmIFtbICQoZ2l0IHN0YXR1cyAtLXNob3J0KSBdXTsgdGhlbgotICAgICAgICAgICAgcmVwbyBzdGFydCAiJEZJTkFMX1BMQVRGT1JNX0NPREVOQU1FLVNESy1GaW5hbGl6YXRpb24tUmVsIiA7CisgICAgICAgICAgICByZXBvIHN0YXJ0ICInJHJlcG9fYnJhbmNoJyIgOwogICAgICAgICAgICAgZ2l0IGFkZCAtQSAuIDsKICAgICAgICAgICAgIGdpdCBjb21taXQgLW0gIiRGSU5BTF9QTEFURk9STV9DT0RFTkFNRS8kRklOQUxfUExBVEZPUk1fU0RLX1ZFUlNJT04gaXMgbm93IFJFTCIgXAogICAgICAgICAgICAgICAgICAgICAgICAtbSAiSWdub3JlLUFPU1AtRmlyc3Q6ICRGSU5BTF9QTEFURk9STV9DT0RFTkFNRSBGaW5hbGl6YXRpb24KIEJ1ZzogJEZJTkFMX0JVR19JRAogVGVzdDogYnVpbGQiOwogCi0gICAgICAgICAgICByZXBvIHVwbG9hZCAtLWNiciAtLW5vLXZlcmlmeSAtbyBub2tleWNoZWNrIC10IC15IC4gOworICAgICAgICAgICAgcmVwbyB1cGxvYWQgJyIkcmVwb191cGxvYWRfZHJ5X3J1bl9hcmciJyAtLWNiciAtLW5vLXZlcmlmeSAtbyBub2tleWNoZWNrIC10IC15IC4gOwogICAgICAgICBmaScKIH0KIAogZnVuY3Rpb24gZmluYWxpemVfc3RlcF8yX21haW4oKSB7CiAgICAgbG9jYWwgdG9wPSIkKGRpcm5hbWUgIiQwIikiLy4uLy4uLy4uLy4uCiAgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZW52aXJvbm1lbnQuc2gKLQotICAgIGxvY2FsIG09IiR0b3AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSBUQVJHRVRfUFJPRFVDVD1hb3NwX2FybTY0IFRBUkdFVF9CVUlMRF9WQVJJQU5UPXVzZXJkZWJ1ZyIKKyAgICBsb2NhbCByZXBvX2JyYW5jaD0iJEZJTkFMX1BMQVRGT1JNX0NPREVOQU1FLVNESy1GaW5hbGl6YXRpb24tUmVsIgorICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2NvbW1hbmQtbGluZS1vcHRpb25zLnNoCiAKICAgICAjIHByZWJ1aWx0cyBldGMKICAgICBzb3VyY2UgJHRvcC9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS1zZGstcmVsLnNoCkBAIC0yOCw3ICsyOCwxMSBAQAogICAgIGNvbW1pdF9zdGVwXzJfY2hhbmdlcwogCiAgICAgIyBidWlsZCB0byBjb25maXJtIGV2ZXJ5dGhpbmcgaXMgT0sKLSAgICBBSURMX0ZST1pFTl9SRUw9dHJ1ZSAkbQorICAgIGxvY2FsIG1fbmV4dD0iJHRvcC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlIFRBUkdFVF9SRUxFQVNFPW5leHQgVEFSR0VUX1BST0RVQ1Q9YW9zcF9hcm02NCBUQVJHRVRfQlVJTERfVkFSSUFOVD11c2VyZGVidWciCisgICAgJG1fbmV4dAorCisgICAgbG9jYWwgbV9maW5hPSIkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgVEFSR0VUX1JFTEVBU0U9ZmluYV8yIFRBUkdFVF9QUk9EVUNUPWFvc3BfYXJtNjQgVEFSR0VUX0JVSUxEX1ZBUklBTlQ9dXNlcmRlYnVnIgorICAgICRtX2ZpbmEKIH0KIAotZmluYWxpemVfc3RlcF8yX21haW4KK2ZpbmFsaXplX3N0ZXBfMl9tYWluICRACmRpZmYgLS1naXQgYS90b29scy9maW5hbGl6YXRpb24vdXBkYXRlLXN0ZXAtMS5zaCBiL3Rvb2xzL2ZpbmFsaXphdGlvbi91cGRhdGUtc3RlcC0xLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDY5OTg4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2ZpbmFsaXphdGlvbi91cGRhdGUtc3RlcC0xLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotIyEvYmluL2Jhc2gKLSMgU2NyaXB0IHRvIHBlcmZvcm0gYSAxc3Qgc3RlcCBvZiBBbmRyb2lkIEZpbmFsaXphdGlvbjogQVBJL1NESyBmaW5hbGl6YXRpb24sIHVwZGF0ZSBDTHMgYW5kIHVwbG9hZCB0byBHZXJyaXQuCi0KLSMgV0lQLCBkb2VzIG5vdCB3b3JrIHlldAotZXhpdCAxMAotCi1zZXQgLWV4Ci0KLWZ1bmN0aW9uIHVwZGF0ZV9zdGVwXzFfY2hhbmdlcygpIHsKLSAgICBzZXQgK2UKLSAgICByZXBvIGZvcmFsbCAtYyAnXAotICAgICAgICBpZiBbWyAkKGdpdCBzdGF0dXMgLS1zaG9ydCkgXV07IHRoZW4KLSAgICAgICAgICAgIGdpdCBzdGFzaCAtdSA7Ci0gICAgICAgICAgICByZXBvIHN0YXJ0ICIkRklOQUxfUExBVEZPUk1fQ09ERU5BTUUtU0RLLUZpbmFsaXphdGlvbiIgOwotICAgICAgICAgICAgZ2l0IHN0YXNoIHBvcCA7Ci0gICAgICAgICAgICBnaXQgYWRkIC1BIC4gOwotICAgICAgICAgICAgZ2l0IGNvbW1pdCAtLWFtZW5kIC0tbm8tZWRpdCA7Ci0gICAgICAgICAgICByZXBvIHVwbG9hZCAtLWNiciAtLW5vLXZlcmlmeSAtbyBub2tleWNoZWNrIC10IC15IC4gOwotICAgICAgICBmaScKLX0KLQotZnVuY3Rpb24gdXBkYXRlX3N0ZXBfMV9tYWluKCkgewotICAgIGxvY2FsIHRvcD0iJChkaXJuYW1lICIkMCIpIi8uLi8uLi8uLi8uLgotICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2Vudmlyb25tZW50LnNoCi0KLQotICAgIGxvY2FsIG09IiR0b3AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSBUQVJHRVRfUFJPRFVDVD1hb3NwX2FybTY0IFRBUkdFVF9CVUlMRF9WQVJJQU5UPXVzZXJkZWJ1ZyIKLQotICAgICMgdm5kayBldGMgZmluYWxpemF0aW9uCi0gICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtYWlkbC12bmRrLXNkay1yZXNvdXJjZXMuc2gKLQotICAgICMgdXBkYXRlIGV4aXN0aW5nIENMcyBhbmQgdXBsb2FkIHRvIGdlcnJpdAotICAgIHVwZGF0ZV9zdGVwXzFfY2hhbmdlcwotCi0gICAgIyBidWlsZCB0byBjb25maXJtIGV2ZXJ5dGhpbmcgaXMgT0sKLSAgICBBSURMX0ZST1pFTl9SRUw9dHJ1ZSAkbQotfQotCi11cGRhdGVfc3RlcF8xX21haW4KZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmFsaXphdGlvbi91cGRhdGUtc3RlcC0yLnNoIGIvdG9vbHMvZmluYWxpemF0aW9uL3VwZGF0ZS1zdGVwLTIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQyYjg1OTIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZmluYWxpemF0aW9uL3VwZGF0ZS1zdGVwLTIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIS9iaW4vYmFzaAotIyBTY3JpcHQgdG8gcGVyZm9ybSBhIDJuZCBzdGVwIG9mIEFuZHJvaWQgRmluYWxpemF0aW9uOiBSRUwgZmluYWxpemF0aW9uLCBjcmVhdGUgQ0xzIGFuZCB1cGxvYWQgdG8gR2Vycml0LgotCi0jIFdJUCwgZG9lcyBub3Qgd29yayB5ZXQKLWV4aXQgMTAKLQotc2V0IC1leAotCi1mdW5jdGlvbiB1cGRhdGVfc3RlcF8yX2NoYW5nZXMoKSB7Ci0gICAgc2V0ICtlCi0gICAgcmVwbyBmb3JhbGwgLWMgJ1wKLSAgICAgICAgaWYgW1sgJChnaXQgc3RhdHVzIC0tc2hvcnQpIF1dOyB0aGVuCi0gICAgICAgICAgICBnaXQgc3Rhc2ggLXUgOwotICAgICAgICAgICAgcmVwbyBzdGFydCAiJEZJTkFMX1BMQVRGT1JNX0NPREVOQU1FLVNESy1GaW5hbGl6YXRpb24tUmVsIiA7Ci0gICAgICAgICAgICBnaXQgc3Rhc2ggcG9wIDsKLSAgICAgICAgICAgIGdpdCBhZGQgLUEgLiA7Ci0gICAgICAgICAgICBnaXQgY29tbWl0IC0tYW1lbmQgLS1uby1lZGl0IDsKLSAgICAgICAgICAgIHJlcG8gdXBsb2FkIC0tY2JyIC0tbm8tdmVyaWZ5IC1vIG5va2V5Y2hlY2sgLXQgLXkgLiA7Ci0gICAgICAgIGZpJwotfQotCi1mdW5jdGlvbiB1cGRhdGVfc3RlcF8yX21haW4oKSB7Ci0gICAgbG9jYWwgdG9wPSIkKGRpcm5hbWUgIiQwIikiLy4uLy4uLy4uLy4uCi0gICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZW52aXJvbm1lbnQuc2gKLQotICAgIGxvY2FsIG09IiR0b3AvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSBUQVJHRVRfUFJPRFVDVD1hb3NwX2FybTY0IFRBUkdFVF9CVUlMRF9WQVJJQU5UPXVzZXJkZWJ1ZyIKLQotICAgICMgcHJlYnVpbHRzIGV0YwotICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLXNkay1yZWwuc2gKLQotICAgICMgbW92ZSBhbGwgY2hhbmdlcyB0byBmaW5hbGl6YXRpb24gYnJhbmNoL3RvcGljIGFuZCB1cGxvYWQgdG8gZ2Vycml0Ci0gICAgdXBkYXRlX3N0ZXBfMl9jaGFuZ2VzCi0KLSAgICAjIGJ1aWxkIHRvIGNvbmZpcm0gZXZlcnl0aGluZyBpcyBPSwotICAgIEFJRExfRlJPWkVOX1JFTD10cnVlICRtCi19Ci0KLXVwZGF0ZV9zdGVwXzJfbWFpbgpkaWZmIC0tZ2l0IGEvdG9vbHMvZmluZF9zdGF0aWNfY2FuZGlkYXRlcy5weSBiL3Rvb2xzL2ZpbmRfc3RhdGljX2NhbmRpZGF0ZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU1MDYyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2ZpbmRfc3RhdGljX2NhbmRpZGF0ZXMucHkKQEAgLTAsMCArMSwyMzcgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKKworIiIiVG9vbCB0byBmaW5kIHN0YXRpYyBsaWJyYXJpZXMgdGhhdCBtYXliZSBzaG91bGQgYmUgc2hhcmVkIGxpYnJhcmllcyBhbmQgc2hhcmVkIGxpYnJhcmllcyB0aGF0IG1heWJlIHNob3VsZCBiZSBzdGF0aWMgbGlicmFyaWVzLgorCitUaGlzIHRvb2wgb25seSBsb29rcyBhdCB0aGUgbW9kdWxlLWluZm8uanNvbiBmb3IgdGhlIGN1cnJlbnQgdGFyZ2V0LgorCitFeGFtcGxlIG9mICJjbGFzcyIgdHlwZXMgZm9yIGVhY2ggb2YgdGhlIG1vZHVsZXMgaW4gbW9kdWxlLWluZm8uanNvbgorICAiRVhFQ1VUQUJMRVMiOiAyMzA3LAorICAiRVRDIjogOTA5NCwKKyAgIk5BVElWRV9URVNUUyI6IDEwNDYxLAorICAiQVBQUyI6IDI4ODUsCisgICJKQVZBX0xJQlJBUklFUyI6IDUyMDUsCisgICJFWEVDVVRBQkxFUy9KQVZBX0xJQlJBUklFUyI6IDExOSwKKyAgIkZBS0UiOiA1NTMsCisgICJTSEFSRURfTElCUkFSSUVTL1NUQVRJQ19MSUJSQVJJRVMiOiA3NTkxLAorICAiU1RBVElDX0xJQlJBUklFUyI6IDExNTM1LAorICAiU0hBUkVEX0xJQlJBUklFUyI6IDEwODUyLAorICAiSEVBREVSX0xJQlJBUklFUyI6IDE4OTcsCisgICJEWUxJQl9MSUJSQVJJRVMiOiAxMjYyLAorICAiUkxJQl9MSUJSQVJJRVMiOiAzNDEzLAorICAiUk9CT0xFQ1RSSUMiOiAzOSwKKyAgIlBBQ0tBR0lORyI6IDUsCisgICJQUk9DX01BQ1JPX0xJQlJBUklFUyI6IDM2LAorICAiUkVOREVSU0NSSVBUX0JJVENPREUiOiAxNywKKyAgIkRZTElCX0xJQlJBUklFUy9STElCX0xJQlJBUklFUyI6IDgsCisgICJFVEMvRkFLRSI6IDEKKworTm9uZSBvZiB0aGUgIlNIQVJFRF9MSUJSQVJJRVMvU1RBVElDX0xJQlJBUklFUyIgYXJlIGRvdWJsZSBjb3VudGVkIGluIHRoZQorbW9kdWxlcyB3aXRoIG9uZSBjbGFzcworUkxJQi8KKworQWxsIG9mIHRoZXNlIGNsYXNzZXMgaGF2ZSBzaGFyZWRfbGlicyBhbmQvb3Igc3RhdGljX2xpYnMKKyAgICAiRVhFQ1VUQUJMRVMiLAorICAgICJTSEFSRURfTElCUkFSSUVTIiwKKyAgICAiU1RBVElDX0xJQlJBUklFUyIsCisgICAgIlNIQVJFRF9MSUJSQVJJRVMvU1RBVElDX0xJQlJBUklFUyIsICMgY2NfbGlicmFyeQorICAgICJIRUFERVJfTElCUkFSSUVTIiwKKyAgICAiTkFUSVZFX1RFU1RTIiwgIyB0ZXN0IG1vZHVsZXMKKyAgICAiRFlMSUJfTElCUkFSSUVTIiwgIyBydXN0CisgICAgIlJMSUJfTElCUkFSSUVTIiwgIyBydXN0CisgICAgIkVUQyIsICMgcnVzdF9iaW5kZ2VuCisiIiIKKworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKKworaW1wb3J0IGpzb24sIG9zLCBhcmdwYXJzZQorCitBTkRST0lEX1BST0RVQ1RfT1VUID0gb3MuZW52aXJvbi5nZXQoIkFORFJPSURfUFJPRFVDVF9PVVQiKQorIyBJZiBhIHNoYXJlZCBsaWJyYXJ5IGlzIHVzZWQgbGVzcyB0aGFuIE1BWF9TSEFSRURfSU5DTFVTSU9OUyB0aW1lcyBpbiBhIHRhcmdldCwKKyMgdGhlbiBpdCB3aWxsIGxpa2VseSBzYXZlIG1lbW9yeSBieSBjaGFuZ2luZyBpdCB0byBhIHN0YXRpYyBsaWJyYXJ5CisjIFRoaXMgbW92ZSB3aWxsIGFsc28gdXNlIGxlc3Mgc3RvcmFnZQorTUFYX1NIQVJFRF9JTkNMVVNJT05TID0gMgorIyBJZiBhIHN0YXRpYyBsaWJyYXJ5IGlzIHVzZWQgbW9yZSB0aGFuIE1BWF9TVEFUSUNfSU5DTFVTSU9OUyB0aW1lcyBpbiBhIHRhcmdldCwKKyMgdGhlbiBpdCB3aWxsIGxpa2VseSBzYXZlIG1lbW9yeSBieSBjaGFuZ2luZyBpdCB0byBhIHNoYXJlZCBsaWJyYXJ5CisjIFRoaXMgbW92ZSB3aWxsIGFsc28gbGlrZWx5IHVzZSBsZXNzIHN0b3JhZ2UKK01JTl9TVEFUSUNfSU5DTFVTSU9OUyA9IDMKKworCitkZWYgcGFyc2VfYXJncygpOgorICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigKKyAgICAgIGRlc2NyaXB0aW9uPSgKKyAgICAgICAgICAiUGFyc2UgbW9kdWxlLWluZm8uanNvIGFuZCBkaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHN0YXRpYyBhbmQiCisgICAgICAgICAgIiBzaGFyZWQgbGlicmFyeSBkZXBlbmRlbmNpZXMuIgorICAgICAgKQorICApCisgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAiLS1tb2R1bGUiLCBkZXN0PSJtb2R1bGUiLCBoZWxwPSJQcmludCB0aGUgaW5mbyBmb3IgdGhlIG1vZHVsZS4iCisgICkKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICItLXNoYXJlZCIsCisgICAgICBkZXN0PSJwcmludF9zaGFyZWQiLAorICAgICAgYWN0aW9uPWFyZ3BhcnNlLkJvb2xlYW5PcHRpb25hbEFjdGlvbiwKKyAgICAgIGhlbHA9KAorICAgICAgICAgICJQcmludCB0aGUgbGlzdCBvZiBsaWJyYXJpZXMgdGhhdCBhcmUgc2hhcmVkX2xpYnMgZm9yIGZld2VyIHRoYW4ge30iCisgICAgICAgICAgIiBtb2R1bGVzLiIuZm9ybWF0KE1BWF9TSEFSRURfSU5DTFVTSU9OUykKKyAgICAgICksCisgICkKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICItLXN0YXRpYyIsCisgICAgICBkZXN0PSJwcmludF9zdGF0aWMiLAorICAgICAgYWN0aW9uPWFyZ3BhcnNlLkJvb2xlYW5PcHRpb25hbEFjdGlvbiwKKyAgICAgIGhlbHA9KAorICAgICAgICAgICJQcmludCB0aGUgbGlzdCBvZiBsaWJyYXJpZXMgdGhhdCBhcmUgc3RhdGljX2xpYnMgZm9yIG1vcmUgdGhhbiB7fSIKKyAgICAgICAgICAiIG1vZHVsZXMuIi5mb3JtYXQoTUlOX1NUQVRJQ19JTkNMVVNJT05TKQorICAgICAgKSwKKyAgKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgIi0tcmVjdXJzaXZlIiwKKyAgICAgIGRlc3Q9InJlY3Vyc2l2ZSIsCisgICAgICBhY3Rpb249YXJncGFyc2UuQm9vbGVhbk9wdGlvbmFsQWN0aW9uLAorICAgICAgZGVmYXVsdD1UcnVlLAorICAgICAgaGVscD0oCisgICAgICAgICAgIkdhdGhlciBhbGwgZGVwZW5kZW5jaWVzIG9mIEVYRUNVVEFCTEVTIHJlY3Vyc3ZpbHkgYmVmb3JlIGNhbGN1bGF0aW5nIgorICAgICAgICAgICIgdGhlIHN0YXRzLiBUaGlzIGVsaW1pbmF0ZXMgZHVwbGljYXRlcyBmcm9tIG11bHRpcGxlIGxpYnJhcmllcyIKKyAgICAgICAgICAiIGluY2x1ZGluZyB0aGUgc2FtZSBkZXBlbmRlbmNpZXMgaW4gYSBzaW5nbGUgYmluYXJ5LiIKKyAgICAgICksCisgICkKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICItLWJvdGgiLAorICAgICAgZGVzdD0iYm90aCIsCisgICAgICBhY3Rpb249YXJncGFyc2UuQm9vbGVhbk9wdGlvbmFsQWN0aW9uLAorICAgICAgZGVmYXVsdD1GYWxzZSwKKyAgICAgIGhlbHA9KAorICAgICAgICAgICJQcmludCBhIGxpc3Qgb2YgbGlicmFyaWVzIHRoYXQgYXJlIGluY2x1ZGluZyBsaWJyYXJpZXMgYXMgYm90aCIKKyAgICAgICAgICAiIHN0YXRpYyBhbmQgc2hhcmVkIgorICAgICAgKSwKKyAgKQorICByZXR1cm4gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisKK2NsYXNzIFRyYW5zaXRpdmVIZWxwZXI6CisKKyAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICMga2VlcCBhIGxpc3Qgb2YgYWxyZWFkeSBleHBhbmRlZCBsaWJyYXJpZXMgc28gd2UgZG9uJ3QgZW5kIHVwIGluIGEgY3ljbGUKKyAgICBzZWxmLnZpc2l0ZWQgPSBkZWZhdWx0ZGljdChsYW1iZGE6IGRlZmF1bHRkaWN0KHNldCkpCisKKyAgIyBtb2R1bGUgaXMgYW4gb2JqZWN0IGZyb20gdGhlIG1vZHVsZS1pbmZvIGRpY3Rpb25hcnkKKyAgIyBtb2R1bGVfaW5mbyBpcyB0aGUgZGljdGlvbmFyeSBmcm9tIG1vZHVsZS1pbmZvLmpzb24KKyAgIyBtb2RpZnkgdGhlIG1vZHVsZSdzIHNoYXJlZF9saWJzIGFuZCBzdGF0aWNfbGlicyB3aXRoIGFsbCBvZiB0aGUgdHJhbnNpZW50CisgICMgZGVwZW5kZW5jaWVzIHJlcXVpcmVkIGZyb20gYWxsIG9mIHRoZSBleHBsaWNpdCBkZXBlbmRlbmNpZXMKKyAgZGVmIGZsYXR0ZW5EZXBzKHNlbGYsIG1vZHVsZSwgbW9kdWxlX2luZm8pOgorICAgIGxpYnNfc25hcHNob3QgPSBkaWN0KHNoYXJlZF9saWJzID0gc2V0KG1vZHVsZS5nZXQoInNoYXJlZF9saWJzIix7fSkpLCBzdGF0aWNfbGlicyA9IHNldChtb2R1bGUuZ2V0KCJzdGF0aWNfbGlicyIse30pKSkKKworICAgIGZvciBsaWJfY2xhc3MgaW4gWyJzaGFyZWRfbGlicyIsICJzdGF0aWNfbGlicyJdOgorICAgICAgZm9yIGxpYiBpbiBsaWJzX3NuYXBzaG90W2xpYl9jbGFzc106CisgICAgICAgIGlmIG5vdCBsaWIgb3IgbGliIG5vdCBpbiBtb2R1bGVfaW5mbyBvciBsaWJfY2xhc3Mgbm90IGluIG1vZHVsZToKKyAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBsaWIgaW4gc2VsZi52aXNpdGVkOgorICAgICAgICAgIG1vZHVsZVtsaWJfY2xhc3NdLnVwZGF0ZShzZWxmLnZpc2l0ZWRbbGliXVtsaWJfY2xhc3NdKQorICAgICAgICBlbHNlOgorICAgICAgICAgIHJlcyA9IHNlbGYuZmxhdHRlbkRlcHMobW9kdWxlX2luZm9bbGliXSwgbW9kdWxlX2luZm8pCisgICAgICAgICAgbW9kdWxlW2xpYl9jbGFzc10udXBkYXRlKHJlcy5nZXQobGliX2NsYXNzLCB7fSkpCisgICAgICAgICAgc2VsZi52aXNpdGVkW2xpYl1bbGliX2NsYXNzXS51cGRhdGUocmVzLmdldChsaWJfY2xhc3MsIHt9KSkKKworICAgIHJldHVybiBtb2R1bGUKKworZGVmIG1haW4oKToKKyAgbW9kdWxlX2luZm8gPSBqc29uLmxvYWQob3BlbihBTkRST0lEX1BST0RVQ1RfT1VUICsgIi9tb2R1bGUtaW5mby5qc29uIikpCisKKyAgYXJncyA9IHBhcnNlX2FyZ3MoKQorCisgIGlmIGFyZ3MubW9kdWxlOgorICAgIGlmIGFyZ3MubW9kdWxlIG5vdCBpbiBtb2R1bGVfaW5mbzoKKyAgICAgIHByaW50KCJNb2R1bGUge30gZG9lcyBub3QgZXhpc3QiLmZvcm1hdChhcmdzLm1vZHVsZSkpCisgICAgICBleGl0KDEpCisKKyAgIyB0dXJuIGFsbCBvZiB0aGUgc3RhdGljX2xpYnMgYW5kIHNoYXJlZF9saWJzIGxpc3RzIGludG8gc2V0cyB0byBtYWtlIHRoZW0KKyAgIyBlYXNpZXIgdG8gdXBkYXRlCisgIGZvciBfLCBtb2R1bGUgaW4gbW9kdWxlX2luZm8uaXRlbXMoKToKKyAgICBtb2R1bGVbInNoYXJlZF9saWJzIl0gPSBzZXQobW9kdWxlLmdldCgic2hhcmVkX2xpYnMiLCB7fSkpCisgICAgbW9kdWxlWyJzdGF0aWNfbGlicyJdID0gc2V0KG1vZHVsZS5nZXQoInN0YXRpY19saWJzIiwge30pKQorCisgIGluY2x1ZGVkU3RhdGljYWxseSA9IGRlZmF1bHRkaWN0KHNldCkKKyAgaW5jbHVkZWRTaGFyZWRseSA9IGRlZmF1bHRkaWN0KHNldCkKKyAgaW5jbHVkZWRCb3RobHkgPSBkZWZhdWx0ZGljdChzZXQpCisgIHRyYW5zaXRpdmUgPSBUcmFuc2l0aXZlSGVscGVyKCkKKyAgZm9yIG5hbWUsIG1vZHVsZSBpbiBtb2R1bGVfaW5mby5pdGVtcygpOgorICAgIGlmIGFyZ3MucmVjdXJzaXZlOgorICAgICAgIyBpbiB0aGlzIHJlY3Vyc2l2ZSBtb2RlIHdlIG9ubHkgd2FudCB0byBzZWUgd2hhdCBpcyBpbmNsdWRlZCBieSB0aGUgZXhlY3V0YWJsZXMKKyAgICAgIGlmICJFWEVDVVRBQkxFUyIgbm90IGluIG1vZHVsZVsiY2xhc3MiXToKKyAgICAgICAgY29udGludWUKKyAgICAgIG1vZHVsZSA9IHRyYW5zaXRpdmUuZmxhdHRlbkRlcHMobW9kdWxlLCBtb2R1bGVfaW5mbykKKyAgICAgICMgZmlsdGVyIG91dCBmdXp6ZXJzIGJ5IHRoZWlyIGRlcGVuZGVuY3kgb24gY2xhbmcKKyAgICAgIGlmICJzdGF0aWNfbGlicyIgaW4gbW9kdWxlOgorICAgICAgICBpZiAibGliY2xhbmdfcnQuZnV6emVyIiBpbiBtb2R1bGVbInN0YXRpY19saWJzIl06CisgICAgICAgICAgY29udGludWUKKyAgICBlbHNlOgorICAgICAgaWYgIk5BVElWRV9URVNUUyIgaW4gbW9kdWxlWyJjbGFzcyJdOgorICAgICAgICAjIFdlIGRvbid0IGNhcmUgYWJvdXQgaG93IHRlc3RzIGFyZSBpbmNsdWRpbmcgbGlicmFyaWVzCisgICAgICAgIGNvbnRpbnVlCisKKyAgICAjIGNvdW50IGFsbCBvZiB0aGUgc2hhcmVkIGFuZCBzdGF0aWMgbGlicyBpbmNsdWRlZCBpbiB0aGlzIG1vZHVsZQorICAgIGlmICJzaGFyZWRfbGlicyIgaW4gbW9kdWxlOgorICAgICAgZm9yIGxpYiBpbiBtb2R1bGVbInNoYXJlZF9saWJzIl06CisgICAgICAgIGluY2x1ZGVkU2hhcmVkbHlbbGliXS5hZGQobmFtZSkKKyAgICBpZiAic3RhdGljX2xpYnMiIGluIG1vZHVsZToKKyAgICAgIGZvciBsaWIgaW4gbW9kdWxlWyJzdGF0aWNfbGlicyJdOgorICAgICAgICBpbmNsdWRlZFN0YXRpY2FsbHlbbGliXS5hZGQobmFtZSkKKworICAgIGlmICJzaGFyZWRfbGlicyIgaW4gbW9kdWxlIGFuZCAgInN0YXRpY19saWJzIiBpbiBtb2R1bGU6CisgICAgICBpbnRlcnNlY3Rpb24gPSBzZXQobW9kdWxlWyJzaGFyZWRfbGlicyJdKS5pbnRlcnNlY3Rpb24oCisgICAgICAgICAgbW9kdWxlWyJzdGF0aWNfbGlicyJdCisgICAgICApCisgICAgICBpZiBpbnRlcnNlY3Rpb246CisgICAgICAgIGluY2x1ZGVkQm90aGx5W25hbWVdID0gaW50ZXJzZWN0aW9uCisKKyAgaWYgYXJncy5wcmludF9zaGFyZWQ6CisgICAgcHJpbnQoCisgICAgICAgICJTaGFyZWQgbGlicmFyaWVzIHRoYXQgYXJlIGluY2x1ZGVkIGJ5IGZld2VyIHRoYW4ge30gbW9kdWxlcyBvbiBhIgorICAgICAgICAiIGRldmljZToiLmZvcm1hdChNQVhfU0hBUkVEX0lOQ0xVU0lPTlMpCisgICAgKQorICAgIGZvciBuYW1lLCBsaWJzIGluIGluY2x1ZGVkU2hhcmVkbHkuaXRlbXMoKToKKyAgICAgIGlmIGxlbihsaWJzKSA8IE1BWF9TSEFSRURfSU5DTFVTSU9OUzoKKyAgICAgICAgcHJpbnQoInt9OiB7fSBpbmNsdWRlZCBieToge30iLmZvcm1hdChuYW1lLCBsZW4obGlicyksIGxpYnMpKQorCisgIGlmIGFyZ3MucHJpbnRfc3RhdGljOgorICAgIHByaW50KAorICAgICAgICAiTGlicmFyaWVzIHRoYXQgYXJlIGluY2x1ZGVkIHN0YXRpY2FsbHkgYnkgbW9yZSB0aGFuIHt9IG1vZHVsZXMgb24gYSIKKyAgICAgICAgIiBkZXZpY2U6Ii5mb3JtYXQoTUlOX1NUQVRJQ19JTkNMVVNJT05TKQorICAgICkKKyAgICBmb3IgbmFtZSwgbGlicyBpbiBpbmNsdWRlZFN0YXRpY2FsbHkuaXRlbXMoKToKKyAgICAgIGlmIGxlbihsaWJzKSA+IE1JTl9TVEFUSUNfSU5DTFVTSU9OUzoKKyAgICAgICAgcHJpbnQoInt9OiB7fSBpbmNsdWRlZCBieToge30iLmZvcm1hdChuYW1lLCBsZW4obGlicyksIGxpYnMpKQorCisgIGlmIGFyZ3MuYm90aDoKKyAgICBhbGxJbmNsdWRlZEJvdGhseSA9IHNldCgpCisgICAgZm9yIG5hbWUsIGxpYnMgaW4gaW5jbHVkZWRCb3RobHkuaXRlbXMoKToKKyAgICAgIGFsbEluY2x1ZGVkQm90aGx5LnVwZGF0ZShsaWJzKQorCisgICAgcHJpbnQoCisgICAgICAgICJMaXN0IG9mIGxpYnJhcmllcyB1c2VkIGJvdGggc3RhdGljYWxseSBhbmQgc2hhcmVkIGluIHRoZSBzYW1lIgorICAgICAgICAiIHByb2Nlc3NlczpcbiB7fVxuXG4iLmZvcm1hdCgiXG4iLmpvaW4oc29ydGVkKGFsbEluY2x1ZGVkQm90aGx5KSkpCisgICAgKQorICAgIHByaW50KAorICAgICAgICAiTGlzdCBvZiBsaWJyYXJpZXMgdXNlZCBib3RoIHN0YXRpY2FsbHkgYW5kIHNoYXJlZCBpbiBhbnkgcHJvY2Vzc2VzOlxuIHt9Ii5mb3JtYXQoIlxuIi5qb2luKHNvcnRlZChpbmNsdWRlZFN0YXRpY2FsbHkua2V5cygpICYgaW5jbHVkZWRTaGFyZWRseS5rZXlzKCkpKSkpCisKKyAgaWYgYXJncy5tb2R1bGU6CisgICAgcHJpbnQoanNvbi5kdW1wcyhtb2R1bGVfaW5mb1thcmdzLm1vZHVsZV0sIGRlZmF1bHQ9bGlzdCwgaW5kZW50PTIpKQorICAgIHByaW50KAorICAgICAgICAie30gaXMgaW5jbHVkZWQgaW4gc2hhcmVkX2xpYnMge30gdGltZXMgYnkgdGhlc2UgbW9kdWxlczoge30iLmZvcm1hdCgKKyAgICAgICAgICAgIGFyZ3MubW9kdWxlLCBsZW4oaW5jbHVkZWRTaGFyZWRseVthcmdzLm1vZHVsZV0pLAorICAgICAgICAgICAgaW5jbHVkZWRTaGFyZWRseVthcmdzLm1vZHVsZV0KKyAgICAgICAgKQorICAgICkKKyAgICBwcmludCgKKyAgICAgICAgInt9IGlzIGluY2x1ZGVkIGluIHN0YXRpY19saWJzIHt9IHRpbWVzIGJ5IHRoZXNlIG1vZHVsZXM6IHt9Ii5mb3JtYXQoCisgICAgICAgICAgICBhcmdzLm1vZHVsZSwgbGVuKGluY2x1ZGVkU3RhdGljYWxseVthcmdzLm1vZHVsZV0pLAorICAgICAgICAgICAgaW5jbHVkZWRTdGF0aWNhbGx5W2FyZ3MubW9kdWxlXQorICAgICAgICApCisgICAgKQorICAgIHByaW50KCJTaGFyZWQgbGlicyBpbmNsdWRlZCBieSB0aGlzIG1vZHVsZSB0aGF0IGFyZSB1c2VkIGluIGZld2VyIHRoYW4ge30gcHJvY2Vzc2VzOlxue30iLmZvcm1hdCgKKyAgICAgICAgTUFYX1NIQVJFRF9JTkNMVVNJT05TLCBbeCBmb3IgeCBpbiBtb2R1bGVfaW5mb1thcmdzLm1vZHVsZV1bInNoYXJlZF9saWJzIl0gaWYgbGVuKGluY2x1ZGVkU2hhcmVkbHlbeF0pIDwgTUFYX1NIQVJFRF9JTkNMVVNJT05TXSkpCisKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICBtYWluKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZzX2NvbmZpZy9BbmRyb2lkLmJwIGIvdG9vbHMvZnNfY29uZmlnL0FuZHJvaWQuYnAKaW5kZXggNTVmZGNhNC4uYTViNmZkMCAxMDA2NDQKLS0tIGEvdG9vbHMvZnNfY29uZmlnL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvZnNfY29uZmlnL0FuZHJvaWQuYnAKQEAgLTM1LDcgKzM1LDYgQEAKICAgICBzcmNzOiBbImZzX2NvbmZpZy5jIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJzZWxpbnV4IiwKICAgICBdLAogICAgIGNmbGFnczogWyItV2Vycm9yIl0sCiB9CkBAIC0yNTksMyArMjU4LDM4OCBAQAogICAgIHN5c3RlbV9leHRfc3BlY2lmaWM6IHRydWUsCiAgICAgc3JjOiAiOmdyb3VwX2dlbl9zeXN0ZW1fZXh0IiwKIH0KKworZnNfY29uZmlnX2NtZCA9ICIkKGxvY2F0aW9uIGZzX2NvbmZpZ19nZW5lcmF0b3IpIGZzY29uZmlnICIgKworICAgICItLWFpZC1oZWFkZXIgJChsb2NhdGlvbiA6YW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZ19oZWFkZXIpICIgKworICAgICItLWNhcGFiaWxpdHktaGVhZGVyICQobG9jYXRpb24gOmxpbnV4X2NhcGFiaWxpdHlfaGVhZGVyKSAiICsKKyAgICAiLS1vdXRfZmlsZSAkKG91dCkgIgorZnNfY29uZmlnX2NtZF9kaXJzID0gZnNfY29uZmlnX2NtZCArICItLWRpcnMgIgorZnNfY29uZmlnX2NtZF9maWxlcyA9IGZzX2NvbmZpZ19jbWQgKyAiLS1maWxlcyAiCisKK2dlbnJ1bGVfZGVmYXVsdHMgeworICAgIG5hbWU6ICJmc19jb25maWdfZGVmYXVsdHMiLAorICAgIHRvb2xzOiBbImZzX2NvbmZpZ19nZW5lcmF0b3IiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICI6YW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZ19oZWFkZXIiLAorICAgICAgICAiOmxpbnV4X2NhcGFiaWxpdHlfaGVhZGVyIiwKKyAgICAgICAgIjp0YXJnZXRfZnNfY29uZmlnX2dlbiIsCisgICAgXSwKKyAgICBvdXQ6IFsib3V0Il0sCit9CisKKy8vIHN5c3RlbQorZ2VucnVsZSB7CisgICAgbmFtZTogImZzX2NvbmZpZ19kaXJzX3N5c3RlbV9nZW4iLAorICAgIGRlZmF1bHRzOiBbImZzX2NvbmZpZ19kZWZhdWx0cyJdLAorICAgIGNtZDogZnNfY29uZmlnX2NtZF9kaXJzICsKKyAgICAgICAgIi0tcGFydGl0aW9uIHN5c3RlbSAiICsKKyAgICAgICAgIi0tYWxsLXBhcnRpdGlvbnMgdmVuZG9yLG9lbSxvZG0sdmVuZG9yX2Rsa20sb2RtX2Rsa20sc3lzdGVtX2Rsa20gIiArCisgICAgICAgICIkKGxvY2F0aW9ucyA6dGFyZ2V0X2ZzX2NvbmZpZ19nZW4pIiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2RpcnNfc3lzdGVtIiwKKyAgICBmaWxlbmFtZTogImZzX2NvbmZpZ19kaXJzIiwKKyAgICBzcmM6ICI6ZnNfY29uZmlnX2RpcnNfc3lzdGVtX2dlbiIsCit9CisKK2dlbnJ1bGUgeworICAgIG5hbWU6ICJmc19jb25maWdfZmlsZXNfc3lzdGVtX2dlbiIsCisgICAgZGVmYXVsdHM6IFsiZnNfY29uZmlnX2RlZmF1bHRzIl0sCisgICAgY21kOiBmc19jb25maWdfY21kX2ZpbGVzICsKKyAgICAgICAgIi0tcGFydGl0aW9uIHN5c3RlbSAiICsKKyAgICAgICAgIi0tYWxsLXBhcnRpdGlvbnMgdmVuZG9yLG9lbSxvZG0sdmVuZG9yX2Rsa20sb2RtX2Rsa20sc3lzdGVtX2Rsa20gIiArCisgICAgICAgICIkKGxvY2F0aW9ucyA6dGFyZ2V0X2ZzX2NvbmZpZ19nZW4pIiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2ZpbGVzX3N5c3RlbSIsCisgICAgZmlsZW5hbWU6ICJmc19jb25maWdfZmlsZXMiLAorICAgIHNyYzogIjpmc19jb25maWdfZmlsZXNfc3lzdGVtX2dlbiIsCit9CisKKy8vIHN5c3RlbV9leHQKK2dlbnJ1bGUgeworICAgIG5hbWU6ICJmc19jb25maWdfZGlyc19zeXN0ZW1fZXh0X2dlbiIsCisgICAgZGVmYXVsdHM6IFsiZnNfY29uZmlnX2RlZmF1bHRzIl0sCisgICAgY21kOiBmc19jb25maWdfY21kX2RpcnMgKworICAgICAgICAiLS1wYXJ0aXRpb24gc3lzdGVtX2V4dCAiICsKKyAgICAgICAgIiQobG9jYXRpb25zIDp0YXJnZXRfZnNfY29uZmlnX2dlbikiLAorfQorCitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJmc19jb25maWdfZGlyc19zeXN0ZW1fZXh0IiwKKyAgICBmaWxlbmFtZTogImZzX2NvbmZpZ19kaXJzIiwKKyAgICBzcmM6ICI6ZnNfY29uZmlnX2RpcnNfc3lzdGVtX2V4dF9nZW4iLAorICAgIHN5c3RlbV9leHRfc3BlY2lmaWM6IHRydWUsCit9CisKK2dlbnJ1bGUgeworICAgIG5hbWU6ICJmc19jb25maWdfZmlsZXNfc3lzdGVtX2V4dF9nZW4iLAorICAgIGRlZmF1bHRzOiBbImZzX2NvbmZpZ19kZWZhdWx0cyJdLAorICAgIGNtZDogZnNfY29uZmlnX2NtZF9maWxlcyArCisgICAgICAgICItLXBhcnRpdGlvbiBzeXN0ZW1fZXh0ICIgKworICAgICAgICAiJChsb2NhdGlvbnMgOnRhcmdldF9mc19jb25maWdfZ2VuKSIsCit9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImZzX2NvbmZpZ19maWxlc19zeXN0ZW1fZXh0IiwKKyAgICBmaWxlbmFtZTogImZzX2NvbmZpZ19maWxlcyIsCisgICAgc3JjOiAiOmZzX2NvbmZpZ19maWxlc19zeXN0ZW1fZXh0X2dlbiIsCisgICAgc3lzdGVtX2V4dF9zcGVjaWZpYzogdHJ1ZSwKK30KKworLy8gcHJvZHVjdAorZ2VucnVsZSB7CisgICAgbmFtZTogImZzX2NvbmZpZ19kaXJzX3Byb2R1Y3RfZ2VuIiwKKyAgICBkZWZhdWx0czogWyJmc19jb25maWdfZGVmYXVsdHMiXSwKKyAgICBjbWQ6IGZzX2NvbmZpZ19jbWRfZGlycyArCisgICAgICAgICItLXBhcnRpdGlvbiBwcm9kdWN0ICIgKworICAgICAgICAiJChsb2NhdGlvbnMgOnRhcmdldF9mc19jb25maWdfZ2VuKSIsCit9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImZzX2NvbmZpZ19kaXJzX3Byb2R1Y3QiLAorICAgIGZpbGVuYW1lOiAiZnNfY29uZmlnX2RpcnMiLAorICAgIHNyYzogIjpmc19jb25maWdfZGlyc19wcm9kdWN0X2dlbiIsCisgICAgcHJvZHVjdF9zcGVjaWZpYzogdHJ1ZSwKK30KKworZ2VucnVsZSB7CisgICAgbmFtZTogImZzX2NvbmZpZ19maWxlc19wcm9kdWN0X2dlbiIsCisgICAgZGVmYXVsdHM6IFsiZnNfY29uZmlnX2RlZmF1bHRzIl0sCisgICAgY21kOiBmc19jb25maWdfY21kX2ZpbGVzICsKKyAgICAgICAgIi0tcGFydGl0aW9uIHByb2R1Y3QgIiArCisgICAgICAgICIkKGxvY2F0aW9ucyA6dGFyZ2V0X2ZzX2NvbmZpZ19nZW4pIiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2ZpbGVzX3Byb2R1Y3QiLAorICAgIGZpbGVuYW1lOiAiZnNfY29uZmlnX2ZpbGVzIiwKKyAgICBzcmM6ICI6ZnNfY29uZmlnX2ZpbGVzX3Byb2R1Y3RfZ2VuIiwKKyAgICBwcm9kdWN0X3NwZWNpZmljOiB0cnVlLAorfQorCisvLyB2ZW5kb3IKK2dlbnJ1bGUgeworICAgIG5hbWU6ICJmc19jb25maWdfZGlyc192ZW5kb3JfZ2VuIiwKKyAgICBkZWZhdWx0czogWyJmc19jb25maWdfZGVmYXVsdHMiXSwKKyAgICBjbWQ6IGZzX2NvbmZpZ19jbWRfZGlycyArCisgICAgICAgICItLXBhcnRpdGlvbiB2ZW5kb3IgIiArCisgICAgICAgICIkKGxvY2F0aW9ucyA6dGFyZ2V0X2ZzX2NvbmZpZ19nZW4pIiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2RpcnNfdmVuZG9yIiwKKyAgICBmaWxlbmFtZTogImZzX2NvbmZpZ19kaXJzIiwKKyAgICBzcmM6ICI6ZnNfY29uZmlnX2RpcnNfdmVuZG9yX2dlbiIsCisgICAgdmVuZG9yOiB0cnVlLAorfQorCitnZW5ydWxlIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2ZpbGVzX3ZlbmRvcl9nZW4iLAorICAgIGRlZmF1bHRzOiBbImZzX2NvbmZpZ19kZWZhdWx0cyJdLAorICAgIGNtZDogZnNfY29uZmlnX2NtZF9maWxlcyArCisgICAgICAgICItLXBhcnRpdGlvbiB2ZW5kb3IgIiArCisgICAgICAgICIkKGxvY2F0aW9ucyA6dGFyZ2V0X2ZzX2NvbmZpZ19nZW4pIiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2ZpbGVzX3ZlbmRvciIsCisgICAgZmlsZW5hbWU6ICJmc19jb25maWdfZmlsZXMiLAorICAgIHNyYzogIjpmc19jb25maWdfZmlsZXNfdmVuZG9yX2dlbiIsCisgICAgdmVuZG9yOiB0cnVlLAorfQorCisvLyBvZG0KK2dlbnJ1bGUgeworICAgIG5hbWU6ICJmc19jb25maWdfZGlyc19vZG1fZ2VuIiwKKyAgICBkZWZhdWx0czogWyJmc19jb25maWdfZGVmYXVsdHMiXSwKKyAgICBjbWQ6IGZzX2NvbmZpZ19jbWRfZGlycyArCisgICAgICAgICItLXBhcnRpdGlvbiBvZG0gIiArCisgICAgICAgICIkKGxvY2F0aW9ucyA6dGFyZ2V0X2ZzX2NvbmZpZ19nZW4pIiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2RpcnNfb2RtIiwKKyAgICBmaWxlbmFtZTogImZzX2NvbmZpZ19kaXJzIiwKKyAgICBzcmM6ICI6ZnNfY29uZmlnX2RpcnNfb2RtX2dlbiIsCisgICAgZGV2aWNlX3NwZWNpZmljOiB0cnVlLAorfQorCitnZW5ydWxlIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2ZpbGVzX29kbV9nZW4iLAorICAgIGRlZmF1bHRzOiBbImZzX2NvbmZpZ19kZWZhdWx0cyJdLAorICAgIGNtZDogZnNfY29uZmlnX2NtZF9maWxlcyArCisgICAgICAgICItLXBhcnRpdGlvbiBvZG0gIiArCisgICAgICAgICIkKGxvY2F0aW9ucyA6dGFyZ2V0X2ZzX2NvbmZpZ19nZW4pIiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2ZpbGVzX29kbSIsCisgICAgZmlsZW5hbWU6ICJmc19jb25maWdfZmlsZXMiLAorICAgIHNyYzogIjpmc19jb25maWdfZmlsZXNfb2RtX2dlbiIsCisgICAgZGV2aWNlX3NwZWNpZmljOiB0cnVlLAorfQorCisvLyBzeXN0ZW1fZGxrbQorZ2VucnVsZSB7CisgICAgbmFtZTogImZzX2NvbmZpZ19kaXJzX3N5c3RlbV9kbGttX2dlbiIsCisgICAgZGVmYXVsdHM6IFsiZnNfY29uZmlnX2RlZmF1bHRzIl0sCisgICAgY21kOiBmc19jb25maWdfY21kX2RpcnMgKworICAgICAgICAiLS1wYXJ0aXRpb24gc3lzdGVtX2Rsa20gIiArCisgICAgICAgICIkKGxvY2F0aW9ucyA6dGFyZ2V0X2ZzX2NvbmZpZ19nZW4pIiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2RpcnNfc3lzdGVtX2Rsa20iLAorICAgIGZpbGVuYW1lOiAiZnNfY29uZmlnX2RpcnMiLAorICAgIHNyYzogIjpmc19jb25maWdfZGlyc19zeXN0ZW1fZGxrbV9nZW4iLAorICAgIHN5c3RlbV9kbGttX3NwZWNpZmljOiB0cnVlLAorfQorCitnZW5ydWxlIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2ZpbGVzX3N5c3RlbV9kbGttX2dlbiIsCisgICAgZGVmYXVsdHM6IFsiZnNfY29uZmlnX2RlZmF1bHRzIl0sCisgICAgY21kOiBmc19jb25maWdfY21kX2ZpbGVzICsKKyAgICAgICAgIi0tcGFydGl0aW9uIHN5c3RlbV9kbGttICIgKworICAgICAgICAiJChsb2NhdGlvbnMgOnRhcmdldF9mc19jb25maWdfZ2VuKSIsCit9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImZzX2NvbmZpZ19maWxlc19zeXN0ZW1fZGxrbSIsCisgICAgZmlsZW5hbWU6ICJmc19jb25maWdfZmlsZXMiLAorICAgIHNyYzogIjpmc19jb25maWdfZmlsZXNfc3lzdGVtX2Rsa21fZ2VuIiwKKyAgICBzeXN0ZW1fZGxrbV9zcGVjaWZpYzogdHJ1ZSwKK30KKworLy8gdmVuZG9yX2Rsa20KK2dlbnJ1bGUgeworICAgIG5hbWU6ICJmc19jb25maWdfZGlyc192ZW5kb3JfZGxrbV9nZW4iLAorICAgIGRlZmF1bHRzOiBbImZzX2NvbmZpZ19kZWZhdWx0cyJdLAorICAgIGNtZDogZnNfY29uZmlnX2NtZF9kaXJzICsKKyAgICAgICAgIi0tcGFydGl0aW9uIHZlbmRvcl9kbGttICIgKworICAgICAgICAiJChsb2NhdGlvbnMgOnRhcmdldF9mc19jb25maWdfZ2VuKSIsCit9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImZzX2NvbmZpZ19kaXJzX3ZlbmRvcl9kbGttIiwKKyAgICBmaWxlbmFtZTogImZzX2NvbmZpZ19kaXJzIiwKKyAgICBzcmM6ICI6ZnNfY29uZmlnX2RpcnNfdmVuZG9yX2Rsa21fZ2VuIiwKKyAgICB2ZW5kb3JfZGxrbV9zcGVjaWZpYzogdHJ1ZSwKK30KKworZ2VucnVsZSB7CisgICAgbmFtZTogImZzX2NvbmZpZ19maWxlc192ZW5kb3JfZGxrbV9nZW4iLAorICAgIGRlZmF1bHRzOiBbImZzX2NvbmZpZ19kZWZhdWx0cyJdLAorICAgIGNtZDogZnNfY29uZmlnX2NtZF9maWxlcyArCisgICAgICAgICItLXBhcnRpdGlvbiB2ZW5kb3JfZGxrbSAiICsKKyAgICAgICAgIiQobG9jYXRpb25zIDp0YXJnZXRfZnNfY29uZmlnX2dlbikiLAorfQorCitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJmc19jb25maWdfZmlsZXNfdmVuZG9yX2Rsa20iLAorICAgIGZpbGVuYW1lOiAiZnNfY29uZmlnX2ZpbGVzIiwKKyAgICBzcmM6ICI6ZnNfY29uZmlnX2ZpbGVzX3ZlbmRvcl9kbGttX2dlbiIsCisgICAgdmVuZG9yX2Rsa21fc3BlY2lmaWM6IHRydWUsCit9CisKKy8vIG9kbV9kbGttCitnZW5ydWxlIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2RpcnNfb2RtX2Rsa21fZ2VuIiwKKyAgICBkZWZhdWx0czogWyJmc19jb25maWdfZGVmYXVsdHMiXSwKKyAgICBjbWQ6IGZzX2NvbmZpZ19jbWRfZGlycyArCisgICAgICAgICItLXBhcnRpdGlvbiBvZG1fZGxrbSAiICsKKyAgICAgICAgIiQobG9jYXRpb25zIDp0YXJnZXRfZnNfY29uZmlnX2dlbikiLAorfQorCitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJmc19jb25maWdfZGlyc19vZG1fZGxrbSIsCisgICAgZmlsZW5hbWU6ICJmc19jb25maWdfZGlycyIsCisgICAgc3JjOiAiOmZzX2NvbmZpZ19kaXJzX29kbV9kbGttX2dlbiIsCisgICAgb2RtX2Rsa21fc3BlY2lmaWM6IHRydWUsCit9CisKK2dlbnJ1bGUgeworICAgIG5hbWU6ICJmc19jb25maWdfZmlsZXNfb2RtX2Rsa21fZ2VuIiwKKyAgICBkZWZhdWx0czogWyJmc19jb25maWdfZGVmYXVsdHMiXSwKKyAgICBjbWQ6IGZzX2NvbmZpZ19jbWRfZmlsZXMgKworICAgICAgICAiLS1wYXJ0aXRpb24gb2RtX2Rsa20gIiArCisgICAgICAgICIkKGxvY2F0aW9ucyA6dGFyZ2V0X2ZzX2NvbmZpZ19nZW4pIiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2ZpbGVzX29kbV9kbGttIiwKKyAgICBmaWxlbmFtZTogImZzX2NvbmZpZ19maWxlcyIsCisgICAgc3JjOiAiOmZzX2NvbmZpZ19maWxlc19vZG1fZGxrbV9nZW4iLAorICAgIG9kbV9kbGttX3NwZWNpZmljOiB0cnVlLAorfQorCisvLyBvZW0KK2dlbnJ1bGUgeworICAgIG5hbWU6ICJmc19jb25maWdfZGlyc19vZW1fZ2VuIiwKKyAgICBkZWZhdWx0czogWyJmc19jb25maWdfZGVmYXVsdHMiXSwKKyAgICBjbWQ6IGZzX2NvbmZpZ19jbWRfZGlycyArCisgICAgICAgICItLXBhcnRpdGlvbiBvZW0gIiArCisgICAgICAgICIkKGxvY2F0aW9ucyA6dGFyZ2V0X2ZzX2NvbmZpZ19nZW4pIiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2RpcnNfb2VtIiwKKyAgICBmaWxlbmFtZTogImZzX2NvbmZpZ19kaXJzIiwKKyAgICBzcmM6ICI6ZnNfY29uZmlnX2RpcnNfb2VtX2dlbiIsCisgICAgb2VtX3NwZWNpZmljOiB0cnVlLAorfQorCitnZW5ydWxlIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2ZpbGVzX29lbV9nZW4iLAorICAgIGRlZmF1bHRzOiBbImZzX2NvbmZpZ19kZWZhdWx0cyJdLAorICAgIGNtZDogZnNfY29uZmlnX2NtZF9maWxlcyArCisgICAgICAgICItLXBhcnRpdGlvbiBvZW0gIiArCisgICAgICAgICIkKGxvY2F0aW9ucyA6dGFyZ2V0X2ZzX2NvbmZpZ19nZW4pIiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2ZpbGVzX29lbSIsCisgICAgZmlsZW5hbWU6ICJmc19jb25maWdfZmlsZXMiLAorICAgIHNyYzogIjpmc19jb25maWdfZmlsZXNfb2VtX2dlbiIsCisgICAgb2VtX3NwZWNpZmljOiB0cnVlLAorfQorCisvLyBHZW5lcmF0ZSB0aGUgPHA+L2V0Yy9mc19jb25maWdfZGlycyBiaW5hcnkgZmlsZXMgZm9yIGVhY2ggcGFydGl0aW9uLgorLy8gQWRkIGZzX2NvbmZpZ19kaXJzIHRvIFBST0RVQ1RfUEFDS0FHRVMgaW4gdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlLgorcGhvbnkgeworICAgIG5hbWU6ICJmc19jb25maWdfZGlycyIsCisgICAgcmVxdWlyZWQ6IFsKKyAgICAgICAgImZzX2NvbmZpZ19kaXJzX3N5c3RlbSIsCisgICAgICAgICJmc19jb25maWdfZGlyc19zeXN0ZW1fZXh0IiwKKyAgICAgICAgImZzX2NvbmZpZ19kaXJzX3Byb2R1Y3QiLAorICAgICAgICAiZnNfY29uZmlnX2RpcnNfbm9uc3lzdGVtIiwKKyAgICBdLAorfQorCisvLyBHZW5lcmF0ZSB0aGUgPHA+L2V0Yy9mc19jb25maWdfZmlsZXMgYmluYXJ5IGZpbGVzIGZvciBlYWNoIHBhcnRpdGlvbi4KKy8vIEFkZCBmc19jb25maWdfZmlsZXMgdG8gUFJPRFVDVF9QQUNLQUdFUyBpbiB0aGUgZGV2aWNlIG1ha2UgZmlsZSB0byBlbmFibGUuCitwaG9ueSB7CisgICAgbmFtZTogImZzX2NvbmZpZ19maWxlcyIsCisgICAgcmVxdWlyZWQ6IFsKKyAgICAgICAgImZzX2NvbmZpZ19maWxlc19zeXN0ZW0iLAorICAgICAgICAiZnNfY29uZmlnX2ZpbGVzX3N5c3RlbV9leHQiLAorICAgICAgICAiZnNfY29uZmlnX2ZpbGVzX3Byb2R1Y3QiLAorICAgICAgICAiZnNfY29uZmlnX2ZpbGVzX25vbnN5c3RlbSIsCisgICAgXSwKK30KKworLy8gR2VuZXJhdGUgdGhlIDxwPi9ldGMvZnNfY29uZmlnX2RpcnMgYmluYXJ5IGZpbGVzIGZvciBhbGwgZW5hYmxlZCBwYXJ0aXRpb25zCisvLyBleGNsdWRpbmcgL3N5c3RlbSwgL3N5c3RlbV9leHQgYW5kIC9wcm9kdWN0LiBBZGQgZnNfY29uZmlnX2RpcnNfbm9uc3lzdGVtIHRvCisvLyBQUk9EVUNUX1BBQ0tBR0VTIGluIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZS4KK3Bob255IHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2RpcnNfbm9uc3lzdGVtIiwKKyAgICByZXF1aXJlZDogW10gKworICAgICAgICBzZWxlY3Qoc29vbmdfY29uZmlnX3ZhcmlhYmxlKCJmc19jb25maWciLCAidmVuZG9yIiksIHsKKyAgICAgICAgICAgIHRydWU6IFsiZnNfY29uZmlnX2RpcnNfdmVuZG9yIl0sCisgICAgICAgICAgICBkZWZhdWx0OiBbXSwKKyAgICAgICAgfSkgKworICAgICAgICBzZWxlY3Qoc29vbmdfY29uZmlnX3ZhcmlhYmxlKCJmc19jb25maWciLCAib2VtIiksIHsKKyAgICAgICAgICAgIHRydWU6IFsiZnNfY29uZmlnX2RpcnNfb2VtIl0sCisgICAgICAgICAgICBkZWZhdWx0OiBbXSwKKyAgICAgICAgfSkgKworICAgICAgICBzZWxlY3Qoc29vbmdfY29uZmlnX3ZhcmlhYmxlKCJmc19jb25maWciLCAib2RtIiksIHsKKyAgICAgICAgICAgIHRydWU6IFsiZnNfY29uZmlnX2RpcnNfb2RtIl0sCisgICAgICAgICAgICBkZWZhdWx0OiBbXSwKKyAgICAgICAgfSkgKworICAgICAgICBzZWxlY3Qoc29vbmdfY29uZmlnX3ZhcmlhYmxlKCJmc19jb25maWciLCAidmVuZG9yX2Rsa20iKSwgeworICAgICAgICAgICAgdHJ1ZTogWyJmc19jb25maWdfZGlyc192ZW5kb3JfZGxrbSJdLAorICAgICAgICAgICAgZGVmYXVsdDogW10sCisgICAgICAgIH0pICsKKyAgICAgICAgc2VsZWN0KHNvb25nX2NvbmZpZ192YXJpYWJsZSgiZnNfY29uZmlnIiwgIm9kbV9kbGttIiksIHsKKyAgICAgICAgICAgIHRydWU6IFsiZnNfY29uZmlnX2RpcnNfb2RtX2Rsa20iXSwKKyAgICAgICAgICAgIGRlZmF1bHQ6IFtdLAorICAgICAgICB9KSArCisgICAgICAgIHNlbGVjdChzb29uZ19jb25maWdfdmFyaWFibGUoImZzX2NvbmZpZyIsICJzeXN0ZW1fZGxrbSIpLCB7CisgICAgICAgICAgICB0cnVlOiBbImZzX2NvbmZpZ19kaXJzX3N5c3RlbV9kbGttIl0sCisgICAgICAgICAgICBkZWZhdWx0OiBbXSwKKyAgICAgICAgfSksCit9CisKKy8vIEdlbmVyYXRlIHRoZSA8cD4vZXRjL2ZzX2NvbmZpZ19maWxlcyBiaW5hcnkgZmlsZXMgZm9yIGFsbCBlbmFibGVkIHBhcnRpdGlvbnMKKy8vIGV4Y2x1ZGluZyAvc3lzdGVtLCAvc3lzdGVtX2V4dCBhbmQgL3Byb2R1Y3QuIEFkZCBmc19jb25maWdfZmlsZXNfbm9uc3lzdGVtIHRvCisvLyBQUk9EVUNUX1BBQ0tBR0VTIGluIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZS4KK3Bob255IHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2ZpbGVzX25vbnN5c3RlbSIsCisgICAgcmVxdWlyZWQ6IFtdICsKKyAgICAgICAgc2VsZWN0KHNvb25nX2NvbmZpZ192YXJpYWJsZSgiZnNfY29uZmlnIiwgInZlbmRvciIpLCB7CisgICAgICAgICAgICB0cnVlOiBbImZzX2NvbmZpZ19maWxlc192ZW5kb3IiXSwKKyAgICAgICAgICAgIGRlZmF1bHQ6IFtdLAorICAgICAgICB9KSArCisgICAgICAgIHNlbGVjdChzb29uZ19jb25maWdfdmFyaWFibGUoImZzX2NvbmZpZyIsICJvZW0iKSwgeworICAgICAgICAgICAgdHJ1ZTogWyJmc19jb25maWdfZmlsZXNfb2VtIl0sCisgICAgICAgICAgICBkZWZhdWx0OiBbXSwKKyAgICAgICAgfSkgKworICAgICAgICBzZWxlY3Qoc29vbmdfY29uZmlnX3ZhcmlhYmxlKCJmc19jb25maWciLCAib2RtIiksIHsKKyAgICAgICAgICAgIHRydWU6IFsiZnNfY29uZmlnX2ZpbGVzX29kbSJdLAorICAgICAgICAgICAgZGVmYXVsdDogW10sCisgICAgICAgIH0pICsKKyAgICAgICAgc2VsZWN0KHNvb25nX2NvbmZpZ192YXJpYWJsZSgiZnNfY29uZmlnIiwgInZlbmRvcl9kbGttIiksIHsKKyAgICAgICAgICAgIHRydWU6IFsiZnNfY29uZmlnX2ZpbGVzX3ZlbmRvcl9kbGttIl0sCisgICAgICAgICAgICBkZWZhdWx0OiBbXSwKKyAgICAgICAgfSkgKworICAgICAgICBzZWxlY3Qoc29vbmdfY29uZmlnX3ZhcmlhYmxlKCJmc19jb25maWciLCAib2RtX2Rsa20iKSwgeworICAgICAgICAgICAgdHJ1ZTogWyJmc19jb25maWdfZmlsZXNfb2RtX2Rsa20iXSwKKyAgICAgICAgICAgIGRlZmF1bHQ6IFtdLAorICAgICAgICB9KSArCisgICAgICAgIHNlbGVjdChzb29uZ19jb25maWdfdmFyaWFibGUoImZzX2NvbmZpZyIsICJzeXN0ZW1fZGxrbSIpLCB7CisgICAgICAgICAgICB0cnVlOiBbImZzX2NvbmZpZ19maWxlc19zeXN0ZW1fZGxrbSJdLAorICAgICAgICAgICAgZGVmYXVsdDogW10sCisgICAgICAgIH0pLAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZnNfY29uZmlnL0FuZHJvaWQubWsgYi90b29scy9mc19jb25maWcvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM2YzNhYS4uMDAwMDAwMAotLS0gYS90b29scy9mc19jb25maWcvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDY3NyArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLSMgT25lIGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdCBhbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmggZmlsZSBieSB1c2luZyBUQVJHRVRfRlNfQ09ORklHX0dFTi4KLSMgICBTZXQgVEFSR0VUX0ZTX0NPTkZJR19HRU4gdG8gY29udGFpbiBhIGxpc3Qgb2YgaW50ZXJtZWRpYXRlIGZvcm1hdCBmaWxlcwotIyAgIGZvciBnZW5lcmF0aW5nIHRoZSBhbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmggZmlsZS4KLSMKLSMgTW9yZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlIFJFQURNRQotCi1pZm5lcSAoJCh3aWxkY2FyZCAkKFRBUkdFVF9ERVZJQ0VfRElSKS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmgpLCkKLSQoZXJyb3IgVXNpbmcgJChUQVJHRVRfREVWSUNFX0RJUikvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgVEFSR0VUX0ZTX0NPTkZJR19HRU4gaW5zdGVhZCkKLWVuZGlmCi0KLXN5c3RlbV9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnIDo9IHN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL3ByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oCi1zeXN0ZW1fY2FwYWJpbGl0eV9oZWFkZXIgOj0gYmlvbmljL2xpYmMva2VybmVsL3VhcGkvbGludXgvY2FwYWJpbGl0eS5oCi0KLSMgVXNlIHNuYXBzaG90cyBpZiBleGlzdAotdmVuZG9yX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcgOj0gJChzdHJpcCBcCi0gICQoaWYgJChmaWx0ZXItb3V0IGN1cnJlbnQsJChCT0FSRF9WTkRLX1ZFUlNJT04pKSwgXAotICAgICQoU09PTkdfVkVORE9SXyQoQk9BUkRfVk5ES19WRVJTSU9OKV9TTkFQU0hPVF9ESVIpL2luY2x1ZGUvJChzeXN0ZW1fYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykpKQotaWZlcSAoLCQod2lsZGNhcmQgJCh2ZW5kb3JfYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykpKQotdmVuZG9yX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcgOj0gJChzeXN0ZW1fYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykKLWVuZGlmCi0KLXZlbmRvcl9jYXBhYmlsaXR5X2hlYWRlciA6PSAkKHN0cmlwIFwKLSAgJChpZiAkKGZpbHRlci1vdXQgY3VycmVudCwkKEJPQVJEX1ZOREtfVkVSU0lPTikpLCBcCi0gICAgJChTT09OR19WRU5ET1JfJChCT0FSRF9WTkRLX1ZFUlNJT04pX1NOQVBTSE9UX0RJUikvaW5jbHVkZS8kKHN5c3RlbV9jYXBhYmlsaXR5X2hlYWRlcikpKQotaWZlcSAoLCQod2lsZGNhcmQgJCh2ZW5kb3JfY2FwYWJpbGl0eV9oZWFkZXIpKSkKLXZlbmRvcl9jYXBhYmlsaXR5X2hlYWRlciA6PSAkKHN5c3RlbV9jYXBhYmlsaXR5X2hlYWRlcikKLWVuZGlmCi0KLSMgTGlzdCBvZiBzdXBwb3J0ZWQgdmVuZG9yLCBvZW0sIG9kbSwgdmVuZG9yX2Rsa20sIG9kbV9kbGttLCBhbmQgc3lzdGVtX2Rsa20gUGFydGl0aW9ucwotZnNfY29uZmlnX2dlbmVyYXRlX2V4dHJhX3BhcnRpdGlvbl9saXN0IDo9ICQoc3RyaXAgXAotICAkKGlmICQoQk9BUkRfVVNFU19WRU5ET1JJTUFHRSkkKEJPQVJEX1ZFTkRPUklNQUdFX0ZJTEVfU1lTVEVNX1RZUEUpLHZlbmRvcikgXAotICAkKGlmICQoQk9BUkRfVVNFU19PRU1JTUFHRSkkKEJPQVJEX09FTUlNQUdFX0ZJTEVfU1lTVEVNX1RZUEUpLG9lbSkgXAotICAkKGlmICQoQk9BUkRfVVNFU19PRE1JTUFHRSkkKEJPQVJEX09ETUlNQUdFX0ZJTEVfU1lTVEVNX1RZUEUpLG9kbSkgXAotICAkKGlmICQoQk9BUkRfVVNFU19WRU5ET1JfRExLTUlNQUdFKSQoQk9BUkRfVkVORE9SX0RMS01JTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSx2ZW5kb3JfZGxrbSkgXAotICAkKGlmICQoQk9BUkRfVVNFU19PRE1fRExLTUlNQUdFKSQoQk9BUkRfT0RNX0RMS01JTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSxvZG1fZGxrbSkgXAotICAkKGlmICQoQk9BUkRfVVNFU19TWVNURU1fRExLTUlNQUdFKSQoQk9BUkRfU1lTVEVNX0RMS01JTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSxzeXN0ZW1fZGxrbSkgXAotKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEdlbmVyYXRlIHRoZSA8cD4vZXRjL2ZzX2NvbmZpZ19kaXJzIGJpbmFyeSBmaWxlcyBmb3IgZWFjaCBwYXJ0aXRpb24uCi0jIEFkZCBmc19jb25maWdfZGlycyB0byBQUk9EVUNUX1BBQ0tBR0VTIGluIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZS4KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gZnNfY29uZmlnX2RpcnMKLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBcCi0gIGZzX2NvbmZpZ19kaXJzX3N5c3RlbSBcCi0gIGZzX2NvbmZpZ19kaXJzX3N5c3RlbV9leHQgXAotICBmc19jb25maWdfZGlyc19wcm9kdWN0IFwKLSAgZnNfY29uZmlnX2RpcnNfbm9uc3lzdGVtCi1pbmNsdWRlICQoQlVJTERfUEhPTllfUEFDS0FHRSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBHZW5lcmF0ZSB0aGUgPHA+L2V0Yy9mc19jb25maWdfZmlsZXMgYmluYXJ5IGZpbGVzIGZvciBlYWNoIHBhcnRpdGlvbi4KLSMgQWRkIGZzX2NvbmZpZ19maWxlcyB0byBQUk9EVUNUX1BBQ0tBR0VTIGluIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZS4KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gZnNfY29uZmlnX2ZpbGVzCi1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gXAotICBmc19jb25maWdfZmlsZXNfc3lzdGVtIFwKLSAgZnNfY29uZmlnX2ZpbGVzX3N5c3RlbV9leHQgXAotICBmc19jb25maWdfZmlsZXNfcHJvZHVjdCBcCi0gIGZzX2NvbmZpZ19maWxlc19ub25zeXN0ZW0KLWluY2x1ZGUgJChCVUlMRF9QSE9OWV9QQUNLQUdFKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEdlbmVyYXRlIHRoZSBzeXN0ZW1fZXh0L2V0Yy9mc19jb25maWdfZGlycyBiaW5hcnkgZmlsZSBmb3IgdGhlIHRhcmdldCBpZiB0aGUKLSMgc3lzdGVtX2V4dCBwYXJ0aXRpb24gaXMgZ2VuZXJhdGVkLiBBZGQgZnNfY29uZmlnX2RpcnMgb3IgZnNfY29uZmlnX2RpcnNfc3lzdGVtX2V4dAotIyB0byBQUk9EVUNUX1BBQ0tBR0VTIGluIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZS4KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gZnNfY29uZmlnX2RpcnNfc3lzdGVtX2V4dAotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9ICQoaWYgJChCT0FSRF9VU0VTX1NZU1RFTV9FWFRJTUFHRSkkKEJPQVJEX1NZU1RFTV9FWFRJTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSxfZnNfY29uZmlnX2RpcnNfc3lzdGVtX2V4dCkKLWluY2x1ZGUgJChCVUlMRF9QSE9OWV9QQUNLQUdFKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEdlbmVyYXRlIHRoZSBzeXN0ZW1fZXh0L2V0Yy9mc19jb25maWdfZmlsZXMgYmluYXJ5IGZpbGUgZm9yIHRoZSB0YXJnZXQgaWYgdGhlCi0jIHN5c3RlbV9leHQgcGFydGl0aW9uIGlzIGdlbmVyYXRlZC4gQWRkIGZzX2NvbmZpZ19maWxlcyBvciBmc19jb25maWdfZmlsZXNfc3lzdGVtX2V4dAotIyB0byBQUk9EVUNUX1BBQ0tBR0VTIGluIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZS4KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gZnNfY29uZmlnX2ZpbGVzX3N5c3RlbV9leHQKLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSAkKGlmICQoQk9BUkRfVVNFU19TWVNURU1fRVhUSU1BR0UpJChCT0FSRF9TWVNURU1fRVhUSU1BR0VfRklMRV9TWVNURU1fVFlQRSksX2ZzX2NvbmZpZ19maWxlc19zeXN0ZW1fZXh0KQotaW5jbHVkZSAkKEJVSUxEX1BIT05ZX1BBQ0tBR0UpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2VuZXJhdGUgdGhlIHByb2R1Y3QvZXRjL2ZzX2NvbmZpZ19kaXJzIGJpbmFyeSBmaWxlIGZvciB0aGUgdGFyZ2V0IGlmIHRoZQotIyBwcm9kdWN0IHBhcnRpdGlvbiBpcyBnZW5lcmF0ZWQuIEFkZCBmc19jb25maWdfZGlycyBvciBmc19jb25maWdfZGlyc19wcm9kdWN0Ci0jIHRvIFBST0RVQ1RfUEFDS0FHRVMgaW4gdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlLgotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBmc19jb25maWdfZGlyc19wcm9kdWN0Ci1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gJChpZiAkKEJPQVJEX1VTRVNfUFJPRFVDVElNQUdFKSQoQk9BUkRfUFJPRFVDVElNQUdFX0ZJTEVfU1lTVEVNX1RZUEUpLF9mc19jb25maWdfZGlyc19wcm9kdWN0KQotaW5jbHVkZSAkKEJVSUxEX1BIT05ZX1BBQ0tBR0UpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2VuZXJhdGUgdGhlIHByb2R1Y3QvZXRjL2ZzX2NvbmZpZ19maWxlcyBiaW5hcnkgZmlsZSBmb3IgdGhlIHRhcmdldCBpZiB0aGUKLSMgcHJvZHVjdCBwYXJ0aXRpb24gaXMgZ2VuZXJhdGVkLiBBZGQgZnNfY29uZmlnX2ZpbGVzIG9yIGZzX2NvbmZpZ19maWxlc19wcm9kdWN0Ci0jIHRvIFBST0RVQ1RfUEFDS0FHRVMgaW4gdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlLgotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBmc19jb25maWdfZmlsZXNfcHJvZHVjdAotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9ICQoaWYgJChCT0FSRF9VU0VTX1BST0RVQ1RJTUFHRSkkKEJPQVJEX1BST0RVQ1RJTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSxfZnNfY29uZmlnX2ZpbGVzX3Byb2R1Y3QpCi1pbmNsdWRlICQoQlVJTERfUEhPTllfUEFDS0FHRSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBHZW5lcmF0ZSB0aGUgPHA+L2V0Yy9mc19jb25maWdfZGlycyBiaW5hcnkgZmlsZXMgZm9yIGFsbCBlbmFibGVkIHBhcnRpdGlvbnMKLSMgZXhjbHVkaW5nIC9zeXN0ZW0sIC9zeXN0ZW1fZXh0IGFuZCAvcHJvZHVjdC4gQWRkIGZzX2NvbmZpZ19kaXJzX25vbnN5c3RlbSB0bwotIyBQUk9EVUNUX1BBQ0tBR0VTIGluIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZS4KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gZnNfY29uZmlnX2RpcnNfbm9uc3lzdGVtCi1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gJChmb3JlYWNoIHQsJChmc19jb25maWdfZ2VuZXJhdGVfZXh0cmFfcGFydGl0aW9uX2xpc3QpLF9mc19jb25maWdfZGlyc18kKHQpKQotaW5jbHVkZSAkKEJVSUxEX1BIT05ZX1BBQ0tBR0UpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2VuZXJhdGUgdGhlIDxwPi9ldGMvZnNfY29uZmlnX2ZpbGVzIGJpbmFyeSBmaWxlcyBmb3IgYWxsIGVuYWJsZWQgcGFydGl0aW9ucwotIyBleGNsdWRpbmcgL3N5c3RlbSwgL3N5c3RlbV9leHQgYW5kIC9wcm9kdWN0LiBBZGQgZnNfY29uZmlnX2ZpbGVzX25vbnN5c3RlbSB0bwotIyBQUk9EVUNUX1BBQ0tBR0VTIGluIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZS4KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gZnNfY29uZmlnX2ZpbGVzX25vbnN5c3RlbQotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9ICQoZm9yZWFjaCB0LCQoZnNfY29uZmlnX2dlbmVyYXRlX2V4dHJhX3BhcnRpdGlvbl9saXN0KSxfZnNfY29uZmlnX2ZpbGVzXyQodCkpCi1pbmNsdWRlICQoQlVJTERfUEhPTllfUEFDS0FHRSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBHZW5lcmF0ZSB0aGUgc3lzdGVtL2V0Yy9mc19jb25maWdfZGlycyBiaW5hcnkgZmlsZSBmb3IgdGhlIHRhcmdldAotIyBBZGQgZnNfY29uZmlnX2RpcnMgb3IgZnNfY29uZmlnX2RpcnNfc3lzdGVtIHRvIFBST0RVQ1RfUEFDS0FHRVMgaW4KLSMgdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IGZzX2NvbmZpZ19kaXJzX3N5c3RlbQotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9JTlNUQUxMRURfTU9EVUxFX1NURU0gOj0gZnNfY29uZmlnX2RpcnMKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0ZTX0hEUiA6PSAkKHN5c3RlbV9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfQ0FQX0hEUiA6PSAkKHN5c3RlbV9jYXBhYmlsaXR5X2hlYWRlcikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9QQVJUSVRJT05fTElTVCA6PSAkKGZzX2NvbmZpZ19nZW5lcmF0ZV9leHRyYV9wYXJ0aXRpb25fbGlzdCkKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiA6PSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX1BBVEgpL2ZzX2NvbmZpZ19nZW5lcmF0b3IucHkgJChUQVJHRVRfRlNfQ09ORklHX0dFTikgJChzeXN0ZW1fYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykgJChzeXN0ZW1fY2FwYWJpbGl0eV9oZWFkZXIpCi0JQG1rZGlyIC1wICQoZGlyICRAKQotCSQ8IGZzY29uZmlnIFwKLQkgICAtLWFpZC1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfRlNfSERSKSBcCi0JICAgLS1jYXBhYmlsaXR5LWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSKSBcCi0JICAgLS1wYXJ0aXRpb24gc3lzdGVtIFwKLQkgICAtLWFsbC1wYXJ0aXRpb25zICIkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQoUFJJVkFURV9QQVJUSVRJT05fTElTVCkpIiBcCi0JICAgLS1kaXJzIFwKLQkgICAtLW91dF9maWxlICRAIFwKLQkgICAkKG9yICQoUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiksL2Rldi9udWxsKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEdlbmVyYXRlIHRoZSBzeXN0ZW0vZXRjL2ZzX2NvbmZpZ19maWxlcyBiaW5hcnkgZmlsZSBmb3IgdGhlIHRhcmdldAotIyBBZGQgZnNfY29uZmlnX2ZpbGVzIG9yIGZzX2NvbmZpZ19maWxlc19zeXN0ZW0gdG8gUFJPRFVDVF9QQUNLQUdFUyBpbgotIyB0aGUgZGV2aWNlIG1ha2UgZmlsZSB0byBlbmFibGUKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gZnNfY29uZmlnX2ZpbGVzX3N5c3RlbQotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9JTlNUQUxMRURfTU9EVUxFX1NURU0gOj0gZnNfY29uZmlnX2ZpbGVzCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9GU19IRFIgOj0gJChzeXN0ZW1fYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0NBUF9IRFIgOj0gJChzeXN0ZW1fY2FwYWJpbGl0eV9oZWFkZXIpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfUEFSVElUSU9OX0xJU1QgOj0gJChmc19jb25maWdfZ2VuZXJhdGVfZXh0cmFfcGFydGl0aW9uX2xpc3QpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4gOj0gJChUQVJHRVRfRlNfQ09ORklHX0dFTikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChMT0NBTF9QQVRIKS9mc19jb25maWdfZ2VuZXJhdG9yLnB5ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pICQoc3lzdGVtX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpICQoc3lzdGVtX2NhcGFiaWxpdHlfaGVhZGVyKQotCUBta2RpciAtcCAkKGRpciAkQCkKLQkkPCBmc2NvbmZpZyBcCi0JICAgLS1haWQtaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0ZTX0hEUikgXAotCSAgIC0tY2FwYWJpbGl0eS1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfQ0FQX0hEUikgXAotCSAgIC0tcGFydGl0aW9uIHN5c3RlbSBcCi0JICAgLS1hbGwtcGFydGl0aW9ucyAiJChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKFBSSVZBVEVfUEFSVElUSU9OX0xJU1QpKSIgXAotCSAgIC0tZmlsZXMgXAotCSAgIC0tb3V0X2ZpbGUgJEAgXAotCSAgICQob3IgJChQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOKSwvZGV2L251bGwpCi0KLWlmbmVxICgkKGZpbHRlciB2ZW5kb3IsJChmc19jb25maWdfZ2VuZXJhdGVfZXh0cmFfcGFydGl0aW9uX2xpc3QpKSwpCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEdlbmVyYXRlIHRoZSB2ZW5kb3IvZXRjL2ZzX2NvbmZpZ19kaXJzIGJpbmFyeSBmaWxlIGZvciB0aGUgdGFyZ2V0Ci0jIEFkZCBmc19jb25maWdfZGlycyBvciBmc19jb25maWdfZGlyc19ub25zeXN0ZW0gdG8gUFJPRFVDVF9QQUNLQUdFUwotIyBpbiB0aGUgZGV2aWNlIG1ha2UgZmlsZSB0byBlbmFibGUKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gX2ZzX2NvbmZpZ19kaXJzX3ZlbmRvcgotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9JTlNUQUxMRURfTU9EVUxFX1NURU0gOj0gZnNfY29uZmlnX2RpcnMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9WRU5ET1IpL2V0YwotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfRlNfSERSIDo9ICQodmVuZG9yX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSIDo9ICQodmVuZG9yX2NhcGFiaWxpdHlfaGVhZGVyKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOIDo9ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfUEFUSCkvZnNfY29uZmlnX2dlbmVyYXRvci5weSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKSAkKHZlbmRvcl9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKSAkKHZlbmRvcl9jYXBhYmlsaXR5X2hlYWRlcikKLQlAbWtkaXIgLXAgJChkaXIgJEApCi0JJDwgZnNjb25maWcgXAotCSAgIC0tYWlkLWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9GU19IRFIpIFwKLQkgICAtLWNhcGFiaWxpdHktaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0NBUF9IRFIpIFwKLQkgICAtLXBhcnRpdGlvbiB2ZW5kb3IgXAotCSAgIC0tZGlycyBcCi0JICAgLS1vdXRfZmlsZSAkQCBcCi0JICAgJChvciAkKFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4pLC9kZXYvbnVsbCkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBHZW5lcmF0ZSB0aGUgdmVuZG9yL2V0Yy9mc19jb25maWdfZmlsZXMgYmluYXJ5IGZpbGUgZm9yIHRoZSB0YXJnZXQKLSMgQWRkIGZzX2NvbmZpZ19maWxlcyBvciBmc19jb25maWdfZmlsZXNfbm9uc3lzdGVtIHRvIFBST0RVQ1RfUEFDS0FHRVMKLSMgaW4gdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IF9mc19jb25maWdfZmlsZXNfdmVuZG9yCi1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX0lOU1RBTExFRF9NT0RVTEVfU1RFTSA6PSBmc19jb25maWdfZmlsZXMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9WRU5ET1IpL2V0YwotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfRlNfSERSIDo9ICQodmVuZG9yX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSIDo9ICQodmVuZG9yX2NhcGFiaWxpdHlfaGVhZGVyKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOIDo9ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfUEFUSCkvZnNfY29uZmlnX2dlbmVyYXRvci5weSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKSAkKHZlbmRvcl9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKSAkKHZlbmRvcl9jYXBhYmlsaXR5X2hlYWRlcikKLQlAbWtkaXIgLXAgJChkaXIgJEApCi0JJDwgZnNjb25maWcgXAotCSAgIC0tYWlkLWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9GU19IRFIpIFwKLQkgICAtLWNhcGFiaWxpdHktaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0NBUF9IRFIpIFwKLQkgICAtLXBhcnRpdGlvbiB2ZW5kb3IgXAotCSAgIC0tZmlsZXMgXAotCSAgIC0tb3V0X2ZpbGUgJEAgXAotCSAgICQob3IgJChQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOKSwvZGV2L251bGwpCi0KLWVuZGlmCi0KLWlmbmVxICgkKGZpbHRlciBvZW0sJChmc19jb25maWdfZ2VuZXJhdGVfZXh0cmFfcGFydGl0aW9uX2xpc3QpKSwpCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEdlbmVyYXRlIHRoZSBvZW0vZXRjL2ZzX2NvbmZpZ19kaXJzIGJpbmFyeSBmaWxlIGZvciB0aGUgdGFyZ2V0Ci0jIEFkZCBmc19jb25maWdfZGlycyBvciBmc19jb25maWdfZGlyc19ub25zeXN0ZW0gdG8gUFJPRFVDVF9QQUNLQUdFUwotIyBpbiB0aGUgZGV2aWNlIG1ha2UgZmlsZSB0byBlbmFibGUKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gX2ZzX2NvbmZpZ19kaXJzX29lbQotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9JTlNUQUxMRURfTU9EVUxFX1NURU0gOj0gZnNfY29uZmlnX2RpcnMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9PRU0pL2V0YwotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfRlNfSERSIDo9ICQoc3lzdGVtX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSIDo9ICQoc3lzdGVtX2NhcGFiaWxpdHlfaGVhZGVyKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOIDo9ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfUEFUSCkvZnNfY29uZmlnX2dlbmVyYXRvci5weSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKSAkKHN5c3RlbV9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKSAkKHN5c3RlbV9jYXBhYmlsaXR5X2hlYWRlcikKLQlAbWtkaXIgLXAgJChkaXIgJEApCi0JJDwgZnNjb25maWcgXAotCSAgIC0tYWlkLWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9GU19IRFIpIFwKLQkgICAtLWNhcGFiaWxpdHktaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0NBUF9IRFIpIFwKLQkgICAtLXBhcnRpdGlvbiBvZW0gXAotCSAgIC0tZGlycyBcCi0JICAgLS1vdXRfZmlsZSAkQCBcCi0JICAgJChvciAkKFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4pLC9kZXYvbnVsbCkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBHZW5lcmF0ZSB0aGUgb2VtL2V0Yy9mc19jb25maWdfZmlsZXMgYmluYXJ5IGZpbGUgZm9yIHRoZSB0YXJnZXQKLSMgQWRkIGZzX2NvbmZpZ19maWxlcyBvciBmc19jb25maWdfZmlsZXNfbm9uc3lzdGVtIHRvIFBST0RVQ1RfUEFDS0FHRVMKLSMgaW4gdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IF9mc19jb25maWdfZmlsZXNfb2VtCi1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX0lOU1RBTExFRF9NT0RVTEVfU1RFTSA6PSBmc19jb25maWdfZmlsZXMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9PRU0pL2V0YwotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfRlNfSERSIDo9ICQoc3lzdGVtX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSIDo9ICQoc3lzdGVtX2NhcGFiaWxpdHlfaGVhZGVyKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOIDo9ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfUEFUSCkvZnNfY29uZmlnX2dlbmVyYXRvci5weSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKSAkKHN5c3RlbV9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKSAkKHN5c3RlbV9jYXBhYmlsaXR5X2hlYWRlcikKLQlAbWtkaXIgLXAgJChkaXIgJEApCi0JJDwgZnNjb25maWcgXAotCSAgIC0tYWlkLWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9GU19IRFIpIFwKLQkgICAtLWNhcGFiaWxpdHktaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0NBUF9IRFIpIFwKLQkgICAtLXBhcnRpdGlvbiBvZW0gXAotCSAgIC0tZmlsZXMgXAotCSAgIC0tb3V0X2ZpbGUgJEAgXAotCSAgICQob3IgJChQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOKSwvZGV2L251bGwpCi0KLWVuZGlmCi0KLWlmbmVxICgkKGZpbHRlciBvZG0sJChmc19jb25maWdfZ2VuZXJhdGVfZXh0cmFfcGFydGl0aW9uX2xpc3QpKSwpCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEdlbmVyYXRlIHRoZSBvZG0vZXRjL2ZzX2NvbmZpZ19kaXJzIGJpbmFyeSBmaWxlIGZvciB0aGUgdGFyZ2V0Ci0jIEFkZCBmc19jb25maWdfZGlycyBvciBmc19jb25maWdfZGlyc19ub25zeXN0ZW0gdG8gUFJPRFVDVF9QQUNLQUdFUwotIyBpbiB0aGUgZGV2aWNlIG1ha2UgZmlsZSB0byBlbmFibGUKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gX2ZzX2NvbmZpZ19kaXJzX29kbQotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9JTlNUQUxMRURfTU9EVUxFX1NURU0gOj0gZnNfY29uZmlnX2RpcnMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9PRE0pL2V0YwotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfRlNfSERSIDo9ICQodmVuZG9yX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSIDo9ICQodmVuZG9yX2NhcGFiaWxpdHlfaGVhZGVyKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOIDo9ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfUEFUSCkvZnNfY29uZmlnX2dlbmVyYXRvci5weSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKSAkKHZlbmRvcl9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKSAkKHZlbmRvcl9jYXBhYmlsaXR5X2hlYWRlcikKLQlAbWtkaXIgLXAgJChkaXIgJEApCi0JJDwgZnNjb25maWcgXAotCSAgIC0tYWlkLWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9GU19IRFIpIFwKLQkgICAtLWNhcGFiaWxpdHktaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0NBUF9IRFIpIFwKLQkgICAtLXBhcnRpdGlvbiBvZG0gXAotCSAgIC0tZGlycyBcCi0JICAgLS1vdXRfZmlsZSAkQCBcCi0JICAgJChvciAkKFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4pLC9kZXYvbnVsbCkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBHZW5lcmF0ZSB0aGUgb2RtL2V0Yy9mc19jb25maWdfZmlsZXMgYmluYXJ5IGZpbGUgZm9yIHRoZSB0YXJnZXQKLSMgQWRkIGZzX2NvbmZpZ19maWxlcyBvciBmc19jb25maWdfZmlsZXNfbm9uc3lzdGVtIHRvIFBST0RVQ1RfUEFDS0FHRVMKLSMgaW4gdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IF9mc19jb25maWdfZmlsZXNfb2RtCi1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX0lOU1RBTExFRF9NT0RVTEVfU1RFTSA6PSBmc19jb25maWdfZmlsZXMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9PRE0pL2V0YwotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfRlNfSERSIDo9ICQodmVuZG9yX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSIDo9ICQodmVuZG9yX2NhcGFiaWxpdHlfaGVhZGVyKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOIDo9ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfUEFUSCkvZnNfY29uZmlnX2dlbmVyYXRvci5weSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKSAkKHZlbmRvcl9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKSAkKHZlbmRvcl9jYXBhYmlsaXR5X2hlYWRlcikKLQlAbWtkaXIgLXAgJChkaXIgJEApCi0JJDwgZnNjb25maWcgXAotCSAgIC0tYWlkLWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9GU19IRFIpIFwKLQkgICAtLWNhcGFiaWxpdHktaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0NBUF9IRFIpIFwKLQkgICAtLXBhcnRpdGlvbiBvZG0gXAotCSAgIC0tZmlsZXMgXAotCSAgIC0tb3V0X2ZpbGUgJEAgXAotCSAgICQob3IgJChQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOKSwvZGV2L251bGwpCi0KLWVuZGlmCi0KLWlmbmVxICgkKGZpbHRlciB2ZW5kb3JfZGxrbSwkKGZzX2NvbmZpZ19nZW5lcmF0ZV9leHRyYV9wYXJ0aXRpb25fbGlzdCkpLCkKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2VuZXJhdGUgdGhlIHZlbmRvcl9kbGttL2V0Yy9mc19jb25maWdfZGlycyBiaW5hcnkgZmlsZSBmb3IgdGhlIHRhcmdldAotIyBBZGQgZnNfY29uZmlnX2RpcnMgb3IgZnNfY29uZmlnX2RpcnNfbm9uc3lzdGVtIHRvIFBST0RVQ1RfUEFDS0FHRVMgaW4KLSMgdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IF9mc19jb25maWdfZGlyc192ZW5kb3JfZGxrbQotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9JTlNUQUxMRURfTU9EVUxFX1NURU0gOj0gZnNfY29uZmlnX2RpcnMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRExLTSkvZXRjCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9GU19IRFIgOj0gJCh2ZW5kb3JfYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0NBUF9IRFIgOj0gJCh2ZW5kb3JfY2FwYWJpbGl0eV9oZWFkZXIpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4gOj0gJChUQVJHRVRfRlNfQ09ORklHX0dFTikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChMT0NBTF9QQVRIKS9mc19jb25maWdfZ2VuZXJhdG9yLnB5ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pICQodmVuZG9yX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpICQodmVuZG9yX2NhcGFiaWxpdHlfaGVhZGVyKQotCUBta2RpciAtcCAkKGRpciAkQCkKLQkkPCBmc2NvbmZpZyBcCi0JICAgLS1haWQtaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0ZTX0hEUikgXAotCSAgIC0tY2FwYWJpbGl0eS1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfQ0FQX0hEUikgXAotCSAgIC0tcGFydGl0aW9uIHZlbmRvcl9kbGttIFwKLQkgICAtLWRpcnMgXAotCSAgIC0tb3V0X2ZpbGUgJEAgXAotCSAgICQob3IgJChQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOKSwvZGV2L251bGwpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2VuZXJhdGUgdGhlIHZlbmRvcl9kbGttL2V0Yy9mc19jb25maWdfZmlsZXMgYmluYXJ5IGZpbGUgZm9yIHRoZSB0YXJnZXQKLSMgQWRkIGZzX2NvbmZpZ19maWxlcyBvciBmc19jb25maWdfZmlsZXNfbm9uc3lzdGVtIHRvIFBST0RVQ1RfUEFDS0FHRVMgaW4KLSMgdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IF9mc19jb25maWdfZmlsZXNfdmVuZG9yX2Rsa20KLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfSU5TVEFMTEVEX01PRFVMRV9TVEVNIDo9IGZzX2NvbmZpZ19maWxlcwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9ETEtNKS9ldGMKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0ZTX0hEUiA6PSAkKHZlbmRvcl9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfQ0FQX0hEUiA6PSAkKHZlbmRvcl9jYXBhYmlsaXR5X2hlYWRlcikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiA6PSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX1BBVEgpL2ZzX2NvbmZpZ19nZW5lcmF0b3IucHkgJChUQVJHRVRfRlNfQ09ORklHX0dFTikgJCh2ZW5kb3JfYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykgJCh2ZW5kb3JfY2FwYWJpbGl0eV9oZWFkZXIpCi0JQG1rZGlyIC1wICQoZGlyICRAKQotCSQ8IGZzY29uZmlnIFwKLQkgICAtLWFpZC1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfRlNfSERSKSBcCi0JICAgLS1jYXBhYmlsaXR5LWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSKSBcCi0JICAgLS1wYXJ0aXRpb24gdmVuZG9yX2Rsa20gXAotCSAgIC0tZmlsZXMgXAotCSAgIC0tb3V0X2ZpbGUgJEAgXAotCSAgICQob3IgJChQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOKSwvZGV2L251bGwpCi0KLWVuZGlmCi0KLWlmbmVxICgkKGZpbHRlciBvZG1fZGxrbSwkKGZzX2NvbmZpZ19nZW5lcmF0ZV9leHRyYV9wYXJ0aXRpb25fbGlzdCkpLCkKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2VuZXJhdGUgdGhlIG9kbV9kbGttL2V0Yy9mc19jb25maWdfZGlycyBiaW5hcnkgZmlsZSBmb3IgdGhlIHRhcmdldAotIyBBZGQgZnNfY29uZmlnX2RpcnMgb3IgZnNfY29uZmlnX2RpcnNfbm9uc3lzdGVtIHRvIFBST0RVQ1RfUEFDS0FHRVMKLSMgaW4gdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IF9mc19jb25maWdfZGlyc19vZG1fZGxrbQotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9JTlNUQUxMRURfTU9EVUxFX1NURU0gOj0gZnNfY29uZmlnX2RpcnMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9PRE1fRExLTSkvZXRjCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9GU19IRFIgOj0gJCh2ZW5kb3JfYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0NBUF9IRFIgOj0gJCh2ZW5kb3JfY2FwYWJpbGl0eV9oZWFkZXIpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4gOj0gJChUQVJHRVRfRlNfQ09ORklHX0dFTikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChMT0NBTF9QQVRIKS9mc19jb25maWdfZ2VuZXJhdG9yLnB5ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pICQodmVuZG9yX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpICQodmVuZG9yX2NhcGFiaWxpdHlfaGVhZGVyKQotCUBta2RpciAtcCAkKGRpciAkQCkKLQkkPCBmc2NvbmZpZyBcCi0JICAgLS1haWQtaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0ZTX0hEUikgXAotCSAgIC0tY2FwYWJpbGl0eS1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfQ0FQX0hEUikgXAotCSAgIC0tcGFydGl0aW9uIG9kbV9kbGttIFwKLQkgICAtLWRpcnMgXAotCSAgIC0tb3V0X2ZpbGUgJEAgXAotCSAgICQob3IgJChQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOKSwvZGV2L251bGwpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2VuZXJhdGUgdGhlIG9kbV9kbGttL2V0Yy9mc19jb25maWdfZmlsZXMgYmluYXJ5IGZpbGUgZm9yIHRoZSB0YXJnZXQKLSMgQWRkIGZzX2NvbmZpZ19maWxlcyBvciBmc19jb25maWdfZmlsZXNfbm9uc3lzdGVtIHRvIFBST0RVQ1RfUEFDS0FHRVMKLSMgaW4gdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IF9mc19jb25maWdfZmlsZXNfb2RtX2Rsa20KLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfSU5TVEFMTEVEX01PRFVMRV9TVEVNIDo9IGZzX2NvbmZpZ19maWxlcwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX09ETV9ETEtNKS9ldGMKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0ZTX0hEUiA6PSAkKHZlbmRvcl9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfQ0FQX0hEUiA6PSAkKHZlbmRvcl9jYXBhYmlsaXR5X2hlYWRlcikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiA6PSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX1BBVEgpL2ZzX2NvbmZpZ19nZW5lcmF0b3IucHkgJChUQVJHRVRfRlNfQ09ORklHX0dFTikgJCh2ZW5kb3JfYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykgJCh2ZW5kb3JfY2FwYWJpbGl0eV9oZWFkZXIpCi0JQG1rZGlyIC1wICQoZGlyICRAKQotCSQ8IGZzY29uZmlnIFwKLQkgICAtLWFpZC1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfRlNfSERSKSBcCi0JICAgLS1jYXBhYmlsaXR5LWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSKSBcCi0JICAgLS1wYXJ0aXRpb24gb2RtX2Rsa20gXAotCSAgIC0tZmlsZXMgXAotCSAgIC0tb3V0X2ZpbGUgJEAgXAotCSAgICQob3IgJChQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOKSwvZGV2L251bGwpCi0KLWVuZGlmCi0KLWlmbmVxICgkKGZpbHRlciBzeXN0ZW1fZGxrbSwkKGZzX2NvbmZpZ19nZW5lcmF0ZV9leHRyYV9wYXJ0aXRpb25fbGlzdCkpLCkKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2VuZXJhdGUgdGhlIHN5c3RlbV9kbGttL2V0Yy9mc19jb25maWdfZGlycyBiaW5hcnkgZmlsZSBmb3IgdGhlIHRhcmdldAotIyBBZGQgZnNfY29uZmlnX2RpcnMgb3IgZnNfY29uZmlnX2RpcnNfbm9uc3lzdGVtIHRvIFBST0RVQ1RfUEFDS0FHRVMKLSMgaW4gdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IF9mc19jb25maWdfZGlyc19zeXN0ZW1fZGxrbQotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9JTlNUQUxMRURfTU9EVUxFX1NURU0gOj0gZnNfY29uZmlnX2RpcnMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9TWVNURU1fRExLTSkvZXRjCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9GU19IRFIgOj0gJCh2ZW5kb3JfYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0NBUF9IRFIgOj0gJCh2ZW5kb3JfY2FwYWJpbGl0eV9oZWFkZXIpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4gOj0gJChUQVJHRVRfRlNfQ09ORklHX0dFTikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChMT0NBTF9QQVRIKS9mc19jb25maWdfZ2VuZXJhdG9yLnB5ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pICQodmVuZG9yX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpICQodmVuZG9yX2NhcGFiaWxpdHlfaGVhZGVyKQotCUBta2RpciAtcCAkKGRpciAkQCkKLQkkPCBmc2NvbmZpZyBcCi0JICAgLS1haWQtaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0ZTX0hEUikgXAotCSAgIC0tY2FwYWJpbGl0eS1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfQ0FQX0hEUikgXAotCSAgIC0tcGFydGl0aW9uIHN5c3RlbV9kbGttIFwKLQkgICAtLWRpcnMgXAotCSAgIC0tb3V0X2ZpbGUgJEAgXAotCSAgICQob3IgJChQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOKSwvZGV2L251bGwpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2VuZXJhdGUgdGhlIHN5c3RlbV9kbGttL2V0Yy9mc19jb25maWdfZmlsZXMgYmluYXJ5IGZpbGUgZm9yIHRoZSB0YXJnZXQKLSMgQWRkIGZzX2NvbmZpZ19maWxlcyBvciBmc19jb25maWdfZmlsZXNfbm9uc3lzdGVtIHRvIFBST0RVQ1RfUEFDS0FHRVMKLSMgaW4gdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IF9mc19jb25maWdfZmlsZXNfc3lzdGVtX2Rsa20KLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfSU5TVEFMTEVEX01PRFVMRV9TVEVNIDo9IGZzX2NvbmZpZ19maWxlcwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1NZU1RFTV9ETEtNKS9ldGMKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0ZTX0hEUiA6PSAkKHZlbmRvcl9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfQ0FQX0hEUiA6PSAkKHZlbmRvcl9jYXBhYmlsaXR5X2hlYWRlcikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiA6PSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX1BBVEgpL2ZzX2NvbmZpZ19nZW5lcmF0b3IucHkgJChUQVJHRVRfRlNfQ09ORklHX0dFTikgJCh2ZW5kb3JfYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykgJCh2ZW5kb3JfY2FwYWJpbGl0eV9oZWFkZXIpCi0JQG1rZGlyIC1wICQoZGlyICRAKQotCSQ8IGZzY29uZmlnIFwKLQkgICAtLWFpZC1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfRlNfSERSKSBcCi0JICAgLS1jYXBhYmlsaXR5LWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSKSBcCi0JICAgLS1wYXJ0aXRpb24gc3lzdGVtX2Rsa20gXAotCSAgIC0tZmlsZXMgXAotCSAgIC0tb3V0X2ZpbGUgJEAgXAotCSAgICQob3IgJChQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOKSwvZGV2L251bGwpCi0KLWVuZGlmCi0KLWlmbmVxICgkKEJPQVJEX1VTRVNfUFJPRFVDVElNQUdFKSQoQk9BUkRfUFJPRFVDVElNQUdFX0ZJTEVfU1lTVEVNX1RZUEUpLCkKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2VuZXJhdGUgdGhlIHByb2R1Y3QvZXRjL2ZzX2NvbmZpZ19kaXJzIGJpbmFyeSBmaWxlIGZvciB0aGUgdGFyZ2V0Ci0jIEFkZCBmc19jb25maWdfZGlycyBvciBmc19jb25maWdfZGlyc19wcm9kdWN0IHRvIFBST0RVQ1RfUEFDS0FHRVMgaW4KLSMgdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IF9mc19jb25maWdfZGlyc19wcm9kdWN0Ci1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX0lOU1RBTExFRF9NT0RVTEVfU1RFTSA6PSBmc19jb25maWdfZGlycwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1BST0RVQ1QpL2V0YwotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfRlNfSERSIDo9ICQoc3lzdGVtX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSIDo9ICQoc3lzdGVtX2NhcGFiaWxpdHlfaGVhZGVyKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOIDo9ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfUEFUSCkvZnNfY29uZmlnX2dlbmVyYXRvci5weSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKSAkKHN5c3RlbV9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKSAkKHN5c3RlbV9jYXBhYmlsaXR5X2hlYWRlcikKLQlAbWtkaXIgLXAgJChkaXIgJEApCi0JJDwgZnNjb25maWcgXAotCSAgIC0tYWlkLWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9GU19IRFIpIFwKLQkgICAtLWNhcGFiaWxpdHktaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0NBUF9IRFIpIFwKLQkgICAtLXBhcnRpdGlvbiBwcm9kdWN0IFwKLQkgICAtLWRpcnMgXAotCSAgIC0tb3V0X2ZpbGUgJEAgXAotCSAgICQob3IgJChQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOKSwvZGV2L251bGwpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2VuZXJhdGUgdGhlIHByb2R1Y3QvZXRjL2ZzX2NvbmZpZ19maWxlcyBiaW5hcnkgZmlsZSBmb3IgdGhlIHRhcmdldAotIyBBZGQgZnNfY29uZmlnX2ZpbGVzIG9yIGZzX2NvbmZpZ19maWxlc19wcm9kdWN0IHRvIFBST0RVQ1RfUEFDS0FHRVMgaW4KLSMgdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IF9mc19jb25maWdfZmlsZXNfcHJvZHVjdAotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9JTlNUQUxMRURfTU9EVUxFX1NURU0gOj0gZnNfY29uZmlnX2ZpbGVzCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfUFJPRFVDVCkvZXRjCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9GU19IRFIgOj0gJChzeXN0ZW1fYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0NBUF9IRFIgOj0gJChzeXN0ZW1fY2FwYWJpbGl0eV9oZWFkZXIpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4gOj0gJChUQVJHRVRfRlNfQ09ORklHX0dFTikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChMT0NBTF9QQVRIKS9mc19jb25maWdfZ2VuZXJhdG9yLnB5ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pICQoc3lzdGVtX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpICQoc3lzdGVtX2NhcGFiaWxpdHlfaGVhZGVyKQotCUBta2RpciAtcCAkKGRpciAkQCkKLQkkPCBmc2NvbmZpZyBcCi0JICAgLS1haWQtaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0ZTX0hEUikgXAotCSAgIC0tY2FwYWJpbGl0eS1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfQ0FQX0hEUikgXAotCSAgIC0tcGFydGl0aW9uIHByb2R1Y3QgXAotCSAgIC0tZmlsZXMgXAotCSAgIC0tb3V0X2ZpbGUgJEAgXAotCSAgICQob3IgJChQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOKSwvZGV2L251bGwpCi1lbmRpZgotCi1pZm5lcSAoJChCT0FSRF9VU0VTX1NZU1RFTV9FWFRJTUFHRSkkKEJPQVJEX1NZU1RFTV9FWFRJTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSwpCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEdlbmVyYXRlIHRoZSBzeXN0ZW1fZXh0L2V0Yy9mc19jb25maWdfZGlycyBiaW5hcnkgZmlsZSBmb3IgdGhlIHRhcmdldAotIyBBZGQgZnNfY29uZmlnX2RpcnMgb3IgZnNfY29uZmlnX2RpcnNfc3lzdGVtX2V4dCB0byBQUk9EVUNUX1BBQ0tBR0VTIGluCi0jIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBfZnNfY29uZmlnX2RpcnNfc3lzdGVtX2V4dAotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9JTlNUQUxMRURfTU9EVUxFX1NURU0gOj0gZnNfY29uZmlnX2RpcnMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9TWVNURU1fRVhUKS9ldGMKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0ZTX0hEUiA6PSAkKHN5c3RlbV9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfQ0FQX0hEUiA6PSAkKHN5c3RlbV9jYXBhYmlsaXR5X2hlYWRlcikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiA6PSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX1BBVEgpL2ZzX2NvbmZpZ19nZW5lcmF0b3IucHkgJChUQVJHRVRfRlNfQ09ORklHX0dFTikgJChzeXN0ZW1fYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykgJChzeXN0ZW1fY2FwYWJpbGl0eV9oZWFkZXIpCi0JQG1rZGlyIC1wICQoZGlyICRAKQotCSQ8IGZzY29uZmlnIFwKLQkgICAtLWFpZC1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfRlNfSERSKSBcCi0JICAgLS1jYXBhYmlsaXR5LWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSKSBcCi0JICAgLS1wYXJ0aXRpb24gc3lzdGVtX2V4dCBcCi0JICAgLS1kaXJzIFwKLQkgICAtLW91dF9maWxlICRAIFwKLQkgICAkKG9yICQoUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiksL2Rldi9udWxsKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEdlbmVyYXRlIHRoZSBzeXN0ZW1fZXh0L2V0Yy9mc19jb25maWdfZmlsZXMgYmluYXJ5IGZpbGUgZm9yIHRoZSB0YXJnZXQKLSMgQWRkIGZzX2NvbmZpZ19maWxlcyBvciBmc19jb25maWdfZmlsZXNfc3lzdGVtX2V4dCB0byBQUk9EVUNUX1BBQ0tBR0VTIGluCi0jIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBfZnNfY29uZmlnX2ZpbGVzX3N5c3RlbV9leHQKLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfSU5TVEFMTEVEX01PRFVMRV9TVEVNIDo9IGZzX2NvbmZpZ19maWxlcwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1NZU1RFTV9FWFQpL2V0YwotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfRlNfSERSIDo9ICQoc3lzdGVtX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSIDo9ICQoc3lzdGVtX2NhcGFiaWxpdHlfaGVhZGVyKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOIDo9ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfUEFUSCkvZnNfY29uZmlnX2dlbmVyYXRvci5weSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKSAkKHN5c3RlbV9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKSAkKHN5c3RlbV9jYXBhYmlsaXR5X2hlYWRlcikKLQlAbWtkaXIgLXAgJChkaXIgJEApCi0JJDwgZnNjb25maWcgXAotCSAgIC0tYWlkLWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9GU19IRFIpIFwKLQkgICAtLWNhcGFiaWxpdHktaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0NBUF9IRFIpIFwKLQkgICAtLXBhcnRpdGlvbiBzeXN0ZW1fZXh0IFwKLQkgICAtLWZpbGVzIFwKLQkgICAtLW91dF9maWxlICRAIFwKLQkgICAkKG9yICQoUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiksL2Rldi9udWxsKQotZW5kaWYKLQotc3lzdGVtX2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcgOj0KLXN5c3RlbV9jYXBhYmlsaXR5X2hlYWRlciA6PQotZnNfY29uZmlnX2dlbmVyYXRlX2V4dHJhX3BhcnRpdGlvbl9saXN0IDo9CmRpZmYgLS1naXQgYS90b29scy9mc19jb25maWcvZnNfY29uZmlnLmMgYi90b29scy9mc19jb25maWcvZnNfY29uZmlnLmMKaW5kZXggMmE3NWFkZC4uODBiZDNjMSAxMDA2NDQKLS0tIGEvdG9vbHMvZnNfY29uZmlnL2ZzX2NvbmZpZy5jCisrKyBiL3Rvb2xzL2ZzX2NvbmZpZy9mc19jb25maWcuYwpAQCAtMjIsOSArMjIsNiBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKLSNpbmNsdWRlIDxzZWxpbnV4L3NlbGludXguaD4KLSNpbmNsdWRlIDxzZWxpbnV4L2xhYmVsLmg+Ci0KICNpbmNsdWRlICJwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaCIKICNpbmNsdWRlICJwcml2YXRlL2ZzX2NvbmZpZy5oIgogCkBAIC0zNSw4ICszMiw4IEBACiAvLwogLy8gQWZ0ZXIgdGhlIGZpcnN0IDQgY29sdW1ucywgb3B0aW9uYWwga2V5PXZhbHVlIHBhaXJzIGFyZSBlbWl0dGVkCiAvLyBmb3IgZWFjaCBmaWxlLiAgQ3VycmVudGx5LCB0aGUgZm9sbG93aW5nIGtleXMgYXJlIHN1cHBvcnRlZDoKLS8vICogLVM6IHNlbGFiZWw9W3NlbGludXhfbGFiZWxdCi0vLyAqIC1DOiBjYXBhYmlsaXRpZXM9W2hleCBjYXBhYmlsaXRpZXMgdmFsdWVdCisvLworLy8gICAtQzogY2FwYWJpbGl0aWVzPVtoZXggY2FwYWJpbGl0aWVzIHZhbHVlXQogLy8KIC8vIEV4YW1wbGUgaW5wdXQ6CiAvLwpAQCAtNDgsNDUgKzQ1LDI0IEBACiAvLyAgICAgIHN5c3RlbS9ldGMvZGJ1cy5jb25mIDEwMDIgMTAwMiA0NDAKIC8vICAgICAgZGF0YS9hcHAgMTAwMCAxMDAwIDc3MQogLy8KLS8vICAgb3IgaWYsIGZvciBleGFtcGxlLCAtUyBpcyB1c2VkOgotLy8KLS8vICAgICAgc3lzdGVtL2V0Yy9kYnVzLmNvbmYgMTAwMiAxMDAyIDQ0MCBzZWxhYmVsPXU6b2JqZWN0X3I6c3lzdGVtX2ZpbGU6czAKLS8vICAgICAgZGF0YS9hcHAgMTAwMCAxMDAwIDc3MSBzZWxhYmVsPXU6b2JqZWN0X3I6YXBrX2RhdGFfZmlsZTpzMAotLy8KIC8vIE5vdGUgdGhhdCB0aGUgb3V0cHV0IHdpbGwgb21pdCB0aGUgdHJhaWxpbmcgc2xhc2ggZnJvbQogLy8gZGlyZWN0b3JpZXMuCiAKLXN0YXRpYyBzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUqIGdldF9zZWhuZChjb25zdCBjaGFyKiBjb250ZXh0X2ZpbGUpIHsKLSAgc3RydWN0IHNlbGludXhfb3B0IHNlb3B0c1tdID0geyB7IFNFTEFCRUxfT1BUX1BBVEgsIGNvbnRleHRfZmlsZSB9IH07Ci0gIHN0cnVjdCBzZWxhYmVsX2hhbmRsZSogc2VobmQgPSBzZWxhYmVsX29wZW4oU0VMQUJFTF9DVFhfRklMRSwgc2VvcHRzLCAxKTsKLQotICBpZiAoIXNlaG5kKSB7Ci0gICAgcGVycm9yKCJlcnJvciBydW5uaW5nIHNlbGFiZWxfb3BlbiIpOwotICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgfQotICByZXR1cm4gc2VobmQ7Ci19Ci0KIHN0YXRpYyB2b2lkIHVzYWdlKCkgewotICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBmc19jb25maWcgWy1EIHByb2R1Y3Rfb3V0X3BhdGhdIFstUyBjb250ZXh0X2ZpbGVdIFstUiByb290XSBbLUNdXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogZnNfY29uZmlnIFstRCBwcm9kdWN0X291dF9wYXRoXSBbLVIgcm9vdF0gWy1DXVxuIik7CiB9CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewogICBjaGFyIGJ1ZmZlclsxMDI0XTsKLSAgY29uc3QgY2hhciogY29udGV4dF9maWxlID0gTlVMTDsKICAgY29uc3QgY2hhciogcHJvZHVjdF9vdXRfcGF0aCA9IE5VTEw7CiAgIGNoYXIqIHJvb3RfcGF0aCA9IE5VTEw7Ci0gIHN0cnVjdCBzZWxhYmVsX2hhbmRsZSogc2VobmQgPSBOVUxMOwogICBpbnQgcHJpbnRfY2FwYWJpbGl0aWVzID0gMDsKICAgaW50IG9wdDsKLSAgd2hpbGUoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiQ1M6UjpEOiIpKSAhPSAtMSkgeworICB3aGlsZSgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJDUjpEOiIpKSAhPSAtMSkgewogICAgIHN3aXRjaChvcHQpIHsKICAgICBjYXNlICdDJzoKICAgICAgIHByaW50X2NhcGFiaWxpdGllcyA9IDE7CiAgICAgICBicmVhazsKLSAgICBjYXNlICdTJzoKLSAgICAgIGNvbnRleHRfZmlsZSA9IG9wdGFyZzsKLSAgICAgIGJyZWFrOwogICAgIGNhc2UgJ1InOgogICAgICAgcm9vdF9wYXRoID0gb3B0YXJnOwogICAgICAgYnJlYWs7CkBAIC05OSwxMCArNzUsNiBAQAogICAgIH0KICAgfQogCi0gIGlmIChjb250ZXh0X2ZpbGUgIT0gTlVMTCkgewotICAgIHNlaG5kID0gZ2V0X3NlaG5kKGNvbnRleHRfZmlsZSk7Ci0gIH0KLQogICBpZiAocm9vdF9wYXRoICE9IE5VTEwpIHsKICAgICBzaXplX3Qgcm9vdF9sZW4gPSBzdHJsZW4ocm9vdF9wYXRoKTsKICAgICAvKiBUcmltIGFueSB0cmFpbGluZyBzbGFzaGVzIGZyb20gdGhlIHJvb3QgcGF0aC4gKi8KQEAgLTE0MSwzMyArMTEzLDYgQEAKICAgICB9CiAgICAgcHJpbnRmKCIlcyAlZCAlZCAlbyIsIGJ1ZmZlciwgdWlkLCBnaWQsIG1vZGUpOwogCi0gICAgaWYgKHNlaG5kICE9IE5VTEwpIHsKLSAgICAgIHNpemVfdCBidWZmZXJfc3RybGVuID0gc3RybmxlbihidWZmZXIsIHNpemVvZihidWZmZXIpKTsKLSAgICAgIGlmIChidWZmZXJfc3RybGVuID49IHNpemVvZihidWZmZXIpKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAibm9uIG51bGwgdGVybWluYXRlZCBidWZmZXIsIGFib3J0aW5nXG4iKTsKLSAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICAgICAgfQotICAgICAgc2l6ZV90IGZ1bGxfbmFtZV9zaXplID0gYnVmZmVyX3N0cmxlbiArIDI7Ci0gICAgICBjaGFyKiBmdWxsX25hbWUgPSAoY2hhciopIG1hbGxvYyhmdWxsX25hbWVfc2l6ZSk7Ci0gICAgICBpZiAoZnVsbF9uYW1lID09IE5VTEwpIHsKLSAgICAgICAgcGVycm9yKCJtYWxsb2MiKTsKLSAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICAgICAgfQotCi0gICAgICBmdWxsX25hbWVbMF0gPSAnLyc7Ci0gICAgICBzdHJuY3B5KGZ1bGxfbmFtZSArIDEsIGJ1ZmZlciwgZnVsbF9uYW1lX3NpemUgLSAxKTsKLSAgICAgIGZ1bGxfbmFtZVtmdWxsX25hbWVfc2l6ZSAtIDFdID0gJ1wwJzsKLQotICAgICAgY2hhciogc2Vjb250ZXh0OwotICAgICAgaWYgKHNlbGFiZWxfbG9va3VwKHNlaG5kLCAmc2Vjb250ZXh0LCBmdWxsX25hbWUsICggbW9kZSB8IChpc19kaXIgPyBTX0lGRElSIDogU19JRlJFRykpKSkgewotICAgICAgICBzZWNvbnRleHQgPSBzdHJkdXAoInU6b2JqZWN0X3I6dW5sYWJlbGVkOnMwIik7Ci0gICAgICB9Ci0KLSAgICAgIHByaW50ZigiIHNlbGFiZWw9JXMiLCBzZWNvbnRleHQpOwotICAgICAgZnJlZShmdWxsX25hbWUpOwotICAgICAgZnJlZWNvbihzZWNvbnRleHQpOwotICAgIH0KLQogICAgIGlmIChwcmludF9jYXBhYmlsaXRpZXMpIHsKICAgICAgIHByaW50ZigiIGNhcGFiaWxpdGllcz0weCUiIFBSSXg2NCwgY2FwYWJpbGl0aWVzKTsKICAgICB9CmRpZmYgLS1naXQgYS90b29scy9mc19nZXRfc3RhdHMvQW5kcm9pZC5icCBiL3Rvb2xzL2ZzX2dldF9zdGF0cy9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjk3OTk5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2ZzX2dldF9zdGF0cy9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKLX0KLQotY2NfYmluYXJ5X2hvc3QgewotICAgIG5hbWU6ICJmc19nZXRfc3RhdHMiLAotICAgIHNyY3M6IFsiZnNfZ2V0X3N0YXRzLmMiXSwKLSAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZnNfZ2V0X3N0YXRzL2ZzX2dldF9zdGF0cy5jIGIvdG9vbHMvZnNfZ2V0X3N0YXRzL2ZzX2dldF9zdGF0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGVmMGUyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2ZzX2dldF9zdGF0cy9mc19nZXRfc3RhdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9mc19jb25maWcuaD4KLQotI2RlZmluZSBET19ERUJVRyAxCi0KLSNkZWZpbmUgRVJST1IoZm10LGFyZ3MuLi4pIFwKLQlkbyB7IFwKLQkJZnByaW50ZihzdGRlcnIsICIlczolZDogRVJST1I6ICIgZm10LCAgXAotCQkgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgIyNhcmdzKTsgICAgXAotCX0gd2hpbGUgKDApCi0KLSNpZiBET19ERUJVRwotI2RlZmluZSBERUJVRyhmbXQsYXJncy4uLikgXAotCWRvIHsgZnByaW50ZihzdGRlcnIsICJERUJVRzogIiBmbXQsICMjYXJncyk7IH0gd2hpbGUoMCkKLSNlbHNlCi0jZGVmaW5lIERFQlVHKHguLi4pICAgICAgICAgICAgICAgZG8ge30gd2hpbGUoMCkKLSNlbmRpZgotCi12b2lkCi1wcmludF9oZWxwKHZvaWQpCi17Ci0JZnByaW50ZihzdGRlcnIsICJmc19nZXRfc3RhdHM6IHJldHJpZXZlIHRoZSB0YXJnZXQgZmlsZSBzdGF0cyAiCi0JICAgICAgICAiZm9yIHRoZSBzcGVjaWZpZWQgZmlsZVxuIik7Ci0JZnByaW50ZihzdGRlcnIsICJ1c2FnZTogZnNfZ2V0X3N0YXRzIGN1cl9wZXJtcyBpc19kaXIgZmlsZW5hbWUgdGFyZ2V0b3V0XG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlx0Y3VyX3Blcm1zIC0gVGhlIGN1cnJlbnQgcGVybWlzc2lvbnMgb2YgIgotCSAgICAgICAgInRoZSBmaWxlXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlx0aXNfZGlyICAgIC0gSXMgZmlsZW5hbWUgaXMgYSBkaXIsIDEuIE90aGVyd2lzZSwgMC5cbiIpOwotCWZwcmludGYoc3RkZXJyLCAiXHRmaWxlbmFtZSAgLSBUaGUgZmlsZW5hbWUgdG8gbG9va3VwXG4iKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlx0dGFyZ2V0b3V0IC0gVGhlIHRhcmdldCBvdXQgcGF0aCB0byBxdWVyeSBkZXZpY2Ugc3BlY2lmaWMgRlMgY29uZmlnc1xuIik7Ci0JZnByaW50ZihzdGRlcnIsICJcbiIpOwotfQotCi1pbnQKLW1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkKLXsKLQljaGFyICplbmRwdHI7Ci0JY2hhciBpc19kaXIgPSAwOwotCXVuc2lnbmVkIHBlcm1zID0gMDsKLQl1bnNpZ25lZCB1aWQgPSAodW5zaWduZWQpLTE7Ci0JdW5zaWduZWQgZ2lkID0gKHVuc2lnbmVkKS0xOwotCi0JaWYgKGFyZ2MgPCA1KSB7Ci0JCUVSUk9SKCJJbnZhbGlkIGFyZ3VtZW50c1xuIik7Ci0JCXByaW50X2hlbHAoKTsKLQkJZXhpdCgtMSk7Ci0JfQotCi0JcGVybXMgPSAodW5zaWduZWQpc3RydG91bChhcmd2WzFdLCAmZW5kcHRyLCAwKTsKLQlpZiAoIWVuZHB0ciB8fCAoZW5kcHRyID09IGFyZ3ZbMV0pIHx8ICgqZW5kcHRyICE9ICdcMCcpKSB7Ci0JCUVSUk9SKCJjdXJyZW50IHBlcm1pc3Npb25zIG11c3QgYmUgYSBudW1iZXIuIEdvdCAnJXMnLlxuIiwgYXJndlsxXSk7Ci0JCWV4aXQoLTEpOwotCX0KLQotCWlmICghc3RyY21wKGFyZ3ZbMl0sICIxIikpCi0JCWlzX2RpciA9IDE7Ci0KLQl1aW50NjRfdCBjYXBhYmlsaXRpZXM7Ci0JZnNfY29uZmlnKGFyZ3ZbM10sIGlzX2RpciwgYXJndls0XSwgJnVpZCwgJmdpZCwgJnBlcm1zLCAmY2FwYWJpbGl0aWVzKTsKLQlmcHJpbnRmKHN0ZG91dCwgIiVkICVkIDAlb1xuIiwgdWlkLCBnaWQsIHBlcm1zKTsKLQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L09XTkVSUyBiL3Rvb2xzL2lkZV9xdWVyeS9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE0YTlhMgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9PV05FUlMKQEAgLTAsMCArMSw0IEBACitpYWxpeWV2QGdvb2dsZS5jb20KK2l2YW5raXJpY2hlbmtvQGdvb2dsZS5jb20KK2thZGlyY2V0QGdvb2dsZS5jb20KK21pY2hhZWxtZXJnQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9BbmRyb2lkLmJwIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg1ZDQ0NQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiaWRlX3F1ZXJ5X2NjX2FuYWx5emVyX2RlZmF1bHRzIiwKKyAgICBjb21waWxlX211bHRpbGliOiAiNjQiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsbHZtLWJ1aWxkLWhvc3QtdG9vbHMtZGVmYXVsdHMiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgIC8vIExMVk0gU291cmNlcyBkbyBoYXZlIHVudXNlZCBwYXJhbWV0ZXJzIDooCisgICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAorICAgIF0sCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGhvc3Q6IHsKKyAgICAgICAgICAgIGNwcGZsYWdzOiBbCisgICAgICAgICAgICAgICAgIi1mbm8tcnR0aSIsCisgICAgICAgICAgICBdLAorICAgICAgICB9LAorICAgIH0sCit9CisKK2NjX2xpYnJhcnlfaG9zdF9zdGF0aWMgeworICAgIG5hbWU6ICJidWlsdGluX2hlYWRlcnMiLAorICAgIHNyY3M6IFsiYnVpbHRpbl9oZWFkZXJzLmNjIl0sCisgICAgZ2VuZXJhdGVkX2hlYWRlcnM6IFsiY2xhbmdfYnVpbHRpbl9oZWFkZXJzX3Jlc291cmNlcyJdLAorICAgIGRlZmF1bHRzOiBbImlkZV9xdWVyeV9jY19hbmFseXplcl9kZWZhdWx0cyJdLAorfQorCitjY19saWJyYXJ5X2hvc3Rfc3RhdGljIHsKKyAgICBuYW1lOiAiaW5jbHVkZV9zY2FubmVyIiwKKyAgICBzcmNzOiBbImluY2x1ZGVfc2Nhbm5lci5jYyJdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmNsYW5nLWNwcF9ob3N0Il0sCisgICAgc3RhdGljX2xpYnM6IFsiYnVpbHRpbl9oZWFkZXJzIl0sCisgICAgZGVmYXVsdHM6IFsiaWRlX3F1ZXJ5X2NjX2FuYWx5emVyX2RlZmF1bHRzIl0sCit9CisKK2NjX2xpYnJhcnlfaG9zdF9zdGF0aWMgeworICAgIG5hbWU6ICJhbmFseXplciIsCisgICAgc3JjczogWyJhbmFseXplci5jYyJdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmNsYW5nLWNwcF9ob3N0Il0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImluY2x1ZGVfc2Nhbm5lciIsCisgICAgICAgICJjY19hbmFseXplcl9wcm90byIsCisgICAgXSwKKyAgICBkZWZhdWx0czogWyJpZGVfcXVlcnlfY2NfYW5hbHl6ZXJfZGVmYXVsdHMiXSwKK30KKworY2NfYmluYXJ5X2hvc3QgeworICAgIG5hbWU6ICJpZGVfcXVlcnlfY2NfYW5hbHl6ZXIiLAorICAgIGRlZmF1bHRzOiBbImlkZV9xdWVyeV9jY19hbmFseXplcl9kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsibWFpbi5jYyJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjbGFuZy1jcHBfaG9zdCIsCisgICAgICAgICJsaWJwcm90b2J1Zi1jcHAtZnVsbCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiY2NfYW5hbHl6ZXJfcHJvdG8iLAorICAgICAgICAiYnVpbHRpbl9oZWFkZXJzIiwKKyAgICAgICAgImluY2x1ZGVfc2Nhbm5lciIsCisgICAgICAgICJhbmFseXplciIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9hbmFseXplci5jYyBiL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9hbmFseXplci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2NlYzU0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL2FuYWx5emVyLmNjCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlICJhbmFseXplci5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNjX2FuYWx5emVyLnBiLmgiCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9Db21waWxhdGlvbkRhdGFiYXNlLmgiCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9KU09OQ29tcGlsYXRpb25EYXRhYmFzZS5oIgorI2luY2x1ZGUgImluY2x1ZGVfc2Nhbm5lci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUGF0aC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9WaXJ0dWFsRmlsZVN5c3RlbS5oIgorCituYW1lc3BhY2UgdG9vbHM6OmlkZV9xdWVyeTo6Y2NfYW5hbHl6ZXIgeworbmFtZXNwYWNlIHsKK2xsdm06OkV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxjbGFuZzo6dG9vbGluZzo6Q29tcGlsYXRpb25EYXRhYmFzZT4+IExvYWRDb21wREIoCisgICAgbGx2bTo6U3RyaW5nUmVmIGNvbXBfZGJfcGF0aCkgeworICBzdGQ6OnN0cmluZyBlcnI7CisgIHN0ZDo6dW5pcXVlX3B0cjxjbGFuZzo6dG9vbGluZzo6Q29tcGlsYXRpb25EYXRhYmFzZT4gZGIgPQorICAgICAgY2xhbmc6OnRvb2xpbmc6OkpTT05Db21waWxhdGlvbkRhdGFiYXNlOjpsb2FkRnJvbUZpbGUoCisgICAgICAgICAgY29tcF9kYl9wYXRoLCBlcnIsIGNsYW5nOjp0b29saW5nOjpKU09OQ29tbWFuZExpbmVTeW50YXg6OkF1dG9EZXRlY3QpOworICBpZiAoIWRiKSB7CisgICAgcmV0dXJuIGxsdm06OmNyZWF0ZVN0cmluZ0Vycm9yKGxsdm06OmluY29udmVydGlibGVFcnJvckNvZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBsb2FkIENEQjogIiArIGVycik7CisgIH0KKyAgLy8gUHJvdmlkZSBzb21lIGhldXJpc3RpYyBzdXBwb3J0IGZvciBtaXNzaW5nIGZpbGVzLgorICByZXR1cm4gaW5mZXJNaXNzaW5nQ29tcGlsZUNvbW1hbmRzKHN0ZDo6bW92ZShkYikpOworfQorfSAgLy8gbmFtZXNwYWNlCisKKzo6Y2NfYW5hbHl6ZXI6OkRlcHNSZXNwb25zZSBHZXREZXBzKDo6Y2NfYW5hbHl6ZXI6OlJlcG9TdGF0ZSBzdGF0ZSkgeworICA6OmNjX2FuYWx5emVyOjpEZXBzUmVzcG9uc2UgcmVzdWx0czsKKyAgYXV0byBkYiA9IExvYWRDb21wREIoc3RhdGUuY29tcF9kYl9wYXRoKCkpOworICBpZiAoIWRiKSB7CisgICAgcmVzdWx0cy5tdXRhYmxlX3N0YXR1cygpLT5zZXRfY29kZSg6OmNjX2FuYWx5emVyOjpTdGF0dXM6OkZBSUxVUkUpOworICAgIHJlc3VsdHMubXV0YWJsZV9zdGF0dXMoKS0+c2V0X21lc3NhZ2UobGx2bTo6dG9TdHJpbmcoZGIudGFrZUVycm9yKCkpKTsKKyAgICByZXR1cm4gcmVzdWx0czsKKyAgfQorICBmb3IgKGxsdm06OlN0cmluZ1JlZiBhY3RpdmVfZmlsZSA6IHN0YXRlLmFjdGl2ZV9maWxlX3BhdGgoKSkgeworICAgIGF1dG8mIHJlc3VsdCA9ICpyZXN1bHRzLmFkZF9kZXBzKCk7CisKKyAgICBsbHZtOjpTbWFsbFN0cmluZzwyNTY+IGFic19maWxlKHN0YXRlLnJlcG9fZGlyKCkpOworICAgIGxsdm06OnN5czo6cGF0aDo6YXBwZW5kKGFic19maWxlLCBhY3RpdmVfZmlsZSk7CisgICAgYXV0byBjbWRzID0gZGItPmdldCgpLT5nZXRDb21waWxlQ29tbWFuZHMoYWN0aXZlX2ZpbGUpOworICAgIGlmIChjbWRzLmVtcHR5KCkpIHsKKyAgICAgIHJlc3VsdC5tdXRhYmxlX3N0YXR1cygpLT5zZXRfY29kZSg6OmNjX2FuYWx5emVyOjpTdGF0dXM6OkZBSUxVUkUpOworICAgICAgcmVzdWx0Lm11dGFibGVfc3RhdHVzKCktPnNldF9tZXNzYWdlKAorICAgICAgICAgIGxsdm06OlR3aW5lKCJDYW4ndCBmaW5kIGNvbXBpbGUgZmxhZ3MgZm9yIGZpbGU6ICIsIGFic19maWxlKS5zdHIoKSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgcmVzdWx0LnNldF9zb3VyY2VfZmlsZShhY3RpdmVfZmlsZS5zdHIoKSk7CisgICAgbGx2bTo6U3RyaW5nUmVmIGZpbGUgPSBjbWRzWzBdLkZpbGVuYW1lOworICAgIGlmIChsbHZtOjpTdHJpbmdSZWYgYWN0dWFsX2ZpbGUoY21kc1swXS5IZXVyaXN0aWMpOworICAgICAgICBhY3R1YWxfZmlsZS5jb25zdW1lX2Zyb250KCJpbmZlcnJlZCBmcm9tICIpKSB7CisgICAgICBmaWxlID0gYWN0dWFsX2ZpbGU7CisgICAgfQorICAgIC8vIFRPRE86IFF1ZXJ5IG5pbmphIGdyYXBoIHRvIGZpZ3VyZSBvdXQgYSBtaW5pbWFsIHNldCBvZiB0YXJnZXRzIHRvIGJ1aWxkLgorICAgIHJlc3VsdC5hZGRfYnVpbGRfdGFyZ2V0KGZpbGUuc3RyKCkgKyAiXiIpOworICB9CisgIHJldHVybiByZXN1bHRzOworfQorCis6OmNjX2FuYWx5emVyOjpJZGVBbmFseXNpcyBHZXRCdWlsZElucHV0cyg6OmNjX2FuYWx5emVyOjpSZXBvU3RhdGUgc3RhdGUpIHsKKyAgYXV0byBkYiA9IExvYWRDb21wREIoc3RhdGUuY29tcF9kYl9wYXRoKCkpOworICA6OmNjX2FuYWx5emVyOjpJZGVBbmFseXNpcyByZXN1bHRzOworICBpZiAoIWRiKSB7CisgICAgcmVzdWx0cy5tdXRhYmxlX3N0YXR1cygpLT5zZXRfY29kZSg6OmNjX2FuYWx5emVyOjpTdGF0dXM6OkZBSUxVUkUpOworICAgIHJlc3VsdHMubXV0YWJsZV9zdGF0dXMoKS0+c2V0X21lc3NhZ2UobGx2bTo6dG9TdHJpbmcoZGIudGFrZUVycm9yKCkpKTsKKyAgICByZXR1cm4gcmVzdWx0czsKKyAgfQorICBzdGQ6OnN0cmluZyByZXBvX2RpciA9IHN0YXRlLnJlcG9fZGlyKCk7CisgIGlmICghcmVwb19kaXIuZW1wdHkoKSAmJiByZXBvX2Rpci5iYWNrKCkgPT0gJy8nKSByZXBvX2Rpci5wb3BfYmFjaygpOworCisgIGxsdm06OlNtYWxsU3RyaW5nPDI1Nj4gZ2VuZmlsZV9yb290X2FicyhyZXBvX2Rpcik7CisgIGxsdm06OnN5czo6cGF0aDo6YXBwZW5kKGdlbmZpbGVfcm9vdF9hYnMsIHN0YXRlLm91dF9kaXIoKSk7CisgIGlmIChnZW5maWxlX3Jvb3RfYWJzLmVtcHR5KCkgfHwgZ2VuZmlsZV9yb290X2Ficy5iYWNrKCkgIT0gJy8nKSB7CisgICAgZ2VuZmlsZV9yb290X2Ficy5wdXNoX2JhY2soJy8nKTsKKyAgfQorCisgIGZvciAobGx2bTo6U3RyaW5nUmVmIGFjdGl2ZV9maWxlIDogc3RhdGUuYWN0aXZlX2ZpbGVfcGF0aCgpKSB7CisgICAgYXV0byYgcmVzdWx0ID0gKnJlc3VsdHMuYWRkX3NvdXJjZXMoKTsKKyAgICByZXN1bHQuc2V0X3BhdGgoYWN0aXZlX2ZpbGUuc3RyKCkpOworCisgICAgbGx2bTo6U21hbGxTdHJpbmc8MjU2PiBhYnNfZmlsZShyZXBvX2Rpcik7CisgICAgbGx2bTo6c3lzOjpwYXRoOjphcHBlbmQoYWJzX2ZpbGUsIGFjdGl2ZV9maWxlKTsKKyAgICBhdXRvIGNtZHMgPSBkYi0+Z2V0KCktPmdldENvbXBpbGVDb21tYW5kcyhhYnNfZmlsZSk7CisgICAgaWYgKGNtZHMuZW1wdHkoKSkgeworICAgICAgcmVzdWx0Lm11dGFibGVfc3RhdHVzKCktPnNldF9jb2RlKDo6Y2NfYW5hbHl6ZXI6OlN0YXR1czo6RkFJTFVSRSk7CisgICAgICByZXN1bHQubXV0YWJsZV9zdGF0dXMoKS0+c2V0X21lc3NhZ2UoCisgICAgICAgICAgbGx2bTo6VHdpbmUoIkNhbid0IGZpbmQgY29tcGlsZSBmbGFncyBmb3IgZmlsZTogIiwgYWJzX2ZpbGUpLnN0cigpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBjb25zdCBhdXRvJiBjbWQgPSBjbWRzLmZyb250KCk7CisgICAgbGx2bTo6U3RyaW5nUmVmIHdvcmtpbmdfZGlyID0gY21kLkRpcmVjdG9yeTsKKyAgICBpZiAoIXdvcmtpbmdfZGlyLmNvbnN1bWVfZnJvbnQocmVwb19kaXIpKSB7CisgICAgICByZXN1bHQubXV0YWJsZV9zdGF0dXMoKS0+c2V0X2NvZGUoOjpjY19hbmFseXplcjo6U3RhdHVzOjpGQUlMVVJFKTsKKyAgICAgIHJlc3VsdC5tdXRhYmxlX3N0YXR1cygpLT5zZXRfbWVzc2FnZSgiQ29tbWFuZCB3b3JraW5nIGRpciAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JraW5nX2Rpci5zdHIoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBvdXRzaWRlIHJlcG9zaXRvcnkgIiArIHJlcG9fZGlyKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICB3b3JraW5nX2RpciA9IHdvcmtpbmdfZGlyLmx0cmltKCcvJyk7CisgICAgcmVzdWx0LnNldF93b3JraW5nX2Rpcih3b3JraW5nX2Rpci5zdHIoKSk7CisgICAgZm9yIChhdXRvJiBhcmcgOiBjbWQuQ29tbWFuZExpbmUpIHJlc3VsdC5hZGRfY29tcGlsZXJfYXJndW1lbnRzKGFyZyk7CisKKyAgICBhdXRvIGluY2x1ZGVzID0KKyAgICAgICAgU2NhbkluY2x1ZGVzKGNtZHMuZnJvbnQoKSwgbGx2bTo6dmZzOjpjcmVhdGVQaHlzaWNhbEZpbGVTeXN0ZW0oKSk7CisgICAgaWYgKCFpbmNsdWRlcykgeworICAgICAgcmVzdWx0Lm11dGFibGVfc3RhdHVzKCktPnNldF9jb2RlKDo6Y2NfYW5hbHl6ZXI6OlN0YXR1czo6RkFJTFVSRSk7CisgICAgICByZXN1bHQubXV0YWJsZV9zdGF0dXMoKS0+c2V0X21lc3NhZ2UoCisgICAgICAgICAgbGx2bTo6dG9TdHJpbmcoaW5jbHVkZXMudGFrZUVycm9yKCkpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGZvciAoYXV0byYgW3JlcV9pbnB1dCwgY29udGVudHNdIDogKmluY2x1ZGVzKSB7CisgICAgICBsbHZtOjpTdHJpbmdSZWYgcmVxX2lucHV0X3JlZihyZXFfaW5wdXQpOworICAgICAgLy8gV2UncmUgb25seSBpbnRlcmVzdGVkIGluIGdlbmVyYXRlZCBmaWxlcy4KKyAgICAgIGlmICghcmVxX2lucHV0X3JlZi5jb25zdW1lX2Zyb250KGdlbmZpbGVfcm9vdF9hYnMpKSBjb250aW51ZTsKKyAgICAgIGF1dG8mIGdlbmZpbGUgPSAqcmVzdWx0LmFkZF9nZW5lcmF0ZWQoKTsKKyAgICAgIGdlbmZpbGUuc2V0X3BhdGgocmVxX2lucHV0X3JlZi5zdHIoKSk7CisgICAgICBnZW5maWxlLnNldF9jb250ZW50cyhzdGQ6Om1vdmUoY29udGVudHMpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdHM7Cit9Cit9ICAvLyBuYW1lc3BhY2UgdG9vbHM6OmlkZV9xdWVyeTo6Y2NfYW5hbHl6ZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9hbmFseXplci5oIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL2FuYWx5emVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQxOTA4MgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9hbmFseXplci5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9UT09MU19JREVfUVVFUllfQ0NfQU5BTFlaRVJfQU5BTFlaRVJfSF8KKyNkZWZpbmUgX1RPT0xTX0lERV9RVUVSWV9DQ19BTkFMWVpFUl9BTkFMWVpFUl9IXworCisjaW5jbHVkZSAiY2NfYW5hbHl6ZXIucGIuaCIKKworbmFtZXNwYWNlIHRvb2xzOjppZGVfcXVlcnk6OmNjX2FuYWx5emVyIHsKKworLy8gU2NhbnMgdGhlIGJ1aWxkIGdyYXBoIGFuZCByZXR1cm5zIHRhcmdldCBuYW1lcyBmcm9tIHRoZSBidWlsZCBncmFwaCB0bworLy8gZ2VuZXJhdGUgYWxsIHRoZSBkZXBlbmRlbmNpZXMgZm9yIHRoZSBhY3RpdmUgZmlsZXMuCis6OmNjX2FuYWx5emVyOjpEZXBzUmVzcG9uc2UgR2V0RGVwcyg6OmNjX2FuYWx5emVyOjpSZXBvU3RhdGUgc3RhdGUpOworCisvLyBTY2FucyB0aGUgc291cmNlcyBhbmQgcmV0dXJucyBhbGwgdGhlIHNvdXJjZSBmaWxlcyByZXF1aXJlZCBmb3IgYW5hbHl6aW5nIHRoZQorLy8gYWN0aXZlIGZpbGVzLgorOjpjY19hbmFseXplcjo6SWRlQW5hbHlzaXMgR2V0QnVpbGRJbnB1dHMoOjpjY19hbmFseXplcjo6UmVwb1N0YXRlIHN0YXRlKTsKKworfSAgLy8gbmFtZXNwYWNlIHRvb2xzOjppZGVfcXVlcnk6OmNjX2FuYWx5emVyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL2J1aWx0aW5faGVhZGVycy5jYyBiL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9idWlsdGluX2hlYWRlcnMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ0NGNlNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9idWlsdGluX2hlYWRlcnMuY2MKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiYnVpbHRpbl9oZWFkZXJzLmgiCisKKyNpbmNsdWRlIDxjc3RkZGVmPgorCisjaW5jbHVkZSAiY2xhbmdfYnVpbHRpbl9oZWFkZXJzX3Jlc291cmNlcy5pbmMiCisKK2NvbnN0IHN0cnVjdCBGaWxlVG9jICpidWlsdGluX2hlYWRlcnNfY3JlYXRlKCkgeyByZXR1cm4ga1BhY2tlZEZpbGVzOyB9CitzaXplX3QgYnVpbHRpbl9oZWFkZXJzX3NpemUoKSB7CisgIHJldHVybiBzaXplb2Yoa1BhY2tlZEZpbGVzKSAvIHNpemVvZihGaWxlVG9jKSAtIDE7Cit9CmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXIvYnVpbHRpbl9oZWFkZXJzLmggYi90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXIvYnVpbHRpbl9oZWFkZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhNzIyZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9idWlsdGluX2hlYWRlcnMuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX1RPT0xTX0lERV9RVUVSWV9DQ19BTkFMWVpFUl9CVUlMVElOX0hFQURFUlNfSF8KKyNkZWZpbmUgX1RPT0xTX0lERV9RVUVSWV9DQ19BTkFMWVpFUl9CVUlMVElOX0hFQURFUlNfSF8KKworI2luY2x1ZGUgPGNzdGRkZWY+CisKK3N0cnVjdCBGaWxlVG9jIHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgY29uc3QgY2hhciAqZGF0YTsKK307CisKK2NvbnN0IHN0cnVjdCBGaWxlVG9jICpidWlsdGluX2hlYWRlcnNfY3JlYXRlKCk7CitzaXplX3QgYnVpbHRpbl9oZWFkZXJzX3NpemUoKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXIvaW5jbHVkZV9zY2FubmVyLmNjIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL2luY2x1ZGVfc2Nhbm5lci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTE2YTNlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL2luY2x1ZGVfc2Nhbm5lci5jYwpAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiaW5jbHVkZV9zY2FubmVyLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJidWlsdGluX2hlYWRlcnMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9GaWxlRW50cnkuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9GaWxlTWFuYWdlci5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL01vZHVsZS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTWFuYWdlci5oIgorI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL0FTVFVuaXQuaCIKKyNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Db21waWxlckluc3RhbmNlLmgiCisjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb25zLmgiCisjaW5jbHVkZSAiY2xhbmcvTGV4L1BQQ2FsbGJhY2tzLmgiCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9Bcmd1bWVudHNBZGp1c3RlcnMuaCIKKyNpbmNsdWRlICJjbGFuZy9Ub29saW5nL0NvbXBpbGF0aW9uRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJjbGFuZy9Ub29saW5nL1Rvb2xpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ludHJ1c2l2ZVJlZkNudFB0ci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1BhdGguaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVmlydHVhbEZpbGVTeXN0ZW0uaCIKKworbmFtZXNwYWNlIHRvb2xzOjppZGVfcXVlcnk6OmNjX2FuYWx5emVyIHsKK25hbWVzcGFjZSB7CitzdGQ6OnN0cmluZyBDbGVhblBhdGgobGx2bTo6U3RyaW5nUmVmIHBhdGgpIHsKKyAgLy8gYm90aCAuLyBhbmQgLi4vIGhhcyBgLi9gIGluIHRoZW0uCisgIGlmICghcGF0aC5jb250YWlucygiLi8iKSkgcmV0dXJuIHBhdGguc3RyKCk7CisgIGxsdm06OlNtYWxsU3RyaW5nPDI1Nj4gY2xlYW5fcGF0aChwYXRoKTsKKyAgbGx2bTo6c3lzOjpwYXRoOjpyZW1vdmVfZG90cyhjbGVhbl9wYXRoLCAvKnJlbW92ZV9kb3RfZG90PSovdHJ1ZSk7CisgIHJldHVybiBjbGVhbl9wYXRoLnN0cigpLnN0cigpOworfQorCisvLyBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIGZpbGVfbmFtZSwgdHJlYXRpbmcgaXQgYXMgcmVsYXRpdmUgdG8gY3dkIGlmIGl0CisvLyBpc24ndCBhbHJlYWR5IGFic29sdXRlLgorc3RkOjpzdHJpbmcgR2V0QWJzb2x1dGVQYXRoKGxsdm06OlN0cmluZ1JlZiBjd2QsIGxsdm06OlN0cmluZ1JlZiBmaWxlX25hbWUpIHsKKyAgaWYgKGxsdm06OnN5czo6cGF0aDo6aXNfYWJzb2x1dGUoZmlsZV9uYW1lKSkgcmV0dXJuIENsZWFuUGF0aChmaWxlX25hbWUpOworICBsbHZtOjpTbWFsbFN0cmluZzwyNTY+IGFic19wYXRoKGN3ZCk7CisgIGxsdm06OnN5czo6cGF0aDo6YXBwZW5kKGFic19wYXRoLCBmaWxlX25hbWUpOworICBsbHZtOjpzeXM6OnBhdGg6OnJlbW92ZV9kb3RzKGFic19wYXRoLCAvKnJlbW92ZV9kb3RfZG90PSovdHJ1ZSk7CisgIHJldHVybiBhYnNfcGF0aC5zdHIoKS5zdHIoKTsKK30KKworY2xhc3MgSW5jbHVkZVJlY29yZGluZ1BQIDogcHVibGljIGNsYW5nOjpQUENhbGxiYWNrcyB7CisgcHVibGljOgorICBleHBsaWNpdCBJbmNsdWRlUmVjb3JkaW5nUFAoCisgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiAmYWJzX3BhdGhzLCBzdGQ6OnN0cmluZyBjd2QsCisgICAgICBjb25zdCBjbGFuZzo6U291cmNlTWFuYWdlciAmc20pCisgICAgICA6IGFic19wYXRoc18oYWJzX3BhdGhzKSwgY3dkXyhzdGQ6Om1vdmUoY3dkKSksIHNtXyhzbSkge30KKworICB2b2lkIExleGVkRmlsZUNoYW5nZWQoY2xhbmc6OkZpbGVJRCBGSUQsIExleGVkRmlsZUNoYW5nZVJlYXNvbiBSZWFzb24sCisgICAgICAgICAgICAgICAgICAgICAgICBjbGFuZzo6U3JjTWdyOjpDaGFyYWN0ZXJpc3RpY0tpbmQgRmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjbGFuZzo6RmlsZUlEIFByZXZGSUQsCisgICAgICAgICAgICAgICAgICAgICAgICBjbGFuZzo6U291cmNlTG9jYXRpb24gTG9jKSBvdmVycmlkZSB7CisgICAgYXV0byBmaWxlX2VudHJ5ID0gc21fLmdldEZpbGVFbnRyeVJlZkZvcklEKEZJRCk7CisgICAgaWYgKCFmaWxlX2VudHJ5KSByZXR1cm47CisgICAgYXV0byBhYnNfcGF0aCA9IEdldEFic29sdXRlUGF0aChjd2RfLCBmaWxlX2VudHJ5LT5nZXROYW1lKCkpOworICAgIGF1dG8gW2l0LCBpbnNlcnRlZF0gPSBhYnNfcGF0aHNfLnRyeV9lbXBsYWNlKGFic19wYXRoKTsKKyAgICBpZiAoaW5zZXJ0ZWQpIGl0LT5zZWNvbmQgPSBzbV8uZ2V0QnVmZmVyRGF0YShGSUQpOworICB9CisKKyAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gJmFic19wYXRoc187CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGN3ZF87CisgIGNvbnN0IGNsYW5nOjpTb3VyY2VNYW5hZ2VyICZzbV87Cit9OworCitjbGFzcyBJbmNsdWRlU2Nhbm5pbmdBY3Rpb24gZmluYWwgOiBwdWJsaWMgY2xhbmc6OlByZXByb2Nlc3NPbmx5QWN0aW9uIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEluY2x1ZGVTY2FubmluZ0FjdGlvbigKKyAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+ICZhYnNfcGF0aHMpCisgICAgICA6IGFic19wYXRoc18oYWJzX3BhdGhzKSB7fQorICBib29sIEJlZ2luU291cmNlRmlsZUFjdGlvbihjbGFuZzo6Q29tcGlsZXJJbnN0YW5jZSAmY2kpIG92ZXJyaWRlIHsKKyAgICBzdGQ6OnN0cmluZyBjd2Q7CisgICAgYXV0byBjd2Rfb3JfZXJyID0gY2kuZ2V0VmlydHVhbEZpbGVTeXN0ZW0oKS5nZXRDdXJyZW50V29ya2luZ0RpcmVjdG9yeSgpOworICAgIGlmICghY3dkX29yX2VyciB8fCBjd2Rfb3JfZXJyLmdldCgpLmVtcHR5KCkpIHJldHVybiBmYWxzZTsKKyAgICBjd2QgPSBjd2Rfb3JfZXJyLmdldCgpOworICAgIGNpLmdldFByZXByb2Nlc3NvcigpLmFkZFBQQ2FsbGJhY2tzKHN0ZDo6bWFrZV91bmlxdWU8SW5jbHVkZVJlY29yZGluZ1BQPigKKyAgICAgICAgYWJzX3BhdGhzXywgc3RkOjptb3ZlKGN3ZCksIGNpLmdldFNvdXJjZU1hbmFnZXIoKSkpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyBwcml2YXRlOgorICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiAmYWJzX3BhdGhzXzsKK307CisKK2xsdm06OkludHJ1c2l2ZVJlZkNudFB0cjxsbHZtOjp2ZnM6OkZpbGVTeXN0ZW0+IE92ZXJsYXlCdWlsdGluSGVhZGVycygKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmFyZ3YsCisgICAgbGx2bTo6SW50cnVzaXZlUmVmQ250UHRyPGxsdm06OnZmczo6RmlsZVN5c3RlbT4gYmFzZSkgeworICBzdGF0aWMgY29uc3RleHByIGxsdm06OlN0cmluZ0xpdGVyYWwga1Jlc291cmNlRGlyID0gIi9yZXNvdXJjZXMiOworICBsbHZtOjpJbnRydXNpdmVSZWZDbnRQdHI8bGx2bTo6dmZzOjpPdmVybGF5RmlsZVN5c3RlbT4gb3ZlcmxheSgKKyAgICAgIG5ldyBsbHZtOjp2ZnM6Ok92ZXJsYXlGaWxlU3lzdGVtKHN0ZDo6bW92ZShiYXNlKSkpOworICBsbHZtOjpJbnRydXNpdmVSZWZDbnRQdHI8bGx2bTo6dmZzOjpJbk1lbW9yeUZpbGVTeXN0ZW0+IGJ1aWx0aW5faGVhZGVycygKKyAgICAgIG5ldyBsbHZtOjp2ZnM6OkluTWVtb3J5RmlsZVN5c3RlbSk7CisKKyAgbGx2bTo6U21hbGxTdHJpbmc8MjU2PiBmaWxlX3BhdGg7CisgIGZvciAoY29uc3QgYXV0byAmYnVpbHRpbl9oZWFkZXIgOgorICAgICAgIGxsdm06OkFycmF5UmVmKGJ1aWx0aW5faGVhZGVyc19jcmVhdGUoKSwgYnVpbHRpbl9oZWFkZXJzX3NpemUoKSkpIHsKKyAgICBmaWxlX3BhdGguY2xlYXIoKTsKKyAgICBsbHZtOjpzeXM6OnBhdGg6OmFwcGVuZChmaWxlX3BhdGgsIGtSZXNvdXJjZURpciwgImluY2x1ZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5faGVhZGVyLm5hbWUpOworICAgIGJ1aWx0aW5faGVhZGVycy0+YWRkRmlsZSgKKyAgICAgICAgZmlsZV9wYXRoLAorICAgICAgICAvKk1vZGlmaWNhdGlvblRpbWU9Ki8wLAorICAgICAgICBsbHZtOjpNZW1vcnlCdWZmZXI6OmdldE1lbUJ1ZmZlcihidWlsdGluX2hlYWRlci5kYXRhKSk7CisgIH0KKyAgb3ZlcmxheS0+cHVzaE92ZXJsYXkoc3RkOjptb3ZlKGJ1aWx0aW5faGVhZGVycykpOworICBhcmd2Lmluc2VydChsbHZtOjpmaW5kKGFyZ3YsICItLSIpLAorICAgICAgICAgICAgICBsbHZtOjpUd2luZSgiLXJlc291cmNlLWRpcj0iLCBrUmVzb3VyY2VEaXIpLnN0cigpKTsKKyAgcmV0dXJuIG92ZXJsYXk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitsbHZtOjpFeHBlY3RlZDxzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4+IFNjYW5JbmNsdWRlcygKKyAgICBjb25zdCBjbGFuZzo6dG9vbGluZzo6Q29tcGlsZUNvbW1hbmQgJmNtZCwKKyAgICBsbHZtOjpJbnRydXNpdmVSZWZDbnRQdHI8bGx2bTo6dmZzOjpGaWxlU3lzdGVtPiBmcykgeworICBpZiAoZnMtPnNldEN1cnJlbnRXb3JraW5nRGlyZWN0b3J5KGNtZC5EaXJlY3RvcnkpKSB7CisgICAgcmV0dXJuIGxsdm06OmNyZWF0ZVN0cmluZ0Vycm9yKAorICAgICAgICBsbHZtOjppbmNvbnZlcnRpYmxlRXJyb3JDb2RlKCksCisgICAgICAgICJGYWlsZWQgdG8gc2V0IHdvcmtpbmcgZGlyZWN0b3J5IHRvOiAiICsgY21kLkRpcmVjdG9yeSk7CisgIH0KKworICBhdXRvIG1haW5fZmlsZSA9IGZzLT5nZXRCdWZmZXJGb3JGaWxlKGNtZC5GaWxlbmFtZSk7CisgIGlmICghbWFpbl9maWxlKSB7CisgICAgcmV0dXJuIGxsdm06OmNyZWF0ZVN0cmluZ0Vycm9yKGxsdm06OmluY29udmVydGlibGVFcnJvckNvZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1haW4gZmlsZSBkb2Vzbid0IGV4aXN0OiAiICsgY21kLkZpbGVuYW1lKTsKKyAgfQorICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhYnNfcGF0aHM7CisgIGFic19wYXRocy50cnlfZW1wbGFjZShHZXRBYnNvbHV0ZVBhdGgoY21kLkRpcmVjdG9yeSwgY21kLkZpbGVuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fZmlsZS5nZXQoKS0+Z2V0QnVmZmVyKCkuc3RyKCkpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhcmd2ID0gY21kLkNvbW1hbmRMaW5lOworICBmcyA9IE92ZXJsYXlCdWlsdGluSGVhZGVycyhhcmd2LCBzdGQ6Om1vdmUoZnMpKTsKKworICBsbHZtOjpJbnRydXNpdmVSZWZDbnRQdHI8Y2xhbmc6OkZpbGVNYW5hZ2VyPiBmaWxlcygKKyAgICAgIG5ldyBjbGFuZzo6RmlsZU1hbmFnZXIoLypGaWxlU3lzdGVtT3B0cz0qL3t9LCBzdGQ6Om1vdmUoZnMpKSk7CisgIGNsYW5nOjp0b29saW5nOjpUb29sSW52b2NhdGlvbiB0b29sKAorICAgICAgYXJndiwgc3RkOjptYWtlX3VuaXF1ZTxJbmNsdWRlU2Nhbm5pbmdBY3Rpb24+KGFic19wYXRocyksIGZpbGVzLmdldCgpKTsKKyAgaWYgKCF0b29sLnJ1bigpKSB7CisgICAgcmV0dXJuIGxsdm06OmNyZWF0ZVN0cmluZ0Vycm9yKAorICAgICAgICBsbHZtOjppbmNvbnZlcnRpYmxlRXJyb3JDb2RlKCksCisgICAgICAgICJGYWlsZWQgdG8gc2NhbiBpbmNsdWRlcyBmb3I6ICIgKyBjbWQuRmlsZW5hbWUpOworICB9CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IHJlc3VsdDsKKyAgcmVzdWx0LnJlc2VydmUoYWJzX3BhdGhzLnNpemUoKSk7CisgIGZvciAoYXV0byAmZW50cnkgOiBhYnNfcGF0aHMpIHsKKyAgICByZXN1bHQuZW1wbGFjZV9iYWNrKGVudHJ5LmZpcnN0LCBzdGQ6Om1vdmUoZW50cnkuc2Vjb25kKSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KK30gIC8vIG5hbWVzcGFjZSB0b29sczo6aWRlX3F1ZXJ5OjpjY19hbmFseXplcgpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL2luY2x1ZGVfc2Nhbm5lci5oIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL2luY2x1ZGVfc2Nhbm5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MTRlNzIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXIvaW5jbHVkZV9zY2FubmVyLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIF9UT09MU19JREVfUVVFUllfQ0NfQU5BTFlaRVJfSU5DTFVERV9TQ0FOTkVSX0hfCisjZGVmaW5lIF9UT09MU19JREVfUVVFUllfQ0NfQU5BTFlaRVJfSU5DTFVERV9TQ0FOTkVSX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjbGFuZy9Ub29saW5nL0NvbXBpbGF0aW9uRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9JbnRydXNpdmVSZWZDbnRQdHIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVmlydHVhbEZpbGVTeXN0ZW0uaCIKKworbmFtZXNwYWNlIHRvb2xzOjppZGVfcXVlcnk6OmNjX2FuYWx5emVyIHsKKworLy8gUmV0dXJucyBhYnNvbHV0ZSBwYXRocyBhbmQgY29udGVudHMgZm9yIGFsbCB0aGUgaW5jbHVkZXMgbmVjZXNzYXJ5IGZvcgorLy8gY29tcGlsaW5nIHNvdXJjZSBmaWxlIGluIGNvbW1hbmQuCitsbHZtOjpFeHBlY3RlZDxzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4+IFNjYW5JbmNsdWRlcygKKyAgICBjb25zdCBjbGFuZzo6dG9vbGluZzo6Q29tcGlsZUNvbW1hbmQgJmNtZCwKKyAgICBsbHZtOjpJbnRydXNpdmVSZWZDbnRQdHI8bGx2bTo6dmZzOjpGaWxlU3lzdGVtPiBmcyk7CisKK30gIC8vIG5hbWVzcGFjZSB0b29sczo6aWRlX3F1ZXJ5OjpjY19hbmFseXplcgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9tYWluLmNjIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL21haW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg2ZmM4YwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9tYWluLmNjCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBEcml2ZXIgZm9yIGMrKyBleHRyYWN0b3IuIE9wZXJhdGVzIGluIHR3byBtb2RlczoKKy8vIC0gREVQUywgc2NhbnMgYnVpbGQgZ3JhcGggZm9yIGFjdGl2ZSBmaWxlcyBhbmQgcmVwb3J0cyB0YXJnZXRzIHRoYXQgbmVlZCB0bworLy8gYmUgYnVpbGQgZm9yIGFuYWx5emluZyB0aGF0IGZpbGUuCisvLyAtIElOUFVUUywgc2NhbnMgdGhlIHNvdXJjZSBjb2RlIGZvciBhY3RpdmUgZmlsZXMgYW5kIHJldHVybnMgYWxsIHRoZSBzb3VyY2VzCisvLyByZXF1aXJlZCBmb3IgYW5hbHl6aW5nIHRoYXQgZmlsZS4KKy8vCisvLyBVc2VzIHN0ZGluL3N0ZG91dCB0byB0YWtlIGluIHJlcXVlc3RzIGFuZCBwcm92aWRlIHJlc3BvbnNlcy4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiYW5hbHl6ZXIuaCIKKyNpbmNsdWRlICJnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oIgorI2luY2x1ZGUgImNjX2FuYWx5emVyLnBiLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1RhcmdldFNlbGVjdC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCituYW1lc3BhY2UgeworZW51bSBjbGFzcyBPcE1vZGUgeworICBERVBTID0gMCwKKyAgSU5QVVRTID0gMSwKK307CitsbHZtOjpjbDo6b3B0PE9wTW9kZT4gbW9kZXsKKyAgICAibW9kZSIsCisgICAgbGx2bTo6Y2w6OnZhbHVlcyhjbEVudW1WYWxOKE9wTW9kZTo6REVQUywgImRlcHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlndXJlIG91dCB0YXJnZXRzIHRoYXQgbmVlZCB0byBiZSBidWlsZCIpLAorICAgICAgICAgICAgICAgICAgICAgY2xFbnVtVmFsTihPcE1vZGU6OklOUFVUUywgImlucHV0cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWd1cmUgb3V0IGdlbmVyYXRlZCBmaWxlcyB1c2VkIikpLAorICAgIGxsdm06OmNsOjpkZXNjKCJQcmludCB0aGUgbGlzdCBvZiBoZWFkZXJzIHRvIGluc2VydCBhbmQgcmVtb3ZlIiksCit9OworCitjY19hbmFseXplcjo6SWRlQW5hbHlzaXMgUmV0dXJuRXJyb3IobGx2bTo6U3RyaW5nUmVmIG1lc3NhZ2UpIHsKKyAgY2NfYW5hbHl6ZXI6OklkZUFuYWx5c2lzIHJlc3VsdDsKKyAgcmVzdWx0Lm11dGFibGVfc3RhdHVzKCktPnNldF9jb2RlKGNjX2FuYWx5emVyOjpTdGF0dXM6OkZBSUxVUkUpOworICByZXN1bHQubXV0YWJsZV9zdGF0dXMoKS0+c2V0X21lc3NhZ2UobWVzc2FnZS5zdHIoKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIGxsdm06OkluaXRpYWxpemVBbGxUYXJnZXRJbmZvcygpOworICBsbHZtOjpjbDo6UGFyc2VDb21tYW5kTGluZU9wdGlvbnMoYXJnYywgYXJndik7CisKKyAgY2NfYW5hbHl6ZXI6OlJlcG9TdGF0ZSBzdGF0ZTsKKyAgaWYgKCFzdGF0ZS5QYXJzZUZyb21GaWxlRGVzY3JpcHRvcihTVERJTl9GSUxFTk8pKSB7CisgICAgbGx2bTo6ZXJycygpIDw8ICJGYWlsZWQgdG8gcGFyc2UgaW5wdXQhXG4iOworICAgIHJldHVybiAxOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2U+IHJlc3VsdDsKKyAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBPcE1vZGU6OkRFUFM6IHsKKyAgICAgIHJlc3VsdCA9IHN0ZDo6bWFrZV91bmlxdWU8Y2NfYW5hbHl6ZXI6OkRlcHNSZXNwb25zZT4oCisgICAgICAgICAgdG9vbHM6OmlkZV9xdWVyeTo6Y2NfYW5hbHl6ZXI6OkdldERlcHMoc3RkOjptb3ZlKHN0YXRlKSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgT3BNb2RlOjpJTlBVVFM6IHsKKyAgICAgIHJlc3VsdCA9IHN0ZDo6bWFrZV91bmlxdWU8Y2NfYW5hbHl6ZXI6OklkZUFuYWx5c2lzPigKKyAgICAgICAgICB0b29sczo6aWRlX3F1ZXJ5OjpjY19hbmFseXplcjo6R2V0QnVpbGRJbnB1dHMoc3RkOjptb3ZlKHN0YXRlKSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBsbHZtOjplcnJzKCkgPDwgIlVua25vd24gb3BlcmF0aW9uIG1vZGUhXG4iOworICAgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKCFyZXN1bHQtPlNlcmlhbGl6ZVRvRmlsZURlc2NyaXB0b3IoU1RET1VUX0ZJTEVOTykpIHsKKyAgICBsbHZtOjplcnJzKCkgPDwgIkZhaWxlZCB0byBzZXJpYWxpemUgcmVzdWx0IVxuIjsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyX3Byb3RvL0FuZHJvaWQuYnAgYi90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXJfcHJvdG8vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWQwN2I0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyX3Byb3RvL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKK30KKworY2NfbGlicmFyeV9ob3N0X3N0YXRpYyB7CisgICAgbmFtZTogImNjX2FuYWx5emVyX3Byb3RvIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJjY19hbmFseXplci5wcm90byIsCisgICAgXSwKKyAgICBwcm90bzogeworICAgICAgICBleHBvcnRfcHJvdG9faGVhZGVyczogdHJ1ZSwKKyAgICAgICAgdHlwZTogImZ1bGwiLAorICAgICAgICBjYW5vbmljYWxfcGF0aF9mcm9tX3Jvb3Q6IGZhbHNlLAorICAgIH0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjY0IiwKKyAgICBzaGFyZWRfbGliczogWyJsaWJwcm90b2J1Zi1jcHAtZnVsbCJdLAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyX3Byb3RvL2NjX2FuYWx5emVyLnBiLmdvIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyX3Byb3RvL2NjX2FuYWx5emVyLnBiLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYmU1YzAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXJfcHJvdG8vY2NfYW5hbHl6ZXIucGIuZ28KQEAgLTAsMCArMSw3ODkgQEAKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gQ29kZSBnZW5lcmF0ZWQgYnkgcHJvdG9jLWdlbi1nby4gRE8gTk9UIEVESVQuCisvLyB2ZXJzaW9uczoKKy8vIAlwcm90b2MtZ2VuLWdvIHYxLjMwLjAKKy8vIAlwcm90b2MgICAgICAgIHYzLjIxLjEyCisvLyBzb3VyY2U6IGNjX2FuYWx5emVyLnByb3RvCisKK3BhY2thZ2UgY2NfYW5hbHl6ZXJfcHJvdG8KKworaW1wb3J0ICgKKwlwcm90b3JlZmxlY3QgImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgorCXByb3RvaW1wbCAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcnVudGltZS9wcm90b2ltcGwiCisJcmVmbGVjdCAicmVmbGVjdCIKKwlzeW5jICJzeW5jIgorKQorCitjb25zdCAoCisJLy8gVmVyaWZ5IHRoYXQgdGhpcyBnZW5lcmF0ZWQgY29kZSBpcyBzdWZmaWNpZW50bHkgdXAtdG8tZGF0ZS4KKwlfID0gcHJvdG9pbXBsLkVuZm9yY2VWZXJzaW9uKDIwIC0gcHJvdG9pbXBsLk1pblZlcnNpb24pCisJLy8gVmVyaWZ5IHRoYXQgcnVudGltZS9wcm90b2ltcGwgaXMgc3VmZmljaWVudGx5IHVwLXRvLWRhdGUuCisJXyA9IHByb3RvaW1wbC5FbmZvcmNlVmVyc2lvbihwcm90b2ltcGwuTWF4VmVyc2lvbiAtIDIwKQorKQorCit0eXBlIFN0YXR1c19Db2RlIGludDMyCisKK2NvbnN0ICgKKwlTdGF0dXNfT0sgICAgICBTdGF0dXNfQ29kZSA9IDAKKwlTdGF0dXNfRkFJTFVSRSBTdGF0dXNfQ29kZSA9IDEKKykKKworLy8gRW51bSB2YWx1ZSBtYXBzIGZvciBTdGF0dXNfQ29kZS4KK3ZhciAoCisJU3RhdHVzX0NvZGVfbmFtZSA9IG1hcFtpbnQzMl1zdHJpbmd7CisJCTA6ICJPSyIsCisJCTE6ICJGQUlMVVJFIiwKKwl9CisJU3RhdHVzX0NvZGVfdmFsdWUgPSBtYXBbc3RyaW5nXWludDMyeworCQkiT0siOiAgICAgIDAsCisJCSJGQUlMVVJFIjogMSwKKwl9CispCisKK2Z1bmMgKHggU3RhdHVzX0NvZGUpIEVudW0oKSAqU3RhdHVzX0NvZGUgeworCXAgOj0gbmV3KFN0YXR1c19Db2RlKQorCSpwID0geAorCXJldHVybiBwCit9CisKK2Z1bmMgKHggU3RhdHVzX0NvZGUpIFN0cmluZygpIHN0cmluZyB7CisJcmV0dXJuIHByb3RvaW1wbC5YLkVudW1TdHJpbmdPZih4LkRlc2NyaXB0b3IoKSwgcHJvdG9yZWZsZWN0LkVudW1OdW1iZXIoeCkpCit9CisKK2Z1bmMgKFN0YXR1c19Db2RlKSBEZXNjcmlwdG9yKCkgcHJvdG9yZWZsZWN0LkVudW1EZXNjcmlwdG9yIHsKKwlyZXR1cm4gZmlsZV9jY19hbmFseXplcl9wcm90b19lbnVtVHlwZXNbMF0uRGVzY3JpcHRvcigpCit9CisKK2Z1bmMgKFN0YXR1c19Db2RlKSBUeXBlKCkgcHJvdG9yZWZsZWN0LkVudW1UeXBlIHsKKwlyZXR1cm4gJmZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fZW51bVR5cGVzWzBdCit9CisKK2Z1bmMgKHggU3RhdHVzX0NvZGUpIE51bWJlcigpIHByb3RvcmVmbGVjdC5FbnVtTnVtYmVyIHsKKwlyZXR1cm4gcHJvdG9yZWZsZWN0LkVudW1OdW1iZXIoeCkKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIFN0YXR1c19Db2RlLkRlc2NyaXB0b3IgaW5zdGVhZC4KK2Z1bmMgKFN0YXR1c19Db2RlKSBFbnVtRGVzY3JpcHRvcigpIChbXWJ5dGUsIFtdaW50KSB7CisJcmV0dXJuIGZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fcmF3RGVzY0daSVAoKSwgW11pbnR7MCwgMH0KK30KKworLy8gSW5kaWNhdGVzIHRoZSBzdWNjZXNzL2ZhaWx1cmUgZm9yIGFuYWx5c2lzLgordHlwZSBTdGF0dXMgc3RydWN0IHsKKwlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKKwlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKKwl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCisKKwlDb2RlIFN0YXR1c19Db2RlIGBwcm90b2J1ZjoidmFyaW50LDEsb3B0LG5hbWU9Y29kZSxwcm90bzMsZW51bT1jY19hbmFseXplci5TdGF0dXNfQ29kZSIganNvbjoiY29kZSxvbWl0ZW1wdHkiYAorCS8vIERldGFpbHMgYWJvdXQgdGhlIHN0YXR1cywgbWlnaHQgYmUgZGlzcGxheWVkIHRvIHVzZXIuCisJTWVzc2FnZSAqc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMixvcHQsbmFtZT1tZXNzYWdlLHByb3RvMyxvbmVvZiIganNvbjoibWVzc2FnZSxvbWl0ZW1wdHkiYAorfQorCitmdW5jICh4ICpTdGF0dXMpIFJlc2V0KCkgeworCSp4ID0gU3RhdHVze30KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCB7CisJCW1pIDo9ICZmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzWzBdCisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCX0KK30KKworZnVuYyAoeCAqU3RhdHVzKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKlN0YXR1cykgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqU3RhdHVzKSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7CisJbWkgOj0gJmZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbMF0KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7CisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgeworCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwkJfQorCQlyZXR1cm4gbXMKKwl9CisJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgU3RhdHVzLlByb3RvUmVmbGVjdC5EZXNjcmlwdG9yIGluc3RlYWQuCitmdW5jICgqU3RhdHVzKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKwlyZXR1cm4gZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHswfQorfQorCitmdW5jICh4ICpTdGF0dXMpIEdldENvZGUoKSBTdGF0dXNfQ29kZSB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5Db2RlCisJfQorCXJldHVybiBTdGF0dXNfT0sKK30KKworZnVuYyAoeCAqU3RhdHVzKSBHZXRNZXNzYWdlKCkgc3RyaW5nIHsKKwlpZiB4ICE9IG5pbCAmJiB4Lk1lc3NhZ2UgIT0gbmlsIHsKKwkJcmV0dXJuICp4Lk1lc3NhZ2UKKwl9CisJcmV0dXJuICIiCit9CisKKy8vIFJlcHJlc2VudHMgYW4gQW5kcm9pZCBjaGVja291dCBvbiB1c2VyJ3Mgd29ya3N0YXRpb24uCit0eXBlIFJlcG9TdGF0ZSBzdHJ1Y3QgeworCXN0YXRlICAgICAgICAgcHJvdG9pbXBsLk1lc3NhZ2VTdGF0ZQorCXNpemVDYWNoZSAgICAgcHJvdG9pbXBsLlNpemVDYWNoZQorCXVua25vd25GaWVsZHMgcHJvdG9pbXBsLlVua25vd25GaWVsZHMKKworCS8vIEFic29sdXRlIHBhdGggZm9yIHRoZSBjaGVja291dCBpbiB0aGUgd29ya3N0YXRpb24uCisJLy8gZS5nLiAvaG9tZS91c2VyL3dvcmsvYW5kcm9pZC8KKwlSZXBvRGlyIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDEsb3B0LG5hbWU9cmVwb19kaXIsanNvbj1yZXBvRGlyLHByb3RvMyIganNvbjoicmVwb19kaXIsb21pdGVtcHR5ImAKKwkvLyBSZWxhdGl2ZSB0byByZXBvX2Rpci4KKwlBY3RpdmVGaWxlUGF0aCBbXXN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDIscmVwLG5hbWU9YWN0aXZlX2ZpbGVfcGF0aCxqc29uPWFjdGl2ZUZpbGVQYXRoLHByb3RvMyIganNvbjoiYWN0aXZlX2ZpbGVfcGF0aCxvbWl0ZW1wdHkiYAorCS8vIFJlcG9zaXRvcnkgcmVsYXRpdmUgcGF0aCB0byBvdXRwdXQgZGlyZWN0b3J5IGluIHdvcmtzdGF0aW9uLgorCU91dERpciBzdHJpbmcgYHByb3RvYnVmOiJieXRlcywzLG9wdCxuYW1lPW91dF9kaXIsanNvbj1vdXREaXIscHJvdG8zIiBqc29uOiJvdXRfZGlyLG9taXRlbXB0eSJgCisJLy8gUmVwb3NpdG9yeSByZWxhdGl2ZSBwYXRoIHRvIGNvbXBpbGVfY29tbWFuZHMuanNvbiBpbiB3b3Jrc3RhdGlvbi4KKwlDb21wRGJQYXRoIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDQsb3B0LG5hbWU9Y29tcF9kYl9wYXRoLGpzb249Y29tcERiUGF0aCxwcm90bzMiIGpzb246ImNvbXBfZGJfcGF0aCxvbWl0ZW1wdHkiYAorfQorCitmdW5jICh4ICpSZXBvU3RhdGUpIFJlc2V0KCkgeworCSp4ID0gUmVwb1N0YXRle30KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCB7CisJCW1pIDo9ICZmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzWzFdCisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCX0KK30KKworZnVuYyAoeCAqUmVwb1N0YXRlKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKlJlcG9TdGF0ZSkgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqUmVwb1N0YXRlKSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7CisJbWkgOj0gJmZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbMV0KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7CisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgeworCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwkJfQorCQlyZXR1cm4gbXMKKwl9CisJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgUmVwb1N0YXRlLlByb3RvUmVmbGVjdC5EZXNjcmlwdG9yIGluc3RlYWQuCitmdW5jICgqUmVwb1N0YXRlKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKwlyZXR1cm4gZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHsxfQorfQorCitmdW5jICh4ICpSZXBvU3RhdGUpIEdldFJlcG9EaXIoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguUmVwb0RpcgorCX0KKwlyZXR1cm4gIiIKK30KKworZnVuYyAoeCAqUmVwb1N0YXRlKSBHZXRBY3RpdmVGaWxlUGF0aCgpIFtdc3RyaW5nIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LkFjdGl2ZUZpbGVQYXRoCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqUmVwb1N0YXRlKSBHZXRPdXREaXIoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguT3V0RGlyCisJfQorCXJldHVybiAiIgorfQorCitmdW5jICh4ICpSZXBvU3RhdGUpIEdldENvbXBEYlBhdGgoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguQ29tcERiUGF0aAorCX0KKwlyZXR1cm4gIiIKK30KKworLy8gUHJvdmlkZXMgYWxsIHRoZSB0YXJnZXRzIHRoYXQgYXJlIHByZS1yZXF1aXNpdGllcyBmb3IgcnVubmluZyBsYW5ndWFnZQorLy8gc2VydmljZXMgb24gYWN0aXZlX2ZpbGVfcGF0aHMuCit0eXBlIERlcHNSZXNwb25zZSBzdHJ1Y3QgeworCXN0YXRlICAgICAgICAgcHJvdG9pbXBsLk1lc3NhZ2VTdGF0ZQorCXNpemVDYWNoZSAgICAgcHJvdG9pbXBsLlNpemVDYWNoZQorCXVua25vd25GaWVsZHMgcHJvdG9pbXBsLlVua25vd25GaWVsZHMKKworCURlcHMgICBbXSpEZXBzUmVzcG9uc2VfRGVwcyBgcHJvdG9idWY6ImJ5dGVzLDEscmVwLG5hbWU9ZGVwcyxwcm90bzMiIGpzb246ImRlcHMsb21pdGVtcHR5ImAKKwlTdGF0dXMgKlN0YXR1cyAgICAgICAgICAgICAgYHByb3RvYnVmOiJieXRlcywyLG9wdCxuYW1lPXN0YXR1cyxwcm90bzMsb25lb2YiIGpzb246InN0YXR1cyxvbWl0ZW1wdHkiYAorfQorCitmdW5jICh4ICpEZXBzUmVzcG9uc2UpIFJlc2V0KCkgeworCSp4ID0gRGVwc1Jlc3BvbnNle30KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCB7CisJCW1pIDo9ICZmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzWzJdCisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCX0KK30KKworZnVuYyAoeCAqRGVwc1Jlc3BvbnNlKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKkRlcHNSZXNwb25zZSkgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqRGVwc1Jlc3BvbnNlKSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7CisJbWkgOj0gJmZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbMl0KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7CisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgeworCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwkJfQorCQlyZXR1cm4gbXMKKwl9CisJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgRGVwc1Jlc3BvbnNlLlByb3RvUmVmbGVjdC5EZXNjcmlwdG9yIGluc3RlYWQuCitmdW5jICgqRGVwc1Jlc3BvbnNlKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKwlyZXR1cm4gZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHsyfQorfQorCitmdW5jICh4ICpEZXBzUmVzcG9uc2UpIEdldERlcHMoKSBbXSpEZXBzUmVzcG9uc2VfRGVwcyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5EZXBzCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqRGVwc1Jlc3BvbnNlKSBHZXRTdGF0dXMoKSAqU3RhdHVzIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LlN0YXR1cworCX0KKwlyZXR1cm4gbmlsCit9CisKKy8vIFJldHVybnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIHByb3ZpZGluZyBsYW5ndWFnZSBzZXJ2aWNlcyBmb3IgdGhlCisvLyBhY3RpdmUgZmlsZXMuCit0eXBlIEdlbmVyYXRlZEZpbGUgc3RydWN0IHsKKwlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKKwlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKKwl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCisKKwkvLyBQYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHJlcG9zaXRvcnkgcm9vdC4KKwlQYXRoIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDEsb3B0LG5hbWU9cGF0aCxwcm90bzMiIGpzb246InBhdGgsb21pdGVtcHR5ImAKKwkvLyBUaGUgdGV4dCBvZiB0aGUgZ2VuZXJhdGVkIGZpbGUsIGlmIG5vdCBwcm92aWRlZCBjb250ZW50cyB3aWxsIGJlIHJlYWQKKwkvLyBmcm9tIHRoZSBwYXRoIGFib3ZlIGluIHVzZXIncyB3b3Jrc3RhdGlvbi4KKwlDb250ZW50cyBbXWJ5dGUgYHByb3RvYnVmOiJieXRlcywyLG9wdCxuYW1lPWNvbnRlbnRzLHByb3RvMyxvbmVvZiIganNvbjoiY29udGVudHMsb21pdGVtcHR5ImAKK30KKworZnVuYyAoeCAqR2VuZXJhdGVkRmlsZSkgUmVzZXQoKSB7CisJKnggPSBHZW5lcmF0ZWRGaWxle30KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCB7CisJCW1pIDo9ICZmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzWzNdCisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCX0KK30KKworZnVuYyAoeCAqR2VuZXJhdGVkRmlsZSkgU3RyaW5nKCkgc3RyaW5nIHsKKwlyZXR1cm4gcHJvdG9pbXBsLlguTWVzc2FnZVN0cmluZ09mKHgpCit9CisKK2Z1bmMgKCpHZW5lcmF0ZWRGaWxlKSBQcm90b01lc3NhZ2UoKSB7fQorCitmdW5jICh4ICpHZW5lcmF0ZWRGaWxlKSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7CisJbWkgOj0gJmZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbM10KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7CisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgeworCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwkJfQorCQlyZXR1cm4gbXMKKwl9CisJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgR2VuZXJhdGVkRmlsZS5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoKkdlbmVyYXRlZEZpbGUpIERlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgeworCXJldHVybiBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2NHWklQKCksIFtdaW50ezN9Cit9CisKK2Z1bmMgKHggKkdlbmVyYXRlZEZpbGUpIEdldFBhdGgoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguUGF0aAorCX0KKwlyZXR1cm4gIiIKK30KKworZnVuYyAoeCAqR2VuZXJhdGVkRmlsZSkgR2V0Q29udGVudHMoKSBbXWJ5dGUgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguQ29udGVudHMKKwl9CisJcmV0dXJuIG5pbAorfQorCit0eXBlIFNvdXJjZUZpbGUgc3RydWN0IHsKKwlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKKwlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKKwl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCisKKwkvLyBQYXRoIHRvIHRoZSBzb3VyY2UgZmlsZSByZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QuCisJUGF0aCBzdHJpbmcgYHByb3RvYnVmOiJieXRlcywxLG9wdCxuYW1lPXBhdGgscHJvdG8zIiBqc29uOiJwYXRoLG9taXRlbXB0eSJgCisJLy8gV29ya2luZyBkaXJlY3RvcnkgdXNlZCBieSB0aGUgYnVpbGQgc3lzdGVtLiBBbGwgdGhlIHJlbGF0aXZlCisJLy8gcGF0aHMgaW4gY29tcGlsZXJfYXJndW1lbnRzIHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGlzIHBhdGguCisJLy8gUmVsYXRpdmUgdG8gcmVwb3NpdG9yeSByb290LgorCVdvcmtpbmdEaXIgc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMixvcHQsbmFtZT13b3JraW5nX2Rpcixqc29uPXdvcmtpbmdEaXIscHJvdG8zIiBqc29uOiJ3b3JraW5nX2RpcixvbWl0ZW1wdHkiYAorCS8vIENvbXBpbGVyIGFyZ3VtZW50cyB0byBjb21waWxlIHRoZSBzb3VyY2UgZmlsZS4gSWYgbXVsdGlwbGUgdmFyaWFudHMKKwkvLyBvZiB0aGUgbW9kdWxlIGJlaW5nIGNvbXBpbGVkIGFyZSBwb3NzaWJsZSwgdGhlIHF1ZXJ5IHNjcmlwdCB3aWxsIGNob29zZQorCS8vIG9uZS4KKwlDb21waWxlckFyZ3VtZW50cyBbXXN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDMscmVwLG5hbWU9Y29tcGlsZXJfYXJndW1lbnRzLGpzb249Y29tcGlsZXJBcmd1bWVudHMscHJvdG8zIiBqc29uOiJjb21waWxlcl9hcmd1bWVudHMsb21pdGVtcHR5ImAKKwkvLyBBbnkgZ2VuZXJhdGVkIGZpbGVzIHRoYXQgYXJlIHVzZWQgaW4gY29tcGlsaW5nIHRoZSBmaWxlLgorCUdlbmVyYXRlZCBbXSpHZW5lcmF0ZWRGaWxlIGBwcm90b2J1ZjoiYnl0ZXMsNCxyZXAsbmFtZT1nZW5lcmF0ZWQscHJvdG8zIiBqc29uOiJnZW5lcmF0ZWQsb21pdGVtcHR5ImAKKwkvLyBQYXRocyB0byBhbGwgb2YgdGhlIHNvdXJjZXMsIGxpa2UgYnVpbGQgZmlsZXMsIGNvZGUgZ2VuZXJhdG9ycywKKwkvLyBwcm90byBmaWxlcyBldGMuIHRoYXQgd2VyZSB1c2VkIGR1cmluZyBhbmFseXNpcy4gVXNlZCB0byBmaWd1cmUKKwkvLyBvdXQgd2hlbiBhIHNldCBvZiBidWlsZCBhcnRpZmFjdHMgYXJlIHN0YWxlIGFuZCB0aGUgcXVlcnkgdG9vbAorCS8vIG11c3QgYmUgcmUtcnVuLgorCS8vIFJlbGF0aXZlIHRvIHJlcG9zaXRvcnkgcm9vdC4KKwlEZXBzIFtdc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsNSxyZXAsbmFtZT1kZXBzLHByb3RvMyIganNvbjoiZGVwcyxvbWl0ZW1wdHkiYAorCS8vIFJlcHJlc2VudHMgYW5hbHlzaXMgc3RhdHVzIGZvciB0aGlzIHBhcnRpY3VsYXIgZmlsZS4gZS5nLiBub3QgcGFydAorCS8vIG9mIHRoZSBidWlsZCBncmFwaC4KKwlTdGF0dXMgKlN0YXR1cyBgcHJvdG9idWY6ImJ5dGVzLDYsb3B0LG5hbWU9c3RhdHVzLHByb3RvMyxvbmVvZiIganNvbjoic3RhdHVzLG9taXRlbXB0eSJgCit9CisKK2Z1bmMgKHggKlNvdXJjZUZpbGUpIFJlc2V0KCkgeworCSp4ID0gU291cmNlRmlsZXt9CisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgeworCQltaSA6PSAmZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1s0XQorCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKKwkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwl9Cit9CisKK2Z1bmMgKHggKlNvdXJjZUZpbGUpIFN0cmluZygpIHN0cmluZyB7CisJcmV0dXJuIHByb3RvaW1wbC5YLk1lc3NhZ2VTdHJpbmdPZih4KQorfQorCitmdW5jICgqU291cmNlRmlsZSkgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqU291cmNlRmlsZSkgUHJvdG9SZWZsZWN0KCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2UgeworCW1pIDo9ICZmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzWzRdCisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgJiYgeCAhPSBuaWwgeworCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKKwkJaWYgbXMuTG9hZE1lc3NhZ2VJbmZvKCkgPT0gbmlsIHsKKwkJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJCX0KKwkJcmV0dXJuIG1zCisJfQorCXJldHVybiBtaS5NZXNzYWdlT2YoeCkKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIFNvdXJjZUZpbGUuUHJvdG9SZWZsZWN0LkRlc2NyaXB0b3IgaW5zdGVhZC4KK2Z1bmMgKCpTb3VyY2VGaWxlKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKwlyZXR1cm4gZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHs0fQorfQorCitmdW5jICh4ICpTb3VyY2VGaWxlKSBHZXRQYXRoKCkgc3RyaW5nIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LlBhdGgKKwl9CisJcmV0dXJuICIiCit9CisKK2Z1bmMgKHggKlNvdXJjZUZpbGUpIEdldFdvcmtpbmdEaXIoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguV29ya2luZ0RpcgorCX0KKwlyZXR1cm4gIiIKK30KKworZnVuYyAoeCAqU291cmNlRmlsZSkgR2V0Q29tcGlsZXJBcmd1bWVudHMoKSBbXXN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5Db21waWxlckFyZ3VtZW50cworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKlNvdXJjZUZpbGUpIEdldEdlbmVyYXRlZCgpIFtdKkdlbmVyYXRlZEZpbGUgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguR2VuZXJhdGVkCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqU291cmNlRmlsZSkgR2V0RGVwcygpIFtdc3RyaW5nIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LkRlcHMKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jICh4ICpTb3VyY2VGaWxlKSBHZXRTdGF0dXMoKSAqU3RhdHVzIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LlN0YXR1cworCX0KKwlyZXR1cm4gbmlsCit9CisKK3R5cGUgSWRlQW5hbHlzaXMgc3RydWN0IHsKKwlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKKwlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKKwl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCisKKwlTb3VyY2VzIFtdKlNvdXJjZUZpbGUgYHByb3RvYnVmOiJieXRlcywyLHJlcCxuYW1lPXNvdXJjZXMscHJvdG8zIiBqc29uOiJzb3VyY2VzLG9taXRlbXB0eSJgCisJLy8gU3RhdHVzIHJlcHJlc2VudGluZyBvdmVyYWxsIGFuYWx5c2lzLgorCS8vIFNob3VsZCBmYWlsIG9ubHkgd2hlbiBubyBhbmFseXNpcyBjYW4gYmUgcGVyZm9ybWVkLgorCVN0YXR1cyAqU3RhdHVzIGBwcm90b2J1ZjoiYnl0ZXMsMyxvcHQsbmFtZT1zdGF0dXMscHJvdG8zLG9uZW9mIiBqc29uOiJzdGF0dXMsb21pdGVtcHR5ImAKK30KKworZnVuYyAoeCAqSWRlQW5hbHlzaXMpIFJlc2V0KCkgeworCSp4ID0gSWRlQW5hbHlzaXN7fQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKKwkJbWkgOj0gJmZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbNV0KKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJfQorfQorCitmdW5jICh4ICpJZGVBbmFseXNpcykgU3RyaW5nKCkgc3RyaW5nIHsKKwlyZXR1cm4gcHJvdG9pbXBsLlguTWVzc2FnZVN0cmluZ09mKHgpCit9CisKK2Z1bmMgKCpJZGVBbmFseXNpcykgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqSWRlQW5hbHlzaXMpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKKwltaSA6PSAmZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1s1XQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkICYmIHggIT0gbmlsIHsKKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCWlmIG1zLkxvYWRNZXNzYWdlSW5mbygpID09IG5pbCB7CisJCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCQl9CisJCXJldHVybiBtcworCX0KKwlyZXR1cm4gbWkuTWVzc2FnZU9mKHgpCit9CisKKy8vIERlcHJlY2F0ZWQ6IFVzZSBJZGVBbmFseXNpcy5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoKklkZUFuYWx5c2lzKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKwlyZXR1cm4gZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHs1fQorfQorCitmdW5jICh4ICpJZGVBbmFseXNpcykgR2V0U291cmNlcygpIFtdKlNvdXJjZUZpbGUgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguU291cmNlcworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKklkZUFuYWx5c2lzKSBHZXRTdGF0dXMoKSAqU3RhdHVzIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LlN0YXR1cworCX0KKwlyZXR1cm4gbmlsCit9CisKKy8vIEJ1aWxkIGRlcGVuZGVuY2llcyBvZiBhIHNvdXJjZSBmaWxlIGZvciBwcm92aWRpbmcgbGFuZ3VhZ2Ugc2VydmljZXMuCit0eXBlIERlcHNSZXNwb25zZV9EZXBzIHN0cnVjdCB7CisJc3RhdGUgICAgICAgICBwcm90b2ltcGwuTWVzc2FnZVN0YXRlCisJc2l6ZUNhY2hlICAgICBwcm90b2ltcGwuU2l6ZUNhY2hlCisJdW5rbm93bkZpZWxkcyBwcm90b2ltcGwuVW5rbm93bkZpZWxkcworCisJLy8gUmVsYXRpdmUgdG8gcmVwb19kaXIuCisJU291cmNlRmlsZSBzdHJpbmcgYHByb3RvYnVmOiJieXRlcywxLG9wdCxuYW1lPXNvdXJjZV9maWxlLGpzb249c291cmNlRmlsZSxwcm90bzMiIGpzb246InNvdXJjZV9maWxlLG9taXRlbXB0eSJgCisJLy8gQnVpbGQgdGFyZ2V0IHRvIGV4ZWN1dGUgZm9yIGdlbmVyYXRpbmcgZGVwLgorCUJ1aWxkVGFyZ2V0IFtdc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMixyZXAsbmFtZT1idWlsZF90YXJnZXQsanNvbj1idWlsZFRhcmdldCxwcm90bzMiIGpzb246ImJ1aWxkX3RhcmdldCxvbWl0ZW1wdHkiYAorCVN0YXR1cyAgICAgICpTdGF0dXMgIGBwcm90b2J1ZjoiYnl0ZXMsMyxvcHQsbmFtZT1zdGF0dXMscHJvdG8zLG9uZW9mIiBqc29uOiJzdGF0dXMsb21pdGVtcHR5ImAKK30KKworZnVuYyAoeCAqRGVwc1Jlc3BvbnNlX0RlcHMpIFJlc2V0KCkgeworCSp4ID0gRGVwc1Jlc3BvbnNlX0RlcHN7fQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKKwkJbWkgOj0gJmZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbNl0KKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJfQorfQorCitmdW5jICh4ICpEZXBzUmVzcG9uc2VfRGVwcykgU3RyaW5nKCkgc3RyaW5nIHsKKwlyZXR1cm4gcHJvdG9pbXBsLlguTWVzc2FnZVN0cmluZ09mKHgpCit9CisKK2Z1bmMgKCpEZXBzUmVzcG9uc2VfRGVwcykgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqRGVwc1Jlc3BvbnNlX0RlcHMpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKKwltaSA6PSAmZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1s2XQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkICYmIHggIT0gbmlsIHsKKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCWlmIG1zLkxvYWRNZXNzYWdlSW5mbygpID09IG5pbCB7CisJCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCQl9CisJCXJldHVybiBtcworCX0KKwlyZXR1cm4gbWkuTWVzc2FnZU9mKHgpCit9CisKKy8vIERlcHJlY2F0ZWQ6IFVzZSBEZXBzUmVzcG9uc2VfRGVwcy5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoKkRlcHNSZXNwb25zZV9EZXBzKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKwlyZXR1cm4gZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHsyLCAwfQorfQorCitmdW5jICh4ICpEZXBzUmVzcG9uc2VfRGVwcykgR2V0U291cmNlRmlsZSgpIHN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5Tb3VyY2VGaWxlCisJfQorCXJldHVybiAiIgorfQorCitmdW5jICh4ICpEZXBzUmVzcG9uc2VfRGVwcykgR2V0QnVpbGRUYXJnZXQoKSBbXXN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5CdWlsZFRhcmdldAorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKkRlcHNSZXNwb25zZV9EZXBzKSBHZXRTdGF0dXMoKSAqU3RhdHVzIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LlN0YXR1cworCX0KKwlyZXR1cm4gbmlsCit9CisKK3ZhciBGaWxlX2NjX2FuYWx5emVyX3Byb3RvIHByb3RvcmVmbGVjdC5GaWxlRGVzY3JpcHRvcgorCit2YXIgZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjID0gW11ieXRleworCTB4MGEsIDB4MTEsIDB4NjMsIDB4NjMsIDB4NWYsIDB4NjEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4N2EsIDB4NjUsIDB4NzIsIDB4MmUsIDB4NzAsIDB4NzIsCisJMHg2ZiwgMHg3NCwgMHg2ZiwgMHgxMiwgMHgwYiwgMHg2MywgMHg2MywgMHg1ZiwgMHg2MSwgMHg2ZSwgMHg2MSwgMHg2YywgMHg3OSwgMHg3YSwgMHg2NSwgMHg3MiwKKwkweDIyLCAweDdlLCAweDBhLCAweDA2LCAweDUzLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDEyLCAweDJjLCAweDBhLCAweDA0LCAweDYzLCAweDZmLAorCTB4NjQsIDB4NjUsIDB4MTgsIDB4MDEsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MGUsIDB4MzIsIDB4MTgsIDB4MmUsIDB4NjMsIDB4NjMsIDB4NWYsIDB4NjEsIDB4NmUsCisJMHg2MSwgMHg2YywgMHg3OSwgMHg3YSwgMHg2NSwgMHg3MiwgMHgyZSwgMHg1MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHgyZSwgMHg0MywgMHg2ZiwKKwkweDY0LCAweDY1LCAweDUyLCAweDA0LCAweDYzLCAweDZmLCAweDY0LCAweDY1LCAweDEyLCAweDFkLCAweDBhLCAweDA3LCAweDZkLCAweDY1LCAweDczLCAweDczLAorCTB4NjEsIDB4NjcsIDB4NjUsIDB4MTgsIDB4MDIsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MDksIDB4NDgsIDB4MDAsIDB4NTIsIDB4MDcsIDB4NmQsIDB4NjUsIDB4NzMsCisJMHg3MywgMHg2MSwgMHg2NywgMHg2NSwgMHg4OCwgMHgwMSwgMHgwMSwgMHgyMiwgMHgxYiwgMHgwYSwgMHgwNCwgMHg0MywgMHg2ZiwgMHg2NCwgMHg2NSwgMHgxMiwKKwkweDA2LCAweDBhLCAweDAyLCAweDRmLCAweDRiLCAweDEwLCAweDAwLCAweDEyLCAweDBiLCAweDBhLCAweDA3LCAweDQ2LCAweDQxLCAweDQ5LCAweDRjLCAweDU1LAorCTB4NTIsIDB4NDUsIDB4MTAsIDB4MDEsIDB4NDIsIDB4MGEsIDB4MGEsIDB4MDgsIDB4NWYsIDB4NmQsIDB4NjUsIDB4NzMsIDB4NzMsIDB4NjEsIDB4NjcsIDB4NjUsCisJMHgyMiwgMHg4YiwgMHgwMSwgMHgwYSwgMHgwOSwgMHg1MiwgMHg2NSwgMHg3MCwgMHg2ZiwgMHg1MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg2NSwgMHgxMiwgMHgxOSwKKwkweDBhLCAweDA4LCAweDcyLCAweDY1LCAweDcwLCAweDZmLCAweDVmLCAweDY0LCAweDY5LCAweDcyLCAweDE4LCAweDAxLCAweDIwLCAweDAxLCAweDI4LCAweDA5LAorCTB4NTIsIDB4MDcsIDB4NzIsIDB4NjUsIDB4NzAsIDB4NmYsIDB4NDQsIDB4NjksIDB4NzIsIDB4MTIsIDB4MjgsIDB4MGEsIDB4MTAsIDB4NjEsIDB4NjMsIDB4NzQsCisJMHg2OSwgMHg3NiwgMHg2NSwgMHg1ZiwgMHg2NiwgMHg2OSwgMHg2YywgMHg2NSwgMHg1ZiwgMHg3MCwgMHg2MSwgMHg3NCwgMHg2OCwgMHgxOCwgMHgwMiwgMHgyMCwKKwkweDAzLCAweDI4LCAweDA5LCAweDUyLCAweDBlLCAweDYxLCAweDYzLCAweDc0LCAweDY5LCAweDc2LCAweDY1LCAweDQ2LCAweDY5LCAweDZjLCAweDY1LCAweDUwLAorCTB4NjEsIDB4NzQsIDB4NjgsIDB4MTIsIDB4MTcsIDB4MGEsIDB4MDcsIDB4NmYsIDB4NzUsIDB4NzQsIDB4NWYsIDB4NjQsIDB4NjksIDB4NzIsIDB4MTgsIDB4MDMsCisJMHgyMCwgMHgwMSwgMHgyOCwgMHgwOSwgMHg1MiwgMHgwNiwgMHg2ZiwgMHg3NSwgMHg3NCwgMHg0NCwgMHg2OSwgMHg3MiwgMHgxMiwgMHgyMCwgMHgwYSwgMHgwYywKKwkweDYzLCAweDZmLCAweDZkLCAweDcwLCAweDVmLCAweDY0LCAweDYyLCAweDVmLCAweDcwLCAweDYxLCAweDc0LCAweDY4LCAweDE4LCAweDA0LCAweDIwLCAweDAxLAorCTB4MjgsIDB4MDksIDB4NTIsIDB4MGEsIDB4NjMsIDB4NmYsIDB4NmQsIDB4NzAsIDB4NDQsIDB4NjIsIDB4NTAsIDB4NjEsIDB4NzQsIDB4NjgsIDB4MjIsIDB4ODksCisJMHgwMiwgMHgwYSwgMHgwYywgMHg0NCwgMHg2NSwgMHg3MCwgMHg3MywgMHg1MiwgMHg2NSwgMHg3MywgMHg3MCwgMHg2ZiwgMHg2ZSwgMHg3MywgMHg2NSwgMHgxMiwKKwkweDMyLCAweDBhLCAweDA0LCAweDY0LCAweDY1LCAweDcwLCAweDczLCAweDE4LCAweDAxLCAweDIwLCAweDAzLCAweDI4LCAweDBiLCAweDMyLCAweDFlLCAweDJlLAorCTB4NjMsIDB4NjMsIDB4NWYsIDB4NjEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4N2EsIDB4NjUsIDB4NzIsIDB4MmUsIDB4NDQsIDB4NjUsIDB4NzAsIDB4NzMsCisJMHg1MiwgMHg2NSwgMHg3MywgMHg3MCwgMHg2ZiwgMHg2ZSwgMHg3MywgMHg2NSwgMHgyZSwgMHg0NCwgMHg2NSwgMHg3MCwgMHg3MywgMHg1MiwgMHgwNCwgMHg2NCwKKwkweDY1LCAweDcwLCAweDczLCAweDEyLCAweDMwLCAweDBhLCAweDA2LCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDE4LCAweDAyLCAweDIwLAorCTB4MDEsIDB4MjgsIDB4MGIsIDB4MzIsIDB4MTMsIDB4MmUsIDB4NjMsIDB4NjMsIDB4NWYsIDB4NjEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4N2EsIDB4NjUsCisJMHg3MiwgMHgyZSwgMHg1MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHg0OCwgMHgwMCwgMHg1MiwgMHgwNiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwKKwkweDc1LCAweDczLCAweDg4LCAweDAxLCAweDAxLCAweDFhLCAweDg3LCAweDAxLCAweDBhLCAweDA0LCAweDQ0LCAweDY1LCAweDcwLCAweDczLCAweDEyLCAweDFmLAorCTB4MGEsIDB4MGIsIDB4NzMsIDB4NmYsIDB4NzUsIDB4NzIsIDB4NjMsIDB4NjUsIDB4NWYsIDB4NjYsIDB4NjksIDB4NmMsIDB4NjUsIDB4MTgsIDB4MDEsIDB4MjAsCisJMHgwMSwgMHgyOCwgMHgwOSwgMHg1MiwgMHgwYSwgMHg3MywgMHg2ZiwgMHg3NSwgMHg3MiwgMHg2MywgMHg2NSwgMHg0NiwgMHg2OSwgMHg2YywgMHg2NSwgMHgxMiwKKwkweDIxLCAweDBhLCAweDBjLCAweDYyLCAweDc1LCAweDY5LCAweDZjLCAweDY0LCAweDVmLCAweDc0LCAweDYxLCAweDcyLCAweDY3LCAweDY1LCAweDc0LCAweDE4LAorCTB4MDIsIDB4MjAsIDB4MDMsIDB4MjgsIDB4MDksIDB4NTIsIDB4MGIsIDB4NjIsIDB4NzUsIDB4NjksIDB4NmMsIDB4NjQsIDB4NTQsIDB4NjEsIDB4NzIsIDB4NjcsCisJMHg2NSwgMHg3NCwgMHgxMiwgMHgzMCwgMHgwYSwgMHgwNiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHgxOCwgMHgwMywgMHgyMCwgMHgwMSwKKwkweDI4LCAweDBiLCAweDMyLCAweDEzLCAweDJlLCAweDYzLCAweDYzLCAweDVmLCAweDYxLCAweDZlLCAweDYxLCAweDZjLCAweDc5LCAweDdhLCAweDY1LCAweDcyLAorCTB4MmUsIDB4NTMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4NDgsIDB4MDAsIDB4NTIsIDB4MDYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsCisJMHg3MywgMHg4OCwgMHgwMSwgMHgwMSwgMHg0MiwgMHgwOSwgMHgwYSwgMHgwNywgMHg1ZiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHg0MiwKKwkweDA5LCAweDBhLCAweDA3LCAweDVmLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDIyLCAweDUxLCAweDBhLCAweDBkLCAweDQ3LCAweDY1LAorCTB4NmUsIDB4NjUsIDB4NzIsIDB4NjEsIDB4NzQsIDB4NjUsIDB4NjQsIDB4NDYsIDB4NjksIDB4NmMsIDB4NjUsIDB4MTIsIDB4MTIsIDB4MGEsIDB4MDQsIDB4NzAsCisJMHg2MSwgMHg3NCwgMHg2OCwgMHgxOCwgMHgwMSwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwOSwgMHg1MiwgMHgwNCwgMHg3MCwgMHg2MSwgMHg3NCwgMHg2OCwgMHgxMiwKKwkweDFmLCAweDBhLCAweDA4LCAweDYzLCAweDZmLCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDc0LCAweDczLCAweDE4LCAweDAyLCAweDIwLCAweDAxLCAweDI4LAorCTB4MGMsIDB4NDgsIDB4MDAsIDB4NTIsIDB4MDgsIDB4NjMsIDB4NmYsIDB4NmUsIDB4NzQsIDB4NjUsIDB4NmUsIDB4NzQsIDB4NzMsIDB4ODgsIDB4MDEsIDB4MDEsCisJMHg0MiwgMHgwYiwgMHgwYSwgMHgwOSwgMHg1ZiwgMHg2MywgMHg2ZiwgMHg2ZSwgMHg3NCwgMHg2NSwgMHg2ZSwgMHg3NCwgMHg3MywgMHgyMiwgMHhmYiwgMHgwMSwKKwkweDBhLCAweDBhLCAweDUzLCAweDZmLCAweDc1LCAweDcyLCAweDYzLCAweDY1LCAweDQ2LCAweDY5LCAweDZjLCAweDY1LCAweDEyLCAweDEyLCAweDBhLCAweDA0LAorCTB4NzAsIDB4NjEsIDB4NzQsIDB4NjgsIDB4MTgsIDB4MDEsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MDksIDB4NTIsIDB4MDQsIDB4NzAsIDB4NjEsIDB4NzQsIDB4NjgsCisJMHgxMiwgMHgxZiwgMHgwYSwgMHgwYiwgMHg3NywgMHg2ZiwgMHg3MiwgMHg2YiwgMHg2OSwgMHg2ZSwgMHg2NywgMHg1ZiwgMHg2NCwgMHg2OSwgMHg3MiwgMHgxOCwKKwkweDAyLCAweDIwLCAweDAxLCAweDI4LCAweDA5LCAweDUyLCAweDBhLCAweDc3LCAweDZmLCAweDcyLCAweDZiLCAweDY5LCAweDZlLCAweDY3LCAweDQ0LCAweDY5LAorCTB4NzIsIDB4MTIsIDB4MmQsIDB4MGEsIDB4MTIsIDB4NjMsIDB4NmYsIDB4NmQsIDB4NzAsIDB4NjksIDB4NmMsIDB4NjUsIDB4NzIsIDB4NWYsIDB4NjEsIDB4NzIsCisJMHg2NywgMHg3NSwgMHg2ZCwgMHg2NSwgMHg2ZSwgMHg3NCwgMHg3MywgMHgxOCwgMHgwMywgMHgyMCwgMHgwMywgMHgyOCwgMHgwOSwgMHg1MiwgMHgxMSwgMHg2MywKKwkweDZmLCAweDZkLCAweDcwLCAweDY5LCAweDZjLCAweDY1LCAweDcyLCAweDQxLCAweDcyLCAweDY3LCAweDc1LCAweDZkLCAweDY1LCAweDZlLCAweDc0LCAweDczLAorCTB4MTIsIDB4MzgsIDB4MGEsIDB4MDksIDB4NjcsIDB4NjUsIDB4NmUsIDB4NjUsIDB4NzIsIDB4NjEsIDB4NzQsIDB4NjUsIDB4NjQsIDB4MTgsIDB4MDQsIDB4MjAsCisJMHgwMywgMHgyOCwgMHgwYiwgMHgzMiwgMHgxYSwgMHgyZSwgMHg2MywgMHg2MywgMHg1ZiwgMHg2MSwgMHg2ZSwgMHg2MSwgMHg2YywgMHg3OSwgMHg3YSwgMHg2NSwKKwkweDcyLCAweDJlLCAweDQ3LCAweDY1LCAweDZlLCAweDY1LCAweDcyLCAweDYxLCAweDc0LCAweDY1LCAweDY0LCAweDQ2LCAweDY5LCAweDZjLCAweDY1LCAweDUyLAorCTB4MDksIDB4NjcsIDB4NjUsIDB4NmUsIDB4NjUsIDB4NzIsIDB4NjEsIDB4NzQsIDB4NjUsIDB4NjQsIDB4MTIsIDB4MTIsIDB4MGEsIDB4MDQsIDB4NjQsIDB4NjUsCisJMHg3MCwgMHg3MywgMHgxOCwgMHgwNSwgMHgyMCwgMHgwMywgMHgyOCwgMHgwOSwgMHg1MiwgMHgwNCwgMHg2NCwgMHg2NSwgMHg3MCwgMHg3MywgMHgxMiwgMHgzMCwKKwkweDBhLCAweDA2LCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDE4LCAweDA2LCAweDIwLCAweDAxLCAweDI4LCAweDBiLCAweDMyLCAweDEzLAorCTB4MmUsIDB4NjMsIDB4NjMsIDB4NWYsIDB4NjEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4N2EsIDB4NjUsIDB4NzIsIDB4MmUsIDB4NTMsIDB4NzQsIDB4NjEsCisJMHg3NCwgMHg3NSwgMHg3MywgMHg0OCwgMHgwMCwgMHg1MiwgMHgwNiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHg4OCwgMHgwMSwgMHgwMSwKKwkweDQyLCAweDA5LCAweDBhLCAweDA3LCAweDVmLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDIyLCAweDgzLCAweDAxLCAweDBhLCAweDBiLAorCTB4NDksIDB4NjQsIDB4NjUsIDB4NDEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4NzMsIDB4NjksIDB4NzMsIDB4MTIsIDB4MzEsIDB4MGEsIDB4MDcsIDB4NzMsCisJMHg2ZiwgMHg3NSwgMHg3MiwgMHg2MywgMHg2NSwgMHg3MywgMHgxOCwgMHgwMiwgMHgyMCwgMHgwMywgMHgyOCwgMHgwYiwgMHgzMiwgMHgxNywgMHgyZSwgMHg2MywKKwkweDYzLCAweDVmLCAweDYxLCAweDZlLCAweDYxLCAweDZjLCAweDc5LCAweDdhLCAweDY1LCAweDcyLCAweDJlLCAweDUzLCAweDZmLCAweDc1LCAweDcyLCAweDYzLAorCTB4NjUsIDB4NDYsIDB4NjksIDB4NmMsIDB4NjUsIDB4NTIsIDB4MDcsIDB4NzMsIDB4NmYsIDB4NzUsIDB4NzIsIDB4NjMsIDB4NjUsIDB4NzMsIDB4MTIsIDB4MzAsCisJMHgwYSwgMHgwNiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHgxOCwgMHgwMywgMHgyMCwgMHgwMSwgMHgyOCwgMHgwYiwgMHgzMiwgMHgxMywKKwkweDJlLCAweDYzLCAweDYzLCAweDVmLCAweDYxLCAweDZlLCAweDYxLCAweDZjLCAweDc5LCAweDdhLCAweDY1LCAweDcyLCAweDJlLCAweDUzLCAweDc0LCAweDYxLAorCTB4NzQsIDB4NzUsIDB4NzMsIDB4NDgsIDB4MDAsIDB4NTIsIDB4MDYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4ODgsIDB4MDEsIDB4MDEsCisJMHg0MiwgMHgwOSwgMHgwYSwgMHgwNywgMHg1ZiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHg0YSwgMHgwNCwgMHgwOCwgMHgwMSwgMHgxMCwKKwkweDAyLCAweDQyLCAweDFkLCAweDVhLCAweDFiLCAweDY5LCAweDY0LCAweDY1LCAweDVmLCAweDcxLCAweDc1LCAweDY1LCAweDcyLCAweDc5LCAweDJmLCAweDYzLAorCTB4NjMsIDB4NWYsIDB4NjEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4N2EsIDB4NjUsIDB4NzIsIDB4NWYsIDB4NzAsIDB4NzIsIDB4NmYsIDB4NzQsIDB4NmYsCisJMHg2MiwgMHgwNiwgMHg3MCwgMHg3MiwgMHg2ZiwgMHg3NCwgMHg2ZiwgMHgzMywKK30KKwordmFyICgKKwlmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2NPbmNlIHN5bmMuT25jZQorCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fcmF3RGVzY0RhdGEgPSBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2MKKykKKworZnVuYyBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2NHWklQKCkgW11ieXRlIHsKKwlmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2NPbmNlLkRvKGZ1bmMoKSB7CisJCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fcmF3RGVzY0RhdGEgPSBwcm90b2ltcGwuWC5Db21wcmVzc0daSVAoZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjRGF0YSkKKwl9KQorCXJldHVybiBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2NEYXRhCit9CisKK3ZhciBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX2VudW1UeXBlcyA9IG1ha2UoW11wcm90b2ltcGwuRW51bUluZm8sIDEpCit2YXIgZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlcyA9IG1ha2UoW11wcm90b2ltcGwuTWVzc2FnZUluZm8sIDcpCit2YXIgZmlsZV9jY19hbmFseXplcl9wcm90b19nb1R5cGVzID0gW11pbnRlcmZhY2V7fXsKKwkoU3RhdHVzX0NvZGUpKDApLCAgICAgICAgICAvLyAwOiBjY19hbmFseXplci5TdGF0dXMuQ29kZQorCSgqU3RhdHVzKShuaWwpLCAgICAgICAgICAgIC8vIDE6IGNjX2FuYWx5emVyLlN0YXR1cworCSgqUmVwb1N0YXRlKShuaWwpLCAgICAgICAgIC8vIDI6IGNjX2FuYWx5emVyLlJlcG9TdGF0ZQorCSgqRGVwc1Jlc3BvbnNlKShuaWwpLCAgICAgIC8vIDM6IGNjX2FuYWx5emVyLkRlcHNSZXNwb25zZQorCSgqR2VuZXJhdGVkRmlsZSkobmlsKSwgICAgIC8vIDQ6IGNjX2FuYWx5emVyLkdlbmVyYXRlZEZpbGUKKwkoKlNvdXJjZUZpbGUpKG5pbCksICAgICAgICAvLyA1OiBjY19hbmFseXplci5Tb3VyY2VGaWxlCisJKCpJZGVBbmFseXNpcykobmlsKSwgICAgICAgLy8gNjogY2NfYW5hbHl6ZXIuSWRlQW5hbHlzaXMKKwkoKkRlcHNSZXNwb25zZV9EZXBzKShuaWwpLCAvLyA3OiBjY19hbmFseXplci5EZXBzUmVzcG9uc2UuRGVwcworfQordmFyIGZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fZGVwSWR4cyA9IFtdaW50MzJ7CisJMCwgLy8gMDogY2NfYW5hbHl6ZXIuU3RhdHVzLmNvZGU6dHlwZV9uYW1lIC0+IGNjX2FuYWx5emVyLlN0YXR1cy5Db2RlCisJNywgLy8gMTogY2NfYW5hbHl6ZXIuRGVwc1Jlc3BvbnNlLmRlcHM6dHlwZV9uYW1lIC0+IGNjX2FuYWx5emVyLkRlcHNSZXNwb25zZS5EZXBzCisJMSwgLy8gMjogY2NfYW5hbHl6ZXIuRGVwc1Jlc3BvbnNlLnN0YXR1czp0eXBlX25hbWUgLT4gY2NfYW5hbHl6ZXIuU3RhdHVzCisJNCwgLy8gMzogY2NfYW5hbHl6ZXIuU291cmNlRmlsZS5nZW5lcmF0ZWQ6dHlwZV9uYW1lIC0+IGNjX2FuYWx5emVyLkdlbmVyYXRlZEZpbGUKKwkxLCAvLyA0OiBjY19hbmFseXplci5Tb3VyY2VGaWxlLnN0YXR1czp0eXBlX25hbWUgLT4gY2NfYW5hbHl6ZXIuU3RhdHVzCisJNSwgLy8gNTogY2NfYW5hbHl6ZXIuSWRlQW5hbHlzaXMuc291cmNlczp0eXBlX25hbWUgLT4gY2NfYW5hbHl6ZXIuU291cmNlRmlsZQorCTEsIC8vIDY6IGNjX2FuYWx5emVyLklkZUFuYWx5c2lzLnN0YXR1czp0eXBlX25hbWUgLT4gY2NfYW5hbHl6ZXIuU3RhdHVzCisJMSwgLy8gNzogY2NfYW5hbHl6ZXIuRGVwc1Jlc3BvbnNlLkRlcHMuc3RhdHVzOnR5cGVfbmFtZSAtPiBjY19hbmFseXplci5TdGF0dXMKKwk4LCAvLyBbODo4XSBpcyB0aGUgc3ViLWxpc3QgZm9yIG1ldGhvZCBvdXRwdXRfdHlwZQorCTgsIC8vIFs4OjhdIGlzIHRoZSBzdWItbGlzdCBmb3IgbWV0aG9kIGlucHV0X3R5cGUKKwk4LCAvLyBbODo4XSBpcyB0aGUgc3ViLWxpc3QgZm9yIGV4dGVuc2lvbiB0eXBlX25hbWUKKwk4LCAvLyBbODo4XSBpcyB0aGUgc3ViLWxpc3QgZm9yIGV4dGVuc2lvbiBleHRlbmRlZQorCTAsIC8vIFswOjhdIGlzIHRoZSBzdWItbGlzdCBmb3IgZmllbGQgdHlwZV9uYW1lCit9CisKK2Z1bmMgaW5pdCgpIHsgZmlsZV9jY19hbmFseXplcl9wcm90b19pbml0KCkgfQorZnVuYyBmaWxlX2NjX2FuYWx5emVyX3Byb3RvX2luaXQoKSB7CisJaWYgRmlsZV9jY19hbmFseXplcl9wcm90byAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisJaWYgIXByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKKwkJZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1swXS5FeHBvcnRlciA9IGZ1bmModiBpbnRlcmZhY2V7fSwgaSBpbnQpIGludGVyZmFjZXt9IHsKKwkJCXN3aXRjaCB2IDo9IHYuKCpTdGF0dXMpOyBpIHsKKwkJCWNhc2UgMDoKKwkJCQlyZXR1cm4gJnYuc3RhdGUKKwkJCWNhc2UgMToKKwkJCQlyZXR1cm4gJnYuc2l6ZUNhY2hlCisJCQljYXNlIDI6CisJCQkJcmV0dXJuICZ2LnVua25vd25GaWVsZHMKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIG5pbAorCQkJfQorCQl9CisJCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbMV0uRXhwb3J0ZXIgPSBmdW5jKHYgaW50ZXJmYWNle30sIGkgaW50KSBpbnRlcmZhY2V7fSB7CisJCQlzd2l0Y2ggdiA6PSB2LigqUmVwb1N0YXRlKTsgaSB7CisJCQljYXNlIDA6CisJCQkJcmV0dXJuICZ2LnN0YXRlCisJCQljYXNlIDE6CisJCQkJcmV0dXJuICZ2LnNpemVDYWNoZQorCQkJY2FzZSAyOgorCQkJCXJldHVybiAmdi51bmtub3duRmllbGRzCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBuaWwKKwkJCX0KKwkJfQorCQlmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzWzJdLkV4cG9ydGVyID0gZnVuYyh2IGludGVyZmFjZXt9LCBpIGludCkgaW50ZXJmYWNle30geworCQkJc3dpdGNoIHYgOj0gdi4oKkRlcHNSZXNwb25zZSk7IGkgeworCQkJY2FzZSAwOgorCQkJCXJldHVybiAmdi5zdGF0ZQorCQkJY2FzZSAxOgorCQkJCXJldHVybiAmdi5zaXplQ2FjaGUKKwkJCWNhc2UgMjoKKwkJCQlyZXR1cm4gJnYudW5rbm93bkZpZWxkcworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gbmlsCisJCQl9CisJCX0KKwkJZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlc1szXS5FeHBvcnRlciA9IGZ1bmModiBpbnRlcmZhY2V7fSwgaSBpbnQpIGludGVyZmFjZXt9IHsKKwkJCXN3aXRjaCB2IDo9IHYuKCpHZW5lcmF0ZWRGaWxlKTsgaSB7CisJCQljYXNlIDA6CisJCQkJcmV0dXJuICZ2LnN0YXRlCisJCQljYXNlIDE6CisJCQkJcmV0dXJuICZ2LnNpemVDYWNoZQorCQkJY2FzZSAyOgorCQkJCXJldHVybiAmdi51bmtub3duRmllbGRzCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBuaWwKKwkJCX0KKwkJfQorCQlmaWxlX2NjX2FuYWx5emVyX3Byb3RvX21zZ1R5cGVzWzRdLkV4cG9ydGVyID0gZnVuYyh2IGludGVyZmFjZXt9LCBpIGludCkgaW50ZXJmYWNle30geworCQkJc3dpdGNoIHYgOj0gdi4oKlNvdXJjZUZpbGUpOyBpIHsKKwkJCWNhc2UgMDoKKwkJCQlyZXR1cm4gJnYuc3RhdGUKKwkJCWNhc2UgMToKKwkJCQlyZXR1cm4gJnYuc2l6ZUNhY2hlCisJCQljYXNlIDI6CisJCQkJcmV0dXJuICZ2LnVua25vd25GaWVsZHMKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIG5pbAorCQkJfQorCQl9CisJCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbNV0uRXhwb3J0ZXIgPSBmdW5jKHYgaW50ZXJmYWNle30sIGkgaW50KSBpbnRlcmZhY2V7fSB7CisJCQlzd2l0Y2ggdiA6PSB2LigqSWRlQW5hbHlzaXMpOyBpIHsKKwkJCWNhc2UgMDoKKwkJCQlyZXR1cm4gJnYuc3RhdGUKKwkJCWNhc2UgMToKKwkJCQlyZXR1cm4gJnYuc2l6ZUNhY2hlCisJCQljYXNlIDI6CisJCQkJcmV0dXJuICZ2LnVua25vd25GaWVsZHMKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIG5pbAorCQkJfQorCQl9CisJCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbNl0uRXhwb3J0ZXIgPSBmdW5jKHYgaW50ZXJmYWNle30sIGkgaW50KSBpbnRlcmZhY2V7fSB7CisJCQlzd2l0Y2ggdiA6PSB2LigqRGVwc1Jlc3BvbnNlX0RlcHMpOyBpIHsKKwkJCWNhc2UgMDoKKwkJCQlyZXR1cm4gJnYuc3RhdGUKKwkJCWNhc2UgMToKKwkJCQlyZXR1cm4gJnYuc2l6ZUNhY2hlCisJCQljYXNlIDI6CisJCQkJcmV0dXJuICZ2LnVua25vd25GaWVsZHMKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIG5pbAorCQkJfQorCQl9CisJfQorCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbMF0uT25lb2ZXcmFwcGVycyA9IFtdaW50ZXJmYWNle317fQorCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbMl0uT25lb2ZXcmFwcGVycyA9IFtdaW50ZXJmYWNle317fQorCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbM10uT25lb2ZXcmFwcGVycyA9IFtdaW50ZXJmYWNle317fQorCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbNF0uT25lb2ZXcmFwcGVycyA9IFtdaW50ZXJmYWNle317fQorCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbNV0uT25lb2ZXcmFwcGVycyA9IFtdaW50ZXJmYWNle317fQorCWZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fbXNnVHlwZXNbNl0uT25lb2ZXcmFwcGVycyA9IFtdaW50ZXJmYWNle317fQorCXR5cGUgeCBzdHJ1Y3R7fQorCW91dCA6PSBwcm90b2ltcGwuVHlwZUJ1aWxkZXJ7CisJCUZpbGU6IHByb3RvaW1wbC5EZXNjQnVpbGRlcnsKKwkJCUdvUGFja2FnZVBhdGg6IHJlZmxlY3QuVHlwZU9mKHh7fSkuUGtnUGF0aCgpLAorCQkJUmF3RGVzY3JpcHRvcjogZmlsZV9jY19hbmFseXplcl9wcm90b19yYXdEZXNjLAorCQkJTnVtRW51bXM6ICAgICAgMSwKKwkJCU51bU1lc3NhZ2VzOiAgIDcsCisJCQlOdW1FeHRlbnNpb25zOiAwLAorCQkJTnVtU2VydmljZXM6ICAgMCwKKwkJfSwKKwkJR29UeXBlczogICAgICAgICAgIGZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fZ29UeXBlcywKKwkJRGVwZW5kZW5jeUluZGV4ZXM6IGZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fZGVwSWR4cywKKwkJRW51bUluZm9zOiAgICAgICAgIGZpbGVfY2NfYW5hbHl6ZXJfcHJvdG9fZW51bVR5cGVzLAorCQlNZXNzYWdlSW5mb3M6ICAgICAgZmlsZV9jY19hbmFseXplcl9wcm90b19tc2dUeXBlcywKKwl9LkJ1aWxkKCkKKwlGaWxlX2NjX2FuYWx5emVyX3Byb3RvID0gb3V0LkZpbGUKKwlmaWxlX2NjX2FuYWx5emVyX3Byb3RvX3Jhd0Rlc2MgPSBuaWwKKwlmaWxlX2NjX2FuYWx5emVyX3Byb3RvX2dvVHlwZXMgPSBuaWwKKwlmaWxlX2NjX2FuYWx5emVyX3Byb3RvX2RlcElkeHMgPSBuaWwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplcl9wcm90by9jY19hbmFseXplci5wcm90byBiL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplcl9wcm90by9jY19hbmFseXplci5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTRlYjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyX3Byb3RvL2NjX2FuYWx5emVyLnByb3RvCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3N5bnRheCA9ICJwcm90bzMiOworCitwYWNrYWdlIGNjX2FuYWx5emVyOworCitvcHRpb24gZ29fcGFja2FnZSA9ICJpZGVfcXVlcnkvY2NfYW5hbHl6ZXJfcHJvdG8iOworCisvLyBJbmRpY2F0ZXMgdGhlIHN1Y2Nlc3MvZmFpbHVyZSBmb3IgYW5hbHlzaXMuCittZXNzYWdlIFN0YXR1cyB7CisgIGVudW0gQ29kZSB7CisgICAgT0sgPSAwOworICAgIEZBSUxVUkUgPSAxOworICB9CisgIENvZGUgY29kZSA9IDE7CisgIC8vIERldGFpbHMgYWJvdXQgdGhlIHN0YXR1cywgbWlnaHQgYmUgZGlzcGxheWVkIHRvIHVzZXIuCisgIG9wdGlvbmFsIHN0cmluZyBtZXNzYWdlID0gMjsKK30KKworLy8gUmVwcmVzZW50cyBhbiBBbmRyb2lkIGNoZWNrb3V0IG9uIHVzZXIncyB3b3Jrc3RhdGlvbi4KK21lc3NhZ2UgUmVwb1N0YXRlIHsKKyAgLy8gQWJzb2x1dGUgcGF0aCBmb3IgdGhlIGNoZWNrb3V0IGluIHRoZSB3b3Jrc3RhdGlvbi4KKyAgLy8gZS5nLiAvaG9tZS91c2VyL3dvcmsvYW5kcm9pZC8KKyAgc3RyaW5nIHJlcG9fZGlyID0gMTsKKyAgLy8gUmVsYXRpdmUgdG8gcmVwb19kaXIuCisgIHJlcGVhdGVkIHN0cmluZyBhY3RpdmVfZmlsZV9wYXRoID0gMjsKKyAgLy8gUmVwb3NpdG9yeSByZWxhdGl2ZSBwYXRoIHRvIG91dHB1dCBkaXJlY3RvcnkgaW4gd29ya3N0YXRpb24uCisgIHN0cmluZyBvdXRfZGlyID0gMzsKKyAgLy8gUmVwb3NpdG9yeSByZWxhdGl2ZSBwYXRoIHRvIGNvbXBpbGVfY29tbWFuZHMuanNvbiBpbiB3b3Jrc3RhdGlvbi4KKyAgc3RyaW5nIGNvbXBfZGJfcGF0aCA9IDQ7Cit9CisKKy8vIFByb3ZpZGVzIGFsbCB0aGUgdGFyZ2V0cyB0aGF0IGFyZSBwcmUtcmVxdWlzaXRpZXMgZm9yIHJ1bm5pbmcgbGFuZ3VhZ2UKKy8vIHNlcnZpY2VzIG9uIGFjdGl2ZV9maWxlX3BhdGhzLgorbWVzc2FnZSBEZXBzUmVzcG9uc2UgeworICAvLyBCdWlsZCBkZXBlbmRlbmNpZXMgb2YgYSBzb3VyY2UgZmlsZSBmb3IgcHJvdmlkaW5nIGxhbmd1YWdlIHNlcnZpY2VzLgorICBtZXNzYWdlIERlcHMgeworICAgIC8vIFJlbGF0aXZlIHRvIHJlcG9fZGlyLgorICAgIHN0cmluZyBzb3VyY2VfZmlsZSA9IDE7CisgICAgLy8gQnVpbGQgdGFyZ2V0IHRvIGV4ZWN1dGUgZm9yIGdlbmVyYXRpbmcgZGVwLgorICAgIHJlcGVhdGVkIHN0cmluZyBidWlsZF90YXJnZXQgPSAyOworICAgIG9wdGlvbmFsIFN0YXR1cyBzdGF0dXMgPSAzOworICB9CisgIHJlcGVhdGVkIERlcHMgZGVwcyA9IDE7CisgIG9wdGlvbmFsIFN0YXR1cyBzdGF0dXMgPSAyOworfQorCisvLyBSZXR1cm5zIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IGZvciBwcm92aWRpbmcgbGFuZ3VhZ2Ugc2VydmljZXMgZm9yIHRoZQorLy8gYWN0aXZlIGZpbGVzLgorbWVzc2FnZSBHZW5lcmF0ZWRGaWxlIHsKKyAgLy8gUGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QuCisgIHN0cmluZyBwYXRoID0gMTsKKworICAvLyBUaGUgdGV4dCBvZiB0aGUgZ2VuZXJhdGVkIGZpbGUsIGlmIG5vdCBwcm92aWRlZCBjb250ZW50cyB3aWxsIGJlIHJlYWQKKyAgLy8gZnJvbSB0aGUgcGF0aCBhYm92ZSBpbiB1c2VyJ3Mgd29ya3N0YXRpb24uCisgIG9wdGlvbmFsIGJ5dGVzIGNvbnRlbnRzID0gMjsKK30KKworbWVzc2FnZSBTb3VyY2VGaWxlIHsKKyAgLy8gUGF0aCB0byB0aGUgc291cmNlIGZpbGUgcmVsYXRpdmUgdG8gcmVwb3NpdG9yeSByb290LgorICBzdHJpbmcgcGF0aCA9IDE7CisKKyAgLy8gV29ya2luZyBkaXJlY3RvcnkgdXNlZCBieSB0aGUgYnVpbGQgc3lzdGVtLiBBbGwgdGhlIHJlbGF0aXZlCisgIC8vIHBhdGhzIGluIGNvbXBpbGVyX2FyZ3VtZW50cyBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhpcyBwYXRoLgorICAvLyBSZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QuCisgIHN0cmluZyB3b3JraW5nX2RpciA9IDI7CisKKyAgLy8gQ29tcGlsZXIgYXJndW1lbnRzIHRvIGNvbXBpbGUgdGhlIHNvdXJjZSBmaWxlLiBJZiBtdWx0aXBsZSB2YXJpYW50cworICAvLyBvZiB0aGUgbW9kdWxlIGJlaW5nIGNvbXBpbGVkIGFyZSBwb3NzaWJsZSwgdGhlIHF1ZXJ5IHNjcmlwdCB3aWxsIGNob29zZQorICAvLyBvbmUuCisgIHJlcGVhdGVkIHN0cmluZyBjb21waWxlcl9hcmd1bWVudHMgPSAzOworCisgIC8vIEFueSBnZW5lcmF0ZWQgZmlsZXMgdGhhdCBhcmUgdXNlZCBpbiBjb21waWxpbmcgdGhlIGZpbGUuCisgIHJlcGVhdGVkIEdlbmVyYXRlZEZpbGUgZ2VuZXJhdGVkID0gNDsKKworICAvLyBQYXRocyB0byBhbGwgb2YgdGhlIHNvdXJjZXMsIGxpa2UgYnVpbGQgZmlsZXMsIGNvZGUgZ2VuZXJhdG9ycywKKyAgLy8gcHJvdG8gZmlsZXMgZXRjLiB0aGF0IHdlcmUgdXNlZCBkdXJpbmcgYW5hbHlzaXMuIFVzZWQgdG8gZmlndXJlCisgIC8vIG91dCB3aGVuIGEgc2V0IG9mIGJ1aWxkIGFydGlmYWN0cyBhcmUgc3RhbGUgYW5kIHRoZSBxdWVyeSB0b29sCisgIC8vIG11c3QgYmUgcmUtcnVuLgorICAvLyBSZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QuCisgIHJlcGVhdGVkIHN0cmluZyBkZXBzID0gNTsKKworICAvLyBSZXByZXNlbnRzIGFuYWx5c2lzIHN0YXR1cyBmb3IgdGhpcyBwYXJ0aWN1bGFyIGZpbGUuIGUuZy4gbm90IHBhcnQKKyAgLy8gb2YgdGhlIGJ1aWxkIGdyYXBoLgorICBvcHRpb25hbCBTdGF0dXMgc3RhdHVzID0gNjsKK30KKworbWVzc2FnZSBJZGVBbmFseXNpcyB7CisgIHJlcGVhdGVkIFNvdXJjZUZpbGUgc291cmNlcyA9IDI7CisKKyAgLy8gU3RhdHVzIHJlcHJlc2VudGluZyBvdmVyYWxsIGFuYWx5c2lzLgorICAvLyBTaG91bGQgZmFpbCBvbmx5IHdoZW4gbm8gYW5hbHlzaXMgY2FuIGJlIHBlcmZvcm1lZC4KKyAgb3B0aW9uYWwgU3RhdHVzIHN0YXR1cyA9IDM7CisKKyAgcmVzZXJ2ZWQgMTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplcl9wcm90by9yZWdlbi5zaCBiL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplcl9wcm90by9yZWdlbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZjQ0Zjg4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyX3Byb3RvL3JlZ2VuLnNoCkBAIC0wLDAgKzEsMyBAQAorIyEvYmluL2Jhc2gKKworYXByb3RvYyAtLWdvX291dD1wYXRocz1zb3VyY2VfcmVsYXRpdmU6LiBjY19hbmFseXplci5wcm90bwpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L2dvLm1vZCBiL3Rvb2xzL2lkZV9xdWVyeS9nby5tb2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlkNzI3ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9nby5tb2QKQEAgLTAsMCArMSw3IEBACittb2R1bGUgaWRlX3F1ZXJ5CisKK2dvIDEuMjEKKworcmVxdWlyZSAoCisgIAlnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1ZiB2MC4wLjAKKykKZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9nby53b3JrIGIvdG9vbHMvaWRlX3F1ZXJ5L2dvLndvcmsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUxZjM1MgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9nby53b3JrCkBAIC0wLDAgKzEsOSBAQAorZ28gMS4yMQorCit1c2UgKAorCS4KKykKKworcmVwbGFjZSAoCisJZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYgdjAuMC4wID0+IC4uLy4uLy4uLy4uL2V4dGVybmFsL2dvbGFuZy1wcm90b2J1ZgorKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9nby53b3JrLnN1bSBiL3Rvb2xzL2lkZV9xdWVyeS9nby53b3JrLnN1bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjQyYjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2dvLndvcmsuc3VtCkBAIC0wLDAgKzEsNSBAQAorZ2l0aHViLmNvbS9nb2xhbmcvcHJvdG9idWYgdjEuNS4wL2dvLm1vZCBoMTpGc09OVlJBUzlUN3NJK0xJVW1XVGZjWWtITzRhSVd3emhjYVNBb0pPZklrPQorZ2l0aHViLmNvbS9nb29nbGUvZ28tY21wIHYwLjUuNS9nby5tb2QgaDE6djhkVGRMYk1HMmtJYy92SnZsK2Y2NVYyMmRia1hib3dFNmpnVC9nTkJ4RT0KK2dvbGFuZy5vcmcveC94ZXJyb3JzIHYwLjAuMC0yMDE5MTIwNDE5MDUzNi05YmRmYWJlNjg1NDMvZ28ubW9kIGgxOkkvNXo2OThzbjlLYThUZUpjOU1Lcm9VVWZxQkJhdVdqUXFMSjJPUGZtWTA9Citnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1ZiB2MS4yNi4wLXJjLjEgaDE6N1FuSVFwR1JIRTVSbkxLbkVTZkRveG0yZFRhcFRadWE1YTBrUzBBK1ZYUT0KK2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmIHYxLjI2LjAtcmMuMS9nby5tb2QgaDE6amxoaE9TdlRkS0VoYlVMVGp2ZDRBUks5Z3JGQnAwOXlXK1diWS9UeVFidz0KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnkuZ28gYi90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3Y2Y1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5LmdvCkBAIC0wLDAgKzEsNDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gQmluYXJ5IGlkZV9xdWVyeSBnZW5lcmF0ZXMgYW5kIGFuYWx5emVzIGJ1aWxkIGFydGlmYWN0cy4KKy8vIFRoZSBwcm9kdWNlZCByZXN1bHQgY2FuIGJlIGNvbnN1bWVkIGJ5IElERXMgdG8gcHJvdmlkZSBsYW5ndWFnZSBmZWF0dXJlcy4KK3BhY2thZ2UgbWFpbgorCitpbXBvcnQgKAorCSJieXRlcyIKKwkiY29udGFpbmVyL2xpc3QiCisJImNvbnRleHQiCisJImVuY29kaW5nL2pzb24iCisJImZsYWciCisJImZtdCIKKwkibG9nIgorCSJvcyIKKwkib3MvZXhlYyIKKwkicGF0aCIKKwkic2xpY2VzIgorCSJzdHJpbmdzIgorCisJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3Byb3RvIgorCWFwYiAiaWRlX3F1ZXJ5L2NjX2FuYWx5emVyX3Byb3RvIgorCXBiICJpZGVfcXVlcnkvaWRlX3F1ZXJ5X3Byb3RvIgorKQorCisvLyBFbnYgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuCit0eXBlIEVudiBzdHJ1Y3QgeworCUx1bmNoVGFyZ2V0ICAgIEx1bmNoVGFyZ2V0CisJUmVwb0RpciAgICAgICAgc3RyaW5nCisJT3V0RGlyICAgICAgICAgc3RyaW5nCisJQ2xhbmdUb29sc1Jvb3Qgc3RyaW5nCit9CisKKy8vIEx1bmNoVGFyZ2V0IGlzIGEgcGFyc2VkIEFuZHJvaWQgbHVuY2ggdGFyZ2V0LgorLy8gSW5wdXQgZm9ybWF0OiA8cHJvZHVjdF9uYW1lPi08cmVsZWFzZV90eXBlPi08YnVpbGRfdmFyaWFudD4KK3R5cGUgTHVuY2hUYXJnZXQgc3RydWN0IHsKKwlQcm9kdWN0IHN0cmluZworCVJlbGVhc2Ugc3RyaW5nCisJVmFyaWFudCBzdHJpbmcKK30KKwordmFyIF8gZmxhZy5WYWx1ZSA9ICgqTHVuY2hUYXJnZXQpKG5pbCkKKworLy8gLy8gR2V0IGltcGxlbWVudHMgZmxhZy5WYWx1ZS4KKy8vIGZ1bmMgKGwgKkx1bmNoVGFyZ2V0KSBHZXQoKSBhbnkgeworLy8gCXJldHVybiBsCisvLyB9CisKKy8vIFNldCBpbXBsZW1lbnRzIGZsYWcuVmFsdWUuCitmdW5jIChsICpMdW5jaFRhcmdldCkgU2V0KHMgc3RyaW5nKSBlcnJvciB7CisJcGFydHMgOj0gc3RyaW5ncy5TcGxpdChzLCAiLSIpCisJaWYgbGVuKHBhcnRzKSAhPSAzIHsKKwkJcmV0dXJuIGZtdC5FcnJvcmYoImludmFsaWQgbHVuY2ggdGFyZ2V0OiAlcSwgbXVzdCBoYXZlIGZvcm0gPHByb2R1Y3RfbmFtZT4tPHJlbGVhc2VfdHlwZT4tPGJ1aWxkX3ZhcmlhbnQ+IiwgcykKKwl9CisJKmwgPSBMdW5jaFRhcmdldHsKKwkJUHJvZHVjdDogcGFydHNbMF0sCisJCVJlbGVhc2U6IHBhcnRzWzFdLAorCQlWYXJpYW50OiBwYXJ0c1syXSwKKwl9CisJcmV0dXJuIG5pbAorfQorCisvLyBTdHJpbmcgaW1wbGVtZW50cyBmbGFnLlZhbHVlLgorZnVuYyAobCAqTHVuY2hUYXJnZXQpIFN0cmluZygpIHN0cmluZyB7CisJcmV0dXJuIGZtdC5TcHJpbnRmKCIlcy0lcy0lcyIsIGwuUHJvZHVjdCwgbC5SZWxlYXNlLCBsLlZhcmlhbnQpCit9CisKK2Z1bmMgbWFpbigpIHsKKwl2YXIgZW52IEVudgorCWVudi5PdXREaXIgPSBzdHJpbmdzLlRyaW1TdWZmaXgob3MuR2V0ZW52KCJPVVRfRElSIiksICIvIikKKwllbnYuUmVwb0RpciA9IG9zLkdldGVudigiQU5EUk9JRF9CVUlMRF9UT1AiKQorCWVudi5DbGFuZ1Rvb2xzUm9vdCA9IG9zLkdldGVudigiUFJFQlVJTFRTX0NMQU5HX1RPT0xTX1JPT1QiKQorCWZsYWcuVmFyKCZlbnYuTHVuY2hUYXJnZXQsICJsdW5jaF90YXJnZXQiLCAiVGhlIGx1bmNoIHRhcmdldCB0byBxdWVyeSIpCisJZmxhZy5QYXJzZSgpCisJZmlsZXMgOj0gZmxhZy5BcmdzKCkKKwlpZiBsZW4oZmlsZXMpID09IDAgeworCQlmbXQuUHJpbnRsbigiTm8gZmlsZXMgcHJvdmlkZWQuIikKKwkJb3MuRXhpdCgxKQorCQlyZXR1cm4KKwl9CisKKwl2YXIgY2NGaWxlcywgamF2YUZpbGVzIFtdc3RyaW5nCisJZm9yIF8sIGYgOj0gcmFuZ2UgZmlsZXMgeworCQlzd2l0Y2ggeworCQljYXNlIHN0cmluZ3MuSGFzU3VmZml4KGYsICIuamF2YSIpIHx8IHN0cmluZ3MuSGFzU3VmZml4KGYsICIua3QiKToKKwkJCWphdmFGaWxlcyA9IGFwcGVuZChqYXZhRmlsZXMsIGYpCisJCWNhc2Ugc3RyaW5ncy5IYXNTdWZmaXgoZiwgIi5jYyIpIHx8IHN0cmluZ3MuSGFzU3VmZml4KGYsICIuY3BwIikgfHwgc3RyaW5ncy5IYXNTdWZmaXgoZiwgIi5oIik6CisJCQljY0ZpbGVzID0gYXBwZW5kKGNjRmlsZXMsIGYpCisJCWRlZmF1bHQ6CisJCQlsb2cuUHJpbnRmKCJGaWxlICVxIGlzIHN1cHBvcnRlZCAtIHdpbGwgYmUgc2tpcHBlZC4iLCBmKQorCQl9CisJfQorCisJY3R4IDo9IGNvbnRleHQuQmFja2dyb3VuZCgpCisJLy8gVE9ETyhtaWNoYWVsbWVyZyk6IEZpZ3VyZSBvdXQgaWYgbW9kdWxlX2JwX2phdmFfZGVwcy5qc29uIGFuZCBjb21waWxlX2NvbW1hbmRzLmpzb24gaXMgb3V0ZGF0ZWQuCisJcnVuTWFrZShjdHgsIGVudiwgIm5vdGhpbmciKQorCisJamF2YU1vZHVsZXMsIGVyciA6PSBsb2FkSmF2YU1vZHVsZXMoZW52KQorCWlmIGVyciAhPSBuaWwgeworCQlsb2cuUHJpbnRmKCJGYWlsZWQgdG8gbG9hZCBqYXZhIG1vZHVsZXM6ICV2IiwgZXJyKQorCX0KKworCXZhciB0YXJnZXRzIFtdc3RyaW5nCisJamF2YVRhcmdldHNCeUZpbGUgOj0gZmluZEphdmFNb2R1bGVzKGphdmFGaWxlcywgamF2YU1vZHVsZXMpCisJZm9yIF8sIHQgOj0gcmFuZ2UgamF2YVRhcmdldHNCeUZpbGUgeworCQl0YXJnZXRzID0gYXBwZW5kKHRhcmdldHMsIHQpCisJfQorCisJY2NUYXJnZXRzLCBlcnIgOj0gZ2V0Q0NUYXJnZXRzKGN0eCwgZW52LCBjY0ZpbGVzKQorCWlmIGVyciAhPSBuaWwgeworCQlsb2cuRmF0YWxmKCJGYWlsZWQgdG8gcXVlcnkgY2MgdGFyZ2V0czogJXYiLCBlcnIpCisJfQorCXRhcmdldHMgPSBhcHBlbmQodGFyZ2V0cywgY2NUYXJnZXRzLi4uKQorCWlmIGxlbih0YXJnZXRzKSA9PSAwIHsKKwkJZm10LlByaW50bG4oIk5vIHRhcmdldHMgZm91bmQuIikKKwkJb3MuRXhpdCgxKQorCQlyZXR1cm4KKwl9CisKKwlmbXQuRnByaW50Zihvcy5TdGRlcnIsICJSdW5uaW5nIG1ha2UgZm9yIG1vZHVsZXM6ICV2XG4iLCBzdHJpbmdzLkpvaW4odGFyZ2V0cywgIiwgIikpCisJaWYgZXJyIDo9IHJ1bk1ha2UoY3R4LCBlbnYsIHRhcmdldHMuLi4pOyBlcnIgIT0gbmlsIHsKKwkJbG9nLlByaW50ZigiQnVpbGRpbmcgbW9kdWxlcyBmYWlsZWQ6ICV2IiwgZXJyKQorCX0KKworCXZhciBhbmFseXNpcyBwYi5JZGVBbmFseXNpcworCXJlc3VsdHMsIHVuaXRzIDo9IGdldEphdmFJbnB1dHMoZW52LCBqYXZhVGFyZ2V0c0J5RmlsZSwgamF2YU1vZHVsZXMpCisJYW5hbHlzaXMuUmVzdWx0cyA9IHJlc3VsdHMKKwlhbmFseXNpcy5Vbml0cyA9IHVuaXRzCisJaWYgZXJyICE9IG5pbCAmJiBhbmFseXNpcy5FcnJvciA9PSBuaWwgeworCQlhbmFseXNpcy5FcnJvciA9ICZwYi5BbmFseXNpc0Vycm9yeworCQkJRXJyb3JNZXNzYWdlOiBlcnIuRXJyb3IoKSwKKwkJfQorCX0KKworCXJlc3VsdHMsIHVuaXRzLCBlcnIgPSBnZXRDQ0lucHV0cyhjdHgsIGVudiwgY2NGaWxlcykKKwlhbmFseXNpcy5SZXN1bHRzID0gYXBwZW5kKGFuYWx5c2lzLlJlc3VsdHMsIHJlc3VsdHMuLi4pCisJYW5hbHlzaXMuVW5pdHMgPSBhcHBlbmQoYW5hbHlzaXMuVW5pdHMsIHVuaXRzLi4uKQorCWlmIGVyciAhPSBuaWwgJiYgYW5hbHlzaXMuRXJyb3IgPT0gbmlsIHsKKwkJYW5hbHlzaXMuRXJyb3IgPSAmcGIuQW5hbHlzaXNFcnJvcnsKKwkJCUVycm9yTWVzc2FnZTogZXJyLkVycm9yKCksCisJCX0KKwl9CisKKwlhbmFseXNpcy5CdWlsZE91dERpciA9IGVudi5PdXREaXIKKwlkYXRhLCBlcnIgOj0gcHJvdG8uTWFyc2hhbCgmYW5hbHlzaXMpCisJaWYgZXJyICE9IG5pbCB7CisJCWxvZy5GYXRhbGYoIkZhaWxlZCB0byBtYXJzaGFsIHJlc3VsdCBwcm90bzogJXYiLCBlcnIpCisJfQorCisJXywgZXJyID0gb3MuU3Rkb3V0LldyaXRlKGRhdGEpCisJaWYgZXJyICE9IG5pbCB7CisJCWxvZy5GYXRhbGYoIkZhaWxlZCB0byB3cml0ZSByZXN1bHQgcHJvdG86ICV2IiwgZXJyKQorCX0KKworCWZvciBfLCByIDo9IHJhbmdlIGFuYWx5c2lzLlJlc3VsdHMgeworCQlmbXQuRnByaW50Zihvcy5TdGRlcnIsICIlczogJSt2XG4iLCByLkdldFNvdXJjZUZpbGVQYXRoKCksIHIuR2V0U3RhdHVzKCkpCisJfQorfQorCitmdW5jIHJlcG9TdGF0ZShlbnYgRW52LCBmaWxlUGF0aHMgW11zdHJpbmcpICphcGIuUmVwb1N0YXRlIHsKKwljb25zdCBjb21wRGJQYXRoID0gInNvb25nL2RldmVsb3BtZW50L2lkZS9jb21wZGIvY29tcGlsZV9jb21tYW5kcy5qc29uIgorCXJldHVybiAmYXBiLlJlcG9TdGF0ZXsKKwkJUmVwb0RpcjogICAgICAgIGVudi5SZXBvRGlyLAorCQlBY3RpdmVGaWxlUGF0aDogZmlsZVBhdGhzLAorCQlPdXREaXI6ICAgICAgICAgZW52Lk91dERpciwKKwkJQ29tcERiUGF0aDogICAgIHBhdGguSm9pbihlbnYuT3V0RGlyLCBjb21wRGJQYXRoKSwKKwl9Cit9CisKK2Z1bmMgcnVuQ0NhbmFseXplcihjdHggY29udGV4dC5Db250ZXh0LCBlbnYgRW52LCBtb2RlIHN0cmluZywgaW4gW11ieXRlKSAoW11ieXRlLCBlcnJvcikgeworCWNjQW5hbHl6ZXJQYXRoIDo9IHBhdGguSm9pbihlbnYuQ2xhbmdUb29sc1Jvb3QsICJiaW4vaWRlX3F1ZXJ5X2NjX2FuYWx5emVyIikKKwlvdXRCdWZmZXIgOj0gbmV3KGJ5dGVzLkJ1ZmZlcikKKworCWluQnVmZmVyIDo9IG5ldyhieXRlcy5CdWZmZXIpCisJaW5CdWZmZXIuV3JpdGUoaW4pCisKKwljbWQgOj0gZXhlYy5Db21tYW5kQ29udGV4dChjdHgsIGNjQW5hbHl6ZXJQYXRoLCAiLS1tb2RlPSIrbW9kZSkKKwljbWQuRGlyID0gZW52LlJlcG9EaXIKKworCWNtZC5TdGRpbiA9IGluQnVmZmVyCisJY21kLlN0ZG91dCA9IG91dEJ1ZmZlcgorCWNtZC5TdGRlcnIgPSBvcy5TdGRlcnIKKworCWVyciA6PSBjbWQuUnVuKCkKKworCXJldHVybiBvdXRCdWZmZXIuQnl0ZXMoKSwgZXJyCit9CisKKy8vIEV4ZWN1dGUgY2NfYW5hbHl6ZXIgYW5kIGdldCBhbGwgdGhlIHRhcmdldHMgdGhhdCBuZWVkcyB0byBiZSBidWlsZCBmb3IgYW5hbHl6aW5nIGZpbGVzLgorZnVuYyBnZXRDQ1RhcmdldHMoY3R4IGNvbnRleHQuQ29udGV4dCwgZW52IEVudiwgZmlsZVBhdGhzIFtdc3RyaW5nKSAoW11zdHJpbmcsIGVycm9yKSB7CisJc3RhdGUsIGVyciA6PSBwcm90by5NYXJzaGFsKHJlcG9TdGF0ZShlbnYsIGZpbGVQYXRocykpCisJaWYgZXJyICE9IG5pbCB7CisJCWxvZy5GYXRhbGxuKCJGYWlsZWQgdG8gc2VyaWFsaXplIHN0YXRlOiIsIGVycikKKwl9CisKKwlyZXNwIDo9IG5ldyhhcGIuRGVwc1Jlc3BvbnNlKQorCXJlc3VsdCwgZXJyIDo9IHJ1bkNDYW5hbHl6ZXIoY3R4LCBlbnYsICJkZXBzIiwgc3RhdGUpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGVycgorCX0KKworCWlmIGVyciA6PSBwcm90by5Vbm1hcnNoYWwocmVzdWx0LCByZXNwKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGZtdC5FcnJvcmYoIm1hbGZvcm1lZCByZXNwb25zZSBmcm9tIGNjX2FuYWx5emVyOiAldiIsIGVycikKKwl9CisKKwl2YXIgdGFyZ2V0cyBbXXN0cmluZworCWlmIHJlc3AuU3RhdHVzICE9IG5pbCAmJiByZXNwLlN0YXR1cy5Db2RlICE9IGFwYi5TdGF0dXNfT0sgeworCQlyZXR1cm4gdGFyZ2V0cywgZm10LkVycm9yZigiY2NfYW5hbHl6ZXIgZmFpbGVkOiAldiIsIHJlc3AuU3RhdHVzLk1lc3NhZ2UpCisJfQorCisJZm9yIF8sIGRlcHMgOj0gcmFuZ2UgcmVzcC5EZXBzIHsKKwkJdGFyZ2V0cyA9IGFwcGVuZCh0YXJnZXRzLCBkZXBzLkJ1aWxkVGFyZ2V0Li4uKQorCX0KKwlyZXR1cm4gdGFyZ2V0cywgbmlsCit9CisKK2Z1bmMgZ2V0Q0NJbnB1dHMoY3R4IGNvbnRleHQuQ29udGV4dCwgZW52IEVudiwgZmlsZVBhdGhzIFtdc3RyaW5nKSAoW10qcGIuQW5hbHlzaXNSZXN1bHQsIFtdKnBiLkJ1aWxkYWJsZVVuaXQsIGVycm9yKSB7CisJc3RhdGUsIGVyciA6PSBwcm90by5NYXJzaGFsKHJlcG9TdGF0ZShlbnYsIGZpbGVQYXRocykpCisJaWYgZXJyICE9IG5pbCB7CisJCWxvZy5GYXRhbGxuKCJGYWlsZWQgdG8gc2VyaWFsaXplIHN0YXRlOiIsIGVycikKKwl9CisKKwlyZXNwIDo9IG5ldyhhcGIuSWRlQW5hbHlzaXMpCisJcmVzdWx0LCBlcnIgOj0gcnVuQ0NhbmFseXplcihjdHgsIGVudiwgImlucHV0cyIsIHN0YXRlKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBuaWwsIGZtdC5FcnJvcmYoImNjX2FuYWx5emVyIGZhaWxlZDoiLCBlcnIpCisJfQorCWlmIGVyciA6PSBwcm90by5Vbm1hcnNoYWwocmVzdWx0LCByZXNwKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIG5pbCwgZm10LkVycm9yZigibWFsZm9ybWVkIHJlc3BvbnNlIGZyb20gY2NfYW5hbHl6ZXI6ICV2IiwgZXJyKQorCX0KKwlpZiByZXNwLlN0YXR1cyAhPSBuaWwgJiYgcmVzcC5TdGF0dXMuQ29kZSAhPSBhcGIuU3RhdHVzX09LIHsKKwkJcmV0dXJuIG5pbCwgbmlsLCBmbXQuRXJyb3JmKCJjY19hbmFseXplciBmYWlsZWQ6ICV2IiwgcmVzcC5TdGF0dXMuTWVzc2FnZSkKKwl9CisKKwl2YXIgcmVzdWx0cyBbXSpwYi5BbmFseXNpc1Jlc3VsdAorCXZhciB1bml0cyBbXSpwYi5CdWlsZGFibGVVbml0CisJZm9yIF8sIHMgOj0gcmFuZ2UgcmVzcC5Tb3VyY2VzIHsKKwkJc3RhdHVzIDo9ICZwYi5BbmFseXNpc1Jlc3VsdF9TdGF0dXN7CisJCQlDb2RlOiBwYi5BbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ09ERV9PSywKKwkJfQorCQlpZiBzLkdldFN0YXR1cygpLkdldENvZGUoKSAhPSBhcGIuU3RhdHVzX09LIHsKKwkJCXN0YXR1cy5Db2RlID0gcGIuQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NPREVfQlVJTERfRkFJTEVECisJCQlzdGF0dXMuU3RhdHVzTWVzc2FnZSA9IHByb3RvLlN0cmluZyhzLkdldFN0YXR1cygpLkdldE1lc3NhZ2UoKSkKKwkJfQorCisJCXJlc3VsdCA6PSAmcGIuQW5hbHlzaXNSZXN1bHR7CisJCQlTb3VyY2VGaWxlUGF0aDogcy5HZXRQYXRoKCksCisJCQlVbml0SWQ6ICAgICAgICAgcy5HZXRQYXRoKCksCisJCQlTdGF0dXM6ICAgICAgICAgc3RhdHVzLAorCQl9CisJCXJlc3VsdHMgPSBhcHBlbmQocmVzdWx0cywgcmVzdWx0KQorCisJCXZhciBnZW5lcmF0ZWQgW10qcGIuR2VuZXJhdGVkRmlsZQorCQlmb3IgXywgZiA6PSByYW5nZSBzLkdlbmVyYXRlZCB7CisJCQlnZW5lcmF0ZWQgPSBhcHBlbmQoZ2VuZXJhdGVkLCAmcGIuR2VuZXJhdGVkRmlsZXsKKwkJCQlQYXRoOiAgICAgZi5HZXRQYXRoKCksCisJCQkJQ29udGVudHM6IGYuR2V0Q29udGVudHMoKSwKKwkJCX0pCisJCX0KKwkJZ2VuVW5pdCA6PSAmcGIuQnVpbGRhYmxlVW5pdHsKKwkJCUlkOiAgICAgICAgICAgICAgImdlbmZpbGVzX2Zvcl8iICsgcy5HZXRQYXRoKCksCisJCQlTb3VyY2VGaWxlUGF0aHM6IHMuR2V0RGVwcygpLAorCQkJR2VuZXJhdGVkRmlsZXM6ICBnZW5lcmF0ZWQsCisJCX0KKworCQl1bml0IDo9ICZwYi5CdWlsZGFibGVVbml0eworCQkJSWQ6ICAgICAgICAgICAgICAgIHMuR2V0UGF0aCgpLAorCQkJTGFuZ3VhZ2U6ICAgICAgICAgIHBiLkxhbmd1YWdlX0xBTkdVQUdFX0NQUCwKKwkJCVNvdXJjZUZpbGVQYXRoczogICBbXXN0cmluZ3tzLkdldFBhdGgoKX0sCisJCQlDb21waWxlckFyZ3VtZW50czogcy5HZXRDb21waWxlckFyZ3VtZW50cygpLAorCQkJRGVwZW5kZW5jeUlkczogICAgIFtdc3RyaW5ne2dlblVuaXQuR2V0SWQoKX0sCisJCX0KKwkJdW5pdHMgPSBhcHBlbmQodW5pdHMsIHVuaXQsIGdlblVuaXQpCisJfQorCXJldHVybiByZXN1bHRzLCB1bml0cywgbmlsCit9CisKKy8vIGZpbmRKYXZhTW9kdWxlcyB0cmllcyB0byBmaW5kIHRoZSBtb2R1bGVzIHRoYXQgY292ZXIgdGhlIGdpdmVuIGZpbGUgcGF0aHMuCisvLyBJZiBhIGZpbGUgaXMgY292ZXJlZCBieSBtdWx0aXBsZSBtb2R1bGVzLCB0aGUgZmlyc3QgbW9kdWxlIGlzIHJldHVybmVkLgorZnVuYyBmaW5kSmF2YU1vZHVsZXMocGF0aHMgW11zdHJpbmcsIG1vZHVsZXMgbWFwW3N0cmluZ10qamF2YU1vZHVsZSkgbWFwW3N0cmluZ11zdHJpbmcgeworCXJldCA6PSBtYWtlKG1hcFtzdHJpbmddc3RyaW5nKQorCS8vIEEgZmlsZSBtYXkgYmUgcGFydCBvZiBtdWx0aXBsZSBtb2R1bGVzLiBUbyBtYWtlIHRoZSByZXN1bHQgZGV0ZXJtaW5pc3RpYywKKwkvLyBjaGVjayB0aGUgbW9kdWxlcyBpbiBzb3J0ZWQgb3JkZXIuCisJa2V5cyA6PSBtYWtlKFtdc3RyaW5nLCAwLCBsZW4obW9kdWxlcykpCisJZm9yIG5hbWUgOj0gcmFuZ2UgbW9kdWxlcyB7CisJCWtleXMgPSBhcHBlbmQoa2V5cywgbmFtZSkKKwl9CisJc2xpY2VzLlNvcnQoa2V5cykKKwlmb3IgXywgbmFtZSA6PSByYW5nZSBrZXlzIHsKKwkJaWYgc3RyaW5ncy5IYXNTdWZmaXgobmFtZSwgIi5pbXBsIikgeworCQkJY29udGludWUKKwkJfQorCisJCW1vZHVsZSA6PSBtb2R1bGVzW25hbWVdCisJCWZvciBpLCBwIDo9IHJhbmdlIHBhdGhzIHsKKwkJCWlmIHNsaWNlcy5Db250YWlucyhtb2R1bGUuU3JjcywgcCkgeworCQkJCXJldFtwXSA9IG5hbWUKKwkJCQlwYXRocyA9IGFwcGVuZChwYXRoc1s6aV0sIHBhdGhzW2krMTpdLi4uKQorCQkJCWJyZWFrCisJCQl9CisJCX0KKwkJaWYgbGVuKHBhdGhzKSA9PSAwIHsKKwkJCWJyZWFrCisJCX0KKwl9CisJcmV0dXJuIHJldAorfQorCitmdW5jIGdldEphdmFJbnB1dHMoZW52IEVudiwgbW9kdWxlc0J5UGF0aCBtYXBbc3RyaW5nXXN0cmluZywgbW9kdWxlcyBtYXBbc3RyaW5nXSpqYXZhTW9kdWxlKSAoW10qcGIuQW5hbHlzaXNSZXN1bHQsIFtdKnBiLkJ1aWxkYWJsZVVuaXQpIHsKKwl2YXIgcmVzdWx0cyBbXSpwYi5BbmFseXNpc1Jlc3VsdAorCXVuaXRzQnlJZCA6PSBtYWtlKG1hcFtzdHJpbmddKnBiLkJ1aWxkYWJsZVVuaXQpCisJZm9yIHAsIG1vZHVsZU5hbWUgOj0gcmFuZ2UgbW9kdWxlc0J5UGF0aCB7CisJCXIgOj0gJnBiLkFuYWx5c2lzUmVzdWx0eworCQkJU291cmNlRmlsZVBhdGg6IHAsCisJCX0KKwkJcmVzdWx0cyA9IGFwcGVuZChyZXN1bHRzLCByKQorCisJCW0gOj0gbW9kdWxlc1ttb2R1bGVOYW1lXQorCQlpZiBtID09IG5pbCB7CisJCQlyLlN0YXR1cyA9ICZwYi5BbmFseXNpc1Jlc3VsdF9TdGF0dXN7CisJCQkJQ29kZTogICAgICAgICAgcGIuQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NPREVfTk9UX0ZPVU5ELAorCQkJCVN0YXR1c01lc3NhZ2U6IHByb3RvLlN0cmluZygiRmlsZSBub3QgZm91bmQgaW4gYW55IG1vZHVsZS4iKSwKKwkJCX0KKwkJCWNvbnRpbnVlCisJCX0KKworCQlyLlVuaXRJZCA9IG1vZHVsZU5hbWUKKwkJci5TdGF0dXMgPSAmcGIuQW5hbHlzaXNSZXN1bHRfU3RhdHVze0NvZGU6IHBiLkFuYWx5c2lzUmVzdWx0X1N0YXR1c19DT0RFX09LfQorCQlpZiB1bml0c0J5SWRbci5Vbml0SWRdICE9IG5pbCB7CisJCQkvLyBGaWxlIGlzIGNvdmVyZWQgYnkgYW4gYWxyZWFkeSBjcmVhdGVkIHVuaXQuCisJCQljb250aW51ZQorCQl9CisKKwkJdSA6PSAmcGIuQnVpbGRhYmxlVW5pdHsKKwkJCUlkOiAgICAgICAgICAgICAgbW9kdWxlTmFtZSwKKwkJCUxhbmd1YWdlOiAgICAgICAgcGIuTGFuZ3VhZ2VfTEFOR1VBR0VfSkFWQSwKKwkJCVNvdXJjZUZpbGVQYXRoczogbS5TcmNzLAorCQkJR2VuZXJhdGVkRmlsZXM6ICBnZW5GaWxlcyhlbnYsIG0pLAorCQkJRGVwZW5kZW5jeUlkczogICBtLkRlcHMsCisJCX0KKwkJdW5pdHNCeUlkW3UuSWRdID0gdQorCisJCXEgOj0gbGlzdC5OZXcoKQorCQlmb3IgXywgZCA6PSByYW5nZSBtLkRlcHMgeworCQkJcS5QdXNoQmFjayhkKQorCQl9CisJCWZvciBxLkxlbigpID4gMCB7CisJCQluYW1lIDo9IHEuUmVtb3ZlKHEuRnJvbnQoKSkuKHN0cmluZykKKwkJCW1vZCA6PSBtb2R1bGVzW25hbWVdCisJCQlpZiBtb2QgPT0gbmlsIHx8IHVuaXRzQnlJZFtuYW1lXSAhPSBuaWwgeworCQkJCWNvbnRpbnVlCisJCQl9CisKKwkJCXVuaXRzQnlJZFtuYW1lXSA9ICZwYi5CdWlsZGFibGVVbml0eworCQkJCUlkOiAgICAgICAgICAgICAgbmFtZSwKKwkJCQlTb3VyY2VGaWxlUGF0aHM6IG1vZC5TcmNzLAorCQkJCUdlbmVyYXRlZEZpbGVzOiAgZ2VuRmlsZXMoZW52LCBtb2QpLAorCQkJCURlcGVuZGVuY3lJZHM6ICAgbW9kLkRlcHMsCisJCQl9CisKKwkJCWZvciBfLCBkIDo9IHJhbmdlIG1vZC5EZXBzIHsKKwkJCQlxLlB1c2hCYWNrKGQpCisJCQl9CisJCX0KKwl9CisKKwl1bml0cyA6PSBtYWtlKFtdKnBiLkJ1aWxkYWJsZVVuaXQsIDAsIGxlbih1bml0c0J5SWQpKQorCWZvciBfLCB1IDo9IHJhbmdlIHVuaXRzQnlJZCB7CisJCXVuaXRzID0gYXBwZW5kKHVuaXRzLCB1KQorCX0KKwlyZXR1cm4gcmVzdWx0cywgdW5pdHMKK30KKworLy8gZ2VuRmlsZXMgcmV0dXJucyB0aGUgZ2VuZXJhdGVkIGZpbGVzIChwYXRocyB0aGF0IHN0YXJ0IHdpdGggb3V0RGlyLykgZm9yIHRoZQorLy8gZ2l2ZW4gbW9kdWxlLiBHZW5lcmF0ZWQgZmlsZXMgdGhhdCBkbyBub3QgZXhpc3QgYXJlIGlnbm9yZWQuCitmdW5jIGdlbkZpbGVzKGVudiBFbnYsIG1vZCAqamF2YU1vZHVsZSkgW10qcGIuR2VuZXJhdGVkRmlsZSB7CisJdmFyIHBhdGhzIFtdc3RyaW5nCisJcGF0aHMgPSBhcHBlbmQocGF0aHMsIG1vZC5TcmNzLi4uKQorCXBhdGhzID0gYXBwZW5kKHBhdGhzLCBtb2QuU3JjSmFycy4uLikKKwlwYXRocyA9IGFwcGVuZChwYXRocywgbW9kLkphcnMuLi4pCisKKwlwcmVmaXggOj0gZW52Lk91dERpciArICIvIgorCXZhciByZXQgW10qcGIuR2VuZXJhdGVkRmlsZQorCWZvciBfLCBwIDo9IHJhbmdlIHBhdGhzIHsKKwkJcmVsUGF0aCwgb2sgOj0gc3RyaW5ncy5DdXRQcmVmaXgocCwgcHJlZml4KQorCQlpZiAhb2sgeworCQkJY29udGludWUKKwkJfQorCisJCWNvbnRlbnRzLCBlcnIgOj0gb3MuUmVhZEZpbGUocGF0aC5Kb2luKGVudi5SZXBvRGlyLCBwKSkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQljb250aW51ZQorCQl9CisKKwkJcmV0ID0gYXBwZW5kKHJldCwgJnBiLkdlbmVyYXRlZEZpbGV7CisJCQlQYXRoOiAgICAgcmVsUGF0aCwKKwkJCUNvbnRlbnRzOiBjb250ZW50cywKKwkJfSkKKwl9CisJcmV0dXJuIHJldAorfQorCisvLyBydW5NYWtlIHJ1bnMgU29vbmcgYnVpbGQgZm9yIHRoZSBnaXZlbiBtb2R1bGVzLgorZnVuYyBydW5NYWtlKGN0eCBjb250ZXh0LkNvbnRleHQsIGVudiBFbnYsIG1vZHVsZXMgLi4uc3RyaW5nKSBlcnJvciB7CisJYXJncyA6PSBbXXN0cmluZ3sKKwkJIi0tbWFrZS1tb2RlIiwKKwkJIkFORFJPSURfQlVJTERfRU5WSVJPTk1FTlRfQ09ORklHPWdvb2dsZXItY29nIiwKKwkJIlNPT05HX0dFTl9DT01QREI9MSIsCisJCSJUQVJHRVRfUFJPRFVDVD0iICsgZW52Lkx1bmNoVGFyZ2V0LlByb2R1Y3QsCisJCSJUQVJHRVRfUkVMRUFTRT0iICsgZW52Lkx1bmNoVGFyZ2V0LlJlbGVhc2UsCisJCSJUQVJHRVRfQlVJTERfVkFSSUFOVD0iICsgZW52Lkx1bmNoVGFyZ2V0LlZhcmlhbnQsCisJCSJUQVJHRVRfQlVJTERfVFlQRT1yZWxlYXNlIiwKKwkJIi1rIiwKKwl9CisJYXJncyA9IGFwcGVuZChhcmdzLCBtb2R1bGVzLi4uKQorCWNtZCA6PSBleGVjLkNvbW1hbmRDb250ZXh0KGN0eCwgImJ1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2giLCBhcmdzLi4uKQorCWNtZC5EaXIgPSBlbnYuUmVwb0RpcgorCWNtZC5TdGRvdXQgPSBvcy5TdGRlcnIKKwljbWQuU3RkZXJyID0gb3MuU3RkZXJyCisJcmV0dXJuIGNtZC5SdW4oKQorfQorCit0eXBlIGphdmFNb2R1bGUgc3RydWN0IHsKKwlQYXRoICAgIFtdc3RyaW5nIGBqc29uOiJwYXRoLG9taXRlbXB0eSJgCisJRGVwcyAgICBbXXN0cmluZyBganNvbjoiZGVwZW5kZW5jaWVzLG9taXRlbXB0eSJgCisJU3JjcyAgICBbXXN0cmluZyBganNvbjoic3JjcyxvbWl0ZW1wdHkiYAorCUphcnMgICAgW11zdHJpbmcgYGpzb246ImphcnMsb21pdGVtcHR5ImAKKwlTcmNKYXJzIFtdc3RyaW5nIGBqc29uOiJzcmNqYXJzLG9taXRlbXB0eSJgCit9CisKK2Z1bmMgbG9hZEphdmFNb2R1bGVzKGVudiBFbnYpIChtYXBbc3RyaW5nXSpqYXZhTW9kdWxlLCBlcnJvcikgeworCWphdmFEZXBzUGF0aCA6PSBwYXRoLkpvaW4oZW52LlJlcG9EaXIsIGVudi5PdXREaXIsICJzb29uZy9tb2R1bGVfYnBfamF2YV9kZXBzLmpzb24iKQorCWRhdGEsIGVyciA6PSBvcy5SZWFkRmlsZShqYXZhRGVwc1BhdGgpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGVycgorCX0KKworCXZhciByZXQgbWFwW3N0cmluZ10qamF2YU1vZHVsZSAvLyBtb2R1bGUgbmFtZSAtPiBtb2R1bGUKKwlpZiBlcnIgPSBqc29uLlVubWFyc2hhbChkYXRhLCAmcmV0KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGVycgorCX0KKworCS8vIEFkZCB0b3AgbGV2ZWwgamF2YV9zZGtfbGlicmFyeSBmb3IgLmltcGwgbW9kdWxlcy4KKwlmb3IgbmFtZSwgbW9kdWxlIDo9IHJhbmdlIHJldCB7CisJCWlmIHN0cmlwZWQgOj0gc3RyaW5ncy5UcmltU3VmZml4KG5hbWUsICIuaW1wbCIpOyBzdHJpcGVkICE9IG5hbWUgeworCQkJcmV0W3N0cmlwZWRdID0gbW9kdWxlCisJCX0KKwl9CisJcmV0dXJuIHJldCwgbmlsCit9CmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5LnNoIGIvdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZGZmZmMxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeS5zaApAQCAtMCwwICsxLDM4IEBACisjIS9iaW4vYmFzaCAtZQorCisjIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitjZCAkKGRpcm5hbWUgJEJBU0hfU09VUkNFKQorc291cmNlICQocHdkKS8uLi8uLi9zaGVsbF91dGlscy5zaAorcmVxdWlyZV90b3AKKworIyBFbnN1cmUgY29nc2V0dXAgKG91dC8gd2lsbCBiZSBzeW1saW5rIG91dHNpZGUgdGhlIHJlcG8pCitzZXR1cF9jb2dfZW52X2lmX25lZWRlZAorCitjYXNlICQodW5hbWUgLXMpIGluCisgICAgTGludXgpCisgICAgICBleHBvcnQgUFJFQlVJTFRTX0NMQU5HX1RPT0xTX1JPT1Q9IiR7VE9QfS9wcmVidWlsdHMvY2xhbmctdG9vbHMvbGludXgteDg2LyIKKyAgICAgIFBSRUJVSUxUU19HT19ST09UPSIke1RPUH0vcHJlYnVpbHRzL2dvL2xpbnV4LXg4Ni8iCisgICAgICA7OworICAgICopCisgICAgICBlY2hvICJPbmx5IHN1cHBvcnRlZCBmb3IgbGludXggaG9zdHMiID4mMgorICAgICAgZXhpdCAxCisgICAgICA7OworZXNhYworCitleHBvcnQgQlVJTERfRU5WX1NFUVVFTkNFX05VTUJFUj0xMworZXhwb3J0IEFORFJPSURfQlVJTERfVE9QPSRUT1AKK2V4cG9ydCBPVVRfRElSPSR7T1VUX0RJUn0KK2V4ZWMgIiR7UFJFQlVJTFRTX0dPX1JPT1R9L2Jpbi9nbyIgInJ1biIgImlkZV9xdWVyeSIgIiRAIgpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeV9wcm90by9pZGVfcXVlcnkucGIuZ28gYi90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5X3Byb3RvL2lkZV9xdWVyeS5wYi5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTkwMjIzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeV9wcm90by9pZGVfcXVlcnkucGIuZ28KQEAgLTAsMCArMSw5NjQgQEAKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gQ29kZSBnZW5lcmF0ZWQgYnkgcHJvdG9jLWdlbi1nby4gRE8gTk9UIEVESVQuCisvLyB2ZXJzaW9uczoKKy8vIAlwcm90b2MtZ2VuLWdvIHYxLjMwLjAKKy8vIAlwcm90b2MgICAgICAgIHYzLjIxLjEyCisvLyBzb3VyY2U6IGlkZV9xdWVyeS5wcm90bworCitwYWNrYWdlIGlkZV9xdWVyeV9wcm90bworCitpbXBvcnQgKAorCXByb3RvcmVmbGVjdCAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZmxlY3QiCisJcHJvdG9pbXBsICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9ydW50aW1lL3Byb3RvaW1wbCIKKwlyZWZsZWN0ICJyZWZsZWN0IgorCXN5bmMgInN5bmMiCispCisKK2NvbnN0ICgKKwkvLyBWZXJpZnkgdGhhdCB0aGlzIGdlbmVyYXRlZCBjb2RlIGlzIHN1ZmZpY2llbnRseSB1cC10by1kYXRlLgorCV8gPSBwcm90b2ltcGwuRW5mb3JjZVZlcnNpb24oMjAgLSBwcm90b2ltcGwuTWluVmVyc2lvbikKKwkvLyBWZXJpZnkgdGhhdCBydW50aW1lL3Byb3RvaW1wbCBpcyBzdWZmaWNpZW50bHkgdXAtdG8tZGF0ZS4KKwlfID0gcHJvdG9pbXBsLkVuZm9yY2VWZXJzaW9uKHByb3RvaW1wbC5NYXhWZXJzaW9uIC0gMjApCispCisKK3R5cGUgTGFuZ3VhZ2UgaW50MzIKKworY29uc3QgKAorCUxhbmd1YWdlX0xBTkdVQUdFX1VOU1BFQ0lGSUVEIExhbmd1YWdlID0gMAorCUxhbmd1YWdlX0xBTkdVQUdFX0pBVkEgICAgICAgIExhbmd1YWdlID0gMSAvLyBhbHNvIGluY2x1ZGVzIEtvdGxpbgorCUxhbmd1YWdlX0xBTkdVQUdFX0NQUCAgICAgICAgIExhbmd1YWdlID0gMgorKQorCisvLyBFbnVtIHZhbHVlIG1hcHMgZm9yIExhbmd1YWdlLgordmFyICgKKwlMYW5ndWFnZV9uYW1lID0gbWFwW2ludDMyXXN0cmluZ3sKKwkJMDogIkxBTkdVQUdFX1VOU1BFQ0lGSUVEIiwKKwkJMTogIkxBTkdVQUdFX0pBVkEiLAorCQkyOiAiTEFOR1VBR0VfQ1BQIiwKKwl9CisJTGFuZ3VhZ2VfdmFsdWUgPSBtYXBbc3RyaW5nXWludDMyeworCQkiTEFOR1VBR0VfVU5TUEVDSUZJRUQiOiAwLAorCQkiTEFOR1VBR0VfSkFWQSI6ICAgICAgICAxLAorCQkiTEFOR1VBR0VfQ1BQIjogICAgICAgICAyLAorCX0KKykKKworZnVuYyAoeCBMYW5ndWFnZSkgRW51bSgpICpMYW5ndWFnZSB7CisJcCA6PSBuZXcoTGFuZ3VhZ2UpCisJKnAgPSB4CisJcmV0dXJuIHAKK30KKworZnVuYyAoeCBMYW5ndWFnZSkgU3RyaW5nKCkgc3RyaW5nIHsKKwlyZXR1cm4gcHJvdG9pbXBsLlguRW51bVN0cmluZ09mKHguRGVzY3JpcHRvcigpLCBwcm90b3JlZmxlY3QuRW51bU51bWJlcih4KSkKK30KKworZnVuYyAoTGFuZ3VhZ2UpIERlc2NyaXB0b3IoKSBwcm90b3JlZmxlY3QuRW51bURlc2NyaXB0b3IgeworCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19lbnVtVHlwZXNbMF0uRGVzY3JpcHRvcigpCit9CisKK2Z1bmMgKExhbmd1YWdlKSBUeXBlKCkgcHJvdG9yZWZsZWN0LkVudW1UeXBlIHsKKwlyZXR1cm4gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX2VudW1UeXBlc1swXQorfQorCitmdW5jICh4IExhbmd1YWdlKSBOdW1iZXIoKSBwcm90b3JlZmxlY3QuRW51bU51bWJlciB7CisJcmV0dXJuIHByb3RvcmVmbGVjdC5FbnVtTnVtYmVyKHgpCit9CisKKy8vIERlcHJlY2F0ZWQ6IFVzZSBMYW5ndWFnZS5EZXNjcmlwdG9yIGluc3RlYWQuCitmdW5jIChMYW5ndWFnZSkgRW51bURlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgeworCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHswfQorfQorCit0eXBlIEFuYWx5c2lzUmVzdWx0X1N0YXR1c19Db2RlIGludDMyCisKK2NvbnN0ICgKKwlBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ09ERV9VTlNQRUNJRklFRCAgQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NvZGUgPSAwCisJQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NPREVfT0sgICAgICAgICAgIEFuYWx5c2lzUmVzdWx0X1N0YXR1c19Db2RlID0gMQorCUFuYWx5c2lzUmVzdWx0X1N0YXR1c19DT0RFX05PVF9GT1VORCAgICBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSA9IDIgLy8gbm8gdGFyZ2V0IG9yIG1vZHVsZSBmb3VuZCBmb3IgdGhlIHNvdXJjZSBmaWxlLgorCUFuYWx5c2lzUmVzdWx0X1N0YXR1c19DT0RFX0JVSUxEX0ZBSUxFRCBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSA9IDMKKykKKworLy8gRW51bSB2YWx1ZSBtYXBzIGZvciBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZS4KK3ZhciAoCisJQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NvZGVfbmFtZSA9IG1hcFtpbnQzMl1zdHJpbmd7CisJCTA6ICJDT0RFX1VOU1BFQ0lGSUVEIiwKKwkJMTogIkNPREVfT0siLAorCQkyOiAiQ09ERV9OT1RfRk9VTkQiLAorCQkzOiAiQ09ERV9CVUlMRF9GQUlMRUQiLAorCX0KKwlBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZV92YWx1ZSA9IG1hcFtzdHJpbmddaW50MzJ7CisJCSJDT0RFX1VOU1BFQ0lGSUVEIjogIDAsCisJCSJDT0RFX09LIjogICAgICAgICAgIDEsCisJCSJDT0RFX05PVF9GT1VORCI6ICAgIDIsCisJCSJDT0RFX0JVSUxEX0ZBSUxFRCI6IDMsCisJfQorKQorCitmdW5jICh4IEFuYWx5c2lzUmVzdWx0X1N0YXR1c19Db2RlKSBFbnVtKCkgKkFuYWx5c2lzUmVzdWx0X1N0YXR1c19Db2RlIHsKKwlwIDo9IG5ldyhBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSkKKwkqcCA9IHgKKwlyZXR1cm4gcAorfQorCitmdW5jICh4IEFuYWx5c2lzUmVzdWx0X1N0YXR1c19Db2RlKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5FbnVtU3RyaW5nT2YoeC5EZXNjcmlwdG9yKCksIHByb3RvcmVmbGVjdC5FbnVtTnVtYmVyKHgpKQorfQorCitmdW5jIChBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSkgRGVzY3JpcHRvcigpIHByb3RvcmVmbGVjdC5FbnVtRGVzY3JpcHRvciB7CisJcmV0dXJuIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX2VudW1UeXBlc1sxXS5EZXNjcmlwdG9yKCkKK30KKworZnVuYyAoQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NvZGUpIFR5cGUoKSBwcm90b3JlZmxlY3QuRW51bVR5cGUgeworCXJldHVybiAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fZW51bVR5cGVzWzFdCit9CisKK2Z1bmMgKHggQW5hbHlzaXNSZXN1bHRfU3RhdHVzX0NvZGUpIE51bWJlcigpIHByb3RvcmVmbGVjdC5FbnVtTnVtYmVyIHsKKwlyZXR1cm4gcHJvdG9yZWZsZWN0LkVudW1OdW1iZXIoeCkKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIEFuYWx5c2lzUmVzdWx0X1N0YXR1c19Db2RlLkRlc2NyaXB0b3IgaW5zdGVhZC4KK2Z1bmMgKEFuYWx5c2lzUmVzdWx0X1N0YXR1c19Db2RlKSBFbnVtRGVzY3JpcHRvcigpIChbXWJ5dGUsIFtdaW50KSB7CisJcmV0dXJuIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX3Jhd0Rlc2NHWklQKCksIFtdaW50ezMsIDAsIDB9Cit9CisKK3R5cGUgR2VuZXJhdGVkRmlsZSBzdHJ1Y3QgeworCXN0YXRlICAgICAgICAgcHJvdG9pbXBsLk1lc3NhZ2VTdGF0ZQorCXNpemVDYWNoZSAgICAgcHJvdG9pbXBsLlNpemVDYWNoZQorCXVua25vd25GaWVsZHMgcHJvdG9pbXBsLlVua25vd25GaWVsZHMKKworCS8vIFBhdGggdG8gdGhlIGZpbGUgcmVsYXRpdmUgdG8gYnVpbGRfb3V0X2Rpci4KKwlQYXRoIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDEsb3B0LG5hbWU9cGF0aCxwcm90bzMiIGpzb246InBhdGgsb21pdGVtcHR5ImAKKwkvLyBUaGUgdGV4dCBvZiB0aGUgZ2VuZXJhdGVkIGZpbGUsIGlmIG5vdCBwcm92aWRlZCBjb250ZW50cyB3aWxsIGJlIHJlYWQKKwkvLyBmcm9tIHRoZSBwYXRoIGFib3ZlIGluIHVzZXIncyB3b3Jrc3RhdGlvbi4KKwlDb250ZW50cyBbXWJ5dGUgYHByb3RvYnVmOiJieXRlcywyLG9wdCxuYW1lPWNvbnRlbnRzLHByb3RvMyxvbmVvZiIganNvbjoiY29udGVudHMsb21pdGVtcHR5ImAKK30KKworZnVuYyAoeCAqR2VuZXJhdGVkRmlsZSkgUmVzZXQoKSB7CisJKnggPSBHZW5lcmF0ZWRGaWxle30KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCB7CisJCW1pIDo9ICZmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1swXQorCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKKwkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwl9Cit9CisKK2Z1bmMgKHggKkdlbmVyYXRlZEZpbGUpIFN0cmluZygpIHN0cmluZyB7CisJcmV0dXJuIHByb3RvaW1wbC5YLk1lc3NhZ2VTdHJpbmdPZih4KQorfQorCitmdW5jICgqR2VuZXJhdGVkRmlsZSkgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqR2VuZXJhdGVkRmlsZSkgUHJvdG9SZWZsZWN0KCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2UgeworCW1pIDo9ICZmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1swXQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkICYmIHggIT0gbmlsIHsKKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCWlmIG1zLkxvYWRNZXNzYWdlSW5mbygpID09IG5pbCB7CisJCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCQl9CisJCXJldHVybiBtcworCX0KKwlyZXR1cm4gbWkuTWVzc2FnZU9mKHgpCit9CisKKy8vIERlcHJlY2F0ZWQ6IFVzZSBHZW5lcmF0ZWRGaWxlLlByb3RvUmVmbGVjdC5EZXNjcmlwdG9yIGluc3RlYWQuCitmdW5jICgqR2VuZXJhdGVkRmlsZSkgRGVzY3JpcHRvcigpIChbXWJ5dGUsIFtdaW50KSB7CisJcmV0dXJuIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX3Jhd0Rlc2NHWklQKCksIFtdaW50ezB9Cit9CisKK2Z1bmMgKHggKkdlbmVyYXRlZEZpbGUpIEdldFBhdGgoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguUGF0aAorCX0KKwlyZXR1cm4gIiIKK30KKworZnVuYyAoeCAqR2VuZXJhdGVkRmlsZSkgR2V0Q29udGVudHMoKSBbXWJ5dGUgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguQ29udGVudHMKKwl9CisJcmV0dXJuIG5pbAorfQorCit0eXBlIElkZUFuYWx5c2lzIHN0cnVjdCB7CisJc3RhdGUgICAgICAgICBwcm90b2ltcGwuTWVzc2FnZVN0YXRlCisJc2l6ZUNhY2hlICAgICBwcm90b2ltcGwuU2l6ZUNhY2hlCisJdW5rbm93bkZpZWxkcyBwcm90b2ltcGwuVW5rbm93bkZpZWxkcworCisJLy8gRGlyZWN0b3J5IHRoYXQgY29udGFpbnMgYnVpbGQgb3V0cHV0cyBnZW5lcmF0ZWQgYnkgdGhlIGJ1aWxkIHN5c3RlbS4KKwkvLyBSZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QuCisJQnVpbGRPdXREaXIgc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMSxvcHQsbmFtZT1idWlsZF9vdXRfZGlyLGpzb249YnVpbGRPdXREaXIscHJvdG8zIiBqc29uOiJidWlsZF9vdXRfZGlyLG9taXRlbXB0eSJgCisJLy8gV29ya2luZyBkaXJlY3RvcnkgdXNlZCBieSB0aGUgYnVpbGQgc3lzdGVtLgorCS8vIFJlbGF0aXZlIHRvIHJlcG9zaXRvcnkgcm9vdC4KKwlXb3JraW5nRGlyIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDQsb3B0LG5hbWU9d29ya2luZ19kaXIsanNvbj13b3JraW5nRGlyLHByb3RvMyIganNvbjoid29ya2luZ19kaXIsb21pdGVtcHR5ImAKKwkvLyBPbmx5IHNldCBpZiB0aGUgd2hvbGUgcXVlcnkgZmFpbGVkLgorCUVycm9yICpBbmFseXNpc0Vycm9yIGBwcm90b2J1ZjoiYnl0ZXMsNSxvcHQsbmFtZT1lcnJvcixwcm90bzMsb25lb2YiIGpzb246ImVycm9yLG9taXRlbXB0eSJgCisJLy8gTGlzdCBvZiByZXN1bHRzLCBvbmUgcGVyIHF1ZXJpZWQgZmlsZS4KKwlSZXN1bHRzIFtdKkFuYWx5c2lzUmVzdWx0IGBwcm90b2J1ZjoiYnl0ZXMsNixyZXAsbmFtZT1yZXN1bHRzLHByb3RvMyIganNvbjoicmVzdWx0cyxvbWl0ZW1wdHkiYAorCS8vIExpc3Qgb2YgYnVpbGRhYmxlIHVuaXRzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgcmVmZXJlbmNlcyBieSB0aGUgcmVzdWx0cy4KKwlVbml0cyBbXSpCdWlsZGFibGVVbml0IGBwcm90b2J1ZjoiYnl0ZXMsNyxyZXAsbmFtZT11bml0cyxwcm90bzMiIGpzb246InVuaXRzLG9taXRlbXB0eSJgCit9CisKK2Z1bmMgKHggKklkZUFuYWx5c2lzKSBSZXNldCgpIHsKKwkqeCA9IElkZUFuYWx5c2lze30KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCB7CisJCW1pIDo9ICZmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1sxXQorCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKKwkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwl9Cit9CisKK2Z1bmMgKHggKklkZUFuYWx5c2lzKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKklkZUFuYWx5c2lzKSBQcm90b01lc3NhZ2UoKSB7fQorCitmdW5jICh4ICpJZGVBbmFseXNpcykgUHJvdG9SZWZsZWN0KCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2UgeworCW1pIDo9ICZmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1sxXQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkICYmIHggIT0gbmlsIHsKKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCWlmIG1zLkxvYWRNZXNzYWdlSW5mbygpID09IG5pbCB7CisJCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCQl9CisJCXJldHVybiBtcworCX0KKwlyZXR1cm4gbWkuTWVzc2FnZU9mKHgpCit9CisKKy8vIERlcHJlY2F0ZWQ6IFVzZSBJZGVBbmFseXNpcy5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoKklkZUFuYWx5c2lzKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKwlyZXR1cm4gZmlsZV9pZGVfcXVlcnlfcHJvdG9fcmF3RGVzY0daSVAoKSwgW11pbnR7MX0KK30KKworZnVuYyAoeCAqSWRlQW5hbHlzaXMpIEdldEJ1aWxkT3V0RGlyKCkgc3RyaW5nIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LkJ1aWxkT3V0RGlyCisJfQorCXJldHVybiAiIgorfQorCitmdW5jICh4ICpJZGVBbmFseXNpcykgR2V0V29ya2luZ0RpcigpIHN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5Xb3JraW5nRGlyCisJfQorCXJldHVybiAiIgorfQorCitmdW5jICh4ICpJZGVBbmFseXNpcykgR2V0RXJyb3IoKSAqQW5hbHlzaXNFcnJvciB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5FcnJvcgorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKklkZUFuYWx5c2lzKSBHZXRSZXN1bHRzKCkgW10qQW5hbHlzaXNSZXN1bHQgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguUmVzdWx0cworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKklkZUFuYWx5c2lzKSBHZXRVbml0cygpIFtdKkJ1aWxkYWJsZVVuaXQgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguVW5pdHMKKwl9CisJcmV0dXJuIG5pbAorfQorCit0eXBlIEFuYWx5c2lzRXJyb3Igc3RydWN0IHsKKwlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKKwlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKKwl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCisKKwkvLyBIdW1hbiByZWFkYWJsZSBlcnJvciBtZXNzYWdlLgorCUVycm9yTWVzc2FnZSBzdHJpbmcgYHByb3RvYnVmOiJieXRlcywxLG9wdCxuYW1lPWVycm9yX21lc3NhZ2UsanNvbj1lcnJvck1lc3NhZ2UscHJvdG8zIiBqc29uOiJlcnJvcl9tZXNzYWdlLG9taXRlbXB0eSJgCit9CisKK2Z1bmMgKHggKkFuYWx5c2lzRXJyb3IpIFJlc2V0KCkgeworCSp4ID0gQW5hbHlzaXNFcnJvcnt9CisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgeworCQltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbMl0KKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJfQorfQorCitmdW5jICh4ICpBbmFseXNpc0Vycm9yKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKkFuYWx5c2lzRXJyb3IpIFByb3RvTWVzc2FnZSgpIHt9CisKK2Z1bmMgKHggKkFuYWx5c2lzRXJyb3IpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKKwltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbMl0KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7CisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgeworCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwkJfQorCQlyZXR1cm4gbXMKKwl9CisJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgQW5hbHlzaXNFcnJvci5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoKkFuYWx5c2lzRXJyb3IpIERlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgeworCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHsyfQorfQorCitmdW5jICh4ICpBbmFseXNpc0Vycm9yKSBHZXRFcnJvck1lc3NhZ2UoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguRXJyb3JNZXNzYWdlCisJfQorCXJldHVybiAiIgorfQorCit0eXBlIEFuYWx5c2lzUmVzdWx0IHN0cnVjdCB7CisJc3RhdGUgICAgICAgICBwcm90b2ltcGwuTWVzc2FnZVN0YXRlCisJc2l6ZUNhY2hlICAgICBwcm90b2ltcGwuU2l6ZUNhY2hlCisJdW5rbm93bkZpZWxkcyBwcm90b2ltcGwuVW5rbm93bkZpZWxkcworCisJLy8gUGF0aCB0byB0aGUgc291cmNlIGZpbGUgdGhhdCB3YXMgcXVlcmllZCwgcmVsYXRpdmUgdG8gcmVwb3NpdG9yeSByb290LgorCVNvdXJjZUZpbGVQYXRoIHN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDEsb3B0LG5hbWU9c291cmNlX2ZpbGVfcGF0aCxqc29uPXNvdXJjZUZpbGVQYXRoLHByb3RvMyIganNvbjoic291cmNlX2ZpbGVfcGF0aCxvbWl0ZW1wdHkiYAorCS8vIFJlcHJlc2VudHMgc3RhdHVzIGZvciB0aGlzIHJlc3VsdC4gZS5nLiBub3QgcGFydCBvZiB0aGUgYnVpbGQgZ3JhcGguCisJU3RhdHVzICpBbmFseXNpc1Jlc3VsdF9TdGF0dXMgYHByb3RvYnVmOiJieXRlcywyLG9wdCxuYW1lPXN0YXR1cyxwcm90bzMiIGpzb246InN0YXR1cyxvbWl0ZW1wdHkiYAorCS8vIElEIG9mIGJ1aWxkYWJsZSB1bml0IHRoYXQgY29udGFpbnMgdGhlIHNvdXJjZSBmaWxlLgorCS8vIFRoZSBpZGVfcXVlcnkgc2NyaXB0IGNhbiBjaG9vc2UgdGhlIG1vc3QgcmVsZXZhbnQgdW5pdCBmcm9tIG11bHRpcGxlCisJLy8gb3B0aW9ucy4KKwlVbml0SWQgc3RyaW5nIGBwcm90b2J1ZjoiYnl0ZXMsMyxvcHQsbmFtZT11bml0X2lkLGpzb249dW5pdElkLHByb3RvMyIganNvbjoidW5pdF9pZCxvbWl0ZW1wdHkiYAorCS8vIEludmFsaWRhdGlvbiBydWxlIHRvIGNoZWNrIGlmIHRoZSByZXN1bHQgaXMgc3RpbGwgdmFsaWQuCisJSW52YWxpZGF0aW9uICpJbnZhbGlkYXRpb24gYHByb3RvYnVmOiJieXRlcyw0LG9wdCxuYW1lPWludmFsaWRhdGlvbixwcm90bzMiIGpzb246ImludmFsaWRhdGlvbixvbWl0ZW1wdHkiYAorfQorCitmdW5jICh4ICpBbmFseXNpc1Jlc3VsdCkgUmVzZXQoKSB7CisJKnggPSBBbmFseXNpc1Jlc3VsdHt9CisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgeworCQltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbM10KKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJfQorfQorCitmdW5jICh4ICpBbmFseXNpc1Jlc3VsdCkgU3RyaW5nKCkgc3RyaW5nIHsKKwlyZXR1cm4gcHJvdG9pbXBsLlguTWVzc2FnZVN0cmluZ09mKHgpCit9CisKK2Z1bmMgKCpBbmFseXNpc1Jlc3VsdCkgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqQW5hbHlzaXNSZXN1bHQpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKKwltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbM10KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7CisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgeworCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwkJfQorCQlyZXR1cm4gbXMKKwl9CisJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgQW5hbHlzaXNSZXN1bHQuUHJvdG9SZWZsZWN0LkRlc2NyaXB0b3IgaW5zdGVhZC4KK2Z1bmMgKCpBbmFseXNpc1Jlc3VsdCkgRGVzY3JpcHRvcigpIChbXWJ5dGUsIFtdaW50KSB7CisJcmV0dXJuIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX3Jhd0Rlc2NHWklQKCksIFtdaW50ezN9Cit9CisKK2Z1bmMgKHggKkFuYWx5c2lzUmVzdWx0KSBHZXRTb3VyY2VGaWxlUGF0aCgpIHN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5Tb3VyY2VGaWxlUGF0aAorCX0KKwlyZXR1cm4gIiIKK30KKworZnVuYyAoeCAqQW5hbHlzaXNSZXN1bHQpIEdldFN0YXR1cygpICpBbmFseXNpc1Jlc3VsdF9TdGF0dXMgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguU3RhdHVzCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqQW5hbHlzaXNSZXN1bHQpIEdldFVuaXRJZCgpIHN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5Vbml0SWQKKwl9CisJcmV0dXJuICIiCit9CisKK2Z1bmMgKHggKkFuYWx5c2lzUmVzdWx0KSBHZXRJbnZhbGlkYXRpb24oKSAqSW52YWxpZGF0aW9uIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LkludmFsaWRhdGlvbgorCX0KKwlyZXR1cm4gbmlsCit9CisKK3R5cGUgQnVpbGRhYmxlVW5pdCBzdHJ1Y3QgeworCXN0YXRlICAgICAgICAgcHJvdG9pbXBsLk1lc3NhZ2VTdGF0ZQorCXNpemVDYWNoZSAgICAgcHJvdG9pbXBsLlNpemVDYWNoZQorCXVua25vd25GaWVsZHMgcHJvdG9pbXBsLlVua25vd25GaWVsZHMKKworCS8vIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBidWlsZGFibGUgdW5pdC4KKwkvLworCS8vIEV4YW1wbGVzOgorCS8vICAgLSBKYXZhOiBtb2R1bGUgb3IgdGFyZ2V0IG5hbWUsIGUuZy4gImZyYW1ld29yay1ibHVldG9vdGgiIG9yCisJLy8gICAgICIvL3RoaXJkX3BhcnR5L2hhbWNyZXN0OmhhbWNyZXN0X2phdmEiCisJLy8gICAtIEMrKzogc291cmNlIGZpbGUsIGUuZy4gInBhdGgvdG8vZmlsZS5jYyIKKwlJZCBzdHJpbmcgYHByb3RvYnVmOiJieXRlcywxLG9wdCxuYW1lPWlkLHByb3RvMyIganNvbjoiaWQsb21pdGVtcHR5ImAKKwkvLyBMYW5ndWFnZSBvZiB0aGUgdW5pdC4KKwkvLyBSZXF1aXJlZCBmb3IgYnVpbGRhYmxlIHVuaXRzIGRpcmVjdGx5IHJlZmVyZW5jZWQgYnkgdGhlIEFuYWx5c2lzUmVzdWx0LAorCS8vIGUuZy4gdGhlIHVuaXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb21waWxhdGlvbiBzdGFnZSBmb3IgdGhlIHNvdXJjZSBmaWxlLgorCUxhbmd1YWdlIExhbmd1YWdlIGBwcm90b2J1ZjoidmFyaW50LDIsb3B0LG5hbWU9bGFuZ3VhZ2UscHJvdG8zLGVudW09aWRlX3F1ZXJ5Lkxhbmd1YWdlIiBqc29uOiJsYW5ndWFnZSxvbWl0ZW1wdHkiYAorCS8vIFNvdXJjZSBmaWxlcyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgdW5pdC4KKwkvLyBQYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHdvcmtpbmdfZGlyLgorCVNvdXJjZUZpbGVQYXRocyBbXXN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDMscmVwLG5hbWU9c291cmNlX2ZpbGVfcGF0aHMsanNvbj1zb3VyY2VGaWxlUGF0aHMscHJvdG8zIiBqc29uOiJzb3VyY2VfZmlsZV9wYXRocyxvbWl0ZW1wdHkiYAorCS8vIENvbXBpbGVyIGFyZ3VtZW50cyB0byBjb21waWxlIHRoZSBzb3VyY2UgZmlsZXMuCisJQ29tcGlsZXJBcmd1bWVudHMgW11zdHJpbmcgYHByb3RvYnVmOiJieXRlcyw0LHJlcCxuYW1lPWNvbXBpbGVyX2FyZ3VtZW50cyxqc29uPWNvbXBpbGVyQXJndW1lbnRzLHByb3RvMyIganNvbjoiY29tcGlsZXJfYXJndW1lbnRzLG9taXRlbXB0eSJgCisJLy8gTGlzdCBvZiBnZW5lcmF0ZWQgZmlsZXMgcHJvZHVjZWQgYnkgdGhpcyB1bml0LgorCUdlbmVyYXRlZEZpbGVzIFtdKkdlbmVyYXRlZEZpbGUgYHByb3RvYnVmOiJieXRlcyw1LHJlcCxuYW1lPWdlbmVyYXRlZF9maWxlcyxqc29uPWdlbmVyYXRlZEZpbGVzLHByb3RvMyIganNvbjoiZ2VuZXJhdGVkX2ZpbGVzLG9taXRlbXB0eSJgCisJLy8gTGlzdCBvZiBvdGhlciBCdWlsZGFibGVVbml0cyB0aGlzIHVuaXQgZGVwZW5kIG9uLgorCURlcGVuZGVuY3lJZHMgW11zdHJpbmcgYHByb3RvYnVmOiJieXRlcyw2LHJlcCxuYW1lPWRlcGVuZGVuY3lfaWRzLGpzb249ZGVwZW5kZW5jeUlkcyxwcm90bzMiIGpzb246ImRlcGVuZGVuY3lfaWRzLG9taXRlbXB0eSJgCit9CisKK2Z1bmMgKHggKkJ1aWxkYWJsZVVuaXQpIFJlc2V0KCkgeworCSp4ID0gQnVpbGRhYmxlVW5pdHt9CisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgeworCQltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbNF0KKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJfQorfQorCitmdW5jICh4ICpCdWlsZGFibGVVbml0KSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKkJ1aWxkYWJsZVVuaXQpIFByb3RvTWVzc2FnZSgpIHt9CisKK2Z1bmMgKHggKkJ1aWxkYWJsZVVuaXQpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKKwltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbNF0KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7CisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgeworCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwkJfQorCQlyZXR1cm4gbXMKKwl9CisJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgQnVpbGRhYmxlVW5pdC5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoKkJ1aWxkYWJsZVVuaXQpIERlc2NyaXB0b3IoKSAoW11ieXRlLCBbXWludCkgeworCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjR1pJUCgpLCBbXWludHs0fQorfQorCitmdW5jICh4ICpCdWlsZGFibGVVbml0KSBHZXRJZCgpIHN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5JZAorCX0KKwlyZXR1cm4gIiIKK30KKworZnVuYyAoeCAqQnVpbGRhYmxlVW5pdCkgR2V0TGFuZ3VhZ2UoKSBMYW5ndWFnZSB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5MYW5ndWFnZQorCX0KKwlyZXR1cm4gTGFuZ3VhZ2VfTEFOR1VBR0VfVU5TUEVDSUZJRUQKK30KKworZnVuYyAoeCAqQnVpbGRhYmxlVW5pdCkgR2V0U291cmNlRmlsZVBhdGhzKCkgW11zdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguU291cmNlRmlsZVBhdGhzCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqQnVpbGRhYmxlVW5pdCkgR2V0Q29tcGlsZXJBcmd1bWVudHMoKSBbXXN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5Db21waWxlckFyZ3VtZW50cworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKkJ1aWxkYWJsZVVuaXQpIEdldEdlbmVyYXRlZEZpbGVzKCkgW10qR2VuZXJhdGVkRmlsZSB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5HZW5lcmF0ZWRGaWxlcworCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHggKkJ1aWxkYWJsZVVuaXQpIEdldERlcGVuZGVuY3lJZHMoKSBbXXN0cmluZyB7CisJaWYgeCAhPSBuaWwgeworCQlyZXR1cm4geC5EZXBlbmRlbmN5SWRzCisJfQorCXJldHVybiBuaWwKK30KKworLy8gSW52YWxpZGF0aW9uIHJ1bGUgdG8gY2hlY2sgaWYgdGhlIHJlc3VsdCBpcyBzdGlsbCB2YWxpZC4KKy8vIFRoaXMgc2hvdWxkIGNvbnRhaW4gZmlsZXMvZGlycyB0aGF0IGFyZSBub3QgZGlyZWN0bHkgcGFydCBvZiB0aGUgYnVpbGQgZ3JhcGgKKy8vIGJ1dCBzdGlsbCBhZmZlY3QgdGhlIHJlc3VsdC4gRm9yIGV4YW1wbGUgQlVJTEQgZmlsZXMsIGRpcmVjdG9yeSB0byB0aGUKKy8vIHRvb2xjaGFpbiBvciBjb25maWcgZmlsZXMgZXRjLgordHlwZSBJbnZhbGlkYXRpb24gc3RydWN0IHsKKwlzdGF0ZSAgICAgICAgIHByb3RvaW1wbC5NZXNzYWdlU3RhdGUKKwlzaXplQ2FjaGUgICAgIHByb3RvaW1wbC5TaXplQ2FjaGUKKwl1bmtub3duRmllbGRzIHByb3RvaW1wbC5Vbmtub3duRmllbGRzCisKKwkvLyBJZiBhbnkgb2YgdGhlc2UgZmlsZXMgY2hhbmdlIHRoZSByZXN1bHQgbWF5IGJlY29tZSBpbnZhbGlkLgorCS8vIFBhdGggdG8gdGhlIGZpbGUgcmVsYXRpdmUgdG8gcmVwb3NpdG9yeSByb290LgorCUZpbGVQYXRocyBbXXN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDEscmVwLG5hbWU9ZmlsZV9wYXRocyxqc29uPWZpbGVQYXRocyxwcm90bzMiIGpzb246ImZpbGVfcGF0aHMsb21pdGVtcHR5ImAKKwkvLyBJZiBhbnkgb2YgdGhlc2UgcnVsZXMgbWF0Y2ggYSBjaGFuZ2VkIGZpbGUgdGhlIHJlc3VsdCBtYXkgYmVjb21lIGludmFsaWQuCisJV2lsZGNhcmRzIFtdKkludmFsaWRhdGlvbl9XaWxkY2FyZCBgcHJvdG9idWY6ImJ5dGVzLDQscmVwLG5hbWU9d2lsZGNhcmRzLHByb3RvMyIganNvbjoid2lsZGNhcmRzLG9taXRlbXB0eSJgCit9CisKK2Z1bmMgKHggKkludmFsaWRhdGlvbikgUmVzZXQoKSB7CisJKnggPSBJbnZhbGlkYXRpb257fQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKKwkJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzVdCisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCX0KK30KKworZnVuYyAoeCAqSW52YWxpZGF0aW9uKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKkludmFsaWRhdGlvbikgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqSW52YWxpZGF0aW9uKSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7CisJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzVdCisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgJiYgeCAhPSBuaWwgeworCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKKwkJaWYgbXMuTG9hZE1lc3NhZ2VJbmZvKCkgPT0gbmlsIHsKKwkJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJCX0KKwkJcmV0dXJuIG1zCisJfQorCXJldHVybiBtaS5NZXNzYWdlT2YoeCkKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIEludmFsaWRhdGlvbi5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoKkludmFsaWRhdGlvbikgRGVzY3JpcHRvcigpIChbXWJ5dGUsIFtdaW50KSB7CisJcmV0dXJuIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX3Jhd0Rlc2NHWklQKCksIFtdaW50ezV9Cit9CisKK2Z1bmMgKHggKkludmFsaWRhdGlvbikgR2V0RmlsZVBhdGhzKCkgW11zdHJpbmcgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguRmlsZVBhdGhzCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAoeCAqSW52YWxpZGF0aW9uKSBHZXRXaWxkY2FyZHMoKSBbXSpJbnZhbGlkYXRpb25fV2lsZGNhcmQgeworCWlmIHggIT0gbmlsIHsKKwkJcmV0dXJuIHguV2lsZGNhcmRzCisJfQorCXJldHVybiBuaWwKK30KKworLy8gSW5kaWNhdGVzIHRoZSBzdWNjZXNzL2ZhaWx1cmUgZm9yIHRoZSBxdWVyeS4KK3R5cGUgQW5hbHlzaXNSZXN1bHRfU3RhdHVzIHN0cnVjdCB7CisJc3RhdGUgICAgICAgICBwcm90b2ltcGwuTWVzc2FnZVN0YXRlCisJc2l6ZUNhY2hlICAgICBwcm90b2ltcGwuU2l6ZUNhY2hlCisJdW5rbm93bkZpZWxkcyBwcm90b2ltcGwuVW5rbm93bkZpZWxkcworCisJQ29kZSBBbmFseXNpc1Jlc3VsdF9TdGF0dXNfQ29kZSBgcHJvdG9idWY6InZhcmludCwxLG9wdCxuYW1lPWNvZGUscHJvdG8zLGVudW09aWRlX3F1ZXJ5LkFuYWx5c2lzUmVzdWx0X1N0YXR1c19Db2RlIiBqc29uOiJjb2RlLG9taXRlbXB0eSJgCisJLy8gRGV0YWlscyBhYm91dCB0aGUgc3RhdHVzLCBtaWdodCBiZSBkaXNwbGF5ZWQgdG8gdXNlci4KKwlTdGF0dXNNZXNzYWdlICpzdHJpbmcgYHByb3RvYnVmOiJieXRlcywyLG9wdCxuYW1lPXN0YXR1c19tZXNzYWdlLGpzb249c3RhdHVzTWVzc2FnZSxwcm90bzMsb25lb2YiIGpzb246InN0YXR1c19tZXNzYWdlLG9taXRlbXB0eSJgCit9CisKK2Z1bmMgKHggKkFuYWx5c2lzUmVzdWx0X1N0YXR1cykgUmVzZXQoKSB7CisJKnggPSBBbmFseXNpc1Jlc3VsdF9TdGF0dXN7fQorCWlmIHByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKKwkJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzZdCisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQltcy5TdG9yZU1lc3NhZ2VJbmZvKG1pKQorCX0KK30KKworZnVuYyAoeCAqQW5hbHlzaXNSZXN1bHRfU3RhdHVzKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwcm90b2ltcGwuWC5NZXNzYWdlU3RyaW5nT2YoeCkKK30KKworZnVuYyAoKkFuYWx5c2lzUmVzdWx0X1N0YXR1cykgUHJvdG9NZXNzYWdlKCkge30KKworZnVuYyAoeCAqQW5hbHlzaXNSZXN1bHRfU3RhdHVzKSBQcm90b1JlZmxlY3QoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7CisJbWkgOj0gJmZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzZdCisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgJiYgeCAhPSBuaWwgeworCQltcyA6PSBwcm90b2ltcGwuWC5NZXNzYWdlU3RhdGVPZihwcm90b2ltcGwuUG9pbnRlcih4KSkKKwkJaWYgbXMuTG9hZE1lc3NhZ2VJbmZvKCkgPT0gbmlsIHsKKwkJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJCX0KKwkJcmV0dXJuIG1zCisJfQorCXJldHVybiBtaS5NZXNzYWdlT2YoeCkKK30KKworLy8gRGVwcmVjYXRlZDogVXNlIEFuYWx5c2lzUmVzdWx0X1N0YXR1cy5Qcm90b1JlZmxlY3QuRGVzY3JpcHRvciBpbnN0ZWFkLgorZnVuYyAoKkFuYWx5c2lzUmVzdWx0X1N0YXR1cykgRGVzY3JpcHRvcigpIChbXWJ5dGUsIFtdaW50KSB7CisJcmV0dXJuIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX3Jhd0Rlc2NHWklQKCksIFtdaW50ezMsIDB9Cit9CisKK2Z1bmMgKHggKkFuYWx5c2lzUmVzdWx0X1N0YXR1cykgR2V0Q29kZSgpIEFuYWx5c2lzUmVzdWx0X1N0YXR1c19Db2RlIHsKKwlpZiB4ICE9IG5pbCB7CisJCXJldHVybiB4LkNvZGUKKwl9CisJcmV0dXJuIEFuYWx5c2lzUmVzdWx0X1N0YXR1c19DT0RFX1VOU1BFQ0lGSUVECit9CisKK2Z1bmMgKHggKkFuYWx5c2lzUmVzdWx0X1N0YXR1cykgR2V0U3RhdHVzTWVzc2FnZSgpIHN0cmluZyB7CisJaWYgeCAhPSBuaWwgJiYgeC5TdGF0dXNNZXNzYWdlICE9IG5pbCB7CisJCXJldHVybiAqeC5TdGF0dXNNZXNzYWdlCisJfQorCXJldHVybiAiIgorfQorCit0eXBlIEludmFsaWRhdGlvbl9XaWxkY2FyZCBzdHJ1Y3QgeworCXN0YXRlICAgICAgICAgcHJvdG9pbXBsLk1lc3NhZ2VTdGF0ZQorCXNpemVDYWNoZSAgICAgcHJvdG9pbXBsLlNpemVDYWNoZQorCXVua25vd25GaWVsZHMgcHJvdG9pbXBsLlVua25vd25GaWVsZHMKKworCS8vIFByZWZpeCBvZiB0aGUgZmlsZSBwYXRoIChlLmcuICJwYXRoL3RvLyIpCisJUHJlZml4ICpzdHJpbmcgYHByb3RvYnVmOiJieXRlcywxLG9wdCxuYW1lPXByZWZpeCxwcm90bzMsb25lb2YiIGpzb246InByZWZpeCxvbWl0ZW1wdHkiYAorCS8vIFN1ZmZpeCBvZiB0aGUgZmlsZSBwYXRoIChlLmcuICJBbmRyb2lkLmJwIikKKwlTdWZmaXggKnN0cmluZyBgcHJvdG9idWY6ImJ5dGVzLDIsb3B0LG5hbWU9c3VmZml4LHByb3RvMyxvbmVvZiIganNvbjoic3VmZml4LG9taXRlbXB0eSJgCisJLy8gSWYgZmFsc2UsIHRoZSBwYXJ0IG9mIHRoZSBwYXRoIGJldHdlZW4gdGhlIGdpdmVuIGBwcmVmaXhgIGFuZCBgc3VmZml4YAorCS8vIHNob3VsZCBub3QgY29udGFpbiBkaXJlY3Rvcnkgc2VwYXJhdG9ycyAoJy8nKS4KKwlDYW5Dcm9zc0ZvbGRlciAqYm9vbCBgcHJvdG9idWY6InZhcmludCwzLG9wdCxuYW1lPWNhbl9jcm9zc19mb2xkZXIsanNvbj1jYW5Dcm9zc0ZvbGRlcixwcm90bzMsb25lb2YiIGpzb246ImNhbl9jcm9zc19mb2xkZXIsb21pdGVtcHR5ImAKK30KKworZnVuYyAoeCAqSW52YWxpZGF0aW9uX1dpbGRjYXJkKSBSZXNldCgpIHsKKwkqeCA9IEludmFsaWRhdGlvbl9XaWxkY2FyZHt9CisJaWYgcHJvdG9pbXBsLlVuc2FmZUVuYWJsZWQgeworCQltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbN10KKwkJbXMgOj0gcHJvdG9pbXBsLlguTWVzc2FnZVN0YXRlT2YocHJvdG9pbXBsLlBvaW50ZXIoeCkpCisJCW1zLlN0b3JlTWVzc2FnZUluZm8obWkpCisJfQorfQorCitmdW5jICh4ICpJbnZhbGlkYXRpb25fV2lsZGNhcmQpIFN0cmluZygpIHN0cmluZyB7CisJcmV0dXJuIHByb3RvaW1wbC5YLk1lc3NhZ2VTdHJpbmdPZih4KQorfQorCitmdW5jICgqSW52YWxpZGF0aW9uX1dpbGRjYXJkKSBQcm90b01lc3NhZ2UoKSB7fQorCitmdW5jICh4ICpJbnZhbGlkYXRpb25fV2lsZGNhcmQpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKKwltaSA6PSAmZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbN10KKwlpZiBwcm90b2ltcGwuVW5zYWZlRW5hYmxlZCAmJiB4ICE9IG5pbCB7CisJCW1zIDo9IHByb3RvaW1wbC5YLk1lc3NhZ2VTdGF0ZU9mKHByb3RvaW1wbC5Qb2ludGVyKHgpKQorCQlpZiBtcy5Mb2FkTWVzc2FnZUluZm8oKSA9PSBuaWwgeworCQkJbXMuU3RvcmVNZXNzYWdlSW5mbyhtaSkKKwkJfQorCQlyZXR1cm4gbXMKKwl9CisJcmV0dXJuIG1pLk1lc3NhZ2VPZih4KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgSW52YWxpZGF0aW9uX1dpbGRjYXJkLlByb3RvUmVmbGVjdC5EZXNjcmlwdG9yIGluc3RlYWQuCitmdW5jICgqSW52YWxpZGF0aW9uX1dpbGRjYXJkKSBEZXNjcmlwdG9yKCkgKFtdYnl0ZSwgW11pbnQpIHsKKwlyZXR1cm4gZmlsZV9pZGVfcXVlcnlfcHJvdG9fcmF3RGVzY0daSVAoKSwgW11pbnR7NSwgMH0KK30KKworZnVuYyAoeCAqSW52YWxpZGF0aW9uX1dpbGRjYXJkKSBHZXRQcmVmaXgoKSBzdHJpbmcgeworCWlmIHggIT0gbmlsICYmIHguUHJlZml4ICE9IG5pbCB7CisJCXJldHVybiAqeC5QcmVmaXgKKwl9CisJcmV0dXJuICIiCit9CisKK2Z1bmMgKHggKkludmFsaWRhdGlvbl9XaWxkY2FyZCkgR2V0U3VmZml4KCkgc3RyaW5nIHsKKwlpZiB4ICE9IG5pbCAmJiB4LlN1ZmZpeCAhPSBuaWwgeworCQlyZXR1cm4gKnguU3VmZml4CisJfQorCXJldHVybiAiIgorfQorCitmdW5jICh4ICpJbnZhbGlkYXRpb25fV2lsZGNhcmQpIEdldENhbkNyb3NzRm9sZGVyKCkgYm9vbCB7CisJaWYgeCAhPSBuaWwgJiYgeC5DYW5Dcm9zc0ZvbGRlciAhPSBuaWwgeworCQlyZXR1cm4gKnguQ2FuQ3Jvc3NGb2xkZXIKKwl9CisJcmV0dXJuIGZhbHNlCit9CisKK3ZhciBGaWxlX2lkZV9xdWVyeV9wcm90byBwcm90b3JlZmxlY3QuRmlsZURlc2NyaXB0b3IKKwordmFyIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX3Jhd0Rlc2MgPSBbXWJ5dGV7CisJMHgwYSwgMHgwZiwgMHg2OSwgMHg2NCwgMHg2NSwgMHg1ZiwgMHg3MSwgMHg3NSwgMHg2NSwgMHg3MiwgMHg3OSwgMHgyZSwgMHg3MCwgMHg3MiwgMHg2ZiwgMHg3NCwKKwkweDZmLCAweDEyLCAweDA5LCAweDY5LCAweDY0LCAweDY1LCAweDVmLCAweDcxLCAweDc1LCAweDY1LCAweDcyLCAweDc5LCAweDIyLCAweDUxLCAweDBhLCAweDBkLAorCTB4NDcsIDB4NjUsIDB4NmUsIDB4NjUsIDB4NzIsIDB4NjEsIDB4NzQsIDB4NjUsIDB4NjQsIDB4NDYsIDB4NjksIDB4NmMsIDB4NjUsIDB4MTIsIDB4MTIsIDB4MGEsCisJMHgwNCwgMHg3MCwgMHg2MSwgMHg3NCwgMHg2OCwgMHgxOCwgMHgwMSwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwOSwgMHg1MiwgMHgwNCwgMHg3MCwgMHg2MSwgMHg3NCwKKwkweDY4LCAweDEyLCAweDFmLCAweDBhLCAweDA4LCAweDYzLCAweDZmLCAweDZlLCAweDc0LCAweDY1LCAweDZlLCAweDc0LCAweDczLCAweDE4LCAweDAyLCAweDIwLAorCTB4MDEsIDB4MjgsIDB4MGMsIDB4NDgsIDB4MDAsIDB4NTIsIDB4MDgsIDB4NjMsIDB4NmYsIDB4NmUsIDB4NzQsIDB4NjUsIDB4NmUsIDB4NzQsIDB4NzMsIDB4ODgsCisJMHgwMSwgMHgwMSwgMHg0MiwgMHgwYiwgMHgwYSwgMHgwOSwgMHg1ZiwgMHg2MywgMHg2ZiwgMHg2ZSwgMHg3NCwgMHg2NSwgMHg2ZSwgMHg3NCwgMHg3MywgMHgyMiwKKwkweDgyLCAweDAyLCAweDBhLCAweDBiLCAweDQ5LCAweDY0LCAweDY1LCAweDQxLCAweDZlLCAweDYxLCAweDZjLCAweDc5LCAweDczLCAweDY5LCAweDczLCAweDEyLAorCTB4MjIsIDB4MGEsIDB4MGQsIDB4NjIsIDB4NzUsIDB4NjksIDB4NmMsIDB4NjQsIDB4NWYsIDB4NmYsIDB4NzUsIDB4NzQsIDB4NWYsIDB4NjQsIDB4NjksIDB4NzIsCisJMHgxOCwgMHgwMSwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwOSwgMHg1MiwgMHgwYiwgMHg2MiwgMHg3NSwgMHg2OSwgMHg2YywgMHg2NCwgMHg0ZiwgMHg3NSwgMHg3NCwKKwkweDQ0LCAweDY5LCAweDcyLCAweDEyLCAweDFmLCAweDBhLCAweDBiLCAweDc3LCAweDZmLCAweDcyLCAweDZiLCAweDY5LCAweDZlLCAweDY3LCAweDVmLCAweDY0LAorCTB4NjksIDB4NzIsIDB4MTgsIDB4MDQsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MDksIDB4NTIsIDB4MGEsIDB4NzcsIDB4NmYsIDB4NzIsIDB4NmIsIDB4NjksIDB4NmUsCisJMHg2NywgMHg0NCwgMHg2OSwgMHg3MiwgMHgxMiwgMHgzMywgMHgwYSwgMHgwNSwgMHg2NSwgMHg3MiwgMHg3MiwgMHg2ZiwgMHg3MiwgMHgxOCwgMHgwNSwgMHgyMCwKKwkweDAxLCAweDI4LCAweDBiLCAweDMyLCAweDE4LCAweDJlLCAweDY5LCAweDY0LCAweDY1LCAweDVmLCAweDcxLCAweDc1LCAweDY1LCAweDcyLCAweDc5LCAweDJlLAorCTB4NDEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4NzMsIDB4NjksIDB4NzMsIDB4NDUsIDB4NzIsIDB4NzIsIDB4NmYsIDB4NzIsIDB4NDgsIDB4MDAsIDB4NTIsCisJMHgwNSwgMHg2NSwgMHg3MiwgMHg3MiwgMHg2ZiwgMHg3MiwgMHg4OCwgMHgwMSwgMHgwMSwgMHgxMiwgMHgzMywgMHgwYSwgMHgwNywgMHg3MiwgMHg2NSwgMHg3MywKKwkweDc1LCAweDZjLCAweDc0LCAweDczLCAweDE4LCAweDA2LCAweDIwLCAweDAzLCAweDI4LCAweDBiLCAweDMyLCAweDE5LCAweDJlLCAweDY5LCAweDY0LCAweDY1LAorCTB4NWYsIDB4NzEsIDB4NzUsIDB4NjUsIDB4NzIsIDB4NzksIDB4MmUsIDB4NDEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4NzMsIDB4NjksIDB4NzMsIDB4NTIsCisJMHg2NSwgMHg3MywgMHg3NSwgMHg2YywgMHg3NCwgMHg1MiwgMHgwNywgMHg3MiwgMHg2NSwgMHg3MywgMHg3NSwgMHg2YywgMHg3NCwgMHg3MywgMHgxMiwgMHgyZSwKKwkweDBhLCAweDA1LCAweDc1LCAweDZlLCAweDY5LCAweDc0LCAweDczLCAweDE4LCAweDA3LCAweDIwLCAweDAzLCAweDI4LCAweDBiLCAweDMyLCAweDE4LCAweDJlLAorCTB4NjksIDB4NjQsIDB4NjUsIDB4NWYsIDB4NzEsIDB4NzUsIDB4NjUsIDB4NzIsIDB4NzksIDB4MmUsIDB4NDIsIDB4NzUsIDB4NjksIDB4NmMsIDB4NjQsIDB4NjEsCisJMHg2MiwgMHg2YywgMHg2NSwgMHg1NSwgMHg2ZSwgMHg2OSwgMHg3NCwgMHg1MiwgMHgwNSwgMHg3NSwgMHg2ZSwgMHg2OSwgMHg3NCwgMHg3MywgMHg0MiwgMHgwOCwKKwkweDBhLCAweDA2LCAweDVmLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDRhLCAweDA0LCAweDA4LCAweDAyLCAweDEwLCAweDAzLCAweDRhLCAweDA0LAorCTB4MDgsIDB4MDMsIDB4MTAsIDB4MDQsIDB4MjIsIDB4MzQsIDB4MGEsIDB4MGQsIDB4NDEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4NzMsIDB4NjksIDB4NzMsCisJMHg0NSwgMHg3MiwgMHg3MiwgMHg2ZiwgMHg3MiwgMHgxMiwgMHgyMywgMHgwYSwgMHgwZCwgMHg2NSwgMHg3MiwgMHg3MiwgMHg2ZiwgMHg3MiwgMHg1ZiwgMHg2ZCwKKwkweDY1LCAweDczLCAweDczLCAweDYxLCAweDY3LCAweDY1LCAweDE4LCAweDAxLCAweDIwLCAweDAxLCAweDI4LCAweDA5LCAweDUyLCAweDBjLCAweDY1LCAweDcyLAorCTB4NzIsIDB4NmYsIDB4NzIsIDB4NGQsIDB4NjUsIDB4NzMsIDB4NzMsIDB4NjEsIDB4NjcsIDB4NjUsIDB4MjIsIDB4YTUsIDB4MDMsIDB4MGEsIDB4MGUsIDB4NDEsCisJMHg2ZSwgMHg2MSwgMHg2YywgMHg3OSwgMHg3MywgMHg2OSwgMHg3MywgMHg1MiwgMHg2NSwgMHg3MywgMHg3NSwgMHg2YywgMHg3NCwgMHgxMiwgMHgyOCwgMHgwYSwKKwkweDEwLCAweDczLCAweDZmLCAweDc1LCAweDcyLCAweDYzLCAweDY1LCAweDVmLCAweDY2LCAweDY5LCAweDZjLCAweDY1LCAweDVmLCAweDcwLCAweDYxLCAweDc0LAorCTB4NjgsIDB4MTgsIDB4MDEsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MDksIDB4NTIsIDB4MGUsIDB4NzMsIDB4NmYsIDB4NzUsIDB4NzIsIDB4NjMsIDB4NjUsIDB4NDYsCisJMHg2OSwgMHg2YywgMHg2NSwgMHg1MCwgMHg2MSwgMHg3NCwgMHg2OCwgMHgxMiwgMHgzOCwgMHgwYSwgMHgwNiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwKKwkweDczLCAweDE4LCAweDAyLCAweDIwLCAweDAxLCAweDI4LCAweDBiLCAweDMyLCAweDIwLCAweDJlLCAweDY5LCAweDY0LCAweDY1LCAweDVmLCAweDcxLCAweDc1LAorCTB4NjUsIDB4NzIsIDB4NzksIDB4MmUsIDB4NDEsIDB4NmUsIDB4NjEsIDB4NmMsIDB4NzksIDB4NzMsIDB4NjksIDB4NzMsIDB4NTIsIDB4NjUsIDB4NzMsIDB4NzUsCisJMHg2YywgMHg3NCwgMHgyZSwgMHg1MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHg1MiwgMHgwNiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwKKwkweDczLCAweDEyLCAweDE3LCAweDBhLCAweDA3LCAweDc1LCAweDZlLCAweDY5LCAweDc0LCAweDVmLCAweDY5LCAweDY0LCAweDE4LCAweDAzLCAweDIwLCAweDAxLAorCTB4MjgsIDB4MDksIDB4NTIsIDB4MDYsIDB4NzUsIDB4NmUsIDB4NjksIDB4NzQsIDB4NDksIDB4NjQsIDB4MTIsIDB4M2IsIDB4MGEsIDB4MGMsIDB4NjksIDB4NmUsCisJMHg3NiwgMHg2MSwgMHg2YywgMHg2OSwgMHg2NCwgMHg2MSwgMHg3NCwgMHg2OSwgMHg2ZiwgMHg2ZSwgMHgxOCwgMHgwNCwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwYiwKKwkweDMyLCAweDE3LCAweDJlLCAweDY5LCAweDY0LCAweDY1LCAweDVmLCAweDcxLCAweDc1LCAweDY1LCAweDcyLCAweDc5LCAweDJlLCAweDQ5LCAweDZlLCAweDc2LAorCTB4NjEsIDB4NmMsIDB4NjksIDB4NjQsIDB4NjEsIDB4NzQsIDB4NjksIDB4NmYsIDB4NmUsIDB4NTIsIDB4MGMsIDB4NjksIDB4NmUsIDB4NzYsIDB4NjEsIDB4NmMsCisJMHg2OSwgMHg2NCwgMHg2MSwgMHg3NCwgMHg2OSwgMHg2ZiwgMHg2ZSwgMHgxYSwgMHhkOCwgMHgwMSwgMHgwYSwgMHgwNiwgMHg1MywgMHg3NCwgMHg2MSwgMHg3NCwKKwkweDc1LCAweDczLCAweDEyLCAweDM5LCAweDBhLCAweDA0LCAweDYzLCAweDZmLCAweDY0LCAweDY1LCAweDE4LCAweDAxLCAweDIwLCAweDAxLCAweDI4LCAweDBlLAorCTB4MzIsIDB4MjUsIDB4MmUsIDB4NjksIDB4NjQsIDB4NjUsIDB4NWYsIDB4NzEsIDB4NzUsIDB4NjUsIDB4NzIsIDB4NzksIDB4MmUsIDB4NDEsIDB4NmUsIDB4NjEsCisJMHg2YywgMHg3OSwgMHg3MywgMHg2OSwgMHg3MywgMHg1MiwgMHg2NSwgMHg3MywgMHg3NSwgMHg2YywgMHg3NCwgMHgyZSwgMHg1MywgMHg3NCwgMHg2MSwgMHg3NCwKKwkweDc1LCAweDczLCAweDJlLCAweDQzLCAweDZmLCAweDY0LCAweDY1LCAweDUyLCAweDA0LCAweDYzLCAweDZmLCAweDY0LCAweDY1LCAweDEyLCAweDJhLCAweDBhLAorCTB4MGUsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NzUsIDB4NzMsIDB4NWYsIDB4NmQsIDB4NjUsIDB4NzMsIDB4NzMsIDB4NjEsIDB4NjcsIDB4NjUsIDB4MTgsCisJMHgwMiwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwOSwgMHg0OCwgMHgwMCwgMHg1MiwgMHgwZCwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg3NSwgMHg3MywgMHg0ZCwKKwkweDY1LCAweDczLCAweDczLCAweDYxLCAweDY3LCAweDY1LCAweDg4LCAweDAxLCAweDAxLCAweDIyLCAweDU0LCAweDBhLCAweDA0LCAweDQzLCAweDZmLCAweDY0LAorCTB4NjUsIDB4MTIsIDB4MTQsIDB4MGEsIDB4MTAsIDB4NDMsIDB4NGYsIDB4NDQsIDB4NDUsIDB4NWYsIDB4NTUsIDB4NGUsIDB4NTMsIDB4NTAsIDB4NDUsIDB4NDMsCisJMHg0OSwgMHg0NiwgMHg0OSwgMHg0NSwgMHg0NCwgMHgxMCwgMHgwMCwgMHgxMiwgMHgwYiwgMHgwYSwgMHgwNywgMHg0MywgMHg0ZiwgMHg0NCwgMHg0NSwgMHg1ZiwKKwkweDRmLCAweDRiLCAweDEwLCAweDAxLCAweDEyLCAweDEyLCAweDBhLCAweDBlLCAweDQzLCAweDRmLCAweDQ0LCAweDQ1LCAweDVmLCAweDRlLCAweDRmLCAweDU0LAorCTB4NWYsIDB4NDYsIDB4NGYsIDB4NTUsIDB4NGUsIDB4NDQsIDB4MTAsIDB4MDIsIDB4MTIsIDB4MTUsIDB4MGEsIDB4MTEsIDB4NDMsIDB4NGYsIDB4NDQsIDB4NDUsCisJMHg1ZiwgMHg0MiwgMHg1NSwgMHg0OSwgMHg0YywgMHg0NCwgMHg1ZiwgMHg0NiwgMHg0MSwgMHg0OSwgMHg0YywgMHg0NSwgMHg0NCwgMHgxMCwgMHgwMywgMHg0MiwKKwkweDExLCAweDBhLCAweDBmLCAweDVmLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDc1LCAweDczLCAweDVmLCAweDZkLCAweDY1LCAweDczLCAweDczLCAweDYxLAorCTB4NjcsIDB4NjUsIDB4MjIsIDB4OTUsIDB4MDIsIDB4MGEsIDB4MGQsIDB4NDIsIDB4NzUsIDB4NjksIDB4NmMsIDB4NjQsIDB4NjEsIDB4NjIsIDB4NmMsIDB4NjUsCisJMHg1NSwgMHg2ZSwgMHg2OSwgMHg3NCwgMHgxMiwgMHgwZSwgMHgwYSwgMHgwMiwgMHg2OSwgMHg2NCwgMHgxOCwgMHgwMSwgMHgyMCwgMHgwMSwgMHgyOCwgMHgwOSwKKwkweDUyLCAweDAyLCAweDY5LCAweDY0LCAweDEyLCAweDJmLCAweDBhLCAweDA4LCAweDZjLCAweDYxLCAweDZlLCAweDY3LCAweDc1LCAweDYxLCAweDY3LCAweDY1LAorCTB4MTgsIDB4MDIsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MGUsIDB4MzIsIDB4MTMsIDB4MmUsIDB4NjksIDB4NjQsIDB4NjUsIDB4NWYsIDB4NzEsIDB4NzUsIDB4NjUsCisJMHg3MiwgMHg3OSwgMHgyZSwgMHg0YywgMHg2MSwgMHg2ZSwgMHg2NywgMHg3NSwgMHg2MSwgMHg2NywgMHg2NSwgMHg1MiwgMHgwOCwgMHg2YywgMHg2MSwgMHg2ZSwKKwkweDY3LCAweDc1LCAweDYxLCAweDY3LCAweDY1LCAweDEyLCAweDJhLCAweDBhLCAweDExLCAweDczLCAweDZmLCAweDc1LCAweDcyLCAweDYzLCAweDY1LCAweDVmLAorCTB4NjYsIDB4NjksIDB4NmMsIDB4NjUsIDB4NWYsIDB4NzAsIDB4NjEsIDB4NzQsIDB4NjgsIDB4NzMsIDB4MTgsIDB4MDMsIDB4MjAsIDB4MDMsIDB4MjgsIDB4MDksCisJMHg1MiwgMHgwZiwgMHg3MywgMHg2ZiwgMHg3NSwgMHg3MiwgMHg2MywgMHg2NSwgMHg0NiwgMHg2OSwgMHg2YywgMHg2NSwgMHg1MCwgMHg2MSwgMHg3NCwgMHg2OCwKKwkweDczLCAweDEyLCAweDJkLCAweDBhLCAweDEyLCAweDYzLCAweDZmLCAweDZkLCAweDcwLCAweDY5LCAweDZjLCAweDY1LCAweDcyLCAweDVmLCAweDYxLCAweDcyLAorCTB4NjcsIDB4NzUsIDB4NmQsIDB4NjUsIDB4NmUsIDB4NzQsIDB4NzMsIDB4MTgsIDB4MDQsIDB4MjAsIDB4MDMsIDB4MjgsIDB4MDksIDB4NTIsIDB4MTEsIDB4NjMsCisJMHg2ZiwgMHg2ZCwgMHg3MCwgMHg2OSwgMHg2YywgMHg2NSwgMHg3MiwgMHg0MSwgMHg3MiwgMHg2NywgMHg3NSwgMHg2ZCwgMHg2NSwgMHg2ZSwgMHg3NCwgMHg3MywKKwkweDEyLCAweDQxLCAweDBhLCAweDBmLCAweDY3LCAweDY1LCAweDZlLCAweDY1LCAweDcyLCAweDYxLCAweDc0LCAweDY1LCAweDY0LCAweDVmLCAweDY2LCAweDY5LAorCTB4NmMsIDB4NjUsIDB4NzMsIDB4MTgsIDB4MDUsIDB4MjAsIDB4MDMsIDB4MjgsIDB4MGIsIDB4MzIsIDB4MTgsIDB4MmUsIDB4NjksIDB4NjQsIDB4NjUsIDB4NWYsCisJMHg3MSwgMHg3NSwgMHg2NSwgMHg3MiwgMHg3OSwgMHgyZSwgMHg0NywgMHg2NSwgMHg2ZSwgMHg2NSwgMHg3MiwgMHg2MSwgMHg3NCwgMHg2NSwgMHg2NCwgMHg0NiwKKwkweDY5LCAweDZjLCAweDY1LCAweDUyLCAweDBlLCAweDY3LCAweDY1LCAweDZlLCAweDY1LCAweDcyLCAweDYxLCAweDc0LCAweDY1LCAweDY0LCAweDQ2LCAweDY5LAorCTB4NmMsIDB4NjUsIDB4NzMsIDB4MTIsIDB4MjUsIDB4MGEsIDB4MGUsIDB4NjQsIDB4NjUsIDB4NzAsIDB4NjUsIDB4NmUsIDB4NjQsIDB4NjUsIDB4NmUsIDB4NjMsCisJMHg3OSwgMHg1ZiwgMHg2OSwgMHg2NCwgMHg3MywgMHgxOCwgMHgwNiwgMHgyMCwgMHgwMywgMHgyOCwgMHgwOSwgMHg1MiwgMHgwZCwgMHg2NCwgMHg2NSwgMHg3MCwKKwkweDY1LCAweDZlLCAweDY0LCAweDY1LCAweDZlLCAweDYzLCAweDc5LCAweDQ5LCAweDY0LCAweDczLCAweDIyLCAweDhlLCAweDAyLCAweDBhLCAweDBjLCAweDQ5LAorCTB4NmUsIDB4NzYsIDB4NjEsIDB4NmMsIDB4NjksIDB4NjQsIDB4NjEsIDB4NzQsIDB4NjksIDB4NmYsIDB4NmUsIDB4MTIsIDB4MWQsIDB4MGEsIDB4MGEsIDB4NjYsCisJMHg2OSwgMHg2YywgMHg2NSwgMHg1ZiwgMHg3MCwgMHg2MSwgMHg3NCwgMHg2OCwgMHg3MywgMHgxOCwgMHgwMSwgMHgyMCwgMHgwMywgMHgyOCwgMHgwOSwgMHg1MiwKKwkweDA5LCAweDY2LCAweDY5LCAweDZjLCAweDY1LCAweDUwLCAweDYxLCAweDc0LCAweDY4LCAweDczLCAweDEyLCAweDNlLCAweDBhLCAweDA5LCAweDc3LCAweDY5LAorCTB4NmMsIDB4NjQsIDB4NjMsIDB4NjEsIDB4NzIsIDB4NjQsIDB4NzMsIDB4MTgsIDB4MDQsIDB4MjAsIDB4MDMsIDB4MjgsIDB4MGIsIDB4MzIsIDB4MjAsIDB4MmUsCisJMHg2OSwgMHg2NCwgMHg2NSwgMHg1ZiwgMHg3MSwgMHg3NSwgMHg2NSwgMHg3MiwgMHg3OSwgMHgyZSwgMHg0OSwgMHg2ZSwgMHg3NiwgMHg2MSwgMHg2YywgMHg2OSwKKwkweDY0LCAweDYxLCAweDc0LCAweDY5LCAweDZmLCAweDZlLCAweDJlLCAweDU3LCAweDY5LCAweDZjLCAweDY0LCAweDYzLCAweDYxLCAweDcyLCAweDY0LCAweDUyLAorCTB4MDksIDB4NzcsIDB4NjksIDB4NmMsIDB4NjQsIDB4NjMsIDB4NjEsIDB4NzIsIDB4NjQsIDB4NzMsIDB4MWEsIDB4OWUsIDB4MDEsIDB4MGEsIDB4MDgsIDB4NTcsCisJMHg2OSwgMHg2YywgMHg2NCwgMHg2MywgMHg2MSwgMHg3MiwgMHg2NCwgMHgxMiwgMHgxYiwgMHgwYSwgMHgwNiwgMHg3MCwgMHg3MiwgMHg2NSwgMHg2NiwgMHg2OSwKKwkweDc4LCAweDE4LCAweDAxLCAweDIwLCAweDAxLCAweDI4LCAweDA5LCAweDQ4LCAweDAwLCAweDUyLCAweDA2LCAweDcwLCAweDcyLCAweDY1LCAweDY2LCAweDY5LAorCTB4NzgsIDB4ODgsIDB4MDEsIDB4MDEsIDB4MTIsIDB4MWIsIDB4MGEsIDB4MDYsIDB4NzMsIDB4NzUsIDB4NjYsIDB4NjYsIDB4NjksIDB4NzgsIDB4MTgsIDB4MDIsCisJMHgyMCwgMHgwMSwgMHgyOCwgMHgwOSwgMHg0OCwgMHgwMSwgMHg1MiwgMHgwNiwgMHg3MywgMHg3NSwgMHg2NiwgMHg2NiwgMHg2OSwgMHg3OCwgMHg4OCwgMHgwMSwKKwkweDAxLCAweDEyLCAweDJkLCAweDBhLCAweDEwLCAweDYzLCAweDYxLCAweDZlLCAweDVmLCAweDYzLCAweDcyLCAweDZmLCAweDczLCAweDczLCAweDVmLCAweDY2LAorCTB4NmYsIDB4NmMsIDB4NjQsIDB4NjUsIDB4NzIsIDB4MTgsIDB4MDMsIDB4MjAsIDB4MDEsIDB4MjgsIDB4MDgsIDB4NDgsIDB4MDIsIDB4NTIsIDB4MGUsIDB4NjMsCisJMHg2MSwgMHg2ZSwgMHg0MywgMHg3MiwgMHg2ZiwgMHg3MywgMHg3MywgMHg0NiwgMHg2ZiwgMHg2YywgMHg2NCwgMHg2NSwgMHg3MiwgMHg4OCwgMHgwMSwgMHgwMSwKKwkweDQyLCAweDA5LCAweDBhLCAweDA3LCAweDVmLCAweDcwLCAweDcyLCAweDY1LCAweDY2LCAweDY5LCAweDc4LCAweDQyLCAweDA5LCAweDBhLCAweDA3LCAweDVmLAorCTB4NzMsIDB4NzUsIDB4NjYsIDB4NjYsIDB4NjksIDB4NzgsIDB4NDIsIDB4MTMsIDB4MGEsIDB4MTEsIDB4NWYsIDB4NjMsIDB4NjEsIDB4NmUsIDB4NWYsIDB4NjMsCisJMHg3MiwgMHg2ZiwgMHg3MywgMHg3MywgMHg1ZiwgMHg2NiwgMHg2ZiwgMHg2YywgMHg2NCwgMHg2NSwgMHg3MiwgMHgyYSwgMHg0OSwgMHgwYSwgMHgwOCwgMHg0YywKKwkweDYxLCAweDZlLCAweDY3LCAweDc1LCAweDYxLCAweDY3LCAweDY1LCAweDEyLCAweDE4LCAweDBhLCAweDE0LCAweDRjLCAweDQxLCAweDRlLCAweDQ3LCAweDU1LAorCTB4NDEsIDB4NDcsIDB4NDUsIDB4NWYsIDB4NTUsIDB4NGUsIDB4NTMsIDB4NTAsIDB4NDUsIDB4NDMsIDB4NDksIDB4NDYsIDB4NDksIDB4NDUsIDB4NDQsIDB4MTAsCisJMHgwMCwgMHgxMiwgMHgxMSwgMHgwYSwgMHgwZCwgMHg0YywgMHg0MSwgMHg0ZSwgMHg0NywgMHg1NSwgMHg0MSwgMHg0NywgMHg0NSwgMHg1ZiwgMHg0YSwgMHg0MSwKKwkweDU2LCAweDQxLCAweDEwLCAweDAxLCAweDEyLCAweDEwLCAweDBhLCAweDBjLCAweDRjLCAweDQxLCAweDRlLCAweDQ3LCAweDU1LCAweDQxLCAweDQ3LCAweDQ1LAorCTB4NWYsIDB4NDMsIDB4NTAsIDB4NTAsIDB4MTAsIDB4MDIsIDB4NDIsIDB4MWIsIDB4NWEsIDB4MTksIDB4NjksIDB4NjQsIDB4NjUsIDB4NWYsIDB4NzEsIDB4NzUsCisJMHg2NSwgMHg3MiwgMHg3OSwgMHgyZiwgMHg2OSwgMHg2NCwgMHg2NSwgMHg1ZiwgMHg3MSwgMHg3NSwgMHg2NSwgMHg3MiwgMHg3OSwgMHg1ZiwgMHg3MCwgMHg3MiwKKwkweDZmLCAweDc0LCAweDZmLCAweDYyLCAweDA2LCAweDcwLCAweDcyLCAweDZmLCAweDc0LCAweDZmLCAweDMzLAorfQorCit2YXIgKAorCWZpbGVfaWRlX3F1ZXJ5X3Byb3RvX3Jhd0Rlc2NPbmNlIHN5bmMuT25jZQorCWZpbGVfaWRlX3F1ZXJ5X3Byb3RvX3Jhd0Rlc2NEYXRhID0gZmlsZV9pZGVfcXVlcnlfcHJvdG9fcmF3RGVzYworKQorCitmdW5jIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX3Jhd0Rlc2NHWklQKCkgW11ieXRlIHsKKwlmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjT25jZS5EbyhmdW5jKCkgeworCQlmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjRGF0YSA9IHByb3RvaW1wbC5YLkNvbXByZXNzR1pJUChmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjRGF0YSkKKwl9KQorCXJldHVybiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjRGF0YQorfQorCit2YXIgZmlsZV9pZGVfcXVlcnlfcHJvdG9fZW51bVR5cGVzID0gbWFrZShbXXByb3RvaW1wbC5FbnVtSW5mbywgMikKK3ZhciBmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlcyA9IG1ha2UoW11wcm90b2ltcGwuTWVzc2FnZUluZm8sIDgpCit2YXIgZmlsZV9pZGVfcXVlcnlfcHJvdG9fZ29UeXBlcyA9IFtdaW50ZXJmYWNle317CisJKExhbmd1YWdlKSgwKSwgICAgICAgICAgICAgICAgICAgLy8gMDogaWRlX3F1ZXJ5Lkxhbmd1YWdlCisJKEFuYWx5c2lzUmVzdWx0X1N0YXR1c19Db2RlKSgwKSwgLy8gMTogaWRlX3F1ZXJ5LkFuYWx5c2lzUmVzdWx0LlN0YXR1cy5Db2RlCisJKCpHZW5lcmF0ZWRGaWxlKShuaWwpLCAgICAgICAgICAgLy8gMjogaWRlX3F1ZXJ5LkdlbmVyYXRlZEZpbGUKKwkoKklkZUFuYWx5c2lzKShuaWwpLCAgICAgICAgICAgICAvLyAzOiBpZGVfcXVlcnkuSWRlQW5hbHlzaXMKKwkoKkFuYWx5c2lzRXJyb3IpKG5pbCksICAgICAgICAgICAvLyA0OiBpZGVfcXVlcnkuQW5hbHlzaXNFcnJvcgorCSgqQW5hbHlzaXNSZXN1bHQpKG5pbCksICAgICAgICAgIC8vIDU6IGlkZV9xdWVyeS5BbmFseXNpc1Jlc3VsdAorCSgqQnVpbGRhYmxlVW5pdCkobmlsKSwgICAgICAgICAgIC8vIDY6IGlkZV9xdWVyeS5CdWlsZGFibGVVbml0CisJKCpJbnZhbGlkYXRpb24pKG5pbCksICAgICAgICAgICAgLy8gNzogaWRlX3F1ZXJ5LkludmFsaWRhdGlvbgorCSgqQW5hbHlzaXNSZXN1bHRfU3RhdHVzKShuaWwpLCAgIC8vIDg6IGlkZV9xdWVyeS5BbmFseXNpc1Jlc3VsdC5TdGF0dXMKKwkoKkludmFsaWRhdGlvbl9XaWxkY2FyZCkobmlsKSwgICAvLyA5OiBpZGVfcXVlcnkuSW52YWxpZGF0aW9uLldpbGRjYXJkCit9Cit2YXIgZmlsZV9pZGVfcXVlcnlfcHJvdG9fZGVwSWR4cyA9IFtdaW50MzJ7CisJNCwgLy8gMDogaWRlX3F1ZXJ5LklkZUFuYWx5c2lzLmVycm9yOnR5cGVfbmFtZSAtPiBpZGVfcXVlcnkuQW5hbHlzaXNFcnJvcgorCTUsIC8vIDE6IGlkZV9xdWVyeS5JZGVBbmFseXNpcy5yZXN1bHRzOnR5cGVfbmFtZSAtPiBpZGVfcXVlcnkuQW5hbHlzaXNSZXN1bHQKKwk2LCAvLyAyOiBpZGVfcXVlcnkuSWRlQW5hbHlzaXMudW5pdHM6dHlwZV9uYW1lIC0+IGlkZV9xdWVyeS5CdWlsZGFibGVVbml0CisJOCwgLy8gMzogaWRlX3F1ZXJ5LkFuYWx5c2lzUmVzdWx0LnN0YXR1czp0eXBlX25hbWUgLT4gaWRlX3F1ZXJ5LkFuYWx5c2lzUmVzdWx0LlN0YXR1cworCTcsIC8vIDQ6IGlkZV9xdWVyeS5BbmFseXNpc1Jlc3VsdC5pbnZhbGlkYXRpb246dHlwZV9uYW1lIC0+IGlkZV9xdWVyeS5JbnZhbGlkYXRpb24KKwkwLCAvLyA1OiBpZGVfcXVlcnkuQnVpbGRhYmxlVW5pdC5sYW5ndWFnZTp0eXBlX25hbWUgLT4gaWRlX3F1ZXJ5Lkxhbmd1YWdlCisJMiwgLy8gNjogaWRlX3F1ZXJ5LkJ1aWxkYWJsZVVuaXQuZ2VuZXJhdGVkX2ZpbGVzOnR5cGVfbmFtZSAtPiBpZGVfcXVlcnkuR2VuZXJhdGVkRmlsZQorCTksIC8vIDc6IGlkZV9xdWVyeS5JbnZhbGlkYXRpb24ud2lsZGNhcmRzOnR5cGVfbmFtZSAtPiBpZGVfcXVlcnkuSW52YWxpZGF0aW9uLldpbGRjYXJkCisJMSwgLy8gODogaWRlX3F1ZXJ5LkFuYWx5c2lzUmVzdWx0LlN0YXR1cy5jb2RlOnR5cGVfbmFtZSAtPiBpZGVfcXVlcnkuQW5hbHlzaXNSZXN1bHQuU3RhdHVzLkNvZGUKKwk5LCAvLyBbOTo5XSBpcyB0aGUgc3ViLWxpc3QgZm9yIG1ldGhvZCBvdXRwdXRfdHlwZQorCTksIC8vIFs5OjldIGlzIHRoZSBzdWItbGlzdCBmb3IgbWV0aG9kIGlucHV0X3R5cGUKKwk5LCAvLyBbOTo5XSBpcyB0aGUgc3ViLWxpc3QgZm9yIGV4dGVuc2lvbiB0eXBlX25hbWUKKwk5LCAvLyBbOTo5XSBpcyB0aGUgc3ViLWxpc3QgZm9yIGV4dGVuc2lvbiBleHRlbmRlZQorCTAsIC8vIFswOjldIGlzIHRoZSBzdWItbGlzdCBmb3IgZmllbGQgdHlwZV9uYW1lCit9CisKK2Z1bmMgaW5pdCgpIHsgZmlsZV9pZGVfcXVlcnlfcHJvdG9faW5pdCgpIH0KK2Z1bmMgZmlsZV9pZGVfcXVlcnlfcHJvdG9faW5pdCgpIHsKKwlpZiBGaWxlX2lkZV9xdWVyeV9wcm90byAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisJaWYgIXByb3RvaW1wbC5VbnNhZmVFbmFibGVkIHsKKwkJZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbMF0uRXhwb3J0ZXIgPSBmdW5jKHYgaW50ZXJmYWNle30sIGkgaW50KSBpbnRlcmZhY2V7fSB7CisJCQlzd2l0Y2ggdiA6PSB2LigqR2VuZXJhdGVkRmlsZSk7IGkgeworCQkJY2FzZSAwOgorCQkJCXJldHVybiAmdi5zdGF0ZQorCQkJY2FzZSAxOgorCQkJCXJldHVybiAmdi5zaXplQ2FjaGUKKwkJCWNhc2UgMjoKKwkJCQlyZXR1cm4gJnYudW5rbm93bkZpZWxkcworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gbmlsCisJCQl9CisJCX0KKwkJZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbMV0uRXhwb3J0ZXIgPSBmdW5jKHYgaW50ZXJmYWNle30sIGkgaW50KSBpbnRlcmZhY2V7fSB7CisJCQlzd2l0Y2ggdiA6PSB2LigqSWRlQW5hbHlzaXMpOyBpIHsKKwkJCWNhc2UgMDoKKwkJCQlyZXR1cm4gJnYuc3RhdGUKKwkJCWNhc2UgMToKKwkJCQlyZXR1cm4gJnYuc2l6ZUNhY2hlCisJCQljYXNlIDI6CisJCQkJcmV0dXJuICZ2LnVua25vd25GaWVsZHMKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIG5pbAorCQkJfQorCQl9CisJCWZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzJdLkV4cG9ydGVyID0gZnVuYyh2IGludGVyZmFjZXt9LCBpIGludCkgaW50ZXJmYWNle30geworCQkJc3dpdGNoIHYgOj0gdi4oKkFuYWx5c2lzRXJyb3IpOyBpIHsKKwkJCWNhc2UgMDoKKwkJCQlyZXR1cm4gJnYuc3RhdGUKKwkJCWNhc2UgMToKKwkJCQlyZXR1cm4gJnYuc2l6ZUNhY2hlCisJCQljYXNlIDI6CisJCQkJcmV0dXJuICZ2LnVua25vd25GaWVsZHMKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIG5pbAorCQkJfQorCQl9CisJCWZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzNdLkV4cG9ydGVyID0gZnVuYyh2IGludGVyZmFjZXt9LCBpIGludCkgaW50ZXJmYWNle30geworCQkJc3dpdGNoIHYgOj0gdi4oKkFuYWx5c2lzUmVzdWx0KTsgaSB7CisJCQljYXNlIDA6CisJCQkJcmV0dXJuICZ2LnN0YXRlCisJCQljYXNlIDE6CisJCQkJcmV0dXJuICZ2LnNpemVDYWNoZQorCQkJY2FzZSAyOgorCQkJCXJldHVybiAmdi51bmtub3duRmllbGRzCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBuaWwKKwkJCX0KKwkJfQorCQlmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1s0XS5FeHBvcnRlciA9IGZ1bmModiBpbnRlcmZhY2V7fSwgaSBpbnQpIGludGVyZmFjZXt9IHsKKwkJCXN3aXRjaCB2IDo9IHYuKCpCdWlsZGFibGVVbml0KTsgaSB7CisJCQljYXNlIDA6CisJCQkJcmV0dXJuICZ2LnN0YXRlCisJCQljYXNlIDE6CisJCQkJcmV0dXJuICZ2LnNpemVDYWNoZQorCQkJY2FzZSAyOgorCQkJCXJldHVybiAmdi51bmtub3duRmllbGRzCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBuaWwKKwkJCX0KKwkJfQorCQlmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1s1XS5FeHBvcnRlciA9IGZ1bmModiBpbnRlcmZhY2V7fSwgaSBpbnQpIGludGVyZmFjZXt9IHsKKwkJCXN3aXRjaCB2IDo9IHYuKCpJbnZhbGlkYXRpb24pOyBpIHsKKwkJCWNhc2UgMDoKKwkJCQlyZXR1cm4gJnYuc3RhdGUKKwkJCWNhc2UgMToKKwkJCQlyZXR1cm4gJnYuc2l6ZUNhY2hlCisJCQljYXNlIDI6CisJCQkJcmV0dXJuICZ2LnVua25vd25GaWVsZHMKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIG5pbAorCQkJfQorCQl9CisJCWZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzZdLkV4cG9ydGVyID0gZnVuYyh2IGludGVyZmFjZXt9LCBpIGludCkgaW50ZXJmYWNle30geworCQkJc3dpdGNoIHYgOj0gdi4oKkFuYWx5c2lzUmVzdWx0X1N0YXR1cyk7IGkgeworCQkJY2FzZSAwOgorCQkJCXJldHVybiAmdi5zdGF0ZQorCQkJY2FzZSAxOgorCQkJCXJldHVybiAmdi5zaXplQ2FjaGUKKwkJCWNhc2UgMjoKKwkJCQlyZXR1cm4gJnYudW5rbm93bkZpZWxkcworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gbmlsCisJCQl9CisJCX0KKwkJZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbN10uRXhwb3J0ZXIgPSBmdW5jKHYgaW50ZXJmYWNle30sIGkgaW50KSBpbnRlcmZhY2V7fSB7CisJCQlzd2l0Y2ggdiA6PSB2LigqSW52YWxpZGF0aW9uX1dpbGRjYXJkKTsgaSB7CisJCQljYXNlIDA6CisJCQkJcmV0dXJuICZ2LnN0YXRlCisJCQljYXNlIDE6CisJCQkJcmV0dXJuICZ2LnNpemVDYWNoZQorCQkJY2FzZSAyOgorCQkJCXJldHVybiAmdi51bmtub3duRmllbGRzCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBuaWwKKwkJCX0KKwkJfQorCX0KKwlmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1swXS5PbmVvZldyYXBwZXJzID0gW11pbnRlcmZhY2V7fXt9CisJZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXNbMV0uT25lb2ZXcmFwcGVycyA9IFtdaW50ZXJmYWNle317fQorCWZpbGVfaWRlX3F1ZXJ5X3Byb3RvX21zZ1R5cGVzWzZdLk9uZW9mV3JhcHBlcnMgPSBbXWludGVyZmFjZXt9e30KKwlmaWxlX2lkZV9xdWVyeV9wcm90b19tc2dUeXBlc1s3XS5PbmVvZldyYXBwZXJzID0gW11pbnRlcmZhY2V7fXt9CisJdHlwZSB4IHN0cnVjdHt9CisJb3V0IDo9IHByb3RvaW1wbC5UeXBlQnVpbGRlcnsKKwkJRmlsZTogcHJvdG9pbXBsLkRlc2NCdWlsZGVyeworCQkJR29QYWNrYWdlUGF0aDogcmVmbGVjdC5UeXBlT2YoeHt9KS5Qa2dQYXRoKCksCisJCQlSYXdEZXNjcmlwdG9yOiBmaWxlX2lkZV9xdWVyeV9wcm90b19yYXdEZXNjLAorCQkJTnVtRW51bXM6ICAgICAgMiwKKwkJCU51bU1lc3NhZ2VzOiAgIDgsCisJCQlOdW1FeHRlbnNpb25zOiAwLAorCQkJTnVtU2VydmljZXM6ICAgMCwKKwkJfSwKKwkJR29UeXBlczogICAgICAgICAgIGZpbGVfaWRlX3F1ZXJ5X3Byb3RvX2dvVHlwZXMsCisJCURlcGVuZGVuY3lJbmRleGVzOiBmaWxlX2lkZV9xdWVyeV9wcm90b19kZXBJZHhzLAorCQlFbnVtSW5mb3M6ICAgICAgICAgZmlsZV9pZGVfcXVlcnlfcHJvdG9fZW51bVR5cGVzLAorCQlNZXNzYWdlSW5mb3M6ICAgICAgZmlsZV9pZGVfcXVlcnlfcHJvdG9fbXNnVHlwZXMsCisJfS5CdWlsZCgpCisJRmlsZV9pZGVfcXVlcnlfcHJvdG8gPSBvdXQuRmlsZQorCWZpbGVfaWRlX3F1ZXJ5X3Byb3RvX3Jhd0Rlc2MgPSBuaWwKKwlmaWxlX2lkZV9xdWVyeV9wcm90b19nb1R5cGVzID0gbmlsCisJZmlsZV9pZGVfcXVlcnlfcHJvdG9fZGVwSWR4cyA9IG5pbAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeV9wcm90by9pZGVfcXVlcnkucHJvdG8gYi90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5X3Byb3RvL2lkZV9xdWVyeS5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2YzNDljCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeV9wcm90by9pZGVfcXVlcnkucHJvdG8KQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworc3ludGF4ID0gInByb3RvMyI7CisKK3BhY2thZ2UgaWRlX3F1ZXJ5OworCitvcHRpb24gZ29fcGFja2FnZSA9ICJpZGVfcXVlcnkvaWRlX3F1ZXJ5X3Byb3RvIjsKKworbWVzc2FnZSBHZW5lcmF0ZWRGaWxlIHsKKyAgLy8gUGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byBidWlsZF9vdXRfZGlyLgorICBzdHJpbmcgcGF0aCA9IDE7CisKKyAgLy8gVGhlIHRleHQgb2YgdGhlIGdlbmVyYXRlZCBmaWxlLCBpZiBub3QgcHJvdmlkZWQgY29udGVudHMgd2lsbCBiZSByZWFkCisgIC8vIGZyb20gdGhlIHBhdGggYWJvdmUgaW4gdXNlcidzIHdvcmtzdGF0aW9uLgorICBvcHRpb25hbCBieXRlcyBjb250ZW50cyA9IDI7Cit9CisKK21lc3NhZ2UgSWRlQW5hbHlzaXMgeworICAvLyBEaXJlY3RvcnkgdGhhdCBjb250YWlucyBidWlsZCBvdXRwdXRzIGdlbmVyYXRlZCBieSB0aGUgYnVpbGQgc3lzdGVtLgorICAvLyBSZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QuCisgIHN0cmluZyBidWlsZF9vdXRfZGlyID0gMTsKKyAgLy8gV29ya2luZyBkaXJlY3RvcnkgdXNlZCBieSB0aGUgYnVpbGQgc3lzdGVtLgorICAvLyBSZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QuCisgIHN0cmluZyB3b3JraW5nX2RpciA9IDQ7CisgIC8vIE9ubHkgc2V0IGlmIHRoZSB3aG9sZSBxdWVyeSBmYWlsZWQuCisgIG9wdGlvbmFsIEFuYWx5c2lzRXJyb3IgZXJyb3IgPSA1OworICAvLyBMaXN0IG9mIHJlc3VsdHMsIG9uZSBwZXIgcXVlcmllZCBmaWxlLgorICByZXBlYXRlZCBBbmFseXNpc1Jlc3VsdCByZXN1bHRzID0gNjsKKyAgLy8gTGlzdCBvZiBidWlsZGFibGUgdW5pdHMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSByZWZlcmVuY2VzIGJ5IHRoZSByZXN1bHRzLgorICByZXBlYXRlZCBCdWlsZGFibGVVbml0IHVuaXRzID0gNzsKKworICByZXNlcnZlZCAyLCAzOworfQorCittZXNzYWdlIEFuYWx5c2lzRXJyb3IgeworICAvLyBIdW1hbiByZWFkYWJsZSBlcnJvciBtZXNzYWdlLgorICBzdHJpbmcgZXJyb3JfbWVzc2FnZSA9IDE7Cit9CisKK21lc3NhZ2UgQW5hbHlzaXNSZXN1bHQgeworICAvLyBQYXRoIHRvIHRoZSBzb3VyY2UgZmlsZSB0aGF0IHdhcyBxdWVyaWVkLCByZWxhdGl2ZSB0byByZXBvc2l0b3J5IHJvb3QuCisgIHN0cmluZyBzb3VyY2VfZmlsZV9wYXRoID0gMTsKKyAgLy8gSW5kaWNhdGVzIHRoZSBzdWNjZXNzL2ZhaWx1cmUgZm9yIHRoZSBxdWVyeS4KKyAgbWVzc2FnZSBTdGF0dXMgeworICAgIGVudW0gQ29kZSB7CisgICAgICBDT0RFX1VOU1BFQ0lGSUVEID0gMDsKKyAgICAgIENPREVfT0sgPSAxOworICAgICAgQ09ERV9OT1RfRk9VTkQgPSAyOyAgLy8gbm8gdGFyZ2V0IG9yIG1vZHVsZSBmb3VuZCBmb3IgdGhlIHNvdXJjZSBmaWxlLgorICAgICAgQ09ERV9CVUlMRF9GQUlMRUQgPSAzOworICAgIH0KKyAgICBDb2RlIGNvZGUgPSAxOworICAgIC8vIERldGFpbHMgYWJvdXQgdGhlIHN0YXR1cywgbWlnaHQgYmUgZGlzcGxheWVkIHRvIHVzZXIuCisgICAgb3B0aW9uYWwgc3RyaW5nIHN0YXR1c19tZXNzYWdlID0gMjsKKyAgfQorICAvLyBSZXByZXNlbnRzIHN0YXR1cyBmb3IgdGhpcyByZXN1bHQuIGUuZy4gbm90IHBhcnQgb2YgdGhlIGJ1aWxkIGdyYXBoLgorICBTdGF0dXMgc3RhdHVzID0gMjsKKyAgLy8gSUQgb2YgYnVpbGRhYmxlIHVuaXQgdGhhdCBjb250YWlucyB0aGUgc291cmNlIGZpbGUuCisgIC8vIFRoZSBpZGVfcXVlcnkgc2NyaXB0IGNhbiBjaG9vc2UgdGhlIG1vc3QgcmVsZXZhbnQgdW5pdCBmcm9tIG11bHRpcGxlCisgIC8vIG9wdGlvbnMuCisgIHN0cmluZyB1bml0X2lkID0gMzsKKyAgLy8gSW52YWxpZGF0aW9uIHJ1bGUgdG8gY2hlY2sgaWYgdGhlIHJlc3VsdCBpcyBzdGlsbCB2YWxpZC4KKyAgSW52YWxpZGF0aW9uIGludmFsaWRhdGlvbiA9IDQ7Cit9CisKK2VudW0gTGFuZ3VhZ2UgeworICBMQU5HVUFHRV9VTlNQRUNJRklFRCA9IDA7CisgIExBTkdVQUdFX0pBVkEgPSAxOyAgLy8gYWxzbyBpbmNsdWRlcyBLb3RsaW4KKyAgTEFOR1VBR0VfQ1BQID0gMjsKK30KKworbWVzc2FnZSBCdWlsZGFibGVVbml0IHsKKyAgLy8gVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGJ1aWxkYWJsZSB1bml0LgorICAvLworICAvLyBFeGFtcGxlczoKKyAgLy8gICAtIEphdmE6IG1vZHVsZSBvciB0YXJnZXQgbmFtZSwgZS5nLiAiZnJhbWV3b3JrLWJsdWV0b290aCIgb3IKKyAgLy8gICAiLy90aGlyZF9wYXJ0eS9oYW1jcmVzdDpoYW1jcmVzdF9qYXZhIgorICAvLyAgIC0gQysrOiBzb3VyY2UgZmlsZSwgZS5nLiAicGF0aC90by9maWxlLmNjIgorICBzdHJpbmcgaWQgPSAxOworICAvLyBMYW5ndWFnZSBvZiB0aGUgdW5pdC4KKyAgLy8gUmVxdWlyZWQgZm9yIGJ1aWxkYWJsZSB1bml0cyBkaXJlY3RseSByZWZlcmVuY2VkIGJ5IHRoZSBBbmFseXNpc1Jlc3VsdCwKKyAgLy8gZS5nLiB0aGUgdW5pdCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbXBpbGF0aW9uIHN0YWdlIGZvciB0aGUgc291cmNlIGZpbGUuCisgIExhbmd1YWdlIGxhbmd1YWdlID0gMjsKKyAgLy8gU291cmNlIGZpbGVzIHRoYXQgYXJlIHBhcnQgb2YgdGhpcyB1bml0LgorICAvLyBQYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHdvcmtpbmdfZGlyLgorICByZXBlYXRlZCBzdHJpbmcgc291cmNlX2ZpbGVfcGF0aHMgPSAzOworICAvLyBDb21waWxlciBhcmd1bWVudHMgdG8gY29tcGlsZSB0aGUgc291cmNlIGZpbGVzLgorICByZXBlYXRlZCBzdHJpbmcgY29tcGlsZXJfYXJndW1lbnRzID0gNDsKKyAgLy8gTGlzdCBvZiBnZW5lcmF0ZWQgZmlsZXMgcHJvZHVjZWQgYnkgdGhpcyB1bml0LgorICByZXBlYXRlZCBHZW5lcmF0ZWRGaWxlIGdlbmVyYXRlZF9maWxlcyA9IDU7CisgIC8vIExpc3Qgb2Ygb3RoZXIgQnVpbGRhYmxlVW5pdHMgdGhpcyB1bml0IGRlcGVuZCBvbi4KKyAgcmVwZWF0ZWQgc3RyaW5nIGRlcGVuZGVuY3lfaWRzID0gNjsKK30KKworLy8gSW52YWxpZGF0aW9uIHJ1bGUgdG8gY2hlY2sgaWYgdGhlIHJlc3VsdCBpcyBzdGlsbCB2YWxpZC4KKy8vIFRoaXMgc2hvdWxkIGNvbnRhaW4gZmlsZXMvZGlycyB0aGF0IGFyZSBub3QgZGlyZWN0bHkgcGFydCBvZiB0aGUgYnVpbGQgZ3JhcGgKKy8vIGJ1dCBzdGlsbCBhZmZlY3QgdGhlIHJlc3VsdC4gRm9yIGV4YW1wbGUgQlVJTEQgZmlsZXMsIGRpcmVjdG9yeSB0byB0aGUKKy8vIHRvb2xjaGFpbiBvciBjb25maWcgZmlsZXMgZXRjLgorbWVzc2FnZSBJbnZhbGlkYXRpb24geworICAvLyBJZiBhbnkgb2YgdGhlc2UgZmlsZXMgY2hhbmdlIHRoZSByZXN1bHQgbWF5IGJlY29tZSBpbnZhbGlkLgorICAvLyBQYXRoIHRvIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHJlcG9zaXRvcnkgcm9vdC4KKyAgcmVwZWF0ZWQgc3RyaW5nIGZpbGVfcGF0aHMgPSAxOworCisgIG1lc3NhZ2UgV2lsZGNhcmQgeworICAgIC8vIFByZWZpeCBvZiB0aGUgZmlsZSBwYXRoIChlLmcuICJwYXRoL3RvLyIpCisgICAgb3B0aW9uYWwgc3RyaW5nIHByZWZpeCA9IDE7CisgICAgLy8gU3VmZml4IG9mIHRoZSBmaWxlIHBhdGggKGUuZy4gIkFuZHJvaWQuYnAiKQorICAgIG9wdGlvbmFsIHN0cmluZyBzdWZmaXggPSAyOworICAgIC8vIElmIGZhbHNlLCB0aGUgcGFydCBvZiB0aGUgcGF0aCBiZXR3ZWVuIHRoZSBnaXZlbiBgcHJlZml4YCBhbmQgYHN1ZmZpeGAKKyAgICAvLyBzaG91bGQgbm90IGNvbnRhaW4gZGlyZWN0b3J5IHNlcGFyYXRvcnMgKCcvJykuCisgICAgb3B0aW9uYWwgYm9vbCBjYW5fY3Jvc3NfZm9sZGVyID0gMzsKKyAgfQorICAvLyBJZiBhbnkgb2YgdGhlc2UgcnVsZXMgbWF0Y2ggYSBjaGFuZ2VkIGZpbGUgdGhlIHJlc3VsdCBtYXkgYmVjb21lIGludmFsaWQuCisgIHJlcGVhdGVkIFdpbGRjYXJkIHdpbGRjYXJkcyA9IDQ7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeV9wcm90by9yZWdlbi5zaCBiL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnlfcHJvdG8vcmVnZW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWVjNGYzNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnlfcHJvdG8vcmVnZW4uc2gKQEAgLTAsMCArMSwzIEBACisjIS9iaW4vYmFzaAorCithcHJvdG9jIC0tZ29fb3V0PXBhdGhzPXNvdXJjZV9yZWxhdGl2ZTouIGlkZV9xdWVyeS5wcm90bwpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9BbmRyb2lkLmJwIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOTAyMTAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKK30KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiaWRlX3F1ZXJ5X3Byb2JlcnNjcmlwdF9jYyIsCisgICAgc3JjczogWworICAgICAgICAiZ2VuZXJhbC5jYyIsCisgICAgICAgICJmb28ucHJvdG8iLAorICAgIF0sCisgICAgY2ZsYWdzOiBbIi1Xbm8tdW51c2VkLXBhcmFtZXRlciJdLAorICAgIHByb3RvOiB7CisgICAgICAgIHR5cGU6ICJsaXRlIiwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9mb28ucHJvdG8gYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2Zvby5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTg1MTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9mb28ucHJvdG8KQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3N5bnRheCA9ICJwcm90bzMiOworCitwYWNrYWdlIGlkZV9xdWVyeS5wcm9iZXJfc2NyaXB0czsKKworbWVzc2FnZSBQcm90b01zZyB7CisgIC8vIFRlc3QgcHJvdG8gZmllbGQuCisgIGludDY0IHNvbWVfZmllbGQgPSAxOworICAvLyAgICAgICAgICAgICAgICAgICBeIHNvbWVfZmllbGQKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZ2VuZXJhbC5jYyBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZ2VuZXJhbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjA2MzliCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjCkBAIC0wLDAgKzEsMTE5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImZvby5wYi5oIgorCit1c2luZyBpZGVfcXVlcnk6OnByb2Jlcl9zY3JpcHRzOjpQcm90b01zZzsKKwordm9pZCBGb28oaW50IHgsIGRvdWJsZSB5KSB7fQorZmxvYXQgRm9vKGZsb2F0IHgsIGZsb2F0IHkpIHsgcmV0dXJuIDAuMGY7IH0KKwordm9pZCBUZXN0Q29tcGxldGlvbigpIHsKKyAgLy8gVGVzdCBjb21wbGV0aW9uIG9uIHByb3RvcyBhbmQgZnV6enkgbWF0Y2hpbmcgb2YgY29tcGxldGlvbiBzdWdnZXN0aW9ucy4KKworICBQcm90b01zZyBmb287CisKKyAgLy8gXgorCisgIC8vIHN0ZXAKKyAgLy8gd29ya3NwYWNlLndhaXRGb3JSZWFkeSgpCisgIC8vIHR5cGUoImYiKQorICAvLyBjb21wbGV0aW9uLnRyaWdnZXIoKQorICAvLyBhc3NlcnQgY29tcGxldGlvbi5pdGVtcy5maWx0ZXIobGFiZWw9ImZvbyIpCisgIC8vIGRlbGxpbmUoKQorICAvLyB0eXBlKCJmb28uc2YiKQorICAvLyBjb21wbGV0aW9uLnRyaWdnZXIoKQorICAvLyBhc3NlcnQgY29tcGxldGlvbi5pdGVtcy5maWx0ZXIoCisgIC8vICBsYWJlbD0ic29tZV9maWVsZC4qIiwKKyAgLy8gIGluc2VydFRleHQ9InNvbWVfZmllbGQuKiIsCisgIC8vICkKKyAgLy8gZGVsbGluZSgpCisKKyAgc3RkOjp2ZWN0b3I8aW50PiB2OworCisgIC8vIF4KKworICAvLyBzdGVwCisgIC8vIHdvcmtzcGFjZS53YWl0Rm9yUmVhZHkoKQorICAvLyB0eXBlKCJ2LnB1c2giKQorICAvLyBjb21wbGV0aW9uLnRyaWdnZXIoKQorICAvLyBhc3NlcnQgY29tcGxldGlvbi5pdGVtcy5maWx0ZXIobGFiZWw9InB1c2hfYmFjay4qIikKKyAgLy8gZGVsbGluZSgpCit9CisKK3ZvaWQgVGVzdE5hdmlnYXRpb24oKSB7CisgIHN0ZDo6dmVjdG9yPGludD4gaW50czsKKyAgLy8gICAgICAgICAgICAgICB8ICAgfCBpbnRzCisgIC8vICAgICAgXgorCisgIC8vIHN0ZXAKKyAgLy8gOyBUZXN0IG5hdmlnYXRpb24gdG8gZGVmaW5pdGlvbiBvbiBTVEwgdHlwZXMuCisgIC8vIHdvcmtzcGFjZS53YWl0Rm9yUmVhZHkoKQorICAvLyBuYXZpZ2F0aW9uLnRyaWdnZXIoKQorICAvLyBhc3NlcnQgbmF2aWdhdGlvbi5pdGVtcy5maWx0ZXIocGF0aD0iLiovdmVjdG9yIikKKworICBpbnRzLnB1c2hfYmFjaygwKTsKKyAgLy8gXgorCisgIC8vIHN0ZXAKKyAgLy8gOyBUZXN0IG5hdmlnYXRpb24gdG8gZGVmaW5pdGlvbiBvbiBsb2NhbCBzeW1ib2xzLgorICAvLyB3b3Jrc3BhY2Uud2FpdEZvclJlYWR5KCkKKyAgLy8gbmF2aWdhdGlvbi50cmlnZ2VyKCkKKyAgLy8gYXNzZXJ0IG5hdmlnYXRpb24uaXRlbXMuZmlsdGVyKHBhdGg9Ii4qL2dlbmVyYWwuY2MiLCByYW5nZT1pbnRzKQorCisgIFByb3RvTXNnIG1zZzsKKyAgbXNnLnNldF9zb21lX2ZpZWxkKDApOworICAvLyAgICAgICAgICBeCisKKyAgLy8gc3RlcAorICAvLyA7IFRlc3QgbmF2aWdhdGlvbiB0byBkZWZpbml0aW9uIG9uIHByb3RvIGZpZWxkcy4gV2UgZG8gbm90IGNoZWNrIGZvciBhCisgIC8vIDsgc3BlY2lmaWMgdGFyZ2V0IGFzIGl0IGNhbiBiZSBpbiBnZW5lcmF0ZWQgY29kZS4KKyAgLy8gd29ya3NwYWNlLndhaXRGb3JSZWFkeSgpCisgIC8vIG5hdmlnYXRpb24udHJpZ2dlcigpCisgIC8vIGFzc2VydCBuYXZpZ2F0aW9uLml0ZW1zCit9CisKK3ZvaWQgVGVzdFBhcmFtZXRlckluZm8oKSB7CisgIHN0ZDo6dmVjdG9yPGludD4gdjsKKyAgdi5wdXNoX2JhY2soMCk7CisgIC8vICAgICAgICAgIF4KKworICAvLyBzdGVwCisgIC8vIDsgVGVzdCB0aGUgc2lnbmF0dXJlIGhlbHAgZm9yIFNUTCBmdW5jdGlvbnMuIFdlIGRvIG5vdCBjaGVjayBmb3IgYSBzcGVjaWZpYworICAvLyA7IHRleHQgYXMgaXQgY2FuIGJlIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudC4KKyAgLy8gd29ya3NwYWNlLndhaXRGb3JSZWFkeSgpCisgIC8vIHBhcmFtaW5mby50cmlnZ2VyKCkKKyAgLy8gYXNzZXJ0IHBhcmFtaW5mby5pdGVtcworCisgIEZvbygwLCAwLjApOworICAvLyAgICAgIF4KKworICAvLyBzdGVwCisgIC8vIDsgVGVzdCB0aGUgc2lnbmF0dXJlIGhlbHAgZm9yIHRoZSBmdW5jdGlvbiAnRm9vJyBoYXZpbmcgdHdvIG92ZXJsb2Fkcy4KKyAgLy8gd29ya3NwYWNlLndhaXRGb3JSZWFkeSgpCisgIC8vIHBhcmFtaW5mby50cmlnZ2VyKCkKKyAgLy8gYXNzZXJ0IHBhcmFtaW5mby5pdGVtcy5maWx0ZXIoCisgIC8vICBhY3RpdmU9dHJ1ZSwKKyAgLy8gIGxhYmVsPSJGb29cXChpbnQgeCwgZG91YmxlIHlcXCkgLT4gdm9pZCIsCisgIC8vICBzZWxlY3Rpb249ImRvdWJsZSB5IiwKKyAgLy8gKQorICAvLyBhc3NlcnQgcGFyYW1pbmZvLml0ZW1zLmZpbHRlcigKKyAgLy8gIGFjdGl2ZT1mYWxzZSwKKyAgLy8gIGxhYmVsPSJGb29cXChmbG9hdCB4LCBmbG9hdCB5XFwpIC0+IGZsb2F0IiwKKyAgLy8gKQorfQorCitpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHBfc3VpdGUudGV4dHBiIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcF9zdWl0ZS50ZXh0cGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM3NzI2OQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHBfc3VpdGUudGV4dHBiCkBAIC0wLDAgKzEsNSBAQAordGVzdHM6IHsKKyAgbmFtZTogImdlbmVyYWwiCisgIHNjcmlwdHM6ICJidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZ2VuZXJhbC5jYyIKKyAgc2NyaXB0czogImJ1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9mb28ucHJvdG8iCit9CmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvaWRlX3F1ZXJ5Lm91dCBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9pZGVfcXVlcnkub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNDhkYTEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvaWRlX3F1ZXJ5Lm91dApAQCAtMCwwICsxLDI0MSBAQAorCisDb3V0MngKKzhidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZ2VuZXJhbC5jYxICCAEaOGJ1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjOpciCis4YnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2dlbmVyYWwuY2MQAho4YnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2dlbmVyYWwuY2MiOHByZWJ1aWx0cy9jbGFuZy9ob3N0L2xpbnV4LXg4Ni9jbGFuZy1yNTMwNTY3L2Jpbi9jbGFuZysrIgwtbm9zdGRsaWJpbmMiBy1tdGh1bWIiAy1PcyIULWZvbWl0LWZyYW1lLXBvaW50ZXIiBi1tbGx2bSIZLWVuYWJsZS1zaHJpbmstd3JhcD1mYWxzZSIDLU8yIgUtV2FsbCIHLVdleHRyYSILLVdpbml0LXNlbGYiDy1XcG9pbnRlci1hcml0aCIYLVd1bmd1YXJkZWQtYXZhaWxhYmlsaXR5IhEtV2Vycm9yPWRhdGUtdGltZSIWLVdlcnJvcj1pbnQtY29udmVyc2lvbiITLVdlcnJvcj1wcmFnbWEtcGFjayImLVdlcnJvcj1wcmFnbWEtcGFjay1zdXNwaWNpb3VzLWluY2x1ZGUiGC1XZXJyb3I9c2l6ZW9mLWFycmF5LWRpdiIXLVdlcnJvcj1zdHJpbmctcGx1cy1pbnQiJy1XZXJyb3I9dW5yZWFjaGFibGUtY29kZS1sb29wLWluY3JlbWVudCIiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyITLVduby1jMjMtZXh0ZW5zaW9ucyITLVduby1jOTktZGVzaWduYXRvciIZLVduby1nbnUtZm9sZGluZy1jb25zdGFudCIiLVduby1pbmNvbnNpc3RlbnQtbWlzc2luZy1vdmVycmlkZSIcLVduby1lcnJvcj1yZW9yZGVyLWluaXQtbGlzdCIWLVduby1yZW9yZGVyLWluaXQtbGlzdCIRLVduby1zaWduLWNvbXBhcmUiCy1Xbm8tdW51c2VkIgktREFORFJPSUQiCC1ETkRFQlVHIgctVURFQlVHIigtRF9fY29tcGlsZXJfb2Zmc2V0b2Y9X19idWlsdGluX29mZnNldG9mIiotRF9fQU5EUk9JRF9VTkFWQUlMQUJMRV9TWU1CT0xTX0FSRV9XRUFLX18iCS1mYWRkcnNpZyIZLWZkZWJ1Zy1kZWZhdWx0LXZlcnNpb249NSITLWZjb2xvci1kaWFnbm9zdGljcyIRLWZmcC1jb250cmFjdD1vZmYiDy1mbm8tZXhjZXB0aW9ucyIULWZuby1zdHJpY3QtYWxpYXNpbmciEi1mbWVzc2FnZS1sZW5ndGg9MCIXLWdzaW1wbGUtdGVtcGxhdGUtbmFtZXMiCC1nej16c3RkIhYtbm8tY2Fub25pY2FsLXByZWZpeGVzIiItZmRlYnVnLXByZWZpeC1tYXA9L3Byb2Mvc2VsZi9jd2Q9IhwtZnRyaXZpYWwtYXV0by12YXItaW5pdD16ZXJvIgItZyITLWZmdW5jdGlvbi1zZWN0aW9ucyIPLWZkYXRhLXNlY3Rpb25zIhAtZm5vLXNob3J0LWVudW1zIg8tZnVud2luZC10YWJsZXMiGC1mc3RhY2stcHJvdGVjdG9yLXN0cm9uZyIRLVdhLC0tbm9leGVjc3RhY2siEy1EX0ZPUlRJRllfU09VUkNFPTIiEy1Xc3RyaWN0LWFsaWFzaW5nPTIiEy1XZXJyb3I9cmV0dXJuLXR5cGUiGC1XZXJyb3I9bm9uLXZpcnR1YWwtZHRvciIPLVdlcnJvcj1hZGRyZXNzIhYtV2Vycm9yPXNlcXVlbmNlLXBvaW50IhctV2Vycm9yPWZvcm1hdC1zZWN1cml0eSIMLW1zb2Z0LWZsb2F0Ig4tbWFyY2g9YXJtdjctYSISLW1mbG9hdC1hYmk9c29mdGZwIgorLW1mcHU9bmVvbiIvLUlidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAiswEtSW91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9idWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvaWRlX3F1ZXJ5X3Byb2JlcnNjcmlwdF9jYy9hbmRyb2lkX2FybV9hcm12Ny1hLW5lb24vZ2VuL3Byb3RvL2J1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcCKFAS1Jb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2J1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9pZGVfcXVlcnlfcHJvYmVyc2NyaXB0X2NjL2FuZHJvaWRfYXJtX2FybXY3LWEtbmVvbi9nZW4vcHJvdG8iFC1EX19MSUJDX0FQSV9fPTEwMDAwIhQtRF9fTElCTV9BUElfXz0xMDAwMCIVLURfX0xJQkRMX0FQSV9fPTEwMDAwIhctSWV4dGVybmFsL3Byb3RvYnVmL3NyYyJZLUlwcmVidWlsdHMvY2xhbmcvaG9zdC9saW51eC14ODYvY2xhbmctcjUzMDU2Ny9hbmRyb2lkX2xpYmMrKy9wbGF0Zm9ybS9hcm0vaW5jbHVkZS9jKysvdjEiPS1JcHJlYnVpbHRzL2NsYW5nL2hvc3QvbGludXgteDg2L2NsYW5nLXI1MzA1NjcvaW5jbHVkZS9jKysvdjEiIC1JYmlvbmljL2xpYmMvYXN5bmNfc2FmZS9pbmNsdWRlIh8tSXN5c3RlbS9sb2dnaW5nL2xpYmxvZy9pbmNsdWRlIictSWJpb25pYy9saWJjL3N5c3RlbV9wcm9wZXJ0aWVzL2luY2x1ZGUiPC1Jc3lzdGVtL2NvcmUvcHJvcGVydHlfc2VydmljZS9saWJwcm9wZXJ0eWluZm9wYXJzZXIvaW5jbHVkZSIILWlzeXN0ZW0iE2Jpb25pYy9saWJjL2luY2x1ZGUiCC1pc3lzdGVtIh9iaW9uaWMvbGliYy9rZXJuZWwvdWFwaS9hc20tYXJtIggtaXN5c3RlbSIXYmlvbmljL2xpYmMva2VybmVsL3VhcGkiCC1pc3lzdGVtIh9iaW9uaWMvbGliYy9rZXJuZWwvYW5kcm9pZC9zY3NpIggtaXN5c3RlbSIfYmlvbmljL2xpYmMva2VybmVsL2FuZHJvaWQvdWFwaSIHLXRhcmdldCIdYXJtdjdhLWxpbnV4LWFuZHJvaWRlYWJpMTAwMDAiEC1EQU5EUk9JRF9TVFJJQ1QiBS1mUElFIgctV2Vycm9yIhUtV25vLXVudXNlZC1wYXJhbWV0ZXIiGS1ER09PR0xFX1BST1RPQlVGX05PX1JUVEkiFi1XaW1wbGljaXQtZmFsbHRocm91Z2giKi1EX0xJQkNQUF9FTkFCTEVfVEhSRUFEX1NBRkVUWV9BTk5PVEFUSU9OUyIVLVduby1nbnUtaW5jbHVkZS1uZXh0IhstZnZpc2liaWxpdHktaW5saW5lcy1oaWRkZW4iBi1tbGx2bSIZLWVuYWJsZS1zaHJpbmstd3JhcD1mYWxzZSIMLXN0ZD1nbnUrKzIwIgktZm5vLXJ0dGkiFS1Jc3lzdGVtL2NvcmUvaW5jbHVkZSIfLUlzeXN0ZW0vbG9nZ2luZy9saWJsb2cvaW5jbHVkZSIcLUlzeXN0ZW0vbWVkaWEvYXVkaW8vaW5jbHVkZSIeLUloYXJkd2FyZS9saWJoYXJkd2FyZS9pbmNsdWRlIiUtSWhhcmR3YXJlL2xpYmhhcmR3YXJlX2xlZ2FjeS9pbmNsdWRlIhYtSWhhcmR3YXJlL3JpbC9pbmNsdWRlIhstSWZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUiIi1JZnJhbWV3b3Jrcy9uYXRpdmUvb3BlbmdsL2luY2x1ZGUiFy1JZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIhYtV2Vycm9yPWJvb2wtb3BlcmF0aW9uIiAtV2Vycm9yPWZvcm1hdC1pbnN1ZmZpY2llbnQtYXJncyIlLVdlcnJvcj1pbXBsaWNpdC1pbnQtZmxvYXQtY29udmVyc2lvbiIbLVdlcnJvcj1pbnQtaW4tYm9vbC1jb250ZXh0IhstV2Vycm9yPWludC10by1wb2ludGVyLWNhc3QiGy1XZXJyb3I9cG9pbnRlci10by1pbnQtY2FzdCIXLVdlcnJvcj14b3ItdXNlZC1hcy1wb3ciHi1Xbm8tdm9pZC1wb2ludGVyLXRvLWVudW0tY2FzdCIdLVduby12b2lkLXBvaW50ZXItdG8taW50LWNhc3QiGC1Xbm8tcG9pbnRlci10by1pbnQtY2FzdCIWLVdlcnJvcj1mb3J0aWZ5LXNvdXJjZSIULVduby11bnVzZWQtdmFyaWFibGUiHy1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMiEy1Xbm8tcGFja2VkLW5vbi1wb2QiHC1XZXJyb3I9YWRkcmVzcy1vZi10ZW1wb3JhcnkiKy1XZXJyb3I9aW5jb21wYXRpYmxlLWZ1bmN0aW9uLXBvaW50ZXItdHlwZXMiGC1XZXJyb3I9bnVsbC1kZXJlZmVyZW5jZSITLVdlcnJvcj1yZXR1cm4tdHlwZSIiLVduby10YXV0b2xvZ2ljYWwtY29uc3RhbnQtY29tcGFyZSIkLVduby10YXV0b2xvZ2ljYWwtdHlwZS1saW1pdC1jb21wYXJlIiItV25vLWltcGxpY2l0LWludC1mbG9hdC1jb252ZXJzaW9uIiEtV25vLXRhdXRvbG9naWNhbC1vdmVybGFwLWNvbXBhcmUiFC1Xbm8tZGVwcmVjYXRlZC1jb3B5IhktV25vLXJhbmdlLWxvb3AtY29uc3RydWN0IiItV25vLXplcm8tYXMtbnVsbC1wb2ludGVyLWNvbnN0YW50IiktV25vLWRlcHJlY2F0ZWQtYW5vbi1lbnVtLWVudW0tY29udmVyc2lvbiIkLVduby1kZXByZWNhdGVkLWVudW0tZW51bS1jb252ZXJzaW9uIhstV25vLWVycm9yPXBlc3NpbWl6aW5nLW1vdmUiHi1Xbm8tbm9uLWMtdHlwZWRlZi1mb3ItbGlua2FnZSITLVduby1hbGlnbi1taXNtYXRjaCIiLVduby1lcnJvcj11bnVzZWQtYnV0LXNldC12YXJpYWJsZSIjLVduby1lcnJvcj11bnVzZWQtYnV0LXNldC1wYXJhbWV0ZXIiHi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1idWlsdGlucyIVLVduby1lcnJvcj1kZXByZWNhdGVkIiYtV25vLWRlcHJlY2F0ZWQtZHluYW1pYy1leGNlcHRpb24tc3BlYyIkLVduby1lcnJvcj1lbnVtLWNvbnN0ZXhwci1jb252ZXJzaW9uIhstV25vLWVycm9yPWludmFsaWQtb2Zmc2V0b2YiKS1Xbm8tZXJyb3I9dGhyZWFkLXNhZmV0eS1yZWZlcmVuY2UtcmV0dXJuIhYtV25vLXZsYS1jeHgtZXh0ZW5zaW9uIjhidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZ2VuZXJhbC5jYzJFZ2VuZmlsZXNfZm9yX2J1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjOp9ACitFZ2VuZmlsZXNfZm9yX2J1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjKtU/Ciu2AXNvb25nLy5pbnRlcm1lZGlhdGVzL2J1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9pZGVfcXVlcnlfcHJvYmVyc2NyaXB0X2NjL2FuZHJvaWRfYXJtX2FybXY3LWEtbmVvbi9nZW4vcHJvdG8vYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2Zvby5wYi5oEpk+Ly8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKy8vIHNvdXJjZTogYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2Zvby5wcm90bworCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9idWlsZF8yZm1ha2VfMmZ0b29sc18yZmlkZV81ZnF1ZXJ5XzJmcHJvYmVyXzVmc2NyaXB0c18yZmNwcF8yZmZvb18yZXByb3RvCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9idWlsZF8yZm1ha2VfMmZ0b29sc18yZmlkZV81ZnF1ZXJ5XzJmcHJvYmVyXzVmc2NyaXB0c18yZmNwcF8yZmZvb18yZXByb3RvCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF9kZWYuaW5jPgorI2lmIFBST1RPQlVGX1ZFUlNJT04gPCAzMDIxMDAwCisjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpcworI2Vycm9yIGluY29tcGF0aWJsZSB3aXRoIHlvdXIgUHJvdG9jb2wgQnVmZmVyIGhlYWRlcnMuIFBsZWFzZSB1cGRhdGUKKyNlcnJvciB5b3VyIGhlYWRlcnMuCisjZW5kaWYKKyNpZiAzMDIxMDEyIDwgUFJPVE9CVUZfTUlOX1BST1RPQ19WRVJTSU9OCisjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYW4gb2xkZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKKyNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiBQbGVhc2UKKyNlcnJvciByZWdlbmVyYXRlIHRoaXMgZmlsZSB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2MuCisjZW5kaWYKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X3VuZGVmLmluYz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWV0YWRhdGFfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4gIC8vIElXWVUgcHJhZ21hOiBleHBvcnQKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPiAgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydAorLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGluY2x1ZGVzKQorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9wb3J0X2RlZi5pbmM+CisjZGVmaW5lIFBST1RPQlVGX0lOVEVSTkFMX0VYUE9SVF9idWlsZF8yZm1ha2VfMmZ0b29sc18yZmlkZV81ZnF1ZXJ5XzJmcHJvYmVyXzVmc2NyaXB0c18yZmNwcF8yZmZvb18yZXByb3RvCitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgorbmFtZXNwYWNlIGludGVybmFsIHsKK2NsYXNzIEFueU1ldGFkYXRhOworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKKworLy8gSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsIC0tIGRvIG5vdCB1c2UgdGhlc2UgbWVtYmVycy4KK3N0cnVjdCBUYWJsZVN0cnVjdF9idWlsZF8yZm1ha2VfMmZ0b29sc18yZmlkZV81ZnF1ZXJ5XzJmcHJvYmVyXzVmc2NyaXB0c18yZmNwcF8yZmZvb18yZXByb3RvIHsKKyAgc3RhdGljIGNvbnN0IDo6dWludDMyX3Qgb2Zmc2V0c1tdOworfTsKK25hbWVzcGFjZSBpZGVfcXVlcnkgeworbmFtZXNwYWNlIHByb2Jlcl9zY3JpcHRzIHsKK2NsYXNzIFByb3RvTXNnOworc3RydWN0IFByb3RvTXNnRGVmYXVsdFR5cGVJbnRlcm5hbDsKK2V4dGVybiBQcm90b01zZ0RlZmF1bHRUeXBlSW50ZXJuYWwgX1Byb3RvTXNnX2RlZmF1bHRfaW5zdGFuY2VfOworfSAgLy8gbmFtZXNwYWNlIHByb2Jlcl9zY3JpcHRzCit9ICAvLyBuYW1lc3BhY2UgaWRlX3F1ZXJ5CitQUk9UT0JVRl9OQU1FU1BBQ0VfT1BFTgordGVtcGxhdGU8PiA6OmlkZV9xdWVyeTo6cHJvYmVyX3NjcmlwdHM6OlByb3RvTXNnKiBBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPDo6aWRlX3F1ZXJ5Ojpwcm9iZXJfc2NyaXB0czo6UHJvdG9Nc2c+KEFyZW5hKik7CitQUk9UT0JVRl9OQU1FU1BBQ0VfQ0xPU0UKK25hbWVzcGFjZSBpZGVfcXVlcnkgeworbmFtZXNwYWNlIHByb2Jlcl9zY3JpcHRzIHsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBQcm90b01zZyBmaW5hbCA6CisgICAgcHVibGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpNZXNzYWdlTGl0ZSAvKiBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3NfZGVmaW5pdGlvbjppZGVfcXVlcnkucHJvYmVyX3NjcmlwdHMuUHJvdG9Nc2cpICovIHsKKyBwdWJsaWM6CisgIGlubGluZSBQcm90b01zZygpIDogUHJvdG9Nc2cobnVsbHB0cikge30KKyAgflByb3RvTXNnKCkgb3ZlcnJpZGU7CisgIGV4cGxpY2l0IFBST1RPQlVGX0NPTlNURVhQUiBQcm90b01zZyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6aW50ZXJuYWw6OkNvbnN0YW50SW5pdGlhbGl6ZWQpOworCisgIFByb3RvTXNnKGNvbnN0IFByb3RvTXNnJiBmcm9tKTsKKyAgUHJvdG9Nc2coUHJvdG9Nc2cmJiBmcm9tKSBub2V4Y2VwdAorICAgIDogUHJvdG9Nc2coKSB7CisgICAgKnRoaXMgPSA6OnN0ZDo6bW92ZShmcm9tKTsKKyAgfQorCisgIGlubGluZSBQcm90b01zZyYgb3BlcmF0b3I9KGNvbnN0IFByb3RvTXNnJiBmcm9tKSB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5saW5lIFByb3RvTXNnJiBvcGVyYXRvcj0oUHJvdG9Nc2cmJiBmcm9tKSBub2V4Y2VwdCB7CisgICAgaWYgKHRoaXMgPT0gJmZyb20pIHJldHVybiAqdGhpczsKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBmcm9tLkdldE93bmluZ0FyZW5hKCkKKyAgI2lmZGVmIFBST1RPQlVGX0ZPUkNFX0NPUFlfSU5fTU9WRQorICAgICAgICAmJiBHZXRPd25pbmdBcmVuYSgpICE9IG51bGxwdHIKKyAgI2VuZGlmICAvLyAhUFJPVE9CVUZfRk9SQ0VfQ09QWV9JTl9NT1ZFCisgICAgKSB7CisgICAgICBJbnRlcm5hbFN3YXAoJmZyb20pOworICAgIH0gZWxzZSB7CisgICAgICBDb3B5RnJvbShmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgc3RhdGljIGNvbnN0IFByb3RvTXNnJiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiAqaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgUHJvdG9Nc2cqIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUHJvdG9Nc2cqPigKKyAgICAgICAgICAgICAgICZfUHJvdG9Nc2dfZGVmYXVsdF9pbnN0YW5jZV8pOworICB9CisgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtJbmRleEluRmlsZU1lc3NhZ2VzID0KKyAgICAwOworCisgIGZyaWVuZCB2b2lkIHN3YXAoUHJvdG9Nc2cmIGEsIFByb3RvTXNnJiBiKSB7CisgICAgYS5Td2FwKCZiKTsKKyAgfQorICBpbmxpbmUgdm9pZCBTd2FwKFByb3RvTXNnKiBvdGhlcikgeworICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgICNpZmRlZiBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSAhPSBudWxscHRyICYmCisgICAgICAgIEdldE93bmluZ0FyZW5hKCkgPT0gb3RoZXItPkdldE93bmluZ0FyZW5hKCkpIHsKKyAgICNlbHNlICAvLyBQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICBpZiAoR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSkgeworICAjZW5kaWYgIC8vICFQUk9UT0JVRl9GT1JDRV9DT1BZX0lOX1NXQVAKKyAgICAgIEludGVybmFsU3dhcChvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbnRlcm5hbDo6R2VuZXJpY1N3YXAodGhpcywgb3RoZXIpOworICAgIH0KKyAgfQorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChQcm90b01zZyogb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICAgIEdPT0dMRV9EQ0hFQ0soR2V0T3duaW5nQXJlbmEoKSA9PSBvdGhlci0+R2V0T3duaW5nQXJlbmEoKSk7CisgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUHJvdG9Nc2cqIE5ldyg6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hKSBjb25zdCBmaW5hbCB7CisgICAgcmV0dXJuIENyZWF0ZU1heWJlTWVzc2FnZTxQcm90b01zZz4oYXJlbmEpOworICB9CisgIFByb3RvTXNnKiBOZXcoKSBjb25zdCB7CisgICAgcmV0dXJuIE5ldyhudWxscHRyKTsKKyAgfQorICB2b2lkIENoZWNrVHlwZUFuZE1lcmdlRnJvbShjb25zdCA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6TWVzc2FnZUxpdGUmIGZyb20pICBmaW5hbDsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBQcm90b01zZyYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFByb3RvTXNnJiBmcm9tKTsKKyAgUFJPVE9CVUZfQVRUUklCVVRFX1JFSU5JVElBTElaRVMgdm9pZCBDbGVhcigpIGZpbmFsOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdCBmaW5hbDsKKworICBzaXplX3QgQnl0ZVNpemVMb25nKCkgY29uc3QgZmluYWw7CisgIGNvbnN0IGNoYXIqIF9JbnRlcm5hbFBhcnNlKGNvbnN0IGNoYXIqIHB0ciwgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpQYXJzZUNvbnRleHQqIGN0eCkgZmluYWw7CisgIDo6dWludDhfdCogX0ludGVybmFsU2VyaWFsaXplKAorICAgICAgOjp1aW50OF90KiB0YXJnZXQsIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjppbzo6RXBzQ29weU91dHB1dFN0cmVhbSogc3RyZWFtKSBjb25zdCBmaW5hbDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCBmaW5hbCB7IHJldHVybiBfaW1wbF8uX2NhY2hlZF9zaXplXy5HZXQoKTsgfQorCisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3Rvcig6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmEqIGFyZW5hLCBib29sIGlzX21lc3NhZ2Vfb3duZWQpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoUHJvdG9Nc2cqIG90aGVyKTsKKworICBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpBbnlNZXRhZGF0YTsKKyAgc3RhdGljIDo6UFJPVE9CVUZfTkFNRVNQQUNFX0lEOjpTdHJpbmdQaWVjZSBGdWxsTWVzc2FnZU5hbWUoKSB7CisgICAgcmV0dXJuICJpZGVfcXVlcnkucHJvYmVyX3NjcmlwdHMuUHJvdG9Nc2ciOworICB9CisgIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgUHJvdG9Nc2coOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tZXNzYWdlX293bmVkID0gZmFsc2UpOworICBwdWJsaWM6CisKKyAgc3RkOjpzdHJpbmcgR2V0VHlwZU5hbWUoKSBjb25zdCBmaW5hbDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgZW51bSA6IGludCB7CisgICAga1NvbWVGaWVsZEZpZWxkTnVtYmVyID0gMSwKKyAgfTsKKyAgLy8gaW50NjQgc29tZV9maWVsZCA9IDE7CisgIHZvaWQgY2xlYXJfc29tZV9maWVsZCgpOworICA6OmludDY0X3Qgc29tZV9maWVsZCgpIGNvbnN0OworICB2b2lkIHNldF9zb21lX2ZpZWxkKDo6aW50NjRfdCB2YWx1ZSk7CisgIHByaXZhdGU6CisgIDo6aW50NjRfdCBfaW50ZXJuYWxfc29tZV9maWVsZCgpIGNvbnN0OworICB2b2lkIF9pbnRlcm5hbF9zZXRfc29tZV9maWVsZCg6OmludDY0X3QgdmFsdWUpOworICBwdWJsaWM6CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmlkZV9xdWVyeS5wcm9iZXJfc2NyaXB0cy5Qcm90b01zZykKKyBwcml2YXRlOgorICBjbGFzcyBfSW50ZXJuYWw7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyA6OlBST1RPQlVGX05BTUVTUEFDRV9JRDo6QXJlbmE6OkludGVybmFsSGVscGVyOworICB0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfOworICB0eXBlZGVmIHZvaWQgRGVzdHJ1Y3RvclNraXBwYWJsZV87CisgIHN0cnVjdCBJbXBsXyB7CisgICAgOjppbnQ2NF90IHNvbWVfZmllbGRfOworICAgIG11dGFibGUgOjpQUk9UT0JVRl9OQU1FU1BBQ0VfSUQ6OmludGVybmFsOjpDYWNoZWRTaXplIF9jYWNoZWRfc2l6ZV87CisgIH07CisgIHVuaW9uIHsgSW1wbF8gX2ltcGxfOyB9OworICBmcmllbmQgc3RydWN0IDo6VGFibGVTdHJ1Y3RfYnVpbGRfMmZtYWtlXzJmdG9vbHNfMmZpZGVfNWZxdWVyeV8yZnByb2Jlcl81ZnNjcmlwdHNfMmZjcHBfMmZmb29fMmVwcm90bzsKK307CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZkZWYgX19HTlVDX18KKyAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdzdHJpY3QtYWxpYXNpbmciCisjZW5kaWYgIC8vIF9fR05VQ19fCisvLyBQcm90b01zZworCisvLyBpbnQ2NCBzb21lX2ZpZWxkID0gMTsKK2lubGluZSB2b2lkIFByb3RvTXNnOjpjbGVhcl9zb21lX2ZpZWxkKCkgeworICBfaW1wbF8uc29tZV9maWVsZF8gPSA6OmludDY0X3R7MH07Cit9CitpbmxpbmUgOjppbnQ2NF90IFByb3RvTXNnOjpfaW50ZXJuYWxfc29tZV9maWVsZCgpIGNvbnN0IHsKKyAgcmV0dXJuIF9pbXBsXy5zb21lX2ZpZWxkXzsKK30KK2lubGluZSA6OmludDY0X3QgUHJvdG9Nc2c6OnNvbWVfZmllbGQoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6aWRlX3F1ZXJ5LnByb2Jlcl9zY3JpcHRzLlByb3RvTXNnLnNvbWVfZmllbGQpCisgIHJldHVybiBfaW50ZXJuYWxfc29tZV9maWVsZCgpOworfQoraW5saW5lIHZvaWQgUHJvdG9Nc2c6Ol9pbnRlcm5hbF9zZXRfc29tZV9maWVsZCg6OmludDY0X3QgdmFsdWUpIHsKKyAgCisgIF9pbXBsXy5zb21lX2ZpZWxkXyA9IHZhbHVlOworfQoraW5saW5lIHZvaWQgUHJvdG9Nc2c6OnNldF9zb21lX2ZpZWxkKDo6aW50NjRfdCB2YWx1ZSkgeworICBfaW50ZXJuYWxfc2V0X3NvbWVfZmllbGQodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OmlkZV9xdWVyeS5wcm9iZXJfc2NyaXB0cy5Qcm90b01zZy5zb21lX2ZpZWxkKQorfQorCisjaWZkZWYgX19HTlVDX18KKyAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZiAgLy8gX19HTlVDX18KKworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG5hbWVzcGFjZV9zY29wZSkKKworfSAgLy8gbmFtZXNwYWNlIHByb2Jlcl9zY3JpcHRzCit9ICAvLyBuYW1lc3BhY2UgaWRlX3F1ZXJ5CisKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcG9ydF91bmRlZi5pbmM+CisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9JTkNMVURFRF9HT09HTEVfUFJPVE9CVUZfSU5DTFVERURfYnVpbGRfMmZtYWtlXzJmdG9vbHNfMmZpZGVfNWZxdWVyeV8yZnByb2Jlcl81ZnNjcmlwdHNfMmZjcHBfMmZmb29fMmVwcm90bwpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2p2bS9BbmRyb2lkLmJwIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2p2bS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZDAwYjUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvanZtL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKK30KKworamF2YV9saWJyYXJ5IHsKKyAgICBuYW1lOiAiaWRlX3F1ZXJ5X3Byb2JlcnNjcmlwdF9qdm0iLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkZvby5qYXZhIiwKKyAgICAgICAgIkJhci5qYXZhIiwKKyAgICAgICAgIm90aGVyL090aGVyLmphdmEiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvanZtL0Jhci5qYXZhIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2p2bS9CYXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDUxNTc2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2p2bS9CYXIuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGp2bTsKKworLyoqIEJhciBjbGFzcy4gVGhlIGNsYXNzIGZvciB0ZXN0aW5nIGNvZGUgYXNzaXN0IHdpdGhpbiB0aGUgc2FtZSBidWlsZCBtb2R1bGUuICovCitjbGFzcyBCYXI8SyBleHRlbmRzIE51bWJlciwgViBleHRlbmRzIE51bWJlcj4geworICBCYXIoKSB7CisgICAgZm9vKG5ldyBGb28oKSk7CisgIH0KKworICB2b2lkIGZvbyhGb28gZikge30KKworICB2b2lkIGZvbyhPYmplY3Qgbykge30KKworICB2b2lkIGJhcihGb28gZikge30KKworICB2b2lkIGJheihPYmplY3Qgbykge30KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvanZtL0Zvby5qYXZhIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2p2bS9Gb28uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mzk3YmM0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2p2bS9Gb28uamF2YQpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBqdm07CisKK2ltcG9ydCBqdm0ub3RoZXIuT3RoZXI7CisKKy8qKiBGb28gY2xhc3MuICovCitwdWJsaWMgZmluYWwgY2xhc3MgRm9vIHsKKy8vICAgICAgICAgICAgICAgfCAgfCBmb29fZGVmCisKKyAgdm9pZCB0ZXN0UGFyYW1ldGVySW5mbygpIHsKKyAgICAvLyBUZXN0IHNpZ25hdHVyZSBoZWxwIGZvciB0eXBlIHBhcmFtZXRlcnMuCisKKyAgICBCYXI8SW50ZWdlciwgRG91YmxlPiBiID0gbmV3IEJhcjw+KCk7CisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiBjdG9yCisgICAgLy8gICAgIF4gZGVjbF8xCisgICAgLy8gICAgICAgICAgICAgIF4gZGVjbF8yCisgICAgU3lzdGVtLm91dC5wcmludGxuKGIpOworCisgICAgLy8gc3RlcCBhdCBjdG9yCisgICAgLy8gd29ya3NwYWNlLndhaXRGb3JSZWFkeSgpCisgICAgLy8gcGFyYW1pbmZvLnRyaWdnZXIoKQorICAgIC8vIGFzc2VydCBwYXJhbWluZm8uaXRlbXMuZmlsdGVyKAorICAgIC8vICBsYWJlbD0iSyBleHRlbmRzIE51bWJlciwgViBleHRlbmRzIE51bWJlciIsCisgICAgLy8gIHNlbGVjdGlvbj0iSyBleHRlbmRzIE51bWJlciIsCisgICAgLy8gKQorCisgICAgLy8gc3RlcCBhdCBkZWNsXzEKKyAgICAvLyB3b3Jrc3BhY2Uud2FpdEZvclJlYWR5KCkKKyAgICAvLyBwYXJhbWluZm8udHJpZ2dlcigpCisgICAgLy8gYXNzZXJ0IHBhcmFtaW5mby5pdGVtcy5maWx0ZXIoCisgICAgLy8gIGxhYmVsPSJLIGV4dGVuZHMgTnVtYmVyLCBWIGV4dGVuZHMgTnVtYmVyIiwKKyAgICAvLyAgc2VsZWN0aW9uPSJLIGV4dGVuZHMgTnVtYmVyIiwKKyAgICAvLyApCisKKyAgICAvLyBzdGVwIGF0IGRlY2xfMgorICAgIC8vIHdvcmtzcGFjZS53YWl0Rm9yUmVhZHkoKQorICAgIC8vIHBhcmFtaW5mby50cmlnZ2VyKCkKKyAgICAvLyBhc3NlcnQgcGFyYW1pbmZvLml0ZW1zLmZpbHRlcigKKyAgICAvLyAgbGFiZWw9IksgZXh0ZW5kcyBOdW1iZXIsIFYgZXh0ZW5kcyBOdW1iZXIiLAorICAgIC8vICBzZWxlY3Rpb249IlYgZXh0ZW5kcyBOdW1iZXIiLAorICAgIC8vICkKKworICAgIC8vIFRlc3Qgc2lnbmF0dXJlIGhlbHAgZm9yIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuCisKKyAgICBPdGhlciBvdGhlciA9IG5ldyBPdGhlcigxMjMsICJmb28iKTsKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgXiBwYXJhbV8xCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gcGFyYW1fMgorICAgIFN5c3RlbS5vdXQucHJpbnRsbihvdGhlcik7CisKKyAgICAvLyBzdGVwIGF0IHBhcmFtXzEKKyAgICAvLyB3b3Jrc3BhY2Uud2FpdEZvclJlYWR5KCkKKyAgICAvLyBwYXJhbWluZm8udHJpZ2dlcigpCisgICAgLy8gYXNzZXJ0IHBhcmFtaW5mby5pdGVtcy5maWx0ZXIoCisgICAgLy8gIGxhYmVsPSJcXChpbnQgZmlyc3QsIFN0cmluZyBzZWNvbmRcXCkiLAorICAgIC8vICBzZWxlY3Rpb249ImludCBmaXJzdCIsCisgICAgLy8gKQorCisgICAgLy8gc3RlcCBhdCBwYXJhbV8yCisgICAgLy8gd29ya3NwYWNlLndhaXRGb3JSZWFkeSgpCisgICAgLy8gcGFyYW1pbmZvLnRyaWdnZXIoKQorICAgIC8vIGFzc2VydCBwYXJhbWluZm8uaXRlbXMuZW1wdHkoKQorICB9CisKKyAgdm9pZCB0ZXN0Q29tcGxldGlvbigpIHsKKyAgICBCYXI8SW50ZWdlciwgRG91YmxlPiBiID0gbmV3IEJhcjw+KCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKGIpOworCisgICAgLy8gXgorCisgICAgLy8gc3RlcAorICAgIC8vIDsgVGVzdCBjb21wbGV0aW9uIG9uIHR5cGVzIGZyb20gdGhlIHNhbWUgcGFja2FnZS4KKyAgICAvLyB3b3Jrc3BhY2Uud2FpdEZvclJlYWR5KCkKKyAgICAvLyB0eXBlKCJiLiIpCisgICAgLy8gY29tcGxldGlvbi50cmlnZ2VyKCkKKyAgICAvLyBhc3NlcnQgY29tcGxldGlvbi5pdGVtcy5maWx0ZXIobGFiZWw9ImZvby4qIikKKyAgICAvLyBkZWxsaW5lKCkKKworICAgIE90aGVyIG90aGVyID0gbmV3IE90aGVyKDEsICJmb28iKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4ob3RoZXIpOworCisgICAgLy8gXgorCisgICAgLy8gc3RlcAorICAgIC8vIDsgVGVzdCBjb21wbGV0aW9uIG9uIHR5cGVzIGZyb20gYSBkaWZmZXJlbnQgcGFja2FnZS4KKyAgICAvLyB3b3Jrc3BhY2Uud2FpdEZvclJlYWR5KCkKKyAgICAvLyB0eXBlKCJvdGhlci4iKQorICAgIC8vIGNvbXBsZXRpb24udHJpZ2dlcigpCisgICAgLy8gYXBwbHkoY29tcGxldGlvbi5pdGVtcy5maWx0ZXIobGFiZWw9Im90aGVyLioiKS5maXJzdCgpKQorICAgIC8vIHR5cGUoIi4iKQorICAgIC8vIGNvbXBsZXRpb24udHJpZ2dlcigpCisgICAgLy8gYXBwbHkoY29tcGxldGlvbi5pdGVtcy5maWx0ZXIobGFiZWw9Im90aGVyLioiKS5maXJzdCgpKQorICAgIC8vIGRlbGxpbmUoKQorICB9CisKKyAgdm9pZCB0ZXN0RGlhZ25vc3RpY3MoKSB7CisKKyAgICAvLyBeCisKKyAgICAvLyBzdGVwCisgICAgLy8gOyBUZXN0IGRpYWdub3N0aWNzIGFib3V0IHdyb25nIHR5cGUgYXJndW1lbnQgYm91bmRzLgorICAgIC8vIHdvcmtzcGFjZS53YWl0Rm9yUmVhZHkoKQorICAgIC8vIHR5cGUoIkJhcjxTdHJpbmcsIERvdWJsZT4gYjsiKQorICAgIC8vIGFzc2VydCBkaWFnbm9zdGljcy5pdGVtcy5maWx0ZXIoCisgICAgLy8gIG1lc3NhZ2U9InR5cGUgYXJndW1lbnQgLiogaXMgbm90IHdpdGhpbiBib3VuZHMgLioiLAorICAgIC8vICBjb2RlPSJjb21waWxlci5lcnIubm90LndpdGhpbi5ib3VuZHMiLAorICAgIC8vICkKKyAgICAvLyBkZWxsaW5lKCkKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2p2bS9pZGVfcXVlcnkub3V0IGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2p2bS9pZGVfcXVlcnkub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOWZiODYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvanZtL2lkZV9xdWVyeS5vdXQKQEAgLTAsMCArMSw0IEBACisKKwNvdXQyWAorNmJ1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2p2bS9Gb28uamF2YRICCAEaGmlkZV9xdWVyeV9wcm9iZXJzY3JpcHRfanZtOs4BCisaaWRlX3F1ZXJ5X3Byb2JlcnNjcmlwdF9qdm0QARo2YnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvanZtL0Zvby5qYXZhGjZidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9qdm0vQmFyLmphdmEaPmJ1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2p2bS9vdGhlci9PdGhlci5qYXZhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2p2bS9vdGhlci9PdGhlci5qYXZhIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2p2bS9vdGhlci9PdGhlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMjY2MmEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvanZtL290aGVyL090aGVyLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBqdm0ub3RoZXI7CisKKy8qKiBPdGhlciBjbGFzcyAqLworcHVibGljIGNsYXNzIE90aGVyIHsKKyAgcHVibGljIE90aGVyKGludCBmaXJzdCwgU3RyaW5nIHNlY29uZCkge30KKworICBwdWJsaWMgT3RoZXIgb3RoZXIoKSB7CisgICAgcmV0dXJuIG5ldyBPdGhlcigwLCAiIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9qdm0vc3VpdGUudGV4dHBiIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2p2bS9zdWl0ZS50ZXh0cGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYwZTA4YwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9qdm0vc3VpdGUudGV4dHBiCkBAIC0wLDAgKzEsNCBAQAordGVzdHM6IHsKKyAgbmFtZTogImdlbmVyYWwiCisgIHNjcmlwdHM6ICJidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9qdm0vRm9vLmphdmEiCit9CmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvcmVnZW4uc2ggYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvcmVnZW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDRhMDI2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9yZWdlbi5zaApAQCAtMCwwICsxLDI4IEBACisjIS9iaW4vYmFzaCAtZQorCisjIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFRoaXMgc2NyaXB0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGlkZV9xdWVyeS5vdXQgZmlsZS4KKyMKKyMgVGhlIGlkZV9xdWVyeS5vdXQgZmlsZSBpcyBhIHByZS1jb21wdXRlZCByZXN1bHQgb2YgcnVubmluZyBpZGVfcXVlcnkuc2gKKyMgb24gYSBzZXQgb2YgZmlsZXMuIFRoaXMgYWxsb3dzIHRoZSBwcm9iZXIgdG8gcnVuIGl0cyB0ZXN0cyB3aXRob3V0IHJ1bm5pbmcKKyMgaWRlX3F1ZXJ5LnNoLiBUaGUgcHJvYmVyIGRvZXNuJ3QgY2hlY2stb3V0IHRoZSBmdWxsIHNvdXJjZSBjb2RlLCBzbyBpdAorIyBjYW4ndCBydW4gaWRlX3F1ZXJ5LnNoIGl0c2VsZi4KKworZmlsZXNfdG9fYnVpbGQ9KAorICBidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZ2VuZXJhbC5jYworKQorCitidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnkuc2ggLS1sdW5jaF90YXJnZXQ9YW9zcF9hcm0tdHJ1bmtfc3RhZ2luZy1lbmcgJHtmaWxlc190b19idWlsZFtAXX0gPiBidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9pZGVfcXVlcnkub3V0CmRpZmYgLS1naXQgYS90b29scy9qYXZhLWV2ZW50LWxvZy10YWdzLnB5IGIvdG9vbHMvamF2YS1ldmVudC1sb2ctdGFncy5weQppbmRleCBiYmQ2NWZhLi5lM2RjMDdlIDEwMDc1NQotLS0gYS90b29scy9qYXZhLWV2ZW50LWxvZy10YWdzLnB5CisrKyBiL3Rvb2xzL2phdmEtZXZlbnQtbG9nLXRhZ3MucHkKQEAgLTE1LDE2ICsxNSwxMiBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogIiIiCi1Vc2FnZTogamF2YS1ldmVudC1sb2ctdGFncy5weSBbLW8gb3V0cHV0X2ZpbGVdIDxpbnB1dF9maWxlPiA8bWVyZ2VkX3RhZ3NfZmlsZT4KLQogR2VuZXJhdGUgYSBqYXZhIGNsYXNzIGNvbnRhaW5pbmcgY29uc3RhbnRzIGZvciBlYWNoIG9mIHRoZSBldmVudCBsb2cKIHRhZ3MgaW4gdGhlIGdpdmVuIGlucHV0IGZpbGUuCi0KLS1oIHRvIGRpc3BsYXkgdGhpcyB1c2FnZSBtZXNzYWdlIGFuZCBleGl0LgogIiIiCiAKIGZyb20gaW8gaW1wb3J0IFN0cmluZ0lPCi1pbXBvcnQgZ2V0b3B0CitpbXBvcnQgYXJncGFyc2UKIGltcG9ydCBvcwogaW1wb3J0IG9zLnBhdGgKIGltcG9ydCByZQpAQCAtMzIsNTcgKzI4LDE0IEBACiAKIGltcG9ydCBldmVudF9sb2dfdGFncwogCi1vdXRwdXRfZmlsZSA9IE5vbmUKK3BhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPV9fZG9jX18pCitwYXJzZXIuYWRkX2FyZ3VtZW50KCctbycsIGRlc3Q9J291dHB1dF9maWxlJykKK3BhcnNlci5hZGRfYXJndW1lbnQoJ2ZpbGUnKQorYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKIAotdHJ5OgotICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICJobzoiKQotZXhjZXB0IGdldG9wdC5HZXRvcHRFcnJvciBhcyBlcnI6Ci0gIHByaW50KHN0cihlcnIpKQotICBwcmludChfX2RvY19fKQotICBzeXMuZXhpdCgyKQotCi1mb3IgbywgYSBpbiBvcHRzOgotICBpZiBvID09ICItaCI6Ci0gICAgcHJpbnQoX19kb2NfXykKLSAgICBzeXMuZXhpdCgyKQotICBlbGlmIG8gPT0gIi1vIjoKLSAgICBvdXRwdXRfZmlsZSA9IGEKLSAgZWxzZToKLSAgICBwcmludCgidW5oYW5kbGVkIG9wdGlvbiAlcyIgJSAobywpLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgc3lzLmV4aXQoMSkKLQotaWYgbGVuKGFyZ3MpICE9IDEgYW5kIGxlbihhcmdzKSAhPSAyOgotICBwcmludCgibmVlZCBvbmUgb3IgdHdvIGlucHV0IGZpbGVzLCBub3QgJWQiICUgKGxlbihhcmdzKSwpKQotICBwcmludChfX2RvY19fKQotICBzeXMuZXhpdCgxKQotCi1mbiA9IGFyZ3NbMF0KK2ZuID0gYXJncy5maWxlCiB0YWdmaWxlID0gZXZlbnRfbG9nX3RhZ3MuVGFnRmlsZShmbikKIAotaWYgbGVuKGFyZ3MpID4gMToKLSAgIyBMb2FkIHRoZSBtZXJnZWQgdGFnIGZpbGUgKHdoaWNoIHNob3VsZCBoYXZlIG51bWJlcnMgYXNzaWduZWQgZm9yIGFsbAotICAjIHRhZ3MuICBVc2UgdGhlIG51bWJlcnMgZnJvbSB0aGUgbWVyZ2VkIGZpbGUgdG8gZmlsbCBpbiBhbnkgbWlzc2luZwotICAjIG51bWJlcnMgZnJvbSB0aGUgaW5wdXQgZmlsZS4KLSAgbWVyZ2VkX2ZuID0gYXJnc1sxXQotICBtZXJnZWRfdGFnZmlsZSA9IGV2ZW50X2xvZ190YWdzLlRhZ0ZpbGUobWVyZ2VkX2ZuKQotICBtZXJnZWRfYnlfbmFtZSA9IGRpY3QoWyh0LnRhZ25hbWUsIHQpIGZvciB0IGluIG1lcmdlZF90YWdmaWxlLnRhZ3NdKQotICBmb3IgdCBpbiB0YWdmaWxlLnRhZ3M6Ci0gICAgaWYgdC50YWdudW0gaXMgTm9uZToKLSAgICAgIGlmIHQudGFnbmFtZSBpbiBtZXJnZWRfYnlfbmFtZToKLSAgICAgICAgdC50YWdudW0gPSBtZXJnZWRfYnlfbmFtZVt0LnRhZ25hbWVdLnRhZ251bQotICAgICAgZWxzZToKLSAgICAgICAgIyBXZSdyZSBidWlsZGluZyBzb21ldGhpbmcgdGhhdCdzIG5vdCBiZWluZyBpbmNsdWRlZCBpbiB0aGUKLSAgICAgICAgIyBwcm9kdWN0LCBzbyBpdHMgdGFncyBkb24ndCBhcHBlYXIgaW4gdGhlIG1lcmdlZCBmaWxlLiAgQXNzaWduCi0gICAgICAgICMgdGhlbSBhbGwgYW4gYXJiaXRyYXJ5IG51bWJlciBzbyB3ZSBjYW4gZW1pdCB0aGUgamF2YSBhbmQKLSAgICAgICAgIyBjb21waWxlIHRoZSAodW51c2VkKSBwYWNrYWdlLgotICAgICAgICB0LnRhZ251bSA9IDk5OTk5OQotZWxzZToKLSAgIyBOb3QgdXNpbmcgdGhlIG1lcmdlZCB0YWcgZmlsZSwgc28gYWxsIHRhZ3MgbXVzdCBoYXZlIG1hbnVhbGx5IGFzc2lnbmVkCi0gICMgbnVtYmVycwotICBmb3IgdCBpbiB0YWdmaWxlLnRhZ3M6Ci0gICAgaWYgdC50YWdudW0gaXMgTm9uZToKLSAgICAgIHRhZ2ZpbGVmLkFkZEVycm9yKCJ0YWcgXCIlc1wiIGhhcyBubyBudW1iZXIiICUgKHRhZ25hbWUsKSwgdGFnLmxpbmVudW0pCi0KIGlmICJqYXZhX3BhY2thZ2UiIG5vdCBpbiB0YWdmaWxlLm9wdGlvbnM6CiAgIHRhZ2ZpbGUuQWRkRXJyb3IoImphdmFfcGFja2FnZSBvcHRpb24gbm90IHNwZWNpZmllZCIsIGxpbmVudW09MCkKIApAQCAtMTQxLDExICs5NCwxMSBAQAogZm9yIHQgaW4gdGFnZmlsZS50YWdzOgogICBtZXRob2ROYW1lID0gamF2YU5hbWUoIndyaXRlXyIgKyB0LnRhZ25hbWUpCiAgIGlmIHQuZGVzY3JpcHRpb246Ci0gICAgYXJncyA9IFthcmcuc3RyaXAoIigpICIpLnNwbGl0KCJ8IikgZm9yIGFyZyBpbiB0LmRlc2NyaXB0aW9uLnNwbGl0KCIsIildCisgICAgZm5fYXJncyA9IFthcmcuc3RyaXAoIigpICIpLnNwbGl0KCJ8IikgZm9yIGFyZyBpbiB0LmRlc2NyaXB0aW9uLnNwbGl0KCIsIildCiAgIGVsc2U6Ci0gICAgYXJncyA9IFtdCi0gIGFyZ1R5cGVzTmFtZXMgPSAiLCAiLmpvaW4oW2phdmFUeXBlc1tpbnQoYXJnWzFdKV0gKyAiICIgKyBqYXZhTmFtZShhcmdbMF0pIGZvciBhcmcgaW4gYXJnc10pCi0gIGFyZ05hbWVzID0gIiIuam9pbihbIiwgIiArIGphdmFOYW1lKGFyZ1swXSkgZm9yIGFyZyBpbiBhcmdzXSkKKyAgICBmbl9hcmdzID0gW10KKyAgYXJnVHlwZXNOYW1lcyA9ICIsICIuam9pbihbamF2YVR5cGVzW2ludChhcmdbMV0pXSArICIgIiArIGphdmFOYW1lKGFyZ1swXSkgZm9yIGFyZyBpbiBmbl9hcmdzXSkKKyAgYXJnTmFtZXMgPSAiIi5qb2luKFsiLCAiICsgamF2YU5hbWUoYXJnWzBdKSBmb3IgYXJnIGluIGZuX2FyZ3NdKQogICBidWZmZXIud3JpdGUoIlxuICBwdWJsaWMgc3RhdGljIHZvaWQgJXMoJXMpIHsiICUgKG1ldGhvZE5hbWUsIGFyZ1R5cGVzTmFtZXMpKQogICBidWZmZXIud3JpdGUoIlxuICAgIGFuZHJvaWQudXRpbC5FdmVudExvZy53cml0ZUV2ZW50KCVzJXMpOyIgJSAodC50YWduYW1lLnVwcGVyKCksIGFyZ05hbWVzKSkKICAgYnVmZmVyLndyaXRlKCJcbiAgfVxuIikKQEAgLTE1Myw4ICsxMDYsOCBAQAogCiBidWZmZXIud3JpdGUoIn1cbiIpOwogCi1vdXRwdXRfZGlyID0gb3MucGF0aC5kaXJuYW1lKG91dHB1dF9maWxlKQorb3V0cHV0X2RpciA9IG9zLnBhdGguZGlybmFtZShhcmdzLm91dHB1dF9maWxlKQogaWYgbm90IG9zLnBhdGguZXhpc3RzKG91dHB1dF9kaXIpOgogICBvcy5tYWtlZGlycyhvdXRwdXRfZGlyKQogCi1ldmVudF9sb2dfdGFncy5Xcml0ZU91dHB1dChvdXRwdXRfZmlsZSwgYnVmZmVyKQorZXZlbnRfbG9nX3RhZ3MuV3JpdGVPdXRwdXQoYXJncy5vdXRwdXRfZmlsZSwgYnVmZmVyKQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGlzdF9maWxlcy5weSBiL3Rvb2xzL2xpc3RfZmlsZXMucHkKaW5kZXggM2FmYTgxZi4uNGY2NjZhYSAxMDA2NDQKLS0tIGEvdG9vbHMvbGlzdF9maWxlcy5weQorKysgYi90b29scy9saXN0X2ZpbGVzLnB5CkBAIC0xOCw2ICsxOCw3IEBACiBmcm9tIGdsb2IgaW1wb3J0IGdsb2IKIGZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aAogZnJvbSBvcy5wYXRoIGltcG9ydCBqb2luLCByZWxwYXRoCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgY2hhaW4KIGltcG9ydCBhcmdwYXJzZQogCiBjbGFzcyBGaWxlTGlzdGVyOgpAQCAtMjcsNyArMjgsOCBAQAogICAgICAgICBzZWxmLmZvbGRlcl9kaXIgPSBhcmdzLmRpcgogICAgICAgICBzZWxmLmV4dGVuc2lvbnMgPSBbZSBpZiBlLnN0YXJ0c3dpdGgoIi4iKSBlbHNlICIuIiArIGUgZm9yIGUgaW4gYXJncy5leHRlbnNpb25zXQogICAgICAgICBzZWxmLnJvb3QgPSBhcmdzLnJvb3QKLSAgICAgICAgc2VsZi5maWxlc19saXN0ID0gbGlzdCgpCisgICAgICAgIHNlbGYuZmlsZXNfbGlzdCA6IExpc3Rbc3RyXSA9IGxpc3QoKQorICAgICAgICBzZWxmLmNsYXNzZXMgPSBhcmdzLmNsYXNzZXMKIAogICAgIGRlZiBnZXRfZmlsZXMoc2VsZikgLT4gTm9uZToKICAgICAgICAgIiIiR2V0IGFsbCBmaWxlcyBkaXJlY3RvcnkgaW4gdGhlIGlucHV0IGRpcmVjdG9yeSBpbmNsdWRpbmcgdGhlIGZpbGVzIGluIHRoZSBzdWJkaXJlY3RvcmllcwpAQCAtNjEsNiArNjMsMjYgQEAKICAgICBkZWYgbGlzdChzZWxmKSAtPiBOb25lOgogICAgICAgICBzZWxmLmdldF9maWxlcygpCiAgICAgICAgIHNlbGYuZmlsZXNfbGlzdCA9IFtmIGZvciBmIGluIHNlbGYuZmlsZXNfbGlzdCBpZiBub3Qgc2VsZi5leHRlbnNpb25zIG9yIFBhdGgoZikuc3VmZml4IGluIHNlbGYuZXh0ZW5zaW9uc10KKworICAgICAgICAjIElmIGZpbGVzX2xpc3QgaXMgYXMgYmVsb3c6CisgICAgICAgICMgQS9CL0MuamF2YQorICAgICAgICAjIEEvQi9ELmphdmEKKyAgICAgICAgIyBBL0IvRS50eHQKKyAgICAgICAgIyAtLWNsYXNzZXMgZmxhZyBjb252ZXJ0cyBmaWxlc19saXN0IGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorICAgICAgICAjIEEvQi9DLmNsYXNzCisgICAgICAgICMgQS9CL0MkKi5jbGFzcworICAgICAgICAjIEEvQi9ELmNsYXNzCisgICAgICAgICMgQS9CL0QkKi5jbGFzcworICAgICAgICAjIEFkZGl0aW9uYWwgYCQqYC1zdWZmaXhlZCBsaW5lIGlzIGFwcGVuZGVkIGFmdGVyIGVhY2ggbGluZQorICAgICAgICAjIHRvIHRha2UgbXVsdGlwbGUgdG9wIGxldmVsIGNsYXNzZXMgaW4gYSBzaW5nbGUgamF2YSBmaWxlIGludG8gYWNjb3VudC4KKyAgICAgICAgIyBOb3RlIHRoYXQgbm9uLWphdmEgZmlsZXMgaW4gZmlsZXNfbGlzdCBhcmUgZmlsdGVyZWQgb3V0LgorICAgICAgICBpZiBzZWxmLmNsYXNzZXM6CisgICAgICAgICAgICBzZWxmLmZpbGVzX2xpc3QgPSBsaXN0KGNoYWluLmZyb21faXRlcmFibGUoWworICAgICAgICAgICAgICAgIChjbGFzc19maWxlcyA6PSBzdHIoUGF0aChmZikud2l0aF9zdWZmaXgoIi5jbGFzcyIpKSwKKyAgICAgICAgICAgICAgICAgY2xhc3NfZmlsZXMucmVwbGFjZSgiLmNsYXNzIiwgIiQqLmNsYXNzIikpCisgICAgICAgICAgICAgICAgIGZvciBmZiBpbiBzZWxmLmZpbGVzX2xpc3QgaWYgZmYuZW5kc3dpdGgoIi5qYXZhIikKKyAgICAgICAgICAgIF0pKQorCiAgICAgICAgIHNlbGYud3JpdGUoKQogCiAgICAgZGVmIHdyaXRlKHNlbGYpIC0+IE5vbmU6CkBAIC05NSw2ICsxMTcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Im9wdGlvbmFsIGRpcmVjdG9yeSB0byByZXBsYWNlIHRoZSByb290IGRpcmVjdG9yaWVzIG9mIG91dHB1dC4iKQogICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tZXh0ZW5zaW9ucycsIG5hcmdzPScqJywgZGVmYXVsdD1saXN0KCksIGRlc3Q9J2V4dGVuc2lvbnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iRXh0ZW5zaW9ucyB0byBpbmNsdWRlIGluIHRoZSBvdXRwdXQuIElmIG5vdCBzZXQsIGFsbCBmaWxlcyBhcmUgaW5jbHVkZWQiKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tY2xhc3NlcycsIGRlc3Q9J2NsYXNzZXMnLCBhY3Rpb249YXJncGFyc2UuQm9vbGVhbk9wdGlvbmFsQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iT3B0aW9uYWwgZmxhZy4gSWYgcGFzc2VkLCBvdXRwdXRzIGEgbGlzdCBvZiBwYXR0ZXJuIG9mIGNsYXNzIGZpbGVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIHByb2R1Y2VkIGJ5IGNvbXBpbGluZyBqYXZhIGZpbGVzIGluIHRoZSBpbnB1dCBkaXIuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uLWphdmEgZmlsZXMgaW4gdGhlIGlucHV0IGRpcmVjdG9yeSB3aWxsIGJlIGlnbm9yZWQuIikKIAogICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2x1bmNoYWJsZSBiL3Rvb2xzL2x1bmNoYWJsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mY2UyYzI3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbHVuY2hhYmxlCkBAIC0wLDAgKzEsNzIgQEAKKyMhL2Jpbi9iYXNoCisKKyMgVE9ETzogQ3VycmVudGx5IG9ubHkgY2hlY2tzIHRydW5rX3N0YWdpbmcuIFNob3VsZCBjaGVjayB0cnVua19zdGFnaW5nIGZpcnN0LAorIyAgICAgICB0aGVuIHVzZSB0aGUgcHJvZHVjdC1zcGVjZmljIHJlbGVhc2VzLiBPbmx5IGFwcGxpZXMgdG8gLWMgdGhvdWdoLgorCitmdW5jdGlvbiBIZWxwKCkgeworY2F0IDw8QEVPRkAKK1VzYWdlOiBsdW5jaGFibGUgW29wdGlvbnNdCisKK0xpc3RzIHByb2R1Y3RzIHRoYXQgaGF2ZSBubyBmdW5jdGlvbmluZyBsdW5jaCBjb21iby4KKworb3B0aW9uczoKKy1jICAgIHByaW50cyBhbGwgZmFpbGluZyBsdW5jaCBjb21ib3MgZm9yIGFsbCB0YXJnZXRzOworLXcgICAgd2h5PyBQcmludHMgdGhlIGVycm9yIG1lc3NhZ2UgYWZ0ZXIgZWFjaCBmYWlsZWQgbHVuY2ggY29tYm8uIE9ubHkKKyAgICAgIHdvcmtzIHdpdGggLWMKKworQEVPRkAKK30KKworY29tcGxldGU9MAord2h5PTAKK3doaWxlIGdldG9wdHMgImN3aCIgb3B0aW9uOyBkbworICBjYXNlICRvcHRpb24gaW4KKyAgICBjKQorICAgICAgY29tcGxldGU9MTs7CisgICAgdykKKyAgICAgIHdoeT0xOzsKKyAgICBoKQorICAgICAgSGVscAorICAgICAgZXhpdDs7CisgIGVzYWMKK2RvbmUKKworIyBHZXR0aW5nIGFsbCBuYW1lZCBwcm9kdWN0cyBjYW4gZmFpbCBpZiB3ZSBoYXZlbid0IGx1bmNoZWQgYW55dGhpbmcKK3NvdXJjZSAkKHB3ZCkvYnVpbGQvZW52c2V0dXAuc2ggJj4gL2Rldi9udWxsCithbGxfbmFtZWRfcHJvZHVjdHM9KCAkKGdldF9idWlsZF92YXIgYWxsX25hbWVkX3Byb2R1Y3RzIDI+IC9kZXYvbnVsbCkgKQoraWYgW1sgJD8gLW5lIDAgXV07IHRoZW4KKyAgZWNobyAiZ2V0X2J1aWxkX3ZhciBhbGxfbmFtZWRfcHJvZHVjdHMgZmFpbGVkLiBMdW5jaCBzb21ldGhpbmcgZmlyc3Q/IiA+JjIKKyAgZXhpdCAxCitmaQordG90YWxfcHJvZHVjdHM9JHsjYWxsX25hbWVkX3Byb2R1Y3RzW0BdfQorY3VycmVudF9wcm9kdWN0PTAKKworZm9yIHByb2R1Y3QgaW4gIiR7YWxsX25hbWVkX3Byb2R1Y3RzW0BdfSI7IGRvCisgICgoIGN1cnJlbnRfcHJvZHVjdCArPSAxICkpCisgIHNpbmdsZV9wYXNzPTAKKyAgcHJpbnRmICIgQ2hlY2tpbmcgJHtjdXJyZW50X3Byb2R1Y3R9LyR7dG90YWxfcHJvZHVjdHN9IFxyIiA+JjIKKyAgZm9yIHJlbGVhc2UgaW4gdHJ1bmtfc3RhZ2luZzsgZG8KKyAgICBmb3IgdmFyaWFudCBpbiBlbmcgdXNlciB1c2VyZGVidWc7IGRvCisgICAgICBsdW5jaGNvbWJvPSIke3Byb2R1Y3R9LSR7cmVsZWFzZX0tJHt2YXJpYW50fSIKKyAgICAgIGx1bmNoX2Vycm9yPSIkKGx1bmNoICRsdW5jaGNvbWJvIDI+JjEgPiAvZGV2L251bGwpIgorICAgICAgaWYgW1sgJD8gLW5lIDAgXV07IHRoZW4KKyAgICAgICAgIyBMdW5jaCBmYWlsZWQKKyAgICAgICAgaWYgW1sgJGNvbXBsZXRlIC1lcSAxIF1dOyB0aGVuCisgICAgICAgICAgZWNobyAtZSAiJHtwcm9kdWN0fSA6ICR7bHVuY2hjb21ib30iCisgICAgICAgICAgaWYgW1sgJHdoeSAtZXEgMSBdXTsgdGhlbgorICAgICAgICAgICAgZWNobyAtZSAiJChzZWQgJ3MvXi8gICAgL2cnIDw8PCRsdW5jaF9lcnJvcikiCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICAgIGVsaWYgW1sgJGNvbXBsZXRlIC1uZSAxIF1dOyB0aGVuCisgICAgICAgIHNpbmdsZV9wYXNzPTEKKyAgICAgICAgYnJlYWsgIyBza2lwIHZhcmlhbnQKKyAgICAgIGZpCisgICAgZG9uZQorICAgIGlmIFtbICRzaW5nbGVfcGFzcyAtZXEgMSBdXTsgdGhlbgorICAgICAgYnJlYWsgIyBza2lwIHJlbGVhc2UKKyAgICBmaQorICBkb25lCisgIGlmIFtbICRjb21wbGV0ZSAtZXEgMCBdXSAmJiBbWyAkc2luZ2xlX3Bhc3MgLWVxIDAgXV07IHRoZW4KKyAgICBlY2hvICIke3Byb2R1Y3R9IgorICBmaQorZG9uZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWVyZ2UtZXZlbnQtbG9nLXRhZ3MucHkgYi90b29scy9tZXJnZS1ldmVudC1sb2ctdGFncy5weQppbmRleCAyOTI2MDRjLi41NzMwYzExIDEwMDc1NQotLS0gYS90b29scy9tZXJnZS1ldmVudC1sb2ctdGFncy5weQorKysgYi90b29scy9tZXJnZS1ldmVudC1sb2ctdGFncy5weQpAQCAtMTUsMjIgKzE1LDEzIEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAiIiIKLVVzYWdlOiBtZXJnZS1ldmVudC1sb2ctdGFncy5weSBbLW8gb3V0cHV0X2ZpbGVdIFtpbnB1dF9maWxlcy4uLl0KLQogTWVyZ2UgdG9nZXRoZXIgemVybyBvciBtb3JlIGV2ZW50LWxvZ3MtdGFncyBmaWxlcyB0byBwcm9kdWNlIGEgc2luZ2xlCiBvdXRwdXQgZmlsZSwgc3RyaXBwZWQgb2YgY29tbWVudHMuICBDaGVja3MgdGhhdCBubyB0YWcgbnVtYmVycyBjb25mbGljdAogYW5kIGZhaWxzIGlmIHRoZXkgZG8uCi0KLS1oIHRvIGRpc3BsYXkgdGhpcyB1c2FnZSBtZXNzYWdlIGFuZCBleGl0LgogIiIiCiAKIGZyb20gaW8gaW1wb3J0IFN0cmluZ0lPCi1pbXBvcnQgZ2V0b3B0Ci10cnk6Ci0gIGltcG9ydCBoYXNobGliCi1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gIGltcG9ydCBtZDUgYXMgaGFzaGxpYgotaW1wb3J0IHN0cnVjdAoraW1wb3J0IGFyZ3BhcnNlCiBpbXBvcnQgc3lzCiAKIGltcG9ydCBldmVudF9sb2dfdGFncwpAQCAtMzgsMzIgKzI5LDEwIEBACiBlcnJvcnMgPSBbXQogd2FybmluZ3MgPSBbXQogCi1vdXRwdXRfZmlsZSA9IE5vbmUKLXByZV9tZXJnZWRfZmlsZSA9IE5vbmUKLQotIyBUYWdzIHdpdGggYSB0YWcgbnVtYmVyIG9mID8gYXJlIGFzc2lnbmVkIGEgdGFnIGluIHRoZSByYW5nZQotIyBbQVNTSUdOX1NUQVJULCBBU1NJR05fTElNSVQpLgotQVNTSUdOX1NUQVJUID0gOTAwMDAwCi1BU1NJR05fTElNSVQgPSAxMDAwMDAwCi0KLXRyeToKLSAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAiaG86bToiKQotZXhjZXB0IGdldG9wdC5HZXRvcHRFcnJvciBhcyBlcnI6Ci0gIHByaW50KHN0cihlcnIpKQotICBwcmludChfX2RvY19fKQotICBzeXMuZXhpdCgyKQotCi1mb3IgbywgYSBpbiBvcHRzOgotICBpZiBvID09ICItaCI6Ci0gICAgcHJpbnQoX19kb2NfXykKLSAgICBzeXMuZXhpdCgyKQotICBlbGlmIG8gPT0gIi1vIjoKLSAgICBvdXRwdXRfZmlsZSA9IGEKLSAgZWxpZiBvID09ICItbSI6Ci0gICAgcHJlX21lcmdlZF9maWxlID0gYQotICBlbHNlOgotICAgIHByaW50KCJ1bmhhbmRsZWQgb3B0aW9uICVzIiAlIChvLCksIGZpbGU9c3lzLnN0ZGVycikKLSAgICBzeXMuZXhpdCgxKQorcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249X19kb2NfXykKK3BhcnNlci5hZGRfYXJndW1lbnQoJy1vJywgZGVzdD0nb3V0cHV0X2ZpbGUnKQorcGFyc2VyLmFkZF9hcmd1bWVudCgnZmlsZXMnLCBuYXJncz0nKicpCithcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQogCiAjIFJlc3RyaWN0aW9ucyBvbiB0YWdzOgogIwpAQCAtNzcsMTIgKzQ2LDcgQEAKIGJ5X3RhZ25hbWUgPSB7fQogYnlfdGFnbnVtID0ge30KIAotcHJlX21lcmdlZF90YWdzID0ge30KLWlmIHByZV9tZXJnZWRfZmlsZToKLSAgZm9yIHQgaW4gZXZlbnRfbG9nX3RhZ3MuVGFnRmlsZShwcmVfbWVyZ2VkX2ZpbGUpLnRhZ3M6Ci0gICAgcHJlX21lcmdlZF90YWdzW3QudGFnbmFtZV0gPSB0Ci0KLWZvciBmbiBpbiBhcmdzOgorZm9yIGZuIGluIGFyZ3MuZmlsZXM6CiAgIHRhZ2ZpbGUgPSBldmVudF9sb2dfdGFncy5UYWdGaWxlKGZuKQogCiAgIGZvciB0IGluIHRhZ2ZpbGUudGFnczoKQEAgLTkzLDEyICs1Nyw2IEBACiAgICAgaWYgdC50YWduYW1lIGluIGJ5X3RhZ25hbWU6CiAgICAgICBvcmlnID0gYnlfdGFnbmFtZVt0LnRhZ25hbWVdCiAKLSAgICAgICMgQWxsb3cgYW4gZXhwbGljaXQgdGFnIG51bWJlciB0byBkZWZpbmUgYW4gaW1wbGljaXQgdGFnIG51bWJlcgotICAgICAgaWYgb3JpZy50YWdudW0gaXMgTm9uZToKLSAgICAgICAgb3JpZy50YWdudW0gPSB0LnRhZ251bQotICAgICAgZWxpZiB0LnRhZ251bSBpcyBOb25lOgotICAgICAgICB0LnRhZ251bSA9IG9yaWcudGFnbnVtCi0KICAgICAgIGlmICh0LnRhZ251bSA9PSBvcmlnLnRhZ251bSBhbmQKICAgICAgICAgICB0LmRlc2NyaXB0aW9uID09IG9yaWcuZGVzY3JpcHRpb24pOgogICAgICAgICAjIGlmIHRoZSBuYW1lIGFuZCBkZXNjcmlwdGlvbiBhcmUgaWRlbnRpY2FsLCBpc3N1ZSBhIHdhcm5pbmcKQEAgLTExNCw3ICs3Miw3IEBACiAgICAgICAgICAgICBsaW5lbnVtPXQubGluZW51bSkKICAgICAgIGNvbnRpbnVlCiAKLSAgICBpZiB0LnRhZ251bSBpcyBub3QgTm9uZSBhbmQgdC50YWdudW0gaW4gYnlfdGFnbnVtOgorICAgIGlmIHQudGFnbnVtIGluIGJ5X3RhZ251bToKICAgICAgIG9yaWcgPSBieV90YWdudW1bdC50YWdudW1dCiAKICAgICAgIGlmIHQudGFnbmFtZSAhPSBvcmlnLnRhZ25hbWU6CkBAIC0xMjUsOCArODMsNyBAQAogICAgICAgICBjb250aW51ZQogCiAgICAgYnlfdGFnbmFtZVt0LnRhZ25hbWVdID0gdAotICAgIGlmIHQudGFnbnVtIGlzIG5vdCBOb25lOgotICAgICAgYnlfdGFnbnVtW3QudGFnbnVtXSA9IHQKKyAgICBieV90YWdudW1bdC50YWdudW1dID0gdAogCiAgIGVycm9ycy5leHRlbmQodGFnZmlsZS5lcnJvcnMpCiAgIHdhcm5pbmdzLmV4dGVuZCh0YWdmaWxlLndhcm5pbmdzKQpAQCAtMTQwLDM4ICs5Nyw2IEBACiAgIGZvciBmbiwgbG4sIG1zZyBpbiB3YXJuaW5nczoKICAgICBwcmludCgiJXM6JWQ6IHdhcm5pbmc6ICVzIiAlIChmbiwgbG4sIG1zZyksIGZpbGU9c3lzLnN0ZGVycikKIAotIyBQeXRob24ncyBoYXNoIGZ1bmN0aW9uIChhKSBpc24ndCBncmVhdCBhbmQgKGIpIHZhcmllcyBiZXR3ZWVuCi0jIHZlcnNpb25zIG9mIHB5dGhvbi4gIFVzaW5nIG1kNSBpcyBvdmVya2lsbCBoZXJlIGJ1dCBpcyB0aGUgc2FtZSBmcm9tCi0jIHBsYXRmb3JtIHRvIHBsYXRmb3JtIGFuZCBzcGVlZCBzaG91bGRuJ3QgbWF0dGVyIGluIHByYWN0aWNlLgotZGVmIGhhc2huYW1lKHN0cik6Ci0gIGQgPSBoYXNobGliLm1kNShzdHIpLmRpZ2VzdCgpWzo0XQotICByZXR1cm4gc3RydWN0LnVucGFjaygiIUkiLCBkKVswXQotCi0jIEFzc2lnbiBhIHRhZyBudW1iZXIgdG8gYWxsIHRoZSBlbnRyaWVzIHRoYXQgc2F5IHRoZXkgd2FudCBvbmUKLSMgYXNzaWduZWQuICBXZSBkbyB0aGlzIGJhc2VkIG9uIGEgaGFzaCBvZiB0aGUgdGFnIG5hbWUgc28gdGhhdCB0aGUKLSMgbnVtYmVycyBzaG91bGQgc3RheSByZWxhdGl2ZWx5IHN0YWJsZSBhcyB0YWdzIGFyZSBhZGRlZC4KLQotIyBJZiB3ZSB3ZXJlIHByb3ZpZGVkIHByZS1tZXJnZWQgdGFncyAody8gdGhlIC1tIG9wdGlvbiksIHRoZW4gZG9uJ3QKLSMgZXZlciB0cnkgdG8gYWxsb2NhdGUgb25lLCBqdXN0IGZhaWwgaWYgd2UgZG9uJ3QgaGF2ZSBhIG51bWJlcgotCi1mb3IgbmFtZSwgdCBpbiBzb3J0ZWQoYnlfdGFnbmFtZS5pdGVtcygpKToKLSAgaWYgdC50YWdudW0gaXMgTm9uZToKLSAgICBpZiBwcmVfbWVyZ2VkX3RhZ3M6Ci0gICAgICB0cnk6Ci0gICAgICAgIHQudGFnbnVtID0gcHJlX21lcmdlZF90YWdzW3QudGFnbmFtZV0KLSAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgcHJpbnQoIkVycm9yOiBUYWcgbnVtYmVyIG5vdCBkZWZpbmVkIGZvciB0YWcgYCVzJy4gSGF2ZSB5b3UgZG9uZSBhIGZ1bGwgYnVpbGQ/IiAlIHQudGFnbmFtZSwKLSAgICAgICAgICAgICAgZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICBzeXMuZXhpdCgxKQotICAgIGVsc2U6Ci0gICAgICB3aGlsZSBUcnVlOgotICAgICAgICB4ID0gKGhhc2huYW1lKG5hbWUpICUgKEFTU0lHTl9MSU1JVCAtIEFTU0lHTl9TVEFSVCAtIDEpKSArIEFTU0lHTl9TVEFSVAotICAgICAgICBpZiB4IG5vdCBpbiBieV90YWdudW06Ci0gICAgICAgICAgdC50YWdudW0gPSB4Ci0gICAgICAgICAgYnlfdGFnbnVtW3hdID0gdAotICAgICAgICAgIGJyZWFrCi0gICAgICAgIG5hbWUgPSAiXyIgKyBuYW1lCi0KICMgYnlfdGFnbnVtIHNob3VsZCBiZSBjb21wbGV0ZSBub3c7IHdlJ3ZlIGFzc2lnbmVkIG51bWJlcnMgdG8gYWxsIHRhZ3MuCiAKIGJ1ZmZlciA9IFN0cmluZ0lPKCkKQEAgLTE4MSw0ICsxMDYsNCBAQAogICBlbHNlOgogICAgIGJ1ZmZlci53cml0ZSgiJWQgJXNcbiIgJSAodC50YWdudW0sIHQudGFnbmFtZSkpCiAKLWV2ZW50X2xvZ190YWdzLldyaXRlT3V0cHV0KG91dHB1dF9maWxlLCBidWZmZXIpCitldmVudF9sb2dfdGFncy5Xcml0ZU91dHB1dChhcmdzLm91dHB1dF9maWxlLCBidWZmZXIpCmRpZmYgLS1naXQgYS90b29scy9taXNzaW5nX3Nvb25nX21vZHVsZV9pbmZvLnB5IGIvdG9vbHMvbWlzc2luZ19zb29uZ19tb2R1bGVfaW5mby5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZmE3ZjJiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbWlzc2luZ19zb29uZ19tb2R1bGVfaW5mby5weQpAQCAtMCwwICsxLDUzIEBACisjIS91c3IvYmluL2VudiBweXRob24zCisjCisjIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAnTGljZW5zZScpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQganNvbgoraW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK2RlZiBtYWluKCk6CisgICAgdHJ5OgorICAgICAgICBwcm9kdWN0X291dCA9IG9zLmVudmlyb25bIkFORFJPSURfUFJPRFVDVF9PVVQiXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiQ2FuJ3QgZ2V0IEFORFJPSURfUFJPRFVDVF9PVVQuIFJ1biBsdW5jaCBmaXJzdC5cbiIpCisgICAgICAgIHN5cy5leGl0KDEpCisKKyAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihwcm9kdWN0X291dCwgIm1vZHVsZS1pbmZvLmpzb24iKQorICAgIHRyeToKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lKSBhcyBmOgorICAgICAgICAgICAgbW9kdWxlcyA9IGpzb24ubG9hZChmKQorICAgIGV4Y2VwdCBGaWxlTm90Rm91bmRFcnJvcjoKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZShmIkZpbGUgbm90IGZvdW5kOiB7ZmlsZW5hbWV9XG4iKQorICAgICAgICBzeXMuZXhpdCgxKQorICAgIGV4Y2VwdCBqc29uLkpTT05EZWNvZGVFcnJvcjoKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZShmIkludmFsaWQganNvbjoge2ZpbGVuYW1lfVxuIikKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGNsYXNzZXMgPSB7fQorCisgICAgZm9yIG5hbWUsIGluZm8gaW4gbW9kdWxlcy5pdGVtcygpOgorICAgICAgICBtYWtlID0gaW5mby5nZXQoIm1ha2UiKQorICAgICAgICBtYWtlX2dlbiA9IGluZm8uZ2V0KCJtYWtlX2dlbmVyYXRlZF9tb2R1bGVfaW5mbyIpCisgICAgICAgIGlmIG5vdCBtYWtlIGFuZCBtYWtlX2dlbjoKKyAgICAgICAgICAgIGNsYXNzZXMuc2V0ZGVmYXVsdChmcm96ZW5zZXQoaW5mby5nZXQoImNsYXNzIikpLCBbXSkuYXBwZW5kKG5hbWUpCisKKyAgICBmb3IgY2wsIG5hbWVzIGluIGNsYXNzZXMuaXRlbXMoKToKKyAgICAgICAgcHJpbnQoIiAiLmpvaW4oY2wpKQorICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgIHByaW50KCIgIiwgbmFtZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYmVuY2htYXJrcyBiL3Rvb2xzL3BlcmYvYmVuY2htYXJrcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OTk4ZWNkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9iZW5jaG1hcmtzCkBAIC0wLDAgKzEsODExIEBACisjIS91c3IvYmluL2VudiBweXRob24zCisjIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgc3lzCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHN5cy5kb250X3dyaXRlX2J5dGVjb2RlID0gVHJ1ZQorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBkYXRhY2xhc3NlcworaW1wb3J0IGRhdGV0aW1lCitpbXBvcnQganNvbgoraW1wb3J0IG9zCitpbXBvcnQgcGF0aGxpYgoraW1wb3J0IHJhbmRvbQoraW1wb3J0IHJlCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHRpbWUKK2ltcG9ydCB1dWlkCitmcm9tIHR5cGluZyBpbXBvcnQgT3B0aW9uYWwKKworaW1wb3J0IHByZXR0eQoraW1wb3J0IHV0aWxzCisKKworY2xhc3MgRmF0YWxFcnJvcihFeGNlcHRpb24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisKK2NsYXNzIE9wdGlvbnNFcnJvcihFeGNlcHRpb24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQorCisKK0BkYXRhY2xhc3Nlcy5kYXRhY2xhc3MoZnJvemVuPVRydWUpCitjbGFzcyBMdW5jaDoKKyAgICAiTHVuY2ggY29tYmluYXRpb24iCisKKyAgICB0YXJnZXRfcHJvZHVjdDogc3RyCisgICAgIlRBUkdFVF9QUk9EVUNUIgorCisgICAgdGFyZ2V0X3JlbGVhc2U6IHN0cgorICAgICJUQVJHRVRfUkVMRUFTRSIKKworICAgIHRhcmdldF9idWlsZF92YXJpYW50OiBzdHIKKyAgICAiVEFSR0VUX0JVSUxEX1ZBUklBTlQiCisKKyAgICBkZWYgVG9EaWN0KHNlbGYpOgorICAgICAgICByZXR1cm4geworICAgICAgICAgICAgIlRBUkdFVF9QUk9EVUNUIjogc2VsZi50YXJnZXRfcHJvZHVjdCwKKyAgICAgICAgICAgICJUQVJHRVRfUkVMRUFTRSI6IHNlbGYudGFyZ2V0X3JlbGVhc2UsCisgICAgICAgICAgICAiVEFSR0VUX0JVSUxEX1ZBUklBTlQiOiBzZWxmLnRhcmdldF9idWlsZF92YXJpYW50LAorICAgICAgICB9CisKKyAgICBkZWYgQ29tYmluZShzZWxmKToKKyAgICAgICAgcmV0dXJuIGYie3NlbGYudGFyZ2V0X3Byb2R1Y3R9LXtzZWxmLnRhcmdldF9yZWxlYXNlfS17c2VsZi50YXJnZXRfYnVpbGRfdmFyaWFudH0iCisKKworQGRhdGFjbGFzc2VzLmRhdGFjbGFzcyhmcm96ZW49VHJ1ZSkKK2NsYXNzIENoYW5nZToKKyAgICAiQSBjaGFuZ2UgdGhhdCB3ZSBtYWtlIHRvIHRoZSB0cmVlLCBhbmQgaG93IHRvIHVuZG8gaXQiCisgICAgbGFiZWw6IHN0cgorICAgICJTdHJpbmcgdG8gcHJpbnQgaW4gdGhlIGxvZyB3aGVuIHRoZSBjaGFuZ2UgaXMgbWFkZSIKKworICAgIGNoYW5nZTogY2FsbGFibGUKKyAgICAiRnVuY3Rpb24gdG8gY2hhbmdlIHRoZSBzb3VyY2UgdHJlZSIKKworICAgIHVuZG86IGNhbGxhYmxlCisgICAgIkZ1bmN0aW9uIHRvIHJldmVydCB0aGUgc291cmNlIHRyZWUgdG8gaXRzIHByZXZpb3VzIGNvbmRpdGlvbiBpbiB0aGUgbW9zdCBtaW5pbWFsIHdheSBwb3NzaWJsZS4iCisKK19EVU1QVkFSU19WQVJTPVsKKyAgICAiQ09NTU9OX0xVTkNIX0NIT0lDRVMiLAorICAgICJIT1NUX1BSRUJVSUxUX1RBRyIsCisgICAgInByaW50IiwKKyAgICAiUFJPRFVDVF9PVVQiLAorICAgICJyZXBvcnRfY29uZmlnIiwKKyAgICAiVEFSR0VUX0FSQ0giLAorICAgICJUQVJHRVRfQlVJTERfVkFSSUFOVCIsCisgICAgIlRBUkdFVF9ERVZJQ0UiLAorICAgICJUQVJHRVRfUFJPRFVDVCIsCitdCisKK19EVU1QVkFSU19BQlNfVkFSUyA9WworICAgICJBTkRST0lEX0NMQU5HX1BSRUJVSUxUUyIsCisgICAgIkFORFJPSURfSkFWQV9IT01FIiwKKyAgICAiQU5EUk9JRF9KQVZBX1RPT0xDSEFJTiIsCisgICAgIkFORFJPSURfUFJFQlVJTFRTIiwKKyAgICAiSE9TVF9PVVQiLAorICAgICJIT1NUX09VVF9FWEVDVVRBQkxFUyIsCisgICAgIkhPU1RfT1VUX1RFU1RDQVNFUyIsCisgICAgIk9VVF9ESVIiLAorICAgICJwcmludCIsCisgICAgIlBST0RVQ1RfT1VUIiwKKyAgICAiU09PTkdfSE9TVF9PVVQiLAorICAgICJTT09OR19IT1NUX09VVF9FWEVDVVRBQkxFUyIsCisgICAgIlRBUkdFVF9PVVRfVEVTVENBU0VTIiwKK10KKworQGRhdGFjbGFzc2VzLmRhdGFjbGFzcyhmcm96ZW49VHJ1ZSkKK2NsYXNzIEJlbmNobWFyazoKKyAgICAiU29tZXRoaW5nIHdlIG1lYXN1cmUiCisKKyAgICBpZDogc3RyCisgICAgIlNob3J0IElEIGZvciB0aGUgYmVuY2htYXJrLCBmb3IgdGhlIGNvbW1hbmQgbGluZSIKKworICAgIHRpdGxlOiBzdHIKKyAgICAiVGl0bGUgZm9yIHJlcG9ydHMiCisKKyAgICBjaGFuZ2U6IENoYW5nZQorICAgICJTb3VyY2UgdHJlZSBtb2RpZmljYXRpb24gZm9yIHRoZSBiZW5jaG1hcmsgdGhhdCB3aWxsIGJlIG1lYXN1cmVkIgorCisgICAgZHVtcHZhcnM6IE9wdGlvbmFsW2Jvb2xdID0gRmFsc2UKKyAgICAiSWYgc3BlY2lmaWVkLCBzb29uZyB3aWxsIHJ1biBpbiBkdW1wdmFycyBtb2RlIHJhdGhlciB0aGFuIGJ1aWxkLW1vZGUuIgorCisgICAgbW9kdWxlczogT3B0aW9uYWxbbGlzdFtzdHJdXSA9IE5vbmUKKyAgICAiQnVpbGQgbW9kdWxlcyB0byBidWlsZCBvbiBzb29uZyBjb21tYW5kIGxpbmUiCisKKyAgICBwcmVyb2xsOiBPcHRpb25hbFtpbnRdID0gMAorICAgICJOdW1iZXIgb2YgdGltZXMgdG8gcnVuIHRoZSBidWlsZCBjb21tYW5kIHRvIHN0YWJpbGl6ZSIKKworICAgIHBvc3Ryb2xsOiBPcHRpb25hbFtpbnRdID0gMworICAgICJOdW1iZXIgb2YgdGltZXMgdG8gcnVuIHRoZSBidWlsZCBjb21tYW5kIGFmdGVyIHJldmVydGluZyB0aGUgYWN0aW9uIHRvIHN0YWJpbGl6ZSIKKworICAgIGRlZiBidWlsZF9kZXNjcmlwdGlvbihzZWxmKToKKyAgICAgICJTaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgYmVuY2htYXJrJ3MgU29vbmcgaW52b2NhdGlvbi4iCisgICAgICBpZiBzZWxmLmR1bXB2YXJzOgorICAgICAgICByZXR1cm4gImR1bXB2YXJzIgorICAgICAgZWxpZiBzZWxmLm1vZHVsZXM6CisgICAgICAgIHJldHVybiAiICIuam9pbihzZWxmLm1vZHVsZXMpCisgICAgICByZXR1cm4gIiIKKworCisgICAgZGVmIHNvb25nX2NvbW1hbmQoc2VsZiwgcm9vdCk6CisgICAgICAiQ29tbWFuZCBsaW5lIGFyZ3MgdG8gc29vbmdfdWkgZm9yIHRoaXMgYmVuY2htYXJrLiIKKyAgICAgIGlmIHNlbGYuZHVtcHZhcnM6CisgICAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgIi0tZHVtcHZhcnMtbW9kZSIsCisgICAgICAgICAgICAgIGYiLS12YXJzPVwieycgJy5qb2luKF9EVU1QVkFSU19WQVJTKX1cIiIsCisgICAgICAgICAgICAgIGYiLS1hYnMtdmFycz1cInsnICcuam9pbihfRFVNUFZBUlNfQUJTX1ZBUlMpfVwiIiwKKyAgICAgICAgICAgICAgIi0tdmFyLXByZWZpeD12YXJfY2FjaGVfIiwKKyAgICAgICAgICAgICAgIi0tYWJzLXZhci1wcmVmaXg9YWJzX3Zhcl9jYWNoZV8iLAorICAgICAgICAgIF0KKyAgICAgIGVsaWYgc2VsZi5tb2R1bGVzOgorICAgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICItLWJ1aWxkLW1vZGUiLAorICAgICAgICAgICAgICAiLS1hbGwtbW9kdWxlcyIsCisgICAgICAgICAgICAgIGYiLS1kaXI9e3Jvb3R9IiwKKyAgICAgICAgICAgICAgIi0tc2tpcC1tZXRyaWNzLXVwbG9hZCIsCisgICAgICAgICAgXSArIHNlbGYubW9kdWxlcworICAgICAgZWxzZToKKyAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkJlbmNobWFyayBtdXN0IHNwZWNpZnkgZHVtcHZhcnMgb3IgbW9kdWxlcyIpCisKKworQGRhdGFjbGFzc2VzLmRhdGFjbGFzcyhmcm96ZW49VHJ1ZSkKK2NsYXNzIEZpbGVTbmFwc2hvdDoKKyAgICAiU25hcHNob3Qgb2YgYSBmaWxlJ3MgY29udGVudHMuIgorCisgICAgZmlsZW5hbWU6IHN0cgorICAgICJUaGUgZmlsZSB0aGF0IHdhcyBzbmFwc2hvdHRlbmVkIgorCisgICAgY29udGVudHM6IHN0cgorICAgICJUaGUgY29udGVudHMgb2YgdGhlIGZpbGUiCisKKyAgICBkZWYgd3JpdGUoc2VsZik6CisgICAgICAgICJXcml0ZSB0aGUgY29udGVudHMgYmFjayB0byB0aGUgZmlsZSIKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuZmlsZW5hbWUsICJ3IikgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoc2VsZi5jb250ZW50cykKKworCitkZWYgU25hcHNob3QoZmlsZW5hbWUpOgorICAgICIiIlJldHVybiBhIEZpbGVTbmFwc2hvdCB3aXRoIHRoZSBmaWxlJ3MgY3VycmVudCBjb250ZW50cy4iIiIKKyAgICB3aXRoIG9wZW4oZmlsZW5hbWUpIGFzIGY6CisgICAgICAgIGNvbnRlbnRzID0gZi5yZWFkKCkKKyAgICByZXR1cm4gRmlsZVNuYXBzaG90KGZpbGVuYW1lLCBjb250ZW50cykKKworCitkZWYgQ2xlYW4oKToKKyAgICAiIiJSZW1vdmUgdGhlIG91dCBkaXJlY3RvcnkuIiIiCisgICAgZGVmIHJlbW92ZV9vdXQoKToKKyAgICAgICAgb3V0X2RpciA9IHV0aWxzLmdldF9vdXRfZGlyKCkKKyAgICAgICAgI29ubHkgcmVtb3ZlIGFjdHVhbCBjb250ZW50cywgaW4gY2FzZSBvdXQgaXMgYSBzeW1saW5rIChhcyBpcyB0aGUgY2FzZSBmb3IgY29nKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhvdXRfZGlyKToKKyAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gb3MubGlzdGRpcihvdXRfZGlyKToKKyAgICAgICAgICAgICAgcCA9IG9zLnBhdGguam9pbihvdXRfZGlyLCBmaWxlbmFtZSkKKyAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocCkgb3Igb3MucGF0aC5pc2xpbmsocCk6CisgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUocCkKKyAgICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmlzZGlyKHApOgorICAgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShwKQorICAgIHJldHVybiBDaGFuZ2UobGFiZWw9IlJlbW92ZSBvdXQiLCBjaGFuZ2U9cmVtb3ZlX291dCwgdW5kbz1sYW1iZGE6IE5vbmUpCisKKworZGVmIE5vQ2hhbmdlKCk6CisgICAgIiIiTm8gY2hhbmdlIHRvIHRoZSBzb3VyY2UgdHJlZS4iIiIKKyAgICByZXR1cm4gQ2hhbmdlKGxhYmVsPSJObyBjaGFuZ2UiLCBjaGFuZ2U9bGFtYmRhOiBOb25lLCB1bmRvPWxhbWJkYTogTm9uZSkKKworCitkZWYgQ3JlYXRlKGZpbGVuYW1lKToKKyAgICAiQ3JlYXRlIGFuIGFjdGlvbiB0byBjcmVhdGUgYGZpbGVuYW1lYC4gVGhlIHBhcmVudCBkaXJlY3RvcnkgbXVzdCBleGlzdC4iCisgICAgZGVmIGNyZWF0ZSgpOgorICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJ3IikgYXMgZjoKKyAgICAgICAgICAgIHBhc3MKKyAgICBkZWYgZGVsZXRlKCk6CisgICAgICAgIG9zLnJlbW92ZShmaWxlbmFtZSkKKyAgICByZXR1cm4gQ2hhbmdlKAorICAgICAgICAgICAgICAgIGxhYmVsPWYiQ3JlYXRlIHtmaWxlbmFtZX0iLAorICAgICAgICAgICAgICAgIGNoYW5nZT1jcmVhdGUsCisgICAgICAgICAgICAgICAgdW5kbz1kZWxldGUsCisgICAgICAgICAgICApCisKKworZGVmIE1vZGlmeShmaWxlbmFtZSwgY29udGVudHMsIGJlZm9yZT1Ob25lKToKKyAgICAiIiJDcmVhdGUgYW4gYWN0aW9uIHRvIG1vZGlmeSBgZmlsZW5hbWVgIGJ5IGFwcGVuZGluZyB0aGUgcmVzdWx0IG9mIGBjb250ZW50c2AKKyAgICBiZWZvcmUgdGhlIGxhc3QgaW5zdGFuY2VzIG9mIGBiZWZvcmVgIGluIHRoZSBmaWxlLgorCisgICAgUmFpc2VzIGFuIGVycm9yIGlmIGBiZWZvcmVgIGRvZXNuJ3QgYXBwZWFyIGluIHRoZSBmaWxlLgorICAgICIiIgorICAgIG9yaWcgPSBTbmFwc2hvdChmaWxlbmFtZSkKKyAgICBpZiBiZWZvcmU6CisgICAgICAgIGluZGV4ID0gb3JpZy5jb250ZW50cy5yZmluZChiZWZvcmUpCisgICAgICAgIGlmIGluZGV4IDwgMDoKKyAgICAgICAgICAgIHJlcG9ydF9lcnJvcihmIntmaWxlbmFtZX06IFVuYWJsZSB0byBmaW5kIHN0cmluZyAne2JlZm9yZX0nIGZvciBtb2RpZnkgb3BlcmF0aW9uLiIpCisgICAgICAgICAgICByYWlzZSBGYXRhbEVycm9yKCkKKyAgICBlbHNlOgorICAgICAgICBpbmRleCA9IGxlbihvcmlnLmNvbnRlbnRzKQorICAgIG1vZGlmaWVkID0gRmlsZVNuYXBzaG90KGZpbGVuYW1lLCBvcmlnLmNvbnRlbnRzWzppbmRleF0gKyBjb250ZW50cygpICsgb3JpZy5jb250ZW50c1tpbmRleDpdKQorICAgIGlmIEZhbHNlOgorICAgICAgICBwcmludChmIk1vZGlmeToge2ZpbGVuYW1lfSIpCisgICAgICAgIHggPSBvcmlnLmNvbnRlbnRzLnJlcGxhY2UoIlxuIiwgIlxuICAgT1JJRyIpCisgICAgICAgIHByaW50KGYiICAgT1JJRyB7eH0iKQorICAgICAgICB4ID0gbW9kaWZpZWQuY29udGVudHMucmVwbGFjZSgiXG4iLCAiXG4gICBNT0RJRklFRCIpCisgICAgICAgIHByaW50KGYiICAgTU9ESUZJRUQge3h9IikKKworICAgIHJldHVybiBDaGFuZ2UoCisgICAgICAgICAgICBsYWJlbD0iTW9kaWZ5ICIgKyBmaWxlbmFtZSwKKyAgICAgICAgICAgIGNoYW5nZT1sYW1iZGE6IG1vZGlmaWVkLndyaXRlKCksCisgICAgICAgICAgICB1bmRvPWxhbWJkYTogb3JpZy53cml0ZSgpCisgICAgICAgICkKKworZGVmIENoYW5nZVB1YmxpY0FwaSgpOgorICAgIGNoYW5nZSA9IEFkZEphdmFGaWVsZCgiZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmphdmEiLAorICAgICAgICAgICAgICAgICAiQGFuZHJvaWQuYW5ub3RhdGlvbi5TdXBwcmVzc0xpbnQoXCJVbmZsYWdnZWRBcGlcIikgcHVibGljIikKKyAgICBvcmlnX2N1cnJlbnRfdGV4dCA9IFNuYXBzaG90KCJmcmFtZXdvcmtzL2Jhc2UvY29yZS9hcGkvY3VycmVudC50eHQiKQorCisgICAgZGVmIHVuZG8oKToKKyAgICAgICAgY2hhbmdlLnVuZG8oKQorICAgICAgICBvcmlnX2N1cnJlbnRfdGV4dC53cml0ZSgpCisKKyAgICByZXR1cm4gQ2hhbmdlKAorICAgICAgICBsYWJlbD1jaGFuZ2UubGFiZWwsCisgICAgICAgIGNoYW5nZT1jaGFuZ2UuY2hhbmdlLAorICAgICAgICB1bmRvPWxhbWJkYTogdW5kbygpCisgICAgKQorCitkZWYgQWRkSmF2YUZpZWxkKGZpbGVuYW1lLCBwcmVmaXgpOgorICAgIHJldHVybiBNb2RpZnkoZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICBsYW1iZGE6IGYie3ByZWZpeH0gc3RhdGljIGZpbmFsIGludCBCRU5DSE1BUksgPSB7cmFuZG9tLnJhbmRpbnQoMCwgMTAwMDAwMCl9O1xuIiwKKyAgICAgICAgICAgICAgICAgIGJlZm9yZT0ifSIpCisKKworZGVmIENvbW1lbnQocHJlZml4LCBzdWZmaXg9IiIpOgorICAgIHJldHVybiBsYW1iZGE6IHByZWZpeCArICIgIiArIHN0cih1dWlkLnV1aWQ0KCkpICsgc3VmZml4CisKKworY2xhc3MgQmVuY2htYXJrUmVwb3J0KCk6CisgICAgIkluZm9ybWF0aW9uIGFib3V0IGEgcnVuIG9mIHRoZSBiZW5jaG1hcmsiCisKKyAgICBsdW5jaDogTHVuY2gKKyAgICAibHVuY2ggY29tYm8iCisKKyAgICBiZW5jaG1hcms6IEJlbmNobWFyaworICAgICJUaGUgYmVuY2htYXJrIG9iamVjdC4iCisKKyAgICBpdGVyYXRpb246IGludAorICAgICJXaGljaCBpdGVyYXRpb24gb2YgdGhlIGJlbmNobWFyayIKKworICAgIGxvZ19kaXI6IHN0cgorICAgICJQYXRoIHRoZSB0aGUgbG9nIGRpcmVjdG9yeSwgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHJlcG9ydHMgZGlyZWN0b3J5IgorCisgICAgcHJlcm9sbF9kdXJhdGlvbl9uczogW2ludF0KKyAgICAiRHVyYXRpb25zIG9mIHRoZSBpbiBuYW5vc2Vjb25kcy4iCisKKyAgICBkdXJhdGlvbl9uczogaW50CisgICAgIkR1cmF0aW9uIG9mIHRoZSBtZWFzdXJlZCBwb3J0aW9uIG9mIHRoZSBiZW5jaG1hcmsgaW4gbmFub3NlY29uZHMuIgorCisgICAgcG9zdHJvbGxfZHVyYXRpb25fbnM6IFtpbnRdCisgICAgIkR1cmF0aW9ucyBvZiB0aGUgcG9zdHJvbGxzIGluIG5hbm9zZWNvbmRzLiIKKworICAgIGNvbXBsZXRlOiBib29sCisgICAgIldoZXRoZXIgdGhlIGJlbmNobWFyayBtYWRlIGl0IGFsbCB0aGUgd2F5IHRocm91Z2ggdGhlIHBvc3Ryb2xscy4iCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbHVuY2gsIGJlbmNobWFyaywgaXRlcmF0aW9uLCBsb2dfZGlyKToKKyAgICAgICAgc2VsZi5sdW5jaCA9IGx1bmNoCisgICAgICAgIHNlbGYuYmVuY2htYXJrID0gYmVuY2htYXJrCisgICAgICAgIHNlbGYuaXRlcmF0aW9uID0gaXRlcmF0aW9uCisgICAgICAgIHNlbGYubG9nX2RpciA9IGxvZ19kaXIKKyAgICAgICAgc2VsZi5wcmVyb2xsX2R1cmF0aW9uX25zID0gW10KKyAgICAgICAgc2VsZi5kdXJhdGlvbl9ucyA9IC0xCisgICAgICAgIHNlbGYucG9zdHJvbGxfZHVyYXRpb25fbnMgPSBbXQorICAgICAgICBzZWxmLmNvbXBsZXRlID0gRmFsc2UKKworICAgIGRlZiBUb0RpY3Qoc2VsZik6CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAibHVuY2giOiBzZWxmLmx1bmNoLlRvRGljdCgpLAorICAgICAgICAgICAgImlkIjogc2VsZi5iZW5jaG1hcmsuaWQsCisgICAgICAgICAgICAidGl0bGUiOiBzZWxmLmJlbmNobWFyay50aXRsZSwKKyAgICAgICAgICAgICJtb2R1bGVzIjogc2VsZi5iZW5jaG1hcmsubW9kdWxlcywKKyAgICAgICAgICAgICJkdW1wdmFycyI6IHNlbGYuYmVuY2htYXJrLmR1bXB2YXJzLAorICAgICAgICAgICAgImNoYW5nZSI6IHNlbGYuYmVuY2htYXJrLmNoYW5nZS5sYWJlbCwKKyAgICAgICAgICAgICJpdGVyYXRpb24iOiBzZWxmLml0ZXJhdGlvbiwKKyAgICAgICAgICAgICJsb2dfZGlyIjogc2VsZi5sb2dfZGlyLAorICAgICAgICAgICAgInByZXJvbGxfZHVyYXRpb25fbnMiOiBzZWxmLnByZXJvbGxfZHVyYXRpb25fbnMsCisgICAgICAgICAgICAiZHVyYXRpb25fbnMiOiBzZWxmLmR1cmF0aW9uX25zLAorICAgICAgICAgICAgInBvc3Ryb2xsX2R1cmF0aW9uX25zIjogc2VsZi5wb3N0cm9sbF9kdXJhdGlvbl9ucywKKyAgICAgICAgICAgICJjb21wbGV0ZSI6IHNlbGYuY29tcGxldGUsCisgICAgICAgIH0KKworY2xhc3MgUnVubmVyKCk6CisgICAgIiIiUnVucyB0aGUgYmVuY2htYXJrcy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvcHRpb25zKToKKyAgICAgICAgc2VsZi5fb3B0aW9ucyA9IG9wdGlvbnMKKyAgICAgICAgc2VsZi5fcmVwb3J0cyA9IFtdCisgICAgICAgIHNlbGYuX2NvbXBsZXRlID0gRmFsc2UKKworICAgIGRlZiBSdW4oc2VsZik6CisgICAgICAgICIiIlJ1biBhbGwgb2YgdGhlIHVzZXItc2VsZWN0ZWQgYmVuY2htYXJrcy4iIiIKKyAgICAgICAgIyBDbGVhbiBvdXQgdGhlIGxvZyBkaXIgb3IgY3JlYXRlIGl0IGlmIG5lY2Vzc2FyeQorICAgICAgICBwcmVwYXJlX2xvZ19kaXIoc2VsZi5fb3B0aW9ucy5Mb2dEaXIoKSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgbHVuY2ggaW4gc2VsZi5fb3B0aW9ucy5MdW5jaGVzKCk6CisgICAgICAgICAgICAgICAgcHJpbnQobHVuY2gpCisgICAgICAgICAgICAgICAgZm9yIGJlbmNobWFyayBpbiBzZWxmLl9vcHRpb25zLkJlbmNobWFya3MoKToKKyAgICAgICAgICAgICAgICAgICAgZm9yIGl0ZXJhdGlvbiBpbiByYW5nZShzZWxmLl9vcHRpb25zLkl0ZXJhdGlvbnMoKSk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9ydW5fYmVuY2htYXJrKGx1bmNoLCBiZW5jaG1hcmssIGl0ZXJhdGlvbikKKyAgICAgICAgICAgIHNlbGYuX2NvbXBsZXRlID0gVHJ1ZQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fd3JpdGVfc3VtbWFyeSgpCisKKworICAgIGRlZiBfcnVuX2JlbmNobWFyayhzZWxmLCBsdW5jaCwgYmVuY2htYXJrLCBpdGVyYXRpb24pOgorICAgICAgICAiIiJSdW4gYSBzaW5nbGUgYmVuY2htYXJrLiIiIgorICAgICAgICBiZW5jaG1hcmtfbG9nX3N1YmRpciA9IHNlbGYuX2JlbmNobWFya19sb2dfZGlyKGx1bmNoLCBiZW5jaG1hcmssIGl0ZXJhdGlvbikKKyAgICAgICAgYmVuY2htYXJrX2xvZ19kaXIgPSBzZWxmLl9vcHRpb25zLkxvZ0RpcigpLmpvaW5wYXRoKGJlbmNobWFya19sb2dfc3ViZGlyKQorCisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoZiJTVEFSVElORyBCRU5DSE1BUks6IHtiZW5jaG1hcmsuaWR9XG4iKQorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKGYiICAgICAgICAgICAgIGx1bmNoOiB7bHVuY2guQ29tYmluZSgpfVxuIikKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZShmIiAgICAgICAgIGl0ZXJhdGlvbjoge2l0ZXJhdGlvbn1cbiIpCisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoZiIgYmVuY2htYXJrX2xvZ19kaXI6IHtiZW5jaG1hcmtfbG9nX2Rpcn1cbiIpCisKKyAgICAgICAgcmVwb3J0ID0gQmVuY2htYXJrUmVwb3J0KGx1bmNoLCBiZW5jaG1hcmssIGl0ZXJhdGlvbiwgYmVuY2htYXJrX2xvZ19zdWJkaXIpCisgICAgICAgIHNlbGYuX3JlcG9ydHMuYXBwZW5kKHJlcG9ydCkKKworICAgICAgICAjIFByZXJvbGwgYnVpbGRzCisgICAgICAgIGZvciBpIGluIHJhbmdlKGJlbmNobWFyay5wcmVyb2xsKToKKyAgICAgICAgICAgIG5zID0gc2VsZi5fcnVuX2J1aWxkKGx1bmNoLCBiZW5jaG1hcmtfbG9nX2Rpci5qb2lucGF0aChmInByZV97aX0iKSwgYmVuY2htYXJrKQorICAgICAgICAgICAgcmVwb3J0LnByZXJvbGxfZHVyYXRpb25fbnMuYXBwZW5kKG5zKQorCisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoZiJQRVJGT1JNSU5HIENIQU5HRToge2JlbmNobWFyay5jaGFuZ2UubGFiZWx9XG4iKQorICAgICAgICBpZiBub3Qgc2VsZi5fb3B0aW9ucy5EcnlSdW4oKToKKyAgICAgICAgICAgIGJlbmNobWFyay5jaGFuZ2UuY2hhbmdlKCkKKyAgICAgICAgdHJ5OgorCisgICAgICAgICAgICAjIE1lYXN1cmVkIGJ1aWxkCisgICAgICAgICAgICBucyA9IHNlbGYuX3J1bl9idWlsZChsdW5jaCwgYmVuY2htYXJrX2xvZ19kaXIuam9pbnBhdGgoIm1lYXN1cmVkIiksIGJlbmNobWFyaykKKyAgICAgICAgICAgIHJlcG9ydC5kdXJhdGlvbl9ucyA9IG5zCisKKyAgICAgICAgICAgIGRpc3Rfb25lID0gc2VsZi5fb3B0aW9ucy5EaXN0T25lKCkKKyAgICAgICAgICAgIGlmIGRpc3Rfb25lOgorICAgICAgICAgICAgICAgICMgSWYgd2UncmUgZGlzdGluZyBqdXN0IG9uZSBiZW5jaG1hcmssIHNhdmUgdGhlIGxvZ3MgYW5kIHdlIGNhbiBzdG9wIGhlcmUuCisgICAgICAgICAgICAgICAgc2VsZi5fZGlzdCh1dGlscy5nZXRfZGlzdF9kaXIoKSwgYmVuY2htYXJrLmR1bXB2YXJzKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9kaXN0KGJlbmNobWFya19sb2dfZGlyLCBiZW5jaG1hcmsuZHVtcHZhcnMsIHN0b3JlX21ldHJpY3Nfb25seT1UcnVlKQorICAgICAgICAgICAgICAgICMgUG9zdHJvbGwgYnVpbGRzCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoYmVuY2htYXJrLnBvc3Ryb2xsKToKKyAgICAgICAgICAgICAgICAgICAgbnMgPSBzZWxmLl9ydW5fYnVpbGQobHVuY2gsIGJlbmNobWFya19sb2dfZGlyLmpvaW5wYXRoKGYicG9zdF97aX0iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVuY2htYXJrKQorICAgICAgICAgICAgICAgICAgICByZXBvcnQucG9zdHJvbGxfZHVyYXRpb25fbnMuYXBwZW5kKG5zKQorCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAjIEFsd2F5cyB1bmRvLCBldmVuIGlmIHdlIGNyYXNoZWQgb3IgdGhlIGJ1aWxkIGZhaWxlZCBhbmQgd2Ugc3RvcHBlZC4KKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoZiJVTkRPSU5HIENIQU5HRToge2JlbmNobWFyay5jaGFuZ2UubGFiZWx9XG4iKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuX29wdGlvbnMuRHJ5UnVuKCk6CisgICAgICAgICAgICAgICAgYmVuY2htYXJrLmNoYW5nZS51bmRvKCkKKworICAgICAgICBzZWxmLl93cml0ZV9zdW1tYXJ5KCkKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZShmIkZJTklTSEVEIEJFTkNITUFSSzoge2JlbmNobWFyay5pZH1cbiIpCisKKyAgICBkZWYgX2JlbmNobWFya19sb2dfZGlyKHNlbGYsIGx1bmNoLCBiZW5jaG1hcmssIGl0ZXJhdGlvbik6CisgICAgICAgICIiIkNvbnN0cnVjdCB0aGUgbG9nIGRpcmVjdG9yeSBmaXIgYSBiZW5jaG1hcmsgcnVuLiIiIgorICAgICAgICBwYXRoID0gZiJ7bHVuY2guQ29tYmluZSgpfS97YmVuY2htYXJrLmlkfSIKKyAgICAgICAgIyBaZXJvIHBhZCB0byB0aGUgY29ycmVjdCBsZW5ndGggZm9yIGNvcnJlY3QgYWxwaGEgc29ydGluZworICAgICAgICBwYXRoICs9ICgiLyUwIiArIHN0cihsZW4oc3RyKHNlbGYuX29wdGlvbnMuSXRlcmF0aW9ucygpKSkpICsgImQiKSAlIGl0ZXJhdGlvbgorICAgICAgICByZXR1cm4gcGF0aAorCisgICAgZGVmIF9ydW5fYnVpbGQoc2VsZiwgbHVuY2gsIGJ1aWxkX2xvZ19kaXIsIGJlbmNobWFyayk6CisgICAgICAgICIiIkJ1aWxkcyB0aGUgbW9kdWxlcy4gIFNhdmVzIGludGVyZXN0aW5nIGxvZyBmaWxlcyB0byBsb2dfZGlyLiAgUmFpc2VzIEZhdGFsRXJyb3IKKyAgICAgICAgaWYgdGhlIGJ1aWxkIGZhaWxzLgorICAgICAgICAiIiIKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZShmIlNUQVJUSU5HIEJVSUxEIHtiZW5jaG1hcmsuYnVpbGRfZGVzY3JpcHRpb24oKX1cbiIpCisKKyAgICAgICAgYmVmb3JlX25zID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQorICAgICAgICBpZiBub3Qgc2VsZi5fb3B0aW9ucy5EcnlSdW4oKToKKyAgICAgICAgICAgIGNtZCA9IFsKKyAgICAgICAgICAgICAgICAiYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCIsCisgICAgICAgICAgICBdICsgYmVuY2htYXJrLnNvb25nX2NvbW1hbmQoc2VsZi5fb3B0aW9ucy5yb290KQorICAgICAgICAgICAgZW52ID0gZGljdChvcy5lbnZpcm9uKQorICAgICAgICAgICAgZW52WyJUQVJHRVRfUFJPRFVDVCJdID0gbHVuY2gudGFyZ2V0X3Byb2R1Y3QKKyAgICAgICAgICAgIGVudlsiVEFSR0VUX1JFTEVBU0UiXSA9IGx1bmNoLnRhcmdldF9yZWxlYXNlCisgICAgICAgICAgICBlbnZbIlRBUkdFVF9CVUlMRF9WQVJJQU5UIl0gPSBsdW5jaC50YXJnZXRfYnVpbGRfdmFyaWFudAorICAgICAgICAgICAgcmV0dXJuY29kZSA9IHN1YnByb2Nlc3MuY2FsbChjbWQsIGVudj1lbnYpCisgICAgICAgICAgICBpZiByZXR1cm5jb2RlICE9IDA6CisgICAgICAgICAgICAgICAgcmVwb3J0X2Vycm9yKGYiQnVpbGQgZmFpbGVkOiB7JyAnLmpvaW4oY21kKX0iKQorICAgICAgICAgICAgICAgIHJhaXNlIEZhdGFsRXJyb3IoKQorCisgICAgICAgIGFmdGVyX25zID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQorCisgICAgICAgICMgVE9ETzogQ29weSBzb21lIGxvZyBmaWxlcy4KKworICAgICAgICBzeXMuc3RkZXJyLndyaXRlKGYiRklOSVNIRUQgQlVJTEQge2JlbmNobWFyay5idWlsZF9kZXNjcmlwdGlvbigpfVxuIikKKworICAgICAgICByZXR1cm4gYWZ0ZXJfbnMgLSBiZWZvcmVfbnMKKworICAgIGRlZiBfZGlzdChzZWxmLCBkaXN0X2RpciwgZHVtcHZhcnMsIHN0b3JlX21ldHJpY3Nfb25seT1GYWxzZSk6CisgICAgICAgIG91dF9kaXIgPSB1dGlscy5nZXRfb3V0X2RpcigpCisgICAgICAgIGRlc3RfZGlyID0gZGlzdF9kaXIuam9pbnBhdGgoImxvZ3MiKQorICAgICAgICBvcy5tYWtlZGlycyhkZXN0X2RpciwgZXhpc3Rfb2s9VHJ1ZSkKKyAgICAgICAgYmFzZW5hbWVzID0gWworICAgICAgICAgICAgInNvb25nX2J1aWxkX21ldHJpY3MucGIiLAorICAgICAgICAgICAgInNvb25nX21ldHJpY3MiLAorICAgICAgICBdCisgICAgICAgIGlmIG5vdCBzdG9yZV9tZXRyaWNzX29ubHk6CisgICAgICAgICAgICBiYXNlbmFtZXMuZXh0ZW5kKFsKKyAgICAgICAgICAgICAgICAiYnVpbGQudHJhY2UuZ3oiLAorICAgICAgICAgICAgICAgICJzb29uZy5sb2ciLAorICAgICAgICAgICAgXSkKKyAgICAgICAgaWYgZHVtcHZhcnM6CisgICAgICAgICAgICBiYXNlbmFtZXMgPSBbJ2R1bXB2YXJzLScrYiBmb3IgYiBpbiBiYXNlbmFtZXNdCisgICAgICAgIGZvciBiYXNlIGluIGJhc2VuYW1lczoKKyAgICAgICAgICAgIHNyYyA9IG91dF9kaXIuam9pbnBhdGgoYmFzZSkKKyAgICAgICAgICAgIGlmIHNyYy5leGlzdHMoKToKKyAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKGYiRElTVDogY29waWVkIHtzcmN9IHRvIHtkZXN0X2Rpcn1cbiIpCisgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHkoc3JjLCBkZXN0X2RpcikKKworICAgIGRlZiBfd3JpdGVfc3VtbWFyeShzZWxmKToKKyAgICAgICAgIyBXcml0ZSB0aGUgcmVzdWx0cywgZXZlbiBpZiB0aGUgYnVpbGQgZmFpbGVkIG9yIHdlIGNyYXNoZWQsIGluY2x1ZGluZworICAgICAgICAjIHdoZXRoZXIgd2UgZmluaXNoZWQgYWxsIG9mIHRoZSBiZW5jaG1hcmtzLgorICAgICAgICBkYXRhID0geworICAgICAgICAgICAgInN0YXJ0X3RpbWUiOiBzZWxmLl9vcHRpb25zLlRpbWVzdGFtcCgpLmlzb2Zvcm1hdCgpLAorICAgICAgICAgICAgImJyYW5jaCI6IHNlbGYuX29wdGlvbnMuQnJhbmNoKCksCisgICAgICAgICAgICAidGFnIjogc2VsZi5fb3B0aW9ucy5UYWcoKSwKKyAgICAgICAgICAgICJiZW5jaG1hcmtzIjogW3JlcG9ydC5Ub0RpY3QoKSBmb3IgcmVwb3J0IGluIHNlbGYuX3JlcG9ydHNdLAorICAgICAgICAgICAgImNvbXBsZXRlIjogc2VsZi5fY29tcGxldGUsCisgICAgICAgIH0KKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuX29wdGlvbnMuTG9nRGlyKCkuam9pbnBhdGgoInN1bW1hcnkuanNvbiIpLCAidyIsIGVuY29kaW5nPSJ1dGYtOCIpIGFzIGY6CisgICAgICAgICAgICBqc29uLmR1bXAoZGF0YSwgZiwgaW5kZW50PTIsIHNvcnRfa2V5cz1UcnVlKQorCisKK2RlZiBiZW5jaG1hcmtfdGFibGUoYmVuY2htYXJrcyk6CisgICAgcm93cyA9IFsoIklEIiwgIkRFU0NSSVBUSU9OIiwgIlJFQlVJTEQiKSxdCisgICAgcm93cyArPSBbKGJlbmNobWFyay5pZCwgYmVuY2htYXJrLnRpdGxlLCBiZW5jaG1hcmsuYnVpbGRfZGVzY3JpcHRpb24oKSkgZm9yIGJlbmNobWFyayBpbgorICAgICAgICAgICAgIGJlbmNobWFya3NdCisgICAgcmV0dXJuIHJvd3MKKworCitkZWYgcHJlcGFyZV9sb2dfZGlyKGRpcmVjdG9yeSk6CisgICAgaWYgb3MucGF0aC5leGlzdHMoZGlyZWN0b3J5KToKKyAgICAgICAgIyBJZiBpdCBleGlzdHMgYW5kIGlzbid0IGEgZGlyZWN0b3J5LCBmYWlsLgorICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihkaXJlY3RvcnkpOgorICAgICAgICAgICAgcmVwb3J0X2Vycm9yKGYiTG9nIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyBidXQgaXNuJ3QgYSBkaXJlY3Rvcnk6IHtkaXJlY3Rvcnl9IikKKyAgICAgICAgICAgIHJhaXNlIEZhdGFsRXJyb3IoKQorICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGlzIGVtcHR5LiBEbyB0aGlzIHJhdGhlciB0aGFuIGRlbGV0aW5nIGl0IHRvIGhhbmRsZQorICAgICAgICAjIHN5bWxpbmtzIGNsZWFubHkuCisgICAgICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGRpcmVjdG9yeSk6CisgICAgICAgICAgICBlbnRyeSA9IG9zLnBhdGguam9pbihkaXJlY3RvcnksIGZpbGVuYW1lKQorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihlbnRyeSk6CisgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShlbnRyeSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKGVudHJ5KQorICAgIGVsc2U6CisgICAgICAgICMgQ3JlYXRlIGl0CisgICAgICAgIG9zLm1ha2VkaXJzKGRpcmVjdG9yeSkKKworCitjbGFzcyBPcHRpb25zKCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9oYWRfZXJyb3IgPSBGYWxzZQorCisgICAgICAgICMgV2FsbCB0aW1lIGNsb2NrIHdoZW4gd2Ugc3RhcnRlZAorICAgICAgICBzZWxmLl90aW1lc3RhbXAgPSBkYXRldGltZS5kYXRldGltZS5ub3coZGF0ZXRpbWUudGltZXpvbmUudXRjKQorCisgICAgICAgICMgTW92ZSB0byB0aGUgcm9vdCBvZiB0aGUgdHJlZSByaWdodCBhd2F5LiBFdmVyeXRoaW5nIG11c3QgaGFwcGVuIGZyb20gdGhlcmUuCisgICAgICAgIHNlbGYucm9vdCA9IHV0aWxzLmdldF9yb290KCkKKyAgICAgICAgaWYgbm90IHNlbGYucm9vdDoKKyAgICAgICAgICAgIHJlcG9ydF9lcnJvcigiVW5hYmxlIHRvIGZpbmQgcm9vdCBvZiB0cmVlIGZyb20gY3dkLiIpCisgICAgICAgICAgICByYWlzZSBGYXRhbEVycm9yKCkKKyAgICAgICAgb3MuY2hkaXIoc2VsZi5yb290KQorCisgICAgICAgICMgSW5pdGlhbGl6ZSB0aGUgQmVuY2htYXJrcy4gTm90ZSB0aGF0IHRoaXMgcHJlLWxvYWRzIGFsbCBvZiB0aGUgZmlsZXMsIGV0Yy4KKyAgICAgICAgIyBEb2luZyBhbGwgdGhhdCBoZXJlIGZvcmNlcyB1cyB0byBmYWlsIGZhc3QgaWYgb25lIG9mIHRoZW0gY2FuJ3QgbG9hZCBhIHJlcXVpcmVkCisgICAgICAgICMgZmlsZSwgYXQgdGhlIGNvc3Qgb2YgYSBzbWFsbCBzdGFydHVwIHNwZWVkLiBEb24ndCBtYWtlIHRoaXMgZG8gc29tZXRoaW5nIHNsb3cKKyAgICAgICAgIyBsaWtlIHNjYW4gdGhlIHdob2xlIHRyZWUuCisgICAgICAgIHNlbGYuX2luaXRfYmVuY2htYXJrcygpCisKKyAgICAgICAgIyBBcmd1bWVudCBwYXJzaW5nCisgICAgICAgIGVwaWxvZyA9IGYiIiIKK2JlbmNobWFya3M6Cit7cHJldHR5LkZvcm1hdFRhYmxlKGJlbmNobWFya190YWJsZShzZWxmLl9iZW5jaG1hcmtzKSwgcHJlZml4PSIgICIpfQorIiIiCisKKyAgICAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoCisgICAgICAgICAgICAgICAgcHJvZz0iYmVuY2htYXJrcyIsCisgICAgICAgICAgICAgICAgYWxsb3dfYWJicmV2PUZhbHNlLCAjIERvbid0IGxldCBwZW9wbGUgd3JpdGUgdW5zdXBwb3J0YWJsZSBzY3JpcHRzLgorICAgICAgICAgICAgICAgIGZvcm1hdHRlcl9jbGFzcz1hcmdwYXJzZS5SYXdEZXNjcmlwdGlvbkhlbHBGb3JtYXR0ZXIsCisgICAgICAgICAgICAgICAgZXBpbG9nPWVwaWxvZywKKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUnVuIGJ1aWxkIHN5c3RlbSBwZXJmb3JtYW5jZSBiZW5jaG1hcmtzLiIpCisgICAgICAgIHNlbGYucGFyc2VyID0gcGFyc2VyCisKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1sb2ctZGlyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJEaXJlY3RvcnkgZm9yIGxvZ3MuIERlZmF1bHQgaXMgJFRPUC8uLi9iZW5jaG1hcmtzLy4iKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWRhdGVkLWxvZ3MiLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkFwcGVuZCB0aW1lc3RhbXAgdG8gbG9nIGRpci4iKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItbiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9ImRyeV9ydW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkRyeSBydW4uIERvbid0IHJ1biB0aGUgYnVpbGQgY29tbWFuZHMgYnV0IGRvIGV2ZXJ5dGhpbmcgZWxzZS4iKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLXRhZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iVmFyaWFudCBvZiB0aGUgcnVuLCBmb3Igd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgcGVyZiBydW5zLiIpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tbHVuY2giLCBuYXJncz0iKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iTHVuY2ggY29tYm9zIHRvIHRlc3QiKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWl0ZXJhdGlvbnMiLCB0eXBlPWludCwgZGVmYXVsdD0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Ik51bWJlciBvZiBpdGVyYXRpb25zIG9mIGVhY2ggdGVzdCB0byBydW4uIikKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1icmFuY2giLCB0eXBlPXN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJTcGVjaWZ5IGJyYW5jaC4gT3RoZXJ3aXNlIGEgZ3Vlc3Mgd2lsbCBiZSBtYWRlIGJhc2VkIG9uIHJlcG8uIikKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1iZW5jaG1hcmsiLCBuYXJncz0iKiIsIGRlZmF1bHQ9W2IuaWQgZm9yIGIgaW4gc2VsZi5fYmVuY2htYXJrc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YXZhcj0iQkVOQ0hNQVJLUyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iQmVuY2htYXJrcyB0byBydW4uICBEZWZhdWx0IHN1aXRlIHdpbGwgYmUgcnVuIGlmIG9taXR0ZWQuIikKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1kaXN0LW9uZSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iQ29weSBsb2dzIGFuZCBtZXRyaWNzIHRvIHRoZSBnaXZlbiBkaXN0IGRpci4gUmVxdWlyZXMgdGhhdCBvbmx5IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgb25lIGJlbmNobWFyayBiZSBzdXBwbGllZC4gUG9zdHJvbGwgc3RlcHMgd2lsbCBiZSBza2lwcGVkLiIpCisKKyAgICAgICAgc2VsZi5fYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworICAgICAgICBzZWxmLl9icmFuY2ggPSBzZWxmLl9icmFuY2goKQorICAgICAgICBzZWxmLl9sb2dfZGlyID0gc2VsZi5fbG9nX2RpcigpCisgICAgICAgIHNlbGYuX2x1bmNoZXMgPSBzZWxmLl9sdW5jaGVzKCkKKworICAgICAgICAjIFZhbGlkYXRlIHRoZSBiZW5jaG1hcmsgaWRzCisgICAgICAgIGFsbF9pZHMgPSBbYmVuY2htYXJrLmlkIGZvciBiZW5jaG1hcmsgaW4gc2VsZi5fYmVuY2htYXJrc10KKyAgICAgICAgYmFkX2lkcyA9IFtpZCBmb3IgaWQgaW4gc2VsZi5fYXJncy5iZW5jaG1hcmsgaWYgaWQgbm90IGluIGFsbF9pZHNdCisgICAgICAgIGlmIGJhZF9pZHM6CisgICAgICAgICAgICBmb3IgaWQgaW4gYmFkX2lkczoKKyAgICAgICAgICAgICAgICBzZWxmLl9lcnJvcihmIkludmFsaWQgYmVuY2htYXJrOiB7aWR9IikKKworICAgICAgICAjIC0tZGlzdC1vbmUgcmVxdWlyZXMgdGhhdCBvbmx5IG9uZSBiZW5jaG1hcmsgYmUgc3VwcGxpZWQKKyAgICAgICAgaWYgc2VsZi5fYXJncy5kaXN0X29uZSBhbmQgbGVuKHNlbGYuQmVuY2htYXJrcygpKSAhPSAxOgorICAgICAgICAgICAgc2VsZi5fZXJyb3IoIi0tZGlzdC1vbmUgcmVxdWlyZXMgdGhhdCBleGFjdGx5IG9uZSAtLWJlbmNobWFyay4iKQorCisgICAgICAgIGlmIHNlbGYuX2hhZF9lcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIEZhdGFsRXJyb3IoKQorCisgICAgZGVmIFRpbWVzdGFtcChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3RpbWVzdGFtcAorCisgICAgZGVmIF9icmFuY2goc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgYnJhbmNoLCBlaXRoZXIgZnJvbSB0aGUgY29tbWFuZCBsaW5lIG9yIGJ5IGd1ZXNzaW5nIGZyb20gcmVwby4iIiIKKyAgICAgICAgaWYgc2VsZi5fYXJncy5icmFuY2g6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fYXJncy5icmFuY2gKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYnJhbmNoID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoZiJjZCB7c2VsZi5yb290fS8ucmVwby9tYW5pZmVzdHMiCisgICAgICAgICAgICAgICAgICAgICAgICArICIgJiYgZ2l0IHJldi1wYXJzZSAtLWFiYnJldi1yZWYgLS1zeW1ib2xpYy1mdWxsLW5hbWUgQHt1fSIsCisgICAgICAgICAgICAgICAgICAgIHNoZWxsPVRydWUsIGVuY29kaW5nPSJ1dGYtOCIpCisgICAgICAgICAgICByZXR1cm4gYnJhbmNoLnN0cmlwKCkuc3BsaXQoIi8iKVstMV0KKyAgICAgICAgZXhjZXB0IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yIGFzIGV4OgorICAgICAgICAgICAgcmVwb3J0X2Vycm9yKCJDYW4ndCBnZXQgYnJhbmNoIGZyb20gLnJlcG8gZGlyLiBTcGVjaWZ5IC0tYnJhbmNoIGFyZ3VtZW50IikKKyAgICAgICAgICAgIHJlcG9ydF9lcnJvcihzdHIoZXgpKQorICAgICAgICAgICAgcmFpc2UgRmF0YWxFcnJvcigpCisKKyAgICBkZWYgQnJhbmNoKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fYnJhbmNoCisKKyAgICBkZWYgX2xvZ19kaXIoc2VsZik6CisgICAgICAgICJUaGUgbG9nIGRpcmVjdG9yeSB0byB1c2UsIGJhc2VkIG9uIHRoZSBjdXJyZW50IG9wdGlvbnMiCisgICAgICAgIGlmIHNlbGYuX2FyZ3MubG9nX2RpcjoKKyAgICAgICAgICAgIGQgPSBwYXRobGliLlBhdGgoc2VsZi5fYXJncy5sb2dfZGlyKS5yZXNvbHZlKCkuYWJzb2x1dGUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZCA9IHNlbGYucm9vdC5qb2lucGF0aCgiLi4iLCB1dGlscy5ERUZBVUxUX1JFUE9SVF9ESVIpCisgICAgICAgIGlmIHNlbGYuX2FyZ3MuZGF0ZWRfbG9nczoKKyAgICAgICAgICAgIGQgPSBkLmpvaW5wYXRoKHNlbGYuX3RpbWVzdGFtcC5zdHJmdGltZSgnJVktJW0tJWQnKSkKKyAgICAgICAgZCA9IGQuam9pbnBhdGgoc2VsZi5fYnJhbmNoKQorICAgICAgICBpZiBzZWxmLl9hcmdzLnRhZzoKKyAgICAgICAgICAgIGQgPSBkLmpvaW5wYXRoKHNlbGYuX2FyZ3MudGFnKQorICAgICAgICByZXR1cm4gZC5yZXNvbHZlKCkuYWJzb2x1dGUoKQorCisgICAgZGVmIExvZ0RpcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xvZ19kaXIKKworICAgIGRlZiBCZW5jaG1hcmtzKHNlbGYpOgorICAgICAgICByZXR1cm4gW2IgZm9yIGIgaW4gc2VsZi5fYmVuY2htYXJrcyBpZiBiLmlkIGluIHNlbGYuX2FyZ3MuYmVuY2htYXJrXQorCisgICAgZGVmIFRhZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2FyZ3MudGFnCisKKyAgICBkZWYgRHJ5UnVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fYXJncy5kcnlfcnVuCisKKyAgICBkZWYgX2x1bmNoZXMoc2VsZik6CisgICAgICAgIGRlZiBwYXJzZV9sdW5jaChsdW5jaCk6CisgICAgICAgICAgICBwYXJ0cyA9IGx1bmNoLnNwbGl0KCItIikKKyAgICAgICAgICAgIGlmIGxlbihwYXJ0cykgIT0gMzoKKyAgICAgICAgICAgICAgICByYWlzZSBPcHRpb25zRXJyb3IoZiJJbnZhbGlkIGx1bmNoIGNvbWJvOiB7bHVuY2h9IikKKyAgICAgICAgICAgIHJldHVybiBMdW5jaChwYXJ0c1swXSwgcGFydHNbMV0sIHBhcnRzWzJdKQorICAgICAgICAjIElmIHRoZXkgZ2F2ZSBsdW5jaCB0YXJnZXRzIG9uIHRoZSBjb21tYW5kIGxpbmUgdXNlIHRoYXQKKyAgICAgICAgaWYgc2VsZi5fYXJncy5sdW5jaDoKKyAgICAgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgICAgICAjIFNwbGl0IGludG8gTHVuY2ggb2JqZWN0cworICAgICAgICAgICAgZm9yIGx1bmNoIGluIHNlbGYuX2FyZ3MubHVuY2g6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHBhcnNlX2x1bmNoKGx1bmNoKSkKKyAgICAgICAgICAgICAgICBleGNlcHQgT3B0aW9uc0Vycm9yIGFzIGV4OgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9lcnJvcihleC5tZXNzYWdlKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICAjIFVzZSB3aGF0cyBpbiB0aGUgZW52aXJvbm1lbnQKKyAgICAgICAgcHJvZHVjdCA9IG9zLmdldGVudigiVEFSR0VUX1BST0RVQ1QiKQorICAgICAgICByZWxlYXNlID0gb3MuZ2V0ZW52KCJUQVJHRVRfUkVMRUFTRSIpCisgICAgICAgIHZhcmlhbnQgPSBvcy5nZXRlbnYoIlRBUkdFVF9CVUlMRF9WQVJJQU5UIikKKyAgICAgICAgaWYgKG5vdCBwcm9kdWN0KSBvciAobm90IHJlbGVhc2UpIG9yIChub3QgdmFyaWFudCk6CisgICAgICAgICAgICAjIElmIHRoZXkgZGlkbid0IGdpdmUgdXMgYW55dGhpbmcsIGZhaWwgcmF0aGVyIHRoYW4gZ3Vlc3NpbmcuIFRoZXJlJ3Mgbm8gZ29vZAorICAgICAgICAgICAgIyBkZWZhdWx0IGZvciBBT1NQLgorICAgICAgICAgICAgc2VsZi5fZXJyb3IoIk5vIGx1bmNoIGNvbWJvIHNwZWNpZmllZC4gRWl0aGVyIHBhc3MgLS1sdW5jaCBhcmd1bWVudCBvciBydW4gbHVuY2guIikKKyAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICByZXR1cm4gW0x1bmNoKHByb2R1Y3QsIHJlbGVhc2UsIHZhcmlhbnQpLF0KKworICAgIGRlZiBMdW5jaGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbHVuY2hlcworCisgICAgZGVmIEl0ZXJhdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9hcmdzLml0ZXJhdGlvbnMKKworICAgIGRlZiBEaXN0T25lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fYXJncy5kaXN0X29uZQorCisgICAgZGVmIF9pbml0X2JlbmNobWFya3Moc2VsZik6CisgICAgICAgICIiIkluaXRpYWxpemUgdGhlIGxpc3Qgb2YgYmVuY2htYXJrcy4iIiIKKyAgICAgICAgIyBBc3N1bWVzIHRoYXQgd2UndmUgYWxyZWFkeSBjaGRpcmVkIHRvIHRoZSByb290IG9mIHRoZSB0cmVlLgorICAgICAgICBzZWxmLl9iZW5jaG1hcmtzID0gWworICAgICAgICAgICAgQmVuY2htYXJrKAorICAgICAgICAgICAgICAgICAgICAgIGlkPSJmdWxsX2x1bmNoIiwKKyAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0iTHVuY2ggZnJvbSBjbGVhbiBvdXQiLAorICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZT1DbGVhbigpLAorICAgICAgICAgICAgICAgICAgICAgIGR1bXB2YXJzPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgcHJlcm9sbD0wLAorICAgICAgICAgICAgICAgICAgICAgIHBvc3Ryb2xsPTAsCisgICAgICAgICAgICApLAorICAgICAgICAgICAgQmVuY2htYXJrKAorICAgICAgICAgICAgICAgICAgICAgIGlkPSJub29wX2x1bmNoIiwKKyAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0iTHVuY2ggd2l0aCBubyBjaGFuZ2UiLAorICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZT1Ob0NoYW5nZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGR1bXB2YXJzPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgcHJlcm9sbD0xLAorICAgICAgICAgICAgICAgICAgICAgIHBvc3Ryb2xsPTAsCisgICAgICAgICAgICApLAorICAgICAgICAgICAgQmVuY2htYXJrKGlkPSJmdWxsIiwKKyAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0iRnVsbCBidWlsZCIsCisgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlPUNsZWFuKCksCisgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlcz1bImRyb2lkIl0sCisgICAgICAgICAgICAgICAgICAgICAgcHJlcm9sbD0wLAorICAgICAgICAgICAgICAgICAgICAgIHBvc3Ryb2xsPTMsCisgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIEJlbmNobWFyayhpZD0ibm9jaGFuZ2UiLAorICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJObyBjaGFuZ2UiLAorICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZT1Ob0NoYW5nZSgpLAorICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXM9WyJkcm9pZCJdLAorICAgICAgICAgICAgICAgICAgICAgIHByZXJvbGw9MiwKKyAgICAgICAgICAgICAgICAgICAgICBwb3N0cm9sbD0zLAorICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICBCZW5jaG1hcmsoaWQ9InVucmVmZXJlbmNlZCIsCisgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9IkNyZWF0ZSB1bnJlZmVyZW5jZWQgZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlPUNyZWF0ZSgiYmlvbmljL3VucmVmZXJlbmNlZC50eHQiKSwKKyAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzPVsiZHJvaWQiXSwKKyAgICAgICAgICAgICAgICAgICAgICBwcmVyb2xsPTEsCisgICAgICAgICAgICAgICAgICAgICAgcG9zdHJvbGw9MiwKKyAgICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgQmVuY2htYXJrKGlkPSJtb2RpZnlfYnAiLAorICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJNb2RpZnkgQW5kcm9pZC5icCIsCisgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlPU1vZGlmeSgiYmlvbmljL2xpYmMvQW5kcm9pZC5icCIsIENvbW1lbnQoIi8vIikpLAorICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXM9WyJkcm9pZCJdLAorICAgICAgICAgICAgICAgICAgICAgIHByZXJvbGw9MSwKKyAgICAgICAgICAgICAgICAgICAgICBwb3N0cm9sbD0zLAorICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICBCZW5jaG1hcmsoaWQ9Im1vZGlmeV9zdGRpbyIsCisgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9Ik1vZGlmeSBzdGRpby5jcHAiLAorICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZT1Nb2RpZnkoImJpb25pYy9saWJjL3N0ZGlvL3N0ZGlvLmNwcCIsIENvbW1lbnQoIi8vIikpLAorICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXM9WyJsaWJjIl0sCisgICAgICAgICAgICAgICAgICAgICAgcHJlcm9sbD0xLAorICAgICAgICAgICAgICAgICAgICAgIHBvc3Ryb2xsPTIsCisgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIEJlbmNobWFyayhpZD0ibW9kaWZ5X2FkYmQiLAorICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJNb2RpZnkgYWRiZCIsCisgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlPU1vZGlmeSgicGFja2FnZXMvbW9kdWxlcy9hZGIvZGFlbW9uL21haW4uY3BwIiwgQ29tbWVudCgiLy8iKSksCisgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlcz1bImFkYmQiXSwKKyAgICAgICAgICAgICAgICAgICAgICBwcmVyb2xsPTEsCisgICAgICAgICAgICAgICAgICAgICAgcG9zdHJvbGw9MiwKKyAgICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgQmVuY2htYXJrKGlkPSJzZXJ2aWNlc19wcml2YXRlX2ZpZWxkIiwKKyAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0iQWRkIHByaXZhdGUgZmllbGQgdG8gQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5qYXZhIiwKKyAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2U9QWRkSmF2YUZpZWxkKCJmcmFtZXdvcmtzL2Jhc2Uvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByaXZhdGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzPVsic2VydmljZXMiXSwKKyAgICAgICAgICAgICAgICAgICAgICBwcmVyb2xsPTEsCisgICAgICAgICAgICAgICAgICAgICAgcG9zdHJvbGw9MiwKKyAgICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgQmVuY2htYXJrKGlkPSJzZXJ2aWNlc19wdWJsaWNfZmllbGQiLAorICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJBZGQgcHVibGljIGZpZWxkIHRvIEFjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YSIsCisgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlPUFkZEphdmFGaWVsZCgiZnJhbWV3b3Jrcy9iYXNlL3NlcnZpY2VzL2NvcmUvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5qYXZhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvKiogQGhpZGUgKi8gcHVibGljIiksCisgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlcz1bInNlcnZpY2VzIl0sCisgICAgICAgICAgICAgICAgICAgICAgcHJlcm9sbD0xLAorICAgICAgICAgICAgICAgICAgICAgIHBvc3Ryb2xsPTIsCisgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIEJlbmNobWFyayhpZD0ic2VydmljZXNfYXBpIiwKKyAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0iQWRkIEFQSSB0byBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmFhIiwKKyAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2U9QWRkSmF2YUZpZWxkKCJmcmFtZXdvcmtzL2Jhc2Uvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkBhbmRyb2lkLmFubm90YXRpb24uU3VwcHJlc3NMaW50KFwiVW5mbGFnZ2VkQXBpXCIpIHB1YmxpYyIpLAorICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXM9WyJzZXJ2aWNlcyJdLAorICAgICAgICAgICAgICAgICAgICAgIHByZXJvbGw9MSwKKyAgICAgICAgICAgICAgICAgICAgICBwb3N0cm9sbD0yLAorICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICBCZW5jaG1hcmsoaWQ9ImZyYW1ld29ya19wcml2YXRlX2ZpZWxkIiwKKyAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0iQWRkIHByaXZhdGUgZmllbGQgdG8gU2V0dGluZ3MuamF2YSIsCisgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlPUFkZEphdmFGaWVsZCgiZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmphdmEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByaXZhdGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzPVsiZnJhbWV3b3JrLW1pbnVzLWFwZXgiXSwKKyAgICAgICAgICAgICAgICAgICAgICBwcmVyb2xsPTEsCisgICAgICAgICAgICAgICAgICAgICAgcG9zdHJvbGw9MiwKKyAgICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgQmVuY2htYXJrKGlkPSJmcmFtZXdvcmtfcHVibGljX2ZpZWxkIiwKKyAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0iQWRkIHB1YmxpYyBmaWVsZCB0byBTZXR0aW5ncy5qYXZhIiwKKyAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2U9QWRkSmF2YUZpZWxkKCJmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLyoqIEBoaWRlICovIHB1YmxpYyIpLAorICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXM9WyJmcmFtZXdvcmstbWludXMtYXBleCJdLAorICAgICAgICAgICAgICAgICAgICAgIHByZXJvbGw9MSwKKyAgICAgICAgICAgICAgICAgICAgICBwb3N0cm9sbD0yLAorICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICBCZW5jaG1hcmsoaWQ9ImZyYW1ld29ya19hcGkiLAorICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJBZGQgQVBJIHRvIFNldHRpbmdzLmphdmEiLAorICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZT1DaGFuZ2VQdWJsaWNBcGkoKSwKKyAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzPVsiYXBpLXN0dWJzLWRvY3Mtbm9uLXVwZGF0YWJsZS11cGRhdGUtY3VycmVudC1hcGkiLCAiZnJhbWV3b3JrLW1pbnVzLWFwZXgiXSwKKyAgICAgICAgICAgICAgICAgICAgICBwcmVyb2xsPTEsCisgICAgICAgICAgICAgICAgICAgICAgcG9zdHJvbGw9MiwKKyAgICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgQmVuY2htYXJrKGlkPSJtb2RpZnlfZnJhbWV3b3JrX3Jlc291cmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0iTW9kaWZ5IGZyYW1ld29yayByZXNvdXJjZSIsCisgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlPU1vZGlmeSgiZnJhbWV3b3Jrcy9iYXNlL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29uZmlnLnhtbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IHN0cih1dWlkLnV1aWQ0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlPSI8L3N0cmluZz4iKSwKKyAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzPVsiZnJhbWV3b3JrLW1pbnVzLWFwZXgiXSwKKyAgICAgICAgICAgICAgICAgICAgICBwcmVyb2xsPTEsCisgICAgICAgICAgICAgICAgICAgICAgcG9zdHJvbGw9MiwKKyAgICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgQmVuY2htYXJrKGlkPSJhZGRfZnJhbWV3b3JrX3Jlc291cmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0iQWRkIGZyYW1ld29yayByZXNvdXJjZSIsCisgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlPU1vZGlmeSgiZnJhbWV3b3Jrcy9iYXNlL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29uZmlnLnhtbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IGYiPHN0cmluZyBuYW1lPVwiQkVOQ0hNQVJLXCI+e3V1aWQudXVpZDQoKX08L3N0cmluZz4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlPSI8L3Jlc291cmNlcz4iKSwKKyAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzPVsiZnJhbWV3b3JrLW1pbnVzLWFwZXgiXSwKKyAgICAgICAgICAgICAgICAgICAgICBwcmVyb2xsPTEsCisgICAgICAgICAgICAgICAgICAgICAgcG9zdHJvbGw9MiwKKyAgICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgQmVuY2htYXJrKGlkPSJhZGRfc3lzdGVtdWlfZmllbGQiLAorICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJBZGQgU3lzdGVtVUkgZmllbGQiLAorICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZT1BZGRKYXZhRmllbGQoImZyYW1ld29ya3MvYmFzZS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvd21zaGVsbC9XTVNoZWxsLmphdmEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB1YmxpYyIpLAorICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXM9WyJTeXN0ZW1VSSJdLAorICAgICAgICAgICAgICAgICAgICAgIHByZXJvbGw9MSwKKyAgICAgICAgICAgICAgICAgICAgICBwb3N0cm9sbD0yLAorICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgIF0KKworICAgIGRlZiBfZXJyb3Ioc2VsZiwgbWVzc2FnZSk6CisgICAgICAgIHJlcG9ydF9lcnJvcihtZXNzYWdlKQorICAgICAgICBzZWxmLl9oYWRfZXJyb3IgPSBUcnVlCisKKworZGVmIHJlcG9ydF9lcnJvcihtZXNzYWdlKToKKyAgICBzeXMuc3RkZXJyLndyaXRlKGYiZXJyb3I6IHttZXNzYWdlfVxuIikKKworCitkZWYgbWFpbihhcmd2KToKKyAgICB0cnk6CisgICAgICAgIG9wdGlvbnMgPSBPcHRpb25zKCkKKyAgICAgICAgcnVubmVyID0gUnVubmVyKG9wdGlvbnMpCisgICAgICAgIHJ1bm5lci5SdW4oKQorICAgIGV4Y2VwdCBGYXRhbEVycm9yOgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKGYiRkFJTEVEXG4iKQorICAgICAgICBzeXMuZXhpdCgxKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbihzeXMuYXJndikKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvZm9ybWF0X2JlbmNobWFya3MgYi90b29scy9wZXJmL2Zvcm1hdF9iZW5jaG1hcmtzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgwN2U1NDYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2Zvcm1hdF9iZW5jaG1hcmtzCkBAIC0wLDAgKzEsMjE5IEBACisjIS91c3IvYmluL2VudiBweXRob24zCisjIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgc3lzCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHN5cy5kb250X3dyaXRlX2J5dGVjb2RlID0gVHJ1ZQorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBkYXRhY2xhc3NlcworaW1wb3J0IGRhdGV0aW1lCitpbXBvcnQganNvbgoraW1wb3J0IG9zCitpbXBvcnQgcGF0aGxpYgoraW1wb3J0IHN0YXRpc3RpY3MKK2ltcG9ydCB6b25laW5mbworaW1wb3J0IGNzdgorCitpbXBvcnQgcHJldHR5CitpbXBvcnQgdXRpbHMKKworIyBUT0RPOgorIyAtIEZsYWcgaWYgdGhlIGxhc3QgcG9zdHJvbGwgYnVpbGQgd2FzIG1vcmUgdGhhbiAxNSBzZWNvbmRzIG9yIHNvbWV0aGluZy4gVGhhdCdzCisjICAgYW4gaW5kaWNhdG9yIHRoYXQgc29tZXRoaW5nIGlzIGFtaXNzLgorIyAtIEFkZCBhIG1vZGUgdG8gcHJpbnQgYWxsIG9mIHRoZSB2YWx1ZXMgZm9yIG11bHRpLWl0ZXJhdGlvbiBydW5zCisjIC0gQWRkIGEgZmxhZyB0byByZW9yZGVyIHRoZSB0YWdzCisjIC0gQWRkIGEgZmxhZyB0byByZW9yZGVyIHRoZSBoZWFkZXJzIGluIG9yZGVyIHRvIHNob3cgZ3JvdXBpbmcgbW9yZSBjbGVhcmx5LgorCisKK2RlZiBGaW5kU3VtbWFyaWVzKGFyZ3MpOgorICAgIGRlZiBmaW5kX3N1bW1hcmllcyhkaXJlY3RvcnkpOgorICAgICAgICByZXR1cm4gW3N0cihwLnJlc29sdmUoKSkgZm9yIHAgaW4gcGF0aGxpYi5QYXRoKGRpcmVjdG9yeSkuZ2xvYigiKiovc3VtbWFyeS5qc29uIildCisgICAgaWYgbm90IGFyZ3M6CisgICAgICAgICMgSWYgdGhleSBkaWRuJ3QgZ2l2ZSBhbiBhcmd1bWVudCwgdXNlIHRoZSBkZWZhdWx0IGRpcgorICAgICAgICByb290ID0gdXRpbHMuZ2V0X3Jvb3QoKQorICAgICAgICBpZiBub3Qgcm9vdDoKKyAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICByZXR1cm4gZmluZF9zdW1tYXJpZXMocm9vdC5qb2lucGF0aCgiLi4iLCB1dGlscy5ERUZBVUxUX1JFUE9SVF9ESVIpKQorICAgIHJlc3VsdHMgPSBsaXN0KCkKKyAgICBmb3IgYXJnIGluIGFyZ3M6CisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGFyZyk6CisgICAgICAgICAgICAjIElmIGl0J3MgYSBmaWxlIGFkZCB0aGF0CisgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChhcmcpCisgICAgICAgIGVsaWYgb3MucGF0aC5pc2RpcihhcmcpOgorICAgICAgICAgICAgIyBJZiBpdCdzIGEgZGlyZWN0b3J5LCBmaW5kIGFsbCBvZiB0aGUgZmlsZXMgdGhlcmUKKyAgICAgICAgICAgIHJlc3VsdHMgKz0gZmluZF9zdW1tYXJpZXMoYXJnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZShmIkludmFsaWQgc3VtbWFyeSBhcmd1bWVudDoge2FyZ31cbiIpCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgIHJldHVybiBzb3J0ZWQobGlzdChyZXN1bHRzKSkKKworCitkZWYgTG9hZFN1bW1hcnkoZmlsZW5hbWUpOgorICAgIHdpdGggb3BlbihmaWxlbmFtZSkgYXMgZjoKKyAgICAgICAgcmV0dXJuIGpzb24ubG9hZChmKQorCisjIENvbHVtbnM6CisjICAgRGF0ZQorIyAgIEJyYW5jaAorIyAgIFRhZworIyAgIC0tCisjICAgTHVuY2gKKyMgUm93czoKKyMgICBCZW5jaG1hcmsKKworZGVmIGx1bmNoX3N0cihkKToKKyAgICAiQ29udmVydCBhIGx1bmNoIGRpY3QgdG8gYSBzdHJpbmciCisgICAgcmV0dXJuIGYie2RbJ1RBUkdFVF9QUk9EVUNUJ119LXtkWydUQVJHRVRfUkVMRUFTRSddfS17ZFsnVEFSR0VUX0JVSUxEX1ZBUklBTlQnXX0iCisKK2RlZiBncm91cF9ieShsLCBrZXkpOgorICAgICJSZXR1cm4gYSBsaXN0IG9mIHR1cGxlcywgZ3JvdXBlZCBieSBrZXksIHNvcnRlZCBieSBrZXkiCisgICAgcmVzdWx0ID0ge30KKyAgICBmb3IgaXRlbSBpbiBsOgorICAgICAgICByZXN1bHQuc2V0ZGVmYXVsdChrZXkoaXRlbSksIFtdKS5hcHBlbmQoaXRlbSkKKyAgICByZXR1cm4gWyhrLCB2KSBmb3IgaywgdiBpbiByZXN1bHQuaXRlbXMoKV0KKworCitjbGFzcyBUYWJsZToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcm93X3RpdGxlLCBmaXhlZF90aXRsZXM9W10pOgorICAgICAgICBzZWxmLl9kYXRhID0ge30KKyAgICAgICAgc2VsZi5fcm93cyA9IFtdCisgICAgICAgIHNlbGYuX2NvbHMgPSBbXQorICAgICAgICBzZWxmLl9maXhlZF9jb2xzID0ge30KKyAgICAgICAgc2VsZi5fdGl0bGVzID0gW3Jvd190aXRsZV0gKyBmaXhlZF90aXRsZXMKKworICAgIGRlZiBTZXQoc2VsZiwgY29sdW1uX2tleSwgcm93X2tleSwgZGF0YSk6CisgICAgICAgIHNlbGYuX2RhdGFbKGNvbHVtbl9rZXksIHJvd19rZXkpXSA9IGRhdGEKKyAgICAgICAgaWYgbm90IGNvbHVtbl9rZXkgaW4gc2VsZi5fY29sczoKKyAgICAgICAgICAgIHNlbGYuX2NvbHMuYXBwZW5kKGNvbHVtbl9rZXkpCisgICAgICAgIGlmIG5vdCByb3dfa2V5IGluIHNlbGYuX3Jvd3M6CisgICAgICAgICAgICBzZWxmLl9yb3dzLmFwcGVuZChyb3dfa2V5KQorCisgICAgZGVmIFNldEZpeGVkQ29sKHNlbGYsIHJvd19rZXksIGNvbHVtbnMpOgorICAgICAgICBzZWxmLl9maXhlZF9jb2xzW3Jvd19rZXldID0gY29sdW1ucworCisgICAgZGVmIFdyaXRlKHNlbGYsIG91dCwgZm10KToKKyAgICAgICAgdGFibGUgPSBbXQorICAgICAgICAjIEV4cGFuZCB0aGUgY29sdW1uIGl0ZW1zCisgICAgICAgIGZvciByb3cgaW4gemlwKCpzZWxmLl9jb2xzKToKKyAgICAgICAgICAgIGlmIHJvdy5jb3VudChyb3dbMF0pID09IGxlbihyb3cpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB0YWJsZS5hcHBlbmQoWyIiXSAqIGxlbihzZWxmLl90aXRsZXMpICsgW2NvbCBmb3IgY29sIGluIHJvd10pCisgICAgICAgIGlmIHRhYmxlOgorICAgICAgICAgICAgIyBVcGRhdGUgdGhlIGxhc3Qgcm93IG9mIHRoZSBoZWFkZXIgd2l0aCB0aXRsZSBhbmQgYWRkIHNlcGFyYXRvcgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuX3RpdGxlcykpOgorICAgICAgICAgICAgICAgIHRhYmxlW2xlbih0YWJsZSktMV1baV0gPSBzZWxmLl90aXRsZXNbaV0KKyAgICAgICAgICAgIGlmIGZtdCA9PSAidGFibGUiOgorICAgICAgICAgICAgICAgIHRhYmxlLmFwcGVuZChwcmV0dHkuU0VQQVJBVE9SKQorICAgICAgICAjIFBvcHVsYXRlIHRoZSBkYXRhCisgICAgICAgIGZvciByb3cgaW4gc2VsZi5fcm93czoKKyAgICAgICAgICAgIHRhYmxlLmFwcGVuZChbc3RyKHJvdyldCisgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZWxmLl9maXhlZF9jb2xzW3Jvd10KKyAgICAgICAgICAgICAgICAgICAgICAgICArIFtzdHIoc2VsZi5fZGF0YS5nZXQoKGNvbCwgcm93KSwgIiIpKSBmb3IgY29sIGluIHNlbGYuX2NvbHNdKQorICAgICAgICBpZiBmbXQgPT0gImNzdiI6CisgICAgICAgICAgICBjc3Yud3JpdGVyKHN5cy5zdGRvdXQsIHF1b3Rpbmc9Y3N2LlFVT1RFX01JTklNQUwpLndyaXRlcm93cyh0YWJsZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG91dC53cml0ZShwcmV0dHkuRm9ybWF0VGFibGUodGFibGUsIGFsaWdubWVudHM9IkxMIikpCisKKworZGVmIGZvcm1hdF9kdXJhdGlvbl9zZWMobnMsIGZtdF9zZWMpOgorICAgICJGb3JtYXQgYSBkdXJhdGlvbiBpbiBucyB0byBzZWNvbmQgcHJlY2lzaW9uIgorICAgIHNlYyA9IHJvdW5kKG5zIC8gMTAwMDAwMDAwMCkKKyAgICBpZiBmbXRfc2VjOgorICAgICAgICByZXR1cm4gZiJ7c2VjfSIKKyAgICBlbHNlOgorICAgICAgICBoLCBzZWMgPSBkaXZtb2Qoc2VjLCA2MCo2MCkKKyAgICAgICAgbSwgc2VjID0gZGl2bW9kKHNlYywgNjApCisgICAgICAgIHJlc3VsdCA9ICIiCisgICAgICAgIGlmIGggPiAwOgorICAgICAgICAgICAgcmVzdWx0ICs9IGYie2g6MmR9aCAiCisgICAgICAgIGlmIGggPiAwIG9yIG0gPiAwOgorICAgICAgICAgICAgcmVzdWx0ICs9IGYie206MmR9bSAiCisgICAgICAgIHJldHVybiByZXN1bHQgKyBmIntzZWM6MmR9cyIKKworCitkZWYgbWFpbihhcmd2KToKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigKKyAgICAgICAgICAgIHByb2c9ImZvcm1hdF9iZW5jaG1hcmtzIiwKKyAgICAgICAgICAgIGFsbG93X2FiYnJldj1GYWxzZSwgIyBEb24ndCBsZXQgcGVvcGxlIHdyaXRlIHVuc3VwcG9ydGFibGUgc2NyaXB0cy4KKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJQcmludCBhbmFseXNpcyB0YWJsZXMgZm9yIGJlbmNobWFya3MiKQorCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1jc3YiLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iUHJpbnQgaW4gQ1NWIGluc3RlYWQgb2YgdGFibGUuIikKKworICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tc2VjIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlByaW50IGluIHNlY29uZHMgaW5zdGVhZCBvZiBtaW51dGVzIGFuZCBzZWNvbmRzIikKKworICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tdGFncyIsIG5hcmdzPSIqIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlRoZSB0YWdzIHRvIHByaW50LCBpbiBvcmRlci4iKQorCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgic3VtbWFyaWVzIiwgbmFyZ3M9IioiLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iQSBzdW1tYXJ5Lmpzb24gZmlsZSBvciBhIGRpcmVjdG9yeSBpbiB3aGljaCB0byBsb29rIGZvciBzdW1tYXJpZXMuIikKKworICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisKKyAgICAjIExvYWQgdGhlIHN1bW1hcmllcworICAgIHN1bW1hcmllcyA9IFsocywgTG9hZFN1bW1hcnkocykpIGZvciBzIGluIEZpbmRTdW1tYXJpZXMoYXJncy5zdW1tYXJpZXMpXQorCisgICAgIyBDb252ZXJ0IHRvIE1UViB0aW1lCisgICAgZm9yIGZpbGVuYW1lLCBzIGluIHN1bW1hcmllczoKKyAgICAgICAgZHQgPSBkYXRldGltZS5kYXRldGltZS5mcm9taXNvZm9ybWF0KHNbInN0YXJ0X3RpbWUiXSkKKyAgICAgICAgZHQgPSBkdC5hc3RpbWV6b25lKHpvbmVpbmZvLlpvbmVJbmZvKCJBbWVyaWNhL0xvc19BbmdlbGVzIikpCisgICAgICAgIHNbImRhdGV0aW1lIl0gPSBkdAorICAgICAgICBzWyJkYXRlIl0gPSBkYXRldGltZS5kYXRlKGR0LnllYXIsIGR0Lm1vbnRoLCBkdC5kYXkpCisKKyAgICAjIEZpbHRlciBvdXQgdGFncyB3ZSBkb24ndCB3YW50CisgICAgaWYgYXJncy50YWdzOgorICAgICAgICBzdW1tYXJpZXMgPSBbKGYsIHMpIGZvciBmLCBzIGluIHN1bW1hcmllcyBpZiBzLmdldCgidGFnIiwgIiIpIGluIGFyZ3MudGFnc10KKworICAgICMgSWYgdGhleSBzdXBwbGllZCB0YWdzLCBzb3J0IGluIHRoYXQgb3JkZXIsIG90aGVyd2lzZSBzb3J0IGJ5IHRhZworICAgIGlmIGFyZ3MudGFnczoKKyAgICAgICAgdGFnc29ydCA9IGxhbWJkYSB0YWc6IGFyZ3MudGFncy5pbmRleCh0YWcpCisgICAgZWxzZToKKyAgICAgICAgdGFnc29ydCA9IGxhbWJkYSB0YWc6IHRhZworCisgICAgIyBTb3J0IHRoZSBzdW1tYXJpZXMKKyAgICBzdW1tYXJpZXMuc29ydChrZXk9bGFtYmRhIHM6IChzWzFdWyJkYXRlIl0sIHNbMV1bImJyYW5jaCJdLCB0YWdzb3J0KHNbMV1bInRhZyJdKSkpCisKKyAgICAjIGdyb3VwIHRoZSBiZW5jaG1hcmtzIGJ5IGNvbHVtbiBhbmQgaXRlcmF0aW9uCisgICAgZGVmIGJtX2tleShiKToKKyAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgIGx1bmNoX3N0cihiWyJsdW5jaCJdKSwKKyAgICAgICAgKQorICAgIGZvciBmaWxlbmFtZSwgc3VtbWFyeSBpbiBzdW1tYXJpZXM6CisgICAgICAgIHN1bW1hcnlbImNvbHVtbnMiXSA9IFsoa2V5LCBncm91cF9ieShibXMsIGxhbWJkYSBiOiBiWyJpZCJdKSkgZm9yIGtleSwgYm1zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBncm91cF9ieShzdW1tYXJ5WyJiZW5jaG1hcmtzIl0sIGJtX2tleSldCisKKyAgICAjIEJ1aWxkIHRoZSB0YWJsZQorICAgIHRhYmxlID0gVGFibGUoIkJlbmNobWFyayIsIFsiUmVidWlsZCJdKQorICAgIGZvciBmaWxlbmFtZSwgc3VtbWFyeSBpbiBzdW1tYXJpZXM6CisgICAgICAgIGZvciBrZXksIGNvbHVtbiBpbiBzdW1tYXJ5WyJjb2x1bW5zIl06CisgICAgICAgICAgICBmb3IgaWQsIGNlbGwgaW4gY29sdW1uOgorICAgICAgICAgICAgICAgIGR1cmF0aW9uX25zID0gc3RhdGlzdGljcy5tZWRpYW4oW2JbImR1cmF0aW9uX25zIl0gZm9yIGIgaW4gY2VsbF0pCisgICAgICAgICAgICAgICAgbW9kdWxlcyA9IGNlbGxbMF1bIm1vZHVsZXMiXQorICAgICAgICAgICAgICAgIGlmIG5vdCBtb2R1bGVzOgorICAgICAgICAgICAgICAgICAgICBtb2R1bGVzID0gWyItLS0iXQorICAgICAgICAgICAgICAgIHRhYmxlLlNldEZpeGVkQ29sKGNlbGxbMF1bInRpdGxlIl0sIFsiICIuam9pbihtb2R1bGVzKV0pCisgICAgICAgICAgICAgICAgdGFibGUuU2V0KHR1cGxlKFtzdW1tYXJ5WyJkYXRlIl0uc3RyZnRpbWUoIiVZLSVtLSVkIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5WyJicmFuY2giXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlbInRhZyJdXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxpc3Qoa2V5KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxbMF1bInRpdGxlIl0sIGZvcm1hdF9kdXJhdGlvbl9zZWMoZHVyYXRpb25fbnMsIGFyZ3Muc2VjKSkKKworICAgIHRhYmxlLldyaXRlKHN5cy5zdGRvdXQsICJjc3YiIGlmIGFyZ3MuY3N2IGVsc2UgInRhYmxlIikKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKHN5cy5hcmd2KQorCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3ByZXR0eS5weSBiL3Rvb2xzL3BlcmYvcHJldHR5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZmRjOWUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3ByZXR0eS5weQpAQCAtMCwwICsxLDUyIEBACisjIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIEZvcm1hdHRpbmcgdXRpbGl0aWVzCisKK2NsYXNzIFNlbnRpbmVsKCk6CisgICAgcGFzcworCitTRVBBUkFUT1IgPSBTZW50aW5lbCgpCisKK2RlZiBGb3JtYXRUYWJsZShkYXRhLCBwcmVmaXg9IiIsIGFsaWdubWVudHM9W10pOgorICAgICIiIlByZXR0eSBwcmludCBhIHRhYmxlLgorCisgICAgUHJlZml4ZXMgZWFjaCByb3cgd2l0aCBgcHJlZml4YC4KKyAgICAiIiIKKyAgICBpZiBub3QgZGF0YToKKyAgICAgICAgcmV0dXJuICIiCisgICAgd2lkdGhzID0gW21heChbbGVuKHgpIGlmIHggZWxzZSAwIGZvciB4IGluIGNvbF0pIGZvciBjb2wKKyAgICAgICAgICAgICAgaW4gemlwKCpbZCBmb3IgZCBpbiBkYXRhIGlmIG5vdCBpc2luc3RhbmNlKGQsIFNlbnRpbmVsKV0pXQorICAgIHJlc3VsdCA9ICIiCisgICAgY29sc2VwID0gIiAgIgorICAgIGZvciByb3cgaW4gZGF0YToKKyAgICAgICAgcmVzdWx0ICs9IHByZWZpeAorICAgICAgICBpZiByb3cgPT0gU0VQQVJBVE9SOgorICAgICAgICAgICAgZm9yIHcgaW4gd2lkdGhzOgorICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiLSIgKiB3CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGNvbHNlcAorICAgICAgICAgICAgcmVzdWx0ICs9ICJcbiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihyb3cpKToKKyAgICAgICAgICAgICAgICBjZWxsID0gcm93W2ldIGlmIHJvd1tpXSBlbHNlICIiCisgICAgICAgICAgICAgICAgaWYgaSA+PSBsZW4oYWxpZ25tZW50cykgb3IgYWxpZ25tZW50c1tpXSA9PSAiUiI6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiICIgKiAod2lkdGhzW2ldIC0gbGVuKGNlbGwpKQorICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjZWxsCisgICAgICAgICAgICAgICAgaWYgaSA8IGxlbihhbGlnbm1lbnRzKSBhbmQgYWxpZ25tZW50c1tpXSA9PSAiTCI6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiICIgKiAod2lkdGhzW2ldIC0gbGVuKGNlbGwpKQorICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjb2xzZXAKKyAgICAgICAgICAgIHJlc3VsdCArPSAiXG4iCisgICAgcmV0dXJuIHJlc3VsdAorCisKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbHMucHkgYi90b29scy9wZXJmL3V0aWxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNjZkNGMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWxzLnB5CkBAIC0wLDAgKzEsNDQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ltcG9ydCBvcworaW1wb3J0IHBhdGhsaWIKKworREVGQVVMVF9SRVBPUlRfRElSID0gImJlbmNobWFya3MiCisKK2RlZiBnZXRfcm9vdCgpOgorICAgIHRvcF9kaXIgPSBvcy5lbnZpcm9uLmdldCgiQU5EUk9JRF9CVUlMRF9UT1AiKQorICAgIGQgPSBwYXRobGliLlBhdGguY3dkKCkKKyAgICAjIHdpdGggY29nLCBzb21lb25lIG1heSBoYXZlIGEgbmV3IHdvcmtzcGFjZSBhbmQgbmV3IHNvdXJjZSB0cmVlIHRvcCwgYnV0CisgICAgIyBub3QgcnVuIGx1bmNoIHlldCwgcmVzdWx0aW5nIGluIGEgbWlzbGVhZGluZyBBTkRST0lEX0JVSUxEX1RPUCB2YWx1ZQorICAgIGlmIHRvcF9kaXIgYW5kIGQuaXNfcmVsYXRpdmVfdG8odG9wX2Rpcik6CisgICAgICAgIHJldHVybiBwYXRobGliLlBhdGgodG9wX2RpcikucmVzb2x2ZSgpCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgaWYgZC5qb2lucGF0aCgiYnVpbGQiLCAic29vbmciLCAic29vbmdfdWkuYmFzaCIpLmV4aXN0cygpOgorICAgICAgICAgICAgcmV0dXJuIGQucmVzb2x2ZSgpLmFic29sdXRlKCkKKyAgICAgICAgZCA9IGQucGFyZW50CisgICAgICAgIGlmIGQgPT0gcGF0aGxpYi5QYXRoKCIvIik6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCitkZWYgZ2V0X2Rpc3RfZGlyKCk6CisgICAgZGlzdF9kaXIgPSBvcy5nZXRlbnYoIkRJU1RfRElSIikKKyAgICBpZiBkaXN0X2RpcjoKKyAgICAgICAgcmV0dXJuIHBhdGhsaWIuUGF0aChkaXN0X2RpcikucmVzb2x2ZSgpCisgICAgcmV0dXJuIGdldF9vdXRfZGlyKCkuam9pbnBhdGgoImRpc3QiKQorCitkZWYgZ2V0X291dF9kaXIoKToKKyAgICBvdXRfZGlyID0gb3MuZ2V0ZW52KCJPVVRfRElSIikKKyAgICBpZiBub3Qgb3V0X2RpcjoKKyAgICAgICAgb3V0X2RpciA9ICJvdXQiCisgICAgcmV0dXJuIHBhdGhsaWIuUGF0aChvdXRfZGlyKS5yZXNvbHZlKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvc3RfcHJvY2Vzc19wcm9wcy5weSBiL3Rvb2xzL3Bvc3RfcHJvY2Vzc19wcm9wcy5weQppbmRleCAzMWE0NjBkLi42ZjQyOWZhIDEwMDc1NQotLS0gYS90b29scy9wb3N0X3Byb2Nlc3NfcHJvcHMucHkKKysrIGIvdG9vbHMvcG9zdF9wcm9jZXNzX3Byb3BzLnB5CkBAIC0xNyw2ICsxNyw4IEBACiBpbXBvcnQgYXJncGFyc2UKIGltcG9ydCBzeXMKIAorZnJvbSB1ZmZkX2djX3V0aWxzIGltcG9ydCBzaG91bGRfZW5hYmxlX3VmZmRfZ2MKKwogIyBVc2FnZTogcG9zdF9wcm9jZXNzX3Byb3BzLnB5IGZpbGUucHJvcCBbZGlzYWxsb3dlZF9rZXksIC4uLl0KICMgRGlzYWxsb3dlZCBrZXlzIGFyZSByZW1vdmVkIGZyb20gdGhlIHByb3BlcnR5IGZpbGUsIGlmIHByZXNlbnQKIApAQCAtMjcsNyArMjksNyBAQAogCiAjIFB1dCB0aGUgbW9kaWZpY2F0aW9ucyB0aGF0IHlvdSBuZWVkIHRvIG1ha2UgaW50byB0aGUgKi9idWlsZC5wcm9wIGludG8gdGhpcwogIyBmdW5jdGlvbi4KLWRlZiBtYW5nbGVfYnVpbGRfcHJvcChwcm9wX2xpc3QpOgorZGVmIG1hbmdsZV9idWlsZF9wcm9wKHByb3BfbGlzdCwga2VybmVsX3ZlcnNpb25fZmlsZV9mb3JfdWZmZF9nYyk6CiAgICMgSWYgcm8uZGVidWdnYWJsZSBpcyAxLCB0aGVuIGVuYWJsZSBhZGIgb24gVVNCIGJ5IGRlZmF1bHQKICAgIyAodGhpcyBpcyBmb3IgdXNlcmRlYnVnIGJ1aWxkcykKICAgaWYgcHJvcF9saXN0LmdldF92YWx1ZSgicm8uZGVidWdnYWJsZSIpID09ICIxIjoKQEAgLTM4LDU1ICs0MCwzMiBAQAogICAgICAgZWxzZToKICAgICAgICAgdmFsID0gdmFsICsgIixhZGIiCiAgICAgICBwcm9wX2xpc3QucHV0KCJwZXJzaXN0LnN5cy51c2IuY29uZmlnIiwgdmFsKQorICBpZiBwcm9wX2xpc3QuZ2V0X3ZhbHVlKCJyby5kYWx2aWsudm0uZW5hYmxlX3VmZmRfZ2MiKSA9PSAiZGVmYXVsdCI6CisgICAgYXNzZXJ0IGtlcm5lbF92ZXJzaW9uX2ZpbGVfZm9yX3VmZmRfZ2MgIT0gIiIKKyAgICBlbmFibGVfdWZmZF9nYyA9IHNob3VsZF9lbmFibGVfdWZmZF9nYyhrZXJuZWxfdmVyc2lvbl9maWxlX2Zvcl91ZmZkX2djKQorICAgIHByb3BfbGlzdC5wdXQoInJvLmRhbHZpay52bS5lbmFibGVfdWZmZF9nYyIsCisgICAgICAgICAgICAgICAgICAidHJ1ZSIgaWYgZW5hYmxlX3VmZmRfZ2MgZWxzZSAiZmFsc2UiKQogCi1kZWYgdmFsaWRhdGVfZ3JmX3Byb3BzKHByb3BfbGlzdCwgc2RrX3ZlcnNpb24pOgorZGVmIHZhbGlkYXRlX2dyZl9wcm9wcyhwcm9wX2xpc3QpOgogICAiIiJWYWxpZGF0ZSBHUkYgcHJvcGVydGllcyBpZiBleGlzdC4KIAotICBJZiByby5ib2FyZC5maXJzdF9hcGlfbGV2ZWwgaXMgZGVmaW5lZCwgY2hlY2sgaWYgaXRzIHZhbHVlIGlzIHZhbGlkIGZvciB0aGUKLSAgc2RrIHZlcnNpb24uIFRoaXMgaXMgb25seSBmb3IgdGhlIHJlbGVhc2UgdmVyc2lvbi4KLSAgQWxzbywgdmFsaWRhdGUgdGhlIHZhbHVlIG9mIHJvLmJvYXJkLmFwaV9sZXZlbCBpZiBkZWZpbmVkLgorICBJZiByby5ib2FyZC5maXJzdF9hcGlfbGV2ZWwgaXMgZGVmaW5lZCwgY2hlY2sgaWYgaXRzIHZhbHVlIGlzIHZhbGlkLgogCiAgIFJldHVybnM6CiAgICAgVHJ1ZSBpZiB0aGUgR1JGIHByb3BlcnRpZXMgYXJlIHZhbGlkLgogICAiIiIKICAgZ3JmX2FwaV9sZXZlbCA9IHByb3BfbGlzdC5nZXRfdmFsdWUoInJvLmJvYXJkLmZpcnN0X2FwaV9sZXZlbCIpCiAgIGJvYXJkX2FwaV9sZXZlbCA9IHByb3BfbGlzdC5nZXRfdmFsdWUoInJvLmJvYXJkLmFwaV9sZXZlbCIpCi0gIHBsYXRmb3JtX3ZlcnNpb25fY29kZW5hbWUgPSBwcm9wX2xpc3QuZ2V0X3ZhbHVlKCJyby5idWlsZC52ZXJzaW9uLmNvZGVuYW1lIikKIAotICBpZiBub3QgZ3JmX2FwaV9sZXZlbDoKLSAgICBpZiBib2FyZF9hcGlfbGV2ZWw6Ci0gICAgICBzeXMuc3RkZXJyLndyaXRlKCJlcnJvcjogbm9uLUdSRiBkZXZpY2UgbXVzdCBub3QgZGVmaW5lICIKLSAgICAgICAgICAgICAgICAgICAgICAgInJvLmJvYXJkLmFwaV9sZXZlbFxuIikKLSAgICAgIHJldHVybiBGYWxzZQotICAgICMgbm9uLUdSRiBkZXZpY2Ugc2tpcHMgdGhlIEdSRiB2YWxpZGF0aW9uIHRlc3QKLSAgICByZXR1cm4gVHJ1ZQotCi0gIGdyZl9hcGlfbGV2ZWwgPSBpbnQoZ3JmX2FwaV9sZXZlbCkKLSAgaWYgYm9hcmRfYXBpX2xldmVsOgorICBpZiBncmZfYXBpX2xldmVsIGFuZCBib2FyZF9hcGlfbGV2ZWw6CisgICAgZ3JmX2FwaV9sZXZlbCA9IGludChncmZfYXBpX2xldmVsKQogICAgIGJvYXJkX2FwaV9sZXZlbCA9IGludChib2FyZF9hcGlfbGV2ZWwpCiAgICAgaWYgYm9hcmRfYXBpX2xldmVsIDwgZ3JmX2FwaV9sZXZlbDoKLSAgICAgIHN5cy5zdGRlcnIud3JpdGUoImVycm9yOiByby5ib2FyZC5hcGlfbGV2ZWwoJWQpIG11c3QgYmUgZ3JlYXRlciB0aGFuICIKKyAgICAgIHN5cy5zdGRlcnIud3JpdGUoImVycm9yOiByby5ib2FyZC5hcGlfbGV2ZWwoJWQpIG11c3Qgbm90IGJlIGxlc3MgdGhhbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICJyby5ib2FyZC5maXJzdF9hcGlfbGV2ZWwoJWQpXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICUgKGJvYXJkX2FwaV9sZXZlbCwgZ3JmX2FwaV9sZXZlbCkpCiAgICAgICByZXR1cm4gRmFsc2UKIAotICAjIHNraXAgc2RrIHZlcnNpb24gdmFsaWRhdGlvbiBmb3IgZGV2LXN0YWdlIG5vbi1SRUwgZGV2aWNlcwotICBpZiBwbGF0Zm9ybV92ZXJzaW9uX2NvZGVuYW1lICE9ICJSRUwiOgotICAgIHJldHVybiBUcnVlCi0KLSAgaWYgZ3JmX2FwaV9sZXZlbCA+IHNka192ZXJzaW9uOgotICAgIHN5cy5zdGRlcnIud3JpdGUoImVycm9yOiByby5ib2FyZC5maXJzdF9hcGlfbGV2ZWwoJWQpIG11c3QgYmUgbGVzcyB0aGFuICIKLSAgICAgICAgICAgICAgICAgICAgICJvciBlcXVhbCB0byByby5idWlsZC52ZXJzaW9uLnNkayglZClcbiIKLSAgICAgICAgICAgICAgICAgICAgICUgKGdyZl9hcGlfbGV2ZWwsIHNka192ZXJzaW9uKSkKLSAgICByZXR1cm4gRmFsc2UKLQotICBpZiBib2FyZF9hcGlfbGV2ZWw6Ci0gICAgaWYgYm9hcmRfYXBpX2xldmVsID4gc2RrX3ZlcnNpb246Ci0gICAgICBzeXMuc3RkZXJyLndyaXRlKCJlcnJvcjogcm8uYm9hcmQuYXBpX2xldmVsKCVkKSBtdXN0IGJlIGxlc3MgdGhhbiBvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICJlcXVhbCB0byByby5idWlsZC52ZXJzaW9uLnNkayglZClcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgJSAoYm9hcmRfYXBpX2xldmVsLCBzZGtfdmVyc2lvbikpCi0gICAgICByZXR1cm4gRmFsc2UKLQogICByZXR1cm4gVHJ1ZQogCiBkZWYgdmFsaWRhdGUocHJvcF9saXN0KToKQEAgLTI2MSw2ICsyNDAsNyBAQAogICBwYXJzZXIuYWRkX2FyZ3VtZW50KCJmaWxlbmFtZSIpCiAgIHBhcnNlci5hZGRfYXJndW1lbnQoImRpc2FsbG93ZWRfa2V5cyIsIG1ldGF2YXI9IktFWSIsIHR5cGU9c3RyLCBuYXJncz0iKiIpCiAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tc2RrLXZlcnNpb24iLCB0eXBlPWludCwgcmVxdWlyZWQ9VHJ1ZSkKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1rZXJuZWwtdmVyc2lvbi1maWxlLWZvci11ZmZkLWdjIiwgcmVxdWlyZWQ9VHJ1ZSkKICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKIAogICBpZiBub3QgYXJncy5maWxlbmFtZS5lbmRzd2l0aCgiL2J1aWxkLnByb3AiKToKQEAgLTI2OCwxMCArMjQ4LDEwIEBACiAgICAgc3lzLmV4aXQoMSkKIAogICBwcm9wcyA9IFByb3BMaXN0KGFyZ3MuZmlsZW5hbWUpCi0gIG1hbmdsZV9idWlsZF9wcm9wKHByb3BzKQorICBtYW5nbGVfYnVpbGRfcHJvcChwcm9wcywgYXJncy5rZXJuZWxfdmVyc2lvbl9maWxlX2Zvcl91ZmZkX2djKQogICBpZiBub3Qgb3ZlcnJpZGVfb3B0aW9uYWxfcHJvcHMocHJvcHMsIGFyZ3MuYWxsb3dfZHVwKToKICAgICBzeXMuZXhpdCgxKQotICBpZiBub3QgdmFsaWRhdGVfZ3JmX3Byb3BzKHByb3BzLCBhcmdzLnNka192ZXJzaW9uKToKKyAgaWYgbm90IHZhbGlkYXRlX2dyZl9wcm9wcyhwcm9wcyk6CiAgICAgc3lzLmV4aXQoMSkKICAgaWYgbm90IHZhbGlkYXRlKHByb3BzKToKICAgICBzeXMuZXhpdCgxKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcHJvdG9zL21ldGFkYXRhX2ZpbGUucHJvdG8gYi90b29scy9wcm90b3MvbWV0YWRhdGFfZmlsZS5wcm90bwppbmRleCBhYzExMjlhLi41Yzg5NjE4IDEwMDY0NAotLS0gYS90b29scy9wcm90b3MvbWV0YWRhdGFfZmlsZS5wcm90bworKysgYi90b29scy9wcm90b3MvbWV0YWRhdGFfZmlsZS5wcm90bwpAQCAtOTIsNiArOTIsOCBAQAogICAgIFNCT01SZWYgc2JvbV9yZWYgPSAxMDsKICAgfQogCisgIC8vIElkZW50aWZpZXJzIGZvciB0aGUgcGFja2FnZS4KKyAgcmVwZWF0ZWQgSWRlbnRpZmllciBpZGVudGlmaWVyID0gMTE7CiB9CiAKIC8vIFVSTCBhc3NvY2lhdGVkIHdpdGggYSB0aGlyZC1wYXJ0eSBwYWNrYWdlLgpAQCAtMjc4LDQgKzI4MCwxNDggQEAKICAgLy8gaHR0cHM6Ly9zcGR4LmdpdGh1Yi5pby9zcGR4LXNwZWMvdjIuMy9wYWNrYWdlLWluZm9ybWF0aW9uLyM3Mi1wYWNrYWdlLXNwZHgtaWRlbnRpZmllci1maWVsZCBvcgogICAvLyBodHRwczovL3NwZHguZ2l0aHViLmlvL3NwZHgtc3BlYy92Mi4zL2ZpbGUtaW5mb3JtYXRpb24vIzgyLWZpbGUtc3BkeC1pZGVudGlmaWVyLWZpZWxkCiAgIG9wdGlvbmFsIHN0cmluZyBlbGVtZW50X2lkID0gMzsKK30KKworLy8gSWRlbnRpZmllciBmb3IgYSB0aGlyZC1wYXJ0eSBwYWNrYWdlLgorLy8gU2VlIGdvL3RwLW1ldGFkYXRhLWlkLgorbWVzc2FnZSBJZGVudGlmaWVyIHsKKyAgLy8gVGhlIHR5cGUgb2YgdGhlIGlkZW50aWZpZXIuIEVpdGhlciBhbiAiZWNvc3lzdGVtIiB2YWx1ZSBmcm9tCisgIC8vIGh0dHBzOi8vb3NzZi5naXRodWIuaW8vb3N2LXNjaGVtYS8jYWZmZWN0ZWRwYWNrYWdlLWZpZWxkIHN1Y2ggYXMgIkdvIiwKKyAgLy8gIm5wbSIgb3IgIlB5UEkiLiBUaGUgInZhbHVlIiBhbmQgInZlcnNpb24iIGZpZWxkcyBmb2xsb3cgdGhlIHNhbWUgcnVsZXMgYXMKKyAgLy8gZGVmaW5lZCBpbiB0aGUgT1NWIHNwZWMuCisKKyAgLy8gT3Igb25lIG9mOgorICAvLyAgLSAiR2l0IjogVGhlICJ2YWx1ZSIgZmllbGQgaXMgdGhlIFVSTCBvZiB0aGUgdXBzdHJlYW0gZ2l0IHJlcG9zaXRvcnkgdGhpcworICAvLyAgcGFja2FnZSBpcyByZXRyaWV2ZWQgZnJvbS4KKyAgLy8gIEZvciBleGFtcGxlOgorICAvLyAgIC0gaHR0cHM6Ly9naXRodWIuY29tL2dpdC9naXQKKyAgLy8gICAtIGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vZ2l0L2dpdAorICAvLworICAvLyAgVXNlIG9mIGEgZ2l0IFVSTCByZXF1aXJlcyB0aGF0IHRoZSBwYWNrYWdlICJ2ZXJzaW9uIiB2YWx1ZSBtdXN0IHNwZWNpZnkgYQorICAvLyAgc3BlY2lmaWMgZ2l0IHRhZyBvciByZXZpc2lvbi4gVGhpcyBtdXN0IG5vdCBiZSBhIGJyYW5jaCBuYW1lLgorICAvLworICAvLyAgLSAiU1ZOIjogVGhlICJ2YWx1ZSIgZmllbGQgaXMgdGhlIFVSTCBvZiB0aGUgdXBzdHJlYW0gU1ZOIHJlcG9zaXRvcnkgdGhpcworICAvLyAgcGFja2FnZSBpcyByZXRyaWV2ZWQgZnJvbS4KKyAgLy8gIEZvciBleGFtcGxlOgorICAvLyAgIC0gaHR0cDovL2xsdm0ub3JnL3N2bi9sbHZtLXByb2plY3QvbGx2bS8KKyAgLy8KKyAgLy8gIFVzZSBvZiBhbiBTVk4gVVJMIHJlcXVpcmVzIHRoYXQgdGhlIHBhY2thZ2UgInZlcnNpb24iIHZhbHVlIG11c3Qgc3BlY2lmeQorICAvLyAgYSBzcGVjaWZpYyBTVk4gdGFnIG9yIHJldmlzaW9uLiBUaGlzIG11c3Qgbm90IGJlIGEgYnJhbmNoIG5hbWUuCisgIC8vCisgIC8vICAtICJIZyI6IFRoZSAidmFsdWUiIGZpZWxkIGlzIHRoZSBVUkwgb2YgdGhlIHVwc3RyZWFtIG1lcmN1cmlhbCByZXBvc2l0b3J5CisgIC8vICB0aGlzIHBhY2thZ2UgaXMgcmV0cmlldmVkIGZyb20uCisgIC8vICBGb3IgZXhhbXBsZToKKyAgLy8gICAtIGh0dHBzOi8vbWVyY3VyaWFsLXNjbS5vcmcvcmVwby9ldm9sdmUKKyAgLy8KKyAgLy8gIFVzZSBvZiBhIG1lcmN1cmlhbCBVUkwgcmVxdWlyZXMgdGhhdCB0aGUgcGFja2FnZSAidmVyc2lvbiIgdmFsdWUgbXVzdAorICAvLyAgc3BlY2lmeSBhIHNwZWNpZmljIHRhZyBvciByZXZpc2lvbi4gVGhpcyBtdXN0IG5vdCBiZSBhIGJyYW5jaCBuYW1lLgorICAvLworICAvLyAgLSAiRGFyY3MiOiB0aGUgInZhbHVlIiBmaWVsZCBpcyB0aGUgVVJMIG9mIHRoZSB1cHN0cmVhbSBkYXJjcyByZXBvc2l0b3J5CisgIC8vICB0aGlzIHBhY2thZ2UgaXMgcmV0cmlldmVkIGZyb20uCisgIC8vICBGb3IgZXhhbXBsZToKKyAgLy8gICAtIGh0dHBzOi8vaHViLmRhcmNzLm5ldC9odS5kd2ltL2h1LmR3aW0udXRpbAorICAvLworICAvLyAgVXNlIG9mIGEgRGFyY3MgVVJMIHJlcXVpcmVzIHRoYXQgdGhlIHBhY2thZ2UgInZlcnNpb24iIHZhbHVlIG11c3QKKyAgLy8gIHNwZWNpZnkgYSBzcGVjaWZpYyB0YWcgb3IgcmV2aXNpb24uIFRoaXMgbXVzdCBub3QgYmUgYSBicmFuY2ggbmFtZS4KKyAgLy8KKyAgLy8gIC0gIlBpcGVyIjogVGhlICJ2YWx1ZSIgZmllbGQgaXMgdGhlIFVSTCBvZiB0aGUgdXBzdHJlYW0gcGlwZXIgbG9jYXRpb24uCisgIC8vICBUaGlzIGlzIHByaW1hcmlseSB1c2VkIHdoZW4gYSBwYWNrYWdlIGlzIGJlaW5nIG1pZ3JhdGVkIGludG8gdGhpcmRfcGFydHkKKyAgLy8gIGZyb20gZWxzZXdoZXJlIGluIFBpcGVyLCBvciB3aGVuIGEgcGFja2FnZSBpcyBiZWluZyBuZXdseSBkZXZlbG9wZWQgaW4KKyAgLy8gIHRoaXJkX3BhcnR5LgorICAvLworICAvLyAgLSAiVkNTIjogVGhpcyBpcyBhIGdlbmVyaWMgZmFsbGJhY2sgZm9yIGFuIHVubGlzdGVkIFZDUyBzeXN0ZW0uIFRoZQorICAvLyAidmFsdWUiIGZpZWxkIGlzIHRoZSBVUkwgb2YgdGhlIHJlcG9zaXRvcnkgZm9yIHRoaXMgVkNTLgorICAvLworICAvLyAgLSAiQXJjaGl2ZSI6IFRoZSAidmFsdWUiIGZpZWxkIGlzIHRoZSBVUkwgb2YgdGhlIGFyY2hpdmUgY29udGFpbmluZyB0aGUKKyAgLy8gIHNvdXJjZSBjb2RlIGZvciB0aGUgcGFja2FnZSwgZm9yIGV4YW1wbGUgYSB6aXAgb3IgdGd6IGZpbGUuCisgIC8vCisgIC8vICAtICJQcmVidWlsdEJ5QWxwaGFiZXQiOiBUaGlzIHR5cGUgc2hvdWxkIGJlIHVzZWQgZm9yIGFyY2hpdmVzIG9mIHByaW1hcmlseQorICAvLyAgR29vZ2xlLW93bmVkIHNvdXJjZSBjb2RlIChtYXkgY29udGFpbiBub24tR29vZ2xlLW93bmVkIGRlcGVuZGVuY2llcyksCisgIC8vICB3aGljaCBoYXMgYmVlbiBidWlsdCB1c2luZyBwcm9kdWN0aW9uIEdvb2dsZSBpbmZyYXN0cnVjdHVyZSwgYW5kIGNvcGllZAorICAvLyAgaW50byBBbmRyb2lkLiBUaGUgInZhbHVlIiBmaWVsZCBpcyB0aGUgVVJMIG9mIHRoZSBwcmVidWlsdCBhcnRpZmFjdCBvcgorICAvLyAgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIGFydGlmYWN0IHRvIHRoZSByb290IG9mIGEgcGFja2FnZS4KKyAgLy8gIEV4YW1wbGU6CisgIC8vICAgIGlkZW50aWZpZXIgeworICAvLyAgICAgIHR5cGU6ICJQcmVidWlsdEJ5QWxwaGFiZXQiLAorICAvLyAgICAgIHZlcnNpb246ICIxIiwKKyAgLy8gICAgICB2YWx1ZTogInYxL2FybTg0X2hkcGkuYXBrIiwKKyAgLy8gICAgfQorICAvLyAgICBpZGVudGlmaWVyIHsKKyAgLy8gICAgICB0eXBlOiAiUHJlYnVpbHRCeUFscGhhYmV0IiwKKyAgLy8gICAgICB2ZXJzaW9uOiAiMiIsCisgIC8vICAgICAgdmFsdWU6ICJ2Mi94ODZfNjRfeGhkcGkuYXBrIiwKKyAgLy8gICAgfQorICAvLworICAvLyAgLSAiTG9jYWxTb3VyY2UiOiBUaGUgInZhbHVlIiBmaWVsZCBpcyB0aGUgVVJMIGlkZW50aWZ5aW5nIHdoZXJlIHRoZSBsb2NhbAorICAvLyAgY29weSBvZiB0aGUgcGFja2FnZSBzb3VyY2UgY29kZSBjYW4gYmUgZm91bmQuCisgIC8vICBFeGFtcGxlczoKKyAgLy8gICAtIGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2V4dGVybmFsL2FwYWNoZS1odHRwLworICAvLworICAvLyAgVHlwaWNhbGx5LCB0aGUgbWV0YWRhdGEgZmlsZXMgZGVzY3JpYmluZyBhIHBhY2thZ2UgcmVzaWRlIGluIHRoZSBzYW1lCisgIC8vICBkaXJlY3RvcnkgYXMgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgcGFja2FnZS4gSW4gYSBmZXcgcmFyZSBjYXNlcyB3aGVyZQorICAvLyAgdGhleSBhcmUgc2VwYXJhdGUsIHRoZSBMb2NhbFNvdXJjZSBVUkwgaWRlbnRpZmllcyB3aGVyZSB0byBmaW5kIHRoZQorICAvLyAgc291cmNlIGNvZGUuIFRoaXMgb25seSBkZXNjcmliZXMgd2hlcmUgdG8gZmluZCB0aGUgbG9jYWwgY29weSBvZiB0aGUKKyAgLy8gIHNvdXJjZTsgdGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBhbiBhZGRpdGlvbmFsIFVSTCBkZXNjcmliaW5nIHdoZXJlIHRoZQorICAvLyAgcGFja2FnZSB3YXMgcmV0cmlldmVkIGZyb20uCisgIC8vCisgIC8vICAtICJPdGhlciI6IEFuIGlkZW50aWZpZXIgdGhhdCBkb2VzIG5vdCBmaXQgYW55IG90aGVyIHR5cGUuIFRoaXMgbWF5IGFsc28KKyAgLy8gIGluZGljYXRlIHRoYXQgdGhlIFNvdXJjZSBjb2RlIHdhcyByZWNlaXZlZCB2aWEgZW1haWwgb3Igc29tZSBvdGhlcgorICAvLyAgb3V0LW9mLWJhbmQgd2F5LiBUaGlzIGlzIG1vc3QgY29tbW9ubHkgdXNlZCB3aXRoIGNvbW1lcmNpYWwgc29mdHdhcmUKKyAgLy8gIHJlY2VpdmVkIGRpcmVjdGx5IGZyb20gdGhlIFZlbmRvci4gSW4gdGhlIGNhc2Ugb2YgZW1haWwsIHRoZSAidmFsdWUiIGZpZWxkCisgIC8vICBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgaG93IGl0IHdhcyByZWNlaXZlZC4KKyAgb3B0aW9uYWwgc3RyaW5nIHR5cGUgPSAxOworCisgIC8vIEEgaHVtYW4gcmVhZGFibGUgc3RyaW5nIHRvIGluZGljYXRlIHdoeSBhIHRoaXJkLXBhY2thZ2UgcGFja2FnZSBkb2VzIG5vdAorICAvLyBoYXZlIHRoaXMgaWRlbnRpZmllciB0eXBlIHNldC4KKyAgLy8gRXhhbXBsZToKKyAgLy8gICBpZGVudGlmaWVyIHsKKyAgLy8gICAgIHR5cGU6ICJQeVBJIgorICAvLyAgICAgb21pc3Npb25fcmVhc29uOiAiT25seSBvbiBHaXQuIE5vdCBwdWJsaXNoZWQgdG8gUHlQSS4iCisgIC8vICAgfQorICBvcHRpb25hbCBzdHJpbmcgb21pc3Npb25fcmVhc29uID0gMjsKKworICAvLyBUaGUgdmFsdWUgb2YgdGhlIHBhY2thZ2UgaWRlbnRpZmllciBhcyBkZWZpbmVkIGJ5IHRoZSAidHlwZSIuCisgIC8vIEV4YW1wbGU6CisgIC8vICBpZGVudGlmaWVyIHsKKyAgLy8gICAgdHlwZTogIlB5UEkiCisgIC8vICAgIHZhbHVlOiAiZGphbmdvIgorICAvLyAgICB2ZXJzaW9uOiAiMy4yLjgiCisgIC8vICB9CisgIG9wdGlvbmFsIHN0cmluZyB2YWx1ZSA9IDM7CisKKyAgLy8gVGhlIHZlcnNpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFja2FnZSBhcyBkZWZpbmVkIGJ5IHRoZSAidHlwZSIuCisgIC8vIEV4YW1wbGU6CisgIC8vICBpZGVudGlmaWVyIHsKKyAgLy8gICAgdHlwZTogIlB5UEkiCisgIC8vICAgIHZhbHVlOiAiZGphbmdvIgorICAvLyAgICB2ZXJzaW9uOiAiMy4yLjgiCisgIC8vICB9CisgIG9wdGlvbmFsIHN0cmluZyB2ZXJzaW9uID0gNDsKKworICAvLyBUaGUgY2xvc2VzdCB2ZXJzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhY2thZ2UgYXMgZGVmaW5lZCBieSB0aGUgInR5cGUiLgorICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIHNldCBieSBhdXRvbWF0ZWQgaW5mcmFzdHJ1Y3R1cmUgYnkgYXBwbHlpbmcgYXV0b21hdGVkCisgIC8vIGhldXJpc3RpY3MsIHN1Y2ggYXMgdGhlIGNsb3Nlc3QgZ2l0IHRhZyBvciBwYWNrYWdlIHZlcnNpb24gZnJvbSBhIHBhY2thZ2UKKyAgLy8gbWFuaWZlc3QgZmlsZSAoZS5nLiBwb20ueG1sKS4KKyAgLy8KKyAgLy8gRm9yIG1vc3QgaWRlbnRpZmllciB0eXBlcywgb25seSBvbmUgb2YgYHZlcnNpb25gIG9yIGBjbG9zZXN0X3ZlcnNpb25gCisgIC8vIHNob3VsZCBiZSBzZXQgKG5vdCBib3RoKS4gVGhlIGV4Y2VwdGlvbiBpcyBzb3VyY2UgcmVwb3NpdG9yeSB0eXBlcyBzdWNoIGFzCisgIC8vICJHaXQiLCB3aGVyZSBgdmVyc2lvbmAgd2lsbCByZWZlciB0byBhIGdpdCBjb21taXQsIGFuZCBgY2xvc2VzdF92ZXJzaW9uYAorICAvLyByZWZlcnMgdG8gYSBnaXQgdGFnLgorICAvLyBFeGFtcGxlOgorICAvLyAgaWRlbnRpZmllciB7CisgIC8vICAgIHR5cGU6ICJHaXQiLAorICAvLyAgICB2YWx1ZTogImh0dHBzOi8vZ2l0aHViLmNvbS9teS9yZXBvIgorICAvLyAgICB2ZXJzaW9uOiAiZTVmYTQ0ZjJiMzFjMWZiNTUzYjYwMjFlNzM2MGQwN2Q1ZDkxZmY1ZSIKKyAgLy8gICAgY2xvc2VzdF92ZXJzaW9uOiAidjEuNCIKKyAgLy8gIH0KKyAgb3B0aW9uYWwgc3RyaW5nIGNsb3Nlc3RfdmVyc2lvbiA9IDU7CisKKyAgLy8gV2hlbiBgdHJ1ZWAsIHRoaXMgSWRlbnRpZmllciByZXByZXNlbnRzIHRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIHRoZSBzb3VyY2UKKyAgLy8gY29kZSBmb3IgdGhpcyBwYWNrYWdlIHdhcyBvcmlnaW5hbGx5IG9idGFpbmVkLiBUaGlzIHNob3VsZCBvbmx5IGJlIHNldCBmb3IKKyAgLy8gKm9uZSogSWRlbnRpZmllciBpbiBhIHRoaXJkX3BhcnR5IHBhY2thZ2UncyBNRVRBREFUQS4KKworICAvLyBGb3IgZXh0ZXJuYWwgcGFja2FnZXMsIHRoaXMgaXMgdHlwaWNhbGx5IGZvciB0aGUgSWRlbnRpZmllciBhc3NvY2lhdGVkCisgIC8vIHdpdGggdGhlIHZlcnNpb24gY29udHJvbCBzeXN0ZW0gb3IgcGFja2FnZSBtYW5hZ2VyIHRoYXQgd2FzIHVzZWQgdG8KKyAgLy8gY2hlY2sgb3V0IG9yIGRvd25sb2FkIHRoZSBjb2RlLgorICBvcHRpb25hbCBib29sIHByaW1hcnlfc291cmNlID0gNjsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9yYmNydW4vQW5kcm9pZC5icCBiL3Rvb2xzL3JiY3J1bi9BbmRyb2lkLmJwCmluZGV4IGZjYzMzZWYuLjRmYWI4NTggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JiY3J1bi9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL3JiY3J1bi9BbmRyb2lkLmJwCkBAIC0zNCw2ICszNCw3IEBACiAgICAgcGtnUGF0aDogInJiY3J1biIsCiAgICAgZGVwczogWwogICAgICAgICAiZ28tc3Rhcmxhcmstc3RhcmxhcmsiLAorICAgICAgICAiZ28tc3Rhcmxhcmstc3Rhcmxhcmtqc29uIiwKICAgICAgICAgImdvLXN0YXJsYXJrLXN0YXJsYXJrc3RydWN0IiwKICAgICAgICAgImdvLXN0YXJsYXJrLXN0YXJsYXJrdGVzdCIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL3Rvb2xzL3JiY3J1bi9nby5tb2QgYi90b29scy9yYmNydW4vZ28ubW9kCmluZGV4IDVhZTI5NzIuLjZlOTljZTkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JiY3J1bi9nby5tb2QKKysrIGIvdG9vbHMvcmJjcnVuL2dvLm1vZApAQCAtNCw0ICs0LDQgQEAKIAogcmVwbGFjZSBnby5zdGFybGFyay5uZXQgPT4gLi4vLi4vLi4vLi4vZXh0ZXJuYWwvc3RhcmxhcmstZ28KIAotZ28gMS4xNQorZ28gMS4yMQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmJjcnVuL2hvc3QuZ28gYi90b29scy9yYmNydW4vaG9zdC5nbwppbmRleCAzMmFmYTQ1Li44Y2QyODQ1IDEwMDY0NAotLS0gYS90b29scy9yYmNydW4vaG9zdC5nbworKysgYi90b29scy9yYmNydW4vaG9zdC5nbwpAQCAtMjcsMTAgKzI3LDE2IEBACiAJImdvLnN0YXJsYXJrLm5ldC9zdGFybGFya3N0cnVjdCIKICkKIAotY29uc3QgY2FsbGVyRGlyS2V5ID0gImNhbGxlckRpciIKK3R5cGUgRXhlY3V0aW9uTW9kZSBpbnQKK2NvbnN0ICgKKwlFeGVjdXRpb25Nb2RlUmJjIEV4ZWN1dGlvbk1vZGUgPSBpb3RhCisJRXhlY3V0aW9uTW9kZVNjbCBFeGVjdXRpb25Nb2RlID0gaW90YQorKQogCi12YXIgTG9hZFBhdGhSb290ID0gIi4iCi12YXIgc2hlbGxQYXRoIHN0cmluZworY29uc3QgYWxsb3dFeHRlcm5hbEVudHJ5cG9pbnRLZXkgPSAiYWxsb3dFeHRlcm5hbEVudHJ5cG9pbnQiCitjb25zdCBjYWxsaW5nRmlsZUtleSA9ICJjYWxsaW5nRmlsZSIKK2NvbnN0IGV4ZWN1dGlvbk1vZGVLZXkgPSAiZXhlY3V0aW9uTW9kZSIKK2NvbnN0IHNoZWxsS2V5ID0gInNoZWxsIgogCiB0eXBlIG1vZGVudHJ5IHN0cnVjdCB7CiAJZ2xvYmFscyBzdGFybGFyay5TdHJpbmdEaWN0CkBAIC0zOSwzNiArNDUsOTcgQEAKIAogdmFyIG1vZHVsZUNhY2hlID0gbWFrZShtYXBbc3RyaW5nXSptb2RlbnRyeSkKIAotdmFyIGJ1aWx0aW5zIHN0YXJsYXJrLlN0cmluZ0RpY3QKK3ZhciByYmNCdWlsdGlucyBzdGFybGFyay5TdHJpbmdEaWN0ID0gc3RhcmxhcmsuU3RyaW5nRGljdHsKKwkic3RydWN0IjogICBzdGFybGFyay5OZXdCdWlsdGluKCJzdHJ1Y3QiLCBzdGFybGFya3N0cnVjdC5NYWtlKSwKKwkvLyBUbyBjb252ZXJ0IGZpbmQtY29weS1zdWJkaXIgYW5kIHByb2R1Y3QtY29weS1maWxlcy1ieSBwYXR0ZXJuCisJInJibGZfZmluZF9maWxlcyI6IHN0YXJsYXJrLk5ld0J1aWx0aW4oInJibGZfZmluZF9maWxlcyIsIGZpbmQpLAorCS8vIFRvIGNvbnZlcnQgbWFrZWZpbGUncyAkKHNoZWxsIGNtZCkKKwkicmJsZl9zaGVsbCI6IHN0YXJsYXJrLk5ld0J1aWx0aW4oInJibGZfc2hlbGwiLCBzaGVsbCksCisJLy8gT3V0cHV0IHRvIHN0ZGVycgorCSJyYmxmX2xvZyI6IHN0YXJsYXJrLk5ld0J1aWx0aW4oInJibGZfbG9nIiwgbG9nKSwKKwkvLyBUbyBjb252ZXJ0IG1ha2VmaWxlJ3MgJCh3aWxkY2FyZCBmb28qKQorCSJyYmxmX3dpbGRjYXJkIjogc3RhcmxhcmsuTmV3QnVpbHRpbigicmJsZl93aWxkY2FyZCIsIHdpbGRjYXJkKSwKK30KIAotZnVuYyBtb2R1bGVOYW1lMkFic1BhdGgobW9kdWxlTmFtZSBzdHJpbmcsIGNhbGxlckRpciBzdHJpbmcpIChzdHJpbmcsIGVycm9yKSB7Ci0JcGF0aCA6PSBtb2R1bGVOYW1lCi0JaWYgaXggOj0gc3RyaW5ncy5MYXN0SW5kZXgocGF0aCwgIjoiKTsgaXggPj0gMCB7Ci0JCXBhdGggPSBwYXRoWzA6aXhdICsgc3RyaW5nKG9zLlBhdGhTZXBhcmF0b3IpICsgcGF0aFtpeCsxOl0KLQl9Ci0JaWYgc3RyaW5ncy5IYXNQcmVmaXgocGF0aCwgIi8vIikgewotCQlyZXR1cm4gZmlsZXBhdGguQWJzKGZpbGVwYXRoLkpvaW4oTG9hZFBhdGhSb290LCBwYXRoWzI6XSkpCi0JfSBlbHNlIGlmIHN0cmluZ3MuSGFzUHJlZml4KG1vZHVsZU5hbWUsICI6IikgewotCQlyZXR1cm4gZmlsZXBhdGguQWJzKGZpbGVwYXRoLkpvaW4oY2FsbGVyRGlyLCBwYXRoWzE6XSkpCit2YXIgc2NsQnVpbHRpbnMgc3RhcmxhcmsuU3RyaW5nRGljdCA9IHN0YXJsYXJrLlN0cmluZ0RpY3R7CisJInN0cnVjdCI6ICAgc3RhcmxhcmsuTmV3QnVpbHRpbigic3RydWN0Iiwgc3RhcmxhcmtzdHJ1Y3QuTWFrZSksCit9CisKK2Z1bmMgaXNTeW1saW5rKGZpbGVwYXRoIHN0cmluZykgKGJvb2wsIGVycm9yKSB7CisJaWYgaW5mbywgZXJyIDo9IG9zLkxzdGF0KGZpbGVwYXRoKTsgZXJyID09IG5pbCB7CisJCXJldHVybiBpbmZvLk1vZGUoKSAmIG9zLk1vZGVTeW1saW5rICE9IDAsIG5pbAogCX0gZWxzZSB7Ci0JCXJldHVybiBmaWxlcGF0aC5BYnMocGF0aCkKKwkJcmV0dXJuIGZhbHNlLCBlcnIKIAl9CiB9CiAKKy8vIFRha2VzIGEgbW9kdWxlIG5hbWUgKHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgbG9hZCgpIGZ1bmN0aW9uKSBhbmQgcmV0dXJucyB0aGUgcGF0aAorLy8gaXQncyB0cnlpbmcgdG8gbG9hZCwgc3RyaXBwaW5nIG91dCBsZWFkaW5nIC8vLCBhbmQgaGFuZGxpbmcgbGVhZGluZyA6cy4KK2Z1bmMgY2xlYW5Nb2R1bGVOYW1lKG1vZHVsZU5hbWUgc3RyaW5nLCBjYWxsZXJEaXIgc3RyaW5nLCBhbGxvd0V4dGVybmFsUGF0aHMgYm9vbCkgKHN0cmluZywgZXJyb3IpIHsKKwlpZiBzdHJpbmdzLkNvdW50KG1vZHVsZU5hbWUsICI6IikgPiAxIHsKKwkJcmV0dXJuICIiLCBmbXQuRXJyb3JmKCJhdCBtb3N0IDEgY29sb24gbXVzdCBiZSBwcmVzZW50IGluIHN0YXJsYXJrIHBhdGg6ICVzIiwgbW9kdWxlTmFtZSkKKwl9CisKKwkvLyBXZSBkb24ndCBoYXZlIGZ1bGwgc3VwcG9ydCBmb3IgZXh0ZXJuYWwgcmVwb3NpdG9yaWVzLCBidXQgYXQgbGVhc3Qgc3VwcG9ydCBza3lsaWIncyBkaWN0cy4KKwlpZiBtb2R1bGVOYW1lID09ICJAYmF6ZWxfc2t5bGliLy9saWI6ZGljdHMuYnpsIiB7CisJCXJldHVybiAiZXh0ZXJuYWwvYmF6ZWwtc2t5bGliL2xpYi9kaWN0cy5iemwiLCBuaWwKKwl9CisKKwlsb2NhbExvYWQgOj0gZmFsc2UKKwlpZiBzdHJpbmdzLkhhc1ByZWZpeChtb2R1bGVOYW1lLCAiQC8vIikgeworCQltb2R1bGVOYW1lID0gbW9kdWxlTmFtZVszOl0KKwl9IGVsc2UgaWYgc3RyaW5ncy5IYXNQcmVmaXgobW9kdWxlTmFtZSwgIi8vIikgeworCQltb2R1bGVOYW1lID0gbW9kdWxlTmFtZVsyOl0KKwl9IGVsc2UgaWYgc3RyaW5ncy5IYXNQcmVmaXgobW9kdWxlTmFtZSwgIjoiKSB7CisJCW1vZHVsZU5hbWUgPSBtb2R1bGVOYW1lWzE6XQorCQlsb2NhbExvYWQgPSB0cnVlCisJfSBlbHNlIGlmICFhbGxvd0V4dGVybmFsUGF0aHMgeworCQlyZXR1cm4gIiIsIGZtdC5FcnJvcmYoImxvYWQgcGF0aCBtdXN0IHN0YXJ0IHdpdGggLy8gb3IgOiIpCisJfQorCisJaWYgaXggOj0gc3RyaW5ncy5MYXN0SW5kZXgobW9kdWxlTmFtZSwgIjoiKTsgaXggPj0gMCB7CisJCW1vZHVsZU5hbWUgPSBtb2R1bGVOYW1lWzppeF0gKyBzdHJpbmcob3MuUGF0aFNlcGFyYXRvcikgKyBtb2R1bGVOYW1lW2l4KzE6XQorCX0KKworCWlmIGZpbGVwYXRoLkNsZWFuKG1vZHVsZU5hbWUpICE9IG1vZHVsZU5hbWUgeworCQlyZXR1cm4gIiIsIGZtdC5FcnJvcmYoImxvYWQgcGF0aCBtdXN0IGJlIGNsZWFuLCBmb3VuZDogJXMsIGV4cGVjdGVkOiAlcyIsIG1vZHVsZU5hbWUsIGZpbGVwYXRoLkNsZWFuKG1vZHVsZU5hbWUpKQorCX0KKwlpZiAhYWxsb3dFeHRlcm5hbFBhdGhzIHsKKwkJaWYgc3RyaW5ncy5IYXNQcmVmaXgobW9kdWxlTmFtZSwgIi4uLyIpIHsKKwkJCXJldHVybiAiIiwgZm10LkVycm9yZigibG9hZCBwYXRoIG11c3Qgbm90IHN0YXJ0IHdpdGggLi4vOiAlcyIsIG1vZHVsZU5hbWUpCisJCX0KKwkJaWYgc3RyaW5ncy5IYXNQcmVmaXgobW9kdWxlTmFtZSwgIi8iKSB7CisJCQlyZXR1cm4gIiIsIGZtdC5FcnJvcmYoImxvYWQgcGF0aCBzdGFydHMgd2l0aCAvLCB1c2UgLy8gZm9yIGEgYWJzb2x1dGUgcGF0aDogJXMiLCBtb2R1bGVOYW1lKQorCQl9CisJfQorCisJaWYgbG9jYWxMb2FkIHsKKwkJcmV0dXJuIGZpbGVwYXRoLkpvaW4oY2FsbGVyRGlyLCBtb2R1bGVOYW1lKSwgbmlsCisJfQorCisJcmV0dXJuIG1vZHVsZU5hbWUsIG5pbAorfQorCiAvLyBsb2FkZXIgaW1wbGVtZW50cyBsb2FkIHN0YXRlbWVudC4gVGhlIGZvcm1hdCBvZiB0aGUgbG9hZGVkIG1vZHVsZSBVUkkgaXMKIC8vICBbLy9wYXRoXTpiYXNlW3xzeW1ib2xdCiAvLyBUaGUgZmlsZSBwYXRoIGlzICRST09UL3BhdGgvYmFzZSBpZiBwYXRoIGlzIHByZXNlbnQsIDxjYWxsZXJfZGlyPi9iYXNlIG90aGVyd2lzZS4KIC8vIFRoZSBwcmVzZW5jZSBvZiBgfHN5bWJvbGAgaW5kaWNhdGVzIHRoYXQgdGhlIGxvYWRlciBzaG91bGQgcmV0dXJuIGEgc2luZ2xlICdzeW1ib2wnCiAvLyBib3VuZCB0byBOb25lIGlmIGZpbGUgaXMgbWlzc2luZy4KIGZ1bmMgbG9hZGVyKHRocmVhZCAqc3RhcmxhcmsuVGhyZWFkLCBtb2R1bGUgc3RyaW5nKSAoc3RhcmxhcmsuU3RyaW5nRGljdCwgZXJyb3IpIHsKLQlwaXBlUG9zIDo9IHN0cmluZ3MuTGFzdEluZGV4KG1vZHVsZSwgInwiKQotCW11c3RMb2FkIDo9IHBpcGVQb3MgPCAwCisJbW9kZSA6PSB0aHJlYWQuTG9jYWwoZXhlY3V0aW9uTW9kZUtleSkuKEV4ZWN1dGlvbk1vZGUpCisJYWxsb3dFeHRlcm5hbEVudHJ5cG9pbnQgOj0gdGhyZWFkLkxvY2FsKGFsbG93RXh0ZXJuYWxFbnRyeXBvaW50S2V5KS4oYm9vbCkKIAl2YXIgZGVmYXVsdFN5bWJvbCBzdHJpbmcKLQlpZiAhbXVzdExvYWQgewotCQlkZWZhdWx0U3ltYm9sID0gbW9kdWxlW3BpcGVQb3MrMTpdCi0JCW1vZHVsZSA9IG1vZHVsZVs6cGlwZVBvc10KKwltdXN0TG9hZCA6PSB0cnVlCisJaWYgbW9kZSA9PSBFeGVjdXRpb25Nb2RlUmJjIHsKKwkJcGlwZVBvcyA6PSBzdHJpbmdzLkxhc3RJbmRleChtb2R1bGUsICJ8IikKKwkJaWYgcGlwZVBvcyA+PSAwIHsKKwkJCW11c3RMb2FkID0gZmFsc2UKKwkJCWRlZmF1bHRTeW1ib2wgPSBtb2R1bGVbcGlwZVBvcysxOl0KKwkJCW1vZHVsZSA9IG1vZHVsZVs6cGlwZVBvc10KKwkJfQogCX0KLQltb2R1bGVQYXRoLCBlcnIgOj0gbW9kdWxlTmFtZTJBYnNQYXRoKG1vZHVsZSwgdGhyZWFkLkxvY2FsKGNhbGxlckRpcktleSkuKHN0cmluZykpCisJY2FsbGluZ0ZpbGUgOj0gdGhyZWFkLkxvY2FsKGNhbGxpbmdGaWxlS2V5KS4oc3RyaW5nKQorCW1vZHVsZVBhdGgsIGVyciA6PSBjbGVhbk1vZHVsZU5hbWUobW9kdWxlLCBmaWxlcGF0aC5EaXIoY2FsbGluZ0ZpbGUpLCBhbGxvd0V4dGVybmFsRW50cnlwb2ludCkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuIG5pbCwgZXJyCiAJfQpAQCAtOTAsNiArMTU3LDIwIEBACiAKIAkJLy8gTG9hZCBvciByZXR1cm4gZGVmYXVsdAogCQlpZiBtdXN0TG9hZCB7CisJCQlpZiBzdHJpbmdzLkhhc1N1ZmZpeChjYWxsaW5nRmlsZSwgIi5zY2wiKSAmJiAhc3RyaW5ncy5IYXNTdWZmaXgobW9kdWxlUGF0aCwgIi5zY2wiKSB7CisJCQkJcmV0dXJuIG5pbCwgZm10LkVycm9yZigiLnNjbCBmaWxlcyBjYW4gb25seSBsb2FkIG90aGVyIC5zY2wgZmlsZXM6ICVxIGxvYWRzICVxIiwgY2FsbGluZ0ZpbGUsIG1vZHVsZVBhdGgpCisJCQl9CisJCQkvLyBTd2l0Y2ggaW50byBzY2wgbW9kZSBmcm9tIGhlcmUgb24KKwkJCWlmIHN0cmluZ3MuSGFzU3VmZml4KG1vZHVsZVBhdGgsICIuc2NsIikgeworCQkJCW1vZGUgPSBFeGVjdXRpb25Nb2RlU2NsCisJCQl9CisKKwkJCWlmIHN5bSwgZXJyIDo9IGlzU3ltbGluayhtb2R1bGVQYXRoKTsgc3ltICYmIGVyciA9PSBuaWwgeworCQkJCXJldHVybiBuaWwsIGZtdC5FcnJvcmYoInN5bWxpbmtzIHRvIHN0YXJsYXJrIGZpbGVzIGFyZSBub3QgYWxsb3dlZC4gSW5zdGVhZCwgbG9hZCB0aGUgdGFyZ2V0IGZpbGUgYW5kIHJlLWV4cG9ydCBpdHMgc3ltYm9sczogJXMiLCBtb2R1bGVQYXRoKQorCQkJfSBlbHNlIGlmIGVyciAhPSBuaWwgeworCQkJCXJldHVybiBuaWwsIGVycgorCQkJfQorCiAJCQljaGlsZFRocmVhZCA6PSAmc3RhcmxhcmsuVGhyZWFke05hbWU6ICJleGVjICIgKyBtb2R1bGUsIExvYWQ6IHRocmVhZC5Mb2FkfQogCQkJLy8gQ2hlYXRpbmcgZm9yIHRoZSBzYWtlIG9mIHRlc3Rpbmc6CiAJCQkvLyBwcm9wYWdhdGUgc3Rhcmxhcmt0ZXN0J3MgUmVwb3J0ZXIga2V5LCBvdGhlcndpc2UgdGVzdGluZwpAQCAtOTksOSArMTgwLDIwIEBACiAJCQkJY2hpbGRUaHJlYWQuU2V0TG9jYWwodGVzdFJlcG9ydGVyS2V5LCB2KQogCQkJfQogCi0JCQljaGlsZFRocmVhZC5TZXRMb2NhbChjYWxsZXJEaXJLZXksIGZpbGVwYXRoLkRpcihtb2R1bGVQYXRoKSkKLQkJCWdsb2JhbHMsIGVyciA6PSBzdGFybGFyay5FeGVjRmlsZShjaGlsZFRocmVhZCwgbW9kdWxlUGF0aCwgbmlsLCBidWlsdGlucykKLQkJCWUgPSAmbW9kZW50cnl7Z2xvYmFscywgZXJyfQorCQkJLy8gT25seSB0aGUgZW50cnlwb2ludCBzdGFybGFyayBmaWxlIGFsbG93cyBleHRlcm5hbCBsb2Fkcy4KKwkJCWNoaWxkVGhyZWFkLlNldExvY2FsKGFsbG93RXh0ZXJuYWxFbnRyeXBvaW50S2V5LCBmYWxzZSkKKwkJCWNoaWxkVGhyZWFkLlNldExvY2FsKGNhbGxpbmdGaWxlS2V5LCBtb2R1bGVQYXRoKQorCQkJY2hpbGRUaHJlYWQuU2V0TG9jYWwoZXhlY3V0aW9uTW9kZUtleSwgbW9kZSkKKwkJCWNoaWxkVGhyZWFkLlNldExvY2FsKHNoZWxsS2V5LCB0aHJlYWQuTG9jYWwoc2hlbGxLZXkpKQorCQkJaWYgbW9kZSA9PSBFeGVjdXRpb25Nb2RlUmJjIHsKKwkJCQlnbG9iYWxzLCBlcnIgOj0gc3RhcmxhcmsuRXhlY0ZpbGUoY2hpbGRUaHJlYWQsIG1vZHVsZVBhdGgsIG5pbCwgcmJjQnVpbHRpbnMpCisJCQkJZSA9ICZtb2RlbnRyeXtnbG9iYWxzLCBlcnJ9CisJCQl9IGVsc2UgaWYgbW9kZSA9PSBFeGVjdXRpb25Nb2RlU2NsIHsKKwkJCQlnbG9iYWxzLCBlcnIgOj0gc3RhcmxhcmsuRXhlY0ZpbGUoY2hpbGRUaHJlYWQsIG1vZHVsZVBhdGgsIG5pbCwgc2NsQnVpbHRpbnMpCisJCQkJZSA9ICZtb2RlbnRyeXtnbG9iYWxzLCBlcnJ9CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBuaWwsIGZtdC5FcnJvcmYoInVua25vd24gZXhlY3V0aW9uTW9kZSAlZCIsIG1vZGUpCisJCQl9CiAJCX0gZWxzZSB7CiAJCQllID0gJm1vZGVudHJ5e3N0YXJsYXJrLlN0cmluZ0RpY3R7ZGVmYXVsdFN5bWJvbDogc3RhcmxhcmsuTm9uZX0sIG5pbH0KIAkJfQpAQCAtMTg5LDEyICsyODEsMTMgQEAKIC8vIGl0cyBvdXRwdXQgdGhlIHNhbWUgd2F5IGFzIE1ha2UncyAkKHNoZWxsICkgZnVuY3Rpb24uIFRoZSBlbmQtb2YtbGluZXMKIC8vICgiXG4iIG9yICJcclxuIikgYXJlIHJlcGxhY2VkIHdpdGggIiAiIGluIHRoZSByZXN1bHQsIGFuZCB0aGUgdHJhaWxpbmcKIC8vIGVuZC1vZi1saW5lIGlzIHJlbW92ZWQuCi1mdW5jIHNoZWxsKF8gKnN0YXJsYXJrLlRocmVhZCwgYiAqc3RhcmxhcmsuQnVpbHRpbiwgYXJncyBzdGFybGFyay5UdXBsZSwKK2Z1bmMgc2hlbGwodGhyZWFkICpzdGFybGFyay5UaHJlYWQsIGIgKnN0YXJsYXJrLkJ1aWx0aW4sIGFyZ3Mgc3RhcmxhcmsuVHVwbGUsCiAJa3dhcmdzIFtdc3RhcmxhcmsuVHVwbGUpIChzdGFybGFyay5WYWx1ZSwgZXJyb3IpIHsKIAl2YXIgY29tbWFuZCBzdHJpbmcKIAlpZiBlcnIgOj0gc3RhcmxhcmsuVW5wYWNrUG9zaXRpb25hbEFyZ3MoYi5OYW1lKCksIGFyZ3MsIGt3YXJncywgMSwgJmNvbW1hbmQpOyBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuIHN0YXJsYXJrLk5vbmUsIGVycgogCX0KKwlzaGVsbFBhdGggOj0gdGhyZWFkLkxvY2FsKHNoZWxsS2V5KS4oc3RyaW5nKQogCWlmIHNoZWxsUGF0aCA9PSAiIiB7CiAJCXJldHVybiBzdGFybGFyay5Ob25lLAogCQkJZm10LkVycm9yZigiY2Fubm90IHJ1biBzaGVsbCwgL2Jpbi9zaCBpcyBtaXNzaW5nIChydW5uaW5nIG9uIFdpbmRvd3M/KSIpCkBAIC0yMjMsMTYgKzMxNiw2IEBACiAJcmV0dXJuIHN0YXJsYXJrLk5ld0xpc3QoZWxlbXMpCiB9CiAKLS8vIHByb3BzZXRGcm9tRW52IGNvbnN0cnVjdHMgYSBwcm9wc2V0IGZyb20gdGhlIGFycmF5IG9mIEtFWT12YWx1ZSBzdHJpbmdzCi1mdW5jIHN0cnVjdEZyb21FbnYoZW52IFtdc3RyaW5nKSAqc3RhcmxhcmtzdHJ1Y3QuU3RydWN0IHsKLQlzZCA6PSBtYWtlKG1hcFtzdHJpbmddc3RhcmxhcmsuVmFsdWUsIGxlbihlbnYpKQotCWZvciBfLCB4IDo9IHJhbmdlIGVudiB7Ci0JCWt2IDo9IHN0cmluZ3MuU3BsaXROKHgsICI9IiwgMikKLQkJc2Rba3ZbMF1dID0gc3RhcmxhcmsuU3RyaW5nKGt2WzFdKQotCX0KLQlyZXR1cm4gc3RhcmxhcmtzdHJ1Y3QuRnJvbVN0cmluZ0RpY3Qoc3RhcmxhcmtzdHJ1Y3QuRGVmYXVsdCwgc2QpCi19Ci0KIGZ1bmMgbG9nKHRocmVhZCAqc3RhcmxhcmsuVGhyZWFkLCBmbiAqc3RhcmxhcmsuQnVpbHRpbiwgYXJncyBzdGFybGFyay5UdXBsZSwga3dhcmdzIFtdc3RhcmxhcmsuVHVwbGUpIChzdGFybGFyay5WYWx1ZSwgZXJyb3IpIHsKIAlzZXAgOj0gIiAiCiAJaWYgZXJyIDo9IHN0YXJsYXJrLlVucGFja0FyZ3MoInByaW50IiwgbmlsLCBrd2FyZ3MsICJzZXA/IiwgJnNlcCk7IGVyciAhPSBuaWwgewpAQCAtMjU1LDUwICszMzgsNzkgQEAKIAlyZXR1cm4gc3RhcmxhcmsuTm9uZSwgbmlsCiB9CiAKLWZ1bmMgc2V0dXAoZW52IFtdc3RyaW5nKSB7Ci0JLy8gQ3JlYXRlIHRoZSBzeW1ib2xzIHRoYXQgYWlkIG1ha2VmaWxlIGNvbnZlcnNpb24uIFNlZSBSRUFETUUubWQKLQlidWlsdGlucyA9IHN0YXJsYXJrLlN0cmluZ0RpY3R7Ci0JCSJzdHJ1Y3QiOiAgIHN0YXJsYXJrLk5ld0J1aWx0aW4oInN0cnVjdCIsIHN0YXJsYXJrc3RydWN0Lk1ha2UpLAotCQkicmJsZl9jbGkiOiBzdHJ1Y3RGcm9tRW52KGVudiksCi0JCSJyYmxmX2VudiI6IHN0cnVjdEZyb21FbnYob3MuRW52aXJvbigpKSwKLQkJLy8gVG8gY29udmVydCBmaW5kLWNvcHktc3ViZGlyIGFuZCBwcm9kdWN0LWNvcHktZmlsZXMtYnkgcGF0dGVybgotCQkicmJsZl9maW5kX2ZpbGVzIjogc3RhcmxhcmsuTmV3QnVpbHRpbigicmJsZl9maW5kX2ZpbGVzIiwgZmluZCksCi0JCS8vIFRvIGNvbnZlcnQgbWFrZWZpbGUncyAkKHNoZWxsIGNtZCkKLQkJInJibGZfc2hlbGwiOiBzdGFybGFyay5OZXdCdWlsdGluKCJyYmxmX3NoZWxsIiwgc2hlbGwpLAotCQkvLyBPdXRwdXQgdG8gc3RkZXJyCi0JCSJyYmxmX2xvZyI6IHN0YXJsYXJrLk5ld0J1aWx0aW4oInJibGZfbG9nIiwgbG9nKSwKLQkJLy8gVG8gY29udmVydCBtYWtlZmlsZSdzICQod2lsZGNhcmQgZm9vKikKLQkJInJibGZfd2lsZGNhcmQiOiBzdGFybGFyay5OZXdCdWlsdGluKCJyYmxmX3dpbGRjYXJkIiwgd2lsZGNhcmQpLAotCX0KLQotCS8vIE5PVEUoYXNtdW5kYWspOiBPUy1zcGVjaWZpYy4gQmVoYXZlIHNpbWlsYXIgdG8gTGludXggYHN5c3RlbWAgY2FsbCwKLQkvLyB3aGljaCBhbHdheXMgdXNlcyAvYmluL3NoIHRvIHJ1biB0aGUgY29tbWFuZAotCXNoZWxsUGF0aCA9ICIvYmluL3NoIgotCWlmIF8sIGVyciA6PSBvcy5TdGF0KHNoZWxsUGF0aCk7IGVyciAhPSBuaWwgewotCQlzaGVsbFBhdGggPSAiIgotCX0KLX0KLQogLy8gUGFyc2VzLCByZXNvbHZlcywgYW5kIGV4ZWN1dGVzIGEgU3RhcmxhcmsgZmlsZS4KIC8vIGZpbGVuYW1lIGFuZCBzcmMgcGFyYW1ldGVycyBhcmUgYXMgZm9yIHN0YXJsYXJrLkV4ZWNGaWxlOgogLy8gKiBmaWxlbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBleGVjdXRlLAogLy8gICBhbmQgdGhlIG5hbWUgdGhhdCBhcHBlYXJzIGluIGVycm9yIG1lc3NhZ2VzOwogLy8gKiBzcmMgaXMgYW4gb3B0aW9uYWwgc291cmNlIG9mIGJ5dGVzIHRvIHVzZSBpbnN0ZWFkIG9mIGZpbGVuYW1lCiAvLyAgIChpdCBjYW4gYmUgYSBzdHJpbmcsIG9yIGEgYnl0ZSBhcnJheSwgb3IgYW4gaW8uUmVhZGVyIGluc3RhbmNlKQotLy8gKiBjb21tYW5kVmFycyBpcyBhbiBhcnJheSBvZiAiVkFSPXZhbHVlIiBpdGVtcy4gVGhleSBhcmUgYWNjZXNzaWJsZSBmcm9tCi0vLyAgIHRoZSBzdGFybGFyayBzY3JpcHQgYXMgbWVtYmVycyBvZiB0aGUgYHJibGZfY2xpYCBwcm9wc2V0LgotZnVuYyBSdW4oZmlsZW5hbWUgc3RyaW5nLCBzcmMgaW50ZXJmYWNle30sIGNvbW1hbmRWYXJzIFtdc3RyaW5nKSBlcnJvciB7Ci0Jc2V0dXAoY29tbWFuZFZhcnMpCisvLyBSZXR1cm5zIHRoZSB0b3AtbGV2ZWwgc3RhcmxhcmsgdmFyaWFibGVzLCB0aGUgbGlzdCBvZiBzdGFybGFyayBmaWxlcyBsb2FkZWQsIGFuZCBhbiBlcnJvcgorZnVuYyBSdW4oZmlsZW5hbWUgc3RyaW5nLCBzcmMgaW50ZXJmYWNle30sIG1vZGUgRXhlY3V0aW9uTW9kZSwgYWxsb3dFeHRlcm5hbEVudHJ5cG9pbnQgYm9vbCkgKHN0YXJsYXJrLlN0cmluZ0RpY3QsIFtdc3RyaW5nLCBlcnJvcikgeworCS8vIE5PVEUoYXNtdW5kYWspOiBPUy1zcGVjaWZpYy4gQmVoYXZlIHNpbWlsYXIgdG8gTGludXggYHN5c3RlbWAgY2FsbCwKKwkvLyB3aGljaCBhbHdheXMgdXNlcyAvYmluL3NoIHRvIHJ1biB0aGUgY29tbWFuZAorCXNoZWxsUGF0aCA6PSAiL2Jpbi9zaCIKKwlpZiBfLCBlcnIgOj0gb3MuU3RhdChzaGVsbFBhdGgpOyBlcnIgIT0gbmlsIHsKKwkJc2hlbGxQYXRoID0gIiIKKwl9CiAKIAltYWluVGhyZWFkIDo9ICZzdGFybGFyay5UaHJlYWR7CiAJCU5hbWU6ICAibWFpbiIsCi0JCVByaW50OiBmdW5jKF8gKnN0YXJsYXJrLlRocmVhZCwgbXNnIHN0cmluZykgeyBmbXQuUHJpbnRsbihtc2cpIH0sCisJCVByaW50OiBmdW5jKF8gKnN0YXJsYXJrLlRocmVhZCwgbXNnIHN0cmluZykgeworCQkJaWYgbW9kZSA9PSBFeGVjdXRpb25Nb2RlUmJjIHsKKwkJCQkvLyBJbiByYmMgbW9kZSwgcmJsZl9sb2cgaXMgdXNlZCB0byBwcmludCB0byBzdGRlcnIKKwkJCQlmbXQuUHJpbnRsbihtc2cpCisJCQl9IGVsc2UgaWYgbW9kZSA9PSBFeGVjdXRpb25Nb2RlU2NsIHsKKwkJCQlmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBtc2cpCisJCQl9CisJCX0sCiAJCUxvYWQ6ICBsb2FkZXIsCiAJfQotCWFic1BhdGgsIGVyciA6PSBmaWxlcGF0aC5BYnMoZmlsZW5hbWUpCi0JaWYgZXJyID09IG5pbCB7Ci0JCW1haW5UaHJlYWQuU2V0TG9jYWwoY2FsbGVyRGlyS2V5LCBmaWxlcGF0aC5EaXIoYWJzUGF0aCkpCi0JCV8sIGVyciA9IHN0YXJsYXJrLkV4ZWNGaWxlKG1haW5UaHJlYWQsIGFic1BhdGgsIHNyYywgYnVpbHRpbnMpCisJZmlsZW5hbWUsIGVyciA6PSBmaWxlcGF0aC5BYnMoZmlsZW5hbWUpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIG5pbCwgZXJyCiAJfQotCXJldHVybiBlcnIKKwlpZiB3ZCwgZXJyIDo9IG9zLkdldHdkKCk7IGVyciA9PSBuaWwgeworCQlmaWxlbmFtZSwgZXJyID0gZmlsZXBhdGguUmVsKHdkLCBmaWxlbmFtZSkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gbmlsLCBuaWwsIGVycgorCQl9CisJCWlmICFhbGxvd0V4dGVybmFsRW50cnlwb2ludCAmJiBzdHJpbmdzLkhhc1ByZWZpeChmaWxlbmFtZSwgIi4uLyIpIHsKKwkJCXJldHVybiBuaWwsIG5pbCwgZm10LkVycm9yZigicGF0aCBjb3VsZCBub3QgYmUgbWFkZSByZWxhdGl2ZSB0byB3b3Jrc3BhY2Ugcm9vdDogJXMiLCBmaWxlbmFtZSkKKwkJfQorCX0gZWxzZSB7CisJCXJldHVybiBuaWwsIG5pbCwgZXJyCisJfQorCisJaWYgc3ltLCBlcnIgOj0gaXNTeW1saW5rKGZpbGVuYW1lKTsgc3ltICYmIGVyciA9PSBuaWwgeworCQlyZXR1cm4gbmlsLCBuaWwsIGZtdC5FcnJvcmYoInN5bWxpbmtzIHRvIHN0YXJsYXJrIGZpbGVzIGFyZSBub3QgYWxsb3dlZC4gSW5zdGVhZCwgbG9hZCB0aGUgdGFyZ2V0IGZpbGUgYW5kIHJlLWV4cG9ydCBpdHMgc3ltYm9sczogJXMiLCBmaWxlbmFtZSkKKwl9IGVsc2UgaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIG5pbCwgZXJyCisJfQorCisJaWYgbW9kZSA9PSBFeGVjdXRpb25Nb2RlU2NsICYmICFzdHJpbmdzLkhhc1N1ZmZpeChmaWxlbmFtZSwgIi5zY2wiKSB7CisJCXJldHVybiBuaWwsIG5pbCwgZm10LkVycm9yZigiZmlsZW5hbWUgbXVzdCBlbmQgaW4gLnNjbDogJXMiLCBmaWxlbmFtZSkKKwl9CisKKwkvLyBBZGQgdG9wLWxldmVsIGZpbGUgdG8gY2FjaGUgZm9yIGN5Y2xlIGRldGVjdGlvbiBwdXJwb3NlcworCW1vZHVsZUNhY2hlW2ZpbGVuYW1lXSA9IG5pbAorCisJdmFyIHJlc3VsdHMgc3RhcmxhcmsuU3RyaW5nRGljdAorCW1haW5UaHJlYWQuU2V0TG9jYWwoYWxsb3dFeHRlcm5hbEVudHJ5cG9pbnRLZXksIGFsbG93RXh0ZXJuYWxFbnRyeXBvaW50KQorCW1haW5UaHJlYWQuU2V0TG9jYWwoY2FsbGluZ0ZpbGVLZXksIGZpbGVuYW1lKQorCW1haW5UaHJlYWQuU2V0TG9jYWwoZXhlY3V0aW9uTW9kZUtleSwgbW9kZSkKKwltYWluVGhyZWFkLlNldExvY2FsKHNoZWxsS2V5LCBzaGVsbFBhdGgpCisJaWYgbW9kZSA9PSBFeGVjdXRpb25Nb2RlUmJjIHsKKwkJcmVzdWx0cywgZXJyID0gc3RhcmxhcmsuRXhlY0ZpbGUobWFpblRocmVhZCwgZmlsZW5hbWUsIHNyYywgcmJjQnVpbHRpbnMpCisJfSBlbHNlIGlmIG1vZGUgPT0gRXhlY3V0aW9uTW9kZVNjbCB7CisJCXJlc3VsdHMsIGVyciA9IHN0YXJsYXJrLkV4ZWNGaWxlKG1haW5UaHJlYWQsIGZpbGVuYW1lLCBzcmMsIHNjbEJ1aWx0aW5zKQorCX0gZWxzZSB7CisJCXJldHVybiByZXN1bHRzLCBuaWwsIGZtdC5FcnJvcmYoInVua25vd24gZXhlY3V0aW9uTW9kZSAlZCIsIG1vZGUpCisJfQorCWxvYWRlZFN0YXJsYXJrRmlsZXMgOj0gbWFrZShbXXN0cmluZywgMCwgbGVuKG1vZHVsZUNhY2hlKSkKKwlmb3IgZmlsZSA6PSByYW5nZSBtb2R1bGVDYWNoZSB7CisJCWxvYWRlZFN0YXJsYXJrRmlsZXMgPSBhcHBlbmQobG9hZGVkU3RhcmxhcmtGaWxlcywgZmlsZSkKKwl9CisJc29ydC5TdHJpbmdzKGxvYWRlZFN0YXJsYXJrRmlsZXMpCisKKwlyZXR1cm4gcmVzdWx0cywgbG9hZGVkU3RhcmxhcmtGaWxlcywgZXJyCiB9CmRpZmYgLS1naXQgYS90b29scy9yYmNydW4vaG9zdF90ZXN0LmdvIGIvdG9vbHMvcmJjcnVuL2hvc3RfdGVzdC5nbwppbmRleCA5N2Y2Y2U5Li4zOGIyOTIzIDEwMDY0NAotLS0gYS90b29scy9yYmNydW4vaG9zdF90ZXN0LmdvCisrKyBiL3Rvb2xzL3JiY3J1bi9ob3N0X3Rlc3QuZ28KQEAgLTE5LDYgKzE5LDcgQEAKIAkib3MiCiAJInBhdGgvZmlsZXBhdGgiCiAJInJ1bnRpbWUiCisJInN0cmluZ3MiCiAJInRlc3RpbmciCiAKIAkiZ28uc3RhcmxhcmsubmV0L3Jlc29sdmUiCkBAIC01Myw4ICs1NCw3IEBACiB9CiAKIC8vIENvbW1vbiBzZXR1cCBmb3IgdGhlIHRlc3RzOiBjcmVhdGUgdGhyZWFkLCBjaGFuZ2UgdG8gdGhlIHRlc3QgZGlyZWN0b3J5Ci1mdW5jIHRlc3RTZXR1cCh0ICp0ZXN0aW5nLlQsIGVudiBbXXN0cmluZykgKnN0YXJsYXJrLlRocmVhZCB7Ci0Jc2V0dXAoZW52KQorZnVuYyB0ZXN0U2V0dXAodCAqdGVzdGluZy5UKSAqc3RhcmxhcmsuVGhyZWFkIHsKIAl0aHJlYWQgOj0gJnN0YXJsYXJrLlRocmVhZHsKIAkJTG9hZDogZnVuYyh0aHJlYWQgKnN0YXJsYXJrLlRocmVhZCwgbW9kdWxlIHN0cmluZykgKHN0YXJsYXJrLlN0cmluZ0RpY3QsIGVycm9yKSB7CiAJCQlpZiBtb2R1bGUgPT0gImFzc2VydC5zdGFyIiB7CkBAIC03MiwxNCArNzIsMTUgQEAKIGZ1bmMgZGF0YURpcigpIHN0cmluZyB7CiAJXywgdGhpc1NyY0ZpbGUsIF8sIF8gOj0gcnVudGltZS5DYWxsZXIoMCkKIAlyZXR1cm4gZmlsZXBhdGguSm9pbihmaWxlcGF0aC5EaXIodGhpc1NyY0ZpbGUpLCAidGVzdGRhdGEiKQotCiB9CiAKIGZ1bmMgZXhlcmNpc2VTdGFybGFya1Rlc3RGaWxlKHQgKnRlc3RpbmcuVCwgc3RhckZpbGUgc3RyaW5nKSB7CiAJLy8gSW4gb3JkZXIgdG8gdXNlICJhc3NlcnQuc3RhciIgZnJvbSBnby9zdGFybGFyay5uZXQvc3Rhcmxhcmt0ZXN0IGluIHRoZSB0ZXN0cywgcHJvdmlkZToKIAkvLyAgKiBsb2FkIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyAiYXNzZXJ0LnN0YXIiCiAJLy8gICogc3Rhcmxhcmt0ZXN0LkRhdGFGaWxlIGZ1bmN0aW9uIHRoYXQgZmluZHMgaXRzIGxvY2F0aW9uCi0Jc2V0dXAobmlsKQorCWlmIGVyciA6PSBvcy5DaGRpcihkYXRhRGlyKCkpOyBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbChlcnIpCisJfQogCXRocmVhZCA6PSAmc3RhcmxhcmsuVGhyZWFkewogCQlMb2FkOiBmdW5jKHRocmVhZCAqc3RhcmxhcmsuVGhyZWFkLCBtb2R1bGUgc3RyaW5nKSAoc3RhcmxhcmsuU3RyaW5nRGljdCwgZXJyb3IpIHsKIAkJCWlmIG1vZHVsZSA9PSAiYXNzZXJ0LnN0YXIiIHsKQEAgLTkwLDIxICs5MSw5IEBACiAJc3Rhcmxhcmt0ZXN0LlNldFJlcG9ydGVyKHRocmVhZCwgdCkKIAlfLCB0aGlzU3JjRmlsZSwgXywgXyA6PSBydW50aW1lLkNhbGxlcigwKQogCWZpbGVuYW1lIDo9IGZpbGVwYXRoLkpvaW4oZmlsZXBhdGguRGlyKHRoaXNTcmNGaWxlKSwgc3RhckZpbGUpCi0JaWYgXywgZXJyIDo9IHN0YXJsYXJrLkV4ZWNGaWxlKHRocmVhZCwgZmlsZW5hbWUsIG5pbCwgYnVpbHRpbnMpOyBlcnIgIT0gbmlsIHsKLQkJaWYgZXJyLCBvayA6PSBlcnIuKCpzdGFybGFyay5FdmFsRXJyb3IpOyBvayB7Ci0JCQl0LkZhdGFsKGVyci5CYWNrdHJhY2UoKSkKLQkJfQotCQl0LkZhdGFsKGVycikKLQl9Ci19Ci0KLWZ1bmMgVGVzdENsaUFuZEVudih0ICp0ZXN0aW5nLlQpIHsKLQkvLyBUT0RPKGFzbXVuZGFrKTogY29udmVydCB0aGlzIHRvIHVzZSBleGVyY2lzZVN0YXJsYXJrVGVzdEZpbGUKLQlpZiBlcnIgOj0gb3MuU2V0ZW52KCJURVNUX0VOVklST05NRU5UX0ZPTyIsICJ0ZXN0X2Vudmlyb25tZW50X2ZvbyIpOyBlcnIgIT0gbmlsIHsKLQkJdC5GYXRhbChlcnIpCi0JfQotCXRocmVhZCA6PSB0ZXN0U2V0dXAodCwgW11zdHJpbmd7IkNMSV9GT089Zm9vIn0pCi0JaWYgXywgZXJyIDo9IHN0YXJsYXJrLkV4ZWNGaWxlKHRocmVhZCwgImNsaV9hbmRfZW52LnN0YXIiLCBuaWwsIGJ1aWx0aW5zKTsgZXJyICE9IG5pbCB7CisJdGhyZWFkLlNldExvY2FsKGV4ZWN1dGlvbk1vZGVLZXksIEV4ZWN1dGlvbk1vZGVSYmMpCisJdGhyZWFkLlNldExvY2FsKHNoZWxsS2V5LCAiL2Jpbi9zaCIpCisJaWYgXywgZXJyIDo9IHN0YXJsYXJrLkV4ZWNGaWxlKHRocmVhZCwgZmlsZW5hbWUsIG5pbCwgcmJjQnVpbHRpbnMpOyBlcnIgIT0gbmlsIHsKIAkJaWYgZXJyLCBvayA6PSBlcnIuKCpzdGFybGFyay5FdmFsRXJyb3IpOyBvayB7CiAJCQl0LkZhdGFsKGVyci5CYWNrdHJhY2UoKSkKIAkJfQpAQCAtMTE0LDExICsxMDMsOCBAQAogCiBmdW5jIFRlc3RGaWxlT3BzKHQgKnRlc3RpbmcuVCkgewogCS8vIFRPRE8oYXNtdW5kYWspOiBjb252ZXJ0IHRoaXMgdG8gdXNlIGV4ZXJjaXNlU3RhcmxhcmtUZXN0RmlsZQotCWlmIGVyciA6PSBvcy5TZXRlbnYoIlRFU1RfREFUQV9ESVIiLCBkYXRhRGlyKCkpOyBlcnIgIT0gbmlsIHsKLQkJdC5GYXRhbChlcnIpCi0JfQotCXRocmVhZCA6PSB0ZXN0U2V0dXAodCwgbmlsKQotCWlmIF8sIGVyciA6PSBzdGFybGFyay5FeGVjRmlsZSh0aHJlYWQsICJmaWxlX29wcy5zdGFyIiwgbmlsLCBidWlsdGlucyk7IGVyciAhPSBuaWwgeworCXRocmVhZCA6PSB0ZXN0U2V0dXAodCkKKwlpZiBfLCBlcnIgOj0gc3RhcmxhcmsuRXhlY0ZpbGUodGhyZWFkLCAiZmlsZV9vcHMuc3RhciIsIG5pbCwgcmJjQnVpbHRpbnMpOyBlcnIgIT0gbmlsIHsKIAkJaWYgZXJyLCBvayA6PSBlcnIuKCpzdGFybGFyay5FdmFsRXJyb3IpOyBvayB7CiAJCQl0LkZhdGFsKGVyci5CYWNrdHJhY2UoKSkKIAkJfQpAQCAtMTI4LDcgKzExNCw3IEBACiAKIGZ1bmMgVGVzdExvYWQodCAqdGVzdGluZy5UKSB7CiAJLy8gVE9ETyhhc211bmRhayk6IGNvbnZlcnQgdGhpcyB0byB1c2UgZXhlcmNpc2VTdGFybGFya1Rlc3RGaWxlCi0JdGhyZWFkIDo9IHRlc3RTZXR1cCh0LCBuaWwpCisJdGhyZWFkIDo9IHRlc3RTZXR1cCh0KQogCXRocmVhZC5Mb2FkID0gZnVuYyh0aHJlYWQgKnN0YXJsYXJrLlRocmVhZCwgbW9kdWxlIHN0cmluZykgKHN0YXJsYXJrLlN0cmluZ0RpY3QsIGVycm9yKSB7CiAJCWlmIG1vZHVsZSA9PSAiYXNzZXJ0LnN0YXIiIHsKIAkJCXJldHVybiBzdGFybGFya3Rlc3QuTG9hZEFzc2VydE1vZHVsZSgpCkBAIC0xMzcsOSArMTIzLDEzIEBACiAJCX0KIAl9CiAJZGlyIDo9IGRhdGFEaXIoKQotCXRocmVhZC5TZXRMb2NhbChjYWxsZXJEaXJLZXksIGRpcikKLQlMb2FkUGF0aFJvb3QgPSBmaWxlcGF0aC5EaXIoZGlyKQotCWlmIF8sIGVyciA6PSBzdGFybGFyay5FeGVjRmlsZSh0aHJlYWQsICJsb2FkLnN0YXIiLCBuaWwsIGJ1aWx0aW5zKTsgZXJyICE9IG5pbCB7CisJaWYgZXJyIDo9IG9zLkNoZGlyKGZpbGVwYXRoLkRpcihkaXIpKTsgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoZXJyKQorCX0KKwl0aHJlYWQuU2V0TG9jYWwoYWxsb3dFeHRlcm5hbEVudHJ5cG9pbnRLZXksIGZhbHNlKQorCXRocmVhZC5TZXRMb2NhbChjYWxsaW5nRmlsZUtleSwgInRlc3RkYXRhL2xvYWQuc3RhciIpCisJdGhyZWFkLlNldExvY2FsKGV4ZWN1dGlvbk1vZGVLZXksIEV4ZWN1dGlvbk1vZGVSYmMpCisJaWYgXywgZXJyIDo9IHN0YXJsYXJrLkV4ZWNGaWxlKHRocmVhZCwgInRlc3RkYXRhL2xvYWQuc3RhciIsIG5pbCwgcmJjQnVpbHRpbnMpOyBlcnIgIT0gbmlsIHsKIAkJaWYgZXJyLCBvayA6PSBlcnIuKCpzdGFybGFyay5FdmFsRXJyb3IpOyBvayB7CiAJCQl0LkZhdGFsKGVyci5CYWNrdHJhY2UoKSkKIAkJfQpAQCAtMTQ3LDkgKzEzNyw3MCBAQAogCX0KIH0KIAotZnVuYyBUZXN0U2hlbGwodCAqdGVzdGluZy5UKSB7Ci0JaWYgZXJyIDo9IG9zLlNldGVudigiVEVTVF9EQVRBX0RJUiIsIGRhdGFEaXIoKSk7IGVyciAhPSBuaWwgeworZnVuYyBUZXN0QnpsTG9hZHNTY2wodCAqdGVzdGluZy5UKSB7CisJbW9kdWxlQ2FjaGUgPSBtYWtlKG1hcFtzdHJpbmddKm1vZGVudHJ5KQorCWRpciA6PSBkYXRhRGlyKCkKKwlpZiBlcnIgOj0gb3MuQ2hkaXIoZmlsZXBhdGguRGlyKGRpcikpOyBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbChlcnIpCiAJfQorCXZhcnMsIF8sIGVyciA6PSBSdW4oInRlc3RkYXRhL2J6bF9sb2Fkc19zY2wuYnpsIiwgbmlsLCBFeGVjdXRpb25Nb2RlUmJjLCBmYWxzZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbChlcnIpCisJfQorCWlmIHZhbCwgb2sgOj0gdmFyc1siZm9vIl07ICFvayB7CisJCXQuRmF0YWxmKCJGYWlsZWQgdG8gbG9hZCBmb28gdmFyaWFibGUiKQorCX0gZWxzZSBpZiB2YWwuKHN0YXJsYXJrLlN0cmluZykgIT0gImJhciIgeworCQl0LkZhdGFsZigiRXhwZWN0ZWQgXCJiYXJcIiwgZ290ICVxIiwgdmFsKQorCX0KK30KKworZnVuYyBUZXN0Tm9uRW50cnlwb2ludEJ6bExvYWRzU2NsKHQgKnRlc3RpbmcuVCkgeworCW1vZHVsZUNhY2hlID0gbWFrZShtYXBbc3RyaW5nXSptb2RlbnRyeSkKKwlkaXIgOj0gZGF0YURpcigpCisJaWYgZXJyIDo9IG9zLkNoZGlyKGZpbGVwYXRoLkRpcihkaXIpKTsgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoZXJyKQorCX0KKwl2YXJzLCBfLCBlcnIgOj0gUnVuKCJ0ZXN0ZGF0YS9iemxfbG9hZHNfc2NsXzIuYnpsIiwgbmlsLCBFeGVjdXRpb25Nb2RlUmJjLCBmYWxzZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbChlcnIpCisJfQorCWlmIHZhbCwgb2sgOj0gdmFyc1siZm9vIl07ICFvayB7CisJCXQuRmF0YWxmKCJGYWlsZWQgdG8gbG9hZCBmb28gdmFyaWFibGUiKQorCX0gZWxzZSBpZiB2YWwuKHN0YXJsYXJrLlN0cmluZykgIT0gImJhciIgeworCQl0LkZhdGFsZigiRXhwZWN0ZWQgXCJiYXJcIiwgZ290ICVxIiwgdmFsKQorCX0KK30KKworZnVuYyBUZXN0U2NsTG9hZHNCemwodCAqdGVzdGluZy5UKSB7CisJbW9kdWxlQ2FjaGUgPSBtYWtlKG1hcFtzdHJpbmddKm1vZGVudHJ5KQorCWRpciA6PSBkYXRhRGlyKCkKKwlpZiBlcnIgOj0gb3MuQ2hkaXIoZmlsZXBhdGguRGlyKGRpcikpOyBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbChlcnIpCisJfQorCV8sIF8sIGVyciA6PSBSdW4oInRlc3RkYXRhL3NjbF9pbmNvcnJlY3RseV9sb2Fkc19iemwuc2NsIiwgbmlsLCBFeGVjdXRpb25Nb2RlU2NsLCBmYWxzZSkKKwlpZiBlcnIgPT0gbmlsIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgZmFpbHVyZSIpCisJfQorCWlmICFzdHJpbmdzLkNvbnRhaW5zKGVyci5FcnJvcigpLCAiLnNjbCBmaWxlcyBjYW4gb25seSBsb2FkIG90aGVyIC5zY2wgZmlsZXMiKSB7CisJCXQuRmF0YWxmKCJFeHBlY3RlZCBlcnJvciB0byBjb250YWluIFwiLnNjbCBmaWxlcyBjYW4gb25seSBsb2FkIG90aGVyIC5zY2wgZmlsZXNcIjogJXEiLCBlcnIuRXJyb3IoKSkKKwl9Cit9CisKK2Z1bmMgVGVzdENhbnRMb2FkU3ltbGluayh0ICp0ZXN0aW5nLlQpIHsKKwltb2R1bGVDYWNoZSA9IG1ha2UobWFwW3N0cmluZ10qbW9kZW50cnkpCisJZGlyIDo9IGRhdGFEaXIoKQorCWlmIGVyciA6PSBvcy5DaGRpcihmaWxlcGF0aC5EaXIoZGlyKSk7IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKGVycikKKwl9CisJXywgXywgZXJyIDo9IFJ1bigidGVzdGRhdGEvdGVzdF9zY2xfc3ltbGluay5zY2wiLCBuaWwsIEV4ZWN1dGlvbk1vZGVTY2wsIGZhbHNlKQorCWlmIGVyciA9PSBuaWwgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBmYWlsdXJlIikKKwl9CisJaWYgIXN0cmluZ3MuQ29udGFpbnMoZXJyLkVycm9yKCksICJzeW1saW5rcyB0byBzdGFybGFyayBmaWxlcyBhcmUgbm90IGFsbG93ZWQiKSB7CisJCXQuRmF0YWxmKCJFeHBlY3RlZCBlcnJvciB0byBjb250YWluIFwic3ltbGlua3MgdG8gc3RhcmxhcmsgZmlsZXMgYXJlIG5vdCBhbGxvd2VkXCI6ICVxIiwgZXJyLkVycm9yKCkpCisJfQorfQorCitmdW5jIFRlc3RTaGVsbCh0ICp0ZXN0aW5nLlQpIHsKIAlleGVyY2lzZVN0YXJsYXJrVGVzdEZpbGUodCwgInRlc3RkYXRhL3NoZWxsLnN0YXIiKQogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmJjcnVuL3JiY3J1bi9yYmNydW4uZ28gYi90b29scy9yYmNydW4vcmJjcnVuL3JiY3J1bi5nbwppbmRleCA0ZGI2YTBiLi44YzM3MmM3IDEwMDY0NAotLS0gYS90b29scy9yYmNydW4vcmJjcnVuL3JiY3J1bi5nbworKysgYi90b29scy9yYmNydW4vcmJjcnVuL3JiY3J1bi5nbwpAQCAtMTcsNTIgKzE3LDEzOCBAQAogaW1wb3J0ICgKIAkiZmxhZyIKIAkiZm10IgotCSJnby5zdGFybGFyay5uZXQvc3RhcmxhcmsiCiAJIm9zIgogCSJyYmNydW4iCisJInJlZ2V4cCIKIAkic3RyaW5ncyIKKworCSJnby5zdGFybGFyay5uZXQvc3RhcmxhcmsiCiApCiAKIHZhciAoCi0JZXhlY3Byb2cgPSBmbGFnLlN0cmluZygiYyIsICIiLCAiZXhlY3V0ZSBwcm9ncmFtIGBwcm9nYCIpCisJYWxsb3dFeHRlcm5hbEVudHJ5cG9pbnQgPSBmbGFnLkJvb2woImFsbG93X2V4dGVybmFsX2VudHJ5cG9pbnQiLCBmYWxzZSwgImFsbG93IHRoZSBlbnRyeXBvaW50IHN0YXJsYXJrIGZpbGUgdG8gYmUgb3V0c2lkZSBvZiB0aGUgc291cmNlIHRyZWUiKQorCW1vZGVGbGFnICA9IGZsYWcuU3RyaW5nKCJtb2RlIiwgIiIsICJ0aGUgZ2VuZXJhbCBiZWhhdmlvciBvZiByYmNydW4uIENhbiBiZSBcInJiY1wiIG9yIFwibWFrZVwiLiBSZXF1aXJlZC4iKQogCXJvb3RkaXIgID0gZmxhZy5TdHJpbmcoImQiLCAiLiIsICJ0aGUgdmFsdWUgb2YgLy8gZm9yIGxvYWQgcGF0aHMiKQotCWZpbGUgICAgID0gZmxhZy5TdHJpbmcoImYiLCAiIiwgImZpbGUgdG8gZXhlY3V0ZSIpCiAJcGVyZkZpbGUgPSBmbGFnLlN0cmluZygicGVyZiIsICIiLCAic2F2ZSBwZXJmb3JtYW5jZSBkYXRhIikKKwlpZGVudGlmaWVyUmUgPSByZWdleHAuTXVzdENvbXBpbGUoIlthLXpBLVpfXVthLXpBLVowLTlfXSoiKQogKQogCi1mdW5jIG1haW4oKSB7Ci0JZmxhZy5QYXJzZSgpCi0JZmlsZW5hbWUgOj0gKmZpbGUKLQl2YXIgc3JjIGludGVyZmFjZXt9Ci0JdmFyIGVudiBbXXN0cmluZworZnVuYyBnZXRFbnRyeXBvaW50U3RhcmxhcmtGaWxlKCkgc3RyaW5nIHsKKwlmaWxlbmFtZSA6PSAiIgogCi0JcmMgOj0gMAogCWZvciBfLCBhcmcgOj0gcmFuZ2UgZmxhZy5BcmdzKCkgewotCQlpZiBzdHJpbmdzLkNvbnRhaW5zKGFyZywgIj0iKSB7Ci0JCQllbnYgPSBhcHBlbmQoZW52LCBhcmcpCi0JCX0gZWxzZSBpZiBmaWxlbmFtZSA9PSAiIiB7CisJCWlmIGZpbGVuYW1lID09ICIiIHsKIAkJCWZpbGVuYW1lID0gYXJnCiAJCX0gZWxzZSB7CiAJCQlxdWl0KCJvbmx5IG9uZSBmaWxlIGNhbiBiZSBleGVjdXRlZFxuIikKIAkJfQogCX0KLQlpZiAqZXhlY3Byb2cgIT0gIiIgewotCQlpZiBmaWxlbmFtZSAhPSAiIiB7Ci0JCQlxdWl0KCJlaXRoZXIgLWMgb3IgZmlsZSBuYW1lIHNob3VsZCBiZSBwcmVzZW50XG4iKQotCQl9Ci0JCWZpbGVuYW1lID0gIjxjbWRsaW5lPiIKLQkJc3JjID0gKmV4ZWNwcm9nCi0JfQogCWlmIGZpbGVuYW1lID09ICIiIHsKLQkJaWYgbGVuKGVudikgPiAwIHsKLQkJCWZtdC5GcHJpbnRsbihvcy5TdGRlcnIsCi0JCQkJIm5vIGZpbGUgdG8gcnVuIC0tIGlmIHlvdXIgZmlsZSdzIG5hbWUgY29udGFpbnMgJz0nLCB1c2UgLWYgdG8gc3BlY2lmeSBpdCIpCi0JCX0KIAkJZmxhZy5Vc2FnZSgpCiAJCW9zLkV4aXQoMSkKIAl9Ci0JaWYgc3RhdCwgZXJyIDo9IG9zLlN0YXQoKnJvb3RkaXIpOyBvcy5Jc05vdEV4aXN0KGVycikgfHwgIXN0YXQuSXNEaXIoKSB7Ci0JCXF1aXQoIiVzIGlzIG5vdCBhIGRpcmVjdG9yeVxuIiwgKnJvb3RkaXIpCisJcmV0dXJuIGZpbGVuYW1lCit9CisKK2Z1bmMgZ2V0TW9kZSgpIHJiY3J1bi5FeGVjdXRpb25Nb2RlIHsKKwlzd2l0Y2ggKm1vZGVGbGFnIHsKKwljYXNlICJyYmMiOgorCQlyZXR1cm4gcmJjcnVuLkV4ZWN1dGlvbk1vZGVSYmMKKwljYXNlICJtYWtlIjoKKwkJcmV0dXJuIHJiY3J1bi5FeGVjdXRpb25Nb2RlU2NsCisJY2FzZSAiIjoKKwkJcXVpdCgiLW1vZGUgZmxhZyBpcyByZXF1aXJlZC4iKQorCWRlZmF1bHQ6CisJCXF1aXQoIlVua25vd24gLW1vZGUgdmFsdWUgJXEsIGV4cGVjdGVkIDEgb2YgXCJyYmNcIiwgXCJtYWtlXCIiLCAqbW9kZUZsYWcpCisJfQorCXJldHVybiByYmNydW4uRXhlY3V0aW9uTW9kZVNjbAorfQorCit2YXIgbWFrZVN0cmluZ1JlcGxhY2VyID0gc3RyaW5ncy5OZXdSZXBsYWNlcigiIyIsICJcXCMiLCAiJCIsICIkJCIpCisKK2Z1bmMgY2xlYW5TdHJpbmdGb3JNYWtlKHMgc3RyaW5nKSAoc3RyaW5nLCBlcnJvcikgeworCWlmIHN0cmluZ3MuQ29udGFpbnNBbnkocywgIlxcXG4iKSB7CisJCS8vIFxcIGluIG1ha2UgaXMgbGl0ZXJhbGx5IFxcLCBub3QgYSBzaW5nbGUgXCwgc28gd2UgY2FuJ3QgYWxsb3cgdGhlbS4KKwkJLy8gXDxuZXdsaW5lPiBpbiBtYWtlIHdpbGwgcHJvZHVjZSBhIHNwYWNlLCBub3QgYSBuZXdsaW5lLgorCQlyZXR1cm4gIiIsIGZtdC5FcnJvcmYoInN0YXJsYXJrIHN0cmluZ3MgZXhwb3J0ZWQgdG8gbWFrZSBjYW5ub3QgY29udGFpbiBiYWNrc2xhc2hlcyBvciBuZXdsaW5lcyIpCisJfQorCXJldHVybiBtYWtlU3RyaW5nUmVwbGFjZXIuUmVwbGFjZShzKSwgbmlsCit9CisKK2Z1bmMgZ2V0VmFsdWVJbk1ha2VGb3JtYXQodmFsdWUgc3RhcmxhcmsuVmFsdWUsIGFsbG93TGlzdHMgYm9vbCkgKHN0cmluZywgZXJyb3IpIHsKKwlzd2l0Y2ggdiA6PSB2YWx1ZS4odHlwZSkgeworCWNhc2Ugc3RhcmxhcmsuU3RyaW5nOgorCQlpZiBjbGVhbmVkVmFsdWUsIGVyciA6PSBjbGVhblN0cmluZ0Zvck1ha2Uodi5Hb1N0cmluZygpKTsgZXJyID09IG5pbCB7CisJCQlyZXR1cm4gY2xlYW5lZFZhbHVlLCBuaWwKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAiIiwgZXJyCisJCX0KKwljYXNlIHN0YXJsYXJrLkludDoKKwkJcmV0dXJuIHYuU3RyaW5nKCksIG5pbAorCWNhc2UgKnN0YXJsYXJrLkxpc3Q6CisJCWlmICFhbGxvd0xpc3RzIHsKKwkJCXJldHVybiAiIiwgZm10LkVycm9yZigibmVzdGVkIGxpc3RzIGFyZSBub3QgYWxsb3dlZCB0byBiZSBleHBvcnRlZCBmcm9tIHN0YXJsYXJrIHRvIG1ha2UsIGZsYXR0ZW4gdGhlIGxpc3QgaW4gc3RhcmxhcmsgZmlyc3QiKQorCQl9CisJCXJlc3VsdCA6PSAiIgorCQlmb3IgaSA6PSAwOyBpIDwgdi5MZW4oKTsgaSsrIHsKKwkJCXZhbHVlLCBlcnIgOj0gZ2V0VmFsdWVJbk1ha2VGb3JtYXQodi5JbmRleChpKSwgZmFsc2UpCisJCQlpZiBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gIiIsIGVycgorCQkJfQorCQkJaWYgaSA+IDAgeworCQkJCXJlc3VsdCArPSAiICIKKwkJCX0KKwkJCXJlc3VsdCArPSB2YWx1ZQorCQl9CisJCXJldHVybiByZXN1bHQsIG5pbAorCWRlZmF1bHQ6CisJCXJldHVybiAiIiwgZm10LkVycm9yZigib25seSBzdGFybGFyayBzdHJpbmdzLCBpbnRzLCBhbmQgbGlzdHMgb2Ygc3RyaW5ncy9pbnRzIGNhbiBiZSBleHBvcnRlZCB0byBtYWtlLiBQbGVhc2UgY29udmVydCBhbGwgb3RoZXIgdHlwZXMgaW4gc3RhcmxhcmsgZmlyc3QuIEZvdW5kIHR5cGU6ICVzIiwgdmFsdWUuVHlwZSgpKQorCX0KK30KKworZnVuYyBwcmludFZhcnNJbk1ha2VGb3JtYXQoZ2xvYmFscyBzdGFybGFyay5TdHJpbmdEaWN0KSBlcnJvciB7CisJLy8gV2UgY291bGQganVzdCBkaXJlY3RseSBleHBvcnQgdG9wIGxldmVsIHZhcmlhYmxlcyBieSBuYW1lIGluc3RlYWQgb2YgZ29pbmcgdGhyb3VnaAorCS8vIGEgdmFyaWFibGVzX3RvX2V4cG9ydF90b19tYWtlIGRpY3Rpb25hcnksIGJ1dCB0aGF0IHdvdWxkbid0IGFsbG93IGZvciBleHBvcnRpbmcgYQorCS8vIHJ1bnRpbWUtZGVmaW5lZCBudW1iZXIgb2YgdmFyaWFibGVzIHRvIG1ha2UuIFRoaXMgY2FuIGJlIGltcG9ydGFudCBiZWNhdXNlIGRpY3Rpb25hcmllcworCS8vIGluIG1ha2UgYXJlIG9mdGVuIHJlcHJlc2VudGVkIGJ5IGEgdW5pcXVlIHZhcmlhYmxlIGZvciBldmVyeSBrZXkgaW4gdGhlIGRpY3Rpb25hcnkuCisJdmFyaWFibGVzVmFsdWUsIG9rIDo9IGdsb2JhbHNbInZhcmlhYmxlc190b19leHBvcnRfdG9fbWFrZSJdCisJaWYgIW9rIHsKKwkJcmV0dXJuIGZtdC5FcnJvcmYoImV4cGVjdGVkIHRvcC1sZXZlbCBzdGFybGFyayBmaWxlIHRvIGhhdmUgYSBcInZhcmlhYmxlc190b19leHBvcnRfdG9fbWFrZVwiIHZhcmlhYmxlIikKKwl9CisJdmFyaWFibGVzLCBvayA6PSB2YXJpYWJsZXNWYWx1ZS4oKnN0YXJsYXJrLkRpY3QpCisJaWYgIW9rIHsKKwkJcmV0dXJuIGZtdC5FcnJvcmYoImV4cGVjdGVkIHZhcmlhYmxlc190b19leHBvcnRfdG9fbWFrZSB0byBiZSBhIGRpY3QsIGdvdCAlcyIsIHZhcmlhYmxlc1ZhbHVlLlR5cGUoKSkKKwl9CisKKwlmb3IgXywgdmFyVHVwbGUgOj0gcmFuZ2UgdmFyaWFibGVzLkl0ZW1zKCkgeworCQl2YXJOYW1lU3RhcmxhcmssIG9rIDo9IHZhclR1cGxlLkluZGV4KDApLihzdGFybGFyay5TdHJpbmcpCisJCWlmICFvayB7CisJCQlyZXR1cm4gZm10LkVycm9yZigiYWxsIGtleXMgaW4gdmFyaWFibGVzX3RvX2V4cG9ydF90b19tYWtlIG11c3QgYmUgc3RyaW5ncywgYnV0IGdvdCAlcSIsIHZhclR1cGxlLkluZGV4KDApLlR5cGUoKSkKKwkJfQorCQl2YXJOYW1lIDo9IHZhck5hbWVTdGFybGFyay5Hb1N0cmluZygpCisJCWlmICFpZGVudGlmaWVyUmUuTWF0Y2hTdHJpbmcodmFyTmFtZSkgeworCQkJcmV0dXJuIGZtdC5FcnJvcmYoImFsbCB2YXJpYWJsZXMgYXQgdGhlIHRvcCBsZXZlbCBzdGFybGFyayBmaWxlIG11c3QgYmUgdmFsaWQgYyBpZGVudGlmaWVycywgYnV0IGdvdCAlcSIsIHZhck5hbWUpCisJCX0KKwkJaWYgdmFyTmFtZSA9PSAiTE9BREVEX1NUQVJMQVJLX0ZJTEVTIiB7CisJCQlyZXR1cm4gZm10LkVycm9yZigidGhlIG5hbWUgTE9BREVEX1NUQVJMQVJLX0ZJTEVTIGlzIHJlc2VydmVkIGZvciB1c2UgYnkgdGhlIHN0YXJsYXJrIGludGVycHJldGVyIikKKwkJfQorCQl2YWx1ZU1ha2UsIGVyciA6PSBnZXRWYWx1ZUluTWFrZUZvcm1hdCh2YXJUdXBsZS5JbmRleCgxKSwgdHJ1ZSkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKwkJLy8gVGhlIDo9JD0gaXMgc3BlY2lhbCBLYXRpIHN5bnRheCB0aGF0IG1lYW5zICJzZXQgYW5kIG1ha2UgcmVhZG9ubHkiCisJCWZtdC5QcmludGYoIiVzIDo9JD0gJXNcbiIsIHZhck5hbWUsIHZhbHVlTWFrZSkKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIG1haW4oKSB7CisJZmxhZy5QYXJzZSgpCisJZmlsZW5hbWUgOj0gZ2V0RW50cnlwb2ludFN0YXJsYXJrRmlsZSgpCisJbW9kZSA6PSBnZXRNb2RlKCkKKworCWlmIG9zLkNoZGlyKCpyb290ZGlyKSAhPSBuaWwgeworCQlxdWl0KCJjb3VsZCBub3QgY2hkaXIgdG8gJXNcbiIsICpyb290ZGlyKQogCX0KIAlpZiAqcGVyZkZpbGUgIT0gIiIgewogCQlwcHJvZiwgZXJyIDo9IG9zLkNyZWF0ZSgqcGVyZkZpbGUpCkBAIC03NCw4ICsxNjAsOCBAQAogCQkJcXVpdCgiJXNcbiIsIGVycikKIAkJfQogCX0KLQlyYmNydW4uTG9hZFBhdGhSb290ID0gKnJvb3RkaXIKLQllcnIgOj0gcmJjcnVuLlJ1bihmaWxlbmFtZSwgc3JjLCBlbnYpCisJdmFyaWFibGVzLCBsb2FkZWRTdGFybGFya0ZpbGVzLCBlcnIgOj0gcmJjcnVuLlJ1bihmaWxlbmFtZSwgbmlsLCBtb2RlLCAqYWxsb3dFeHRlcm5hbEVudHJ5cG9pbnQpCisJcmMgOj0gMAogCWlmICpwZXJmRmlsZSAhPSAiIiB7CiAJCWlmIGVycjIgOj0gc3RhcmxhcmsuU3RvcFByb2ZpbGUoKTsgZXJyMiAhPSBuaWwgewogCQkJZm10LkZwcmludGxuKG9zLlN0ZGVyciwgZXJyMikKQEAgLTg5LDYgKzE3NSwxMiBAQAogCQkJcXVpdCgiJXNcbiIsIGVycikKIAkJfQogCX0KKwlpZiBtb2RlID09IHJiY3J1bi5FeGVjdXRpb25Nb2RlU2NsIHsKKwkJaWYgZXJyIDo9IHByaW50VmFyc0luTWFrZUZvcm1hdCh2YXJpYWJsZXMpOyBlcnIgIT0gbmlsIHsKKwkJCXF1aXQoIiVzXG4iLCBlcnIpCisJCX0KKwkJZm10LlByaW50ZigiTE9BREVEX1NUQVJMQVJLX0ZJTEVTIDo9ICVzXG4iLCBzdHJpbmdzLkpvaW4obG9hZGVkU3RhcmxhcmtGaWxlcywgIiAiKSkKKwl9CiAJb3MuRXhpdChyYykKIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvcmJjcnVuL3Rlc3RkYXRhL2J6bF9sb2Fkc19zY2wuYnpsIGIvdG9vbHMvcmJjcnVuL3Rlc3RkYXRhL2J6bF9sb2Fkc19zY2wuYnpsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZGVjYTMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9yYmNydW4vdGVzdGRhdGEvYnpsX2xvYWRzX3NjbC5iemwKQEAgLTAsMCArMSwzIEBACitsb2FkKCI6dGVzdF9zY2wuc2NsIiwgX2ZvbyA9ICJmb28iKQorCitmb28gPSBfZm9vCmRpZmYgLS1naXQgYS90b29scy9yYmNydW4vdGVzdGRhdGEvYnpsX2xvYWRzX3NjbF8yLmJ6bCBiL3Rvb2xzL3JiY3J1bi90ZXN0ZGF0YS9iemxfbG9hZHNfc2NsXzIuYnpsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNjgwZWQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9yYmNydW4vdGVzdGRhdGEvYnpsX2xvYWRzX3NjbF8yLmJ6bApAQCAtMCwwICsxLDMgQEAKK2xvYWQoIjpiemxfbG9hZHNfc2NsLmJ6bCIsIF9mb28gPSAiZm9vIikKKworZm9vID0gX2ZvbwpkaWZmIC0tZ2l0IGEvdG9vbHMvcmJjcnVuL3Rlc3RkYXRhL2NsaV9hbmRfZW52LnN0YXIgYi90b29scy9yYmNydW4vdGVzdGRhdGEvY2xpX2FuZF9lbnYuc3RhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZmNDY0YS4uMDAwMDAwMAotLS0gYS90b29scy9yYmNydW4vdGVzdGRhdGEvY2xpX2FuZF9lbnYuc3RhcgorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMgVGVzdHMgcmJsZl9lbnYgYWNjZXNzCi1sb2FkKCJhc3NlcnQuc3RhciIsICJhc3NlcnQiKQotCi0KLWRlZiB0ZXN0KCk6Ci0gICAgYXNzZXJ0LmVxKHJibGZfZW52LlRFU1RfRU5WSVJPTk1FTlRfRk9PLCAidGVzdF9lbnZpcm9ubWVudF9mb28iKQotICAgIGFzc2VydC5mYWlscyhsYW1iZGE6IHJibGZfZW52LkZPT19CQVJfQkFaLCAiLipzdHJ1Y3QgaGFzIG5vIC5GT09fQkFSX0JBWiBhdHRyaWJ1dGUkIikKLSAgICBhc3NlcnQuZXEocmJsZl9jbGkuQ0xJX0ZPTywgImZvbyIpCi0KLQotdGVzdCgpCmRpZmYgLS1naXQgYS90b29scy9yYmNydW4vdGVzdGRhdGEvZmlsZV9vcHMuc3RhciBiL3Rvb2xzL3JiY3J1bi90ZXN0ZGF0YS9maWxlX29wcy5zdGFyCmluZGV4IDJlZTc4ZmMuLmIyYjkwN2MgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JiY3J1bi90ZXN0ZGF0YS9maWxlX29wcy5zdGFyCisrKyBiL3Rvb2xzL3JiY3J1bi90ZXN0ZGF0YS9maWxlX29wcy5zdGFyCkBAIC0xLDIyICsxLDIxIEBACiAjIFRlc3RzIGZpbGUgb3BzIGJ1aWx0aW5zCiBsb2FkKCJhc3NlcnQuc3RhciIsICJhc3NlcnQiKQogCi0KIGRlZiB0ZXN0KCk6CiAgICAgbXluYW1lID0gImZpbGVfb3BzLnN0YXIiCiAgICAgZmlsZXMgPSByYmxmX3dpbGRjYXJkKCIqLnN0YXIiKQogICAgIGFzc2VydC50cnVlKG15bmFtZSBpbiBmaWxlcywgImV4cGVjdGVkICVzIGluICAlcyIgJSAobXluYW1lLCBmaWxlcykpCi0gICAgZmlsZXMgPSByYmxmX3dpbGRjYXJkKCIqLnN0YXIiLCByYmxmX2Vudi5URVNUX0RBVEFfRElSKQorICAgIGZpbGVzID0gcmJsZl93aWxkY2FyZCgiKi5zdGFyIikKICAgICBhc3NlcnQudHJ1ZShteW5hbWUgaW4gZmlsZXMsICJleHBlY3RlZCAlcyBpbiAlcyIgJSAobXluYW1lLCBmaWxlcykpCiAgICAgZmlsZXMgPSByYmxmX3dpbGRjYXJkKCIqLnh4eCIpCiAgICAgYXNzZXJ0LnRydWUobGVuKGZpbGVzKSA9PSAwLCAiZXhwYW5zaW9uIHNob3VsZCBiZSBlbXB0eSBidXQgY29udGFpbnMgJXMiICUgZmlsZXMpCiAgICAgbXlkaXIgPSAidGVzdGRhdGEiCiAgICAgbXlyZWxuYW1lID0gIiVzLyVzIiAlIChteWRpciwgbXluYW1lKQotICAgIGZpbGVzID0gcmJsZl9maW5kX2ZpbGVzKHJibGZfZW52LlRFU1RfREFUQV9ESVIgKyAiLy4uLyIsICIqIikKKyAgICBmaWxlcyA9IHJibGZfZmluZF9maWxlcygiLi4vIiwgIioiKQogICAgIGFzc2VydC50cnVlKG15ZGlyIGluIGZpbGVzIGFuZCBteXJlbG5hbWUgaW4gZmlsZXMsICJleHBlY3RlZCAlcyBhbmQgJXMgaW4gJXMiICUgKG15ZGlyLCBteXJlbG5hbWUsIGZpbGVzKSkKLSAgICBmaWxlcyA9IHJibGZfZmluZF9maWxlcyhyYmxmX2Vudi5URVNUX0RBVEFfRElSICsgIi8uLi8iLCAiKiIsIG9ubHlfZmlsZXM9MSkKKyAgICBmaWxlcyA9IHJibGZfZmluZF9maWxlcygiLi4vIiwgIioiLCBvbmx5X2ZpbGVzPTEpCiAgICAgYXNzZXJ0LnRydWUobXlkaXIgbm90IGluIGZpbGVzLCAiZGlkIG5vdCBleHBlY3QgJXMgaW4gJXMiICUgKG15ZGlyLCBmaWxlcykpCiAgICAgYXNzZXJ0LnRydWUobXlyZWxuYW1lIGluIGZpbGVzLCAiZXhwZWN0ZWQgJXMgIGluICVzIiAlIChteXJlbG5hbWUsIGZpbGVzKSkKLSAgICBmaWxlcyA9IHJibGZfZmluZF9maWxlcyhyYmxmX2Vudi5URVNUX0RBVEFfRElSICsgIi8uLi8iLCAiKi5zdGFyIikKKyAgICBmaWxlcyA9IHJibGZfZmluZF9maWxlcygiLi4vIiwgIiouc3RhciIpCiAgICAgYXNzZXJ0LnRydWUobXlyZWxuYW1lIGluIGZpbGVzLCAiZXhwZWN0ZWQgJXMgaW4gJXMiICUgKG15cmVsbmFtZSwgZmlsZXMpKQogdGVzdCgpCmRpZmYgLS1naXQgYS90b29scy9yYmNydW4vdGVzdGRhdGEvbW9kdWxlMS5zdGFyIGIvdG9vbHMvcmJjcnVuL3Rlc3RkYXRhL21vZHVsZTEuc3RhcgppbmRleCBiZTA0Zjc1Li4wMjkxOWEwIDEwMDY0NAotLS0gYS90b29scy9yYmNydW4vdGVzdGRhdGEvbW9kdWxlMS5zdGFyCisrKyBiL3Rvb2xzL3JiY3J1bi90ZXN0ZGF0YS9tb2R1bGUxLnN0YXIKQEAgLTIsNiArMiw2IEBACiBsb2FkKCJhc3NlcnQuc3RhciIsICJhc3NlcnQiKQogCiAjIE1ha2Ugc3VyZSB0aGF0IGJ1aWx0aW5zIGFyZSBkZWZpbmVkIGZvciB0aGUgbG9hZGVkIG1vZHVsZSwgdG9vCi1hc3NlcnQudHJ1ZShyYmxmX3dpbGRjYXJkKCJtb2R1bGUxLnN0YXIiKSkKLWFzc2VydC50cnVlKG5vdCByYmxmX3dpbGRjYXJkKCJub19zdWNoIGZpbGUiKSkKK2Fzc2VydC50cnVlKHJibGZfd2lsZGNhcmQoInRlc3RkYXRhL21vZHVsZTEuc3RhciIpKQorYXNzZXJ0LnRydWUobm90IHJibGZfd2lsZGNhcmQoInRlc3RkYXRhL25vX3N1Y2ggZmlsZSIpKQogdGVzdCA9ICJtb2R1bGUxIgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmJjcnVuL3Rlc3RkYXRhL3NjbF9pbmNvcnJlY3RseV9sb2Fkc19iemwuc2NsIGIvdG9vbHMvcmJjcnVuL3Rlc3RkYXRhL3NjbF9pbmNvcnJlY3RseV9sb2Fkc19iemwuc2NsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNjgwZWQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9yYmNydW4vdGVzdGRhdGEvc2NsX2luY29ycmVjdGx5X2xvYWRzX2J6bC5zY2wKQEAgLTAsMCArMSwzIEBACitsb2FkKCI6YnpsX2xvYWRzX3NjbC5iemwiLCBfZm9vID0gImZvbyIpCisKK2ZvbyA9IF9mb28KZGlmZiAtLWdpdCBhL3Rvb2xzL3JiY3J1bi90ZXN0ZGF0YS9zaGVsbC5zdGFyIGIvdG9vbHMvcmJjcnVuL3Rlc3RkYXRhL3NoZWxsLnN0YXIKaW5kZXggYWQxMDY5Ny4uZGQxNzM3NSAxMDA2NDQKLS0tIGEvdG9vbHMvcmJjcnVuL3Rlc3RkYXRhL3NoZWxsLnN0YXIKKysrIGIvdG9vbHMvcmJjcnVuL3Rlc3RkYXRhL3NoZWxsLnN0YXIKQEAgLTEsNSArMSw1IEBACiAjIFRlc3RzICJxdWV1ZSIgZGF0YSB0eXBlCiBsb2FkKCJhc3NlcnQuc3RhciIsICJhc3NlcnQiKQogCi1hc3NlcnQuZXEoImxvYWQuc3RhciBzaGVsbC5zdGFyIiwgcmJsZl9zaGVsbCgiY2QgJXMgJiYgbHMgLTEgc2hlbGwuc3RhciBsb2FkLnN0YXIgMj4mMSIgJSByYmxmX2Vudi5URVNUX0RBVEFfRElSKSkKLWFzc2VydC5lcSgic2hlbGwuc3RhciIsIHJibGZfc2hlbGwoImNkICVzICYmIGVjaG8gc2hlbGwuc3RhKiIgJSByYmxmX2Vudi5URVNUX0RBVEFfRElSKSkKK2Fzc2VydC5lcSgibG9hZC5zdGFyIHNoZWxsLnN0YXIiLCByYmxmX3NoZWxsKCJscyAtMSBzaGVsbC5zdGFyIGxvYWQuc3RhciAyPiYxIikpCithc3NlcnQuZXEoInNoZWxsLnN0YXIiLCByYmxmX3NoZWxsKCJlY2hvIHNoZWxsLnN0YSoiKSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3JiY3J1bi90ZXN0ZGF0YS90ZXN0X3NjbC5zY2wgYi90b29scy9yYmNydW4vdGVzdGRhdGEvdGVzdF9zY2wuc2NsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNjBjY2IKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9yYmNydW4vdGVzdGRhdGEvdGVzdF9zY2wuc2NsCkBAIC0wLDAgKzEsMiBAQAorCitmb28gPSAiYmFyIgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmJjcnVuL3Rlc3RkYXRhL3Rlc3Rfc2NsX3N5bWxpbmsuc2NsIGIvdG9vbHMvcmJjcnVuL3Rlc3RkYXRhL3Rlc3Rfc2NsX3N5bWxpbmsuc2NsCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjNmNWFlZjQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9yYmNydW4vdGVzdGRhdGEvdGVzdF9zY2xfc3ltbGluay5zY2wKQEAgLTAsMCArMSBAQAordGVzdF9zY2wuc2NsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL0FuZHJvaWQuYnAgYi90b29scy9yZWxlYXNldG9vbHMvQW5kcm9pZC5icAppbmRleCBkMDcyOTJhLi5lMzcxYjIzIDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvQW5kcm9pZC5icAorKysgYi90b29scy9yZWxlYXNldG9vbHMvQW5kcm9pZC5icApAQCAtOTYsMTkgKzk2LDE5IEBACiAgICAgXSwKICAgICBsaWJzOiBbCiAgICAgICAgICJhcGV4X21hbmlmZXN0IiwKKyAgICAgICAgInJlbGVhc2V0b29sc19hcGV4X3V0aWxzIiwKICAgICAgICAgInJlbGVhc2V0b29sc19jb21tb24iLAogICAgIF0sCiAgICAgcmVxdWlyZWQ6IFsKKyAgICAgICAgImFwZXhkX2hvc3QiLAogICAgICAgICAiY2hlY2t2aW50ZiIsCi0gICAgICAgICJkZWFwZXhlciIsCi0gICAgICAgICJkdW1wX2FwZXhfaW5mbyIsCiAgICAgXSwKIH0KIAogcHl0aG9uX2xpYnJhcnlfaG9zdCB7CiAgICAgbmFtZTogIm90YV9tZXRhZGF0YV9wcm90byIsCiAgICAgc3JjczogWwotICAgICAgICJvdGFfbWV0YWRhdGEucHJvdG8iLAorICAgICAgICAib3RhX21ldGFkYXRhLnByb3RvIiwKICAgICBdLAogICAgIHByb3RvOiB7CiAgICAgICAgIGNhbm9uaWNhbF9wYXRoX2Zyb21fcm9vdDogZmFsc2UsCkBAIC0xMTgsNyArMTE4LDcgQEAKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAib3RhX21ldGFkYXRhX3Byb3RvX2NjIiwKICAgICBzcmNzOiBbCi0gICAgICAgIm90YV9tZXRhZGF0YS5wcm90byIsCisgICAgICAgICJvdGFfbWV0YWRhdGEucHJvdG8iLAogICAgIF0sCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAgICAgcmVjb3ZlcnlfYXZhaWxhYmxlOiB0cnVlLApAQCAtMTQ1LDcgKzE0NSw3IEBACiAgICAgICAgICAgICBzdGF0aWNfbGliczogWyJsaWJwcm90b2J1Zi1qYXZhLW5hbm8iXSwKICAgICAgICAgfSwKICAgICB9LAotICAgIHZpc2liaWxpdHk6IFsiLy9mcmFtZXdvcmtzL2Jhc2U6X19zdWJwYWNrYWdlc19fIl0KKyAgICB2aXNpYmlsaXR5OiBbIi8vZnJhbWV3b3Jrcy9iYXNlOl9fc3VicGFja2FnZXNfXyJdLAogfQogCiBweXRob25fZGVmYXVsdHMgewpAQCAtMTY2LDEwICsxNjYsOSBAQAogICAgICAgICAib3RhX3V0aWxzX2xpYiIsCiAgICAgXSwKICAgICByZXF1aXJlZDogWworICAgICAgICAiYXBleGRfaG9zdCIsCiAgICAgICAgICJicmlsbG9fdXBkYXRlX3BheWxvYWQiLAogICAgICAgICAiY2hlY2t2aW50ZiIsCi0gICAgICAgICJnZW5lcmF0ZV9na2lfY2VydGlmaWNhdGUiLAotICAgICAgICAibWluaWd6aXAiLAogICAgICAgICAibHo0IiwKICAgICAgICAgInRveWJveCIsCiAgICAgICAgICJ1bnBhY2tfYm9vdGltZyIsCkBAIC0yNDYsOSArMjQ1LDYgQEAKICAgICAgICAgImJvb3Rfc2lnbmVyIiwKICAgICAgICAgImJyb3RsaSIsCiAgICAgICAgICJic2RpZmYiLAotICAgICAgICAiZ2VuZXJhdGVfZ2tpX2NlcnRpZmljYXRlIiwKLSAgICAgICAgImltZ2RpZmYiLAotICAgICAgICAibWluaWd6aXAiLAogICAgICAgICAibHo0IiwKICAgICAgICAgIm1rYm9vdGZzIiwKICAgICAgICAgInNpZ25hcGsiLApAQCAtMzEyLDkgKzMwOCw2IEBACiAgICAgICAgICJicm90bGkiLAogICAgICAgICAiYnNkaWZmIiwKICAgICAgICAgImRlYXBleGVyIiwKLSAgICAgICAgImdlbmVyYXRlX2draV9jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICJpbWdkaWZmIiwKLSAgICAgICAgIm1pbmlnemlwIiwKICAgICAgICAgImx6NCIsCiAgICAgICAgICJta2Jvb3RmcyIsCiAgICAgICAgICJzaWduYXBrIiwKQEAgLTMzNiw2ICszMjksNyBAQAogICAgIHNyY3M6IFsKICAgICAgICAgIm90YV91dGlscy5weSIsCiAgICAgICAgICJwYXlsb2FkX3NpZ25lci5weSIsCisgICAgICAgICJvdGFfc2lnbmluZ191dGlscy5weSIsCiAgICAgXSwKICAgICBsaWJzOiBbCiAgICAgICAgICJyZWxlYXNldG9vbHNfY29tbW9uIiwKQEAgLTM3NCw2ICszNjgsOSBAQAogICAgIGxpYnM6IFsKICAgICAgICAgIm90YV91dGlsc19saWIiLAogICAgIF0sCisgICAgcmVxdWlyZWQ6IFsKKyAgICAgICAgInNpZ25hcGsiLAorICAgIF0sCiB9CiAKIHB5dGhvbl9iaW5hcnlfaG9zdCB7CkBAIC00NDMsNyArNDQwLDcgQEAKICAgICBuYW1lOiAiY2hlY2tfdGFyZ2V0X2ZpbGVzX3ZpbnRmIiwKICAgICBkZWZhdWx0czogWwogICAgICAgICAicmVsZWFzZXRvb2xzX2JpbmFyeV9kZWZhdWx0cyIsCi0gICAgICAgICJyZWxlYXNldG9vbHNfY2hlY2tfdGFyZ2V0X2ZpbGVzX3ZpbnRmX2RlZmF1bHRzIgorICAgICAgICAicmVsZWFzZXRvb2xzX2NoZWNrX3RhcmdldF9maWxlc192aW50Zl9kZWZhdWx0cyIsCiAgICAgXSwKIH0KIApAQCAtNTAwLDYgKzQ5NywyNSBAQAogfQogCiBweXRob25fYmluYXJ5X2hvc3QgeworICAgIG5hbWU6ICJvdGFfZnJvbV9yYXdfaW1nIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJvdGFfZnJvbV9yYXdfaW1nLnB5IiwKKyAgICBdLAorICAgIG1haW46ICJvdGFfZnJvbV9yYXdfaW1nLnB5IiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAicmVsZWFzZXRvb2xzX2JpbmFyeV9kZWZhdWx0cyIsCisgICAgXSwKKyAgICByZXF1aXJlZDogWworICAgICAgICAiZGVsdGFfZ2VuZXJhdG9yIiwKKyAgICBdLAorICAgIGxpYnM6IFsKKyAgICAgICAgIm90YV9tZXRhZGF0YV9wcm90byIsCisgICAgICAgICJyZWxlYXNldG9vbHNfY29tbW9uIiwKKyAgICAgICAgIm90YV91dGlsc19saWIiLAorICAgIF0sCit9CisKK3B5dGhvbl9iaW5hcnlfaG9zdCB7CiAgICAgbmFtZTogIm90YV9wYWNrYWdlX3BhcnNlciIsCiAgICAgZGVmYXVsdHM6IFsicmVsZWFzZXRvb2xzX2JpbmFyeV9kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsKQEAgLTUzNCwxMSArNTUwLDE1IEBACiAgICAgZGVmYXVsdHM6IFsicmVsZWFzZXRvb2xzX2JpbmFyeV9kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsKICAgICAgICAgInNpZ25fdGFyZ2V0X2ZpbGVzX2Fwa3MucHkiLAorICAgICAgICAib3RhX2Zyb21fcmF3X2ltZy5weSIsCiAgICAgXSwKICAgICBsaWJzOiBbCiAgICAgICAgICJyZWxlYXNldG9vbHNfYWRkX2ltZ190b190YXJnZXRfZmlsZXMiLAogICAgICAgICAicmVsZWFzZXRvb2xzX2FwZXhfdXRpbHMiLAogICAgICAgICAicmVsZWFzZXRvb2xzX2NvbW1vbiIsCisgICAgICAgICJvdGFfbWV0YWRhdGFfcHJvdG8iLAorICAgICAgICAib3RhX3V0aWxzX2xpYiIsCisgICAgICAgICJ1cGRhdGVfcGF5bG9hZCIsCiAgICAgXSwKIH0KIApAQCAtNjE3LDkgKzYzNywxMCBAQAogICAgIF0sCiAgICAgZGF0YTogWwogICAgICAgICAidGVzdGRhdGEvKiovKiIsCisgICAgXSwKKyAgICBkZXZpY2VfY29tbW9uX2RhdGE6IFsKICAgICAgICAgIjpjb20uYW5kcm9pZC5hcGV4LmNvbXByZXNzZWQudjEiLAotICAgICAgICAiOmNvbS5hbmRyb2lkLmFwZXguY29tcHJlc3NlZC52MV9vcmlnaW5hbCIsCi0gICAgICAgICI6Y29tLmFuZHJvaWQuYXBleC52ZW5kb3IuZm9vLndpdGhfdmludGYiCisgICAgICAgICI6Y29tLmFuZHJvaWQuYXBleC52ZW5kb3IuZm9vLndpdGhfdmludGYiLAogICAgIF0sCiAgICAgdGFyZ2V0OiB7CiAgICAgICAgIGRhcndpbjogewpAQCAtNjI4LDYgKzY0OSw3IEBACiAgICAgICAgIH0sCiAgICAgfSwKICAgICByZXF1aXJlZDogWworICAgICAgICAiYXBleGRfaG9zdCIsCiAgICAgICAgICJkZWFwZXhlciIsCiAgICAgXSwKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9hZGRfaW1nX3RvX3RhcmdldF9maWxlcy5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9hZGRfaW1nX3RvX3RhcmdldF9maWxlcy5weQppbmRleCBhYzMyNzFiLi4zMGE2YWNjIDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvYWRkX2ltZ190b190YXJnZXRfZmlsZXMucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL2FkZF9pbWdfdG9fdGFyZ2V0X2ZpbGVzLnB5CkBAIC00Miw2ICs0MiwxMCBAQAogICAtLWlzX3NpZ25pbmcKICAgICAgIFNraXAgYnVpbGRpbmcgJiBhZGRpbmcgdGhlIGltYWdlcyBmb3IgInVzZXJkYXRhIiBhbmQgImNhY2hlIiBpZiB3ZQogICAgICAgYXJlIHNpZ25pbmcgdGhlIHRhcmdldCBmaWxlcy4KKworICAtLWF2Yi1yZXNvbHZlLXJvbGxiYWNrLWluZGV4LWxvY2F0aW9uLWNvbmZsaWN0CisgICAgICBJZiBwcm92aWRlZCwgcmVzb2x2ZSB0aGUgY29uZmxpY3QgQVZCIHJvbGxiYWNrIGluZGV4IGxvY2F0aW9uIHdoZW4KKyAgICAgIG5lY2Vzc2FyeS4KICIiIgogCiBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCkBAIC02NSw5ICs2OSwxMCBAQAogaW1wb3J0IG90YV9tZXRhZGF0YV9wYjIKIGltcG9ydCByYW5nZWxpYgogaW1wb3J0IHNwYXJzZV9pbWcKLQorZnJvbSBjb25jdXJyZW50LmZ1dHVyZXMgaW1wb3J0IFRocmVhZFBvb2xFeGVjdXRvcgogZnJvbSBhcGV4X3V0aWxzIGltcG9ydCBHZXRBcGV4SW5mb0Zyb21UYXJnZXRGaWxlcwogZnJvbSBjb21tb24gaW1wb3J0IFppcERlbGV0ZSwgUEFSVElUSU9OU19XSVRIX0NBUkVfTUFQLCBFeHRlcm5hbEVycm9yLCBSdW5BbmRDaGVja091dHB1dCwgSXNTcGFyc2VJbWFnZSwgTWFrZVRlbXBGaWxlLCBaaXBXcml0ZQorZnJvbSBidWlsZF9pbWFnZSBpbXBvcnQgRklYRURfRklMRV9USU1FU1RBTVAKIAogaWYgc3lzLmhleHZlcnNpb24gPCAweDAyMDcwMDAwOgogICBwcmludCgiUHl0aG9uIDIuNyBvciBuZXdlciBpcyByZXF1aXJlZC4iLCBmaWxlPXN5cy5zdGRlcnIpCkBAIC04MCwxMiArODUsNyBAQAogT1BUSU9OUy5yZWJ1aWxkX3JlY292ZXJ5ID0gRmFsc2UKIE9QVElPTlMucmVwbGFjZV91cGRhdGVkX2ZpbGVzX2xpc3QgPSBbXQogT1BUSU9OUy5pc19zaWduaW5nID0gRmFsc2UKLQotIyBVc2UgYSBmaXhlZCB0aW1lc3RhbXAgKDAxLzAxLzIwMDkgMDA6MDA6MDAgVVRDKSBmb3IgZmlsZXMgd2hlbiBwYWNrYWdpbmcKLSMgaW1hZ2VzLiAoYi8yNDM3Nzk5MywgYi84MDYwMDkzMSkKLUZJWEVEX0ZJTEVfVElNRVNUQU1QID0gaW50KCgKLSAgICBkYXRldGltZS5kYXRldGltZSgyMDA5LCAxLCAxLCAwLCAwLCAwLCAwLCBOb25lKSAtCi0gICAgZGF0ZXRpbWUuZGF0ZXRpbWUudXRjZnJvbXRpbWVzdGFtcCgwKSkudG90YWxfc2Vjb25kcygpKQorT1BUSU9OUy5hdmJfcmVzb2x2ZV9yb2xsYmFja19pbmRleF9sb2NhdGlvbl9jb25mbGljdCA9IEZhbHNlCiAKIAogZGVmIFBhcnNlQXZiRm9vdGVyKGltZ19wYXRoKSAtPiBhdmJ0b29sLkF2YkZvb3RlcjoKQEAgLTQ2NCw2ICs0NjQsNyBAQAogICBkdGJvX3ByZWJ1aWx0X3BhdGggPSBvcy5wYXRoLmpvaW4oCiAgICAgICBPUFRJT05TLmlucHV0X3RtcCwgIlBSRUJVSUxUX0lNQUdFUyIsICJkdGJvLmltZyIpCiAgIGFzc2VydCBvcy5wYXRoLmV4aXN0cyhkdGJvX3ByZWJ1aWx0X3BhdGgpCisgIG9zLm1ha2VkaXJzKG9zLnBhdGguZGlybmFtZShpbWcubmFtZSksIGV4aXN0X29rPVRydWUpCiAgIHNodXRpbC5jb3B5KGR0Ym9fcHJlYnVpbHRfcGF0aCwgaW1nLm5hbWUpCiAKICAgIyBBVkItc2lnbiB0aGUgaW1hZ2UgYXMgbmVlZGVkLgpAQCAtNTIyLDEyICs1MjMsMTQgQEAKICAgcmV0dXJuIGltZy5uYW1lCiAKIAotZGVmIEFkZEN1c3RvbUltYWdlcyhvdXRwdXRfemlwLCBwYXJ0aXRpb25fbmFtZSk6Ci0gICIiIkFkZHMgYW5kIHNpZ25zIGN1c3RvbSBpbWFnZXMgaW4gSU1BR0VTLy4KK2RlZiBBZGRDdXN0b21JbWFnZXMob3V0cHV0X3ppcCwgcGFydGl0aW9uX25hbWUsIGltYWdlX2xpc3QpOgorICAiIiJBZGRzIGFuZCBzaWducyBhdmIgY3VzdG9tIGltYWdlcyBhcyBuZWVkZWQgaW4gSU1BR0VTLy4KIAogICBBcmdzOgogICAgIG91dHB1dF96aXA6IFRoZSBvdXRwdXQgemlwIGZpbGUgKG5lZWRzIHRvIGJlIGFscmVhZHkgb3BlbiksIG9yIE5vbmUgdG8KICAgICAgICAgd3JpdGUgaW1hZ2VzIHRvIE9QVElPTlMuaW5wdXRfdG1wLy4KKyAgICBwYXJ0aXRpb25fbmFtZTogVGhlIGN1c3RvbSBpbWFnZSBwYXJ0aXRpb24gbmFtZS4KKyAgICBpbWFnZV9saXN0OiBUaGUgaW1hZ2UgbGlzdCBvZiB0aGUgY3VzdG9tIGltYWdlIHBhcnRpdGlvbi4KIAogICBVc2VzIHRoZSBpbWFnZSB1bmRlciBJTUFHRVMvIGlmIGl0IGFscmVhZHkgZXhpc3RzLiBPdGhlcndpc2UgbG9va3MgZm9yIHRoZQogICBpbWFnZSB1bmRlciBQUkVCVUlMVF9JTUFHRVMvLCBzaWducyBpdCBhcyBuZWVkZWQsIGFuZCByZXR1cm5zIHRoZSBpbWFnZSBuYW1lLgpAQCAtNTM2LDE5ICs1MzksMjAgQEAKICAgICBBc3NlcnRpb25FcnJvcjogSWYgaW1hZ2UgY2FuJ3QgYmUgZm91bmQuCiAgICIiIgogCisgIGJ1aWxkZXIgPSBOb25lCiAgIGtleV9wYXRoID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJhdmJfe31fa2V5X3BhdGgiLmZvcm1hdChwYXJ0aXRpb25fbmFtZSkpCi0gIGFsZ29yaXRobSA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgiYXZiX3t9X2FsZ29yaXRobSIuZm9ybWF0KHBhcnRpdGlvbl9uYW1lKSkKLSAgZXh0cmFfYXJncyA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgKLSAgICAgICJhdmJfe31fYWRkX2hhc2h0cmVlX2Zvb3Rlcl9hcmdzIi5mb3JtYXQocGFydGl0aW9uX25hbWUpKQotICBwYXJ0aXRpb25fc2l6ZSA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgKLSAgICAgICJhdmJfe31fcGFydGl0aW9uX3NpemUiLmZvcm1hdChwYXJ0aXRpb25fbmFtZSkpCisgIGlmIGtleV9wYXRoIGlzIG5vdCBOb25lOgorICAgIGFsZ29yaXRobSA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgiYXZiX3t9X2FsZ29yaXRobSIuZm9ybWF0KHBhcnRpdGlvbl9uYW1lKSkKKyAgICBleHRyYV9hcmdzID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KAorICAgICAgICAiYXZiX3t9X2FkZF9oYXNodHJlZV9mb290ZXJfYXJncyIuZm9ybWF0KHBhcnRpdGlvbl9uYW1lKSkKKyAgICBwYXJ0aXRpb25fc2l6ZSA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgKKyAgICAgICAgImF2Yl97fV9wYXJ0aXRpb25fc2l6ZSIuZm9ybWF0KHBhcnRpdGlvbl9uYW1lKSkKIAotICBidWlsZGVyID0gdmVyaXR5X3V0aWxzLkNyZWF0ZUN1c3RvbUltYWdlQnVpbGRlcigKLSAgICAgIE9QVElPTlMuaW5mb19kaWN0LCBwYXJ0aXRpb25fbmFtZSwgcGFydGl0aW9uX3NpemUsCi0gICAgICBrZXlfcGF0aCwgYWxnb3JpdGhtLCBleHRyYV9hcmdzKQorICAgIGJ1aWxkZXIgPSB2ZXJpdHlfdXRpbHMuQ3JlYXRlQ3VzdG9tSW1hZ2VCdWlsZGVyKAorICAgICAgICBPUFRJT05TLmluZm9fZGljdCwgcGFydGl0aW9uX25hbWUsIHBhcnRpdGlvbl9zaXplLAorICAgICAgICBrZXlfcGF0aCwgYWxnb3JpdGhtLCBleHRyYV9hcmdzKQogCi0gIGZvciBpbWdfbmFtZSBpbiBPUFRJT05TLmluZm9fZGljdC5nZXQoCi0gICAgICAgICAgImF2Yl97fV9pbWFnZV9saXN0Ii5mb3JtYXQocGFydGl0aW9uX25hbWUpKS5zcGxpdCgpOgorICBmb3IgaW1nX25hbWUgaW4gaW1hZ2VfbGlzdDoKICAgICBjdXN0b21faW1hZ2UgPSBPdXRwdXRGaWxlKAogICAgICAgICBvdXRwdXRfemlwLCBPUFRJT05TLmlucHV0X3RtcCwgIklNQUdFUyIsIGltZ19uYW1lKQogICAgIGlmIG9zLnBhdGguZXhpc3RzKGN1c3RvbV9pbWFnZS5uYW1lKToKQEAgLTU5NCwxNSArNTk4LDYgQEAKICAgaWYgYmxvY2tfbGlzdDoKICAgICBpbWFnZV9wcm9wc1siYmxvY2tfbGlzdCJdID0gYmxvY2tfbGlzdC5uYW1lCiAKLSAgIyBVc2UgcmVwZWF0YWJsZSBleHQ0IEZTIFVVSUQgYW5kIGhhc2hfc2VlZCBVVUlEIChiYXNlZCBvbiBwYXJ0aXRpb24gbmFtZSBhbmQKLSAgIyBidWlsZCBmaW5nZXJwcmludCkuIEFsc28gdXNlIHRoZSBsZWdhY3kgYnVpbGQgaWQsIGJlY2F1c2UgdGhlIHZibWV0YSBkaWdlc3QKLSAgIyBpc24ndCBhdmFpbGFibGUgYXQgdGhpcyBwb2ludC4KLSAgYnVpbGRfaW5mbyA9IGNvbW1vbi5CdWlsZEluZm8oaW5mb19kaWN0LCB1c2VfbGVnYWN5X2lkPVRydWUpCi0gIHV1aWRfc2VlZCA9IHdoYXQgKyAiLSIgKyBidWlsZF9pbmZvLkdldFBhcnRpdGlvbkZpbmdlcnByaW50KHdoYXQpCi0gIGltYWdlX3Byb3BzWyJ1dWlkIl0gPSBzdHIodXVpZC51dWlkNSh1dWlkLk5BTUVTUEFDRV9VUkwsIHV1aWRfc2VlZCkpCi0gIGhhc2hfc2VlZCA9ICJoYXNoX3NlZWQtIiArIHV1aWRfc2VlZAotICBpbWFnZV9wcm9wc1siaGFzaF9zZWVkIl0gPSBzdHIodXVpZC51dWlkNSh1dWlkLk5BTUVTUEFDRV9VUkwsIGhhc2hfc2VlZCkpCi0KICAgYnVpbGRfaW1hZ2UuQnVpbGRJbWFnZSgKICAgICAgIG9zLnBhdGguam9pbihpbnB1dF9kaXIsIHdoYXQudXBwZXIoKSksIGltYWdlX3Byb3BzLCBvdXRwdXRfZmlsZS5uYW1lKQogCkBAIC02OTMsMzkgKzY4OCwxMiBAQAogICAgIGxvZ2dlci5pbmZvKCIlcy5pbWcgYWxyZWFkeSBleGlzdHM7IG5vdCByZWJ1aWxkaW5nLi4uIiwgbmFtZSkKICAgICByZXR1cm4gaW1nLm5hbWUKIAotICBjb21tb24uQnVpbGRWQk1ldGEoaW1nLm5hbWUsIHBhcnRpdGlvbnMsIG5hbWUsIG5lZWRlZF9wYXJ0aXRpb25zKQorICBjb21tb24uQnVpbGRWQk1ldGEoaW1nLm5hbWUsIHBhcnRpdGlvbnMsIG5hbWUsIG5lZWRlZF9wYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgT1BUSU9OUy5hdmJfcmVzb2x2ZV9yb2xsYmFja19pbmRleF9sb2NhdGlvbl9jb25mbGljdCkKICAgaW1nLldyaXRlKCkKICAgcmV0dXJuIGltZy5uYW1lCiAKIAotZGVmIEFkZFBhcnRpdGlvblRhYmxlKG91dHB1dF96aXApOgotICAiIiJDcmVhdGUgYSBwYXJ0aXRpb24gdGFibGUgaW1hZ2UgYW5kIHN0b3JlIGl0IGluIG91dHB1dF96aXAuIiIiCi0KLSAgaW1nID0gT3V0cHV0RmlsZSgKLSAgICAgIG91dHB1dF96aXAsIE9QVElPTlMuaW5wdXRfdG1wLCAiSU1BR0VTIiwgInBhcnRpdGlvbi10YWJsZS5pbWciKQotICBicHQgPSBPdXRwdXRGaWxlKAotICAgICAgb3V0cHV0X3ppcCwgT1BUSU9OUy5pbnB1dF90bXAsICJNRVRBIiwgInBhcnRpdGlvbi10YWJsZS5icHQiKQotCi0gICMgdXNlIEJQVFRPT0wgZnJvbSBlbnZpcm9uLCBvciAiYnB0dG9vbCIgaWYgZW1wdHkgb3Igbm90IHNldC4KLSAgYnB0dG9vbCA9IG9zLmdldGVudigiQlBUVE9PTCIpIG9yICJicHR0b29sIgotICBjbWQgPSBbYnB0dG9vbCwgIm1ha2VfdGFibGUiLCAiLS1vdXRwdXRfanNvbiIsIGJwdC5uYW1lLAotICAgICAgICAgIi0tb3V0cHV0X2dwdCIsIGltZy5uYW1lXQotICBpbnB1dF9maWxlc19zdHIgPSBPUFRJT05TLmluZm9fZGljdFsiYm9hcmRfYnB0X2lucHV0X2ZpbGVzIl0KLSAgaW5wdXRfZmlsZXMgPSBpbnB1dF9maWxlc19zdHIuc3BsaXQoKQotICBmb3IgaSBpbiBpbnB1dF9maWxlczoKLSAgICBjbWQuZXh0ZW5kKFsiLS1pbnB1dCIsIGldKQotICBkaXNrX3NpemUgPSBPUFRJT05TLmluZm9fZGljdC5nZXQoImJvYXJkX2JwdF9kaXNrX3NpemUiKQotICBpZiBkaXNrX3NpemU6Ci0gICAgY21kLmV4dGVuZChbIi0tZGlza19zaXplIiwgZGlza19zaXplXSkKLSAgYXJncyA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgiYm9hcmRfYnB0X21ha2VfdGFibGVfYXJncyIpCi0gIGlmIGFyZ3M6Ci0gICAgY21kLmV4dGVuZChzaGxleC5zcGxpdChhcmdzKSkKLSAgY29tbW9uLlJ1bkFuZENoZWNrT3V0cHV0KGNtZCkKLQotICBpbWcuV3JpdGUoKQotICBicHQuV3JpdGUoKQotCi0KIGRlZiBBZGRDYWNoZShvdXRwdXRfemlwKToKICAgIiIiQ3JlYXRlIGFuIGVtcHR5IGNhY2hlIGltYWdlIGFuZCBzdG9yZSBpdCBpbiBvdXRwdXRfemlwLiIiIgogCkBAIC04NjgsOCArODM2LDcgQEAKIAogCiBkZWYgQWRkQXBleEluZm8ob3V0cHV0X3ppcCk6Ci0gIGFwZXhfaW5mb3MgPSBHZXRBcGV4SW5mb0Zyb21UYXJnZXRGaWxlcyhPUFRJT05TLmlucHV0X3RtcCwgJ3N5c3RlbScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkX29ubHk9RmFsc2UpCisgIGFwZXhfaW5mb3MgPSBHZXRBcGV4SW5mb0Zyb21UYXJnZXRGaWxlcyhPUFRJT05TLmlucHV0X3RtcCkKICAgYXBleF9tZXRhZGF0YV9wcm90byA9IG90YV9tZXRhZGF0YV9wYjIuQXBleE1ldGFkYXRhKCkKICAgYXBleF9tZXRhZGF0YV9wcm90by5hcGV4X2luZm8uZXh0ZW5kKGFwZXhfaW5mb3MpCiAgIGFwZXhfaW5mb19ieXRlcyA9IGFwZXhfbWV0YWRhdGFfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQpAQCAtMTA4Myw4ICsxMDUwLDE1IEBACiAgICAgICAoInN5c3RlbV9kbGttIiwgaGFzX3N5c3RlbV9kbGttLCBBZGRTeXN0ZW1EbGttLCBbXSksCiAgICAgICAoInN5c3RlbV9vdGhlciIsIGhhc19zeXN0ZW1fb3RoZXIsIEFkZFN5c3RlbU90aGVyLCBbXSksCiAgICkKLSAgZm9yIGNhbGwgaW4gYWRkX3BhcnRpdGlvbl9jYWxsczoKLSAgICBhZGRfcGFydGl0aW9uKCpjYWxsKQorICAjIElmIG91dHB1dF96aXAgZXhpc3RzLCBlYWNoIGFkZF9wYXJ0aXRpb25fY2FsbHMgd3JpdGVzIGJ5dGVzIHRvIHRoZSBzYW1lIG91dHB1dF96aXAsCisgICMgd2hpY2ggaXMgbm90IHRocmVhZC1zYWZlLiBTbywgcnVuIHRoZW0gaW4gc2VyaWFsIGlmIG91dHB1dF96aXAgZXhpc3RzLgorICBpZiBvdXRwdXRfemlwOgorICAgIGZvciBjYWxsIGluIGFkZF9wYXJ0aXRpb25fY2FsbHM6CisgICAgICBhZGRfcGFydGl0aW9uKCpjYWxsKQorICBlbHNlOgorICAgIHdpdGggVGhyZWFkUG9vbEV4ZWN1dG9yKG1heF93b3JrZXJzPWxlbihhZGRfcGFydGl0aW9uX2NhbGxzKSkgYXMgZXhlY3V0b3I6CisgICAgICBmb3IgZnV0dXJlIGluIFtleGVjdXRvci5zdWJtaXQoYWRkX3BhcnRpdGlvbiwgKmNhbGwpIGZvciBjYWxsIGluIGFkZF9wYXJ0aXRpb25fY2FsbHNdOgorICAgICAgICBmdXR1cmUucmVzdWx0KCkKIAogICBBZGRBcGV4SW5mbyhvdXRwdXRfemlwKQogCkBAIC0xMDk0LDEwICsxMDY4LDYgQEAKICAgICBiYW5uZXIoImNhY2hlIikKICAgICBBZGRDYWNoZShvdXRwdXRfemlwKQogCi0gIGlmIE9QVElPTlMuaW5mb19kaWN0LmdldCgiYm9hcmRfYnB0X2VuYWJsZSIpID09ICJ0cnVlIjoKLSAgICBiYW5uZXIoInBhcnRpdGlvbi10YWJsZSIpCi0gICAgQWRkUGFydGl0aW9uVGFibGUob3V0cHV0X3ppcCkKLQogICBhZGRfcGFydGl0aW9uKCJkdGJvIiwKICAgICAgICAgICAgICAgICBPUFRJT05TLmluZm9fZGljdC5nZXQoImhhc19kdGJvIikgPT0gInRydWUiLCBBZGREdGJvLCBbXSkKICAgYWRkX3BhcnRpdGlvbigicHZtZnciLApAQCAtMTEwNSwyMSArMTA3NSwzMiBAQAogCiAgICMgQ3VzdG9tIGltYWdlcy4KICAgY3VzdG9tX3BhcnRpdGlvbnMgPSBPUFRJT05TLmluZm9fZGljdC5nZXQoCi0gICAgICAiYXZiX2N1c3RvbV9pbWFnZXNfcGFydGl0aW9uX2xpc3QiLCAiIikuc3RyaXAoKS5zcGxpdCgpCisgICAgICAiY3VzdG9tX2ltYWdlc19wYXJ0aXRpb25fbGlzdCIsICIiKS5zdHJpcCgpLnNwbGl0KCkKICAgZm9yIHBhcnRpdGlvbl9uYW1lIGluIGN1c3RvbV9wYXJ0aXRpb25zOgogICAgIHBhcnRpdGlvbl9uYW1lID0gcGFydGl0aW9uX25hbWUuc3RyaXAoKQogICAgIGJhbm5lcigiY3VzdG9tIGltYWdlcyBmb3IgIiArIHBhcnRpdGlvbl9uYW1lKQotICAgIHBhcnRpdGlvbnNbcGFydGl0aW9uX25hbWVdID0gQWRkQ3VzdG9tSW1hZ2VzKG91dHB1dF96aXAsIHBhcnRpdGlvbl9uYW1lKQorICAgIGltYWdlX2xpc3QgPSBPUFRJT05TLmluZm9fZGljdC5nZXQoCisgICAgICAgICAgInt9X2ltYWdlX2xpc3QiLmZvcm1hdChwYXJ0aXRpb25fbmFtZSkpLnNwbGl0KCkKKyAgICBwYXJ0aXRpb25zW3BhcnRpdGlvbl9uYW1lXSA9IEFkZEN1c3RvbUltYWdlcyhvdXRwdXRfemlwLCBwYXJ0aXRpb25fbmFtZSwgaW1hZ2VfbGlzdCkKKworICBhdmJfY3VzdG9tX3BhcnRpdGlvbnMgPSBPUFRJT05TLmluZm9fZGljdC5nZXQoCisgICAgICAiYXZiX2N1c3RvbV9pbWFnZXNfcGFydGl0aW9uX2xpc3QiLCAiIikuc3RyaXAoKS5zcGxpdCgpCisgIGZvciBwYXJ0aXRpb25fbmFtZSBpbiBhdmJfY3VzdG9tX3BhcnRpdGlvbnM6CisgICAgcGFydGl0aW9uX25hbWUgPSBwYXJ0aXRpb25fbmFtZS5zdHJpcCgpCisgICAgYmFubmVyKCJhdmIgY3VzdG9tIGltYWdlcyBmb3IgIiArIHBhcnRpdGlvbl9uYW1lKQorICAgIGltYWdlX2xpc3QgPSBPUFRJT05TLmluZm9fZGljdC5nZXQoCisgICAgICAgICAgImF2Yl97fV9pbWFnZV9saXN0Ii5mb3JtYXQocGFydGl0aW9uX25hbWUpKS5zcGxpdCgpCisgICAgcGFydGl0aW9uc1twYXJ0aXRpb25fbmFtZV0gPSBBZGRDdXN0b21JbWFnZXMob3V0cHV0X3ppcCwgcGFydGl0aW9uX25hbWUsIGltYWdlX2xpc3QpCiAKICAgaWYgT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJhdmJfZW5hYmxlIikgPT0gInRydWUiOgogICAgICMgdmJtZXRhX3BhcnRpdGlvbnMgaW5jbHVkZXMgdGhlIHBhcnRpdGlvbnMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW50bwogICAgICMgdG9wLWxldmVsIHZibWV0YS5pbWcsIHdoaWNoIGFyZSB0aGUgb25lcyB0aGF0IGFyZSBub3QgaW5jbHVkZWQgaW4gYW55CiAgICAgIyBjaGFpbmVkIFZCTWV0YSBpbWFnZSBwbHVzIHRoZSBjaGFpbmVkIFZCTWV0YSBpbWFnZXMgdGhlbXNlbHZlcy4KLSAgICAjIEN1cnJlbnRseSBjdXN0b21fcGFydGl0aW9ucyBhcmUgYWxsIGNoYWluZWQgdG8gVkJNZXRhIGltYWdlLgotICAgIHZibWV0YV9wYXJ0aXRpb25zID0gY29tbW9uLkFWQl9QQVJUSVRJT05TWzpdICsgdHVwbGUoY3VzdG9tX3BhcnRpdGlvbnMpCisgICAgIyBDdXJyZW50bHkgYXZiX2N1c3RvbV9wYXJ0aXRpb25zIGFyZSBhbGwgY2hhaW5lZCB0byBWQk1ldGEgaW1hZ2UuCisgICAgdmJtZXRhX3BhcnRpdGlvbnMgPSBjb21tb24uQVZCX1BBUlRJVElPTlNbOl0gKyB0dXBsZShhdmJfY3VzdG9tX3BhcnRpdGlvbnMpCiAKICAgICB2Ym1ldGFfc3lzdGVtID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJhdmJfdmJtZXRhX3N5c3RlbSIsICIiKS5zdHJpcCgpCi0gICAgaWYgdmJtZXRhX3N5c3RlbToKKyAgICBpZiB2Ym1ldGFfc3lzdGVtIGFuZCBzZXQodmJtZXRhX3N5c3RlbS5zcGxpdCgpKS5pbnRlcnNlY3Rpb24ocGFydGl0aW9ucyk6CiAgICAgICBiYW5uZXIoInZibWV0YV9zeXN0ZW0iKQogICAgICAgcGFydGl0aW9uc1sidmJtZXRhX3N5c3RlbSJdID0gQWRkVkJNZXRhKAogICAgICAgICAgIG91dHB1dF96aXAsIHBhcnRpdGlvbnMsICJ2Ym1ldGFfc3lzdGVtIiwgdmJtZXRhX3N5c3RlbS5zcGxpdCgpKQpAQCAtMTEyOSw3ICsxMTEwLDcgQEAKICAgICAgIHZibWV0YV9wYXJ0aXRpb25zLmFwcGVuZCgidmJtZXRhX3N5c3RlbSIpCiAKICAgICB2Ym1ldGFfdmVuZG9yID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJhdmJfdmJtZXRhX3ZlbmRvciIsICIiKS5zdHJpcCgpCi0gICAgaWYgdmJtZXRhX3ZlbmRvcjoKKyAgICBpZiB2Ym1ldGFfdmVuZG9yIGFuZCBzZXQodmJtZXRhX3ZlbmRvci5zcGxpdCgpKS5pbnRlcnNlY3Rpb24ocGFydGl0aW9ucyk6CiAgICAgICBiYW5uZXIoInZibWV0YV92ZW5kb3IiKQogICAgICAgcGFydGl0aW9uc1sidmJtZXRhX3ZlbmRvciJdID0gQWRkVkJNZXRhKAogICAgICAgICAgIG91dHB1dF96aXAsIHBhcnRpdGlvbnMsICJ2Ym1ldGFfdmVuZG9yIiwgdmJtZXRhX3ZlbmRvci5zcGxpdCgpKQpAQCAtMTEzNywxNCArMTExOCwxOCBAQAogICAgICAgICAgIGl0ZW0gZm9yIGl0ZW0gaW4gdmJtZXRhX3BhcnRpdGlvbnMKICAgICAgICAgICBpZiBpdGVtIG5vdCBpbiB2Ym1ldGFfdmVuZG9yLnNwbGl0KCldCiAgICAgICB2Ym1ldGFfcGFydGl0aW9ucy5hcHBlbmQoInZibWV0YV92ZW5kb3IiKQotICAgIGN1c3RvbV9hdmJfcGFydGl0aW9ucyA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgiYXZiX2N1c3RvbV92Ym1ldGFfaW1hZ2VzX3BhcnRpdGlvbl9saXN0IiwgIiIpLnN0cmlwKCkuc3BsaXQoKQorICAgIGN1c3RvbV9hdmJfcGFydGl0aW9ucyA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgKKyAgICAgICAgImF2Yl9jdXN0b21fdmJtZXRhX2ltYWdlc19wYXJ0aXRpb25fbGlzdCIsICIiKS5zdHJpcCgpLnNwbGl0KCkKICAgICBpZiBjdXN0b21fYXZiX3BhcnRpdGlvbnM6CiAgICAgICBmb3IgYXZiX3BhcnQgaW4gY3VzdG9tX2F2Yl9wYXJ0aXRpb25zOgogICAgICAgICBwYXJ0aXRpb25fbmFtZSA9ICJ2Ym1ldGFfIiArIGF2Yl9wYXJ0Ci0gICAgICAgIGluY2x1ZGVkX3BhcnRpdGlvbnMgPSBPUFRJT05TLmluZm9fZGljdC5nZXQoImF2Yl92Ym1ldGFfe30iLmZvcm1hdChhdmJfcGFydCksICIiKS5zdHJpcCgpLnNwbGl0KCkKLSAgICAgICAgYXNzZXJ0IGluY2x1ZGVkX3BhcnRpdGlvbnMsICJDdXN0b20gdmJtZXRhIHBhcnRpdGlvbiB7MH0gbWlzc2luZyBhdmJfdmJtZXRhX3swfSBwcm9wIi5mb3JtYXQoYXZiX3BhcnQpCisgICAgICAgIGluY2x1ZGVkX3BhcnRpdGlvbnMgPSBPUFRJT05TLmluZm9fZGljdC5nZXQoCisgICAgICAgICAgICAiYXZiX3ZibWV0YV97fSIuZm9ybWF0KGF2Yl9wYXJ0KSwgIiIpLnN0cmlwKCkuc3BsaXQoKQorICAgICAgICBhc3NlcnQgaW5jbHVkZWRfcGFydGl0aW9ucywgIkN1c3RvbSB2Ym1ldGEgcGFydGl0aW9uIHswfSBtaXNzaW5nIGF2Yl92Ym1ldGFfezB9IHByb3AiLmZvcm1hdCgKKyAgICAgICAgICAgIGF2Yl9wYXJ0KQogICAgICAgICBiYW5uZXIocGFydGl0aW9uX25hbWUpCi0gICAgICAgIGxvZ2dlci5pbmZvKCJWQk1ldGEgcGFydGl0aW9uIHt9IG5lZWRzIHt9Ii5mb3JtYXQocGFydGl0aW9uX25hbWUsIGluY2x1ZGVkX3BhcnRpdGlvbnMpKQorICAgICAgICBsb2dnZXIuaW5mbygiVkJNZXRhIHBhcnRpdGlvbiB7fSBuZWVkcyB7fSIuZm9ybWF0KAorICAgICAgICAgICAgcGFydGl0aW9uX25hbWUsIGluY2x1ZGVkX3BhcnRpdGlvbnMpKQogICAgICAgICBwYXJ0aXRpb25zW3BhcnRpdGlvbl9uYW1lXSA9IEFkZFZCTWV0YSgKICAgICAgICAgICAgIG91dHB1dF96aXAsIHBhcnRpdGlvbnMsIHBhcnRpdGlvbl9uYW1lLCBpbmNsdWRlZF9wYXJ0aXRpb25zKQogICAgICAgICB2Ym1ldGFfcGFydGl0aW9ucyA9IFsKQEAgLTExNTIsOCArMTEzNyw3IEBACiAgICAgICAgICAgICBpZiBpdGVtIG5vdCBpbiBpbmNsdWRlZF9wYXJ0aXRpb25zXQogICAgICAgICB2Ym1ldGFfcGFydGl0aW9ucy5hcHBlbmQocGFydGl0aW9uX25hbWUpCiAKLQotICAgIGlmIE9QVElPTlMuaW5mb19kaWN0LmdldCgiYXZiX2J1aWxkaW5nX3ZibWV0YV9pbWFnZSIpID09ICJ0cnVlIjoKKyAgICBpZiBPUFRJT05TLmluZm9fZGljdC5nZXQoImF2Yl9idWlsZGluZ192Ym1ldGFfaW1hZ2UiKSA9PSAidHJ1ZSIgYW5kIHNldCh2Ym1ldGFfcGFydGl0aW9ucykuaW50ZXJzZWN0aW9uKHBhcnRpdGlvbnMpOgogICAgICAgYmFubmVyKCJ2Ym1ldGEiKQogICAgICAgQWRkVkJNZXRhKG91dHB1dF96aXAsIHBhcnRpdGlvbnMsICJ2Ym1ldGEiLCB2Ym1ldGFfcGFydGl0aW9ucykKIApAQCAtMTI0Niw2ICsxMjMwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIiBwbGVhc2Ugc3dpdGNoIHRvIEFWQiIpCiAgICAgZWxpZiBvID09ICItLWlzX3NpZ25pbmciOgogICAgICAgT1BUSU9OUy5pc19zaWduaW5nID0gVHJ1ZQorICAgIGVsaWYgbyA9PSAiLS1hdmJfcmVzb2x2ZV9yb2xsYmFja19pbmRleF9sb2NhdGlvbl9jb25mbGljdCI6CisgICAgICBPUFRJT05TLmF2Yl9yZXNvbHZlX3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uX2NvbmZsaWN0ID0gVHJ1ZQogICAgIGVsc2U6CiAgICAgICByZXR1cm4gRmFsc2UKICAgICByZXR1cm4gVHJ1ZQpAQCAtMTI1NSw3ICsxMjQxLDggQEAKICAgICAgIGV4dHJhX2xvbmdfb3B0cz1bImFkZF9taXNzaW5nIiwgInJlYnVpbGRfcmVjb3ZlcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVwbGFjZV92ZXJpdHlfcHVibGljX2tleT0iLAogICAgICAgICAgICAgICAgICAgICAgICAicmVwbGFjZV92ZXJpdHlfcHJpdmF0ZV9rZXk9IiwKLSAgICAgICAgICAgICAgICAgICAgICAgImlzX3NpZ25pbmciXSwKKyAgICAgICAgICAgICAgICAgICAgICAgImlzX3NpZ25pbmciLAorICAgICAgICAgICAgICAgICAgICAgICAiYXZiX3Jlc29sdmVfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb25fY29uZmxpY3QiXSwKICAgICAgIGV4dHJhX29wdGlvbl9oYW5kbGVyPW9wdGlvbl9oYW5kbGVyKQogCiAgIGlmIGxlbihhcmdzKSAhPSAxOgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL2FwZXhfdXRpbHMucHkgYi90b29scy9yZWxlYXNldG9vbHMvYXBleF91dGlscy5weQppbmRleCA1OWM3MTJlLi4wOGYyYjgzIDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvYXBleF91dGlscy5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvYXBleF91dGlscy5weQpAQCAtMzYsNiArMzYsOCBAQAogCiBBUEVYX1BVQktFWSA9ICdhcGV4X3B1YmtleScKIAorIyBQYXJ0aXRpb25zIHN1cHBvcnRpbmcgQVBFWGVzCitQQVJUSVRJT05TID0gWydzeXN0ZW0nLCAnc3lzdGVtX2V4dCcsICdwcm9kdWN0JywgJ3ZlbmRvcicsICdvZG0nXQogCiBjbGFzcyBBcGV4SW5mb0Vycm9yKEV4Y2VwdGlvbik6CiAgICIiIkFuIEV4Y2VwdGlvbiByYWlzZWQgZHVyaW5nIEFwZXggSW5mb3JtYXRpb24gY29tbWFuZC4iIiIKQEAgLTY1LDEyICs2NywxMCBAQAogICAgICAgICBPUFRJT05TLnNlYXJjaF9wYXRoLCAiYmluIiwgImRlYnVnZnNfc3RhdGljIikKICAgICBzZWxmLmZzY2tlcm9mc19wYXRoID0gb3MucGF0aC5qb2luKAogICAgICAgICBPUFRJT05TLnNlYXJjaF9wYXRoLCAiYmluIiwgImZzY2suZXJvZnMiKQotICAgIHNlbGYuYmxraWRfcGF0aCA9IG9zLnBhdGguam9pbigKLSAgICAgICAgT1BUSU9OUy5zZWFyY2hfcGF0aCwgImJpbiIsICJibGtpZF9zdGF0aWMiKQogICAgIHNlbGYuYXZidG9vbCA9IGF2YnRvb2wgaWYgYXZidG9vbCBlbHNlICJhdmJ0b29sIgogICAgIHNlbGYuc2lnbl90b29sID0gc2lnbl90b29sCiAKLSAgZGVmIFByb2Nlc3NBcGV4RmlsZShzZWxmLCBhcGtfa2V5cywgcGF5bG9hZF9rZXksIHNpZ25pbmdfYXJncz1Ob25lLCBpc19zZXBvbGljeT1GYWxzZSk6CisgIGRlZiBQcm9jZXNzQXBleEZpbGUoc2VsZiwgYXBrX2tleXMsIHBheWxvYWRfa2V5LCBzaWduaW5nX2FyZ3M9Tm9uZSk6CiAgICAgIiIiU2NhbnMgYW5kIHNpZ25zIHRoZSBwYXlsb2FkIGZpbGVzIGFuZCByZXBhY2sgdGhlIGFwZXgKIAogICAgIEFyZ3M6CkBAIC03OSwyMiArNzksMTMgQEAKICAgICBSZXR1cm5zOgogICAgICAgVGhlIHJlcGFja2VkIGFwZXggZmlsZSBjb250YWluaW5nIHRoZSBzaWduZWQgYXBrIGZpbGVzLgogICAgICIiIgotICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLmRlYnVnZnNfcGF0aCk6Ci0gICAgICByYWlzZSBBcGV4U2lnbmluZ0Vycm9yKAotICAgICAgICAgICJDb3VsZG4ndCBmaW5kIGxvY2F0aW9uIG9mIGRlYnVnZnNfc3RhdGljOiAiICsKLSAgICAgICAgICAiUGF0aCB7fSBkb2VzIG5vdCBleGlzdC4gIi5mb3JtYXQoc2VsZi5kZWJ1Z2ZzX3BhdGgpICsKLSAgICAgICAgICAiTWFrZSBzdXJlIGJpbi9kZWJ1Z2ZzX3N0YXRpYyBjYW4gYmUgZm91bmQgaW4gLXAgPHBhdGg+IikKLSAgICBsaXN0X2NtZCA9IFsnZGVhcGV4ZXInLCAnLS1kZWJ1Z2ZzX3BhdGgnLCBzZWxmLmRlYnVnZnNfcGF0aCwKLSAgICAgICAgICAgICAgICAnbGlzdCcsIHNlbGYuYXBleF9wYXRoXQotICAgIGVudHJpZXNfbmFtZXMgPSBjb21tb24uUnVuQW5kQ2hlY2tPdXRwdXQobGlzdF9jbWQpLnNwbGl0KCkKLSAgICBhcGtfZW50cmllcyA9IFtuYW1lIGZvciBuYW1lIGluIGVudHJpZXNfbmFtZXMgaWYgbmFtZS5lbmRzd2l0aCgnLmFwaycpXQotICAgIHNlcG9saWN5X2VudHJpZXMgPSBbXQotICAgIGlmIGlzX3NlcG9saWN5OgotICAgICAgc2Vwb2xpY3lfZW50cmllcyA9IFtuYW1lIGZvciBuYW1lIGluIGVudHJpZXNfbmFtZXMgaWYKLSAgICAgICAgICBuYW1lLnN0YXJ0c3dpdGgoJy4vZXRjL1NFUG9saWN5JykgYW5kIG5hbWUuZW5kc3dpdGgoJy56aXAnKV0KKyAgICBwYXlsb2FkX2RpciA9IHNlbGYuRXh0cmFjdEFwZXhQYXlsb2FkKHNlbGYuYXBleF9wYXRoKQorICAgIGFwa19lbnRyaWVzID0gW10KKyAgICBmb3IgYmFzZV9kaXIsIF8sIGZpbGVzIGluIG9zLndhbGsocGF5bG9hZF9kaXIpOgorICAgICAgYXBrX2VudHJpZXMuZXh0ZW5kKG9zLnBhdGguam9pbihiYXNlX2RpciwgZmlsZSkgZm9yIGZpbGUgaW4gZmlsZXMgaWYgZmlsZS5lbmRzd2l0aCgnLmFwaycpKQogCiAgICAgIyBObyBuZWVkIHRvIHNpZ24gYW5kIHJlcGFjaywgcmV0dXJuIHRoZSBvcmlnaW5hbCBhcGV4IHBhdGguCi0gICAgaWYgbm90IGFwa19lbnRyaWVzIGFuZCBub3Qgc2Vwb2xpY3lfZW50cmllcyBhbmQgc2VsZi5zaWduX3Rvb2wgaXMgTm9uZToKKyAgICBpZiBub3QgYXBrX2VudHJpZXMgYW5kIHNlbGYuc2lnbl90b29sIGlzIE5vbmU6CiAgICAgICBsb2dnZXIuaW5mbygnTm8gYXBrIGZpbGUgdG8gc2lnbiBpbiAlcycsIHNlbGYuYXBleF9wYXRoKQogICAgICAgcmV0dXJuIHNlbGYuYXBleF9wYXRoCiAKQEAgLTEwOSwxNiArMTAwLDE2IEBACiAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdBcGsgcGF0aCBkb2VzIG5vdCBjb250YWluIHRoZSBpbnRlbmRlZCBkaXJlY3RvcnkgbmFtZTonCiAgICAgICAgICAgICAgICAgICAgICAgICcgJXMnLCBlbnRyeSkKIAotICAgIHBheWxvYWRfZGlyLCBoYXNfc2lnbmVkX2NvbnRlbnQgPSBzZWxmLkV4dHJhY3RBcGV4UGF5bG9hZEFuZFNpZ25Db250ZW50cygKLSAgICAgICAgYXBrX2VudHJpZXMsIHNlcG9saWN5X2VudHJpZXMsIGFwa19rZXlzLCBwYXlsb2FkX2tleSwgc2lnbmluZ19hcmdzKQorICAgIGhhc19zaWduZWRfY29udGVudCA9IHNlbGYuU2lnbkNvbnRlbnRzSW5QYXlsb2FkKAorICAgICAgICBwYXlsb2FkX2RpciwgYXBrX2VudHJpZXMsIGFwa19rZXlzLCBwYXlsb2FkX2tleSwgc2lnbmluZ19hcmdzKQogICAgIGlmIG5vdCBoYXNfc2lnbmVkX2NvbnRlbnQ6Ci0gICAgICBsb2dnZXIuaW5mbygnTm8gY29udGVudHMgaGF2ZSBiZWVuIHNpZ25lZCBpbiAlcycsIHNlbGYuYXBleF9wYXRoKQorICAgICAgbG9nZ2VyLmluZm8oJ05vIGNvbnRlbnRzIGhhcyBiZWVuIHNpZ25lZCBpbiAlcycsIHNlbGYuYXBleF9wYXRoKQogICAgICAgcmV0dXJuIHNlbGYuYXBleF9wYXRoCiAKICAgICByZXR1cm4gc2VsZi5SZXBhY2tBcGV4UGF5bG9hZChwYXlsb2FkX2RpciwgcGF5bG9hZF9rZXksIHNpZ25pbmdfYXJncykKIAotICBkZWYgRXh0cmFjdEFwZXhQYXlsb2FkQW5kU2lnbkNvbnRlbnRzKHNlbGYsIGFwa19lbnRyaWVzLCBzZXBvbGljeV9lbnRyaWVzLCBhcGtfa2V5cywgcGF5bG9hZF9rZXksIHNpZ25pbmdfYXJncyk6Ci0gICAgIiIiRXh0cmFjdHMgdGhlIHBheWxvYWQgaW1hZ2UgYW5kIHNpZ25zIHRoZSBjb250YWluaW5nIGFwayBmaWxlcy4iIiIKKyAgZGVmIEV4dHJhY3RBcGV4UGF5bG9hZChzZWxmLCBhcGV4X3BhdGgpOgorICAgICIiIkV4dHJhY3RzIHRoZSBjb250ZW50cyBvZiBhbiBBUEVYIGFuZCByZXR1cm5zIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIGNvbnRlbnRzIiIiCiAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYuZGVidWdmc19wYXRoKToKICAgICAgIHJhaXNlIEFwZXhTaWduaW5nRXJyb3IoCiAgICAgICAgICAgIkNvdWxkbid0IGZpbmQgbG9jYXRpb24gb2YgZGVidWdmc19zdGF0aWM6ICIgKwpAQCAtMTI5LDIyICsxMjAsMjAgQEAKICAgICAgICAgICAiQ291bGRuJ3QgZmluZCBsb2NhdGlvbiBvZiBmc2NrLmVyb2ZzOiAiICsKICAgICAgICAgICAiUGF0aCB7fSBkb2VzIG5vdCBleGlzdC4gIi5mb3JtYXQoc2VsZi5mc2NrZXJvZnNfcGF0aCkgKwogICAgICAgICAgICJNYWtlIHN1cmUgYmluL2ZzY2suZXJvZnMgY2FuIGJlIGZvdW5kIGluIC1wIDxwYXRoPiIpCi0gICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYuYmxraWRfcGF0aCk6Ci0gICAgICByYWlzZSBBcGV4U2lnbmluZ0Vycm9yKAotICAgICAgICAgICJDb3VsZG4ndCBmaW5kIGxvY2F0aW9uIG9mIGJsa2lkOiAiICsKLSAgICAgICAgICAiUGF0aCB7fSBkb2VzIG5vdCBleGlzdC4gIi5mb3JtYXQoc2VsZi5ibGtpZF9wYXRoKSArCi0gICAgICAgICAgIk1ha2Ugc3VyZSBiaW4vYmxraWQgY2FuIGJlIGZvdW5kIGluIC1wIDxwYXRoPiIpCiAgICAgcGF5bG9hZF9kaXIgPSBjb21tb24uTWFrZVRlbXBEaXIoKQogICAgIGV4dHJhY3RfY21kID0gWydkZWFwZXhlcicsICctLWRlYnVnZnNfcGF0aCcsIHNlbGYuZGVidWdmc19wYXRoLAogICAgICAgICAgICAgICAgICAgICctLWZzY2tlcm9mc19wYXRoJywgc2VsZi5mc2NrZXJvZnNfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAnLS1ibGtpZF9wYXRoJywgc2VsZi5ibGtpZF9wYXRoLCAnZXh0cmFjdCcsCi0gICAgICAgICAgICAgICAgICAgc2VsZi5hcGV4X3BhdGgsIHBheWxvYWRfZGlyXQorICAgICAgICAgICAgICAgICAgICdleHRyYWN0JywKKyAgICAgICAgICAgICAgICAgICBhcGV4X3BhdGgsIHBheWxvYWRfZGlyXQogICAgIGNvbW1vbi5SdW5BbmRDaGVja091dHB1dChleHRyYWN0X2NtZCkKLSAgICBhc3NlcnQgb3MucGF0aC5leGlzdHMoc2VsZi5hcGV4X3BhdGgpCisgICAgcmV0dXJuIHBheWxvYWRfZGlyCiAKKyAgZGVmIFNpZ25Db250ZW50c0luUGF5bG9hZChzZWxmLCBwYXlsb2FkX2RpciwgYXBrX2VudHJpZXMsIGFwa19rZXlzLCBwYXlsb2FkX2tleSwgc2lnbmluZ19hcmdzKToKKyAgICAiIiJTaWducyB0aGUgY29udGVudHMgaW4gcGF5bG9hZC4iIiIKICAgICBoYXNfc2lnbmVkX2NvbnRlbnQgPSBGYWxzZQogICAgIGZvciBlbnRyeSBpbiBhcGtfZW50cmllczoKICAgICAgIGFwa19wYXRoID0gb3MucGF0aC5qb2luKHBheWxvYWRfZGlyLCBlbnRyeSkKKyAgICAgIGFzc2VydCBvcy5wYXRoLmV4aXN0cyhzZWxmLmFwZXhfcGF0aCkKIAogICAgICAga2V5X25hbWUgPSBhcGtfa2V5cy5nZXQob3MucGF0aC5iYXNlbmFtZShlbnRyeSkpCiAgICAgICBpZiBrZXlfbmFtZSBpbiBjb21tb24uU1BFQ0lBTF9DRVJUX1NUUklOR1M6CkBAIC0xNjEsMzcgKzE1MCw2IEBACiAgICAgICAgICAgY29kZW5hbWVfdG9fYXBpX2xldmVsX21hcD1zZWxmLmNvZGVuYW1lX3RvX2FwaV9sZXZlbF9tYXApCiAgICAgICBoYXNfc2lnbmVkX2NvbnRlbnQgPSBUcnVlCiAKLSAgICBmb3IgZW50cnkgaW4gc2Vwb2xpY3lfZW50cmllczoKLSAgICAgIHNlcG9saWN5X3BhdGggPSBvcy5wYXRoLmpvaW4ocGF5bG9hZF9kaXIsIGVudHJ5KQotCi0gICAgICBpZiBub3QgJ2V0YycgaW4gZW50cnk6Ci0gICAgICAgIGxvZ2dlci53YXJuaW5nKCdTZXBvbGljeSBwYXRoIGRvZXMgbm90IGNvbnRhaW4gdGhlIGludGVuZGVkIGRpcmVjdG9yeSBuYW1lIGV0YzonCi0gICAgICAgICAgICAgICAgICAgICAgICcgJXMnLCBlbnRyeSkKLQotICAgICAga2V5X25hbWUgPSBhcGtfa2V5cy5nZXQob3MucGF0aC5iYXNlbmFtZShlbnRyeSkpCi0gICAgICBpZiBrZXlfbmFtZSBpcyBOb25lOgotICAgICAgICBsb2dnZXIud2FybmluZygnRmFpbGVkIHRvIGZpbmQgc2lnbmluZyBrZXlzIGZvciB7fSBpbicKLSAgICAgICAgICAgICAgICAgICAgICAgJyBhcGV4IHt9LCBwYXlsb2FkIGtleSB3aWxsIGJlIHVzZWQgaW5zdGVhZC4nCi0gICAgICAgICAgICAgICAgICAgICAgICcgVXNlICItZSA8bmFtZT49IiB0byBzcGVjaWZ5IGEga2V5JwotICAgICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KGVudHJ5LCBzZWxmLmFwZXhfcGF0aCkpCi0gICAgICAgIGtleV9uYW1lID0gcGF5bG9hZF9rZXkKLQotICAgICAgaWYga2V5X25hbWUgaW4gY29tbW9uLlNQRUNJQUxfQ0VSVF9TVFJJTkdTOgotICAgICAgICBsb2dnZXIuaW5mbygnTm90IHNpZ25pbmc6ICVzIGR1ZSB0byBzcGVjaWFsIGNlcnQgc3RyaW5nJywgc2Vwb2xpY3lfcGF0aCkKLSAgICAgICAgY29udGludWUKLQotICAgICAgaWYgT1BUSU9OUy5zaWduX3NlcG9saWN5X3BhdGggaXMgbm90IE5vbmU6Ci0gICAgICAgIHNpZ19wYXRoID0gb3MucGF0aC5qb2luKHBheWxvYWRfZGlyLCBzZXBvbGljeV9wYXRoICsgJy5zaWcnKQotICAgICAgICBmc3Zfc2lnX3BhdGggPSBvcy5wYXRoLmpvaW4ocGF5bG9hZF9kaXIsIHNlcG9saWN5X3BhdGggKyAnLmZzdl9zaWcnKQotICAgICAgICBvbGRfc2lnID0gY29tbW9uLk1ha2VUZW1wRmlsZSgpCi0gICAgICAgIG9sZF9mc3Zfc2lnID0gY29tbW9uLk1ha2VUZW1wRmlsZSgpCi0gICAgICAgIG9zLnJlbmFtZShzaWdfcGF0aCwgb2xkX3NpZykKLSAgICAgICAgb3MucmVuYW1lKGZzdl9zaWdfcGF0aCwgb2xkX2Zzdl9zaWcpCi0KLSAgICAgIGxvZ2dlci5pbmZvKCdTaWduaW5nIHNlcG9saWN5IGZpbGUgJXMgaW4gYXBleCAlcycsIHNlcG9saWN5X3BhdGgsIHNlbGYuYXBleF9wYXRoKQotICAgICAgaWYgY29tbW9uLlNpZ25TZVBvbGljeShzZXBvbGljeV9wYXRoLCBrZXlfbmFtZSwgc2VsZi5rZXlfcGFzc3dvcmRzLmdldChrZXlfbmFtZSkpOgotICAgICAgICBoYXNfc2lnbmVkX2NvbnRlbnQgPSBUcnVlCi0KICAgICBpZiBzZWxmLnNpZ25fdG9vbDoKICAgICAgIGxvZ2dlci5pbmZvKCdTaWduaW5nIHBheWxvYWQgY29udGVudHMgaW4gYXBleCAlcyB3aXRoICVzJywgc2VsZi5hcGV4X3BhdGgsIHNlbGYuc2lnbl90b29sKQogICAgICAgIyBQYXNzIGF2YnRvb2wgdG8gdGhlIGN1c3RvbSBzaWduaW5nIHRvb2wKQEAgLTIwMyw3ICsxNjEsNyBAQAogICAgICAgY29tbW9uLlJ1bkFuZENoZWNrT3V0cHV0KGNtZCkKICAgICAgIGhhc19zaWduZWRfY29udGVudCA9IFRydWUKIAotICAgIHJldHVybiBwYXlsb2FkX2RpciwgaGFzX3NpZ25lZF9jb250ZW50CisgICAgcmV0dXJuIGhhc19zaWduZWRfY29udGVudAogCiAgIGRlZiBSZXBhY2tBcGV4UGF5bG9hZChzZWxmLCBwYXlsb2FkX2RpciwgcGF5bG9hZF9rZXksIHNpZ25pbmdfYXJncz1Ob25lKToKICAgICAiIiJSZWJ1aWxkcyB0aGUgYXBleCBmaWxlIHdpdGggdGhlIHVwZGF0ZWQgcGF5bG9hZCBkaXJlY3RvcnkuIiIiCkBAIC0zNzUsOCArMzMzLDcgQEAKIAogZGVmIFNpZ25VbmNvbXByZXNzZWRBcGV4KGF2YnRvb2wsIGFwZXhfZmlsZSwgcGF5bG9hZF9rZXksIGNvbnRhaW5lcl9rZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX3B3LCBhcGtfa2V5cywgY29kZW5hbWVfdG9fYXBpX2xldmVsX21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBub19oYXNodHJlZSwgc2lnbmluZ19hcmdzPU5vbmUsIHNpZ25fdG9vbD1Ob25lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3NlcG9saWN5PUZhbHNlKToKKyAgICAgICAgICAgICAgICAgICAgICAgICBub19oYXNodHJlZSwgc2lnbmluZ19hcmdzPU5vbmUsIHNpZ25fdG9vbD1Ob25lKToKICAgIiIiU2lnbnMgdGhlIGN1cnJlbnQgdW5jb21wcmVzc2VkIEFQRVggd2l0aCB0aGUgZ2l2ZW4gcGF5bG9hZC9jb250YWluZXIga2V5cy4KIAogICBBcmdzOgpAQCAtMzg5LDcgKzM0Niw2IEBACiAgICAgbm9faGFzaHRyZWU6IERvbid0IGluY2x1ZGUgaGFzaHRyZWUgaW4gdGhlIHNpZ25lZCBBUEVYLgogICAgIHNpZ25pbmdfYXJnczogQWRkaXRpb25hbCBhcmdzIHRvIGJlIHBhc3NlZCB0byB0aGUgcGF5bG9hZCBzaWduZXIuCiAgICAgc2lnbl90b29sOiBBIHRvb2wgdG8gc2lnbiB0aGUgY29udGVudHMgb2YgdGhlIEFQRVguCi0gICAgaXNfc2Vwb2xpY3k6IEluZGljYXRlcyBpZiB0aGUgYXBleCBpcyBhIHNlcG9saWN5LmFwZXgKIAogICBSZXR1cm5zOgogICAgIFRoZSBwYXRoIHRvIHRoZSBzaWduZWQgQVBFWCBmaWxlLgpAQCAtMzk5LDggKzM1NSw3IEBACiAgIGFwa19zaWduZXIgPSBBcGV4QXBrU2lnbmVyKGFwZXhfZmlsZSwgY29udGFpbmVyX3B3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlbmFtZV90b19hcGlfbGV2ZWxfbWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmJ0b29sLCBzaWduX3Rvb2wpCi0gIGFwZXhfZmlsZSA9IGFwa19zaWduZXIuUHJvY2Vzc0FwZXhGaWxlKAotICAgICAgYXBrX2tleXMsIHBheWxvYWRfa2V5LCBzaWduaW5nX2FyZ3MsIGlzX3NlcG9saWN5KQorICBhcGV4X2ZpbGUgPSBhcGtfc2lnbmVyLlByb2Nlc3NBcGV4RmlsZShhcGtfa2V5cywgcGF5bG9hZF9rZXksIHNpZ25pbmdfYXJncykKIAogICAjIDJhLiBFeHRyYWN0IGFuZCBzaWduIHRoZSBBUEVYX1BBWUxPQURfSU1BR0UgZW50cnkgd2l0aCB0aGUgZ2l2ZW4KICAgIyBwYXlsb2FkX2tleS4KQEAgLTQ1NCw4ICs0MDksNyBAQAogCiBkZWYgU2lnbkNvbXByZXNzZWRBcGV4KGF2YnRvb2wsIGFwZXhfZmlsZSwgcGF5bG9hZF9rZXksIGNvbnRhaW5lcl9rZXksCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9wdywgYXBrX2tleXMsIGNvZGVuYW1lX3RvX2FwaV9sZXZlbF9tYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIG5vX2hhc2h0cmVlLCBzaWduaW5nX2FyZ3M9Tm9uZSwgc2lnbl90b29sPU5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIGlzX3NlcG9saWN5PUZhbHNlKToKKyAgICAgICAgICAgICAgICAgICAgICAgbm9faGFzaHRyZWUsIHNpZ25pbmdfYXJncz1Ob25lLCBzaWduX3Rvb2w9Tm9uZSk6CiAgICIiIlNpZ25zIHRoZSBjdXJyZW50IGNvbXByZXNzZWQgQVBFWCB3aXRoIHRoZSBnaXZlbiBwYXlsb2FkL2NvbnRhaW5lciBrZXlzLgogCiAgIEFyZ3M6CkBAIC00NjcsNyArNDIxLDYgQEAKICAgICBjb2RlbmFtZV90b19hcGlfbGV2ZWxfbWFwOiBBIGRpY3QgdGhhdCBtYXBzIGZyb20gY29kZW5hbWUgdG8gQVBJIGxldmVsLgogICAgIG5vX2hhc2h0cmVlOiBEb24ndCBpbmNsdWRlIGhhc2h0cmVlIGluIHRoZSBzaWduZWQgQVBFWC4KICAgICBzaWduaW5nX2FyZ3M6IEFkZGl0aW9uYWwgYXJncyB0byBiZSBwYXNzZWQgdG8gdGhlIHBheWxvYWQgc2lnbmVyLgotICAgIGlzX3NlcG9saWN5OiBJbmRpY2F0ZXMgaWYgdGhlIGFwZXggaXMgYSBzZXBvbGljeS5hcGV4CiAKICAgUmV0dXJuczoKICAgICBUaGUgcGF0aCB0byB0aGUgc2lnbmVkIEFQRVggZmlsZS4KQEAgLTQ5NCw4ICs0NDcsNyBAQAogICAgICAgY29kZW5hbWVfdG9fYXBpX2xldmVsX21hcCwKICAgICAgIG5vX2hhc2h0cmVlLAogICAgICAgc2lnbmluZ19hcmdzLAotICAgICAgc2lnbl90b29sLAotICAgICAgaXNfc2Vwb2xpY3kpCisgICAgICBzaWduX3Rvb2wpCiAKICAgIyAzLiBDb21wcmVzcyBzaWduZWQgb3JpZ2luYWwgYXBleC4KICAgY29tcHJlc3NlZF9hcGV4X2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0nYXBleC1jb250YWluZXItJywKQEAgLTUyMiw4ICs0NzQsOCBAQAogCiAKIGRlZiBTaWduQXBleChhdmJ0b29sLCBhcGV4X2RhdGEsIHBheWxvYWRfa2V5LCBjb250YWluZXJfa2V5LCBjb250YWluZXJfcHcsCi0gICAgICAgICAgICAgYXBrX2tleXMsIGNvZGVuYW1lX3RvX2FwaV9sZXZlbF9tYXAsIG5vX2hhc2h0cmVlLAotICAgICAgICAgICAgIHNpZ25pbmdfYXJncz1Ob25lLCBzaWduX3Rvb2w9Tm9uZSwgaXNfc2Vwb2xpY3k9RmFsc2UpOgorICAgICAgICAgICAgIGFwa19rZXlzLCBjb2RlbmFtZV90b19hcGlfbGV2ZWxfbWFwLAorICAgICAgICAgICAgIG5vX2hhc2h0cmVlLCBzaWduaW5nX2FyZ3M9Tm9uZSwgc2lnbl90b29sPU5vbmUpOgogICAiIiJTaWducyB0aGUgY3VycmVudCBBUEVYIHdpdGggdGhlIGdpdmVuIHBheWxvYWQvY29udGFpbmVyIGtleXMuCiAKICAgQXJnczoKQEAgLTUzNSw3ICs0ODcsNiBAQAogICAgIGNvZGVuYW1lX3RvX2FwaV9sZXZlbF9tYXA6IEEgZGljdCB0aGF0IG1hcHMgZnJvbSBjb2RlbmFtZSB0byBBUEkgbGV2ZWwuCiAgICAgbm9faGFzaHRyZWU6IERvbid0IGluY2x1ZGUgaGFzaHRyZWUgaW4gdGhlIHNpZ25lZCBBUEVYLgogICAgIHNpZ25pbmdfYXJnczogQWRkaXRpb25hbCBhcmdzIHRvIGJlIHBhc3NlZCB0byB0aGUgcGF5bG9hZCBzaWduZXIuCi0gICAgaXNfc2Vwb2xpY3k6IEluZGljYXRlcyBpZiB0aGUgYXBleCBpcyBhIHNlcG9saWN5LmFwZXgKIAogICBSZXR1cm5zOgogICAgIFRoZSBwYXRoIHRvIHRoZSBzaWduZWQgQVBFWCBmaWxlLgpAQCAtNTYxLDggKzUxMiw3IEBACiAgICAgICAgICAgbm9faGFzaHRyZWU9bm9faGFzaHRyZWUsCiAgICAgICAgICAgYXBrX2tleXM9YXBrX2tleXMsCiAgICAgICAgICAgc2lnbmluZ19hcmdzPXNpZ25pbmdfYXJncywKLSAgICAgICAgICBzaWduX3Rvb2w9c2lnbl90b29sLAotICAgICAgICAgIGlzX3NlcG9saWN5PWlzX3NlcG9saWN5KQorICAgICAgICAgIHNpZ25fdG9vbD1zaWduX3Rvb2wpCiAgICAgZWxpZiBhcGV4X3R5cGUgPT0gJ0NPTVBSRVNTRUQnOgogICAgICAgcmV0dXJuIFNpZ25Db21wcmVzc2VkQXBleCgKICAgICAgICAgICBhdmJ0b29sLApAQCAtNTc0LDggKzUyNCw3IEBACiAgICAgICAgICAgbm9faGFzaHRyZWU9bm9faGFzaHRyZWUsCiAgICAgICAgICAgYXBrX2tleXM9YXBrX2tleXMsCiAgICAgICAgICAgc2lnbmluZ19hcmdzPXNpZ25pbmdfYXJncywKLSAgICAgICAgICBzaWduX3Rvb2w9c2lnbl90b29sLAotICAgICAgICAgIGlzX3NlcG9saWN5PWlzX3NlcG9saWN5KQorICAgICAgICAgIHNpZ25fdG9vbD1zaWduX3Rvb2wpCiAgICAgZWxzZToKICAgICAgICMgVE9ETyhiLzE3MjkxMjIzMik6IHN1cHBvcnQgc2lnbmluZyBjb21wcmVzc2VkIGFwZXgKICAgICAgIHJhaXNlIEFwZXhJbmZvRXJyb3IoJ1Vuc3VwcG9ydGVkIGFwZXggdHlwZSB7fScuZm9ybWF0KGFwZXhfdHlwZSkpCkBAIC01ODUsMjIgKzUzNCwyOCBAQAogICAgICAgICAnRmFpbGVkIHRvIGdldCB0eXBlIGZvciB7fTpcbnt9Jy5mb3JtYXQoYXBleF9maWxlLCBlKSkKIAogCi1kZWYgR2V0QXBleEluZm9Gcm9tVGFyZ2V0RmlsZXMoaW5wdXRfZmlsZSwgcGFydGl0aW9uLCBjb21wcmVzc2VkX29ubHk9VHJ1ZSk6CitkZWYgR2V0QXBleEluZm9Gcm9tVGFyZ2V0RmlsZXMoaW5wdXRfZmlsZSk6CiAgICIiIgotICBHZXQgaW5mb3JtYXRpb24gYWJvdXQgc3lzdGVtIEFQRVggc3RvcmVkIGluIHRoZSBpbnB1dF9maWxlIHppcAorICBHZXQgaW5mb3JtYXRpb24gYWJvdXQgQVBFWGVzIHN0b3JlZCBpbiB0aGUgaW5wdXRfZmlsZSB6aXAKIAogICBBcmdzOgogICAgIGlucHV0X2ZpbGU6IFRoZSBmaWxlbmFtZSBvZiB0aGUgdGFyZ2V0IGJ1aWxkIHRhcmdldC1maWxlcyB6aXAgb3IgZGlyZWN0b3J5LgogCiAgIFJldHVybjoKICAgICBBIGxpc3Qgb2Ygb3RhX21ldGFkYXRhX3BiMi5BcGV4SW5mbygpIHBvcHVsYXRlZCB1c2luZyB0aGUgQVBFWCBzdG9yZWQgaW4KLSAgICAvc3lzdGVtIHBhcnRpdGlvbiBvZiB0aGUgaW5wdXRfZmlsZQorICAgIGVhY2ggcGFydGl0aW9uIG9mIHRoZSBpbnB1dF9maWxlCiAgICIiIgogCiAgICMgRXh0cmFjdCB0aGUgYXBleCBmaWxlcyBzbyB0aGF0IHdlIGNhbiBydW4gY2hlY2tzIG9uIHRoZW0KICAgaWYgbm90IGlzaW5zdGFuY2UoaW5wdXRfZmlsZSwgc3RyKToKICAgICByYWlzZSBSdW50aW1lRXJyb3IoIm11c3QgcGFzcyBmaWxlcGF0aCB0byB0YXJnZXQtZmlsZXMgemlwIG9yIGRpcmVjdG9yeSIpCisgIGFwZXhfaW5mb3MgPSBbXQorICBmb3IgcGFydGl0aW9uIGluIFBBUlRJVElPTlM6CisgICAgYXBleF9pbmZvcy5leHRlbmQoR2V0QXBleEluZm9Gb3JQYXJ0aXRpb24oaW5wdXRfZmlsZSwgcGFydGl0aW9uKSkKKyAgcmV0dXJuIGFwZXhfaW5mb3MKIAorCitkZWYgR2V0QXBleEluZm9Gb3JQYXJ0aXRpb24oaW5wdXRfZmlsZSwgcGFydGl0aW9uKToKICAgYXBleF9zdWJkaXIgPSBvcy5wYXRoLmpvaW4ocGFydGl0aW9uLnVwcGVyKCksICdhcGV4JykKICAgaWYgb3MucGF0aC5pc2RpcihpbnB1dF9maWxlKToKICAgICB0bXBfZGlyID0gaW5wdXRfZmlsZQpAQCAtNjU4LDcgKzYxMyw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tb3V0cHV0JywgZGVjb21wcmVzc2VkX2ZpbGVfcGF0aF0pCiAgICAgICBhcGV4X2luZm8uZGVjb21wcmVzc2VkX3NpemUgPSBvcy5wYXRoLmdldHNpemUoZGVjb21wcmVzc2VkX2ZpbGVfcGF0aCkKIAotICAgIGlmIG5vdCBjb21wcmVzc2VkX29ubHkgb3IgYXBleF9pbmZvLmlzX2NvbXByZXNzZWQ6Ci0gICAgICBhcGV4X2luZm9zLmFwcGVuZChhcGV4X2luZm8pCisgICAgYXBleF9pbmZvcy5hcHBlbmQoYXBleF9pbmZvKQogCiAgIHJldHVybiBhcGV4X2luZm9zCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvYnVpbGRfaW1hZ2UucHkgYi90b29scy9yZWxlYXNldG9vbHMvYnVpbGRfaW1hZ2UucHkKaW5kZXggOTA2NDEzNi4uYjZjOTZjNCAxMDA3NTUKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL2J1aWxkX2ltYWdlLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9idWlsZF9pbWFnZS5weQpAQCAtMSw0ICsxLDQgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwogIwogIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogIwpAQCAtMjIsMjUgKzIyLDM2IEBACiAgICAgICAgICAgICB0YXJnZXRfb3V0cHV0X2RpcmVjdG9yeQogIiIiCiAKLWZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2ltcG9ydCBkYXRldGltZQogCitpbXBvcnQgYXJncGFyc2UKIGltcG9ydCBnbG9iCiBpbXBvcnQgbG9nZ2luZwogaW1wb3J0IG9zCiBpbXBvcnQgb3MucGF0aAogaW1wb3J0IHJlCitpbXBvcnQgc2hsZXgKIGltcG9ydCBzaHV0aWwKIGltcG9ydCBzeXMKK2ltcG9ydCB1dWlkCitpbXBvcnQgdGVtcGZpbGUKIAogaW1wb3J0IGNvbW1vbgogaW1wb3J0IHZlcml0eV91dGlscwogCisKIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQogCiBPUFRJT05TID0gY29tbW9uLk9QVElPTlMKIEJMT0NLX1NJWkUgPSBjb21tb24uQkxPQ0tfU0laRQogQllURVNfSU5fTUIgPSAxMDI0ICogMTAyNAogCisjIFVzZSBhIGZpeGVkIHRpbWVzdGFtcCAoMDEvMDEvMjAwOSAwMDowMDowMCBVVEMpIGZvciBmaWxlcyB3aGVuIHBhY2thZ2luZworIyBpbWFnZXMuIChiLzI0Mzc3OTkzLCBiLzgwNjAwOTMxKQorRklYRURfRklMRV9USU1FU1RBTVAgPSBpbnQoKAorICAgIGRhdGV0aW1lLmRhdGV0aW1lKDIwMDksIDEsIDEsIDAsIDAsIDAsIDAsIE5vbmUpIC0KKyAgICBkYXRldGltZS5kYXRldGltZS51dGNmcm9tdGltZXN0YW1wKDApKS50b3RhbF9zZWNvbmRzKCkpCisKIAogY2xhc3MgQnVpbGRJbWFnZUVycm9yKEV4Y2VwdGlvbik6CiAgICIiIkFuIEV4Y2VwdGlvbiByYWlzZWQgZHVyaW5nIGltYWdlIGJ1aWxkaW5nLiIiIgpAQCAtMjQ5LDcgKzI2MCw3IEBACiAgIGlmIGZzX3R5cGUuc3RhcnRzd2l0aCgiZXh0NCIpIGFuZCBwYXJ0aXRpb25faGVhZHJvb20gPiByZXNlcnZlZF9zaXplOgogICAgIHJlc2VydmVkX3NpemUgPSBwYXJ0aXRpb25faGVhZHJvb20KIAotICByZXR1cm4gc2l6ZSArIHJlc2VydmVkX3NpemUKKyAgcmV0dXJuIGludChzaXplICogMS4xKSArIHJlc2VydmVkX3NpemUKIAogCiBkZWYgQnVpbGRJbWFnZU1rZnMoaW5fZGlyLCBwcm9wX2RpY3QsIG91dF9maWxlLCB0YXJnZXRfb3V0LCBmc19jb25maWcpOgpAQCAtMjgzLDcgKzI5NCw3IEBACiAgICAgYnVpbGRfY29tbWFuZCA9IFtwcm9wX2RpY3RbImV4dF9ta3VzZXJpbWciXV0KICAgICBpZiAiZXh0ZnNfc3BhcnNlX2ZsYWciIGluIHByb3BfZGljdCBhbmQgbm90IGRpc2FibGVfc3BhcnNlOgogICAgICAgYnVpbGRfY29tbWFuZC5hcHBlbmQocHJvcF9kaWN0WyJleHRmc19zcGFyc2VfZmxhZyJdKQotICAgICAgcnVuX2UyZnNjayA9IFJ1bkUyZnNjaworICAgICAgcnVuX2ZzY2sgPSBSdW5FMmZzY2sKICAgICBidWlsZF9jb21tYW5kLmV4dGVuZChbaW5fZGlyLCBvdXRfZmlsZSwgZnNfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcF9kaWN0WyJtb3VudF9wb2ludCJdXSkKICAgICBidWlsZF9jb21tYW5kLmFwcGVuZChwcm9wX2RpY3RbImltYWdlX3NpemUiXSkKQEAgLTM0Miw2ICszNTMsOCBAQAogICAgIGlmIGNvbXByZXNzX2hpbnRzOgogICAgICAgYnVpbGRfY29tbWFuZC5leHRlbmQoWyItLWNvbXByZXNzLWhpbnRzIiwgY29tcHJlc3NfaGludHNdKQogCisgICAgYnVpbGRfY29tbWFuZC5leHRlbmQoWyItYiIsIHByb3BfZGljdC5nZXQoImVyb2ZzX2Jsb2Nrc2l6ZSIsICI0MDk2IildKQorCiAgICAgYnVpbGRfY29tbWFuZC5leHRlbmQoWyItLW1vdW50LXBvaW50IiwgcHJvcF9kaWN0WyJtb3VudF9wb2ludCJdXSkKICAgICBpZiB0YXJnZXRfb3V0OgogICAgICAgYnVpbGRfY29tbWFuZC5leHRlbmQoWyItLXByb2R1Y3Qtb3V0IiwgdGFyZ2V0X291dF0pCkBAIC00MjQsNiArNDM3LDggQEAKICAgICAgICAgc2xkY19mbGFncyA9IHNsZGNfZmxhZ3Nfc3RyLnNwbGl0KCkKICAgICAgICAgYnVpbGRfY29tbWFuZC5hcHBlbmQoc3RyKGxlbihzbGRjX2ZsYWdzKSkpCiAgICAgICAgIGJ1aWxkX2NvbW1hbmQuZXh0ZW5kKHNsZGNfZmxhZ3MpCisgICAgZjJmc19ibG9ja3NpemUgPSBwcm9wX2RpY3QuZ2V0KCJmMmZzX2Jsb2Nrc2l6ZSIsICI0MDk2IikKKyAgICBidWlsZF9jb21tYW5kLmV4dGVuZChbIi1iIiwgZjJmc19ibG9ja3NpemVdKQogICBlbHNlOgogICAgIHJhaXNlIEJ1aWxkSW1hZ2VFcnJvcigKICAgICAgICAgIkVycm9yOiB1bmtub3duIGZpbGVzeXN0ZW0gdHlwZToge30iLmZvcm1hdChmc190eXBlKSkKQEAgLTQ4Nyw2ICs1MDIsMjAgQEAKICAgICByYWlzZQogCiAKK2RlZiBTZXRVVUlESWZOb3RFeGlzdChpbWFnZV9wcm9wcyk6CisKKyAgIyBVc2UgcmVwZWF0YWJsZSBleHQ0IEZTIFVVSUQgYW5kIGhhc2hfc2VlZCBVVUlEIChiYXNlZCBvbiBwYXJ0aXRpb24gbmFtZSBhbmQKKyAgIyBidWlsZCBmaW5nZXJwcmludCkuIEFsc28gdXNlIHRoZSBsZWdhY3kgYnVpbGQgaWQsIGJlY2F1c2UgdGhlIHZibWV0YSBkaWdlc3QKKyAgIyBpc24ndCBhdmFpbGFibGUgYXQgdGhpcyBwb2ludC4KKyAgd2hhdCA9IGltYWdlX3Byb3BzWyJtb3VudF9wb2ludCJdCisgIGZpbmdlcnByaW50ID0gaW1hZ2VfcHJvcHMuZ2V0KCJmaW5nZXJwcmludCIsICIiKQorICB1dWlkX3NlZWQgPSB3aGF0ICsgIi0iICsgZmluZ2VycHJpbnQKKyAgbG9nZ2VyLmluZm8oIlVzaW5nIGZpbmdlcnByaW50ICVzIGZvciBwYXJ0aXRpb24gJXMiLCBmaW5nZXJwcmludCwgd2hhdCkKKyAgaW1hZ2VfcHJvcHNbInV1aWQiXSA9IHN0cih1dWlkLnV1aWQ1KHV1aWQuTkFNRVNQQUNFX1VSTCwgdXVpZF9zZWVkKSkKKyAgaGFzaF9zZWVkID0gImhhc2hfc2VlZC0iICsgdXVpZF9zZWVkCisgIGltYWdlX3Byb3BzWyJoYXNoX3NlZWQiXSA9IHN0cih1dWlkLnV1aWQ1KHV1aWQuTkFNRVNQQUNFX1VSTCwgaGFzaF9zZWVkKSkKKworCiBkZWYgQnVpbGRJbWFnZShpbl9kaXIsIHByb3BfZGljdCwgb3V0X2ZpbGUsIHRhcmdldF9vdXQ9Tm9uZSk6CiAgICIiIkJ1aWxkcyBhbiBpbWFnZSBmb3IgdGhlIGZpbGVzIHVuZGVyIGluX2RpciBhbmQgd3JpdGVzIGl0IHRvIG91dF9maWxlLgogCkBAIC01MDQsNiArNTMzLDcgQEAKICAgICBCdWlsZEltYWdlRXJyb3I6IE9uIGJ1aWxkIGltYWdlIGZhaWx1cmVzLgogICAiIiIKICAgaW5fZGlyLCBmc19jb25maWcgPSBTZXRVcEluRGlyQW5kRnNDb25maWcoaW5fZGlyLCBwcm9wX2RpY3QpCisgIFNldFVVSURJZk5vdEV4aXN0KHByb3BfZGljdCkKIAogICBidWlsZF9jb21tYW5kID0gW10KICAgZnNfdHlwZSA9IHByb3BfZGljdC5nZXQoImZzX3R5cGUiLCAiIikKQEAgLTYwNiw3ICs2MzYsNyBAQAogICAgICAgc2l6ZSA9IHZlcml0eV9pbWFnZV9idWlsZGVyLkNhbGN1bGF0ZUR5bmFtaWNQYXJ0aXRpb25TaXplKHNpemUpCiAgICAgcHJvcF9kaWN0WyJwYXJ0aXRpb25fc2l6ZSJdID0gc3RyKHNpemUpCiAgICAgbG9nZ2VyLmluZm8oCi0gICAgICAgICJBbGxvY2F0aW5nICVkIE1CIGZvciAlcy4iLCBzaXplIC8vIEJZVEVTX0lOX01CLCBvdXRfZmlsZSkKKyAgICAgICAgIkFsbG9jYXRpbmcgJWQgTUIgZm9yICVzIiwgc2l6ZSAvLyBCWVRFU19JTl9NQiwgb3V0X2ZpbGUpCiAKICAgcHJvcF9kaWN0WyJpbWFnZV9zaXplIl0gPSBwcm9wX2RpY3RbInBhcnRpdGlvbl9zaXplIl0KIApAQCAtNjM1LDYgKzY2NSwzNCBAQAogICAgIHZlcml0eV9pbWFnZV9idWlsZGVyLkJ1aWxkKG91dF9maWxlKQogCiAKK2RlZiBUcnlQYXJzZUZpbmdlcnByaW50KGdsb2JfZGljdDogZGljdCk6CisgIGZvciAoa2V5LCB2YWwpIGluIGdsb2JfZGljdC5pdGVtcygpOgorICAgIGlmIG5vdCBrZXkuZW5kc3dpdGgoIl9hZGRfaGFzaHRyZWVfZm9vdGVyX2FyZ3MiKSBhbmQgbm90IGtleS5lbmRzd2l0aCgiX2FkZF9oYXNoX2Zvb3Rlcl9hcmdzIik6CisgICAgICBjb250aW51ZQorICAgIGZvciBhcmcgaW4gc2hsZXguc3BsaXQodmFsKToKKyAgICAgIG0gPSByZS5tYXRjaChyIl5jb21cLmFuZHJvaWRcLmJ1aWxkXC5cdytcLmZpbmdlcnByaW50OiIsIGFyZykKKyAgICAgIGlmIG0gaXMgTm9uZToKKyAgICAgICAgY29udGludWUKKyAgICAgIGZpbmdlcnByaW50ID0gYXJnW2xlbihtLmdyb3VwKCkpOl0KKyAgICAgIGdsb2JfZGljdFsiZmluZ2VycHJpbnQiXSA9IGZpbmdlcnByaW50CisgICAgICByZXR1cm4KKworZGVmIFRyeVBhcnNlRmluZ2VycHJpbnRBbmRUaW1lc3RhbXAoZ2xvYl9kaWN0KToKKyAgIiIiSGVscGVyIGZ1bmN0aW9uIHRoYXQgcGFyc2VzIGZpbmdlcnByaW50IGFuZCB0aW1lc3RhbXAgZnJvbSB0aGUgZ2xvYmFsIGRpY3Rpb25hcnkuCisKKyAgQXJnczoKKyAgICBnbG9iX2RpY3Q6IHRoZSBnbG9iYWwgZGljdGlvbmFyeSBmcm9tIHRoZSBidWlsZCBzeXN0ZW0uCisgICIiIgorICBUcnlQYXJzZUZpbmdlcnByaW50KGdsb2JfZGljdCkKKworICAjIFNldCBmaXhlZCB0aW1lc3RhbXAgZm9yIGJ1aWxkaW5nIHRoZSBPVEEgcGFja2FnZS4KKyAgaWYgInVzZV9maXhlZF90aW1lc3RhbXAiIGluIGdsb2JfZGljdDoKKyAgICBnbG9iX2RpY3RbInRpbWVzdGFtcCJdID0gRklYRURfRklMRV9USU1FU1RBTVAKKyAgaWYgImJ1aWxkLnByb3AiIGluIGdsb2JfZGljdDoKKyAgICB0aW1lc3RhbXAgPSBnbG9iX2RpY3RbImJ1aWxkLnByb3AiXS5HZXRQcm9wKCJyby5idWlsZC5kYXRlLnV0YyIpCisgICAgaWYgdGltZXN0YW1wOgorICAgICAgZ2xvYl9kaWN0WyJ0aW1lc3RhbXAiXSA9IHRpbWVzdGFtcAorCiBkZWYgSW1hZ2VQcm9wRnJvbUdsb2JhbERpY3QoZ2xvYl9kaWN0LCBtb3VudF9wb2ludCk6CiAgICIiIkJ1aWxkIGFuIGltYWdlIHByb3BlcnR5IGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2xvYmFsIGRpY3Rpb25hcnkuCiAKQEAgLTY0MywxMSArNzAxLDcgQEAKICAgICBtb3VudF9wb2ludDogc3VjaCBhcyAic3lzdGVtIiwgImRhdGEiIGV0Yy4KICAgIiIiCiAgIGQgPSB7fQotCi0gIGlmICJidWlsZC5wcm9wIiBpbiBnbG9iX2RpY3Q6Ci0gICAgdGltZXN0YW1wID0gZ2xvYl9kaWN0WyJidWlsZC5wcm9wIl0uR2V0UHJvcCgicm8uYnVpbGQuZGF0ZS51dGMiKQotICAgIGlmIHRpbWVzdGFtcDoKLSAgICAgIGRbInRpbWVzdGFtcCJdID0gdGltZXN0YW1wCisgIFRyeVBhcnNlRmluZ2VycHJpbnRBbmRUaW1lc3RhbXAoZ2xvYl9kaWN0KQogCiAgIGRlZiBjb3B5X3Byb3Aoc3JjX3AsIGRlc3RfcCk6CiAgICAgIiIiQ29weSBhIHByb3BlcnR5IGZyb20gdGhlIGdsb2JhbCBkaWN0aW9uYXJ5LgpAQCAtNjY4LDYgKzcyMiw3IEBACiAgICAgICAiZXJvZnNfZGVmYXVsdF9jb21wcmVzc29yIiwKICAgICAgICJlcm9mc19kZWZhdWx0X2NvbXByZXNzX2hpbnRzIiwKICAgICAgICJlcm9mc19wY2x1c3Rlcl9zaXplIiwKKyAgICAgICJlcm9mc19ibG9ja3NpemUiLAogICAgICAgImVyb2ZzX3NoYXJlX2R1cF9ibG9ja3MiLAogICAgICAgImVyb2ZzX3NwYXJzZV9mbGFnIiwKICAgICAgICJlcm9mc191c2VfbGVnYWN5X2NvbXByZXNzaW9uIiwKQEAgLTY3NSwxMSArNzMwLDE0IEBACiAgICAgICAic3lzdGVtX2YyZnNfY29tcHJlc3MiLAogICAgICAgInN5c3RlbV9mMmZzX3NsZGNfZmxhZ3MiLAogICAgICAgImYyZnNfc3BhcnNlX2ZsYWciLAorICAgICAgImYyZnNfYmxvY2tzaXplIiwKICAgICAgICJza2lwX2ZzY2siLAogICAgICAgImV4dF9ta3VzZXJpbWciLAogICAgICAgImF2Yl9lbmFibGUiLAogICAgICAgImF2Yl9hdmJ0b29sIiwKICAgICAgICJ1c2VfZHluYW1pY19wYXJ0aXRpb25fc2l6ZSIsCisgICAgICAiZmluZ2VycHJpbnQiLAorICAgICAgInRpbWVzdGFtcCIsCiAgICkKICAgZm9yIHAgaW4gY29tbW9uX3Byb3BzOgogICAgIGNvcHlfcHJvcChwLCBwKQpAQCAtNzE4LDEwICs3NzYsMTIgQEAKICAgICAgIChUcnVlLCAie31fZXJvZnNfY29tcHJlc3NvciIsICJlcm9mc19jb21wcmVzc29yIiksCiAgICAgICAoVHJ1ZSwgInt9X2Vyb2ZzX2NvbXByZXNzX2hpbnRzIiwgImVyb2ZzX2NvbXByZXNzX2hpbnRzIiksCiAgICAgICAoVHJ1ZSwgInt9X2Vyb2ZzX3BjbHVzdGVyX3NpemUiLCAiZXJvZnNfcGNsdXN0ZXJfc2l6ZSIpLAorICAgICAgKFRydWUsICJ7fV9lcm9mc19ibG9ja3NpemUiLCAiZXJvZnNfYmxvY2tzaXplIiksCiAgICAgICAoVHJ1ZSwgInt9X2Vyb2ZzX3NoYXJlX2R1cF9ibG9ja3MiLCAiZXJvZnNfc2hhcmVfZHVwX2Jsb2NrcyIpLAogICAgICAgKFRydWUsICJ7fV9leHRmc19pbm9kZV9jb3VudCIsICJleHRmc19pbm9kZV9jb3VudCIpLAogICAgICAgKFRydWUsICJ7fV9mMmZzX2NvbXByZXNzIiwgImYyZnNfY29tcHJlc3MiKSwKICAgICAgIChUcnVlLCAie31fZjJmc19zbGRjX2ZsYWdzIiwgImYyZnNfc2xkY19mbGFncyIpLAorICAgICAgKFRydWUsICJ7fV9mMmZzX2Jsb2Nrc2l6ZSIsICJmMmZzX2Jsb2NrX3NpemUiKSwKICAgICAgIChUcnVlLCAie31fcmVzZXJ2ZWRfc2l6ZSIsICJwYXJ0aXRpb25fcmVzZXJ2ZWRfc2l6ZSIpLAogICAgICAgKFRydWUsICJ7fV9zcXVhc2hmc19ibG9ja19zaXplIiwgInNxdWFzaGZzX2Jsb2NrX3NpemUiKSwKICAgICAgIChUcnVlLCAie31fc3F1YXNoZnNfY29tcHJlc3NvciIsICJzcXVhc2hmc19jb21wcmVzc29yIiksCkBAIC03NjksNyArODI5LDYgQEAKICAgZFsibW91bnRfcG9pbnQiXSA9IG1vdW50X3BvaW50CiAgIGlmIG1vdW50X3BvaW50ID09ICJzeXN0ZW0iOgogICAgIGNvcHlfcHJvcCgic3lzdGVtX2hlYWRyb29tIiwgInBhcnRpdGlvbl9oZWFkcm9vbSIpCi0gICAgY29weV9wcm9wKCJzeXN0ZW1fcm9vdF9pbWFnZSIsICJzeXN0ZW1fcm9vdF9pbWFnZSIpCiAgICAgY29weV9wcm9wKCJyb290X2RpciIsICJyb290X2RpciIpCiAgICAgY29weV9wcm9wKCJyb290X2ZzX2NvbmZpZyIsICJyb290X2ZzX2NvbmZpZyIpCiAgIGVsaWYgbW91bnRfcG9pbnQgPT0gImRhdGEiOgpAQCAtODcwLDM0ICs5MjksODAgQEAKICAgICAgICAgICBpZiBpdGVtIG5vdCBpbiB2Ym1ldGFfdmVuZG9yLnNwbGl0KCldCiAgICAgICB2Ym1ldGFfcGFydGl0aW9ucy5hcHBlbmQoInZibWV0YV92ZW5kb3IiKQogCi0KICAgcGFydGl0aW9ucyA9IHtwYXJ0OiBvcy5wYXRoLmpvaW4oaW5fZGlyLCBwYXJ0ICsgIi5pbWciKQogICAgICAgICAgICAgICAgIGZvciBwYXJ0IGluIHZibWV0YV9wYXJ0aXRpb25zfQotICBwYXJ0aXRpb25zID0ge3BhcnQ6cGF0aCBmb3IgKHBhcnQsIHBhdGgpIGluIHBhcnRpdGlvbnMuaXRlbXMoKSBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKX0KKyAgcGFydGl0aW9ucyA9IHtwYXJ0OiBwYXRoIGZvciAocGFydCwgcGF0aCkgaW4gcGFydGl0aW9ucy5pdGVtcygpIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpfQogICBjb21tb24uQnVpbGRWQk1ldGEob3V0cHV0X3BhdGgsIHBhcnRpdGlvbnMsIG5hbWUsIHZibWV0YV9wYXJ0aXRpb25zKQogCiAKLWRlZiBtYWluKGFyZ3YpOgotICBhcmdzID0gY29tbW9uLlBhcnNlT3B0aW9ucyhhcmd2LCBfX2RvY19fKQorZGVmIEJ1aWxkSW1hZ2VPclZCTWV0YShpbnB1dF9kaXJlY3RvcnksIHRhcmdldF9vdXQsIGdsb2JfZGljdCwgaW1hZ2VfcHJvcGVydGllcywgb3V0X2ZpbGUpOgorICB0cnk6CisgICAgaWYgInZibWV0YSIgaW4gb3MucGF0aC5iYXNlbmFtZShvdXRfZmlsZSk6CisgICAgICBPUFRJT05TLmluZm9fZGljdCA9IGdsb2JfZGljdAorICAgICAgQnVpbGRWQk1ldGEoaW5wdXRfZGlyZWN0b3J5LCBnbG9iX2RpY3QsIG91dF9maWxlKQorICAgIGVsc2U6CisgICAgICBCdWlsZEltYWdlKGlucHV0X2RpcmVjdG9yeSwgaW1hZ2VfcHJvcGVydGllcywgb3V0X2ZpbGUsIHRhcmdldF9vdXQpCisgIGV4Y2VwdDoKKyAgICBsb2dnZXIuZXJyb3IoIkZhaWxlZCB0byBidWlsZCAlcyBmcm9tICVzIiwgb3V0X2ZpbGUsIGlucHV0X2RpcmVjdG9yeSkKKyAgICByYWlzZQogCi0gIGlmIGxlbihhcmdzKSAhPSA0OgotICAgIHByaW50KF9fZG9jX18pCi0gICAgc3lzLmV4aXQoMSkKKworZGVmIENvcHlJbnB1dERpcmVjdG9yeShzcmMsIGRzdCwgZmlsdGVyX2ZpbGUpOgorICB3aXRoIG9wZW4oZmlsdGVyX2ZpbGUsICdyJykgYXMgZjoKKyAgICBmb3IgbGluZSBpbiBmOgorICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgIHJldHVybgorICAgICAgaWYgbGluZSAhPSBvcy5wYXRoLm5vcm1wYXRoKGxpbmUpOgorICAgICAgICBzeXMuZXhpdChmIntsaW5lfTogbm90IG5vcm1hbGl6ZWQiKQorICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCIuLi8iKSBvciBsaW5lLnN0YXJ0c3dpdGgoJy8nKToKKyAgICAgICAgc3lzLmV4aXQoZiJ7bGluZX06IGVzY2FwZXMgc3RhZ2luZyBkaXJlY3RvcnkgYnkgc3RhcnRpbmcgd2l0aCAuLi8gb3IgLyIpCisgICAgICBmdWxsX3NyYyA9IG9zLnBhdGguam9pbihzcmMsIGxpbmUpCisgICAgICBmdWxsX2RzdCA9IG9zLnBhdGguam9pbihkc3QsIGxpbmUpCisgICAgICBpZiBvcy5wYXRoLmlzZGlyKGZ1bGxfc3JjKToKKyAgICAgICAgb3MubWFrZWRpcnMoZnVsbF9kc3QsIGV4aXN0X29rPVRydWUpCisgICAgICBlbHNlOgorICAgICAgICBvcy5tYWtlZGlycyhvcy5wYXRoLmRpcm5hbWUoZnVsbF9kc3QpLCBleGlzdF9vaz1UcnVlKQorICAgICAgICBvcy5saW5rKGZ1bGxfc3JjLCBmdWxsX2RzdCwgZm9sbG93X3N5bWxpbmtzPUZhbHNlKQorCisKK2RlZiBtYWluKGFyZ3YpOgorICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigKKyAgICBkZXNjcmlwdGlvbj0iQnVpbGRzIG91dHB1dF9pbWFnZSBmcm9tIHRoZSBnaXZlbiBpbnB1dF9kaXJlY3RvcnkgYW5kIHByb3BlcnRpZXNfZmlsZSwgYW5kICIKKyAgICAid3JpdGVzIHRoZSBpbWFnZSB0byB0YXJnZXRfb3V0cHV0X2RpcmVjdG9yeS4iKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWlucHV0LWRpcmVjdG9yeS1maWx0ZXItZmlsZSIsCisgICAgaGVscD0idGhlIHBhdGggdG8gYSBmaWxlIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mIGFsbCBmaWxlcyBpbiB0aGUgaW5wdXRfZGlyZWN0b3J5LiBJZiB0aGlzICIKKyAgICAib3B0aW9uIGlzIHByb3ZpZGVkLCBhbGwgZmlsZXMgdW5kZXIgdGhlIGlucHV0X2RpcmVjdG9yeSB0aGF0IGFyZSBub3QgbGlzdGVkIGluIHRoaXMgZmlsZSB3aWxsICIKKyAgICAiYmUgZGVsZXRlZCBiZWZvcmUgYnVpbGRpbmcgdGhlIGltYWdlLiBUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIHRoZSBmYWN0IHRoYXQgYnVpbGRpbmcgYSBtb2R1bGUgIgorICAgICJ3aWxsIGluc3RhbGwgaW4gYnkgZGVmYXVsdCwgc28gdGhlcmUgY291bGQgYmUgZmlsZXMgaW4gdGhlIGlucHV0X2RpcmVjdG9yeSB0aGF0IGFyZSBub3QgIgorICAgICJhY3R1YWxseSBzdXBwb3NlZCB0byBiZSBwYXJ0IG9mIHRoZSBwYXJ0aXRpb24uIFRoZSBwYXRocyBpbiB0aGlzIGZpbGUgbXVzdCBiZSByZWxhdGl2ZSB0byAiCisgICAgImlucHV0X2RpcmVjdG9yeS4iKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCJpbnB1dF9kaXJlY3RvcnkiLAorICAgIGhlbHA9InRoZSBzdGFnaW5nIGRpcmVjdG9yeSB0byBiZSBjb252ZXJ0ZWQgdG8gYW4gaW1hZ2UgZmlsZSIpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoInByb3BlcnRpZXNfZmlsZSIsCisgICAgaGVscD0iYSBmaWxlIGNvbnRhaW5pbmcgdGhlICdnbG9iYWwgZGljdGlvbmFyeScgb2YgcHJvcGVydGllcyB0aGF0IGFmZmVjdCBob3cgdGhlIGltYWdlIGlzICIKKyAgICAiYnVpbHQiKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCJvdXRfZmlsZSIsCisgICAgaGVscD0idGhlIG91dHB1dCBmaWxlIHRvIHdyaXRlIikKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgidGFyZ2V0X291dCIsCisgICAgaGVscD0idGhlIHBhdGggdG8gJChUQVJHRVRfT1VUKS4gQ2VydGFpbiB0b29scyB3aWxsIHVzZSB0aGlzIHRvIGxvb2sgdGhyb3VnaCBtdWx0aXBsZSBzdGFnaW5nICIKKyAgICAiZGlyZWN0b3JpZXMgZm9yIGZzIGNvbmZpZyBmaWxlcy4iKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItdiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iRW5hYmxlIHZlcmJvc2UgbG9nZ2luZyIsIGRlc3Q9InZlcmJvc2UiKQorICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorICBpZiBhcmdzLnZlcmJvc2U6CisgICAgT1BUSU9OUy52ZXJib3NlID0gVHJ1ZQogCiAgIGNvbW1vbi5Jbml0TG9nZ2luZygpCiAKLSAgaW5fZGlyID0gYXJnc1swXQotICBnbG9iX2RpY3RfZmlsZSA9IGFyZ3NbMV0KLSAgb3V0X2ZpbGUgPSBhcmdzWzJdCi0gIHRhcmdldF9vdXQgPSBhcmdzWzNdCi0KLSAgZ2xvYl9kaWN0ID0gTG9hZEdsb2JhbERpY3QoZ2xvYl9kaWN0X2ZpbGUpCisgIGdsb2JfZGljdCA9IExvYWRHbG9iYWxEaWN0KGFyZ3MucHJvcGVydGllc19maWxlKQogICBpZiAibW91bnRfcG9pbnQiIGluIGdsb2JfZGljdDoKICAgICAjIFRoZSBjYWxsZXIga25vd3MgdGhlIG1vdW50IHBvaW50IGFuZCBwcm92aWRlcyBhIGRpY3Rpb25hcnkgbmVlZGVkIGJ5CiAgICAgIyBCdWlsZEltYWdlKCkuCiAgICAgaW1hZ2VfcHJvcGVydGllcyA9IGdsb2JfZGljdAorICAgIFRyeVBhcnNlRmluZ2VycHJpbnRBbmRUaW1lc3RhbXAoaW1hZ2VfcHJvcGVydGllcykKICAgZWxzZToKLSAgICBpbWFnZV9maWxlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUob3V0X2ZpbGUpCisgICAgaW1hZ2VfZmlsZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGFyZ3Mub3V0X2ZpbGUpCiAgICAgbW91bnRfcG9pbnQgPSAiIgogICAgIGlmIGltYWdlX2ZpbGVuYW1lID09ICJzeXN0ZW0uaW1nIjoKICAgICAgIG1vdW50X3BvaW50ID0gInN5c3RlbSIKQEAgLTkzMiwxNSArMTAzNywxMiBAQAogICAgIGlmICJ2Ym1ldGEiICE9IG1vdW50X3BvaW50OgogICAgICAgaW1hZ2VfcHJvcGVydGllcyA9IEltYWdlUHJvcEZyb21HbG9iYWxEaWN0KGdsb2JfZGljdCwgbW91bnRfcG9pbnQpCiAKLSAgdHJ5OgotICAgIGlmICJ2Ym1ldGEiIGluIG9zLnBhdGguYmFzZW5hbWUob3V0X2ZpbGUpOgotICAgICAgT1BUSU9OUy5pbmZvX2RpY3QgPSBnbG9iX2RpY3QKLSAgICAgIEJ1aWxkVkJNZXRhKGluX2RpciwgZ2xvYl9kaWN0LCBvdXRfZmlsZSkKLSAgICBlbHNlOgotICAgICAgQnVpbGRJbWFnZShpbl9kaXIsIGltYWdlX3Byb3BlcnRpZXMsIG91dF9maWxlLCB0YXJnZXRfb3V0KQotICBleGNlcHQ6Ci0gICAgbG9nZ2VyLmVycm9yKCJGYWlsZWQgdG8gYnVpbGQgJXMgZnJvbSAlcyIsIG91dF9maWxlLCBpbl9kaXIpCi0gICAgcmFpc2UKKyAgaWYgYXJncy5pbnB1dF9kaXJlY3RvcnlfZmlsdGVyX2ZpbGUgYW5kIG5vdCBvcy5lbnZpcm9uLmdldCgiQlVJTERfQlJPS0VOX0lOQ09SUkVDVF9QQVJUSVRJT05fSU1BR0VTIik6CisgICAgd2l0aCB0ZW1wZmlsZS5UZW1wb3JhcnlEaXJlY3RvcnkoZGlyPW9zLnBhdGguZGlybmFtZShhcmdzLmlucHV0X2RpcmVjdG9yeSkpIGFzIG5ld19pbnB1dF9kaXJlY3Rvcnk6CisgICAgICBDb3B5SW5wdXREaXJlY3RvcnkoYXJncy5pbnB1dF9kaXJlY3RvcnksIG5ld19pbnB1dF9kaXJlY3RvcnksIGFyZ3MuaW5wdXRfZGlyZWN0b3J5X2ZpbHRlcl9maWxlKQorICAgICAgQnVpbGRJbWFnZU9yVkJNZXRhKG5ld19pbnB1dF9kaXJlY3RvcnksIGFyZ3MudGFyZ2V0X291dCwgZ2xvYl9kaWN0LCBpbWFnZV9wcm9wZXJ0aWVzLCBhcmdzLm91dF9maWxlKQorICBlbHNlOgorICAgIEJ1aWxkSW1hZ2VPclZCTWV0YShhcmdzLmlucHV0X2RpcmVjdG9yeSwgYXJncy50YXJnZXRfb3V0LCBnbG9iX2RpY3QsIGltYWdlX3Byb3BlcnRpZXMsIGFyZ3Mub3V0X2ZpbGUpCiAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9jaGVja190YXJnZXRfZmlsZXNfc2lnbmF0dXJlcy5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9jaGVja190YXJnZXRfZmlsZXNfc2lnbmF0dXJlcy5weQppbmRleCBhN2IzNTIzLi5jZGFmYjRiIDEwMDc1NQotLS0gYS90b29scy9yZWxlYXNldG9vbHMvY2hlY2tfdGFyZ2V0X2ZpbGVzX3NpZ25hdHVyZXMucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL2NoZWNrX3RhcmdldF9maWxlc19zaWduYXR1cmVzLnB5CkBAIC01OCwyMiArNTgsNiBAQAogCiBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKIAotIyBXb3JrIGFyb3VuZCBhIGJ1ZyBpbiBQeXRob24ncyB6aXBmaWxlIG1vZHVsZSB0aGF0IHByZXZlbnRzIG9wZW5pbmcgb2YgemlwZmlsZXMKLSMgaWYgYW55IGVudHJ5IGhhcyBhbiBleHRyYSBmaWVsZCBvZiBiZXR3ZWVuIDEgYW5kIDMgYnl0ZXMgKHdoaWNoIGlzIGNvbW1vbiB3aXRoCi0jIHppcGFsaWduZWQgQVBLcykuIFRoaXMgb3ZlcnJpZGVzIHRoZSBaaXBJbmZvLl9kZWNvZGVFeHRyYSgpIG1ldGhvZCAod2hpY2gKLSMgY29udGFpbnMgdGhlIGJ1Zykgd2l0aCBhbiBlbXB0eSB2ZXJzaW9uIChzaW5jZSB3ZSBkb24ndCBuZWVkIHRvIGRlY29kZSB0aGUKLSMgZXh0cmEgZmllbGQgYW55d2F5KS4KLSMgSXNzdWUgIzE0MzE1OiBodHRwczovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE0MzE1LCBmaXhlZCBpbiBQeXRob24gMi43LjggYW5kCi0jIFB5dGhvbiAzLjUuMCBhbHBoYSAxLgotCi0KLWNsYXNzIE15WmlwSW5mbyh6aXBmaWxlLlppcEluZm8pOgotICBkZWYgX2RlY29kZUV4dHJhKHNlbGYpOgotICAgIHBhc3MKLQotCi16aXBmaWxlLlppcEluZm8gPSBNeVppcEluZm8KLQogCiBPUFRJT05TID0gY29tbW9uLk9QVElPTlMKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL2NoZWNrX3RhcmdldF9maWxlc192aW50Zi5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9jaGVja190YXJnZXRfZmlsZXNfdmludGYucHkKaW5kZXggNWI3MWM3Mi4uZGMxMjNlZiAxMDA3NTUKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL2NoZWNrX3RhcmdldF9maWxlc192aW50Zi5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvY2hlY2tfdGFyZ2V0X2ZpbGVzX3ZpbnRmLnB5CkBAIC0zMCw2ICszMCw3IEBACiBpbXBvcnQgc3lzCiBpbXBvcnQgemlwZmlsZQogCitpbXBvcnQgYXBleF91dGlscwogaW1wb3J0IGNvbW1vbgogZnJvbSBhcGV4X21hbmlmZXN0IGltcG9ydCBQYXJzZUFwZXhNYW5pZmVzdAogCkBAIC0xMjksOCArMTMwLDkgQEAKIAogICBkaXJtYXAgPSBHZXREaXJtYXAoaW5wdXRfdG1wKQogCi0gICMgU2ltdWxhdGUgYXBleGQgZnJvbSB0YXJnZXQtZmlsZXMuCi0gIGRpcm1hcFsnL2FwZXgnXSA9IFByZXBhcmVBcGV4RGlyZWN0b3J5KGlucHV0X3RtcCkKKyAgIyBTaW11bGF0ZSBhcGV4ZCB3aXRoIHRhcmdldC1maWxlcy4KKyAgIyBhZGQgYSBtYXBwaW5nKCcvYXBleCcgPT4gJHtpbnB1dF90bXB9L0FQRVgpIHRvIGRpcm1hcAorICBQcmVwYXJlQXBleERpcmVjdG9yeShpbnB1dF90bXAsIGRpcm1hcCkKIAogICBhcmdzX2Zvcl9za3VzID0gR2V0QXJnc0ZvclNrdXMoaW5mb19kaWN0KQogICBzaGlwcGluZ19hcGlfbGV2ZWxfYXJncyA9IEdldEFyZ3NGb3JTaGlwcGluZ0FwaUxldmVsKGluZm9fZGljdCkKQEAgLTIwNCw3ICsyMDYsOCBAQAogCiAgIHJldHVybiBwYXR0ZXJucwogCi1kZWYgUHJlcGFyZUFwZXhEaXJlY3RvcnkoaW5wKToKKworZGVmIFByZXBhcmVBcGV4RGlyZWN0b3J5KGlucCwgZGlybWFwKToKICAgIiIiIFByZXBhcmUgL2FwZXggZGlyZWN0b3J5IGJlZm9yZSBydW5uaW5nIGNoZWNrdmludGYKIAogICBBcGV4IGJpbmFyaWVzIGRvIG5vdCBzdXBwb3J0IGRpcm1hcHMsIGluIG9yZGVyIHRvIHVzZSB0aGVzZSBiaW5hcmllcyB3ZQpAQCAtMjEyLDk2ICsyMTUsMjYgQEAKICAgZXhwZWN0ZWQgZGV2aWNlIGxvY2F0aW9ucy4KIAogICBUaGlzIHNpbXVsYXRlcyBob3cgYXBleGQgYWN0aXZhdGVzIEFQRVhlcy4KLSAgMS4gY3JlYXRlIHtpbnB9L0FQRVggd2hpY2ggaXMgdHJlYXRlZCBhcyBhICIvIiBvbiBkZXZpY2UuCi0gIDIuIGNvcHkgYXBleGVzIGZyb20gdGFyZ2V0LWZpbGVzIHRvIHtyb290fS97cGFydGl0aW9ufS9hcGV4LgotICAzLiBtb3VudCBhcGV4ZXMgdW5kZXIge3Jvb3R9L3twYXJ0aXRpb259L2FwZXggYXQge3Jvb3R9L2FwZXguCi0gIDQuIGdlbmVyYXRlIGluZm8gZmlsZXMgd2l0aCBkdW1wX2FwZXhfaW5mby4KLQotICBXZSdsbCBnZXQgdGhlIGZvbGxvd2luZyBsYXlvdXQKLSAgICAgICB7aW5wfS9BUEVYL2FwZXggICAgICAgICAgICAgIyBBY3RpdmF0ZWQgQVBFWGVzICsgc29tZSBpbmZvIGZpbGVzCi0gICAgICAge2lucH0vQVBFWC9zeXN0ZW0vYXBleCAgICAgICMgU3lzdGVtIEFQRVhlcwotICAgICAgIHtpbnB9L0FQRVgvdmVuZG9yL2FwZXggICAgICAjIFZlbmRvciBBUEVYZXMKLSAgICAgICAuLi4KLQotICBBcmdzOgotICAgIGlucDogcGF0aCB0byB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlIGV4dHJhY3RlZCB0YXJnZXQgZmlsZXMgYXJjaGl2ZS4KLQotICBSZXR1cm5zOgotICAgIGRpcmVjdG9yeSByZXByZXNlbnRpbmcgL2FwZXggb24gZGV2aWNlCisgIDEuIGNyZWF0ZSB7aW5wfS9BUEVYIHdoaWNoIGlzIHRyZWF0ZWQgYXMgYSAiL2FwZXgiIG9uIGRldmljZS4KKyAgMi4gaW52b2tlIGFwZXhkX2hvc3Qgd2l0aCBBUEVYZXMuCiAgICIiIgogCi0gIGRlYXBleGVyID0gJ2RlYXBleGVyJwotICBkZWJ1Z2ZzX3BhdGggPSAnZGVidWdmcycKLSAgYmxraWRfcGF0aCA9ICdibGtpZCcKLSAgZnNja2Vyb2ZzX3BhdGggPSAnZnNjay5lcm9mcycKLSAgaWYgT1BUSU9OUy5zZWFyY2hfcGF0aDoKLSAgICBkZWJ1Z2ZzX3BhdGggPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5zZWFyY2hfcGF0aCwgJ2JpbicsICdkZWJ1Z2ZzX3N0YXRpYycpCi0gICAgZGVhcGV4ZXJfcGF0aCA9IG9zLnBhdGguam9pbihPUFRJT05TLnNlYXJjaF9wYXRoLCAnYmluJywgJ2RlYXBleGVyJykKLSAgICBibGtpZF9wYXRoID0gb3MucGF0aC5qb2luKE9QVElPTlMuc2VhcmNoX3BhdGgsICdiaW4nLCAnYmxraWRfc3RhdGljJykKLSAgICBmc2NrZXJvZnNfcGF0aCA9IG9zLnBhdGguam9pbihPUFRJT05TLnNlYXJjaF9wYXRoLCAnYmluJywgJ2ZzY2suZXJvZnMnKQotICAgIGlmIG9zLnBhdGguaXNmaWxlKGRlYXBleGVyX3BhdGgpOgotICAgICAgZGVhcGV4ZXIgPSBkZWFwZXhlcl9wYXRoCi0KLSAgZGVmIEV4dHJhY3RBcGV4ZXMocGF0aCwgb3V0cCk6Ci0gICAgIyBFeHRyYWN0IGFsbCBBUEVYZXMgZm91bmQgaW4gaW5wdXQgcGF0aC4KLSAgICBsb2dnZXIuaW5mbygnRXh0cmFjdGluZyBBUEVYcyBpbiAlcycsIHBhdGgpCi0gICAgZm9yIGYgaW4gb3MubGlzdGRpcihwYXRoKToKLSAgICAgIGxvZ2dlci5pbmZvKCcgIGFkZGluZyBBUEVYICVzJywgb3MucGF0aC5iYXNlbmFtZShmKSkKLSAgICAgIGFwZXggPSBvcy5wYXRoLmpvaW4ocGF0aCwgZikKLSAgICAgIGlmIG9zLnBhdGguaXNkaXIoYXBleCkgYW5kIG9zLnBhdGguaXNmaWxlKG9zLnBhdGguam9pbihhcGV4LCAnYXBleF9tYW5pZmVzdC5wYicpKToKLSAgICAgICAgaW5mbyA9IFBhcnNlQXBleE1hbmlmZXN0KG9zLnBhdGguam9pbihhcGV4LCAnYXBleF9tYW5pZmVzdC5wYicpKQotICAgICAgICAjIEZsYXR0ZW5lZCBBUEVYZXMgbWF5IGhhdmUgc3ltbGlua3MgZm9yIGxpYnMgKGxpbmtlZCB0byAvc3lzdGVtL2xpYikKLSAgICAgICAgIyBXZSBuZWVkIHRvIGJsaW5kbHkgY29weSB0aGVtIGFsbC4KLSAgICAgICAgc2h1dGlsLmNvcHl0cmVlKGFwZXgsIG9zLnBhdGguam9pbihvdXRwLCBpbmZvLm5hbWUpLCBzeW1saW5rcz1UcnVlKQotICAgICAgZWxpZiBvcy5wYXRoLmlzZmlsZShhcGV4KSBhbmQgYXBleC5lbmRzd2l0aCgoJy5hcGV4JywgJy5jYXBleCcpKToKLSAgICAgICAgY21kID0gW2RlYXBleGVyLAotICAgICAgICAgICAgICAgJy0tZGVidWdmc19wYXRoJywgZGVidWdmc19wYXRoLAotICAgICAgICAgICAgICAgJ2luZm8nLAotICAgICAgICAgICAgICAgYXBleF0KLSAgICAgICAgaW5mbyA9IGpzb24ubG9hZHMoY29tbW9uLlJ1bkFuZENoZWNrT3V0cHV0KGNtZCkpCi0KLSAgICAgICAgY21kID0gW2RlYXBleGVyLAotICAgICAgICAgICAgICAgJy0tZGVidWdmc19wYXRoJywgZGVidWdmc19wYXRoLAotICAgICAgICAgICAgICAgJy0tZnNja2Vyb2ZzX3BhdGgnLCBmc2NrZXJvZnNfcGF0aCwKLSAgICAgICAgICAgICAgICctLWJsa2lkX3BhdGgnLCBibGtpZF9wYXRoLAotICAgICAgICAgICAgICAgJ2V4dHJhY3QnLAotICAgICAgICAgICAgICAgYXBleCwKLSAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihvdXRwLCBpbmZvWyduYW1lJ10pXQotICAgICAgICBjb21tb24uUnVuQW5kQ2hlY2tPdXRwdXQoY21kKQotICAgICAgZWxzZToKLSAgICAgICAgbG9nZ2VyLmluZm8oJyAgLi4gc2tpcHBpbmcgJXMgKGlzIGl0IEFQRVg/KScsIHBhdGgpCi0KLSAgcm9vdF9kaXJfbmFtZSA9ICdBUEVYJwotICByb290X2RpciA9IG9zLnBhdGguam9pbihpbnAsIHJvb3RfZGlyX25hbWUpCi0gIGV4dHJhY3RlZF9yb290ID0gb3MucGF0aC5qb2luKHJvb3RfZGlyLCAnYXBleCcpCisgIGFwZXhfZGlyID0gY29tbW9uLk1ha2VUZW1wRGlyKCdBUEVYJykKKyAgIyBjaGVja3ZpbnRmIG5lZWRzIC9hcGV4IGRpcm1hcAorICBkaXJtYXBbJy9hcGV4J10gPSBhcGV4X2RpcgogCiAgICMgQWx3YXlzIGNyZWF0ZSAvYXBleCBkaXJlY3RvcnkgZm9yIGRpcm1hcAotICBvcy5tYWtlZGlycyhleHRyYWN0ZWRfcm9vdCkKKyAgb3MubWFrZWRpcnMoYXBleF9kaXIsIGV4aXN0X29rPVRydWUpCiAKLSAgY3JlYXRlX2luZm9fZmlsZSA9IEZhbHNlCisgICMgSW52b2tlIGFwZXhkX2hvc3QgdG8gYWN0aXZhdGUgQVBFWGVzIGZvciBjaGVja3ZpbnRmCisgIGFwZXhfaG9zdCA9IG9zLnBhdGguam9pbihPUFRJT05TLnNlYXJjaF9wYXRoLCAnYmluJywgJ2FwZXhkX2hvc3QnKQorICBjbWQgPSBbYXBleF9ob3N0LCAnLS10b29sX3BhdGgnLCBPUFRJT05TLnNlYXJjaF9wYXRoXQorICBjbWQgKz0gWyctLWFwZXhfcGF0aCcsIGRpcm1hcFsnL2FwZXgnXV0KKyAgZm9yIHAgaW4gYXBleF91dGlscy5QQVJUSVRJT05TOgorICAgIGlmICcvJyArIHAgaW4gZGlybWFwOgorICAgICAgY21kICs9IFsnLS0nICsgcCArICdfcGF0aCcsIGRpcm1hcFsnLycgKyBwXV0KKyAgY29tbW9uLlJ1bkFuZENoZWNrT3V0cHV0KGNtZCkKIAotICAjIExvb3AgdGhyb3VnaCBzZWFyY2ggcGF0aCBsb29raW5nIGZvciBhbmQgcHJvY2Vzc2luZyBhcGV4LyBkaXJlY3Rvcmllcy4KLSAgZm9yIGRldmljZV9wYXRoLCB0YXJnZXRfZmlsZXNfcmVsX3BhdGhzIGluIERJUl9TRUFSQ0hfUEFUSFMuaXRlbXMoKToKLSAgICAjIGNoZWNrdmludGYgb25seSBuZWVkcyB2ZW5kb3IgYXBleGVzLiBza2lwIG90aGVyIHBhcnRpdGlvbnMgZm9yIGVmZmljaWVuY3kKLSAgICBpZiBkZXZpY2VfcGF0aCBub3QgaW4gWycvdmVuZG9yJywgJy9vZG0nXToKLSAgICAgIGNvbnRpbnVlCi0gICAgIyBGaXJzdCwgY29weSBWRU5ET1IvYXBleC9mb28uYXBleCB0byBBUEVYL3ZlbmRvci9hcGV4L2Zvby5hcGV4Ci0gICAgIyBUaGVuLCBleHRyYWN0IHRoZSBjb250ZW50cyB0byBBUEVYL2FwZXgvZm9vLwotICAgIGZvciB0YXJnZXRfZmlsZXNfcmVsX3BhdGggaW4gdGFyZ2V0X2ZpbGVzX3JlbF9wYXRoczoKLSAgICAgIGlucF9wYXJ0aXRpb24gPSBvcy5wYXRoLmpvaW4oaW5wLCB0YXJnZXRfZmlsZXNfcmVsX3BhdGgsImFwZXgiKQotICAgICAgaWYgb3MucGF0aC5leGlzdHMoaW5wX3BhcnRpdGlvbik6Ci0gICAgICAgIGFwZXhfZGlyID0gcm9vdF9kaXIgKyBvcy5wYXRoLmpvaW4oZGV2aWNlX3BhdGggKyAiL2FwZXgiKTsKLSAgICAgICAgb3MubWFrZWRpcnMocm9vdF9kaXIgKyBkZXZpY2VfcGF0aCkKLSAgICAgICAgc2h1dGlsLmNvcHl0cmVlKGlucF9wYXJ0aXRpb24sIGFwZXhfZGlyLCBzeW1saW5rcz1UcnVlKQotICAgICAgICBFeHRyYWN0QXBleGVzKGFwZXhfZGlyLCBleHRyYWN0ZWRfcm9vdCkKLSAgICAgICAgY3JlYXRlX2luZm9fZmlsZSA9IFRydWUKLQotICBpZiBjcmVhdGVfaW5mb19maWxlOgotICAgICMjIyBEdW1wIGFwZXggaW5mbyBmaWxlcwotICAgIGR1bXBfY21kID0gWydkdW1wX2FwZXhfaW5mbycsICctLXJvb3RfZGlyJywgcm9vdF9kaXJdCi0gICAgY29tbW9uLlJ1bkFuZENoZWNrT3V0cHV0KGR1bXBfY21kKQotCi0gIHJldHVybiBleHRyYWN0ZWRfcm9vdAogCiBkZWYgQ2hlY2tWaW50ZkZyb21UYXJnZXRGaWxlcyhpbnAsIGluZm9fZGljdD1Ob25lKToKICAgIiIiCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvY29tbW9uLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL2NvbW1vbi5weQppbmRleCAyYzU1N2QxLi5mMDRkZmI3IDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvY29tbW9uLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9jb21tb24ucHkKQEAgLTIwLDcgKzIwLDYgQEAKIGltcG9ydCBkYXRldGltZQogaW1wb3J0IGVycm5vCiBpbXBvcnQgZm5tYXRjaAotZnJvbSBnZW5lcmljcGF0aCBpbXBvcnQgaXNkaXIKIGltcG9ydCBnZXRvcHQKIGltcG9ydCBnZXRwYXNzCiBpbXBvcnQgZ3ppcApAQCAtMzQsMjIgKzMzLDI5IEBACiBpbXBvcnQgc2hsZXgKIGltcG9ydCBzaHV0aWwKIGltcG9ydCBzdWJwcm9jZXNzCi1pbXBvcnQgc3lzCiBpbXBvcnQgc3RhdAoraW1wb3J0IHN5cwogaW1wb3J0IHRlbXBmaWxlCiBpbXBvcnQgdGhyZWFkaW5nCiBpbXBvcnQgdGltZQogaW1wb3J0IHppcGZpbGUKKworZnJvbSB0eXBpbmcgaW1wb3J0IEl0ZXJhYmxlLCBDYWxsYWJsZQorZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCiBmcm9tIGhhc2hsaWIgaW1wb3J0IHNoYTEsIHNoYTI1NgogCiBpbXBvcnQgaW1hZ2VzCi1pbXBvcnQgcmFuZ2VsaWIKIGltcG9ydCBzcGFyc2VfaW1nCiBmcm9tIGJsb2NraW1nZGlmZiBpbXBvcnQgQmxvY2tJbWFnZURpZmYKIAogbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCiAKIAorQGRhdGFjbGFzcworY2xhc3MgT3B0aW9uSGFuZGxlcjoKKyAgZXh0cmFfbG9uZ19vcHRzOiBJdGVyYWJsZVtzdHJdCisgIGhhbmRsZXI6IENhbGxhYmxlCisKIGNsYXNzIE9wdGlvbnMob2JqZWN0KToKIAogICBkZWYgX19pbml0X18oc2VsZik6CkBAIC03NCw5ICs4MCw3IEBACiAgICAgICBpZiAiQU5EUk9JRF9IT1NUX09VVCIgaW4gb3MuZW52aXJvbjoKICAgICAgICAgc2VsZi5zZWFyY2hfcGF0aCA9IG9zLmVudmlyb25bIkFORFJPSURfSE9TVF9PVVQiXQogICAgIHNlbGYuc2lnbmFwa19zaGFyZWRfbGlicmFyeV9wYXRoID0gImxpYjY0IiAgICMgUmVsYXRpdmUgdG8gc2VhcmNoX3BhdGgKLSAgICBzZWxmLnNpZ25fc2Vwb2xpY3lfcGF0aCA9IE5vbmUKICAgICBzZWxmLmV4dHJhX3NpZ25hcGtfYXJncyA9IFtdCi0gICAgc2VsZi5leHRyYV9zaWduX3NlcG9saWN5X2FyZ3MgPSBbXQogICAgIHNlbGYuYWFwdDJfcGF0aCA9ICJhYXB0MiIKICAgICBzZWxmLmphdmFfcGF0aCA9ICJqYXZhIiAgIyBVc2UgdGhlIG9uZSBvbiB0aGUgcGF0aCBieSBkZWZhdWx0LgogICAgIHNlbGYuamF2YV9hcmdzID0gWyItWG14NDA5Nm0iXSAgIyBUaGUgZGVmYXVsdCBKVk0gYXJncy4KQEAgLTk2LDggKzEwMCw2IEBACiAgICAgc2VsZi5jYWNoZV9zaXplID0gTm9uZQogICAgIHNlbGYuc3Rhc2hfdGhyZXNob2xkID0gMC44CiAgICAgc2VsZi5sb2dmaWxlID0gTm9uZQotICAgIHNlbGYuaG9zdF90b29scyA9IHt9Ci0gICAgc2VsZi5zZXBvbGljeV9uYW1lID0gJ3NlcG9saWN5LmFwZXgnCiAKIAogT1BUSU9OUyA9IE9wdGlvbnMoKQpAQCAtMTEzLDEzICsxMTUsMTggQEAKICMgZGVzY3JpcHRvciBpbnRvIHZibWV0YS5pbWcuIFdoZW4gYWRkaW5nIGEgbmV3IGVudHJ5IGhlcmUsIHRoZQogIyBBVkJfRk9PVEVSX0FSR1NfQllfUEFSVElUSU9OIGluIHNpZ25fdGFyZ2V0X2ZpbGVzX2Fwa3MgbmVlZCB0byBiZSB1cGRhdGVkCiAjIGFjY29yZGluZ2x5LgotQVZCX1BBUlRJVElPTlMgPSAoJ2Jvb3QnLCAnaW5pdF9ib290JywgJ2R0Ym8nLCAnb2RtJywgJ3Byb2R1Y3QnLCAncHZtZncnLCAncmVjb3ZlcnknLAotICAgICAgICAgICAgICAgICAgJ3N5c3RlbScsICdzeXN0ZW1fZXh0JywgJ3ZlbmRvcicsICd2ZW5kb3JfYm9vdCcsICd2ZW5kb3Jfa2VybmVsX2Jvb3QnLAotICAgICAgICAgICAgICAgICAgJ3ZlbmRvcl9kbGttJywgJ29kbV9kbGttJywgJ3N5c3RlbV9kbGttJykKK0FWQl9QQVJUSVRJT05TID0gKCdib290JywgJ2luaXRfYm9vdCcsICdkdGJvJywgJ29kbScsICdwcm9kdWN0JywgJ3B2bWZ3JywKKyAgICAgICAgICAgICAgICAgICdyZWNvdmVyeScsICdzeXN0ZW0nLCAnc3lzdGVtX2V4dCcsICd2ZW5kb3InLCAndmVuZG9yX2Jvb3QnLAorICAgICAgICAgICAgICAgICAgJ3ZlbmRvcl9rZXJuZWxfYm9vdCcsICd2ZW5kb3JfZGxrbScsICdvZG1fZGxrbScsCisgICAgICAgICAgICAgICAgICAnc3lzdGVtX2Rsa20nKQogCiAjIENoYWluZWQgVkJNZXRhIHBhcnRpdGlvbnMuCiBBVkJfVkJNRVRBX1BBUlRJVElPTlMgPSAoJ3ZibWV0YV9zeXN0ZW0nLCAndmJtZXRhX3ZlbmRvcicpCiAKKyMgYXZidG9vbCBhcmd1bWVudHMgbmFtZQorQVZCX0FSR19OQU1FX0lOQ0xVREVfREVTQ19GUk9NX0lNRyA9ICctLWluY2x1ZGVfZGVzY3JpcHRvcnNfZnJvbV9pbWFnZScKK0FWQl9BUkdfTkFNRV9DSEFJTl9QQVJUSVRJT04gPSAnLS1jaGFpbl9wYXJ0aXRpb24nCisKICMgUGFydGl0aW9ucyB0aGF0IHNob3VsZCBoYXZlIHRoZWlyIGNhcmVfbWFwIGFkZGVkIHRvIE1FVEEvY2FyZV9tYXAucGIKIFBBUlRJVElPTlNfV0lUSF9DQVJFX01BUCA9IFsKICAgICAnc3lzdGVtJywKQEAgLTE0MCw2ICsxNDcsMTkgQEAKIFJBTURJU0tfQlVJTERfUFJPUF9SRUxfUEFUSFMgPSBbJ3N5c3RlbS9ldGMvcmFtZGlzay9idWlsZC5wcm9wJ10KIAogCitAZGF0YWNsYXNzCitjbGFzcyBBdmJDaGFpbmVkUGFydGl0aW9uQXJnOgorICAiIiJUaGUgcmVxdWlyZWQgYXJndW1lbnRzIGZvciBhdmJ0b29sIC0tY2hhaW5fcGFydGl0aW9uLiIiIgorICBwYXJ0aXRpb246IHN0cgorICByb2xsYmFja19pbmRleF9sb2NhdGlvbjogaW50CisgIHB1YmtleV9wYXRoOiBzdHIKKworICBkZWYgdG9fc3RyaW5nKHNlbGYpOgorICAgICIiIkNvbnZlcnQgdG8gc3RyaW5nIGNvbW1hbmQgYXJndW1lbnRzLiIiIgorICAgIHJldHVybiAne306e306e30nLmZvcm1hdCgKKyAgICAgICAgc2VsZi5wYXJ0aXRpb24sIHNlbGYucm9sbGJhY2tfaW5kZXhfbG9jYXRpb24sIHNlbGYucHVia2V5X3BhdGgpCisKKwogY2xhc3MgRXJyb3JDb2RlKG9iamVjdCk6CiAgICIiIkRlZmluZSBlcnJvcl9jb2RlcyBmb3IgZmFpbHVyZXMgdGhhdCBoYXBwZW4gZHVyaW5nIHRoZSBhY3R1YWwKICAgdXBkYXRlIHBhY2thZ2UgaW5zdGFsbGF0aW9uLgpAQCAtMTk1LDcgKzIxNSw3IEBACiAgICAgICAgICAgJyc6IHsKICAgICAgICAgICAgICAgJ2hhbmRsZXJzJzogWydkZWZhdWx0J10sCiAgICAgICAgICAgICAgICdwcm9wYWdhdGUnOiBUcnVlLAotICAgICAgICAgICAgICAnbGV2ZWwnOiAnSU5GTycsCisgICAgICAgICAgICAgICdsZXZlbCc6ICdOT1RTRVQnLAogICAgICAgICAgIH0KICAgICAgIH0KICAgfQpAQCAtMjI1LDIzICsyNDUsMTUgQEAKICAgbG9nZ2luZy5jb25maWcuZGljdENvbmZpZyhjb25maWcpCiAKIAotZGVmIFNldEhvc3RUb29sTG9jYXRpb24odG9vbF9uYW1lLCBsb2NhdGlvbik6Ci0gIE9QVElPTlMuaG9zdF90b29sc1t0b29sX25hbWVdID0gbG9jYXRpb24KLQotCiBkZWYgRmluZEhvc3RUb29sUGF0aCh0b29sX25hbWUpOgogICAiIiJGaW5kcyB0aGUgcGF0aCB0byB0aGUgaG9zdCB0b29sLgogCiAgIEFyZ3M6CiAgICAgdG9vbF9uYW1lOiBuYW1lIG9mIHRoZSB0b29sIHRvIGZpbmQKICAgUmV0dXJuczoKLSAgICBwYXRoIHRvIHRoZSB0b29sIGlmIGZvdW5kIHVuZGVyIGVpdGhlciBvbmUgb2YgdGhlIGhvc3RfdG9vbHMgbWFwIG9yIHVuZGVyCi0gICAgdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoaXMgYmluYXJ5IGlzIGxvY2F0ZWQgYXQuIElmIG5vdCBmb3VuZCwgdG9vbF9uYW1lCi0gICAgaXMgcmV0dXJuZWQuCisgICAgcGF0aCB0byB0aGUgdG9vbCBpZiBmb3VuZCB1bmRlciB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhpcyBiaW5hcnkgaXMgbG9jYXRlZCBhdC4gSWYgbm90IGZvdW5kLAorICAgIHRvb2xfbmFtZSBpcyByZXR1cm5lZC4KICAgIiIiCi0gIGlmIHRvb2xfbmFtZSBpbiBPUFRJT05TLmhvc3RfdG9vbHM6Ci0gICAgcmV0dXJuIE9QVElPTlMuaG9zdF90b29sc1t0b29sX25hbWVdCi0KICAgbXlfZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGgucmVhbHBhdGgoc3lzLmFyZ3ZbMF0pKQogICB0b29sX3BhdGggPSBvcy5wYXRoLmpvaW4obXlfZGlyLCB0b29sX25hbWUpCiAgIGlmIG9zLnBhdGguZXhpc3RzKHRvb2xfcGF0aCk6CkBAIC00NTEsMTAgKzQ2Myw3IEBACiAKICAgQHByb3BlcnR5CiAgIGRlZiBpc192YWJjKHNlbGYpOgotICAgIHZlbmRvcl9wcm9wID0gc2VsZi5pbmZvX2RpY3QuZ2V0KCJ2ZW5kb3IuYnVpbGQucHJvcCIpCi0gICAgdmFiY19lbmFibGVkID0gdmVuZG9yX3Byb3AgYW5kIFwKLSAgICAgICAgdmVuZG9yX3Byb3AuR2V0UHJvcCgicm8udmlydHVhbF9hYi5jb21wcmVzc2lvbi5lbmFibGVkIikgPT0gInRydWUiCi0gICAgcmV0dXJuIHZhYmNfZW5hYmxlZAorICAgIHJldHVybiBzZWxmLmluZm9fZGljdC5nZXQoInZpcnR1YWxfYWJfY29tcHJlc3Npb24iKSA9PSAidHJ1ZSIKIAogICBAcHJvcGVydHkKICAgZGVmIGlzX2FuZHJvaWRfcihzZWxmKToKQEAgLTQ2MiwyNiArNDcxLDM0IEBACiAgICAgcmV0dXJuIHN5c3RlbV9wcm9wIGFuZCBzeXN0ZW1fcHJvcC5HZXRQcm9wKCJyby5idWlsZC52ZXJzaW9uLnJlbGVhc2UiKSA9PSAiMTEiCiAKICAgQHByb3BlcnR5CisgIGRlZiBpc19yZWxlYXNlX2tleShzZWxmKToKKyAgICBzeXN0ZW1fcHJvcCA9IHNlbGYuaW5mb19kaWN0LmdldCgiYnVpbGQucHJvcCIpCisgICAgcmV0dXJuIHN5c3RlbV9wcm9wIGFuZCBzeXN0ZW1fcHJvcC5HZXRQcm9wKCJyby5idWlsZC50YWdzIikgPT0gInJlbGVhc2Uta2V5IgorCisgIEBwcm9wZXJ0eQogICBkZWYgdmFiY19jb21wcmVzc2lvbl9wYXJhbShzZWxmKToKICAgICByZXR1cm4gc2VsZi5nZXQoInZpcnR1YWxfYWJfY29tcHJlc3Npb25fbWV0aG9kIiwgIiIpCiAKICAgQHByb3BlcnR5CisgIGRlZiB2YWJjX2Nvd192ZXJzaW9uKHNlbGYpOgorICAgIHJldHVybiBzZWxmLmdldCgidmlydHVhbF9hYl9jb3dfdmVyc2lvbiIsICIiKQorCisgIEBwcm9wZXJ0eQogICBkZWYgdmVuZG9yX2FwaV9sZXZlbChzZWxmKToKICAgICB2ZW5kb3JfcHJvcCA9IHNlbGYuaW5mb19kaWN0LmdldCgidmVuZG9yLmJ1aWxkLnByb3AiKQogICAgIGlmIG5vdCB2ZW5kb3JfcHJvcDoKICAgICAgIHJldHVybiAtMQogCiAgICAgcHJvcHMgPSBbCi0gICAgICAgICJyby5ib2FyZC5hcGlfbGV2ZWwiLAogICAgICAgICAicm8uYm9hcmQuZmlyc3RfYXBpX2xldmVsIiwKICAgICAgICAgInJvLnByb2R1Y3QuZmlyc3RfYXBpX2xldmVsIiwKICAgICBdCiAgICAgZm9yIHByb3AgaW4gcHJvcHM6CiAgICAgICB2YWx1ZSA9IHZlbmRvcl9wcm9wLkdldFByb3AocHJvcCkKICAgICAgIHRyeToKLSAgICAgICAgICByZXR1cm4gaW50KHZhbHVlKQorICAgICAgICByZXR1cm4gaW50KHZhbHVlKQogICAgICAgZXhjZXB0OgotICAgICAgICAgIHBhc3MKKyAgICAgICAgcGFzcwogICAgIHJldHVybiAtMQogCiAgIEBwcm9wZXJ0eQpAQCAtNzYyLDYgKzc3OSwzMyBAQAogICByZXR1cm4gUmVhZEJ5dGVzRnJvbUlucHV0RmlsZShpbnB1dF9maWxlLCBmbikuZGVjb2RlKCkKIAogCitkZWYgV3JpdGVCeXRlc1RvSW5wdXRGaWxlKGlucHV0X2ZpbGUsIGZuLCBkYXRhKToKKyAgIiIiV3JpdGUgYnl0ZXMgfGRhdGF8IGNvbnRlbnRzIHRvIGZuIG9mIGlucHV0IHppcGZpbGUgb3IgZGlyZWN0b3J5LiIiIgorICBpZiBpc2luc3RhbmNlKGlucHV0X2ZpbGUsIHppcGZpbGUuWmlwRmlsZSk6CisgICAgd2l0aCBpbnB1dF9maWxlLm9wZW4oZm4sICJ3IikgYXMgZW50cnlfZnA6CisgICAgICByZXR1cm4gZW50cnlfZnAud3JpdGUoZGF0YSkKKyAgZWxpZiB6aXBmaWxlLmlzX3ppcGZpbGUoaW5wdXRfZmlsZSk6CisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoaW5wdXRfZmlsZSwgInIiLCBhbGxvd1ppcDY0PVRydWUpIGFzIHpmcDoKKyAgICAgIHdpdGggemZwLm9wZW4oZm4sICJ3IikgYXMgZW50cnlfZnA6CisgICAgICAgIHJldHVybiBlbnRyeV9mcC53cml0ZShkYXRhKQorICBlbHNlOgorICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGlucHV0X2ZpbGUpOgorICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAiSW52YWxpZCBpbnB1dF9maWxlLCBhY2NlcHRlZCBpbnB1dHMgYXJlIFppcEZpbGUgb2JqZWN0LCBwYXRoIHRvIC56aXAgZmlsZSBvbiBkaXNrLCBvciBwYXRoIHRvIGV4dHJhY3RlZCBkaXJlY3RvcnkuIEFjdHVhbDogIiArIGlucHV0X2ZpbGUpCisgICAgcGF0aCA9IG9zLnBhdGguam9pbihpbnB1dF9maWxlLCAqZm4uc3BsaXQoIi8iKSkKKyAgICB0cnk6CisgICAgICB3aXRoIG9wZW4ocGF0aCwgIndiIikgYXMgZjoKKyAgICAgICAgcmV0dXJuIGYud3JpdGUoZGF0YSkKKyAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9FTlQ6CisgICAgICAgIHJhaXNlIEtleUVycm9yKGZuKQorCisKK2RlZiBXcml0ZVRvSW5wdXRGaWxlKGlucHV0X2ZpbGUsIGZuLCBzdHI6IHN0cik6CisgICIiIldyaXRlIHN0ciBjb250ZW50IHRvIGZuIG9mIGlucHV0IGZpbGUgb3IgZGlyZWN0b3J5IiIiCisgIHJldHVybiBXcml0ZUJ5dGVzVG9JbnB1dEZpbGUoaW5wdXRfZmlsZSwgZm4sIHN0ci5lbmNvZGUoKSkKKworCiBkZWYgRXh0cmFjdEZyb21JbnB1dEZpbGUoaW5wdXRfZmlsZSwgZm4pOgogICAiIiJFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgZm4gZnJvbSBpbnB1dCB6aXBmaWxlIG9yIGRpcmVjdG9yeSBpbnRvIGEgZmlsZS4iIiIKICAgaWYgaXNpbnN0YW5jZShpbnB1dF9maWxlLCB6aXBmaWxlLlppcEZpbGUpOgpAQCAtODU0LDcgKzg5OCw3IEBACiAgICAgICBpZiBrZXkuZW5kc3dpdGgoInNlbGludXhfZmMiKToKICAgICAgICAgZmNfYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGRba2V5XSkKICAgICAgICAgZmNfY29uZmlnID0gb3MucGF0aC5qb2luKGlucHV0X2ZpbGUsICJNRVRBIiwgZmNfYmFzZW5hbWUpCi0gICAgICAgIGFzc2VydCBvcy5wYXRoLmV4aXN0cyhmY19jb25maWcpCisgICAgICAgIGFzc2VydCBvcy5wYXRoLmV4aXN0cyhmY19jb25maWcpLCAie30gZG9lcyBub3QgZXhpc3QiLmZvcm1hdChmY19jb25maWcpCiAKICAgICAgICAgZFtrZXldID0gZmNfY29uZmlnCiAKQEAgLTg2Myw5ICs5MDcsMTAgQEAKICAgICBkWyJyb290X2ZzX2NvbmZpZyJdID0gb3MucGF0aC5qb2luKAogICAgICAgICBpbnB1dF9maWxlLCAiTUVUQSIsICJyb290X2ZpbGVzeXN0ZW1fY29uZmlnLnR4dCIpCiAKKyAgICBwYXJ0aXRpb25zID0gWyJzeXN0ZW0iLCAidmVuZG9yIiwgInN5c3RlbV9leHQiLCAicHJvZHVjdCIsICJvZG0iLAorICAgICAgICAgICAgICAgICAgInZlbmRvcl9kbGttIiwgIm9kbV9kbGttIiwgInN5c3RlbV9kbGttIl0KICAgICAjIFJlZGlyZWN0IHtwYXJ0aXRpb259X2Jhc2VfZnNfZmlsZSBmb3IgZWFjaCBvZiB0aGUgbmFtZWQgcGFydGl0aW9ucy4KLSAgICBmb3IgcGFydF9uYW1lIGluIFsic3lzdGVtIiwgInZlbmRvciIsICJzeXN0ZW1fZXh0IiwgInByb2R1Y3QiLCAib2RtIiwKLSAgICAgICAgICAgICAgICAgICAgICAidmVuZG9yX2Rsa20iLCAib2RtX2Rsa20iLCAic3lzdGVtX2Rsa20iXToKKyAgICBmb3IgcGFydF9uYW1lIGluIHBhcnRpdGlvbnM6CiAgICAgICBrZXlfbmFtZSA9IHBhcnRfbmFtZSArICJfYmFzZV9mc19maWxlIgogICAgICAgaWYga2V5X25hbWUgbm90IGluIGQ6CiAgICAgICAgIGNvbnRpbnVlCkBAIC04NzgsNiArOTIzLDI1IEBACiAgICAgICAgICAgICAiRmFpbGVkIHRvIGZpbmQgJXMgYmFzZSBmcyBmaWxlOiAlcyIsIHBhcnRfbmFtZSwgYmFzZV9mc19maWxlKQogICAgICAgICBkZWwgZFtrZXlfbmFtZV0KIAorICAgICMgUmVkaXJlY3RpbmcgaGVscGVyIGZvciBvcHRpb25hbCBwcm9wZXJ0aWVzIGxpa2UgZXJvZnNfY29tcHJlc3NfaGludHMKKyAgICBkZWYgcmVkaXJlY3RfZmlsZShwcm9wLCBmaWxlbmFtZSk6CisgICAgICBpZiBwcm9wIG5vdCBpbiBkOgorICAgICAgICByZXR1cm4KKyAgICAgIGNvbmZpZ19maWxlID0gb3MucGF0aC5qb2luKGlucHV0X2ZpbGUsICJNRVRBLyIgKyBmaWxlbmFtZSkKKyAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGNvbmZpZ19maWxlKToKKyAgICAgICAgZFtwcm9wXSA9IGNvbmZpZ19maWxlCisgICAgICBlbHNlOgorICAgICAgICBsb2dnZXIud2FybmluZygKKyAgICAgICAgICAgICJGYWlsZWQgdG8gZmluZCAlcyBmcm8gJXMiLCBmaWxlbmFtZSwgcHJvcCkKKyAgICAgICAgZGVsIGRbcHJvcF0KKworICAgICMgUmVkaXJlY3QgZXJvZnNfW2RlZmF1bHRfXWNvbXByZXNzX2hpbnRzIGZpbGVzCisgICAgcmVkaXJlY3RfZmlsZSgiZXJvZnNfZGVmYXVsdF9jb21wcmVzc19oaW50cyIsCisgICAgICAgICAgICAgICAgICAiZXJvZnNfZGVmYXVsdF9jb21wcmVzc19oaW50cy50eHQiKQorICAgIGZvciBwYXJ0IGluIHBhcnRpdGlvbnM6CisgICAgICByZWRpcmVjdF9maWxlKHBhcnQgKyAiX2Vyb2ZzX2NvbXByZXNzX2hpbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgcGFydCArICJfZXJvZnNfY29tcHJlc3NfaGludHMudHh0IikKKwogICBkZWYgbWFrZWludChrZXkpOgogICAgIGlmIGtleSBpbiBkOgogICAgICAgZFtrZXldID0gaW50KGRba2V5XSwgMCkKQEAgLTkwOSwyMCArOTczLDE0IEBACiAgICAgICAgIGlucHV0X2ZpbGUsIHBhcnRpdGlvbiwgcmFtZGlza19mb3JtYXQ9cmFtZGlza19mb3JtYXQpCiAgIGRbImJ1aWxkLnByb3AiXSA9IGRbInN5c3RlbS5idWlsZC5wcm9wIl0KIAotICAjIFNldCB1cCB0aGUgc2FsdCAoYmFzZWQgb24gZmluZ2VycHJpbnQpIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gYWRkaW5nIEFWQgotICAjIGhhc2ggLyBoYXNodHJlZSBmb290ZXJzLgogICBpZiBkLmdldCgiYXZiX2VuYWJsZSIpID09ICJ0cnVlIjoKICAgICBidWlsZF9pbmZvID0gQnVpbGRJbmZvKGQsIHVzZV9sZWdhY3lfaWQ9VHJ1ZSkKLSAgICBmb3IgcGFydGl0aW9uIGluIFBBUlRJVElPTlNfV0lUSF9CVUlMRF9QUk9QOgotICAgICAgZmluZ2VycHJpbnQgPSBidWlsZF9pbmZvLkdldFBhcnRpdGlvbkZpbmdlcnByaW50KHBhcnRpdGlvbikKLSAgICAgIGlmIGZpbmdlcnByaW50OgotICAgICAgICBkWyJhdmJfe31fc2FsdCIuZm9ybWF0KHBhcnRpdGlvbildID0gc2hhMjU2KAotICAgICAgICAgICAgZmluZ2VycHJpbnQuZW5jb2RlKCkpLmhleGRpZ2VzdCgpCi0KICAgICAjIFNldCB1cCB0aGUgc2FsdCBmb3IgcGFydGl0aW9ucyB3aXRob3V0IGJ1aWxkLnByb3AKICAgICBpZiBidWlsZF9pbmZvLmZpbmdlcnByaW50OgotICAgICAgZFsiYXZiX3NhbHQiXSA9IHNoYTI1NihidWlsZF9pbmZvLmZpbmdlcnByaW50LmVuY29kZSgpKS5oZXhkaWdlc3QoKQotCisgICAgICBpZiAiZmluZ2VycHJpbnQiIG5vdCBpbiBkOgorICAgICAgICBkWyJmaW5nZXJwcmludCJdID0gYnVpbGRfaW5mby5maW5nZXJwcmludAorICAgICAgaWYgImF2Yl9zYWx0IiBub3QgaW4gZDoKKyAgICAgICAgZFsiYXZiX3NhbHQiXSA9IHNoYTI1NihidWlsZF9pbmZvLmZpbmdlcnByaW50LmVuY29kZSgpKS5oZXhkaWdlc3QoKQogICAgICMgU2V0IHRoZSB2Ym1ldGEgZGlnZXN0IGlmIGV4aXN0cwogICAgIHRyeToKICAgICAgIGRbInZibWV0YV9kaWdlc3QiXSA9IHJlYWRfaGVscGVyKCJNRVRBL3ZibWV0YV9kaWdlc3QudHh0IikucnN0cmlwKCkKQEAgLTk3OCw3ICsxMDM2LDcgQEAKICAgICAgICAgZWFjaCBvZiB0aGUgdmFyaWFibGVzLgogICAgIHJhbWRpc2tfZm9ybWF0OiBJZiBuYW1lIGlzICJib290IiwgdGhlIGZvcm1hdCBvZiByYW1kaXNrIGluc2lkZSB0aGUKICAgICAgICAgYm9vdCBpbWFnZS4gT3RoZXJ3aXNlLCBpdHMgdmFsdWUgaXMgaWdub3JlZC4KLSAgICAgICAgVXNlIGx6NCB0byBkZWNvbXByZXNzIGJ5IGRlZmF1bHQuIElmIGl0cyB2YWx1ZSBpcyBnemlwLCB1c2UgbWluaWd6aXAuCisgICAgICAgIFVzZSBsejQgdG8gZGVjb21wcmVzcyBieSBkZWZhdWx0LiBJZiBpdHMgdmFsdWUgaXMgZ3ppcCwgdXNlIGd6aXAuCiAgICIiIgogCiAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbnB1dF9maWxlLCBuYW1lLCBwbGFjZWhvbGRlcl92YWx1ZXM9Tm9uZSk6CkBAIC0xMTI4LDggKzExODYsNyBAQAogICAgIHJldHVybiBzZWxmLmJ1aWxkX3Byb3BzLmdldChwcm9wKQogCiAKLWRlZiBMb2FkUmVjb3ZlcnlGU1RhYihyZWFkX2hlbHBlciwgZnN0YWJfdmVyc2lvbiwgcmVjb3ZlcnlfZnN0YWJfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1fcm9vdF9pbWFnZT1GYWxzZSk6CitkZWYgTG9hZFJlY292ZXJ5RlNUYWIocmVhZF9oZWxwZXIsIGZzdGFiX3ZlcnNpb24sIHJlY292ZXJ5X2ZzdGFiX3BhdGgpOgogICBjbGFzcyBQYXJ0aXRpb24ob2JqZWN0KToKICAgICBkZWYgX19pbml0X18oc2VsZiwgbW91bnRfcG9pbnQsIGZzX3R5cGUsIGRldmljZSwgbGVuZ3RoLCBjb250ZXh0LCBzbG90c2VsZWN0KToKICAgICAgIHNlbGYubW91bnRfcG9pbnQgPSBtb3VudF9wb2ludApAQCAtMTE4OCwxMiArMTI0NSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPXBpZWNlc1swXSwgbGVuZ3RoPWxlbmd0aCwgY29udGV4dD1jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RzZWxlY3Q9c2xvdHNlbGVjdCkKIAotICAjIC8gaXMgdXNlZCBmb3IgdGhlIHN5c3RlbSBtb3VudCBwb2ludCB3aGVuIHRoZSByb290IGRpcmVjdG9yeSBpcyBpbmNsdWRlZCBpbgotICAjIHN5c3RlbS4gT3RoZXIgYXJlYXMgYXNzdW1lIHN5c3RlbSBpcyBhbHdheXMgYXQgIi9zeXN0ZW0iIHNvIHBvaW50IC9zeXN0ZW0KLSAgIyBhdCAvLgotICBpZiBzeXN0ZW1fcm9vdF9pbWFnZToKLSAgICBhc3NlcnQgJy9zeXN0ZW0nIG5vdCBpbiBkIGFuZCAnLycgaW4gZAotICAgIGRbIi9zeXN0ZW0iXSA9IGRbIi8iXQogICByZXR1cm4gZAogCiAKQEAgLTEyMDksMzIgKzEyNjAsMTkgQEAKICAgIyAuLi9SQU1ESVNLL3N5c3RlbS9ldGMvcmVjb3ZlcnkuZnN0YWIuIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGhhbmRsZSBib3RoCiAgICMgY2FzZXMsIHNpbmNlIGl0IG1heSBsb2FkIHRoZSBpbmZvX2RpY3QgZnJvbSBhbiBvbGQgYnVpbGQgKGUuZy4gd2hlbgogICAjIGdlbmVyYXRpbmcgaW5jcmVtZW50YWwgT1RBcyBmcm9tIHRoYXQgYnVpbGQpLgotICBzeXN0ZW1fcm9vdF9pbWFnZSA9IGluZm9fZGljdC5nZXQoJ3N5c3RlbV9yb290X2ltYWdlJykgPT0gJ3RydWUnCiAgIGlmIGluZm9fZGljdC5nZXQoJ25vX3JlY292ZXJ5JykgIT0gJ3RydWUnOgogICAgIHJlY292ZXJ5X2ZzdGFiX3BhdGggPSAnUkVDT1ZFUlkvUkFNRElTSy9zeXN0ZW0vZXRjL3JlY292ZXJ5LmZzdGFiJwotICAgIGlmIGlzaW5zdGFuY2UoaW5wdXRfZmlsZSwgemlwZmlsZS5aaXBGaWxlKToKLSAgICAgIGlmIHJlY292ZXJ5X2ZzdGFiX3BhdGggbm90IGluIGlucHV0X2ZpbGUubmFtZWxpc3QoKToKLSAgICAgICAgcmVjb3ZlcnlfZnN0YWJfcGF0aCA9ICdSRUNPVkVSWS9SQU1ESVNLL2V0Yy9yZWNvdmVyeS5mc3RhYicKLSAgICBlbHNlOgotICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihpbnB1dF9maWxlLCAqcmVjb3ZlcnlfZnN0YWJfcGF0aC5zcGxpdCgnLycpKQotICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBhdGgpOgotICAgICAgICByZWNvdmVyeV9mc3RhYl9wYXRoID0gJ1JFQ09WRVJZL1JBTURJU0svZXRjL3JlY292ZXJ5LmZzdGFiJworICAgIGlmIG5vdCBEb2VzSW5wdXRGaWxlQ29udGFpbihpbnB1dF9maWxlLCByZWNvdmVyeV9mc3RhYl9wYXRoKToKKyAgICAgIHJlY292ZXJ5X2ZzdGFiX3BhdGggPSAnUkVDT1ZFUlkvUkFNRElTSy9ldGMvcmVjb3ZlcnkuZnN0YWInCiAgICAgcmV0dXJuIExvYWRSZWNvdmVyeUZTVGFiKAotICAgICAgICByZWFkX2hlbHBlciwgaW5mb19kaWN0Wydmc3RhYl92ZXJzaW9uJ10sIHJlY292ZXJ5X2ZzdGFiX3BhdGgsCi0gICAgICAgIHN5c3RlbV9yb290X2ltYWdlKQorICAgICAgICByZWFkX2hlbHBlciwgaW5mb19kaWN0Wydmc3RhYl92ZXJzaW9uJ10sIHJlY292ZXJ5X2ZzdGFiX3BhdGgpCiAKICAgaWYgaW5mb19kaWN0LmdldCgncmVjb3ZlcnlfYXNfYm9vdCcpID09ICd0cnVlJzoKICAgICByZWNvdmVyeV9mc3RhYl9wYXRoID0gJ0JPT1QvUkFNRElTSy9zeXN0ZW0vZXRjL3JlY292ZXJ5LmZzdGFiJwotICAgIGlmIGlzaW5zdGFuY2UoaW5wdXRfZmlsZSwgemlwZmlsZS5aaXBGaWxlKToKLSAgICAgIGlmIHJlY292ZXJ5X2ZzdGFiX3BhdGggbm90IGluIGlucHV0X2ZpbGUubmFtZWxpc3QoKToKLSAgICAgICAgcmVjb3ZlcnlfZnN0YWJfcGF0aCA9ICdCT09UL1JBTURJU0svZXRjL3JlY292ZXJ5LmZzdGFiJwotICAgIGVsc2U6Ci0gICAgICBwYXRoID0gb3MucGF0aC5qb2luKGlucHV0X2ZpbGUsICpyZWNvdmVyeV9mc3RhYl9wYXRoLnNwbGl0KCcvJykpCi0gICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6Ci0gICAgICAgIHJlY292ZXJ5X2ZzdGFiX3BhdGggPSAnQk9PVC9SQU1ESVNLL2V0Yy9yZWNvdmVyeS5mc3RhYicKKyAgICBpZiBub3QgRG9lc0lucHV0RmlsZUNvbnRhaW4oaW5wdXRfZmlsZSwgcmVjb3ZlcnlfZnN0YWJfcGF0aCk6CisgICAgICByZWNvdmVyeV9mc3RhYl9wYXRoID0gJ0JPT1QvUkFNRElTSy9ldGMvcmVjb3ZlcnkuZnN0YWInCiAgICAgcmV0dXJuIExvYWRSZWNvdmVyeUZTVGFiKAotICAgICAgICByZWFkX2hlbHBlciwgaW5mb19kaWN0Wydmc3RhYl92ZXJzaW9uJ10sIHJlY292ZXJ5X2ZzdGFiX3BhdGgsCi0gICAgICAgIHN5c3RlbV9yb290X2ltYWdlKQorICAgICAgICByZWFkX2hlbHBlciwgaW5mb19kaWN0Wydmc3RhYl92ZXJzaW9uJ10sIHJlY292ZXJ5X2ZzdGFiX3BhdGgpCiAKICAgcmV0dXJuIE5vbmUKIApAQCAtMTMwMSw3ICsxMzM5LDExIEBACiAgICAga2V5ID0gInN1cGVyXyVzX3BhcnRpdGlvbl9saXN0IiAlIHBhcnRpdGlvbl9ncm91cAogICAgIG1lcmdlZF9kaWN0W2tleV0gPSB1bmlxX2NvbmNhdCgKICAgICAgICAgZnJhbWV3b3JrX2RpY3QuZ2V0KGtleSwgIiIpLCB2ZW5kb3JfZGljdC5nZXQoa2V5LCAiIikpCi0KKyAgIyBpbiB0aGUgY2FzZSB0aGF0IHZlbmRvciBpcyBvbiBzIGJ1aWxkLCBidXQgaXMgdGFraW5nIGEgdjMgLT4gdjMgdmFiYyBvdGEsIHdlIHdhbnQgdG8gZmFsbGJhY2sgdG8gdjIKKyAgaWYgInZhYmNfY293X3ZlcnNpb24iIG5vdCBpbiB2ZW5kb3JfZGljdCBvciAidmFiY19jb3dfdmVyc2lvbiIgbm90IGluIGZyYW1ld29ya19kaWN0OgorICAgIG1lcmdlZF9kaWN0WyJ2YWJjX2Nvd192ZXJzaW9uIl0gPSAnMicKKyAgZWxzZToKKyAgICBtZXJnZWRfZGljdFsidmFiY19jb3dfdmVyc2lvbiJdID0gbWluKHZlbmRvcl9kaWN0WyJ2YWJjX2Nvd192ZXJzaW9uIl0sIGZyYW1ld29ya19kaWN0WyJ2YWJjX2Nvd192ZXJzaW9uIl0pCiAgICMgVmFyaW91cyBvdGhlciBmbGFncyBzaG91bGQgYmUgY29waWVkIGZyb20gdGhlIHZlbmRvciBkaWN0LCBpZiBkZWZpbmVkLgogICBmb3Iga2V5IGluICgidmlydHVhbF9hYiIsICJ2aXJ0dWFsX2FiX3JldHJvZml0IiwgImxwbWFrZSIsCiAgICAgICAgICAgICAgICJzdXBlcl9tZXRhZGF0YV9kZXZpY2UiLCAic3VwZXJfcGFydGl0aW9uX2Vycm9yX2xpbWl0IiwKQEAgLTEzOTgsMTQgKzE0NDAsMTYgQEAKICAgcmV0dXJuIFJ1bkFuZENoZWNrT3V0cHV0KGNtZCkKIAogCi1kZWYgQXBwZW5kQVZCU2lnbmluZ0FyZ3MoY21kLCBwYXJ0aXRpb24pOgorZGVmIEFwcGVuZEFWQlNpZ25pbmdBcmdzKGNtZCwgcGFydGl0aW9uLCBhdmJfc2FsdD1Ob25lKToKICAgIiIiQXBwZW5kIHNpZ25pbmcgYXJndW1lbnRzIGZvciBhdmJ0b29sLiIiIgogICAjIGUuZy4sICItLWtleSBwYXRoL3RvL3NpZ25pbmdfa2V5IC0tYWxnb3JpdGhtIFNIQTI1Nl9SU0E0MDk2IgotICBrZXlfcGF0aCA9IFJlc29sdmVBVkJTaWduaW5nUGF0aEFyZ3MoT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJhdmJfIiArIHBhcnRpdGlvbiArICJfa2V5X3BhdGgiKSkKKyAga2V5X3BhdGggPSBSZXNvbHZlQVZCU2lnbmluZ1BhdGhBcmdzKAorICAgICAgT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJhdmJfIiArIHBhcnRpdGlvbiArICJfa2V5X3BhdGgiKSkKICAgYWxnb3JpdGhtID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJhdmJfIiArIHBhcnRpdGlvbiArICJfYWxnb3JpdGhtIikKICAgaWYga2V5X3BhdGggYW5kIGFsZ29yaXRobToKICAgICBjbWQuZXh0ZW5kKFsiLS1rZXkiLCBrZXlfcGF0aCwgIi0tYWxnb3JpdGhtIiwgYWxnb3JpdGhtXSkKLSAgYXZiX3NhbHQgPSBPUFRJT05TLmluZm9fZGljdC5nZXQoImF2Yl9zYWx0IikKKyAgaWYgYXZiX3NhbHQgaXMgTm9uZToKKyAgICBhdmJfc2FsdCA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgiYXZiX3NhbHQiKQogICAjIG1ha2VfdmJtZXRhX2ltYWdlIGRvZXNuJ3QgbGlrZSAiLS1zYWx0IiAoYW5kIGl0J3Mgbm90IG5lZWRlZCkuCiAgIGlmIGF2Yl9zYWx0IGFuZCBub3QgcGFydGl0aW9uLnN0YXJ0c3dpdGgoInZibWV0YSIpOgogICAgIGNtZC5leHRlbmQoWyItLXNhbHQiLCBhdmJfc2FsdF0pCkBAIC0xNDE2LDExICsxNDYwLDEyIEBACiAgIGRlZiBSZXNvbHZlQmluYXJ5UGF0aChwYXRoKToKICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKICAgICAgIHJldHVybiBwYXRoCi0gICAgbmV3X3BhdGggPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5zZWFyY2hfcGF0aCwgcGF0aCkKLSAgICBpZiBvcy5wYXRoLmV4aXN0cyhuZXdfcGF0aCk6Ci0gICAgICByZXR1cm4gbmV3X3BhdGgKKyAgICBpZiBPUFRJT05TLnNlYXJjaF9wYXRoOgorICAgICAgbmV3X3BhdGggPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5zZWFyY2hfcGF0aCwgcGF0aCkKKyAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG5ld19wYXRoKToKKyAgICAgICAgcmV0dXJuIG5ld19wYXRoCiAgICAgcmFpc2UgRXh0ZXJuYWxFcnJvcigKLSAgICAgICJGYWlsZWQgdG8gZmluZCB7fSIuZm9ybWF0KG5ld19wYXRoKSkKKyAgICAgICAgIkZhaWxlZCB0byBmaW5kIHt9Ii5mb3JtYXQocGF0aCkpCiAKICAgaWYgbm90IHNwbGl0X2FyZ3M6CiAgICAgcmV0dXJuIHNwbGl0X2FyZ3MKQEAgLTE0MzgsNyArMTQ4Myw3IEBACiAKIAogZGVmIEdldEF2YlBhcnRpdGlvbkFyZyhwYXJ0aXRpb24sIGltYWdlLCBpbmZvX2RpY3Q9Tm9uZSk6Ci0gICIiIlJldHVybnMgdGhlIFZCTWV0YSBhcmd1bWVudHMgZm9yIHBhcnRpdGlvbi4KKyAgIiIiUmV0dXJucyB0aGUgVkJNZXRhIGFyZ3VtZW50cyBmb3Igb25lIHBhcnRpdGlvbi4KIAogICBJdCBzZXRzIHVwIHRoZSBWQk1ldGEgYXJndW1lbnQgYnkgaW5jbHVkaW5nIHRoZSBwYXJ0aXRpb24gZGVzY3JpcHRvciBmcm9tIHRoZQogICBnaXZlbiAnaW1hZ2UnLCBvciBieSBjb25maWd1cmluZyB0aGUgcGFydGl0aW9uIGFzIGEgY2hhaW5lZCBwYXJ0aXRpb24uCkBAIC0xNDUwLDcgKzE0OTUsNyBAQAogICAgICAgICBPUFRJT05TLmluZm9fZGljdCBpZiBOb25lIGhhcyBiZWVuIGdpdmVuLgogCiAgIFJldHVybnM6Ci0gICAgQSBsaXN0IG9mIFZCTWV0YSBhcmd1bWVudHMuCisgICAgQSBsaXN0IG9mIFZCTWV0YSBhcmd1bWVudHMgZm9yIG9uZSBwYXJ0aXRpb24uCiAgICIiIgogICBpZiBpbmZvX2RpY3QgaXMgTm9uZToKICAgICBpbmZvX2RpY3QgPSBPUFRJT05TLmluZm9fZGljdApAQCAtMTQ1OCw3ICsxNTAzLDcgQEAKICAgIyBDaGVjayBpZiBjaGFpbiBwYXJ0aXRpb24gaXMgdXNlZC4KICAga2V5X3BhdGggPSBpbmZvX2RpY3QuZ2V0KCJhdmJfIiArIHBhcnRpdGlvbiArICJfa2V5X3BhdGgiKQogICBpZiBub3Qga2V5X3BhdGg6Ci0gICAgcmV0dXJuIFsiLS1pbmNsdWRlX2Rlc2NyaXB0b3JzX2Zyb21faW1hZ2UiLCBpbWFnZV0KKyAgICByZXR1cm4gW0FWQl9BUkdfTkFNRV9JTkNMVURFX0RFU0NfRlJPTV9JTUcsIGltYWdlXQogCiAgICMgRm9yIGEgbm9uLUEvQiBkZXZpY2UsIHdlIGRvbid0IGNoYWluIC9yZWNvdmVyeSBub3IgaW5jbHVkZSBpdHMgZGVzY3JpcHRvcgogICAjIGludG8gdmJtZXRhLmltZy4gVGhlIHJlY292ZXJ5IGltYWdlIHdpbGwgYmUgY29uZmlndXJlZCBvbiBhbiBpbmRlcGVuZGVudApAQCAtMTQ3MCw3ICsxNTE1LDYyIEBACiAKICAgIyBPdGhlcndpc2UgY2hhaW4gdGhlIHBhcnRpdGlvbiBpbnRvIHZibWV0YS4KICAgY2hhaW5lZF9wYXJ0aXRpb25fYXJnID0gR2V0QXZiQ2hhaW5lZFBhcnRpdGlvbkFyZyhwYXJ0aXRpb24sIGluZm9fZGljdCkKLSAgcmV0dXJuIFsiLS1jaGFpbl9wYXJ0aXRpb24iLCBjaGFpbmVkX3BhcnRpdGlvbl9hcmddCisgIHJldHVybiBbQVZCX0FSR19OQU1FX0NIQUlOX1BBUlRJVElPTiwgY2hhaW5lZF9wYXJ0aXRpb25fYXJnXQorCisKK2RlZiBHZXRBdmJQYXJ0aXRpb25zQXJnKHBhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlX3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uX2NvbmZsaWN0PUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19kaWN0PU5vbmUpOgorICAiIiJSZXR1cm5zIHRoZSBWQk1ldGEgYXJndW1lbnRzIGZvciBhbGwgQVZCIHBhcnRpdGlvbnMuCisKKyAgSXQgc2V0cyB1cCB0aGUgVkJNZXRhIGFyZ3VtZW50IGJ5IGNhbGxpbmcgR2V0QXZiUGFydGl0aW9uQXJnIG9mIGFsbAorICBwYXJ0aXRpb25zLgorCisgIEFyZ3M6CisgICAgcGFydGl0aW9uczogQSBkaWN0IG9mIGFsbCBBVkIgcGFydGl0aW9ucy4KKyAgICByZXNvbHZlX3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uX2NvbmZsaWN0OiBJZiB0cnVlLCByZXNvbHZlIGNvbmZsaWN0aW5nIGF2YgorICAgICAgICByb2xsYmFjayBpbmRleCBsb2NhdGlvbnMgYnkgYXNzaWduaW5nIHRoZSBzbWFsbGVzdCB1bnVzZWQgdmFsdWUuCisgICAgaW5mb19kaWN0OiBBIGRpY3QgcmV0dXJuZWQgYnkgY29tbW9uLkxvYWRJbmZvRGljdCgpLgorCisgIFJldHVybnM6CisgICAgQSBsaXN0IG9mIFZCTWV0YSBhcmd1bWVudHMgZm9yIGFsbCBwYXJ0aXRpb25zLgorICAiIiIKKyAgIyBBbiBBVkIgcGFydGl0aW9uIHdpbGwgYmUgbGlua2VkIGludG8gYSB2Ym1ldGEgcGFydGl0aW9uIGJ5IGVpdGhlcgorICAjIEFWQl9BUkdfTkFNRV9JTkNMVURFX0RFU0NfRlJPTV9JTUcgb3IgQVZCX0FSR19OQU1FX0NIQUlOX1BBUlRJVElPTiwgdGhlcmUKKyAgIyBzaG91bGQgYmUgbm8gb3RoZXIgY2FzZXMuCisgIHZhbGlkX2FyZ3MgPSB7CisgICAgICBBVkJfQVJHX05BTUVfSU5DTFVERV9ERVNDX0ZST01fSU1HOiBbXSwKKyAgICAgIEFWQl9BUkdfTkFNRV9DSEFJTl9QQVJUSVRJT046IFtdCisgIH0KKworICBmb3IgcGFydGl0aW9uLCBwYXRoIGluIHNvcnRlZChwYXJ0aXRpb25zLml0ZW1zKCkpOgorICAgIGF2Yl9wYXJ0aXRpb25fYXJnID0gR2V0QXZiUGFydGl0aW9uQXJnKHBhcnRpdGlvbiwgcGF0aCwgaW5mb19kaWN0KQorICAgIGlmIG5vdCBhdmJfcGFydGl0aW9uX2FyZzoKKyAgICAgIGNvbnRpbnVlCisgICAgYXJnX25hbWUsIGFyZ192YWx1ZSA9IGF2Yl9wYXJ0aXRpb25fYXJnCisgICAgYXNzZXJ0IGFyZ19uYW1lIGluIHZhbGlkX2FyZ3MKKyAgICB2YWxpZF9hcmdzW2FyZ19uYW1lXS5hcHBlbmQoYXJnX3ZhbHVlKQorCisgICMgQ29weSB0aGUgYXJndW1lbnRzIGZvciBub24tY2hhaW5lZCBBVkIgcGFydGl0aW9ucyBkaXJlY3RseSB3aXRob3V0CisgICMgaW50ZXJ2ZW50aW9uLgorICBhdmJfYXJncyA9IFtdCisgIGZvciBpbWFnZSBpbiB2YWxpZF9hcmdzW0FWQl9BUkdfTkFNRV9JTkNMVURFX0RFU0NfRlJPTV9JTUddOgorICAgIGF2Yl9hcmdzLmV4dGVuZChbQVZCX0FSR19OQU1FX0lOQ0xVREVfREVTQ19GUk9NX0lNRywgaW1hZ2VdKQorCisgICMgSGFuZGxlIGNoYWluZWQgQVZCIHBhcnRpdGlvbnMuIFRoZSByb2xsYmFjayBpbmRleCBsb2NhdGlvbiBtaWdodCBiZQorICAjIGFkanVzdGVkIGlmIHR3byBwYXJ0aXRpb25zIHVzZSB0aGUgc2FtZSB2YWx1ZS4gVGhpcyBtYXkgaGFwcGVuIHdoZW4gbWl4aW5nCisgICMgYSBzaGFyZWQgc3lzdGVtIGltYWdlIHdpdGggb3RoZXIgdmVuZG9yIGltYWdlcy4KKyAgdXNlZF9pbmRleF9sb2MgPSBzZXQoKQorICBmb3IgY2hhaW5lZF9wYXJ0aXRpb25fYXJnIGluIHZhbGlkX2FyZ3NbQVZCX0FSR19OQU1FX0NIQUlOX1BBUlRJVElPTl06CisgICAgaWYgcmVzb2x2ZV9yb2xsYmFja19pbmRleF9sb2NhdGlvbl9jb25mbGljdDoKKyAgICAgIHdoaWxlIGNoYWluZWRfcGFydGl0aW9uX2FyZy5yb2xsYmFja19pbmRleF9sb2NhdGlvbiBpbiB1c2VkX2luZGV4X2xvYzoKKyAgICAgICAgY2hhaW5lZF9wYXJ0aXRpb25fYXJnLnJvbGxiYWNrX2luZGV4X2xvY2F0aW9uICs9IDEKKworICAgIHVzZWRfaW5kZXhfbG9jLmFkZChjaGFpbmVkX3BhcnRpdGlvbl9hcmcucm9sbGJhY2tfaW5kZXhfbG9jYXRpb24pCisgICAgYXZiX2FyZ3MuZXh0ZW5kKFtBVkJfQVJHX05BTUVfQ0hBSU5fUEFSVElUSU9OLAorICAgICAgICAgICAgICAgICAgICAgY2hhaW5lZF9wYXJ0aXRpb25fYXJnLnRvX3N0cmluZygpXSkKKworICByZXR1cm4gYXZiX2FyZ3MKIAogCiBkZWYgR2V0QXZiQ2hhaW5lZFBhcnRpdGlvbkFyZyhwYXJ0aXRpb24sIGluZm9fZGljdCwga2V5PU5vbmUpOgpAQCAtMTQ4NCw4ICsxNTg0LDggQEAKICAgICAgICAgdGhlIGtleSBsaXN0ZWQgaW4gaW5mb19kaWN0LgogCiAgIFJldHVybnM6Ci0gICAgQSBzdHJpbmcgb2YgZm9ybSAicGFydGl0aW9uOnJvbGxiYWNrX2luZGV4X2xvY2F0aW9uOmtleSIgdGhhdCBjYW4gYmUgdXNlZCB0bwotICAgIGJ1aWxkIG9yIHZlcmlmeSB2Ym1ldGEgaW1hZ2UuCisgICAgQW4gQXZiQ2hhaW5lZFBhcnRpdGlvbkFyZyBvYmplY3Qgd2l0aCByb2xsYmFja19pbmRleF9sb2NhdGlvbiBhbmQKKyAgICBwdWJrZXlfcGF0aCB0aGF0IGNhbiBiZSB1c2VkIHRvIGJ1aWxkIG9yIHZlcmlmeSB2Ym1ldGEgaW1hZ2UuCiAgICIiIgogICBpZiBrZXkgaXMgTm9uZToKICAgICBrZXkgPSBpbmZvX2RpY3RbImF2Yl8iICsgcGFydGl0aW9uICsgIl9rZXlfcGF0aCJdCkBAIC0xNDkzLDU0ICsxNTkzLDE0IEBACiAgIHB1YmtleV9wYXRoID0gRXh0cmFjdEF2YlB1YmxpY0tleShpbmZvX2RpY3RbImF2Yl9hdmJ0b29sIl0sIGtleSkKICAgcm9sbGJhY2tfaW5kZXhfbG9jYXRpb24gPSBpbmZvX2RpY3RbCiAgICAgICAiYXZiXyIgKyBwYXJ0aXRpb24gKyAiX3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uIl0KLSAgcmV0dXJuICJ7fTp7fTp7fSIuZm9ybWF0KHBhcnRpdGlvbiwgcm9sbGJhY2tfaW5kZXhfbG9jYXRpb24sIHB1YmtleV9wYXRoKQorICByZXR1cm4gQXZiQ2hhaW5lZFBhcnRpdGlvbkFyZygKKyAgICAgIHBhcnRpdGlvbj1wYXJ0aXRpb24sCisgICAgICByb2xsYmFja19pbmRleF9sb2NhdGlvbj1pbnQocm9sbGJhY2tfaW5kZXhfbG9jYXRpb24pLAorICAgICAgcHVia2V5X3BhdGg9cHVia2V5X3BhdGgpCiAKIAotZGVmIF9IYXNHa2lDZXJ0aWZpY2F0aW9uQXJncygpOgotICByZXR1cm4gKCJna2lfc2lnbmluZ19rZXlfcGF0aCIgaW4gT1BUSU9OUy5pbmZvX2RpY3QgYW5kCi0gICAgICAgICAgImdraV9zaWduaW5nX2FsZ29yaXRobSIgaW4gT1BUSU9OUy5pbmZvX2RpY3QpCi0KLQotZGVmIF9HZW5lcmF0ZUdraUNlcnRpZmljYXRlKGltYWdlLCBpbWFnZV9uYW1lKToKLSAga2V5X3BhdGggPSBPUFRJT05TLmluZm9fZGljdC5nZXQoImdraV9zaWduaW5nX2tleV9wYXRoIikKLSAgYWxnb3JpdGhtID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJna2lfc2lnbmluZ19hbGdvcml0aG0iKQotCi0gIGtleV9wYXRoID0gUmVzb2x2ZUFWQlNpZ25pbmdQYXRoQXJncyhrZXlfcGF0aCkKLQotICAjIENoZWNrcyBrZXlfcGF0aCBleGlzdHMsIGJlZm9yZSBwcm9jZXNzaW5nIC0tZ2tpX3NpZ25pbmdfKiBhcmdzLgotICBpZiBub3Qgb3MucGF0aC5leGlzdHMoa2V5X3BhdGgpOgotICAgIHJhaXNlIEV4dGVybmFsRXJyb3IoCi0gICAgICAgICdna2lfc2lnbmluZ19rZXlfcGF0aDogInt9IiBub3QgZm91bmQnLmZvcm1hdChrZXlfcGF0aCkpCi0KLSAgb3V0cHV0X2NlcnRpZmljYXRlID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkKLSAgY21kID0gWwotICAgICAgImdlbmVyYXRlX2draV9jZXJ0aWZpY2F0ZSIsCi0gICAgICAiLS1uYW1lIiwgaW1hZ2VfbmFtZSwKLSAgICAgICItLWFsZ29yaXRobSIsIGFsZ29yaXRobSwKLSAgICAgICItLWtleSIsIGtleV9wYXRoLAotICAgICAgIi0tb3V0cHV0Iiwgb3V0cHV0X2NlcnRpZmljYXRlLm5hbWUsCi0gICAgICBpbWFnZSwKLSAgXQotCi0gIHNpZ25hdHVyZV9hcmdzID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJna2lfc2lnbmluZ19zaWduYXR1cmVfYXJncyIsICIiKQotICBzaWduYXR1cmVfYXJncyA9IHNpZ25hdHVyZV9hcmdzLnN0cmlwKCkKLSAgaWYgc2lnbmF0dXJlX2FyZ3M6Ci0gICAgY21kLmV4dGVuZChbIi0tYWRkaXRpb25hbF9hdmJfYXJncyIsIHNpZ25hdHVyZV9hcmdzXSkKLQotICBhcmdzID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJhdmJfYm9vdF9hZGRfaGFzaF9mb290ZXJfYXJncyIsICIiKQotICBhcmdzID0gYXJncy5zdHJpcCgpCi0gIGlmIGFyZ3M6Ci0gICAgY21kLmV4dGVuZChbIi0tYWRkaXRpb25hbF9hdmJfYXJncyIsIGFyZ3NdKQotCi0gIFJ1bkFuZENoZWNrT3V0cHV0KGNtZCkKLQotICBvdXRwdXRfY2VydGlmaWNhdGUuc2Vlayhvcy5TRUVLX1NFVCwgMCkKLSAgZGF0YSA9IG91dHB1dF9jZXJ0aWZpY2F0ZS5yZWFkKCkKLSAgb3V0cHV0X2NlcnRpZmljYXRlLmNsb3NlKCkKLSAgcmV0dXJuIGRhdGEKLQotCi1kZWYgQnVpbGRWQk1ldGEoaW1hZ2VfcGF0aCwgcGFydGl0aW9ucywgbmFtZSwgbmVlZGVkX3BhcnRpdGlvbnMpOgorZGVmIEJ1aWxkVkJNZXRhKGltYWdlX3BhdGgsIHBhcnRpdGlvbnMsIG5hbWUsIG5lZWRlZF9wYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgIHJlc29sdmVfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb25fY29uZmxpY3Q9RmFsc2UpOgogICAiIiJDcmVhdGVzIGEgVkJNZXRhIGltYWdlLgogCiAgIEl0IGdlbmVyYXRlcyB0aGUgcmVxdWVzdGVkIFZCTWV0YSBpbWFnZS4gVGhlIHJlcXVlc3RlZCBpbWFnZSBjb3VsZCBiZSBmb3IKQEAgLTE1NTUsNiArMTYxNSw4IEBACiAgICAgbmFtZTogTmFtZSBvZiB0aGUgVkJNZXRhIHBhcnRpdGlvbiwgZS5nLiAndmJtZXRhJywgJ3ZibWV0YV9zeXN0ZW0nLgogICAgIG5lZWRlZF9wYXJ0aXRpb25zOiBQYXJ0aXRpb25zIHdob3NlIGRlc2NyaXB0b3JzIHNob3VsZCBiZSBpbmNsdWRlZCBpbnRvIHRoZQogICAgICAgICBnZW5lcmF0ZWQgVkJNZXRhIGltYWdlLgorICAgIHJlc29sdmVfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb25fY29uZmxpY3Q6IElmIHRydWUsIHJlc29sdmUgY29uZmxpY3RpbmcgYXZiCisgICAgICAgIHJvbGxiYWNrIGluZGV4IGxvY2F0aW9ucyBieSBhc3NpZ25pbmcgdGhlIHNtYWxsZXN0IHVudXNlZCB2YWx1ZS4KIAogICBSYWlzZXM6CiAgICAgQXNzZXJ0aW9uRXJyb3I6IE9uIGludmFsaWQgaW5wdXQgYXJncy4KQEAgLTE1NjgsNyArMTYzMCw4IEBACiAgIGN1c3RvbV9hdmJfcGFydGl0aW9ucyA9IFsidmJtZXRhXyIgKyBwYXJ0IGZvciBwYXJ0IGluIE9QVElPTlMuaW5mb19kaWN0LmdldCgKICAgICAgICJhdmJfY3VzdG9tX3ZibWV0YV9pbWFnZXNfcGFydGl0aW9uX2xpc3QiLCAiIikuc3RyaXAoKS5zcGxpdCgpXQogCi0gIGZvciBwYXJ0aXRpb24sIHBhdGggaW4gcGFydGl0aW9ucy5pdGVtcygpOgorICBhdmJfcGFydGl0aW9ucyA9IHt9CisgIGZvciBwYXJ0aXRpb24sIHBhdGggaW4gc29ydGVkKHBhcnRpdGlvbnMuaXRlbXMoKSk6CiAgICAgaWYgcGFydGl0aW9uIG5vdCBpbiBuZWVkZWRfcGFydGl0aW9uczoKICAgICAgIGNvbnRpbnVlCiAgICAgYXNzZXJ0IChwYXJ0aXRpb24gaW4gQVZCX1BBUlRJVElPTlMgb3IKQEAgLTE1NzgsNyArMTY0MSw5IEBACiAgICAgICAgICdVbmtub3duIHBhcnRpdGlvbjoge30nLmZvcm1hdChwYXJ0aXRpb24pCiAgICAgYXNzZXJ0IG9zLnBhdGguZXhpc3RzKHBhdGgpLCBcCiAgICAgICAgICdGYWlsZWQgdG8gZmluZCB7fSBmb3Ige30nLmZvcm1hdChwYXRoLCBwYXJ0aXRpb24pCi0gICAgY21kLmV4dGVuZChHZXRBdmJQYXJ0aXRpb25BcmcocGFydGl0aW9uLCBwYXRoKSkKKyAgICBhdmJfcGFydGl0aW9uc1twYXJ0aXRpb25dID0gcGF0aAorICBjbWQuZXh0ZW5kKEdldEF2YlBhcnRpdGlvbnNBcmcoYXZiX3BhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlX3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uX2NvbmZsaWN0KSkKIAogICBhcmdzID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJhdmJfe31fYXJncyIuZm9ybWF0KG5hbWUpKQogICBpZiBhcmdzIGFuZCBhcmdzLnN0cmlwKCk6CkBAIC0xNTg5LDcgKzE2NTQsNyBAQAogICAgICAgIyBzYW1lIGxvY2F0aW9uIHdoZW4gcnVubmluZyB0aGlzIHNjcmlwdCAod2UgaGF2ZSB0aGUgaW5wdXQgdGFyZ2V0X2ZpbGVzCiAgICAgICAjIHppcCBvbmx5KS4gRm9yIHN1Y2ggY2FzZXMsIHdlIGFkZGl0aW9uYWxseSBzY2FuIG90aGVyIGxvY2F0aW9ucyAoZS5nLgogICAgICAgIyBJTUFHRVMvLCBSQURJTy8sIGV0YykgYmVmb3JlIGJhaWxpbmcgb3V0LgotICAgICAgaWYgYXJnID09ICctLWluY2x1ZGVfZGVzY3JpcHRvcnNfZnJvbV9pbWFnZSc6CisgICAgICBpZiBhcmcgPT0gQVZCX0FSR19OQU1FX0lOQ0xVREVfREVTQ19GUk9NX0lNRzoKICAgICAgICAgY2hhaW5lZF9pbWFnZSA9IHNwbGl0X2FyZ3NbaW5kZXggKyAxXQogICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhjaGFpbmVkX2ltYWdlKToKICAgICAgICAgICBjb250aW51ZQpAQCAtMTYyOSw5ICsxNjk0LDkgQEAKICAgICBwMiA9IFJ1bihbImx6NCIsICItbCIsICItMTIiLCAiLS1mYXZvci1kZWNTcGVlZCJdLCBzdGRpbj1wMS5zdGRvdXQsCiAgICAgICAgICAgICAgc3Rkb3V0PXJhbWRpc2tfaW1nLmZpbGUuZmlsZW5vKCkpCiAgIGVsaWYgcmFtZGlza19mb3JtYXQgPT0gUmFtZGlza0Zvcm1hdC5HWjoKLSAgICBwMiA9IFJ1bihbIm1pbmlnemlwIl0sIHN0ZGluPXAxLnN0ZG91dCwgc3Rkb3V0PXJhbWRpc2tfaW1nLmZpbGUuZmlsZW5vKCkpCisgICAgcDIgPSBSdW4oWyJnemlwIl0sIHN0ZGluPXAxLnN0ZG91dCwgc3Rkb3V0PXJhbWRpc2tfaW1nLmZpbGUuZmlsZW5vKCkpCiAgIGVsc2U6Ci0gICAgcmFpc2UgVmFsdWVFcnJvcigiT25seSBzdXBwb3J0IGx6NCBvciBtaW5pZ3ppcCByYW1kaXNrIGZvcm1hdC4iKQorICAgIHJhaXNlIFZhbHVlRXJyb3IoIk9ubHkgc3VwcG9ydCBsejQgb3IgZ3ppcCByYW1kaXNrIGZvcm1hdC4iKQogCiAgIHAyLndhaXQoKQogICBwMS53YWl0KCkKQEAgLTE3MzksMTIgKzE4MDQsNyBAQAogICBpZiBoYXNfcmFtZGlzazoKICAgICBjbWQuZXh0ZW5kKFsiLS1yYW1kaXNrIiwgcmFtZGlza19pbWcubmFtZV0pCiAKLSAgaW1nX3Vuc2lnbmVkID0gTm9uZQotICBpZiBpbmZvX2RpY3QuZ2V0KCJ2Ym9vdCIpOgotICAgIGltZ191bnNpZ25lZCA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpCi0gICAgY21kLmV4dGVuZChbIi0tb3V0cHV0IiwgaW1nX3Vuc2lnbmVkLm5hbWVdKQotICBlbHNlOgotICAgIGNtZC5leHRlbmQoWyItLW91dHB1dCIsIGltZy5uYW1lXSkKKyAgY21kLmV4dGVuZChbIi0tb3V0cHV0IiwgaW1nLm5hbWVdKQogCiAgIGlmIHBhcnRpdGlvbl9uYW1lID09ICJyZWNvdmVyeSI6CiAgICAgaWYgaW5mb19kaWN0LmdldCgiaW5jbHVkZV9yZWNvdmVyeV9kdGJvIikgPT0gInRydWUiOgpAQCAtMTc1Niw1MSArMTgxNiw2IEBACiAKICAgUnVuQW5kQ2hlY2tPdXRwdXQoY21kKQogCi0gIGlmIF9IYXNHa2lDZXJ0aWZpY2F0aW9uQXJncygpOgotICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhpbWcubmFtZSk6Ci0gICAgICByYWlzZSBWYWx1ZUVycm9yKCJDYW5ub3QgZmluZCBHS0kgYm9vdC5pbWciKQotICAgIGlmIGtlcm5lbF9wYXRoIGlzIE5vbmUgb3Igbm90IG9zLnBhdGguZXhpc3RzKGtlcm5lbF9wYXRoKToKLSAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbm5vdCBmaW5kIEdLSSBrZXJuZWwuaW1nIikKLQotICAgICMgQ2VydGlmeSBHS0kgaW1hZ2VzLgotICAgIGJvb3Rfc2lnbmF0dXJlX2J5dGVzID0gYicnCi0gICAgYm9vdF9zaWduYXR1cmVfYnl0ZXMgKz0gX0dlbmVyYXRlR2tpQ2VydGlmaWNhdGUoaW1nLm5hbWUsICJib290IikKLSAgICBib290X3NpZ25hdHVyZV9ieXRlcyArPSBfR2VuZXJhdGVHa2lDZXJ0aWZpY2F0ZSgKLSAgICAgICAga2VybmVsX3BhdGgsICJnZW5lcmljX2tlcm5lbCIpCi0KLSAgICBCT09UX1NJR05BVFVSRV9TSVpFID0gMTYgKiAxMDI0Ci0gICAgaWYgbGVuKGJvb3Rfc2lnbmF0dXJlX2J5dGVzKSA+IEJPT1RfU0lHTkFUVVJFX1NJWkU6Ci0gICAgICByYWlzZSBWYWx1ZUVycm9yKAotICAgICAgICAgIGYiR0tJIGJvb3Rfc2lnbmF0dXJlIHNpemUgbXVzdCBiZSA8PSB7Qk9PVF9TSUdOQVRVUkVfU0laRX0iKQotICAgIGJvb3Rfc2lnbmF0dXJlX2J5dGVzICs9ICgKLSAgICAgICAgYidcMCcgKiAoQk9PVF9TSUdOQVRVUkVfU0laRSAtIGxlbihib290X3NpZ25hdHVyZV9ieXRlcykpKQotICAgIGFzc2VydCBsZW4oYm9vdF9zaWduYXR1cmVfYnl0ZXMpID09IEJPT1RfU0lHTkFUVVJFX1NJWkUKLQotICAgIHdpdGggb3BlbihpbWcubmFtZSwgJ2FiJykgYXMgZjoKLSAgICAgIGYud3JpdGUoYm9vdF9zaWduYXR1cmVfYnl0ZXMpCi0KLSAgIyBTaWduIHRoZSBpbWFnZSBpZiB2Ym9vdCBpcyBub24tZW1wdHkuCi0gIGlmIGluZm9fZGljdC5nZXQoInZib290Iik6Ci0gICAgcGF0aCA9ICIvIiArIHBhcnRpdGlvbl9uYW1lCi0gICAgaW1nX2tleWJsb2NrID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkKLSAgICAjIFdlIGhhdmUgc3dpdGNoZWQgZnJvbSB0aGUgcHJlYnVpbHQgZnV0aWxpdHkgYmluYXJ5IHRvIHVzaW5nIHRoZSB0b29sCi0gICAgIyAoZnV0aWxpdHktaG9zdCkgYnVpbHQgZnJvbSB0aGUgc291cmNlLiBPdmVycmlkZSB0aGUgc2V0dGluZyBpbiB0aGUgb2xkCi0gICAgIyBURi56aXAuCi0gICAgZnV0aWxpdHkgPSBpbmZvX2RpY3RbImZ1dGlsaXR5Il0KLSAgICBpZiBmdXRpbGl0eS5zdGFydHN3aXRoKCJwcmVidWlsdHMvIik6Ci0gICAgICBmdXRpbGl0eSA9ICJmdXRpbGl0eS1ob3N0IgotICAgIGNtZCA9IFtpbmZvX2RpY3RbInZib290X3NpZ25lcl9jbWQiXSwgZnV0aWxpdHksCi0gICAgICAgICAgIGltZ191bnNpZ25lZC5uYW1lLCBpbmZvX2RpY3RbInZib290X2tleSJdICsgIi52YnB1YmsiLAotICAgICAgICAgICBpbmZvX2RpY3RbInZib290X2tleSJdICsgIi52YnByaXZrIiwKLSAgICAgICAgICAgaW5mb19kaWN0WyJ2Ym9vdF9zdWJrZXkiXSArICIudmJwcml2ayIsCi0gICAgICAgICAgIGltZ19rZXlibG9jay5uYW1lLAotICAgICAgICAgICBpbWcubmFtZV0KLSAgICBSdW5BbmRDaGVja091dHB1dChjbWQpCi0KLSAgICAjIENsZWFuIHVwIHRoZSB0ZW1wIGZpbGVzLgotICAgIGltZ191bnNpZ25lZC5jbG9zZSgpCi0gICAgaW1nX2tleWJsb2NrLmNsb3NlKCkKLQogICAjIEFWQjogaWYgZW5hYmxlZCwgY2FsY3VsYXRlIGFuZCBhZGQgaGFzaCB0byBib290LmltZyBvciByZWNvdmVyeS5pbWcuCiAgIGlmIGluZm9fZGljdC5nZXQoImF2Yl9lbmFibGUiKSA9PSAidHJ1ZSI6CiAgICAgYXZidG9vbCA9IGluZm9fZGljdFsiYXZiX2F2YnRvb2wiXQpAQCAtMTgxMSw3ICsxODI2LDExIEBACiAgICAgY21kID0gW2F2YnRvb2wsICJhZGRfaGFzaF9mb290ZXIiLCAiLS1pbWFnZSIsIGltZy5uYW1lLAogICAgICAgICAgICAiLS1wYXJ0aXRpb25fc2l6ZSIsIHN0cihwYXJ0X3NpemUpLCAiLS1wYXJ0aXRpb25fbmFtZSIsCiAgICAgICAgICAgIHBhcnRpdGlvbl9uYW1lXQotICAgIEFwcGVuZEFWQlNpZ25pbmdBcmdzKGNtZCwgcGFydGl0aW9uX25hbWUpCisgICAgc2FsdCA9IE5vbmUKKyAgICBpZiBrZXJuZWxfcGF0aCBpcyBub3QgTm9uZToKKyAgICAgIHdpdGggb3BlbihrZXJuZWxfcGF0aCwgInJiIikgYXMgZnA6CisgICAgICAgIHNhbHQgPSBzaGEyNTYoZnAucmVhZCgpKS5oZXhkaWdlc3QoKQorICAgIEFwcGVuZEFWQlNpZ25pbmdBcmdzKGNtZCwgcGFydGl0aW9uX25hbWUsIHNhbHQpCiAgICAgYXJncyA9IGluZm9fZGljdC5nZXQoImF2Yl8iICsgcGFydGl0aW9uX25hbWUgKyAiX2FkZF9oYXNoX2Zvb3Rlcl9hcmdzIikKICAgICBpZiBhcmdzIGFuZCBhcmdzLnN0cmlwKCk6CiAgICAgICBzcGxpdF9hcmdzID0gUmVzb2x2ZUFWQlNpZ25pbmdQYXRoQXJncyhzaGxleC5zcGxpdChhcmdzKSkKQEAgLTE4NTMsNyArMTg3MiwxOCBAQAogICAgIGNtZCA9IFthdmJ0b29sLCAiYWRkX2hhc2hfZm9vdGVyIiwgIi0taW1hZ2UiLCBpbWFnZV9wYXRoLAogICAgICAgICAgICAiLS1wYXJ0aXRpb25fc2l6ZSIsIHN0cihwYXJ0X3NpemUpLCAiLS1wYXJ0aXRpb25fbmFtZSIsCiAgICAgICAgICAgIHBhcnRpdGlvbl9uYW1lXQotICAgIEFwcGVuZEFWQlNpZ25pbmdBcmdzKGNtZCwgcGFydGl0aW9uX25hbWUpCisgICAgIyBVc2Ugc2hhMjU2IG9mIHRoZSBrZXJuZWwgYXMgc2FsdCBmb3IgcmVwcm9kdWNpYmxlIGJ1aWxkcworICAgIHdpdGggdGVtcGZpbGUuVGVtcG9yYXJ5RGlyZWN0b3J5KCkgYXMgdG1wZGlyOgorICAgICAgUnVuQW5kQ2hlY2tPdXRwdXQoWyJ1bnBhY2tfYm9vdGltZyIsICItLWJvb3RfaW1nIiwgaW1hZ2VfcGF0aCwgIi0tb3V0IiwgdG1wZGlyXSkKKyAgICAgIGZvciBmaWxlbmFtZSBpbiBbImtlcm5lbCIsICJyYW1kaXNrIiwgInZlbmRvcl9yYW1kaXNrMDAiXToKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbih0bXBkaXIsIGZpbGVuYW1lKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKSBhbmQgb3MucGF0aC5nZXRzaXplKHBhdGgpOgorICAgICAgICAgIHByaW50KCJVc2luZyB7fSBhcyBzYWx0IGZvciBhdmIgZm9vdGVyIG9mIHt9Ii5mb3JtYXQoCisgICAgICAgICAgICAgIGZpbGVuYW1lLCBwYXJ0aXRpb25fbmFtZSkpCisgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICJyYiIpIGFzIGZwOgorICAgICAgICAgICAgc2FsdCA9IHNoYTI1NihmcC5yZWFkKCkpLmhleGRpZ2VzdCgpCisgICAgICAgICAgICBicmVhaworICAgIEFwcGVuZEFWQlNpZ25pbmdBcmdzKGNtZCwgcGFydGl0aW9uX25hbWUsIHNhbHQpCiAgICAgYXJncyA9IGluZm9fZGljdC5nZXQoImF2Yl8iICsgcGFydGl0aW9uX25hbWUgKyAiX2FkZF9oYXNoX2Zvb3Rlcl9hcmdzIikKICAgICBpZiBhcmdzIGFuZCBhcmdzLnN0cmlwKCk6CiAgICAgICBzcGxpdF9hcmdzID0gUmVzb2x2ZUFWQlNpZ25pbmdQYXRoQXJncyhzaGxleC5zcGxpdChhcmdzKSkKQEAgLTE4ODAsMTEgKzE5MTAsNiBAQAogICBpZiBpbmZvX2RpY3QuZ2V0KCJna2lfYm9vdF9pbWFnZV93aXRob3V0X3JhbWRpc2siKSA9PSAidHJ1ZSI6CiAgICAgcmV0dXJuIEZhbHNlICAjIEEgR0tJIGJvb3QuaW1nIGhhcyBubyByYW1kaXNrIHNpbmNlIEFuZHJvaWQtMTMuCiAKLSAgaWYgaW5mb19kaWN0LmdldCgic3lzdGVtX3Jvb3RfaW1hZ2UiKSA9PSAidHJ1ZSI6Ci0gICAgIyBUaGUgcmFtZGlzayBjb250ZW50IGlzIG1lcmdlZCBpbnRvIHRoZSBzeXN0ZW0uaW1nLCBzbyB0aGVyZSBpcyBOTwotICAgICMgcmFtZGlzayBpbiB0aGUgYm9vdC5pbWcgb3IgYm9vdC08a2VybmVsIHZlcnNpb24+LmltZy4KLSAgICByZXR1cm4gRmFsc2UKLQogICBpZiBpbmZvX2RpY3QuZ2V0KCJpbml0X2Jvb3QiKSA9PSAidHJ1ZSI6CiAgICAgIyBUaGUgcmFtZGlzayBpcyBtb3ZlZCB0byB0aGUgaW5pdF9ib290LmltZywgc28gdGhlcmUgaXMgTk8KICAgICAjIHJhbWRpc2sgaW4gdGhlIGJvb3QuaW1nIG9yIGJvb3QtPGtlcm5lbCB2ZXJzaW9uPi5pbWcuCkBAIC0xOTM5LDcgKzE5NjQsNyBAQAogICByZXR1cm4gTm9uZQogCiAKLWRlZiBfQnVpbGRWZW5kb3JCb290SW1hZ2Uoc291cmNlZGlyLCBwYXJ0aXRpb25fbmFtZSwgaW5mb19kaWN0PU5vbmUpOgorZGVmIF9CdWlsZFZlbmRvckJvb3RJbWFnZShzb3VyY2VkaXIsIGZzX2NvbmZpZ19maWxlLCBwYXJ0aXRpb25fbmFtZSwgaW5mb19kaWN0PU5vbmUpOgogICAiIiJCdWlsZCBhIHZlbmRvciBib290IGltYWdlIGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2VkaXIuCiAKICAgVGFrZSBhIHJhbWRpc2ssIGR0YiwgYW5kIHZlbmRvcl9jbWRsaW5lIGZyb20gdGhlIGlucHV0IChpbiAnc291cmNlZGlyJyksIGFuZApAQCAtMTk1NSw3ICsxOTgwLDcgQEAKICAgaW1nID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkKIAogICByYW1kaXNrX2Zvcm1hdCA9IEdldFJhbWRpc2tGb3JtYXQoaW5mb19kaWN0KQotICByYW1kaXNrX2ltZyA9IF9NYWtlUmFtZGlzayhzb3VyY2VkaXIsIHJhbWRpc2tfZm9ybWF0PXJhbWRpc2tfZm9ybWF0KQorICByYW1kaXNrX2ltZyA9IF9NYWtlUmFtZGlzayhzb3VyY2VkaXIsIGZzX2NvbmZpZ19maWxlPWZzX2NvbmZpZ19maWxlLCByYW1kaXNrX2Zvcm1hdD1yYW1kaXNrX2Zvcm1hdCkKIAogICAjIHVzZSBNS0JPT1RJTUcgZnJvbSBlbnZpcm9uLCBvciAibWtib290aW1nIiBpZiBlbXB0eSBvciBub3Qgc2V0CiAgIG1rYm9vdGltZyA9IG9zLmdldGVudignTUtCT09USU1HJykgb3IgIm1rYm9vdGltZyIKQEAgLTIwNjksOCArMjA5NCw5IEBACiAgIGlmIGluZm9fZGljdCBpcyBOb25lOgogICAgIGluZm9fZGljdCA9IE9QVElPTlMuaW5mb19kaWN0CiAKKyAgZnNfY29uZmlnID0gIk1FVEEvIiArIHRyZWVfc3ViZGlyLmxvd2VyKCkgKyAiX2ZpbGVzeXN0ZW1fY29uZmlnLnR4dCIKICAgZGF0YSA9IF9CdWlsZFZlbmRvckJvb3RJbWFnZSgKLSAgICAgIG9zLnBhdGguam9pbih1bnBhY2tfZGlyLCB0cmVlX3N1YmRpciksICJ2ZW5kb3JfYm9vdCIsIGluZm9fZGljdCkKKyAgICAgIG9zLnBhdGguam9pbih1bnBhY2tfZGlyLCB0cmVlX3N1YmRpciksIG9zLnBhdGguam9pbih1bnBhY2tfZGlyLCBmc19jb25maWcpLCAidmVuZG9yX2Jvb3QiLCBpbmZvX2RpY3QpCiAgIGlmIGRhdGE6CiAgICAgcmV0dXJuIEZpbGUobmFtZSwgZGF0YSkKICAgcmV0dXJuIE5vbmUKQEAgLTIwOTQsNyArMjEyMCw3IEBACiAgICAgaW5mb19kaWN0ID0gT1BUSU9OUy5pbmZvX2RpY3QKIAogICBkYXRhID0gX0J1aWxkVmVuZG9yQm9vdEltYWdlKAotICAgICAgb3MucGF0aC5qb2luKHVucGFja19kaXIsIHRyZWVfc3ViZGlyKSwgInZlbmRvcl9rZXJuZWxfYm9vdCIsIGluZm9fZGljdCkKKyAgICAgIG9zLnBhdGguam9pbih1bnBhY2tfZGlyLCB0cmVlX3N1YmRpciksIE5vbmUsICJ2ZW5kb3Jfa2VybmVsX2Jvb3QiLCBpbmZvX2RpY3QpCiAgIGlmIGRhdGE6CiAgICAgcmV0dXJuIEZpbGUobmFtZSwgZGF0YSkKICAgcmV0dXJuIE5vbmUKQEAgLTIxMTEsMjAgKzIxMzcsMzMgQEAKICAgIyBBY2NvcmRpbmcgdG8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDM0NjQxL2hvdy1kby1pLXNldC1wZXJtaXNzaW9ucy1hdHRyaWJ1dGVzLW9uLWEtZmlsZS1pbi1hLXppcC1maWxlLXVzaW5nLXB5dGhvbnMtemlwLzYyOTc4MzgjNjI5NzgzOAogICAjIGhpZ2hlciBiaXRzIG9mIHxleHRlcm5hbF9hdHRyfCBhcmUgdW5peCBmaWxlIHBlcm1pc3Npb24gYW5kIHR5cGVzCiAgIHVuaXhfZmlsZXR5cGUgPSBpbmZvLmV4dGVybmFsX2F0dHIgPj4gMTYKKyAgZmlsZV9wZXJtID0gdW5peF9maWxldHlwZSAmIDBvNzc3CiAKICAgZGVmIENoZWNrTWFzayhhLCBtYXNrKToKICAgICByZXR1cm4gKGEgJiBtYXNrKSA9PSBtYXNrCiAKICAgZGVmIElzU3ltbGluayhhKToKICAgICByZXR1cm4gQ2hlY2tNYXNrKGEsIHN0YXQuU19JRkxOSykKKworICBkZWYgSXNEaXIoYSk6CisgICAgcmV0dXJuIENoZWNrTWFzayhhLCBzdGF0LlNfSUZESVIpCiAgICMgcHl0aG9uMy4xMSB6aXBmaWxlIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgaGFuZGxlIHN5bWxpbmsgY29ycmVjdGx5CiAgIGlmIG5vdCBJc1N5bWxpbmsodW5peF9maWxldHlwZSk6Ci0gICAgcmV0dXJuIGlucHV0X3ppcC5leHRyYWN0KGluZm8sIGRpcm5hbWUpCisgICAgdGFyZ2V0ID0gaW5wdXRfemlwLmV4dHJhY3QoaW5mbywgZGlybmFtZSkKKyAgICAjIFdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgdGhlIGZpbGUgaXMgYXQgbGVhc3QgcmVhZC93cml0YWJsZSBieSBvd25lciBhbmQgcmVhZGFibGUgYnkgYWxsIHVzZXJzCisgICAgaWYgSXNEaXIodW5peF9maWxldHlwZSk6CisgICAgICBvcy5jaG1vZCh0YXJnZXQsIGZpbGVfcGVybSB8IDBvNzU1KQorICAgIGVsc2U6CisgICAgICBvcy5jaG1vZCh0YXJnZXQsIGZpbGVfcGVybSB8IDBvNjQ0KQorICAgIHJldHVybiB0YXJnZXQKICAgaWYgZGlybmFtZSBpcyBOb25lOgogICAgIGRpcm5hbWUgPSBvcy5nZXRjd2QoKQogICB0YXJnZXQgPSBvcy5wYXRoLmpvaW4oZGlybmFtZSwgaW5mby5maWxlbmFtZSkKICAgb3MubWFrZWRpcnMob3MucGF0aC5kaXJuYW1lKHRhcmdldCksIGV4aXN0X29rPVRydWUpCisgIGlmIG9zLnBhdGguZXhpc3RzKHRhcmdldCk6CisgICAgb3MudW5saW5rKHRhcmdldCkKICAgb3Muc3ltbGluayhpbnB1dF96aXAucmVhZChpbmZvKS5kZWNvZGUoKSwgdGFyZ2V0KQorICByZXR1cm4gdGFyZ2V0CiAKIAogZGVmIFVuemlwVG9EaXIoZmlsZW5hbWUsIGRpcm5hbWUsIHBhdHRlcm5zPU5vbmUpOgpAQCAtMjQxNSwxMiArMjQ1NCwyNCBAQAogICAgICAgICAiRmFpbGVkIHRvIG9idGFpbiBtaW5TZGtWZXJzaW9uIGZvciB7fTogYWFwdDIgcmV0dXJuIGNvZGUge306XG57fVxue30iLmZvcm1hdCgKICAgICAgICAgICAgIGFwa19uYW1lLCBwcm9jLnJldHVybmNvZGUsIHN0ZG91dGRhdGEsIHN0ZGVycmRhdGEpKQogCisgIGlzX3NwbGl0X2FwayA9IEZhbHNlCiAgIGZvciBsaW5lIGluIHN0ZG91dGRhdGEuc3BsaXQoIlxuIik6Ci0gICAgIyBMb29raW5nIGZvciBsaW5lcyBzdWNoIGFzIHNka1ZlcnNpb246JzIzJyBvciBzZGtWZXJzaW9uOidNJy4KLSAgICBtID0gcmUubWF0Y2gocidzZGtWZXJzaW9uOlwnKFteXCddKilcJycsIGxpbmUpCisgICAgIyBTZWUgYi8zNTM4MzczNDcgLCBzcGxpdCBBUEtzIGRvIG5vdCBoYXZlIHNkayB2ZXJzaW9uIGRlZmluZWQsCisgICAgIyBzbyB3ZSBkZWZhdWx0IHRvIDIxIGFzIHNwbGl0IEFQS3MgYXJlIG9ubHkgc3VwcG9ydGVkIHNpbmNlIFNESworICAgICMgMjEuCisgICAgaWYgKHJlLnNlYXJjaChyInNwbGl0PVtcIiddLipbXCInXSIsIGxpbmUpKToKKyAgICAgIGlzX3NwbGl0X2FwayA9IFRydWUKKyAgICAjIER1ZSB0byBhZy8yNDE2MTcwOCwgbG9va2luZyBmb3IgbGluZXMgc3VjaCBhcyBtaW5TZGtWZXJzaW9uOicyMycsbWluU2RrVmVyc2lvbjonTScKKyAgICAjIG9yIHNka1ZlcnNpb246JzIzJywgc2RrVmVyc2lvbjonTScuCisgICAgbSA9IHJlLm1hdGNoKHInKD86bWluU2RrVmVyc2lvbnxzZGtWZXJzaW9uKTpcJyhbXlwnXSopXCcnLCBsaW5lKQogICAgIGlmIG06CiAgICAgICByZXR1cm4gbS5ncm91cCgxKQotICByYWlzZSBFeHRlcm5hbEVycm9yKCJObyBtaW5TZGtWZXJzaW9uIHJldHVybmVkIGJ5IGFhcHQyIikKKyAgaWYgaXNfc3BsaXRfYXBrOgorICAgIGxvZ2dlci5pbmZvKCIlcyBpcyBhIHNwbGl0IEFQSywgaXQgZG9lcyBub3QgaGF2ZSBtaW5pbXVtIFNESyB2ZXJzaW9uIgorICAgICAgICAgICAgICAgICIgZGVmaW5lZC4gRGVmYXVsdGluZyB0byAyMSBiZWNhdXNlIHNwbGl0IEFQSyBpc24ndCBzdXBwb3J0ZWQiCisgICAgICAgICAgICAgICAgIiBiZWZvcmUgdGhhdC4iLCBhcGtfbmFtZSkKKyAgICByZXR1cm4gMjEKKyAgcmFpc2UgRXh0ZXJuYWxFcnJvcigiTm8gbWluU2RrVmVyc2lvbiByZXR1cm5lZCBieSBhYXB0MiBmb3IgYXBrOiB7fSIuZm9ybWF0KGFwa19uYW1lKSkKIAogCiBkZWYgR2V0TWluU2RrVmVyc2lvbkludChhcGtfbmFtZSwgY29kZW5hbWVfdG9fYXBpX2xldmVsX21hcCk6CkBAIC0yNTE4LDM4ICsyNTY5LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jLnJldHVybmNvZGUsIHN0ZG91dGRhdGEpKQogCiAKLWRlZiBTaWduU2VQb2xpY3koc2Vwb2xpY3ksIGtleSwgcGFzc3dvcmQpOgotICAiIiJTaWduIHRoZSBzZXBvbGljeSB6aXAsIHByb2R1Y2luZyBhbiBmc3Zlcml0eSAuZnN2X3NpZyBhbmQKLSAgYW4gUlNBIC5zaWcgc2lnbmF0dXJlIGZpbGVzLgotICAiIiIKLQotICBpZiBPUFRJT05TLnNpZ25fc2Vwb2xpY3lfcGF0aCBpcyBOb25lOgotICAgIGxvZ2dlci5pbmZvKCJObyBzaWduX3NlcG9saWN5X3BhdGggc3BlY2lmaWVkLCAlcyB3YXMgbm90IHNpZ25lZCIsIHNlcG9saWN5KQotICAgIHJldHVybiBGYWxzZQotCi0gIGphdmFfbGlicmFyeV9wYXRoID0gb3MucGF0aC5qb2luKAotICAgICAgT1BUSU9OUy5zZWFyY2hfcGF0aCwgT1BUSU9OUy5zaWduYXBrX3NoYXJlZF9saWJyYXJ5X3BhdGgpCi0KLSAgY21kID0gKFtPUFRJT05TLmphdmFfcGF0aF0gKyBPUFRJT05TLmphdmFfYXJncyArCi0gICAgICAgICBbIi1EamF2YS5saWJyYXJ5LnBhdGg9IiArIGphdmFfbGlicmFyeV9wYXRoLAotICAgICAgICAgICItamFyIiwgb3MucGF0aC5qb2luKE9QVElPTlMuc2VhcmNoX3BhdGgsIE9QVElPTlMuc2lnbl9zZXBvbGljeV9wYXRoKV0gKwotICAgICAgICAgT1BUSU9OUy5leHRyYV9zaWduX3NlcG9saWN5X2FyZ3MpCi0KLSAgY21kLmV4dGVuZChba2V5ICsgT1BUSU9OUy5wdWJsaWNfa2V5X3N1ZmZpeCwKLSAgICAgICAgICAgICAga2V5ICsgT1BUSU9OUy5wcml2YXRlX2tleV9zdWZmaXgsCi0gICAgICAgICAgICAgIHNlcG9saWN5LCBvcy5wYXRoLmRpcm5hbWUoc2Vwb2xpY3kpXSkKLQotICBwcm9jID0gUnVuKGNtZCwgc3RkaW49c3VicHJvY2Vzcy5QSVBFKQotICBpZiBwYXNzd29yZCBpcyBub3QgTm9uZToKLSAgICBwYXNzd29yZCArPSAiXG4iCi0gIHN0ZG91dGRhdGEsIF8gPSBwcm9jLmNvbW11bmljYXRlKHBhc3N3b3JkKQotICBpZiBwcm9jLnJldHVybmNvZGUgIT0gMDoKLSAgICByYWlzZSBFeHRlcm5hbEVycm9yKAotICAgICAgICAiRmFpbGVkIHRvIHJ1biBzaWduIHNlcG9saWN5OiByZXR1cm4gY29kZSB7fTpcbnt9Ii5mb3JtYXQoCi0gICAgICAgICAgICBwcm9jLnJldHVybmNvZGUsIHN0ZG91dGRhdGEpKQotICByZXR1cm4gVHJ1ZQotCi0KIGRlZiBDaGVja1NpemUoZGF0YSwgdGFyZ2V0LCBpbmZvX2RpY3QpOgogICAiIiJDaGVja3MgdGhlIGRhdGEgc3RyaW5nIHBhc3NlZCBhZ2FpbnN0IHRoZSBtYXggc2l6ZSBsaW1pdC4KIApAQCAtMjU3Nyw3ICsyNTk2LDkgQEAKICAgICBkZXZpY2UgPSBwLmRldmljZQogICAgIGlmICIvIiBpbiBkZXZpY2U6CiAgICAgICBkZXZpY2UgPSBkZXZpY2VbZGV2aWNlLnJmaW5kKCIvIikrMTpdCi0gICAgbGltaXQgPSBpbmZvX2RpY3QuZ2V0KGRldmljZSArICJfc2l6ZSIpCisgICAgbGltaXQgPSBpbmZvX2RpY3QuZ2V0KGRldmljZSArICJfc2l6ZSIsIDApCisgICAgaWYgaXNpbnN0YW5jZShsaW1pdCwgc3RyKToKKyAgICAgIGxpbWl0ID0gaW50KGxpbWl0LCAwKQogICBpZiBub3QgZnNfdHlwZSBvciBub3QgbGltaXQ6CiAgICAgcmV0dXJuCiAKQEAgLTI3MTQsMTkgKzI3MzUsMjUgQEAKIGRlZiBQYXJzZU9wdGlvbnMoYXJndiwKICAgICAgICAgICAgICAgICAgZG9jc3RyaW5nLAogICAgICAgICAgICAgICAgICBleHRyYV9vcHRzPSIiLCBleHRyYV9sb25nX29wdHM9KCksCi0gICAgICAgICAgICAgICAgIGV4dHJhX29wdGlvbl9oYW5kbGVyPU5vbmUpOgorICAgICAgICAgICAgICAgICBleHRyYV9vcHRpb25faGFuZGxlcjogSXRlcmFibGVbT3B0aW9uSGFuZGxlcl0gPSBOb25lKToKICAgIiIiUGFyc2UgdGhlIG9wdGlvbnMgaW4gYXJndiBhbmQgcmV0dXJuIGFueSBhcmd1bWVudHMgdGhhdCBhcmVuJ3QKICAgZmxhZ3MuICBkb2NzdHJpbmcgaXMgdGhlIGNhbGxpbmcgbW9kdWxlJ3MgZG9jc3RyaW5nLCB0byBiZSBkaXNwbGF5ZWQKICAgZm9yIGVycm9ycyBhbmQgLWguICBleHRyYV9vcHRzIGFuZCBleHRyYV9sb25nX29wdHMgYXJlIGZvciBmbGFncwogICBkZWZpbmVkIGJ5IHRoZSBjYWxsZXIsIHdoaWNoIGFyZSBwcm9jZXNzZWQgYnkgcGFzc2luZyB0aGVtIHRvCiAgIGV4dHJhX29wdGlvbl9oYW5kbGVyLiIiIgorICBleHRyYV9sb25nX29wdHMgPSBsaXN0KGV4dHJhX2xvbmdfb3B0cykKKyAgaWYgbm90IGlzaW5zdGFuY2UoZXh0cmFfb3B0aW9uX2hhbmRsZXIsIEl0ZXJhYmxlKToKKyAgICBleHRyYV9vcHRpb25faGFuZGxlciA9IFtleHRyYV9vcHRpb25faGFuZGxlcl0KKworICBmb3IgaGFuZGxlciBpbiBleHRyYV9vcHRpb25faGFuZGxlcjoKKyAgICBpZiBpc2luc3RhbmNlKGhhbmRsZXIsIE9wdGlvbkhhbmRsZXIpOgorICAgICAgZXh0cmFfbG9uZ19vcHRzLmV4dGVuZChoYW5kbGVyLmV4dHJhX2xvbmdfb3B0cykKIAogICB0cnk6CiAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoCiAgICAgICAgIGFyZ3YsICJodnA6czp4OiIgKyBleHRyYV9vcHRzLAogICAgICAgICBbImhlbHAiLCAidmVyYm9zZSIsICJwYXRoPSIsICJzaWduYXBrX3BhdGg9IiwKLSAgICAgICAgICJzaWduYXBrX3NoYXJlZF9saWJyYXJ5X3BhdGg9IiwgImV4dHJhX3NpZ25hcGtfYXJncz0iLAotICAgICAgICAgInNpZ25fc2Vwb2xpY3lfcGF0aD0iLCAiZXh0cmFfc2lnbl9zZXBvbGljeV9hcmdzPSIsICJhYXB0Ml9wYXRoPSIsCisgICAgICAgICAic2lnbmFwa19zaGFyZWRfbGlicmFyeV9wYXRoPSIsICJleHRyYV9zaWduYXBrX2FyZ3M9IiwgImFhcHQyX3BhdGg9IiwKICAgICAgICAgICJqYXZhX3BhdGg9IiwgImphdmFfYXJncz0iLCAiYW5kcm9pZF9qYXJfcGF0aD0iLCAicHVibGljX2tleV9zdWZmaXg9IiwKICAgICAgICAgICJwcml2YXRlX2tleV9zdWZmaXg9IiwgImJvb3Rfc2lnbmVyX3BhdGg9IiwgImJvb3Rfc2lnbmVyX2FyZ3M9IiwKICAgICAgICAgICJ2ZXJpdHlfc2lnbmVyX3BhdGg9IiwgInZlcml0eV9zaWduZXJfYXJncz0iLCAiZGV2aWNlX3NwZWNpZmljPSIsCkBAIC0yNzUwLDEwICsyNzc3LDYgQEAKICAgICAgIE9QVElPTlMuc2lnbmFwa19zaGFyZWRfbGlicmFyeV9wYXRoID0gYQogICAgIGVsaWYgbyBpbiAoIi0tZXh0cmFfc2lnbmFwa19hcmdzIiwpOgogICAgICAgT1BUSU9OUy5leHRyYV9zaWduYXBrX2FyZ3MgPSBzaGxleC5zcGxpdChhKQotICAgIGVsaWYgbyBpbiAoIi0tc2lnbl9zZXBvbGljeV9wYXRoIiwpOgotICAgICAgT1BUSU9OUy5zaWduX3NlcG9saWN5X3BhdGggPSBhCi0gICAgZWxpZiBvIGluICgiLS1leHRyYV9zaWduX3NlcG9saWN5X2FyZ3MiLCk6Ci0gICAgICBPUFRJT05TLmV4dHJhX3NpZ25fc2Vwb2xpY3lfYXJncyA9IHNobGV4LnNwbGl0KGEpCiAgICAgZWxpZiBvIGluICgiLS1hYXB0Ml9wYXRoIiwpOgogICAgICAgT1BUSU9OUy5hYXB0Ml9wYXRoID0gYQogICAgIGVsaWYgbyBpbiAoIi0tamF2YV9wYXRoIiwpOgpAQCAtMjc4Niw4ICsyODA5LDIwIEBACiAgICAgZWxpZiBvIGluICgiLS1sb2dmaWxlIiwpOgogICAgICAgT1BUSU9OUy5sb2dmaWxlID0gYQogICAgIGVsc2U6Ci0gICAgICBpZiBleHRyYV9vcHRpb25faGFuZGxlciBpcyBOb25lIG9yIG5vdCBleHRyYV9vcHRpb25faGFuZGxlcihvLCBhKToKLSAgICAgICAgYXNzZXJ0IEZhbHNlLCAidW5rbm93biBvcHRpb24gXCIlc1wiIiAlIChvLCkKKyAgICAgIGlmIGV4dHJhX29wdGlvbl9oYW5kbGVyIGlzIE5vbmU6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVua25vd24gb3B0aW9uIFwiJXNcIiIgJSAobywpKQorICAgICAgc3VjY2VzcyA9IEZhbHNlCisgICAgICBmb3IgaGFuZGxlciBpbiBleHRyYV9vcHRpb25faGFuZGxlcjoKKyAgICAgICAgaWYgaXNpbnN0YW5jZShoYW5kbGVyLCBPcHRpb25IYW5kbGVyKToKKyAgICAgICAgICBpZiBoYW5kbGVyLmhhbmRsZXIobywgYSk6CisgICAgICAgICAgICBzdWNjZXNzID0gVHJ1ZQorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxpZiBoYW5kbGVyKG8sIGEpOgorICAgICAgICAgIHN1Y2Nlc3MgPSBUcnVlCisgICAgICAgICAgYnJlYWsKKyAgICAgIGlmIG5vdCBzdWNjZXNzOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmtub3duIG9wdGlvbiBcIiVzXCIiICUgKG8sKSkKKwogCiAgIGlmIE9QVElPTlMuc2VhcmNoX3BhdGg6CiAgICAgb3MuZW52aXJvblsiUEFUSCJdID0gKG9zLnBhdGguam9pbihPUFRJT05TLnNlYXJjaF9wYXRoLCAiYmluIikgKwpAQCAtMjgxOCw2ICsyODUzLDggQEAKIAogZGVmIENsZWFudXAoKToKICAgZm9yIGkgaW4gT1BUSU9OUy50ZW1wZmlsZXM6CisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGkpOgorICAgICAgY29udGludWUKICAgICBpZiBvcy5wYXRoLmlzZGlyKGkpOgogICAgICAgc2h1dGlsLnJtdHJlZShpLCBpZ25vcmVfZXJyb3JzPVRydWUpCiAgICAgZWxzZToKQEAgLTI5NzEsNyArMzAwOCw3IEBACiAgICAgemlwZmlsZS5aSVA2NF9MSU1JVCA9IHNhdmVkX3ppcDY0X2xpbWl0CiAKIAotZGVmIFppcFdyaXRlU3RyKHppcF9maWxlLCB6aW5mb19vcl9hcmNuYW1lLCBkYXRhLCBwZXJtcz1Ob25lLAorZGVmIFppcFdyaXRlU3RyKHppcF9maWxlOiB6aXBmaWxlLlppcEZpbGUsIHppbmZvX29yX2FyY25hbWUsIGRhdGEsIHBlcm1zPU5vbmUsCiAgICAgICAgICAgICAgICAgY29tcHJlc3NfdHlwZT1Ob25lKToKICAgIiIiV3JhcCB6aXBmaWxlLndyaXRlc3RyKCkgZnVuY3Rpb24gdG8gd29yayBhcm91bmQgdGhlIHppcDY0IGxpbWl0LgogCkBAIC0zMDIxLDYgKzMwNTgsMzQgQEAKICAgemlwX2ZpbGUud3JpdGVzdHIoemluZm8sIGRhdGEpCiAgIHppcGZpbGUuWklQNjRfTElNSVQgPSBzYXZlZF96aXA2NF9saW1pdAogCitkZWYgWmlwRXhjbHVkZShpbnB1dF96aXAsIG91dHB1dF96aXAsIGVudHJpZXMsIGZvcmNlPUZhbHNlKToKKyAgIiIiRGVsZXRlcyBlbnRyaWVzIGZyb20gYSBaSVAgZmlsZS4KKworICBBcmdzOgorICAgIHppcF9maWxlbmFtZTogVGhlIG5hbWUgb2YgdGhlIFpJUCBmaWxlLgorICAgIGVudHJpZXM6IFRoZSBuYW1lIG9mIHRoZSBlbnRyeSwgb3IgdGhlIGxpc3Qgb2YgbmFtZXMgdG8gYmUgZGVsZXRlZC4KKyAgIiIiCisgIGlmIGlzaW5zdGFuY2UoZW50cmllcywgc3RyKToKKyAgICBlbnRyaWVzID0gW2VudHJpZXNdCisgICMgSWYgbGlzdCBpcyBlbXB0eSwgbm90aGluZyB0byBkbworICBpZiBub3QgZW50cmllczoKKyAgICBzaHV0aWwuY29weShpbnB1dF96aXAsIG91dHB1dF96aXApCisgICAgcmV0dXJuCisKKyAgd2l0aCB6aXBmaWxlLlppcEZpbGUoaW5wdXRfemlwLCAncicpIGFzIHppbjoKKyAgICBpZiBub3QgZm9yY2UgYW5kIGxlbihzZXQoemluLm5hbWVsaXN0KCkpLmludGVyc2VjdGlvbihlbnRyaWVzKSkgPT0gMDoKKyAgICAgIHJhaXNlIEV4dGVybmFsRXJyb3IoCisgICAgICAgICAgIkZhaWxlZCB0byBkZWxldGUgemlwIGVudHJpZXMsIG5hbWUgbm90IG1hdGNoZWQ6ICVzIiAlIGVudHJpZXMpCisKKyAgICBmZCwgbmV3X3ppcGZpbGUgPSB0ZW1wZmlsZS5ta3N0ZW1wKGRpcj1vcy5wYXRoLmRpcm5hbWUoaW5wdXRfemlwKSkKKyAgICBvcy5jbG9zZShmZCkKKyAgICBjbWQgPSBbInppcDJ6aXAiLCAiLWkiLCBpbnB1dF96aXAsICItbyIsIG5ld196aXBmaWxlXQorICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzOgorICAgICAgY21kLmFwcGVuZCgiLXgiKQorICAgICAgY21kLmFwcGVuZChlbnRyeSkKKyAgICBSdW5BbmRDaGVja091dHB1dChjbWQpCisgIG9zLnJlcGxhY2UobmV3X3ppcGZpbGUsIG91dHB1dF96aXApCisKIAogZGVmIFppcERlbGV0ZSh6aXBfZmlsZW5hbWUsIGVudHJpZXMsIGZvcmNlPUZhbHNlKToKICAgIiIiRGVsZXRlcyBlbnRyaWVzIGZyb20gYSBaSVAgZmlsZS4KQEAgLTMwMzUsMjAgKzMxMDAsNyBAQAogICBpZiBub3QgZW50cmllczoKICAgICByZXR1cm4KIAotICB3aXRoIHppcGZpbGUuWmlwRmlsZSh6aXBfZmlsZW5hbWUsICdyJykgYXMgemluOgotICAgIGlmIG5vdCBmb3JjZSBhbmQgbGVuKHNldCh6aW4ubmFtZWxpc3QoKSkuaW50ZXJzZWN0aW9uKGVudHJpZXMpKSA9PSAwOgotICAgICAgcmFpc2UgRXh0ZXJuYWxFcnJvcigKLSAgICAgICAgICAiRmFpbGVkIHRvIGRlbGV0ZSB6aXAgZW50cmllcywgbmFtZSBub3QgbWF0Y2hlZDogJXMiICUgZW50cmllcykKLQotICAgIGZkLCBuZXdfemlwZmlsZSA9IHRlbXBmaWxlLm1rc3RlbXAoZGlyPW9zLnBhdGguZGlybmFtZSh6aXBfZmlsZW5hbWUpKQotICAgIG9zLmNsb3NlKGZkKQotICAgIGNtZCA9IFsiemlwMnppcCIsICItaSIsIHppcF9maWxlbmFtZSwgIi1vIiwgbmV3X3ppcGZpbGVdCi0gICAgZm9yIGVudHJ5IGluIGVudHJpZXM6Ci0gICAgICBjbWQuYXBwZW5kKCIteCIpCi0gICAgICBjbWQuYXBwZW5kKGVudHJ5KQotICAgIFJ1bkFuZENoZWNrT3V0cHV0KGNtZCkKLQotICBvcy5yZXBsYWNlKG5ld196aXBmaWxlLCB6aXBfZmlsZW5hbWUpCisgIFppcEV4Y2x1ZGUoemlwX2ZpbGVuYW1lLCB6aXBfZmlsZW5hbWUsIGVudHJpZXMsIGZvcmNlKQogCiAKIGRlZiBaaXBDbG9zZSh6aXBfZmlsZSk6CkBAIC0zMTg2LDcgKzMyMzgsOSBAQAogICAgIHJldHVybiB0CiAKICAgZGVmIFdyaXRlVG9EaXIoc2VsZiwgZCk6Ci0gICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihkLCBzZWxmLm5hbWUpLCAid2IiKSBhcyBmcDoKKyAgICBvdXRwdXRfcGF0aCA9IG9zLnBhdGguam9pbihkLCBzZWxmLm5hbWUpCisgICAgb3MubWFrZWRpcnMob3MucGF0aC5kaXJuYW1lKG91dHB1dF9wYXRoKSwgZXhpc3Rfb2s9VHJ1ZSkKKyAgICB3aXRoIG9wZW4ob3V0cHV0X3BhdGgsICJ3YiIpIGFzIGZwOgogICAgICAgZnAud3JpdGUoc2VsZi5kYXRhKQogCiAgIGRlZiBBZGRUb1ppcChzZWxmLCB6LCBjb21wcmVzc2lvbj1Ob25lKToKQEAgLTM3NTQsMTQgKzM4MDgsMTEgQEAKICAgICBvdXRwdXRfc2luayhyZWNvdmVyeV9pbWdfcGF0aCwgcmVjb3ZlcnlfaW1nLmRhdGEpCiAKICAgZWxzZToKLSAgICBzeXN0ZW1fcm9vdF9pbWFnZSA9IGluZm9fZGljdC5nZXQoInN5c3RlbV9yb290X2ltYWdlIikgPT0gInRydWUiCiAgICAgaW5jbHVkZV9yZWNvdmVyeV9kdGJvID0gaW5mb19kaWN0LmdldCgiaW5jbHVkZV9yZWNvdmVyeV9kdGJvIikgPT0gInRydWUiCiAgICAgaW5jbHVkZV9yZWNvdmVyeV9hY3BpbyA9IGluZm9fZGljdC5nZXQoImluY2x1ZGVfcmVjb3ZlcnlfYWNwaW8iKSA9PSAidHJ1ZSIKICAgICBwYXRoID0gb3MucGF0aC5qb2luKGlucHV0X2RpciwgcmVjb3ZlcnlfcmVzb3VyY2VfZGF0X3BhdGgpCi0gICAgIyBXaXRoIHN5c3RlbS1yb290LWltYWdlLCBib290IGFuZCByZWNvdmVyeSBpbWFnZXMgd2lsbCBoYXZlIG1pc21hdGNoaW5nCi0gICAgIyBlbnRyaWVzIChvbmx5IHJlY292ZXJ5IGhhcyB0aGUgcmFtZGlzayBlbnRyeSkgKEJ1ZzogNzI3MzE1MDYpLiBVc2UgYnNkaWZmCi0gICAgIyB0byBoYW5kbGUgc3VjaCBhIGNhc2UuCi0gICAgaWYgc3lzdGVtX3Jvb3RfaW1hZ2Ugb3IgaW5jbHVkZV9yZWNvdmVyeV9kdGJvIG9yIGluY2x1ZGVfcmVjb3ZlcnlfYWNwaW86CisgICAgIyBVc2UgYnNkaWZmIHRvIGhhbmRsZSBtaXNtYXRjaGluZyBlbnRyaWVzIChCdWc6IDcyNzMxNTA2KQorICAgIGlmIGluY2x1ZGVfcmVjb3ZlcnlfZHRibyBvciBpbmNsdWRlX3JlY292ZXJ5X2FjcGlvOgogICAgICAgZGlmZl9wcm9ncmFtID0gWyJic2RpZmYiXQogICAgICAgYm9udXNfYXJncyA9ICIiCiAgICAgICBhc3NlcnQgbm90IG9zLnBhdGguZXhpc3RzKHBhdGgpCkBAIC00MDY0LDcgKzQxMTUsNyBAQAogICBHZXQgYnVpbGQucHJvcCBmcm9tIHJhbWRpc2sgd2l0aGluIHRoZSBib290IGltYWdlCiAKICAgQXJnczoKLSAgICBib290X2ltZzogdGhlIGJvb3QgaW1hZ2UgZmlsZS4gUmFtZGlzayBtdXN0IGJlIGNvbXByZXNzZWQgd2l0aCBsejQgb3IgbWluaWd6aXAgZm9ybWF0LgorICAgIGJvb3RfaW1nOiB0aGUgYm9vdCBpbWFnZSBmaWxlLiBSYW1kaXNrIG11c3QgYmUgY29tcHJlc3NlZCB3aXRoIGx6NCBvciBnemlwIGZvcm1hdC4KIAogICBSZXR1cm46CiAgICAgQW4gZXh0cmFjdGVkIGZpbGUgdGhhdCBzdG9yZXMgcHJvcGVydGllcyBpbiB0aGUgYm9vdCBpbWFnZS4KQEAgLTQwODMsMTEgKzQxMzQsMTEgQEAKICAgICBlbGlmIHJhbWRpc2tfZm9ybWF0ID09IFJhbWRpc2tGb3JtYXQuR1o6CiAgICAgICB3aXRoIG9wZW4ocmFtZGlzaywgJ3JiJykgYXMgaW5wdXRfc3RyZWFtOgogICAgICAgICB3aXRoIG9wZW4odW5jb21wcmVzc2VkX3JhbWRpc2ssICd3YicpIGFzIG91dHB1dF9zdHJlYW06Ci0gICAgICAgICAgcDIgPSBSdW4oWydtaW5pZ3ppcCcsICctZCddLCBzdGRpbj1pbnB1dF9zdHJlYW0uZmlsZW5vKCksCisgICAgICAgICAgcDIgPSBSdW4oWydnemlwJywgJy1kJ10sIHN0ZGluPWlucHV0X3N0cmVhbS5maWxlbm8oKSwKICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9b3V0cHV0X3N0cmVhbS5maWxlbm8oKSkKICAgICAgICAgICBwMi53YWl0KCkKICAgICBlbHNlOgotICAgICAgbG9nZ2VyLmVycm9yKCdPbmx5IHN1cHBvcnQgbHo0IG9yIG1pbmlnemlwIHJhbWRpc2sgZm9ybWF0LicpCisgICAgICBsb2dnZXIuZXJyb3IoJ09ubHkgc3VwcG9ydCBsejQgb3IgZ3ppcCByYW1kaXNrIGZvcm1hdC4nKQogICAgICAgcmV0dXJuIE5vbmUKIAogICAgIGFic191bmNvbXByZXNzZWRfcmFtZGlzayA9IG9zLnBhdGguYWJzcGF0aCh1bmNvbXByZXNzZWRfcmFtZGlzaykKQEAgLTQxNTMsNiArNDIwNCwxNyBAQAogICAgIHJldHVybiBmcC5yZWFkKDQpID09IGInXHgzQVx4RkZceDI2XHhFRCcKIAogCitkZWYgVW5zcGFyc2VJbWFnZShmaWxlcGF0aCwgdGFyZ2V0X3BhdGg9Tm9uZSk6CisgIGlmIG5vdCBJc1NwYXJzZUltYWdlKGZpbGVwYXRoKToKKyAgICByZXR1cm4KKyAgaWYgdGFyZ2V0X3BhdGggaXMgTm9uZToKKyAgICB0bXBfaW1nID0gTWFrZVRlbXBGaWxlKHN1ZmZpeD0iLmltZyIpCisgICAgUnVuQW5kQ2hlY2tPdXRwdXQoWyJzaW1nMmltZyIsIGZpbGVwYXRoLCB0bXBfaW1nXSkKKyAgICBvcy5yZW5hbWUodG1wX2ltZywgZmlsZXBhdGgpCisgIGVsc2U6CisgICAgUnVuQW5kQ2hlY2tPdXRwdXQoWyJzaW1nMmltZyIsIGZpbGVwYXRoLCB0YXJnZXRfcGF0aF0pCisKKwogZGVmIFBhcnNlVXBkYXRlRW5naW5lQ29uZmlnKHBhdGg6IHN0cik6CiAgICIiIlBhcnNlIHRoZSB1cGRhdGVfZW5naW5lIGNvbmZpZyBzdG9yZWQgaW4gZmlsZSBgcGF0aGAKICAgQXJncwpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL2NyZWF0ZV9icmlja19vdGEucHkgYi90b29scy9yZWxlYXNldG9vbHMvY3JlYXRlX2JyaWNrX290YS5weQppbmRleCA0NGYwYTk1Li5iZjUwZjcxIDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvY3JlYXRlX2JyaWNrX290YS5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvY3JlYXRlX2JyaWNrX290YS5weQpAQCAtNDUsMTMgKzQ1LDE3IEBACiAgIHBhcnRpdGlvbnNfdG9fd2lwZSA9IFBBUlRJVElPTlNfVE9fV0lQRQogICBpZiBleHRyYV93aXBlX3BhcnRpdGlvbnMgaXMgbm90IE5vbmU6CiAgICAgcGFydGl0aW9uc190b193aXBlID0gUEFSVElUSU9OU19UT19XSVBFICsgZXh0cmFfd2lwZV9wYXJ0aXRpb25zLnNwbGl0KCIsIikKKyAgb3RhX21ldGFkYXRhID0gWyJvdGEtdHlwZT1CUklDSyIsICJwb3N0LXRpbWVzdGFtcD05OTk5OTk5OTk5IiwKKyAgICAgICAgICAgICAgICAgICJwcmUtZGV2aWNlPSIgKyBwcm9kdWN0X25hbWVdCisgIGlmIHNlcmlhbG5vIGlzIG5vdCBOb25lOgorICAgICAgb3RhX21ldGFkYXRhLmFwcGVuZCgic2VyaWFsbm89IiArIHNlcmlhbG5vKQogICAjIHJlY292ZXJ5IHJlcXVpZXJzIHByb2R1Y3QgbmFtZSB0byBiZSBhIHwgc2VwYXJhdGVkIGxpc3QKICAgcHJvZHVjdF9uYW1lID0gcHJvZHVjdF9uYW1lLnJlcGxhY2UoIiwiLCAifCIpCiAgIHdpdGggemlwZmlsZS5aaXBGaWxlKG91dHB1dF9wYXRoLCAidyIpIGFzIHpmcDoKICAgICB6ZnAud3JpdGVzdHIoInJlY292ZXJ5LndpcGUiLCAiXG4iLmpvaW4ocGFydGl0aW9uc190b193aXBlKSkKICAgICB6ZnAud3JpdGVzdHIoInBheWxvYWQuYmluIiwgIiIpCiAgICAgemZwLndyaXRlc3RyKCJNRVRBLUlORi9jb20vYW5kcm9pZC9tZXRhZGF0YSIsICJcbiIuam9pbigKLSAgICAgICAgWyJvdGEtdHlwZT1CUklDSyIsICJwb3N0LXRpbWVzdGFtcD05OTk5OTk5OTk5IiwgInByZS1kZXZpY2U9IiArIHByb2R1Y3RfbmFtZSwgInNlcmlhbG5vPSIgKyBzZXJpYWxub10pKQorICAgICAgICBvdGFfbWV0YWRhdGEpKQogCiAKIGRlZiBtYWluKGFyZ3YpOgpAQCAtNTksOSArNjMsOSBAQAogICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdvdGFmaWxlJywgbWV0YXZhcj0nUEFZTE9BRCcsIHR5cGU9c3RyLAogICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1RoZSBvdXRwdXQgT1RBIHBhY2thZ2UgZmlsZS4nKQogICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXByb2R1Y3QnLCB0eXBlPXN0ciwKLSAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdUaGUgcHJvZHVjdCBuYW1lIG9mIHRoZSBkZXZpY2UsIGZvciBleGFtcGxlLCBicmFtYmxlLCByZWRmaW4uIFRoaXMgY2FuIGJlIGEgY29tbWEgc2VwYXJhdGVkIGxpc3QuJywgcmVxdWlyZWQ9VHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdUaGUgcHJvZHVjdCBuYW1lIG9mIHRoZSBkZXZpY2UsIGZvciBleGFtcGxlLCBicmFtYmxlLCByZWRmaW4uJywgcmVxdWlyZWQ9VHJ1ZSkKICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zZXJpYWxubycsIHR5cGU9c3RyLAotICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1RoZSBzZXJpYWwgbnVtYmVyIG9mIGRldmljZXMgdGhhdCBhcmUgYWxsb3dlZCB0byBpbnN0YWxsIHRoaXMgT1RBIHBhY2thZ2UuIFRoaXMgY2FuIGJlIGEgY29tbWEgc2VwYXJhdGVkIGxpc3QuJykKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdUaGUgc2VyaWFsIG51bWJlciBvZiBkZXZpY2VzIHRoYXQgYXJlIGFsbG93ZWQgdG8gaW5zdGFsbCB0aGlzIE9UQSBwYWNrYWdlLiBUaGlzIGNhbiBiZSBhIHwgc2VwYXJhdGVkIGxpc3QuJykKICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1leHRyYV93aXBlX3BhcnRpdGlvbnMnLCB0eXBlPXN0ciwKICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdBZGRpdGlvbmFsIHBhcnRpdGlvbnMgb24gZGV2aWNlIHdoaWNoIHNob3VsZCBiZSB3aXBlZC4nKQogICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctdicsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvaW1nX2Zyb21fdGFyZ2V0X2ZpbGVzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL2ltZ19mcm9tX3RhcmdldF9maWxlcy5weQppbmRleCBmOGJkZDgxLi5iN2E1YWQ4IDEwMDc1NQotLS0gYS90b29scy9yZWxlYXNldG9vbHMvaW1nX2Zyb21fdGFyZ2V0X2ZpbGVzLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9pbWdfZnJvbV90YXJnZXRfZmlsZXMucHkKQEAgLTY0LDYgKzY0LDggQEAKIE9QVElPTlMucmV0cm9maXRfZGFwID0gTm9uZQogT1BUSU9OUy5idWlsZF9zdXBlciA9IE5vbmUKIE9QVElPTlMuc3BhcnNlX3VzZXJpbWFnZXMgPSBOb25lCitPUFRJT05TLnVzZV9mYXN0Ym9vdF9pbmZvID0gVHJ1ZQorT1BUSU9OUy5idWlsZF9zdXBlcl9pbWFnZSA9IE5vbmUKIAogCiBkZWYgTG9hZE9wdGlvbnMoaW5wdXRfZmlsZSk6CkBAIC0xMDQsNiArMTA2LDEzIEBACiAgIGNvbW1vbi5SdW5BbmRDaGVja091dHB1dChjbWQpCiAKIAorZGVmIExvY2F0ZVBhcnRpdGlvbkVudHJ5KHBhcnRpdGlvbl9uYW1lLCBuYW1lbGlzdCk6CisgIGZvciBzdWJkaXIgaW4gWyJJTUFHRVMiLCAiUFJFQlVJTFRfSU1BR0VTIiwgIlJBRElPIl06CisgICAgZW50cnlfbmFtZSA9IG9zLnBhdGguam9pbihzdWJkaXIsIHBhcnRpdGlvbl9uYW1lICsgIi5pbWciKQorICAgIGlmIGVudHJ5X25hbWUgaW4gbmFtZWxpc3Q6CisgICAgICByZXR1cm4gZW50cnlfbmFtZQorCisKIGRlZiBFbnRyaWVzRm9yVXNlckltYWdlcyhpbnB1dF9maWxlKToKICAgIiIiUmV0dXJucyB0aGUgdXNlciBpbWFnZXMgZW50cmllcyB0byBiZSBjb3BpZWQuCiAKQEAgLTExOSwxMiArMTI4LDIzIEBACiAgIGVudHJpZXMgPSBbCiAgICAgICAnT1RBL2FuZHJvaWQtaW5mby50eHQ6YW5kcm9pZC1pbmZvLnR4dCcsCiAgIF0KKyAgaWYgT1BUSU9OUy51c2VfZmFzdGJvb3RfaW5mbzoKKyAgICBlbnRyaWVzLmFwcGVuZCgnTUVUQS9mYXN0Ym9vdC1pbmZvLnR4dDpmYXN0Ym9vdC1pbmZvLnR4dCcpCisgIGFiX3BhcnRpdGlvbnMgPSBbXQogICB3aXRoIHppcGZpbGUuWmlwRmlsZShpbnB1dF9maWxlKSBhcyBpbnB1dF96aXA6CiAgICAgbmFtZWxpc3QgPSBpbnB1dF96aXAubmFtZWxpc3QoKQorICAgIGlmICJNRVRBL2FiX3BhcnRpdGlvbnMudHh0IiBpbiBuYW1lbGlzdDoKKyAgICAgIGFiX3BhcnRpdGlvbnMgPSBpbnB1dF96aXAucmVhZCgKKyAgICAgICAgICAiTUVUQS9hYl9wYXJ0aXRpb25zLnR4dCIpLmRlY29kZSgpLnN0cmlwKCkuc3BsaXQoKQorICBpZiAnUFJFQlVJTFRfSU1BR0VTL2tlcm5lbF8xNmsnIGluIG5hbWVsaXN0OgorICAgIGVudHJpZXMuYXBwZW5kKCdQUkVCVUlMVF9JTUFHRVMva2VybmVsXzE2azprZXJuZWxfMTZrJykKKyAgaWYgJ1BSRUJVSUxUX0lNQUdFUy9yYW1kaXNrXzE2ay5pbWcnIGluIG5hbWVsaXN0OgorICAgIGVudHJpZXMuYXBwZW5kKCdQUkVCVUlMVF9JTUFHRVMvcmFtZGlza18xNmsuaW1nOnJhbWRpc2tfMTZrLmltZycpCiAKKyAgdmlzaXRlZF9wYXJ0aXRpb25zID0gc2V0KE9QVElPTlMuZHluYW1pY19wYXJ0aXRpb25fbGlzdCkKICAgZm9yIGltYWdlX3BhdGggaW4gW25hbWUgZm9yIG5hbWUgaW4gbmFtZWxpc3QgaWYgbmFtZS5zdGFydHN3aXRoKCdJTUFHRVMvJyldOgogICAgIGltYWdlID0gb3MucGF0aC5iYXNlbmFtZShpbWFnZV9wYXRoKQotICAgIGlmIE9QVElPTlMuYm9vdGFibGVfb25seSBhbmQgaW1hZ2Ugbm90IGluKCdib290LmltZycsICdyZWNvdmVyeS5pbWcnLCAnYm9vdGxvYWRlcicsICdpbml0X2Jvb3QuaW1nJyk6CisgICAgaWYgT1BUSU9OUy5ib290YWJsZV9vbmx5IGFuZCBpbWFnZSBub3QgaW4gKCdib290LmltZycsICdyZWNvdmVyeS5pbWcnLCAnYm9vdGxvYWRlcicsICdpbml0X2Jvb3QuaW1nJyk6CiAgICAgICBjb250aW51ZQogICAgIGlmIG5vdCBpbWFnZS5lbmRzd2l0aCgnLmltZycpIGFuZCBpbWFnZSAhPSAnYm9vdGxvYWRlcic6CiAgICAgICBjb250aW51ZQpAQCAtMTM2LDcgKzE1NiwxNCBAQAogICAgICAgICBjb250aW51ZQogICAgICAgaWYgaW1hZ2UgaW4gZHluYW1pY19pbWFnZXM6CiAgICAgICAgIGNvbnRpbnVlCisgICAgcGFydGl0aW9uX25hbWUgPSBpbWFnZS5yc3RyaXAoIi5pbWciKQorICAgIHZpc2l0ZWRfcGFydGl0aW9ucy5hZGQocGFydGl0aW9uX25hbWUpCiAgICAgZW50cmllcy5hcHBlbmQoJ3t9Ont9Jy5mb3JtYXQoaW1hZ2VfcGF0aCwgaW1hZ2UpKQorICBmb3IgcGFydCBpbiBbcGFydCBmb3IgcGFydCBpbiBhYl9wYXJ0aXRpb25zIGlmIHBhcnQgbm90IGluIHZpc2l0ZWRfcGFydGl0aW9uc106CisgICAgZW50cnkgPSBMb2NhdGVQYXJ0aXRpb25FbnRyeShwYXJ0LCBuYW1lbGlzdCkKKyAgICBpbWFnZSA9IG9zLnBhdGguYmFzZW5hbWUoZW50cnkpCisgICAgaWYgZW50cnkgaXMgbm90IE5vbmU6CisgICAgICBlbnRyaWVzLmFwcGVuZCgne306e30nLmZvcm1hdChlbnRyeSwgaW1hZ2UpKQogICByZXR1cm4gZW50cmllcwogCiAKQEAgLTE2OCwxMiArMTk1LDE4IEBACiAgIGlucHV0X3RtcCA9IGNvbW1vbi5VbnppcFRlbXAoaW5wdXRfZmlsZSkKIAogICBzdXBlcl9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZSgnc3VwZXJfJywgJy5pbWcnKQotICBCdWlsZFN1cGVySW1hZ2UoaW5wdXRfdG1wLCBzdXBlcl9maWxlKQorCisgICMgQWxsb3cgb3ZlcnJpZGluZyB0aGUgQlVJTERfU1VQRVJfSU1BR0UgYmluYXJ5CisgIGlmIE9QVElPTlMuYnVpbGRfc3VwZXJfaW1hZ2U6CisgICAgY29tbWFuZCA9IFtPUFRJT05TLmJ1aWxkX3N1cGVyX2ltYWdlLCBpbnB1dF90bXAsIHN1cGVyX2ZpbGVdCisgICAgY29tbW9uLlJ1bkFuZENoZWNrT3V0cHV0KGNvbW1hbmQpCisgIGVsc2U6CisgICAgQnVpbGRTdXBlckltYWdlKGlucHV0X3RtcCwgc3VwZXJfZmlsZSkKIAogICBsb2dnZXIuaW5mbygnV3JpdGluZyBzdXBlci5pbWcgdG8gYXJjaGl2ZS4uLicpCiAgIHdpdGggemlwZmlsZS5aaXBGaWxlKAotICAgICAgb3V0cHV0X2ZpbGUsICdhJywgY29tcHJlc3Npb249emlwZmlsZS5aSVBfREVGTEFURUQsCi0gICAgICBhbGxvd1ppcDY0PVRydWUpIGFzIG91dHB1dF96aXA6CisgICAgICAgICAgb3V0cHV0X2ZpbGUsICdhJywgY29tcHJlc3Npb249emlwZmlsZS5aSVBfREVGTEFURUQsCisgICAgICAgICAgYWxsb3daaXA2ND1UcnVlKSBhcyBvdXRwdXRfemlwOgogICAgIGNvbW1vbi5aaXBXcml0ZShvdXRwdXRfemlwLCBzdXBlcl9maWxlLCAnc3VwZXIuaW1nJykKIAogCkBAIC0yMjUsNiArMjU4LDggQEAKICAgICAgIE9QVElPTlMuYm9vdGFibGVfb25seSA9IFRydWUKICAgICBlbGlmIG8gPT0gJy0tYWRkaXRpb25hbCc6CiAgICAgICBPUFRJT05TLmFkZGl0aW9uYWxfZW50cmllcy5hcHBlbmQoYSkKKyAgICBlbGlmIG8gPT0gJy0tYnVpbGRfc3VwZXJfaW1hZ2UnOgorICAgICAgT1BUSU9OUy5idWlsZF9zdXBlcl9pbWFnZSA9IGEKICAgICBlbHNlOgogICAgICAgcmV0dXJuIEZhbHNlCiAgICAgcmV0dXJuIFRydWUKQEAgLTIzNCw2ICsyNjksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9sb25nX29wdHM9WwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FkZGl0aW9uYWw9JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdib290YWJsZV96aXAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1aWxkX3N1cGVyX2ltYWdlPScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX29wdGlvbl9oYW5kbGVyPW9wdGlvbl9oYW5kbGVyKQogICBpZiBsZW4oYXJncykgIT0gMjoKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9tZXJnZS9BbmRyb2lkLmJwIGIvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlL0FuZHJvaWQuYnAKaW5kZXggMjE5YWNmOC4uOTZlYzczZSAxMDA2NDQKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlL0FuZHJvaWQuYnAKQEAgLTUwLDYgKzUwLDcgQEAKICAgICAgICAgInJlbGVhc2V0b29sc19vdGFfZnJvbV90YXJnZXRfZmlsZXMiLAogICAgIF0sCiAgICAgcmVxdWlyZWQ6IFsKKyAgICAgICAgImFwZXhkX2hvc3QiLAogICAgICAgICAiY2hlY2t2aW50ZiIsCiAgICAgICAgICJob3N0X2luaXRfdmVyaWZpZXIiLAogICAgICAgICAic2VjaWxjIiwKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9tZXJnZS9tZXJnZV9idWlsZHMucHkgYi90b29scy9yZWxlYXNldG9vbHMvbWVyZ2UvbWVyZ2VfYnVpbGRzLnB5CmluZGV4IDNhYzRlYzQuLjAzMjI3OGMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9tZXJnZS9tZXJnZV9idWlsZHMucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlL21lcmdlX2J1aWxkcy5weQpAQCAtNDcsNiArNDcsMTAgQEAKICAgICAgIFRoZSBvcHRpb25hbCBwYXRoIHRvIGEgbmV3bGluZS1zZXBhcmF0ZWQgY29uZmlnIGZpbGUgY29udGFpbmluZyBrZXlzIHRvCiAgICAgICBvYnRhaW4gZnJvbSB0aGUgZnJhbWV3b3JrIGluc3RhbmNlIG9mIG1pc2NfaW5mby50eHQsIHVzZWQgZm9yIGNyZWF0aW5nCiAgICAgICB2Ym1ldGEuaW1nLiBUaGUgcmVtYWluaW5nIGtleXMgY29tZSBmcm9tIHRoZSB2ZW5kb3IgaW5zdGFuY2UuCisKKyAgLS1hdmJfcmVzb2x2ZV9yb2xsYmFja19pbmRleF9sb2NhdGlvbl9jb25mbGljdAorICAgICAgSWYgcHJvdmlkZWQsIHJlc29sdmUgdGhlIGNvbmZsaWN0IEFWQiByb2xsYmFjayBpbmRleCBsb2NhdGlvbiB3aGVuCisgICAgICBuZWNlc3NhcnkuCiAiIiIKIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KIApAQCAtNjUsNiArNjksNyBAQAogT1BUSU9OUy5wcm9kdWN0X291dF92ZW5kb3IgPSBOb25lCiBPUFRJT05TLmJ1aWxkX3ZibWV0YSA9IEZhbHNlCiBPUFRJT05TLmZyYW1ld29ya19taXNjX2luZm9fa2V5cyA9IE5vbmUKK09QVElPTlMuYXZiX3Jlc29sdmVfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb25fY29uZmxpY3QgPSBGYWxzZQogCiAKIGRlZiBDcmVhdGVJbWFnZVN5bWxpbmtzKCk6CkBAIC0xNDAsNyArMTQ1LDggQEAKICAgb3V0cHV0X3ZibWV0YV9wYXRoID0gb3MucGF0aC5qb2luKE9QVElPTlMucHJvZHVjdF9vdXRfdmVuZG9yLCAidmJtZXRhLmltZyIpCiAgIE9QVElPTlMuaW5mb19kaWN0ID0gbWVyZ2VkX2RpY3QKICAgY29tbW9uLkJ1aWxkVkJNZXRhKG91dHB1dF92Ym1ldGFfcGF0aCwgcGFydGl0aW9ucywgInZibWV0YSIsCi0gICAgICAgICAgICAgICAgICAgICB2Ym1ldGFfcGFydGl0aW9ucykKKyAgICAgICAgICAgICAgICAgICAgIHZibWV0YV9wYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgT1BUSU9OUy5hdmJfcmVzb2x2ZV9yb2xsYmFja19pbmRleF9sb2NhdGlvbl9jb25mbGljdCkKIAogCiBkZWYgTWVyZ2VCdWlsZHMoKToKQEAgLTE2NCw2ICsxNzAsOCBAQAogICAgICAgT1BUSU9OUy5idWlsZF92Ym1ldGEgPSBUcnVlCiAgICAgZWxpZiBvID09ICItLWZyYW1ld29ya19taXNjX2luZm9fa2V5cyI6CiAgICAgICBPUFRJT05TLmZyYW1ld29ya19taXNjX2luZm9fa2V5cyA9IGEKKyAgICBlbGlmIG8gPT0gIi0tYXZiX3Jlc29sdmVfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb25fY29uZmxpY3QiOgorICAgICAgT1BUSU9OUy5hdmJfcmVzb2x2ZV9yb2xsYmFja19pbmRleF9sb2NhdGlvbl9jb25mbGljdCA9IFRydWUKICAgICBlbHNlOgogICAgICAgcmV0dXJuIEZhbHNlCiAgICAgcmV0dXJuIFRydWUKQEAgLTE3Nyw2ICsxODUsNyBAQAogICAgICAgICAgICJwcm9kdWN0X291dF92ZW5kb3I9IiwKICAgICAgICAgICAiYnVpbGRfdmJtZXRhIiwKICAgICAgICAgICAiZnJhbWV3b3JrX21pc2NfaW5mb19rZXlzPSIsCisgICAgICAgICAgImF2Yl9yZXNvbHZlX3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uX2NvbmZsaWN0IgogICAgICAgXSwKICAgICAgIGV4dHJhX29wdGlvbl9oYW5kbGVyPW9wdGlvbl9oYW5kbGVyKQogCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvbWVyZ2UvbWVyZ2VfY29tcGF0aWJpbGl0eV9jaGVja3MucHkgYi90b29scy9yZWxlYXNldG9vbHMvbWVyZ2UvbWVyZ2VfY29tcGF0aWJpbGl0eV9jaGVja3MucHkKaW5kZXggMjA3YWJlMi4uOGM5OTkzZiAxMDA2NDQKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlL21lcmdlX2NvbXBhdGliaWxpdHlfY2hlY2tzLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9tZXJnZS9tZXJnZV9jb21wYXRpYmlsaXR5X2NoZWNrcy5weQpAQCAtMTkwLDggKzE5MCw4IEBACiAgIGFwZXhfcGFja2FnZXMgPSBzZXQoKQogICBmb3IgcGFydGl0aW9uIGluIHBhcnRpdGlvbl9tYXAua2V5cygpOgogICAgIHRyeToKLSAgICAgIGFwZXhfaW5mbyA9IGFwZXhfdXRpbHMuR2V0QXBleEluZm9Gcm9tVGFyZ2V0RmlsZXMoCi0gICAgICAgICAgdGFyZ2V0X2ZpbGVzX2RpciwgcGFydGl0aW9uLCBjb21wcmVzc2VkX29ubHk9RmFsc2UpCisgICAgICBhcGV4X2luZm8gPSBhcGV4X3V0aWxzLkdldEFwZXhJbmZvRm9yUGFydGl0aW9uKAorICAgICAgICAgIHRhcmdldF9maWxlc19kaXIsIHBhcnRpdGlvbikKICAgICBleGNlcHQgUnVudGltZUVycm9yIGFzIGVycjoKICAgICAgIGVycm9ycy5hcHBlbmQoc3RyKGVycikpCiAgICAgICBhcGV4X2luZm8gPSBbXQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlL21lcmdlX2RleG9wdC5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9tZXJnZS9tZXJnZV9kZXhvcHQucHkKaW5kZXggMTYxODJiNS4uMWMwYzc0MyAxMDA2NDQKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlL21lcmdlX2RleG9wdC5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvbWVyZ2UvbWVyZ2VfZGV4b3B0LnB5CkBAIC03Miw3ICs3Miw2IEBACiAgICMgICAgICAgICA8Y29udGVudHMgb2YgdmVuZG9yIGRleHByZW9wdF9jb25maWcuemlwPgogICAjICAgICBzeXN0ZW0gLT4gb3V0cHV0L1NZU1RFTQogICAjICAgICB2ZW5kb3IgLT4gb3V0cHV0L1ZFTkRPUgotICAjICAgICBhcGV4IC0+IG91dHB1dC9TWVNURU0vYXBleCAob25seSBmb3IgZmxhdHRlbmVkIEFQRVggYnVpbGRzKQogICAjICAgICBhcGV4LyAoZXh0cmFjdGVkIHVwZGF0YWJsZSBBUEVYKQogICAjICAgICAgICAgPGFwZXggMT4vCiAgICMgICAgICAgICAgICAgLi4uCkBAIC0xMTQsNzAgKzExMywyMCBAQAogICAgICAgb3MucGF0aC5qb2luKG91dHB1dF90YXJnZXRfZmlsZXNfZGlyLCAnVkVORE9SJyksCiAgICAgICBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICd2ZW5kb3InKSkKIAotICAjIFRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZvciBmbGF0dGVkZWQgQVBFWGVzIGlzOgotICAjCi0gICMgU1lTVEVNCi0gICMgICAgIGFwZXgKLSAgIyAgICAgICAgIDxBUEVYIG5hbWUsIGUuZy4sIGNvbS5hbmRyb2lkLndpZmk+Ci0gICMgICAgICAgICAgICAgYXBleF9tYW5pZmVzdC5wYgotICAjICAgICAgICAgICAgIGFwZXhfcHVia2V5Ci0gICMgICAgICAgICAgICAgZXRjLwotICAjICAgICAgICAgICAgIGphdmFsaWIvCi0gICMgICAgICAgICAgICAgbGliLwotICAjICAgICAgICAgICAgIGxpYjY0LwotICAjICAgICAgICAgICAgIHByaXYtYXBwLwotICAjCi0gICMgVGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIHVwZGF0YWJsZSBBUEVYZXMgaXM6Ci0gICMKLSAgIyBTWVNURU0KLSAgIyAgICAgYXBleAotICAjICAgICAgICAgY29tLmFuZHJvaWQuYWRiZC5hcGV4Ci0gICMgICAgICAgICBjb20uYW5kcm9pZC5hcHBzZWFyY2guYXBleAotICAjICAgICAgICAgY29tLmFuZHJvaWQuYXJ0LmFwZXgKLSAgIyAgICAgICAgIC4uLgotICBhcGV4X3Jvb3QgPSBvcy5wYXRoLmpvaW4ob3V0cHV0X3RhcmdldF9maWxlc19kaXIsICdTWVNURU0nLCAnYXBleCcpCisgICMgRXh0cmFjdCBBUEVYLgorICBsb2dnaW5nLmluZm8oJ2V4dHJhY3RpbmcgQVBFWCcpCisgIGFwZXhfZXh0cmFjdF9yb290X2RpciA9IG9zLnBhdGguam9pbih0ZW1wX2RpciwgJ2FwZXgnKQorICBvcy5tYWtlZGlycyhhcGV4X2V4dHJhY3Rfcm9vdF9kaXIpCiAKLSAgIyBDaGVjayBmb3IgZmxhdHRlbmRlZCB2ZXJzdXMgdXBkYXRhYmxlIEFQRVguCi0gIGlmIE9QVElPTlMuZnJhbWV3b3JrX21pc2NfaW5mby5nZXQoJ3RhcmdldF9mbGF0dGVuX2FwZXgnKSA9PSAnZmFsc2UnOgotICAgICMgRXh0cmFjdCBBUEVYLgotICAgIGxvZ2dpbmcuaW5mbygnZXh0cmFjdGluZyBBUEVYJykKLQotICAgIGFwZXhfZXh0cmFjdF9yb290X2RpciA9IG9zLnBhdGguam9pbih0ZW1wX2RpciwgJ2FwZXgnKQotICAgIG9zLm1ha2VkaXJzKGFwZXhfZXh0cmFjdF9yb290X2RpcikKLQotICAgIGZvciBhcGV4IGluIChnbG9iLmdsb2Iob3MucGF0aC5qb2luKGFwZXhfcm9vdCwgJyouYXBleCcpKSArCi0gICAgICAgICAgICAgICAgIGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4oYXBleF9yb290LCAnKi5jYXBleCcpKSk6Ci0gICAgICBsb2dnaW5nLmluZm8oJyAgYXBleDogJXMnLCBhcGV4KQotICAgICAgIyBkZWFwZXhlciBpcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIG1lcmdlX3RhcmdldF9maWxlcyBiaW5hcnkgZXh0cmFjdGVkCi0gICAgICAjIGZyb20gb3RhdG9vbHMuemlwLgotICAgICAgYXBleF9qc29uX2luZm8gPSBzdWJwcm9jZXNzLmNoZWNrX291dHB1dChbJ2RlYXBleGVyJywgJ2luZm8nLCBhcGV4XSkKLSAgICAgIGxvZ2dpbmcuaW5mbygnICAgIGluZm86ICVzJywgYXBleF9qc29uX2luZm8pCi0gICAgICBhcGV4X2luZm8gPSBqc29uLmxvYWRzKGFwZXhfanNvbl9pbmZvKQotICAgICAgYXBleF9uYW1lID0gYXBleF9pbmZvWyduYW1lJ10KLSAgICAgIGxvZ2dpbmcuaW5mbygnICAgIG5hbWU6ICVzJywgYXBleF9uYW1lKQotCi0gICAgICBhcGV4X2V4dHJhY3RfZGlyID0gb3MucGF0aC5qb2luKGFwZXhfZXh0cmFjdF9yb290X2RpciwgYXBleF9uYW1lKQotICAgICAgb3MubWFrZWRpcnMoYXBleF9leHRyYWN0X2RpcikKLQotICAgICAgIyBkZWFwZXhlciB1c2VzIGRlYnVnZnNfc3RhdGljLCB3aGljaCBpcyBwYXJ0IG9mIG90YXRvb2xzLnppcC4KLSAgICAgIGNvbW1hbmQgPSBbCi0gICAgICAgICAgJ2RlYXBleGVyJywKLSAgICAgICAgICAnLS1kZWJ1Z2ZzX3BhdGgnLAotICAgICAgICAgICdkZWJ1Z2ZzX3N0YXRpYycsCi0gICAgICAgICAgJy0tYmxraWRfcGF0aCcsCi0gICAgICAgICAgJ2Jsa2lkJywKLSAgICAgICAgICAnLS1mc2NrZXJvZnNfcGF0aCcsCi0gICAgICAgICAgJ2ZzY2suZXJvZnMnLAotICAgICAgICAgICdleHRyYWN0JywKLSAgICAgICAgICBhcGV4LAotICAgICAgICAgIGFwZXhfZXh0cmFjdF9kaXIsCi0gICAgICBdCi0gICAgICBsb2dnaW5nLmluZm8oJyAgICBydW5uaW5nICVzJywgY29tbWFuZCkKLSAgICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbChjb21tYW5kKQotICBlbHNlOgotICAgICMgRmxhdHRlbmVkIEFQRVhlcyBkb24ndCBuZWVkIHRvIGJlIGV4dHJhY3RlZCBzaW5jZSB0aGV5IGhhdmUgdGhlIG5lY2Vzc2FyeQotICAgICMgZGlyZWN0b3J5IHN0cnVjdHVyZS4KLSAgICBvcy5zeW1saW5rKG9zLnBhdGguam9pbihhcGV4X3Jvb3QpLCBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICdhcGV4JykpCisgIGNvbW1hbmQgPSBbCisgICAgICAnYXBleGRfaG9zdCcsCisgICAgICAnLS1zeXN0ZW1fcGF0aCcsCisgICAgICBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICdzeXN0ZW0nKSwKKyAgICAgICctLWFwZXhfcGF0aCcsCisgICAgICBhcGV4X2V4dHJhY3Rfcm9vdF9kaXIsCisgIF0KKyAgbG9nZ2luZy5pbmZvKCcgICAgcnVubmluZyAlcycsIGNvbW1hbmQpCisgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbChjb21tYW5kKQogCiAgICMgTW9kaWZ5IHN5c3RlbSBjb25maWcgdG8gcG9pbnQgdG8gdGhlIHRvb2xzIHRoYXQgaGF2ZSBiZWVuIGV4dHJhY3RlZC4KICAgIyBBYnNvbHV0ZSBvciAuLiBwYXRocyBhcmUgbm90IGFsbG93ZWQgIGJ5IHRoZSBkZXhwcmVvcHRfZ2VuIHRvb2wgaW4KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9tZXJnZS9tZXJnZV9tZXRhLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlL21lcmdlX21ldGEucHkKaW5kZXggYjYxZjAzOS4uNzY1ODJjMCAxMDA2NDQKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlL21lcmdlX21ldGEucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlL21lcmdlX21ldGEucHkKQEAgLTUzLDI4ICs1MywzNCBAQAogTU9EVUxFX0tFWV9QQVRURVJOID0gcmUuY29tcGlsZShyJ25hbWU9IiguKylcLihhcGV4fGFwaykiJykKIAogCitkZWYgTWVyZ2VVcGRhdGVFbmdpbmVDb25maWcoZnJhbWV3b3JrX21ldGFfZGlyLCB2ZW5kb3JfbWV0YV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VkX21ldGFfZGlyKToKKyAgIiIiTWVyZ2VzIE1FVEEvdXBkYXRlX2VuZ2luZV9jb25maWcudHh0LgogCisgIFRoZSBvdXRwdXQgaXMgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIG1heGltdW0gY29tcGF0aWJpbGl0eS4KKyAgIiIiCisgIF9DT05GSUdfTkFNRSA9ICd1cGRhdGVfZW5naW5lX2NvbmZpZy50eHQnCisgIGZyYW1ld29ya19jb25maWdfcGF0aCA9IG9zLnBhdGguam9pbihmcmFtZXdvcmtfbWV0YV9kaXIsIF9DT05GSUdfTkFNRSkKKyAgdmVuZG9yX2NvbmZpZ19wYXRoID0gb3MucGF0aC5qb2luKHZlbmRvcl9tZXRhX2RpciwgX0NPTkZJR19OQU1FKQorICBtZXJnZWRfY29uZmlnX3BhdGggPSBvcy5wYXRoLmpvaW4obWVyZ2VkX21ldGFfZGlyLCBfQ09ORklHX05BTUUpCiAKLWRlZiBNZXJnZVVwZGF0ZUVuZ2luZUNvbmZpZyhpbnB1dF9tZXRhZGlyMSwgaW5wdXRfbWV0YWRpcjIsIG1lcmdlZF9tZXRhX2Rpcik6Ci0gIFVQREFURV9FTkdJTkVfQ09ORklHX05BTUUgPSAidXBkYXRlX2VuZ2luZV9jb25maWcudHh0IgotICBjb25maWcxX3BhdGggPSBvcy5wYXRoLmpvaW4oCi0gICAgICBpbnB1dF9tZXRhZGlyMSwgVVBEQVRFX0VOR0lORV9DT05GSUdfTkFNRSkKLSAgY29uZmlnMl9wYXRoID0gb3MucGF0aC5qb2luKAotICAgICAgaW5wdXRfbWV0YWRpcjIsIFVQREFURV9FTkdJTkVfQ09ORklHX05BTUUpCi0gIGNvbmZpZzEgPSBQYXJzZVVwZGF0ZUVuZ2luZUNvbmZpZyhjb25maWcxX3BhdGgpCi0gIGNvbmZpZzIgPSBQYXJzZVVwZGF0ZUVuZ2luZUNvbmZpZyhjb25maWcyX3BhdGgpCi0gICMgQ29weSBvbGRlciBjb25maWcgdG8gbWVyZ2VkIHRhcmdldCBmaWxlcyBmb3IgbWF4aW11bSBjb21wYXRpYmlsaXR5Ci0gICMgdXBkYXRlX2VuZ2luZSBpbiBzeXN0ZW0gcGFydGl0aW9uIGlzIGZyb20gc3lzdGVtIHNpZGUsIGJ1dAotICAjIHVwZGF0ZV9lbmdpbmVfc2lkZWxvYWQgaW4gcmVjb3ZlcnkgaXMgZnJvbSB2ZW5kb3Igc2lkZS4KLSAgaWYgY29uZmlnMSA8IGNvbmZpZzI6Ci0gICAgc2h1dGlsLmNvcHkoY29uZmlnMV9wYXRoLCBvcy5wYXRoLmpvaW4oCi0gICAgICAgIG1lcmdlZF9tZXRhX2RpciwgVVBEQVRFX0VOR0lORV9DT05GSUdfTkFNRSkpCisgIGlmIG9zLnBhdGguZXhpc3RzKGZyYW1ld29ya19jb25maWdfcGF0aCk6CisgICAgZnJhbWV3b3JrX2NvbmZpZyA9IFBhcnNlVXBkYXRlRW5naW5lQ29uZmlnKGZyYW1ld29ya19jb25maWdfcGF0aCkKKyAgICB2ZW5kb3JfY29uZmlnID0gUGFyc2VVcGRhdGVFbmdpbmVDb25maWcodmVuZG9yX2NvbmZpZ19wYXRoKQorICAgICMgQ29weSBvbGRlciBjb25maWcgdG8gbWVyZ2VkIHRhcmdldCBmaWxlcyBmb3IgbWF4aW11bSBjb21wYXRpYmlsaXR5CisgICAgIyB1cGRhdGVfZW5naW5lIGluIHN5c3RlbSBwYXJ0aXRpb24gaXMgZnJvbSBzeXN0ZW0gc2lkZSwgYnV0CisgICAgIyB1cGRhdGVfZW5naW5lX3NpZGVsb2FkIGluIHJlY292ZXJ5IGlzIGZyb20gdmVuZG9yIHNpZGUuCisgICAgaWYgZnJhbWV3b3JrX2NvbmZpZyA8IHZlbmRvcl9jb25maWc6CisgICAgICBzaHV0aWwuY29weShmcmFtZXdvcmtfY29uZmlnX3BhdGgsIG1lcmdlZF9jb25maWdfcGF0aCkKKyAgICBlbHNlOgorICAgICAgc2h1dGlsLmNvcHkodmVuZG9yX2NvbmZpZ19wYXRoLCBtZXJnZWRfY29uZmlnX3BhdGgpCiAgIGVsc2U6Ci0gICAgc2h1dGlsLmNvcHkoY29uZmlnMl9wYXRoLCBvcy5wYXRoLmpvaW4oCi0gICAgICAgIG1lcmdlZF9tZXRhX2RpciwgVVBEQVRFX0VOR0lORV9DT05GSUdfTkFNRSkpCisgICAgaWYgbm90IE9QVElPTlMuYWxsb3dfcGFydGlhbF9hYjoKKyAgICAgIHJhaXNlIEZpbGVOb3RGb3VuZEVycm9yKGZyYW1ld29ya19jb25maWdfcGF0aCkKKyAgICBzaHV0aWwuY29weSh2ZW5kb3JfY29uZmlnX3BhdGgsIG1lcmdlZF9jb25maWdfcGF0aCkKIAogCi1kZWYgTWVyZ2VNZXRhRmlsZXModGVtcF9kaXIsIG1lcmdlZF9kaXIpOgorZGVmIE1lcmdlTWV0YUZpbGVzKHRlbXBfZGlyLCBtZXJnZWRfZGlyLCBmcmFtZXdvcmtfcGFydGl0aW9ucyk6CiAgICIiIk1lcmdlcyB2YXJpb3VzIGZpbGVzIGluIE1FVEEvKi4iIiIKIAogICBmcmFtZXdvcmtfbWV0YV9kaXIgPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICdmcmFtZXdvcmtfbWV0YScsICdNRVRBJykKQEAgLTExNCw3ICsxMjAsOCBAQAogICAgIE1lcmdlQWJQYXJ0aXRpb25zKAogICAgICAgICBmcmFtZXdvcmtfbWV0YV9kaXI9ZnJhbWV3b3JrX21ldGFfZGlyLAogICAgICAgICB2ZW5kb3JfbWV0YV9kaXI9dmVuZG9yX21ldGFfZGlyLAotICAgICAgICBtZXJnZWRfbWV0YV9kaXI9bWVyZ2VkX21ldGFfZGlyKQorICAgICAgICBtZXJnZWRfbWV0YV9kaXI9bWVyZ2VkX21ldGFfZGlyLAorICAgICAgICBmcmFtZXdvcmtfcGFydGl0aW9ucz1mcmFtZXdvcmtfcGFydGl0aW9ucykKICAgICBVcGRhdGVDYXJlTWFwSW1hZ2VTaXplUHJvcHMoaW1hZ2VzX2Rpcj1vcy5wYXRoLmpvaW4obWVyZ2VkX2RpciwgJ0lNQUdFUycpKQogCiAgIGZvciBmaWxlX25hbWUgaW4gKCdhcGtjZXJ0cy50eHQnLCAnYXBleGtleXMudHh0Jyk6CkBAIC0xMjQsMTAgKzEzMSw5IEBACiAgICAgICAgIG1lcmdlZF9tZXRhX2Rpcj1tZXJnZWRfbWV0YV9kaXIsCiAgICAgICAgIGZpbGVfbmFtZT1maWxlX25hbWUpCiAKLSAgTWVyZ2VVcGRhdGVFbmdpbmVDb25maWcoCi0gICAgICBmcmFtZXdvcmtfbWV0YV9kaXIsCi0gICAgICB2ZW5kb3JfbWV0YV9kaXIsIG1lcmdlZF9tZXRhX2RpciwKLSAgKQorICBpZiBPUFRJT05TLm1lcmdlZF9taXNjX2luZm8uZ2V0KCdhYl91cGRhdGUnKSA9PSAndHJ1ZSc6CisgICAgTWVyZ2VVcGRhdGVFbmdpbmVDb25maWcoCisgICAgICAgIGZyYW1ld29ya19tZXRhX2RpciwgdmVuZG9yX21ldGFfZGlyLCBtZXJnZWRfbWV0YV9kaXIpCiAKICAgIyBXcml0ZSB0aGUgbm93LWZpbmFsaXplZCBPUFRJT05TLm1lcmdlZF9taXNjX2luZm8uCiAgIG1lcmdlX3V0aWxzLldyaXRlU29ydGVkRGF0YSgKQEAgLTEzNSwxMyArMTQxLDMwIEBACiAgICAgICBwYXRoPW9zLnBhdGguam9pbihtZXJnZWRfbWV0YV9kaXIsICdtaXNjX2luZm8udHh0JykpCiAKIAotZGVmIE1lcmdlQWJQYXJ0aXRpb25zKGZyYW1ld29ya19tZXRhX2RpciwgdmVuZG9yX21ldGFfZGlyLCBtZXJnZWRfbWV0YV9kaXIpOgorZGVmIE1lcmdlQWJQYXJ0aXRpb25zKGZyYW1ld29ya19tZXRhX2RpciwgdmVuZG9yX21ldGFfZGlyLCBtZXJnZWRfbWV0YV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgZnJhbWV3b3JrX3BhcnRpdGlvbnMpOgogICAiIiJNZXJnZXMgTUVUQS9hYl9wYXJ0aXRpb25zLnR4dC4KIAogICBUaGUgb3V0cHV0IGNvbnRhaW5zIHRoZSB1bmlvbiBvZiB0aGUgcGFydGl0aW9uIG5hbWVzLgogICAiIiIKLSAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihmcmFtZXdvcmtfbWV0YV9kaXIsICdhYl9wYXJ0aXRpb25zLnR4dCcpKSBhcyBmOgotICAgIGZyYW1ld29ya19hYl9wYXJ0aXRpb25zID0gZi5yZWFkKCkuc3BsaXRsaW5lcygpCisgIGZyYW1ld29ya19hYl9wYXJ0aXRpb25zID0gW10KKyAgZnJhbWV3b3JrX2FiX2NvbmZpZyA9IG9zLnBhdGguam9pbihmcmFtZXdvcmtfbWV0YV9kaXIsICdhYl9wYXJ0aXRpb25zLnR4dCcpCisgIGlmIG9zLnBhdGguZXhpc3RzKGZyYW1ld29ya19hYl9jb25maWcpOgorICAgIHdpdGggb3BlbihmcmFtZXdvcmtfYWJfY29uZmlnKSBhcyBmOgorICAgICAgIyBGaWx0ZXIgb3V0IHNvbWUgcGFydGl0aW9ucyBoZXJlIHRvIHN1cHBvcnQgdGhlIGNhc2UgdGhhdCB0aGUKKyAgICAgICMgYWJfcGFydGl0aW9ucy50eHQgb2YgZnJhbWV3b3JrLXRhcmdldC1maWxlcyBoYXMgbm9uLWZyYW1ld29yaworICAgICAgIyBwYXJ0aXRpb25zLiBUaGlzIGNhc2UgaGFwcGVucyB3aGVuIHdlIHVzZSBhIGNvbXBsZXRlIG1lcmdlZCB0YXJnZXQKKyAgICAgICMgZmlsZXMgcGFja2FnZSBhcyB0aGUgZnJhbWV3b3JrLXRhcmdldC1maWxlcy4KKyAgICAgIGZyYW1ld29ya19hYl9wYXJ0aXRpb25zLmV4dGVuZChbCisgICAgICAgICAgcGFydGl0aW9uCisgICAgICAgICAgZm9yIHBhcnRpdGlvbiBpbiBmLnJlYWQoKS5zcGxpdGxpbmVzKCkKKyAgICAgICAgICBpZiBwYXJ0aXRpb24gaW4gZnJhbWV3b3JrX3BhcnRpdGlvbnMKKyAgICAgIF0pCisgIGVsc2U6CisgICAgaWYgbm90IE9QVElPTlMuYWxsb3dfcGFydGlhbF9hYjoKKyAgICAgIHJhaXNlIEZpbGVOb3RGb3VuZEVycm9yKGZyYW1ld29ya19hYl9jb25maWcpCisgICAgbG9nZ2VyLmluZm8oJ1VzZSBwYXJ0aWFsIEFCIGJlY2F1c2UgZnJhbWV3b3JrIGFiX3BhcnRpdGlvbnMudHh0IGRvZXMgbm90ICcKKyAgICAgICAgICAgICAgICAnZXhpc3QuJykKIAogICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKHZlbmRvcl9tZXRhX2RpciwgJ2FiX3BhcnRpdGlvbnMudHh0JykpIGFzIGY6CiAgICAgdmVuZG9yX2FiX3BhcnRpdGlvbnMgPSBmLnJlYWQoKS5zcGxpdGxpbmVzKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9tZXJnZS9tZXJnZV90YXJnZXRfZmlsZXMucHkgYi90b29scy9yZWxlYXNldG9vbHMvbWVyZ2UvbWVyZ2VfdGFyZ2V0X2ZpbGVzLnB5CmluZGV4IGJhMmIxNGYuLmZkYmE5MjcgMTAwNzU1Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9tZXJnZS9tZXJnZV90YXJnZXRfZmlsZXMucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlL21lcmdlX3RhcmdldF9maWxlcy5weQpAQCAtNDYsNiArNDYsMTAgQEAKICAgICAgIFRoZSBvcHRpb25hbCBwYXRoIHRvIGEgbmV3bGluZS1zZXBhcmF0ZWQgY29uZmlnIGZpbGUgb2YgaXRlbXMgdGhhdAogICAgICAgYXJlIGV4dHJhY3RlZCBhcy1pcyBmcm9tIHRoZSB2ZW5kb3IgdGFyZ2V0IGZpbGVzIHBhY2thZ2UuCiAKKyAgLS1ib290LWltYWdlLWRpci1wYXRoCisgICAgICBUaGUgaW5wdXQgYm9vdCBpbWFnZSBkaXJlY3RvcnkgcGF0aC4gVGhpcyBwYXRoIGNvbnRhaW5zIElNQUdFUy9ib290LmltZworICAgICAgZmlsZS4KKwogICAtLW91dHB1dC10YXJnZXQtZmlsZXMgb3V0cHV0LXRhcmdldC1maWxlcy1wYWNrYWdlCiAgICAgICBJZiBwcm92aWRlZCwgdGhlIG91dHB1dCBtZXJnZWQgdGFyZ2V0IGZpbGVzIHBhY2thZ2UuIEFsc28gYSB6aXAgYXJjaGl2ZS4KIApAQCAtOTAsNiArOTQsMTQgQEAKICAgLS1rZWVwLXRtcAogICAgICAgS2VlcCB0ZW1wb2FyeSBmaWxlcyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgogCisgIC0tYXZiLXJlc29sdmUtcm9sbGJhY2staW5kZXgtbG9jYXRpb24tY29uZmxpY3QKKyAgICAgIElmIHByb3ZpZGVkLCByZXNvbHZlIHRoZSBjb25mbGljdCBBVkIgcm9sbGJhY2sgaW5kZXggbG9jYXRpb24gd2hlbgorICAgICAgbmVjZXNzYXJ5LgorCisgIC0tYWxsb3ctcGFydGlhbC1hYgorICAgICAgSWYgcHJvdmlkZWQsIGFsbG93IG1lcmdpbmcgbm9uLUFCIGZyYW1ld29yayB0YXJnZXQgZmlsZXMgd2l0aCBBQiB2ZW5kb3IKKyAgICAgIHRhcmdldCBmaWxlcywgd2hpY2ggbWVhbnMgdGhhdCBvbmx5IHRoZSB2ZW5kb3IgaGFzIEFCIHBhcnRpdGlvbnMuCisKICAgVGhlIGZvbGxvd2luZyBvbmx5IGFwcGx5IHdoZW4gdXNpbmcgdGhlIFZTREsgdG8gcGVyZm9ybSBkZXhvcHQgb24gdmVuZG9yIGFwcHM6CiAKICAgLS1mcmFtZXdvcmstZGV4cHJlb3B0LWNvbmZpZwpAQCAtMTMyLDYgKzE0NCw3IEBACiBPUFRJT05TLmZyYW1ld29ya19taXNjX2luZm9fa2V5cyA9IFtdCiBPUFRJT05TLnZlbmRvcl90YXJnZXRfZmlsZXMgPSBOb25lCiBPUFRJT05TLnZlbmRvcl9pdGVtX2xpc3QgPSBbXQorT1BUSU9OUy5ib290X2ltYWdlX2Rpcl9wYXRoID0gTm9uZQogT1BUSU9OUy5vdXRwdXRfdGFyZ2V0X2ZpbGVzID0gTm9uZQogT1BUSU9OUy5vdXRwdXRfZGlyID0gTm9uZQogT1BUSU9OUy5vdXRwdXRfaXRlbV9saXN0ID0gW10KQEAgLTE0NCw2ICsxNTcsOCBAQAogT1BUSU9OUy52ZW5kb3Jfb3RhdG9vbHMgPSBOb25lCiBPUFRJT05TLnJlYnVpbGRfc2Vwb2xpY3kgPSBGYWxzZQogT1BUSU9OUy5rZWVwX3RtcCA9IEZhbHNlCitPUFRJT05TLmF2Yl9yZXNvbHZlX3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uX2NvbmZsaWN0ID0gRmFsc2UKK09QVElPTlMuYWxsb3dfcGFydGlhbF9hYiA9IEZhbHNlCiBPUFRJT05TLmZyYW1ld29ya19kZXhwcmVvcHRfY29uZmlnID0gTm9uZQogT1BUSU9OUy5mcmFtZXdvcmtfZGV4cHJlb3B0X3Rvb2xzID0gTm9uZQogT1BUSU9OUy52ZW5kb3JfZGV4cHJlb3B0X2NvbmZpZyA9IE5vbmUKQEAgLTE2NSwxNyArMTgwLDI0IEBACiAgICAgcGFzcwogCiAKLWRlZiBpbmNsdWRlX21ldGFfaW5fbGlzdChpdGVtX2xpc3QpOgotICAiIiJJbmNsdWRlIGFsbCBgTUVUQS8qYCBmaWxlcyBpbiB0aGUgaXRlbSBsaXN0LgorZGVmIGluY2x1ZGVfZXh0cmFfaW5fbGlzdChpdGVtX2xpc3QpOgorICAiIiIKKyAgMS4gSW5jbHVkZSBhbGwgYE1FVEEvKmAgZmlsZXMgaW4gdGhlIGl0ZW0gbGlzdC4KIAogICBUbyBlbnN1cmUgdGhhdCBgQWRkSW1hZ2VzVG9UYXJnZXRGaWxlc2AgY2FuIHN0aWxsIGJlIHVzZWQgd2l0aCB2ZW5kb3IgaXRlbQogICBsaXN0IHRoYXQgZG8gbm90IHNwZWNpZnkgYWxsIG9mIHRoZSByZXF1aXJlZCBNRVRBLyBmaWxlcywgdGhvc2UgZmlsZXMgc2hvdWxkCiAgIGJlIGluY2x1ZGVkIGJ5IGRlZmF1bHQuIFRoaXMgcHJlc2VydmVzIHRoZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9mCiAgIGByZWJ1aWxkX2ltYWdlX3dpdGhfc2Vwb2xpY3lgLgorCisgIDIuIEluY2x1ZGUgYFNZU1RFTS9idWlsZC5wcm9wYCBmaWxlIGluIHRoZSBpdGVtIGxpc3QuCisKKyAgVG8gZW5zdXJlIHRoYXQgYEFkZEltYWdlc1RvVGFyZ2V0RmlsZXNgIGZvciBHUkYgdmVuZG9yIGltYWdlcywgY2FuIHN0aWxsCisgIGFjY2VzcyBTWVNURU0vYnVpbGQucHJvcCB0byBwYXNzIEdldFBhcnRpdGlvbkZpbmdlcnByaW50IGNoZWNrIGluIEJ1aWxkSW5mbworICBjb25zdHJ1Y3Rvci4KICAgIiIiCiAgIGlmIG5vdCBpdGVtX2xpc3Q6CiAgICAgcmV0dXJuIE5vbmUKLSAgcmV0dXJuIGxpc3QoaXRlbV9saXN0KSArIFsnTUVUQS8qJ10KKyAgcmV0dXJuIGxpc3QoaXRlbV9saXN0KSArIFsnTUVUQS8qJ10gKyBbJ1NZU1RFTS9idWlsZC5wcm9wJ10KIAogCiBkZWYgY3JlYXRlX21lcmdlZF9wYWNrYWdlKHRlbXBfZGlyKToKQEAgLTE5OCwxMSArMjIwLDE5IEBACiAgICAgICBvdXRwdXRfZGlyPW91dHB1dF90YXJnZXRfZmlsZXNfdGVtcF9kaXIsCiAgICAgICBpdGVtX2xpc3Q9T1BUSU9OUy52ZW5kb3JfaXRlbV9saXN0KQogCisgIGlmIE9QVElPTlMuYm9vdF9pbWFnZV9kaXJfcGF0aDoKKyAgICBtZXJnZV91dGlscy5Db2xsZWN0VGFyZ2V0RmlsZXMoCisgICAgICAgIGlucHV0X3ppcGZpbGVfb3JfZGlyPU9QVElPTlMuYm9vdF9pbWFnZV9kaXJfcGF0aCwKKyAgICAgICAgb3V0cHV0X2Rpcj1vdXRwdXRfdGFyZ2V0X2ZpbGVzX3RlbXBfZGlyLAorICAgICAgICBpdGVtX2xpc3Q9WydJTUFHRVMvYm9vdC5pbWcnXSkKKwogICAjIFBlcmZvcm0gc3BlY2lhbCBjYXNlIHByb2Nlc3Npbmcgb24gTUVUQS8qIGl0ZW1zLgogICAjIEFmdGVyIHRoaXMgZnVuY3Rpb24gY29tcGxldGVzIHN1Y2Nlc3NmdWxseSwgYWxsIHRoZSBmaWxlcyB3ZSBuZWVkIHRvIGNyZWF0ZQogICAjIHRoZSBvdXRwdXQgdGFyZ2V0IGZpbGVzIHBhY2thZ2UgYXJlIGluIHBsYWNlLgogICBtZXJnZV9tZXRhLk1lcmdlTWV0YUZpbGVzKAotICAgICAgdGVtcF9kaXI9dGVtcF9kaXIsIG1lcmdlZF9kaXI9b3V0cHV0X3RhcmdldF9maWxlc190ZW1wX2RpcikKKyAgICAgIHRlbXBfZGlyPXRlbXBfZGlyLAorICAgICAgbWVyZ2VkX2Rpcj1vdXRwdXRfdGFyZ2V0X2ZpbGVzX3RlbXBfZGlyLAorICAgICAgZnJhbWV3b3JrX3BhcnRpdGlvbnM9T1BUSU9OUy5mcmFtZXdvcmtfcGFydGl0aW9uX3NldCkKIAogICBtZXJnZV9kZXhvcHQuTWVyZ2VEZXhvcHQoCiAgICAgICB0ZW1wX2Rpcj10ZW1wX2Rpciwgb3V0cHV0X3RhcmdldF9maWxlc19kaXI9b3V0cHV0X3RhcmdldF9maWxlc190ZW1wX2RpcikKQEAgLTIyMSw2ICsyNTEsOCBAQAogICBdCiAgIGlmIE9QVElPTlMucmVidWlsZF9yZWNvdmVyeToKICAgICBhZGRfaW1nX2FyZ3MuYXBwZW5kKCctLXJlYnVpbGRfcmVjb3ZlcnknKQorICBpZiBPUFRJT05TLmF2Yl9yZXNvbHZlX3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uX2NvbmZsaWN0OgorICAgIGFkZF9pbWdfYXJncy5hcHBlbmQoJy0tYXZiX3Jlc29sdmVfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb25fY29uZmxpY3QnKQogICBhZGRfaW1nX2FyZ3MuYXBwZW5kKHRhcmdldF9maWxlc19kaXIpCiAKICAgYWRkX2ltZ190b190YXJnZXRfZmlsZXMubWFpbihhZGRfaW1nX2FyZ3MpCkBAIC0yODksNyArMzIxLDcgQEAKICAgbWVyZ2VfdXRpbHMuQ29sbGVjdFRhcmdldEZpbGVzKAogICAgICAgaW5wdXRfemlwZmlsZV9vcl9kaXI9T1BUSU9OUy52ZW5kb3JfdGFyZ2V0X2ZpbGVzLAogICAgICAgb3V0cHV0X2Rpcj12ZW5kb3JfdGFyZ2V0X2ZpbGVzX2RpciwKLSAgICAgIGl0ZW1fbGlzdD1pbmNsdWRlX21ldGFfaW5fbGlzdChPUFRJT05TLnZlbmRvcl9pdGVtX2xpc3QpKQorICAgICAgaXRlbV9saXN0PWluY2x1ZGVfZXh0cmFfaW5fbGlzdChPUFRJT05TLnZlbmRvcl9pdGVtX2xpc3QpKQogCiAgICMgQ29weSB0aGUgcGFydGl0aW9uIGNvbnRlbnRzIGZyb20gdGhlIG1lcmdlZCB0YXJnZXQtZmlsZXMgYXJjaGl2ZSB0byB0aGUKICAgIyB2ZW5kb3IgdGFyZ2V0LWZpbGVzIGFyY2hpdmUuCkBAIC01MjMsNiArNTU1LDggQEAKICAgICAgIE9QVElPTlMudmVuZG9yX2l0ZW1fbGlzdCA9IGEKICAgICBlbGlmIG8gPT0gJy0tdmVuZG9yLWl0ZW0tbGlzdCc6CiAgICAgICBPUFRJT05TLnZlbmRvcl9pdGVtX2xpc3QgPSBhCisgICAgZWxpZiBvID09ICctLWJvb3QtaW1hZ2UtZGlyLXBhdGgnOgorICAgICAgT1BUSU9OUy5ib290X2ltYWdlX2Rpcl9wYXRoID0gYQogICAgIGVsaWYgbyA9PSAnLS1vdXRwdXQtdGFyZ2V0LWZpbGVzJzoKICAgICAgIE9QVElPTlMub3V0cHV0X3RhcmdldF9maWxlcyA9IGEKICAgICBlbGlmIG8gPT0gJy0tb3V0cHV0LWRpcic6CkBAIC01NDUsNiArNTc5LDEwIEBACiAgICAgICBPUFRJT05TLnJlYnVpbGRfc2Vwb2xpY3kgPSBUcnVlCiAgICAgZWxpZiBvID09ICctLWtlZXAtdG1wJzoKICAgICAgIE9QVElPTlMua2VlcF90bXAgPSBUcnVlCisgICAgZWxpZiBvID09ICctLWF2Yi1yZXNvbHZlLXJvbGxiYWNrLWluZGV4LWxvY2F0aW9uLWNvbmZsaWN0JzoKKyAgICAgIE9QVElPTlMuYXZiX3Jlc29sdmVfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb25fY29uZmxpY3QgPSBUcnVlCisgICAgZWxpZiBvID09ICctLWFsbG93LXBhcnRpYWwtYWInOgorICAgICAgT1BUSU9OUy5hbGxvd19wYXJ0aWFsX2FiID0gVHJ1ZQogICAgIGVsaWYgbyA9PSAnLS1mcmFtZXdvcmstZGV4cHJlb3B0LWNvbmZpZyc6CiAgICAgICBPUFRJT05TLmZyYW1ld29ya19kZXhwcmVvcHRfY29uZmlnID0gYQogICAgIGVsaWYgbyA9PSAnLS1mcmFtZXdvcmstZGV4cHJlb3B0LXRvb2xzJzoKQEAgLTU2OSw2ICs2MDcsNyBAQAogICAgICAgICAgICd2ZW5kb3ItdGFyZ2V0LWZpbGVzPScsCiAgICAgICAgICAgJ290aGVyLWl0ZW0tbGlzdD0nLAogICAgICAgICAgICd2ZW5kb3ItaXRlbS1saXN0PScsCisgICAgICAgICAgJ2Jvb3QtaW1hZ2UtZGlyLXBhdGg9JywKICAgICAgICAgICAnb3V0cHV0LXRhcmdldC1maWxlcz0nLAogICAgICAgICAgICdvdXRwdXQtZGlyPScsCiAgICAgICAgICAgJ291dHB1dC1pdGVtLWxpc3Q9JywKQEAgLTU4NCw2ICs2MjMsOCBAQAogICAgICAgICAgICd2ZW5kb3Itb3RhdG9vbHM9JywKICAgICAgICAgICAncmVidWlsZC1zZXBvbGljeScsCiAgICAgICAgICAgJ2tlZXAtdG1wJywKKyAgICAgICAgICAnYXZiLXJlc29sdmUtcm9sbGJhY2staW5kZXgtbG9jYXRpb24tY29uZmxpY3QnLAorICAgICAgICAgICdhbGxvdy1wYXJ0aWFsLWFiJywKICAgICAgIF0sCiAgICAgICBleHRyYV9vcHRpb25faGFuZGxlcj1vcHRpb25faGFuZGxlcikKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlL21lcmdlX3V0aWxzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlL21lcmdlX3V0aWxzLnB5CmluZGV4IGI1NjgzYTguLmQ0NDZmYzAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9tZXJnZS9tZXJnZV91dGlscy5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvbWVyZ2UvbWVyZ2VfdXRpbHMucHkKQEAgLTIxNyw3ICsyMTcsNyBAQAogCiAjIFBhcnRpdGlvbnMgdGhhdCBhcmUgZ3JhYmJlZCBmcm9tIHRoZSBmcmFtZXdvcmsgcGFydGlhbCBidWlsZCBieSBkZWZhdWx0LgogX0ZSQU1FV09SS19QQVJUSVRJT05TID0gewotICAgICdzeXN0ZW0nLCAncHJvZHVjdCcsICdzeXN0ZW1fZXh0JywgJ3N5c3RlbV9vdGhlcicsICdyb290JywgJ3N5c3RlbV9kbGttJywKKyAgICAnc3lzdGVtJywgJ3Byb2R1Y3QnLCAnc3lzdGVtX2V4dCcsICdzeXN0ZW1fb3RoZXInLCAncm9vdCcsCiAgICAgJ3ZibWV0YV9zeXN0ZW0nLCAncHZtZncnCiB9CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9tZXJnZV9vdGEucHkgYi90b29scy9yZWxlYXNldG9vbHMvbWVyZ2Vfb3RhLnB5CmluZGV4IDQ0MTMxMmMuLmU4NzMyYTIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9tZXJnZV9vdGEucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlX290YS5weQpAQCAtMTQsNyArMTQsNiBAQAogCiBpbXBvcnQgYXJncGFyc2UKIGltcG9ydCBsb2dnaW5nCi1pbXBvcnQgc2hsZXgKIGltcG9ydCBzdHJ1Y3QKIGltcG9ydCBzeXMKIGltcG9ydCB1cGRhdGVfcGF5bG9hZApAQCAtMzEsNiArMzAsNyBAQAogCiBmcm9tIHBheWxvYWRfc2lnbmVyIGltcG9ydCBQYXlsb2FkU2lnbmVyCiBmcm9tIG90YV91dGlscyBpbXBvcnQgUGF5bG9hZEdlbmVyYXRvciwgTUVUQURBVEFfUFJPVE9fTkFNRSwgRmluYWxpemVNZXRhZGF0YQorZnJvbSBvdGFfc2lnbmluZ191dGlscyBpbXBvcnQgQWRkU2lnbmluZ0FyZ3VtZW50UGFyc2UKIAogbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCiAKQEAgLTEyNiw3ICsxMjYsNyBAQAogICAgIEV4dGVuZFBhcnRpdGlvblVwZGF0ZXMob3V0cHV0X21hbmlmZXN0LnBhcnRpdGlvbnMsIG1hbmlmZXN0LnBhcnRpdGlvbnMpCiAgICAgdHJ5OgogICAgICAgTWVyZ2VEeW5hbWljUGFydGl0aW9uTWV0YWRhdGEoCi0gICAgICAgIG91dHB1dF9tYW5pZmVzdC5keW5hbWljX3BhcnRpdGlvbl9tZXRhZGF0YSwgbWFuaWZlc3QuZHluYW1pY19wYXJ0aXRpb25fbWV0YWRhdGEpCisgICAgICAgICAgb3V0cHV0X21hbmlmZXN0LmR5bmFtaWNfcGFydGl0aW9uX21ldGFkYXRhLCBtYW5pZmVzdC5keW5hbWljX3BhcnRpdGlvbl9tZXRhZGF0YSkKICAgICBleGNlcHQgRHVwbGljYXRlUGFydGl0aW9uRXJyb3I6CiAgICAgICBsb2dnZXIuZXJyb3IoCiAgICAgICAgICAgIk9UQSAlcyBoYXMgZHVwbGljYXRlIHBhcnRpdGlvbiB3aXRoIHNvbWUgb2YgdGhlIHByZXZpb3VzIE9UQXMiLCBwYXlsb2FkLm5hbWUpCkBAIC0xOTAsNiArMTkwLDcgQEAKICAgICAgICAgICAgICAgZiJPVEEge3BhcnRpdGlvbl90b19vdGFbcGFydF0ubmFtZX0gYW5kIHtwYXlsb2FkLm5hbWV9IGhhdmUgZHVwbGljYXRpbmcgcGFydGl0aW9uIHtwYXJ0fSIpCiAgICAgICAgIHBhcnRpdGlvbl90b19vdGFbcGFydF0gPSBwYXlsb2FkCiAKKwogZGVmIEFwZXhJbmZvKGZpbGVfcGF0aHMpOgogICBpZiBsZW4oZmlsZV9wYXRocykgPiAxOgogICAgIGxvZ2dlci5pbmZvKCJNb3JlIHRoYW4gb25lIHRhcmdldCBmaWxlIHNwZWNpZmllZCwgd2lsbCBpZ25vcmUgIgpAQCAtMjAxLDMzICsyMDIsMTkgQEAKICAgICAgIHJldHVybiBhcGV4X2luZm9fYnl0ZXMKICAgcmV0dXJuIE5vbmUKIAotZGVmIFBhcnNlU2lnbmVyQXJncyhhcmdzKToKLSAgaWYgYXJncyBpcyBOb25lOgotICAgIHJldHVybiBOb25lCi0gIHJldHVybiBzaGxleC5zcGxpdChhcmdzKQogCiBkZWYgbWFpbihhcmd2KToKICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249J01lcmdlIG11bHRpcGxlIHBhcnRpYWwgT1RBcycpCiAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ3BhY2thZ2VzJywgdHlwZT1zdHIsIG5hcmdzPScrJywKICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdQYXRocyB0byBPVEEgcGFja2FnZXMgdG8gbWVyZ2UnKQotICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXBhY2thZ2Vfa2V5JywgdHlwZT1zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgaGVscD0nUGF0aHMgdG8gcHJpdmF0ZSBrZXkgZm9yIHNpZ25pbmcgcGF5bG9hZCcpCi0gIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tc2VhcmNoX3BhdGgnLCB0eXBlPXN0ciwKLSAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdTZWFyY2ggcGF0aCBmb3IgZnJhbWV3b3JrL3NpZ25hcGsuamFyJykKLSAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1wYXlsb2FkX3NpZ25lcicsIHR5cGU9c3RyLAotICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1BhdGggdG8gY3VzdG9tIHBheWxvYWQgc2lnbmVyJykKLSAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1wYXlsb2FkX3NpZ25lcl9hcmdzJywgdHlwZT1QYXJzZVNpZ25lckFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgaGVscD0nQXJndW1lbnRzIGZvciBwYXlsb2FkIHNpZ25lciBpZiBuZWNlc3NhcnknKQotICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXBheWxvYWRfc2lnbmVyX21heGltdW1fc2lnbmF0dXJlX3NpemUnLCB0eXBlPXN0ciwKLSAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdNYXhpbXVtIHNpZ25hdHVyZSBzaXplIChpbiBieXRlcykgdGhhdCB3b3VsZCBiZSAnCi0gICAgICAgICAgICAgICAgICAgICAgJ2dlbmVyYXRlZCBieSB0aGUgZ2l2ZW4gcGF5bG9hZCBzaWduZXInKQogICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLW91dHB1dCcsIHR5cGU9c3RyLAogICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1BhdGhzIHRvIG91dHB1dCBtZXJnZWQgb3RhJywgcmVxdWlyZWQ9VHJ1ZSkKICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1tZXRhZGF0YV9vdGEnLCB0eXBlPXN0ciwKICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdPdXRwdXQgemlwIHdpbGwgdXNlIGJ1aWxkIG1ldGFkYXRhIGZyb20gdGhpcyBPVEEgcGFja2FnZSwgaWYgdW5zcGVjaWZpZWQsIHVzZSB0aGUgbGFzdCBPVEEgcGFja2FnZSBpbiBtZXJnZSBsaXN0JykKLSAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1wcml2YXRlX2tleV9zdWZmaXgnLCB0eXBlPXN0ciwKLSAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdTdWZmaXggdG8gYmUgYXBwZW5kZWQgdG8gcGFja2FnZV9rZXkgcGF0aCcsIGRlZmF1bHQ9Ii5wazgiKQotICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctdicsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGhlbHA9IkVuYWJsZSB2ZXJib3NlIGxvZ2dpbmciLCBkZXN0PSJ2ZXJib3NlIikKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXYnLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkVuYWJsZSB2ZXJib3NlIGxvZ2dpbmciLCBkZXN0PSJ2ZXJib3NlIikKKyAgQWRkU2lnbmluZ0FyZ3VtZW50UGFyc2UocGFyc2VyKQorCiAgIHBhcnNlci5lcGlsb2cgPSAoJ1RoaXMgdG9vbCBjYW4gYWxzbyBiZSB1c2VkIHRvIHJlc2lnbiBhIHJlZ3VsYXIgT1RBLiBGb3IgYSBzaW5nbGUgcmVndWxhciBPVEEsICcKICAgICAgICAgICAgICAgICAgICAnYXBleF9pbmZvLnBiIHdpbGwgYmUgd3JpdHRlbiB0byBvdXRwdXQuIFdoZW4gbWVyZ2luZyBtdWx0aXBsZSBPVEFzLCAnCiAgICAgICAgICAgICAgICAgICAgJ2FwZXhfaW5mby5wYiB3aWxsIG5vdCBiZSB3cml0dGVuLicpCkBAIC0yMzksOSArMjI2LDIxIEBACiAgICAgbG9nZ2VyLnNldExldmVsKGxvZ2dpbmcuSU5GTykKIAogICBsb2dnZXIuaW5mbyhhcmdzKQorICBpZiBhcmdzLmphdmFfcGF0aDoKKyAgICBjb21tb24uT1BUSU9OUy5qYXZhX3BhdGggPSBhcmdzLmphdmFfcGF0aAorCiAgIGlmIGFyZ3Muc2VhcmNoX3BhdGg6CiAgICAgY29tbW9uLk9QVElPTlMuc2VhcmNoX3BhdGggPSBhcmdzLnNlYXJjaF9wYXRoCiAKKyAgaWYgYXJncy5zaWduYXBrX3BhdGg6CisgICAgY29tbW9uLk9QVElPTlMuc2lnbmFwa19wYXRoID0gYXJncy5zaWduYXBrX3BhdGgKKworICBpZiBhcmdzLmV4dHJhX3NpZ25hcGtfYXJnczoKKyAgICBjb21tb24uT1BUSU9OUy5leHRyYV9zaWduYXBrX2FyZ3MgPSBhcmdzLmV4dHJhX3NpZ25hcGtfYXJncworCisgIGlmIGFyZ3Muc2lnbmFwa19zaGFyZWRfbGlicmFyeV9wYXRoOgorICAgIGNvbW1vbi5PUFRJT05TLnNpZ25hcGtfc2hhcmVkX2xpYnJhcnlfcGF0aCA9IGFyZ3Muc2lnbmFwa19zaGFyZWRfbGlicmFyeV9wYXRoCisKICAgbWV0YWRhdGFfb3RhID0gYXJncy5wYWNrYWdlc1stMV0KICAgaWYgYXJncy5tZXRhZGF0YV9vdGEgaXMgbm90IE5vbmU6CiAgICAgbWV0YWRhdGFfb3RhID0gYXJncy5tZXRhZGF0YV9vdGEKQEAgLTI1Niw4ICsyNTUsNiBAQAogICAjIEdldCBzaWduaW5nIGtleXMKICAga2V5X3Bhc3N3b3JkcyA9IGNvbW1vbi5HZXRLZXlQYXNzd29yZHMoW2FyZ3MucGFja2FnZV9rZXldKQogCi0gIGdlbmVyYXRvciA9IFBheWxvYWRHZW5lcmF0b3IoKQotCiAgIGFwZXhfaW5mb19ieXRlcyA9IEFwZXhJbmZvKGZpbGVfcGF0aHMpCiAKICAgd2l0aCB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoKSBhcyB1bnNpZ25lZF9wYXlsb2FkOgpAQCAtMzAxLDggKzI5OCw2IEBACiAgIHJldHVybiAwCiAKIAotCi0KIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgIGxvZ2dpbmcuYmFzaWNDb25maWcoKQogICBzeXMuZXhpdChtYWluKHN5cy5hcmd2KSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9ub25fYWJfb3RhLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL25vbl9hYl9vdGEucHkKaW5kZXggYzRmZDgwOS4uNjY3ODkxYyAxMDA2NDQKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL25vbl9hYl9vdGEucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL25vbl9hYl9vdGEucHkKQEAgLTIzLDYgKzIzLDcgQEAKIGZyb20gY2hlY2tfdGFyZ2V0X2ZpbGVzX3ZpbnRmIGltcG9ydCBDaGVja1ZpbnRmSWZUcmVibGVFbmFibGVkLCBIYXNQYXJ0aXRpb24KIGZyb20gY29tbW9uIGltcG9ydCBPUFRJT05TCiBmcm9tIG90YV91dGlscyBpbXBvcnQgVU5aSVBfUEFUVEVSTiwgRmluYWxpemVNZXRhZGF0YSwgR2V0UGFja2FnZU1ldGFkYXRhLCBQcm9wZXJ0eUZpbGVzCitpbXBvcnQgc3VicHJvY2VzcwogCiBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKIApAQCAtMjc3LDcgKzI3OCw4IEBACiAgIG5lZWRlZF9wcm9wZXJ0eV9maWxlcyA9ICgKICAgICAgIE5vbkFiT3RhUHJvcGVydHlGaWxlcygpLAogICApCi0gIEZpbmFsaXplTWV0YWRhdGEobWV0YWRhdGEsIHN0YWdpbmdfZmlsZSwgb3V0cHV0X2ZpbGUsIG5lZWRlZF9wcm9wZXJ0eV9maWxlcywgcGFja2FnZV9rZXk9T1BUSU9OUy5wYWNrYWdlX2tleSkKKyAgRmluYWxpemVNZXRhZGF0YShtZXRhZGF0YSwgc3RhZ2luZ19maWxlLCBvdXRwdXRfZmlsZSwKKyAgICAgICAgICAgICAgICAgICBuZWVkZWRfcHJvcGVydHlfZmlsZXMsIHBhY2thZ2Vfa2V5PU9QVElPTlMucGFja2FnZV9rZXkpCiAKIAogZGVmIFdyaXRlQmxvY2tJbmNyZW1lbnRhbE9UQVBhY2thZ2UodGFyZ2V0X3ppcCwgc291cmNlX3ppcCwgb3V0cHV0X2ZpbGUpOgpAQCAtNTMyLDcgKzUzNCw4IEBACiAgIG5lZWRlZF9wcm9wZXJ0eV9maWxlcyA9ICgKICAgICAgIE5vbkFiT3RhUHJvcGVydHlGaWxlcygpLAogICApCi0gIEZpbmFsaXplTWV0YWRhdGEobWV0YWRhdGEsIHN0YWdpbmdfZmlsZSwgb3V0cHV0X2ZpbGUsIG5lZWRlZF9wcm9wZXJ0eV9maWxlcywgcGFja2FnZV9rZXk9T1BUSU9OUy5wYWNrYWdlX2tleSkKKyAgRmluYWxpemVNZXRhZGF0YShtZXRhZGF0YSwgc3RhZ2luZ19maWxlLCBvdXRwdXRfZmlsZSwKKyAgICAgICAgICAgICAgICAgICBuZWVkZWRfcHJvcGVydHlfZmlsZXMsIHBhY2thZ2Vfa2V5PU9QVElPTlMucGFja2FnZV9rZXkpCiAKIAogZGVmIEdlbmVyYXRlTm9uQWJPdGFQYWNrYWdlKHRhcmdldF9maWxlLCBvdXRwdXRfZmlsZSwgc291cmNlX2ZpbGU9Tm9uZSk6CkBAIC01NTUsOCArNTU4LDE4IEBACiAgIGlmIE9QVElPTlMuZXh0cmFjdGVkX2lucHV0IGlzIG5vdCBOb25lOgogICAgIE9QVElPTlMuaW5wdXRfdG1wID0gT1BUSU9OUy5leHRyYWN0ZWRfaW5wdXQKICAgZWxzZToKLSAgICBsb2dnZXIuaW5mbygidW56aXBwaW5nIHRhcmdldCB0YXJnZXQtZmlsZXMuLi4iKQotICAgIE9QVElPTlMuaW5wdXRfdG1wID0gY29tbW9uLlVuemlwVGVtcCh0YXJnZXRfZmlsZSwgVU5aSVBfUEFUVEVSTikKKyAgICBpZiBub3Qgb3MucGF0aC5pc2Rpcih0YXJnZXRfZmlsZSk6CisgICAgICBsb2dnZXIuaW5mbygidW56aXBwaW5nIHRhcmdldCB0YXJnZXQtZmlsZXMuLi4iKQorICAgICAgT1BUSU9OUy5pbnB1dF90bXAgPSBjb21tb24uVW56aXBUZW1wKHRhcmdldF9maWxlLCBVTlpJUF9QQVRURVJOKQorICAgIGVsc2U6CisgICAgICBPUFRJT05TLmlucHV0X3RtcCA9IHRhcmdldF9maWxlCisgICAgICB0bXBmaWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShzdWZmaXg9Ii56aXAiKQorICAgICAgb3MudW5saW5rKHRtcGZpbGUpCisgICAgICBjb21tb24uUnVuQW5kQ2hlY2tPdXRwdXQoCisgICAgICAgICAgWyJ6aXAiLCB0bXBmaWxlLCAiLXIiLCAiLiIsICItMCJdLCBjd2Q9dGFyZ2V0X2ZpbGUpCisgICAgICBhc3NlcnQgemlwZmlsZS5pc196aXBmaWxlKHRtcGZpbGUpCisgICAgICB0YXJnZXRfZmlsZSA9IHRtcGZpbGUKKwogICBPUFRJT05TLnRhcmdldF90bXAgPSBPUFRJT05TLmlucHV0X3RtcAogCiAgICMgSWYgdGhlIGNhbGxlciBleHBsaWNpdGx5IHNwZWNpZmllZCB0aGUgZGV2aWNlLXNwZWNpZmljIGV4dGVuc2lvbnMgcGF0aCB2aWEKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9vdGFfZnJvbV9yYXdfaW1nLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL290YV9mcm9tX3Jhd19pbWcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I5Mzc0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9vdGFfZnJvbV9yYXdfaW1nLnB5CkBAIC0wLDAgKzEsMTI1IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyIiIgorR2l2ZW4gYSBzZXJpZXMgb2YgLmltZyBmaWxlcywgcHJvZHVjZXMgYW4gT1RBIHBhY2thZ2UgdGhhdCBpbnN0YWxscyB0aG9lc2UgaW1hZ2VzCisiIiIKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgemlwZmlsZQorCitpbXBvcnQgY29tbW9uCitmcm9tIHBheWxvYWRfc2lnbmVyIGltcG9ydCBQYXlsb2FkU2lnbmVyCitmcm9tIG90YV91dGlscyBpbXBvcnQgUGF5bG9hZEdlbmVyYXRvcgorZnJvbSBvdGFfc2lnbmluZ191dGlscyBpbXBvcnQgQWRkU2lnbmluZ0FyZ3VtZW50UGFyc2UKKworCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKKworCitkZWYgUmVzb2x2ZUJpbmFyeVBhdGgoZmlsZW5hbWUsIHNlYXJjaF9wYXRoKToKKyAgaWYgbm90IHNlYXJjaF9wYXRoOgorICAgIHJldHVybiBmaWxlbmFtZQorICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VhcmNoX3BhdGgpOgorICAgIHJldHVybiBmaWxlbmFtZQorICBwYXRoID0gb3MucGF0aC5qb2luKHNlYXJjaF9wYXRoLCAiYmluIiwgZmlsZW5hbWUpCisgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgorICAgIHJldHVybiBwYXRoCisgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VhcmNoX3BhdGgsIGZpbGVuYW1lKQorICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICByZXR1cm4gcGF0aAorICByZXR1cm4gcGF0aAorCisKK2RlZiBtYWluKGFyZ3YpOgorICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigKKyAgICAgIHByb2c9YXJndlswXSwgZGVzY3JpcHRpb249IkdpdmVuIGEgc2VyaWVzIG9mIC5pbWcgZmlsZXMsIHByb2R1Y2VzIGEgZnVsbCBPVEEgcGFja2FnZSB0aGF0IGluc3RhbGxzIHRob2VzZSBpbWFnZXMiKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCJpbWFnZXMiLCBuYXJncz0iKyIsIHR5cGU9c3RyLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Ikxpc3Qgb2YgaW1hZ2VzIHRvIGdlbmVyYXRlIE9UQSIpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tcGFydGl0aW9uX25hbWVzIiwgbmFyZ3M9Jz8nLCB0eXBlPXN0ciwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJQYXJ0aXRpb24gbmFtZXMgdG8gaW5zdGFsbCB0aGUgaW1hZ2VzLCBkZWZhdWx0IHRvIGJhc2VuYW1lIG9mIHRoZSBpbWFnZShubyBmaWxlIG5hbWUgZXh0ZW5zaW9uKSIpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tb3V0cHV0JywgdHlwZT1zdHIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0nUGF0aHMgdG8gb3V0cHV0IG1lcmdlZCBvdGEnLCByZXF1aXJlZD1UcnVlKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLW1heF90aW1lc3RhbXAnLCB0eXBlPWludCwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdNYXhpbXVtIGJ1aWxkIHRpbWVzdGFtcCBhbGxvd2VkIHRvIGluc3RhbGwgdGhpcyBPVEEnKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItdiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iRW5hYmxlIHZlcmJvc2UgbG9nZ2luZyIsIGRlc3Q9InZlcmJvc2UiKQorICBBZGRTaWduaW5nQXJndW1lbnRQYXJzZShwYXJzZXIpCisKKyAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3ZbMTpdKQorICBpZiBhcmdzLnZlcmJvc2U6CisgICAgbG9nZ2VyLnNldExldmVsKGxvZ2dpbmcuSU5GTykKKyAgbG9nZ2VyLmluZm8oYXJncykKKyAgb2xkX2ltZ3MgPSBbIiJdICogbGVuKGFyZ3MuaW1hZ2VzKQorICBmb3IgKGksIGltZykgaW4gZW51bWVyYXRlKGFyZ3MuaW1hZ2VzKToKKyAgICBpZiAiOiIgaW4gaW1nOgorICAgICAgb2xkX2ltZ3NbaV0sIGFyZ3MuaW1hZ2VzW2ldID0gaW1nLnNwbGl0KCI6IiwgbWF4c3BsaXQ9MSkKKworICBpZiBub3QgYXJncy5wYXJ0aXRpb25fbmFtZXM6CisgICAgYXJncy5wYXJ0aXRpb25fbmFtZXMgPSBbb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKHBhdGgpKVsKKyAgICAgICAgMF0gZm9yIHBhdGggaW4gYXJncy5pbWFnZXNdCisgIGVsc2U6CisgICAgYXJncy5wYXJ0aXRpb25fbmFtZXMgPSBhcmdzLnBhcnRpdGlvbl9uYW1lcy5zcGxpdCgiLCIpCisgIHdpdGggdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkgYXMgdW5zaWduZWRfcGF5bG9hZCwgdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkgYXMgZHluYW1pY19wYXJ0aXRpb25faW5mb19maWxlOgorICAgIGR5bmFtaWNfcGFydGl0aW9uX2luZm9fZmlsZS53cml0ZWxpbmVzKAorICAgICAgICBbYiJ2aXJ0dWFsX2FiPXRydWVcbiIsIGIic3VwZXJfcGFydGl0aW9uX2dyb3Vwcz1cbiJdKQorICAgIGR5bmFtaWNfcGFydGl0aW9uX2luZm9fZmlsZS5mbHVzaCgpCisgICAgY21kID0gW1Jlc29sdmVCaW5hcnlQYXRoKCJkZWx0YV9nZW5lcmF0b3IiLCBhcmdzLnNlYXJjaF9wYXRoKV0KKyAgICBjbWQuYXBwZW5kKCItLXBhcnRpdGlvbl9uYW1lcz0iICsgIjoiLmpvaW4oYXJncy5wYXJ0aXRpb25fbmFtZXMpKQorICAgIGNtZC5hcHBlbmQoIi0tZHluYW1pY19wYXJ0aXRpb25faW5mb19maWxlPSIgKworICAgICAgICAgICAgICAgZHluYW1pY19wYXJ0aXRpb25faW5mb19maWxlLm5hbWUpCisgICAgY21kLmFwcGVuZCgiLS1vbGRfcGFydGl0aW9ucz0iICsgIjoiLmpvaW4ob2xkX2ltZ3MpKQorICAgIGNtZC5hcHBlbmQoIi0tbmV3X3BhcnRpdGlvbnM9IiArICI6Ii5qb2luKGFyZ3MuaW1hZ2VzKSkKKyAgICBjbWQuYXBwZW5kKCItLW91dF9maWxlPSIgKyB1bnNpZ25lZF9wYXlsb2FkLm5hbWUpCisgICAgY21kLmFwcGVuZCgiLS1pc19wYXJ0aWFsX3VwZGF0ZSIpCisgICAgaWYgYXJncy5tYXhfdGltZXN0YW1wOgorICAgICAgY21kLmFwcGVuZCgiLS1tYXhfdGltZXN0YW1wPSIgKyBzdHIoYXJncy5tYXhfdGltZXN0YW1wKSkKKyAgICAgIGNtZC5hcHBlbmQoIi0tcGFydGl0aW9uX3RpbWVzdGFtcHM9Ym9vdDoiICsgc3RyKGFyZ3MubWF4X3RpbWVzdGFtcCkpCisgICAgbG9nZ2VyLmluZm8oIlJ1bm5pbmcgJXMiLCBjbWQpCisKKyAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoY21kKQorICAgIGdlbmVyYXRvciA9IFBheWxvYWRHZW5lcmF0b3IoKQorICAgIGdlbmVyYXRvci5wYXlsb2FkX2ZpbGUgPSB1bnNpZ25lZF9wYXlsb2FkLm5hbWUKKyAgICBsb2dnZXIuaW5mbygiUGF5bG9hZCBzaXplOiAlZCIsIG9zLnBhdGguZ2V0c2l6ZShnZW5lcmF0b3IucGF5bG9hZF9maWxlKSkKKworICAgICMgR2V0IHNpZ25pbmcga2V5cworICAgIGtleV9wYXNzd29yZHMgPSBjb21tb24uR2V0S2V5UGFzc3dvcmRzKFthcmdzLnBhY2thZ2Vfa2V5XSkKKworICAgIGlmIGFyZ3MucGFja2FnZV9rZXk6CisgICAgICBsb2dnZXIuaW5mbygiU2lnbmluZyBwYXlsb2FkLi4uIikKKyAgICAgIHNpZ25lciA9IFBheWxvYWRTaWduZXIoYXJncy5wYWNrYWdlX2tleSwgYXJncy5wcml2YXRlX2tleV9zdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9wYXNzd29yZHNbYXJncy5wYWNrYWdlX2tleV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfc2lnbmVyPWFyZ3MucGF5bG9hZF9zaWduZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfc2lnbmVyX2FyZ3M9YXJncy5wYXlsb2FkX3NpZ25lcl9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3NpZ25lcl9tYXhpbXVtX3NpZ25hdHVyZV9zaXplPWFyZ3MucGF5bG9hZF9zaWduZXJfbWF4aW11bV9zaWduYXR1cmVfc2l6ZSkKKyAgICAgIGdlbmVyYXRvci5wYXlsb2FkX2ZpbGUgPSB1bnNpZ25lZF9wYXlsb2FkLm5hbWUKKyAgICAgIGdlbmVyYXRvci5TaWduKHNpZ25lcikKKworICAgIGxvZ2dlci5pbmZvKCJQYXlsb2FkIHNpemU6ICVkIiwgb3MucGF0aC5nZXRzaXplKGdlbmVyYXRvci5wYXlsb2FkX2ZpbGUpKQorCisgICAgbG9nZ2VyLmluZm8oIldyaXRpbmcgdG8gJXMiLCBhcmdzLm91dHB1dCkKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShhcmdzLm91dHB1dCwgInciKSBhcyB6ZnA6CisgICAgICBnZW5lcmF0b3IuV3JpdGVUb1ppcCh6ZnApCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgbG9nZ2luZy5iYXNpY0NvbmZpZygpCisgIG1haW4oc3lzLmFyZ3YpCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvb3RhX2Zyb21fdGFyZ2V0X2ZpbGVzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL290YV9mcm9tX3RhcmdldF9maWxlcy5weQppbmRleCAxNjhjNjc5Li43NmQxNjhjIDEwMDc1NQotLS0gYS90b29scy9yZWxlYXNldG9vbHMvb3RhX2Zyb21fdGFyZ2V0X2ZpbGVzLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9vdGFfZnJvbV90YXJnZXRfZmlsZXMucHkKQEAgLTE0Nyw3ICsxNDcsNyBAQAogQS9CIE9UQSBzcGVjaWZpYyBvcHRpb25zCiAKICAgLS1kaXNhYmxlX2ZlY19jb21wdXRhdGlvbgotICAgICAgRGlzYWJsZSB0aGUgb24gZGV2aWNlIEZFQyBkYXRhIGNvbXB1dGF0aW9uIGZvciBpbmNyZW1lbnRhbCB1cGRhdGVzLgorICAgICAgRGlzYWJsZSB0aGUgb24gZGV2aWNlIEZFQyBkYXRhIGNvbXB1dGF0aW9uIGZvciBpbmNyZW1lbnRhbCB1cGRhdGVzLiBPVEEgd2lsbCBiZSBsYXJnZXIgYnV0IGluc3RhbGxhdGlvbiB3aWxsIGJlIGZhc3Rlci4KIAogICAtLWluY2x1ZGVfc2Vjb25kYXJ5CiAgICAgICBBZGRpdGlvbmFsbHkgaW5jbHVkZSB0aGUgcGF5bG9hZCBmb3Igc2Vjb25kYXJ5IHNsb3QgaW1hZ2VzIChkZWZhdWx0OgpAQCAtMTk1LDYgKzE5NSw4IEBACiAgICAgICByby5wcm9kdWN0LiogcHJvcGVydGllcyBhcmUgb3ZlcnJpZGRlbiBieSB0aGUgJ2ltcG9ydCcgc3RhdGVtZW50LgogICAgICAgVGhlIGZpbGUgZXhwZWN0cyBvbmUgcHJvcGVydHkgcGVyIGxpbmUsIGFuZCBlYWNoIGxpbmUgaGFzIHRoZSBmb2xsb3dpbmcKICAgICAgIGZvcm1hdDogJ3Byb3BfbmFtZT12YWx1ZTEsdmFsdWUyJy4gZS5nLiAncm8uYm9vdC5wcm9kdWN0LnNrdT1zdGQscHJvJworICAgICAgVGhlIHBhdGggc3BlY2lmaWVkIGNhbiBlaXRoZXIgYmUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkKKyAgICAgIG9yIHRoZSBwYXRoIHRvIGEgZmlsZSBpbnNpZGUgb2YgaW5wdXRfdGFyZ2V0X2ZpbGVzLgogCiAgIC0tc2tpcF9wb3N0aW5zdGFsbAogICAgICAgU2tpcCB0aGUgcG9zdGluc3RhbGwgaG9va3Mgd2hlbiBnZW5lcmF0aW5nIGFuIEEvQiBPVEEgcGFja2FnZSAoZGVmYXVsdDoKQEAgLTIyNCw3ICsyMjYsNyBAQAogICAgICAgd2FpdCB0aW1lIGluIHJlY292ZXJ5LgogCiAgIC0tZW5hYmxlX3ZhYmNfeG9yCi0gICAgICBFbmFibGUgdGhlIFZBQkMgeG9yIGZlYXR1cmUuIFdpbGwgcmVkdWNlIHNwYWNlIHJlcXVpcmVtZW50cyBmb3IgT1RBCisgICAgICBFbmFibGUgdGhlIFZBQkMgeG9yIGZlYXR1cmUuIFdpbGwgcmVkdWNlIHNwYWNlIHJlcXVpcmVtZW50cyBmb3IgT1RBLCBidXQgT1RBIGluc3RhbGxhdGlvbiB3aWxsIGJlIHNsb3dlci4KIAogICAtLWZvcmNlX21pbm9yX3ZlcnNpb24KICAgICAgIE92ZXJyaWRlIHRoZSB1cGRhdGVfZW5naW5lIG1pbm9yIHZlcnNpb24gZm9yIGRlbHRhIGdlbmVyYXRpb24uCkBAIC0yMzMsNyArMjM1LDEwIEBACiAgICAgICBBIGNvbG9uICc6JyBzZXBhcmF0ZWQgbGlzdCBvZiBjb21wcmVzc29ycy4gQWxsb3dlZCB2YWx1ZXMgYXJlIGJ6MiBhbmQgYnJvdGxpLgogCiAgIC0tZW5hYmxlX3p1Y2NoaW5pCi0gICAgICBXaGV0aGVyIHRvIGVuYWJsZSB0byB6dWNjaGluaSBmZWF0dXJlLiBXaWxsIGdlbmVyYXRlIHNtYWxsZXIgT1RBIGJ1dCB1c2VzIG1vcmUgbWVtb3J5LgorICAgICAgV2hldGhlciB0byBlbmFibGUgdG8genVjY2hpbmkgZmVhdHVyZS4gV2lsbCBnZW5lcmF0ZSBzbWFsbGVyIE9UQSBidXQgdXNlcyBtb3JlIG1lbW9yeSwgT1RBIGdlbmVyYXRpb24gd2lsbCB0YWtlIGxvbmdlci4KKworICAtLWVuYWJsZV9wdWZmZGlmZgorICAgICAgV2hldGhlciB0byBlbmFibGUgdG8gcHVmZmRpZmYgZmVhdHVyZS4gV2lsbCBnZW5lcmF0ZSBzbWFsbGVyIE9UQSBidXQgdXNlcyBtb3JlIG1lbW9yeSwgT1RBIGdlbmVyYXRpb24gd2lsbCB0YWtlIGxvbmdlci4KIAogICAtLWVuYWJsZV9sejRkaWZmCiAgICAgICBXaGV0aGVyIHRvIGVuYWJsZSBsejRkaWZmIGZlYXR1cmUuIFdpbGwgZ2VuZXJhdGUgc21hbGxlciBPVEEgZm9yIEVST0ZTIGJ1dApAQCAtMjQ0LDEzICsyNDksMjUgQEAKICAgICAgIG9sZGVyIFNQTC4KIAogICAtLXZhYmNfY29tcHJlc3Npb25fcGFyYW0KLSAgICAgIENvbXByZXNzaW9uIGFsZ29yaXRobSB0byBiZSB1c2VkIGZvciBWQUJDLiBBdmFpbGFibGUgb3B0aW9uczogZ3osIGJyb3RsaSwgbm9uZQorICAgICAgQ29tcHJlc3Npb24gYWxnb3JpdGhtIHRvIGJlIHVzZWQgZm9yIFZBQkMuIEF2YWlsYWJsZSBvcHRpb25zOiBneiwgbHo0LCB6c3RkLCBicm90bGksIG5vbmUuIAorICAgICAgQ29tcHJlc3Npb24gbGV2ZWwgY2FuIGJlIHNwZWNpZmllZCBieSBhcHBlbmRpbmcgIiwkTEVWRUwiIHRvIG9wdGlvbi4gCisgICAgICBlLmcuIC0tdmFiY19jb21wcmVzc2lvbl9wYXJhbT1neiw5IHNwZWNpZmllcyBsZXZlbCA5IGNvbXByZXNzaW9uIHdpdGggZ3ogYWxnb3JpdGhtCiAKICAgLS1zZWN1cml0eV9wYXRjaF9sZXZlbAogICAgICAgT3ZlcnJpZGUgdGhlIHNlY3VyaXR5IHBhdGNoIGxldmVsIGluIHRhcmdldCBmaWxlcwogCiAgIC0tbWF4X3RocmVhZHMKICAgICAgIFNwZWNpZnkgbWF4IG51bWJlciBvZiB0aHJlYWRzIGFsbG93ZWQgd2hlbiBnZW5lcmF0aW5nIEEvQiBPVEEKKworICAtLXZhYmNfY293X3ZlcnNpb24KKyAgICAgIFNwZWNpZnkgdGhlIFZBQkMgY293IHZlcnNpb24gdG8gYmUgdXNlZAorCisgIC0tY29tcHJlc3Npb25fZmFjdG9yCisgICAgICBTcGVjaWZ5IHRoZSBtYXhpbXVtIGJsb2NrIHNpemUgdG8gYmUgY29tcHJlc3NlZCBhdCBvbmNlIGR1cmluZyBPVEEuIHN1cHBvcnRlZCBvcHRpb25zOiA0aywgOGssIDE2aywgMzJrLCA2NGssIDEyOGssIDI1NmsKKworICAtLWZ1bGxfb3RhX3BhcnRpdGlvbnMKKyAgICAgIFNwZWNpZnkgbGlzdCBvZiBwYXJ0aXRpb25zIHNob3VsZCBiZSB1cGRhdGVkIGluIGZ1bGwgT1RBIGZhc2hpb24sIGV2ZW4gaWYKKyAgICAgIGFuIGluY3JlbWVudGFsIE9UQSBpcyBhYm91dCB0byBiZSBnZW5lcmF0ZWQKICIiIgogCiBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCkBAIC0yNjAsNyArMjc3LDYgQEAKIGltcG9ydCBvcwogaW1wb3J0IG9zLnBhdGgKIGltcG9ydCByZQotaW1wb3J0IHNobGV4CiBpbXBvcnQgc2h1dGlsCiBpbXBvcnQgc3VicHJvY2VzcwogaW1wb3J0IHN5cwpAQCAtMjY5LDExICsyODUsMTEgQEAKIGltcG9ydCBjYXJlX21hcF9wYjIKIGltcG9ydCBjb21tb24KIGltcG9ydCBvdGFfdXRpbHMKLWZyb20gb3RhX3V0aWxzIGltcG9ydCAoVU5aSVBfUEFUVEVSTiwgRmluYWxpemVNZXRhZGF0YSwgR2V0UGFja2FnZU1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICBQYXlsb2FkR2VuZXJhdG9yLCBTRUNVUklUWV9QQVRDSF9MRVZFTF9QUk9QX05BTUUsIENvcHlUYXJnZXRGaWxlc0RpciwgVkFCQ19DT01QUkVTU0lPTl9QQVJBTV9TVVBQT1JUKQoraW1wb3J0IHBheWxvYWRfc2lnbmVyCitmcm9tIG90YV91dGlscyBpbXBvcnQgKFZBQkNfQ09NUFJFU1NJT05fUEFSQU1fU1VQUE9SVCwgRmluYWxpemVNZXRhZGF0YSwgR2V0UGFja2FnZU1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBQYXlsb2FkR2VuZXJhdG9yLCBTRUNVUklUWV9QQVRDSF9MRVZFTF9QUk9QX05BTUUsIEV4dHJhY3RUYXJnZXRGaWxlcywgQ29weVRhcmdldEZpbGVzRGlyLCBUQVJHRVRfRklMRVNfSU1BR0VTX1NVQkRJUikKIGZyb20gY29tbW9uIGltcG9ydCBEb2VzSW5wdXRGaWxlQ29udGFpbiwgSXNTcGFyc2VJbWFnZQogaW1wb3J0IHRhcmdldF9maWxlc19kaWZmCi1mcm9tIGNoZWNrX3RhcmdldF9maWxlc192aW50ZiBpbXBvcnQgQ2hlY2tWaW50ZklmVHJlYmxlRW5hYmxlZAogZnJvbSBub25fYWJfb3RhIGltcG9ydCBHZW5lcmF0ZU5vbkFiT3RhUGFja2FnZQogZnJvbSBwYXlsb2FkX3NpZ25lciBpbXBvcnQgUGF5bG9hZFNpZ25lcgogCkBAIC0zMDQsOSArMzIwLDYgQEAKIE9QVElPTlMuY2FjaGVfc2l6ZSA9IE5vbmUKIE9QVElPTlMuc3Rhc2hfdGhyZXNob2xkID0gMC44CiBPUFRJT05TLmxvZ19kaWZmID0gTm9uZQotT1BUSU9OUy5wYXlsb2FkX3NpZ25lciA9IE5vbmUKLU9QVElPTlMucGF5bG9hZF9zaWduZXJfYXJncyA9IFtdCi1PUFRJT05TLnBheWxvYWRfc2lnbmVyX21heGltdW1fc2lnbmF0dXJlX3NpemUgPSBOb25lCiBPUFRJT05TLmV4dHJhY3RlZF9pbnB1dCA9IE5vbmUKIE9QVElPTlMuc2tpcF9wb3N0aW5zdGFsbCA9IEZhbHNlCiBPUFRJT05TLnNraXBfY29tcGF0aWJpbGl0eV9jaGVjayA9IEZhbHNlCkBAIC0zMjAsMTUgKzMzMywyMCBAQAogT1BUSU9OUy5lbmFibGVfdmFiY194b3IgPSBUcnVlCiBPUFRJT05TLmZvcmNlX21pbm9yX3ZlcnNpb24gPSBOb25lCiBPUFRJT05TLmNvbXByZXNzb3JfdHlwZXMgPSBOb25lCi1PUFRJT05TLmVuYWJsZV96dWNjaGluaSA9IFRydWUKK09QVElPTlMuZW5hYmxlX3p1Y2NoaW5pID0gRmFsc2UKK09QVElPTlMuZW5hYmxlX3B1ZmZkaWZmID0gTm9uZQogT1BUSU9OUy5lbmFibGVfbHo0ZGlmZiA9IEZhbHNlCiBPUFRJT05TLnZhYmNfY29tcHJlc3Npb25fcGFyYW0gPSBOb25lCiBPUFRJT05TLnNlY3VyaXR5X3BhdGNoX2xldmVsID0gTm9uZQogT1BUSU9OUy5tYXhfdGhyZWFkcyA9IE5vbmUKK09QVElPTlMudmFiY19jb3dfdmVyc2lvbiA9IE5vbmUKK09QVElPTlMuY29tcHJlc3Npb25fZmFjdG9yID0gTm9uZQorT1BUSU9OUy5mdWxsX290YV9wYXJ0aXRpb25zID0gTm9uZQogCiAKIFBPU1RJTlNUQUxMX0NPTkZJRyA9ICdNRVRBL3Bvc3RpbnN0YWxsX2NvbmZpZy50eHQnCiBEWU5BTUlDX1BBUlRJVElPTl9JTkZPID0gJ01FVEEvZHluYW1pY19wYXJ0aXRpb25zX2luZm8udHh0JworTUlTQ19JTkZPID0gJ01FVEEvbWlzY19pbmZvLnR4dCcKIEFCX1BBUlRJVElPTlMgPSAnTUVUQS9hYl9wYXJ0aXRpb25zLnR4dCcKIAogIyBGaWxlcyB0byBiZSB1bnppcHBlZCBmb3IgdGFyZ2V0IGRpZmZpbmcgcHVycG9zZS4KQEAgLTM1NSw2ICszNzMsMjUgQEAKICAgICBvZW1fZGljdHMuYXBwZW5kKGNvbW1vbi5Mb2FkRGljdGlvbmFyeUZyb21GaWxlKG9lbV9maWxlKSkKICAgcmV0dXJuIG9lbV9kaWN0cwogCitkZWYgTW9kaWZ5S2V5dmFsdWVMaXN0KGNvbnRlbnQ6IHN0ciwga2V5OiBzdHIsIHZhbHVlOiBzdHIpOgorICAiIiIgVXBkYXRlIHVwZGF0ZSB0aGUga2V5IHZhbHVlIGxpc3Qgd2l0aCBzcGVjaWZpZWQga2V5IGFuZCB2YWx1ZQorICBBcmdzOgorICAgIGNvbnRlbnQ6IFRoZSBzdHJpbmcgY29udGVudCBvZiBkeW5hbWljX3BhcnRpdGlvbnNfaW5mby50eHQuIEVhY2ggbGluZQorICAgICAgc2hvdWxkIGJlIGEga2V5IHZhbHVyIHBhaXIsIHdoZXJlIHN0cmluZyBiZWZvcmUgdGhlIGZpcnN0ICc9JyBhcmUga2V5cywKKyAgICAgIHJlbWFpbmluZyBwYXJ0cyBhcmUgdmFsdWVzLgorICAgIGtleTogdGhlIGtleSBvZiB0aGUga2V5IHZhbHVlIHBhaXIgdG8gbW9kaWZ5CisgICAgdmFsdWU6IHRoZSBuZXcgdmFsdWUgdG8gcmVwbGFjZSB3aXRoCisKKyAgUmV0dXJuczoKKyAgICBVcGRhdGVkIGNvbnRlbnQgb2YgdGhlIGtleSB2YWx1ZSBsaXN0CisgICIiIgorICBvdXRwdXRfbGlzdCA9IFtdCisgIGZvciBsaW5lIGluIGNvbnRlbnQuc3BsaXRsaW5lcygpOgorICAgIGlmIGxpbmUuc3RhcnRzd2l0aChrZXkrIj0iKToKKyAgICAgIGNvbnRpbnVlCisgICAgb3V0cHV0X2xpc3QuYXBwZW5kKGxpbmUpCisgIG91dHB1dF9saXN0LmFwcGVuZCgie309e30iLmZvcm1hdChrZXksIHZhbHVlKSkKKyAgcmV0dXJuICJcbiIuam9pbihvdXRwdXRfbGlzdCkKIAogZGVmIE1vZGlmeVZBQkNDb21wcmVzc2lvblBhcmFtKGNvbnRlbnQsIGFsZ28pOgogICAiIiIgVXBkYXRlIHVwZGF0ZSBWQUJDIENvbXByZXNzaW9uIFBhcmFtIGluIGR5bmFtaWNfcGFydGl0aW9uc19pbmZvLnR4dApAQCAtMzY1LDEzICs0MDIsNyBAQAogICBSZXR1cm5zOgogICAgIFVwZGF0ZWQgY29udGVudCBvZiBkeW5hbWljX3BhcnRpdGlvbnNfaW5mby50eHQgLCB3aXRoIGN1c3RvbSBjb21wcmVzc2lvbiBhbGdvCiAgICIiIgotICBvdXRwdXRfbGlzdCA9IFtdCi0gIGZvciBsaW5lIGluIGNvbnRlbnQuc3BsaXRsaW5lcygpOgotICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgidmlydHVhbF9hYl9jb21wcmVzc2lvbl9tZXRob2Q9Iik6Ci0gICAgICBjb250aW51ZQotICAgIG91dHB1dF9saXN0LmFwcGVuZChsaW5lKQotICBvdXRwdXRfbGlzdC5hcHBlbmQoInZpcnR1YWxfYWJfY29tcHJlc3Npb25fbWV0aG9kPSIrYWxnbykKLSAgcmV0dXJuICJcbiIuam9pbihvdXRwdXRfbGlzdCkKKyAgcmV0dXJuIE1vZGlmeUtleXZhbHVlTGlzdChjb250ZW50LCAidmlydHVhbF9hYl9jb21wcmVzc2lvbl9tZXRob2QiLCBhbGdvKQogCiAKIGRlZiBVcGRhdGVzSW5mb0ZvclNwZWNpYWxVcGRhdGVzKGNvbnRlbnQsIHBhcnRpdGlvbnNfZmlsdGVyLApAQCAtNDU3LDQ4ICs0ODgsNTEgQEAKICAgdGFyZ2V0X2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0idGFyZ2V0ZmlsZXMtIiwgc3VmZml4PSIuemlwIikKICAgdGFyZ2V0X3ppcCA9IHppcGZpbGUuWmlwRmlsZSh0YXJnZXRfZmlsZSwgJ3cnLCBhbGxvd1ppcDY0PVRydWUpCiAKLSAgd2l0aCB6aXBmaWxlLlppcEZpbGUoaW5wdXRfZmlsZSwgJ3InLCBhbGxvd1ppcDY0PVRydWUpIGFzIGlucHV0X3ppcDoKLSAgICBpbmZvbGlzdCA9IGlucHV0X3ppcC5pbmZvbGlzdCgpCisgIGZpbGVzbGlzdCA9IFtdCisgIGZvciAocm9vdCwgZGlycywgZmlsZXMpIGluIG9zLndhbGsoaW5wdXRfZmlsZSk6CisgICAgcm9vdCA9IHJvb3QubHN0cmlwKGlucHV0X2ZpbGUpLmxzdHJpcCgiLyIpCisgICAgZmlsZXNsaXN0LmV4dGVuZChbb3MucGF0aC5qb2luKHJvb3QsIGQpIGZvciBkIGluIGRpcnNdKQorICAgIGZpbGVzbGlzdC5leHRlbmQoW29zLnBhdGguam9pbihyb290LCBkKSBmb3IgZCBpbiBmaWxlc10pCiAKLSAgaW5wdXRfdG1wID0gY29tbW9uLlVuemlwVGVtcChpbnB1dF9maWxlLCBVTlpJUF9QQVRURVJOKQotICBmb3IgaW5mbyBpbiBpbmZvbGlzdDoKLSAgICB1bnppcHBlZF9maWxlID0gb3MucGF0aC5qb2luKGlucHV0X3RtcCwgKmluZm8uZmlsZW5hbWUuc3BsaXQoJy8nKSkKLSAgICBpZiBpbmZvLmZpbGVuYW1lID09ICdJTUFHRVMvc3lzdGVtX290aGVyLmltZyc6CisgIGlucHV0X3RtcCA9IGlucHV0X2ZpbGUKKyAgZm9yIGZpbGVuYW1lIGluIGZpbGVzbGlzdDoKKyAgICB1bnppcHBlZF9maWxlID0gb3MucGF0aC5qb2luKGlucHV0X3RtcCwgKmZpbGVuYW1lLnNwbGl0KCcvJykpCisgICAgaWYgZmlsZW5hbWUgPT0gJ0lNQUdFUy9zeXN0ZW1fb3RoZXIuaW1nJzoKICAgICAgIGNvbW1vbi5aaXBXcml0ZSh0YXJnZXRfemlwLCB1bnppcHBlZF9maWxlLCBhcmNuYW1lPSdJTUFHRVMvc3lzdGVtLmltZycpCiAKICAgICAjIFByaW1hcnkgaW1hZ2VzIGFuZCBmcmllbmRzIG5lZWQgdG8gYmUgc2tpcHBlZCBleHBsaWNpdGx5LgotICAgIGVsaWYgaW5mby5maWxlbmFtZSBpbiAoJ0lNQUdFUy9zeXN0ZW0uaW1nJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICdJTUFHRVMvc3lzdGVtLm1hcCcpOgorICAgIGVsaWYgZmlsZW5hbWUgaW4gKCdJTUFHRVMvc3lzdGVtLmltZycsCisgICAgICAgICAgICAgICAgICAgICAgJ0lNQUdFUy9zeXN0ZW0ubWFwJyk6CiAgICAgICBwYXNzCiAKICAgICAjIENvcHkgaW1hZ2VzIHRoYXQgYXJlIG5vdCBpbiBTRUNPTkRBUllfUEFZTE9BRF9TS0lQUEVEX0lNQUdFUy4KLSAgICBlbGlmIGluZm8uZmlsZW5hbWUuc3RhcnRzd2l0aCgoJ0lNQUdFUy8nLCAnUkFESU8vJykpOgotICAgICAgaW1hZ2VfbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoaW5mby5maWxlbmFtZSkKKyAgICBlbGlmIGZpbGVuYW1lLnN0YXJ0c3dpdGgoKCdJTUFHRVMvJywgJ1JBRElPLycpKToKKyAgICAgIGltYWdlX25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKQogICAgICAgaWYgaW1hZ2VfbmFtZSBub3QgaW4gWyd7fS5pbWcnLmZvcm1hdChwYXJ0aXRpb24pIGZvciBwYXJ0aXRpb24gaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNPTkRBUllfUEFZTE9BRF9TS0lQUEVEX0lNQUdFU106Ci0gICAgICAgIGNvbW1vbi5aaXBXcml0ZSh0YXJnZXRfemlwLCB1bnppcHBlZF9maWxlLCBhcmNuYW1lPWluZm8uZmlsZW5hbWUpCisgICAgICAgIGNvbW1vbi5aaXBXcml0ZSh0YXJnZXRfemlwLCB1bnppcHBlZF9maWxlLCBhcmNuYW1lPWZpbGVuYW1lKQogCiAgICAgIyBTa2lwIGNvcHlpbmcgdGhlIHBvc3RpbnN0YWxsIGNvbmZpZyBpZiByZXF1ZXN0ZWQuCi0gICAgZWxpZiBza2lwX3Bvc3RpbnN0YWxsIGFuZCBpbmZvLmZpbGVuYW1lID09IFBPU1RJTlNUQUxMX0NPTkZJRzoKKyAgICBlbGlmIHNraXBfcG9zdGluc3RhbGwgYW5kIGZpbGVuYW1lID09IFBPU1RJTlNUQUxMX0NPTkZJRzoKICAgICAgIHBhc3MKIAotICAgIGVsaWYgaW5mby5maWxlbmFtZS5zdGFydHN3aXRoKCdNRVRBLycpOgorICAgIGVsaWYgZmlsZW5hbWUuc3RhcnRzd2l0aCgnTUVUQS8nKToKICAgICAgICMgUmVtb3ZlIHRoZSB1bm5lY2Vzc2FyeSBwYXJ0aXRpb25zIGZvciBzZWNvbmRhcnkgaW1hZ2VzIGZyb20gdGhlCiAgICAgICAjIGFiX3BhcnRpdGlvbnMgZmlsZS4KLSAgICAgIGlmIGluZm8uZmlsZW5hbWUgPT0gQUJfUEFSVElUSU9OUzoKKyAgICAgIGlmIGZpbGVuYW1lID09IEFCX1BBUlRJVElPTlM6CiAgICAgICAgIHdpdGggb3Blbih1bnppcHBlZF9maWxlKSBhcyBmOgogICAgICAgICAgIHBhcnRpdGlvbl9saXN0ID0gZi5yZWFkKCkuc3BsaXRsaW5lcygpCiAgICAgICAgIHBhcnRpdGlvbl9saXN0ID0gW3BhcnRpdGlvbiBmb3IgcGFydGl0aW9uIGluIHBhcnRpdGlvbl9saXN0IGlmIHBhcnRpdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgcGFydGl0aW9uIG5vdCBpbiBTRUNPTkRBUllfUEFZTE9BRF9TS0lQUEVEX0lNQUdFU10KLSAgICAgICAgY29tbW9uLlppcFdyaXRlU3RyKHRhcmdldF96aXAsIGluZm8uZmlsZW5hbWUsCisgICAgICAgIGNvbW1vbi5aaXBXcml0ZVN0cih0YXJnZXRfemlwLCBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcbicuam9pbihwYXJ0aXRpb25fbGlzdCkpCiAgICAgICAjIFJlbW92ZSB0aGUgdW5uZWNlc3NhcnkgcGFydGl0aW9ucyBmcm9tIHRoZSBkeW5hbWljIHBhcnRpdGlvbnMgbGlzdC4KLSAgICAgIGVsaWYgKGluZm8uZmlsZW5hbWUgPT0gJ01FVEEvbWlzY19pbmZvLnR4dCcgb3IKLSAgICAgICAgICAgIGluZm8uZmlsZW5hbWUgPT0gRFlOQU1JQ19QQVJUSVRJT05fSU5GTyk6CisgICAgICBlbGlmIChmaWxlbmFtZSA9PSAnTUVUQS9taXNjX2luZm8udHh0JyBvcgorICAgICAgICAgICAgZmlsZW5hbWUgPT0gRFlOQU1JQ19QQVJUSVRJT05fSU5GTyk6CiAgICAgICAgIG1vZGlmaWVkX2luZm8gPSBHZXRJbmZvRm9yU2Vjb25kYXJ5SW1hZ2VzKHVuemlwcGVkX2ZpbGUpCi0gICAgICAgIGNvbW1vbi5aaXBXcml0ZVN0cih0YXJnZXRfemlwLCBpbmZvLmZpbGVuYW1lLCBtb2RpZmllZF9pbmZvKQorICAgICAgICBjb21tb24uWmlwV3JpdGVTdHIodGFyZ2V0X3ppcCwgZmlsZW5hbWUsIG1vZGlmaWVkX2luZm8pCiAgICAgICBlbHNlOgotICAgICAgICBjb21tb24uWmlwV3JpdGUodGFyZ2V0X3ppcCwgdW56aXBwZWRfZmlsZSwgYXJjbmFtZT1pbmZvLmZpbGVuYW1lKQorICAgICAgICBjb21tb24uWmlwV3JpdGUodGFyZ2V0X3ppcCwgdW56aXBwZWRfZmlsZSwgYXJjbmFtZT1maWxlbmFtZSkKIAogICBjb21tb24uWmlwQ2xvc2UodGFyZ2V0X3ppcCkKIApAQCAtNTE5LDIxICs1NTMsNDUgQEAKICAgUmV0dXJuczoKICAgICBUaGUgZmlsZW5hbWUgb2YgdGFyZ2V0LWZpbGVzLnppcCB0aGF0IGRvZXNuJ3QgY29udGFpbiBwb3N0aW5zdGFsbCBjb25maWcuCiAgICIiIgotICAjIFdlIHNob3VsZCBvbmx5IG1ha2UgYSBjb3B5IGlmIHBvc3RpbnN0YWxsX2NvbmZpZyBlbnRyeSBleGlzdHMuCi0gIHdpdGggemlwZmlsZS5aaXBGaWxlKGlucHV0X2ZpbGUsICdyJywgYWxsb3daaXA2ND1UcnVlKSBhcyBpbnB1dF96aXA6Ci0gICAgaWYgUE9TVElOU1RBTExfQ09ORklHIG5vdCBpbiBpbnB1dF96aXAubmFtZWxpc3QoKToKLSAgICAgIHJldHVybiBpbnB1dF9maWxlCi0KLSAgdGFyZ2V0X2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0idGFyZ2V0ZmlsZXMtIiwgc3VmZml4PSIuemlwIikKLSAgc2h1dGlsLmNvcHlmaWxlKGlucHV0X2ZpbGUsIHRhcmdldF9maWxlKQotICBjb21tb24uWmlwRGVsZXRlKHRhcmdldF9maWxlLCBQT1NUSU5TVEFMTF9DT05GSUcpCi0gIHJldHVybiB0YXJnZXRfZmlsZQorICBjb25maWdfcGF0aCA9IG9zLnBhdGguam9pbihpbnB1dF9maWxlLCBQT1NUSU5TVEFMTF9DT05GSUcpCisgIGlmIG9zLnBhdGguZXhpc3RzKGNvbmZpZ19wYXRoKToKKyAgICBvcy51bmxpbmsoY29uZmlnX3BhdGgpCisgIHJldHVybiBpbnB1dF9maWxlCiAKIAogZGVmIFBhcnNlSW5mb0RpY3QodGFyZ2V0X2ZpbGVfcGF0aCk6Ci0gIHdpdGggemlwZmlsZS5aaXBGaWxlKHRhcmdldF9maWxlX3BhdGgsICdyJywgYWxsb3daaXA2ND1UcnVlKSBhcyB6ZnA6Ci0gICAgcmV0dXJuIGNvbW1vbi5Mb2FkSW5mb0RpY3QoemZwKQorICByZXR1cm4gY29tbW9uLkxvYWRJbmZvRGljdCh0YXJnZXRfZmlsZV9wYXRoKQogCitkZWYgTW9kaWZ5VGFyZ2V0RmlsZXNEeW5hbWljUGFydGl0aW9uSW5mbyhpbnB1dF9maWxlLCBrZXksIHZhbHVlKToKKyAgIiIiUmV0dXJucyBhIHRhcmdldC1maWxlcy56aXAgd2l0aCBhIGN1c3RvbSBWQUJDIGNvbXByZXNzaW9uIHBhcmFtLgorICBBcmdzOgorICAgIGlucHV0X2ZpbGU6IFRoZSBpbnB1dCB0YXJnZXQtZmlsZXMuemlwIHBhdGgKKyAgICB2YWJjX2NvbXByZXNzaW9uX3BhcmFtOiBDdXN0b20gVmlydHVhbCBBQiBDb21wcmVzc2lvbiBhbGdvcml0aG0KKworICBSZXR1cm5zOgorICAgIFRoZSBwYXRoIHRvIG1vZGlmaWVkIHRhcmdldC1maWxlcy56aXAKKyAgIiIiCisgIGlmIG9zLnBhdGguaXNkaXIoaW5wdXRfZmlsZSk6CisgICAgZHluYW1pY19wYXJ0aXRpb25faW5mb19wYXRoID0gb3MucGF0aC5qb2luKAorICAgICAgICBpbnB1dF9maWxlLCAqRFlOQU1JQ19QQVJUSVRJT05fSU5GTy5zcGxpdCgiLyIpKQorICAgIHdpdGggb3BlbihkeW5hbWljX3BhcnRpdGlvbl9pbmZvX3BhdGgsICJyIikgYXMgZnA6CisgICAgICBkeW5hbWljX3BhcnRpdGlvbl9pbmZvID0gZnAucmVhZCgpCisgICAgZHluYW1pY19wYXJ0aXRpb25faW5mbyA9IE1vZGlmeUtleXZhbHVlTGlzdCgKKyAgICAgICAgZHluYW1pY19wYXJ0aXRpb25faW5mbywga2V5LCB2YWx1ZSkKKyAgICB3aXRoIG9wZW4oZHluYW1pY19wYXJ0aXRpb25faW5mb19wYXRoLCAidyIpIGFzIGZwOgorICAgICAgZnAud3JpdGUoZHluYW1pY19wYXJ0aXRpb25faW5mbykKKyAgICByZXR1cm4gaW5wdXRfZmlsZQorCisgIHRhcmdldF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShwcmVmaXg9InRhcmdldGZpbGVzLSIsIHN1ZmZpeD0iLnppcCIpCisgIHNodXRpbC5jb3B5ZmlsZShpbnB1dF9maWxlLCB0YXJnZXRfZmlsZSkKKyAgY29tbW9uLlppcERlbGV0ZSh0YXJnZXRfZmlsZSwgRFlOQU1JQ19QQVJUSVRJT05fSU5GTykKKyAgd2l0aCB6aXBmaWxlLlppcEZpbGUoaW5wdXRfZmlsZSwgJ3InLCBhbGxvd1ppcDY0PVRydWUpIGFzIHpmcDoKKyAgICBkeW5hbWljX3BhcnRpdGlvbl9pbmZvID0gemZwLnJlYWQoRFlOQU1JQ19QQVJUSVRJT05fSU5GTykuZGVjb2RlKCkKKyAgICBkeW5hbWljX3BhcnRpdGlvbl9pbmZvID0gTW9kaWZ5S2V5dmFsdWVMaXN0KAorICAgICAgICBkeW5hbWljX3BhcnRpdGlvbl9pbmZvLCBrZXksIHZhbHVlKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHRhcmdldF9maWxlLCAiYSIsIGFsbG93WmlwNjQ9VHJ1ZSkgYXMgb3V0cHV0X3ppcDoKKyAgICAgIG91dHB1dF96aXAud3JpdGVzdHIoRFlOQU1JQ19QQVJUSVRJT05fSU5GTywgZHluYW1pY19wYXJ0aXRpb25faW5mbykKKyAgcmV0dXJuIHRhcmdldF9maWxlCiAKIGRlZiBHZXRUYXJnZXRGaWxlc1ppcEZvckN1c3RvbVZBQkNDb21wcmVzc2lvbihpbnB1dF9maWxlLCB2YWJjX2NvbXByZXNzaW9uX3BhcmFtKToKICAgIiIiUmV0dXJucyBhIHRhcmdldC1maWxlcy56aXAgd2l0aCBhIGN1c3RvbSBWQUJDIGNvbXByZXNzaW9uIHBhcmFtLgpAQCAtNTQ0LDE2ICs2MDIsNyBAQAogICBSZXR1cm5zOgogICAgIFRoZSBwYXRoIHRvIG1vZGlmaWVkIHRhcmdldC1maWxlcy56aXAKICAgIiIiCi0gIHRhcmdldF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShwcmVmaXg9InRhcmdldGZpbGVzLSIsIHN1ZmZpeD0iLnppcCIpCi0gIHNodXRpbC5jb3B5ZmlsZShpbnB1dF9maWxlLCB0YXJnZXRfZmlsZSkKLSAgY29tbW9uLlppcERlbGV0ZSh0YXJnZXRfZmlsZSwgRFlOQU1JQ19QQVJUSVRJT05fSU5GTykKLSAgd2l0aCB6aXBmaWxlLlppcEZpbGUoaW5wdXRfZmlsZSwgJ3InLCBhbGxvd1ppcDY0PVRydWUpIGFzIHpmcDoKLSAgICBkeW5hbWljX3BhcnRpdGlvbl9pbmZvID0gemZwLnJlYWQoRFlOQU1JQ19QQVJUSVRJT05fSU5GTykuZGVjb2RlKCkKLSAgICBkeW5hbWljX3BhcnRpdGlvbl9pbmZvID0gTW9kaWZ5VkFCQ0NvbXByZXNzaW9uUGFyYW0oCi0gICAgICAgIGR5bmFtaWNfcGFydGl0aW9uX2luZm8sIHZhYmNfY29tcHJlc3Npb25fcGFyYW0pCi0gICAgd2l0aCB6aXBmaWxlLlppcEZpbGUodGFyZ2V0X2ZpbGUsICJhIiwgYWxsb3daaXA2ND1UcnVlKSBhcyBvdXRwdXRfemlwOgotICAgICAgb3V0cHV0X3ppcC53cml0ZXN0cihEWU5BTUlDX1BBUlRJVElPTl9JTkZPLCBkeW5hbWljX3BhcnRpdGlvbl9pbmZvKQotICByZXR1cm4gdGFyZ2V0X2ZpbGUKKyAgcmV0dXJuIE1vZGlmeVRhcmdldEZpbGVzRHluYW1pY1BhcnRpdGlvbkluZm8oaW5wdXRfZmlsZSwgInZpcnR1YWxfYWJfY29tcHJlc3Npb25fbWV0aG9kIiwgdmFiY19jb21wcmVzc2lvbl9wYXJhbSkKIAogCiBkZWYgR2V0VGFyZ2V0RmlsZXNaaXBGb3JQYXJ0aWFsVXBkYXRlcyhpbnB1dF9maWxlLCBhYl9wYXJ0aXRpb25zKToKQEAgLTU2MSw3ICs2MTAsNyBAQAogCiAgIFRoaXMgZnVuY3Rpb24gbW9kaWZpZXMgYWJfcGFydGl0aW9ucyBsaXN0IHdpdGggdGhlIGRlc2lyZWQgcGFydGl0aW9ucyBiZWZvcmUKICAgY2FsbGluZyB0aGUgYnJpbGxvX3VwZGF0ZV9wYXlsb2FkIHNjcmlwdC4gSXQgYWxzbyBjbGVhbnMgdXAgdGhlIHJlZmVyZW5jZSB0bwotICB0aGUgZXhjbHVkZWQgcGFydGl0aW9ucyBpbiB0aGUgaW5mbyBmaWxlLCBlLmcgbWlzY19pbmZvLnR4dC4KKyAgdGhlIGV4Y2x1ZGVkIHBhcnRpdGlvbnMgaW4gdGhlIGluZm8gZmlsZSwgZS5nLiBtaXNjX2luZm8udHh0LgogCiAgIEFyZ3M6CiAgICAgaW5wdXRfZmlsZTogVGhlIGlucHV0IHRhcmdldC1maWxlcy56aXAgZmlsZW5hbWUuCkBAIC01NzEsMjMgKzYyMCw3IEBACiAgICAgVGhlIGZpbGVuYW1lIG9mIHRhcmdldC1maWxlcy56aXAgdXNlZCBmb3IgcGFydGlhbCBvdGEgdXBkYXRlLgogICAiIiIKIAotICBkZWYgQWRkSW1hZ2VGb3JQYXJ0aXRpb24ocGFydGl0aW9uX25hbWUpOgotICAgICIiIkFkZCB0aGUgYXJjaGl2ZSBuYW1lIGZvciBhIGdpdmVuIHBhcnRpdGlvbiB0byB0aGUgY29weSBsaXN0LiIiIgotICAgIGZvciBwcmVmaXggaW4gWydJTUFHRVMnLCAnUkFESU8nXToKLSAgICAgIGltYWdlX3BhdGggPSAne30ve30uaW1nJy5mb3JtYXQocHJlZml4LCBwYXJ0aXRpb25fbmFtZSkKLSAgICAgIGlmIGltYWdlX3BhdGggaW4gbmFtZWxpc3Q6Ci0gICAgICAgIGNvcHlfZW50cmllcy5hcHBlbmQoaW1hZ2VfcGF0aCkKLSAgICAgICAgbWFwX3BhdGggPSAne30ve30ubWFwJy5mb3JtYXQocHJlZml4LCBwYXJ0aXRpb25fbmFtZSkKLSAgICAgICAgaWYgbWFwX3BhdGggaW4gbmFtZWxpc3Q6Ci0gICAgICAgICAgY29weV9lbnRyaWVzLmFwcGVuZChtYXBfcGF0aCkKLSAgICAgICAgcmV0dXJuCi0KLSAgICByYWlzZSBWYWx1ZUVycm9yKCJDYW5ub3QgZmluZCB7fSBpbiBpbnB1dCB6aXBmaWxlIi5mb3JtYXQocGFydGl0aW9uX25hbWUpKQotCi0gIHdpdGggemlwZmlsZS5aaXBGaWxlKGlucHV0X2ZpbGUsIGFsbG93WmlwNjQ9VHJ1ZSkgYXMgaW5wdXRfemlwOgotICAgIG9yaWdpbmFsX2FiX3BhcnRpdGlvbnMgPSBpbnB1dF96aXAucmVhZCgKLSAgICAgICAgQUJfUEFSVElUSU9OUykuZGVjb2RlKCkuc3BsaXRsaW5lcygpCi0gICAgbmFtZWxpc3QgPSBpbnB1dF96aXAubmFtZWxpc3QoKQorICBvcmlnaW5hbF9hYl9wYXJ0aXRpb25zID0gY29tbW9uLlJlYWRGcm9tSW5wdXRGaWxlKGlucHV0X2ZpbGUsIEFCX1BBUlRJVElPTlMpCiAKICAgdW5yZWNvZ25pemVkX3BhcnRpdGlvbnMgPSBbcGFydGl0aW9uIGZvciBwYXJ0aXRpb24gaW4gYWJfcGFydGl0aW9ucyBpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb24gbm90IGluIG9yaWdpbmFsX2FiX3BhcnRpdGlvbnNdCkBAIC01OTYsNTAgKzYyOSw2OCBAQAogICAgICAgICAgICAgICAgICAgICAgdW5yZWNvZ25pemVkX3BhcnRpdGlvbnMpCiAKICAgbG9nZ2VyLmluZm8oIkdlbmVyYXRpbmcgcGFydGlhbCB1cGRhdGVzIGZvciAlcyIsIGFiX3BhcnRpdGlvbnMpCisgIGZvciBzdWJkaXIgaW4gWyJJTUFHRVMiLCAiUkFESU8iLCAiUFJFQlVJTFRfSU1BR0VTIl06CisgICAgaW1hZ2VfZGlyID0gb3MucGF0aC5qb2luKHN1YmRpcikKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoaW1hZ2VfZGlyKToKKyAgICAgIGNvbnRpbnVlCisgICAgZm9yIGZpbGVuYW1lIGluIG9zLmxpc3RkaXIoaW1hZ2VfZGlyKToKKyAgICAgIGZpbGVwYXRoID0gb3MucGF0aC5qb2luKGltYWdlX2RpciwgZmlsZW5hbWUpCisgICAgICBpZiBmaWxlbmFtZS5lbmRzd2l0aCgiLmltZyIpOgorICAgICAgICBwYXJ0aXRpb25fbmFtZSA9IGZpbGVuYW1lLnJlbW92ZXN1ZmZpeCgiLmltZyIpCisgICAgICAgIGlmIHBhcnRpdGlvbl9uYW1lIG5vdCBpbiBhYl9wYXJ0aXRpb25zOgorICAgICAgICAgIG9zLnVubGluayhmaWxlcGF0aCkKIAotICBjb3B5X2VudHJpZXMgPSBbJ01FVEEvdXBkYXRlX2VuZ2luZV9jb25maWcudHh0J10KLSAgZm9yIHBhcnRpdGlvbl9uYW1lIGluIGFiX3BhcnRpdGlvbnM6Ci0gICAgQWRkSW1hZ2VGb3JQYXJ0aXRpb24ocGFydGl0aW9uX25hbWUpCisgIGNvbW1vbi5Xcml0ZVRvSW5wdXRGaWxlKGlucHV0X2ZpbGUsICdNRVRBL2FiX3BhcnRpdGlvbnMudHh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xuJy5qb2luKGFiX3BhcnRpdGlvbnMpKQorICBDQVJFX01BUF9FTlRSWSA9ICJNRVRBL2NhcmVfbWFwLnBiIgorICBpZiBEb2VzSW5wdXRGaWxlQ29udGFpbihpbnB1dF9maWxlLCBDQVJFX01BUF9FTlRSWSk6CisgICAgY2FyZW1hcCA9IGNhcmVfbWFwX3BiMi5DYXJlTWFwKCkKKyAgICBjYXJlbWFwLlBhcnNlRnJvbVN0cmluZygKKyAgICAgICAgY29tbW9uLlJlYWRCeXRlc0Zyb21JbnB1dEZpbGUoaW5wdXRfZmlsZSwgQ0FSRV9NQVBfRU5UUlkpKQorICAgIGZpbHRlcmVkID0gWworICAgICAgICBwYXJ0IGZvciBwYXJ0IGluIGNhcmVtYXAucGFydGl0aW9ucyBpZiBwYXJ0Lm5hbWUgaW4gYWJfcGFydGl0aW9uc10KKyAgICBkZWwgY2FyZW1hcC5wYXJ0aXRpb25zWzpdCisgICAgY2FyZW1hcC5wYXJ0aXRpb25zLmV4dGVuZChmaWx0ZXJlZCkKKyAgICBjb21tb24uV3JpdGVCeXRlc1RvSW5wdXRGaWxlKGlucHV0X2ZpbGUsIENBUkVfTUFQX0VOVFJZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZW1hcC5TZXJpYWxpemVUb1N0cmluZygpKQogCi0gICMgVXNlIHppcDJ6aXAgdG8gYXZvaWQgZXh0cmFjdGluZyB0aGUgemlwZmlsZS4KLSAgcGFydGlhbF90YXJnZXRfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUoc3VmZml4PScuemlwJykKLSAgY21kID0gWyd6aXAyemlwJywgJy1pJywgaW5wdXRfZmlsZSwgJy1vJywgcGFydGlhbF90YXJnZXRfZmlsZV0KLSAgY21kLmV4dGVuZChbJ3t9Ont9Jy5mb3JtYXQobmFtZSwgbmFtZSkgZm9yIG5hbWUgaW4gY29weV9lbnRyaWVzXSkKLSAgY29tbW9uLlJ1bkFuZENoZWNrT3V0cHV0KGNtZCkKKyAgZm9yIGluZm9fZmlsZSBpbiBbJ01FVEEvbWlzY19pbmZvLnR4dCcsIERZTkFNSUNfUEFSVElUSU9OX0lORk9dOgorICAgIGlmIG5vdCBEb2VzSW5wdXRGaWxlQ29udGFpbihpbnB1dF9maWxlLCBpbmZvX2ZpbGUpOgorICAgICAgbG9nZ2VyLndhcm5pbmcoJ0Nhbm5vdCBmaW5kICVzIGluIGlucHV0IHppcGZpbGUnLCBpbmZvX2ZpbGUpCisgICAgICBjb250aW51ZQogCi0gIHBhcnRpYWxfdGFyZ2V0X3ppcCA9IHppcGZpbGUuWmlwRmlsZShwYXJ0aWFsX3RhcmdldF9maWxlLCAnYScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd1ppcDY0PVRydWUpCi0gIHdpdGggemlwZmlsZS5aaXBGaWxlKGlucHV0X2ZpbGUsIGFsbG93WmlwNjQ9VHJ1ZSkgYXMgaW5wdXRfemlwOgotICAgIGNvbW1vbi5aaXBXcml0ZVN0cihwYXJ0aWFsX3RhcmdldF96aXAsICdNRVRBL2FiX3BhcnRpdGlvbnMudHh0JywKLSAgICAgICAgICAgICAgICAgICAgICAgJ1xuJy5qb2luKGFiX3BhcnRpdGlvbnMpKQotICAgIENBUkVfTUFQX0VOVFJZID0gIk1FVEEvY2FyZV9tYXAucGIiCi0gICAgaWYgQ0FSRV9NQVBfRU5UUlkgaW4gaW5wdXRfemlwLm5hbWVsaXN0KCk6Ci0gICAgICBjYXJlbWFwID0gY2FyZV9tYXBfcGIyLkNhcmVNYXAoKQotICAgICAgY2FyZW1hcC5QYXJzZUZyb21TdHJpbmcoaW5wdXRfemlwLnJlYWQoQ0FSRV9NQVBfRU5UUlkpKQotICAgICAgZmlsdGVyZWQgPSBbCi0gICAgICAgICAgcGFydCBmb3IgcGFydCBpbiBjYXJlbWFwLnBhcnRpdGlvbnMgaWYgcGFydC5uYW1lIGluIGFiX3BhcnRpdGlvbnNdCi0gICAgICBkZWwgY2FyZW1hcC5wYXJ0aXRpb25zWzpdCi0gICAgICBjYXJlbWFwLnBhcnRpdGlvbnMuZXh0ZW5kKGZpbHRlcmVkKQotICAgICAgY29tbW9uLlppcFdyaXRlU3RyKHBhcnRpYWxfdGFyZ2V0X3ppcCwgQ0FSRV9NQVBfRU5UUlksCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FyZW1hcC5TZXJpYWxpemVUb1N0cmluZygpKQorICAgIGNvbnRlbnQgPSBjb21tb24uUmVhZEZyb21JbnB1dEZpbGUoaW5wdXRfZmlsZSwgaW5mb19maWxlKQorICAgIG1vZGlmaWVkX2luZm8gPSBVcGRhdGVzSW5mb0ZvclNwZWNpYWxVcGRhdGVzKAorICAgICAgICBjb250ZW50LCBsYW1iZGEgcDogcCBpbiBhYl9wYXJ0aXRpb25zKQorICAgIGlmIE9QVElPTlMudmFiY19jb21wcmVzc2lvbl9wYXJhbSBhbmQgaW5mb19maWxlID09IERZTkFNSUNfUEFSVElUSU9OX0lORk86CisgICAgICBtb2RpZmllZF9pbmZvID0gTW9kaWZ5VkFCQ0NvbXByZXNzaW9uUGFyYW0oCisgICAgICAgICAgbW9kaWZpZWRfaW5mbywgT1BUSU9OUy52YWJjX2NvbXByZXNzaW9uX3BhcmFtKQorICAgIGNvbW1vbi5Xcml0ZVRvSW5wdXRGaWxlKGlucHV0X2ZpbGUsIGluZm9fZmlsZSwgbW9kaWZpZWRfaW5mbykKIAotICAgIGZvciBpbmZvX2ZpbGUgaW4gWydNRVRBL21pc2NfaW5mby50eHQnLCBEWU5BTUlDX1BBUlRJVElPTl9JTkZPXToKLSAgICAgIGlmIGluZm9fZmlsZSBub3QgaW4gaW5wdXRfemlwLm5hbWVsaXN0KCk6Ci0gICAgICAgIGxvZ2dlci53YXJuaW5nKCdDYW5ub3QgZmluZCAlcyBpbiBpbnB1dCB6aXBmaWxlJywgaW5mb19maWxlKQotICAgICAgICBjb250aW51ZQotICAgICAgY29udGVudCA9IGlucHV0X3ppcC5yZWFkKGluZm9fZmlsZSkuZGVjb2RlKCkKLSAgICAgIG1vZGlmaWVkX2luZm8gPSBVcGRhdGVzSW5mb0ZvclNwZWNpYWxVcGRhdGVzKAotICAgICAgICAgIGNvbnRlbnQsIGxhbWJkYSBwOiBwIGluIGFiX3BhcnRpdGlvbnMpCi0gICAgICBpZiBPUFRJT05TLnZhYmNfY29tcHJlc3Npb25fcGFyYW0gYW5kIGluZm9fZmlsZSA9PSBEWU5BTUlDX1BBUlRJVElPTl9JTkZPOgotICAgICAgICBtb2RpZmllZF9pbmZvID0gTW9kaWZ5VkFCQ0NvbXByZXNzaW9uUGFyYW0oCi0gICAgICAgICAgICBtb2RpZmllZF9pbmZvLCBPUFRJT05TLnZhYmNfY29tcHJlc3Npb25fcGFyYW0pCi0gICAgICBjb21tb24uWmlwV3JpdGVTdHIocGFydGlhbF90YXJnZXRfemlwLCBpbmZvX2ZpbGUsIG1vZGlmaWVkX2luZm8pCisgIGRlZiBJc0luUGFydGlhbExpc3QocG9zdGluc3RhbGxfbGluZTogc3RyKToKKyAgICBpZHggPSBwb3N0aW5zdGFsbF9saW5lLmZpbmQoIj0iKQorICAgIGlmIGlkeCA8IDA6CisgICAgICByZXR1cm4gRmFsc2UKKyAgICBrZXkgPSBwb3N0aW5zdGFsbF9saW5lWzppZHhdCisgICAgbG9nZ2VyLmluZm8oIiVzICVzIiwga2V5LCBhYl9wYXJ0aXRpb25zKQorICAgIGZvciBwYXJ0IGluIGFiX3BhcnRpdGlvbnM6CisgICAgICBpZiBrZXkuZW5kc3dpdGgoIl8iICsgcGFydCk6CisgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCiAKLSAgICAjIFRPRE8oeHVuY2hhbmcpIGhhbmRsZSBNRVRBL3Bvc3RpbnN0YWxsX2NvbmZpZy50eHQnCisgIGlmIGNvbW1vbi5Eb2VzSW5wdXRGaWxlQ29udGFpbihpbnB1dF9maWxlLCBQT1NUSU5TVEFMTF9DT05GSUcpOgorICAgIHBvc3RpbnN0YWxsX2NvbmZpZyA9IGNvbW1vbi5SZWFkRnJvbUlucHV0RmlsZSgKKyAgICAgICAgaW5wdXRfZmlsZSwgUE9TVElOU1RBTExfQ09ORklHKQorICAgIHBvc3RpbnN0YWxsX2NvbmZpZyA9IFsKKyAgICAgICAgbGluZSBmb3IgbGluZSBpbiBwb3N0aW5zdGFsbF9jb25maWcuc3BsaXRsaW5lcygpIGlmIElzSW5QYXJ0aWFsTGlzdChsaW5lKV0KKyAgICBpZiBwb3N0aW5zdGFsbF9jb25maWc6CisgICAgICBwb3N0aW5zdGFsbF9jb25maWcgPSAiXG4iLmpvaW4ocG9zdGluc3RhbGxfY29uZmlnKQorICAgICAgY29tbW9uLldyaXRlVG9JbnB1dEZpbGUoCisgICAgICAgICAgaW5wdXRfZmlsZSwgUE9TVElOU1RBTExfQ09ORklHLCBwb3N0aW5zdGFsbF9jb25maWcpCisgICAgZWxzZToKKyAgICAgIG9zLnVubGluayhvcy5wYXRoLmpvaW4oaW5wdXRfZmlsZSwgUE9TVElOU1RBTExfQ09ORklHKSkKIAotICBjb21tb24uWmlwQ2xvc2UocGFydGlhbF90YXJnZXRfemlwKQotCi0gIHJldHVybiBwYXJ0aWFsX3RhcmdldF9maWxlCisgIHJldHVybiBpbnB1dF9maWxlCiAKIAogZGVmIEdldFRhcmdldEZpbGVzWmlwRm9yUmV0cm9maXREeW5hbWljUGFydGl0aW9ucyhpbnB1dF9maWxlLApAQCAtNjY0LDIxICs3MTUsMTIgQEAKICAgcmVwbGFjZSA9IHsnT1RBL3N1cGVyX3t9LmltZycuZm9ybWF0KGRldik6ICdJTUFHRVMve30uaW1nJy5mb3JtYXQoZGV2KQogICAgICAgICAgICAgIGZvciBkZXYgaW4gc3VwZXJfYmxvY2tfZGV2aWNlc30KIAotICB0YXJnZXRfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJ0YXJnZXRmaWxlcy0iLCBzdWZmaXg9Ii56aXAiKQotICBzaHV0aWwuY29weWZpbGUoaW5wdXRfZmlsZSwgdGFyZ2V0X2ZpbGUpCi0KLSAgd2l0aCB6aXBmaWxlLlppcEZpbGUoaW5wdXRfZmlsZSwgYWxsb3daaXA2ND1UcnVlKSBhcyBpbnB1dF96aXA6Ci0gICAgbmFtZWxpc3QgPSBpbnB1dF96aXAubmFtZWxpc3QoKQotCi0gIGlucHV0X3RtcCA9IGNvbW1vbi5VbnppcFRlbXAoaW5wdXRfZmlsZSwgUkVUUk9GSVRfREFQX1VOWklQX1BBVFRFUk4pCi0KICAgIyBSZW1vdmUgcGFydGl0aW9ucyBmcm9tIE1FVEEvYWJfcGFydGl0aW9ucy50eHQgdGhhdCBpcyBpbgogICAjIGR5bmFtaWNfcGFydGl0aW9uX2xpc3QgYnV0IG5vdCBpbiBzdXBlcl9ibG9ja19kZXZpY2VzIHNvIHRoYXQKICAgIyBicmlsbG9fdXBkYXRlX3BheWxvYWQgd29uJ3QgZ2VuZXJhdGUgdXBkYXRlIGZvciB0aG9zZSBsb2dpY2FsIHBhcnRpdGlvbnMuCi0gIGFiX3BhcnRpdGlvbnNfZmlsZSA9IG9zLnBhdGguam9pbihpbnB1dF90bXAsICpBQl9QQVJUSVRJT05TLnNwbGl0KCcvJykpCi0gIHdpdGggb3BlbihhYl9wYXJ0aXRpb25zX2ZpbGUpIGFzIGY6Ci0gICAgYWJfcGFydGl0aW9uc19saW5lcyA9IGYucmVhZGxpbmVzKCkKLSAgICBhYl9wYXJ0aXRpb25zID0gW2xpbmUuc3RyaXAoKSBmb3IgbGluZSBpbiBhYl9wYXJ0aXRpb25zX2xpbmVzXQorICBhYl9wYXJ0aXRpb25zX2xpbmVzID0gY29tbW9uLlJlYWRGcm9tSW5wdXRGaWxlKAorICAgICAgaW5wdXRfZmlsZSwgQUJfUEFSVElUSU9OUykuc3BsaXQoIlxuIikKKyAgYWJfcGFydGl0aW9ucyA9IFtsaW5lLnN0cmlwKCkgZm9yIGxpbmUgaW4gYWJfcGFydGl0aW9uc19saW5lc10KICAgIyBBc3NlcnQgdGhhdCBhbGwgc3VwZXJfYmxvY2tfZGV2aWNlcyBhcmUgaW4gYWJfcGFydGl0aW9ucwogICBzdXBlcl9kZXZpY2Vfbm90X3VwZGF0ZWQgPSBbcGFydGl0aW9uIGZvciBwYXJ0aXRpb24gaW4gc3VwZXJfYmxvY2tfZGV2aWNlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcGFydGl0aW9uIG5vdCBpbiBhYl9wYXJ0aXRpb25zXQpAQCAtNjg2LDE1ICs3MjgsNiBAQAogICAgICAgInt9IGlzIGluIHN1cGVyX2Jsb2NrX2RldmljZXMgYnV0IG5vdCBpbiB7fSIuZm9ybWF0KAogICAgICAgICAgIHN1cGVyX2RldmljZV9ub3RfdXBkYXRlZCwgQUJfUEFSVElUSU9OUykKICAgIyBhYl9wYXJ0aXRpb25zIC09IChkeW5hbWljX3BhcnRpdGlvbl9saXN0IC0gc3VwZXJfYmxvY2tfZGV2aWNlcykKLSAgbmV3X2FiX3BhcnRpdGlvbnMgPSBjb21tb24uTWFrZVRlbXBGaWxlKAotICAgICAgcHJlZml4PSJhYl9wYXJ0aXRpb25zIiwgc3VmZml4PSIudHh0IikKLSAgd2l0aCBvcGVuKG5ld19hYl9wYXJ0aXRpb25zLCAndycpIGFzIGY6Ci0gICAgZm9yIHBhcnRpdGlvbiBpbiBhYl9wYXJ0aXRpb25zOgotICAgICAgaWYgKHBhcnRpdGlvbiBpbiBkeW5hbWljX3BhcnRpdGlvbl9saXN0IGFuZAotICAgICAgICAgICAgICBwYXJ0aXRpb24gbm90IGluIHN1cGVyX2Jsb2NrX2RldmljZXMpOgotICAgICAgICBsb2dnZXIuaW5mbygiRHJvcHBpbmcgJXMgZnJvbSBhYl9wYXJ0aXRpb25zLnR4dCIsIHBhcnRpdGlvbikKLSAgICAgICAgY29udGludWUKLSAgICAgIGYud3JpdGUocGFydGl0aW9uICsgIlxuIikKICAgdG9fZGVsZXRlID0gW0FCX1BBUlRJVElPTlNdCiAKICAgIyBBbHdheXMgc2tpcCBwb3N0aW5zdGFsbCBmb3IgYSByZXRyb2ZpdCB1cGRhdGUuCkBAIC03MDcsNjcgKzc0MCw1NyBAQAogICAjIFJlbW92ZSB0aGUgZXhpc3RpbmcgcGFydGl0aW9uIGltYWdlcyBhcyB3ZWxsIGFzIHRoZSBtYXAgZmlsZXMuCiAgIHRvX2RlbGV0ZSArPSBsaXN0KHJlcGxhY2UudmFsdWVzKCkpCiAgIHRvX2RlbGV0ZSArPSBbJ0lNQUdFUy97fS5tYXAnLmZvcm1hdChkZXYpIGZvciBkZXYgaW4gc3VwZXJfYmxvY2tfZGV2aWNlc10KLQotICBjb21tb24uWmlwRGVsZXRlKHRhcmdldF9maWxlLCB0b19kZWxldGUpCi0KLSAgdGFyZ2V0X3ppcCA9IHppcGZpbGUuWmlwRmlsZSh0YXJnZXRfZmlsZSwgJ2EnLCBhbGxvd1ppcDY0PVRydWUpCisgIGZvciBpdGVtIGluIHRvX2RlbGV0ZToKKyAgICBvcy51bmxpbmsob3MucGF0aC5qb2luKGlucHV0X2ZpbGUsIGl0ZW0pKQogCiAgICMgV3JpdGUgc3VwZXJfe2Zvb30uaW1nIGFzIHtmb299LmltZy4KICAgZm9yIHNyYywgZHN0IGluIHJlcGxhY2UuaXRlbXMoKToKLSAgICBhc3NlcnQgc3JjIGluIG5hbWVsaXN0LCBcCisgICAgYXNzZXJ0IERvZXNJbnB1dEZpbGVDb250YWluKGlucHV0X2ZpbGUsIHNyYyksIFwKICAgICAgICAgJ01pc3Npbmcge30gaW4ge307IHt9IGNhbm5vdCBiZSB3cml0dGVuJy5mb3JtYXQoc3JjLCBpbnB1dF9maWxlLCBkc3QpCi0gICAgdW56aXBwZWRfZmlsZSA9IG9zLnBhdGguam9pbihpbnB1dF90bXAsICpzcmMuc3BsaXQoJy8nKSkKLSAgICBjb21tb24uWmlwV3JpdGUodGFyZ2V0X3ppcCwgdW56aXBwZWRfZmlsZSwgYXJjbmFtZT1kc3QpCisgICAgc291cmNlX3BhdGggPSBvcy5wYXRoLmpvaW4oaW5wdXRfZmlsZSwgKnNyYy5zcGxpdCgiLyIpKQorICAgIHRhcmdldF9wYXRoID0gb3MucGF0aC5qb2luKGlucHV0X2ZpbGUsICpkc3Quc3BsaXQoIi8iKSkKKyAgICBvcy5yZW5hbWUoc291cmNlX3BhdGgsIHRhcmdldF9wYXRoKQogCiAgICMgV3JpdGUgbmV3IGFiX3BhcnRpdGlvbnMudHh0IGZpbGUKLSAgY29tbW9uLlppcFdyaXRlKHRhcmdldF96aXAsIG5ld19hYl9wYXJ0aXRpb25zLCBhcmNuYW1lPUFCX1BBUlRJVElPTlMpCisgIG5ld19hYl9wYXJ0aXRpb25zID0gb3MucGF0aC5qb2luKGlucHV0X2ZpbGUsIEFCX1BBUlRJVElPTlMpCisgIHdpdGggb3BlbihuZXdfYWJfcGFydGl0aW9ucywgJ3cnKSBhcyBmOgorICAgIGZvciBwYXJ0aXRpb24gaW4gYWJfcGFydGl0aW9uczoKKyAgICAgIGlmIChwYXJ0aXRpb24gaW4gZHluYW1pY19wYXJ0aXRpb25fbGlzdCBhbmQKKyAgICAgICAgICAgICAgcGFydGl0aW9uIG5vdCBpbiBzdXBlcl9ibG9ja19kZXZpY2VzKToKKyAgICAgICAgbG9nZ2VyLmluZm8oIkRyb3BwaW5nICVzIGZyb20gYWJfcGFydGl0aW9ucy50eHQiLCBwYXJ0aXRpb24pCisgICAgICAgIGNvbnRpbnVlCisgICAgICBmLndyaXRlKHBhcnRpdGlvbiArICJcbiIpCiAKLSAgY29tbW9uLlppcENsb3NlKHRhcmdldF96aXApCi0KLSAgcmV0dXJuIHRhcmdldF9maWxlCisgIHJldHVybiBpbnB1dF9maWxlCiAKIAotZGVmIEdldFRhcmdldEZpbGVzWmlwRm9yQ3VzdG9tSW1hZ2VzVXBkYXRlcyhpbnB1dF9maWxlLCBjdXN0b21faW1hZ2VzKToKK2RlZiBHZXRUYXJnZXRGaWxlc1ppcEZvckN1c3RvbUltYWdlc1VwZGF0ZXMoaW5wdXRfZmlsZSwgY3VzdG9tX2ltYWdlczogZGljdCk6CiAgICIiIlJldHVybnMgYSB0YXJnZXQtZmlsZXMuemlwIGZvciBjdXN0b20gcGFydGl0aW9ucyB1cGRhdGUuCiAKICAgVGhpcyBmdW5jdGlvbiBtb2RpZmllcyBhYl9wYXJ0aXRpb25zIGxpc3Qgd2l0aCB0aGUgZGVzaXJlZCBjdXN0b20gcGFydGl0aW9ucwogICBhbmQgcHV0cyB0aGUgY3VzdG9tIGltYWdlcyBpbnRvIHRoZSB0YXJnZXQgdGFyZ2V0LWZpbGVzLnppcC4KIAogICBBcmdzOgotICAgIGlucHV0X2ZpbGU6IFRoZSBpbnB1dCB0YXJnZXQtZmlsZXMuemlwIGZpbGVuYW1lLgorICAgIGlucHV0X2ZpbGU6IFRoZSBpbnB1dCB0YXJnZXQtZmlsZXMgZXh0cmFjdGVkIGRpcmVjdG9yeQogICAgIGN1c3RvbV9pbWFnZXM6IEEgbWFwIG9mIGN1c3RvbSBwYXJ0aXRpb25zIGFuZCBjdXN0b20gaW1hZ2VzLgogCiAgIFJldHVybnM6Ci0gICAgVGhlIGZpbGVuYW1lIG9mIGEgdGFyZ2V0LWZpbGVzLnppcCB3aGljaCBoYXMgcmVuYW1lZCB0aGUgY3VzdG9tIGltYWdlcyBpbgotICAgIHRoZSBJTUFHRVMvIHRvIHRoZWlyIHBhcnRpdGlvbiBuYW1lcy4KKyAgICBUaGUgZXh0cmFjdGVkIGRpciBvZiBhIHRhcmdldC1maWxlcy56aXAgd2hpY2ggaGFzIHJlbmFtZWQgdGhlIGN1c3RvbSBpbWFnZXMKKyAgICBpbiB0aGUgSU1BR0VTLyB0byB0aGVpciBwYXJ0aXRpb24gbmFtZXMuCiAgICIiIgorICBmb3IgY3VzdG9tX2ltYWdlIGluIGN1c3RvbV9pbWFnZXMudmFsdWVzKCk6CisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihpbnB1dF9maWxlLCAiSU1BR0VTIiwgY3VzdG9tX2ltYWdlKSk6CisgICAgICByYWlzZSBWYWx1ZUVycm9yKCJTcGVjaWZpZWQgY3VzdG9tIGltYWdlIHt9IG5vdCBmb3VuZCBpbiB0YXJnZXQgZmlsZXMge30sIGF2YWlsYWJsZSBpbWFnZXMgYXJlIHt9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tX2ltYWdlLCBpbnB1dF9maWxlLCBvcy5saXN0ZGlyKG9zLnBhdGguam9pbihpbnB1dF9maWxlLCAiSU1BR0VTIikpKQogCi0gICMgRmlyc3QgcGFzczogdXNlIHppcDJ6aXAgdG8gY29weSB0aGUgdGFyZ2V0IGZpbGVzIGNvbnRlbnRzLCBleGNsdWRpbmcKLSAgIyB0aGUgImN1c3RvbSIgaW1hZ2VzIHRoYXQgd2lsbCBiZSByZXBsYWNlZC4KLSAgdGFyZ2V0X2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0idGFyZ2V0ZmlsZXMtIiwgc3VmZml4PSIuemlwIikKLSAgY21kID0gWyd6aXAyemlwJywgJy1pJywgaW5wdXRfZmlsZSwgJy1vJywgdGFyZ2V0X2ZpbGVdCi0KLSAgaW1hZ2VzID0ge30KICAgZm9yIGN1c3RvbV9wYXJ0aXRpb24sIGN1c3RvbV9pbWFnZSBpbiBjdXN0b21faW1hZ2VzLml0ZW1zKCk6CiAgICAgZGVmYXVsdF9jdXN0b21faW1hZ2UgPSAne30uaW1nJy5mb3JtYXQoY3VzdG9tX3BhcnRpdGlvbikKICAgICBpZiBkZWZhdWx0X2N1c3RvbV9pbWFnZSAhPSBjdXN0b21faW1hZ2U6Ci0gICAgICBzcmMgPSAnSU1BR0VTLycgKyBjdXN0b21faW1hZ2UKLSAgICAgIGRzdCA9ICdJTUFHRVMvJyArIGRlZmF1bHRfY3VzdG9tX2ltYWdlCi0gICAgICBjbWQuZXh0ZW5kKFsnLXgnLCBkc3RdKQotICAgICAgaW1hZ2VzW2RzdF0gPSBzcmMKKyAgICAgIHNyYyA9IG9zLnBhdGguam9pbihpbnB1dF9maWxlLCAnSU1BR0VTJywgY3VzdG9tX2ltYWdlKQorICAgICAgZHN0ID0gb3MucGF0aC5qb2luKGlucHV0X2ZpbGUsICdJTUFHRVMnLCBkZWZhdWx0X2N1c3RvbV9pbWFnZSkKKyAgICAgIG9zLnJlbmFtZShzcmMsIGRzdCkKIAotICBjb21tb24uUnVuQW5kQ2hlY2tPdXRwdXQoY21kKQotCi0gICMgU2Vjb25kIHBhc3M6IHdyaXRlIHtjdXN0b21faW1hZ2V9LmltZyBhcyB7Y3VzdG9tX3BhcnRpdGlvbn0uaW1nLgotICB3aXRoIHppcGZpbGUuWmlwRmlsZShpbnB1dF9maWxlLCBhbGxvd1ppcDY0PVRydWUpIGFzIGlucHV0X3ppcDoKLSAgICB3aXRoIHppcGZpbGUuWmlwRmlsZSh0YXJnZXRfZmlsZSwgJ2EnLCBhbGxvd1ppcDY0PVRydWUpIGFzIG91dHB1dF96aXA6Ci0gICAgICBmb3IgZHN0LCBzcmMgaW4gaW1hZ2VzLml0ZW1zKCk6Ci0gICAgICAgIGRhdGEgPSBpbnB1dF96aXAucmVhZChzcmMpCi0gICAgICAgIGxvZ2dlci5pbmZvKCJVcGRhdGUgY3VzdG9tIHBhcnRpdGlvbiAnJXMnIiwgZHN0KQotICAgICAgICBjb21tb24uWmlwV3JpdGVTdHIob3V0cHV0X3ppcCwgZHN0LCBkYXRhKQotICAgICAgb3V0cHV0X3ppcC5jbG9zZSgpCi0KLSAgcmV0dXJuIHRhcmdldF9maWxlCisgIHJldHVybiBpbnB1dF9maWxlCiAKIAogZGVmIEdlbmVyYXRlUGFydGl0aW9uVGltZXN0YW1wRmxhZ3MocGFydGl0aW9uX3N0YXRlKToKQEAgLTgzMywxNCArODU2LDM2IEBACiAgIHJldHVybiBwYXR0ZXJuLnNlYXJjaChvdXRwdXQpIGlzIG5vdCBOb25lCiAKIAorZGVmIEV4dHJhY3RPckNvcHlUYXJnZXRGaWxlcyh0YXJnZXRfZmlsZSk6CisgIGlmIG9zLnBhdGguaXNkaXIodGFyZ2V0X2ZpbGUpOgorICAgIHJldHVybiBDb3B5VGFyZ2V0RmlsZXNEaXIodGFyZ2V0X2ZpbGUpCisgIGVsc2U6CisgICAgcmV0dXJuIEV4dHJhY3RUYXJnZXRGaWxlcyh0YXJnZXRfZmlsZSkKKworCitkZWYgVmFsaWRhdGVDb21wcmVzc2lvblBhcmFtKHRhcmdldF9pbmZvKToKKyAgdmFiY19jb21wcmVzc2lvbl9wYXJhbSA9IE9QVElPTlMudmFiY19jb21wcmVzc2lvbl9wYXJhbQorICBpZiB2YWJjX2NvbXByZXNzaW9uX3BhcmFtOgorICAgIG1pbmltdW1fYXBpX2xldmVsX3JlcXVpcmVkID0gVkFCQ19DT01QUkVTU0lPTl9QQVJBTV9TVVBQT1JUW3ZhYmNfY29tcHJlc3Npb25fcGFyYW0uc3BsaXQoIiwiKVswXV0KKyAgICBpZiB0YXJnZXRfaW5mby52ZW5kb3JfYXBpX2xldmVsIDwgbWluaW11bV9hcGlfbGV2ZWxfcmVxdWlyZWQ6CisgICAgICByYWlzZSBWYWx1ZUVycm9yKCJTcGVjaWZpZWQgVkFCQyBjb21wcmVzc2lvbiBwYXJhbSB7fSBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgQVBJIGxldmVsID49IHt9LCBkZXZpY2UgaXMgb24gQVBJIGxldmVsIHt9Ii5mb3JtYXQoCisgICAgICAgICAgdmFiY19jb21wcmVzc2lvbl9wYXJhbSwgbWluaW11bV9hcGlfbGV2ZWxfcmVxdWlyZWQsIHRhcmdldF9pbmZvLnZlbmRvcl9hcGlfbGV2ZWwpKQorCisKIGRlZiBHZW5lcmF0ZUFiT3RhUGFja2FnZSh0YXJnZXRfZmlsZSwgb3V0cHV0X2ZpbGUsIHNvdXJjZV9maWxlPU5vbmUpOgogICAiIiJHZW5lcmF0ZXMgYW4gQW5kcm9pZCBPVEEgcGFja2FnZSB0aGF0IGhhcyBBL0IgdXBkYXRlIHBheWxvYWQuIiIiCiAgICMgSWYgaW5wdXQgdGFyZ2V0X2ZpbGVzIGFyZSBkaXJlY3RvcmllcywgY3JlYXRlIGEgY29weSBzbyB0aGF0IHdlIGNhbiBtb2RpZnkKICAgIyB0aGVtIGRpcmVjdGx5Ci0gIGlmIG9zLnBhdGguaXNkaXIodGFyZ2V0X2ZpbGUpOgotICAgIHRhcmdldF9maWxlID0gQ29weVRhcmdldEZpbGVzRGlyKHRhcmdldF9maWxlKQotICBpZiBzb3VyY2VfZmlsZSBpcyBub3QgTm9uZSBhbmQgb3MucGF0aC5pc2Rpcihzb3VyY2VfZmlsZSk6Ci0gICAgc291cmNlX2ZpbGUgPSBDb3B5VGFyZ2V0RmlsZXNEaXIoc291cmNlX2ZpbGUpCisgIHRhcmdldF9pbmZvID0gY29tbW9uLkJ1aWxkSW5mbyhPUFRJT05TLmluZm9fZGljdCwgT1BUSU9OUy5vZW1fZGljdHMpCisgIGlmIE9QVElPTlMuZGlzYWJsZV92YWJjIGFuZCB0YXJnZXRfaW5mby5pc19yZWxlYXNlX2tleToKKyAgICByYWlzZSBWYWx1ZUVycm9yKCJEaXNhYmxpbmcgVkFCQyBvbiByZWxlYXNlLWtleSBidWlsZHMgaXMgbm90IHN1cHBvcnRlZC4iKQorCisgIFZhbGlkYXRlQ29tcHJlc3Npb25QYXJhbSh0YXJnZXRfaW5mbykKKyAgdmFiY19jb21wcmVzc2lvbl9wYXJhbSA9IHRhcmdldF9pbmZvLnZhYmNfY29tcHJlc3Npb25fcGFyYW0KKworICB0YXJnZXRfZmlsZSA9IEV4dHJhY3RPckNvcHlUYXJnZXRGaWxlcyh0YXJnZXRfZmlsZSkKKyAgaWYgc291cmNlX2ZpbGUgaXMgbm90IE5vbmU6CisgICAgc291cmNlX2ZpbGUgPSBFeHRyYWN0T3JDb3B5VGFyZ2V0RmlsZXMoc291cmNlX2ZpbGUpCiAgICMgU3RhZ2UgdGhlIG91dHB1dCB6aXAgcGFja2FnZSBmb3IgcGFja2FnZSBzaWduaW5nLgogICBpZiBub3QgT1BUSU9OUy5ub19zaWduaW5nOgogICAgIHN0YWdpbmdfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUoc3VmZml4PScuemlwJykKQEAgLTg1MSw3ICs4OTYsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd1ppcDY0PVRydWUpCiAKICAgaWYgc291cmNlX2ZpbGUgaXMgbm90IE5vbmU6Ci0gICAgc291cmNlX2ZpbGUgPSBvdGFfdXRpbHMuRXh0cmFjdFRhcmdldEZpbGVzKHNvdXJjZV9maWxlKQorICAgIHNvdXJjZV9maWxlID0gRXh0cmFjdFRhcmdldEZpbGVzKHNvdXJjZV9maWxlKQorICAgIGlmIE9QVElPTlMuZnVsbF9vdGFfcGFydGl0aW9uczoKKyAgICAgIGZvciBwYXJ0aXRpb24gaW4gT1BUSU9OUy5mdWxsX290YV9wYXJ0aXRpb25zOgorICAgICAgICBmb3Igc3ViZGlyIGluIFRBUkdFVF9GSUxFU19JTUFHRVNfU1VCRElSOgorICAgICAgICAgIGltYWdlX3BhdGggPSBvcy5wYXRoLmpvaW4oc291cmNlX2ZpbGUsIHN1YmRpciwgcGFydGl0aW9uICsgIi5pbWciKQorICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGltYWdlX3BhdGgpOgorICAgICAgICAgICAgbG9nZ2VyLmluZm8oCisgICAgICAgICAgICAgICAgIklnbm9yaW5nIHNvdXJjZSBpbWFnZSAlcyBmb3IgcGFydGl0aW9uICVzIGJlY2F1c2UgaXQgaXMgY29uZmlndXJlZCB0byB1c2UgZnVsbCBPVEEiLCBpbWFnZV9wYXRoLCBwYXJ0aXRpb24pCisgICAgICAgICAgICBvcy5yZW1vdmUoaW1hZ2VfcGF0aCkKICAgICBhc3NlcnQgImFiX3BhcnRpdGlvbnMiIGluIE9QVElPTlMuc291cmNlX2luZm9fZGljdCwgXAogICAgICAgICAiTUVUQS9hYl9wYXJ0aXRpb25zLnR4dCBpcyByZXF1aXJlZCBmb3IgYWJfdXBkYXRlLiIKICAgICBhc3NlcnQgImFiX3BhcnRpdGlvbnMiIGluIE9QVElPTlMudGFyZ2V0X2luZm9fZGljdCwgXApAQCAtODY1LDEwICs5MTgsMjIgQEAKICAgICBpZiBub3Qgc291cmNlX2luZm8uaXNfdmFiYyBvciBub3QgdGFyZ2V0X2luZm8uaXNfdmFiYzoKICAgICAgIGxvZ2dlci5pbmZvKCJFaXRoZXIgc291cmNlIG9yIHRhcmdldCBkb2VzIG5vdCBzdXBwb3J0IFZBQkMsIGRpc2FibGluZy4iKQogICAgICAgT1BUSU9OUy5kaXNhYmxlX3ZhYmMgPSBUcnVlCi0gICAgaWYgc291cmNlX2luZm8udmFiY19jb21wcmVzc2lvbl9wYXJhbSAhPSB0YXJnZXRfaW5mby52YWJjX2NvbXByZXNzaW9uX3BhcmFtOgorICAgIGlmIE9QVElPTlMudmFiY19jb21wcmVzc2lvbl9wYXJhbSBpcyBOb25lIGFuZCBcCisgICAgICAgICAgICBzb3VyY2VfaW5mby52YWJjX2NvbXByZXNzaW9uX3BhcmFtICE9IHRhcmdldF9pbmZvLnZhYmNfY29tcHJlc3Npb25fcGFyYW06CiAgICAgICBsb2dnZXIuaW5mbygiU291cmNlIGJ1aWxkIGFuZCB0YXJnZXQgYnVpbGQgdXNlIGRpZmZlcmVudCBjb21wcmVzc2lvbiBtZXRob2RzIHt9IHZzIHt9LCBkZWZhdWx0IHRvIHNvdXJjZSBidWlsZHMgcGFyYW1ldGVyIHt9Ii5mb3JtYXQoCiAgICAgICAgICAgc291cmNlX2luZm8udmFiY19jb21wcmVzc2lvbl9wYXJhbSwgdGFyZ2V0X2luZm8udmFiY19jb21wcmVzc2lvbl9wYXJhbSwgc291cmNlX2luZm8udmFiY19jb21wcmVzc2lvbl9wYXJhbSkpCi0gICAgICBPUFRJT05TLnZhYmNfY29tcHJlc3Npb25fcGFyYW0gPSBzb3VyY2VfaW5mby52YWJjX2NvbXByZXNzaW9uX3BhcmFtCisgICAgICB2YWJjX2NvbXByZXNzaW9uX3BhcmFtID0gc291cmNlX2luZm8udmFiY19jb21wcmVzc2lvbl9wYXJhbQorICAgICMgVmlydHVhbCBBQiBDb3cgdmVyc2lvbiAzIGlzIGludHJvZHVjZWQgaW4gQW5kcm9pZCBVIHdpdGggaW1wcm92ZWQgbWVtb3J5CisgICAgIyBhbmQgaW5zdGFsbCB0aW1lIHBlcmZvcm1hbmNlLiBBbGwgT1RBJ3Mgd2l0aAorICAgICMgYm90aCB0aGUgc291cmNlIGJ1aWxkIGFuZCB0YXJnZXQgYnVpbGQgd2l0aCBWSVJUVUFMX0FCX0NPV19WRVJTSU9OID0gMworICAgICMgY2FuIHN1cHBvcnQgdGhlIG5ldyBmb3JtYXQuIE90aGVyd2lzZSwgZmFsbGJhY2sgb24gb2xkZXIgdmVyc2lvbnMKKyAgICBpZiBub3QgT1BUSU9OUy52YWJjX2Nvd192ZXJzaW9uOgorICAgICAgaWYgbm90IHNvdXJjZV9pbmZvLnZhYmNfY293X3ZlcnNpb24gb3Igbm90IHRhcmdldF9pbmZvLnZhYmNfY293X3ZlcnNpb246CisgICAgICAgIGxvZ2dlci5pbmZvKCJTb3VyY2Ugb3IgVGFyZ2V0IGRvZXNuJ3QgaGF2ZSBWQUJDX0NPV19WRVJTSU9OIHNwZWNpZmllZCwgZGVmYXVsdCB0byB2ZXJzaW9uIDIiKQorICAgICAgICBPUFRJT05TLnZhYmNfY293X3ZlcnNpb24gPSAyCisgICAgICBlbGlmIHNvdXJjZV9pbmZvLnZhYmNfY293X3ZlcnNpb24gIT0gdGFyZ2V0X2luZm8udmFiY19jb3dfdmVyc2lvbjoKKyAgICAgICAgbG9nZ2VyLmluZm8oIlNvdXJjZSBhbmQgVGFyZ2V0IGhhdmUgZGlmZmVyZW50IGNvdyBWQUJDX0NPV19WRVJTSU9OIHNwZWNpZmllZCwgZGVmYXVsdCB0byBtaW5pbXVtIHZlcnNpb24iKQorICAgICAgICBPUFRJT05TLnZhYmNfY293X3ZlcnNpb24gPSBtaW4oc291cmNlX2luZm8udmFiY19jb3dfdmVyc2lvbiwgdGFyZ2V0X2luZm8udmFiY19jb3dfdmVyc2lvbikKIAogICAgICMgVmlydHVhbCBBQiBDb21wcmVzc2lvbiB3YXMgaW50cm9kdWNlZCBpbiBBbmRyb2QgUy4KICAgICAjIExhdGVyLCB3ZSBiYWNrcG9ydGVkIFZBQkMgdG8gQW5kcm9pZCBSLiBCdXQgdmVyaXR5IHN1cHBvcnQgd2FzIG5vdApAQCAtODgxLDExICs5NDYsMjQgQEAKICAgZWxzZToKICAgICBhc3NlcnQgImFiX3BhcnRpdGlvbnMiIGluIE9QVElPTlMuaW5mb19kaWN0LCBcCiAgICAgICAgICJNRVRBL2FiX3BhcnRpdGlvbnMudHh0IGlzIHJlcXVpcmVkIGZvciBhYl91cGRhdGUuIgotICAgIHRhcmdldF9pbmZvID0gY29tbW9uLkJ1aWxkSW5mbyhPUFRJT05TLmluZm9fZGljdCwgT1BUSU9OUy5vZW1fZGljdHMpCiAgICAgc291cmNlX2luZm8gPSBOb25lCi0gICAgaWYgdGFyZ2V0X2luZm8udmFiY19jb21wcmVzc2lvbl9wYXJhbToKKyAgICBpZiBub3QgT1BUSU9OUy52YWJjX2Nvd192ZXJzaW9uOgorICAgICAgaWYgbm90IHRhcmdldF9pbmZvLnZhYmNfY293X3ZlcnNpb246CisgICAgICAgICAgT1BUSU9OUy52YWJjX2Nvd192ZXJzaW9uID0gMgorICAgICAgZWxpZiB0YXJnZXRfaW5mby52YWJjX2Nvd192ZXJzaW9uID49ICIzIiBhbmQgdGFyZ2V0X2luZm8udmVuZG9yX2FwaV9sZXZlbCA8IDM1OgorICAgICAgICBsb2dnZXIud2FybmluZygKKyAgICAgICAgICAgICAgIlRoaXMgZnVsbCBPVEEgaXMgY29uZmlndXJlZCB0byB1c2UgVkFCQyBjb3cgdmVyc2lvbiIKKyAgICAgICAgICAgICAgIiAzIHdoaWNoIGlzIHN1cHBvcnRlZCBzaW5jZSIKKyAgICAgICAgICAgICAgIiBBbmRyb2lkIEFQSSBsZXZlbCAzNSwgYnV0IGRldmljZSBpcyAiCisgICAgICAgICAgICAgICJsYXVuY2hlZCB3aXRoIHt9IC4gSWYgdGhpcyBmdWxsIE9UQSBpcyIKKyAgICAgICAgICAgICAgIiBzZXJ2ZWQgdG8gYSBkZXZpY2UgcnVubmluZyBvbGQgYnVpbGQsIE9UQSBtaWdodCBmYWlsIGR1ZSB0byAiCisgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCB2YWJjIGNvdyB2ZXJzaW9uLiBGb3Igc2FmZXR5LCB2ZXJzaW9uIDIgaXMgdXNlZCBiZWNhdXNlICIKKyAgICAgICAgICAgICAgIml0J3Mgc3VwcG9ydGVkIHNpbmNlIGRheSAxLiIuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgdGFyZ2V0X2luZm8udmVuZG9yX2FwaV9sZXZlbCkpCisgICAgICAgIE9QVElPTlMudmFiY19jb3dfdmVyc2lvbiA9IDIKKyAgICBpZiBPUFRJT05TLnZhYmNfY29tcHJlc3Npb25fcGFyYW0gaXMgTm9uZSBhbmQgdmFiY19jb21wcmVzc2lvbl9wYXJhbToKICAgICAgIG1pbmltdW1fYXBpX2xldmVsX3JlcXVpcmVkID0gVkFCQ19DT01QUkVTU0lPTl9QQVJBTV9TVVBQT1JUWwotICAgICAgICAgIHRhcmdldF9pbmZvLnZhYmNfY29tcHJlc3Npb25fcGFyYW1dCisgICAgICAgICAgdmFiY19jb21wcmVzc2lvbl9wYXJhbV0KICAgICAgIGlmIHRhcmdldF9pbmZvLnZlbmRvcl9hcGlfbGV2ZWwgPCBtaW5pbXVtX2FwaV9sZXZlbF9yZXF1aXJlZDoKICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAiVGhpcyBmdWxsIE9UQSBpcyBjb25maWd1cmVkIHRvIHVzZSBWQUJDIGNvbXByZXNzaW9uIGFsZ29yaXRobSIKQEAgLTg5NSwxMCArOTczLDEwIEBACiAgICAgICAgICAgICAiIHNlcnZlZCB0byBhIGRldmljZSBydW5uaW5nIG9sZCBidWlsZCwgT1RBIG1pZ2h0IGZhaWwgZHVlIHRvICIKICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBjb21wcmVzc2lvbiBwYXJhbWV0ZXIuIEZvciBzYWZldHksIGd6IGlzIHVzZWQgYmVjYXVzZSAiCiAgICAgICAgICAgICAiaXQncyBzdXBwb3J0ZWQgc2luY2UgZGF5IDEuIi5mb3JtYXQoCi0gICAgICAgICAgICAgICAgdGFyZ2V0X2luZm8udmFiY19jb21wcmVzc2lvbl9wYXJhbSwKKyAgICAgICAgICAgICAgICB2YWJjX2NvbXByZXNzaW9uX3BhcmFtLAogICAgICAgICAgICAgICAgIG1pbmltdW1fYXBpX2xldmVsX3JlcXVpcmVkLAogICAgICAgICAgICAgICAgIHRhcmdldF9pbmZvLnZlbmRvcl9hcGlfbGV2ZWwpKQotICAgICAgICBPUFRJT05TLnZhYmNfY29tcHJlc3Npb25fcGFyYW0gPSAiZ3oiCisgICAgICAgIHZhYmNfY29tcHJlc3Npb25fcGFyYW0gPSAiZ3oiCiAKICAgaWYgT1BUSU9OUy5wYXJ0aWFsID09IFtdOgogICAgIGxvZ2dlci5pbmZvKApAQCAtOTU0LDEwICsxMDMyLDE2IEBACiAgICAgICBsb2dnZXIuZXJyb3IoIlZBQkMgWE9SIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyB2ZW5kb3IsIGRpc2FibGluZyIpCiAgICAgICBPUFRJT05TLmVuYWJsZV92YWJjX3hvciA9IEZhbHNlCiAKKyAgaWYgT1BUSU9OUy52YWJjX2NvbXByZXNzaW9uX3BhcmFtOgorICAgIHZhYmNfY29tcHJlc3Npb25fcGFyYW0gPSBPUFRJT05TLnZhYmNfY29tcHJlc3Npb25fcGFyYW0KKwogICBhZGRpdGlvbmFsX2FyZ3MgPSBbXQogCiAgICMgUHJlcGFyZSBjdXN0b20gaW1hZ2VzLgogICBpZiBPUFRJT05TLmN1c3RvbV9pbWFnZXM6CisgICAgaWYgc291cmNlX2ZpbGUgaXMgbm90IE5vbmU6CisgICAgICBzb3VyY2VfZmlsZSA9IEdldFRhcmdldEZpbGVzWmlwRm9yQ3VzdG9tSW1hZ2VzVXBkYXRlcygKKyAgICAgICAgICAgc291cmNlX2ZpbGUsIE9QVElPTlMuY3VzdG9tX2ltYWdlcykKICAgICB0YXJnZXRfZmlsZSA9IEdldFRhcmdldEZpbGVzWmlwRm9yQ3VzdG9tSW1hZ2VzVXBkYXRlcygKICAgICAgICAgdGFyZ2V0X2ZpbGUsIE9QVElPTlMuY3VzdG9tX2ltYWdlcykKIApAQCAtOTY4LDI3ICsxMDUyLDQwIEBACiAgIGVsaWYgT1BUSU9OUy5wYXJ0aWFsOgogICAgIHRhcmdldF9maWxlID0gR2V0VGFyZ2V0RmlsZXNaaXBGb3JQYXJ0aWFsVXBkYXRlcyh0YXJnZXRfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OUy5wYXJ0aWFsKQotICBlbGlmIE9QVElPTlMudmFiY19jb21wcmVzc2lvbl9wYXJhbToKKyAgaWYgdmFiY19jb21wcmVzc2lvbl9wYXJhbSAhPSB0YXJnZXRfaW5mby52YWJjX2NvbXByZXNzaW9uX3BhcmFtOgogICAgIHRhcmdldF9maWxlID0gR2V0VGFyZ2V0RmlsZXNaaXBGb3JDdXN0b21WQUJDQ29tcHJlc3Npb24oCi0gICAgICAgIHRhcmdldF9maWxlLCBPUFRJT05TLnZhYmNfY29tcHJlc3Npb25fcGFyYW0pCi0gIGVsaWYgT1BUSU9OUy5za2lwX3Bvc3RpbnN0YWxsOgorICAgICAgICB0YXJnZXRfZmlsZSwgdmFiY19jb21wcmVzc2lvbl9wYXJhbSkKKyAgaWYgT1BUSU9OUy52YWJjX2Nvd192ZXJzaW9uOgorICAgIHRhcmdldF9maWxlID0gTW9kaWZ5VGFyZ2V0RmlsZXNEeW5hbWljUGFydGl0aW9uSW5mbyh0YXJnZXRfZmlsZSwgInZpcnR1YWxfYWJfY293X3ZlcnNpb24iLCBPUFRJT05TLnZhYmNfY293X3ZlcnNpb24pCisgIGlmIE9QVElPTlMuY29tcHJlc3Npb25fZmFjdG9yOgorICAgIHRhcmdldF9maWxlID0gTW9kaWZ5VGFyZ2V0RmlsZXNEeW5hbWljUGFydGl0aW9uSW5mbyh0YXJnZXRfZmlsZSwgInZpcnR1YWxfYWJfY29tcHJlc3Npb25fZmFjdG9yIiwgT1BUSU9OUy5jb21wcmVzc2lvbl9mYWN0b3IpCisgIGlmIE9QVElPTlMuc2tpcF9wb3N0aW5zdGFsbDoKICAgICB0YXJnZXRfZmlsZSA9IEdldFRhcmdldEZpbGVzWmlwV2l0aG91dFBvc3RpbnN0YWxsQ29uZmlnKHRhcmdldF9maWxlKQogICAjIFRhcmdldF9maWxlIG1heSBoYXZlIGJlZW4gbW9kaWZpZWQsIHJlcGFyc2UgYWJfcGFydGl0aW9ucwogICB0YXJnZXRfaW5mby5pbmZvX2RpY3RbJ2FiX3BhcnRpdGlvbnMnXSA9IGNvbW1vbi5SZWFkRnJvbUlucHV0RmlsZSh0YXJnZXRfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJfUEFSVElUSU9OUykuc3RyaXAoKS5zcGxpdCgiXG4iKQogCisgIGZyb20gY2hlY2tfdGFyZ2V0X2ZpbGVzX3ZpbnRmIGltcG9ydCBDaGVja1ZpbnRmSWZUcmVibGVFbmFibGVkCiAgIENoZWNrVmludGZJZlRyZWJsZUVuYWJsZWQodGFyZ2V0X2ZpbGUsIHRhcmdldF9pbmZvKQogCisgICMgQWxsb3cgYm9vdF92YXJpYWJsZV9maWxlIHRvIGFsc28gZXhpc3QgaW4gdGFyZ2V0LWZpbGVzCisgIGlmIE9QVElPTlMuYm9vdF92YXJpYWJsZV9maWxlOgorICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShPUFRJT05TLmJvb3RfdmFyaWFibGVfZmlsZSk6CisgICAgICBPUFRJT05TLmJvb3RfdmFyaWFibGVfZmlsZSA9IG9zLnBhdGguam9pbih0YXJnZXRfZmlsZSwgT1BUSU9OUy5ib290X3ZhcmlhYmxlX2ZpbGUpCiAgICMgTWV0YWRhdGEgdG8gY29tcGx5IHdpdGggQW5kcm9pZCBPVEEgcGFja2FnZSBmb3JtYXQuCiAgIG1ldGFkYXRhID0gR2V0UGFja2FnZU1ldGFkYXRhKHRhcmdldF9pbmZvLCBzb3VyY2VfaW5mbykKICAgIyBHZW5lcmF0ZSBwYXlsb2FkLgogICBwYXlsb2FkID0gUGF5bG9hZEdlbmVyYXRvcigKLSAgICAgIHdpcGVfdXNlcl9kYXRhPU9QVElPTlMud2lwZV91c2VyX2RhdGEsIG1pbm9yX3ZlcnNpb249T1BUSU9OUy5mb3JjZV9taW5vcl92ZXJzaW9uLCBpc19wYXJ0aWFsX3VwZGF0ZT1PUFRJT05TLnBhcnRpYWwpCisgICAgICB3aXBlX3VzZXJfZGF0YT1PUFRJT05TLndpcGVfdXNlcl9kYXRhLCBtaW5vcl92ZXJzaW9uPU9QVElPTlMuZm9yY2VfbWlub3JfdmVyc2lvbiwgaXNfcGFydGlhbF91cGRhdGU9T1BUSU9OUy5wYXJ0aWFsLCBzcGxfZG93bmdyYWRlPU9QVElPTlMuc3BsX2Rvd25ncmFkZSkKIAogICBwYXJ0aXRpb25fdGltZXN0YW1wc19mbGFncyA9IFtdCiAgICMgRW5mb3JjZSBhIG1heCB0aW1lc3RhbXAgdGhpcyBwYXlsb2FkIGNhbiBiZSBhcHBsaWVkIG9uIHRvcCBvZi4KICAgaWYgT1BUSU9OUy5kb3duZ3JhZGU6Ci0gICAgbWF4X3RpbWVzdGFtcCA9IHNvdXJjZV9pbmZvLkdldEJ1aWxkUHJvcCgicm8uYnVpbGQuZGF0ZS51dGMiKQorICAgICMgV2hlbiBnZW5lcmF0aW5nIG90YSBiZXR3ZWVuIG1lcmdlZCB0YXJnZXQtZmlsZXMsIHBhcnRpdGlvbiBidWlsZCBkYXRlIGNhbgorICAgICMgZGVjcmVhc2UgaW4gdGFyZ2V0LCBhdCB0aGUgc2FtZSB0aW1lIGFzIHJvLmJ1aWxkLmRhdGUudXRjIGluY3JlYXNlcywKKyAgICAjIHNvIGFsd2F5cyBwaWNrIGxhcmdlc3QgdmFsdWUuCisgICAgbWF4X3RpbWVzdGFtcCA9IG1heChzb3VyY2VfaW5mby5HZXRCdWlsZFByb3AoInJvLmJ1aWxkLmRhdGUudXRjIiksCisgICAgICAgIHN0cihtZXRhZGF0YS5wb3N0Y29uZGl0aW9uLnRpbWVzdGFtcCkpCiAgICAgcGFydGl0aW9uX3RpbWVzdGFtcHNfZmxhZ3MgPSBHZW5lcmF0ZVBhcnRpdGlvblRpbWVzdGFtcEZsYWdzRG93bmdyYWRlKAogICAgICAgICBtZXRhZGF0YS5wcmVjb25kaXRpb24ucGFydGl0aW9uX3N0YXRlLAogICAgICAgICBtZXRhZGF0YS5wb3N0Y29uZGl0aW9uLnBhcnRpdGlvbl9zdGF0ZQpAQCAtMTAxNSw2ICsxMTEyLDkgQEAKIAogICBhZGRpdGlvbmFsX2FyZ3MgKz0gWyItLWVuYWJsZV96dWNjaGluaT0iICsKICAgICAgICAgICAgICAgICAgICAgICBzdHIoT1BUSU9OUy5lbmFibGVfenVjY2hpbmkpLmxvd2VyKCldCisgIGlmIE9QVElPTlMuZW5hYmxlX3B1ZmZkaWZmIGlzIG5vdCBOb25lOgorICAgIGFkZGl0aW9uYWxfYXJncyArPSBbIi0tZW5hYmxlX3B1ZmZkaWZmPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgc3RyKE9QVElPTlMuZW5hYmxlX3B1ZmZkaWZmKS5sb3dlcigpXQogCiAgIGlmIG5vdCBvdGFfdXRpbHMuSXNMejRkaWZmQ29tcGF0aWJsZShzb3VyY2VfZmlsZSwgdGFyZ2V0X2ZpbGUpOgogICAgIGxvZ2dlci53YXJuaW5nKApAQCAtMTAyNCwxNyArMTEyNCwxOCBAQAogICBhZGRpdGlvbmFsX2FyZ3MgKz0gWyItLWVuYWJsZV9sejRkaWZmPSIgKwogICAgICAgICAgICAgICAgICAgICAgIHN0cihPUFRJT05TLmVuYWJsZV9sejRkaWZmKS5sb3dlcigpXQogCisgIGVudl9vdmVycmlkZSA9IHt9CiAgIGlmIHNvdXJjZV9maWxlIGFuZCBPUFRJT05TLmVuYWJsZV9sejRkaWZmOgotICAgIGlucHV0X3RtcCA9IGNvbW1vbi5VbnppcFRlbXAoc291cmNlX2ZpbGUsIFsiTUVUQS9saWJsejQuc28iXSkKLSAgICBsaWJsejRfcGF0aCA9IG9zLnBhdGguam9pbihpbnB1dF90bXAsICJNRVRBIiwgImxpYmx6NC5zbyIpCisgICAgbGlibHo0X3BhdGggPSBvcy5wYXRoLmpvaW4oc291cmNlX2ZpbGUsICJNRVRBIiwgImxpYmx6NC5zbyIpCiAgICAgYXNzZXJ0IG9zLnBhdGguZXhpc3RzKAogICAgICAgICBsaWJsejRfcGF0aCksICJsaWJsejQuc28gbm90IGZvdW5kIGluIE1FVEEvIGRpciBvZiB0YXJnZXQgZmlsZSB7fSIuZm9ybWF0KGxpYmx6NF9wYXRoKQogICAgIGxvZ2dlci5pbmZvKCJFbmFibGluZyBsejRkaWZmICVzIiwgbGlibHo0X3BhdGgpCi0gICAgYWRkaXRpb25hbF9hcmdzICs9IFsiLS1saWJsejRfcGF0aCIsIGxpYmx6NF9wYXRoXQogICAgIGVyb2ZzX2NvbXByZXNzaW9uX3BhcmFtID0gT1BUSU9OUy50YXJnZXRfaW5mb19kaWN0LmdldCgKICAgICAgICAgImVyb2ZzX2RlZmF1bHRfY29tcHJlc3NvciIpCiAgICAgYXNzZXJ0IGVyb2ZzX2NvbXByZXNzaW9uX3BhcmFtIGlzIG5vdCBOb25lLCAiJ2Vyb2ZzX2RlZmF1bHRfY29tcHJlc3Nvcicgbm90IGZvdW5kIGluIE1FVEEvbWlzY19pbmZvLnR4dCBvZiB0YXJnZXQgYnVpbGQuIFRoaXMgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIGx6NGRpZmYuIgogICAgIGFkZGl0aW9uYWxfYXJncyArPSBbIi0tZXJvZnNfY29tcHJlc3Npb25fcGFyYW0iLCBlcm9mc19jb21wcmVzc2lvbl9wYXJhbV0KKyAgICBlbnZfb3ZlcnJpZGVbIkxEX1BSRUxPQUQiXSA9IGxpYmx6NF9wYXRoICsgXAorICAgICAgICAiOiIgKyBvcy5lbnZpcm9uLmdldCgiTERfUFJFTE9BRCIsICIiKQogCiAgIGlmIE9QVElPTlMuZGlzYWJsZV92YWJjOgogICAgIGFkZGl0aW9uYWxfYXJncyArPSBbIi0tZGlzYWJsZV92YWJjPXRydWUiXQpAQCAtMTA0NCwxMCArMTE0NSwxNSBAQAogICAgIGFkZGl0aW9uYWxfYXJncyArPSBbIi0tY29tcHJlc3Nvcl90eXBlcyIsIE9QVElPTlMuY29tcHJlc3Nvcl90eXBlc10KICAgYWRkaXRpb25hbF9hcmdzICs9IFsiLS1tYXhfdGltZXN0YW1wIiwgbWF4X3RpbWVzdGFtcF0KIAorICBlbnYgPSBkaWN0KG9zLmVudmlyb24pCisgIGlmIGVudl9vdmVycmlkZToKKyAgICBsb2dnZXIuaW5mbygiVXNpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzICVzIiwgZW52X292ZXJyaWRlKQorICAgIGVudi51cGRhdGUoZW52X292ZXJyaWRlKQogICBwYXlsb2FkLkdlbmVyYXRlKAogICAgICAgdGFyZ2V0X2ZpbGUsCiAgICAgICBzb3VyY2VfZmlsZSwKLSAgICAgIGFkZGl0aW9uYWxfYXJncyArIHBhcnRpdGlvbl90aW1lc3RhbXBzX2ZsYWdzCisgICAgICBhZGRpdGlvbmFsX2FyZ3MgKyBwYXJ0aXRpb25fdGltZXN0YW1wc19mbGFncywKKyAgICAgIGVudj1lbnYKICAgKQogCiAgICMgU2lnbiB0aGUgcGF5bG9hZC4KQEAgLTEwODcsNiArMTE5Myw4IEBACiAgICAgICAjIFpJUF9TVE9SRUQuCiAgICAgICBjb21tb24uWmlwV3JpdGVTdHIob3V0cHV0X3ppcCwgY2FyZV9tYXBfbmFtZSwgY2FyZV9tYXBfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc190eXBlPXppcGZpbGUuWklQX1NUT1JFRCkKKyAgICAgICMgYnJlYWsgaGVyZSB0byBhdm9pZCBnb2luZyBpbnRvIGVsc2Ugd2hlbiBjYXJlIG1hcCBoYXMgYmVlbiBoYW5kbGVkCisgICAgICBicmVhawogICAgIGVsc2U6CiAgICAgICBsb2dnZXIud2FybmluZygiQ2Fubm90IGZpbmQgY2FyZSBtYXAgZmlsZSBpbiB0YXJnZXRfZmlsZSBwYWNrYWdlIikKIApAQCAtMTEwNywxMCArMTIxNSw4IEBACiAKIGRlZiBtYWluKGFyZ3YpOgogCi0gIGRlZiBvcHRpb25faGFuZGxlcihvLCBhKToKLSAgICBpZiBvIGluICgiLWsiLCAiLS1wYWNrYWdlX2tleSIpOgotICAgICAgT1BUSU9OUy5wYWNrYWdlX2tleSA9IGEKLSAgICBlbGlmIG8gaW4gKCItaSIsICItLWluY3JlbWVudGFsX2Zyb20iKToKKyAgZGVmIG9wdGlvbl9oYW5kbGVyKG8sIGE6IHN0cik6CisgICAgaWYgbyBpbiAoIi1pIiwgIi0taW5jcmVtZW50YWxfZnJvbSIpOgogICAgICAgT1BUSU9OUy5pbmNyZW1lbnRhbF9zb3VyY2UgPSBhCiAgICAgZWxpZiBvID09ICItLWZ1bGxfcmFkaW8iOgogICAgICAgT1BUSU9OUy5mdWxsX3JhZGlvID0gVHJ1ZQpAQCAtMTE1NSwxNyArMTI2MSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgImEgZmxvYXQiICUgKGEsIG8pKQogICAgIGVsaWYgbyA9PSAiLS1sb2dfZGlmZiI6CiAgICAgICBPUFRJT05TLmxvZ19kaWZmID0gYQotICAgIGVsaWYgbyA9PSAiLS1wYXlsb2FkX3NpZ25lciI6Ci0gICAgICBPUFRJT05TLnBheWxvYWRfc2lnbmVyID0gYQotICAgIGVsaWYgbyA9PSAiLS1wYXlsb2FkX3NpZ25lcl9hcmdzIjoKLSAgICAgIE9QVElPTlMucGF5bG9hZF9zaWduZXJfYXJncyA9IHNobGV4LnNwbGl0KGEpCi0gICAgZWxpZiBvID09ICItLXBheWxvYWRfc2lnbmVyX21heGltdW1fc2lnbmF0dXJlX3NpemUiOgotICAgICAgT1BUSU9OUy5wYXlsb2FkX3NpZ25lcl9tYXhpbXVtX3NpZ25hdHVyZV9zaXplID0gYQotICAgIGVsaWYgbyA9PSAiLS1wYXlsb2FkX3NpZ25lcl9rZXlfc2l6ZSI6Ci0gICAgICAjIFRPRE8oWHVuY2hhbmcpIHJlbW92ZSB0aGlzIG9wdGlvbiBhZnRlciBjbGVhbmluZyB1cCB0aGUgY2FsbGVycy4KLSAgICAgIGxvZ2dlci53YXJuaW5nKCJUaGUgb3B0aW9uICctLXBheWxvYWRfc2lnbmVyX2tleV9zaXplJyBpcyBkZXByZWNhdGVkLiIKLSAgICAgICAgICAgICAgICAgICAgICIgVXNlICctLXBheWxvYWRfc2lnbmVyX21heGltdW1fc2lnbmF0dXJlX3NpemUnIGluc3RlYWQuIikKLSAgICAgIE9QVElPTlMucGF5bG9hZF9zaWduZXJfbWF4aW11bV9zaWduYXR1cmVfc2l6ZSA9IGEKICAgICBlbGlmIG8gPT0gIi0tZXh0cmFjdGVkX2lucHV0X3RhcmdldF9maWxlcyI6CiAgICAgICBPUFRJT05TLmV4dHJhY3RlZF9pbnB1dCA9IGEKICAgICBlbGlmIG8gPT0gIi0tc2tpcF9wb3N0aW5zdGFsbCI6CkBAIC0xMjEyLDExICsxMzA3LDIwIEBACiAgICAgZWxpZiBvID09ICItLWVuYWJsZV96dWNjaGluaSI6CiAgICAgICBhc3NlcnQgYS5sb3dlcigpIGluIFsidHJ1ZSIsICJmYWxzZSJdCiAgICAgICBPUFRJT05TLmVuYWJsZV96dWNjaGluaSA9IGEubG93ZXIoKSAhPSAiZmFsc2UiCisgICAgZWxpZiBvID09ICItLWVuYWJsZV9wdWZmZGlmZiI6CisgICAgICBhc3NlcnQgYS5sb3dlcigpIGluIFsidHJ1ZSIsICJmYWxzZSJdCisgICAgICBPUFRJT05TLmVuYWJsZV9wdWZmZGlmZiA9IGEubG93ZXIoKSAhPSAiZmFsc2UiCiAgICAgZWxpZiBvID09ICItLWVuYWJsZV9sejRkaWZmIjoKICAgICAgIGFzc2VydCBhLmxvd2VyKCkgaW4gWyJ0cnVlIiwgImZhbHNlIl0KICAgICAgIE9QVElPTlMuZW5hYmxlX2x6NGRpZmYgPSBhLmxvd2VyKCkgIT0gImZhbHNlIgogICAgIGVsaWYgbyA9PSAiLS12YWJjX2NvbXByZXNzaW9uX3BhcmFtIjoKKyAgICAgIHdvcmRzID0gYS5zcGxpdCgiLCIpCisgICAgICBhc3NlcnQgbGVuKHdvcmRzKSA+PSAxIGFuZCBsZW4od29yZHMpIDw9IDIKICAgICAgIE9QVElPTlMudmFiY19jb21wcmVzc2lvbl9wYXJhbSA9IGEubG93ZXIoKQorICAgICAgaWYgbGVuKHdvcmRzKSA9PSAyOgorICAgICAgICBpZiBub3Qgd29yZHNbMV0ubHN0cmlwKCItIikuaXNkaWdpdCgpOgorICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbm5vdCBwYXJzZSB2YWx1ZSAlciBmb3Igb3B0aW9uICRDT01QUkVTU0lPTl9MRVZFTCAtIG9ubHkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXJzIGFyZSBhbGxvd2VkLiIgJSB3b3Jkc1sxXSkKICAgICBlbGlmIG8gPT0gIi0tc2VjdXJpdHlfcGF0Y2hfbGV2ZWwiOgogICAgICAgT1BUSU9OUy5zZWN1cml0eV9wYXRjaF9sZXZlbCA9IGEKICAgICBlbGlmIG8gaW4gKCItLW1heF90aHJlYWRzIik6CkBAIC0xMjI1LDYgKzEzMjksMjIgQEAKICAgICAgIGVsc2U6CiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbm5vdCBwYXJzZSB2YWx1ZSAlciBmb3Igb3B0aW9uICVyIC0gb25seSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXJzIGFyZSBhbGxvd2VkLiIgJSAoYSwgbykpCisgICAgZWxpZiBvIGluICgiLS1jb21wcmVzc2lvbl9mYWN0b3IiKToKKyAgICAgICAgdmFsdWVzID0gWyI0ayIsICI4ayIsICIxNmsiLCAiMzJrIiwgIjY0ayIsICIxMjhrIiwgIjI1NmsiXQorICAgICAgICBpZiBhWzotMV0uaXNkaWdpdCgpIGFuZCBhIGluIHZhbHVlcyBhbmQgYS5lbmRzd2l0aCgiayIpOgorICAgICAgICAgICAgT1BUSU9OUy5jb21wcmVzc2lvbl9mYWN0b3IgPSBzdHIoaW50KGFbOi0xXSkgKiAxMDI0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiUGxlYXNlIHNwZWNpZnkgdmFsdWUgZnJvbSBmb2xsb3dpbmcgb3B0aW9uczogNGssIDhrLCAxNmssIDMyaywgNjRrLCAxMjhrIiwgIjI1NmsiKQorCisgICAgZWxpZiBvID09ICItLXZhYmNfY293X3ZlcnNpb24iOgorICAgICAgaWYgYS5pc2RpZ2l0KCk6CisgICAgICAgIE9QVElPTlMudmFiY19jb3dfdmVyc2lvbiA9IGEKKyAgICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbm5vdCBwYXJzZSB2YWx1ZSAlciBmb3Igb3B0aW9uICVyIC0gb25seSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXJzIGFyZSBhbGxvd2VkLiIgJSAoYSwgbykpCisgICAgZWxpZiBvID09ICItLWZ1bGxfb3RhX3BhcnRpdGlvbnMiOgorICAgICAgT1BUSU9OUy5mdWxsX290YV9wYXJ0aXRpb25zID0gc2V0KAorICAgICAgICAgIGEuc3RyaXAoKS5zdHJpcCgiXCIiKS5zdHJpcCgiJyIpLnNwbGl0KCIsIikpCiAgICAgZWxzZToKICAgICAgIHJldHVybiBGYWxzZQogICAgIHJldHVybiBUcnVlCkBAIC0xMjMyLDcgKzEzNTIsNiBAQAogICBhcmdzID0gY29tbW9uLlBhcnNlT3B0aW9ucyhhcmd2LCBfX2RvY19fLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9vcHRzPSJiOms6aTpkOmU6dDoybzoiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9sb25nX29wdHM9WwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2Vfa2V5PSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jcmVtZW50YWxfZnJvbT0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZ1bGxfcmFkaW8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZ1bGxfYm9vdGxvYWRlciIsCkBAIC0xMjUxLDEwICsxMzcwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJpZnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXNoX3RocmVzaG9sZD0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvZ19kaWZmPSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGF5bG9hZF9zaWduZXI9IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXlsb2FkX3NpZ25lcl9hcmdzPSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGF5bG9hZF9zaWduZXJfbWF4aW11bV9zaWduYXR1cmVfc2l6ZT0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBheWxvYWRfc2lnbmVyX2tleV9zaXplPSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXh0cmFjdGVkX2lucHV0X3RhcmdldF9maWxlcz0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNraXBfcG9zdGluc3RhbGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJldHJvZml0X2R5bmFtaWNfcGFydGl0aW9ucyIsCkBAIC0xMjczLDExICsxMzg4LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yY2VfbWlub3JfdmVyc2lvbj0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXByZXNzb3JfdHlwZXM9IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmFibGVfenVjY2hpbmk9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmFibGVfcHVmZmRpZmY9IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmFibGVfbHo0ZGlmZj0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhYmNfY29tcHJlc3Npb25fcGFyYW09IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWN1cml0eV9wYXRjaF9sZXZlbD0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heF90aHJlYWRzPSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIGV4dHJhX29wdGlvbl9oYW5kbGVyPW9wdGlvbl9oYW5kbGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhYmNfY293X3ZlcnNpb249IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wcmVzc2lvbl9mYWN0b3I9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmdWxsX290YV9wYXJ0aXRpb25zPSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIGV4dHJhX29wdGlvbl9oYW5kbGVyPVtvcHRpb25faGFuZGxlciwgcGF5bG9hZF9zaWduZXIuc2lnbmVyX29wdGlvbnNdKQogICBjb21tb24uSW5pdExvZ2dpbmcoKQogCiAgIGlmIGxlbihhcmdzKSAhPSAyOgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL290YV9zaWduaW5nX3V0aWxzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL290YV9zaWduaW5nX3V0aWxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMDRjM2IKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9yZWxlYXNldG9vbHMvb3RhX3NpZ25pbmdfdXRpbHMucHkKQEAgLTAsMCArMSw0NiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgc2hsZXgKKworCitkZWYgUGFyc2VTaWduZXJBcmdzKGFyZ3MpOgorICBpZiBhcmdzIGlzIE5vbmU6CisgICAgcmV0dXJuIE5vbmUKKyAgcmV0dXJuIHNobGV4LnNwbGl0KGFyZ3MpCisKKworZGVmIEFkZFNpZ25pbmdBcmd1bWVudFBhcnNlKHBhcnNlcjogYXJncGFyc2UuQXJndW1lbnRQYXJzZXIpOgorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWphdmFfcGF0aCcsIHR5cGU9c3RyLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1BhdGggdG8gSlZNIGlmIG90aGVyIHRoYW4gZGVmYXVsdCcpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tcGFja2FnZV9rZXknLCB0eXBlPXN0ciwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdQYXRocyB0byBwcml2YXRlIGtleSBmb3Igc2lnbmluZyBwYXlsb2FkJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zZWFyY2hfcGF0aCcsICctLXBhdGgnLCB0eXBlPXN0ciwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdTZWFyY2ggcGF0aCBmb3IgZnJhbWV3b3JrL3NpZ25hcGsuamFyJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zaWduYXBrX3BhdGgnLCB0eXBlPXN0ciwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdQYXRoIHRvIHNpZ25hcGsuamFyLCByZWxhdGl2ZSB0byBzZWFyY2hfcGF0aCcpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tZXh0cmFfc2lnbmFwa19hcmdzJywgdHlwZT1QYXJzZVNpZ25lckFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0nRXh0cmEgYXJndW1lbnRzIGZvciBzaWduYXBrLmphcicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tc2lnbmFwa19zaGFyZWRfbGlicmFyeV9wYXRoJywgdHlwZT1zdHIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0nUGF0aCB0byBsaWI2NCBsaWJyYXJpZXMgdXNlZCBieSBzaWduYXBrLmphcicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tcGF5bG9hZF9zaWduZXInLCB0eXBlPXN0ciwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdQYXRoIHRvIGN1c3RvbSBwYXlsb2FkIHNpZ25lcicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tcGF5bG9hZF9zaWduZXJfYXJncycsIHR5cGU9UGFyc2VTaWduZXJBcmdzLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0FyZ3VtZW50cyBmb3IgcGF5bG9hZCBzaWduZXIgaWYgbmVjZXNzYXJ5JykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1wYXlsb2FkX3NpZ25lcl9tYXhpbXVtX3NpZ25hdHVyZV9zaXplJywgdHlwZT1zdHIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0nTWF4aW11bSBzaWduYXR1cmUgc2l6ZSAoaW4gYnl0ZXMpIHRoYXQgd291bGQgYmUgJworICAgICAgICAgICAgICAgICAgICAgICdnZW5lcmF0ZWQgYnkgdGhlIGdpdmVuIHBheWxvYWQgc2lnbmVyJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1wcml2YXRlX2tleV9zdWZmaXgnLCB0eXBlPXN0ciwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdTdWZmaXggdG8gYmUgYXBwZW5kZWQgdG8gcGFja2FnZV9rZXkgcGF0aCcsIGRlZmF1bHQ9Ii5wazgiKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL290YV91dGlscy5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9vdGFfdXRpbHMucHkKaW5kZXggMTdiODAwZS4uODUyZDYyYiAxMDA2NDQKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL290YV91dGlscy5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvb3RhX3V0aWxzLnB5CkBAIC0yNyw3ICsyNyw4IEBACiAgICAgICAgICAgICAgICAgICAgIFppcFdyaXRlU3RyLCBCdWlsZEluZm8sIExvYWREaWN0aW9uYXJ5RnJvbUZpbGUsCiAgICAgICAgICAgICAgICAgICAgIFNpZ25GaWxlLCBQQVJUSVRJT05TX1dJVEhfQlVJTERfUFJPUCwgUGFydGl0aW9uQnVpbGRQcm9wcywKICAgICAgICAgICAgICAgICAgICAgR2V0UmFtZGlza0Zvcm1hdCwgUGFyc2VVcGRhdGVFbmdpbmVDb25maWcpCi1mcm9tIHBheWxvYWRfc2lnbmVyIGltcG9ydCBQYXlsb2FkU2lnbmVyCitpbXBvcnQgcGF5bG9hZF9zaWduZXIKK2Zyb20gcGF5bG9hZF9zaWduZXIgaW1wb3J0IFBheWxvYWRTaWduZXIsIEFkZFNpZ25pbmdBcmd1bWVudFBhcnNlLCBHZW5lcmF0ZVBheWxvYWRQcm9wZXJ0aWVzCiAKIAogbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCkBAIC0zNyw3ICszOCw2IEBACiBPUFRJT05TLndpcGVfdXNlcl9kYXRhID0gRmFsc2UKIE9QVElPTlMuZG93bmdyYWRlID0gRmFsc2UKIE9QVElPTlMua2V5X3Bhc3N3b3JkcyA9IHt9Ci1PUFRJT05TLnBhY2thZ2Vfa2V5ID0gTm9uZQogT1BUSU9OUy5pbmNyZW1lbnRhbF9zb3VyY2UgPSBOb25lCiBPUFRJT05TLnJldHJvZml0X2R5bmFtaWNfcGFydGl0aW9ucyA9IEZhbHNlCiBPUFRJT05TLm91dHB1dF9tZXRhZGF0YV9wYXRoID0gTm9uZQpAQCAtNDgsNiArNDgsNyBAQAogVU5aSVBfUEFUVEVSTiA9IFsnSU1BR0VTLyonLCAnTUVUQS8qJywgJ09UQS8qJywKICAgICAgICAgICAgICAgICAgJ1JBRElPLyonLCAnKi9idWlsZC5wcm9wJywgJyovZGVmYXVsdC5wcm9wJywgJyovYnVpbGQuZGVmYXVsdCcsICIqL2V0Yy92aW50Zi8qIl0KIFNFQ1VSSVRZX1BBVENIX0xFVkVMX1BST1BfTkFNRSA9ICJyby5idWlsZC52ZXJzaW9uLnNlY3VyaXR5X3BhdGNoIgorVEFSR0VUX0ZJTEVTX0lNQUdFU19TVUJESVIgPSBbIklNQUdFUyIsICJQUkVCVUlMVF9JTUFHRVMiLCAiUkFESU8iXQogCiAKICMgS2V5IGlzIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0sIHZhbHVlIGlzIG1pbmltdW0gQVBJIGxldmVsIHJlcXVpcmVkIHRvCkBAIC0zNjMsMjYgKzM2NCw2NiBAQAogICAjIE9ubHkgaW5jcmVtZW50YWwgT1RBcyBhcmUgYWxsb3dlZCB0byByZWFjaCBoZXJlLgogICBhc3NlcnQgT1BUSU9OUy5pbmNyZW1lbnRhbF9zb3VyY2UgaXMgbm90IE5vbmUKIAorICAjIHVzZWQgZm9yIGxvZ2dpbmcgdXBvbiBlcnJvcnMKKyAgbG9nX2Rvd25ncmFkZXMgPSBbXQorICBsb2dfdXBncmFkZXMgPSBbXQorCiAgIHBvc3RfdGltZXN0YW1wID0gdGFyZ2V0X2luZm8uR2V0QnVpbGRQcm9wKCJyby5idWlsZC5kYXRlLnV0YyIpCiAgIHByZV90aW1lc3RhbXAgPSBzb3VyY2VfaW5mby5HZXRCdWlsZFByb3AoInJvLmJ1aWxkLmRhdGUudXRjIikKLSAgaXNfZG93bmdyYWRlID0gaW50KHBvc3RfdGltZXN0YW1wKSA8IGludChwcmVfdGltZXN0YW1wKQorICBpZiBpbnQocG9zdF90aW1lc3RhbXApIDwgaW50KHByZV90aW1lc3RhbXApOgorICAgIGxvZ2dlci5pbmZvKGYicm8uYnVpbGQuZGF0ZS51dGMgcHJlIHRpbWVzdGFtcDoge3ByZV90aW1lc3RhbXB9LCAiCisgICAgICAgICAgICAgICAgZiJwb3N0IHRpbWVzdGFtcDoge3Bvc3RfdGltZXN0YW1wfS4gRG93bmdyYWRlIGRldGVjdGVkLiIpCisgICAgbG9nX2Rvd25ncmFkZXMuYXBwZW5kKGYicm8uYnVpbGQuZGF0ZS51dGMgcHJlOiB7cHJlX3RpbWVzdGFtcH0gcG9zdDoge3Bvc3RfdGltZXN0YW1wfSIpCisgIGVsc2U6CisgICAgbG9nZ2VyLmluZm8oZiJyby5idWlsZC5kYXRlLnV0YyBwcmUgdGltZXN0YW1wOiB7cHJlX3RpbWVzdGFtcH0sICIKKyAgICAgICAgICAgICAgICBmInBvc3QgdGltZXN0YW1wOiB7cG9zdF90aW1lc3RhbXB9LiIpCisgICAgbG9nX3VwZ3JhZGVzLmFwcGVuZChmInJvLmJ1aWxkLmRhdGUudXRjIHByZToge3ByZV90aW1lc3RhbXB9IHBvc3Q6IHtwb3N0X3RpbWVzdGFtcH0iKQorCisgICMgV2hlbiBtZXJnaW5nIHN5c3RlbSBhbmQgdmVuZG9yIHRhcmdldCBmaWxlcywgaXQgaXMgbm90IGVub3VnaAorICAjIHRvIGNoZWNrIHJvLmJ1aWxkLmRhdGUudXRjLCB0aGUgdGltZXN0YW1wIGZvciBlYWNoIHBhcnRpdGlvbiBtdXN0CisgICMgYmUgY2hlY2tlZC4KKyAgaWYgc291cmNlX2luZm8uaXNfYWI6CisgICAgYWJfcGFydGl0aW9ucyA9IHNldChzb3VyY2VfaW5mby5nZXQoImFiX3BhcnRpdGlvbnMiKSkKKyAgICBmb3IgcGFydGl0aW9uIGluIHNvcnRlZChzZXQoUEFSVElUSU9OU19XSVRIX0JVSUxEX1BST1ApICYgYWJfcGFydGl0aW9ucyk6CisKKyAgICAgIHBhcnRpdGlvbl9wcm9wID0gc291cmNlX2luZm8uZ2V0KCd7fS5idWlsZC5wcm9wJy5mb3JtYXQocGFydGl0aW9uKSkKKyAgICAgICMgU2tpcCBpZiB0aGUgcGFydGl0aW9uIGlzIG1pc3NpbmcsIG9yIGl0IGRvZXNuJ3QgaGF2ZSBhIGJ1aWxkLnByb3AKKyAgICAgIGlmIG5vdCBwYXJ0aXRpb25fcHJvcCBvciBub3QgcGFydGl0aW9uX3Byb3AuYnVpbGRfcHJvcHM6CisgICAgICAgIGNvbnRpbnVlCisgICAgICBwYXJ0aXRpb25fcHJvcCA9IHRhcmdldF9pbmZvLmdldCgne30uYnVpbGQucHJvcCcuZm9ybWF0KHBhcnRpdGlvbikpCisgICAgICAjIFNraXAgaWYgdGhlIHBhcnRpdGlvbiBpcyBtaXNzaW5nLCBvciBpdCBkb2Vzbid0IGhhdmUgYSBidWlsZC5wcm9wCisgICAgICBpZiBub3QgcGFydGl0aW9uX3Byb3Agb3Igbm90IHBhcnRpdGlvbl9wcm9wLmJ1aWxkX3Byb3BzOgorICAgICAgICBjb250aW51ZQorCisgICAgICBwb3N0X3RpbWVzdGFtcCA9IHRhcmdldF9pbmZvLkdldFBhcnRpdGlvbkJ1aWxkUHJvcCgKKyAgICAgICAgJ3JvLmJ1aWxkLmRhdGUudXRjJywgcGFydGl0aW9uKQorICAgICAgcHJlX3RpbWVzdGFtcCA9IHNvdXJjZV9pbmZvLkdldFBhcnRpdGlvbkJ1aWxkUHJvcCgKKyAgICAgICAgJ3JvLmJ1aWxkLmRhdGUudXRjJywgcGFydGl0aW9uKQorICAgICAgaWYgaW50KHBvc3RfdGltZXN0YW1wKSA8IGludChwcmVfdGltZXN0YW1wKToKKyAgICAgICAgbG9nZ2VyLmluZm8oZiJQYXJ0aXRpb24ge3BhcnRpdGlvbn0gcHJlIHRpbWVzdGFtcDoge3ByZV90aW1lc3RhbXB9LCAiCisgICAgICAgICAgICAgICAgICAgIGYicG9zdCB0aW1lOiB7cG9zdF90aW1lc3RhbXB9LiBEb3duZ3JhZGUgZGV0ZWN0ZWQuIikKKyAgICAgICAgbG9nX2Rvd25ncmFkZXMuYXBwZW5kKGYie3BhcnRpdGlvbn0gcHJlOiB7cHJlX3RpbWVzdGFtcH0gcG9zdDoge3Bvc3RfdGltZXN0YW1wfSIpCisgICAgICBlbHNlOgorICAgICAgICBsb2dnZXIuaW5mbyhmIlBhcnRpdGlvbiB7cGFydGl0aW9ufSBwcmUgdGltZXN0YW1wOiB7cHJlX3RpbWVzdGFtcH0sICIKKyAgICAgICAgICAgICAgICAgICAgZiJwb3N0IHRpbWVzdGFtcDoge3Bvc3RfdGltZXN0YW1wfS4iKQorICAgICAgICBsb2dfdXBncmFkZXMuYXBwZW5kKGYie3BhcnRpdGlvbn0gcHJlOiB7cHJlX3RpbWVzdGFtcH0gcG9zdDoge3Bvc3RfdGltZXN0YW1wfSIpCiAKICAgaWYgT1BUSU9OUy5zcGxfZG93bmdyYWRlOgogICAgIG1ldGFkYXRhX3Byb3RvLnNwbF9kb3duZ3JhZGUgPSBUcnVlCiAKICAgaWYgT1BUSU9OUy5kb3duZ3JhZGU6Ci0gICAgaWYgbm90IGlzX2Rvd25ncmFkZToKKyAgICBpZiBsZW4obG9nX2Rvd25ncmFkZXMpID09IDA6CiAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCiAgICAgICAgICAgIi0tZG93bmdyYWRlIG9yIC0tb3ZlcnJpZGVfdGltZXN0YW1wIHNwZWNpZmllZCBidXQgbm8gZG93bmdyYWRlICIKLSAgICAgICAgICAiZGV0ZWN0ZWQ6IHByZTogJXMsIHBvc3Q6ICVzIiAlIChwcmVfdGltZXN0YW1wLCBwb3N0X3RpbWVzdGFtcCkpCisgICAgICAgICAgImRldGVjdGVkLiBDdXJyZW50IHZhbHVlcyBmb3Igcm8uYnVpbGQuZGF0ZS51dGM6ICIgKyAnLCAnLmpvaW4obG9nX3VwZ3JhZGVzKSkKICAgICBtZXRhZGF0YV9wcm90by5kb3duZ3JhZGUgPSBUcnVlCiAgIGVsc2U6Ci0gICAgaWYgaXNfZG93bmdyYWRlOgorICAgIGlmIGxlbihsb2dfZG93bmdyYWRlcykgIT0gMDoKICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKLSAgICAgICAgICAiRG93bmdyYWRlIGRldGVjdGVkIGJhc2VkIG9uIHRpbWVzdGFtcCBjaGVjazogcHJlOiAlcywgcG9zdDogJXMuICIKKyAgICAgICAgICAiRG93bmdyYWRlIGRldGVjdGVkIGJhc2VkIG9uIHRpbWVzdGFtcCBjaGVjayBpbiByby5idWlsZC5kYXRlLnV0Yy4gIgogICAgICAgICAgICJOZWVkIHRvIHNwZWNpZnkgLS1vdmVycmlkZV90aW1lc3RhbXAgT1IgLS1kb3duZ3JhZGUgdG8gYWxsb3cgIgotICAgICAgICAgICJidWlsZGluZyB0aGUgaW5jcmVtZW50YWwuIiAlIChwcmVfdGltZXN0YW1wLCBwb3N0X3RpbWVzdGFtcCkpCi0KKyAgICAgICAgICAiYnVpbGRpbmcgdGhlIGluY3JlbWVudGFsLiBEb3duZ3JhZGVzIGRldGVjdGVkIGZvcjogIgorICAgICAgICAgICsgJywgJy5qb2luKGxvZ19kb3duZ3JhZGVzKSkKIAogZGVmIENvbXB1dGVSdW50aW1lQnVpbGRJbmZvcyhkZWZhdWx0X2J1aWxkX2luZm8sIGJvb3RfdmFyaWFibGVfdmFsdWVzKToKICAgIiIiUmV0dXJucyBhIHNldCBvZiBidWlsZCBpbmZvIG9iamVjdHMgdGhhdCBtYXkgZXhpc3QgZHVyaW5nIHJ1bnRpbWUuIiIiCkBAIC03MzksMTcgKzc4MCwyNSBAQAogICAgIGxvZ2dlci5pbmZvKCJ0YXJnZXQgZmlsZXMgJXMgaXMgYWxyZWFkeSBleHRyYWN0ZWQiLCBwYXRoKQogICAgIHJldHVybiBwYXRoCiAgIGV4dHJhY3RlZF9kaXIgPSBjb21tb24uTWFrZVRlbXBEaXIoInRhcmdldF9maWxlcyIpCisgIGxvZ2dlci5pbmZvKGYiRXh0cmFjdGluZyB0YXJnZXQgZmlsZXMge3BhdGh9IHRvIHtleHRyYWN0ZWRfZGlyfSIpCiAgIGNvbW1vbi5VbnppcFRvRGlyKHBhdGgsIGV4dHJhY3RlZF9kaXIsIFVOWklQX1BBVFRFUk4gKyBbIiJdKQorICBmb3Igc3ViZGlyIGluIFRBUkdFVF9GSUxFU19JTUFHRVNfU1VCRElSOgorICAgIGltYWdlX2RpciA9IG9zLnBhdGguam9pbihleHRyYWN0ZWRfZGlyLCBzdWJkaXIpCisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGltYWdlX2Rpcik6CisgICAgICBjb250aW51ZQorICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGltYWdlX2Rpcik6CisgICAgICBpZiBub3QgZmlsZW5hbWUuZW5kc3dpdGgoIi5pbWciKToKKyAgICAgICAgY29udGludWUKKyAgICAgIGNvbW1vbi5VbnNwYXJzZUltYWdlKG9zLnBhdGguam9pbihpbWFnZV9kaXIsIGZpbGVuYW1lKSkKKwogICByZXR1cm4gZXh0cmFjdGVkX2RpcgogCiAKIGRlZiBMb2NhdGVQYXJ0aXRpb25QYXRoKHRhcmdldF9maWxlc19kaXI6IHN0ciwgcGFydGl0aW9uOiBzdHIsIGFsbG93X2VtcHR5KToKLSAgcGF0aCA9IG9zLnBhdGguam9pbih0YXJnZXRfZmlsZXNfZGlyLCAiUkFESU8iLCBwYXJ0aXRpb24gKyAiLmltZyIpCi0gIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgotICAgIHJldHVybiBwYXRoCi0gIHBhdGggPSBvcy5wYXRoLmpvaW4odGFyZ2V0X2ZpbGVzX2RpciwgIklNQUdFUyIsIHBhcnRpdGlvbiArICIuaW1nIikKLSAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6Ci0gICAgcmV0dXJuIHBhdGgKKyAgZm9yIHN1YmRpciBpbiBUQVJHRVRfRklMRVNfSU1BR0VTX1NVQkRJUjoKKyAgICBwYXRoID0gb3MucGF0aC5qb2luKHRhcmdldF9maWxlc19kaXIsIHN1YmRpciwgcGFydGl0aW9uICsgIi5pbWciKQorICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgorICAgICAgcmV0dXJuIHBhdGgKICAgaWYgYWxsb3dfZW1wdHk6CiAgICAgcmV0dXJuICIiCiAgIHJhaXNlIGNvbW1vbi5FeHRlcm5hbEVycm9yKApAQCAtNzYyLDkgKzgxMSwxMCBAQAogCiAKIGRlZiBMb2NhdGVQYXJ0aXRpb25NYXAodGFyZ2V0X2ZpbGVzX2Rpcjogc3RyLCBwYXJ0aXRpb246IHN0cik6Ci0gIHBhdGggPSBvcy5wYXRoLmpvaW4odGFyZ2V0X2ZpbGVzX2RpciwgIlJBRElPIiwgcGFydGl0aW9uICsgIi5tYXAiKQotICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKLSAgICByZXR1cm4gcGF0aAorICBmb3Igc3ViZGlyIGluIFRBUkdFVF9GSUxFU19JTUFHRVNfU1VCRElSOgorICAgIHBhdGggPSBvcy5wYXRoLmpvaW4odGFyZ2V0X2ZpbGVzX2Rpciwgc3ViZGlyLCBwYXJ0aXRpb24gKyAiLm1hcCIpCisgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICByZXR1cm4gcGF0aAogICByZXR1cm4gIiIKIAogCkBAIC03NzYsMTIgKzgyNiwxMiBAQAogY2xhc3MgUGF5bG9hZEdlbmVyYXRvcihvYmplY3QpOgogICAiIiJNYW5hZ2VzIHRoZSBjcmVhdGlvbiBhbmQgdGhlIHNpZ25pbmcgb2YgYW4gQS9CIE9UQSBQYXlsb2FkLiIiIgogCi0gIFBBWUxPQURfQklOID0gJ3BheWxvYWQuYmluJwotICBQQVlMT0FEX1BST1BFUlRJRVNfVFhUID0gJ3BheWxvYWRfcHJvcGVydGllcy50eHQnCisgIFBBWUxPQURfQklOID0gcGF5bG9hZF9zaWduZXIuUEFZTE9BRF9CSU4KKyAgUEFZTE9BRF9QUk9QRVJUSUVTX1RYVCA9IHBheWxvYWRfc2lnbmVyLlBBWUxPQURfUFJPUEVSVElFU19UWFQKICAgU0VDT05EQVJZX1BBWUxPQURfQklOID0gJ3NlY29uZGFyeS9wYXlsb2FkLmJpbicKICAgU0VDT05EQVJZX1BBWUxPQURfUFJPUEVSVElFU19UWFQgPSAnc2Vjb25kYXJ5L3BheWxvYWRfcHJvcGVydGllcy50eHQnCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHNlY29uZGFyeT1GYWxzZSwgd2lwZV91c2VyX2RhdGE9RmFsc2UsIG1pbm9yX3ZlcnNpb249Tm9uZSwgaXNfcGFydGlhbF91cGRhdGU9RmFsc2UpOgorICBkZWYgX19pbml0X18oc2VsZiwgc2Vjb25kYXJ5PUZhbHNlLCB3aXBlX3VzZXJfZGF0YT1GYWxzZSwgbWlub3JfdmVyc2lvbj1Ob25lLCBpc19wYXJ0aWFsX3VwZGF0ZT1GYWxzZSwgc3BsX2Rvd25ncmFkZT1GYWxzZSk6CiAgICAgIiIiSW5pdGlhbGl6ZXMgYSBQYXlsb2FkIGluc3RhbmNlLgogCiAgICAgQXJnczoKQEAgLTc5MywxNyArODQzLDE4IEBACiAgICAgc2VsZi53aXBlX3VzZXJfZGF0YSA9IHdpcGVfdXNlcl9kYXRhCiAgICAgc2VsZi5taW5vcl92ZXJzaW9uID0gbWlub3JfdmVyc2lvbgogICAgIHNlbGYuaXNfcGFydGlhbF91cGRhdGUgPSBpc19wYXJ0aWFsX3VwZGF0ZQorICAgIHNlbGYuc3BsX2Rvd25ncmFkZSA9IHNwbF9kb3duZ3JhZGUKIAotICBkZWYgX1J1bihzZWxmLCBjbWQpOiAgIyBweWxpbnQ6IGRpc2FibGU9bm8tc2VsZi11c2UKKyAgZGVmIF9SdW4oc2VsZiwgY21kLCAqKmt3YXJncyk6ICAjIHB5bGludDogZGlzYWJsZT1uby1zZWxmLXVzZQogICAgICMgRG9uJ3QgcGlwZSAoYnVmZmVyKSB0aGUgb3V0cHV0IGlmIHZlcmJvc2UgaXMgc2V0LiBMZXQKICAgICAjIGJyaWxsb191cGRhdGVfcGF5bG9hZCB3cml0ZSB0byBzdGRvdXQvc3RkZXJyIGRpcmVjdGx5LCBzbyBpdHMgcHJvZ3Jlc3MgY2FuCiAgICAgIyBiZSBtb25pdG9yZWQuCiAgICAgaWYgT1BUSU9OUy52ZXJib3NlOgotICAgICAgY29tbW9uLlJ1bkFuZENoZWNrT3V0cHV0KGNtZCwgc3Rkb3V0PU5vbmUsIHN0ZGVycj1Ob25lKQorICAgICAgY29tbW9uLlJ1bkFuZENoZWNrT3V0cHV0KGNtZCwgc3Rkb3V0PU5vbmUsIHN0ZGVycj1Ob25lLCAqKmt3YXJncykKICAgICBlbHNlOgotICAgICAgY29tbW9uLlJ1bkFuZENoZWNrT3V0cHV0KGNtZCkKKyAgICAgIGNvbW1vbi5SdW5BbmRDaGVja091dHB1dChjbWQsICoqa3dhcmdzKQogCi0gIGRlZiBHZW5lcmF0ZShzZWxmLCB0YXJnZXRfZmlsZSwgc291cmNlX2ZpbGU9Tm9uZSwgYWRkaXRpb25hbF9hcmdzPU5vbmUpOgorICBkZWYgR2VuZXJhdGUoc2VsZiwgdGFyZ2V0X2ZpbGUsIHNvdXJjZV9maWxlPU5vbmUsIGFkZGl0aW9uYWxfYXJncz1Ob25lLCAqKmt3YXJncyk6CiAgICAgIiIiR2VuZXJhdGVzIGEgcGF5bG9hZCBmcm9tIHRoZSBnaXZlbiB0YXJnZXQtZmlsZXMgemlwKHMpLgogCiAgICAgQXJnczoKQEAgLTgxMiw2ICs4NjMsNyBAQAogICAgICAgICAgIGdlbmVyYXRpbmcgYSBmdWxsIE9UQS4KICAgICAgIGFkZGl0aW9uYWxfYXJnczogQSBsaXN0IG9mIGFkZGl0aW9uYWwgYXJncyB0aGF0IHNob3VsZCBiZSBwYXNzZWQgdG8KICAgICAgICAgICBkZWx0YV9nZW5lcmF0b3IgYmluYXJ5OyBvciBOb25lLgorICAgICAga3dhcmdzOiBBbnkgYWRkaXRpb25hbCBhcmdzIHRvIHBhc3MgdG8gc3VicHJvY2Vzcy5Qb3BlbgogICAgICIiIgogICAgIGlmIGFkZGl0aW9uYWxfYXJncyBpcyBOb25lOgogICAgICAgYWRkaXRpb25hbF9hcmdzID0gW10KQEAgLTgyMCw4ICs4NzIsOCBAQAogICAgIHRhcmdldF9kaXIgPSBFeHRyYWN0VGFyZ2V0RmlsZXModGFyZ2V0X2ZpbGUpCiAgICAgY21kID0gWyJkZWx0YV9nZW5lcmF0b3IiLAogICAgICAgICAgICAiLS1vdXRfZmlsZSIsIHBheWxvYWRfZmlsZV0KLSAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKHRhcmdldF9kaXIsICJNRVRBIiwgImFiX3BhcnRpdGlvbnMudHh0IikpIGFzIGZwOgotICAgICAgYWJfcGFydGl0aW9ucyA9IGZwLnJlYWQoKS5zdHJpcCgpLnNwbGl0KCJcbiIpCisgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbih0YXJnZXRfZGlyLCAiTUVUQSIsICJhYl9wYXJ0aXRpb25zLnR4dCIpLCAiciIpIGFzIGZwOgorICAgICAgYWJfcGFydGl0aW9ucyA9IGZwLnJlYWQoKS5zdHJpcCgpLnNwbGl0bGluZXMoKQogICAgIGNtZC5leHRlbmQoWyItLXBhcnRpdGlvbl9uYW1lcyIsICI6Ii5qb2luKGFiX3BhcnRpdGlvbnMpXSkKICAgICBjbWQuZXh0ZW5kKAogICAgICAgICBbIi0tbmV3X3BhcnRpdGlvbnMiLCBHZXRQYXJ0aXRpb25JbWFnZXModGFyZ2V0X2RpciwgYWJfcGFydGl0aW9ucywgRmFsc2UpXSkKQEAgLTg0OSw2ICs5MDEsMTEgQEAKICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkeW5hbWljX3BhcnRpdGlvbl9pbmZvKToKICAgICAgIGNtZC5leHRlbmQoWyItLWR5bmFtaWNfcGFydGl0aW9uX2luZm9fZmlsZSIsIGR5bmFtaWNfcGFydGl0aW9uX2luZm9dKQogCisgICAgYXBleF9pbmZvID0gb3MucGF0aC5qb2luKAorICAgICAgICB0YXJnZXRfZGlyLCAiTUVUQSIsICJhcGV4X2luZm8ucGIiKQorICAgIGlmIG9zLnBhdGguZXhpc3RzKGFwZXhfaW5mbyk6CisgICAgICBjbWQuZXh0ZW5kKFsiLS1hcGV4X2luZm9fZmlsZSIsIGFwZXhfaW5mb10pCisKICAgICBtYWpvcl92ZXJzaW9uLCBtaW5vcl92ZXJzaW9uID0gUGFyc2VVcGRhdGVFbmdpbmVDb25maWcoCiAgICAgICAgIG9zLnBhdGguam9pbih0YXJnZXRfZGlyLCAiTUVUQSIsICJ1cGRhdGVfZW5naW5lX2NvbmZpZy50eHQiKSkKICAgICBpZiBzb3VyY2VfZmlsZToKQEAgLTg2Miw3ICs5MTksNyBAQAogICAgIGlmIHNlbGYuaXNfcGFydGlhbF91cGRhdGU6CiAgICAgICBjbWQuZXh0ZW5kKFsiLS1pc19wYXJ0aWFsX3VwZGF0ZT10cnVlIl0pCiAgICAgY21kLmV4dGVuZChhZGRpdGlvbmFsX2FyZ3MpCi0gICAgc2VsZi5fUnVuKGNtZCkKKyAgICBzZWxmLl9SdW4oY21kLCAqKmt3YXJncykKIAogICAgIHNlbGYucGF5bG9hZF9maWxlID0gcGF5bG9hZF9maWxlCiAgICAgc2VsZi5wYXlsb2FkX3Byb3BlcnRpZXMgPSBOb25lCkBAIC04NzgsMzAgKzkzNSw3IEBACiAgICAgIiIiCiAgICAgYXNzZXJ0IGlzaW5zdGFuY2UocGF5bG9hZF9zaWduZXIsIFBheWxvYWRTaWduZXIpCiAKLSAgICAjIDEuIEdlbmVyYXRlIGhhc2hlcyBvZiB0aGUgcGF5bG9hZCBhbmQgbWV0YWRhdGEgZmlsZXMuCi0gICAgcGF5bG9hZF9zaWdfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJzaWctIiwgc3VmZml4PSIuYmluIikKLSAgICBtZXRhZGF0YV9zaWdfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJzaWctIiwgc3VmZml4PSIuYmluIikKLSAgICBjbWQgPSBbImJyaWxsb191cGRhdGVfcGF5bG9hZCIsICJoYXNoIiwKLSAgICAgICAgICAgIi0tdW5zaWduZWRfcGF5bG9hZCIsIHNlbGYucGF5bG9hZF9maWxlLAotICAgICAgICAgICAiLS1zaWduYXR1cmVfc2l6ZSIsIHN0cihwYXlsb2FkX3NpZ25lci5tYXhpbXVtX3NpZ25hdHVyZV9zaXplKSwKLSAgICAgICAgICAgIi0tbWV0YWRhdGFfaGFzaF9maWxlIiwgbWV0YWRhdGFfc2lnX2ZpbGUsCi0gICAgICAgICAgICItLXBheWxvYWRfaGFzaF9maWxlIiwgcGF5bG9hZF9zaWdfZmlsZV0KLSAgICBzZWxmLl9SdW4oY21kKQotCi0gICAgIyAyLiBTaWduIHRoZSBoYXNoZXMuCi0gICAgc2lnbmVkX3BheWxvYWRfc2lnX2ZpbGUgPSBwYXlsb2FkX3NpZ25lci5TaWduSGFzaEZpbGUocGF5bG9hZF9zaWdfZmlsZSkKLSAgICBzaWduZWRfbWV0YWRhdGFfc2lnX2ZpbGUgPSBwYXlsb2FkX3NpZ25lci5TaWduSGFzaEZpbGUobWV0YWRhdGFfc2lnX2ZpbGUpCi0KLSAgICAjIDMuIEluc2VydCB0aGUgc2lnbmF0dXJlcyBiYWNrIGludG8gdGhlIHBheWxvYWQgZmlsZS4KLSAgICBzaWduZWRfcGF5bG9hZF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShwcmVmaXg9InNpZ25lZC1wYXlsb2FkLSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4PSIuYmluIikKLSAgICBjbWQgPSBbImJyaWxsb191cGRhdGVfcGF5bG9hZCIsICJzaWduIiwKLSAgICAgICAgICAgIi0tdW5zaWduZWRfcGF5bG9hZCIsIHNlbGYucGF5bG9hZF9maWxlLAotICAgICAgICAgICAiLS1wYXlsb2FkIiwgc2lnbmVkX3BheWxvYWRfZmlsZSwKLSAgICAgICAgICAgIi0tc2lnbmF0dXJlX3NpemUiLCBzdHIocGF5bG9hZF9zaWduZXIubWF4aW11bV9zaWduYXR1cmVfc2l6ZSksCi0gICAgICAgICAgICItLW1ldGFkYXRhX3NpZ25hdHVyZV9maWxlIiwgc2lnbmVkX21ldGFkYXRhX3NpZ19maWxlLAotICAgICAgICAgICAiLS1wYXlsb2FkX3NpZ25hdHVyZV9maWxlIiwgc2lnbmVkX3BheWxvYWRfc2lnX2ZpbGVdCi0gICAgc2VsZi5fUnVuKGNtZCkKKyAgICBzaWduZWRfcGF5bG9hZF9maWxlID0gcGF5bG9hZF9zaWduZXIuU2lnblBheWxvYWQoc2VsZi5wYXlsb2FkX2ZpbGUpCiAKICAgICBzZWxmLnBheWxvYWRfZmlsZSA9IHNpZ25lZF9wYXlsb2FkX2ZpbGUKIApAQCAtOTEzLDIwICs5NDcsMTcgQEAKICAgICAiIiIKICAgICBhc3NlcnQgc2VsZi5wYXlsb2FkX2ZpbGUgaXMgbm90IE5vbmUKICAgICAjIDQuIER1bXAgdGhlIHNpZ25lZCBwYXlsb2FkIHByb3BlcnRpZXMuCi0gICAgcHJvcGVydGllc19maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShwcmVmaXg9InBheWxvYWQtcHJvcGVydGllcy0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4PSIudHh0IikKLSAgICBjbWQgPSBbImJyaWxsb191cGRhdGVfcGF5bG9hZCIsICJwcm9wZXJ0aWVzIiwKLSAgICAgICAgICAgIi0tcGF5bG9hZCIsIHNlbGYucGF5bG9hZF9maWxlLAotICAgICAgICAgICAiLS1wcm9wZXJ0aWVzX2ZpbGUiLCBwcm9wZXJ0aWVzX2ZpbGVdCi0gICAgc2VsZi5fUnVuKGNtZCkKKyAgICBwcm9wZXJ0aWVzX2ZpbGUgPSBHZW5lcmF0ZVBheWxvYWRQcm9wZXJ0aWVzKHNlbGYucGF5bG9hZF9maWxlKQogCi0gICAgaWYgc2VsZi5zZWNvbmRhcnk6Ci0gICAgICB3aXRoIG9wZW4ocHJvcGVydGllc19maWxlLCAiYSIpIGFzIGY6Ci0gICAgICAgIGYud3JpdGUoIlNXSVRDSF9TTE9UX09OX1JFQk9PVD0wXG4iKQogCi0gICAgaWYgc2VsZi53aXBlX3VzZXJfZGF0YToKLSAgICAgIHdpdGggb3Blbihwcm9wZXJ0aWVzX2ZpbGUsICJhIikgYXMgZjoKKyAgICB3aXRoIG9wZW4ocHJvcGVydGllc19maWxlLCAiYSIpIGFzIGY6CisgICAgICBpZiBzZWxmLndpcGVfdXNlcl9kYXRhOgogICAgICAgICBmLndyaXRlKCJQT1dFUldBU0g9MVxuIikKKyAgICAgIGlmIHNlbGYuc2Vjb25kYXJ5OgorICAgICAgICBmLndyaXRlKCJTV0lUQ0hfU0xPVF9PTl9SRUJPT1Q9MFxuIikKKyAgICAgIGlmIHNlbGYuc3BsX2Rvd25ncmFkZToKKyAgICAgICAgZi53cml0ZSgiU1BMX0RPV05HUkFERT0xXG4iKQorCiAKICAgICBzZWxmLnBheWxvYWRfcHJvcGVydGllcyA9IHByb3BlcnRpZXNfZmlsZQogCkBAIC0xMDYwLDE5ICsxMDkxLDMxIEBACiAKIGRlZiBDb3B5VGFyZ2V0RmlsZXNEaXIoaW5wdXRfZGlyKToKICAgb3V0cHV0X2RpciA9IGNvbW1vbi5NYWtlVGVtcERpcigidGFyZ2V0X2ZpbGVzIikKLSAgc2h1dGlsLmNvcHl0cmVlKG9zLnBhdGguam9pbihpbnB1dF9kaXIsICJJTUFHRVMiKSwgb3MucGF0aC5qb2luKAotICAgICAgb3V0cHV0X2RpciwgIklNQUdFUyIpLCBkaXJzX2V4aXN0X29rPVRydWUpCisKKyAgZGVmIFN5bWxpbmtJZk5vdFNwYXJzZShzcmMsIGRzdCk6CisgICAgaWYgY29tbW9uLklzU3BhcnNlSW1hZ2Uoc3JjKToKKyAgICAgIHJldHVybiBjb21tb24uVW5zcGFyc2VJbWFnZShzcmMsIGRzdCkKKyAgICBlbHNlOgorICAgICAgcmV0dXJuIG9zLnN5bWxpbmsob3MucGF0aC5yZWFscGF0aChzcmMpLCBkc3QpCisKKyAgZm9yIHN1YmRpciBpbiBUQVJHRVRfRklMRVNfSU1BR0VTX1NVQkRJUjoKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGlucHV0X2Rpciwgc3ViZGlyKSk6CisgICAgICBjb250aW51ZQorICAgIHNodXRpbC5jb3B5dHJlZShvcy5wYXRoLmpvaW4oaW5wdXRfZGlyLCBzdWJkaXIpLCBvcy5wYXRoLmpvaW4oCisgICAgICAgIG91dHB1dF9kaXIsIHN1YmRpciksIGRpcnNfZXhpc3Rfb2s9VHJ1ZSwgY29weV9mdW5jdGlvbj1TeW1saW5rSWZOb3RTcGFyc2UpCiAgIHNodXRpbC5jb3B5dHJlZShvcy5wYXRoLmpvaW4oaW5wdXRfZGlyLCAiTUVUQSIpLCBvcy5wYXRoLmpvaW4oCiAgICAgICBvdXRwdXRfZGlyLCAiTUVUQSIpLCBkaXJzX2V4aXN0X29rPVRydWUpCisKICAgZm9yIChkaXJwYXRoLCBfLCBmaWxlbmFtZXMpIGluIG9zLndhbGsoaW5wdXRfZGlyKToKICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgogICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihkaXJwYXRoLCBmaWxlbmFtZSkKICAgICAgIHJlbGF0aXZlX3BhdGggPSBwYXRoLnJlbW92ZXByZWZpeChpbnB1dF9kaXIpLnJlbW92ZXByZWZpeCgiLyIpCiAgICAgICBpZiBub3QgRm5tYXRjaChyZWxhdGl2ZV9wYXRoLCBVTlpJUF9QQVRURVJOKToKICAgICAgICAgY29udGludWUKLSAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCIucHJvcCIpIG9yIGZpbGVuYW1lID09ICJwcm9wLmRlZmF1bHQiIG9yICIvZXRjL3ZpbnRmLyIgaW4gcmVsYXRpdmVfcGF0aDoKLSAgICAgICAgdGFyZ2V0X3BhdGggPSBvcy5wYXRoLmpvaW4oCi0gICAgICAgICAgICBvdXRwdXRfZGlyLCByZWxhdGl2ZV9wYXRoKQotICAgICAgICBvcy5tYWtlZGlycyhvcy5wYXRoLmRpcm5hbWUodGFyZ2V0X3BhdGgpLCBleGlzdF9vaz1UcnVlKQotICAgICAgICBzaHV0aWwuY29weShwYXRoLCB0YXJnZXRfcGF0aCkKKyAgICAgIHRhcmdldF9wYXRoID0gb3MucGF0aC5qb2luKAorICAgICAgICAgIG91dHB1dF9kaXIsIHJlbGF0aXZlX3BhdGgpCisgICAgICBpZiBvcy5wYXRoLmV4aXN0cyh0YXJnZXRfcGF0aCk6CisgICAgICAgIGNvbnRpbnVlCisgICAgICBvcy5tYWtlZGlycyhvcy5wYXRoLmRpcm5hbWUodGFyZ2V0X3BhdGgpLCBleGlzdF9vaz1UcnVlKQorICAgICAgc2h1dGlsLmNvcHkocGF0aCwgdGFyZ2V0X3BhdGgpCiAgIHJldHVybiBvdXRwdXRfZGlyCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvcGF5bG9hZF9zaWduZXIucHkgYi90b29scy9yZWxlYXNldG9vbHMvcGF5bG9hZF9zaWduZXIucHkKaW5kZXggOTkzM2FlZi4uZTg1ZDY0YyAxMDA2NDQKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL3BheWxvYWRfc2lnbmVyLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9wYXlsb2FkX3NpZ25lci5weQpAQCAtMTYsMTAgKzE2LDU4IEBACiAKIGltcG9ydCBjb21tb24KIGltcG9ydCBsb2dnaW5nCi1mcm9tIGNvbW1vbiBpbXBvcnQgT1BUSU9OUworaW1wb3J0IHNobGV4CitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHppcGZpbGUKK2ltcG9ydCBzaHV0aWwKK2Zyb20gY29tbW9uIGltcG9ydCBPUFRJT05TLCBPcHRpb25IYW5kbGVyCitmcm9tIG90YV9zaWduaW5nX3V0aWxzIGltcG9ydCBBZGRTaWduaW5nQXJndW1lbnRQYXJzZQogCiBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKIAorT1BUSU9OUy5wYXlsb2FkX3NpZ25lciA9IE5vbmUKK09QVElPTlMucGF5bG9hZF9zaWduZXJfYXJncyA9IFtdCitPUFRJT05TLnBheWxvYWRfc2lnbmVyX21heGltdW1fc2lnbmF0dXJlX3NpemUgPSBOb25lCitPUFRJT05TLnBhY2thZ2Vfa2V5ID0gTm9uZQorCitQQVlMT0FEX0JJTiA9ICdwYXlsb2FkLmJpbicKK1BBWUxPQURfUFJPUEVSVElFU19UWFQgPSAncGF5bG9hZF9wcm9wZXJ0aWVzLnR4dCcKKworY2xhc3MgU2lnbmVyT3B0aW9ucyhPcHRpb25IYW5kbGVyKToKKworICBAc3RhdGljbWV0aG9kCisgIGRlZiBQYXJzZU9wdGlvbnMobywgYSk6CisgICAgaWYgbyBpbiAoIi1rIiwgIi0tcGFja2FnZV9rZXkiKToKKyAgICAgIE9QVElPTlMucGFja2FnZV9rZXkgPSBhCisgICAgZWxpZiBvID09ICItLXBheWxvYWRfc2lnbmVyIjoKKyAgICAgIE9QVElPTlMucGF5bG9hZF9zaWduZXIgPSBhCisgICAgZWxpZiBvID09ICItLXBheWxvYWRfc2lnbmVyX2FyZ3MiOgorICAgICAgT1BUSU9OUy5wYXlsb2FkX3NpZ25lcl9hcmdzID0gc2hsZXguc3BsaXQoYSkKKyAgICBlbGlmIG8gPT0gIi0tcGF5bG9hZF9zaWduZXJfbWF4aW11bV9zaWduYXR1cmVfc2l6ZSI6CisgICAgICBPUFRJT05TLnBheWxvYWRfc2lnbmVyX21heGltdW1fc2lnbmF0dXJlX3NpemUgPSBhCisgICAgZWxpZiBvID09ICItLXBheWxvYWRfc2lnbmVyX2tleV9zaXplIjoKKyAgICAgICMgVE9ETyh4dW5jaGFuZykgcmVtb3ZlIHRoaXMgb3B0aW9uIGFmdGVyIGNsZWFuaW5nIHVwIHRoZSBjYWxsZXJzLgorICAgICAgbG9nZ2VyLndhcm5pbmcoIlRoZSBvcHRpb24gJy0tcGF5bG9hZF9zaWduZXJfa2V5X3NpemUnIGlzIGRlcHJlY2F0ZWQuIgorICAgICAgICAgICAgICAgICAgICAgICIgVXNlICctLXBheWxvYWRfc2lnbmVyX21heGltdW1fc2lnbmF0dXJlX3NpemUnIGluc3RlYWQuIikKKyAgICAgIE9QVElPTlMucGF5bG9hZF9zaWduZXJfbWF4aW11bV9zaWduYXR1cmVfc2l6ZSA9IGEKKyAgICBlbHNlOgorICAgICAgcmV0dXJuIEZhbHNlCisgICAgcmV0dXJuIFRydWUKKworICBkZWYgX19pbml0X18oc2VsZik6CisgICAgc3VwZXIoKS5fX2luaXRfXygKKyAgICAgIFsicGF5bG9hZF9zaWduZXI9IiwKKyAgICAgICAicGFja2FnZV9rZXk9IiwKKyAgICAgICAicGF5bG9hZF9zaWduZXJfYXJncz0iLAorICAgICAgICJwYXlsb2FkX3NpZ25lcl9tYXhpbXVtX3NpZ25hdHVyZV9zaXplPSIsCisgICAgICAgInBheWxvYWRfc2lnbmVyX2tleV9zaXplPSJdLAorICAgICAgIFNpZ25lck9wdGlvbnMuUGFyc2VPcHRpb25zCisgICAgKQorCisKK3NpZ25lcl9vcHRpb25zID0gU2lnbmVyT3B0aW9ucygpCisKIAogY2xhc3MgUGF5bG9hZFNpZ25lcihvYmplY3QpOgogICAiIiJBIGNsYXNzIHRoYXQgd3JhcHMgdGhlIHBheWxvYWQgc2lnbmluZyB3b3Jrcy4KQEAgLTk1LDExICsxNDMsMTEgQEAKICAgICAjIDEuIEdlbmVyYXRlIGhhc2hlcyBvZiB0aGUgcGF5bG9hZCBhbmQgbWV0YWRhdGEgZmlsZXMuCiAgICAgcGF5bG9hZF9zaWdfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJzaWctIiwgc3VmZml4PSIuYmluIikKICAgICBtZXRhZGF0YV9zaWdfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJzaWctIiwgc3VmZml4PSIuYmluIikKLSAgICBjbWQgPSBbImJyaWxsb191cGRhdGVfcGF5bG9hZCIsICJoYXNoIiwKLSAgICAgICAgICAgIi0tdW5zaWduZWRfcGF5bG9hZCIsIHVuc2lnbmVkX3BheWxvYWQsCi0gICAgICAgICAgICItLXNpZ25hdHVyZV9zaXplIiwgc3RyKHNlbGYubWF4aW11bV9zaWduYXR1cmVfc2l6ZSksCi0gICAgICAgICAgICItLW1ldGFkYXRhX2hhc2hfZmlsZSIsIG1ldGFkYXRhX3NpZ19maWxlLAotICAgICAgICAgICAiLS1wYXlsb2FkX2hhc2hfZmlsZSIsIHBheWxvYWRfc2lnX2ZpbGVdCisgICAgY21kID0gWyJkZWx0YV9nZW5lcmF0b3IiLAorICAgICAgICAgICAiLS1pbl9maWxlPSIgKyB1bnNpZ25lZF9wYXlsb2FkLAorICAgICAgICAgICAiLS1zaWduYXR1cmVfc2l6ZT0iICsgc3RyKHNlbGYubWF4aW11bV9zaWduYXR1cmVfc2l6ZSksCisgICAgICAgICAgICItLW91dF9tZXRhZGF0YV9oYXNoX2ZpbGU9IiArIG1ldGFkYXRhX3NpZ19maWxlLAorICAgICAgICAgICAiLS1vdXRfaGFzaF9maWxlPSIgKyBwYXlsb2FkX3NpZ19maWxlXQogICAgIHNlbGYuX1J1bihjbWQpCiAKICAgICAjIDIuIFNpZ24gdGhlIGhhc2hlcy4KQEAgLTEwOSwxOSArMTU3LDY3IEBACiAgICAgIyAzLiBJbnNlcnQgdGhlIHNpZ25hdHVyZXMgYmFjayBpbnRvIHRoZSBwYXlsb2FkIGZpbGUuCiAgICAgc2lnbmVkX3BheWxvYWRfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJzaWduZWQtcGF5bG9hZC0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeD0iLmJpbiIpCi0gICAgY21kID0gWyJicmlsbG9fdXBkYXRlX3BheWxvYWQiLCAic2lnbiIsCi0gICAgICAgICAgICItLXVuc2lnbmVkX3BheWxvYWQiLCB1bnNpZ25lZF9wYXlsb2FkLAotICAgICAgICAgICAiLS1wYXlsb2FkIiwgc2lnbmVkX3BheWxvYWRfZmlsZSwKLSAgICAgICAgICAgIi0tc2lnbmF0dXJlX3NpemUiLCBzdHIoc2VsZi5tYXhpbXVtX3NpZ25hdHVyZV9zaXplKSwKLSAgICAgICAgICAgIi0tbWV0YWRhdGFfc2lnbmF0dXJlX2ZpbGUiLCBzaWduZWRfbWV0YWRhdGFfc2lnX2ZpbGUsCi0gICAgICAgICAgICItLXBheWxvYWRfc2lnbmF0dXJlX2ZpbGUiLCBzaWduZWRfcGF5bG9hZF9zaWdfZmlsZV0KKyAgICBjbWQgPSBbImRlbHRhX2dlbmVyYXRvciIsCisgICAgICAgICAgICItLWluX2ZpbGU9IiArIHVuc2lnbmVkX3BheWxvYWQsCisgICAgICAgICAgICItLW91dF9maWxlPSIgKyBzaWduZWRfcGF5bG9hZF9maWxlLAorICAgICAgICAgICAiLS1zaWduYXR1cmVfc2l6ZT0iICsgc3RyKHNlbGYubWF4aW11bV9zaWduYXR1cmVfc2l6ZSksCisgICAgICAgICAgICItLW1ldGFkYXRhX3NpZ25hdHVyZV9maWxlPSIgKyBzaWduZWRfbWV0YWRhdGFfc2lnX2ZpbGUsCisgICAgICAgICAgICItLXBheWxvYWRfc2lnbmF0dXJlX2ZpbGU9IiArIHNpZ25lZF9wYXlsb2FkX3NpZ19maWxlXQogICAgIHNlbGYuX1J1bihjbWQpCiAgICAgcmV0dXJuIHNpZ25lZF9wYXlsb2FkX2ZpbGUKIAotCiAgIGRlZiBTaWduSGFzaEZpbGUoc2VsZiwgaW5fZmlsZSk6CiAgICAgIiIiU2lnbnMgdGhlIGdpdmVuIGlucHV0IGZpbGUuIFJldHVybnMgdGhlIG91dHB1dCBmaWxlbmFtZS4iIiIKICAgICBvdXRfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJzaWduZWQtIiwgc3VmZml4PSIuYmluIikKICAgICBjbWQgPSBbc2VsZi5zaWduZXJdICsgc2VsZi5zaWduZXJfYXJncyArIFsnLWluJywgaW5fZmlsZSwgJy1vdXQnLCBvdXRfZmlsZV0KICAgICBjb21tb24uUnVuQW5kQ2hlY2tPdXRwdXQoY21kKQogICAgIHJldHVybiBvdXRfZmlsZQorCitkZWYgR2VuZXJhdGVQYXlsb2FkUHJvcGVydGllcyhwYXlsb2FkX2ZpbGUpOgorICAgIHByb3BlcnRpZXNfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJwYXlsb2FkLXByb3BlcnRpZXMtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeD0iLnR4dCIpCisgICAgY21kID0gWyJkZWx0YV9nZW5lcmF0b3IiLAorICAgICAgICAgICAiLS1pbl9maWxlPSIgKyBwYXlsb2FkX2ZpbGUsCisgICAgICAgICAgICItLXByb3BlcnRpZXNfZmlsZT0iICsgcHJvcGVydGllc19maWxlXQorICAgIGNvbW1vbi5SdW5BbmRDaGVja091dHB1dChjbWQpCisgICAgcmV0dXJuIHByb3BlcnRpZXNfZmlsZQorCitkZWYgU2lnbk90YVBhY2thZ2UoaW5wdXRfcGF0aCwgb3V0cHV0X3BhdGgpOgorICBwYXlsb2FkX3NpZ25lciA9IFBheWxvYWRTaWduZXIoCisgICAgICBPUFRJT05TLnBhY2thZ2Vfa2V5LCBPUFRJT05TLnByaXZhdGVfa2V5X3N1ZmZpeCwKKyAgICAgIE5vbmUsIE9QVElPTlMucGF5bG9hZF9zaWduZXIsIE9QVElPTlMucGF5bG9hZF9zaWduZXJfYXJncykKKyAgY29tbW9uLlppcEV4Y2x1ZGUoaW5wdXRfcGF0aCwgb3V0cHV0X3BhdGgsIFtQQVlMT0FEX0JJTiwgUEFZTE9BRF9QUk9QRVJUSUVTX1RYVF0pCisgIHdpdGggdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkgYXMgdW5zaWduZWRfcGF5bG9hZCwgemlwZmlsZS5aaXBGaWxlKGlucHV0X3BhdGgsICJyIiwgYWxsb3daaXA2ND1UcnVlKSBhcyB6ZnA6CisgICAgd2l0aCB6ZnAub3BlbigicGF5bG9hZC5iaW4iKSBhcyBwYXlsb2FkX2ZwOgorICAgICAgc2h1dGlsLmNvcHlmaWxlb2JqKHBheWxvYWRfZnAsIHVuc2lnbmVkX3BheWxvYWQpCisgICAgc2lnbmVkX3BheWxvYWQgPSBwYXlsb2FkX3NpZ25lci5TaWduUGF5bG9hZCh1bnNpZ25lZF9wYXlsb2FkLm5hbWUpCisgICAgcHJvcGVydGllc19maWxlID0gR2VuZXJhdGVQYXlsb2FkUHJvcGVydGllcyhzaWduZWRfcGF5bG9hZCkKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShvdXRwdXRfcGF0aCwgImEiLCBjb21wcmVzc2lvbj16aXBmaWxlLlpJUF9TVE9SRUQsIGFsbG93WmlwNjQ9VHJ1ZSkgYXMgb3V0cHV0X3pmcDoKKyAgICAgIGNvbW1vbi5aaXBXcml0ZShvdXRwdXRfemZwLCBzaWduZWRfcGF5bG9hZCwgUEFZTE9BRF9CSU4pCisgICAgICBjb21tb24uWmlwV3JpdGUob3V0cHV0X3pmcCwgcHJvcGVydGllc19maWxlLCBQQVlMT0FEX1BST1BFUlRJRVNfVFhUKQorCisKK2RlZiBtYWluKGFyZ3YpOgorICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigKKyAgICAgIHByb2c9YXJndlswXSwgZGVzY3JpcHRpb249IkdpdmVuIGEgc2VyaWVzIG9mIC5pbWcgZmlsZXMsIHByb2R1Y2VzIGEgZnVsbCBPVEEgcGFja2FnZSB0aGF0IGluc3RhbGxzIHRob2VzZSBpbWFnZXMiKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCJpbnB1dF9vdGEiLCB0eXBlPXN0ciwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJJbnB1dCBPVEEgZm9yIHNpZ25pbmciKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdvdXRwdXRfb3RhJywgdHlwZT1zdHIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0nT3V0cHV0IE9UQSBmb3IgdGhlIHNpZ25lZCBwYWNrYWdlJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLXYiLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkVuYWJsZSB2ZXJib3NlIGxvZ2dpbmciLCBkZXN0PSJ2ZXJib3NlIikKKyAgQWRkU2lnbmluZ0FyZ3VtZW50UGFyc2UocGFyc2VyKQorICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoYXJndlsxOl0pCisgIGlucHV0X290YSA9IGFyZ3MuaW5wdXRfb3RhCisgIG91dHB1dF9vdGEgPSBhcmdzLm91dHB1dF9vdGEKKyAgaWYgYXJncy52ZXJib3NlOgorICAgIE9QVElPTlMudmVyYm9zZSA9IFRydWUKKyAgY29tbW9uLkluaXRMb2dnaW5nKCkKKyAgaWYgYXJncy5wYWNrYWdlX2tleToKKyAgICBPUFRJT05TLnBhY2thZ2Vfa2V5ID0gYXJncy5wYWNrYWdlX2tleQorICBsb2dnZXIuaW5mbygiUmUtc2lnbmluZyBPVEEgcGFja2FnZSB7fSIuZm9ybWF0KGlucHV0X290YSkpCisgIFNpZ25PdGFQYWNrYWdlKGlucHV0X290YSwgb3V0cHV0X290YSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgaW1wb3J0IHN5cworICBtYWluKHN5cy5hcmd2KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9zaWduX2FwZXgucHkgYi90b29scy9yZWxlYXNldG9vbHMvc2lnbl9hcGV4LnB5CmluZGV4IGQ3Mzk5ODIuLmEwYTk0ZjYgMTAwNzU1Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9zaWduX2FwZXgucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3NpZ25fYXBleC5weQpAQCAtNTYsNyArNTYsNiBAQAogaW1wb3J0IGNvbW1vbgogCiBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKLU9QVElPTlMgPSBjb21tb24uT1BUSU9OUwogCiAKIGRlZiBTaWduQXBleEZpbGUoYXZidG9vbCwgYXBleF9maWxlLCBwYXlsb2FkX2tleSwgY29udGFpbmVyX2tleSwgbm9faGFzaHRyZWUsCkBAIC03NSw4ICs3NCw3IEBACiAgICAgICBub19oYXNodHJlZT1ub19oYXNodHJlZSwKICAgICAgIGFwa19rZXlzPWFwa19rZXlzLAogICAgICAgc2lnbmluZ19hcmdzPXNpZ25pbmdfYXJncywKLSAgICAgIHNpZ25fdG9vbD1zaWduX3Rvb2wsCi0gICAgICBpc19zZXBvbGljeT1hcGV4X2ZpbGUuZW5kc3dpdGgoT1BUSU9OUy5zZXBvbGljeV9uYW1lKSkKKyAgICAgIHNpZ25fdG9vbD1zaWduX3Rvb2wpCiAKIAogZGVmIG1haW4oYXJndik6CmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvc2lnbl90YXJnZXRfZmlsZXNfYXBrcy5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9zaWduX3RhcmdldF9maWxlc19hcGtzLnB5CmluZGV4IDgyOTE0NDguLjIzNzg1MzkgMTAwNzU1Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9zaWduX3RhcmdldF9maWxlc19hcGtzLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9zaWduX3RhcmdldF9maWxlc19hcGtzLnB5CkBAIC04Myw5ICs4Myw4IEBACiAKICAgLS1yZXBsYWNlX3Zlcml0eV9wdWJsaWNfa2V5IDxrZXk+CiAgICAgICBSZXBsYWNlIHRoZSBjZXJ0aWZpY2F0ZSAocHVibGljIGtleSkgdXNlZCBmb3IgdmVyaXR5IHZlcmlmaWNhdGlvbi4gVGhlCi0gICAgICBrZXkgZmlsZSByZXBsYWNlcyB0aGUgb25lIGF0IEJPT1QvUkFNRElTSy92ZXJpdHlfa2V5IChvciBST09UL3Zlcml0eV9rZXkKLSAgICAgIGZvciBkZXZpY2VzIHVzaW5nIHN5c3RlbV9yb290X2ltYWdlKS4gSXQgZXhwZWN0cyB0aGUga2V5IGZpbGVuYW1lIFdJVEgKLSAgICAgIHRoZSBleHRlbnNpb24gKGUuZy4gdmVyaXR5X2tleS5wdWIpLgorICAgICAga2V5IGZpbGUgcmVwbGFjZXMgdGhlIG9uZSBhdCBCT09UL1JBTURJU0svdmVyaXR5X2tleS4gSXQgZXhwZWN0cyB0aGUga2V5CisgICAgICBmaWxlbmFtZSBXSVRIIHRoZSBleHRlbnNpb24gKGUuZy4gdmVyaXR5X2tleS5wdWIpLgogCiAgIC0tcmVwbGFjZV92ZXJpdHlfa2V5aWQgPHBhdGhfdG9fWDUwOV9QRU1fY2VydF9maWxlPgogICAgICAgUmVwbGFjZSB0aGUgdmVyaXR5a2V5aWQgaW4gQk9PVC9jbWRsaW5lIG9mIGlucHV0X3RhcmdldF9maWxlX3ppcApAQCAtMTI1LDE0ICsxMjQsOCBAQAogCiAgIC0tZ2tpX3NpZ25pbmdfYWxnb3JpdGhtIDxhbGdvcml0aG0+CiAgIC0tZ2tpX3NpZ25pbmdfa2V5IDxrZXk+Ci0gICAgICBVc2UgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gKGUuZy4gU0hBMjU2X1JTQTQwOTYpIGFuZCB0aGUga2V5IHRvIGdlbmVyYXRlCi0gICAgICAnYm9vdCBzaWduYXR1cmUnIGluIGEgdjQgYm9vdC5pbWcuIE90aGVyd2lzZSBpdCB1c2VzIHRoZSBleGlzdGluZyB2YWx1ZXMKLSAgICAgIGluIGluZm8gZGljdC4KLQogICAtLWdraV9zaWduaW5nX2V4dHJhX2FyZ3MgPGFyZ3M+Ci0gICAgICBTcGVjaWZ5IGFueSBhZGRpdGlvbmFsIGFyZ3MgdGhhdCBhcmUgbmVlZGVkIHRvIGdlbmVyYXRlICdib290IHNpZ25hdHVyZScKLSAgICAgIChlLmcuIC0tcHJvcCBmb286YmFyKS4gVGhlIGFyZ3Mgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZXhpc3Rpbmcgb25lcwotICAgICAgaW4gaW5mbyBkaWN0LgorICAgICAgREVQUkVDQVRFRCBEb2VzIG5vdGhpbmcuCiAKICAgLS1hbmRyb2lkX2phcl9wYXRoIDxwYXRoPgogICAgICAgUGF0aCB0byB0aGUgYW5kcm9pZC5qYXIgdG8gcmVwYWNrIHRoZSBhcGV4IGZpbGUuCkBAIC0xNDcsNiArMTQwLDM0IEBACiAKICAgLS1vdmVycmlkZV9hcGV4X2tleXMgPHBhdGg+CiAgICAgICBSZXBsYWNlIGFsbCBBUEVYIGtleXMgd2l0aCB0aGlzIHByaXZhdGUga2V5CisKKyAgLWsgICgtLXBhY2thZ2Vfa2V5KSA8a2V5PgorICAgICAgS2V5IHRvIHVzZSB0byBzaWduIHRoZSBwYWNrYWdlIChkZWZhdWx0IGlzIHRoZSB2YWx1ZSBvZgorICAgICAgZGVmYXVsdF9zeXN0ZW1fZGV2X2NlcnRpZmljYXRlIGZyb20gdGhlIGlucHV0IHRhcmdldC1maWxlcydzCisgICAgICBNRVRBL21pc2NfaW5mby50eHQsIG9yICJidWlsZC9tYWtlL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L3Rlc3RrZXkiIGlmCisgICAgICB0aGF0IHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQpLgorCisgICAgICBGb3IgaW5jcmVtZW50YWwgT1RBcywgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYmFzZWQgb24gdGhlIHNvdXJjZQorICAgICAgdGFyZ2V0LWZpbGUsIG5vdCB0aGUgdGFyZ2V0IGJ1aWxkLgorCisgIC0tcGF5bG9hZF9zaWduZXIgPHNpZ25lcj4KKyAgICAgIFNwZWNpZnkgdGhlIHNpZ25lciB3aGVuIHNpZ25pbmcgdGhlIHBheWxvYWQgYW5kIG1ldGFkYXRhIGZvciBBL0IgT1RBcy4KKyAgICAgIEJ5IGRlZmF1bHQgKGkuZS4gd2l0aG91dCB0aGlzIGZsYWcpLCBpdCBjYWxscyAnb3BlbnNzbCBwa2V5dXRsJyB0byBzaWduCisgICAgICB3aXRoIHRoZSBwYWNrYWdlIHByaXZhdGUga2V5LiBJZiB0aGUgcHJpdmF0ZSBrZXkgY2Fubm90IGJlIGFjY2Vzc2VkCisgICAgICBkaXJlY3RseSwgYSBwYXlsb2FkIHNpZ25lciB0aGF0IGtub3dzIGhvdyB0byBkbyB0aGF0IHNob3VsZCBiZSBzcGVjaWZpZWQuCisgICAgICBUaGUgc2lnbmVyIHdpbGwgYmUgc3VwcGxpZWQgd2l0aCAiLWlua2V5IDxwYXRoX3RvX2tleT4iLAorICAgICAgIi1pbiA8aW5wdXRfZmlsZT4iIGFuZCAiLW91dCA8b3V0cHV0X2ZpbGU+IiBwYXJhbWV0ZXJzLgorCisgIC0tcGF5bG9hZF9zaWduZXJfYXJncyA8YXJncz4KKyAgICAgIFNwZWNpZnkgdGhlIGFyZ3VtZW50cyBuZWVkZWQgZm9yIHBheWxvYWQgc2lnbmVyLgorCisgIC0tcGF5bG9hZF9zaWduZXJfbWF4aW11bV9zaWduYXR1cmVfc2l6ZSA8c2lnbmF0dXJlX3NpemU+CisgICAgICBUaGUgbWF4aW11bSBzaWduYXR1cmUgc2l6ZSAoaW4gYnl0ZXMpIHRoYXQgd291bGQgYmUgZ2VuZXJhdGVkIGJ5IHRoZSBnaXZlbgorICAgICAgcGF5bG9hZCBzaWduZXIuIE9ubHkgbWVhbmluZ2Z1bCB3aGVuIGN1c3RvbSBwYXlsb2FkIHNpZ25lciBpcyBzcGVjaWZpZWQKKyAgICAgIHZpYSAnLS1wYXlsb2FkX3NpZ25lcicuCisgICAgICBJZiB0aGUgc2lnbmVyIHVzZXMgYSBSU0Ega2V5LCB0aGlzIHNob3VsZCBiZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvCisgICAgICByZXByZXNlbnQgdGhlIG1vZHVsdXMuIElmIGl0IHVzZXMgYW4gRUMga2V5LCB0aGlzIGlzIHRoZSBzaXplIG9mIGEKKyAgICAgIERFUi1lbmNvZGVkIEVDRFNBIHNpZ25hdHVyZS4KICIiIgogCiBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCkBAIC0xNjIsMTUgKzE4MywxOSBAQAogaW1wb3J0IHJlCiBpbXBvcnQgc2h1dGlsCiBpbXBvcnQgc3RhdAotaW1wb3J0IHN1YnByb2Nlc3MKIGltcG9ydCBzeXMKK2ltcG9ydCBzaGxleAogaW1wb3J0IHRlbXBmaWxlCiBpbXBvcnQgemlwZmlsZQogZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRUcmVlCiAKIGltcG9ydCBhZGRfaW1nX3RvX3RhcmdldF9maWxlcworaW1wb3J0IG90YV9mcm9tX3Jhd19pbWcKIGltcG9ydCBhcGV4X3V0aWxzCiBpbXBvcnQgY29tbW9uCitpbXBvcnQgcGF5bG9hZF9zaWduZXIKK2ltcG9ydCB1cGRhdGVfcGF5bG9hZAorZnJvbSBwYXlsb2FkX3NpZ25lciBpbXBvcnQgU2lnbk90YVBhY2thZ2UsIFBBWUxPQURfQklOCiAKIAogaWYgc3lzLmhleHZlcnNpb24gPCAweDAyMDcwMDAwOgpAQCAtMTkzLDE1ICsyMTgsMTMgQEAKIE9QVElPTlMuYXZiX2tleXMgPSB7fQogT1BUSU9OUy5hdmJfYWxnb3JpdGhtcyA9IHt9CiBPUFRJT05TLmF2Yl9leHRyYV9hcmdzID0ge30KLU9QVElPTlMuZ2tpX3NpZ25pbmdfa2V5ID0gTm9uZQotT1BUSU9OUy5na2lfc2lnbmluZ19hbGdvcml0aG0gPSBOb25lCi1PUFRJT05TLmdraV9zaWduaW5nX2V4dHJhX2FyZ3MgPSBOb25lCiBPUFRJT05TLmFuZHJvaWRfamFyX3BhdGggPSBOb25lCiBPUFRJT05TLnZlbmRvcl9wYXJ0aXRpb25zID0gc2V0KCkKIE9QVElPTlMudmVuZG9yX290YXRvb2xzID0gTm9uZQogT1BUSU9OUy5hbGxvd19nc2lfZGVidWdfc2Vwb2xpY3kgPSBGYWxzZQogT1BUSU9OUy5vdmVycmlkZV9hcGtfa2V5cyA9IE5vbmUKIE9QVElPTlMub3ZlcnJpZGVfYXBleF9rZXlzID0gTm9uZQorT1BUSU9OUy5pbnB1dF90bXAgPSBOb25lCiAKIAogQVZCX0ZPT1RFUl9BUkdTX0JZX1BBUlRJVElPTiA9IHsKQEAgLTI0MSw2ICsyNjQsMjQgQEAKICAgcmV0dXJuIGZpbGVuYW1lLmVuZHN3aXRoKCIuYXBleCIpIG9yIGZpbGVuYW1lLmVuZHN3aXRoKCIuY2FwZXgiKQogCiAKK2RlZiBJc090YVBhY2thZ2UoZnApOgorICB3aXRoIHppcGZpbGUuWmlwRmlsZShmcCkgYXMgemZwOgorICAgIGlmIG5vdCBQQVlMT0FEX0JJTiBpbiB6ZnAubmFtZWxpc3QoKToKKyAgICAgIHJldHVybiBGYWxzZQorICAgIHdpdGggemZwLm9wZW4oUEFZTE9BRF9CSU4sICJyIikgYXMgcGF5bG9hZDoKKyAgICAgIG1hZ2ljID0gcGF5bG9hZC5yZWFkKDQpCisgICAgICByZXR1cm4gbWFnaWMgPT0gYiJDckFVIgorCisKK2RlZiBJc0VudHJ5T3RhUGFja2FnZShpbnB1dF96aXAsIGZpbGVuYW1lKToKKyAgd2l0aCBpbnB1dF96aXAub3BlbihmaWxlbmFtZSwgInIiKSBhcyBmcDoKKyAgICBleHRlcm5hbF9hdHRyID0gaW5wdXRfemlwLmdldGluZm8oZmlsZW5hbWUpLmV4dGVybmFsX2F0dHIKKyAgICBpZiBzdGF0LlNfSVNMTksoZXh0ZXJuYWxfYXR0ciA+PiAxNik6CisgICAgICByZXR1cm4gSXNFbnRyeU90YVBhY2thZ2UoaW5wdXRfemlwLAorICAgICAgICAgIG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoZmlsZW5hbWUpLCBmcC5yZWFkKCkuZGVjb2RlKCkpKQorICAgIHJldHVybiBJc090YVBhY2thZ2UoZnApCisKKwogZGVmIEdldEFwZXhGaWxlbmFtZShmaWxlbmFtZSk6CiAgIG5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKQogICAjIFJlcGxhY2UgdGhlIHN1ZmZpeCBmb3IgY29tcHJlc3NlZCBhcGV4CkBAIC01MTUsNiArNTU2LDcgQEAKICAgcmV0dXJuIGRhdGEKIAogCisKIGRlZiBJc0J1aWxkUHJvcEZpbGUoZmlsZW5hbWUpOgogICByZXR1cm4gZmlsZW5hbWUgaW4gKAogICAgICAgIlNZU1RFTS9ldGMvcHJvcC5kZWZhdWx0IiwKQEAgLTU0MSw3ICs1ODMsMTA0IEBACiAgICAgICAgIGZpbGVuYW1lLmVuZHN3aXRoKCIvcHJvcC5kZWZhdWx0IikKIAogCi1kZWYgUHJvY2Vzc1RhcmdldEZpbGVzKGlucHV0X3RmX3ppcCwgb3V0cHV0X3RmX3ppcCwgbWlzY19pbmZvLAorZGVmIEdldE90YVNpZ25pbmdBcmdzKCk6CisgIGFyZ3MgPSBbXQorICBpZiBPUFRJT05TLnBhY2thZ2Vfa2V5OgorICAgIGFyZ3MuZXh0ZW5kKFsiLS1wYWNrYWdlX2tleSIsIE9QVElPTlMucGFja2FnZV9rZXldKQorICBpZiBPUFRJT05TLnBheWxvYWRfc2lnbmVyOgorICAgIGFyZ3MuZXh0ZW5kKFsiLS1wYXlsb2FkX3NpZ25lcj0iICsgT1BUSU9OUy5wYXlsb2FkX3NpZ25lcl0pCisgIGlmIE9QVElPTlMucGF5bG9hZF9zaWduZXJfYXJnczoKKyAgICBhcmdzLmV4dGVuZChbIi0tcGF5bG9hZF9zaWduZXJfYXJncz0iICsgc2hsZXguam9pbihPUFRJT05TLnBheWxvYWRfc2lnbmVyX2FyZ3MpXSkKKyAgaWYgT1BUSU9OUy5zZWFyY2hfcGF0aDoKKyAgICBhcmdzLmV4dGVuZChbIi0tc2VhcmNoX3BhdGgiLCBPUFRJT05TLnNlYXJjaF9wYXRoXSkKKyAgaWYgT1BUSU9OUy5wYXlsb2FkX3NpZ25lcl9tYXhpbXVtX3NpZ25hdHVyZV9zaXplOgorICAgIGFyZ3MuZXh0ZW5kKFsiLS1wYXlsb2FkX3NpZ25lcl9tYXhpbXVtX3NpZ25hdHVyZV9zaXplIiwKKyAgICAgICAgICAgICAgICBPUFRJT05TLnBheWxvYWRfc2lnbmVyX21heGltdW1fc2lnbmF0dXJlX3NpemVdKQorICBpZiBPUFRJT05TLnByaXZhdGVfa2V5X3N1ZmZpeDoKKyAgICBhcmdzLmV4dGVuZChbIi0tcHJpdmF0ZV9rZXlfc3VmZml4IiwgT1BUSU9OUy5wcml2YXRlX2tleV9zdWZmaXhdKQorICByZXR1cm4gYXJncworCisKK2RlZiBSZWdlbmVyYXRlS2VybmVsUGFydGl0aW9ucyhpbnB1dF90Zl96aXA6IHppcGZpbGUuWmlwRmlsZSwgb3V0cHV0X3RmX3ppcDogemlwZmlsZS5aaXBGaWxlLCBtaXNjX2luZm8pOgorICAiIiJSZS1nZW5lcmF0ZSBib290IGFuZCBkdGJvIHBhcnRpdGlvbnMgdXNpbmcgbmV3IHNpZ25pbmcgY29uZmlndXJhdGlvbiIiIgorICBmaWxlc190b191bnppcCA9IFsKKyAgICAgICJQUkVCVUlMVF9JTUFHRVMvKiIsICJCT09UQUJMRV9JTUFHRVMvKi5pbWciLCAiKi9ib290XzE2ay5pbWciLCAiKi9kdGJvXzE2ay5pbWciXQorICBpZiBPUFRJT05TLmlucHV0X3RtcCBpcyBOb25lOgorICAgIE9QVElPTlMuaW5wdXRfdG1wID0gY29tbW9uLlVuemlwVGVtcChpbnB1dF90Zl96aXAuZmlsZW5hbWUsIGZpbGVzX3RvX3VuemlwKQorICBlbHNlOgorICAgIGNvbW1vbi5VbnppcFRvRGlyKGlucHV0X3RmX3ppcC5maWxlbmFtZSwgT1BUSU9OUy5pbnB1dF90bXAsIGZpbGVzX3RvX3VuemlwKQorICB1bnppcF9kaXIgPSBPUFRJT05TLmlucHV0X3RtcAorICBvcy5tYWtlZGlycyhvcy5wYXRoLmpvaW4odW56aXBfZGlyLCAiSU1BR0VTIiksIGV4aXN0X29rPVRydWUpCisKKyAgYm9vdF9pbWFnZSA9IGNvbW1vbi5HZXRCb290YWJsZUltYWdlKAorICAgICAgIklNQUdFUy9ib290LmltZyIsICJib290LmltZyIsIHVuemlwX2RpciwgIkJPT1QiLCBtaXNjX2luZm8pCisgIGlmIGJvb3RfaW1hZ2U6CisgICAgYm9vdF9pbWFnZS5Xcml0ZVRvRGlyKHVuemlwX2RpcikKKyAgICBib290X2ltYWdlID0gb3MucGF0aC5qb2luKHVuemlwX2RpciwgYm9vdF9pbWFnZS5uYW1lKQorICAgIGNvbW1vbi5aaXBXcml0ZShvdXRwdXRfdGZfemlwLCBib290X2ltYWdlLCAiSU1BR0VTL2Jvb3QuaW1nIiwKKyAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NfdHlwZT16aXBmaWxlLlpJUF9TVE9SRUQpCisgIGlmIG1pc2NfaW5mby5nZXQoImhhc19kdGJvIikgPT0gInRydWUiOgorICAgIGFkZF9pbWdfdG9fdGFyZ2V0X2ZpbGVzLkFkZER0Ym8ob3V0cHV0X3RmX3ppcCkKKyAgcmV0dXJuIHVuemlwX2RpcgorCisKK2RlZiBSZWdlbmVyYXRlQm9vdE9UQShpbnB1dF90Zl96aXA6IHppcGZpbGUuWmlwRmlsZSwgZmlsZW5hbWUsIGlucHV0X290YSk6CisgIHdpdGggaW5wdXRfdGZfemlwLm9wZW4oZmlsZW5hbWUsICJyIikgYXMgaW5fZnA6CisgICAgcGF5bG9hZCA9IHVwZGF0ZV9wYXlsb2FkLlBheWxvYWQoaW5fZnApCisgIGlzX2luY3JlbWVudGFsID0gYW55KFtwYXJ0Lkhhc0ZpZWxkKCdvbGRfcGFydGl0aW9uX2luZm8nKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHBhcnQgaW4gcGF5bG9hZC5tYW5pZmVzdC5wYXJ0aXRpb25zXSkKKyAgaXNfYm9vdF9vdGEgPSBmaWxlbmFtZS5zdGFydHN3aXRoKAorICAgICAgIlZFTkRPUi9ib290X290YXMvIikgb3IgZmlsZW5hbWUuc3RhcnRzd2l0aCgiU1lTVEVNL2Jvb3Rfb3Rhcy8iKQorICBpZiBub3QgaXNfYm9vdF9vdGE6CisgICAgcmV0dXJuCisgIGlzXzRrX2Jvb3Rfb3RhID0gZmlsZW5hbWUgaW4gWworICAgICAgIlZFTkRPUi9ib290X290YXMvYm9vdF9vdGFfNGsuemlwIiwgIlNZU1RFTS9ib290X290YXMvYm9vdF9vdGFfNGsuemlwIl0KKyAgIyBPbmx5IDRLIGJvb3QgaW1hZ2UgaXMgcmUtZ2VuZXJhdGVkLCBzbyBpZiAxNksgYm9vdCBvdGEgaXNuJ3QgaW5jcmVtZW50YWwsCisgICMgd2UgZG8gbm90IG5lZWQgdG8gcmUtZ2VuZXJhdGUKKyAgaWYgbm90IGlzXzRrX2Jvb3Rfb3RhIGFuZCBub3QgaXNfaW5jcmVtZW50YWw6CisgICAgcmV0dXJuCisKKyAgdGltZXN0YW1wID0gc3RyKHBheWxvYWQubWFuaWZlc3QubWF4X3RpbWVzdGFtcCkKKyAgcGFydGl0aW9ucyA9IFtwYXJ0LnBhcnRpdGlvbl9uYW1lIGZvciBwYXJ0IGluIHBheWxvYWQubWFuaWZlc3QucGFydGl0aW9uc10KKyAgdW56aXBfZGlyID0gT1BUSU9OUy5pbnB1dF90bXAKKyAgc2lnbmVkX2Jvb3RfaW1hZ2UgPSBvcy5wYXRoLmpvaW4odW56aXBfZGlyLCAiSU1BR0VTIiwgImJvb3QuaW1nIikKKyAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNpZ25lZF9ib290X2ltYWdlKToKKyAgICBsb2dnZXIud2FybigiTmVlZCB0byByZS1nZW5lcmF0ZSBib290IE9UQSB7fSBidXQgZmFpbGVkIHRvIGdldCBzaWduZWQgYm9vdCBpbWFnZS4gMTZLIGRldiBvcHRpb24gd2lsbCBiZSBpbXBhY3RlZCwgYWZ0ZXIgcm9sbGluZyBiYWNrIHRvIDRLIHVzZXIgd291bGQgbmVlZCB0byBzaWRlbG9hZC9mbGFzaCB0aGVpciBkZXZpY2UgdG8gY29udGludWUgcmVjZWl2aW5nIE9UQXMuIikKKyAgICByZXR1cm4KKyAgc2lnbmVkX2R0Ym9faW1hZ2UgPSBvcy5wYXRoLmpvaW4odW56aXBfZGlyLCAiSU1BR0VTIiwgImR0Ym8uaW1nIikKKyAgaWYgImR0Ym8iIGluIHBhcnRpdGlvbnMgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyhzaWduZWRfZHRib19pbWFnZSk6CisgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgIkJvb3QgT1RBIHt9IGhhcyBkdGJvIHBhcnRpdGlvbiwgYnV0IG5vIGR0Ym8gaW1hZ2UgZm91bmQgaW4gdGFyZ2V0IGZpbGVzLiIuZm9ybWF0KGZpbGVuYW1lKSkKKyAgaWYgaXNfaW5jcmVtZW50YWw6CisgICAgc2lnbmVkXzE2a19ib290X2ltYWdlID0gb3MucGF0aC5qb2luKAorICAgICAgICB1bnppcF9kaXIsICJJTUFHRVMiLCAiYm9vdF8xNmsuaW1nIikKKyAgICBzaWduZWRfMTZrX2R0Ym9faW1hZ2UgPSBvcy5wYXRoLmpvaW4oCisgICAgICAgIHVuemlwX2RpciwgIklNQUdFUyIsICJkdGJvXzE2ay5pbWciKQorICAgIGlmIGlzXzRrX2Jvb3Rfb3RhOgorICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2lnbmVkXzE2a19ib290X2ltYWdlKToKKyAgICAgICAgc2lnbmVkX2Jvb3RfaW1hZ2UgPSBzaWduZWRfMTZrX2Jvb3RfaW1hZ2UgKyAiOiIgKyBzaWduZWRfYm9vdF9pbWFnZQorICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2lnbmVkXzE2a19kdGJvX2ltYWdlKToKKyAgICAgICAgc2lnbmVkX2R0Ym9faW1hZ2UgPSBzaWduZWRfMTZrX2R0Ym9faW1hZ2UgKyAiOiIgKyBzaWduZWRfZHRib19pbWFnZQorICAgIGVsc2U6CisgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzaWduZWRfMTZrX2Jvb3RfaW1hZ2UpOgorICAgICAgICBzaWduZWRfYm9vdF9pbWFnZSArPSAiOiIgKyBzaWduZWRfMTZrX2Jvb3RfaW1hZ2UKKyAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNpZ25lZF8xNmtfZHRib19pbWFnZSk6CisgICAgICAgIHNpZ25lZF9kdGJvX2ltYWdlICs9ICI6IiArIHNpZ25lZF8xNmtfZHRib19pbWFnZQorCisgIGFyZ3MgPSBbIm90YV9mcm9tX3Jhd19pbWciLAorICAgICAgICAgICItLW1heF90aW1lc3RhbXAiLCB0aW1lc3RhbXAsICItLW91dHB1dCIsIGlucHV0X290YS5uYW1lXQorICBhcmdzLmV4dGVuZChHZXRPdGFTaWduaW5nQXJncygpKQorICBpZiAiZHRibyIgaW4gcGFydGl0aW9uczoKKyAgICBhcmdzLmV4dGVuZChbIi0tcGFydGl0aW9uX25hbWUiLCAiYm9vdCxkdGJvIiwKKyAgICAgICAgICAgICAgICBzaWduZWRfYm9vdF9pbWFnZSwgc2lnbmVkX2R0Ym9faW1hZ2VdKQorICBlbHNlOgorICAgIGFyZ3MuZXh0ZW5kKFsiLS1wYXJ0aXRpb25fbmFtZSIsICJib290Iiwgc2lnbmVkX2Jvb3RfaW1hZ2VdKQorICBsb2dnZXIuaW5mbygKKyAgICAgICJSZS1nZW5lcmF0aW5nIGJvb3QgT1RBIHt9IHVzaW5nIGNtZCB7fSIuZm9ybWF0KGZpbGVuYW1lLCBhcmdzKSkKKyAgb3RhX2Zyb21fcmF3X2ltZy5tYWluKGFyZ3MpCisKKworZGVmIFByb2Nlc3NUYXJnZXRGaWxlcyhpbnB1dF90Zl96aXA6IHppcGZpbGUuWmlwRmlsZSwgb3V0cHV0X3RmX3ppcDogemlwZmlsZS5aaXBGaWxlLCBtaXNjX2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgIGFwa19rZXlzLCBhcGV4X2tleXMsIGtleV9wYXNzd29yZHMsCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtX2FwaV9sZXZlbCwgY29kZW5hbWVfdG9fYXBpX2xldmVsX21hcCwKICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NlZF9leHRlbnNpb24pOgpAQCAtNTUyLDEwICs2OTEsMTggQEAKICAgICAgICAgW2xlbihvcy5wYXRoLmJhc2VuYW1lKGkuZmlsZW5hbWUpKSBmb3IgaSBpbiBpbnB1dF90Zl96aXAuaW5mb2xpc3QoKQogICAgICAgICAgaWYgR2V0QXBrRmlsZUluZm8oaS5maWxlbmFtZSwgY29tcHJlc3NlZF9leHRlbnNpb24sIFtdKVswXV0pCiAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICMgU2V0cyB0aGlzIHRvIHplcm8gZm9yIHRhcmdldHMgd2l0aG91dCBBUEsgZmlsZXMsIGUuZy4sIGdraV9hcm02NC4KKyAgICAjIFNldHMgdGhpcyB0byB6ZXJvIGZvciB0YXJnZXRzIHdpdGhvdXQgQVBLIGZpbGVzLgogICAgIG1heHNpemUgPSAwCiAKLSAgc3lzdGVtX3Jvb3RfaW1hZ2UgPSBtaXNjX2luZm8uZ2V0KCJzeXN0ZW1fcm9vdF9pbWFnZSIpID09ICJ0cnVlIgorICAjIFJlcGxhY2UgdGhlIEFWQiBzaWduaW5nIGtleXMsIGlmIGFueS4KKyAgUmVwbGFjZUF2YlNpZ25pbmdLZXlzKG1pc2NfaW5mbykKKyAgT1BUSU9OUy5pbmZvX2RpY3QgPSBtaXNjX2luZm8KKworICAjIFJld3JpdGUgdGhlIHByb3BzIGluIEFWQiBzaWduaW5nIGFyZ3MuCisgIGlmIG1pc2NfaW5mby5nZXQoJ2F2Yl9lbmFibGUnKSA9PSAndHJ1ZSc6CisgICAgUmV3cml0ZUF2YlByb3BzKG1pc2NfaW5mbykKKworICBSZWdlbmVyYXRlS2VybmVsUGFydGl0aW9ucyhpbnB1dF90Zl96aXAsIG91dHB1dF90Zl96aXAsIG1pc2NfaW5mbykKIAogICBmb3IgaW5mbyBpbiBpbnB1dF90Zl96aXAuaW5mb2xpc3QoKToKICAgICBmaWxlbmFtZSA9IGluZm8uZmlsZW5hbWUKQEAgLTU2NywxMCArNzE0LDEwIEBACiAgICAgaWYgZmlsZW5hbWUuc3RhcnRzd2l0aCgiT1RBLyIpIGFuZCBmaWxlbmFtZS5lbmRzd2l0aCgiLmltZyIpOgogICAgICAgY29udGludWUKIAotICAgIGRhdGEgPSBpbnB1dF90Zl96aXAucmVhZChmaWxlbmFtZSkKLSAgICBvdXRfaW5mbyA9IGNvcHkuY29weShpbmZvKQogICAgIChpc19hcGssIGlzX2NvbXByZXNzZWQsIHNob3VsZF9iZV9za2lwcGVkKSA9IEdldEFwa0ZpbGVJbmZvKAogICAgICAgICBmaWxlbmFtZSwgY29tcHJlc3NlZF9leHRlbnNpb24sIE9QVElPTlMuc2tpcF9hcGtzX3dpdGhfcGF0aF9wcmVmaXgpCisgICAgZGF0YSA9IGlucHV0X3RmX3ppcC5yZWFkKGZpbGVuYW1lKQorICAgIG91dF9pbmZvID0gY29weS5jb3B5KGluZm8pCiAKICAgICBpZiBpc19hcGsgYW5kIHNob3VsZF9iZV9za2lwcGVkOgogICAgICAgIyBDb3B5IHNraXBwZWQgQVBLcyB2ZXJiYXRpbS4KQEAgLTYzMSw2ICs3NzgsMTQgQEAKICAgICAgICAgICAgICIgICAgICAgIChza2lwcGVkIGR1ZSB0byBzcGVjaWFsIGNlcnQgc3RyaW5nKSIgJSAobmFtZSwpKQogICAgICAgICBjb21tb24uWmlwV3JpdGVTdHIob3V0cHV0X3RmX3ppcCwgb3V0X2luZm8sIGRhdGEpCiAKKyAgICBlbGlmIGZpbGVuYW1lLmVuZHN3aXRoKCIuemlwIikgYW5kIElzRW50cnlPdGFQYWNrYWdlKGlucHV0X3RmX3ppcCwgZmlsZW5hbWUpOgorICAgICAgbG9nZ2VyLmluZm8oIlJlLXNpZ25pbmcgT1RBIHBhY2thZ2Uge30iLmZvcm1hdChmaWxlbmFtZSkpCisgICAgICB3aXRoIHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpIGFzIGlucHV0X290YSwgdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkgYXMgb3V0cHV0X290YToKKyAgICAgICAgUmVnZW5lcmF0ZUJvb3RPVEEoaW5wdXRfdGZfemlwLCBmaWxlbmFtZSwgaW5wdXRfb3RhKQorCisgICAgICAgIFNpZ25PdGFQYWNrYWdlKGlucHV0X290YS5uYW1lLCBvdXRwdXRfb3RhLm5hbWUpCisgICAgICAgIGNvbW1vbi5aaXBXcml0ZShvdXRwdXRfdGZfemlwLCBvdXRwdXRfb3RhLm5hbWUsIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NfdHlwZT16aXBmaWxlLlpJUF9TVE9SRUQpCiAgICAgIyBTeXN0ZW0gcHJvcGVydGllcy4KICAgICBlbGlmIElzQnVpbGRQcm9wRmlsZShmaWxlbmFtZSk6CiAgICAgICBwcmludCgiUmV3cml0aW5nICVzOiIgJSAoZmlsZW5hbWUsKSkKQEAgLTcwNywyMSArODYyLDMyIEBACiAKICAgICAjIFVwZGF0ZXMgcHZtZncgZW1iZWRkZWQgcHVibGljIGtleSB3aXRoIHRoZSB2aXJ0IEFQRVggcGF5bG9hZCBrZXkuCiAgICAgZWxpZiBmaWxlbmFtZSA9PSAiUFJFQlVJTFRfSU1BR0VTL3B2bWZ3LmltZyI6Ci0gICAgICAjIEZpbmQgdGhlIG5hbWUgb2YgdGhlIHZpcnQgQVBFWCBpbiB0aGUgdGFyZ2V0IGZpbGVzLgorICAgICAgIyBGaW5kIHRoZSBwYXRoIG9mIHRoZSB2aXJ0IEFQRVggaW4gdGhlIHRhcmdldCBmaWxlcy4KICAgICAgIG5hbWVsaXN0ID0gaW5wdXRfdGZfemlwLm5hbWVsaXN0KCkKLSAgICAgIGFwZXhfZ2VuID0gKEdldEFwZXhGaWxlbmFtZShmKSBmb3IgZiBpbiBuYW1lbGlzdCBpZiBJc0FwZXhGaWxlKGYpKQotICAgICAgdmlydF9hcGV4X3JlID0gcmUuY29tcGlsZSgiXmNvbVwuKFteXC5dK1wuKT9hbmRyb2lkXC52aXJ0XC5hcGV4JCIpCi0gICAgICB2aXJ0X2FwZXggPSBuZXh0KChhIGZvciBhIGluIGFwZXhfZ2VuIGlmIHZpcnRfYXBleF9yZS5tYXRjaChhKSksIE5vbmUpCi0gICAgICBpZiBub3QgdmlydF9hcGV4OgorICAgICAgYXBleF9nZW4gPSAoZiBmb3IgZiBpbiBuYW1lbGlzdCBpZiBJc0FwZXhGaWxlKGYpKQorICAgICAgdmlydF9hcGV4X3JlID0gcmUuY29tcGlsZSgiXi4qY29tXC4oW15cLl0rXC4pP2FuZHJvaWRcLnZpcnRcLmFwZXgkIikKKyAgICAgIHZpcnRfYXBleF9wYXRoID0gbmV4dCgKKyAgICAgICAgKGEgZm9yIGEgaW4gYXBleF9nZW4gaWYgdmlydF9hcGV4X3JlLm1hdGNoKGEpKSwgTm9uZSkKKyAgICAgIGlmIG5vdCB2aXJ0X2FwZXhfcGF0aDoKICAgICAgICAgcHJpbnQoIlJlbW92aW5nICVzIGZyb20gcmFtZGlzazogdmlydCBBUEVYIG5vdCBmb3VuZCIgJSBmaWxlbmFtZSkKICAgICAgIGVsc2U6Ci0gICAgICAgIHByaW50KCJSZXBsYWNpbmcgJXMgZW1iZWRkZWQga2V5IHdpdGggJXMga2V5IiAlIChmaWxlbmFtZSwgdmlydF9hcGV4KSkKKyAgICAgICAgcHJpbnQoIlJlcGxhY2luZyAlcyBlbWJlZGRlZCBrZXkgd2l0aCAlcyBrZXkiICUgKGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlydF9hcGV4X3BhdGgpKQogICAgICAgICAjIEdldCB0aGUgY3VycmVudCBhbmQgbmV3IGVtYmVkZGVkIGtleXMuCisgICAgICAgIHZpcnRfYXBleCA9IEdldEFwZXhGaWxlbmFtZSh2aXJ0X2FwZXhfcGF0aCkKICAgICAgICAgcGF5bG9hZF9rZXksIGNvbnRhaW5lcl9rZXksIHNpZ25fdG9vbCA9IGFwZXhfa2V5c1t2aXJ0X2FwZXhdCi0gICAgICAgIG5ld19wdWJrZXlfcGF0aCA9IGNvbW1vbi5FeHRyYWN0QXZiUHVibGljS2V5KAotICAgICAgICAgICAgbWlzY19pbmZvWydhdmJfYXZidG9vbCddLCBwYXlsb2FkX2tleSkKLSAgICAgICAgd2l0aCBvcGVuKG5ld19wdWJrZXlfcGF0aCwgJ3JiJykgYXMgZjoKLSAgICAgICAgICBuZXdfcHVia2V5ID0gZi5yZWFkKCkKKworICAgICAgICAjIGIvMzg0ODEzMTk5OiBoYW5kbGVzIHRoZSBwcmUtc2lnbmVkIGNvbS5hbmRyb2lkLnZpcnQuYXBleCBpbiBHU0kuCisgICAgICAgIGlmIHBheWxvYWRfa2V5ID09ICdQUkVTSUdORUQnOgorICAgICAgICAgIHdpdGggaW5wdXRfdGZfemlwLm9wZW4odmlydF9hcGV4X3BhdGgpIGFzIGFwZXhfZnA6CisgICAgICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShhcGV4X2ZwKSBhcyBhcGV4X3ppcDoKKyAgICAgICAgICAgICAgbmV3X3B1YmtleSA9IGFwZXhfemlwLnJlYWQoJ2FwZXhfcHVia2V5JykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBuZXdfcHVia2V5X3BhdGggPSBjb21tb24uRXh0cmFjdEF2YlB1YmxpY0tleSgKKyAgICAgICAgICAgICAgbWlzY19pbmZvWydhdmJfYXZidG9vbCddLCBwYXlsb2FkX2tleSkKKyAgICAgICAgICB3aXRoIG9wZW4obmV3X3B1YmtleV9wYXRoLCAncmInKSBhcyBmOgorICAgICAgICAgICAgbmV3X3B1YmtleSA9IGYucmVhZCgpCisKICAgICAgICAgcHVia2V5X2luZm8gPSBjb3B5LmNvcHkoCiAgICAgICAgICAgICBpbnB1dF90Zl96aXAuZ2V0aW5mbygiUFJFQlVJTFRfSU1BR0VTL3B2bWZ3X2VtYmVkZGVkLmF2YnB1YmtleSIpKQogICAgICAgICBvbGRfcHVia2V5ID0gaW5wdXRfdGZfemlwLnJlYWQocHVia2V5X2luZm8uZmlsZW5hbWUpCkBAIC03NTQsMjYgKzkyMCwxMzYgQEAKICAgICAgICAgIyBDb3B5IGl0IHZlcmJhdGltIGlmIHdlIGFsbG93IHRoZSBmaWxlIHRvIGV4aXN0LgogICAgICAgICBjb21tb24uWmlwV3JpdGVTdHIob3V0cHV0X3RmX3ppcCwgb3V0X2luZm8sIGRhdGEpCiAKKyAgICAjIFNpZ24gbWljcm9kcm9pZF92ZW5kb3IuaW1nLgorICAgIGVsaWYgZmlsZW5hbWUgPT0gIlZFTkRPUi9ldGMvYXZmL21pY3JvZHJvaWQvbWljcm9kcm9pZF92ZW5kb3IuaW1nIjoKKyAgICAgIHZlbmRvcl9rZXkgPSBPUFRJT05TLmF2Yl9rZXlzLmdldCgidmVuZG9yIikKKyAgICAgIHZlbmRvcl9hbGdvcml0aG0gPSBPUFRJT05TLmF2Yl9hbGdvcml0aG1zLmdldCgidmVuZG9yIikKKyAgICAgIHdpdGggdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkgYXMgaW1hZ2U6CisgICAgICAgIGltYWdlLndyaXRlKGRhdGEpCisgICAgICAgIGltYWdlLmZsdXNoKCkKKyAgICAgICAgUmVwbGFjZUtleUluQXZiSGFzaHRyZWVGb290ZXIoaW1hZ2UsIHZlbmRvcl9rZXksIHZlbmRvcl9hbGdvcml0aG0sCisgICAgICAgICAgICBtaXNjX2luZm8pCisgICAgICAgIGNvbW1vbi5aaXBXcml0ZShvdXRwdXRfdGZfemlwLCBpbWFnZS5uYW1lLCBmaWxlbmFtZSkKICAgICAjIEEgbm9uLUFQSyBmaWxlOyBjb3B5IGl0IHZlcmJhdGltLgogICAgIGVsc2U6Ci0gICAgICBjb21tb24uWmlwV3JpdGVTdHIob3V0cHV0X3RmX3ppcCwgb3V0X2luZm8sIGRhdGEpCisgICAgICB0cnk6CisgICAgICAgIGVudHJ5ID0gb3V0cHV0X3RmX3ppcC5nZXRpbmZvKGZpbGVuYW1lKQorICAgICAgICBpZiBvdXRwdXRfdGZfemlwLnJlYWQoZW50cnkpICE9IGRhdGE6CisgICAgICAgICAgbG9nZ2VyLndhcm4oCisgICAgICAgICAgICAgICJPdXRwdXQgemlwIGNvbnRhaW5zIGR1cGxpY2F0ZSBlbnRyaWVzIGZvciAlcyB3aXRoIGRpZmZlcmVudCBjb250ZW50cyIsIGZpbGVuYW1lKQorICAgICAgICBjb250aW51ZQorICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICBjb21tb24uWmlwV3JpdGVTdHIob3V0cHV0X3RmX3ppcCwgb3V0X2luZm8sIGRhdGEpCiAKICAgaWYgT1BUSU9OUy5yZXBsYWNlX290YV9rZXlzOgogICAgIFJlcGxhY2VPdGFLZXlzKGlucHV0X3RmX3ppcCwgb3V0cHV0X3RmX3ppcCwgbWlzY19pbmZvKQogCi0gICMgUmVwbGFjZSB0aGUgQVZCIHNpZ25pbmcga2V5cywgaWYgYW55LgotICBSZXBsYWNlQXZiU2lnbmluZ0tleXMobWlzY19pbmZvKQotCi0gICMgUmV3cml0ZSB0aGUgcHJvcHMgaW4gQVZCIHNpZ25pbmcgYXJncy4KLSAgaWYgbWlzY19pbmZvLmdldCgnYXZiX2VuYWJsZScpID09ICd0cnVlJzoKLSAgICBSZXdyaXRlQXZiUHJvcHMobWlzY19pbmZvKQotCi0gICMgUmVwbGFjZSB0aGUgR0tJIHNpZ25pbmcga2V5IGZvciBib290LmltZywgaWYgYW55LgotICBSZXBsYWNlR2tpU2lnbmluZ0tleShtaXNjX2luZm8pCiAKICAgIyBXcml0ZSBiYWNrIG1pc2NfaW5mbyB3aXRoIHRoZSBsYXRlc3QgdmFsdWVzLgogICBSZXBsYWNlTWlzY0luZm9UeHQoaW5wdXRfdGZfemlwLCBvdXRwdXRfdGZfemlwLCBtaXNjX2luZm8pCiAKKyMgUGFyc2Ugc3RyaW5nIG91dHB1dCBvZiBgYXZidG9vbCBpbmZvX2ltYWdlYC4KK2RlZiBQYXJzZUF2YkluZm8oaW5mb19yYXcpOgorICAjIGxpbmVfbWF0Y2hlciBpcyBmb3IgcGFyc2luZyBlYWNoIG91dHB1dCBsaW5lIG9mIGBhdmJ0b29sIGluZm9faW1hZ2VgLgorICAjIGV4YW1wbGUgc3RyaW5nIGlucHV0OiAiICAgICAgSGFzaCBBbGdvcml0aG06ICAgICAgICBzaGExIgorICAjIGV4YW1wbGUgbWF0Y2hlZCBpbnB1dDogKCIgICAgICAiLCAiSGFzaCBBbGdvcml0aG0iLCAic2hhMSIpCisgIGxpbmVfbWF0Y2hlciA9IHJlLmNvbXBpbGUocideKFxzKikoW146XSspOlxzKiguKikkJykKKyAgIyBwcm9wX21hdGNoZXIgaXMgZm9yIHBhcnNpbmcgdmFsdWUgcGFydCBvZiAnUHJvcCcgaW4gYGF2YnRvb2wgaW5mb19pbWFnZWAuCisgICMgZXhhbXBsZSBzdHJpbmcgaW5wdXQ6ICJleGFtcGxlX3Byb3Bfa2V5IC0+ICdleGFtcGxlX3Byb3BfdmFsdWUnIgorICAjIGV4YW1wbGUgbWF0Y2hlZCBvdXRwdXQ6ICgiZXhhbXBsZV9wcm9wX2tleSIsICJleGFtcGxlX3Byb3BfdmFsdWUiKQorICBwcm9wX21hdGNoZXIgPSByZS5jb21waWxlKHIiKC4rKVxzLT5ccycoLispJyIpCisgIGluZm8gPSB7fQorICBpbmRlbnRfc3RhY2sgPSBbWy0xLCBpbmZvXV0KKyAgZm9yIGxpbmVfaW5mb19yYXcgaW4gaW5mb19yYXcuc3BsaXQoJ1xuJyk6CisgICAgIyBQYXJzZSB0aGUgbGluZQorICAgIGxpbmVfaW5mb19wYXJzZWQgPSBsaW5lX21hdGNoZXIubWF0Y2gobGluZV9pbmZvX3JhdykKKyAgICBpZiBub3QgbGluZV9pbmZvX3BhcnNlZDoKKyAgICAgIGNvbnRpbnVlCisgICAgaW5kZW50ID0gbGVuKGxpbmVfaW5mb19wYXJzZWQuZ3JvdXAoMSkpCisgICAga2V5ID0gbGluZV9pbmZvX3BhcnNlZC5ncm91cCgyKS5zdHJpcCgpCisgICAgdmFsdWUgPSBsaW5lX2luZm9fcGFyc2VkLmdyb3VwKDMpLnN0cmlwKCkKKworICAgICMgUG9wIGluZGVudGF0aW9uIHN0YWNrCisgICAgd2hpbGUgaW5kZW50IDw9IGluZGVudF9zdGFja1stMV1bMF06CisgICAgICBkZWwgaW5kZW50X3N0YWNrWy0xXQorCisgICAgIyBJbnNlcnQgaW5mb3JtYXRpb24gaW50byAnaW5mbycuCisgICAgY3VyX2luZm8gPSBpbmRlbnRfc3RhY2tbLTFdWzFdCisgICAgaWYgdmFsdWUgPT0gIiI6CisgICAgICBpZiBrZXkgPT0gIkRlc2NyaXB0b3JzIjoKKyAgICAgICAgZW1wdHlfbGlzdCA9IFtdCisgICAgICAgIGN1cl9pbmZvW2tleV0gPSBlbXB0eV9saXN0CisgICAgICAgIGluZGVudF9zdGFjay5hcHBlbmQoW2luZGVudCwgZW1wdHlfbGlzdF0pCisgICAgICBlbHNlOgorICAgICAgICBlbXB0eV9kaWN0ID0ge30KKyAgICAgICAgY3VyX2luZm8uYXBwZW5kKHtrZXk6ZW1wdHlfZGljdH0pCisgICAgICAgIGluZGVudF9zdGFjay5hcHBlbmQoW2luZGVudCwgZW1wdHlfZGljdF0pCisgICAgZWxpZiBrZXkgPT0gIlByb3AiOgorICAgICAgcHJvcF9wYXJzZWQgPSBwcm9wX21hdGNoZXIubWF0Y2godmFsdWUpCisgICAgICBpZiBub3QgcHJvcF9wYXJzZWQ6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAiRmFpbGVkIHRvIHBhcnNlIHByb3Agd2hpbGUgZ2V0dGluZyBhdmIgaW5mb3JtYXRpb24uIikKKyAgICAgIGN1cl9pbmZvLmFwcGVuZCh7a2V5Ontwcm9wX3BhcnNlZC5ncm91cCgxKTpwcm9wX3BhcnNlZC5ncm91cCgyKX19KQorICAgIGVsc2U6CisgICAgICBjdXJfaW5mb1trZXldID0gdmFsdWUKKyAgcmV0dXJuIGluZm8KKworZGVmIFJlcGxhY2VLZXlJbkF2Ykhhc2h0cmVlRm9vdGVyKGltYWdlLCBuZXdfa2V5LCBuZXdfYWxnb3JpdGhtLCBtaXNjX2luZm8pOgorICAjIEdldCBhdmIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGltYWdlIGJ5IHBhcnNpbmcgYXZidG9vbCBpbmZvX2ltYWdlLgorICBkZWYgR2V0QXZiSW5mbyhhdmJ0b29sLCBpbWFnZV9uYW1lKToKKyAgICAjIEdldCBpbmZvcm1hdGlvbiB3aXRoIHJhdyBzdHJpbmcgYnkgYGF2YnRvb2wgaW5mb19pbWFnZWAuCisgICAgaW5mb19yYXcgPSBjb21tb24uUnVuQW5kQ2hlY2tPdXRwdXQoWworICAgICAgYXZidG9vbCwgJ2luZm9faW1hZ2UnLAorICAgICAgJy0taW1hZ2UnLCBpbWFnZV9uYW1lCisgICAgXSkKKyAgICByZXR1cm4gUGFyc2VBdmJJbmZvKGluZm9fcmF3KQorCisgICMgR2V0IGhhc2h0cmVlIGRlc2NyaXB0b3IgZnJvbSBpbmZvCisgIGRlZiBHZXRBdmJIYXNodHJlZURlc2NyaXB0b3IoYXZiX2luZm8pOgorICAgIGhhc2h0cmVlX2Rlc2NyaXB0b3JzID0gdHVwbGUoZmlsdGVyKGxhbWJkYSB4OiAiSGFzaHRyZWUgZGVzY3JpcHRvciIgaW4geCwKKyAgICAgICAgaW5mby5nZXQoJ0Rlc2NyaXB0b3JzJykpKQorICAgIGlmIGxlbihoYXNodHJlZV9kZXNjcmlwdG9ycykgIT0gMToKKyAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlRoZSBudW1iZXIgb2YgaGFzaHRyZWUgZGVzY3JpcHRvciBpcyBub3QgMS4iKQorICAgIHJldHVybiBoYXNodHJlZV9kZXNjcmlwdG9yc1swXVsiSGFzaHRyZWUgZGVzY3JpcHRvciJdCisKKyAgIyBHZXQgYXZiIGluZm8KKyAgYXZidG9vbCA9IG1pc2NfaW5mb1snYXZiX2F2YnRvb2wnXQorICBpbmZvID0gR2V0QXZiSW5mbyhhdmJ0b29sLCBpbWFnZS5uYW1lKQorICBoYXNodHJlZV9kZXNjcmlwdG9yID0gR2V0QXZiSGFzaHRyZWVEZXNjcmlwdG9yKGluZm8pCisKKyAgIyBHZW5lcmF0ZSBjb21tYW5kCisgIGNtZCA9IFthdmJ0b29sLCAnYWRkX2hhc2h0cmVlX2Zvb3RlcicsCisgICAgJy0ta2V5JywgbmV3X2tleSwKKyAgICAnLS1hbGdvcml0aG0nLCBuZXdfYWxnb3JpdGhtLAorICAgICctLXBhcnRpdGlvbl9uYW1lJywgaGFzaHRyZWVfZGVzY3JpcHRvci5nZXQoIlBhcnRpdGlvbiBOYW1lIiksCisgICAgJy0tcGFydGl0aW9uX3NpemUnLCBpbmZvLmdldCgiSW1hZ2Ugc2l6ZSIpLnJlbW92ZXN1ZmZpeCgiIGJ5dGVzIiksCisgICAgJy0taGFzaF9hbGdvcml0aG0nLCBoYXNodHJlZV9kZXNjcmlwdG9yLmdldCgiSGFzaCBBbGdvcml0aG0iKSwKKyAgICAnLS1zYWx0JywgaGFzaHRyZWVfZGVzY3JpcHRvci5nZXQoIlNhbHQiKSwKKyAgICAnLS1kb19ub3RfZ2VuZXJhdGVfZmVjJywKKyAgICAnLS1pbWFnZScsIGltYWdlLm5hbWUKKyAgXQorCisgICMgQXBwZW5kIHByb3BlcnRpZXMgaW50byBjb21tYW5kCisgIHByb3BzID0gbWFwKGxhbWJkYSB4OiB4LmdldCgiUHJvcCIpLCBmaWx0ZXIobGFtYmRhIHg6ICJQcm9wIiBpbiB4LAorICAgICAgaW5mby5nZXQoJ0Rlc2NyaXB0b3JzJykpKQorICBmb3IgcHJvcF93cmFwcGVkIGluIHByb3BzOgorICAgIHByb3AgPSB0dXBsZShwcm9wX3dyYXBwZWQuaXRlbXMoKSkKKyAgICBpZiBsZW4ocHJvcCkgIT0gMToKKyAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlRoZSBudW1iZXIgb2YgcHJvcGVydHkgaXMgbm90IDEuIikKKyAgICBjbWQuYXBwZW5kKCctLXByb3AnKQorICAgIGNtZC5hcHBlbmQocHJvcFswXVswXSArICc6JyArIHByb3BbMF1bMV0pCisKKyAgIyBSZXBsYWNlIEhhc2h0cmVlIEZvb3RlciB3aXRoIG5ldyBrZXkKKyAgY29tbW9uLlJ1bkFuZENoZWNrT3V0cHV0KGNtZCkKKworICAjIENoZWNrIHJvb3QgZGlnZXN0IGlzIG5vdCBjaGFuZ2VkCisgIG5ld19pbmZvID0gR2V0QXZiSW5mbyhhdmJ0b29sLCBpbWFnZS5uYW1lKQorICBuZXdfaGFzaHRyZWVfZGVzY3JpcHRvciA9IEdldEF2Ykhhc2h0cmVlRGVzY3JpcHRvcihpbmZvKQorICByb290X2RpZ2VzdCA9IGhhc2h0cmVlX2Rlc2NyaXB0b3IuZ2V0KCJSb290IERpZ2VzdCIpCisgIG5ld19yb290X2RpZ2VzdCA9IG5ld19oYXNodHJlZV9kZXNjcmlwdG9yLmdldCgiUm9vdCBEaWdlc3QiKQorICBhc3NlcnQgcm9vdF9kaWdlc3QgPT0gbmV3X3Jvb3RfZGlnZXN0LCBcCisgICAgICAoIlJvb3QgZGlnZXN0IGluIGhhc2h0cmVlIGRlc2NyaXB0b3Igc2hvdWxkbid0IGJlIGNoYW5nZWQuIE9sZDoge30sIE5ldzogIgorICAgICAgICJ7fSIpLmZvcm1hdChyb290X2RpZ2VzdCwgbmV3X3Jvb3RfZGlnZXN0KQogCiBkZWYgUmVwbGFjZUNlcnRzKGRhdGEpOgogICAiIiJSZXBsYWNlcyBhbGwgdGhlIG9jY3VyZW5jZXMgb2YgWC41MDkgY2VydHMgd2l0aCB0aGUgbmV3IG9uZXMuCkBAIC05MTIsOSArMTE4OCw5IEBACiAgIGNvbW1vbi5aaXBXcml0ZVN0cihvdXRwdXRfemlwLCBmaWxlbmFtZSwgdGVtcF9maWxlLmdldHZhbHVlKCkpCiAKIAotZGVmIFJlcGxhY2VPdGFLZXlzKGlucHV0X3RmX3ppcCwgb3V0cHV0X3RmX3ppcCwgbWlzY19pbmZvKToKK2RlZiBSZXBsYWNlT3RhS2V5cyhpbnB1dF90Zl96aXA6IHppcGZpbGUuWmlwRmlsZSwgb3V0cHV0X3RmX3ppcCwgbWlzY19pbmZvKToKICAgdHJ5OgotICAgIGtleWxpc3QgPSBpbnB1dF90Zl96aXAucmVhZCgiTUVUQS9vdGFrZXlzLnR4dCIpLnNwbGl0KCkKKyAgICBrZXlsaXN0ID0gaW5wdXRfdGZfemlwLnJlYWQoIk1FVEEvb3Rha2V5cy50eHQiKS5kZWNvZGUoKS5zcGxpdCgpCiAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICByYWlzZSBjb21tb24uRXh0ZXJuYWxFcnJvcigiY2FuJ3QgcmVhZCBNRVRBL290YWtleXMudHh0IGZyb20gaW5wdXQiKQogCkBAIC0xMDUyLDI3ICsxMzI4LDYgQEAKICAgICAgIG1pc2NfaW5mb1thcmdzX2tleV0gPSByZXN1bHQKIAogCi1kZWYgUmVwbGFjZUdraVNpZ25pbmdLZXkobWlzY19pbmZvKToKLSAgIiIiUmVwbGFjZXMgdGhlIEdLSSBzaWduaW5nIGtleS4iIiIKLQotICBrZXkgPSBPUFRJT05TLmdraV9zaWduaW5nX2tleQotICBpZiBub3Qga2V5OgotICAgIHJldHVybgotCi0gIGFsZ29yaXRobSA9IE9QVElPTlMuZ2tpX3NpZ25pbmdfYWxnb3JpdGhtCi0gIGlmIG5vdCBhbGdvcml0aG06Ci0gICAgcmFpc2UgVmFsdWVFcnJvcigiTWlzc2luZyAtLWdraV9zaWduaW5nX2FsZ29yaXRobSIpCi0KLSAgcHJpbnQoJ1JlcGxhY2luZyBHS0kgc2lnbmluZyBrZXkgd2l0aCAiJXMiICglcyknICUgKGtleSwgYWxnb3JpdGhtKSkKLSAgbWlzY19pbmZvWyJna2lfc2lnbmluZ19hbGdvcml0aG0iXSA9IGFsZ29yaXRobQotICBtaXNjX2luZm9bImdraV9zaWduaW5nX2tleV9wYXRoIl0gPSBrZXkKLQotICBleHRyYV9hcmdzID0gT1BUSU9OUy5na2lfc2lnbmluZ19leHRyYV9hcmdzCi0gIGlmIGV4dHJhX2FyZ3M6Ci0gICAgcHJpbnQoJ1NldHRpbmcgR0tJIHNpZ25pbmcgYXJnczogIiVzIicgJSAoZXh0cmFfYXJncykpCi0gICAgbWlzY19pbmZvWyJna2lfc2lnbmluZ19zaWduYXR1cmVfYXJncyJdID0gZXh0cmFfYXJncwotCi0KIGRlZiBCdWlsZEtleU1hcChtaXNjX2luZm8sIGtleV9tYXBwaW5nX29wdGlvbnMpOgogICBmb3IgcywgZCBpbiBrZXlfbWFwcGluZ19vcHRpb25zOgogICAgIGlmIHMgaXMgTm9uZTogICAjIC1kIG9wdGlvbgpAQCAtMTA4Nyw2ICsxMzQyLDcgQEAKICAgICAgICAgICBkZXZrZXlkaXIgKyAiL3NoYXJlZCI6ICAgZCArICIvc2hhcmVkIiwKICAgICAgICAgICBkZXZrZXlkaXIgKyAiL3BsYXRmb3JtIjogZCArICIvcGxhdGZvcm0iLAogICAgICAgICAgIGRldmtleWRpciArICIvbmV0d29ya3N0YWNrIjogZCArICIvbmV0d29ya3N0YWNrIiwKKyAgICAgICAgICBkZXZrZXlkaXIgKyAiL3Nka19zYW5kYm94IjogZCArICIvc2RrX3NhbmRib3giLAogICAgICAgfSkKICAgICBlbHNlOgogICAgICAgT1BUSU9OUy5rZXlfbWFwW3NdID0gZApAQCAtMTIzNCwxMSArMTQ5MCwxMSBAQAogICAgIHZlbmRvcl9taXNjX2luZm9bIm5vX3JlY292ZXJ5Il0gPSAidHJ1ZSIgICMgcmVjb3ZlcnkKICAgICB2ZW5kb3JfbWlzY19pbmZvWyJhdmJfZW5hYmxlIl0gPSAiZmFsc2UiICAjIHZibWV0YQogCi0gIHZlbmRvcl9taXNjX2luZm9bImJvYXJkX2JwdF9lbmFibGUiXSA9ICJmYWxzZSIgICMgcGFydGl0aW9uLXRhYmxlCiAgIHZlbmRvcl9taXNjX2luZm9bImhhc19kdGJvIl0gPSAiZmFsc2UiICAjIGR0Ym8KICAgdmVuZG9yX21pc2NfaW5mb1siaGFzX3B2bWZ3Il0gPSAiZmFsc2UiICAjIHB2bWZ3Ci0gIHZlbmRvcl9taXNjX2luZm9bImF2Yl9jdXN0b21faW1hZ2VzX3BhcnRpdGlvbl9saXN0Il0gPSAiIiAgIyBjdXN0b20gaW1hZ2VzCisgIHZlbmRvcl9taXNjX2luZm9bImF2Yl9jdXN0b21faW1hZ2VzX3BhcnRpdGlvbl9saXN0Il0gPSAiIiAgIyBhdmIgY3VzdG9tIGltYWdlcwogICB2ZW5kb3JfbWlzY19pbmZvWyJhdmJfYnVpbGRpbmdfdmJtZXRhX2ltYWdlIl0gPSAiZmFsc2UiICMgc2tpcCBidWlsZGluZyB2Ym1ldGEKKyAgdmVuZG9yX21pc2NfaW5mb1siY3VzdG9tX2ltYWdlc19wYXJ0aXRpb25fbGlzdCJdID0gIiIgICMgY3VzdG9tIGltYWdlcwogICB2ZW5kb3JfbWlzY19pbmZvWyJ1c2VfZHluYW1pY19wYXJ0aXRpb25zIl0gPSAiZmFsc2UiICAjIHN1cGVyX2VtcHR5CiAgIHZlbmRvcl9taXNjX2luZm9bImJ1aWxkX3N1cGVyX3BhcnRpdGlvbiJdID0gImZhbHNlIiAgIyBzdXBlciBzcGxpdAogICB2ZW5kb3JfbWlzY19pbmZvWyJhdmJfdmJtZXRhX3N5c3RlbSJdID0gIiIgICMgc2tpcCBidWlsZGluZyB2Ym1ldGFfc3lzdGVtCkBAIC0xNDI2LDEyICsxNjgyLDYgQEAKICAgICAgICMgJ29lbT0tLXNpZ25pbmdfaGVscGVyX3dpdGhfZmlsZXM9L3RtcC9hdmJzaWduZXIuc2gnLgogICAgICAgcGFydGl0aW9uLCBleHRyYV9hcmdzID0gYS5zcGxpdCgiPSIsIDEpCiAgICAgICBPUFRJT05TLmF2Yl9leHRyYV9hcmdzW3BhcnRpdGlvbl0gPSBleHRyYV9hcmdzCi0gICAgZWxpZiBvID09ICItLWdraV9zaWduaW5nX2tleSI6Ci0gICAgICBPUFRJT05TLmdraV9zaWduaW5nX2tleSA9IGEKLSAgICBlbGlmIG8gPT0gIi0tZ2tpX3NpZ25pbmdfYWxnb3JpdGhtIjoKLSAgICAgIE9QVElPTlMuZ2tpX3NpZ25pbmdfYWxnb3JpdGhtID0gYQotICAgIGVsaWYgbyA9PSAiLS1na2lfc2lnbmluZ19leHRyYV9hcmdzIjoKLSAgICAgIE9QVElPTlMuZ2tpX3NpZ25pbmdfZXh0cmFfYXJncyA9IGEKICAgICBlbGlmIG8gPT0gIi0tdmVuZG9yX290YXRvb2xzIjoKICAgICAgIE9QVElPTlMudmVuZG9yX290YXRvb2xzID0gYQogICAgIGVsaWYgbyA9PSAiLS12ZW5kb3JfcGFydGl0aW9ucyI6CkBAIC0xNDQyLDYgKzE2OTIsOCBAQAogICAgICAgT1BUSU9OUy5vdmVycmlkZV9hcGtfa2V5cyA9IGEKICAgICBlbGlmIG8gPT0gIi0tb3ZlcnJpZGVfYXBleF9rZXlzIjoKICAgICAgIE9QVElPTlMub3ZlcnJpZGVfYXBleF9rZXlzID0gYQorICAgIGVsaWYgbyBpbiAoIi0tZ2tpX3NpZ25pbmdfa2V5IiwgICItLWdraV9zaWduaW5nX2FsZ29yaXRobSIsICAiLS1na2lfc2lnbmluZ19leHRyYV9hcmdzIik6CisgICAgICBwcmludChmIntvfSBpcyBkZXByZWNhdGVkIGFuZCBkb2VzIG5vdGhpbmciKQogICAgIGVsc2U6CiAgICAgICByZXR1cm4gRmFsc2UKICAgICByZXR1cm4gVHJ1ZQpAQCAtMTUwNCw3ICsxNzU2LDcgQEAKICAgICAgICAgICAib3ZlcnJpZGVfYXBrX2tleXM9IiwKICAgICAgICAgICAib3ZlcnJpZGVfYXBleF9rZXlzPSIsCiAgICAgICBdLAotICAgICAgZXh0cmFfb3B0aW9uX2hhbmRsZXI9b3B0aW9uX2hhbmRsZXIpCisgICAgICBleHRyYV9vcHRpb25faGFuZGxlcj1bb3B0aW9uX2hhbmRsZXIsIHBheWxvYWRfc2lnbmVyLnNpZ25lcl9vcHRpb25zXSkKIAogICBpZiBsZW4oYXJncykgIT0gMjoKICAgICBjb21tb24uVXNhZ2UoX19kb2NfXykKQEAgLTE1MTgsNiArMTc3MCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93WmlwNjQ9VHJ1ZSkKIAogICBtaXNjX2luZm8gPSBjb21tb24uTG9hZEluZm9EaWN0KGlucHV0X3ppcCkKKyAgaWYgT1BUSU9OUy5wYWNrYWdlX2tleSBpcyBOb25lOgorICAgICAgT1BUSU9OUy5wYWNrYWdlX2tleSA9IG1pc2NfaW5mby5nZXQoCisgICAgICAgICAgImRlZmF1bHRfc3lzdGVtX2Rldl9jZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgImJ1aWxkL21ha2UvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvdGVzdGtleSIpCiAKICAgQnVpbGRLZXlNYXAobWlzY19pbmZvLCBrZXlfbWFwcGluZ19vcHRpb25zKQogCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvdGVzdF9idWlsZF9pbWFnZS5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X2J1aWxkX2ltYWdlLnB5CmluZGV4IGNmYWU3YTUuLmQ0ZjdjY2MgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X2J1aWxkX2ltYWdlLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X2J1aWxkX2ltYWdlLnB5CkBAIC05OSwxMSArOTksMTAgQEAKICAgICB9CiAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQnVpbGRJbWFnZUVycm9yLCBDaGVja0hlYWRyb29tLCBleHQ0ZnNfb3V0cHV0LCBwcm9wX2RpY3QpCiAKLSAgZGVmIHRlc3RfU2V0VXBJbkRpckFuZEZzQ29uZmlnX1N5c3RlbVJvb3RJbWFnZVRydWVfTm9uU3lzdGVtKHNlbGYpOgorICBkZWYgdGVzdF9TZXRVcEluRGlyQW5kRnNDb25maWdfTm9uU3lzdGVtKHNlbGYpOgogICAgIHByb3BfZGljdCA9IHsKICAgICAgICAgJ2ZzX2NvbmZpZyc6ICdmcy1jb25maWcnLAogICAgICAgICAnbW91bnRfcG9pbnQnOiAndmVuZG9yJywKLSAgICAgICAgJ3N5c3RlbV9yb290X2ltYWdlJzogJ3RydWUnLAogICAgIH0KICAgICBpbl9kaXIsIGZzX2NvbmZpZyA9IFNldFVwSW5EaXJBbmRGc0NvbmZpZygnL3BhdGgvdG8vaW5fZGlyJywgcHJvcF9kaWN0KQogICAgIHNlbGYuYXNzZXJ0RXF1YWwoJy9wYXRoL3RvL2luX2RpcicsIGluX2RpcikKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X2NvbW1vbi5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X2NvbW1vbi5weQppbmRleCAyZGZkOGM3Li44OTkzM2EwIDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvdGVzdF9jb21tb24ucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RfY29tbW9uLnB5CkBAIC0xNSwxNCArMTUsMTMgQEAKICMKIAogaW1wb3J0IGNvcHkKLWltcG9ydCBqc29uCiBpbXBvcnQgb3MKIGltcG9ydCBzdWJwcm9jZXNzCiBpbXBvcnQgdGVtcGZpbGUKLWltcG9ydCB0aW1lCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB6aXBmaWxlCiBmcm9tIGhhc2hsaWIgaW1wb3J0IHNoYTEKK2Zyb20gdHlwaW5nIGltcG9ydCBCaW5hcnlJTwogCiBpbXBvcnQgY29tbW9uCiBpbXBvcnQgdGVzdF91dGlscwpAQCAtMzYsMTQgKzM1LDI0IEBACiBHaUIgPSAxMDI0ICogTWlCCiAKIAotZGVmIGdldF8yZ2Jfc3RyaW5nKCk6CitkZWYgZ2V0XzJnYl9maWxlKCk6CiAgIHNpemUgPSBpbnQoMiAqIEdpQiArIDEpCiAgIGJsb2NrX3NpemUgPSA0ICogS2lCCiAgIHN0ZXBfc2l6ZSA9IDQgKiBNaUIKLSAgIyBHZW5lcmF0ZSBhIGxvbmcgc3RyaW5nIHdpdGggaG9sZXMsIGUuZy4gJ3h5elx4MDBhYmNceDAwLi4uJy4KKyAgdG1wZmlsZSA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpCisgIHRtcGZpbGUudHJ1bmNhdGUoc2l6ZSkKICAgZm9yIF8gaW4gcmFuZ2UoMCwgc2l6ZSwgc3RlcF9zaXplKToKLSAgICB5aWVsZCBvcy51cmFuZG9tKGJsb2NrX3NpemUpCi0gICAgeWllbGQgYidcMCcgKiAoc3RlcF9zaXplIC0gYmxvY2tfc2l6ZSkKKyAgICB0bXBmaWxlLndyaXRlKG9zLnVyYW5kb20oYmxvY2tfc2l6ZSkpCisgICAgdG1wZmlsZS5zZWVrKHN0ZXBfc2l6ZSAtIGJsb2NrX3NpemUsIG9zLlNFRUtfQ1VSKQorICByZXR1cm4gdG1wZmlsZQorCisKK2RlZiBoYXNoX2ZpbGUoZmlsZW5hbWUpOgorICBzaGExX2hhc2ggPSBzaGExKCkKKyAgd2l0aCBvcGVuKGZpbGVuYW1lLCAicmIiKSBhcyBmcDoKKyAgICBmb3IgZGF0YSBpbiBpdGVyKGxhbWJkYTogZnAucmVhZCg0Kk1pQiksIGInJyk6CisgICAgICBzaGExX2hhc2gudXBkYXRlKGRhdGEpCisgIHJldHVybiBzaGExX2hhc2gKIAogCiBjbGFzcyBCdWlsZEluZm9UZXN0KHRlc3RfdXRpbHMuUmVsZWFzZVRvb2xzVGVzdENhc2UpOgpAQCAtMjIyLDE3ICsyMzEsMTcgQEAKICAgICBpbmZvX2RpY3QgPSBjb3B5LmRlZXBjb3B5KHNlbGYuVEVTVF9JTkZPX0ZJTkdFUlBSSU5UX0RJQ1QpCiAgICAgYnVpbGRfaW5mbyA9IGNvbW1vbi5CdWlsZEluZm8oaW5mb19kaWN0KQogICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAncHJvZHVjdC1icmFuZC9wcm9kdWN0LW5hbWUvcHJvZHVjdC1kZXZpY2U6dmVyc2lvbi1yZWxlYXNlL2J1aWxkLWlkLycKLSAgICAgICd2ZXJzaW9uLWluY3JlbWVudGFsOmJ1aWxkLXR5cGUvYnVpbGQtdGFncycsIGJ1aWxkX2luZm8uZmluZ2VycHJpbnQpCisgICAgICAgICdwcm9kdWN0LWJyYW5kL3Byb2R1Y3QtbmFtZS9wcm9kdWN0LWRldmljZTp2ZXJzaW9uLXJlbGVhc2UvYnVpbGQtaWQvJworICAgICAgICAndmVyc2lvbi1pbmNyZW1lbnRhbDpidWlsZC10eXBlL2J1aWxkLXRhZ3MnLCBidWlsZF9pbmZvLmZpbmdlcnByaW50KQogCiAgICAgYnVpbGRfcHJvcHMgPSBpbmZvX2RpY3RbJ2J1aWxkLnByb3AnXS5idWlsZF9wcm9wcwogICAgIGRlbCBidWlsZF9wcm9wc1sncm8uYnVpbGQuaWQnXQogICAgIGJ1aWxkX3Byb3BzWydyby5idWlsZC5sZWdhY3kuaWQnXSA9ICdsZWdhY3ktYnVpbGQtaWQnCiAgICAgYnVpbGRfaW5mbyA9IGNvbW1vbi5CdWlsZEluZm8oaW5mb19kaWN0LCB1c2VfbGVnYWN5X2lkPVRydWUpCiAgICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICdwcm9kdWN0LWJyYW5kL3Byb2R1Y3QtbmFtZS9wcm9kdWN0LWRldmljZTp2ZXJzaW9uLXJlbGVhc2UvJwotICAgICAgJ2xlZ2FjeS1idWlsZC1pZC92ZXJzaW9uLWluY3JlbWVudGFsOmJ1aWxkLXR5cGUvYnVpbGQtdGFncycsCi0gICAgICBidWlsZF9pbmZvLmZpbmdlcnByaW50KQorICAgICAgICAncHJvZHVjdC1icmFuZC9wcm9kdWN0LW5hbWUvcHJvZHVjdC1kZXZpY2U6dmVyc2lvbi1yZWxlYXNlLycKKyAgICAgICAgJ2xlZ2FjeS1idWlsZC1pZC92ZXJzaW9uLWluY3JlbWVudGFsOmJ1aWxkLXR5cGUvYnVpbGQtdGFncycsCisgICAgICAgIGJ1aWxkX2luZm8uZmluZ2VycHJpbnQpCiAKICAgICBzZWxmLmFzc2VydFJhaXNlcyhjb21tb24uRXh0ZXJuYWxFcnJvciwgY29tbW9uLkJ1aWxkSW5mbywgaW5mb19kaWN0LCBOb25lLAogICAgICAgICAgICAgICAgICAgICAgIEZhbHNlKQpAQCAtMjQxLDkgKzI1MCw5IEBACiAgICAgaW5mb19kaWN0Wyd2Ym1ldGFfZGlnZXN0J10gPSAnYWJjZGUxMjM0NScKICAgICBidWlsZF9pbmZvID0gY29tbW9uLkJ1aWxkSW5mbyhpbmZvX2RpY3QsIHVzZV9sZWdhY3lfaWQ9RmFsc2UpCiAgICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICdwcm9kdWN0LWJyYW5kL3Byb2R1Y3QtbmFtZS9wcm9kdWN0LWRldmljZTp2ZXJzaW9uLXJlbGVhc2UvJwotICAgICAgJ2xlZ2FjeS1idWlsZC1pZC5hYmNkZTEyMy92ZXJzaW9uLWluY3JlbWVudGFsOmJ1aWxkLXR5cGUvYnVpbGQtdGFncycsCi0gICAgICBidWlsZF9pbmZvLmZpbmdlcnByaW50KQorICAgICAgICAncHJvZHVjdC1icmFuZC9wcm9kdWN0LW5hbWUvcHJvZHVjdC1kZXZpY2U6dmVyc2lvbi1yZWxlYXNlLycKKyAgICAgICAgJ2xlZ2FjeS1idWlsZC1pZC5hYmNkZTEyMy92ZXJzaW9uLWluY3JlbWVudGFsOmJ1aWxkLXR5cGUvYnVpbGQtdGFncycsCisgICAgICAgIGJ1aWxkX2luZm8uZmluZ2VycHJpbnQpCiAKICAgZGVmIHRlc3RfX19nZXRpdGVtX18oc2VsZik6CiAgICAgdGFyZ2V0X2luZm8gPSBjb21tb24uQnVpbGRJbmZvKHNlbGYuVEVTVF9JTkZPX0RJQ1QsIE5vbmUpCkBAIC0zNzYsNyArMzg1LDcgQEAKICAgICBpbmZvX2RpY3RbJ2J1aWxkLnByb3AnXS5idWlsZF9wcm9wc1sKICAgICAgICAgJ3JvLnByb2R1Y3QucHJvcGVydHlfc291cmNlX29yZGVyJ10gPSAnYmFkLXNvdXJjZScKICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKGNvbW1vbi5FeHRlcm5hbEVycm9yLAotICAgICAgICAnSW52YWxpZCByby5wcm9kdWN0LnByb3BlcnR5X3NvdXJjZV9vcmRlcicpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ludmFsaWQgcm8ucHJvZHVjdC5wcm9wZXJ0eV9zb3VyY2Vfb3JkZXInKToKICAgICAgIGluZm8gPSBjb21tb24uQnVpbGRJbmZvKGluZm9fZGljdCwgTm9uZSkKICAgICAgIGluZm8uR2V0QnVpbGRQcm9wKCdyby5wcm9kdWN0LmRldmljZScpCiAKQEAgLTQyOSw2ICs0MzgsMTMgQEAKICAgICBzZWxmLmFzc2VydElzTm9uZSh6aXBfZmlsZS50ZXN0emlwKCkpCiAKICAgZGVmIF90ZXN0X1ppcFdyaXRlKHNlbGYsIGNvbnRlbnRzLCBleHRyYV96aXB3cml0ZV9hcmdzPU5vbmUpOgorICAgIHdpdGggdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkgYXMgdGVzdF9maWxlOgorICAgICAgdGVzdF9maWxlX25hbWUgPSB0ZXN0X2ZpbGUubmFtZQorICAgICAgZm9yIGRhdGEgaW4gY29udGVudHM6CisgICAgICAgIHRlc3RfZmlsZS53cml0ZShieXRlcyhkYXRhKSkKKyAgICAgIHJldHVybiBzZWxmLl90ZXN0X1ppcFdyaXRlRmlsZSh0ZXN0X2ZpbGVfbmFtZSwgZXh0cmFfemlwd3JpdGVfYXJncykKKworICBkZWYgX3Rlc3RfWmlwV3JpdGVGaWxlKHNlbGYsIHRlc3RfZmlsZV9uYW1lLCBleHRyYV96aXB3cml0ZV9hcmdzPU5vbmUpOgogICAgIGV4dHJhX3ppcHdyaXRlX2FyZ3MgPSBkaWN0KGV4dHJhX3ppcHdyaXRlX2FyZ3Mgb3Ige30pCiAKICAgICB0ZXN0X2ZpbGUgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoZGVsZXRlPUZhbHNlKQpAQCAtNDQxLDE3ICs0NTcsMTIgQEAKICAgICBhcmNuYW1lID0gZXh0cmFfemlwd3JpdGVfYXJncy5nZXQoImFyY25hbWUiLCB0ZXN0X2ZpbGVfbmFtZSkKICAgICBpZiBhcmNuYW1lWzBdID09ICIvIjoKICAgICAgIGFyY25hbWUgPSBhcmNuYW1lWzE6XQorICAgIHNoYTFfaGFzaCA9IGhhc2hfZmlsZSh0ZXN0X2ZpbGVfbmFtZSkKIAogICAgIHppcF9maWxlLmNsb3NlKCkKICAgICB6aXBfZmlsZSA9IHppcGZpbGUuWmlwRmlsZSh6aXBfZmlsZV9uYW1lLCAidyIsIGFsbG93WmlwNjQ9VHJ1ZSkKIAogICAgIHRyeToKLSAgICAgIHNoYTFfaGFzaCA9IHNoYTEoKQotICAgICAgZm9yIGRhdGEgaW4gY29udGVudHM6Ci0gICAgICAgIHNoYTFfaGFzaC51cGRhdGUoYnl0ZXMoZGF0YSkpCi0gICAgICAgIHRlc3RfZmlsZS53cml0ZShieXRlcyhkYXRhKSkKLSAgICAgIHRlc3RfZmlsZS5jbG9zZSgpCi0KICAgICAgIGV4cGVjdGVkX21vZGUgPSBleHRyYV96aXB3cml0ZV9hcmdzLmdldCgicGVybXMiLCAwbzY0NCkKICAgICAgIGV4cGVjdGVkX2NvbXByZXNzX3R5cGUgPSBleHRyYV96aXB3cml0ZV9hcmdzLmdldCgiY29tcHJlc3NfdHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5aSVBfU1RPUkVEKQpAQCAtNDY3LDcgKzQ3OCw2IEBACiAgICAgICAgICAgICAgICAgICAgdGVzdF9maWxlX25hbWUsIGV4cGVjdGVkX3N0YXQsIGV4cGVjdGVkX21vZGUsCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfY29tcHJlc3NfdHlwZSkKICAgICBmaW5hbGx5OgotICAgICAgb3MucmVtb3ZlKHRlc3RfZmlsZV9uYW1lKQogICAgICAgb3MucmVtb3ZlKHppcF9maWxlX25hbWUpCiAKICAgZGVmIF90ZXN0X1ppcFdyaXRlU3RyKHNlbGYsIHppbmZvX29yX2FyY25hbWUsIGNvbnRlbnRzLCBleHRyYV9hcmdzPU5vbmUpOgpAQCAtNTAyLDE0ICs1MTIsMTMgQEAKICAgICBmaW5hbGx5OgogICAgICAgb3MucmVtb3ZlKHppcF9maWxlX25hbWUpCiAKLSAgZGVmIF90ZXN0X1ppcFdyaXRlU3RyX2xhcmdlX2ZpbGUoc2VsZiwgbGFyZ2UsIHNtYWxsLCBleHRyYV9hcmdzPU5vbmUpOgorICBkZWYgX3Rlc3RfWmlwV3JpdGVTdHJfbGFyZ2VfZmlsZShzZWxmLCBsYXJnZV9maWxlOiBCaW5hcnlJTywgc21hbGwsIGV4dHJhX2FyZ3M9Tm9uZSk6CiAgICAgZXh0cmFfYXJncyA9IGRpY3QoZXh0cmFfYXJncyBvciB7fSkKIAogICAgIHppcF9maWxlID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKGRlbGV0ZT1GYWxzZSkKICAgICB6aXBfZmlsZV9uYW1lID0gemlwX2ZpbGUubmFtZQogCi0gICAgdGVzdF9maWxlID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKGRlbGV0ZT1GYWxzZSkKLSAgICB0ZXN0X2ZpbGVfbmFtZSA9IHRlc3RfZmlsZS5uYW1lCisgICAgdGVzdF9maWxlX25hbWUgPSBsYXJnZV9maWxlLm5hbWUKIAogICAgIGFyY25hbWVfbGFyZ2UgPSB0ZXN0X2ZpbGVfbmFtZQogICAgIGFyY25hbWVfc21hbGwgPSAiYmFyIgpAQCAtNTIyLDExICs1MzEsNyBAQAogICAgIHppcF9maWxlID0gemlwZmlsZS5aaXBGaWxlKHppcF9maWxlX25hbWUsICJ3IiwgYWxsb3daaXA2ND1UcnVlKQogCiAgICAgdHJ5OgotICAgICAgc2hhMV9oYXNoID0gc2hhMSgpCi0gICAgICBmb3IgZGF0YSBpbiBsYXJnZToKLSAgICAgICAgc2hhMV9oYXNoLnVwZGF0ZShkYXRhKQotICAgICAgICB0ZXN0X2ZpbGUud3JpdGUoZGF0YSkKLSAgICAgIHRlc3RfZmlsZS5jbG9zZSgpCisgICAgICBzaGExX2hhc2ggPSBoYXNoX2ZpbGUodGVzdF9maWxlX25hbWUpCiAKICAgICAgICMgQXJiaXRyYXJ5IHRpbWVzdGFtcCwganVzdCB0byBtYWtlIHN1cmUgY29tbW9uLlppcFdyaXRlKCkgcmVzdG9yZXMKICAgICAgICMgdGhlIHRpbWVzdGFtcCBhZnRlciB3cml0aW5nLgpAQCAtNTUxLDcgKzU1Niw2IEBACiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfY29tcHJlc3NfdHlwZT1leHBlY3RlZF9jb21wcmVzc190eXBlKQogICAgIGZpbmFsbHk6CiAgICAgICBvcy5yZW1vdmUoemlwX2ZpbGVfbmFtZSkKLSAgICAgIG9zLnJlbW92ZSh0ZXN0X2ZpbGVfbmFtZSkKIAogICBkZWYgX3Rlc3RfcmVzZXRfWklQNjRfTElNSVQoc2VsZiwgZnVuYywgKmFyZ3MpOgogICAgIGRlZmF1bHRfbGltaXQgPSAoMSA8PCAzMSkgLSAxCkBAIC01NzcsMTAgKzU4MSwxMCBAQAogICAgIH0pCiAKICAgZGVmIHRlc3RfWmlwV3JpdGVfbGFyZ2VfZmlsZShzZWxmKToKLSAgICBmaWxlX2NvbnRlbnRzID0gZ2V0XzJnYl9zdHJpbmcoKQotICAgIHNlbGYuX3Rlc3RfWmlwV3JpdGUoZmlsZV9jb250ZW50cywgewotICAgICAgICAiY29tcHJlc3NfdHlwZSI6IHppcGZpbGUuWklQX0RFRkxBVEVELAotICAgIH0pCisgICAgd2l0aCBnZXRfMmdiX2ZpbGUoKSBhcyB0bXBmaWxlOgorICAgICAgc2VsZi5fdGVzdF9aaXBXcml0ZUZpbGUodG1wZmlsZS5uYW1lLCB7CisgICAgICAgICAgImNvbXByZXNzX3R5cGUiOiB6aXBmaWxlLlpJUF9ERUZMQVRFRCwKKyAgICAgIH0pCiAKICAgZGVmIHRlc3RfWmlwV3JpdGVfcmVzZXRzX1pJUDY0X0xJTUlUKHNlbGYpOgogICAgIHNlbGYuX3Rlc3RfcmVzZXRfWklQNjRfTElNSVQoc2VsZi5fdGVzdF9aaXBXcml0ZSwgIiIpCkBAIC02MjcsMTEgKzYzMSwxMSBAQAogICAgICMgemlwZmlsZS53cml0ZXN0cigpIGRvZXNuJ3Qgd29yayB3aGVuIHRoZSBzdHIgc2l6ZSBpcyBvdmVyIDJHaUIgZXZlbiB3aXRoCiAgICAgIyB0aGUgd29ya2Fyb3VuZC4gV2Ugd2lsbCBvbmx5IHRlc3QgdGhlIGNhc2Ugb2Ygd3JpdGluZyBhIHN0cmluZyBpbnRvIGEKICAgICAjIGxhcmdlIGFyY2hpdmUuCi0gICAgbG9uZ19zdHJpbmcgPSBnZXRfMmdiX3N0cmluZygpCiAgICAgc2hvcnRfc3RyaW5nID0gb3MudXJhbmRvbSgxMDI0KQotICAgIHNlbGYuX3Rlc3RfWmlwV3JpdGVTdHJfbGFyZ2VfZmlsZShsb25nX3N0cmluZywgc2hvcnRfc3RyaW5nLCB7Ci0gICAgICAgICJjb21wcmVzc190eXBlIjogemlwZmlsZS5aSVBfREVGTEFURUQsCi0gICAgfSkKKyAgICB3aXRoIGdldF8yZ2JfZmlsZSgpIGFzIGxhcmdlX2ZpbGU6CisgICAgICBzZWxmLl90ZXN0X1ppcFdyaXRlU3RyX2xhcmdlX2ZpbGUobGFyZ2VfZmlsZSwgc2hvcnRfc3RyaW5nLCB7CisgICAgICAgICAgImNvbXByZXNzX3R5cGUiOiB6aXBmaWxlLlpJUF9ERUZMQVRFRCwKKyAgICAgIH0pCiAKICAgZGVmIHRlc3RfWmlwV3JpdGVTdHJfcmVzZXRzX1pJUDY0X0xJTUlUKHNlbGYpOgogICAgIHNlbGYuX3Rlc3RfcmVzZXRfWklQNjRfTElNSVQoc2VsZi5fdGVzdF9aaXBXcml0ZVN0ciwgJ2ZvbycsIGInJykKQEAgLTgyMSw5ICs4MjUsOSBAQAogICApCiAKICAgQVBLQ0VSVFNfQ0VSVE1BUDEgPSB7Ci0gICAgICAnUmVjb3ZlcnlMb2NhbGl6ZXIuYXBrJyA6ICdjZXJ0cy9kZXZrZXknLAotICAgICAgJ1NldHRpbmdzLmFwaycgOiAnYnVpbGQvbWFrZS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9wbGF0Zm9ybScsCi0gICAgICAnVFYuYXBrJyA6ICdQUkVTSUdORUQnLAorICAgICAgJ1JlY292ZXJ5TG9jYWxpemVyLmFwayc6ICdjZXJ0cy9kZXZrZXknLAorICAgICAgJ1NldHRpbmdzLmFwayc6ICdidWlsZC9tYWtlL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L3BsYXRmb3JtJywKKyAgICAgICdUVi5hcGsnOiAnUFJFU0lHTkVEJywKICAgfQogCiAgIEFQS0NFUlRTX1RYVDIgPSAoCkBAIC04MzgsMTAgKzg0MiwxMCBAQAogICApCiAKICAgQVBLQ0VSVFNfQ0VSVE1BUDIgPSB7Ci0gICAgICAnQ29tcHJlc3NlZDEuYXBrJyA6ICdjZXJ0cy9jb21wcmVzc2VkMScsCi0gICAgICAnQ29tcHJlc3NlZDJhLmFwaycgOiAnY2VydHMvY29tcHJlc3NlZDInLAotICAgICAgJ0NvbXByZXNzZWQyYi5hcGsnIDogJ2NlcnRzL2NvbXByZXNzZWQyJywKLSAgICAgICdDb21wcmVzc2VkMy5hcGsnIDogJ2NlcnRzL2NvbXByZXNzZWQzJywKKyAgICAgICdDb21wcmVzc2VkMS5hcGsnOiAnY2VydHMvY29tcHJlc3NlZDEnLAorICAgICAgJ0NvbXByZXNzZWQyYS5hcGsnOiAnY2VydHMvY29tcHJlc3NlZDInLAorICAgICAgJ0NvbXByZXNzZWQyYi5hcGsnOiAnY2VydHMvY29tcHJlc3NlZDInLAorICAgICAgJ0NvbXByZXNzZWQzLmFwayc6ICdjZXJ0cy9jb21wcmVzc2VkMycsCiAgIH0KIAogICBBUEtDRVJUU19UWFQzID0gKApAQCAtODUwLDcgKzg1NCw3IEBACiAgICkKIAogICBBUEtDRVJUU19DRVJUTUFQMyA9IHsKLSAgICAgICdDb21wcmVzc2VkNC5hcGsnIDogJ2NlcnRzL2NvbXByZXNzZWQ0JywKKyAgICAgICdDb21wcmVzc2VkNC5hcGsnOiAnY2VydHMvY29tcHJlc3NlZDQnLAogICB9CiAKICAgIyBUZXN0IHBhcnNpbmcgd2l0aCBubyBvcHRpb25hbCBmaWVsZHMsIGJvdGggb3B0aW9uYWwgZmllbGRzLCBhbmQgb25seSB0aGUKQEAgLTg2Nyw5ICs4NzEsOSBAQAogICApCiAKICAgQVBLQ0VSVFNfQ0VSVE1BUDQgPSB7Ci0gICAgICAnUmVjb3ZlcnlMb2NhbGl6ZXIuYXBrJyA6ICdjZXJ0cy9kZXZrZXknLAotICAgICAgJ1NldHRpbmdzLmFwaycgOiAnYnVpbGQvbWFrZS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9wbGF0Zm9ybScsCi0gICAgICAnVFYuYXBrJyA6ICdQUkVTSUdORUQnLAorICAgICAgJ1JlY292ZXJ5TG9jYWxpemVyLmFwayc6ICdjZXJ0cy9kZXZrZXknLAorICAgICAgJ1NldHRpbmdzLmFwayc6ICdidWlsZC9tYWtlL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L3BsYXRmb3JtJywKKyAgICAgICdUVi5hcGsnOiAnUFJFU0lHTkVEJywKICAgfQogCiAgIGRlZiBzZXRVcChzZWxmKToKQEAgLTk3Myw3ICs5NzcsNyBAQAogICAgIGV4dHJhY3RlZF9mcm9tX3ByaXZrZXkgPSBjb21tb24uRXh0cmFjdEF2YlB1YmxpY0tleSgnYXZidG9vbCcsIHByaXZrZXkpCiAgICAgZXh0cmFjdGVkX2Zyb21fcHVia2V5ID0gY29tbW9uLkV4dHJhY3RBdmJQdWJsaWNLZXkoJ2F2YnRvb2wnLCBwdWJrZXkpCiAgICAgd2l0aCBvcGVuKGV4dHJhY3RlZF9mcm9tX3ByaXZrZXksICdyYicpIGFzIHByaXZrZXlfZnAsIFwKLSAgICAgICAgb3BlbihleHRyYWN0ZWRfZnJvbV9wdWJrZXksICdyYicpIGFzIHB1YmtleV9mcDoKKyAgICAgICAgICAgIG9wZW4oZXh0cmFjdGVkX2Zyb21fcHVia2V5LCAncmInKSBhcyBwdWJrZXlfZnA6CiAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByaXZrZXlfZnAucmVhZCgpLCBwdWJrZXlfZnAucmVhZCgpKQogCiAgIGRlZiB0ZXN0X1BhcnNlQ2VydGlmaWNhdGUoc2VsZik6CkBAIC0xMjM3LDcgKzEyNDEsOCBAQAogICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICcxLTUgOS0xMCcsCiAgICAgICAgIHNwYXJzZV9pbWFnZS5maWxlX21hcFsnLy9zeXN0ZW0vZmlsZTEnXS5leHRyYVsndGV4dF9zdHInXSkKLSAgICBzZWxmLmFzc2VydFRydWUoc3BhcnNlX2ltYWdlLmZpbGVfbWFwWycvL3N5c3RlbS9maWxlMiddLmV4dHJhWydpbmNvbXBsZXRlJ10pCisgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICBzcGFyc2VfaW1hZ2UuZmlsZV9tYXBbJy8vc3lzdGVtL2ZpbGUyJ10uZXh0cmFbJ2luY29tcGxldGUnXSkKICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgIHNwYXJzZV9pbWFnZS5maWxlX21hcFsnL3N5c3RlbS9hcHAvZmlsZTMnXS5leHRyYVsnaW5jb21wbGV0ZSddKQogCkBAIC0xMjk0LDExICsxMjk5LDExIEBACiAgICAgICAgICdhdmJfc3lzdGVtX2tleV9wYXRoJzogcHVia2V5LAogICAgICAgICAnYXZiX3N5c3RlbV9yb2xsYmFja19pbmRleF9sb2NhdGlvbic6IDIsCiAgICAgfQotICAgIGFyZ3MgPSBjb21tb24uR2V0QXZiQ2hhaW5lZFBhcnRpdGlvbkFyZygnc3lzdGVtJywgaW5mb19kaWN0KS5zcGxpdCgnOicpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBsZW4oYXJncykpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnc3lzdGVtJywgYXJnc1swXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCcyJywgYXJnc1sxXSkKLSAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoYXJnc1syXSkpCisgICAgY2hhaW5lZF9wYXJ0aXRpb25fYXJncyA9IGNvbW1vbi5HZXRBdmJDaGFpbmVkUGFydGl0aW9uQXJnKAorICAgICAgICAnc3lzdGVtJywgaW5mb19kaWN0KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3N5c3RlbScsIGNoYWluZWRfcGFydGl0aW9uX2FyZ3MucGFydGl0aW9uKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgY2hhaW5lZF9wYXJ0aXRpb25fYXJncy5yb2xsYmFja19pbmRleF9sb2NhdGlvbikKKyAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoY2hhaW5lZF9wYXJ0aXRpb25fYXJncy5wdWJrZXlfcGF0aCkpCiAKICAgQHRlc3RfdXRpbHMuU2tpcElmRXh0ZXJuYWxUb29sc1VuYXZhaWxhYmxlKCkKICAgZGVmIHRlc3RfR2V0QXZiQ2hhaW5lZFBhcnRpdGlvbkFyZ193aXRoUHJpdmF0ZUtleShzZWxmKToKQEAgLTEzMDgsMTEgKzEzMTMsMTEgQEAKICAgICAgICAgJ2F2Yl9wcm9kdWN0X2tleV9wYXRoJzoga2V5LAogICAgICAgICAnYXZiX3Byb2R1Y3Rfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb24nOiAyLAogICAgIH0KLSAgICBhcmdzID0gY29tbW9uLkdldEF2YkNoYWluZWRQYXJ0aXRpb25BcmcoJ3Byb2R1Y3QnLCBpbmZvX2RpY3QpLnNwbGl0KCc6JykKLSAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGxlbihhcmdzKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdwcm9kdWN0JywgYXJnc1swXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCcyJywgYXJnc1sxXSkKLSAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoYXJnc1syXSkpCisgICAgY2hhaW5lZF9wYXJ0aXRpb25fYXJncyA9IGNvbW1vbi5HZXRBdmJDaGFpbmVkUGFydGl0aW9uQXJnKAorICAgICAgICAncHJvZHVjdCcsIGluZm9fZGljdCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdwcm9kdWN0JywgY2hhaW5lZF9wYXJ0aXRpb25fYXJncy5wYXJ0aXRpb24pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBjaGFpbmVkX3BhcnRpdGlvbl9hcmdzLnJvbGxiYWNrX2luZGV4X2xvY2F0aW9uKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhjaGFpbmVkX3BhcnRpdGlvbl9hcmdzLnB1YmtleV9wYXRoKSkKIAogICBAdGVzdF91dGlscy5Ta2lwSWZFeHRlcm5hbFRvb2xzVW5hdmFpbGFibGUoKQogICBkZWYgdGVzdF9HZXRBdmJDaGFpbmVkUGFydGl0aW9uQXJnX3dpdGhTcGVjaWZpZWRLZXkoc2VsZik6CkBAIC0xMzIyLDEyICsxMzI3LDExIEBACiAgICAgICAgICdhdmJfc3lzdGVtX3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uJzogMiwKICAgICB9CiAgICAgcHVia2V5ID0gb3MucGF0aC5qb2luKHNlbGYudGVzdGRhdGFfZGlyLCAndGVzdGtleS5wdWJrZXkucGVtJykKLSAgICBhcmdzID0gY29tbW9uLkdldEF2YkNoYWluZWRQYXJ0aXRpb25BcmcoCi0gICAgICAgICdzeXN0ZW0nLCBpbmZvX2RpY3QsIHB1YmtleSkuc3BsaXQoJzonKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgbGVuKGFyZ3MpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3N5c3RlbScsIGFyZ3NbMF0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnMicsIGFyZ3NbMV0pCi0gICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGFyZ3NbMl0pKQorICAgIGNoYWluZWRfcGFydGl0aW9uX2FyZ3MgPSBjb21tb24uR2V0QXZiQ2hhaW5lZFBhcnRpdGlvbkFyZygKKyAgICAgICAgJ3N5c3RlbScsIGluZm9fZGljdCwgcHVia2V5KQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3N5c3RlbScsIGNoYWluZWRfcGFydGl0aW9uX2FyZ3MucGFydGl0aW9uKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgY2hhaW5lZF9wYXJ0aXRpb25fYXJncy5yb2xsYmFja19pbmRleF9sb2NhdGlvbikKKyAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoY2hhaW5lZF9wYXJ0aXRpb25fYXJncy5wdWJrZXlfcGF0aCkpCiAKICAgQHRlc3RfdXRpbHMuU2tpcElmRXh0ZXJuYWxUb29sc1VuYXZhaWxhYmxlKCkKICAgZGVmIHRlc3RfR2V0QXZiQ2hhaW5lZFBhcnRpdGlvbkFyZ19pbnZhbGlkS2V5KHNlbGYpOgpAQCAtMTM0NCw4ICsxMzQ4LDcgQEAKICAgSU5GT19ESUNUX0RFRkFVTFQgPSB7CiAgICAgICAncmVjb3ZlcnlfYXBpX3ZlcnNpb24nOiAzLAogICAgICAgJ2ZzdGFiX3ZlcnNpb24nOiAyLAotICAgICAgJ3N5c3RlbV9yb290X2ltYWdlJzogJ3RydWUnLAotICAgICAgJ25vX3JlY292ZXJ5JyA6ICd0cnVlJywKKyAgICAgICdub19yZWNvdmVyeSc6ICd0cnVlJywKICAgICAgICdyZWNvdmVyeV9hc19ib290JzogJ3RydWUnLAogICB9CiAKQEAgLTEzNzMsMTQgKzEzNzYsOCBAQAogICAgICAgaW5mb192YWx1ZXMgPSAnJy5qb2luKAogICAgICAgICAgIFsne309e31cbicuZm9ybWF0KGssIHYpIGZvciBrLCB2IGluIHNvcnRlZChpbmZvX2RpY3QuaXRlbXMoKSldKQogICAgICAgY29tbW9uLlppcFdyaXRlU3RyKHRhcmdldF9maWxlc196aXAsICdNRVRBL21pc2NfaW5mby50eHQnLCBpbmZvX3ZhbHVlcykKLQotICAgICAgRlNUQUJfVEVNUExBVEUgPSAiL2Rldi9ibG9jay9zeXN0ZW0ge30gZXh0NCBybyxiYXJyaWVyPTEgZGVmYXVsdHMiCi0gICAgICBpZiBpbmZvX2RpY3QuZ2V0KCdzeXN0ZW1fcm9vdF9pbWFnZScpID09ICd0cnVlJzoKLSAgICAgICAgZnN0YWJfdmFsdWVzID0gRlNUQUJfVEVNUExBVEUuZm9ybWF0KCcvJykKLSAgICAgIGVsc2U6Ci0gICAgICAgIGZzdGFiX3ZhbHVlcyA9IEZTVEFCX1RFTVBMQVRFLmZvcm1hdCgnL3N5c3RlbScpCi0gICAgICBjb21tb24uWmlwV3JpdGVTdHIodGFyZ2V0X2ZpbGVzX3ppcCwgZnN0YWJfcGF0aCwgZnN0YWJfdmFsdWVzKQotCisgICAgICBjb21tb24uWmlwV3JpdGVTdHIodGFyZ2V0X2ZpbGVzX3ppcCwgZnN0YWJfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiL2Rldi9ibG9jay9zeXN0ZW0gL3N5c3RlbSBleHQ0IHJvLGJhcnJpZXI9MSBkZWZhdWx0cyIpCiAgICAgICBjb21tb24uWmlwV3JpdGVTdHIoCiAgICAgICAgICAgdGFyZ2V0X2ZpbGVzX3ppcCwgJ01FVEEvZmlsZV9jb250ZXh0cycsICdmaWxlLWNvbnRleHRzJykKICAgICByZXR1cm4gdGFyZ2V0X2ZpbGVzCkBAIC0xMzkzLDcgKzEzOTAsNiBAQAogICAgICAgbG9hZGVkX2RpY3QgPSBjb21tb24uTG9hZEluZm9EaWN0KHRhcmdldF9maWxlc196aXApCiAgICAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGxvYWRlZF9kaWN0WydyZWNvdmVyeV9hcGlfdmVyc2lvbiddKQogICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBsb2FkZWRfZGljdFsnZnN0YWJfdmVyc2lvbiddKQotICAgICAgc2VsZi5hc3NlcnRJbignLycsIGxvYWRlZF9kaWN0Wydmc3RhYiddKQogICAgICAgc2VsZi5hc3NlcnRJbignL3N5c3RlbScsIGxvYWRlZF9kaWN0Wydmc3RhYiddKQogCiAgIGRlZiB0ZXN0X0xvYWRJbmZvRGljdF9sZWdhY3lSZWNvdmVyeUZzdGFiUGF0aChzZWxmKToKQEAgLTE0MDQsNyArMTQwMCw2IEBACiAgICAgICBsb2FkZWRfZGljdCA9IGNvbW1vbi5Mb2FkSW5mb0RpY3QodGFyZ2V0X2ZpbGVzX3ppcCkKICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgbG9hZGVkX2RpY3RbJ3JlY292ZXJ5X2FwaV92ZXJzaW9uJ10pCiAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxvYWRlZF9kaWN0Wydmc3RhYl92ZXJzaW9uJ10pCi0gICAgICBzZWxmLmFzc2VydEluKCcvJywgbG9hZGVkX2RpY3RbJ2ZzdGFiJ10pCiAgICAgICBzZWxmLmFzc2VydEluKCcvc3lzdGVtJywgbG9hZGVkX2RpY3RbJ2ZzdGFiJ10pCiAKICAgQHRlc3RfdXRpbHMuU2tpcElmRXh0ZXJuYWxUb29sc1VuYXZhaWxhYmxlKCkKQEAgLTE0MTYsNyArMTQxMSw2IEBACiAgICAgbG9hZGVkX2RpY3QgPSBjb21tb24uTG9hZEluZm9EaWN0KHVuemlwcGVkKQogICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgbG9hZGVkX2RpY3RbJ3JlY292ZXJ5X2FwaV92ZXJzaW9uJ10pCiAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBsb2FkZWRfZGljdFsnZnN0YWJfdmVyc2lvbiddKQotICAgIHNlbGYuYXNzZXJ0SW4oJy8nLCBsb2FkZWRfZGljdFsnZnN0YWInXSkKICAgICBzZWxmLmFzc2VydEluKCcvc3lzdGVtJywgbG9hZGVkX2RpY3RbJ2ZzdGFiJ10pCiAKICAgQHRlc3RfdXRpbHMuU2tpcElmRXh0ZXJuYWxUb29sc1VuYXZhaWxhYmxlKCkKQEAgLTE0MjgsMTUgKzE0MjIsMTEgQEAKICAgICBsb2FkZWRfZGljdCA9IGNvbW1vbi5Mb2FkSW5mb0RpY3QodW56aXBwZWQpCiAgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBsb2FkZWRfZGljdFsncmVjb3ZlcnlfYXBpX3ZlcnNpb24nXSkKICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxvYWRlZF9kaWN0Wydmc3RhYl92ZXJzaW9uJ10pCi0gICAgc2VsZi5hc3NlcnRJbignLycsIGxvYWRlZF9kaWN0Wydmc3RhYiddKQogICAgIHNlbGYuYXNzZXJ0SW4oJy9zeXN0ZW0nLCBsb2FkZWRfZGljdFsnZnN0YWInXSkKIAotICBkZWYgdGVzdF9Mb2FkSW5mb0RpY3Rfc3lzdGVtUm9vdEltYWdlRmFsc2Uoc2VsZik6Ci0gICAgIyBEZXZpY2VzIG5vdCB1c2luZyBzeXN0ZW0tYXMtcm9vdCBub3IgcmVjb3ZlcnktYXMtYm9vdC4gTm9uLUEvQiBkZXZpY2VzCi0gICAgIyBsYXVuY2hlZCBwcmlvciB0byBQIHdpbGwgbGlrZWx5IGhhdmUgdGhpcyBjb25maWcuCisgIGRlZiB0ZXN0X0xvYWRJbmZvRGljdF9yZWNvdmVyeUFzQm9vdEZhbHNlKHNlbGYpOgogICAgIGluZm9fZGljdCA9IGNvcHkuY29weShzZWxmLklORk9fRElDVF9ERUZBVUxUKQogICAgIGRlbCBpbmZvX2RpY3RbJ25vX3JlY292ZXJ5J10KLSAgICBkZWwgaW5mb19kaWN0WydzeXN0ZW1fcm9vdF9pbWFnZSddCiAgICAgZGVsIGluZm9fZGljdFsncmVjb3ZlcnlfYXNfYm9vdCddCiAgICAgdGFyZ2V0X2ZpbGVzID0gc2VsZi5fdGVzdF9Mb2FkSW5mb0RpY3RfY3JlYXRlVGFyZ2V0RmlsZXMoCiAgICAgICAgIGluZm9fZGljdCwKQEAgLTE0NDgsMjIgKzE0MzgsNiBAQAogICAgICAgc2VsZi5hc3NlcnROb3RJbignLycsIGxvYWRlZF9kaWN0Wydmc3RhYiddKQogICAgICAgc2VsZi5hc3NlcnRJbignL3N5c3RlbScsIGxvYWRlZF9kaWN0Wydmc3RhYiddKQogCi0gIGRlZiB0ZXN0X0xvYWRJbmZvRGljdF9yZWNvdmVyeUFzQm9vdEZhbHNlKHNlbGYpOgotICAgICMgRGV2aWNlcyB1c2luZyBzeXN0ZW0tYXMtcm9vdCwgYnV0IHdpdGggc3RhbmRhbG9uZSByZWNvdmVyeSBpbWFnZS4gTm9uLUEvQgotICAgICMgZGV2aWNlcyBsYXVuY2hlZCBzaW5jZSBQIHdpbGwgbGlrZWx5IGhhdmUgdGhpcyBjb25maWcuCi0gICAgaW5mb19kaWN0ID0gY29weS5jb3B5KHNlbGYuSU5GT19ESUNUX0RFRkFVTFQpCi0gICAgZGVsIGluZm9fZGljdFsnbm9fcmVjb3ZlcnknXQotICAgIGRlbCBpbmZvX2RpY3RbJ3JlY292ZXJ5X2FzX2Jvb3QnXQotICAgIHRhcmdldF9maWxlcyA9IHNlbGYuX3Rlc3RfTG9hZEluZm9EaWN0X2NyZWF0ZVRhcmdldEZpbGVzKAotICAgICAgICBpbmZvX2RpY3QsCi0gICAgICAgICdSRUNPVkVSWS9SQU1ESVNLL3N5c3RlbS9ldGMvcmVjb3ZlcnkuZnN0YWInKQotICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHRhcmdldF9maWxlcywgJ3InLCBhbGxvd1ppcDY0PVRydWUpIGFzIHRhcmdldF9maWxlc196aXA6Ci0gICAgICBsb2FkZWRfZGljdCA9IGNvbW1vbi5Mb2FkSW5mb0RpY3QodGFyZ2V0X2ZpbGVzX3ppcCkKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgbG9hZGVkX2RpY3RbJ3JlY292ZXJ5X2FwaV92ZXJzaW9uJ10pCi0gICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxvYWRlZF9kaWN0Wydmc3RhYl92ZXJzaW9uJ10pCi0gICAgICBzZWxmLmFzc2VydEluKCcvJywgbG9hZGVkX2RpY3RbJ2ZzdGFiJ10pCi0gICAgICBzZWxmLmFzc2VydEluKCcvc3lzdGVtJywgbG9hZGVkX2RpY3RbJ2ZzdGFiJ10pCi0KICAgZGVmIHRlc3RfTG9hZEluZm9EaWN0X25vUmVjb3ZlcnlUcnVlKHNlbGYpOgogICAgICMgRGV2aWNlIGRvZXNuJ3QgaGF2ZSBhIHJlY292ZXJ5IHBhcnRpdGlvbiBhdCBhbGwuCiAgICAgaW5mb19kaWN0ID0gY29weS5jb3B5KHNlbGYuSU5GT19ESUNUX0RFRkFVTFQpCkBAIC0xNDk1LDcgKzE0NjksNiBAQAogICAgIGxvYWRlZF9kaWN0ID0gY29tbW9uLkxvYWRJbmZvRGljdCh1bnppcHBlZCwgVHJ1ZSkKICAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGxvYWRlZF9kaWN0WydyZWNvdmVyeV9hcGlfdmVyc2lvbiddKQogICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbG9hZGVkX2RpY3RbJ2ZzdGFiX3ZlcnNpb24nXSkKLSAgICBzZWxmLmFzc2VydEluKCcvJywgbG9hZGVkX2RpY3RbJ2ZzdGFiJ10pCiAgICAgc2VsZi5hc3NlcnRJbignL3N5c3RlbScsIGxvYWRlZF9kaWN0Wydmc3RhYiddKQogICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgIG9zLnBhdGguam9pbih1bnppcHBlZCwgJ1JPT1QnKSwgbG9hZGVkX2RpY3RbJ3Jvb3RfZGlyJ10pCkBAIC0xNTQyLDYgKzE1MTUsNyBAQAogICAgICAgICAnc3VwZXJfZ3JvdXBfYV9ncm91cF9zaXplJzogJzEwMDAnLAogICAgICAgICAnc3VwZXJfZ3JvdXBfYl9wYXJ0aXRpb25fbGlzdCc6ICdwcm9kdWN0JywKICAgICAgICAgJ3N1cGVyX2dyb3VwX2JfZ3JvdXBfc2l6ZSc6ICcyMDAwJywKKyAgICAgICAgJ3ZhYmNfY293X3ZlcnNpb24nOiAnMicsCiAgICAgfQogICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVyZ2VkX2RpY3QsIGV4cGVjdGVkX21lcmdlZF9kaWN0KQogCkBAIC0xNTUyLDYgKzE1MjYsNyBAQAogICAgICAgICAnZHluYW1pY19wYXJ0aXRpb25fbGlzdCc6ICdzeXN0ZW0nLAogICAgICAgICAnc3VwZXJfZ3JvdXBfYV9wYXJ0aXRpb25fbGlzdCc6ICdzeXN0ZW0nLAogICAgICAgICAnc3VwZXJfZ3JvdXBfYV9ncm91cF9zaXplJzogJzUwMDAnLAorICAgICAgICAndmFiY19jb3dfdmVyc2lvbic6ICczJywKICAgICB9CiAgICAgdmVuZG9yX2RpY3QgPSB7CiAgICAgICAgICd1c2VfZHluYW1pY19wYXJ0aXRpb25zJzogJ3RydWUnLApAQCAtMTU3Myw2ICsxNTQ4LDcgQEAKICAgICAgICAgJ3N1cGVyX2dyb3VwX2FfZ3JvdXBfc2l6ZSc6ICcxMDAwJywKICAgICAgICAgJ3N1cGVyX2dyb3VwX2JfcGFydGl0aW9uX2xpc3QnOiAncHJvZHVjdCcsCiAgICAgICAgICdzdXBlcl9ncm91cF9iX2dyb3VwX3NpemUnOiAnMjAwMCcsCisgICAgICAgICd2YWJjX2Nvd192ZXJzaW9uJzogJzInLAogICAgIH0KICAgICBzZWxmLmFzc2VydEVxdWFsKG1lcmdlZF9kaWN0LCBleHBlY3RlZF9tZXJnZWRfZGljdCkKIApAQCAtMTU4MCw3ICsxNTU2LDggQEAKICAgICBpbmZvX2RpY3QgPSB7fQogICAgIGNtZCA9IGNvbW1vbi5HZXRBdmJQYXJ0aXRpb25BcmcoJ3N5c3RlbScsICcvcGF0aC90by9zeXN0ZW0uaW1nJywgaW5mb19kaWN0KQogICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIFsnLS1pbmNsdWRlX2Rlc2NyaXB0b3JzX2Zyb21faW1hZ2UnLCAnL3BhdGgvdG8vc3lzdGVtLmltZyddLCBjbWQpCisgICAgICAgIFtjb21tb24uQVZCX0FSR19OQU1FX0lOQ0xVREVfREVTQ19GUk9NX0lNRywgJy9wYXRoL3RvL3N5c3RlbS5pbWcnXSwKKyAgICAgICAgY21kKQogCiAgIEB0ZXN0X3V0aWxzLlNraXBJZkV4dGVybmFsVG9vbHNVbmF2YWlsYWJsZSgpCiAgIGRlZiB0ZXN0X0FwcGVuZFZCTWV0YUFyZ3NGb3JQYXJ0aXRpb25fdmVuZG9yQXNDaGFpbmVkUGFydGl0aW9uKHNlbGYpOgpAQCAtMTU5MywxMiArMTU3MCwxMSBAQAogICAgIH0KICAgICBjbWQgPSBjb21tb24uR2V0QXZiUGFydGl0aW9uQXJnKCd2ZW5kb3InLCAnL3BhdGgvdG8vdmVuZG9yLmltZycsIGluZm9fZGljdCkKICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxlbihjbWQpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJy0tY2hhaW5fcGFydGl0aW9uJywgY21kWzBdKQotICAgIGNoYWluZWRfcGFydGl0aW9uX2FyZ3MgPSBjbWRbMV0uc3BsaXQoJzonKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgbGVuKGNoYWluZWRfcGFydGl0aW9uX2FyZ3MpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3ZlbmRvcicsIGNoYWluZWRfcGFydGl0aW9uX2FyZ3NbMF0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnNScsIGNoYWluZWRfcGFydGl0aW9uX2FyZ3NbMV0pCi0gICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGNoYWluZWRfcGFydGl0aW9uX2FyZ3NbMl0pKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tbW9uLkFWQl9BUkdfTkFNRV9DSEFJTl9QQVJUSVRJT04sIGNtZFswXSkKKyAgICBjaGFpbmVkX3BhcnRpdGlvbl9hcmdzID0gY21kWzFdCisgICAgc2VsZi5hc3NlcnRFcXVhbCgndmVuZG9yJywgY2hhaW5lZF9wYXJ0aXRpb25fYXJncy5wYXJ0aXRpb24pCisgICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBjaGFpbmVkX3BhcnRpdGlvbl9hcmdzLnJvbGxiYWNrX2luZGV4X2xvY2F0aW9uKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhjaGFpbmVkX3BhcnRpdGlvbl9hcmdzLnB1YmtleV9wYXRoKSkKIAogICBAdGVzdF91dGlscy5Ta2lwSWZFeHRlcm5hbFRvb2xzVW5hdmFpbGFibGUoKQogICBkZWYgdGVzdF9BcHBlbmRWQk1ldGFBcmdzRm9yUGFydGl0aW9uX3JlY292ZXJ5QXNDaGFpbmVkUGFydGl0aW9uX25vbkFiKHNlbGYpOgpAQCAtMTYyNiw0NSArMTYwMiwxMiBAQAogICAgIGNtZCA9IGNvbW1vbi5HZXRBdmJQYXJ0aXRpb25BcmcoCiAgICAgICAgICdyZWNvdmVyeScsICcvcGF0aC90by9yZWNvdmVyeS5pbWcnLCBpbmZvX2RpY3QpCiAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBsZW4oY21kKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCctLWNoYWluX3BhcnRpdGlvbicsIGNtZFswXSkKLSAgICBjaGFpbmVkX3BhcnRpdGlvbl9hcmdzID0gY21kWzFdLnNwbGl0KCc6JykKLSAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGxlbihjaGFpbmVkX3BhcnRpdGlvbl9hcmdzKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdyZWNvdmVyeScsIGNoYWluZWRfcGFydGl0aW9uX2FyZ3NbMF0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnMycsIGNoYWluZWRfcGFydGl0aW9uX2FyZ3NbMV0pCi0gICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGNoYWluZWRfcGFydGl0aW9uX2FyZ3NbMl0pKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tbW9uLkFWQl9BUkdfTkFNRV9DSEFJTl9QQVJUSVRJT04sIGNtZFswXSkKKyAgICBjaGFpbmVkX3BhcnRpdGlvbl9hcmdzID0gY21kWzFdCisgICAgc2VsZi5hc3NlcnRFcXVhbCgncmVjb3ZlcnknLCBjaGFpbmVkX3BhcnRpdGlvbl9hcmdzLnBhcnRpdGlvbikKKyAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGNoYWluZWRfcGFydGl0aW9uX2FyZ3Mucm9sbGJhY2tfaW5kZXhfbG9jYXRpb24pCisgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGNoYWluZWRfcGFydGl0aW9uX2FyZ3MucHVia2V5X3BhdGgpKQogCi0gIGRlZiB0ZXN0X0dlbmVyYXRlR2tpQ2VydGlmaWNhdGVfS2V5UGF0aE5vdEZvdW5kKHNlbGYpOgotICAgIHB1YmtleSA9IG9zLnBhdGguam9pbihzZWxmLnRlc3RkYXRhX2RpciwgJ25vX3Rlc3RrZXlfZ2tpLnBlbScpCi0gICAgc2VsZi5hc3NlcnRGYWxzZShvcy5wYXRoLmV4aXN0cyhwdWJrZXkpKQotCi0gICAgY29tbW9uLk9QVElPTlMuaW5mb19kaWN0ID0gewotICAgICAgICAnZ2tpX3NpZ25pbmdfa2V5X3BhdGgnOiBwdWJrZXksCi0gICAgICAgICdna2lfc2lnbmluZ19hbGdvcml0aG0nOiAnU0hBMjU2X1JTQTQwOTYnLAotICAgICAgICAnZ2tpX3NpZ25pbmdfc2lnbmF0dXJlX2FyZ3MnOiAnLS1wcm9wIGZvbzpiYXInLAotICAgIH0KLSAgICB0ZXN0X2ZpbGUgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNvbW1vbi5FeHRlcm5hbEVycm9yLCBjb21tb24uX0dlbmVyYXRlR2tpQ2VydGlmaWNhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgdGVzdF9maWxlLm5hbWUsICdnZW5lcmljX2tlcm5lbCcpCi0KLSAgZGVmIHRlc3RfR2VuZXJhdGVHa2lDZXJ0aWZpY2F0ZV9TZWFyY2hLZXlQYXRoTm90Rm91bmQoc2VsZik6Ci0gICAgcHVia2V5ID0gJ25vX3Rlc3RrZXlfZ2tpLnBlbScKLSAgICBzZWxmLmFzc2VydEZhbHNlKG9zLnBhdGguZXhpc3RzKHB1YmtleSkpCi0KLSAgICAjIFRlc3RzIGl0IHNob3VsZCByYWlzZSBFeHRlcm5hbEVycm9yIGlmIG5vIGtleSBmb3VuZCB1bmRlcgotICAgICMgT1BUSU9OUy5zZWFyY2hfcGF0aC4KLSAgICBzZWFyY2hfcGF0aF9kaXIgPSBjb21tb24uTWFrZVRlbXBEaXIoKQotICAgIHNlYXJjaF9wdWJrZXkgPSBvcy5wYXRoLmpvaW4oc2VhcmNoX3BhdGhfZGlyLCBwdWJrZXkpCi0gICAgc2VsZi5hc3NlcnRGYWxzZShvcy5wYXRoLmV4aXN0cyhzZWFyY2hfcHVia2V5KSkKLQotICAgIGNvbW1vbi5PUFRJT05TLnNlYXJjaF9wYXRoID0gc2VhcmNoX3BhdGhfZGlyCi0gICAgY29tbW9uLk9QVElPTlMuaW5mb19kaWN0ID0gewotICAgICAgICAnZ2tpX3NpZ25pbmdfa2V5X3BhdGgnOiBwdWJrZXksCi0gICAgICAgICdna2lfc2lnbmluZ19hbGdvcml0aG0nOiAnU0hBMjU2X1JTQTQwOTYnLAotICAgICAgICAnZ2tpX3NpZ25pbmdfc2lnbmF0dXJlX2FyZ3MnOiAnLS1wcm9wIGZvbzpiYXInLAotICAgIH0KLSAgICB0ZXN0X2ZpbGUgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNvbW1vbi5FeHRlcm5hbEVycm9yLCBjb21tb24uX0dlbmVyYXRlR2tpQ2VydGlmaWNhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgdGVzdF9maWxlLm5hbWUsICdnZW5lcmljX2tlcm5lbCcpCiAKIGNsYXNzIEluc3RhbGxSZWNvdmVyeVNjcmlwdEZvcm1hdFRlc3QodGVzdF91dGlscy5SZWxlYXNlVG9vbHNUZXN0Q2FzZSk6CiAgICIiIkNoZWNrcyB0aGUgZm9ybWF0IG9mIGluc3RhbGwtcmVjb3Zlcnkuc2guCkBAIC0xNjc1LDcgKzE2MTgsNyBAQAogICBkZWYgc2V0VXAoc2VsZik6CiAgICAgc2VsZi5fdGVtcGRpciA9IGNvbW1vbi5NYWtlVGVtcERpcigpCiAgICAgIyBDcmVhdGUgYSBmYWtlIGRpY3QgdGhhdCBjb250YWlucyB0aGUgZnN0YWIgaW5mbyBmb3IgYm9vdCZyZWNvdmVyeS4KLSAgICBzZWxmLl9pbmZvID0geyJmc3RhYiIgOiB7fX0KKyAgICBzZWxmLl9pbmZvID0geyJmc3RhYiI6IHt9fQogICAgIGZha2VfZnN0YWIgPSBbCiAgICAgICAgICIvZGV2L3NvYy4wL2J5LW5hbWUvYm9vdCAvYm9vdCBlbW1jIGRlZmF1bHRzIGRlZmF1bHRzIiwKICAgICAgICAgIi9kZXYvc29jLjAvYnktbmFtZS9yZWNvdmVyeSAvcmVjb3ZlcnkgZW1tYyBkZWZhdWx0cyBkZWZhdWx0cyJdCkBAIC0yMDIyLDExICsxOTY1LDExIEBACiAgICAgICAgICAgaW5wdXRfemlwLCAnb2RtJywgcGxhY2Vob2xkZXJfdmFsdWVzKQogCiAgICAgc2VsZi5hc3NlcnRFcXVhbCh7Ci0gICAgICAncm8ub2RtLmJ1aWxkLmRhdGUudXRjJzogJzE1Nzg0MzAwNDUnLAotICAgICAgJ3JvLm9kbS5idWlsZC5maW5nZXJwcmludCc6Ci0gICAgICAnZ29vZ2xlL2NvcmFsL2NvcmFsOjEwL1JQMUEuMjAwMzI1LjAwMS82MzM3Njc2OnVzZXIvZGV2LWtleXMnLAotICAgICAgJ3JvLnByb2R1Y3Qub2RtLmRldmljZSc6ICdjb3JhbCcsCi0gICAgICAncm8ucHJvZHVjdC5vZG0ubmFtZSc6ICdwcm9kdWN0MScsCisgICAgICAgICdyby5vZG0uYnVpbGQuZGF0ZS51dGMnOiAnMTU3ODQzMDA0NScsCisgICAgICAgICdyby5vZG0uYnVpbGQuZmluZ2VycHJpbnQnOgorICAgICAgICAnZ29vZ2xlL2NvcmFsL2NvcmFsOjEwL1JQMUEuMjAwMzI1LjAwMS82MzM3Njc2OnVzZXIvZGV2LWtleXMnLAorICAgICAgICAncm8ucHJvZHVjdC5vZG0uZGV2aWNlJzogJ2NvcmFsJywKKyAgICAgICAgJ3JvLnByb2R1Y3Qub2RtLm5hbWUnOiAncHJvZHVjdDEnLAogICAgIH0sIHBhcnRpdGlvbl9wcm9wcy5idWlsZF9wcm9wcykKIAogICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGlucHV0X2ZpbGUsICdyJywgYWxsb3daaXA2ND1UcnVlKSBhcyBpbnB1dF96aXA6CkBAIC0yMjA5LDggKzIxNTIsOCBAQAogCiAgICAgY29waWVkX3Byb3BzID0gY29weS5kZWVwY29weShwYXJ0aXRpb25fcHJvcHMpCiAgICAgc2VsZi5hc3NlcnRFcXVhbCh7Ci0gICAgICAncm8ub2RtLmJ1aWxkLmRhdGUudXRjJzogJzE1Nzg0MzAwNDUnLAotICAgICAgJ3JvLm9kbS5idWlsZC5maW5nZXJwcmludCc6Ci0gICAgICAnZ29vZ2xlL2NvcmFsL2NvcmFsOjEwL1JQMUEuMjAwMzI1LjAwMS82MzM3Njc2OnVzZXIvZGV2LWtleXMnLAotICAgICAgJ3JvLnByb2R1Y3Qub2RtLmRldmljZSc6ICdjb3JhbCcsCisgICAgICAgICdyby5vZG0uYnVpbGQuZGF0ZS51dGMnOiAnMTU3ODQzMDA0NScsCisgICAgICAgICdyby5vZG0uYnVpbGQuZmluZ2VycHJpbnQnOgorICAgICAgICAnZ29vZ2xlL2NvcmFsL2NvcmFsOjEwL1JQMUEuMjAwMzI1LjAwMS82MzM3Njc2OnVzZXIvZGV2LWtleXMnLAorICAgICAgICAncm8ucHJvZHVjdC5vZG0uZGV2aWNlJzogJ2NvcmFsJywKICAgICB9LCBjb3BpZWRfcHJvcHMuYnVpbGRfcHJvcHMpCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvdGVzdF9vdGFfZnJvbV90YXJnZXRfZmlsZXMucHkgYi90b29scy9yZWxlYXNldG9vbHMvdGVzdF9vdGFfZnJvbV90YXJnZXRfZmlsZXMucHkKaW5kZXggYWQwZjdhOC4uYjZmY2IxOCAxMDA2NDQKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3Rfb3RhX2Zyb21fdGFyZ2V0X2ZpbGVzLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X290YV9mcm9tX3RhcmdldF9maWxlcy5weQpAQCAtMTYzLDYgKzE2MywyMCBAQAogICAgICAgJ29lbV9maW5nZXJwcmludF9wcm9wZXJ0aWVzJzogJ3JvLnByb2R1Y3QuZGV2aWNlIHJvLnByb2R1Y3QuYnJhbmQnLAogICB9CiAKKyAgVEVTVF9UQVJHRVRfVkVORE9SX0lORk9fRElDVCA9IGNvbW1vbi5QYXJ0aXRpb25CdWlsZFByb3BzLkZyb21EaWN0aW9uYXJ5KAorICAgICd2ZW5kb3InLCB7CisgICAgICAncm8udmVuZG9yLmJ1aWxkLmRhdGUudXRjJyA6ICc4NzY1NDMyMScsCisgICAgICAncm8ucHJvZHVjdC52ZW5kb3IuZGV2aWNlJzondmVuZG9yLWRldmljZScsCisgICAgICAncm8udmVuZG9yLmJ1aWxkLmZpbmdlcnByaW50JzogJ2J1aWxkLWZpbmdlcnByaW50LXZlbmRvcid9CisgICkKKworICBURVNUX1NPVVJDRV9WRU5ET1JfSU5GT19ESUNUID0gY29tbW9uLlBhcnRpdGlvbkJ1aWxkUHJvcHMuRnJvbURpY3Rpb25hcnkoCisgICAgJ3ZlbmRvcicsIHsKKyAgICAgICdyby52ZW5kb3IuYnVpbGQuZGF0ZS51dGMnIDogJzEyMzQ1Njc4JywKKyAgICAgICdyby5wcm9kdWN0LnZlbmRvci5kZXZpY2UnOid2ZW5kb3ItZGV2aWNlJywKKyAgICAgICdyby52ZW5kb3IuYnVpbGQuZmluZ2VycHJpbnQnOiAnYnVpbGQtZmluZ2VycHJpbnQtdmVuZG9yJ30KKyAgKQorCiAgIGRlZiBzZXRVcChzZWxmKToKICAgICBzZWxmLnRlc3RkYXRhX2RpciA9IHRlc3RfdXRpbHMuZ2V0X3Rlc3RkYXRhX2RpcigpCiAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHNlbGYudGVzdGRhdGFfZGlyKSkKQEAgLTI4NSw3ICsyOTksNyBAQAogICBAdGVzdF91dGlscy5Ta2lwSWZFeHRlcm5hbFRvb2xzVW5hdmFpbGFibGUoKQogICBkZWYgdGVzdF9HZXRBcGV4SW5mb0Zyb21UYXJnZXRGaWxlcyhzZWxmKToKICAgICB0YXJnZXRfZmlsZXMgPSBjb25zdHJ1Y3RfdGFyZ2V0X2ZpbGVzKGNvbXByZXNzZWRBcGV4PVRydWUpCi0gICAgYXBleF9pbmZvcyA9IEdldEFwZXhJbmZvRnJvbVRhcmdldEZpbGVzKHRhcmdldF9maWxlcywgJ3N5c3RlbScpCisgICAgYXBleF9pbmZvcyA9IEdldEFwZXhJbmZvRnJvbVRhcmdldEZpbGVzKHRhcmdldF9maWxlcykKICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhcGV4X2luZm9zKSwgMSkKICAgICBzZWxmLmFzc2VydEVxdWFsKGFwZXhfaW5mb3NbMF0ucGFja2FnZV9uYW1lLCAiY29tLmFuZHJvaWQuYXBleC5jb21wcmVzc2VkIikKICAgICBzZWxmLmFzc2VydEVxdWFsKGFwZXhfaW5mb3NbMF0udmVyc2lvbiwgMSkKQEAgLTM1MSw2ICszNjUsMTMgQEAKICAgICAgICAgIHNvdXJjZV9pbmZvWydidWlsZC5wcm9wJ10uYnVpbGRfcHJvcHNbJ3JvLmJ1aWxkLmRhdGUudXRjJ10sCiAgICAgICAgICB0YXJnZXRfaW5mb1snYnVpbGQucHJvcCddLmJ1aWxkX3Byb3BzWydyby5idWlsZC5kYXRlLnV0YyddKQogCisgIEBzdGF0aWNtZXRob2QKKyAgZGVmIF90ZXN0X0dldFBhY2thZ2VNZXRhZGF0YV9zd2FwVmVuZG9yQnVpbGRUaW1lc3RhbXBzKHRhcmdldF9pbmZvLCBzb3VyY2VfaW5mbyk6CisgICAgKHRhcmdldF9pbmZvWyd2ZW5kb3IuYnVpbGQucHJvcCddLmJ1aWxkX3Byb3BzWydyby52ZW5kb3IuYnVpbGQuZGF0ZS51dGMnXSwKKyAgICAgc291cmNlX2luZm9bJ3ZlbmRvci5idWlsZC5wcm9wJ10uYnVpbGRfcHJvcHNbJ3JvLnZlbmRvci5idWlsZC5kYXRlLnV0YyddKSA9ICgKKyAgICAgICAgIHNvdXJjZV9pbmZvWyd2ZW5kb3IuYnVpbGQucHJvcCddLmJ1aWxkX3Byb3BzWydyby52ZW5kb3IuYnVpbGQuZGF0ZS51dGMnXSwKKyAgICAgICAgIHRhcmdldF9pbmZvWyd2ZW5kb3IuYnVpbGQucHJvcCddLmJ1aWxkX3Byb3BzWydyby52ZW5kb3IuYnVpbGQuZGF0ZS51dGMnXSkKKwogICBkZWYgdGVzdF9HZXRQYWNrYWdlTWV0YWRhdGFfdW5pbnRlbnRpb25hbERvd25ncmFkZURldGVjdGVkKHNlbGYpOgogICAgIHRhcmdldF9pbmZvX2RpY3QgPSBjb3B5LmRlZXBjb3B5KHNlbGYuVEVTVF9UQVJHRVRfSU5GT19ESUNUKQogICAgIHNvdXJjZV9pbmZvX2RpY3QgPSBjb3B5LmRlZXBjb3B5KHNlbGYuVEVTVF9TT1VSQ0VfSU5GT19ESUNUKQpAQCAtMzYzLDYgKzM4NCwyNCBAQAogICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgc2VsZi5HZXRMZWdhY3lPdGFNZXRhZGF0YSwgdGFyZ2V0X2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX2luZm8pCiAKKyAgZGVmIHRlc3RfR2V0UGFja2FnZU1ldGFkYXRhX3VuaW50ZW50aW9uYWxWZW5kb3JEb3duZ3JhZGVEZXRlY3RlZChzZWxmKToKKyAgICB0YXJnZXRfaW5mb19kaWN0ID0gY29weS5kZWVwY29weShzZWxmLlRFU1RfVEFSR0VUX0lORk9fRElDVCkKKyAgICB0YXJnZXRfaW5mb19kaWN0WydhYl91cGRhdGUnXSA9ICd0cnVlJworICAgIHRhcmdldF9pbmZvX2RpY3RbJ2FiX3BhcnRpdGlvbnMnXSA9IFsndmVuZG9yJ10KKyAgICB0YXJnZXRfaW5mb19kaWN0WyJ2ZW5kb3IuYnVpbGQucHJvcCJdID0gY29weS5kZWVwY29weShzZWxmLlRFU1RfVEFSR0VUX1ZFTkRPUl9JTkZPX0RJQ1QpCisgICAgc291cmNlX2luZm9fZGljdCA9IGNvcHkuZGVlcGNvcHkoc2VsZi5URVNUX1NPVVJDRV9JTkZPX0RJQ1QpCisgICAgc291cmNlX2luZm9fZGljdFsnYWJfdXBkYXRlJ10gPSAndHJ1ZScKKyAgICBzb3VyY2VfaW5mb19kaWN0WydhYl9wYXJ0aXRpb25zJ10gPSBbJ3ZlbmRvciddCisgICAgc291cmNlX2luZm9fZGljdFsidmVuZG9yLmJ1aWxkLnByb3AiXSA9IGNvcHkuZGVlcGNvcHkoc2VsZi5URVNUX1NPVVJDRV9WRU5ET1JfSU5GT19ESUNUKQorICAgIHNlbGYuX3Rlc3RfR2V0UGFja2FnZU1ldGFkYXRhX3N3YXBWZW5kb3JCdWlsZFRpbWVzdGFtcHMoCisgICAgICAgIHRhcmdldF9pbmZvX2RpY3QsIHNvdXJjZV9pbmZvX2RpY3QpCisKKyAgICB0YXJnZXRfaW5mbyA9IGNvbW1vbi5CdWlsZEluZm8odGFyZ2V0X2luZm9fZGljdCwgTm9uZSkKKyAgICBzb3VyY2VfaW5mbyA9IGNvbW1vbi5CdWlsZEluZm8oc291cmNlX2luZm9fZGljdCwgTm9uZSkKKyAgICBjb21tb24uT1BUSU9OUy5pbmNyZW1lbnRhbF9zb3VyY2UgPSAnJworICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgc2VsZi5HZXRMZWdhY3lPdGFNZXRhZGF0YSwgdGFyZ2V0X2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgc291cmNlX2luZm8pCisKICAgZGVmIHRlc3RfR2V0UGFja2FnZU1ldGFkYXRhX2Rvd25ncmFkZShzZWxmKToKICAgICB0YXJnZXRfaW5mb19kaWN0ID0gY29weS5kZWVwY29weShzZWxmLlRFU1RfVEFSR0VUX0lORk9fRElDVCkKICAgICBzb3VyY2VfaW5mb19kaWN0ID0gY29weS5kZWVwY29weShzZWxmLlRFU1RfU09VUkNFX0lORk9fRElDVCkKQEAgLTM5Nyw2ICs0MzYsNTUgQEAKICAgICAgICAgfSwKICAgICAgICAgbWV0YWRhdGEpCiAKKyAgZGVmIHRlc3RfR2V0UGFja2FnZU1ldGFkYXRhX3ZlbmRvckRvd25ncmFkZShzZWxmKToKKyAgICB0YXJnZXRfaW5mb19kaWN0ID0gY29weS5kZWVwY29weShzZWxmLlRFU1RfVEFSR0VUX0lORk9fRElDVCkKKyAgICB0YXJnZXRfaW5mb19kaWN0WydhYl91cGRhdGUnXSA9ICd0cnVlJworICAgIHRhcmdldF9pbmZvX2RpY3RbJ2FiX3BhcnRpdGlvbnMnXSA9IFsndmVuZG9yJ10KKyAgICB0YXJnZXRfaW5mb19kaWN0WyJ2ZW5kb3IuYnVpbGQucHJvcCJdID0gY29weS5kZWVwY29weShzZWxmLlRFU1RfVEFSR0VUX1ZFTkRPUl9JTkZPX0RJQ1QpCisgICAgc291cmNlX2luZm9fZGljdCA9IGNvcHkuZGVlcGNvcHkoc2VsZi5URVNUX1NPVVJDRV9JTkZPX0RJQ1QpCisgICAgc291cmNlX2luZm9fZGljdFsnYWJfdXBkYXRlJ10gPSAndHJ1ZScKKyAgICBzb3VyY2VfaW5mb19kaWN0WydhYl9wYXJ0aXRpb25zJ10gPSBbJ3ZlbmRvciddCisgICAgc291cmNlX2luZm9fZGljdFsidmVuZG9yLmJ1aWxkLnByb3AiXSA9IGNvcHkuZGVlcGNvcHkoc2VsZi5URVNUX1NPVVJDRV9WRU5ET1JfSU5GT19ESUNUKQorICAgIHNlbGYuX3Rlc3RfR2V0UGFja2FnZU1ldGFkYXRhX3N3YXBWZW5kb3JCdWlsZFRpbWVzdGFtcHMoCisgICAgICAgIHRhcmdldF9pbmZvX2RpY3QsIHNvdXJjZV9pbmZvX2RpY3QpCisKKyAgICB0YXJnZXRfaW5mbyA9IGNvbW1vbi5CdWlsZEluZm8odGFyZ2V0X2luZm9fZGljdCwgTm9uZSkKKyAgICBzb3VyY2VfaW5mbyA9IGNvbW1vbi5CdWlsZEluZm8oc291cmNlX2luZm9fZGljdCwgTm9uZSkKKyAgICBjb21tb24uT1BUSU9OUy5pbmNyZW1lbnRhbF9zb3VyY2UgPSAnJworICAgIGNvbW1vbi5PUFRJT05TLmRvd25ncmFkZSA9IFRydWUKKyAgICBjb21tb24uT1BUSU9OUy53aXBlX3VzZXJfZGF0YSA9IFRydWUKKyAgICBjb21tb24uT1BUSU9OUy5zcGxfZG93bmdyYWRlID0gVHJ1ZQorICAgIG1ldGFkYXRhID0gc2VsZi5HZXRMZWdhY3lPdGFNZXRhZGF0YSh0YXJnZXRfaW5mbywgc291cmNlX2luZm8pCisgICAgIyBSZXNldCBzcGxfZG93bmdyYWRlIHNvIG90aGVyIHRlc3RzIGFyZSB1bmFmZmVjdGVkCisgICAgY29tbW9uLk9QVElPTlMuc3BsX2Rvd25ncmFkZSA9IEZhbHNlCisKKyAgICBzZWxmLmFzc2VydERpY3RFcXVhbCgKKyAgICAgICAgeworICAgICAgICAgICAgJ290YS1kb3duZ3JhZGUnOiAneWVzJywKKyAgICAgICAgICAgICdvdGEtdHlwZSc6ICdBQicsCisgICAgICAgICAgICAnb3RhLXJlcXVpcmVkLWNhY2hlJzogJzAnLAorICAgICAgICAgICAgJ290YS13aXBlJzogJ3llcycsCisgICAgICAgICAgICAncG9zdC1idWlsZCc6ICdidWlsZC1maW5nZXJwcmludC10YXJnZXQnLAorICAgICAgICAgICAgJ3Bvc3QtYnVpbGQtaW5jcmVtZW50YWwnOiAnYnVpbGQtdmVyc2lvbi1pbmNyZW1lbnRhbC10YXJnZXQnLAorICAgICAgICAgICAgJ3Bvc3Qtc2RrLWxldmVsJzogJzI3JywKKyAgICAgICAgICAgICdwb3N0LXNlY3VyaXR5LXBhdGNoLWxldmVsJzogJzIwMTctMTItMDEnLAorICAgICAgICAgICAgJ3Bvc3QtdGltZXN0YW1wJzogJzE1MDAwMDAwMDAnLAorICAgICAgICAgICAgJ3ByZS1kZXZpY2UnOiAncHJvZHVjdC1kZXZpY2UnLAorICAgICAgICAgICAgJ3ByZS1idWlsZCc6ICdidWlsZC1maW5nZXJwcmludC1zb3VyY2UnLAorICAgICAgICAgICAgJ3ByZS1idWlsZC1pbmNyZW1lbnRhbCc6ICdidWlsZC12ZXJzaW9uLWluY3JlbWVudGFsLXNvdXJjZScsCisgICAgICAgICAgICAnc3BsLWRvd25ncmFkZSc6ICd5ZXMnLAorICAgICAgICB9LAorICAgICAgICBtZXRhZGF0YSkKKworICAgIHBvc3RfYnVpbGQgPSBHZXRQYWNrYWdlTWV0YWRhdGEodGFyZ2V0X2luZm8sIHNvdXJjZV9pbmZvKS5wb3N0Y29uZGl0aW9uCisgICAgc2VsZi5hc3NlcnRFcXVhbCgndmVuZG9yJywgcG9zdF9idWlsZC5wYXJ0aXRpb25fc3RhdGVbMF0ucGFydGl0aW9uX25hbWUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnMTIzNDU2NzgnLCBwb3N0X2J1aWxkLnBhcnRpdGlvbl9zdGF0ZVswXS52ZXJzaW9uKQorCisgICAgcHJlX2J1aWxkID0gR2V0UGFja2FnZU1ldGFkYXRhKHRhcmdldF9pbmZvLCBzb3VyY2VfaW5mbykucHJlY29uZGl0aW9uCisgICAgc2VsZi5hc3NlcnRFcXVhbCgndmVuZG9yJywgcHJlX2J1aWxkLnBhcnRpdGlvbl9zdGF0ZVswXS5wYXJ0aXRpb25fbmFtZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCc4NzY1NDMyMScsIHByZV9idWlsZC5wYXJ0aXRpb25fc3RhdGVbMF0udmVyc2lvbikKKworCiAgIEB0ZXN0X3V0aWxzLlNraXBJZkV4dGVybmFsVG9vbHNVbmF2YWlsYWJsZSgpCiAgIGRlZiB0ZXN0X0dldFRhcmdldEZpbGVzWmlwRm9yU2Vjb25kYXJ5SW1hZ2VzKHNlbGYpOgogICAgIGlucHV0X2ZpbGUgPSBjb25zdHJ1Y3RfdGFyZ2V0X2ZpbGVzKHNlY29uZGFyeT1UcnVlKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3Rfc2lnbl9hcGV4LnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3Rfc2lnbl9hcGV4LnB5CmluZGV4IDc3MjNkZTcuLjg0NzBmMjAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X3NpZ25fYXBleC5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvdGVzdF9zaWduX2FwZXgucHkKQEAgLTU5LDIxICs1OSw2IEBACiAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHNpZ25lZF90ZXN0X2FwZXgpKQogCiAgIEB0ZXN0X3V0aWxzLlNraXBJZkV4dGVybmFsVG9vbHNVbmF2YWlsYWJsZSgpCi0gIGRlZiB0ZXN0X1NpZ25TZXBvbGljeUFwZXgoc2VsZik6Ci0gICAgdGVzdF9hcGV4ID0gb3MucGF0aC5qb2luKHNlbGYudGVzdGRhdGFfZGlyLCAnc2Vwb2xpY3kuYXBleCcpCi0gICAgcGF5bG9hZF9rZXkgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGF0YV9kaXIsICd0ZXN0a2V5X1JTQTQwOTYua2V5JykKLSAgICBjb250YWluZXJfa2V5ID0gb3MucGF0aC5qb2luKHNlbGYudGVzdGRhdGFfZGlyLCAndGVzdGtleScpCi0gICAgYXBrX2tleXMgPSB7J1NFUG9saWN5LTMzLnppcCc6IG9zLnBhdGguam9pbihzZWxmLnRlc3RkYXRhX2RpciwgJ3Rlc3RrZXknKX0KLSAgICBzaWduZWRfdGVzdF9hcGV4ID0gc2lnbl9hcGV4LlNpZ25BcGV4RmlsZSgKLSAgICAgICAgJ2F2YnRvb2wnLAotICAgICAgICB0ZXN0X2FwZXgsCi0gICAgICAgIHBheWxvYWRfa2V5LAotICAgICAgICBjb250YWluZXJfa2V5LAotICAgICAgICBGYWxzZSwKLSAgICAgICAgTm9uZSkKLSAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoc2lnbmVkX3Rlc3RfYXBleCkpCi0KLSAgQHRlc3RfdXRpbHMuU2tpcElmRXh0ZXJuYWxUb29sc1VuYXZhaWxhYmxlKCkKICAgZGVmIHRlc3RfU2lnbkNvbXByZXNzZWRBcGV4RmlsZShzZWxmKToKICAgICBhcGV4ID0gb3MucGF0aC5qb2luKHRlc3RfdXRpbHMuZ2V0X2N1cnJlbnRfZGlyKCksICdjb20uYW5kcm9pZC5hcGV4LmNvbXByZXNzZWQudjEuY2FwZXgnKQogICAgIHBheWxvYWRfa2V5ID0gb3MucGF0aC5qb2luKHNlbGYudGVzdGRhdGFfZGlyLCAndGVzdGtleV9SU0E0MDk2LmtleScpCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvdGVzdF9zaWduX3RhcmdldF9maWxlc19hcGtzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3Rfc2lnbl90YXJnZXRfZmlsZXNfYXBrcy5weQppbmRleCAwY2Q3ZGFjLi43YWMxY2ZmIDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvdGVzdF9zaWduX3RhcmdldF9maWxlc19hcGtzLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X3NpZ25fdGFyZ2V0X2ZpbGVzX2Fwa3MucHkKQEAgLTIyLDggKzIyLDggQEAKIGltcG9ydCBjb21tb24KIGltcG9ydCB0ZXN0X3V0aWxzCiBmcm9tIHNpZ25fdGFyZ2V0X2ZpbGVzX2Fwa3MgaW1wb3J0ICgKLSAgICBDaGVja0Fwa0FuZEFwZXhLZXlzQXZhaWxhYmxlLCBFZGl0VGFncywgR2V0QXBrRmlsZUluZm8sIFJlYWRBcGV4S2V5c0luZm8sCi0gICAgUmVwbGFjZUNlcnRzLCBSZXBsYWNlR2tpU2lnbmluZ0tleSwgUmV3cml0ZUF2YlByb3BzLCBSZXdyaXRlUHJvcHMsCisgICAgQ2hlY2tBcGtBbmRBcGV4S2V5c0F2YWlsYWJsZSwgRWRpdFRhZ3MsIEdldEFwa0ZpbGVJbmZvLCBQYXJzZUF2YkluZm8sCisgICAgUmVhZEFwZXhLZXlzSW5mbywgUmVwbGFjZUNlcnRzLCBSZXdyaXRlQXZiUHJvcHMsIFJld3JpdGVQcm9wcywKICAgICBXcml0ZU90YWNlcnRzKQogCiAKQEAgLTUzNyw1MSArNTM3LDg1IEBACiAgICAgICAgICAgICAnYnVpbGQvbWFrZS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS90ZXN0a2V5JywgTm9uZSksCiAgICAgICAgIH0sIGtleXNfaW5mbykKIAotICBkZWYgdGVzdF9SZXBsYWNlR2tpU2lnbmluZ0tleShzZWxmKToKLSAgICBjb21tb24uT1BUSU9OUy5na2lfc2lnbmluZ19rZXkgPSAncmVsZWFzZV9na2lfa2V5JwotICAgIGNvbW1vbi5PUFRJT05TLmdraV9zaWduaW5nX2FsZ29yaXRobSA9ICdyZWxlYXNlX2draV9hbGdvcml0aG0nCi0gICAgY29tbW9uLk9QVElPTlMuZ2tpX3NpZ25pbmdfZXh0cmFfYXJncyA9ICdyZWxlYXNlX2draV9zaWduYXR1cmVfZXh0cmFfYXJncycKKyAgZGVmIHRlc3RfUGFyc2VBdmJJbmZvKHNlbGYpOgorICAgIGF2Yl9pbmZvX3N0cmluZyA9ICIiIgorICAgIEZvb3RlciB2ZXJzaW9uOiAgICAgICAgICAgMS4wCisgICAgSW1hZ2Ugc2l6ZTogICAgICAgICAgICAgICA5OTk5OTk5IGJ5dGVzCisgICAgT3JpZ2luYWwgaW1hZ2Ugc2l6ZTogICAgICA4ODg4ODg4IGJ5dGVzCisgICAgVkJNZXRhIG9mZnNldDogICAgICAgICAgICA3Nzc3Nzc3CisgICAgVkJNZXRhIHNpemU6ICAgICAgICAgICAgICAxMTExIGJ5dGVzCisgICAgLS0KKyAgICBNaW5pbXVtIGxpYmF2YiB2ZXJzaW9uOiAgIDEuMAorICAgIEhlYWRlciBCbG9jazogICAgICAgICAgICAgMjIyIGJ5dGVzCisgICAgQXV0aGVudGljYXRpb24gQmxvY2s6ICAgICAzMzMgYnl0ZXMKKyAgICBBdXhpbGlhcnkgQmxvY2s6ICAgICAgICAgIDg4OCBieXRlcworICAgIFB1YmxpYyBrZXkgKHNoYTEpOiAgICAgICAgYWJhYmFiYWJhYmFiYWJhYmFiYWJhYmFiYWJhYmFiYWJhYmFiYWJhYgorICAgIEFsZ29yaXRobTogICAgICAgICAgICAgICAgU0hBMjU2X1JTQTIwNDgKKyAgICBSb2xsYmFjayBJbmRleDogICAgICAgICAgIDAKKyAgICBGbGFnczogICAgICAgICAgICAgICAgICAgIDAKKyAgICBSb2xsYmFjayBJbmRleCBMb2NhdGlvbjogIDAKKyAgICBSZWxlYXNlIFN0cmluZzogICAgICAgICAgICdhdmJ0b29sIDEuMy4wJworICAgIERlc2NyaXB0b3JzOgorICAgICAgICBIYXNodHJlZSBkZXNjcmlwdG9yOgorICAgICAgICAgIFZlcnNpb24gb2YgZG0tdmVyaXR5OiAgMQorICAgICAgICAgIEltYWdlIFNpemU6ICAgICAgICAgICAgODg4ODg4OCBieXRlcworICAgICAgICAgIFRyZWUgT2Zmc2V0OiAgICAgICAgICAgODg4ODg4OAorICAgICAgICAgIFRyZWUgU2l6ZTogICAgICAgICAgICAgNDQ0NDQgYnl0ZXMKKyAgICAgICAgICBEYXRhIEJsb2NrIFNpemU6ICAgICAgIDQ0NDQgYnl0ZXMKKyAgICAgICAgICBIYXNoIEJsb2NrIFNpemU6ICAgICAgIDQ0NDQgYnl0ZXMKKyAgICAgICAgICBGRUMgbnVtIHJvb3RzOiAgICAgICAgIDAKKyAgICAgICAgICBGRUMgb2Zmc2V0OiAgICAgICAgICAgIDAKKyAgICAgICAgICBGRUMgc2l6ZTogICAgICAgICAgICAgIDAgYnl0ZXMKKyAgICAgICAgICBIYXNoIEFsZ29yaXRobTogICAgICAgIHNoYTEKKyAgICAgICAgICBQYXJ0aXRpb24gTmFtZTogICAgICAgIHBhcnRpdGlvbi1uYW1lCisgICAgICAgICAgU2FsdDogICAgICAgICAgICAgICAgICBjZGNkY2RjZGNkY2RjZGNkY2RjZGNkY2RjZGNkY2RjZGNkY2RjZGNkCisgICAgICAgICAgUm9vdCBEaWdlc3Q6ICAgICAgICAgICBlZmVmZWZlZmVmZWZlZmVmZWZlZmVmZWZlZmVmZWZlZmVmZWYKKyAgICAgICAgICBGbGFnczogICAgICAgICAgICAgICAgIDAKKyAgICAgICAgUHJvcDogcHJvcC5rZXkgLT4gJ3Byb3AudmFsdWUnCisgICAgIiIiCiAKLSAgICBtaXNjX2luZm8gPSB7Ci0gICAgICAgICdna2lfc2lnbmluZ19rZXlfcGF0aCc6ICdkZWZhdWx0X2draV9rZXknLAotICAgICAgICAnZ2tpX3NpZ25pbmdfYWxnb3JpdGhtJzogJ2RlZmF1bHRfZ2tpX2FsZ29yaXRobScsCi0gICAgICAgICdna2lfc2lnbmluZ19zaWduYXR1cmVfYXJncyc6ICdkZWZhdWx0X2draV9zaWduYXR1cmVfYXJncycsCi0gICAgfQotICAgIGV4cGVjdGVkX2RpY3QgPSB7Ci0gICAgICAgICdna2lfc2lnbmluZ19rZXlfcGF0aCc6ICdyZWxlYXNlX2draV9rZXknLAotICAgICAgICAnZ2tpX3NpZ25pbmdfYWxnb3JpdGhtJzogJ3JlbGVhc2VfZ2tpX2FsZ29yaXRobScsCi0gICAgICAgICdna2lfc2lnbmluZ19zaWduYXR1cmVfYXJncyc6ICdyZWxlYXNlX2draV9zaWduYXR1cmVfZXh0cmFfYXJncycsCi0gICAgfQotICAgIFJlcGxhY2VHa2lTaWduaW5nS2V5KG1pc2NfaW5mbykKLSAgICBzZWxmLmFzc2VydERpY3RFcXVhbChleHBlY3RlZF9kaWN0LCBtaXNjX2luZm8pCi0KLSAgZGVmIHRlc3RfUmVwbGFjZUdraVNpZ25pbmdLZXlfTWlzc2luZ1NpZ25pbmdBbGdvcml0aG0oc2VsZik6Ci0gICAgY29tbW9uLk9QVElPTlMuZ2tpX3NpZ25pbmdfa2V5ID0gJ3JlbGVhc2VfZ2tpX2tleScKLSAgICBjb21tb24uT1BUSU9OUy5na2lfc2lnbmluZ19hbGdvcml0aG0gPSBOb25lCi0gICAgY29tbW9uLk9QVElPTlMuZ2tpX3NpZ25pbmdfZXh0cmFfYXJncyA9ICdyZWxlYXNlX2draV9zaWduYXR1cmVfZXh0cmFfYXJncycKLQotICAgIG1pc2NfaW5mbyA9IHsKLSAgICAgICAgJ2draV9zaWduaW5nX2tleV9wYXRoJzogJ2RlZmF1bHRfZ2tpX2tleScsCi0gICAgICAgICdna2lfc2lnbmluZ19hbGdvcml0aG0nOiAnZGVmYXVsdF9na2lfYWxnb3JpdGhtJywKLSAgICAgICAgJ2draV9zaWduaW5nX3NpZ25hdHVyZV9hcmdzJzogJ2RlZmF1bHRfZ2tpX3NpZ25hdHVyZV9hcmdzJywKLSAgICB9Ci0gICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgUmVwbGFjZUdraVNpZ25pbmdLZXksIG1pc2NfaW5mbykKLQotICBkZWYgdGVzdF9SZXBsYWNlR2tpU2lnbmluZ0tleV9NaXNzaW5nU2lnbmluZ0tleU5vcChzZWxmKToKLSAgICBjb21tb24uT1BUSU9OUy5na2lfc2lnbmluZ19rZXkgPSBOb25lCi0gICAgY29tbW9uLk9QVElPTlMuZ2tpX3NpZ25pbmdfYWxnb3JpdGhtID0gJ3JlbGVhc2VfZ2tpX2FsZ29yaXRobScKLSAgICBjb21tb24uT1BUSU9OUy5na2lfc2lnbmluZ19leHRyYV9hcmdzID0gJ3JlbGVhc2VfZ2tpX3NpZ25hdHVyZV9leHRyYV9hcmdzJwotCi0gICAgIyBObyBjaGFuZ2UgdG8gbWlzY19pbmZvIGlmIGNvbW1vbi5PUFRJT05TLmdraV9zaWduaW5nX2tleSBpcyBtaXNzaW5nLgotICAgIG1pc2NfaW5mbyA9IHsKLSAgICAgICAgJ2draV9zaWduaW5nX2tleV9wYXRoJzogJ2RlZmF1bHRfZ2tpX2tleScsCi0gICAgICAgICdna2lfc2lnbmluZ19hbGdvcml0aG0nOiAnZGVmYXVsdF9na2lfYWxnb3JpdGhtJywKLSAgICAgICAgJ2draV9zaWduaW5nX3NpZ25hdHVyZV9hcmdzJzogJ2RlZmF1bHRfZ2tpX3NpZ25hdHVyZV9hcmdzJywKLSAgICB9Ci0gICAgZXhwZWN0ZWRfZGljdCA9IHsKLSAgICAgICAgJ2draV9zaWduaW5nX2tleV9wYXRoJzogJ2RlZmF1bHRfZ2tpX2tleScsCi0gICAgICAgICdna2lfc2lnbmluZ19hbGdvcml0aG0nOiAnZGVmYXVsdF9na2lfYWxnb3JpdGhtJywKLSAgICAgICAgJ2draV9zaWduaW5nX3NpZ25hdHVyZV9hcmdzJzogJ2RlZmF1bHRfZ2tpX3NpZ25hdHVyZV9hcmdzJywKLSAgICB9Ci0gICAgUmVwbGFjZUdraVNpZ25pbmdLZXkobWlzY19pbmZvKQotICAgIHNlbGYuYXNzZXJ0RGljdEVxdWFsKGV4cGVjdGVkX2RpY3QsIG1pc2NfaW5mbykKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICB7CisgICAgICAgICAgICAnRm9vdGVyIHZlcnNpb24nOiAnMS4wJywKKyAgICAgICAgICAgICdJbWFnZSBzaXplJzogJzk5OTk5OTkgYnl0ZXMnLAorICAgICAgICAgICAgJ09yaWdpbmFsIGltYWdlIHNpemUnOiAnODg4ODg4OCBieXRlcycsCisgICAgICAgICAgICAnVkJNZXRhIG9mZnNldCc6ICc3Nzc3Nzc3JywKKyAgICAgICAgICAgICdWQk1ldGEgc2l6ZSc6ICcxMTExIGJ5dGVzJywKKyAgICAgICAgICAgICdNaW5pbXVtIGxpYmF2YiB2ZXJzaW9uJzogJzEuMCcsCisgICAgICAgICAgICAnSGVhZGVyIEJsb2NrJzogJzIyMiBieXRlcycsCisgICAgICAgICAgICAnQXV0aGVudGljYXRpb24gQmxvY2snOiAnMzMzIGJ5dGVzJywKKyAgICAgICAgICAgICdBdXhpbGlhcnkgQmxvY2snOiAnODg4IGJ5dGVzJywKKyAgICAgICAgICAgICdQdWJsaWMga2V5IChzaGExKSc6ICdhYmFiYWJhYmFiYWJhYmFiYWJhYmFiYWJhYmFiYWJhYmFiYWJhYmFiJywKKyAgICAgICAgICAgICdBbGdvcml0aG0nOiAnU0hBMjU2X1JTQTIwNDgnLAorICAgICAgICAgICAgJ1JvbGxiYWNrIEluZGV4JzogJzAnLAorICAgICAgICAgICAgJ0ZsYWdzJzogJzAnLAorICAgICAgICAgICAgJ1JvbGxiYWNrIEluZGV4IExvY2F0aW9uJzogJzAnLAorICAgICAgICAgICAgJ1JlbGVhc2UgU3RyaW5nJzogIidhdmJ0b29sIDEuMy4wJyIsCisgICAgICAgICAgICAnRGVzY3JpcHRvcnMnOiBbCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAnSGFzaHRyZWUgZGVzY3JpcHRvcic6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICdWZXJzaW9uIG9mIGRtLXZlcml0eSc6ICcxJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdJbWFnZSBTaXplJzogJzg4ODg4ODggYnl0ZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ1RyZWUgT2Zmc2V0JzogJzg4ODg4ODgnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ1RyZWUgU2l6ZSc6ICc0NDQ0NCBieXRlcycsCisgICAgICAgICAgICAgICAgICAgICAgICAnRGF0YSBCbG9jayBTaXplJzogJzQ0NDQgYnl0ZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ0hhc2ggQmxvY2sgU2l6ZSc6ICc0NDQ0IGJ5dGVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdGRUMgbnVtIHJvb3RzJzogJzAnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ0ZFQyBvZmZzZXQnOiAnMCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnRkVDIHNpemUnOiAnMCBieXRlcycsCisgICAgICAgICAgICAgICAgICAgICAgICAnSGFzaCBBbGdvcml0aG0nOiAnc2hhMScsCisgICAgICAgICAgICAgICAgICAgICAgICAnUGFydGl0aW9uIE5hbWUnOiAncGFydGl0aW9uLW5hbWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ1NhbHQnOiAnY2RjZGNkY2RjZGNkY2RjZGNkY2RjZGNkY2RjZGNkY2RjZGNkY2RjZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnUm9vdCBEaWdlc3QnOiAnZWZlZmVmZWZlZmVmZWZlZmVmZWZlZmVmZWZlZmVmZWZlZmVmJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdGbGFncyc6ICcwJywKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAnUHJvcCc6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wLmtleSc6ICdwcm9wLnZhbHVlJywKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICBdLAorICAgICAgICB9LAorICAgICAgICBQYXJzZUF2YkluZm8oYXZiX2luZm9fc3RyaW5nKSwKKyAgICApClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RfdmFsaWRhdGVfdGFyZ2V0X2ZpbGVzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RfdmFsaWRhdGVfdGFyZ2V0X2ZpbGVzLnB5CmluZGV4IDQ4YjU2M2QuLjRkNGI5ZTUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X3ZhbGlkYXRlX3RhcmdldF9maWxlcy5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvdGVzdF92YWxpZGF0ZV90YXJnZXRfZmlsZXMucHkKQEAgLTE1Niw3ICsxNTYsNiBAQAogICAgICAgICB2ZXJpdHlfa2V5X21pbmNyeXB0KQogCiAgICAgaW5mb19kaWN0ID0gewotICAgICAgICAnc3lzdGVtX3Jvb3RfaW1hZ2UnIDogJ3RydWUnLAogICAgICAgICAndmVyaXR5JyA6ICd0cnVlJywKICAgICB9CiAgICAgb3B0aW9ucyA9IHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS9zZXBvbGljeS5hcGV4IGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RkYXRhL3NlcG9saWN5LmFwZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNjQ2Y2QuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RkYXRhL3NlcG9saWN5LmFwZXgKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvdmFsaWRhdGVfdGFyZ2V0X2ZpbGVzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL3ZhbGlkYXRlX3RhcmdldF9maWxlcy5weQppbmRleCBiZWI5ZTc1Li44OGZkODkyIDEwMDc1NQotLS0gYS90b29scy9yZWxlYXNldG9vbHMvdmFsaWRhdGVfdGFyZ2V0X2ZpbGVzLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy92YWxpZGF0ZV90YXJnZXRfZmlsZXMucHkKQEAgLTEzMiw3ICsxMzIsNyBAQAogICAgIHJldHVybgogCiAgICMgVmVyaWZ5IElNQUdFUy9zeXN0ZW0uaW1nIGlmIGFwcGxpY2FibGUuCi0gICMgU29tZSB0YXJnZXRzLCBlLmcuLCBna2lfYXJtNjQsIGdraV94ODZfNjQsIGV0Yy4sIGFyZSBzeXN0ZW0uaW1nLWxlc3MuCisgICMgU29tZSB0YXJnZXRzIGFyZSBzeXN0ZW0uaW1nLWxlc3MuCiAgIGlmICdJTUFHRVMvc3lzdGVtLmltZycgaW4gaW5wdXRfemlwLm5hbWVsaXN0KCk6CiAgICAgQ2hlY2tBbGxGaWxlcygnc3lzdGVtJykKIApAQCAtMzYxLDE4ICszNjEsMTUgQEAKICAgICAgICAgICAiTWlzbWF0Y2hpbmcgbWluY3J5cHQgdmVyaXR5IGtleSBmaWxlcyIKICAgICAgIGxvZ2dpbmcuaW5mbygnVmVyaWZpZWQgdGhlIGNvbnRlbnQgb2YgL3Zlcml0eV9rZXknKQogCi0gICAgIyBGb3IgZGV2aWNlcyB3aXRoIGEgc2VwYXJhdGUgcmFtZGlzayAoaS5lLiBub24tc3lzdGVtLWFzLXJvb3QpLCB0aGVyZSBtdXN0Ci0gICAgIyBiZSBhIGNvcHkgaW4gcmFtZGlzay4KLSAgICBpZiBpbmZvX2RpY3QuZ2V0KCJzeXN0ZW1fcm9vdF9pbWFnZSIpICE9ICJ0cnVlIjoKLSAgICAgIHZlcml0eV9rZXlfcmFtZGlzayA9IG9zLnBhdGguam9pbigKLSAgICAgICAgICBpbnB1dF90bXAsICdCT09UJywgJ1JBTURJU0snLCAndmVyaXR5X2tleScpCi0gICAgICBhc3NlcnQgb3MucGF0aC5leGlzdHMoCi0gICAgICAgICAgdmVyaXR5X2tleV9yYW1kaXNrKSwgJ01pc3NpbmcgdmVyaXR5X2tleSBpbiByYW1kaXNrJworICAgIHZlcml0eV9rZXlfcmFtZGlzayA9IG9zLnBhdGguam9pbigKKyAgICAgICAgaW5wdXRfdG1wLCAnQk9PVCcsICdSQU1ESVNLJywgJ3Zlcml0eV9rZXknKQorICAgIGFzc2VydCBvcy5wYXRoLmV4aXN0cygKKyAgICAgICAgdmVyaXR5X2tleV9yYW1kaXNrKSwgJ01pc3NpbmcgdmVyaXR5X2tleSBpbiByYW1kaXNrJwogCi0gICAgICBhc3NlcnQgZmlsZWNtcC5jbXAoCi0gICAgICAgICAgdmVyaXR5X2tleV9taW5jcnlwdCwgdmVyaXR5X2tleV9yYW1kaXNrLCBzaGFsbG93PUZhbHNlKSwgXAotICAgICAgICAgICdNaXNtYXRjaGluZyB2ZXJpdHlfa2V5IGZpbGVzIGluIHJvb3QgYW5kIHJhbWRpc2snCi0gICAgICBsb2dnaW5nLmluZm8oJ1ZlcmlmaWVkIHRoZSBjb250ZW50IG9mIC92ZXJpdHlfa2V5IGluIHJhbWRpc2snKQorICAgIGFzc2VydCBmaWxlY21wLmNtcCgKKyAgICAgICAgdmVyaXR5X2tleV9taW5jcnlwdCwgdmVyaXR5X2tleV9yYW1kaXNrLCBzaGFsbG93PUZhbHNlKSwgXAorICAgICAgICAnTWlzbWF0Y2hpbmcgdmVyaXR5X2tleSBmaWxlcyBpbiByb290IGFuZCByYW1kaXNrJworICAgIGxvZ2dpbmcuaW5mbygnVmVyaWZpZWQgdGhlIGNvbnRlbnQgb2YgL3Zlcml0eV9rZXkgaW4gcmFtZGlzaycpCiAKICAgICAjIFRoZW4gdmVyaWZ5IHRoZSB2ZXJpdHkgc2lnbmVkIHN5c3RlbS92ZW5kb3IvcHJvZHVjdCBpbWFnZXMsIGFnYWluc3QgdGhlCiAgICAgIyB2ZXJpdHkgcHVia2V5IGluIG1pbmNyeXB0IGZvcm1hdC4KQEAgLTQzMCw3ICs0MjcsOCBAQAogICAgICAgICBrZXlfZmlsZSA9IG9wdGlvbnMuZ2V0KGtleV9uYW1lLCBpbmZvX2RpY3Rba2V5X25hbWVdKQogICAgICAgICBjaGFpbmVkX3BhcnRpdGlvbl9hcmcgPSBjb21tb24uR2V0QXZiQ2hhaW5lZFBhcnRpdGlvbkFyZygKICAgICAgICAgICAgIHBhcnRpdGlvbiwgaW5mb19kaWN0LCBrZXlfZmlsZSkKLSAgICAgICAgY21kLmV4dGVuZChbJy0tZXhwZWN0ZWRfY2hhaW5fcGFydGl0aW9uJywgY2hhaW5lZF9wYXJ0aXRpb25fYXJnXSkKKyAgICAgICAgY21kLmV4dGVuZChbJy0tZXhwZWN0ZWRfY2hhaW5fcGFydGl0aW9uJywKKyAgICAgICAgICAgICAgICAgICAgY2hhaW5lZF9wYXJ0aXRpb25fYXJnLnRvX3N0cmluZygpXSkKIAogICAgICMgSGFuZGxlIHRoZSBib290IGltYWdlIHdpdGggYSBub24tZGVmYXVsdCBuYW1lLCBlLmcuIGJvb3QtNS40LmltZwogICAgIGJvb3RfaW1hZ2VzID0gaW5mb19kaWN0LmdldCgiYm9vdF9pbWFnZXMiKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL3Zlcml0eV91dGlscy5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy92ZXJpdHlfdXRpbHMucHkKaW5kZXggZGRkYjdmNC4uN2NhZWVkNCAxMDA2NDQKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL3Zlcml0eV91dGlscy5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvdmVyaXR5X3V0aWxzLnB5CkBAIC0zMSw2ICszMSw3IEBACiBpbXBvcnQgY29tbW9uCiBpbXBvcnQgc3BhcnNlX2ltZwogZnJvbSByYW5nZWxpYiBpbXBvcnQgUmFuZ2VTZXQKK2Zyb20gaGFzaGxpYiBpbXBvcnQgc2hhMjU2CiAKIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQogCkBAIC00Miw2ICs0Myw3IEBACiBNQVhfVkJNRVRBX1NJWkUgPSA2NCAqIDEwMjQKIE1BWF9GT09URVJfU0laRSA9IDQwOTYKIAorCiBjbGFzcyBCdWlsZFZlcml0eUltYWdlRXJyb3IoRXhjZXB0aW9uKToKICAgIiIiQW4gRXhjZXB0aW9uIHJhaXNlZCBkdXJpbmcgdmVyaXR5IGltYWdlIGJ1aWxkaW5nLiIiIgogCkBAIC02NCw2ICs2NiwxMSBAQAogICAjIHBhcnRpdGlvbl9zaXplIGNvdWxkIGJlIE5vbmUgYXQgdGhpcyBwb2ludCwgaWYgdXNpbmcgZHluYW1pYyBwYXJ0aXRpb25zLgogICBpZiBwYXJ0aXRpb25fc2l6ZToKICAgICBwYXJ0aXRpb25fc2l6ZSA9IGludChwYXJ0aXRpb25fc2l6ZSkKKyAgIyBTZXQgdXAgdGhlIHNhbHQgKGJhc2VkIG9uIGZpbmdlcnByaW50KSB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIGFkZGluZyBBVkIKKyAgIyBoYXNoIC8gaGFzaHRyZWUgZm9vdGVycy4KKyAgc2FsdCA9IHByb3BfZGljdC5nZXQoImF2Yl9zYWx0IikKKyAgaWYgc2FsdCBpcyBOb25lOgorICAgIHNhbHQgPSBzaGEyNTYocHJvcF9kaWN0LmdldCgiZmluZ2VycHJpbnQiLCAiIikuZW5jb2RlKCkpLmhleGRpZ2VzdCgpCiAKICAgIyBWZXJpZmllZCBCb290IDIuMAogICBpZiAocHJvcF9kaWN0LmdldCgiYXZiX2hhc2hfZW5hYmxlIikgPT0gInRydWUiIG9yCkBAIC04MSw3ICs4OCw3IEBACiAgICAgICAgICAgcHJvcF9kaWN0WyJhdmJfYXZidG9vbCJdLAogICAgICAgICAgIGtleV9wYXRoLAogICAgICAgICAgIGFsZ29yaXRobSwKLSAgICAgICAgICBwcm9wX2RpY3QuZ2V0KCJhdmJfc2FsdCIpLAorICAgICAgICAgIHNhbHQsCiAgICAgICAgICAgcHJvcF9kaWN0WyJhdmJfYWRkX2hhc2hfZm9vdGVyX2FyZ3MiXSkKIAogICAgICMgSW1hZ2UgdXNlcyBoYXNodHJlZSBmb290ZXIuCkBAIC05Miw3ICs5OSw3IEBACiAgICAgICAgIHByb3BfZGljdFsiYXZiX2F2YnRvb2wiXSwKICAgICAgICAga2V5X3BhdGgsCiAgICAgICAgIGFsZ29yaXRobSwKLSAgICAgICAgcHJvcF9kaWN0LmdldCgiYXZiX3NhbHQiKSwKKyAgICAgICAgc2FsdCwKICAgICAgICAgcHJvcF9kaWN0WyJhdmJfYWRkX2hhc2h0cmVlX2Zvb3Rlcl9hcmdzIl0pCiAKICAgcmV0dXJuIE5vbmUKQEAgLTI3OSw3ICsyODYsNyBAQAogCiAKIGRlZiBDcmVhdGVDdXN0b21JbWFnZUJ1aWxkZXIoaW5mb19kaWN0LCBwYXJ0aXRpb25fbmFtZSwgcGFydGl0aW9uX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3BhdGgsIGFsZ29yaXRobSwgc2lnbmluZ19hcmdzKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3BhdGgsIGFsZ29yaXRobSwgc2lnbmluZ19hcmdzKToKICAgYnVpbGRlciA9IE5vbmUKICAgaWYgaW5mb19kaWN0LmdldCgiYXZiX2VuYWJsZSIpID09ICJ0cnVlIjoKICAgICBidWlsZGVyID0gVmVyaWZpZWRCb290VmVyc2lvbjJWZXJpdHlJbWFnZUJ1aWxkZXIoCmRpZmYgLS1naXQgYS90b29scy9zYm9tL0FuZHJvaWQuYnAgYi90b29scy9zYm9tL0FuZHJvaWQuYnAKaW5kZXggNDgzN2RkZS4uNGY2ZDNiNyAxMDA2NDQKLS0tIGEvdG9vbHMvc2JvbS9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL3Nib20vQW5kcm9pZC5icApAQCAtMzQsNiArMzQsMzEgQEAKIH0KIAogcHl0aG9uX2xpYnJhcnlfaG9zdCB7CisgICAgbmFtZTogImNvbXBsaWFuY2VfbWV0YWRhdGEiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImNvbXBsaWFuY2VfbWV0YWRhdGEucHkiLAorICAgIF0sCit9CisKK3B5dGhvbl9iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogImdlbl9zYm9tIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJnZW5fc2JvbS5weSIsCisgICAgXSwKKyAgICB2ZXJzaW9uOiB7CisgICAgICAgIHB5MzogeworICAgICAgICAgICAgZW1iZWRkZWRfbGF1bmNoZXI6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKKyAgICBsaWJzOiBbCisgICAgICAgICJjb21wbGlhbmNlX21ldGFkYXRhIiwKKyAgICAgICAgIm1ldGFkYXRhX2ZpbGVfcHJvdG9fcHkiLAorICAgICAgICAibGlicHJvdG9idWYtcHl0aG9uIiwKKyAgICAgICAgInNib21fbGliIiwKKyAgICBdLAorfQorCitweXRob25fbGlicmFyeV9ob3N0IHsKICAgICBuYW1lOiAic2JvbV9saWIiLAogICAgIHNyY3M6IFsKICAgICAgICAgInNib21fZGF0YS5weSIsCkBAIC01Myw1ICs3OCw1NiBAQAogICAgIGxpYnM6IFsKICAgICAgICAgInNib21fbGliIiwKICAgICBdLAorICAgIHZlcnNpb246IHsKKyAgICAgICAgcHkzOiB7CisgICAgICAgICAgICBlbWJlZGRlZF9sYXVuY2hlcjogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAogICAgIHRlc3Rfc3VpdGVzOiBbImdlbmVyYWwtdGVzdHMiXSwKIH0KKworcHl0aG9uX3Rlc3RfaG9zdCB7CisgICAgbmFtZTogInNib21fZGF0YV90ZXN0IiwKKyAgICBtYWluOiAic2JvbV9kYXRhX3Rlc3QucHkiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInNib21fZGF0YV90ZXN0LnB5IiwKKyAgICBdLAorICAgIGxpYnM6IFsKKyAgICAgICAgInNib21fbGliIiwKKyAgICBdLAorICAgIHZlcnNpb246IHsKKyAgICAgICAgcHkzOiB7CisgICAgICAgICAgICBlbWJlZGRlZF9sYXVuY2hlcjogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIHRlc3Rfc3VpdGVzOiBbImdlbmVyYWwtdGVzdHMiXSwKK30KKworcHl0aG9uX2JpbmFyeV9ob3N0IHsKKyAgICBuYW1lOiAiZ2VuZXJhdGUtc2JvbS1mcmFtZXdvcmtfcmVzIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJnZW5lcmF0ZS1zYm9tLWZyYW1ld29ya19yZXMucHkiLAorICAgIF0sCisgICAgdmVyc2lvbjogeworICAgICAgICBweTM6IHsKKyAgICAgICAgICAgIGVtYmVkZGVkX2xhdW5jaGVyOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCisgICAgbGliczogWworICAgICAgICAic2JvbV9saWIiLAorICAgIF0sCit9CisKK3B5dGhvbl9iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogImdlbl9ub3RpY2VfeG1sIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJnZW5fbm90aWNlX3htbC5weSIsCisgICAgXSwKKyAgICB2ZXJzaW9uOiB7CisgICAgICAgIHB5MzogeworICAgICAgICAgICAgZW1iZWRkZWRfbGF1bmNoZXI6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKKyAgICBsaWJzOiBbCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Nib20vY29tcGxpYW5jZV9tZXRhZGF0YS5weSBiL3Rvb2xzL3Nib20vY29tcGxpYW5jZV9tZXRhZGF0YS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTEwMjE3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvc2JvbS9jb21wbGlhbmNlX21ldGFkYXRhLnB5CkBAIC0wLDAgKzEsMjA0IEBACisjIS91c3IvYmluL2VudiBweXRob24zCisjCisjIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgc3FsaXRlMworCitjbGFzcyBNZXRhZGF0YURiOgorICBkZWYgX19pbml0X18oc2VsZiwgZGIpOgorICAgIHNlbGYuY29ubiA9IHNxbGl0ZTMuY29ubmVjdCgnOm1lbW9yeScpCisgICAgc2VsZi5jb25uLnJvd19mYWN0b3J5ID0gc3FsaXRlMy5Sb3cKKyAgICB3aXRoIHNxbGl0ZTMuY29ubmVjdChkYikgYXMgYzoKKyAgICAgIGMuYmFja3VwKHNlbGYuY29ubikKKyAgICBzZWxmLnJlb3JnKCkKKworICBkZWYgcmVvcmcoc2VsZik6CisgICAgIyBwYWNrYWdlX2xpY2Vuc2UgdGFibGUKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHBhY2thZ2VfbGljZW5zZSBhcyAiCisgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdCBuYW1lIGFzIHBhY2thZ2UsIHBrZ19kZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMgYXMgbGljZW5zZSAiCisgICAgICAgICAgICAgICAgICAgICAgImZyb20gbW9kdWxlcyAiCisgICAgICAgICAgICAgICAgICAgICAgIndoZXJlIG1vZHVsZV90eXBlID0gJ3BhY2thZ2UnICIpCisgICAgY3Vyc29yID0gc2VsZi5jb25uLmV4ZWN1dGUoInNlbGVjdCBwYWNrYWdlLGxpY2Vuc2UgZnJvbSBwYWNrYWdlX2xpY2Vuc2Ugd2hlcmUgbGljZW5zZSBsaWtlICclICUnIikKKyAgICBtdWx0aV9saWNlbnNlc19wYWNrYWdlcyA9IGN1cnNvci5mZXRjaGFsbCgpCisgICAgY3Vyc29yLmNsb3NlKCkKKyAgICByb3dzID0gW10KKyAgICBmb3IgcCBpbiBtdWx0aV9saWNlbnNlc19wYWNrYWdlczoKKyAgICAgIGxpY2Vuc2VzID0gcFsnbGljZW5zZSddLnN0cmlwKCkuc3BsaXQoJyAnKQorICAgICAgZm9yIGxpYyBpbiBsaWNlbnNlczoKKyAgICAgICAgcm93cy5hcHBlbmQoKHBbJ3BhY2thZ2UnXSwgbGljKSkKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZW1hbnkoJ2luc2VydCBpbnRvIHBhY2thZ2VfbGljZW5zZSB2YWx1ZXMgKD8sID8pJywgcm93cykKKyAgICBzZWxmLmNvbm4uY29tbWl0KCkKKworICAgIHNlbGYuY29ubi5leGVjdXRlKCJkZWxldGUgZnJvbSBwYWNrYWdlX2xpY2Vuc2Ugd2hlcmUgbGljZW5zZSBsaWtlICclICUnIikKKyAgICBzZWxmLmNvbm4uY29tbWl0KCkKKworICAgICMgbW9kdWxlX2xpY2Vuc2UgdGFibGUKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIG1vZHVsZV9saWNlbnNlIGFzICIKKyAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IGRpc3RpbmN0IG5hbWUgYXMgbW9kdWxlLCBwYWNrYWdlLCBsaWNlbnNlcyBhcyBsaWNlbnNlICIKKyAgICAgICAgICAgICAgICAgICAgICAiZnJvbSBtb2R1bGVzICIKKyAgICAgICAgICAgICAgICAgICAgICAid2hlcmUgbGljZW5zZXMgIT0gJycgIikKKyAgICBjdXJzb3IgPSBzZWxmLmNvbm4uZXhlY3V0ZSgic2VsZWN0IG1vZHVsZSxwYWNrYWdlLGxpY2Vuc2UgZnJvbSBtb2R1bGVfbGljZW5zZSB3aGVyZSBsaWNlbnNlIGxpa2UgJyUgJSciKQorICAgIG11bHRpX2xpY2Vuc2VzX21vZHVsZXMgPSBjdXJzb3IuZmV0Y2hhbGwoKQorICAgIGN1cnNvci5jbG9zZSgpCisgICAgcm93cyA9IFtdCisgICAgZm9yIG0gaW4gbXVsdGlfbGljZW5zZXNfbW9kdWxlczoKKyAgICAgIGxpY2Vuc2VzID0gbVsnbGljZW5zZSddLnN0cmlwKCkuc3BsaXQoJyAnKQorICAgICAgZm9yIGxpYyBpbiBsaWNlbnNlczoKKyAgICAgICAgcm93cy5hcHBlbmQoKG1bJ21vZHVsZSddLCBtWydwYWNrYWdlJ10sbGljKSkKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZW1hbnkoJ2luc2VydCBpbnRvIG1vZHVsZV9saWNlbnNlIHZhbHVlcyAoPywgPywgPyknLCByb3dzKQorICAgIHNlbGYuY29ubi5jb21taXQoKQorCisgICAgc2VsZi5jb25uLmV4ZWN1dGUoImRlbGV0ZSBmcm9tIG1vZHVsZV9saWNlbnNlIHdoZXJlIGxpY2Vuc2UgbGlrZSAnJSAlJyIpCisgICAgc2VsZi5jb25uLmNvbW1pdCgpCisKKyAgICAjIG1vZHVsZV9pbnN0YWxsZWRfZmlsZSB0YWJsZQorICAgIHNlbGYuY29ubi5leGVjdXRlKCJjcmVhdGUgdGFibGUgbW9kdWxlX2luc3RhbGxlZF9maWxlIGFzICIKKyAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IGlkIGFzIG1vZHVsZV9pZCwgbmFtZSBhcyBtb2R1bGVfbmFtZSwgcGFja2FnZSwgaW5zdGFsbGVkX2ZpbGVzIGFzIGluc3RhbGxlZF9maWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAiZnJvbSBtb2R1bGVzICIKKyAgICAgICAgICAgICAgICAgICAgICAid2hlcmUgaW5zdGFsbGVkX2ZpbGVzICE9ICcnICIpCisgICAgY3Vyc29yID0gc2VsZi5jb25uLmV4ZWN1dGUoInNlbGVjdCBtb2R1bGVfaWQsIG1vZHVsZV9uYW1lLCBwYWNrYWdlLCBpbnN0YWxsZWRfZmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyb20gbW9kdWxlX2luc3RhbGxlZF9maWxlIHdoZXJlIGluc3RhbGxlZF9maWxlIGxpa2UgJyUgJSciKQorICAgIG11bHRpX2luc3RhbGxlZF9maWxlX21vZHVsZXMgPSBjdXJzb3IuZmV0Y2hhbGwoKQorICAgIGN1cnNvci5jbG9zZSgpCisgICAgcm93cyA9IFtdCisgICAgZm9yIG0gaW4gbXVsdGlfaW5zdGFsbGVkX2ZpbGVfbW9kdWxlczoKKyAgICAgIGluc3RhbGxlZF9maWxlcyA9IG1bJ2luc3RhbGxlZF9maWxlJ10uc3RyaXAoKS5zcGxpdCgnICcpCisgICAgICBmb3IgZiBpbiBpbnN0YWxsZWRfZmlsZXM6CisgICAgICAgIHJvd3MuYXBwZW5kKChtWydtb2R1bGVfaWQnXSwgbVsnbW9kdWxlX25hbWUnXSwgbVsncGFja2FnZSddLCBmKSkKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZW1hbnkoJ2luc2VydCBpbnRvIG1vZHVsZV9pbnN0YWxsZWRfZmlsZSB2YWx1ZXMgKD8sID8sID8sID8pJywgcm93cykKKyAgICBzZWxmLmNvbm4uY29tbWl0KCkKKworICAgIHNlbGYuY29ubi5leGVjdXRlKCJkZWxldGUgZnJvbSBtb2R1bGVfaW5zdGFsbGVkX2ZpbGUgd2hlcmUgaW5zdGFsbGVkX2ZpbGUgbGlrZSAnJSAlJyIpCisgICAgc2VsZi5jb25uLmNvbW1pdCgpCisKKyAgICAjIG1vZHVsZV9idWlsdF9maWxlIHRhYmxlCisgICAgc2VsZi5jb25uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBtb2R1bGVfYnVpbHRfZmlsZSBhcyAiCisgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdCBpZCBhcyBtb2R1bGVfaWQsIG5hbWUgYXMgbW9kdWxlX25hbWUsIHBhY2thZ2UsIGJ1aWx0X2ZpbGVzIGFzIGJ1aWx0X2ZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICJmcm9tIG1vZHVsZXMgIgorICAgICAgICAgICAgICAgICAgICAgICJ3aGVyZSBidWlsdF9maWxlcyAhPSAnJyAiKQorICAgIGN1cnNvciA9IHNlbGYuY29ubi5leGVjdXRlKCJzZWxlY3QgbW9kdWxlX2lkLCBtb2R1bGVfbmFtZSwgcGFja2FnZSwgYnVpbHRfZmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyb20gbW9kdWxlX2J1aWx0X2ZpbGUgd2hlcmUgYnVpbHRfZmlsZSBsaWtlICclICUnIikKKyAgICBtdWx0aV9idWlsdF9maWxlX21vZHVsZXMgPSBjdXJzb3IuZmV0Y2hhbGwoKQorICAgIGN1cnNvci5jbG9zZSgpCisgICAgcm93cyA9IFtdCisgICAgZm9yIG0gaW4gbXVsdGlfYnVpbHRfZmlsZV9tb2R1bGVzOgorICAgICAgYnVpbHRfZmlsZXMgPSBtWydpbnN0YWxsZWRfZmlsZSddLnN0cmlwKCkuc3BsaXQoJyAnKQorICAgICAgZm9yIGYgaW4gYnVpbHRfZmlsZXM6CisgICAgICAgIHJvd3MuYXBwZW5kKChtWydtb2R1bGVfaWQnXSwgbVsnbW9kdWxlX25hbWUnXSwgbVsncGFja2FnZSddLCBmKSkKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZW1hbnkoJ2luc2VydCBpbnRvIG1vZHVsZV9idWlsdF9maWxlIHZhbHVlcyAoPywgPywgPywgPyknLCByb3dzKQorICAgIHNlbGYuY29ubi5jb21taXQoKQorCisgICAgc2VsZi5jb25uLmV4ZWN1dGUoImRlbGV0ZSBmcm9tIG1vZHVsZV9idWlsdF9maWxlIHdoZXJlIGJ1aWx0X2ZpbGUgbGlrZSAnJSAlJyIpCisgICAgc2VsZi5jb25uLmNvbW1pdCgpCisKKworICAgICMgSW5kZXhlcworICAgIHNlbGYuY29ubi5leGVjdXRlKCdjcmVhdGUgaW5kZXggaWR4X21vZHVsZXNfaWQgb24gbW9kdWxlcyAoaWQpJykKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZSgnY3JlYXRlIGluZGV4IGlkeF9tb2R1bGVzX25hbWUgb24gbW9kdWxlcyAobmFtZSknKQorICAgIHNlbGYuY29ubi5leGVjdXRlKCdjcmVhdGUgaW5kZXggaWR4X3BhY2thZ2VfbGljbmVzZV9wYWNrYWdlIG9uIHBhY2thZ2VfbGljZW5zZSAocGFja2FnZSknKQorICAgIHNlbGYuY29ubi5leGVjdXRlKCdjcmVhdGUgaW5kZXggaWR4X3BhY2thZ2VfbGljbmVzZV9saWNlbnNlIG9uIHBhY2thZ2VfbGljZW5zZSAobGljZW5zZSknKQorICAgIHNlbGYuY29ubi5leGVjdXRlKCdjcmVhdGUgaW5kZXggaWR4X21vZHVsZV9saWNuZXNlX21vZHVsZSBvbiBtb2R1bGVfbGljZW5zZSAobW9kdWxlKScpCisgICAgc2VsZi5jb25uLmV4ZWN1dGUoJ2NyZWF0ZSBpbmRleCBpZHhfbW9kdWxlX2xpY25lc2VfbGljZW5zZSBvbiBtb2R1bGVfbGljZW5zZSAobGljZW5zZSknKQorICAgIHNlbGYuY29ubi5leGVjdXRlKCdjcmVhdGUgaW5kZXggaWR4X21vZHVsZV9pbnN0YWxsZWRfZmlsZV9tb2R1bGVfaWQgb24gbW9kdWxlX2luc3RhbGxlZF9maWxlIChtb2R1bGVfaWQpJykKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZSgnY3JlYXRlIGluZGV4IGlkeF9tb2R1bGVfaW5zdGFsbGVkX2ZpbGVfaW5zdGFsbGVkX2ZpbGUgb24gbW9kdWxlX2luc3RhbGxlZF9maWxlIChpbnN0YWxsZWRfZmlsZSknKQorICAgIHNlbGYuY29ubi5leGVjdXRlKCdjcmVhdGUgaW5kZXggaWR4X21vZHVsZV9idWlsdF9maWxlX21vZHVsZV9pZCBvbiBtb2R1bGVfYnVpbHRfZmlsZSAobW9kdWxlX2lkKScpCisgICAgc2VsZi5jb25uLmV4ZWN1dGUoJ2NyZWF0ZSBpbmRleCBpZHhfbW9kdWxlX2J1aWx0X2ZpbGVfYnVpbHRfZmlsZSBvbiBtb2R1bGVfYnVpbHRfZmlsZSAoYnVpbHRfZmlsZSknKQorICAgIHNlbGYuY29ubi5jb21taXQoKQorCisgIGRlZiBkdW1wX2RlYnVnX2RiKHNlbGYsIGRlYnVnX2RiKToKKyAgICB3aXRoIHNxbGl0ZTMuY29ubmVjdChkZWJ1Z19kYikgYXMgYzoKKyAgICAgIHNlbGYuY29ubi5iYWNrdXAoYykKKworICBkZWYgZ2V0X2luc3RhbGxlZF9maWxlcyhzZWxmKToKKyAgICAjIEdldCBhbGwgcmVjb3JkcyBmcm9tIHRhYmxlIG1ha2VfbWV0YWRhdGEsIHdoaWNoIGNvbnRhaW5zIGFsbCBpbnN0YWxsZWQgZmlsZXMgYW5kIGNvcnJlc3BvbmRpbmcgbWFrZSBtb2R1bGVzJyBtZXRhZGF0YQorICAgIGN1cnNvciA9IHNlbGYuY29ubi5leGVjdXRlKCdzZWxlY3QgaW5zdGFsbGVkX2ZpbGUsIG1vZHVsZV9wYXRoLCBpc19wcmVidWlsdF9tYWtlX21vZHVsZSwgcHJvZHVjdF9jb3B5X2ZpbGVzLCBrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMsIGlzX3BsYXRmb3JtX2dlbmVyYXRlZCwgbGljZW5zZV90ZXh0IGZyb20gbWFrZV9tZXRhZGF0YScpCisgICAgcm93cyA9IGN1cnNvci5mZXRjaGFsbCgpCisgICAgY3Vyc29yLmNsb3NlKCkKKyAgICBpbnN0YWxsZWRfZmlsZXNfbWV0YWRhdGEgPSBbXQorICAgIGZvciByb3cgaW4gcm93czoKKyAgICAgIG1ldGFkYXRhID0gZGljdCh6aXAocm93LmtleXMoKSwgcm93KSkKKyAgICAgIGluc3RhbGxlZF9maWxlc19tZXRhZGF0YS5hcHBlbmQobWV0YWRhdGEpCisgICAgcmV0dXJuIGluc3RhbGxlZF9maWxlc19tZXRhZGF0YQorCisgIGRlZiBnZXRfc29vbmdfbW9kdWxlcyhzZWxmKToKKyAgICAjIEdldCBhbGwgcmVjb3JkcyBmcm9tIHRhYmxlIG1vZHVsZXMsIHdoaWNoIGNvbnRhaW5zIG1ldGFkYXRhIG9mIGFsbCBzb29uZyBtb2R1bGVzCisgICAgY3Vyc29yID0gc2VsZi5jb25uLmV4ZWN1dGUoJ3NlbGVjdCBuYW1lLCBwYWNrYWdlLCBwYWNrYWdlIGFzIG1vZHVsZV9wYXRoLCBtb2R1bGVfdHlwZSBhcyBzb29uZ19tb2R1bGVfdHlwZSwgYnVpbHRfZmlsZXMsIGluc3RhbGxlZF9maWxlcywgc3RhdGljX2RlcF9maWxlcywgd2hvbGVfc3RhdGljX2RlcF9maWxlcyBmcm9tIG1vZHVsZXMnKQorICAgIHJvd3MgPSBjdXJzb3IuZmV0Y2hhbGwoKQorICAgIGN1cnNvci5jbG9zZSgpCisgICAgc29vbmdfbW9kdWxlcyA9IFtdCisgICAgZm9yIHJvdyBpbiByb3dzOgorICAgICAgc29vbmdfbW9kdWxlID0gZGljdCh6aXAocm93LmtleXMoKSwgcm93KSkKKyAgICAgIHNvb25nX21vZHVsZXMuYXBwZW5kKHNvb25nX21vZHVsZSkKKyAgICByZXR1cm4gc29vbmdfbW9kdWxlcworCisgIGRlZiBnZXRfcGFja2FnZV9saWNlbnNlcyhzZWxmLCBwYWNrYWdlKToKKyAgICBjdXJzb3IgPSBzZWxmLmNvbm4uZXhlY3V0ZSgnc2VsZWN0IG0ubmFtZSwgbS5wYWNrYWdlLCBtLmxpY19saWNlbnNlX3RleHQgYXMgbGljZW5zZV90ZXh0ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJvbSBwYWNrYWdlX2xpY2Vuc2UgcGwgam9pbiBtb2R1bGVzIG0gb24gcGwubGljZW5zZSA9IG0ubmFtZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3doZXJlIHBsLnBhY2thZ2UgPSA/JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJy8vJyArIHBhY2thZ2UsKSkKKyAgICByb3dzID0gY3Vyc29yLmZldGNoYWxsKCkKKyAgICBsaWNlbnNlcyA9IHt9CisgICAgZm9yIHIgaW4gcm93czoKKyAgICAgIGxpY2Vuc2VzW3JbJ25hbWUnXV0gPSByWydsaWNlbnNlX3RleHQnXQorICAgIHJldHVybiBsaWNlbnNlcworCisgIGRlZiBnZXRfbW9kdWxlX2xpY2Vuc2VzKHNlbGYsIG1vZHVsZV9uYW1lLCBwYWNrYWdlKToKKyAgICBsaWNlbnNlcyA9IHt9CisgICAgIyBJZiBwcm9wZXJ0eSAibGljZW5zZXMiIGlzIGRlZmluZWQgb24gbW9kdWxlCisgICAgY3Vyc29yID0gc2VsZi5jb25uLmV4ZWN1dGUoJ3NlbGVjdCBtLm5hbWUsIG0ucGFja2FnZSwgbS5saWNfbGljZW5zZV90ZXh0IGFzIGxpY2Vuc2VfdGV4dCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zyb20gbW9kdWxlX2xpY2Vuc2UgbWwgam9pbiBtb2R1bGVzIG0gb24gbWwubGljZW5zZSA9IG0ubmFtZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3doZXJlIG1sLm1vZHVsZSA9ID8gYW5kIG1sLnBhY2thZ2UgPSA/JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW9kdWxlX25hbWUsIHBhY2thZ2UpKQorICAgIHJvd3MgPSBjdXJzb3IuZmV0Y2hhbGwoKQorICAgIGZvciByIGluIHJvd3M6CisgICAgICBsaWNlbnNlc1tyWyduYW1lJ11dID0gclsnbGljZW5zZV90ZXh0J10KKyAgICBpZiBsZW4obGljZW5zZXMpID4gMDoKKyAgICAgIHJldHVybiBsaWNlbnNlcworCisgICAgIyBVc2UgZGVmYXVsdCBwYWNrYWdlIGxpY2Vuc2UKKyAgICBjdXJzb3IgPSBzZWxmLmNvbm4uZXhlY3V0ZSgnc2VsZWN0IG0ubmFtZSwgbS5wYWNrYWdlLCBtLmxpY19saWNlbnNlX3RleHQgYXMgbGljZW5zZV90ZXh0ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJvbSBwYWNrYWdlX2xpY2Vuc2UgcGwgam9pbiBtb2R1bGVzIG0gb24gcGwubGljZW5zZSA9IG0ubmFtZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3doZXJlIHBsLnBhY2thZ2UgPSA/JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJy8vJyArIHBhY2thZ2UsKSkKKyAgICByb3dzID0gY3Vyc29yLmZldGNoYWxsKCkKKyAgICBmb3IgciBpbiByb3dzOgorICAgICAgbGljZW5zZXNbclsnbmFtZSddXSA9IHJbJ2xpY2Vuc2VfdGV4dCddCisgICAgcmV0dXJuIGxpY2Vuc2VzCisKKyAgZGVmIGdldF9zb29uZ19tb2R1bGVfb2ZfaW5zdGFsbGVkX2ZpbGUoc2VsZiwgaW5zdGFsbGVkX2ZpbGUpOgorICAgIGN1cnNvciA9IHNlbGYuY29ubi5leGVjdXRlKCdzZWxlY3QgbmFtZSwgbS5wYWNrYWdlLCBtLnBhY2thZ2UgYXMgbW9kdWxlX3BhdGgsIG1vZHVsZV90eXBlIGFzIHNvb25nX21vZHVsZV90eXBlLCBidWlsdF9maWxlcywgaW5zdGFsbGVkX2ZpbGVzLCBzdGF0aWNfZGVwX2ZpbGVzLCB3aG9sZV9zdGF0aWNfZGVwX2ZpbGVzICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJvbSBtb2R1bGVzIG0gam9pbiBtb2R1bGVfaW5zdGFsbGVkX2ZpbGUgbWlmIG9uIG0uaWQgPSBtaWYubW9kdWxlX2lkICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2hlcmUgbWlmLmluc3RhbGxlZF9maWxlID0gPycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluc3RhbGxlZF9maWxlLCkpCisgICAgcm93cyA9IGN1cnNvci5mZXRjaGFsbCgpCisgICAgY3Vyc29yLmNsb3NlKCkKKyAgICBpZiByb3dzOgorICAgICAgc29vbmdfbW9kdWxlID0gZGljdCh6aXAocm93c1swXS5rZXlzKCksIHJvd3NbMF0pKQorICAgICAgcmV0dXJuIHNvb25nX21vZHVsZQorCisgICAgcmV0dXJuIE5vbmUKKworICBkZWYgZ2V0X3Nvb25nX21vZHVsZV9vZl9idWlsdF9maWxlKHNlbGYsIGJ1aWx0X2ZpbGUpOgorICAgIGN1cnNvciA9IHNlbGYuY29ubi5leGVjdXRlKCdzZWxlY3QgbmFtZSwgbS5wYWNrYWdlLCBtLnBhY2thZ2UgYXMgbW9kdWxlX3BhdGgsIG1vZHVsZV90eXBlIGFzIHNvb25nX21vZHVsZV90eXBlLCBidWlsdF9maWxlcywgaW5zdGFsbGVkX2ZpbGVzLCBzdGF0aWNfZGVwX2ZpbGVzLCB3aG9sZV9zdGF0aWNfZGVwX2ZpbGVzICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJvbSBtb2R1bGVzIG0gam9pbiBtb2R1bGVfYnVpbHRfZmlsZSBtYmYgb24gbS5pZCA9IG1iZi5tb2R1bGVfaWQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aGVyZSBtYmYuYnVpbHRfZmlsZSA9ID8nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidWlsdF9maWxlLCkpCisgICAgcm93cyA9IGN1cnNvci5mZXRjaGFsbCgpCisgICAgY3Vyc29yLmNsb3NlKCkKKyAgICBpZiByb3dzOgorICAgICAgc29vbmdfbW9kdWxlID0gZGljdCh6aXAocm93c1swXS5rZXlzKCksIHJvd3NbMF0pKQorICAgICAgcmV0dXJuIHNvb25nX21vZHVsZQorCisgICAgcmV0dXJuIE5vbmUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9zYm9tL2dlbl9ub3RpY2VfeG1sLnB5IGIvdG9vbHMvc2JvbS9nZW5fbm90aWNlX3htbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWE2ZTVhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvc2JvbS9nZW5fbm90aWNlX3htbC5weQpAQCAtMCwwICsxLDgxIEBACisjICEvdXNyL2Jpbi9lbnYgcHl0aG9uMworIworIyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIiIiCitHZW5lcmF0ZSBOT1RJQ0UueG1sLmd6IG9mIGEgcGFydGl0aW9uLgorVXNhZ2UgZXhhbXBsZToKKyAgZ2VuX25vdGljZV94bWwucHkgLS1vdXRwdXRfZmlsZSBvdXQvc29vbmcvLmludGVybWVkaWF0ZS8uLi4vTk9USUNFLnhtbC5neiBcCisgICAgICAgICAgICAgIC0tbWV0YWRhdGEgb3V0L3Nvb25nL2NvbXBsaWFuY2UtbWV0YWRhdGEvYW9zcF9jZl94ODZfNjRfcGhvbmUvY29tcGxpYW5jZS1tZXRhZGF0YS5kYiBcCisgICAgICAgICAgICAgIC0tcGFydGl0aW9uIHN5c3RlbSBcCisgICAgICAgICAgICAgIC0tcHJvZHVjdF9vdXQgb3V0L3RhcmdldC92c29jX3g4Nl82NCBcCisgICAgICAgICAgICAgIC0tc29vbmdfb3V0IG91dC9zb29uZworIiIiCisKK2ltcG9ydCBhcmdwYXJzZQorCisKK0ZJTEVfSEVBREVSID0gJycnXAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxsaWNlbnNlcz4KKycnJworRklMRV9GT09URVIgPSAnJydcCis8L2xpY2Vuc2VzPgorJycnCisKKworZGVmIGdldF9hcmdzKCk6CisgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXYnLCAnLS12ZXJib3NlJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVmYXVsdD1GYWxzZSwgaGVscD0nUHJpbnQgbW9yZSBpbmZvcm1hdGlvbi4nKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctZCcsICctLWRlYnVnJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVmYXVsdD1UcnVlLCBoZWxwPSdEZWJ1ZyBtb2RlJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1vdXRwdXRfZmlsZScsIHJlcXVpcmVkPVRydWUsIGhlbHA9J1RoZSBwYXRoIG9mIHRoZSBnZW5lcmF0ZWQgTk9USUNFLnhtbC5neiBmaWxlLicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tcGFydGl0aW9uJywgcmVxdWlyZWQ9VHJ1ZSwgaGVscD0nVGhlIG5hbWUgb2YgcGFydGl0aW9uIGZvciB3aGljaCB0aGUgTk9USUNFLnhtbC5neiBpcyBnZW5lcmF0ZWQuJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1tZXRhZGF0YScsIHJlcXVpcmVkPVRydWUsIGhlbHA9J1RoZSBwYXRoIG9mIGNvbXBsaWFuY2UgbWV0YWRhdGEgREIgZmlsZS4nKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXByb2R1Y3Rfb3V0JywgcmVxdWlyZWQ9VHJ1ZSwgaGVscD0nVGhlIHBhdGggb2YgUFJPRFVDVF9PVVQsIGUuZy4gb3V0L3RhcmdldC9wcm9kdWN0L3Zzb2NfeDg2XzY0LicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tc29vbmdfb3V0JywgcmVxdWlyZWQ9VHJ1ZSwgaGVscD0nVGhlIHBhdGggb2YgU29vbmcgb3V0cHV0IGRpcmVjdG9yeSwgZS5nLiBvdXQvc29vbmcnKQorCisgIHJldHVybiBwYXJzZXIucGFyc2VfYXJncygpCisKKworZGVmIGxvZygqaW5mbyk6CisgIGlmIGFyZ3MudmVyYm9zZToKKyAgICBmb3IgaSBpbiBpbmZvOgorICAgICAgcHJpbnQoaSkKKworCitkZWYgbmV3X2ZpbGVfbmFtZV90YWcoZmlsZV9tZXRhZGF0YSwgcGFja2FnZV9uYW1lKToKKyAgZmlsZV9wYXRoID0gZmlsZV9tZXRhZGF0YVsnaW5zdGFsbGVkX2ZpbGUnXS5yZW1vdmVwcmVmaXgoYXJncy5wcm9kdWN0X291dCkKKyAgbGliID0gJ0FuZHJvaWQnCisgIGlmIHBhY2thZ2VfbmFtZToKKyAgICBsaWIgPSBwYWNrYWdlX25hbWUKKyAgcmV0dXJuIGYnPGZpbGUtbmFtZSBjb250ZW50SWQ9IiIgbGliPSJ7bGlifSI+e2ZpbGVfcGF0aH08L2ZpbGUtbmFtZT5cbicKKworCitkZWYgbmV3X2ZpbGVfY29udGVudF90YWcoKToKKyAgcGFzcworCisKK2RlZiBtYWluKCk6CisgIGdsb2JhbCBhcmdzCisgIGFyZ3MgPSBnZXRfYXJncygpCisgIGxvZygnQXJnczonLCB2YXJzKGFyZ3MpKQorCisgIHdpdGggb3BlbihhcmdzLm91dHB1dF9maWxlLCAndycsIGVuY29kaW5nPSJ1dGYtOCIpIGFzIG5vdGljZV94bWxfZmlsZToKKyAgICBub3RpY2VfeG1sX2ZpbGUud3JpdGUoRklMRV9IRUFERVIpCisgICAgbm90aWNlX3htbF9maWxlLndyaXRlKEZJTEVfRk9PVEVSKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIG1haW4oKQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2JvbS9nZW5fc2JvbS5weSBiL3Rvb2xzL3Nib20vZ2VuX3Nib20ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMzYThiZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Nib20vZ2VuX3Nib20ucHkKQEAgLTAsMCArMSw3NDAgQEAKKyMgIS91c3IvYmluL2VudiBweXRob24zCisjCisjIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisiIiIKK0dlbmVyYXRlIHRoZSBTQk9NIG9mIHRoZSBjdXJyZW50IHRhcmdldCBwcm9kdWN0IGluIFNQRFggZm9ybWF0LgorVXNhZ2UgZXhhbXBsZToKKyAgZ2VuX3Nib20ucHkgLS1vdXRwdXRfZmlsZSBvdXQvc29vbmcvc2JvbS9hb3NwX2NmX3g4Nl82NF9waG9uZS9zYm9tLnNwZHggXAorICAgICAgICAgICAgICAtLW1ldGFkYXRhIG91dC9zb29uZy9tZXRhZGF0YS9hb3NwX2NmX3g4Nl82NF9waG9uZS9tZXRhZGF0YS5kYiBcCisgICAgICAgICAgICAgIC0tcHJvZHVjdF9vdXQgb3V0L3RhcmdldC92c29jX3g4Nl82NAorICAgICAgICAgICAgICAtLXNvb25nX291dCBvdXQvc29vbmcKKyAgICAgICAgICAgICAgLS1idWlsZF92ZXJzaW9uICQoY2F0IG91dC90YXJnZXQvcHJvZHVjdC92c29jX3g4Nl82NC9idWlsZF9maW5nZXJwcmludC50eHQpIFwKKyAgICAgICAgICAgICAgLS1wcm9kdWN0X21mcj1Hb29nbGUKKyIiIgorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBjb21wbGlhbmNlX21ldGFkYXRhCitpbXBvcnQgZGF0ZXRpbWUKK2ltcG9ydCBnb29nbGUucHJvdG9idWYudGV4dF9mb3JtYXQgYXMgdGV4dF9mb3JtYXQKK2ltcG9ydCBoYXNobGliCitpbXBvcnQgb3MKK2ltcG9ydCBwYXRobGliCitpbXBvcnQgcXVldWUKK2ltcG9ydCBtZXRhZGF0YV9maWxlX3BiMgoraW1wb3J0IHNib21fZGF0YQoraW1wb3J0IHNib21fd3JpdGVycworCisjIFBhY2thZ2UgdHlwZQorUEtHX1NPVVJDRSA9ICdTT1VSQ0UnCitQS0dfVVBTVFJFQU0gPSAnVVBTVFJFQU0nCitQS0dfUFJFQlVJTFQgPSAnUFJFQlVJTFQnCisKKyMgU2VjdXJpdHkgdGFnCitOVkRfQ1BFMjMgPSAnTlZELUNQRTIuMzonCisKKyMgUmVwb3J0CitJU1NVRV9OT19NRVRBREFUQSA9ICdObyBtZXRhZGF0YSBnZW5lcmF0ZWQgaW4gTWFrZSBmb3IgaW5zdGFsbGVkIGZpbGVzOicKK0lTU1VFX05PX01FVEFEQVRBX0ZJTEUgPSAnTm8gTUVUQURBVEEgZmlsZSBmb3VuZCBmb3IgaW5zdGFsbGVkIGZpbGU6JworSVNTVUVfTUVUQURBVEFfRklMRV9JTkNPTVBMRVRFID0gJ01FVEFEQVRBIGZpbGUgaW5jb21wbGV0ZTonCitJU1NVRV9VTktOT1dOX1NFQ1VSSVRZX1RBR19UWVBFID0gJ1Vua25vd24gc2VjdXJpdHkgdGFnIHR5cGU6JworSVNTVUVfSU5TVEFMTEVEX0ZJTEVfTk9UX0VYSVNUID0gJ05vbi1leGlzdGVudCBpbnN0YWxsZWQgZmlsZXM6JworSVNTVUVfTk9fTU9EVUxFX0ZPVU5EX0ZPUl9TVEFUSUNfREVQID0gJ05vIG1vZHVsZSBmb3VuZCBmb3Igc3RhdGljIGRlcGVuZGVuY3kgZmlsZXM6JworSU5GT19NRVRBREFUQV9GT1VORF9GT1JfUEFDS0FHRSA9ICdNRVRBREFUQSBmaWxlIGZvdW5kIGZvciBwYWNrYWdlczonCisKK1NPT05HX1BSRUJVSUxUX01PRFVMRV9UWVBFUyA9IFsKKyAgICAnYW5kcm9pZF9hcHBfaW1wb3J0JywKKyAgICAnYW5kcm9pZF9saWJyYXJ5X2ltcG9ydCcsCisgICAgJ2NjX3ByZWJ1aWx0X2JpbmFyeScsCisgICAgJ2NjX3ByZWJ1aWx0X2xpYnJhcnknLAorICAgICdjY19wcmVidWlsdF9saWJyYXJ5X2hlYWRlcnMnLAorICAgICdjY19wcmVidWlsdF9saWJyYXJ5X3NoYXJlZCcsCisgICAgJ2NjX3ByZWJ1aWx0X2xpYnJhcnlfc3RhdGljJywKKyAgICAnY2NfcHJlYnVpbHRfb2JqZWN0JywKKyAgICAnZGV4X2ltcG9ydCcsCisgICAgJ2phdmFfaW1wb3J0JywKKyAgICAnamF2YV9zZGtfbGlicmFyeV9pbXBvcnQnLAorICAgICdqYXZhX3N5c3RlbV9tb2R1bGVzX2ltcG9ydCcsCisgICAgJ2xpYmNsYW5nX3J0X3ByZWJ1aWx0X2xpYnJhcnlfc3RhdGljJywKKyAgICAnbGliY2xhbmdfcnRfcHJlYnVpbHRfbGlicmFyeV9zaGFyZWQnLAorICAgICdsbHZtX3ByZWJ1aWx0X2xpYnJhcnlfc3RhdGljJywKKyAgICAnbmRrX3ByZWJ1aWx0X29iamVjdCcsCisgICAgJ25ka19wcmVidWlsdF9zaGFyZWRfc3RsJywKKyAgICAnbmtkX3ByZWJ1aWx0X3N0YXRpY19zdGwnLAorICAgICdwcmVidWlsdF9hcGV4JywKKyAgICAncHJlYnVpbHRfYm9vdGNsYXNzcGF0aF9mcmFnbWVudCcsCisgICAgJ3ByZWJ1aWx0X2RzcCcsCisgICAgJ3ByZWJ1aWx0X2Zpcm13YXJlJywKKyAgICAncHJlYnVpbHRfa2VybmVsX21vZHVsZXMnLAorICAgICdwcmVidWlsdF9yZnNhJywKKyAgICAncHJlYnVpbHRfcm9vdCcsCisgICAgJ3J1c3RfcHJlYnVpbHRfZHlsaWInLAorICAgICdydXN0X3ByZWJ1aWx0X2xpYnJhcnknLAorICAgICdydXN0X3ByZWJ1aWx0X3JsaWInLAorICAgICd2bmRrX3ByZWJ1aWx0X3NoYXJlZCcsCitdCisKK1RISVJEX1BBUlRZX0lERU5USUZJRVJfVFlQRVMgPSBbCisgICAgIyBUeXBlcyBkZWZpbmVkIGluIG1ldGFkYXRhX2ZpbGUucHJvdG8KKyAgICAnR2l0JywKKyAgICAnU1ZOJywKKyAgICAnSGcnLAorICAgICdEYXJjcycsCisgICAgJ1ZDUycsCisgICAgJ0FyY2hpdmUnLAorICAgICdQcmVidWlsdEJ5QWxwaGFiZXQnLAorICAgICdMb2NhbFNvdXJjZScsCisgICAgJ090aGVyJywKKyAgICAjIE9TViBlY29zeXN0ZW1zIGRlZmluZWQgYXQgaHR0cHM6Ly9vc3NmLmdpdGh1Yi5pby9vc3Ytc2NoZW1hLyNhZmZlY3RlZHBhY2thZ2UtZmllbGQuCisgICAgJ0dvJywKKyAgICAnbnBtJywKKyAgICAnT1NTLUZ1enonLAorICAgICdQeVBJJywKKyAgICAnUnVieUdlbXMnLAorICAgICdjcmF0ZXMuaW8nLAorICAgICdIYWNrYWdlJywKKyAgICAnR0hDJywKKyAgICAnUGFja2FnaXN0JywKKyAgICAnTWF2ZW4nLAorICAgICdOdUdldCcsCisgICAgJ0xpbnV4JywKKyAgICAnRGViaWFuJywKKyAgICAnQWxwaW5lJywKKyAgICAnSGV4JywKKyAgICAnQW5kcm9pZCcsCisgICAgJ0dpdEh1YiBBY3Rpb25zJywKKyAgICAnUHViJywKKyAgICAnQ29uYW5DZW50ZXInLAorICAgICdSb2NreSBMaW51eCcsCisgICAgJ0FsbWFMaW51eCcsCisgICAgJ0JpdG5hbWknLAorICAgICdQaG90b24gT1MnLAorICAgICdDUkFOJywKKyAgICAnQmlvY29uZHVjdG9yJywKKyAgICAnU3dpZnRVUkwnCitdCisKKworZGVmIGdldF9hcmdzKCk6CisgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXYnLCAnLS12ZXJib3NlJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVmYXVsdD1GYWxzZSwgaGVscD0nUHJpbnQgbW9yZSBpbmZvcm1hdGlvbi4nKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctZCcsICctLWRlYnVnJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVmYXVsdD1GYWxzZSwgaGVscD0nRGVidWcgbW9kZScpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tb3V0cHV0X2ZpbGUnLCByZXF1aXJlZD1UcnVlLCBoZWxwPSdUaGUgZ2VuZXJhdGVkIFNCT00gZmlsZSBpbiBTUERYIGZvcm1hdC4nKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLW1ldGFkYXRhJywgcmVxdWlyZWQ9VHJ1ZSwgaGVscD0nVGhlIG1ldGFkYXRhIERCIGZpbGUgcGF0aC4nKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXByb2R1Y3Rfb3V0JywgcmVxdWlyZWQ9VHJ1ZSwgaGVscD0nVGhlIHBhdGggb2YgUFJPRFVDVF9PVVQsIGUuZy4gb3V0L3RhcmdldC9wcm9kdWN0L3Zzb2NfeDg2XzY0LicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tc29vbmdfb3V0JywgcmVxdWlyZWQ9VHJ1ZSwgaGVscD0nVGhlIHBhdGggb2YgU29vbmcgb3V0cHV0IGRpcmVjdG9yeSwgZS5nLiBvdXQvc29vbmcnKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWJ1aWxkX3ZlcnNpb24nLCByZXF1aXJlZD1UcnVlLCBoZWxwPSdUaGUgYnVpbGQgdmVyc2lvbi4nKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXByb2R1Y3RfbWZyJywgcmVxdWlyZWQ9VHJ1ZSwgaGVscD0nVGhlIHByb2R1Y3QgbWFudWZhY3R1cmVyLicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tanNvbicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlZmF1bHQ9RmFsc2UsIGhlbHA9J0dlbmVyYXRlZCBTQk9NIGZpbGUgaW4gU1BEWCBKU09OIGZvcm1hdCcpCisKKyAgcmV0dXJuIHBhcnNlci5wYXJzZV9hcmdzKCkKKworCitkZWYgbG9nKCppbmZvKToKKyAgaWYgYXJncy52ZXJib3NlOgorICAgIGZvciBpIGluIGluZm86CisgICAgICBwcmludChpKQorCisKK2RlZiBuZXdfcGFja2FnZV9pZChwYWNrYWdlX25hbWUsIHR5cGUpOgorICByZXR1cm4gZidTUERYUmVmLXt0eXBlfS17c2JvbV9kYXRhLmVuY29kZV9mb3Jfc3BkeGlkKHBhY2thZ2VfbmFtZSl9JworCisKK2RlZiBuZXdfZmlsZV9pZChmaWxlX3BhdGgpOgorICByZXR1cm4gZidTUERYUmVmLXtzYm9tX2RhdGEuZW5jb2RlX2Zvcl9zcGR4aWQoZmlsZV9wYXRoKX0nCisKKworZGVmIG5ld19saWNlbnNlX2lkKGxpY2Vuc2VfbmFtZSk6CisgIHJldHVybiBmJ0xpY2Vuc2VSZWYte3Nib21fZGF0YS5lbmNvZGVfZm9yX3NwZHhpZChsaWNlbnNlX25hbWUpfScKKworCitkZWYgY2hlY2tzdW0oZmlsZV9wYXRoKToKKyAgaCA9IGhhc2hsaWIuc2hhMSgpCisgIGlmIG9zLnBhdGguaXNsaW5rKGZpbGVfcGF0aCk6CisgICAgaC51cGRhdGUob3MucmVhZGxpbmsoZmlsZV9wYXRoKS5lbmNvZGUoJ3V0Zi04JykpCisgIGVsc2U6CisgICAgd2l0aCBvcGVuKGZpbGVfcGF0aCwgJ3JiJykgYXMgZjoKKyAgICAgIGgudXBkYXRlKGYucmVhZCgpKQorICByZXR1cm4gZidTSEExOiB7aC5oZXhkaWdlc3QoKX0nCisKKworZGVmIGlzX3Nvb25nX3ByZWJ1aWx0X21vZHVsZShmaWxlX21ldGFkYXRhKToKKyAgcmV0dXJuIChmaWxlX21ldGFkYXRhWydzb29uZ19tb2R1bGVfdHlwZSddIGFuZAorICAgICAgICAgIGZpbGVfbWV0YWRhdGFbJ3Nvb25nX21vZHVsZV90eXBlJ10gaW4gU09PTkdfUFJFQlVJTFRfTU9EVUxFX1RZUEVTKQorCisKK2RlZiBpc19zb3VyY2VfcGFja2FnZShmaWxlX21ldGFkYXRhKToKKyAgbW9kdWxlX3BhdGggPSBmaWxlX21ldGFkYXRhWydtb2R1bGVfcGF0aCddCisgIHJldHVybiBtb2R1bGVfcGF0aC5zdGFydHN3aXRoKCdleHRlcm5hbC8nKSBhbmQgbm90IGlzX3ByZWJ1aWx0X3BhY2thZ2UoZmlsZV9tZXRhZGF0YSkKKworCitkZWYgaXNfcHJlYnVpbHRfcGFja2FnZShmaWxlX21ldGFkYXRhKToKKyAgbW9kdWxlX3BhdGggPSBmaWxlX21ldGFkYXRhWydtb2R1bGVfcGF0aCddCisgIGlmIG1vZHVsZV9wYXRoOgorICAgIHJldHVybiAobW9kdWxlX3BhdGguc3RhcnRzd2l0aCgncHJlYnVpbHRzLycpIG9yCisgICAgICAgICAgICBpc19zb29uZ19wcmVidWlsdF9tb2R1bGUoZmlsZV9tZXRhZGF0YSkgb3IKKyAgICAgICAgICAgIGZpbGVfbWV0YWRhdGFbJ2lzX3ByZWJ1aWx0X21ha2VfbW9kdWxlJ10pCisKKyAga2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzID0gZmlsZV9tZXRhZGF0YVsna2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzJ10KKyAgaWYga2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzIGFuZCBub3Qga2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzLnN0YXJ0c3dpdGgoJ0FORFJPSUQtR0VOOicpOgorICAgIHJldHVybiBUcnVlCisKKyAgcmV0dXJuIEZhbHNlCisKKworZGVmIGdldF9zb3VyY2VfcGFja2FnZV9pbmZvKGZpbGVfbWV0YWRhdGEsIG1ldGFkYXRhX2ZpbGVfcGF0aCk6CisgICIiIlJldHVybiBzb3VyY2UgcGFja2FnZSBpbmZvIGV4aXN0cyBpbiBpdHMgTUVUQURBVEEgZmlsZSwgY3VycmVudGx5IGluY2x1ZGluZyBuYW1lLCBzZWN1cml0eSB0YWcKKyAgYW5kIGV4dGVybmFsIFNCT00gcmVmZXJlbmNlLgorCisgIFNlZSBnby9hbmRyb2lkLXNwZHggYW5kIGdvL2FuZHJvaWQtc2JvbS1nZW4gZm9yIG1vcmUgZGV0YWlscy4KKyAgIiIiCisgIGlmIG5vdCBtZXRhZGF0YV9maWxlX3BhdGg6CisgICAgcmV0dXJuIGZpbGVfbWV0YWRhdGFbJ21vZHVsZV9wYXRoJ10sIFtdCisKKyAgbWV0YWRhdGFfcHJvdG8gPSBtZXRhZGF0YV9maWxlX3Byb3Rvc1ttZXRhZGF0YV9maWxlX3BhdGhdCisgIGV4dGVybmFsX3JlZnMgPSBbXQorICBmb3IgdGFnIGluIG1ldGFkYXRhX3Byb3RvLnRoaXJkX3BhcnR5LnNlY3VyaXR5LnRhZzoKKyAgICBpZiB0YWcubG93ZXIoKS5zdGFydHN3aXRoKChOVkRfQ1BFMjMgKyAnY3BlOjIuMzonKS5sb3dlcigpKToKKyAgICAgIGV4dGVybmFsX3JlZnMuYXBwZW5kKAorICAgICAgICAgIHNib21fZGF0YS5QYWNrYWdlRXh0ZXJuYWxSZWYoY2F0ZWdvcnk9c2JvbV9kYXRhLlBhY2thZ2VFeHRlcm5hbFJlZkNhdGVnb3J5LlNFQ1VSSVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1zYm9tX2RhdGEuUGFja2FnZUV4dGVybmFsUmVmVHlwZS5jcGUyM1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdG9yPXRhZy5yZW1vdmVwcmVmaXgoTlZEX0NQRTIzKSkpCisgICAgZWxpZiB0YWcubG93ZXIoKS5zdGFydHN3aXRoKChOVkRfQ1BFMjMgKyAnY3BlOi8nKS5sb3dlcigpKToKKyAgICAgIGV4dGVybmFsX3JlZnMuYXBwZW5kKAorICAgICAgICAgIHNib21fZGF0YS5QYWNrYWdlRXh0ZXJuYWxSZWYoY2F0ZWdvcnk9c2JvbV9kYXRhLlBhY2thZ2VFeHRlcm5hbFJlZkNhdGVnb3J5LlNFQ1VSSVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1zYm9tX2RhdGEuUGFja2FnZUV4dGVybmFsUmVmVHlwZS5jcGUyMlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdG9yPXRhZy5yZW1vdmVwcmVmaXgoTlZEX0NQRTIzKSkpCisKKyAgaWYgbWV0YWRhdGFfcHJvdG8ubmFtZToKKyAgICByZXR1cm4gbWV0YWRhdGFfcHJvdG8ubmFtZSwgZXh0ZXJuYWxfcmVmcworICBlbHNlOgorICAgIHJldHVybiBvcy5wYXRoLmJhc2VuYW1lKG1ldGFkYXRhX2ZpbGVfcGF0aCksIGV4dGVybmFsX3JlZnMgICMgcmV0dXJuIHRoZSBkaXJlY3RvcnkgbmFtZSBvbmx5IGFzIHBhY2thZ2UgbmFtZQorCisKK2RlZiBnZXRfcHJlYnVpbHRfcGFja2FnZV9uYW1lKGZpbGVfbWV0YWRhdGEsIG1ldGFkYXRhX2ZpbGVfcGF0aCk6CisgICIiIlJldHVybiBuYW1lIG9mIGEgcHJlYnVpbHQgcGFja2FnZSwgd2hpY2ggY2FuIGJlIGZyb20gdGhlIE1FVEFEQVRBIGZpbGUsIG1ldGFkYXRhIGZpbGUgcGF0aCwKKyAgbW9kdWxlIHBhdGggb3Iga2VybmVsIG1vZHVsZSdzIHNvdXJjZSBwYXRoIGlmIHRoZSBpbnN0YWxsZWQgZmlsZSBpcyBhIGtlcm5lbCBtb2R1bGUuCisKKyAgU2VlIGdvL2FuZHJvaWQtc3BkeCBhbmQgZ28vYW5kcm9pZC1zYm9tLWdlbiBmb3IgbW9yZSBkZXRhaWxzLgorICAiIiIKKyAgbmFtZSA9IE5vbmUKKyAgaWYgbWV0YWRhdGFfZmlsZV9wYXRoOgorICAgIG1ldGFkYXRhX3Byb3RvID0gbWV0YWRhdGFfZmlsZV9wcm90b3NbbWV0YWRhdGFfZmlsZV9wYXRoXQorICAgIGlmIG1ldGFkYXRhX3Byb3RvLm5hbWU6CisgICAgICBuYW1lID0gbWV0YWRhdGFfcHJvdG8ubmFtZQorICAgIGVsc2U6CisgICAgICBuYW1lID0gbWV0YWRhdGFfZmlsZV9wYXRoCisgIGVsaWYgZmlsZV9tZXRhZGF0YVsnbW9kdWxlX3BhdGgnXToKKyAgICBuYW1lID0gZmlsZV9tZXRhZGF0YVsnbW9kdWxlX3BhdGgnXQorICBlbGlmIGZpbGVfbWV0YWRhdGFbJ2tlcm5lbF9tb2R1bGVfY29weV9maWxlcyddOgorICAgIHNyY19wYXRoID0gZmlsZV9tZXRhZGF0YVsna2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzJ10uc3BsaXQoJzonKVswXQorICAgIG5hbWUgPSBvcy5wYXRoLmRpcm5hbWUoc3JjX3BhdGgpCisKKyAgcmV0dXJuIG5hbWUucmVtb3ZlcHJlZml4KCdwcmVidWlsdHMvJykucmVwbGFjZSgnLycsICctJykKKworCitkZWYgZ2V0X21ldGFkYXRhX2ZpbGVfcGF0aChmaWxlX21ldGFkYXRhKToKKyAgIiIiU2VhcmNoIGZvciBNRVRBREFUQSBmaWxlIG9mIGEgcGFja2FnZSBhbmQgcmV0dXJuIGl0cyBwYXRoLiIiIgorICBtZXRhZGF0YV9wYXRoID0gJycKKyAgaWYgZmlsZV9tZXRhZGF0YVsnbW9kdWxlX3BhdGgnXToKKyAgICBtZXRhZGF0YV9wYXRoID0gZmlsZV9tZXRhZGF0YVsnbW9kdWxlX3BhdGgnXQorICBlbGlmIGZpbGVfbWV0YWRhdGFbJ2tlcm5lbF9tb2R1bGVfY29weV9maWxlcyddOgorICAgIG1ldGFkYXRhX3BhdGggPSBvcy5wYXRoLmRpcm5hbWUoZmlsZV9tZXRhZGF0YVsna2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzJ10uc3BsaXQoJzonKVswXSkKKworICB3aGlsZSBtZXRhZGF0YV9wYXRoIGFuZCBub3Qgb3MucGF0aC5leGlzdHMobWV0YWRhdGFfcGF0aCArICcvTUVUQURBVEEnKToKKyAgICBtZXRhZGF0YV9wYXRoID0gb3MucGF0aC5kaXJuYW1lKG1ldGFkYXRhX3BhdGgpCisKKyAgcmV0dXJuIG1ldGFkYXRhX3BhdGgKKworCitkZWYgZ2V0X3BhY2thZ2VfdmVyc2lvbihtZXRhZGF0YV9maWxlX3BhdGgpOgorICAiIiJSZXR1cm4gYSBwYWNrYWdlJ3MgdmVyc2lvbiBpbiBpdHMgTUVUQURBVEEgZmlsZS4iIiIKKyAgaWYgbm90IG1ldGFkYXRhX2ZpbGVfcGF0aDoKKyAgICByZXR1cm4gTm9uZQorICBtZXRhZGF0YV9wcm90byA9IG1ldGFkYXRhX2ZpbGVfcHJvdG9zW21ldGFkYXRhX2ZpbGVfcGF0aF0KKyAgcmV0dXJuIG1ldGFkYXRhX3Byb3RvLnRoaXJkX3BhcnR5LnZlcnNpb24KKworCitkZWYgZ2V0X3BhY2thZ2VfaG9tZXBhZ2UobWV0YWRhdGFfZmlsZV9wYXRoKToKKyAgIiIiUmV0dXJuIGEgcGFja2FnZSdzIGhvbWVwYWdlIFVSTCBpbiBpdHMgTUVUQURBVEEgZmlsZS4iIiIKKyAgaWYgbm90IG1ldGFkYXRhX2ZpbGVfcGF0aDoKKyAgICByZXR1cm4gTm9uZQorICBtZXRhZGF0YV9wcm90byA9IG1ldGFkYXRhX2ZpbGVfcHJvdG9zW21ldGFkYXRhX2ZpbGVfcGF0aF0KKyAgaWYgbWV0YWRhdGFfcHJvdG8udGhpcmRfcGFydHkuaG9tZXBhZ2U6CisgICAgcmV0dXJuIG1ldGFkYXRhX3Byb3RvLnRoaXJkX3BhcnR5LmhvbWVwYWdlCisgIGZvciB1cmwgaW4gbWV0YWRhdGFfcHJvdG8udGhpcmRfcGFydHkudXJsOgorICAgIGlmIHVybC50eXBlID09IG1ldGFkYXRhX2ZpbGVfcGIyLlVSTC5UeXBlLkhPTUVQQUdFOgorICAgICAgcmV0dXJuIHVybC52YWx1ZQorCisgIHJldHVybiBOb25lCisKKworZGVmIGdldF9wYWNrYWdlX2Rvd25sb2FkX2xvY2F0aW9uKG1ldGFkYXRhX2ZpbGVfcGF0aCk6CisgICIiIlJldHVybiBhIHBhY2thZ2UncyBjb2RlIHJlcG9zaXRvcnkgVVJMIGluIGl0cyBNRVRBREFUQSBmaWxlLiIiIgorICBpZiBub3QgbWV0YWRhdGFfZmlsZV9wYXRoOgorICAgIHJldHVybiBOb25lCisgIG1ldGFkYXRhX3Byb3RvID0gbWV0YWRhdGFfZmlsZV9wcm90b3NbbWV0YWRhdGFfZmlsZV9wYXRoXQorICBpZiBtZXRhZGF0YV9wcm90by50aGlyZF9wYXJ0eS51cmw6CisgICAgdXJscyA9IHNvcnRlZChtZXRhZGF0YV9wcm90by50aGlyZF9wYXJ0eS51cmwsIGtleT1sYW1iZGEgdXJsOiB1cmwudHlwZSkKKyAgICBpZiB1cmxzWzBdLnR5cGUgIT0gbWV0YWRhdGFfZmlsZV9wYjIuVVJMLlR5cGUuSE9NRVBBR0U6CisgICAgICByZXR1cm4gdXJsc1swXS52YWx1ZQorICAgIGVsaWYgbGVuKHVybHMpID4gMToKKyAgICAgIHJldHVybiB1cmxzWzFdLnZhbHVlCisKKyAgcmV0dXJuIE5vbmUKKworCitkZWYgZ2V0X2xpY2Vuc2VfdGV4dChsaWNlbnNlX2ZpbGVzKToKKyAgbGljZW5zZV90ZXh0ID0gJycKKyAgZm9yIGxpY2Vuc2VfZmlsZSBpbiBsaWNlbnNlX2ZpbGVzOgorICAgIGlmIGFyZ3MuZGVidWc6CisgICAgICBsaWNlbnNlX3RleHQgKz0gJyMjIyMgQ29udGVudCBmcm9tICcgKyBsaWNlbnNlX2ZpbGUgKyAnXG4nCisgICAgZWxzZToKKyAgICAgIGxpY2Vuc2VfdGV4dCArPSBwYXRobGliLlBhdGgobGljZW5zZV9maWxlKS5yZWFkX3RleHQoZXJyb3JzPSdyZXBsYWNlJykgKyAnXG5cbicKKyAgcmV0dXJuIGxpY2Vuc2VfdGV4dAorCisKK2RlZiBnZXRfc2JvbV9mcmFnbWVudHMoaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGEsIG1ldGFkYXRhX2ZpbGVfcGF0aCk6CisgICIiIlJldHVybiBTUERYIGZyYWdtZW50IG9mIHNvdXJjZS9wcmVidWlsdCBwYWNrYWdlcywgd2hpY2ggdXN1YWxseSBjb250YWlucyBhIFNPVVJDRS9QUkVCVUlMVAorICBwYWNrYWdlLCBhIFVQU1RSRUFNIHBhY2thZ2UgYW5kIGFuIGV4dGVybmFsIFNCT00gZG9jdW1lbnQgcmVmZXJlbmNlIGlmIHNib21fcmVmIGRlZmluZWQgaW4gaXRzCisgIE1FVEFEQVRBIGZpbGUuCisKKyAgU2VlIGdvL2FuZHJvaWQtc3BkeCBhbmQgZ28vYW5kcm9pZC1zYm9tLWdlbiBmb3IgbW9yZSBkZXRhaWxzLgorICAiIiIKKyAgZXh0ZXJuYWxfZG9jX3JlZiA9IE5vbmUKKyAgcGFja2FnZXMgPSBbXQorICByZWxhdGlvbnNoaXBzID0gW10KKyAgbGljZW5zZXMgPSBbXQorCisgICMgSW5mbyBmcm9tIE1FVEFEQVRBIGZpbGUKKyAgaG9tZXBhZ2UgPSBnZXRfcGFja2FnZV9ob21lcGFnZShtZXRhZGF0YV9maWxlX3BhdGgpCisgIHZlcnNpb24gPSBnZXRfcGFja2FnZV92ZXJzaW9uKG1ldGFkYXRhX2ZpbGVfcGF0aCkKKyAgZG93bmxvYWRfbG9jYXRpb24gPSBnZXRfcGFja2FnZV9kb3dubG9hZF9sb2NhdGlvbihtZXRhZGF0YV9maWxlX3BhdGgpCisKKyAgbGljcyA9IGRiLmdldF9wYWNrYWdlX2xpY2Vuc2VzKGluc3RhbGxlZF9maWxlX21ldGFkYXRhWydtb2R1bGVfcGF0aCddKQorICBpZiBub3QgbGljczoKKyAgICBsaWNzID0gZGIuZ2V0X3BhY2thZ2VfbGljZW5zZXMobWV0YWRhdGFfZmlsZV9wYXRoKQorCisgIGlmIGxpY3M6CisgICAgZm9yIGxpY2Vuc2VfbmFtZSwgbGljZW5zZV9maWxlcyBpbiBsaWNzLml0ZW1zKCk6CisgICAgICBpZiBub3QgbGljZW5zZV9maWxlczoKKyAgICAgICAgY29udGludWUKKyAgICAgIGxpY2Vuc2VfaWQgPSBuZXdfbGljZW5zZV9pZChsaWNlbnNlX25hbWUpCisgICAgICBpZiBsaWNlbnNlX25hbWUgbm90IGluIGxpY2Vuc2VzX3RleHQ6CisgICAgICAgIGxpY2Vuc2VzX3RleHRbbGljZW5zZV9uYW1lXSA9IGdldF9saWNlbnNlX3RleHQobGljZW5zZV9maWxlcy5zcGxpdCgnICcpKQorICAgICAgbGljZW5zZXMuYXBwZW5kKHNib21fZGF0YS5MaWNlbnNlKGlkPWxpY2Vuc2VfaWQsIG5hbWU9bGljZW5zZV9uYW1lLCB0ZXh0PWxpY2Vuc2VzX3RleHRbbGljZW5zZV9uYW1lXSkpCisKKyAgaWYgaXNfc291cmNlX3BhY2thZ2UoaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGEpOgorICAgICMgU291cmNlIGZvcmsgcGFja2FnZXMKKyAgICBuYW1lLCBleHRlcm5hbF9yZWZzID0gZ2V0X3NvdXJjZV9wYWNrYWdlX2luZm8oaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGEsIG1ldGFkYXRhX2ZpbGVfcGF0aCkKKyAgICBzb3VyY2VfcGFja2FnZV9pZCA9IG5ld19wYWNrYWdlX2lkKG5hbWUsIFBLR19TT1VSQ0UpCisgICAgc291cmNlX3BhY2thZ2UgPSBzYm9tX2RhdGEuUGFja2FnZShpZD1zb3VyY2VfcGFja2FnZV9pZCwgbmFtZT1uYW1lLCB2ZXJzaW9uPWFyZ3MuYnVpbGRfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2xvY2F0aW9uPXNib21fZGF0YS5WQUxVRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZXI9J09yZ2FuaXphdGlvbjogJyArIGFyZ3MucHJvZHVjdF9tZnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbF9yZWZzPWV4dGVybmFsX3JlZnMpCisKKyAgICB1cHN0cmVhbV9wYWNrYWdlX2lkID0gbmV3X3BhY2thZ2VfaWQobmFtZSwgUEtHX1VQU1RSRUFNKQorICAgIHVwc3RyZWFtX3BhY2thZ2UgPSBzYm9tX2RhdGEuUGFja2FnZShpZD11cHN0cmVhbV9wYWNrYWdlX2lkLCBuYW1lPW5hbWUsIHZlcnNpb249dmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZXI9KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnT3JnYW5pemF0aW9uOiAnICsgaG9tZXBhZ2UpIGlmIGhvbWVwYWdlIGVsc2Ugc2JvbV9kYXRhLlZBTFVFX05PQVNTRVJUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9sb2NhdGlvbj1kb3dubG9hZF9sb2NhdGlvbikKKyAgICBwYWNrYWdlcyArPSBbc291cmNlX3BhY2thZ2UsIHVwc3RyZWFtX3BhY2thZ2VdCisgICAgcmVsYXRpb25zaGlwcy5hcHBlbmQoc2JvbV9kYXRhLlJlbGF0aW9uc2hpcChpZDE9c291cmNlX3BhY2thZ2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9c2JvbV9kYXRhLlJlbGF0aW9uc2hpcFR5cGUuVkFSSUFOVF9PRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkMj11cHN0cmVhbV9wYWNrYWdlX2lkKSkKKworICAgIGZvciBsaWNlbnNlIGluIGxpY2Vuc2VzOgorICAgICAgc291cmNlX3BhY2thZ2UuZGVjbGFyZWRfbGljZW5zZV9pZHMuYXBwZW5kKGxpY2Vuc2UuaWQpCisgICAgICB1cHN0cmVhbV9wYWNrYWdlLmRlY2xhcmVkX2xpY2Vuc2VfaWRzLmFwcGVuZChsaWNlbnNlLmlkKQorCisgIGVsaWYgaXNfcHJlYnVpbHRfcGFja2FnZShpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YSk6CisgICAgIyBQcmVidWlsdCBmb3JrIHBhY2thZ2VzCisgICAgbmFtZSA9IGdldF9wcmVidWlsdF9wYWNrYWdlX25hbWUoaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGEsIG1ldGFkYXRhX2ZpbGVfcGF0aCkKKyAgICBwcmVidWlsdF9wYWNrYWdlX2lkID0gbmV3X3BhY2thZ2VfaWQobmFtZSwgUEtHX1BSRUJVSUxUKQorICAgIHByZWJ1aWx0X3BhY2thZ2UgPSBzYm9tX2RhdGEuUGFja2FnZShpZD1wcmVidWlsdF9wYWNrYWdlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2xvY2F0aW9uPXNib21fZGF0YS5WQUxVRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXZlcnNpb24gaWYgdmVyc2lvbiBlbHNlIGFyZ3MuYnVpbGRfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZXI9J09yZ2FuaXphdGlvbjogJyArIGFyZ3MucHJvZHVjdF9tZnIpCisKKyAgICB1cHN0cmVhbV9wYWNrYWdlX2lkID0gbmV3X3BhY2thZ2VfaWQobmFtZSwgUEtHX1VQU1RSRUFNKQorICAgIHVwc3RyZWFtX3BhY2thZ2UgPSBzYm9tX2RhdGEuUGFja2FnZShpZD11cHN0cmVhbV9wYWNrYWdlX2lkLCBuYW1lPW5hbWUsIHZlcnNpb249dmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZXI9KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnT3JnYW5pemF0aW9uOiAnICsgaG9tZXBhZ2UpIGlmIGhvbWVwYWdlIGVsc2Ugc2JvbV9kYXRhLlZBTFVFX05PQVNTRVJUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9sb2NhdGlvbj1kb3dubG9hZF9sb2NhdGlvbikKKyAgICBwYWNrYWdlcyArPSBbcHJlYnVpbHRfcGFja2FnZSwgdXBzdHJlYW1fcGFja2FnZV0KKyAgICByZWxhdGlvbnNoaXBzLmFwcGVuZChzYm9tX2RhdGEuUmVsYXRpb25zaGlwKGlkMT1wcmVidWlsdF9wYWNrYWdlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwPXNib21fZGF0YS5SZWxhdGlvbnNoaXBUeXBlLlZBUklBTlRfT0YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDI9dXBzdHJlYW1fcGFja2FnZV9pZCkpCisgICAgZm9yIGxpY2Vuc2UgaW4gbGljZW5zZXM6CisgICAgICBwcmVidWlsdF9wYWNrYWdlLmRlY2xhcmVkX2xpY2Vuc2VfaWRzLmFwcGVuZChsaWNlbnNlLmlkKQorICAgICAgdXBzdHJlYW1fcGFja2FnZS5kZWNsYXJlZF9saWNlbnNlX2lkcy5hcHBlbmQobGljZW5zZS5pZCkKKworICBpZiBtZXRhZGF0YV9maWxlX3BhdGg6CisgICAgbWV0YWRhdGFfcHJvdG8gPSBtZXRhZGF0YV9maWxlX3Byb3Rvc1ttZXRhZGF0YV9maWxlX3BhdGhdCisgICAgaWYgbWV0YWRhdGFfcHJvdG8udGhpcmRfcGFydHkuV2hpY2hPbmVvZignc2JvbScpID09ICdzYm9tX3JlZic6CisgICAgICBzYm9tX3VybCA9IG1ldGFkYXRhX3Byb3RvLnRoaXJkX3BhcnR5LnNib21fcmVmLnVybAorICAgICAgc2JvbV9jaGVja3N1bSA9IG1ldGFkYXRhX3Byb3RvLnRoaXJkX3BhcnR5LnNib21fcmVmLmNoZWNrc3VtCisgICAgICB1cHN0cmVhbV9lbGVtZW50X2lkID0gbWV0YWRhdGFfcHJvdG8udGhpcmRfcGFydHkuc2JvbV9yZWYuZWxlbWVudF9pZAorICAgICAgaWYgc2JvbV91cmwgYW5kIHNib21fY2hlY2tzdW0gYW5kIHVwc3RyZWFtX2VsZW1lbnRfaWQ6CisgICAgICAgIGRvY19yZWZfaWQgPSBmJ0RvY3VtZW50UmVmLXtQS0dfVVBTVFJFQU19LXtzYm9tX2RhdGEuZW5jb2RlX2Zvcl9zcGR4aWQobmFtZSl9JworICAgICAgICBleHRlcm5hbF9kb2NfcmVmID0gc2JvbV9kYXRhLkRvY3VtZW50RXh0ZXJuYWxSZWZlcmVuY2UoaWQ9ZG9jX3JlZl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyaT1zYm9tX3VybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc3VtPXNib21fY2hlY2tzdW0pCisgICAgICAgIHJlbGF0aW9uc2hpcHMuYXBwZW5kKAorICAgICAgICAgICAgc2JvbV9kYXRhLlJlbGF0aW9uc2hpcChpZDE9dXBzdHJlYW1fcGFja2FnZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwPXNib21fZGF0YS5SZWxhdGlvbnNoaXBUeXBlLlZBUklBTlRfT0YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkMj1kb2NfcmVmX2lkICsgJzonICsgdXBzdHJlYW1fZWxlbWVudF9pZCkpCisKKyAgcmV0dXJuIGV4dGVybmFsX2RvY19yZWYsIHBhY2thZ2VzLCByZWxhdGlvbnNoaXBzLCBsaWNlbnNlcworCisKK2RlZiBzYXZlX3JlcG9ydChyZXBvcnRfZmlsZV9wYXRoLCByZXBvcnQpOgorICB3aXRoIG9wZW4ocmVwb3J0X2ZpbGVfcGF0aCwgJ3cnLCBlbmNvZGluZz0ndXRmLTgnKSBhcyByZXBvcnRfZmlsZToKKyAgICBmb3IgdHlwZSwgaXNzdWVzIGluIHJlcG9ydC5pdGVtcygpOgorICAgICAgcmVwb3J0X2ZpbGUud3JpdGUodHlwZSArICdcbicpCisgICAgICBmb3IgaXNzdWUgaW4gaXNzdWVzOgorICAgICAgICByZXBvcnRfZmlsZS53cml0ZSgnXHQnICsgaXNzdWUgKyAnXG4nKQorICAgICAgcmVwb3J0X2ZpbGUud3JpdGUoJ1xuJykKKworCisjIFZhbGlkYXRlIHRoZSBtZXRhZGF0YSBnZW5lcmF0ZWQgYnkgTWFrZSBmb3IgaW5zdGFsbGVkIGZpbGVzIGFuZCByZXBvcnQgaWYgdGhlcmUgaXMgbm8gbWV0YWRhdGEuCitkZWYgaW5zdGFsbGVkX2ZpbGVfaGFzX21ldGFkYXRhKGluc3RhbGxlZF9maWxlX21ldGFkYXRhLCByZXBvcnQpOgorICBpbnN0YWxsZWRfZmlsZSA9IGluc3RhbGxlZF9maWxlX21ldGFkYXRhWydpbnN0YWxsZWRfZmlsZSddCisgIG1vZHVsZV9wYXRoID0gaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ21vZHVsZV9wYXRoJ10KKyAgcHJvZHVjdF9jb3B5X2ZpbGVzID0gaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ3Byb2R1Y3RfY29weV9maWxlcyddCisgIGtlcm5lbF9tb2R1bGVfY29weV9maWxlcyA9IGluc3RhbGxlZF9maWxlX21ldGFkYXRhWydrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMnXQorICBpc19wbGF0Zm9ybV9nZW5lcmF0ZWQgPSBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsnaXNfcGxhdGZvcm1fZ2VuZXJhdGVkJ10KKworICBpZiAobm90IG1vZHVsZV9wYXRoIGFuZAorICAgICAgbm90IHByb2R1Y3RfY29weV9maWxlcyBhbmQKKyAgICAgIG5vdCBrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMgYW5kCisgICAgICBub3QgaXNfcGxhdGZvcm1fZ2VuZXJhdGVkIGFuZAorICAgICAgbm90IGluc3RhbGxlZF9maWxlLmVuZHN3aXRoKCcuZnN2X21ldGEnKSk6CisgICAgcmVwb3J0W0lTU1VFX05PX01FVEFEQVRBXS5hcHBlbmQoaW5zdGFsbGVkX2ZpbGUpCisgICAgcmV0dXJuIEZhbHNlCisKKyAgcmV0dXJuIFRydWUKKworCisjIFZhbGlkYXRlIGlkZW50aWZpZXJzIGluIGEgcGFja2FnZSdzIE1FVEFEQVRBLgorIyAxKSBPbmx5IGtub3duIGlkZW50aWZpZXIgdHlwZSBpcyBhbGxvd2VkCisjIDIpIE9ubHkgb25lIGlkZW50aWZpZXIncyBwcmltYXJ5X3NvdXJjZSBjYW4gYmUgdHJ1ZQorZGVmIHZhbGlkYXRlX3BhY2thZ2VfbWV0YWRhdGEobWV0YWRhdGFfZmlsZV9wYXRoLCBwYWNrYWdlX21ldGFkYXRhKToKKyAgcHJpbWFyeV9zb3VyY2VfZm91bmQgPSBGYWxzZQorICBmb3IgaWRlbnRpZmllciBpbiBwYWNrYWdlX21ldGFkYXRhLnRoaXJkX3BhcnR5LmlkZW50aWZpZXI6CisgICAgaWYgaWRlbnRpZmllci50eXBlIG5vdCBpbiBUSElSRF9QQVJUWV9JREVOVElGSUVSX1RZUEVTOgorICAgICAgc3lzLmV4aXQoZidVbmtub3duIHZhbHVlIG9mIHRoaXJkX3BhcnR5LmlkZW50aWZpZXIudHlwZSBpbiB7bWV0YWRhdGFfZmlsZV9wYXRofS9NRVRBREFUQToge2lkZW50aWZpZXIudHlwZX0uJykKKyAgICBpZiBwcmltYXJ5X3NvdXJjZV9mb3VuZCBhbmQgaWRlbnRpZmllci5wcmltYXJ5X3NvdXJjZToKKyAgICAgIHN5cy5leGl0KAorICAgICAgICAgIGYnRmllbGQgInByaW1hcnlfc291cmNlIiBpcyBzZXQgdG8gdHJ1ZSBpbiBtdWx0aXBsZSB0aGlyZF9wYXJ0eS5pZGVudGlmaWVyIGluIHttZXRhZGF0YV9maWxlX3BhdGh9L01FVEFEQVRBLicpCisgICAgcHJpbWFyeV9zb3VyY2VfZm91bmQgPSBpZGVudGlmaWVyLnByaW1hcnlfc291cmNlCisKKworZGVmIHJlcG9ydF9tZXRhZGF0YV9maWxlKG1ldGFkYXRhX2ZpbGVfcGF0aCwgaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGEsIHJlcG9ydCk6CisgIGlmIG1ldGFkYXRhX2ZpbGVfcGF0aDoKKyAgICByZXBvcnRbSU5GT19NRVRBREFUQV9GT1VORF9GT1JfUEFDS0FHRV0uYXBwZW5kKAorICAgICAgICAnaW5zdGFsbGVkX2ZpbGU6IHt9LCBtb2R1bGVfcGF0aDoge30sIE1FVEFEQVRBIGZpbGU6IHt9Jy5mb3JtYXQoCisgICAgICAgICAgICBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsnaW5zdGFsbGVkX2ZpbGUnXSwKKyAgICAgICAgICAgIGluc3RhbGxlZF9maWxlX21ldGFkYXRhWydtb2R1bGVfcGF0aCddLAorICAgICAgICAgICAgbWV0YWRhdGFfZmlsZV9wYXRoICsgJy9NRVRBREFUQScpKQorCisgICAgcGFja2FnZV9tZXRhZGF0YSA9IG1ldGFkYXRhX2ZpbGVfcGIyLk1ldGFkYXRhKCkKKyAgICB3aXRoIG9wZW4obWV0YWRhdGFfZmlsZV9wYXRoICsgJy9NRVRBREFUQScsICdydCcpIGFzIGY6CisgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZShmLnJlYWQoKSwgcGFja2FnZV9tZXRhZGF0YSkKKworICAgIHZhbGlkYXRlX3BhY2thZ2VfbWV0YWRhdGEobWV0YWRhdGFfZmlsZV9wYXRoLCBwYWNrYWdlX21ldGFkYXRhKQorCisgICAgaWYgbm90IG1ldGFkYXRhX2ZpbGVfcGF0aCBpbiBtZXRhZGF0YV9maWxlX3Byb3RvczoKKyAgICAgIG1ldGFkYXRhX2ZpbGVfcHJvdG9zW21ldGFkYXRhX2ZpbGVfcGF0aF0gPSBwYWNrYWdlX21ldGFkYXRhCisgICAgICBpZiBub3QgcGFja2FnZV9tZXRhZGF0YS5uYW1lOgorICAgICAgICByZXBvcnRbSVNTVUVfTUVUQURBVEFfRklMRV9JTkNPTVBMRVRFXS5hcHBlbmQoZid7bWV0YWRhdGFfZmlsZV9wYXRofS9NRVRBREFUQSBkb2VzIG5vdCBoYXMgIm5hbWUiJykKKworICAgICAgaWYgbm90IHBhY2thZ2VfbWV0YWRhdGEudGhpcmRfcGFydHkudmVyc2lvbjoKKyAgICAgICAgcmVwb3J0W0lTU1VFX01FVEFEQVRBX0ZJTEVfSU5DT01QTEVURV0uYXBwZW5kKAorICAgICAgICAgICAgZid7bWV0YWRhdGFfZmlsZV9wYXRofS9NRVRBREFUQSBkb2VzIG5vdCBoYXMgInRoaXJkX3BhcnR5LnZlcnNpb24iJykKKworICAgICAgZm9yIHRhZyBpbiBwYWNrYWdlX21ldGFkYXRhLnRoaXJkX3BhcnR5LnNlY3VyaXR5LnRhZzoKKyAgICAgICAgaWYgbm90IHRhZy5zdGFydHN3aXRoKE5WRF9DUEUyMyk6CisgICAgICAgICAgcmVwb3J0W0lTU1VFX1VOS05PV05fU0VDVVJJVFlfVEFHX1RZUEVdLmFwcGVuZCgKKyAgICAgICAgICAgICAgZidVbmtub3duIHNlY3VyaXR5IHRhZyB0eXBlOiB7dGFnfSBpbiB7bWV0YWRhdGFfZmlsZV9wYXRofS9NRVRBREFUQScpCisgIGVsc2U6CisgICAgcmVwb3J0W0lTU1VFX05PX01FVEFEQVRBX0ZJTEVdLmFwcGVuZCgKKyAgICAgICAgImluc3RhbGxlZF9maWxlOiB7fSwgbW9kdWxlX3BhdGg6IHt9Ii5mb3JtYXQoCisgICAgICAgICAgICBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsnaW5zdGFsbGVkX2ZpbGUnXSwgaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ21vZHVsZV9wYXRoJ10pKQorCisKKyMgSWYgYSBmaWxlIGlzIGZyb20gYSBzb3VyY2UgZm9yayBvciBwcmVidWlsdCBmb3JrIHBhY2thZ2UsIGFkZCBpdHMgcGFja2FnZSBpbmZvcm1hdGlvbiB0byBTQk9NCitkZWYgYWRkX3BhY2thZ2Vfb2ZfZmlsZShmaWxlX2lkLCBmaWxlX21ldGFkYXRhLCBkb2MsIHJlcG9ydCk6CisgIG1ldGFkYXRhX2ZpbGVfcGF0aCA9IGdldF9tZXRhZGF0YV9maWxlX3BhdGgoZmlsZV9tZXRhZGF0YSkKKyAgcmVwb3J0X21ldGFkYXRhX2ZpbGUobWV0YWRhdGFfZmlsZV9wYXRoLCBmaWxlX21ldGFkYXRhLCByZXBvcnQpCisKKyAgZXh0ZXJuYWxfZG9jX3JlZiwgcGtncywgcmVscywgbGljZW5zZXMgPSBnZXRfc2JvbV9mcmFnbWVudHMoZmlsZV9tZXRhZGF0YSwgbWV0YWRhdGFfZmlsZV9wYXRoKQorICBpZiBsZW4ocGtncykgPiAwOgorICAgIGlmIGV4dGVybmFsX2RvY19yZWY6CisgICAgICBkb2MuYWRkX2V4dGVybmFsX3JlZihleHRlcm5hbF9kb2NfcmVmKQorICAgIGZvciBwIGluIHBrZ3M6CisgICAgICBkb2MuYWRkX3BhY2thZ2UocCkKKyAgICBmb3IgcmVsIGluIHJlbHM6CisgICAgICBkb2MuYWRkX3JlbGF0aW9uc2hpcChyZWwpCisgICAgZm9ya19wYWNrYWdlX2lkID0gcGtnc1swXS5pZCAgIyBUaGUgZmlyc3QgcGFja2FnZSBzaG91bGQgYmUgdGhlIHNvdXJjZS9wcmVidWlsdCBmb3JrIHBhY2thZ2UKKyAgICBkb2MuYWRkX3JlbGF0aW9uc2hpcChzYm9tX2RhdGEuUmVsYXRpb25zaGlwKGlkMT1maWxlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwPXNib21fZGF0YS5SZWxhdGlvbnNoaXBUeXBlLkdFTkVSQVRFRF9GUk9NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQyPWZvcmtfcGFja2FnZV9pZCkpCisgICAgZm9yIGxpY2Vuc2UgaW4gbGljZW5zZXM6CisgICAgICBkb2MuYWRkX2xpY2Vuc2UobGljZW5zZSkKKworCisjIEFkZCBTVEFUSUNfTElOSyByZWxhdGlvbnNoaXAgZm9yIHN0YXRpYyBkZXBlbmRlbmNpZXMgb2YgYSBmaWxlCitkZWYgYWRkX3N0YXRpY19kZXBzX29mX2ZpbGUoZmlsZV9pZCwgZmlsZV9tZXRhZGF0YSwgZG9jKToKKyAgaWYgbm90IGZpbGVfbWV0YWRhdGFbJ3N0YXRpY19kZXBfZmlsZXMnXSBhbmQgbm90IGZpbGVfbWV0YWRhdGFbJ3dob2xlX3N0YXRpY19kZXBfZmlsZXMnXToKKyAgICByZXR1cm4KKyAgc3RhdGljX2RlcF9maWxlcyA9IFtdCisgIGlmIGZpbGVfbWV0YWRhdGFbJ3N0YXRpY19kZXBfZmlsZXMnXToKKyAgICBzdGF0aWNfZGVwX2ZpbGVzICs9IGZpbGVfbWV0YWRhdGFbJ3N0YXRpY19kZXBfZmlsZXMnXS5zcGxpdCgnICcpCisgIGlmIGZpbGVfbWV0YWRhdGFbJ3dob2xlX3N0YXRpY19kZXBfZmlsZXMnXToKKyAgICBzdGF0aWNfZGVwX2ZpbGVzICs9IGZpbGVfbWV0YWRhdGFbJ3dob2xlX3N0YXRpY19kZXBfZmlsZXMnXS5zcGxpdCgnICcpCisKKyAgZm9yIGRlcF9maWxlIGluIHN0YXRpY19kZXBfZmlsZXM6CisgICAgIyBTdGF0aWMgbGlicyBhcmUgbm90IHNoaXBwZWQgb24gZGV2aWNlcywgc28gbmFtZXMgYXJlIGRlcml2ZWQgZnJvbSAuaW50ZXJtZWRpYXRlcyBwYXRocy4KKyAgICBkb2MuYWRkX3JlbGF0aW9uc2hpcChzYm9tX2RhdGEuUmVsYXRpb25zaGlwKGlkMT1maWxlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwPXNib21fZGF0YS5SZWxhdGlvbnNoaXBUeXBlLlNUQVRJQ19MSU5LLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQyPW5ld19maWxlX2lkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBfZmlsZS5yZW1vdmVwcmVmaXgoYXJncy5zb29uZ19vdXQgKyAnLy5pbnRlcm1lZGlhdGVzLycpKSkpCisKKworZGVmIGFkZF9saWNlbnNlc19vZl9maWxlKGZpbGVfaWQsIGZpbGVfbWV0YWRhdGEsIGRvYyk6CisgIGxpY3MgPSBkYi5nZXRfbW9kdWxlX2xpY2Vuc2VzKGZpbGVfbWV0YWRhdGEuZ2V0KCduYW1lJywgJycpLCBmaWxlX21ldGFkYXRhWydtb2R1bGVfcGF0aCddKQorICBpZiBsaWNzOgorICAgIGZpbGUgPSBuZXh0KGYgZm9yIGYgaW4gZG9jLmZpbGVzIGlmIGZpbGVfaWQgPT0gZi5pZCkKKyAgICBmb3IgbGljZW5zZV9uYW1lLCBsaWNlbnNlX2ZpbGVzIGluIGxpY3MuaXRlbXMoKToKKyAgICAgIGlmIG5vdCBsaWNlbnNlX2ZpbGVzOgorICAgICAgICBjb250aW51ZQorICAgICAgbGljZW5zZV9pZCA9IG5ld19saWNlbnNlX2lkKGxpY2Vuc2VfbmFtZSkKKyAgICAgIGZpbGUuY29uY2x1ZGVkX2xpY2Vuc2VfaWRzLmFwcGVuZChsaWNlbnNlX2lkKQorICAgICAgaWYgbGljZW5zZV9uYW1lIG5vdCBpbiBsaWNlbnNlc190ZXh0OgorICAgICAgICBsaWNlbnNlX3RleHQgPSBnZXRfbGljZW5zZV90ZXh0KGxpY2Vuc2VfZmlsZXMuc3BsaXQoJyAnKSkKKyAgICAgICAgbGljZW5zZXNfdGV4dFtsaWNlbnNlX25hbWVdID0gbGljZW5zZV90ZXh0CisKKyAgICAgIGRvYy5hZGRfbGljZW5zZShzYm9tX2RhdGEuTGljZW5zZShpZD1saWNlbnNlX2lkLCBuYW1lPWxpY2Vuc2VfbmFtZSwgdGV4dD1saWNlbnNlc190ZXh0W2xpY2Vuc2VfbmFtZV0pKQorCisKK2RlZiBnZXRfYWxsX3RyYW5zaXRpdmVfc3RhdGljX2RlcF9maWxlc19vZl9pbnN0YWxsZWRfZmlsZXMoaW5zdGFsbGVkX2ZpbGVzX21ldGFkYXRhLCBkYiwgcmVwb3J0KToKKyAgIyBGaW5kIGFsbCB0cmFuc2l0aXZlIHN0YXRpYyBkZXAgZmlsZXMgb2YgYWxsIGluc3RhbGxlZCBmaWxlcworICBxID0gcXVldWUuUXVldWUoKQorICBmb3IgaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGEgaW4gaW5zdGFsbGVkX2ZpbGVzX21ldGFkYXRhOgorICAgIGlmIGluc3RhbGxlZF9maWxlX21ldGFkYXRhWydzdGF0aWNfZGVwX2ZpbGVzJ106CisgICAgICBmb3IgZiBpbiBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsnc3RhdGljX2RlcF9maWxlcyddLnNwbGl0KCcgJyk6CisgICAgICAgIHEucHV0KGYpCisgICAgaWYgaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ3dob2xlX3N0YXRpY19kZXBfZmlsZXMnXToKKyAgICAgIGZvciBmIGluIGluc3RhbGxlZF9maWxlX21ldGFkYXRhWyd3aG9sZV9zdGF0aWNfZGVwX2ZpbGVzJ10uc3BsaXQoJyAnKToKKyAgICAgICAgcS5wdXQoZikKKworICBhbGxfc3RhdGljX2RlcF9maWxlcyA9IHt9CisgIHdoaWxlIG5vdCBxLmVtcHR5KCk6CisgICAgZGVwX2ZpbGUgPSBxLmdldCgpCisgICAgaWYgZGVwX2ZpbGUgaW4gYWxsX3N0YXRpY19kZXBfZmlsZXM6CisgICAgICAjIEl0IGhhcyBiZWVuIHByb2Nlc3NlZAorICAgICAgY29udGludWUKKworICAgIGFsbF9zdGF0aWNfZGVwX2ZpbGVzW2RlcF9maWxlXSA9IFRydWUKKyAgICBzb29uZ19tb2R1bGUgPSBkYi5nZXRfc29vbmdfbW9kdWxlX29mX2J1aWx0X2ZpbGUoZGVwX2ZpbGUpCisgICAgaWYgbm90IHNvb25nX21vZHVsZToKKyAgICAgICMgVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYWRkIHRvIHJlcG9ydFtJU1NVRV9OT19NT0RVTEVfRk9VTkRfRk9SX1NUQVRJQ19ERVBdCisgICAgICByZXBvcnRbSVNTVUVfTk9fTU9EVUxFX0ZPVU5EX0ZPUl9TVEFUSUNfREVQXS5hcHBlbmQoZikKKyAgICAgIGNvbnRpbnVlCisKKyAgICBpZiBzb29uZ19tb2R1bGVbJ3N0YXRpY19kZXBfZmlsZXMnXToKKyAgICAgIGZvciBmIGluIHNvb25nX21vZHVsZVsnc3RhdGljX2RlcF9maWxlcyddLnNwbGl0KCcgJyk6CisgICAgICAgIGlmIGYgbm90IGluIGFsbF9zdGF0aWNfZGVwX2ZpbGVzOgorICAgICAgICAgIHEucHV0KGYpCisgICAgaWYgc29vbmdfbW9kdWxlWyd3aG9sZV9zdGF0aWNfZGVwX2ZpbGVzJ106CisgICAgICBmb3IgZiBpbiBzb29uZ19tb2R1bGVbJ3dob2xlX3N0YXRpY19kZXBfZmlsZXMnXS5zcGxpdCgnICcpOgorICAgICAgICBpZiBmIG5vdCBpbiBhbGxfc3RhdGljX2RlcF9maWxlczoKKyAgICAgICAgICBxLnB1dChmKQorCisgIHJldHVybiBzb3J0ZWQoYWxsX3N0YXRpY19kZXBfZmlsZXMua2V5cygpKQorCisKK2RlZiBtYWluKCk6CisgIGdsb2JhbCBhcmdzCisgIGFyZ3MgPSBnZXRfYXJncygpCisgIGxvZygnQXJnczonLCB2YXJzKGFyZ3MpKQorCisgIGdsb2JhbCBkYgorICBkYiA9IGNvbXBsaWFuY2VfbWV0YWRhdGEuTWV0YWRhdGFEYihhcmdzLm1ldGFkYXRhKQorICBpZiBhcmdzLmRlYnVnOgorICAgIGRiLmR1bXBfZGVidWdfZGIob3MucGF0aC5kaXJuYW1lKGFyZ3Mub3V0cHV0X2ZpbGUpICsgJy9jb21wbGlhbmNlLW1ldGFkYXRhLWRlYnVnLmRiJykKKworICBnbG9iYWwgbWV0YWRhdGFfZmlsZV9wcm90b3MKKyAgbWV0YWRhdGFfZmlsZV9wcm90b3MgPSB7fQorICBnbG9iYWwgbGljZW5zZXNfdGV4dAorICBsaWNlbnNlc190ZXh0ID0ge30KKworICBwcm9kdWN0X3BhY2thZ2VfaWQgPSBzYm9tX2RhdGEuU1BEWElEX1BST0RVQ1QKKyAgcHJvZHVjdF9wYWNrYWdlX25hbWUgPSBzYm9tX2RhdGEuUEFDS0FHRV9OQU1FX1BST0RVQ1QKKyAgcHJvZHVjdF9wYWNrYWdlID0gc2JvbV9kYXRhLlBhY2thZ2UoaWQ9cHJvZHVjdF9wYWNrYWdlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPXByb2R1Y3RfcGFja2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9sb2NhdGlvbj1zYm9tX2RhdGEuVkFMVUVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1hcmdzLmJ1aWxkX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVyPSdPcmdhbml6YXRpb246ICcgKyBhcmdzLnByb2R1Y3RfbWZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc19hbmFseXplZD1UcnVlKQorICBkb2NfbmFtZSA9IGFyZ3MuYnVpbGRfdmVyc2lvbgorICBkb2MgPSBzYm9tX2RhdGEuRG9jdW1lbnQobmFtZT1kb2NfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT1mJ2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20vc2JvbS9zcGR4L2FuZHJvaWQve2RvY19uYW1lfScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9ycz1bJ09yZ2FuaXphdGlvbjogJyArIGFyZ3MucHJvZHVjdF9tZnJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmVzPXByb2R1Y3RfcGFja2FnZV9pZCkKKworICBkb2MucGFja2FnZXMuYXBwZW5kKHByb2R1Y3RfcGFja2FnZSkKKyAgZG9jLnBhY2thZ2VzLmFwcGVuZChzYm9tX2RhdGEuUGFja2FnZShpZD1zYm9tX2RhdGEuU1BEWElEX1BMQVRGT1JNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9c2JvbV9kYXRhLlBBQ0tBR0VfTkFNRV9QTEFURk9STSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9sb2NhdGlvbj1zYm9tX2RhdGEuVkFMVUVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPWFyZ3MuYnVpbGRfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllcj0nT3JnYW5pemF0aW9uOiAnICsgYXJncy5wcm9kdWN0X21mciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZF9saWNlbnNlX2lkcz1bc2JvbV9kYXRhLlNQRFhJRF9MSUNFTlNFX0FQQUNIRV0pKQorCisgICMgUmVwb3J0IG9uIHNvbWUgaXNzdWVzIGFuZCBpbmZvcm1hdGlvbgorICByZXBvcnQgPSB7CisgICAgICBJU1NVRV9OT19NRVRBREFUQTogW10sCisgICAgICBJU1NVRV9OT19NRVRBREFUQV9GSUxFOiBbXSwKKyAgICAgIElTU1VFX01FVEFEQVRBX0ZJTEVfSU5DT01QTEVURTogW10sCisgICAgICBJU1NVRV9VTktOT1dOX1NFQ1VSSVRZX1RBR19UWVBFOiBbXSwKKyAgICAgIElTU1VFX0lOU1RBTExFRF9GSUxFX05PVF9FWElTVDogW10sCisgICAgICBJU1NVRV9OT19NT0RVTEVfRk9VTkRfRk9SX1NUQVRJQ19ERVA6IFtdLAorICAgICAgSU5GT19NRVRBREFUQV9GT1VORF9GT1JfUEFDS0FHRTogW10sCisgIH0KKworICAjIEdldCBpbnN0YWxsZWQgZmlsZXMgYW5kIGNvcnJlc3BvbmRpbmcgbWFrZSBtb2R1bGVzJyBtZXRhZGF0YSBpZiBhbiBpbnN0YWxsZWQgZmlsZSBpcyBmcm9tIGEgbWFrZSBtb2R1bGUuCisgIGluc3RhbGxlZF9maWxlc19tZXRhZGF0YSA9IGRiLmdldF9pbnN0YWxsZWRfZmlsZXMoKQorCisgICMgRmluZCB3aGljaCBTb29uZyBtb2R1bGUgYW4gaW5zdGFsbGVkIGZpbGUgaXMgZnJvbSBhbmQgbWVyZ2UgbWV0YWRhdGEgZnJvbSBNYWtlIGFuZCBTb29uZworICBmb3IgaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGEgaW4gaW5zdGFsbGVkX2ZpbGVzX21ldGFkYXRhOgorICAgIHNvb25nX21vZHVsZSA9IGRiLmdldF9zb29uZ19tb2R1bGVfb2ZfaW5zdGFsbGVkX2ZpbGUoaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ2luc3RhbGxlZF9maWxlJ10pCisgICAgaWYgc29vbmdfbW9kdWxlOgorICAgICAgIyBNZXJnZSBzb29uZyBtZXRhZGF0YSB0byBtYWtlIG1ldGFkYXRhCisgICAgICBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YS51cGRhdGUoc29vbmdfbW9kdWxlKQorICAgIGVsc2U6CisgICAgICAjIEZvciBtYWtlIG1vZHVsZXMgc29vbmdfbW9kdWxlX3R5cGUgc2hvdWxkIGJlIGVtcHR5CisgICAgICBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsnc29vbmdfbW9kdWxlX3R5cGUnXSA9ICcnCisgICAgICBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsnc3RhdGljX2RlcF9maWxlcyddID0gJycKKyAgICAgIGluc3RhbGxlZF9maWxlX21ldGFkYXRhWyd3aG9sZV9zdGF0aWNfZGVwX2ZpbGVzJ10gPSAnJworCisgICMgU2NhbiB0aGUgbWV0YWRhdGEgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBwYWNrYWdlIGFuZCBmaWxlIHJlY29yZHMgaW4gU1BEWAorICBmb3IgaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGEgaW4gaW5zdGFsbGVkX2ZpbGVzX21ldGFkYXRhOgorICAgIGluc3RhbGxlZF9maWxlID0gaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ2luc3RhbGxlZF9maWxlJ10KKyAgICBtb2R1bGVfcGF0aCA9IGluc3RhbGxlZF9maWxlX21ldGFkYXRhWydtb2R1bGVfcGF0aCddCisgICAgcHJvZHVjdF9jb3B5X2ZpbGVzID0gaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ3Byb2R1Y3RfY29weV9maWxlcyddCisgICAga2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzID0gaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ2tlcm5lbF9tb2R1bGVfY29weV9maWxlcyddCisgICAgYnVpbGRfb3V0cHV0X3BhdGggPSBpbnN0YWxsZWRfZmlsZQorICAgIGluc3RhbGxlZF9maWxlID0gaW5zdGFsbGVkX2ZpbGUucmVtb3ZlcHJlZml4KGFyZ3MucHJvZHVjdF9vdXQpCisKKyAgICBpZiBub3QgaW5zdGFsbGVkX2ZpbGVfaGFzX21ldGFkYXRhKGluc3RhbGxlZF9maWxlX21ldGFkYXRhLCByZXBvcnQpOgorICAgICAgY29udGludWUKKyAgICBpZiBub3QgKG9zLnBhdGguaXNsaW5rKGJ1aWxkX291dHB1dF9wYXRoKSBvciBvcy5wYXRoLmlzZmlsZShidWlsZF9vdXRwdXRfcGF0aCkpOgorICAgICAgcmVwb3J0W0lTU1VFX0lOU1RBTExFRF9GSUxFX05PVF9FWElTVF0uYXBwZW5kKGluc3RhbGxlZF9maWxlKQorICAgICAgY29udGludWUKKworICAgIGZpbGVfaWQgPSBuZXdfZmlsZV9pZChpbnN0YWxsZWRfZmlsZSkKKyAgICBzaGExID0gY2hlY2tzdW0oYnVpbGRfb3V0cHV0X3BhdGgpCisgICAgZiA9IHNib21fZGF0YS5GaWxlKGlkPWZpbGVfaWQsIG5hbWU9aW5zdGFsbGVkX2ZpbGUsIGNoZWNrc3VtPXNoYTEpCisgICAgZG9jLmZpbGVzLmFwcGVuZChmKQorICAgIHByb2R1Y3RfcGFja2FnZS5maWxlX2lkcy5hcHBlbmQoZmlsZV9pZCkKKworICAgIGlmIGlzX3NvdXJjZV9wYWNrYWdlKGluc3RhbGxlZF9maWxlX21ldGFkYXRhKSBvciBpc19wcmVidWlsdF9wYWNrYWdlKGluc3RhbGxlZF9maWxlX21ldGFkYXRhKToKKyAgICAgIGFkZF9wYWNrYWdlX29mX2ZpbGUoZmlsZV9pZCwgaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGEsIGRvYywgcmVwb3J0KQorCisgICAgZWxpZiBtb2R1bGVfcGF0aCBvciBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsnaXNfcGxhdGZvcm1fZ2VuZXJhdGVkJ106CisgICAgICAjIEZpbGUgZnJvbSBQTEFURk9STSBwYWNrYWdlCisgICAgICBkb2MuYWRkX3JlbGF0aW9uc2hpcChzYm9tX2RhdGEuUmVsYXRpb25zaGlwKGlkMT1maWxlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9c2JvbV9kYXRhLlJlbGF0aW9uc2hpcFR5cGUuR0VORVJBVEVEX0ZST00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkMj1zYm9tX2RhdGEuU1BEWElEX1BMQVRGT1JNKSkKKyAgICAgIGlmIGluc3RhbGxlZF9maWxlX21ldGFkYXRhWydpc19wbGF0Zm9ybV9nZW5lcmF0ZWQnXToKKyAgICAgICAgZi5jb25jbHVkZWRfbGljZW5zZV9pZHMgPSBbc2JvbV9kYXRhLlNQRFhJRF9MSUNFTlNFX0FQQUNIRV0KKworICAgIGVsaWYgcHJvZHVjdF9jb3B5X2ZpbGVzOgorICAgICAgIyBGb3JtYXQgb2YgcHJvZHVjdF9jb3B5X2ZpbGVzOiA8c291cmNlIHBhdGg+OjxkZXN0IHBhdGg+CisgICAgICBzcmNfcGF0aCA9IHByb2R1Y3RfY29weV9maWxlcy5zcGxpdCgnOicpWzBdCisgICAgICAjIFNvIGZhciBwcm9kdWN0X2NvcHlfZmlsZXMgYXJlIGNvcGllZCBmcm9tIGRpcmVjdG9yeSBzeXN0ZW0sIGtlcm5lbCwgaGFyZHdhcmUsIGZyYW1ld29ya3MgYW5kIGRldmljZSwKKyAgICAgICMgc28gcHJvY2VzcyB0aGVtIGFzIGZpbGVzIGZyb20gUExBVEZPUk0gcGFja2FnZQorICAgICAgZG9jLmFkZF9yZWxhdGlvbnNoaXAoc2JvbV9kYXRhLlJlbGF0aW9uc2hpcChpZDE9ZmlsZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwPXNib21fZGF0YS5SZWxhdGlvbnNoaXBUeXBlLkdFTkVSQVRFRF9GUk9NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDI9c2JvbV9kYXRhLlNQRFhJRF9QTEFURk9STSkpCisgICAgICBpZiBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsnbGljZW5zZV90ZXh0J106CisgICAgICAgIGlmIGluc3RhbGxlZF9maWxlX21ldGFkYXRhWydsaWNlbnNlX3RleHQnXSA9PSAnYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRSc6CisgICAgICAgICAgZi5jb25jbHVkZWRfbGljZW5zZV9pZHMgPSBbc2JvbV9kYXRhLlNQRFhJRF9MSUNFTlNFX0FQQUNIRV0KKworICAgIGVsaWYgaW5zdGFsbGVkX2ZpbGUuZW5kc3dpdGgoJy5mc3ZfbWV0YScpOgorICAgICAgZG9jLmFkZF9yZWxhdGlvbnNoaXAoc2JvbV9kYXRhLlJlbGF0aW9uc2hpcChpZDE9ZmlsZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwPXNib21fZGF0YS5SZWxhdGlvbnNoaXBUeXBlLkdFTkVSQVRFRF9GUk9NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDI9c2JvbV9kYXRhLlNQRFhJRF9QTEFURk9STSkpCisgICAgICBmLmNvbmNsdWRlZF9saWNlbnNlX2lkcyA9IFtzYm9tX2RhdGEuU1BEWElEX0xJQ0VOU0VfQVBBQ0hFXQorCisgICAgZWxpZiBrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMuc3RhcnRzd2l0aCgnQU5EUk9JRC1HRU4nKToKKyAgICAgICMgRm9yIHRoZSBmb3VyIGZpbGVzIGdlbmVyYXRlZCBmb3IgX2Rsa20sIF9yYW1kaXNrIHBhcnRpdGlvbnMKKyAgICAgIGRvYy5hZGRfcmVsYXRpb25zaGlwKHNib21fZGF0YS5SZWxhdGlvbnNoaXAoaWQxPWZpbGVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcD1zYm9tX2RhdGEuUmVsYXRpb25zaGlwVHlwZS5HRU5FUkFURURfRlJPTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQyPXNib21fZGF0YS5TUERYSURfUExBVEZPUk0pKQorCisgICAgIyBQcm9jZXNzIHN0YXRpYyBkZXBlbmRlbmNpZXMgb2YgdGhlIGluc3RhbGxlZCBmaWxlCisgICAgYWRkX3N0YXRpY19kZXBzX29mX2ZpbGUoZmlsZV9pZCwgaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGEsIGRvYykKKworICAgICMgQWRkIGxpY2Vuc2VzIG9mIHRoZSBpbnN0YWxsZWQgZmlsZQorICAgIGFkZF9saWNlbnNlc19vZl9maWxlKGZpbGVfaWQsIGluc3RhbGxlZF9maWxlX21ldGFkYXRhLCBkb2MpCisKKyAgIyBBZGQgYWxsIHN0YXRpYyBsaWJyYXJ5IGZpbGVzIHRvIFNCT00KKyAgZm9yIGRlcF9maWxlIGluIGdldF9hbGxfdHJhbnNpdGl2ZV9zdGF0aWNfZGVwX2ZpbGVzX29mX2luc3RhbGxlZF9maWxlcyhpbnN0YWxsZWRfZmlsZXNfbWV0YWRhdGEsIGRiLCByZXBvcnQpOgorICAgIGZpbGVwYXRoID0gZGVwX2ZpbGUucmVtb3ZlcHJlZml4KGFyZ3Muc29vbmdfb3V0ICsgJy8uaW50ZXJtZWRpYXRlcy8nKQorICAgIGZpbGVfaWQgPSBuZXdfZmlsZV9pZChmaWxlcGF0aCkKKyAgICAjIFNIQTEgb2YgZW1wdHkgc3RyaW5nLiBTb21ldGltZXMgLmEgZmlsZXMgbWlnaHQgbm90IGJlIGJ1aWx0LgorICAgIHNoYTEgPSAnU0hBMTogZGEzOWEzZWU1ZTZiNGIwZDMyNTViZmVmOTU2MDE4OTBhZmQ4MDcwOScKKyAgICBpZiBvcy5wYXRoLmlzbGluayhkZXBfZmlsZSkgb3Igb3MucGF0aC5pc2ZpbGUoZGVwX2ZpbGUpOgorICAgICAgc2hhMSA9IGNoZWNrc3VtKGRlcF9maWxlKQorICAgIGRvYy5maWxlcy5hcHBlbmQoc2JvbV9kYXRhLkZpbGUoaWQ9ZmlsZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ZmlsZXBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3N1bT1zaGExKSkKKyAgICBmaWxlX21ldGFkYXRhID0geworICAgICAgICAnaW5zdGFsbGVkX2ZpbGUnOiBkZXBfZmlsZSwKKyAgICAgICAgJ2lzX3ByZWJ1aWx0X21ha2VfbW9kdWxlJzogRmFsc2UKKyAgICB9CisgICAgZmlsZV9tZXRhZGF0YS51cGRhdGUoZGIuZ2V0X3Nvb25nX21vZHVsZV9vZl9idWlsdF9maWxlKGRlcF9maWxlKSkKKyAgICBhZGRfcGFja2FnZV9vZl9maWxlKGZpbGVfaWQsIGZpbGVfbWV0YWRhdGEsIGRvYywgcmVwb3J0KQorCisgICAgIyBBZGQgcmVsYXRpb25zaGlwcyBmb3Igc3RhdGljIGRlcHMgb2Ygc3RhdGljIGxpYnJhcmllcworICAgIGFkZF9zdGF0aWNfZGVwc19vZl9maWxlKGZpbGVfaWQsIGZpbGVfbWV0YWRhdGEsIGRvYykKKworICAgICMgQWRkIGxpY2Vuc2VzIG9mIHRoZSBzdGF0aWMgbGliCisgICAgYWRkX2xpY2Vuc2VzX29mX2ZpbGUoZmlsZV9pZCwgZmlsZV9tZXRhZGF0YSwgZG9jKQorCisgICMgU2F2ZSBTQk9NIHJlY29yZHMgdG8gb3V0cHV0IGZpbGUKKyAgZG9jLmdlbmVyYXRlX3BhY2thZ2VzX3ZlcmlmaWNhdGlvbl9jb2RlKCkKKyAgZG9jLmNyZWF0ZWQgPSBkYXRldGltZS5kYXRldGltZS5ub3codHo9ZGF0ZXRpbWUudGltZXpvbmUudXRjKS5zdHJmdGltZSgnJVktJW0tJWRUJUg6JU06JVNaJykKKyAgcHJlZml4ID0gYXJncy5vdXRwdXRfZmlsZQorICBpZiBwcmVmaXguZW5kc3dpdGgoJy5zcGR4Jyk6CisgICAgcHJlZml4ID0gcHJlZml4LnJlbW92ZXN1ZmZpeCgnLnNwZHgnKQorICBlbGlmIHByZWZpeC5lbmRzd2l0aCgnLnNwZHguanNvbicpOgorICAgIHByZWZpeCA9IHByZWZpeC5yZW1vdmVzdWZmaXgoJy5zcGR4Lmpzb24nKQorCisgIG91dHB1dF9maWxlID0gcHJlZml4ICsgJy5zcGR4JworICB3aXRoIG9wZW4ob3V0cHV0X2ZpbGUsICd3JywgZW5jb2Rpbmc9InV0Zi04IikgYXMgZmlsZToKKyAgICBzYm9tX3dyaXRlcnMuVGFnVmFsdWVXcml0ZXIud3JpdGUoZG9jLCBmaWxlKQorICBpZiBhcmdzLmpzb246CisgICAgd2l0aCBvcGVuKHByZWZpeCArICcuc3BkeC5qc29uJywgJ3cnLCBlbmNvZGluZz0idXRmLTgiKSBhcyBmaWxlOgorICAgICAgc2JvbV93cml0ZXJzLkpTT05Xcml0ZXIud3JpdGUoZG9jLCBmaWxlKQorCisgIHNhdmVfcmVwb3J0KHByZWZpeCArICctZ2VuLXJlcG9ydC50eHQnLCByZXBvcnQpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgbWFpbigpCmRpZmYgLS1naXQgYS90b29scy9zYm9tL2dlbmVyYXRlLXNib20tZnJhbWV3b3JrX3Jlcy5weSBiL3Rvb2xzL3Nib20vZ2VuZXJhdGUtc2JvbS1mcmFtZXdvcmtfcmVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZjNkMmUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9zYm9tL2dlbmVyYXRlLXNib20tZnJhbWV3b3JrX3Jlcy5weQpAQCAtMCwwICsxLDEwMSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMworIworIyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgaGFzaGxpYgoraW1wb3J0IGpzb24KK2ltcG9ydCBzYm9tX2RhdGEKK2ltcG9ydCBzYm9tX3dyaXRlcnMKKworJycnCitUaGlzIHNjcmlwdCBnZW5lcmF0ZXMgU0JPTSBvZiBmcmFtZXdvcmtfcmVzLmphciBvZiBsYXlvdXRsaWIgc2hpcHBlZCB3aXRoIEFuZHJvaWQgU3R1ZGlvLgorCitUaGUgZ2VuZXJhdGVkIFNCT00gY29udGFpbnMgc29tZSBwbGFjZWhvbGRlcnMgd2hpY2ggc2hvdWxkIGJlIHN1YnN0aXR1dGVkIGJ5IHJlbGVhc2VfbGF5b3V0bGliLnNoLgorVGhlIHBsYWNlaG9sZGVycyBpbmNsdWRlOiBkb2N1bWVudCBuYW1lLCBkb2N1bWVudCBuYW1lc3BhY2UsIG9yZ2FuaXphdGlvbiwgY3JlYXRlZCB0aW1lc3RhbXAgYW5kIAordGhlIFNIQTEgY2hlY2tzdW0gb2YgZnJhbWV3b3JrX3Jlcy5qYXIuCisnJycKKworZGVmIGdldF9hcmdzKCk6CisgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXYnLCAnLS12ZXJib3NlJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdQcmludCBtb3JlIGluZm9ybWF0aW9uLicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tb3V0cHV0X2ZpbGUnLCByZXF1aXJlZD1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1RoZSBnZW5lcmF0ZWQgU0JPTSBmaWxlIGluIFNQRFggZm9ybWF0LicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tbGF5b3V0bGliX3Nib20nLCByZXF1aXJlZD1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1RoZSBmaWxlIHBhdGggb2YgdGhlIFNCT00gb2YgbGF5b3V0bGliLicpCisKKyAgcmV0dXJuIHBhcnNlci5wYXJzZV9hcmdzKCkKKworCitkZWYgbWFpbigpOgorICBnbG9iYWwgYXJncworICBhcmdzID0gZ2V0X2FyZ3MoKQorCisgIGRvYyA9IHNib21fZGF0YS5Eb2N1bWVudChuYW1lPSc8bmFtZT4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSc8bmFtZXNwYWNlPicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9ycz1bJ09yZ2FuaXphdGlvbjogPG9yZ2FuaXphdGlvbj4nXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQ9JzxjcmVhdGVkPicpCisKKyAgZmlsZW5hbWUgPSAnZGF0YS9mcmFtZXdvcmtfcmVzLmphcicKKyAgZmlsZV9pZCA9IGYnU1BEWFJlZi17c2JvbV9kYXRhLmVuY29kZV9mb3Jfc3BkeGlkKGZpbGVuYW1lKX0nCisgIGZpbGUgPSBzYm9tX2RhdGEuRmlsZShpZD1maWxlX2lkLCBuYW1lPWZpbGVuYW1lLCBjaGVja3N1bT0nU0hBMTogPGNoZWNrc3VtPicpCisKKyAgcGFja2FnZV9uYW1lID0gJ2ZyYW1ld29ya19yZXMnCisgIHBhY2thZ2VfaWQgPSBmJ1NQRFhSZWYtUFJFQlVJTFQte3Nib21fZGF0YS5lbmNvZGVfZm9yX3NwZHhpZChwYWNrYWdlX25hbWUpfScKKyAgcGFja2FnZSA9IHNib21fZGF0YS5QYWNrYWdlKGlkPXBhY2thZ2VfaWQsIG5hbWU9cGFja2FnZV9uYW1lLCB2ZXJzaW9uPSc8cGFja2FnZV92ZXJzaW9uPicsCisgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2xvY2F0aW9uPXNib21fZGF0YS5WQUxVRV9OT05FLAorICAgICAgICAgICAgICAgICAgICBzdXBwbGllcj0nT3JnYW5pemF0aW9uOiA8b3JnYW5pemF0aW9uPicsCisgICAgICAgICAgICAgICAgICAgIGZpbGVzX2FuYWx5emVkPVRydWUsCisgICAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbl9jb2RlPSc8cGFja2FnZV92ZXJpZmljYXRpb25fY29kZT4nKQorICBwYWNrYWdlLmZpbGVfaWRzLmFwcGVuZChmaWxlX2lkKQorCisgIGRvYy5wYWNrYWdlcy5hcHBlbmQocGFja2FnZSkKKyAgZG9jLmZpbGVzLmFwcGVuZChmaWxlKQorICBkb2MuZGVzY3JpYmVzID0gcGFja2FnZV9pZAorCisgIHdpdGggb3BlbihhcmdzLmxheW91dGxpYl9zYm9tLCAncicsIGVuY29kaW5nPSd1dGYtOCcpIGFzIGY6CisgICAgbGF5b3V0bGliX3Nib20gPSBqc29uLmxvYWQoZikKKworICB3aXRoIG9wZW4oYXJncy5sYXlvdXRsaWJfc2JvbSwgJ3JiJykgYXMgZjoKKyAgICBzaGExID0gaGFzaGxpYi5maWxlX2RpZ2VzdChmLCAnc2hhMScpCisKKyAgbGF5b3V0bGliX3Nib21fbmFtZXNwYWNlID0gbGF5b3V0bGliX3Nib21bc2JvbV93cml0ZXJzLlByb3BOYW1lcy5ET0NVTUVOVF9OQU1FU1BBQ0VdCisgIGV4dGVybmFsX2RvY19yZWYgPSAnRG9jdW1lbnRSZWYtbGF5b3V0bGliJworICBkb2MuZXh0ZXJuYWxfcmVmcyA9IFsKKyAgICBzYm9tX2RhdGEuRG9jdW1lbnRFeHRlcm5hbFJlZmVyZW5jZShleHRlcm5hbF9kb2NfcmVmLCBsYXlvdXRsaWJfc2JvbV9uYW1lc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZidTSEExOiB7c2hhMS5oZXhkaWdlc3QoKX0nKV0KKworICByZXNvdXJjZV9maWxlX3NwZHhpZHMgPSBbXQorICBmb3IgZmlsZSBpbiBsYXlvdXRsaWJfc2JvbVtzYm9tX3dyaXRlcnMuUHJvcE5hbWVzLkZJTEVTXToKKyAgICBmaWxlX3BhdGggPSBmaWxlW3Nib21fd3JpdGVycy5Qcm9wTmFtZXMuRklMRV9OQU1FXQorICAgIGlmIGZpbGVfcGF0aC5zdGFydHN3aXRoKCdkYXRhL3Jlcy8nKSBvciBmaWxlX3BhdGguc3RhcnRzd2l0aCgnZGF0YS9vdmVybGF5cy8nKToKKyAgICAgIHJlc291cmNlX2ZpbGVfc3BkeGlkcy5hcHBlbmQoZmlsZVtzYm9tX3dyaXRlcnMuUHJvcE5hbWVzLlNQRFhJRF0pCisKKyAgZG9jLnJlbGF0aW9uc2hpcHMgPSBbCisgICAgc2JvbV9kYXRhLlJlbGF0aW9uc2hpcChwYWNrYWdlX2lkLCBzYm9tX2RhdGEuUmVsYXRpb25zaGlwVHlwZS5DT05UQUlOUywgZmlsZV9pZCkKKyAgXQorICBmb3Igc3BkeGlkIGluIHJlc291cmNlX2ZpbGVfc3BkeGlkczoKKyAgICBkb2MucmVsYXRpb25zaGlwcy5hcHBlbmQoCisgICAgICBzYm9tX2RhdGEuUmVsYXRpb25zaGlwKGZpbGVfaWQsIHNib21fZGF0YS5SZWxhdGlvbnNoaXBUeXBlLkdFTkVSQVRFRF9GUk9NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmJ3tleHRlcm5hbF9kb2NfcmVmfTp7c3BkeGlkfScpKQorCisgICMgd3JpdGUgc2JvbSBmaWxlCisgIHdpdGggb3BlbihhcmdzLm91dHB1dF9maWxlLCAndycsIGVuY29kaW5nPSd1dGYtOCcpIGFzIGY6CisgICAgc2JvbV93cml0ZXJzLkpTT05Xcml0ZXIud3JpdGUoZG9jLCBmKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIG1haW4oKQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2JvbS9nZW5lcmF0ZS1zYm9tLnB5IGIvdG9vbHMvc2JvbS9nZW5lcmF0ZS1zYm9tLnB5CmluZGV4IGIxOWJlODcuLjcyZjg5NmIgMTAwNzU1Ci0tLSBhL3Rvb2xzL3Nib20vZ2VuZXJhdGUtc2JvbS5weQorKysgYi90b29scy9zYm9tL2dlbmVyYXRlLXNib20ucHkKQEAgLTgyLDYgKzgyLDQ2IEBACiAgICd2bmRrX3ByZWJ1aWx0X3NoYXJlZCcsCiBdCiAKK1RISVJEX1BBUlRZX0lERU5USUZJRVJfVFlQRVMgPSBbCisgICAgIyBUeXBlcyBkZWZpbmVkIGluIG1ldGFkYXRhX2ZpbGUucHJvdG8KKyAgICAnR2l0JywKKyAgICAnU1ZOJywKKyAgICAnSGcnLAorICAgICdEYXJjcycsCisgICAgJ1ZDUycsCisgICAgJ0FyY2hpdmUnLAorICAgICdQcmVidWlsdEJ5QWxwaGFiZXQnLAorICAgICdMb2NhbFNvdXJjZScsCisgICAgJ090aGVyJywKKyAgICAjIE9TViBlY29zeXN0ZW1zIGRlZmluZWQgYXQgaHR0cHM6Ly9vc3NmLmdpdGh1Yi5pby9vc3Ytc2NoZW1hLyNhZmZlY3RlZHBhY2thZ2UtZmllbGQuCisgICAgJ0dvJywKKyAgICAnbnBtJywKKyAgICAnT1NTLUZ1enonLAorICAgICdQeVBJJywKKyAgICAnUnVieUdlbXMnLAorICAgICdjcmF0ZXMuaW8nLAorICAgICdIYWNrYWdlJywKKyAgICAnR0hDJywKKyAgICAnUGFja2FnaXN0JywKKyAgICAnTWF2ZW4nLAorICAgICdOdUdldCcsCisgICAgJ0xpbnV4JywKKyAgICAnRGViaWFuJywKKyAgICAnQWxwaW5lJywKKyAgICAnSGV4JywKKyAgICAnQW5kcm9pZCcsCisgICAgJ0dpdEh1YiBBY3Rpb25zJywKKyAgICAnUHViJywKKyAgICAnQ29uYW5DZW50ZXInLAorICAgICdSb2NreSBMaW51eCcsCisgICAgJ0FsbWFMaW51eCcsCisgICAgJ0JpdG5hbWknLAorICAgICdQaG90b24gT1MnLAorICAgICdDUkFOJywKKyAgICAnQmlvY29uZHVjdG9yJywKKyAgICAnU3dpZnRVUkwnCitdCisKIAogZGVmIGdldF9hcmdzKCk6CiAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKQEAgLTkwLDYgKzEzMCw3IEBACiAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tbWV0YWRhdGEnLCByZXF1aXJlZD1UcnVlLCBoZWxwPSdUaGUgU0JPTSBtZXRhZGF0YSBmaWxlIHBhdGguJykKICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1idWlsZF92ZXJzaW9uJywgcmVxdWlyZWQ9VHJ1ZSwgaGVscD0nVGhlIGJ1aWxkIHZlcnNpb24uJykKICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1wcm9kdWN0X21mcicsIHJlcXVpcmVkPVRydWUsIGhlbHA9J1RoZSBwcm9kdWN0IG1hbnVmYWN0dXJlci4nKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLW1vZHVsZV9uYW1lJywgaGVscD0nVGhlIG1vZHVsZSBuYW1lLiBJZiBzcGVjaWZpZWQsIHRoZSBnZW5lcmF0ZWQgU0JPTSBpcyBmb3IgdGhlIG1vZHVsZS4nKQogICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWpzb24nLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZWZhdWx0PUZhbHNlLCBoZWxwPSdHZW5lcmF0ZWQgU0JPTSBmaWxlIGluIFNQRFggSlNPTiBmb3JtYXQnKQogICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXVuYnVuZGxlZF9hcGsnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZWZhdWx0PUZhbHNlLCBoZWxwPSdHZW5lcmF0ZSBTQk9NIGZvciB1bmJ1bmRsZWQgQVBLcycpCiAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tdW5idW5kbGVkX2FwZXgnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZWZhdWx0PUZhbHNlLCBoZWxwPSdHZW5lcmF0ZSBTQk9NIGZvciB1bmJ1bmRsZWQgQVBFWHMnKQpAQCAtMTAzLDI2ICsxNDQsMTIgQEAKICAgICAgIHByaW50KGkpCiAKIAotZGVmIGVuY29kZV9mb3Jfc3BkeGlkKHMpOgotICAiIiJTaW1wbGUgZW5jb2RlIGZvciBzdHJpbmcgdmFsdWVzIHVzZWQgaW4gU1BEWElEIHdoaWNoIHVzZXMgdGhlIGNoYXJzZXQgb2YgQS1aYS1aMC05Li0iIiIKLSAgcmVzdWx0ID0gJycKLSAgZm9yIGMgaW4gczoKLSAgICBpZiBjLmlzYWxudW0oKSBvciBjIGluICcuLSc6Ci0gICAgICByZXN1bHQgKz0gYwotICAgIGVsaWYgYyBpbiAnX0AvJzoKLSAgICAgIHJlc3VsdCArPSAnLScKLSAgICBlbHNlOgotICAgICAgcmVzdWx0ICs9ICcweCcgKyBjLmVuY29kZSgndXRmLTgnKS5oZXgoKQotCi0gIHJldHVybiByZXN1bHQubHN0cmlwKCctJykKLQotCiBkZWYgbmV3X3BhY2thZ2VfaWQocGFja2FnZV9uYW1lLCB0eXBlKToKLSAgcmV0dXJuIGYnU1BEWFJlZi17dHlwZX0te2VuY29kZV9mb3Jfc3BkeGlkKHBhY2thZ2VfbmFtZSl9JworICByZXR1cm4gZidTUERYUmVmLXt0eXBlfS17c2JvbV9kYXRhLmVuY29kZV9mb3Jfc3BkeGlkKHBhY2thZ2VfbmFtZSl9JwogCiAKIGRlZiBuZXdfZmlsZV9pZChmaWxlX3BhdGgpOgotICByZXR1cm4gZidTUERYUmVmLXtlbmNvZGVfZm9yX3NwZHhpZChmaWxlX3BhdGgpfScKKyAgcmV0dXJuIGYnU1BEWFJlZi17c2JvbV9kYXRhLmVuY29kZV9mb3Jfc3BkeGlkKGZpbGVfcGF0aCl9JwogCiAKIGRlZiBjaGVja3N1bShmaWxlX3BhdGgpOgpAQCAtMzIwLDcgKzM0Nyw3IEBACiAgICAgICBzYm9tX2NoZWNrc3VtID0gbWV0YWRhdGFfcHJvdG8udGhpcmRfcGFydHkuc2JvbV9yZWYuY2hlY2tzdW0KICAgICAgIHVwc3RyZWFtX2VsZW1lbnRfaWQgPSBtZXRhZGF0YV9wcm90by50aGlyZF9wYXJ0eS5zYm9tX3JlZi5lbGVtZW50X2lkCiAgICAgICBpZiBzYm9tX3VybCBhbmQgc2JvbV9jaGVja3N1bSBhbmQgdXBzdHJlYW1fZWxlbWVudF9pZDoKLSAgICAgICAgZG9jX3JlZl9pZCA9IGYnRG9jdW1lbnRSZWYte1BLR19VUFNUUkVBTX0te2VuY29kZV9mb3Jfc3BkeGlkKG5hbWUpfScKKyAgICAgICAgZG9jX3JlZl9pZCA9IGYnRG9jdW1lbnRSZWYte1BLR19VUFNUUkVBTX0te3Nib21fZGF0YS5lbmNvZGVfZm9yX3NwZHhpZChuYW1lKX0nCiAgICAgICAgIGV4dGVybmFsX2RvY19yZWYgPSBzYm9tX2RhdGEuRG9jdW1lbnRFeHRlcm5hbFJlZmVyZW5jZShpZD1kb2NfcmVmX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpPXNib21fdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW09c2JvbV9jaGVja3N1bSkKQEAgLTM2MCw2ICszODcsMjAgQEAKICAgcmV0dXJuIFRydWUKIAogCisjIFZhbGlkYXRlIGlkZW50aWZpZXJzIGluIGEgcGFja2FnZSdzIE1FVEFEQVRBLgorIyAxKSBPbmx5IGtub3duIGlkZW50aWZpZXIgdHlwZSBpcyBhbGxvd2VkCisjIDIpIE9ubHkgb25lIGlkZW50aWZpZXIncyBwcmltYXJ5X3NvdXJjZSBjYW4gYmUgdHJ1ZQorZGVmIHZhbGlkYXRlX3BhY2thZ2VfbWV0YWRhdGEobWV0YWRhdGFfZmlsZV9wYXRoLCBwYWNrYWdlX21ldGFkYXRhKToKKyAgcHJpbWFyeV9zb3VyY2VfZm91bmQgPSBGYWxzZQorICBmb3IgaWRlbnRpZmllciBpbiBwYWNrYWdlX21ldGFkYXRhLnRoaXJkX3BhcnR5LmlkZW50aWZpZXI6CisgICAgaWYgaWRlbnRpZmllci50eXBlIG5vdCBpbiBUSElSRF9QQVJUWV9JREVOVElGSUVSX1RZUEVTOgorICAgICAgc3lzLmV4aXQoZidVbmtub3duIHZhbHVlIG9mIHRoaXJkX3BhcnR5LmlkZW50aWZpZXIudHlwZSBpbiB7bWV0YWRhdGFfZmlsZV9wYXRofS9NRVRBREFUQToge2lkZW50aWZpZXIudHlwZX0uJykKKyAgICBpZiBwcmltYXJ5X3NvdXJjZV9mb3VuZCBhbmQgaWRlbnRpZmllci5wcmltYXJ5X3NvdXJjZToKKyAgICAgIHN5cy5leGl0KAorICAgICAgICBmJ0ZpZWxkICJwcmltYXJ5X3NvdXJjZSIgaXMgc2V0IHRvIHRydWUgaW4gbXVsdGlwbGUgdGhpcmRfcGFydHkuaWRlbnRpZmllciBpbiB7bWV0YWRhdGFfZmlsZV9wYXRofS9NRVRBREFUQS4nKQorICAgIHByaW1hcnlfc291cmNlX2ZvdW5kID0gaWRlbnRpZmllci5wcmltYXJ5X3NvdXJjZQorCisKIGRlZiByZXBvcnRfbWV0YWRhdGFfZmlsZShtZXRhZGF0YV9maWxlX3BhdGgsIGluc3RhbGxlZF9maWxlX21ldGFkYXRhLCByZXBvcnQpOgogICBpZiBtZXRhZGF0YV9maWxlX3BhdGg6CiAgICAgcmVwb3J0W0lORk9fTUVUQURBVEFfRk9VTkRfRk9SX1BBQ0tBR0VdLmFwcGVuZCgKQEAgLTM3Miw2ICs0MTMsOCBAQAogICAgIHdpdGggb3BlbihtZXRhZGF0YV9maWxlX3BhdGggKyAnL01FVEFEQVRBJywgJ3J0JykgYXMgZjoKICAgICAgIHRleHRfZm9ybWF0LlBhcnNlKGYucmVhZCgpLCBwYWNrYWdlX21ldGFkYXRhKQogCisgICAgdmFsaWRhdGVfcGFja2FnZV9tZXRhZGF0YShtZXRhZGF0YV9maWxlX3BhdGgsIHBhY2thZ2VfbWV0YWRhdGEpCisKICAgICBpZiBub3QgbWV0YWRhdGFfZmlsZV9wYXRoIGluIG1ldGFkYXRhX2ZpbGVfcHJvdG9zOgogICAgICAgbWV0YWRhdGFfZmlsZV9wcm90b3NbbWV0YWRhdGFfZmlsZV9wYXRoXSA9IHBhY2thZ2VfbWV0YWRhdGEKICAgICAgIGlmIG5vdCBwYWNrYWdlX21ldGFkYXRhLm5hbWU6CkBAIC00NDEsMTYgKzQ4NCwyNSBAQAogICBnbG9iYWwgbWV0YWRhdGFfZmlsZV9wcm90b3MKICAgbWV0YWRhdGFfZmlsZV9wcm90b3MgPSB7fQogCi0gIHByb2R1Y3RfcGFja2FnZSA9IHNib21fZGF0YS5QYWNrYWdlKGlkPXNib21fZGF0YS5TUERYSURfUFJPRFVDVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1zYm9tX2RhdGEuUEFDS0FHRV9OQU1FX1BST0RVQ1QsCisgIHByb2R1Y3RfcGFja2FnZV9pZCA9IHNib21fZGF0YS5TUERYSURfUFJPRFVDVAorICBwcm9kdWN0X3BhY2thZ2VfbmFtZSA9IHNib21fZGF0YS5QQUNLQUdFX05BTUVfUFJPRFVDVAorICBpZiBhcmdzLm1vZHVsZV9uYW1lOgorICAgICMgQnVpbGQgU0JPTSBvZiBhIG1vZHVsZSBzbyB1c2UgdGhlIG1vZHVsZSBuYW1lIGluc3RlYWQuCisgICAgcHJvZHVjdF9wYWNrYWdlX2lkID0gZidTUERYUmVmLXtzYm9tX2RhdGEuZW5jb2RlX2Zvcl9zcGR4aWQoYXJncy5tb2R1bGVfbmFtZSl9JworICAgIHByb2R1Y3RfcGFja2FnZV9uYW1lID0gYXJncy5tb2R1bGVfbmFtZQorICBwcm9kdWN0X3BhY2thZ2UgPSBzYm9tX2RhdGEuUGFja2FnZShpZD1wcm9kdWN0X3BhY2thZ2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9cHJvZHVjdF9wYWNrYWdlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2xvY2F0aW9uPXNib21fZGF0YS5WQUxVRV9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPWFyZ3MuYnVpbGRfdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZXI9J09yZ2FuaXphdGlvbjogJyArIGFyZ3MucHJvZHVjdF9tZnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzX2FuYWx5emVkPVRydWUpCi0KLSAgZG9jID0gc2JvbV9kYXRhLkRvY3VtZW50KG5hbWU9YXJncy5idWlsZF92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPWYnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zYm9tL3NwZHgvYW5kcm9pZC97YXJncy5idWlsZF92ZXJzaW9ufScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9ycz1bJ09yZ2FuaXphdGlvbjogJyArIGFyZ3MucHJvZHVjdF9tZnJdKQorICBkb2NfbmFtZSA9IGFyZ3MuYnVpbGRfdmVyc2lvbgorICBpZiBhcmdzLm1vZHVsZV9uYW1lOgorICAgIGRvY19uYW1lID0gZid7YXJncy5idWlsZF92ZXJzaW9ufS97YXJncy5tb2R1bGVfbmFtZX0nCisgIGRvYyA9IHNib21fZGF0YS5Eb2N1bWVudChuYW1lPWRvY19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPWYnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zYm9tL3NwZHgvYW5kcm9pZC97ZG9jX25hbWV9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3JzPVsnT3JnYW5pemF0aW9uOiAnICsgYXJncy5wcm9kdWN0X21mcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmliZXM9cHJvZHVjdF9wYWNrYWdlX2lkKQogICBpZiBub3QgYXJncy51bmJ1bmRsZWRfYXBleDoKICAgICBkb2MucGFja2FnZXMuYXBwZW5kKHByb2R1Y3RfcGFja2FnZSkKIApkaWZmIC0tZ2l0IGEvdG9vbHMvc2JvbS9zYm9tX2RhdGEucHkgYi90b29scy9zYm9tL3Nib21fZGF0YS5weQppbmRleCBlYTM4ZTM2Li5mYzVjNzA0IDEwMDY0NAotLS0gYS90b29scy9zYm9tL3Nib21fZGF0YS5weQorKysgYi90b29scy9zYm9tL3Nib21fZGF0YS5weQpAQCAtMzAsNiArMzAsNyBAQAogU1BEWElEX0RPQyA9ICdTUERYUmVmLURPQ1VNRU5UJwogU1BEWElEX1BST0RVQ1QgPSAnU1BEWFJlZi1QUk9EVUNUJwogU1BEWElEX1BMQVRGT1JNID0gJ1NQRFhSZWYtUExBVEZPUk0nCitTUERYSURfTElDRU5TRV9BUEFDSEUgPSAnTGljZW5zZVJlZi1BbmRyb2lkLUFwYWNoZS0yLjAnCiAKIFBBQ0tBR0VfTkFNRV9QUk9EVUNUID0gJ1BST0RVQ1QnCiBQQUNLQUdFX05BTUVfUExBVEZPUk0gPSAnUExBVEZPUk0nCkBAIC01MCw3ICs1MSw3IEBACiAgIGNwZTIzVHlwZSA9ICdjcGUyM1R5cGUnCiAKIAotQGRhdGFjbGFzcworQGRhdGFjbGFzcyhmcm96ZW49VHJ1ZSkKIGNsYXNzIFBhY2thZ2VFeHRlcm5hbFJlZjoKICAgY2F0ZWdvcnk6IFBhY2thZ2VFeHRlcm5hbFJlZkNhdGVnb3J5CiAgIHR5cGU6IFBhY2thZ2VFeHRlcm5hbFJlZlR5cGUKQEAgLTY4LDYgKzY5LDcgQEAKICAgdmVyaWZpY2F0aW9uX2NvZGU6IHN0ciA9IE5vbmUKICAgZmlsZV9pZHM6IExpc3Rbc3RyXSA9IGZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQogICBleHRlcm5hbF9yZWZzOiBMaXN0W1BhY2thZ2VFeHRlcm5hbFJlZl0gPSBmaWVsZChkZWZhdWx0X2ZhY3Rvcnk9bGlzdCkKKyAgZGVjbGFyZWRfbGljZW5zZV9pZHM6IExpc3Rbc3RyXSA9IGZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQogCiAKIEBkYXRhY2xhc3MKQEAgLTc1LDYgKzc3LDcgQEAKICAgaWQ6IHN0cgogICBuYW1lOiBzdHIKICAgY2hlY2tzdW06IHN0cgorICBjb25jbHVkZWRfbGljZW5zZV9pZHM6IExpc3Rbc3RyXSA9IGZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQogCiAKIGNsYXNzIFJlbGF0aW9uc2hpcFR5cGU6CkBAIC04NSwyMCArODgsMjcgQEAKICAgU1RBVElDX0xJTksgPSAnU1RBVElDX0xJTksnCiAKIAotQGRhdGFjbGFzcworQGRhdGFjbGFzcyhmcm96ZW49VHJ1ZSkKIGNsYXNzIFJlbGF0aW9uc2hpcDoKICAgaWQxOiBzdHIKICAgcmVsYXRpb25zaGlwOiBSZWxhdGlvbnNoaXBUeXBlCiAgIGlkMjogc3RyCiAKIAotQGRhdGFjbGFzcworQGRhdGFjbGFzcyhmcm96ZW49VHJ1ZSkKIGNsYXNzIERvY3VtZW50RXh0ZXJuYWxSZWZlcmVuY2U6CiAgIGlkOiBzdHIKICAgdXJpOiBzdHIKICAgY2hlY2tzdW06IHN0cgogCiAKK0BkYXRhY2xhc3MoZnJvemVuPVRydWUpCitjbGFzcyBMaWNlbnNlOgorICBpZDogc3RyCisgIHRleHQ6IHN0cgorICBuYW1lOiBzdHIKKworCiBAZGF0YWNsYXNzCiBjbGFzcyBEb2N1bWVudDoKICAgbmFtZTogc3RyCkBAIC0xMTEsMjAgKzEyMSwzMCBAQAogICBwYWNrYWdlczogTGlzdFtQYWNrYWdlXSA9IGZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQogICBmaWxlczogTGlzdFtGaWxlXSA9IGZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQogICByZWxhdGlvbnNoaXBzOiBMaXN0W1JlbGF0aW9uc2hpcF0gPSBmaWVsZChkZWZhdWx0X2ZhY3Rvcnk9bGlzdCkKKyAgbGljZW5zZXM6IExpc3RbTGljZW5zZV0gPSBmaWVsZChkZWZhdWx0X2ZhY3Rvcnk9bGlzdCkKIAogICBkZWYgYWRkX2V4dGVybmFsX3JlZihzZWxmLCBleHRlcm5hbF9yZWYpOgogICAgIGlmIG5vdCBhbnkoZXh0ZXJuYWxfcmVmLnVyaSA9PSByZWYudXJpIGZvciByZWYgaW4gc2VsZi5leHRlcm5hbF9yZWZzKToKICAgICAgIHNlbGYuZXh0ZXJuYWxfcmVmcy5hcHBlbmQoZXh0ZXJuYWxfcmVmKQogCiAgIGRlZiBhZGRfcGFja2FnZShzZWxmLCBwYWNrYWdlKToKLSAgICBpZiBub3QgYW55KHBhY2thZ2UuaWQgPT0gcC5pZCBmb3IgcCBpbiBzZWxmLnBhY2thZ2VzKToKKyAgICBwID0gbmV4dCgocCBmb3IgcCBpbiBzZWxmLnBhY2thZ2VzIGlmIHBhY2thZ2UuaWQgPT0gcC5pZCksIE5vbmUpCisgICAgaWYgbm90IHA6CiAgICAgICBzZWxmLnBhY2thZ2VzLmFwcGVuZChwYWNrYWdlKQorICAgIGVsc2U6CisgICAgICBmb3IgbGljZW5zZV9pZCBpbiBwYWNrYWdlLmRlY2xhcmVkX2xpY2Vuc2VfaWRzOgorICAgICAgICBpZiBsaWNlbnNlX2lkIG5vdCBpbiBwLmRlY2xhcmVkX2xpY2Vuc2VfaWRzOgorICAgICAgICAgIHAuZGVjbGFyZWRfbGljZW5zZV9pZHMuYXBwZW5kKGxpY2Vuc2VfaWQpCiAKICAgZGVmIGFkZF9yZWxhdGlvbnNoaXAoc2VsZiwgcmVsKToKICAgICBpZiBub3QgYW55KHJlbC5pZDEgPT0gci5pZDEgYW5kIHJlbC5pZDIgPT0gci5pZDIgYW5kIHJlbC5yZWxhdGlvbnNoaXAgPT0gci5yZWxhdGlvbnNoaXAKICAgICAgICAgICAgICAgIGZvciByIGluIHNlbGYucmVsYXRpb25zaGlwcyk6CiAgICAgICBzZWxmLnJlbGF0aW9uc2hpcHMuYXBwZW5kKHJlbCkKIAorICBkZWYgYWRkX2xpY2Vuc2Uoc2VsZiwgbGljZW5zZSk6CisgICAgaWYgbm90IGFueShsaWNlbnNlLmlkID09IGwuaWQgZm9yIGwgaW4gc2VsZi5saWNlbnNlcyk6CisgICAgICBzZWxmLmxpY2Vuc2VzLmFwcGVuZChsaWNlbnNlKQorCiAgIGRlZiBnZW5lcmF0ZV9wYWNrYWdlc192ZXJpZmljYXRpb25fY29kZShzZWxmKToKICAgICBmb3IgcGFja2FnZSBpbiBzZWxmLnBhY2thZ2VzOgogICAgICAgaWYgbm90IHBhY2thZ2UuZmlsZV9pZHM6CkBAIC0xMzMsOCArMTUzLDIxIEBACiAgICAgICBjaGVja3N1bXMgPSBbXQogICAgICAgZm9yIGZpbGUgaW4gc2VsZi5maWxlczoKICAgICAgICAgaWYgZmlsZS5pZCBpbiBwYWNrYWdlLmZpbGVfaWRzOgotICAgICAgICAgIGNoZWNrc3Vtcy5hcHBlbmQoZmlsZS5jaGVja3N1bSkKKyAgICAgICAgICBjaGVja3N1bXMuYXBwZW5kKGZpbGUuY2hlY2tzdW0uc3BsaXQoJzogJylbMV0pCiAgICAgICBjaGVja3N1bXMuc29ydCgpCiAgICAgICBoID0gaGFzaGxpYi5zaGExKCkKICAgICAgIGgudXBkYXRlKCcnLmpvaW4oY2hlY2tzdW1zKS5lbmNvZGUoZW5jb2Rpbmc9J3V0Zi04JykpCiAgICAgICBwYWNrYWdlLnZlcmlmaWNhdGlvbl9jb2RlID0gaC5oZXhkaWdlc3QoKQorCitkZWYgZW5jb2RlX2Zvcl9zcGR4aWQocyk6CisgICIiIlNpbXBsZSBlbmNvZGUgZm9yIHN0cmluZyB2YWx1ZXMgdXNlZCBpbiBTUERYSUQgd2hpY2ggdXNlcyB0aGUgY2hhcnNldCBvZiBBLVphLVowLTkuLSIiIgorICByZXN1bHQgPSAnJworICBmb3IgYyBpbiBzOgorICAgIGlmIGMuaXNhbG51bSgpIG9yIGMgaW4gJy4tJzoKKyAgICAgIHJlc3VsdCArPSBjCisgICAgZWxpZiBjIGluICdfQC8nOgorICAgICAgcmVzdWx0ICs9ICctJworICAgIGVsc2U6CisgICAgICByZXN1bHQgKz0gJzB4JyArIGMuZW5jb2RlKCd1dGYtOCcpLmhleCgpCisKKyAgcmV0dXJuIHJlc3VsdC5sc3RyaXAoJy0nKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3Nib20vc2JvbV9kYXRhX3Rlc3QucHkgYi90b29scy9zYm9tL3Nib21fZGF0YV90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkOTg3YzQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9zYm9tL3Nib21fZGF0YV90ZXN0LnB5CkBAIC0wLDAgKzEsMTg0IEBACisjIS91c3IvYmluL2VudiBweXRob24zCisjCisjIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgaGFzaGxpYgoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc2JvbV9kYXRhCisKK0JVSUxEX0ZJTkdFUl9QUklOVCA9ICdidWlsZF9maW5nZXJfcHJpbnQnCitTVVBQTElFUl9HT09HTEUgPSAnT3JnYW5pemF0aW9uOiBHb29nbGUnCitTVVBQTElFUl9VUFNUUkVBTSA9ICdPcmdhbml6YXRpb246IHVwc3RyZWFtJworCitTUERYSURfUFJFQlVJTFRfUEFDS0FHRTEgPSAnU1BEWFJlZi1QUkVCVUlMVC1wYWNrYWdlMScKK1NQRFhJRF9QUkVCVUlMVF9QQUNLQUdFMiA9ICdTUERYUmVmLVBSRUJVSUxULXBhY2thZ2UyJworU1BEWElEX1NPVVJDRV9QQUNLQUdFMSA9ICdTUERYUmVmLVNPVVJDRS1wYWNrYWdlMScKK1NQRFhJRF9VUFNUUkVBTV9QQUNLQUdFMSA9ICdTUERYUmVmLVVQU1RSRUFNLXBhY2thZ2UxJworCitTUERYSURfRklMRTEgPSAnU1BEWFJlZi1maWxlMScKK1NQRFhJRF9GSUxFMiA9ICdTUERYUmVmLWZpbGUyJworU1BEWElEX0ZJTEUzID0gJ1NQRFhSZWYtZmlsZTMnCitTUERYSURfRklMRTQgPSAnU1BEWFJlZi1maWxlNCcKKworU1BEWElEX0xJQ0VOU0UxID0gIlNQRFhSZWYtTGljZW5zZS0xIgorU1BEWElEX0xJQ0VOU0UyID0gIlNQRFhSZWYtTGljZW5zZS0yIgorCisKK2NsYXNzIFNCT01EYXRhVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHNldFVwKHNlbGYpOgorICAgICMgU0JPTSBvZiBhIHByb2R1Y3QKKyAgICBzZWxmLnNib21fZG9jID0gc2JvbV9kYXRhLkRvY3VtZW50KG5hbWU9J3Rlc3QgZG9jJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0naHR0cDovL3d3dy5nb29nbGUuY29tL3Nib20vc3BkeC9hbmRyb2lkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3JzPVtTVVBQTElFUl9HT09HTEVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZD0nMjAyMy0wMy0zMVQyMjoxNzo1OFonLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmVzPXNib21fZGF0YS5TUERYSURfUFJPRFVDVCkKKyAgICBzZWxmLnNib21fZG9jLmFkZF9leHRlcm5hbF9yZWYoCisgICAgICAgIHNib21fZGF0YS5Eb2N1bWVudEV4dGVybmFsUmVmZXJlbmNlKGlkPSdEb2N1bWVudFJlZi1leHRlcm5hbF9kb2NfcmVmJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpPSdleHRlcm5hbF9kb2NfdXJpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW09J1NIQTE6IDEyMzQ1Njc4OTAnKSkKKyAgICBzZWxmLnNib21fZG9jLmFkZF9wYWNrYWdlKAorICAgICAgICBzYm9tX2RhdGEuUGFja2FnZShpZD1zYm9tX2RhdGEuU1BEWElEX1BST0RVQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9c2JvbV9kYXRhLlBBQ0tBR0VfTkFNRV9QUk9EVUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9sb2NhdGlvbj1zYm9tX2RhdGEuVkFMVUVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZXI9U1VQUExJRVJfR09PR0xFLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPUJVSUxEX0ZJTkdFUl9QUklOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXNfYW5hbHl6ZWQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX2NvZGU9JycsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfaWRzPVtTUERYSURfRklMRTEsIFNQRFhJRF9GSUxFMiwgU1BEWElEX0ZJTEUzLCBTUERYSURfRklMRTRdKSkKKworICAgIHNlbGYuc2JvbV9kb2MuYWRkX3BhY2thZ2UoCisgICAgICAgIHNib21fZGF0YS5QYWNrYWdlKGlkPXNib21fZGF0YS5TUERYSURfUExBVEZPUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9c2JvbV9kYXRhLlBBQ0tBR0VfTkFNRV9QTEFURk9STSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfbG9jYXRpb249c2JvbV9kYXRhLlZBTFVFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVyPVNVUFBMSUVSX0dPT0dMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1CVUlMRF9GSU5HRVJfUFJJTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisKKyAgICBzZWxmLnNib21fZG9jLmFkZF9wYWNrYWdlKAorICAgICAgICBzYm9tX2RhdGEuUGFja2FnZShpZD1TUERYSURfUFJFQlVJTFRfUEFDS0FHRTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9J1ByZWJ1aWx0IHBhY2thZ2UxJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfbG9jYXRpb249c2JvbV9kYXRhLlZBTFVFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVyPVNVUFBMSUVSX0dPT0dMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1CVUlMRF9GSU5HRVJfUFJJTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisKKyAgICBzZWxmLnNib21fZG9jLmFkZF9wYWNrYWdlKAorICAgICAgICBzYm9tX2RhdGEuUGFja2FnZShpZD1TUERYSURfU09VUkNFX1BBQ0tBR0UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSdTb3VyY2UgcGFja2FnZTEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9sb2NhdGlvbj1zYm9tX2RhdGEuVkFMVUVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZXI9U1VQUExJRVJfR09PR0xFLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPUJVSUxEX0ZJTkdFUl9QUklOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxfcmVmcz1bc2JvbV9kYXRhLlBhY2thZ2VFeHRlcm5hbFJlZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PXNib21fZGF0YS5QYWNrYWdlRXh0ZXJuYWxSZWZDYXRlZ29yeS5TRUNVUklUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9c2JvbV9kYXRhLlBhY2thZ2VFeHRlcm5hbFJlZlR5cGUuY3BlMjJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRvcj0nY3BlOi9hOmpzb25jcHBfcHJvamVjdDpqc29uY3BwOjEuOS40JyldCisgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisKKyAgICBzZWxmLnNib21fZG9jLmFkZF9wYWNrYWdlKAorICAgICAgICBzYm9tX2RhdGEuUGFja2FnZShpZD1TUERYSURfVVBTVFJFQU1fUEFDS0FHRTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9J1Vwc3RyZWFtIHBhY2thZ2UxJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZXI9U1VQUExJRVJfVVBTVFJFQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249JzEuMScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisKKyAgICBzZWxmLnNib21fZG9jLmFkZF9yZWxhdGlvbnNoaXAoc2JvbV9kYXRhLlJlbGF0aW9uc2hpcChpZDE9U1BEWElEX1NPVVJDRV9QQUNLQUdFMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9c2JvbV9kYXRhLlJlbGF0aW9uc2hpcFR5cGUuVkFSSUFOVF9PRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDI9U1BEWElEX1VQU1RSRUFNX1BBQ0tBR0UxKSkKKworICAgIHNlbGYuc2JvbV9kb2MuZmlsZXMuYXBwZW5kKAorICAgICAgICBzYm9tX2RhdGEuRmlsZShpZD1TUERYSURfRklMRTEsIG5hbWU9Jy9iaW4vZmlsZTEnLAorICAgICAgICAgICAgICAgICAgICAgICBjaGVja3N1bT0nU0hBMTogMzU2YTE5MmI3OTEzYjA0YzU0NTc0ZDE4YzI4ZDQ2ZTYzOTU0MjhhYicpKSAgIyBzaGExIGhhc2ggb2YgMQorICAgIHNlbGYuc2JvbV9kb2MuZmlsZXMuYXBwZW5kKAorICAgICAgICBzYm9tX2RhdGEuRmlsZShpZD1TUERYSURfRklMRTIsIG5hbWU9Jy9iaW4vZmlsZTInLAorICAgICAgICAgICAgICAgICAgICAgICBjaGVja3N1bT0nU0hBMTogZGE0YjkyMzdiYWNjY2RmMTljMDc2MGNhYjdhZWM0YTgzNTkwMTBiMCcpKSAgIyBzaGExIGhhc2ggb2YgMgorICAgIHNlbGYuc2JvbV9kb2MuZmlsZXMuYXBwZW5kKAorICAgICAgICBzYm9tX2RhdGEuRmlsZShpZD1TUERYSURfRklMRTMsIG5hbWU9Jy9iaW4vZmlsZTMnLAorICAgICAgICAgICAgICAgICAgICAgICBjaGVja3N1bT0nU0hBMTogNzdkZTY4ZGFlY2Q4MjNiYWJiYjU4ZWRiMWM4ZTE0ZDcxMDZlODNiYicpKSAgIyBzaGExIGhhc2ggb2YgMworICAgIHNlbGYuc2JvbV9kb2MuZmlsZXMuYXBwZW5kKAorICAgICAgICBzYm9tX2RhdGEuRmlsZShpZD1TUERYSURfRklMRTQsIG5hbWU9J2ZpbGU0LmEnLAorICAgICAgICAgICAgICAgICAgICAgICBjaGVja3N1bT0nU0hBMTogMWI2NDUzODkyNDczYTQ2N2QwNzM3MmQ0NWViMDVhYmMyMDMxNjQ3YScpKSAgIyBzaGExIG9mIDQKKworICAgIHNlbGYuc2JvbV9kb2MuYWRkX3JlbGF0aW9uc2hpcChzYm9tX2RhdGEuUmVsYXRpb25zaGlwKGlkMT1TUERYSURfRklMRTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwPXNib21fZGF0YS5SZWxhdGlvbnNoaXBUeXBlLkdFTkVSQVRFRF9GUk9NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkMj1zYm9tX2RhdGEuU1BEWElEX1BMQVRGT1JNKSkKKyAgICBzZWxmLnNib21fZG9jLmFkZF9yZWxhdGlvbnNoaXAoc2JvbV9kYXRhLlJlbGF0aW9uc2hpcChpZDE9U1BEWElEX0ZJTEUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcD1zYm9tX2RhdGEuUmVsYXRpb25zaGlwVHlwZS5HRU5FUkFURURfRlJPTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDI9U1BEWElEX1BSRUJVSUxUX1BBQ0tBR0UxKSkKKyAgICBzZWxmLnNib21fZG9jLmFkZF9yZWxhdGlvbnNoaXAoc2JvbV9kYXRhLlJlbGF0aW9uc2hpcChpZDE9U1BEWElEX0ZJTEUzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcD1zYm9tX2RhdGEuUmVsYXRpb25zaGlwVHlwZS5HRU5FUkFURURfRlJPTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDI9U1BEWElEX1NPVVJDRV9QQUNLQUdFMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisgICAgc2VsZi5zYm9tX2RvYy5hZGRfcmVsYXRpb25zaGlwKHNib21fZGF0YS5SZWxhdGlvbnNoaXAoaWQxPVNQRFhJRF9GSUxFMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9c2JvbV9kYXRhLlJlbGF0aW9uc2hpcFR5cGUuU1RBVElDX0xJTkssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQyPVNQRFhJRF9GSUxFNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisKKyAgZGVmIHRlc3RfcGFja2FnZV92ZXJpZmljYXRpb25fY29kZShzZWxmKToKKyAgICBjaGVja3N1bXMgPSBbXQorICAgIGZvciBmaWxlIGluIHNlbGYuc2JvbV9kb2MuZmlsZXM6CisgICAgICBjaGVja3N1bXMuYXBwZW5kKGZpbGUuY2hlY2tzdW0uc3BsaXQoJzogJylbMV0pCisgICAgICBjaGVja3N1bXMuc29ydCgpCisgICAgaCA9IGhhc2hsaWIuc2hhMSgpCisgICAgaC51cGRhdGUoJycuam9pbihjaGVja3N1bXMpLmVuY29kZShlbmNvZGluZz0ndXRmLTgnKSkKKyAgICBleHBlY3RlZF9wYWNrYWdlX3ZlcmlmaWNhdGlvbl9jb2RlID0gaC5oZXhkaWdlc3QoKQorCisgICAgc2VsZi5zYm9tX2RvYy5nZW5lcmF0ZV9wYWNrYWdlc192ZXJpZmljYXRpb25fY29kZSgpCisgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF9wYWNrYWdlX3ZlcmlmaWNhdGlvbl9jb2RlLCBzZWxmLnNib21fZG9jLnBhY2thZ2VzWzBdLnZlcmlmaWNhdGlvbl9jb2RlKQorCisgIGRlZiB0ZXN0X2FkZF9wYWNrYWdlXyhzZWxmKToKKyAgICBzZWxmLnNib21fZG9jLmFkZF9wYWNrYWdlKHNib21fZGF0YS5QYWNrYWdlKGlkPVNQRFhJRF9QUkVCVUlMVF9QQUNLQUdFMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9J1ByZWJ1aWx0IHBhY2thZ2UyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2xvY2F0aW9uPXNib21fZGF0YS5WQUxVRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZXI9U1VQUExJRVJfR09PR0xFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1CVUlMRF9GSU5HRVJfUFJJTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQorICAgIHAgPSBuZXh0KChwIGZvciBwIGluIHNlbGYuc2JvbV9kb2MucGFja2FnZXMgaWYgcC5pZCA9PSBTUERYSURfUFJFQlVJTFRfUEFDS0FHRTIpLCBOb25lKQorICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocCwgTm9uZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHAuZGVjbGFyZWRfbGljZW5zZV9pZHMsIFtdKQorCisgICAgIyBBZGQgc2FtZSBwYWNrYWdlIHdpdGggbGljZW5zZSAxCisgICAgc2VsZi5zYm9tX2RvYy5hZGRfcGFja2FnZShzYm9tX2RhdGEuUGFja2FnZShpZD1TUERYSURfUFJFQlVJTFRfUEFDS0FHRTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSdQcmVidWlsdCBwYWNrYWdlMicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9sb2NhdGlvbj1zYm9tX2RhdGEuVkFMVUVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVyPVNVUFBMSUVSX0dPT0dMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249QlVJTERfRklOR0VSX1BSSU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWRfbGljZW5zZV9pZHM9W1NQRFhJRF9MSUNFTlNFMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisgICAgc2VsZi5hc3NlcnRFcXVhbChwLmRlY2xhcmVkX2xpY2Vuc2VfaWRzLCBbU1BEWElEX0xJQ0VOU0UxXSkKKworICAgICMgQWRkIHNhbWUgcGFja2FnZSB3aXRoIGxpY2Vuc2UgMgorICAgIHNlbGYuc2JvbV9kb2MuYWRkX3BhY2thZ2Uoc2JvbV9kYXRhLlBhY2thZ2UoaWQ9U1BEWElEX1BSRUJVSUxUX1BBQ0tBR0UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0nUHJlYnVpbHQgcGFja2FnZTInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfbG9jYXRpb249c2JvbV9kYXRhLlZBTFVFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllcj1TVVBQTElFUl9HT09HTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPUJVSUxEX0ZJTkdFUl9QUklOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkX2xpY2Vuc2VfaWRzPVtTUERYSURfTElDRU5TRTJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5kZWNsYXJlZF9saWNlbnNlX2lkcywgW1NQRFhJRF9MSUNFTlNFMSwgU1BEWElEX0xJQ0VOU0UyXSkKKworICAgICMgQWRkIHNhbWUgcGFja2FnZSB3aXRoIGxpY2Vuc2UgMiBhZ2FpbgorICAgIHNlbGYuc2JvbV9kb2MuYWRkX3BhY2thZ2Uoc2JvbV9kYXRhLlBhY2thZ2UoaWQ9U1BEWElEX1BSRUJVSUxUX1BBQ0tBR0UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0nUHJlYnVpbHQgcGFja2FnZTInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfbG9jYXRpb249c2JvbV9kYXRhLlZBTFVFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllcj1TVVBQTElFUl9HT09HTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPUJVSUxEX0ZJTkdFUl9QUklOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkX2xpY2Vuc2VfaWRzPVtTUERYSURfTElDRU5TRTJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5kZWNsYXJlZF9saWNlbnNlX2lkcywgW1NQRFhJRF9MSUNFTlNFMSwgU1BEWElEX0xJQ0VOU0UyXSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yKQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2JvbS9zYm9tX3dyaXRlcnMucHkgYi90b29scy9zYm9tL3Nib21fd3JpdGVycy5weQppbmRleCAxY2I4NjRkLi4yNmIzYzU3IDEwMDY0NAotLS0gYS90b29scy9zYm9tL3Nib21fd3JpdGVycy5weQorKysgYi90b29scy9zYm9tL3Nib21fd3JpdGVycy5weQpAQCAtNjQsNiArNjQsMTEgQEAKICAgIyBSZWxhdGlvbnNoaXAKICAgUkVMQVRJT05TSElQID0gJ1JlbGF0aW9uc2hpcCcKIAorICAjIExpY2Vuc2UKKyAgTElDRU5TRV9JRCA9ICdMaWNlbnNlSUQnCisgIExJQ0VOU0VfTkFNRSA9ICdMaWNlbnNlTmFtZScKKyAgTElDRU5TRV9FWFRSQUNURURfVEVYVCA9ICdFeHRyYWN0ZWRUZXh0JworCiAKIGNsYXNzIFRhZ1ZhbHVlV3JpdGVyOgogICBAc3RhdGljbWV0aG9kCkBAIC05OSw2ICsxMDQsMTIgQEAKICAgICAgIHRhZ3ZhbHVlcy5hcHBlbmQoZid7VGFncy5QQUNLQUdFX1ZFUlNJT059OiB7cGFja2FnZS52ZXJzaW9ufScpCiAgICAgaWYgcGFja2FnZS5zdXBwbGllcjoKICAgICAgIHRhZ3ZhbHVlcy5hcHBlbmQoZid7VGFncy5QQUNLQUdFX1NVUFBMSUVSfToge3BhY2thZ2Uuc3VwcGxpZXJ9JykKKworICAgIGxpY2Vuc2UgPSBzYm9tX2RhdGEuVkFMVUVfTk9BU1NFUlRJT04KKyAgICBpZiBwYWNrYWdlLmRlY2xhcmVkX2xpY2Vuc2VfaWRzOgorICAgICAgbGljZW5zZSA9ICcgT1IgJy5qb2luKHBhY2thZ2UuZGVjbGFyZWRfbGljZW5zZV9pZHMpCisgICAgdGFndmFsdWVzLmFwcGVuZChmJ3tUYWdzLlBBQ0tBR0VfTElDRU5TRV9ERUNMQVJFRH06IHtsaWNlbnNlfScpCisKICAgICBpZiBwYWNrYWdlLnZlcmlmaWNhdGlvbl9jb2RlOgogICAgICAgdGFndmFsdWVzLmFwcGVuZChmJ3tUYWdzLlBBQ0tBR0VfVkVSSUZJQ0FUSU9OX0NPREV9OiB7cGFja2FnZS52ZXJpZmljYXRpb25fY29kZX0nKQogICAgIGlmIHBhY2thZ2UuZXh0ZXJuYWxfcmVmczoKQEAgLTE1NSw4ICsxNjYsMTIgQEAKICAgICAgIGYne1RhZ3MuRklMRV9OQU1FfToge2ZpbGUubmFtZX0nLAogICAgICAgZid7VGFncy5TUERYSUR9OiB7ZmlsZS5pZH0nLAogICAgICAgZid7VGFncy5GSUxFX0NIRUNLU1VNfToge2ZpbGUuY2hlY2tzdW19JywKLSAgICAgICcnLAogICAgIF0KKyAgICBsaWNlbnNlID0gc2JvbV9kYXRhLlZBTFVFX05PQVNTRVJUSU9OCisgICAgaWYgZmlsZS5jb25jbHVkZWRfbGljZW5zZV9pZHM6CisgICAgICBsaWNlbnNlID0gJyBPUiAnLmpvaW4oZmlsZS5jb25jbHVkZWRfbGljZW5zZV9pZHMpCisgICAgdGFndmFsdWVzLmFwcGVuZChmJ3tUYWdzLkZJTEVfTElDRU5TRV9DT05DTFVERUR9OiB7bGljZW5zZX0nKQorICAgIHRhZ3ZhbHVlcy5hcHBlbmQoJycpCiAKICAgICByZXR1cm4gdGFndmFsdWVzCiAKQEAgLTE5NCw2ICsyMDksMjIgQEAKICAgICByZXR1cm4gdGFndmFsdWVzCiAKICAgQHN0YXRpY21ldGhvZAorICBkZWYgbWFyc2hhbF9saWNlbnNlKGxpY2Vuc2UpOgorICAgIHRhZ3ZhbHVlcyA9IFtdCisgICAgdGFndmFsdWVzLmFwcGVuZChmJ3tUYWdzLkxJQ0VOU0VfSUR9OiB7bGljZW5zZS5pZH0nKQorICAgIHRhZ3ZhbHVlcy5hcHBlbmQoZid7VGFncy5MSUNFTlNFX05BTUV9OiB7bGljZW5zZS5uYW1lfScpCisgICAgdGFndmFsdWVzLmFwcGVuZChmJ3tUYWdzLkxJQ0VOU0VfRVhUUkFDVEVEX1RFWFR9OiA8dGV4dD57bGljZW5zZS50ZXh0fTwvdGV4dD4nKQorICAgIHJldHVybiB0YWd2YWx1ZXMKKworICBAc3RhdGljbWV0aG9kCisgIGRlZiBtYXJzaGFsX2xpY2Vuc2VzKHNib21fZG9jKToKKyAgICB0YWd2YWx1ZXMgPSBbXQorICAgIGZvciBsaWNlbnNlIGluIHNib21fZG9jLmxpY2Vuc2VzOgorICAgICAgdGFndmFsdWVzICs9IFRhZ1ZhbHVlV3JpdGVyLm1hcnNoYWxfbGljZW5zZShsaWNlbnNlKQorICAgICAgdGFndmFsdWVzLmFwcGVuZCgnJykKKyAgICByZXR1cm4gdGFndmFsdWVzCisKKyAgQHN0YXRpY21ldGhvZAogICBkZWYgd3JpdGUoc2JvbV9kb2MsIGZpbGUsIGZyYWdtZW50PUZhbHNlKToKICAgICBjb250ZW50ID0gW10KICAgICBpZiBub3QgZnJhZ21lbnQ6CkBAIC0yMDIsNiArMjMzLDcgQEAKICAgICB0YWd2YWx1ZXMsIG1hcnNoYWxlZF9yZWxhdGlvbnNoaXBzID0gVGFnVmFsdWVXcml0ZXIubWFyc2hhbF9wYWNrYWdlcyhzYm9tX2RvYywgZnJhZ21lbnQpCiAgICAgY29udGVudCArPSB0YWd2YWx1ZXMKICAgICBjb250ZW50ICs9IFRhZ1ZhbHVlV3JpdGVyLm1hcnNoYWxfcmVsYXRpb25zaGlwcyhzYm9tX2RvYywgbWFyc2hhbGVkX3JlbGF0aW9uc2hpcHMpCisgICAgY29udGVudCArPSBUYWdWYWx1ZVdyaXRlci5tYXJzaGFsX2xpY2Vuc2VzKHNib21fZG9jKQogICAgIGZpbGUud3JpdGUoJ1xuJy5qb2luKGNvbnRlbnQpKQogCiAKQEAgLTIzNiwxMSArMjY4LDEzIEBACiAgIFBBQ0tBR0VfRVhURVJOQUxfUkVGX1RZUEUgPSAncmVmZXJlbmNlVHlwZScKICAgUEFDS0FHRV9FWFRFUk5BTF9SRUZfTE9DQVRPUiA9ICdyZWZlcmVuY2VMb2NhdG9yJwogICBQQUNLQUdFX0hBU19GSUxFUyA9ICdoYXNGaWxlcycKKyAgUEFDS0FHRV9MSUNFTlNFX0RFQ0xBUkVEID0gJ2xpY2Vuc2VEZWNsYXJlZCcKIAogICAjIEZpbGUKICAgRklMRVMgPSAnZmlsZXMnCiAgIEZJTEVfTkFNRSA9ICdmaWxlTmFtZScKICAgRklMRV9DSEVDS1NVTVMgPSAnY2hlY2tzdW1zJworICBGSUxFX0xJQ0VOU0VfQ09OQ0xVREVEID0gJ2xpY2Vuc2VDb25jbHVkZWQnCiAKICAgIyBSZWxhdGlvbnNoaXAKICAgUkVMQVRJT05TSElQUyA9ICdyZWxhdGlvbnNoaXBzJwpAQCAtMjQ4LDYgKzI4MiwxMiBAQAogICBSRUxfUkVMQVRFRF9FTEVNRU5UX0lEID0gJ3JlbGF0ZWRTcGR4RWxlbWVudCcKICAgUkVMX1RZUEUgPSAncmVsYXRpb25zaGlwVHlwZScKIAorICAjIExpY2Vuc2UKKyAgTElDRU5TRVMgPSAnaGFzRXh0cmFjdGVkTGljZW5zaW5nSW5mb3MnCisgIExJQ0VOU0VfSUQgPSAnbGljZW5zZUlkJworICBMSUNFTlNFX05BTUUgPSAnbmFtZScKKyAgTElDRU5TRV9FWFRSQUNURURfVEVYVCA9ICdleHRyYWN0ZWRUZXh0JworCiAKIGNsYXNzIEpTT05Xcml0ZXI6CiAgIEBzdGF0aWNtZXRob2QKQEAgLTI5NCw2ICszMzQsOSBAQAogICAgICAgICBwYWNrYWdlW1Byb3BOYW1lcy5QQUNLQUdFX1ZFUlNJT05dID0gcC52ZXJzaW9uCiAgICAgICBpZiBwLnN1cHBsaWVyOgogICAgICAgICBwYWNrYWdlW1Byb3BOYW1lcy5QQUNLQUdFX1NVUFBMSUVSXSA9IHAuc3VwcGxpZXIKKyAgICAgIHBhY2thZ2VbUHJvcE5hbWVzLlBBQ0tBR0VfTElDRU5TRV9ERUNMQVJFRF0gPSBzYm9tX2RhdGEuVkFMVUVfTk9BU1NFUlRJT04KKyAgICAgIGlmIHAuZGVjbGFyZWRfbGljZW5zZV9pZHM6CisgICAgICAgIHBhY2thZ2VbUHJvcE5hbWVzLlBBQ0tBR0VfTElDRU5TRV9ERUNMQVJFRF0gPSAnIE9SICcuam9pbihwLmRlY2xhcmVkX2xpY2Vuc2VfaWRzKQogICAgICAgaWYgcC52ZXJpZmljYXRpb25fY29kZToKICAgICAgICAgcGFja2FnZVtQcm9wTmFtZXMuUEFDS0FHRV9WRVJJRklDQVRJT05fQ09ERV0gPSB7CiAgICAgICAgICAgUHJvcE5hbWVzLlBBQ0tBR0VfVkVSSUZJQ0FUSU9OX0NPREVfVkFMVUU6IHAudmVyaWZpY2F0aW9uX2NvZGUKQEAgLTMyOSw2ICszNzIsOSBAQAogICAgICAgICBQcm9wTmFtZXMuQUxHT1JJVEhNOiBjaGVja3N1bVswXSwKICAgICAgICAgUHJvcE5hbWVzLkNIRUNLU1VNX1ZBTFVFOiBjaGVja3N1bVsxXSwKICAgICAgIH1dCisgICAgICBmaWxlW1Byb3BOYW1lcy5GSUxFX0xJQ0VOU0VfQ09OQ0xVREVEXSA9IHNib21fZGF0YS5WQUxVRV9OT0FTU0VSVElPTgorICAgICAgaWYgZi5jb25jbHVkZWRfbGljZW5zZV9pZHM6CisgICAgICAgIGZpbGVbUHJvcE5hbWVzLkZJTEVfTElDRU5TRV9DT05DTFVERURdID0gJyBPUiAnLmpvaW4oZi5jb25jbHVkZWRfbGljZW5zZV9pZHMpCiAgICAgICBmaWxlcy5hcHBlbmQoZmlsZSkKICAgICByZXR1cm4ge1Byb3BOYW1lcy5GSUxFUzogZmlsZXN9CiAKQEAgLTM0NywxMCArMzkzLDIyIEBACiAgICAgcmV0dXJuIHtQcm9wTmFtZXMuUkVMQVRJT05TSElQUzogcmVsYXRpb25zaGlwc30KIAogICBAc3RhdGljbWV0aG9kCisgIGRlZiBtYXJzaGFsX2xpY2Vuc2VzKHNib21fZG9jKToKKyAgICBsaWNlbnNlcyA9IFtdCisgICAgZm9yIGwgaW4gc2JvbV9kb2MubGljZW5zZXM6CisgICAgICBsaWNlbnNlcy5hcHBlbmQoeworICAgICAgICAgIFByb3BOYW1lcy5MSUNFTlNFX0lEOiBsLmlkLAorICAgICAgICAgIFByb3BOYW1lcy5MSUNFTlNFX05BTUU6IGwubmFtZSwKKyAgICAgICAgICBQcm9wTmFtZXMuTElDRU5TRV9FWFRSQUNURURfVEVYVDogZic8dGV4dD57bC50ZXh0fTwvdGV4dD4nCisgICAgICB9KQorICAgIHJldHVybiB7UHJvcE5hbWVzLkxJQ0VOU0VTOiBsaWNlbnNlc30KKworICBAc3RhdGljbWV0aG9kCiAgIGRlZiB3cml0ZShzYm9tX2RvYywgZmlsZSk6CiAgICAgZG9jID0ge30KICAgICBkb2MudXBkYXRlKEpTT05Xcml0ZXIubWFyc2hhbF9kb2NfaGVhZGVycyhzYm9tX2RvYykpCiAgICAgZG9jLnVwZGF0ZShKU09OV3JpdGVyLm1hcnNoYWxfcGFja2FnZXMoc2JvbV9kb2MpKQogICAgIGRvYy51cGRhdGUoSlNPTldyaXRlci5tYXJzaGFsX2ZpbGVzKHNib21fZG9jKSkKICAgICBkb2MudXBkYXRlKEpTT05Xcml0ZXIubWFyc2hhbF9yZWxhdGlvbnNoaXBzKHNib21fZG9jKSkKKyAgICBkb2MudXBkYXRlKEpTT05Xcml0ZXIubWFyc2hhbF9saWNlbnNlcyhzYm9tX2RvYykpCiAgICAgZmlsZS53cml0ZShqc29uLmR1bXBzKGRvYywgaW5kZW50PTQpKQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2JvbS9zYm9tX3dyaXRlcnNfdGVzdC5weSBiL3Rvb2xzL3Nib20vc2JvbV93cml0ZXJzX3Rlc3QucHkKaW5kZXggY2Y4NWUwMS4uZjlmNTIzMCAxMDA2NDQKLS0tIGEvdG9vbHMvc2JvbS9zYm9tX3dyaXRlcnNfdGVzdC5weQorKysgYi90b29scy9zYm9tL3Nib21fd3JpdGVyc190ZXN0LnB5CkBAIC0zMyw2ICszMywxNCBAQAogU1BEWElEX0ZJTEUzID0gJ1NQRFhSZWYtZmlsZTMnCiBTUERYSURfRklMRTQgPSAnU1BEWFJlZi1maWxlNCcKIAorU1BEWElEX0xJQ0VOU0VfMSA9ICdMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0xJworU1BEWElEX0xJQ0VOU0VfMiA9ICdMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0yJworU1BEWElEX0xJQ0VOU0VfMyA9ICdMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0zJworCitMSUNFTlNFX0FQQUNIRV9URVhUID0gIkxJQ0VOU0VfQVBBQ0hFIgorTElDRU5TRTFfVEVYVCA9ICdMSUNFTlNFIDEnCitMSUNFTlNFMl9URVhUID0gJ0xJQ0VOU0UgMicKK0xJQ0VOU0UzX1RFWFQgPSAnTElDRU5TRSAzJwogCiBjbGFzcyBTQk9NV3JpdGVyc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCkBAIC02Myw2ICs3MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9sb2NhdGlvbj1zYm9tX2RhdGEuVkFMVUVfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVyPVNVUFBMSUVSX0dPT0dMRSwKICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249QlVJTERfRklOR0VSX1BSSU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWRfbGljZW5zZV9pZHM9W3Nib21fZGF0YS5TUERYSURfTElDRU5TRV9BUEFDSEVdCiAgICAgICAgICAgICAgICAgICAgICAgICApKQogCiAgICAgc2VsZi5zYm9tX2RvYy5hZGRfcGFja2FnZSgKQEAgLTcxLDYgKzgwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2xvY2F0aW9uPXNib21fZGF0YS5WQUxVRV9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZXI9U1VQUExJRVJfR09PR0xFLAogICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1CVUlMRF9GSU5HRVJfUFJJTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZF9saWNlbnNlX2lkcz1bU1BEWElEX0xJQ0VOU0VfMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICApKQogCiAgICAgc2VsZi5zYm9tX2RvYy5hZGRfcGFja2FnZSgKQEAgLTc5LDYgKzg5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2xvY2F0aW9uPXNib21fZGF0YS5WQUxVRV9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZXI9U1VQUExJRVJfR09PR0xFLAogICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1CVUlMRF9GSU5HRVJfUFJJTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZF9saWNlbnNlX2lkcz1bU1BEWElEX0xJQ0VOU0VfMiwgU1BEWElEX0xJQ0VOU0VfM10sCiAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbF9yZWZzPVtzYm9tX2RhdGEuUGFja2FnZUV4dGVybmFsUmVmKAogICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT1zYm9tX2RhdGEuUGFja2FnZUV4dGVybmFsUmVmQ2F0ZWdvcnkuU0VDVVJJVFksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9c2JvbV9kYXRhLlBhY2thZ2VFeHRlcm5hbFJlZlR5cGUuY3BlMjJUeXBlLApAQCAtOTAsNiArMTAxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9J1Vwc3RyZWFtIHBhY2thZ2UxJywKICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVyPVNVUFBMSUVSX1VQU1RSRUFNLAogICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj0nMS4xJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkX2xpY2Vuc2VfaWRzPVtTUERYSURfTElDRU5TRV8yLCBTUERYSURfTElDRU5TRV8zXSwKICAgICAgICAgICAgICAgICAgICAgICAgICkpCiAKICAgICBzZWxmLnNib21fZG9jLmFkZF9yZWxhdGlvbnNoaXAoc2JvbV9kYXRhLlJlbGF0aW9uc2hpcChpZDE9U1BEWElEX1NPVVJDRV9QQUNLQUdFMSwKQEAgLTk3LDExICsxMDksMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDI9U1BEWElEX1VQU1RSRUFNX1BBQ0tBR0UxKSkKIAogICAgIHNlbGYuc2JvbV9kb2MuZmlsZXMuYXBwZW5kKAotICAgICAgc2JvbV9kYXRhLkZpbGUoaWQ9U1BEWElEX0ZJTEUxLCBuYW1lPScvYmluL2ZpbGUxJywgY2hlY2tzdW09J1NIQTE6IDExMTExJykpCisgICAgICBzYm9tX2RhdGEuRmlsZShpZD1TUERYSURfRklMRTEsIG5hbWU9Jy9iaW4vZmlsZTEnLCBjaGVja3N1bT0nU0hBMTogMTExMTEnLCBjb25jbHVkZWRfbGljZW5zZV9pZHM9W3Nib21fZGF0YS5TUERYSURfTElDRU5TRV9BUEFDSEVdKSkKICAgICBzZWxmLnNib21fZG9jLmZpbGVzLmFwcGVuZCgKLSAgICAgIHNib21fZGF0YS5GaWxlKGlkPVNQRFhJRF9GSUxFMiwgbmFtZT0nL2Jpbi9maWxlMicsIGNoZWNrc3VtPSdTSEExOiAyMjIyMicpKQorICAgICAgc2JvbV9kYXRhLkZpbGUoaWQ9U1BEWElEX0ZJTEUyLCBuYW1lPScvYmluL2ZpbGUyJywgY2hlY2tzdW09J1NIQTE6IDIyMjIyJywgY29uY2x1ZGVkX2xpY2Vuc2VfaWRzPVtTUERYSURfTElDRU5TRV8xXSkpCiAgICAgc2VsZi5zYm9tX2RvYy5maWxlcy5hcHBlbmQoCi0gICAgICBzYm9tX2RhdGEuRmlsZShpZD1TUERYSURfRklMRTMsIG5hbWU9Jy9iaW4vZmlsZTMnLCBjaGVja3N1bT0nU0hBMTogMzMzMzMnKSkKKyAgICAgIHNib21fZGF0YS5GaWxlKGlkPVNQRFhJRF9GSUxFMywgbmFtZT0nL2Jpbi9maWxlMycsIGNoZWNrc3VtPSdTSEExOiAzMzMzMycsIGNvbmNsdWRlZF9saWNlbnNlX2lkcz1bU1BEWElEX0xJQ0VOU0VfMiwgU1BEWElEX0xJQ0VOU0VfM10pKQogICAgIHNlbGYuc2JvbV9kb2MuZmlsZXMuYXBwZW5kKAogICAgICAgc2JvbV9kYXRhLkZpbGUoaWQ9U1BEWElEX0ZJTEU0LCBuYW1lPSdmaWxlNC5hJywgY2hlY2tzdW09J1NIQTE6IDQ0NDQ0JykpCiAKQEAgLTEyMCw2ICsxMzIsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDI9U1BEWElEX0ZJTEU0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKIAorICAgIHNlbGYuc2JvbV9kb2MuYWRkX2xpY2Vuc2Uoc2JvbV9kYXRhLkxpY2Vuc2Uoc2JvbV9kYXRhLlNQRFhJRF9MSUNFTlNFX0FQQUNIRSwgTElDRU5TRV9BUEFDSEVfVEVYVCwgIkxpY2Vuc2UtQXBhY2hlIikpCisgICAgc2VsZi5zYm9tX2RvYy5hZGRfbGljZW5zZShzYm9tX2RhdGEuTGljZW5zZShTUERYSURfTElDRU5TRV8xLCBMSUNFTlNFMV9URVhULCAiTGljZW5zZS0xIikpCisgICAgc2VsZi5zYm9tX2RvYy5hZGRfbGljZW5zZShzYm9tX2RhdGEuTGljZW5zZShTUERYSURfTElDRU5TRV8yLCBMSUNFTlNFMl9URVhULCAiTGljZW5zZS0yIikpCisgICAgc2VsZi5zYm9tX2RvYy5hZGRfbGljZW5zZShzYm9tX2RhdGEuTGljZW5zZShTUERYSURfTElDRU5TRV8zLCBMSUNFTlNFM19URVhULCAiTGljZW5zZS0zIikpCisKICAgICAjIFNCT00gZnJhZ21lbnQgb2YgYSBBUEsKICAgICBzZWxmLnVuYnVuZGxlZF9zYm9tX2RvYyA9IHNib21fZGF0YS5Eb2N1bWVudChuYW1lPSd0ZXN0IGRvYycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSdodHRwOi8vd3d3Lmdvb2dsZS5jb20vc2JvbS9zcGR4L2FuZHJvaWQnLApkaWZmIC0tZ2l0IGEvdG9vbHMvc2JvbS90ZXN0ZGF0YS9leHBlY3RlZF9qc29uX3Nib20uc3BkeC5qc29uIGIvdG9vbHMvc2JvbS90ZXN0ZGF0YS9leHBlY3RlZF9qc29uX3Nib20uc3BkeC5qc29uCmluZGV4IDUzOTM2YzUuLmE4Nzc4MTAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Nib20vdGVzdGRhdGEvZXhwZWN0ZWRfanNvbl9zYm9tLnNwZHguanNvbgorKysgYi90b29scy9zYm9tL3Rlc3RkYXRhL2V4cGVjdGVkX2pzb25fc2JvbS5zcGR4Lmpzb24KQEAgLTMxLDYgKzMxLDcgQEAKICAgICAgICAgICAgICJmaWxlc0FuYWx5emVkIjogdHJ1ZSwKICAgICAgICAgICAgICJ2ZXJzaW9uSW5mbyI6ICJidWlsZF9maW5nZXJfcHJpbnQiLAogICAgICAgICAgICAgInN1cHBsaWVyIjogIk9yZ2FuaXphdGlvbjogR29vZ2xlIiwKKyAgICAgICAgICAgICJsaWNlbnNlRGVjbGFyZWQiOiAiTk9BU1NFUlRJT04iLAogICAgICAgICAgICAgInBhY2thZ2VWZXJpZmljYXRpb25Db2RlIjogewogICAgICAgICAgICAgICAgICJwYWNrYWdlVmVyaWZpY2F0aW9uQ29kZVZhbHVlIjogIjEyMzQ1NiIKICAgICAgICAgICAgIH0sCkBAIC00Niw3ICs0Nyw4IEBACiAgICAgICAgICAgICAiZG93bmxvYWRMb2NhdGlvbiI6ICJOT05FIiwKICAgICAgICAgICAgICJmaWxlc0FuYWx5emVkIjogZmFsc2UsCiAgICAgICAgICAgICAidmVyc2lvbkluZm8iOiAiYnVpbGRfZmluZ2VyX3ByaW50IiwKLSAgICAgICAgICAgICJzdXBwbGllciI6ICJPcmdhbml6YXRpb246IEdvb2dsZSIKKyAgICAgICAgICAgICJzdXBwbGllciI6ICJPcmdhbml6YXRpb246IEdvb2dsZSIsCisgICAgICAgICAgICAibGljZW5zZURlY2xhcmVkIjogIkxpY2Vuc2VSZWYtQW5kcm9pZC1BcGFjaGUtMi4wIgogICAgICAgICB9LAogICAgICAgICB7CiAgICAgICAgICAgICAibmFtZSI6ICJQcmVidWlsdCBwYWNrYWdlMSIsCkBAIC01NCw3ICs1Niw4IEBACiAgICAgICAgICAgICAiZG93bmxvYWRMb2NhdGlvbiI6ICJOT05FIiwKICAgICAgICAgICAgICJmaWxlc0FuYWx5emVkIjogZmFsc2UsCiAgICAgICAgICAgICAidmVyc2lvbkluZm8iOiAiYnVpbGRfZmluZ2VyX3ByaW50IiwKLSAgICAgICAgICAgICJzdXBwbGllciI6ICJPcmdhbml6YXRpb246IEdvb2dsZSIKKyAgICAgICAgICAgICJzdXBwbGllciI6ICJPcmdhbml6YXRpb246IEdvb2dsZSIsCisgICAgICAgICAgICAibGljZW5zZURlY2xhcmVkIjogIkxpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTEiCiAgICAgICAgIH0sCiAgICAgICAgIHsKICAgICAgICAgICAgICJuYW1lIjogIlNvdXJjZSBwYWNrYWdlMSIsCkBAIC02Myw2ICs2Niw3IEBACiAgICAgICAgICAgICAiZmlsZXNBbmFseXplZCI6IGZhbHNlLAogICAgICAgICAgICAgInZlcnNpb25JbmZvIjogImJ1aWxkX2Zpbmdlcl9wcmludCIsCiAgICAgICAgICAgICAic3VwcGxpZXIiOiAiT3JnYW5pemF0aW9uOiBHb29nbGUiLAorICAgICAgICAgICAgImxpY2Vuc2VEZWNsYXJlZCI6ICJMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0yIE9SIExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTMiLAogICAgICAgICAgICAgImV4dGVybmFsUmVmcyI6IFsKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICJyZWZlcmVuY2VDYXRlZ29yeSI6ICJTRUNVUklUWSIsCkBAIC03Nyw3ICs4MSw4IEBACiAgICAgICAgICAgICAiZG93bmxvYWRMb2NhdGlvbiI6ICJOT0FTU0VSVElPTiIsCiAgICAgICAgICAgICAiZmlsZXNBbmFseXplZCI6IGZhbHNlLAogICAgICAgICAgICAgInZlcnNpb25JbmZvIjogIjEuMSIsCi0gICAgICAgICAgICAic3VwcGxpZXIiOiAiT3JnYW5pemF0aW9uOiB1cHN0cmVhbSIKKyAgICAgICAgICAgICJzdXBwbGllciI6ICJPcmdhbml6YXRpb246IHVwc3RyZWFtIiwKKyAgICAgICAgICAgICJsaWNlbnNlRGVjbGFyZWQiOiAiTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMiBPUiBMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0zIgogICAgICAgICB9CiAgICAgXSwKICAgICAiZmlsZXMiOiBbCkBAIC04OSw3ICs5NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICJhbGdvcml0aG0iOiAiU0hBMSIsCiAgICAgICAgICAgICAgICAgICAgICJjaGVja3N1bVZhbHVlIjogIjExMTExIgogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF0KKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAibGljZW5zZUNvbmNsdWRlZCI6ICJMaWNlbnNlUmVmLUFuZHJvaWQtQXBhY2hlLTIuMCIKICAgICAgICAgfSwKICAgICAgICAgewogICAgICAgICAgICAgImZpbGVOYW1lIjogIi9iaW4vZmlsZTIiLApAQCAtOTksNyArMTA1LDggQEAKICAgICAgICAgICAgICAgICAgICAgImFsZ29yaXRobSI6ICJTSEExIiwKICAgICAgICAgICAgICAgICAgICAgImNoZWNrc3VtVmFsdWUiOiAiMjIyMjIiCiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgXQorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJsaWNlbnNlQ29uY2x1ZGVkIjogIkxpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTEiCiAgICAgICAgIH0sCiAgICAgICAgIHsKICAgICAgICAgICAgICJmaWxlTmFtZSI6ICIvYmluL2ZpbGUzIiwKQEAgLTEwOSw3ICsxMTYsOCBAQAogICAgICAgICAgICAgICAgICAgICAiYWxnb3JpdGhtIjogIlNIQTEiLAogICAgICAgICAgICAgICAgICAgICAiY2hlY2tzdW1WYWx1ZSI6ICIzMzMzMyIKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBdCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImxpY2Vuc2VDb25jbHVkZWQiOiAiTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMiBPUiBMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0zIgogICAgICAgICB9LAogICAgICAgICB7CiAgICAgICAgICAgICAiZmlsZU5hbWUiOiAiZmlsZTQuYSIsCkBAIC0xMTksNyArMTI3LDggQEAKICAgICAgICAgICAgICAgICAgICAgImFsZ29yaXRobSI6ICJTSEExIiwKICAgICAgICAgICAgICAgICAgICAgImNoZWNrc3VtVmFsdWUiOiAiNDQ0NDQiCiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgXQorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICJsaWNlbnNlQ29uY2x1ZGVkIjogIk5PQVNTRVJUSU9OIgogICAgICAgICB9CiAgICAgXSwKICAgICAicmVsYXRpb25zaGlwcyI6IFsKQEAgLTE0OCw1ICsxNTcsMjcgQEAKICAgICAgICAgICAgICJyZWxhdGVkU3BkeEVsZW1lbnQiOiAiU1BEWFJlZi1VUFNUUkVBTS1wYWNrYWdlMSIsCiAgICAgICAgICAgICAicmVsYXRpb25zaGlwVHlwZSI6ICJWQVJJQU5UX09GIgogICAgICAgICB9CisgICAgXSwKKyAgICAiaGFzRXh0cmFjdGVkTGljZW5zaW5nSW5mb3MiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAgICJsaWNlbnNlSWQiOiAiTGljZW5zZVJlZi1BbmRyb2lkLUFwYWNoZS0yLjAiLAorICAgICAgICAgICAgIm5hbWUiOiAiTGljZW5zZS1BcGFjaGUiLAorICAgICAgICAgICAgImV4dHJhY3RlZFRleHQiOiAiPHRleHQ+TElDRU5TRV9BUEFDSEU8L3RleHQ+IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAibGljZW5zZUlkIjogIkxpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTEiLAorICAgICAgICAgICAgIm5hbWUiOiAiTGljZW5zZS0xIiwKKyAgICAgICAgICAgICJleHRyYWN0ZWRUZXh0IjogIjx0ZXh0PkxJQ0VOU0UgMTwvdGV4dD4iCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJsaWNlbnNlSWQiOiAiTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMiIsCisgICAgICAgICAgICAibmFtZSI6ICJMaWNlbnNlLTIiLAorICAgICAgICAgICAgImV4dHJhY3RlZFRleHQiOiAiPHRleHQ+TElDRU5TRSAyPC90ZXh0PiIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImxpY2Vuc2VJZCI6ICJMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0zIiwKKyAgICAgICAgICAgICJuYW1lIjogIkxpY2Vuc2UtMyIsCisgICAgICAgICAgICAiZXh0cmFjdGVkVGV4dCI6ICI8dGV4dD5MSUNFTlNFIDM8L3RleHQ+IgorICAgICAgICB9CiAgICAgXQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3Nib20vdGVzdGRhdGEvZXhwZWN0ZWRfdGFndmFsdWVfc2JvbS5zcGR4IGIvdG9vbHMvc2JvbS90ZXN0ZGF0YS9leHBlY3RlZF90YWd2YWx1ZV9zYm9tLnNwZHgKaW5kZXggZTZmZDE3ZS4uMWM1NDQxMCAxMDA2NDQKLS0tIGEvdG9vbHMvc2JvbS90ZXN0ZGF0YS9leHBlY3RlZF90YWd2YWx1ZV9zYm9tLnNwZHgKKysrIGIvdG9vbHMvc2JvbS90ZXN0ZGF0YS9leHBlY3RlZF90YWd2YWx1ZV9zYm9tLnNwZHgKQEAgLTEwLDYgKzEwLDcgQEAKIEZpbGVOYW1lOiBmaWxlNC5hCiBTUERYSUQ6IFNQRFhSZWYtZmlsZTQKIEZpbGVDaGVja3N1bTogU0hBMTogNDQ0NDQKK0xpY2Vuc2VDb25jbHVkZWQ6IE5PQVNTRVJUSU9OCiAKIFBhY2thZ2VOYW1lOiBQUk9EVUNUCiBTUERYSUQ6IFNQRFhSZWYtUFJPRFVDVApAQCAtMTcsNiArMTgsNyBAQAogRmlsZXNBbmFseXplZDogdHJ1ZQogUGFja2FnZVZlcnNpb246IGJ1aWxkX2Zpbmdlcl9wcmludAogUGFja2FnZVN1cHBsaWVyOiBPcmdhbml6YXRpb246IEdvb2dsZQorUGFja2FnZUxpY2Vuc2VEZWNsYXJlZDogTk9BU1NFUlRJT04KIFBhY2thZ2VWZXJpZmljYXRpb25Db2RlOiAxMjM0NTYKIAogUmVsYXRpb25zaGlwOiBTUERYUmVmLURPQ1VNRU5UIERFU0NSSUJFUyBTUERYUmVmLVBST0RVQ1QKQEAgLTI0LDE0ICsyNiwxNyBAQAogRmlsZU5hbWU6IC9iaW4vZmlsZTEKIFNQRFhJRDogU1BEWFJlZi1maWxlMQogRmlsZUNoZWNrc3VtOiBTSEExOiAxMTExMQorTGljZW5zZUNvbmNsdWRlZDogTGljZW5zZVJlZi1BbmRyb2lkLUFwYWNoZS0yLjAKIAogRmlsZU5hbWU6IC9iaW4vZmlsZTIKIFNQRFhJRDogU1BEWFJlZi1maWxlMgogRmlsZUNoZWNrc3VtOiBTSEExOiAyMjIyMgorTGljZW5zZUNvbmNsdWRlZDogTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMQogCiBGaWxlTmFtZTogL2Jpbi9maWxlMwogU1BEWElEOiBTUERYUmVmLWZpbGUzCiBGaWxlQ2hlY2tzdW06IFNIQTE6IDMzMzMzCitMaWNlbnNlQ29uY2x1ZGVkOiBMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0yIE9SIExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTMKIAogUGFja2FnZU5hbWU6IFBMQVRGT1JNCiBTUERYSUQ6IFNQRFhSZWYtUExBVEZPUk0KQEAgLTM5LDYgKzQ0LDcgQEAKIEZpbGVzQW5hbHl6ZWQ6IGZhbHNlCiBQYWNrYWdlVmVyc2lvbjogYnVpbGRfZmluZ2VyX3ByaW50CiBQYWNrYWdlU3VwcGxpZXI6IE9yZ2FuaXphdGlvbjogR29vZ2xlCitQYWNrYWdlTGljZW5zZURlY2xhcmVkOiBMaWNlbnNlUmVmLUFuZHJvaWQtQXBhY2hlLTIuMAogCiBQYWNrYWdlTmFtZTogUHJlYnVpbHQgcGFja2FnZTEKIFNQRFhJRDogU1BEWFJlZi1QUkVCVUlMVC1wYWNrYWdlMQpAQCAtNDYsNiArNTIsNyBAQAogRmlsZXNBbmFseXplZDogZmFsc2UKIFBhY2thZ2VWZXJzaW9uOiBidWlsZF9maW5nZXJfcHJpbnQKIFBhY2thZ2VTdXBwbGllcjogT3JnYW5pemF0aW9uOiBHb29nbGUKK1BhY2thZ2VMaWNlbnNlRGVjbGFyZWQ6IExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTEKIAogUGFja2FnZU5hbWU6IFNvdXJjZSBwYWNrYWdlMQogU1BEWElEOiBTUERYUmVmLVNPVVJDRS1wYWNrYWdlMQpAQCAtNTMsNiArNjAsNyBAQAogRmlsZXNBbmFseXplZDogZmFsc2UKIFBhY2thZ2VWZXJzaW9uOiBidWlsZF9maW5nZXJfcHJpbnQKIFBhY2thZ2VTdXBwbGllcjogT3JnYW5pemF0aW9uOiBHb29nbGUKK1BhY2thZ2VMaWNlbnNlRGVjbGFyZWQ6IExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTIgT1IgTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMwogRXh0ZXJuYWxSZWY6IFNFQ1VSSVRZIGNwZTIyVHlwZSBjcGU6L2E6anNvbmNwcF9wcm9qZWN0Ompzb25jcHA6MS45LjQKIAogUGFja2FnZU5hbWU6IFVwc3RyZWFtIHBhY2thZ2UxCkBAIC02MSw2ICs2OSw3IEBACiBGaWxlc0FuYWx5emVkOiBmYWxzZQogUGFja2FnZVZlcnNpb246IDEuMQogUGFja2FnZVN1cHBsaWVyOiBPcmdhbml6YXRpb246IHVwc3RyZWFtCitQYWNrYWdlTGljZW5zZURlY2xhcmVkOiBMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0yIE9SIExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTMKIAogUmVsYXRpb25zaGlwOiBTUERYUmVmLVNPVVJDRS1wYWNrYWdlMSBWQVJJQU5UX09GIFNQRFhSZWYtVVBTVFJFQU0tcGFja2FnZTEKIApAQCAtNjgsMyArNzcsMTkgQEAKIFJlbGF0aW9uc2hpcDogU1BEWFJlZi1maWxlMiBHRU5FUkFURURfRlJPTSBTUERYUmVmLVBSRUJVSUxULXBhY2thZ2UxCiBSZWxhdGlvbnNoaXA6IFNQRFhSZWYtZmlsZTMgR0VORVJBVEVEX0ZST00gU1BEWFJlZi1TT1VSQ0UtcGFja2FnZTEKIFJlbGF0aW9uc2hpcDogU1BEWFJlZi1maWxlMSBTVEFUSUNfTElOSyBTUERYUmVmLWZpbGU0CisKK0xpY2Vuc2VJRDogTGljZW5zZVJlZi1BbmRyb2lkLUFwYWNoZS0yLjAKK0xpY2Vuc2VOYW1lOiBMaWNlbnNlLUFwYWNoZQorRXh0cmFjdGVkVGV4dDogPHRleHQ+TElDRU5TRV9BUEFDSEU8L3RleHQ+CisKK0xpY2Vuc2VJRDogTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMQorTGljZW5zZU5hbWU6IExpY2Vuc2UtMQorRXh0cmFjdGVkVGV4dDogPHRleHQ+TElDRU5TRSAxPC90ZXh0PgorCitMaWNlbnNlSUQ6IExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTIKK0xpY2Vuc2VOYW1lOiBMaWNlbnNlLTIKK0V4dHJhY3RlZFRleHQ6IDx0ZXh0PkxJQ0VOU0UgMjwvdGV4dD4KKworTGljZW5zZUlEOiBMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0zCitMaWNlbnNlTmFtZTogTGljZW5zZS0zCitFeHRyYWN0ZWRUZXh0OiA8dGV4dD5MSUNFTlNFIDM8L3RleHQ+CmRpZmYgLS1naXQgYS90b29scy9zYm9tL3Rlc3RkYXRhL2V4cGVjdGVkX3RhZ3ZhbHVlX3Nib21fZG9jX2Rlc2NyaWJlc19maWxlLnNwZHggYi90b29scy9zYm9tL3Rlc3RkYXRhL2V4cGVjdGVkX3RhZ3ZhbHVlX3Nib21fZG9jX2Rlc2NyaWJlc19maWxlLnNwZHgKaW5kZXggNDI4ZDdlMy4uMzZhZmM4YiAxMDA2NDQKLS0tIGEvdG9vbHMvc2JvbS90ZXN0ZGF0YS9leHBlY3RlZF90YWd2YWx1ZV9zYm9tX2RvY19kZXNjcmliZXNfZmlsZS5zcGR4CisrKyBiL3Rvb2xzL3Nib20vdGVzdGRhdGEvZXhwZWN0ZWRfdGFndmFsdWVfc2JvbV9kb2NfZGVzY3JpYmVzX2ZpbGUuc3BkeApAQCAtMTAsNiArMTAsNyBAQAogRmlsZU5hbWU6IGZpbGU0LmEKIFNQRFhJRDogU1BEWFJlZi1maWxlNAogRmlsZUNoZWNrc3VtOiBTSEExOiA0NDQ0NAorTGljZW5zZUNvbmNsdWRlZDogTk9BU1NFUlRJT04KIAogUmVsYXRpb25zaGlwOiBTUERYUmVmLURPQ1VNRU5UIERFU0NSSUJFUyBTUERYUmVmLWZpbGU0CiAKQEAgLTE5LDE5ICsyMCwyMyBAQAogRmlsZXNBbmFseXplZDogdHJ1ZQogUGFja2FnZVZlcnNpb246IGJ1aWxkX2Zpbmdlcl9wcmludAogUGFja2FnZVN1cHBsaWVyOiBPcmdhbml6YXRpb246IEdvb2dsZQorUGFja2FnZUxpY2Vuc2VEZWNsYXJlZDogTk9BU1NFUlRJT04KIFBhY2thZ2VWZXJpZmljYXRpb25Db2RlOiAxMjM0NTYKIAogRmlsZU5hbWU6IC9iaW4vZmlsZTEKIFNQRFhJRDogU1BEWFJlZi1maWxlMQogRmlsZUNoZWNrc3VtOiBTSEExOiAxMTExMQorTGljZW5zZUNvbmNsdWRlZDogTGljZW5zZVJlZi1BbmRyb2lkLUFwYWNoZS0yLjAKIAogRmlsZU5hbWU6IC9iaW4vZmlsZTIKIFNQRFhJRDogU1BEWFJlZi1maWxlMgogRmlsZUNoZWNrc3VtOiBTSEExOiAyMjIyMgorTGljZW5zZUNvbmNsdWRlZDogTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMQogCiBGaWxlTmFtZTogL2Jpbi9maWxlMwogU1BEWElEOiBTUERYUmVmLWZpbGUzCiBGaWxlQ2hlY2tzdW06IFNIQTE6IDMzMzMzCitMaWNlbnNlQ29uY2x1ZGVkOiBMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0yIE9SIExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTMKIAogUGFja2FnZU5hbWU6IFBMQVRGT1JNCiBTUERYSUQ6IFNQRFhSZWYtUExBVEZPUk0KQEAgLTM5LDYgKzQ0LDcgQEAKIEZpbGVzQW5hbHl6ZWQ6IGZhbHNlCiBQYWNrYWdlVmVyc2lvbjogYnVpbGRfZmluZ2VyX3ByaW50CiBQYWNrYWdlU3VwcGxpZXI6IE9yZ2FuaXphdGlvbjogR29vZ2xlCitQYWNrYWdlTGljZW5zZURlY2xhcmVkOiBMaWNlbnNlUmVmLUFuZHJvaWQtQXBhY2hlLTIuMAogCiBQYWNrYWdlTmFtZTogUHJlYnVpbHQgcGFja2FnZTEKIFNQRFhJRDogU1BEWFJlZi1QUkVCVUlMVC1wYWNrYWdlMQpAQCAtNDYsNiArNTIsNyBAQAogRmlsZXNBbmFseXplZDogZmFsc2UKIFBhY2thZ2VWZXJzaW9uOiBidWlsZF9maW5nZXJfcHJpbnQKIFBhY2thZ2VTdXBwbGllcjogT3JnYW5pemF0aW9uOiBHb29nbGUKK1BhY2thZ2VMaWNlbnNlRGVjbGFyZWQ6IExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTEKIAogUGFja2FnZU5hbWU6IFNvdXJjZSBwYWNrYWdlMQogU1BEWElEOiBTUERYUmVmLVNPVVJDRS1wYWNrYWdlMQpAQCAtNTMsNiArNjAsNyBAQAogRmlsZXNBbmFseXplZDogZmFsc2UKIFBhY2thZ2VWZXJzaW9uOiBidWlsZF9maW5nZXJfcHJpbnQKIFBhY2thZ2VTdXBwbGllcjogT3JnYW5pemF0aW9uOiBHb29nbGUKK1BhY2thZ2VMaWNlbnNlRGVjbGFyZWQ6IExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTIgT1IgTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMwogRXh0ZXJuYWxSZWY6IFNFQ1VSSVRZIGNwZTIyVHlwZSBjcGU6L2E6anNvbmNwcF9wcm9qZWN0Ompzb25jcHA6MS45LjQKIAogUGFja2FnZU5hbWU6IFVwc3RyZWFtIHBhY2thZ2UxCkBAIC02MSw2ICs2OSw3IEBACiBGaWxlc0FuYWx5emVkOiBmYWxzZQogUGFja2FnZVZlcnNpb246IDEuMQogUGFja2FnZVN1cHBsaWVyOiBPcmdhbml6YXRpb246IHVwc3RyZWFtCitQYWNrYWdlTGljZW5zZURlY2xhcmVkOiBMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0yIE9SIExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTMKIAogUmVsYXRpb25zaGlwOiBTUERYUmVmLVNPVVJDRS1wYWNrYWdlMSBWQVJJQU5UX09GIFNQRFhSZWYtVVBTVFJFQU0tcGFja2FnZTEKIApAQCAtNjgsMyArNzcsMTkgQEAKIFJlbGF0aW9uc2hpcDogU1BEWFJlZi1maWxlMiBHRU5FUkFURURfRlJPTSBTUERYUmVmLVBSRUJVSUxULXBhY2thZ2UxCiBSZWxhdGlvbnNoaXA6IFNQRFhSZWYtZmlsZTMgR0VORVJBVEVEX0ZST00gU1BEWFJlZi1TT1VSQ0UtcGFja2FnZTEKIFJlbGF0aW9uc2hpcDogU1BEWFJlZi1maWxlMSBTVEFUSUNfTElOSyBTUERYUmVmLWZpbGU0CisKK0xpY2Vuc2VJRDogTGljZW5zZVJlZi1BbmRyb2lkLUFwYWNoZS0yLjAKK0xpY2Vuc2VOYW1lOiBMaWNlbnNlLUFwYWNoZQorRXh0cmFjdGVkVGV4dDogPHRleHQ+TElDRU5TRV9BUEFDSEU8L3RleHQ+CisKK0xpY2Vuc2VJRDogTGljZW5zZVJlZi1BbmRyb2lkLUxpY2Vuc2UtMQorTGljZW5zZU5hbWU6IExpY2Vuc2UtMQorRXh0cmFjdGVkVGV4dDogPHRleHQ+TElDRU5TRSAxPC90ZXh0PgorCitMaWNlbnNlSUQ6IExpY2Vuc2VSZWYtQW5kcm9pZC1MaWNlbnNlLTIKK0xpY2Vuc2VOYW1lOiBMaWNlbnNlLTIKK0V4dHJhY3RlZFRleHQ6IDx0ZXh0PkxJQ0VOU0UgMjwvdGV4dD4KKworTGljZW5zZUlEOiBMaWNlbnNlUmVmLUFuZHJvaWQtTGljZW5zZS0zCitMaWNlbnNlTmFtZTogTGljZW5zZS0zCitFeHRyYWN0ZWRUZXh0OiA8dGV4dD5MSUNFTlNFIDM8L3RleHQ+CmRpZmYgLS1naXQgYS90b29scy9zYm9tL3Rlc3RkYXRhL2V4cGVjdGVkX3RhZ3ZhbHVlX3Nib21fdW5idW5kbGVkLnNwZHggYi90b29scy9zYm9tL3Rlc3RkYXRhL2V4cGVjdGVkX3RhZ3ZhbHVlX3Nib21fdW5idW5kbGVkLnNwZHgKaW5kZXggYTAwYzI5MS4uNGIxNGE0YiAxMDA2NDQKLS0tIGEvdG9vbHMvc2JvbS90ZXN0ZGF0YS9leHBlY3RlZF90YWd2YWx1ZV9zYm9tX3VuYnVuZGxlZC5zcGR4CisrKyBiL3Rvb2xzL3Nib20vdGVzdGRhdGEvZXhwZWN0ZWRfdGFndmFsdWVfc2JvbV91bmJ1bmRsZWQuc3BkeApAQCAtMSw2ICsxLDcgQEAKIEZpbGVOYW1lOiAvYmluL2ZpbGUxLmFwawogU1BEWElEOiBTUERYUmVmLWZpbGUxCiBGaWxlQ2hlY2tzdW06IFNIQTE6IDExMTExCitMaWNlbnNlQ29uY2x1ZGVkOiBOT0FTU0VSVElPTgogCiBQYWNrYWdlTmFtZTogVW5idW5kbGVkIGFwayBwYWNrYWdlCiBTUERYSUQ6IFNQRFhSZWYtU09VUkNFLXBhY2thZ2UxCkBAIC04LDUgKzksNiBAQAogRmlsZXNBbmFseXplZDogZmFsc2UKIFBhY2thZ2VWZXJzaW9uOiBidWlsZF9maW5nZXJfcHJpbnQKIFBhY2thZ2VTdXBwbGllcjogT3JnYW5pemF0aW9uOiBHb29nbGUKK1BhY2thZ2VMaWNlbnNlRGVjbGFyZWQ6IE5PQVNTRVJUSU9OCiAKIFJlbGF0aW9uc2hpcDogU1BEWFJlZi1maWxlMSBHRU5FUkFURURfRlJPTSBTUERYUmVmLVNPVVJDRS1wYWNrYWdlMQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2lnbmFway9zcmMvY29tL2FuZHJvaWQvc2lnbmFway9TaWduQXBrLmphdmEgYi90b29scy9zaWduYXBrL3NyYy9jb20vYW5kcm9pZC9zaWduYXBrL1NpZ25BcGsuamF2YQppbmRleCAyNWM1M2QzLi42NTRlMTk2IDEwMDY0NAotLS0gYS90b29scy9zaWduYXBrL3NyYy9jb20vYW5kcm9pZC9zaWduYXBrL1NpZ25BcGsuamF2YQorKysgYi90b29scy9zaWduYXBrL3NyYy9jb20vYW5kcm9pZC9zaWduYXBrL1NpZ25BcGsuamF2YQpAQCAtMzAyLDcgKzMwMiw2IEBACiAgICAgICAgICAgICBmaW5hbCBLZXlTdG9yZSBrZXlTdG9yZSwgZmluYWwgU3RyaW5nIGtleU5hbWUpCiAgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24sIEtleVN0b3JlRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCiAgICAgICAgICAgICAgICAgICAgIFVucmVjb3ZlcmFibGVLZXlFeGNlcHRpb24sIFVucmVjb3ZlcmFibGVFbnRyeUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIEtleSBrZXkgPSBrZXlTdG9yZS5nZXRLZXkoa2V5TmFtZSwgcmVhZFBhc3N3b3JkKGtleU5hbWUpKTsKICAgICAgICAgZmluYWwgUHJpdmF0ZUtleUVudHJ5IHByaXZhdGVLZXlFbnRyeSA9IChQcml2YXRlS2V5RW50cnkpIGtleVN0b3JlLmdldEVudHJ5KGtleU5hbWUsIG51bGwpOwogICAgICAgICBpZiAocHJpdmF0ZUtleUVudHJ5ID09IG51bGwpIHsKICAgICAgICAgdGhyb3cgbmV3IEVycm9yKApAQCAtNjg3LDcgKzY4Niw3IEBACiAgICAgICAgIGlmIChlbnRyeU5hbWUuZW5kc1dpdGgoIi5zbyIpKSB7CiAgICAgICAgICAgICAvLyBBbGlnbiAuc28gY29udGVudHMgdG8gbWVtb3J5IHBhZ2UgYm91bmRhcnkgdG8gZW5hYmxlIG1lbW9yeS1tYXBwZWQKICAgICAgICAgICAgIC8vIGV4ZWN1dGlvbi4KLSAgICAgICAgICAgIHJldHVybiA0MDk2OworICAgICAgICAgICAgcmV0dXJuIDE2Mzg0OwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRBbGlnbm1lbnQ7CiAgICAgICAgIH0KQEAgLTk4NiwxNSArOTg1LDE3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgWmlwU2VjdGlvbnMgewotICAgICAgICBCeXRlQnVmZmVyIGJlZm9yZUNlbnRyYWxEaXI7CisgICAgICAgIERhdGFTb3VyY2UgYmVmb3JlQ2VudHJhbERpcjsKKworICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgc3RpbGwgdmFsaWQgYWZ0ZXIgY2xvc2luZyB0aGUgYmFja2luZyBEYXRhU291cmNlLgorICAgICAgICBsb25nIGJlZm9yZUNlbnRyYWxEaXJTaXplOwogICAgICAgICBCeXRlQnVmZmVyIGNlbnRyYWxEaXI7CiAgICAgICAgIEJ5dGVCdWZmZXIgZW9jZDsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBaaXBTZWN0aW9ucyBmaW5kTWFpblppcFNlY3Rpb25zKEJ5dGVCdWZmZXIgYXBrKQorICAgIHByaXZhdGUgc3RhdGljIFppcFNlY3Rpb25zIGZpbmRNYWluWmlwU2VjdGlvbnMoRGF0YVNvdXJjZSBhcGspCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFppcEZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFway5zbGljZSgpOwotICAgICAgICBBcGtVdGlscy5aaXBTZWN0aW9ucyBzZWN0aW9ucyA9IEFwa1V0aWxzLmZpbmRaaXBTZWN0aW9ucyhEYXRhU291cmNlcy5hc0RhdGFTb3VyY2UoYXBrKSk7CisgICAgICAgIEFwa1V0aWxzLlppcFNlY3Rpb25zIHNlY3Rpb25zID0gQXBrVXRpbHMuZmluZFppcFNlY3Rpb25zKGFwayk7CiAgICAgICAgIGxvbmcgY2VudHJhbERpclN0YXJ0T2Zmc2V0ID0gc2VjdGlvbnMuZ2V0WmlwQ2VudHJhbERpcmVjdG9yeU9mZnNldCgpOwogICAgICAgICBsb25nIGNlbnRyYWxEaXJTaXplQnl0ZXMgPSBzZWN0aW9ucy5nZXRaaXBDZW50cmFsRGlyZWN0b3J5U2l6ZUJ5dGVzKCk7CiAgICAgICAgIGxvbmcgY2VudHJhbERpckVuZE9mZnNldCA9IGNlbnRyYWxEaXJTdGFydE9mZnNldCArIGNlbnRyYWxEaXJTaXplQnl0ZXM7CkBAIC0xMDA1LDI1ICsxMDA2LDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLiBDRCBlbmQ6ICIgKyBjZW50cmFsRGlyRW5kT2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBFb0NEIHN0YXJ0OiAiICsgZW9jZFN0YXJ0T2Zmc2V0KTsKICAgICAgICAgfQotICAgICAgICBhcGsucG9zaXRpb24oMCk7Ci0gICAgICAgIGFway5saW1pdCgoaW50KSBjZW50cmFsRGlyU3RhcnRPZmZzZXQpOwotICAgICAgICBCeXRlQnVmZmVyIGJlZm9yZUNlbnRyYWxEaXIgPSBhcGsuc2xpY2UoKTsKLQotICAgICAgICBhcGsucG9zaXRpb24oKGludCkgY2VudHJhbERpclN0YXJ0T2Zmc2V0KTsKLSAgICAgICAgYXBrLmxpbWl0KChpbnQpIGNlbnRyYWxEaXJFbmRPZmZzZXQpOwotICAgICAgICBCeXRlQnVmZmVyIGNlbnRyYWxEaXIgPSBhcGsuc2xpY2UoKTsKLQotICAgICAgICBhcGsucG9zaXRpb24oKGludCkgZW9jZFN0YXJ0T2Zmc2V0KTsKLSAgICAgICAgYXBrLmxpbWl0KGFway5jYXBhY2l0eSgpKTsKLSAgICAgICAgQnl0ZUJ1ZmZlciBlb2NkID0gYXBrLnNsaWNlKCk7Ci0KLSAgICAgICAgYXBrLnBvc2l0aW9uKDApOwotICAgICAgICBhcGsubGltaXQoYXBrLmNhcGFjaXR5KCkpOwogCiAgICAgICAgIFppcFNlY3Rpb25zIHJlc3VsdCA9IG5ldyBaaXBTZWN0aW9ucygpOwotICAgICAgICByZXN1bHQuYmVmb3JlQ2VudHJhbERpciA9IGJlZm9yZUNlbnRyYWxEaXI7Ci0gICAgICAgIHJlc3VsdC5jZW50cmFsRGlyID0gY2VudHJhbERpcjsKLSAgICAgICAgcmVzdWx0LmVvY2QgPSBlb2NkOworCisgICAgICAgIHJlc3VsdC5iZWZvcmVDZW50cmFsRGlyID0gYXBrLnNsaWNlKDAsIGNlbnRyYWxEaXJTdGFydE9mZnNldCk7CisgICAgICAgIHJlc3VsdC5iZWZvcmVDZW50cmFsRGlyU2l6ZSA9IHJlc3VsdC5iZWZvcmVDZW50cmFsRGlyLnNpemUoKTsKKworICAgICAgICBsb25nIGNlbnRyYWxEaXJTaXplID0gY2VudHJhbERpckVuZE9mZnNldCAtIGNlbnRyYWxEaXJTdGFydE9mZnNldDsKKyAgICAgICAgaWYgKGNlbnRyYWxEaXJTaXplID49IEludGVnZXIuTUFYX1ZBTFVFKSB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICByZXN1bHQuY2VudHJhbERpciA9IGFway5nZXRCeXRlQnVmZmVyKGNlbnRyYWxEaXJTdGFydE9mZnNldCwgKGludCljZW50cmFsRGlyU2l6ZSk7CisKKyAgICAgICAgbG9uZyBlb2NkU2l6ZSA9IGFway5zaXplKCkgLSBlb2NkU3RhcnRPZmZzZXQ7CisgICAgICAgIGlmIChlb2NkU2l6ZSA+PSBJbnRlZ2VyLk1BWF9WQUxVRSkgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgcmVzdWx0LmVvY2QgPSBhcGsuZ2V0Qnl0ZUJ1ZmZlcihlb2NkU3RhcnRPZmZzZXQsIChpbnQpZW9jZFNpemUpOworCiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCkBAIC0xMjc4LDExICsxMjc0LDggQEAKICAgICAgICAgICAgICAgICAgICAgLy8gc2lnbmF0dXJlcykKICAgICAgICAgICAgICAgICAgICAgYXBrU2lnbmVyLmlucHV0QXBrU2lnbmluZ0Jsb2NrKG51bGwpOwogCi0gICAgICAgICAgICAgICAgICAgIC8vIEJ1aWxkIHRoZSBvdXRwdXQgQVBLIGluIG1lbW9yeSwgYnkgY29weWluZyBpbnB1dCBBUEsncyBaSVAgZW50cmllcyBhY3Jvc3MKLSAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZW4gc2lnbmluZyB0aGUgb3V0cHV0IEFQSy4KLSAgICAgICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHYxU2lnbmVkQXBrQnVmID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICAgICAgICAgICAgICBDb3VudGluZ091dHB1dFN0cmVhbSBvdXRwdXRKYXJDb3VudGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ291bnRpbmdPdXRwdXRTdHJlYW0odjFTaWduZWRBcGtCdWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb3VudGluZ091dHB1dFN0cmVhbShvdXRwdXRGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgSmFyT3V0cHV0U3RyZWFtIG91dHB1dEphciA9IG5ldyBKYXJPdXRwdXRTdHJlYW0ob3V0cHV0SmFyQ291bnRlcik7CiAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBtYXhpbXVtIGNvbXByZXNzaW9uIGZvciBjb21wcmVzc2VkIGVudHJpZXMgYmVjYXVzZSB0aGUgQVBLIGxpdmVzIGZvcmV2ZXIKICAgICAgICAgICAgICAgICAgICAgLy8gb24gdGhlIHN5c3RlbSBwYXJ0aXRpb24uCkBAIC0xMjk1LDI0ICsxMjg4LDMxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBhZGRWMVNpZ25hdHVyZShhcGtTaWduZXIsIGFkZFYxU2lnbmF0dXJlUmVxdWVzdCwgb3V0cHV0SmFyLCB0aW1lc3RhbXApOwogICAgICAgICAgICAgICAgICAgICAgICAgYWRkVjFTaWduYXR1cmVSZXF1ZXN0LmRvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvdXRwdXRKYXIuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciB2MVNpZ25lZEFwayA9IEJ5dGVCdWZmZXIud3JhcCh2MVNpZ25lZEFwa0J1Zi50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgICAgICAgICAgICAgdjFTaWduZWRBcGtCdWYucmVzZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlcltdIG91dHB1dENodW5rcyA9IG5ldyBCeXRlQnVmZmVyW10ge3YxU2lnbmVkQXBrfTsKIAotICAgICAgICAgICAgICAgICAgICBaaXBTZWN0aW9ucyB6aXBTZWN0aW9ucyA9IGZpbmRNYWluWmlwU2VjdGlvbnModjFTaWduZWRBcGspOworICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSBvdXRwdXQgYW5kIHN3aXRjaCB0byBpbnB1dCBtb2RlCisgICAgICAgICAgICAgICAgICAgIG91dHB1dEphci5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRKYXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRKYXJDb3VudGVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgdjFTaWduZWRBcGsgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShvdXRwdXRGaWxlbmFtZSwgInIiKTsKKworICAgICAgICAgICAgICAgICAgICBaaXBTZWN0aW9ucyB6aXBTZWN0aW9ucyA9IGZpbmRNYWluWmlwU2VjdGlvbnMoRGF0YVNvdXJjZXMuYXNEYXRhU291cmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYxU2lnbmVkQXBrKSk7CiAKICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBlb2NkID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSh6aXBTZWN0aW9ucy5lb2NkLnJlbWFpbmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgZW9jZC5wdXQoemlwU2VjdGlvbnMuZW9jZCk7CiAgICAgICAgICAgICAgICAgICAgIGVvY2QuZmxpcCgpOwogICAgICAgICAgICAgICAgICAgICBlb2NkLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKKworICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyW10gb3V0cHV0Q2h1bmtzID0gbmV3IEJ5dGVCdWZmZXJbXSB7fTsKKwogICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGxvb3AgaXMgc3VwcG9zZWQgdG8gYmUgaXRlcmF0ZWQgdHdpY2UgYXQgbW9zdC4KICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNlY29uZCBwYXNzIGlzIHRvIGFsaWduIHRoZSBmaWxlIHNpemUgYWZ0ZXIgYW1lbmRpbmcgRU9DRCBjb21tZW50cwogICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIGFzc3VtcHRpb24gdGhhdCByZS1nZW5lcmF0ZWQgc2lnbmluZyBibG9jayB3b3VsZCBiZSB0aGUgc2FtZSBzaXplLgogICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgQXBrU2lnbmVyRW5naW5lLk91dHB1dEFwa1NpZ25pbmdCbG9ja1JlcXVlc3QyIGFkZFYyU2lnbmF0dXJlUmVxdWVzdCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwa1NpZ25lci5vdXRwdXRaaXBTZWN0aW9uczIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZXMuYXNEYXRhU291cmNlKHppcFNlY3Rpb25zLmJlZm9yZUNlbnRyYWxEaXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcFNlY3Rpb25zLmJlZm9yZUNlbnRyYWxEaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZXMuYXNEYXRhU291cmNlKHppcFNlY3Rpb25zLmNlbnRyYWxEaXIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VzLmFzRGF0YVNvdXJjZShlb2NkKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRkVjJTaWduYXR1cmVSZXF1ZXN0ID09IG51bGwpIGJyZWFrOwpAQCAtMTMzMCwxMSArMTMzMCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRFb2NkLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKICAgICAgICAgICAgICAgICAgICAgICAgIEFwa1V0aWxzLnNldFppcEVvY2RDZW50cmFsRGlyZWN0b3J5T2Zmc2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZEVvY2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcFNlY3Rpb25zLmJlZm9yZUNlbnRyYWxEaXIucmVtYWluaW5nKCkgKyBwYWRkaW5nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwU2VjdGlvbnMuYmVmb3JlQ2VudHJhbERpci5zaXplKCkgKyBwYWRkaW5nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBrU2lnbmluZ0Jsb2NrLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRDaHVua3MgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUJ1ZmZlcltdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBTZWN0aW9ucy5iZWZvcmVDZW50cmFsRGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIuYWxsb2NhdGUocGFkZGluZyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlci53cmFwKGFwa1NpZ25pbmdCbG9jayksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwU2VjdGlvbnMuY2VudHJhbERpciwKQEAgLTEzNDgsNyArMTM0Nyw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZmlsZSBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICBlb2NkID0gbW9kaWZpZWRFb2NkOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGVTaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZmlsZVNpemUgPSB6aXBTZWN0aW9ucy5iZWZvcmVDZW50cmFsRGlyU2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQnl0ZUJ1ZmZlciBidWYgOiBvdXRwdXRDaHVua3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlU2l6ZSArPSBidWYucmVtYWluaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0xMzU3LDcgKzEzNTYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFkIEVPQ0QgY29tbWVudCB0byBhbGlnbiB0aGUgZmlsZSBzaXplLgotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbW1lbnRMZW4gPSBhbGlnbm1lbnQgLSBmaWxlU2l6ZSAlIGFsaWdubWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21tZW50TGVuID0gYWxpZ25tZW50IC0gKGludCkoZmlsZVNpemUgJSBhbGlnbm1lbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRFb2NkID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShlb2NkLnJlbWFpbmluZygpICsgY29tbWVudExlbik7CiAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZEVvY2QucHV0KGVvY2QpOwogICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRFb2NkLnJld2luZCgpOwpAQCAtMTM2OCw2ICsxMzY3LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBlb2NkID0gbW9kaWZpZWRFb2NkOwogICAgICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2UgaW5wdXQgYW5kIHN3aXRjaCBiYWNrIHRvIG91dHB1dCBtb2RlCisgICAgICAgICAgICAgICAgICAgIHYxU2lnbmVkQXBrLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIHYxU2lnbmVkQXBrID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGVuYW1lLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZS5nZXRDaGFubmVsKCkudHJ1bmNhdGUoemlwU2VjdGlvbnMuYmVmb3JlQ2VudHJhbERpclNpemUpOworCiAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgYXNzdW1lcyBvdXRwdXRDaHVua3MgYXJlIGFycmF5LWJhY2tlZC4gVG8gYXZvaWQgdGhpcyBhc3N1bXB0aW9uLCB0aGUKICAgICAgICAgICAgICAgICAgICAgLy8gY29kZSBjb3VsZCBiZSByZXdyaXR0ZW4gdG8gdXNlIEZpbGVDaGFubmVsLgogICAgICAgICAgICAgICAgICAgICBmb3IgKEJ5dGVCdWZmZXIgb3V0cHV0Q2h1bmsgOiBvdXRwdXRDaHVua3MpIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3RfcG9zdF9wcm9jZXNzX3Byb3BzLnB5IGIvdG9vbHMvdGVzdF9wb3N0X3Byb2Nlc3NfcHJvcHMucHkKaW5kZXggNDM5ZmM5Zi4uMmFkZGVmYyAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdF9wb3N0X3Byb2Nlc3NfcHJvcHMucHkKKysrIGIvdG9vbHMvdGVzdF9wb3N0X3Byb2Nlc3NfcHJvcHMucHkKQEAgLTI1NSwyOSArMjU1LDE3IEBACiAgICAgc3RkZXJyX3JlZGlyZWN0ID0gaW8uU3RyaW5nSU8oKQogICAgIHdpdGggY29udGV4dGxpYi5yZWRpcmVjdF9zdGRlcnIoc3RkZXJyX3JlZGlyZWN0KToKICAgICAgIHByb3BzID0gUHJvcExpc3QoImhlbGxvIikKLSAgICAgIHByb3BzLnB1dCgicm8uYm9hcmQuZmlyc3RfYXBpX2xldmVsIiwiMjUiKQorICAgICAgcHJvcHMucHV0KCJyby5ib2FyZC5maXJzdF9hcGlfbGV2ZWwiLCIyMDI1MDQiKQogICAgICAgcHJvcHMucHV0KCJyby5idWlsZC52ZXJzaW9uLmNvZGVuYW1lIiwgIlJFTCIpCiAKLSAgICAgICMgcm8uYm9hcmQuZmlyc3RfYXBpX2xldmVsIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzZGsgdmVyc2lvbgotICAgICAgc2VsZi5hc3NlcnRGYWxzZSh2YWxpZGF0ZV9ncmZfcHJvcHMocHJvcHMsIDIwKSkKLSAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2YWxpZGF0ZV9ncmZfcHJvcHMocHJvcHMsIDI2KSkKLSAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2YWxpZGF0ZV9ncmZfcHJvcHMocHJvcHMsIDM1KSkKLQogICAgICAgIyBtYW51YWxseSBzZXQgcm8uYm9hcmQuYXBpX2xldmVsIHRvIGFuIGludmFsaWQgdmFsdWUKLSAgICAgIHByb3BzLnB1dCgicm8uYm9hcmQuYXBpX2xldmVsIiwiMjAiKQotICAgICAgc2VsZi5hc3NlcnRGYWxzZSh2YWxpZGF0ZV9ncmZfcHJvcHMocHJvcHMsIDI2KSkKKyAgICAgIHByb3BzLnB1dCgicm8uYm9hcmQuYXBpX2xldmVsIiwiMjAyNDA0IikKKyAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodmFsaWRhdGVfZ3JmX3Byb3BzKHByb3BzKSkKIAogICAgICAgcHJvcHMuZ2V0X2FsbF9wcm9wcygpWy0xXS5tYWtlX2FzX2NvbW1lbnQoKQogICAgICAgIyBtYW51YWxseSBzZXQgcm8uYm9hcmQuYXBpX2xldmVsIHRvIGEgdmFsaWQgdmFsdWUKLSAgICAgIHByb3BzLnB1dCgicm8uYm9hcmQuYXBpX2xldmVsIiwiMjYiKQotICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbGlkYXRlX2dyZl9wcm9wcyhwcm9wcywgMjYpKQotICAgICAgIyByby5ib2FyZC5hcGlfbGV2ZWwgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNkayB2ZXJzaW9uCi0gICAgICBzZWxmLmFzc2VydEZhbHNlKHZhbGlkYXRlX2dyZl9wcm9wcyhwcm9wcywgMjUpKQotCi0gICAgICAjIGFsbG93IHNldHRpbmcgZnV0dXJlIGFwaV9sZXZlbCBiZWZvcmUgcmVsZWFzZQotICAgICAgcHJvcHMuZ2V0X2FsbF9wcm9wcygpWy0yXS5tYWtlX2FzX2NvbW1lbnQoKQotICAgICAgcHJvcHMucHV0KCJyby5idWlsZC52ZXJzaW9uLmNvZGVuYW1lIiwgIk5vblJlbCIpCi0gICAgICBzZWxmLmFzc2VydFRydWUodmFsaWRhdGVfZ3JmX3Byb3BzKHByb3BzLCAyNCkpCisgICAgICBwcm9wcy5wdXQoInJvLmJvYXJkLmFwaV9sZXZlbCIsIjIwMjUwNCIpCisgICAgICBzZWxmLmFzc2VydFRydWUodmFsaWRhdGVfZ3JmX3Byb3BzKHByb3BzKSkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yKQpkaWZmIC0tZ2l0IGEvdG9vbHMvdG9vbF9ldmVudF9sb2dnZXIvQW5kcm9pZC5icCBiL3Rvb2xzL3Rvb2xfZXZlbnRfbG9nZ2VyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ExZDJhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rvb2xfZXZlbnRfbG9nZ2VyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2NyBAQAorLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gU2V0IG9mIGVycm9yIHByb25lIHJ1bGVzIHRvIGVuc3VyZSBjb2RlIHF1YWxpdHkKKy8vIFBhY2thZ2VMb2NhdGlvbiBjaGVjayByZXF1aXJlcyB0aGUgYW5kcm9pZENvbXBhdGlibGU9ZmFsc2Ugb3RoZXJ3aXNlIGl0IGRvZXMgbm90IGRvIGFueXRoaW5nLgorCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCisgICAgZGVmYXVsdF90ZWFtOiAidHJlbmR5X3RlYW1fYWR0ZSIsCit9CisKK3B5dGhvbl9saWJyYXJ5X2hvc3QgeworICAgIG5hbWU6ICJ0b29sX2V2ZW50X3Byb3RvIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJwcm90by90b29sX2V2ZW50LnByb3RvIiwKKyAgICBdLAorICAgIHByb3RvOiB7CisgICAgICAgIGNhbm9uaWNhbF9wYXRoX2Zyb21fcm9vdDogZmFsc2UsCisgICAgfSwKK30KKworcHl0aG9uX2JpbmFyeV9ob3N0IHsKKyAgICBuYW1lOiAidG9vbF9ldmVudF9sb2dnZXIiLAorICAgIHBrZ19wYXRoOiAidG9vbF9ldmVudF9sb2dnZXIiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInRvb2xfZXZlbnRfbG9nZ2VyLnB5IiwKKyAgICBdLAorICAgIGxpYnM6IFsKKyAgICAgICAgImFzdWl0ZV9jY19jbGllbnQiLAorICAgICAgICAidG9vbF9ldmVudF9wcm90byIsCisgICAgXSwKKyAgICBtYWluOiAidG9vbF9ldmVudF9sb2dnZXIucHkiLAorfQorCitweXRob25fdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAidG9vbF9ldmVudF9sb2dnZXJfdGVzdCIsCisgICAgbWFpbjogInRvb2xfZXZlbnRfbG9nZ2VyX3Rlc3QucHkiLAorICAgIHBrZ19wYXRoOiAidG9vbF9ldmVudF9sb2dnZXIiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInRvb2xfZXZlbnRfbG9nZ2VyLnB5IiwKKyAgICAgICAgInRvb2xfZXZlbnRfbG9nZ2VyX3Rlc3QucHkiLAorICAgIF0sCisgICAgdGVzdF9vcHRpb25zOiB7CisgICAgICAgIHVuaXRfdGVzdDogdHJ1ZSwKKyAgICB9LAorICAgIGxpYnM6IFsKKyAgICAgICAgImFzdWl0ZV9jY19jbGllbnQiLAorICAgICAgICAidG9vbF9ldmVudF9wcm90byIsCisgICAgXSwKKyAgICB2ZXJzaW9uOiB7CisgICAgICAgIHB5MzogeworICAgICAgICAgICAgZW1iZWRkZWRfbGF1bmNoZXI6IHRydWUsCisgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCit9CmRpZmYgLS1naXQgYS90b29scy90b29sX2V2ZW50X2xvZ2dlci9PV05FUlMgYi90b29scy90b29sX2V2ZW50X2xvZ2dlci9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY5MmM5ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rvb2xfZXZlbnRfbG9nZ2VyL09XTkVSUwpAQCAtMCwwICsxLDQgQEAKK2luY2x1ZGUgcGxhdGZvcm0vdG9vbHMvYXN1aXRlOi9PV05FUlMKKworemh1b3lhb0Bnb29nbGUuY29tCitoemFsZWtAZ29vZ2xlLmNvbQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rvb2xfZXZlbnRfbG9nZ2VyL3Byb3RvL3Rvb2xfZXZlbnQucHJvdG8gYi90b29scy90b29sX2V2ZW50X2xvZ2dlci9wcm90by90b29sX2V2ZW50LnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNzFlYWMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90b29sX2V2ZW50X2xvZ2dlci9wcm90by90b29sX2V2ZW50LnByb3RvCkBAIC0wLDAgKzEsMzcgQEAKK3N5bnRheCA9ICJwcm90bzMiOworCitwYWNrYWdlIHRvb2xzLmFzdWl0ZS50b29sX2V2ZW50X2xvZ2dlcjsKKworbWVzc2FnZSBUb29sRXZlbnQgeworICAvLyBPY2N1cnMgaW1tZWRpYXRlbHkgdXBvbiBleGVjdXRpb24gb2YgdGhlIHRvb2wuCisgIG1lc3NhZ2UgSW52b2NhdGlvblN0YXJ0ZWQgeworICAgIHN0cmluZyBjb21tYW5kX2FyZ3MgPSAxOworICAgIHN0cmluZyBjd2QgPSAyOworICAgIHN0cmluZyBvcyA9IDM7CisgIH0KKworICAvLyBPY2N1cnMgd2hlbiB0b29sIGV4aXRzIGZvciBhbnkgcmVhc29uLgorICBtZXNzYWdlIEludm9jYXRpb25TdG9wcGVkIHsKKyAgICBpbnQzMiBleGl0X2NvZGUgPSAyOworICAgIHN0cmluZyBleGl0X2xvZyA9IDM7CisgIH0KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gRklFTERTIEZPUiBUb29sRXZlbnQKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFJhbmRvbSBzdHJpbmcgZ2VuZXJhdGVkIHRvIGlkZW50aWZ5IHRoZSBpbnZvY2F0aW9uLgorICBzdHJpbmcgaW52b2NhdGlvbl9pZCA9IDE7CisgIC8vIEludGVybmFsIHVzZXIgbmFtZS4KKyAgc3RyaW5nIHVzZXJfbmFtZSA9IDI7CisgIC8vIFRoZSByb290IG9mIEFuZHJvaWQgc291cmNlLgorICBzdHJpbmcgc291cmNlX3Jvb3QgPSAzOworICAvLyBOYW1lIG9mIHRoZSB0b29sIHVzZWQuCisgIHN0cmluZyB0b29sX3RhZyA9IDY7CisgIC8vIE5hbWUgb2YgdGhlIGhvc3Qgd29ya3N0YXRpb24uCisgIHN0cmluZyBob3N0X25hbWUgPSA3OworCisgIG9uZW9mIGV2ZW50IHsKKyAgICBJbnZvY2F0aW9uU3RhcnRlZCBpbnZvY2F0aW9uX3N0YXJ0ZWQgPSA0OworICAgIEludm9jYXRpb25TdG9wcGVkIGludm9jYXRpb25fc3RvcHBlZCA9IDU7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rvb2xfZXZlbnRfbG9nZ2VyL3Rvb2xfZXZlbnRfbG9nZ2VyLnB5IGIvdG9vbHMvdG9vbF9ldmVudF9sb2dnZXIvdG9vbF9ldmVudF9sb2dnZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI0OWQ5MQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rvb2xfZXZlbnRfbG9nZ2VyL3Rvb2xfZXZlbnRfbG9nZ2VyLnB5CkBAIC0wLDAgKzEsMjMzIEBACisjIENvcHlyaWdodCAyMDI0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgZGF0ZXRpbWUKK2ltcG9ydCBnZXRwYXNzCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHV1aWQKKworZnJvbSBhdGVzdC5tZXRyaWNzIGltcG9ydCBjbGVhcmN1dF9jbGllbnQKK2Zyb20gYXRlc3QucHJvdG8gaW1wb3J0IGNsaWVudGFuYWx5dGljc19wYjIKK2Zyb20gcHJvdG8gaW1wb3J0IHRvb2xfZXZlbnRfcGIyCisKK0xPR19TT1VSQ0UgPSAyMzk1CisKKworY2xhc3MgVG9vbEV2ZW50TG9nZ2VyOgorICAiIiJMb2dzIHRvb2wgZXZlbnRzIHRvIFNhd21pbGwgdGhyb3VnaCBDbGVhcmN1dC4iIiIKKworICBkZWYgX19pbml0X18oCisgICAgICBzZWxmLAorICAgICAgdG9vbF90YWc6IHN0ciwKKyAgICAgIGludm9jYXRpb25faWQ6IHN0ciwKKyAgICAgIHVzZXJfbmFtZTogc3RyLAorICAgICAgaG9zdF9uYW1lOiBzdHIsCisgICAgICBzb3VyY2Vfcm9vdDogc3RyLAorICAgICAgcGxhdGZvcm1fdmVyc2lvbjogc3RyLAorICAgICAgcHl0aG9uX3ZlcnNpb246IHN0ciwKKyAgICAgIGNsaWVudDogY2xlYXJjdXRfY2xpZW50LkNsZWFyY3V0LAorICApOgorICAgIHNlbGYudG9vbF90YWcgPSB0b29sX3RhZworICAgIHNlbGYuaW52b2NhdGlvbl9pZCA9IGludm9jYXRpb25faWQKKyAgICBzZWxmLnVzZXJfbmFtZSA9IHVzZXJfbmFtZQorICAgIHNlbGYuaG9zdF9uYW1lID0gaG9zdF9uYW1lCisgICAgc2VsZi5zb3VyY2Vfcm9vdCA9IHNvdXJjZV9yb290CisgICAgc2VsZi5wbGF0Zm9ybV92ZXJzaW9uID0gcGxhdGZvcm1fdmVyc2lvbgorICAgIHNlbGYucHl0aG9uX3ZlcnNpb24gPSBweXRob25fdmVyc2lvbgorICAgIHNlbGYuX2NsZWFyY3V0X2NsaWVudCA9IGNsaWVudAorCisgIEBjbGFzc21ldGhvZAorICBkZWYgY3JlYXRlKGNscywgdG9vbF90YWc6IHN0cik6CisgICAgcmV0dXJuIFRvb2xFdmVudExvZ2dlcigKKyAgICAgICAgdG9vbF90YWc9dG9vbF90YWcsCisgICAgICAgIGludm9jYXRpb25faWQ9c3RyKHV1aWQudXVpZDQoKSksCisgICAgICAgIHVzZXJfbmFtZT1nZXRwYXNzLmdldHVzZXIoKSwKKyAgICAgICAgaG9zdF9uYW1lPXBsYXRmb3JtLm5vZGUoKSwKKyAgICAgICAgc291cmNlX3Jvb3Q9b3MuZW52aXJvbi5nZXQoJ0FORFJPSURfQlVJTERfVE9QJywgJycpLAorICAgICAgICBwbGF0Zm9ybV92ZXJzaW9uPXBsYXRmb3JtLnBsYXRmb3JtKCksCisgICAgICAgIHB5dGhvbl92ZXJzaW9uPXBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uKCksCisgICAgICAgIGNsaWVudD1jbGVhcmN1dF9jbGllbnQuQ2xlYXJjdXQoTE9HX1NPVVJDRSksCisgICAgKQorCisgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgcmV0dXJuIHNlbGYKKworICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWwsIGV4Y190Yik6CisgICAgc2VsZi5mbHVzaCgpCisKKyAgZGVmIGxvZ19pbnZvY2F0aW9uX3N0YXJ0ZWQoc2VsZiwgZXZlbnRfdGltZTogZGF0ZXRpbWUsIGNvbW1hbmRfYXJnczogc3RyKToKKyAgICAiIiJDcmVhdGVzIGFuIGV2ZW50IGxvZyB3aXRoIGludm9jYXRpb24gc3RhcnRlZCBpbmZvLiIiIgorICAgIGV2ZW50ID0gc2VsZi5fY3JlYXRlX3Rvb2xfZXZlbnQoKQorICAgIGV2ZW50Lmludm9jYXRpb25fc3RhcnRlZC5Db3B5RnJvbSgKKyAgICAgICAgdG9vbF9ldmVudF9wYjIuVG9vbEV2ZW50Lkludm9jYXRpb25TdGFydGVkKAorICAgICAgICAgICAgY29tbWFuZF9hcmdzPWNvbW1hbmRfYXJncywKKyAgICAgICAgICAgIG9zPWYne3NlbGYucGxhdGZvcm1fdmVyc2lvbn06e3NlbGYucHl0aG9uX3ZlcnNpb259JywKKyAgICAgICAgKQorICAgICkKKworICAgIGxvZ2dpbmcuZGVidWcoJ0xvZyBpbnZvY2F0aW9uX3N0YXJ0ZWQ6ICVzJywgZXZlbnQpCisgICAgc2VsZi5fbG9nX2NsZWFyY3V0X2V2ZW50KGV2ZW50LCBldmVudF90aW1lKQorCisgIGRlZiBsb2dfaW52b2NhdGlvbl9zdG9wcGVkKAorICAgICAgc2VsZiwKKyAgICAgIGV2ZW50X3RpbWU6IGRhdGV0aW1lLAorICAgICAgZXhpdF9jb2RlOiBpbnQsCisgICAgICBleGl0X2xvZzogc3RyLAorICApOgorICAgICIiIkNyZWF0ZXMgYW4gZXZlbnQgbG9nIHdpdGggaW52b2NhdGlvbiBzdG9wcGVkIGluZm8uIiIiCisgICAgZXZlbnQgPSBzZWxmLl9jcmVhdGVfdG9vbF9ldmVudCgpCisgICAgZXZlbnQuaW52b2NhdGlvbl9zdG9wcGVkLkNvcHlGcm9tKAorICAgICAgICB0b29sX2V2ZW50X3BiMi5Ub29sRXZlbnQuSW52b2NhdGlvblN0b3BwZWQoCisgICAgICAgICAgICBleGl0X2NvZGU9ZXhpdF9jb2RlLAorICAgICAgICAgICAgZXhpdF9sb2c9ZXhpdF9sb2csCisgICAgICAgICkKKyAgICApCisKKyAgICBsb2dnaW5nLmRlYnVnKCdMb2cgaW52b2NhdGlvbl9zdG9wcGVkOiAlcycsIGV2ZW50KQorICAgIHNlbGYuX2xvZ19jbGVhcmN1dF9ldmVudChldmVudCwgZXZlbnRfdGltZSkKKworICBkZWYgZmx1c2goc2VsZik6CisgICAgIiIiU2VuZHMgYWxsIGJhdGNoZWQgZXZlbnRzIHRvIENsZWFyY3V0LiIiIgorICAgIGxvZ2dpbmcuZGVidWcoJ1NlbmRpbmcgZXZlbnRzIHRvIENsZWFyY3V0LicpCisgICAgc2VsZi5fY2xlYXJjdXRfY2xpZW50LmZsdXNoX2V2ZW50cygpCisKKyAgZGVmIF9jcmVhdGVfdG9vbF9ldmVudChzZWxmKToKKyAgICByZXR1cm4gdG9vbF9ldmVudF9wYjIuVG9vbEV2ZW50KAorICAgICAgICB0b29sX3RhZz1zZWxmLnRvb2xfdGFnLAorICAgICAgICBpbnZvY2F0aW9uX2lkPXNlbGYuaW52b2NhdGlvbl9pZCwKKyAgICAgICAgdXNlcl9uYW1lPXNlbGYudXNlcl9uYW1lLAorICAgICAgICBob3N0X25hbWU9c2VsZi5ob3N0X25hbWUsCisgICAgICAgIHNvdXJjZV9yb290PXNlbGYuc291cmNlX3Jvb3QsCisgICAgKQorCisgIGRlZiBfbG9nX2NsZWFyY3V0X2V2ZW50KAorICAgICAgc2VsZiwgdG9vbF9ldmVudDogdG9vbF9ldmVudF9wYjIuVG9vbEV2ZW50LCBldmVudF90aW1lOiBkYXRldGltZQorICApOgorICAgIGxvZ19ldmVudCA9IGNsaWVudGFuYWx5dGljc19wYjIuTG9nRXZlbnQoCisgICAgICAgIGV2ZW50X3RpbWVfbXM9aW50KGV2ZW50X3RpbWUudGltZXN0YW1wKCkgKiAxMDAwKSwKKyAgICAgICAgc291cmNlX2V4dGVuc2lvbj10b29sX2V2ZW50LlNlcmlhbGl6ZVRvU3RyaW5nKCksCisgICAgKQorICAgIHNlbGYuX2NsZWFyY3V0X2NsaWVudC5sb2cobG9nX2V2ZW50KQorCisKK2NsYXNzIEFyZ3VtZW50UGFyc2VyV2l0aExvZ2dpbmcoYXJncGFyc2UuQXJndW1lbnRQYXJzZXIpOgorCisgIGRlZiBlcnJvcihzZWxmLCBtZXNzYWdlKToKKyAgICBsb2dnaW5nLmVycm9yKCdGYWlsZWQgdG8gcGFyc2UgYXJncyB3aXRoIGVycm9yOiAlcycsIG1lc3NhZ2UpCisgICAgc3VwZXIoKS5lcnJvcihtZXNzYWdlKQorCisKK2RlZiBjcmVhdGVfYXJnX3BhcnNlcigpOgorICAiIiJDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWZhdWx0IFRvb2xFdmVudExvZ2dlciBhcmcgcGFyc2VyLiIiIgorCisgIHBhcnNlciA9IEFyZ3VtZW50UGFyc2VyV2l0aExvZ2dpbmcoCisgICAgICBkZXNjcmlwdGlvbj0nQnVpbGQgYW5kIHVwbG9hZCBsb2dzIGZvciBBbmRyb2lkIGRldiB0b29scycsCisgICAgICBhZGRfaGVscD1UcnVlLAorICAgICAgZm9ybWF0dGVyX2NsYXNzPWFyZ3BhcnNlLlJhd0Rlc2NyaXB0aW9uSGVscEZvcm1hdHRlciwKKyAgKQorCisgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAnLS10b29sX3RhZycsCisgICAgICB0eXBlPXN0ciwKKyAgICAgIHJlcXVpcmVkPVRydWUsCisgICAgICBoZWxwPSdOYW1lIG9mIHRoZSB0b29sLicsCisgICkKKworICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgJy0tc3RhcnRfdGltZXN0YW1wJywKKyAgICAgIHR5cGU9bGFtYmRhIHRzOiBkYXRldGltZS5kYXRldGltZS5mcm9tdGltZXN0YW1wKGZsb2F0KHRzKSksCisgICAgICByZXF1aXJlZD1UcnVlLAorICAgICAgaGVscD0oCisgICAgICAgICAgJ1RpbWVzdGFtcCB3aGVuIHRoZSB0b29sIHN0YXJ0cy4gVGhlIHRpbWVzdGFtcCBzaG91bGQgaGF2ZSB0aGUgZm9ybWF0JworICAgICAgICAgICclcy4lTiB3aGljaCByZXByZXNlbnRzIHRoZSBzZWNvbmRzIGVsYXBzZXMgc2luY2UgZXBvY2guJworICAgICAgKSwKKyAgKQorCisgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAnLS1lbmRfdGltZXN0YW1wJywKKyAgICAgIHR5cGU9bGFtYmRhIHRzOiBkYXRldGltZS5kYXRldGltZS5mcm9tdGltZXN0YW1wKGZsb2F0KHRzKSksCisgICAgICByZXF1aXJlZD1UcnVlLAorICAgICAgaGVscD0oCisgICAgICAgICAgJ1RpbWVzdGFtcCB3aGVuIHRoZSB0b29sIGV4aXRzLiBUaGUgdGltZXN0YW1wIHNob3VsZCBoYXZlIHRoZSBmb3JtYXQnCisgICAgICAgICAgJyVzLiVOIHdoaWNoIHJlcHJlc2VudHMgdGhlIHNlY29uZHMgZWxhcHNlcyBzaW5jZSBlcG9jaC4nCisgICAgICApLAorICApCisKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICctLXRvb2xfYXJncycsCisgICAgICB0eXBlPXN0ciwKKyAgICAgIGhlbHA9J1BhcmFtZXRlcnMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoZSB0b29sLicsCisgICkKKworICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgJy0tZXhpdF9jb2RlJywKKyAgICAgIHR5cGU9aW50LAorICAgICAgcmVxdWlyZWQ9VHJ1ZSwKKyAgICAgIGhlbHA9J1Rvb2wgZXhpdCBjb2RlLicsCisgICkKKworICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgJy0tZXhpdF9sb2cnLAorICAgICAgdHlwZT1zdHIsCisgICAgICBoZWxwPSdMb2dzIHdoZW4gdG9vbCBleGl0cy4nLAorICApCisKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICctLWRyeV9ydW4nLAorICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgIGhlbHA9J0RyeSBydW4gdGhlIHRvb2wgZXZlbnQgbG9nZ2VyIGlmIHNldC4nLAorICApCisKKyAgcmV0dXJuIHBhcnNlcgorCisKK2RlZiBjb25maWd1cmVfbG9nZ2luZygpOgorICByb290X2xvZ2dpbmdfZGlyID0gdGVtcGZpbGUubWtkdGVtcChwcmVmaXg9J3Rvb2xfZXZlbnRfbG9nZ2VyXycpCisKKyAgbG9nX2ZtdCA9ICclKGFzY3RpbWUpcyAlKGZpbGVuYW1lKXM6JShsaW5lbm8pczolKGxldmVsbmFtZSlzOiAlKG1lc3NhZ2UpcycKKyAgZGF0ZV9mbXQgPSAnJVktJW0tJWQgJUg6JU06JVMnCisgIF8sIGxvZ19wYXRoID0gdGVtcGZpbGUubWtzdGVtcChkaXI9cm9vdF9sb2dnaW5nX2Rpciwgc3VmZml4PScubG9nJykKKworICBsb2dnaW5nLmJhc2ljQ29uZmlnKAorICAgICAgZmlsZW5hbWU9bG9nX3BhdGgsIGxldmVsPWxvZ2dpbmcuREVCVUcsIGZvcm1hdD1sb2dfZm10LCBkYXRlZm10PWRhdGVfZm10CisgICkKKworCitkZWYgbWFpbihhcmd2OiBsaXN0W3N0cl0pOgorICBhcmdzID0gY3JlYXRlX2FyZ19wYXJzZXIoKS5wYXJzZV9hcmdzKGFyZ3ZbMTpdKQorCisgIGlmIGFyZ3MuZHJ5X3J1bjoKKyAgICBsb2dnaW5nLmRlYnVnKCdUaGlzIGlzIGEgZHJ5IHJ1bi4nKQorICAgIHJldHVybgorCisgIHRyeToKKyAgICB3aXRoIFRvb2xFdmVudExvZ2dlci5jcmVhdGUoYXJncy50b29sX3RhZykgYXMgbG9nZ2VyOgorICAgICAgbG9nZ2VyLmxvZ19pbnZvY2F0aW9uX3N0YXJ0ZWQoYXJncy5zdGFydF90aW1lc3RhbXAsIGFyZ3MudG9vbF9hcmdzKQorICAgICAgbG9nZ2VyLmxvZ19pbnZvY2F0aW9uX3N0b3BwZWQoCisgICAgICAgICAgYXJncy5lbmRfdGltZXN0YW1wLCBhcmdzLmV4aXRfY29kZSwgYXJncy5leGl0X2xvZworICAgICAgKQorICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgbG9nZ2luZy5lcnJvcignTG9nIGZhaWxlZCB3aXRoIHVuZXhwZWN0ZWQgZXJyb3I6ICVzJywgZSkKKyAgICByYWlzZQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIGNvbmZpZ3VyZV9sb2dnaW5nKCkKKyAgbWFpbihzeXMuYXJndikKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rvb2xfZXZlbnRfbG9nZ2VyL3Rvb2xfZXZlbnRfbG9nZ2VyX3Rlc3QucHkgYi90b29scy90b29sX2V2ZW50X2xvZ2dlci90b29sX2V2ZW50X2xvZ2dlcl90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ODgxMmEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90b29sX2V2ZW50X2xvZ2dlci90b29sX2V2ZW50X2xvZ2dlcl90ZXN0LnB5CkBAIC0wLDAgKzEsMjEyIEBACisjIENvcHlyaWdodCAyMDI0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyIiIlVuaXR0ZXN0cyBmb3IgVG9vbEV2ZW50TG9nZ2VyLiIiIgorCitpbXBvcnQgZGF0ZXRpbWUKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdW5pdHRlc3QgaW1wb3J0IG1vY2sKKworZnJvbSBhdGVzdC5tZXRyaWNzIGltcG9ydCBjbGVhcmN1dF9jbGllbnQKK2Zyb20gcHJvdG8gaW1wb3J0IHRvb2xfZXZlbnRfcGIyCitmcm9tIHRvb2xfZXZlbnRfbG9nZ2VyIGltcG9ydCB0b29sX2V2ZW50X2xvZ2dlcgorCitURVNUX0lOVk9DQVRJT05fSUQgPSAndGVzdF9pbnZvY2F0aW9uX2lkJworVEVTVF9VU0VSX05BTUUgPSAndGVzdF91c2VyJworVEVTVF9IT1NUX05BTUUgPSAndGVzdF9ob3N0X25hbWUnCitURVNUX1RPT0xfVEFHID0gJ3Rlc3RfdG9vbCcKK1RFU1RfU09VUkNFX1JPT1QgPSAndGVzdF9zb3VyY2Vfcm9vdCcKK1RFU1RfUExBVEZPUk1fVkVSU0lPTiA9ICd0ZXN0X3BsYXRmb3JtX3ZlcnNpb24nCitURVNUX1BZVEhPTl9WRVJTSU9OID0gJ3Rlc3RfcHl0aG9uX3ZlcnNpb24nCitURVNUX0VWRU5UX1RJTUVTVEFNUCA9IGRhdGV0aW1lLmRhdGV0aW1lLm5vdygpCisKKworY2xhc3MgVG9vbEV2ZW50TG9nZ2VyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHNldFVwKHNlbGYpOgorICAgIHN1cGVyKCkuc2V0VXAoKQorICAgIHNlbGYuY2xlYXJjdXRfY2xpZW50ID0gRmFrZUNsZWFyY3V0Q2xpZW50KCkKKyAgICBzZWxmLmxvZ2dlciA9IHRvb2xfZXZlbnRfbG9nZ2VyLlRvb2xFdmVudExvZ2dlcigKKyAgICAgICAgVEVTVF9UT09MX1RBRywKKyAgICAgICAgVEVTVF9JTlZPQ0FUSU9OX0lELAorICAgICAgICBURVNUX1VTRVJfTkFNRSwKKyAgICAgICAgVEVTVF9IT1NUX05BTUUsCisgICAgICAgIFRFU1RfU09VUkNFX1JPT1QsCisgICAgICAgIFRFU1RfUExBVEZPUk1fVkVSU0lPTiwKKyAgICAgICAgVEVTVF9QWVRIT05fVkVSU0lPTiwKKyAgICAgICAgY2xpZW50PXNlbGYuY2xlYXJjdXRfY2xpZW50LAorICAgICkKKworICBkZWYgdGVzdF9sb2dfZXZlbnRfdGltZXN0YW1wKHNlbGYpOgorICAgIHdpdGggc2VsZi5sb2dnZXI6CisgICAgICBzZWxmLmxvZ2dlci5sb2dfaW52b2NhdGlvbl9zdGFydGVkKAorICAgICAgICAgIGRhdGV0aW1lLmRhdGV0aW1lLmZyb210aW1lc3RhbXAoMTAwLjEwMSksICd0ZXN0X2NvbW1hbmQnCisgICAgICApCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBzZWxmLmNsZWFyY3V0X2NsaWVudC5nZXRfbGFzdF9zZW50X2V2ZW50KCkuZXZlbnRfdGltZV9tcywgMTAwMTAxCisgICAgKQorCisgIGRlZiB0ZXN0X2xvZ19ldmVudF9iYXNpY19pbmZvcm1hdGlvbihzZWxmKToKKyAgICB3aXRoIHNlbGYubG9nZ2VyOgorICAgICAgc2VsZi5sb2dnZXIubG9nX2ludm9jYXRpb25fc3RhcnRlZChURVNUX0VWRU5UX1RJTUVTVEFNUCwgJ3Rlc3RfY29tbWFuZCcpCisKKyAgICBzZW50X2V2ZW50ID0gc2VsZi5jbGVhcmN1dF9jbGllbnQuZ2V0X2xhc3Rfc2VudF9ldmVudCgpCisgICAgbG9nX2V2ZW50ID0gdG9vbF9ldmVudF9wYjIuVG9vbEV2ZW50LkZyb21TdHJpbmcoc2VudF9ldmVudC5zb3VyY2VfZXh0ZW5zaW9uKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9nX2V2ZW50Lmludm9jYXRpb25faWQsIFRFU1RfSU5WT0NBVElPTl9JRCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGxvZ19ldmVudC51c2VyX25hbWUsIFRFU1RfVVNFUl9OQU1FKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9nX2V2ZW50Lmhvc3RfbmFtZSwgVEVTVF9IT1NUX05BTUUpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsb2dfZXZlbnQudG9vbF90YWcsIFRFU1RfVE9PTF9UQUcpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsb2dfZXZlbnQuc291cmNlX3Jvb3QsIFRFU1RfU09VUkNFX1JPT1QpCisKKyAgZGVmIHRlc3RfbG9nX2ludm9jYXRpb25fc3RhcnRlZChzZWxmKToKKyAgICBleHBlY3RlZF9pbnZvY2F0aW9uX3N0YXJ0ZWQgPSB0b29sX2V2ZW50X3BiMi5Ub29sRXZlbnQuSW52b2NhdGlvblN0YXJ0ZWQoCisgICAgICAgIGNvbW1hbmRfYXJncz0ndGVzdF9jb21tYW5kJywKKyAgICAgICAgb3M9VEVTVF9QTEFURk9STV9WRVJTSU9OICsgJzonICsgVEVTVF9QWVRIT05fVkVSU0lPTiwKKyAgICApCisKKyAgICB3aXRoIHNlbGYubG9nZ2VyOgorICAgICAgc2VsZi5sb2dnZXIubG9nX2ludm9jYXRpb25fc3RhcnRlZChURVNUX0VWRU5UX1RJTUVTVEFNUCwgJ3Rlc3RfY29tbWFuZCcpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xlYXJjdXRfY2xpZW50LmdldF9udW1iZXJfb2Zfc2VudF9ldmVudHMoKSwgMSkKKyAgICBzZW50X2V2ZW50ID0gc2VsZi5jbGVhcmN1dF9jbGllbnQuZ2V0X2xhc3Rfc2VudF9ldmVudCgpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgZXhwZWN0ZWRfaW52b2NhdGlvbl9zdGFydGVkLAorICAgICAgICB0b29sX2V2ZW50X3BiMi5Ub29sRXZlbnQuRnJvbVN0cmluZygKKyAgICAgICAgICAgIHNlbnRfZXZlbnQuc291cmNlX2V4dGVuc2lvbgorICAgICAgICApLmludm9jYXRpb25fc3RhcnRlZCwKKyAgICApCisKKyAgZGVmIHRlc3RfbG9nX2ludm9jYXRpb25fc3RvcHBlZChzZWxmKToKKyAgICBleHBlY3RlZF9pbnZvY2F0aW9uX3N0b3BwZWQgPSB0b29sX2V2ZW50X3BiMi5Ub29sRXZlbnQuSW52b2NhdGlvblN0b3BwZWQoCisgICAgICAgIGV4aXRfY29kZT0wLAorICAgICAgICBleGl0X2xvZz0nZXhpdF9sb2cnLAorICAgICkKKworICAgIHdpdGggc2VsZi5sb2dnZXI6CisgICAgICBzZWxmLmxvZ2dlci5sb2dfaW52b2NhdGlvbl9zdG9wcGVkKFRFU1RfRVZFTlRfVElNRVNUQU1QLCAwLCAnZXhpdF9sb2cnKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsZWFyY3V0X2NsaWVudC5nZXRfbnVtYmVyX29mX3NlbnRfZXZlbnRzKCksIDEpCisgICAgc2VudF9ldmVudCA9IHNlbGYuY2xlYXJjdXRfY2xpZW50LmdldF9sYXN0X3NlbnRfZXZlbnQoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGV4cGVjdGVkX2ludm9jYXRpb25fc3RvcHBlZCwKKyAgICAgICAgdG9vbF9ldmVudF9wYjIuVG9vbEV2ZW50LkZyb21TdHJpbmcoCisgICAgICAgICAgICBzZW50X2V2ZW50LnNvdXJjZV9leHRlbnNpb24KKyAgICAgICAgKS5pbnZvY2F0aW9uX3N0b3BwZWQsCisgICAgKQorCisgIGRlZiB0ZXN0X2xvZ19tdWx0aXBsZV9ldmVudHMoc2VsZik6CisgICAgd2l0aCBzZWxmLmxvZ2dlcjoKKyAgICAgIHNlbGYubG9nZ2VyLmxvZ19pbnZvY2F0aW9uX3N0YXJ0ZWQoVEVTVF9FVkVOVF9USU1FU1RBTVAsICd0ZXN0X2NvbW1hbmQnKQorICAgICAgc2VsZi5sb2dnZXIubG9nX2ludm9jYXRpb25fc3RvcHBlZChURVNUX0VWRU5UX1RJTUVTVEFNUCwgMCwgJ2V4aXRfbG9nJykKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGVhcmN1dF9jbGllbnQuZ2V0X251bWJlcl9vZl9zZW50X2V2ZW50cygpLCAyKQorCisKK2NsYXNzIE1haW5UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBSRVFVSVJFRF9BUkdTID0gWworICAgICAgJycsCisgICAgICAnLS10b29sX3RhZycsCisgICAgICAndGVzdF90b29sJywKKyAgICAgICctLXN0YXJ0X3RpbWVzdGFtcCcsCisgICAgICAnMScsCisgICAgICAnLS1lbmRfdGltZXN0YW1wJywKKyAgICAgICcyJywKKyAgICAgICctLWV4aXRfY29kZScsCisgICAgICAnMCcsCisgIF0KKworICBkZWYgdGVzdF9sb2dfYW5kX2V4aXRfd2l0aF9taXNzaW5nX3JlcXVpcmVkX2FyZ3Moc2VsZik6CisgICAgd2l0aCBzZWxmLmFzc2VydExvZ3MoKSBhcyBsb2dzOgorICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhTeXN0ZW1FeGl0KSBhcyBleDoKKyAgICAgICAgdG9vbF9ldmVudF9sb2dnZXIubWFpbihbJycsICctLXRvb2xfdGFnJywgJ3Rlc3RfdG9vbCddKQorCisgICAgd2l0aCBzZWxmLnN1YlRlc3QoJ1ZlcmlmeSBleGNlcHRpb24gY29kZScpOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbChleC5leGNlcHRpb24uY29kZSwgMikKKworICAgIHdpdGggc2VsZi5zdWJUZXN0KCdWZXJpZnkgbG9nIG1lc3NhZ2VzJyk6CisgICAgICBzZWxmLmFzc2VydEluKAorICAgICAgICAgICd0aGUgZm9sbG93aW5nIGFyZ3VtZW50cyBhcmUgcmVxdWlyZWQnLAorICAgICAgICAgICdcbicuam9pbihsb2dzLm91dHB1dCksCisgICAgICApCisKKyAgZGVmIHRlc3RfbG9nX2FuZF9leGl0X3dpdGhfaW52YWxpZF9hcmdzKHNlbGYpOgorICAgIHdpdGggc2VsZi5hc3NlcnRMb2dzKCkgYXMgbG9nczoKKyAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoU3lzdGVtRXhpdCkgYXMgZXg6CisgICAgICAgIHRvb2xfZXZlbnRfbG9nZ2VyLm1haW4oWycnLCAnLS1zdGFydF90aW1lc3RhbXAnLCAndGVzdCddKQorCisgICAgd2l0aCBzZWxmLnN1YlRlc3QoJ1ZlcmlmeSBleGNlcHRpb24gY29kZScpOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbChleC5leGNlcHRpb24uY29kZSwgMikKKworICAgIHdpdGggc2VsZi5zdWJUZXN0KCdWZXJpZnkgbG9nIG1lc3NhZ2VzJyk6CisgICAgICBzZWxmLmFzc2VydEluKAorICAgICAgICAgICctLXN0YXJ0X3RpbWVzdGFtcDogaW52YWxpZCcsCisgICAgICAgICAgJ1xuJy5qb2luKGxvZ3Mub3V0cHV0KSwKKyAgICAgICkKKworICBkZWYgdGVzdF9sb2dfYW5kX2V4aXRfd2l0aF9kcnlfcnVuKHNlbGYpOgorICAgIHdpdGggc2VsZi5hc3NlcnRMb2dzKGxldmVsPWxvZ2dpbmcuREVCVUcpIGFzIGxvZ3M6CisgICAgICB0b29sX2V2ZW50X2xvZ2dlci5tYWluKHNlbGYuUkVRVUlSRURfQVJHUyArIFsnLS1kcnlfcnVuJ10pCisKKyAgICB3aXRoIHNlbGYuc3ViVGVzdCgnVmVyaWZ5IGxvZyBtZXNzYWdlcycpOgorICAgICAgc2VsZi5hc3NlcnRJbignZHJ5IHJ1bicsICdcbicuam9pbihsb2dzLm91dHB1dCkpCisKKyAgQG1vY2sucGF0Y2gub2JqZWN0KGNsZWFyY3V0X2NsaWVudCwgJ0NsZWFyY3V0JykKKyAgZGVmIHRlc3RfbG9nX2FuZF9leGl0X3dpdGhfdW5leHBlY3RlZF9leGNlcHRpb24oc2VsZiwgbW9ja19jYyk6CisgICAgbW9ja19jYy5yZXR1cm5fdmFsdWUgPSBGYWtlQ2xlYXJjdXRDbGllbnQocmFpc2VfbG9nX2V4Y2VwdGlvbj1UcnVlKQorCisgICAgd2l0aCBzZWxmLmFzc2VydExvZ3MoKSBhcyBsb2dzOgorICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhFeGNlcHRpb24pIGFzIGV4OgorICAgICAgICB0b29sX2V2ZW50X2xvZ2dlci5tYWluKHNlbGYuUkVRVUlSRURfQVJHUykKKworICAgIHdpdGggc2VsZi5zdWJUZXN0KCdWZXJpZnkgbG9nIG1lc3NhZ2VzJyk6CisgICAgICBzZWxmLmFzc2VydEluKCd1bmV4cGVjdGVkIGVycm9yJywgJ1xuJy5qb2luKGxvZ3Mub3V0cHV0KSkKKworICBAbW9jay5wYXRjaC5vYmplY3QoY2xlYXJjdXRfY2xpZW50LCAnQ2xlYXJjdXQnKQorICBkZWYgdGVzdF9zdWNjZXNzKHNlbGYsIG1vY2tfY2MpOgorICAgIG1vY2tfY2xlYXJfY3V0X2NsaWVudCA9IEZha2VDbGVhcmN1dENsaWVudCgpCisgICAgbW9ja19jYy5yZXR1cm5fdmFsdWUgPSBtb2NrX2NsZWFyX2N1dF9jbGllbnQKKworICAgIHRvb2xfZXZlbnRfbG9nZ2VyLm1haW4oc2VsZi5SRVFVSVJFRF9BUkdTKQorCisgICAgc2VsZi5hc3NlcnRFcXVhbChtb2NrX2NsZWFyX2N1dF9jbGllbnQuZ2V0X251bWJlcl9vZl9zZW50X2V2ZW50cygpLCAyKQorCisKK2NsYXNzIEZha2VDbGVhcmN1dENsaWVudDoKKworICBkZWYgX19pbml0X18oc2VsZiwgcmFpc2VfbG9nX2V4Y2VwdGlvbj1GYWxzZSk6CisgICAgc2VsZi5wZW5kaW5nX2xvZ19ldmVudHMgPSBbXQorICAgIHNlbGYuc2VudF9sb2dfZXZlbnRzID0gW10KKyAgICBzZWxmLnJhaXNlX2xvZ19leGNlcHRpb24gPSByYWlzZV9sb2dfZXhjZXB0aW9uCisKKyAgZGVmIGxvZyhzZWxmLCBsb2dfZXZlbnQpOgorICAgIGlmIHNlbGYucmFpc2VfbG9nX2V4Y2VwdGlvbjoKKyAgICAgIHJhaXNlIEV4Y2VwdGlvbigndW5rbm93biBleGNlcHRpb24nKQorICAgIHNlbGYucGVuZGluZ19sb2dfZXZlbnRzLmFwcGVuZChsb2dfZXZlbnQpCisKKyAgZGVmIGZsdXNoX2V2ZW50cyhzZWxmKToKKyAgICBzZWxmLnNlbnRfbG9nX2V2ZW50cy5leHRlbmQoc2VsZi5wZW5kaW5nX2xvZ19ldmVudHMpCisgICAgc2VsZi5wZW5kaW5nX2xvZ19ldmVudHMuY2xlYXIoKQorCisgIGRlZiBnZXRfbnVtYmVyX29mX3NlbnRfZXZlbnRzKHNlbGYpOgorICAgIHJldHVybiBsZW4oc2VsZi5zZW50X2xvZ19ldmVudHMpCisKKyAgZGVmIGdldF9sYXN0X3NlbnRfZXZlbnQoc2VsZik6CisgICAgcmV0dXJuIHNlbGYuc2VudF9sb2dfZXZlbnRzWy0xXQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvdG9vbHMvd2hpY2hnaXQgYi90b29scy93aGljaGdpdAppbmRleCBiMGJmMmU0Li41NWM4YzZmIDEwMDc1NQotLS0gYS90b29scy93aGljaGdpdAorKysgYi90b29scy93aGljaGdpdApAQCAtMSw2ICsxLDcgQEAKICMhL3Vzci9iaW4vZW52IHB5dGhvbjMKIAogaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgaXRlcnRvb2xzCiBpbXBvcnQgb3MKIGltcG9ydCBzdWJwcm9jZXNzCiBpbXBvcnQgc3lzCkBAIC0xMCwxNSArMTEsMzQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrPVRydWUsIGNhcHR1cmVfb3V0cHV0PVRydWUsIHRleHQ9VHJ1ZSkuc3Rkb3V0LnN0cmlwKCkKIAogCitkZWYgZ2V0X2FsbF9tb2R1bGVzKCk6CisgIHByb2R1Y3Rfb3V0ID0gc3VicHJvY2Vzcy5ydW4oWyJidWlsZC9zb29uZy9zb29uZ191aS5iYXNoIiwgIi0tZHVtcHZhci1tb2RlIiwgIi0tYWJzIiwgIlBST0RVQ1RfT1VUIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrPVRydWUsIGNhcHR1cmVfb3V0cHV0PVRydWUsIHRleHQ9VHJ1ZSkuc3Rkb3V0LnN0cmlwKCkKKyAgcmVzdWx0ID0gc3VicHJvY2Vzcy5ydW4oWyJjYXQiLCBwcm9kdWN0X291dCArICIvYWxsX21vZHVsZXMudHh0Il0sIGNoZWNrPVRydWUsIGNhcHR1cmVfb3V0cHV0PVRydWUsIHRleHQ9VHJ1ZSkKKyAgcmV0dXJuIHJlc3VsdC5zdGRvdXQuc3RyaXAoKS5zcGxpdCgiXG4iKQorCisKK2RlZiBiYXRjaGVkKGl0ZXJhYmxlLCBuKToKKyAgIyBpbnRyb2R1Y2VkIGluIGl0ZXJ0b29scyAzLjEyLCBjb3VsZCBkZWxldGUgb25jZSB0aGF0J3MgdW5pdmVyc2FsbHkgYXZhaWxhYmxlCisgIGlmIG4gPCAxOgorICAgIHJhaXNlIFZhbHVlRXJyb3IoJ24gbXVzdCBiZSBhdCBsZWFzdCBvbmUnKQorICBpdCA9IGl0ZXIoaXRlcmFibGUpCisgIHdoaWxlIGJhdGNoIDo9IHR1cGxlKGl0ZXJ0b29scy5pc2xpY2UoaXQsIG4pKToKKyAgICB5aWVsZCBiYXRjaAorCisKIGRlZiBnZXRfc291cmNlcyhtb2R1bGVzKToKLSAgcmVzdWx0ID0gc3VicHJvY2Vzcy5ydW4oWyIuL3ByZWJ1aWx0cy9idWlsZC10b29scy9saW51eC14ODYvYmluL25pbmphIiwgIi1mIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXQvY29tYmluZWQtIiArIG9zLmVudmlyb25bIlRBUkdFVF9QUk9EVUNUIl0gKyAiLm5pbmphIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICItdCIsICJpbnB1dHMiLCAiLWQiLCBdICsgbW9kdWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VULCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBjaGVjaz1GYWxzZSwgdGV4dD1UcnVlKQotICBpZiByZXN1bHQucmV0dXJuY29kZSAhPSAwOgotICAgIHN5cy5zdGRlcnIud3JpdGUocmVzdWx0LnN0ZG91dCkKLSAgICBzeXMuZXhpdCgxKQotICByZXR1cm4gc2V0KFtmIGZvciBmIGluIHJlc3VsdC5zdGRvdXQuc3BsaXQoIlxuIikgaWYgbm90IGYuc3RhcnRzd2l0aCgib3V0LyIpXSkKKyAgc291cmNlcyA9IHNldCgpCisgIGZvciBtb2R1bGVfZ3JvdXAgaW4gYmF0Y2hlZChtb2R1bGVzLCA0MF8wMDApOgorICAgIHJlc3VsdCA9IHN1YnByb2Nlc3MucnVuKFsiLi9wcmVidWlsdHMvYnVpbGQtdG9vbHMvbGludXgteDg2L2Jpbi9uaW5qYSIsICItZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dC9jb21iaW5lZC0iICsgb3MuZW52aXJvblsiVEFSR0VUX1BST0RVQ1QiXSArICIubmluamEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICItdCIsICJpbnB1dHMiLCAiLWQiLCBdICsgbGlzdChtb2R1bGVfZ3JvdXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgY2hlY2s9RmFsc2UsIHRleHQ9VHJ1ZSkKKyAgICBpZiByZXN1bHQucmV0dXJuY29kZSAhPSAwOgorICAgICAgc3lzLnN0ZGVyci53cml0ZShyZXN1bHQuc3Rkb3V0KQorICAgICAgc3lzLmV4aXQoMSkKKyAgICBzb3VyY2VzLnVwZGF0ZShzZXQoW2YgZm9yIGYgaW4gcmVzdWx0LnN0ZG91dC5zcGxpdCgiXG4iKSBpZiBub3QgZi5zdGFydHN3aXRoKCJvdXQvIildKSkKKyAgcmV0dXJuIHNvdXJjZXMKIAogCiBkZWYgbV9ub3RoaW5nKCk6CkBAIC01MCw1NyArNzAsNzYgQEAKICAgICAgICAgcmVmZXJlbmNlZF9kaXJzLmFkZChkKQogICAgICAgICBwcmV2X2RpciA9IGQKICAgICAgICAgYnJlYWsKLSAgcmV0dXJuIFtkWzA6LTFdIGZvciBkIGluIHJlZmVyZW5jZWRfZGlyc10KKyAgcmV0dXJuIHJlZmVyZW5jZWRfZGlycwogCiAKIGRlZiBtYWluKGFyZ3YpOgogICAjIEFyZ3VtZW50IHBhcnNpbmcKICAgYXAgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj0iTGlzdCB0aGUgcmVxdWlyZWQgZ2l0IHByb2plY3RzIGZvciB0aGUgZ2l2ZW4gbW9kdWxlcyIpCiAgIGFwLmFkZF9hcmd1bWVudCgiLS1wcm9kdWN0cyIsIG5hcmdzPSIqIiwKLSAgICAgICAgICAgICAgICAgIGhlbHA9IlRoZSBUQVJHRVRfUFJPRFVDVCB0byBjaGVjay4gSWYgbm90IHByb3ZpZGVkIGp1c3QgdXNlcyB3aGF0ZXZlciBoYXMiCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgYWxyZWFkeSBiZWVuIGJ1aWx0IikKKyAgICAgICAgICAgICAgICAgIGhlbHA9Ik9uZSBvciBtb3JlIFRBUkdFVF9QUk9EVUNUIHRvIGNoZWNrLCBvciBcIipcIiBmb3IgYWxsLiBJZiBub3QgcHJvdmlkZWQiCisgICAgICAgICAgICAgICAgICAgICAgICArICJqdXN0IHVzZXMgd2hhdGV2ZXIgaGFzIGFscmVhZHkgYmVlbiBidWlsdCIpCiAgIGFwLmFkZF9hcmd1bWVudCgiLS12YXJpYW50cyIsIG5hcmdzPSIqIiwKICAgICAgICAgICAgICAgICAgIGhlbHA9IlRoZSBUQVJHRVRfQlVJTERfVkFSSUFOVFMgdG8gY2hlY2suIElmIG5vdCBwcm92aWRlZCBqdXN0IHVzZXMgd2hhdGV2ZXIgaGFzIgogICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFscmVhZHkgYmVlbiBidWlsdCwgb3IgZW5nIGlmIC0tcHJvZHVjdHMgaXMgc3VwcGxpZWQiKQogICBhcC5hZGRfYXJndW1lbnQoIi0tbW9kdWxlcyIsIG5hcmdzPSIqIiwKLSAgICAgICAgICAgICAgICAgIGhlbHA9IlRoZSBidWlsZCBtb2R1bGVzIHRvIGNoZWNrLCBvciBkcm9pZCBpdCBub3Qgc3VwcGxpZWQiKQorICAgICAgICAgICAgICAgICAgaGVscD0iVGhlIGJ1aWxkIG1vZHVsZXMgdG8gY2hlY2ssIG9yIFwiKlwiIGZvciBhbGwsIG9yIGRyb2lkIGlmIG5vdCBzdXBwbGllZCIpCiAgIGFwLmFkZF9hcmd1bWVudCgiLS13aHkiLCBuYXJncz0iKiIsCiAgICAgICAgICAgICAgICAgICBoZWxwPSJBbHNvIHByaW50IHRoZSBpbnB1dCBmaWxlcyB1c2VkIGluIHRoZXNlIHByb2plY3RzLCBvciBcIipcIiBmb3IgYWxsIikKKyAgYXAuYWRkX2FyZ3VtZW50KCItLXVudXNlZCIsIGhlbHA9Ikxpc3QgdGhlIHVudXNlZCBnaXQgcHJvamVjdHMgZm9yIHRoZSBnaXZlbiBtb2R1bGVzIHJhdGhlciB0aGFuIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAidGhlIHVzZWQgb25lcy4gSWdub3JlcyAtLXdoeSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIpCiAgIGFyZ3MgPSBhcC5wYXJzZV9hcmdzKGFyZ3ZbMTpdKQogCiAgIG1vZHVsZXMgPSBhcmdzLm1vZHVsZXMgaWYgYXJncy5tb2R1bGVzIGVsc2UgWyJkcm9pZCJdCiAKKyAgbWF0Y2ggYXJncy5wcm9kdWN0czoKKyAgICBjYXNlIFsiKiJdOgorICAgICAgcHJvZHVjdHMgPSBnZXRfYnVpbGRfdmFyKCJhbGxfbmFtZWRfcHJvZHVjdHMiKS5zcGxpdCgiICIpCisgICAgY2FzZSBfOgorICAgICAgcHJvZHVjdHMgPSBhcmdzLnByb2R1Y3RzCisKICAgIyBHZXQgdGhlIGxpc3Qgb2Ygc291cmNlcyBmb3IgYWxsIG9mIHRoZSByZXF1ZXN0ZWQgYnVpbGQgY29tYm9zCi0gIGlmIG5vdCBhcmdzLnByb2R1Y3RzIGFuZCBub3QgYXJncy52YXJpYW50czoKKyAgaWYgbm90IHByb2R1Y3RzIGFuZCBub3QgYXJncy52YXJpYW50czoKKyAgICBtX25vdGhpbmcoKQorICAgIGlmIGFyZ3MubW9kdWxlcyA9PSBbIioiXToKKyAgICAgIG1vZHVsZXMgPSBnZXRfYWxsX21vZHVsZXMoKQogICAgIHNvdXJjZXMgPSBnZXRfc291cmNlcyhtb2R1bGVzKQogICBlbHNlOgotICAgIGlmIG5vdCBhcmdzLnByb2R1Y3RzOgorICAgIGlmIG5vdCBwcm9kdWN0czoKICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIkVycm9yOiAtLXByb2R1Y3RzIG11c3QgYmUgc3VwcGxpZWQgaWYgLS12YXJpYW50cyBpcyBzdXBwbGllZCIpCiAgICAgICBzeXMuZXhpdCgxKQogICAgIHNvdXJjZXMgPSBzZXQoKQogICAgIGJ1aWxkX251bSA9IDEKLSAgICBmb3IgcHJvZHVjdCBpbiBhcmdzLnByb2R1Y3RzOgorICAgIGZvciBwcm9kdWN0IGluIHByb2R1Y3RzOgogICAgICAgb3MuZW52aXJvblsiVEFSR0VUX1BST0RVQ1QiXSA9IHByb2R1Y3QKICAgICAgIHZhcmlhbnRzID0gYXJncy52YXJpYW50cyBpZiBhcmdzLnZhcmlhbnRzIGVsc2UgWyJ1c2VyIiwgInVzZXJkZWJ1ZyIsICJlbmciXQogICAgICAgZm9yIHZhcmlhbnQgaW4gdmFyaWFudHM6Ci0gICAgICAgIHN5cy5zdGRlcnIud3JpdGUoZiJBbmFseXppbmcgYnVpbGQge2J1aWxkX251bX0gb2Yge2xlbihhcmdzLnByb2R1Y3RzKSpsZW4odmFyaWFudHMpfVxyIikKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZShmIkFuYWx5emluZyBidWlsZCB7YnVpbGRfbnVtfSBvZiB7bGVuKHByb2R1Y3RzKSpsZW4odmFyaWFudHMpfVxyIikKICAgICAgICAgb3MuZW52aXJvblsiVEFSR0VUX0JVSUxEX1ZBUklBTlQiXSA9IHZhcmlhbnQKICAgICAgICAgbV9ub3RoaW5nKCkKKyAgICAgICAgaWYgYXJncy5tb2R1bGVzID09IFsiKiJdOgorICAgICAgICAgIG1vZHVsZXMgPSBnZXRfYWxsX21vZHVsZXMoKQogICAgICAgICBzb3VyY2VzLnVwZGF0ZShnZXRfc291cmNlcyhtb2R1bGVzKSkKICAgICAgICAgYnVpbGRfbnVtICs9IDEKICAgICBzeXMuc3RkZXJyLndyaXRlKCJcblxuIikKIAogICBzb3VyY2VzID0gc29ydGVkKHNvdXJjZXMpCiAKLSAgIyBQcmludCB0aGUgbGlzdCBvZiBnaXQgZGlyZWN0b3JpZXMgdGhhdCBoYXMgb25lIG9yIG1vcmUgb2YgdGhlIHNvdXJjZXMgaW4gaXQKLSAgZm9yIHByb2plY3QgaW4gc29ydGVkKGdldF9yZWZlcmVuY2VkX3Byb2plY3RzKGdldF9naXRfZGlycygpLCBzb3VyY2VzKSk6Ci0gICAgcHJpbnQocHJvamVjdCkKLSAgICBpZiBhcmdzLndoeToKLSAgICAgIGlmICIqIiBpbiBhcmdzLndoeSBvciBwcm9qZWN0IGluIGFyZ3Mud2h5OgotICAgICAgICBwcmVmaXggPSBwcm9qZWN0ICsgIi8iCi0gICAgICAgIGZvciBmIGluIHNvdXJjZXM6Ci0gICAgICAgICAgaWYgZi5zdGFydHN3aXRoKHByZWZpeCk6Ci0gICAgICAgICAgICBwcmludCgiICAiICsgZikKKyAgaWYgYXJncy51bnVzZWQ6CisgICAgIyBQcmludCB0aGUgbGlzdCBvZiBnaXQgZGlyZWN0b3JpZXMgdGhhdCBkb24ndCBjb250YWluIHNvdXJjZXMKKyAgICB1c2VkX2dpdF9kaXJzID0gc2V0KGdldF9naXRfZGlycygpKQorICAgIGZvciBwcm9qZWN0IGluIHNvcnRlZCh1c2VkX2dpdF9kaXJzLmRpZmZlcmVuY2Uoc2V0KGdldF9yZWZlcmVuY2VkX3Byb2plY3RzKHVzZWRfZ2l0X2RpcnMsIHNvdXJjZXMpKSkpOgorICAgICAgcHJpbnQocHJvamVjdFswOi0xXSkKKyAgZWxzZToKKyAgICAjIFByaW50IHRoZSBsaXN0IG9mIGdpdCBkaXJlY3RvcmllcyB0aGF0IGhhcyBvbmUgb3IgbW9yZSBvZiB0aGUgc291cmNlcyBpbiBpdAorICAgIGZvciBwcm9qZWN0IGluIHNvcnRlZChnZXRfcmVmZXJlbmNlZF9wcm9qZWN0cyhnZXRfZ2l0X2RpcnMoKSwgc291cmNlcykpOgorICAgICAgcHJpbnQocHJvamVjdFswOi0xXSkKKyAgICAgIGlmIGFyZ3Mud2h5OgorICAgICAgICBpZiAiKiIgaW4gYXJncy53aHkgb3IgcHJvamVjdFswOi0xXSBpbiBhcmdzLndoeToKKyAgICAgICAgICBwcmVmaXggPSBwcm9qZWN0CisgICAgICAgICAgZm9yIGYgaW4gc291cmNlczoKKyAgICAgICAgICAgIGlmIGYuc3RhcnRzd2l0aChwcmVmaXgpOgorICAgICAgICAgICAgICBwcmludCgiICAiICsgZikKIAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvdG9vbHMvemlwYWxpZ24vQW5kcm9pZC5icCBiL3Rvb2xzL3ppcGFsaWduL0FuZHJvaWQuYnAKaW5kZXggMGUxZDU4ZS4uOGJlN2UyNSAxMDA2NDQKLS0tIGEvdG9vbHMvemlwYWxpZ24vQW5kcm9pZC5icAorKysgYi90b29scy96aXBhbGlnbi9BbmRyb2lkLmJwCkBAIC03MCw2ICs3MCw3IEBACiAgICAgICAgICJsaWJnbW9jayIsCiAgICAgXSwKICAgICBkYXRhOiBbCisgICAgICAgICAidGVzdHMvZGF0YS9hcGtXaXRoVW5jb21wcmVzc2VkU2hhcmVkTGlicy56aXAiLAogICAgICAgICAgInRlc3RzL2RhdGEvYXJjaGl2ZVdpdGhPbmVEaXJlY3RvcnlFbnRyeS56aXAiLAogICAgICAgICAgInRlc3RzL2RhdGEvZGlmZk9yZGVycy56aXAiLAogICAgICAgICAgInRlc3RzL2RhdGEvaG9sZXMuemlwIiwKZGlmZiAtLWdpdCBhL3Rvb2xzL3ppcGFsaWduL1ppcEFsaWduLmNwcCBiL3Rvb2xzL3ppcGFsaWduL1ppcEFsaWduLmNwcAppbmRleCAyMzg0MGUzLi4zZDY1YmMwIDEwMDY0NAotLS0gYS90b29scy96aXBhbGlnbi9aaXBBbGlnbi5jcHAKKysrIGIvdG9vbHMvemlwYWxpZ24vWmlwQWxpZ24uY3BwCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSAiWmlwRmlsZS5oIgogCiAjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIApAQCAtMzYsMTcgKzM3LDE0IEBACiB9CiAKIHN0YXRpYyBpbnQgZ2V0QWxpZ25tZW50KGJvb2wgcGFnZUFsaWduU2hhcmVkTGlicywgaW50IGRlZmF1bHRBbGlnbm1lbnQsCi0gICAgWmlwRW50cnkqIHBFbnRyeSkgewotCi0gICAgc3RhdGljIGNvbnN0IGludCBrUGFnZUFsaWdubWVudCA9IDQwOTY7Ci0KKyAgICBaaXBFbnRyeSogcEVudHJ5LCBpbnQgcGFnZVNpemUpIHsKICAgICBpZiAoIXBhZ2VBbGlnblNoYXJlZExpYnMpIHsKICAgICAgICAgcmV0dXJuIGRlZmF1bHRBbGlnbm1lbnQ7CiAgICAgfQogCiAgICAgY29uc3QgY2hhciogZXh0ID0gc3RycmNocihwRW50cnktPmdldEZpbGVOYW1lKCksICcuJyk7CiAgICAgaWYgKGV4dCAmJiBzdHJjbXAoZXh0LCAiLnNvIikgPT0gMCkgewotICAgICAgICByZXR1cm4ga1BhZ2VBbGlnbm1lbnQ7CisgICAgICAgIHJldHVybiBwYWdlU2l6ZTsKICAgICB9CiAKICAgICByZXR1cm4gZGVmYXVsdEFsaWdubWVudDsKQEAgLTU2LDcgKzU0LDcgQEAKICAqIENvcHkgYWxsIGVudHJpZXMgZnJvbSAicFppbiIgdG8gInBab3V0IiwgYWxpZ25pbmcgYXMgbmVlZGVkLgogICovCiBzdGF0aWMgaW50IGNvcHlBbmRBbGlnbihaaXBGaWxlKiBwWmluLCBaaXBGaWxlKiBwWm91dCwgaW50IGFsaWdubWVudCwgYm9vbCB6b3BmbGksCi0gICAgYm9vbCBwYWdlQWxpZ25TaGFyZWRMaWJzKQorICAgIGJvb2wgcGFnZUFsaWduU2hhcmVkTGlicywgaW50IHBhZ2VTaXplKQogewogICAgIGludCBudW1FbnRyaWVzID0gcFppbi0+Z2V0TnVtRW50cmllcygpOwogICAgIFppcEVudHJ5KiBwRW50cnk7CkBAIC04NCw3ICs4Miw4IEBACiAgICAgICAgICAgICAgICAgc3RhdHVzID0gcFpvdXQtPmFkZChwWmluLCBwRW50cnksIHBhZGRpbmcsICZwTmV3RW50cnkpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uc3QgaW50IGFsaWduVG8gPSBnZXRBbGlnbm1lbnQocGFnZUFsaWduU2hhcmVkTGlicywgYWxpZ25tZW50LCBwRW50cnkpOworICAgICAgICAgICAgY29uc3QgaW50IGFsaWduVG8gPSBnZXRBbGlnbm1lbnQocGFnZUFsaWduU2hhcmVkTGlicywgYWxpZ25tZW50LCBwRW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlU2l6ZSk7CiAKICAgICAgICAgICAgIC8vcHJpbnRmKCItLS0gJXM6IG9yaWcgYXQgJWxkKCslZCkgbGVuPSVsZCwgYWRkaW5nIHBhZD0lZFxuIiwKICAgICAgICAgICAgIC8vICAgIHBFbnRyeS0+Z2V0RmlsZU5hbWUoKSwgKGxvbmcpIHBFbnRyeS0+Z2V0RmlsZU9mZnNldCgpLApAQCAtMTA3LDcgKzEwNiw3IEBACiAgKiBvdXRwdXQgZmlsZSBleGlzdHMgYW5kICJmb3JjZSIgd2Fzbid0IHNwZWNpZmllZC4KICAqLwogaW50IHByb2Nlc3MoY29uc3QgY2hhciogaW5GaWxlTmFtZSwgY29uc3QgY2hhciogb3V0RmlsZU5hbWUsCi0gICAgaW50IGFsaWdubWVudCwgYm9vbCBmb3JjZSwgYm9vbCB6b3BmbGksIGJvb2wgcGFnZUFsaWduU2hhcmVkTGlicykKKyAgICBpbnQgYWxpZ25tZW50LCBib29sIGZvcmNlLCBib29sIHpvcGZsaSwgYm9vbCBwYWdlQWxpZ25TaGFyZWRMaWJzLCBpbnQgcGFnZVNpemUpCiB7CiAgICAgWmlwRmlsZSB6aW4sIHpvdXQ7CiAKQEAgLTEyNyw3ICsxMjYsNyBAQAogICAgIH0KIAogICAgIGlmICh6aW4ub3BlbihpbkZpbGVOYW1lLCBaaXBGaWxlOjprT3BlblJlYWRPbmx5KSAhPSBPSykgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBvcGVuICclcycgYXMgemlwIGFyY2hpdmVcbiIsIGluRmlsZU5hbWUpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBvcGVuICclcycgYXMgemlwIGFyY2hpdmU6ICVzXG4iLCBpbkZpbGVOYW1lLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAgICAgaWYgKHpvdXQub3BlbihvdXRGaWxlTmFtZSwKQEAgLTEzOCw3ICsxMzcsOCBAQAogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAKLSAgICBpbnQgcmVzdWx0ID0gY29weUFuZEFsaWduKCZ6aW4sICZ6b3V0LCBhbGlnbm1lbnQsIHpvcGZsaSwgcGFnZUFsaWduU2hhcmVkTGlicyk7CisgICAgaW50IHJlc3VsdCA9IGNvcHlBbmRBbGlnbigmemluLCAmem91dCwgYWxpZ25tZW50LCB6b3BmbGksIHBhZ2VBbGlnblNoYXJlZExpYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlU2l6ZSk7CiAgICAgaWYgKHJlc3VsdCAhPSAwKSB7CiAgICAgICAgIHByaW50ZigiemlwYWxpZ246IGZhaWxlZCByZXdyaXRpbmcgJyVzJyB0byAnJXMnXG4iLAogICAgICAgICAgICAgaW5GaWxlTmFtZSwgb3V0RmlsZU5hbWUpOwpAQCAtMTUwLDcgKzE1MCw3IEBACiAgKiBWZXJpZnkgdGhlIGFsaWdubWVudCBvZiBhIHppcCBhcmNoaXZlLgogICovCiBpbnQgdmVyaWZ5KGNvbnN0IGNoYXIqIGZpbGVOYW1lLCBpbnQgYWxpZ25tZW50LCBib29sIHZlcmJvc2UsCi0gICAgYm9vbCBwYWdlQWxpZ25TaGFyZWRMaWJzKQorICAgIGJvb2wgcGFnZUFsaWduU2hhcmVkTGlicywgaW50IHBhZ2VTaXplKQogewogICAgIFppcEZpbGUgemlwRmlsZTsKICAgICBib29sIGZvdW5kQmFkID0gZmFsc2U7CkBAIC0xODEsNyArMTgxLDggQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBvZmZfdCBvZmZzZXQgPSBwRW50cnktPmdldEZpbGVPZmZzZXQoKTsKLSAgICAgICAgICAgIGNvbnN0IGludCBhbGlnblRvID0gZ2V0QWxpZ25tZW50KHBhZ2VBbGlnblNoYXJlZExpYnMsIGFsaWdubWVudCwgcEVudHJ5KTsKKyAgICAgICAgICAgIGNvbnN0IGludCBhbGlnblRvID0gZ2V0QWxpZ25tZW50KHBhZ2VBbGlnblNoYXJlZExpYnMsIGFsaWdubWVudCwgcEVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVNpemUpOwogICAgICAgICAgICAgaWYgKChvZmZzZXQgJSBhbGlnblRvKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlOGpkICVzIChCQUQgLSAlamQpXG4iLApAQCAtMTk5LDcgKzIwMCw3IEBACiAgICAgfQogCiAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgIHByaW50ZigiVmVyaWZpY2F0aW9uICVzXG4iLCBmb3VuZEJhZCA/ICJGQUlMRUQiIDogInN1Y2Nlc2Z1bCIpOworICAgICAgICBwcmludGYoIlZlcmlmaWNhdGlvbiAlc1xuIiwgZm91bmRCYWQgPyAiRkFJTEVEIiA6ICJzdWNjZXNzZnVsIik7CiAKICAgICByZXR1cm4gZm91bmRCYWQgPyAxIDogMDsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3ppcGFsaWduL1ppcEFsaWduTWFpbi5jcHAgYi90b29scy96aXBhbGlnbi9aaXBBbGlnbk1haW4uY3BwCmluZGV4IDUzZmM4ZDQuLjJmMjQ0MDMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3ppcGFsaWduL1ppcEFsaWduTWFpbi5jcHAKKysrIGIvdG9vbHMvemlwYWxpZ24vWmlwQWxpZ25NYWluLmNwcApAQCAtMzQsMTUgKzM0LDE4IEBACiAgICAgZnByaW50ZihzdGRlcnIsICJaaXAgYWxpZ25tZW50IHV0aWxpdHlcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3RcblxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICJVc2FnZTogemlwYWxpZ24gWy1mXSBbLXBdIFstdl0gWy16XSA8YWxpZ24+IGluZmlsZS56aXAgb3V0ZmlsZS56aXBcbiIKLSAgICAgICAgIiAgICAgICB6aXBhbGlnbiAtYyBbLXBdIFstdl0gPGFsaWduPiBpbmZpbGUuemlwXG5cbiIgKTsKKyAgICAgICAgIlVzYWdlOiB6aXBhbGlnbiBbLWZdIFstcF0gWy1QIDxwYWdlc2l6ZV9rYj5dIFstdl0gWy16XSA8YWxpZ24+IGluZmlsZS56aXAgb3V0ZmlsZS56aXBcbiIKKyAgICAgICAgIiAgICAgICB6aXBhbGlnbiAtYyBbLXBdIFstUCA8cGFnZXNpemVfa2I+XSBbLXZdIDxhbGlnbj4gaW5maWxlLnppcFxuXG4iICk7CiAgICAgZnByaW50ZihzdGRlcnIsCiAgICAgICAgICIgIDxhbGlnbj46IGFsaWdubWVudCBpbiBieXRlcywgZS5nLiAnNCcgcHJvdmlkZXMgMzItYml0IGFsaWdubWVudFxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgIC1jOiBjaGVjayBhbGlnbm1lbnQgb25seSAoZG9lcyBub3QgbW9kaWZ5IGZpbGUpXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgLWY6IG92ZXJ3cml0ZSBleGlzdGluZyBvdXRmaWxlLnppcFxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgIC1wOiBwYWdlLWFsaWduIHVuY29tcHJlc3NlZCAuc28gZmlsZXNcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAtcDogNGtiIHBhZ2UtYWxpZ24gdW5jb21wcmVzc2VkIC5zbyBmaWxlc1xuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgIC12OiB2ZXJib3NlIG91dHB1dFxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgIC16OiByZWNvbXByZXNzIHVzaW5nIFpvcGZsaVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgIC1QIDxwYWdlc2l6ZV9rYj46IEFsaWduIHVuY29tcHJlc3NlZCAuc28gZmlsZXMgdG8gdGhlIHNwZWNpZmllZFxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgICAgIHBhZ2Ugc2l6ZS4gVmFsaWQgdmFsdWVzIGZvciA8cGFnZXNpemVfa2I+IGFyZSA0LCAxNlxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgICAgIGFuZCA2NC4gJy1QJyBjYW5ub3QgYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoICctcCcuXG4iKTsKIH0KIAogCkBAIC01NywxMiArNjAsMTYgQEAKICAgICBib29sIHZlcmJvc2UgPSBmYWxzZTsKICAgICBib29sIHpvcGZsaSA9IGZhbHNlOwogICAgIGJvb2wgcGFnZUFsaWduU2hhcmVkTGlicyA9IGZhbHNlOworICAgIGludCBwYWdlU2l6ZSA9IDQwOTY7CisgICAgYm9vbCBsZWdhY3lQYWdlQWxpZ25tZW50RmxhZyA9IGZhbHNlOyAgIC8vIC1wCisgICAgYm9vbCBwYWdlQWxpZ25tZW50RmxhZyA9IGZhbHNlOyAgICAgICAgIC8vIC1QIDxwYWdlc2l6ZV9rYj4KICAgICBpbnQgcmVzdWx0ID0gMTsKICAgICBpbnQgYWxpZ25tZW50OwogICAgIGNoYXIqIGVuZHA7CiAKICAgICBpbnQgb3B0OwotICAgIHdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJmY3B2eiIpKSAhPSAtMSkgeworCisgICAgd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgImZjcHZ6UDoiKSkgIT0gLTEpIHsKICAgICAgICAgc3dpdGNoIChvcHQpIHsKICAgICAgICAgY2FzZSAnYyc6CiAgICAgICAgICAgICBjaGVjayA9IHRydWU7CkBAIC03Nyw3ICs4NCwyOSBAQAogICAgICAgICAgICAgem9wZmxpID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlICdwJzoKKyAgICAgICAgICAgIGxlZ2FjeVBhZ2VBbGlnbm1lbnRGbGFnID0gdHJ1ZTsKICAgICAgICAgICAgIHBhZ2VBbGlnblNoYXJlZExpYnMgPSB0cnVlOworICAgICAgICAgICAgcGFnZVNpemUgPSA0MDk2OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1AnOgorICAgICAgICAgICAgcGFnZUFsaWdubWVudEZsYWcgPSB0cnVlOworICAgICAgICAgICAgcGFnZUFsaWduU2hhcmVkTGlicyA9IHRydWU7CisKKyAgICAgICAgICAgIGlmICghb3B0YXJnKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogLVAgcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIpOworICAgICAgICAgICAgICAgIHdhbnRVc2FnZSA9IHRydWU7CisgICAgICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYWdlU2l6ZSA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgIGlmIChwYWdlU2l6ZSAhPSA0ICYmIHBhZ2VTaXplICE9IDE2ICYmIHBhZ2VTaXplICE9IDY0KSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogSW52YWxpZCBhcmd1bWVudCBmb3IgLVA6ICVzXG4iLCBvcHRhcmcpOworICAgICAgICAgICAgICAgIHdhbnRVc2FnZSA9IHRydWU7CisgICAgICAgICAgICAgICAgZ290byBiYWlsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYWdlU2l6ZSAqPSAxMDI0OyAgLy8gQ29udmVydCBmcm9tIGtCIHRvIGJ5dGVzLgorCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IHVua25vd24gZmxhZyAtJWNcbiIsIG9wdCk7CkBAIC04Niw2ICsxMTUsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGlmIChsZWdhY3lQYWdlQWxpZ25tZW50RmxhZyAmJiBwYWdlQWxpZ25tZW50RmxhZykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogSW52YWxpZCBvcHRpb25zOiAnLVAgPHBhZ2VzaXplX2tiPicgYW5kICctcCciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBiZSB1c2VkIGluIGNvbWJpbmF0aW9uLlxuIik7CisgICAgICAgICAgICB3YW50VXNhZ2UgPSB0cnVlOworICAgICAgICAgICAgZ290byBiYWlsOworICAgIH0KKwogICAgIGlmICghKChjaGVjayAmJiAoYXJnYyAtIG9wdGluZCkgPT0gMikgfHwgKCFjaGVjayAmJiAoYXJnYyAtIG9wdGluZCkgPT0gMykpKSB7CiAgICAgICAgIHdhbnRVc2FnZSA9IHRydWU7CiAgICAgICAgIGdvdG8gYmFpbDsKQEAgLTEwMCwxNCArMTM2LDE1IEBACiAKICAgICBpZiAoY2hlY2spIHsKICAgICAgICAgLyogY2hlY2sgZXhpc3RpbmcgYXJjaGl2ZSBmb3IgY29ycmVjdCBhbGlnbm1lbnQgKi8KLSAgICAgICAgcmVzdWx0ID0gdmVyaWZ5KGFyZ3Zbb3B0aW5kICsgMV0sIGFsaWdubWVudCwgdmVyYm9zZSwgcGFnZUFsaWduU2hhcmVkTGlicyk7CisgICAgICAgIHJlc3VsdCA9IHZlcmlmeShhcmd2W29wdGluZCArIDFdLCBhbGlnbm1lbnQsIHZlcmJvc2UsIHBhZ2VBbGlnblNoYXJlZExpYnMsIHBhZ2VTaXplKTsKICAgICB9IGVsc2UgewogICAgICAgICAvKiBjcmVhdGUgdGhlIG5ldyBhcmNoaXZlICovCi0gICAgICAgIHJlc3VsdCA9IHByb2Nlc3MoYXJndltvcHRpbmQgKyAxXSwgYXJndltvcHRpbmQgKyAyXSwgYWxpZ25tZW50LCBmb3JjZSwgem9wZmxpLCBwYWdlQWxpZ25TaGFyZWRMaWJzKTsKKyAgICAgICAgcmVzdWx0ID0gcHJvY2Vzcyhhcmd2W29wdGluZCArIDFdLCBhcmd2W29wdGluZCArIDJdLCBhbGlnbm1lbnQsIGZvcmNlLCB6b3BmbGksCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUFsaWduU2hhcmVkTGlicywgcGFnZVNpemUpOwogCiAgICAgICAgIC8qIHRydXN0LCBidXQgdmVyaWZ5ICovCiAgICAgICAgIGlmIChyZXN1bHQgPT0gMCkgewotICAgICAgICAgICAgcmVzdWx0ID0gdmVyaWZ5KGFyZ3Zbb3B0aW5kICsgMl0sIGFsaWdubWVudCwgdmVyYm9zZSwgcGFnZUFsaWduU2hhcmVkTGlicyk7CisgICAgICAgICAgICByZXN1bHQgPSB2ZXJpZnkoYXJndltvcHRpbmQgKyAyXSwgYWxpZ25tZW50LCB2ZXJib3NlLCBwYWdlQWxpZ25TaGFyZWRMaWJzLCBwYWdlU2l6ZSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3ppcGFsaWduL1ppcEVudHJ5LmNwcCBiL3Rvb2xzL3ppcGFsaWduL1ppcEVudHJ5LmNwcAppbmRleCA2ODk5OTllLi4wMzU1ZTU2IDEwMDY0NAotLS0gYS90b29scy96aXBhbGlnbi9aaXBFbnRyeS5jcHAKKysrIGIvdG9vbHMvemlwYWxpZ24vWmlwRW50cnkuY3BwCkBAIC0xOCw2ICsxOCw4IEBACiAvLyBBY2Nlc3MgdG8gZW50cmllcyBpbiBhIFppcCBhcmNoaXZlLgogLy8KIAorI2RlZmluZSBfUE9TSVhfVEhSRUFEX1NBRkVfRlVOQ1RJT05TICAvLyBGb3IgbWluZ3cgbG9jYWx0aW1lX3IoKS4KKwogI2RlZmluZSBMT0dfVEFHICJ6aXAiCiAKICNpbmNsdWRlICJaaXBFbnRyeS5oIgpAQCAtMzU0LDMxICszNTYsMjkgQEAKICAqLwogdm9pZCBaaXBFbnRyeTo6c2V0TW9kV2hlbih0aW1lX3Qgd2hlbikKIHsKLSNpZiAhZGVmaW5lZChfV0lOMzIpCi0gICAgc3RydWN0IHRtIHRtUmVzdWx0OwotI2VuZGlmCi0gICAgdGltZV90IGV2ZW47Ci0gICAgdWludDE2X3QgemRhdGUsIHp0aW1lOwotCi0gICAgc3RydWN0IHRtKiBwdG07Ci0KICAgICAvKiByb3VuZCB1cCB0byBhbiBldmVuIG51bWJlciBvZiBzZWNvbmRzICovCi0gICAgZXZlbiA9ICh3aGVuICYgMSkgPyAod2hlbiArIDEpIDogd2hlbjsKKyAgICB0aW1lX3QgZXZlbiA9ICh3aGVuICYgMSkgPyAod2hlbiArIDEpIDogd2hlbjsKIAogICAgIC8qIGV4cGFuZCAqLwotI2lmICFkZWZpbmVkKF9XSU4zMikKLSAgICBwdG0gPSBsb2NhbHRpbWVfcigmZXZlbiwgJnRtUmVzdWx0KTsKLSNlbHNlCi0gICAgcHRtID0gbG9jYWx0aW1lKCZldmVuKTsKLSNlbmRpZgorICAgIHN0cnVjdCB0bSB0bVJlc3VsdDsKKyAgICBzdHJ1Y3QgdG0qIHB0bSA9IGxvY2FsdGltZV9yKCZldmVuLCAmdG1SZXN1bHQpOwogCi0gICAgaW50IHllYXI7Ci0gICAgeWVhciA9IHB0bS0+dG1feWVhcjsKLSAgICBpZiAoeWVhciA8IDgwKQotICAgICAgICB5ZWFyID0gODA7CisgICAgLy8gVGhlIGVhcmxpZXN0IHZhbGlkIHRpbWUgZm9yIFpJUCBmaWxlIGVudHJpZXMgaXMgMTk4MC0wMS0wMS4gU2VlOgorICAgIC8vIGh0dHBzOi8vdXNlcnMuY3Muam11LmVkdS9idWNoaG9mcC9mb3JlbnNpY3MvZm9ybWF0cy9wa3ppcC5odG1sLgorICAgIC8vIFNldCBhbnkgdGltZSBiZWZvcmUgMTk4MCB0byAxOTgwLTAxLTAxLgorICAgIGlmIChwdG0tPnRtX3llYXIgPCA4MCkgeworICAgICAgICBwdG0tPnRtX3llYXIgPSA4MDsKKyAgICAgICAgcHRtLT50bV9tb24gPSAwOworICAgICAgICBwdG0tPnRtX21kYXkgPSAxOworICAgICAgICBwdG0tPnRtX2hvdXIgPSAwOworICAgICAgICBwdG0tPnRtX21pbiA9IDA7CisgICAgICAgIHB0bS0+dG1fc2VjID0gMDsKKyAgICB9CiAKLSAgICB6ZGF0ZSA9ICh5ZWFyIC0gODApIDw8IDkgfCAocHRtLT50bV9tb24rMSkgPDwgNSB8IHB0bS0+dG1fbWRheTsKLSAgICB6dGltZSA9IHB0bS0+dG1faG91ciA8PCAxMSB8IHB0bS0+dG1fbWluIDw8IDUgfCBwdG0tPnRtX3NlYyA+PiAxOworICAgIHVpbnQxNl90IHpkYXRlID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KAorICAgICAgICAocHRtLT50bV95ZWFyIC0gODApIDw8IDkgfCAocHRtLT50bV9tb24gKyAxKSA8PCA1IHwgcHRtLT50bV9tZGF5KTsKKyAgICB1aW50MTZfdCB6dGltZSA9IHN0YXRpY19jYXN0PHVpbnQxNl90PigKKyAgICAgICAgcHRtLT50bV9ob3VyIDw8IDExIHwgcHRtLT50bV9taW4gPDwgNSB8IHB0bS0+dG1fc2VjID4+IDEpOwogCiAgICAgbUNERS5tTGFzdE1vZEZpbGVUaW1lID0gbUxGSC5tTGFzdE1vZEZpbGVUaW1lID0genRpbWU7CiAgICAgbUNERS5tTGFzdE1vZEZpbGVEYXRlID0gbUxGSC5tTGFzdE1vZEZpbGVEYXRlID0gemRhdGU7CmRpZmYgLS1naXQgYS90b29scy96aXBhbGlnbi9pbmNsdWRlL1ppcEFsaWduLmggYi90b29scy96aXBhbGlnbi9pbmNsdWRlL1ppcEFsaWduLmgKaW5kZXggYWIzNjA4Ni4uODVkZGExNCAxMDA2NDQKLS0tIGEvdG9vbHMvemlwYWxpZ24vaW5jbHVkZS9aaXBBbGlnbi5oCisrKyBiL3Rvb2xzL3ppcGFsaWduL2luY2x1ZGUvWmlwQWxpZ24uaApAQCAtMjUsMjQgKzI1LDI4IEBACiAgKiAtIGZvcmNlICA6IE92ZXJ3cml0ZSBvdXRwdXQgaWYgaXQgZXhpc3RzLCBmYWlsIG90aGVyd2lzZS4KICAqIC0gem9wZmxpIDogUmVjb21wcmVzcyBjb21wcmVzc2VkIGVudHJpZXMgd2l0aCBtb3JlIGVmZmljaWVudCBhbGdvcml0aG0uCiAgKiAgICAgICAgICAgIENvcHkgY29tcHJlc3NlZCBlbnRyaWVzIGFzLWlzLCBhbmQgdW5hbGlnbmVkLCBvdGhlcndpc2UuCi0gKiAtIHBhZ2VBbGlnblNoYXJlZExpYnM6IEFsaWduIC5zbyBmaWxlcyB0byA0MDk2IGFuZCBvdGhlciBmaWxlcyB0bworICogLSBwYWdlQWxpZ25TaGFyZWRMaWJzOiBBbGlnbiAuc28gZmlsZXMgdG8gQHBhZ2VTaXplIGFuZCBvdGhlciBmaWxlcyB0bwogICogICBhbGlnblRvLCBvciBhbGwgZmlsZXMgdG8gYWxpZ25UbyBpZiBmYWxzZS4uCisgKiAtIHBhZ2VTaXplOiBTcGVjaWZpZXMgdGhlIHBhZ2Ugc2l6ZSBvZiB0aGUgdGFyZ2V0IGRldmljZS4gVGhpcyBpcyB1c2VkCisgKiAgICAgICAgICAgICB0byBjb3JyZWN0bHkgcGFnZS1hbGlnbiBzaGFyZWQgbGlicmFyaWVzLgogICoKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgogICovCiBpbnQgcHJvY2Vzcyhjb25zdCBjaGFyKiBpbnB1dCwgY29uc3QgY2hhciogb3V0cHV0LCBpbnQgYWxpZ25UbywgYm9vbCBmb3JjZSwKLSAgICBib29sIHpvcGZsaSwgYm9vbCBwYWdlQWxpZ25TaGFyZWRMaWJzKTsKKyAgICBib29sIHpvcGZsaSwgYm9vbCBwYWdlQWxpZ25TaGFyZWRMaWJzLCBpbnQgcGFnZVNpemUpOwogCiAvKgogICogVmVyaWZ5IHRoZSBhbGlnbm1lbnQgb2YgYSB6aXAgYXJjaGl2ZS4KICAqIC0gYWxpZ25UbzogQWxpZ25tZW50IChpbiBieXRlcykgZm9yIHVuY29tcHJlc3NlZCBlbnRyaWVzLgotICogLSBwYWdlQWxpZ25TaGFyZWRMaWJzOiBBbGlnbiAuc28gZmlsZXMgdG8gNDA5NiBhbmQgb3RoZXIgZmlsZXMgdG8KKyAqIC0gcGFnZUFsaWduU2hhcmVkTGliczogQWxpZ24gLnNvIGZpbGVzIHRvIEBwYWdlU2l6ZSBhbmQgb3RoZXIgZmlsZXMgdG8KICAqICAgYWxpZ25Ubywgb3IgYWxsIGZpbGVzIHRvIGFsaWduVG8gaWYgZmFsc2UuLgorICogLSBwYWdlU2l6ZTogU3BlY2lmaWVzIHRoZSBwYWdlIHNpemUgb2YgdGhlIHRhcmdldCBkZXZpY2UuIFRoaXMgaXMgdXNlZAorICogICAgICAgICAgICAgdG8gY29ycmVjdGx5IHBhZ2UtYWxpZ24gc2hhcmVkIGxpYnJhcmllcy4KICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KICAqLwogaW50IHZlcmlmeShjb25zdCBjaGFyKiBmaWxlTmFtZSwgaW50IGFsaWduVG8sIGJvb2wgdmVyYm9zZSwKLSAgICBib29sIHBhZ2VBbGlnblNoYXJlZExpYnMpOworICAgIGJvb2wgcGFnZUFsaWduU2hhcmVkTGlicywgaW50IHBhZ2VTaXplKTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS90b29scy96aXBhbGlnbi90ZXN0cy9kYXRhL2Fwa1dpdGhVbmNvbXByZXNzZWRTaGFyZWRMaWJzLnppcCBiL3Rvb2xzL3ppcGFsaWduL3Rlc3RzL2RhdGEvYXBrV2l0aFVuY29tcHJlc3NlZFNoYXJlZExpYnMuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMGUzYjUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy96aXBhbGlnbi90ZXN0cy9kYXRhL2Fwa1dpdGhVbmNvbXByZXNzZWRTaGFyZWRMaWJzLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy96aXBhbGlnbi90ZXN0cy9zcmMvYWxpZ25fdGVzdC5jcHAgYi90b29scy96aXBhbGlnbi90ZXN0cy9zcmMvYWxpZ25fdGVzdC5jcHAKaW5kZXggYTg0MzNmYS4uMDdhZDdjYyAxMDA2NDQKLS0tIGEvdG9vbHMvemlwYWxpZ24vdGVzdHMvc3JjL2FsaWduX3Rlc3QuY3BwCisrKyBiL3Rvb2xzL3ppcGFsaWduL3Rlc3RzL3NyYy9hbGlnbl90ZXN0LmNwcApAQCAtNDgsMTEgKzQ4LDEyIEBACiBURVNUKEFsaWduLCBVbmFsaWduZWQpIHsKICAgY29uc3Qgc3RkOjpzdHJpbmcgc3JjID0gR2V0VGVzdFBhdGgoInVuYWxpZ25lZC56aXAiKTsKICAgY29uc3Qgc3RkOjpzdHJpbmcgZHN0ID0gR2V0VGVtcFBhdGgoInVuYWxpZ25lZF9vdXQuemlwIik7CisgIGludCBwYWdlU2l6ZSA9IDQwOTY7CiAKLSAgaW50IHByb2Nlc3NlZCA9IHByb2Nlc3Moc3JjLmNfc3RyKCksIGRzdC5jX3N0cigpLCA0LCB0cnVlLCBmYWxzZSwgNDA5Nik7CisgIGludCBwcm9jZXNzZWQgPSBwcm9jZXNzKHNyYy5jX3N0cigpLCBkc3QuY19zdHIoKSwgNCwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBwYWdlU2l6ZSk7CiAgIEFTU0VSVF9FUSgwLCBwcm9jZXNzZWQpOwogCi0gIGludCB2ZXJpZmllZCA9IHZlcmlmeShkc3QuY19zdHIoKSwgNCwgdHJ1ZSwgZmFsc2UpOworICBpbnQgdmVyaWZpZWQgPSB2ZXJpZnkoZHN0LmNfc3RyKCksIDQsIHRydWUsIGZhbHNlLCBwYWdlU2l6ZSk7CiAgIEFTU0VSVF9FUSgwLCB2ZXJpZmllZCk7CiB9CiAKQEAgLTYwLDE4ICs2MSwxOSBAQAogICBjb25zdCBzdGQ6OnN0cmluZyBzcmMgPSBHZXRUZXN0UGF0aCgidW5hbGlnbmVkLnppcCIpOwogICBjb25zdCBzdGQ6OnN0cmluZyB0bXAgPSBHZXRUZW1wUGF0aCgiZGFfYWxpZ25lZC56aXAiKTsKICAgY29uc3Qgc3RkOjpzdHJpbmcgZHN0ID0gR2V0VGVtcFBhdGgoImRhX2RfYWxpZ25lci56aXAiKTsKKyAgaW50IHBhZ2VTaXplID0gNDA5NjsKIAotICBpbnQgcHJvY2Vzc2VkID0gcHJvY2VzcyhzcmMuY19zdHIoKSwgdG1wLmNfc3RyKCksIDQsIHRydWUsIGZhbHNlLCA0MDk2KTsKKyAgaW50IHByb2Nlc3NlZCA9IHByb2Nlc3Moc3JjLmNfc3RyKCksIHRtcC5jX3N0cigpLCA0LCB0cnVlLCBmYWxzZSwgZmFsc2UsIHBhZ2VTaXplKTsKICAgQVNTRVJUX0VRKDAsIHByb2Nlc3NlZCk7CiAKLSAgaW50IHZlcmlmaWVkID0gdmVyaWZ5KHRtcC5jX3N0cigpLCA0LCB0cnVlLCBmYWxzZSk7CisgIGludCB2ZXJpZmllZCA9IHZlcmlmeSh0bXAuY19zdHIoKSwgNCwgdHJ1ZSwgZmFsc2UsIHBhZ2VTaXplKTsKICAgQVNTRVJUX0VRKDAsIHZlcmlmaWVkKTsKIAogICAvLyBBbGlnbiB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBydW4uIEVzc2VudGlhbGx5IGRvdWJsZSBhbGlnbmluZy4KLSAgcHJvY2Vzc2VkID0gcHJvY2Vzcyh0bXAuY19zdHIoKSwgZHN0LmNfc3RyKCksIDQsIHRydWUsIGZhbHNlLCA0MDk2KTsKKyAgcHJvY2Vzc2VkID0gcHJvY2Vzcyh0bXAuY19zdHIoKSwgZHN0LmNfc3RyKCksIDQsIHRydWUsIGZhbHNlLCBmYWxzZSwgcGFnZVNpemUpOwogICBBU1NFUlRfRVEoMCwgcHJvY2Vzc2VkKTsKIAotICB2ZXJpZmllZCA9IHZlcmlmeShkc3QuY19zdHIoKSwgNCwgdHJ1ZSwgZmFsc2UpOworICB2ZXJpZmllZCA9IHZlcmlmeShkc3QuY19zdHIoKSwgNCwgdHJ1ZSwgZmFsc2UsIHBhZ2VTaXplKTsKICAgQVNTRVJUX0VRKDAsIHZlcmlmaWVkKTsKIAogICAvLyBOb3RoaW5nIHNob3VsZCBoYXZlIGNoYW5nZWQgYmV0d2VlbiB0bXAgYW5kIGRzdC4KQEAgLTkwLDExICs5MiwxMiBAQAogVEVTVChBbGlnbiwgSG9sZXMpIHsKICAgY29uc3Qgc3RkOjpzdHJpbmcgc3JjID0gR2V0VGVzdFBhdGgoImhvbGVzLnppcCIpOwogICBjb25zdCBzdGQ6OnN0cmluZyBkc3QgPSBHZXRUZW1wUGF0aCgiaG9sZXNfb3V0LnppcCIpOworICBpbnQgcGFnZVNpemUgPSA0MDk2OwogCi0gIGludCBwcm9jZXNzZWQgPSBwcm9jZXNzKHNyYy5jX3N0cigpLCBkc3QuY19zdHIoKSwgNCwgdHJ1ZSwgZmFsc2UsIDQwOTYpOworICBpbnQgcHJvY2Vzc2VkID0gcHJvY2VzcyhzcmMuY19zdHIoKSwgZHN0LmNfc3RyKCksIDQsIHRydWUsIGZhbHNlLCB0cnVlLCBwYWdlU2l6ZSk7CiAgIEFTU0VSVF9FUSgwLCBwcm9jZXNzZWQpOwogCi0gIGludCB2ZXJpZmllZCA9IHZlcmlmeShkc3QuY19zdHIoKSwgNCwgZmFsc2UsIHRydWUpOworICBpbnQgdmVyaWZpZWQgPSB2ZXJpZnkoZHN0LmNfc3RyKCksIDQsIGZhbHNlLCB0cnVlLCBwYWdlU2l6ZSk7CiAgIEFTU0VSVF9FUSgwLCB2ZXJpZmllZCk7CiB9CiAKQEAgLTEwMiwyOCArMTA1LDg1IEBACiBURVNUKEFsaWduLCBEaWZmZXJlbnRlT3JkZXJzKSB7CiAgIGNvbnN0IHN0ZDo6c3RyaW5nIHNyYyA9IEdldFRlc3RQYXRoKCJkaWZmT3JkZXJzLnppcCIpOwogICBjb25zdCBzdGQ6OnN0cmluZyBkc3QgPSBHZXRUZW1wUGF0aCgiZGlmZk9yZGVyc19vdXQuemlwIik7CisgIGludCBwYWdlU2l6ZSA9IDQwOTY7CiAKLSAgaW50IHByb2Nlc3NlZCA9IHByb2Nlc3Moc3JjLmNfc3RyKCksIGRzdC5jX3N0cigpLCA0LCB0cnVlLCBmYWxzZSwgNDA5Nik7CisgIGludCBwcm9jZXNzZWQgPSBwcm9jZXNzKHNyYy5jX3N0cigpLCBkc3QuY19zdHIoKSwgNCwgdHJ1ZSwgZmFsc2UsIHRydWUsIHBhZ2VTaXplKTsKICAgQVNTRVJUX0VRKDAsIHByb2Nlc3NlZCk7CiAKLSAgaW50IHZlcmlmaWVkID0gdmVyaWZ5KGRzdC5jX3N0cigpLCA0LCBmYWxzZSwgdHJ1ZSk7CisgIGludCB2ZXJpZmllZCA9IHZlcmlmeShkc3QuY19zdHIoKSwgNCwgZmFsc2UsIHRydWUsIHBhZ2VTaXplKTsKICAgQVNTRVJUX0VRKDAsIHZlcmlmaWVkKTsKIH0KIAogVEVTVChBbGlnbiwgRGlyZWN0b3J5RW50cnlEb05vdFJlcXVpcmVBbGlnbm1lbnQpIHsKICAgY29uc3Qgc3RkOjpzdHJpbmcgc3JjID0gR2V0VGVzdFBhdGgoImFyY2hpdmVXaXRoT25lRGlyZWN0b3J5RW50cnkuemlwIik7Ci0gIGludCB2ZXJpZmllZCA9IHZlcmlmeShzcmMuY19zdHIoKSwgNCwgZmFsc2UsIHRydWUpOworICBpbnQgcGFnZVNpemUgPSA0MDk2OworICBpbnQgdmVyaWZpZWQgPSB2ZXJpZnkoc3JjLmNfc3RyKCksIDQsIGZhbHNlLCB0cnVlLCBwYWdlU2l6ZSk7CiAgIEFTU0VSVF9FUSgwLCB2ZXJpZmllZCk7CiB9CiAKIFRFU1QoQWxpZ24sIERpcmVjdG9yeUVudHJ5KSB7CiAgIGNvbnN0IHN0ZDo6c3RyaW5nIHNyYyA9IEdldFRlc3RQYXRoKCJhcmNoaXZlV2l0aE9uZURpcmVjdG9yeUVudHJ5LnppcCIpOwogICBjb25zdCBzdGQ6OnN0cmluZyBkc3QgPSBHZXRUZW1wUGF0aCgiYXJjaGl2ZVdpdGhPbmVEaXJlY3RvcnlFbnRyeV9vdXQuemlwIik7CisgIGludCBwYWdlU2l6ZSA9IDQwOTY7CiAKLSAgaW50IHByb2Nlc3NlZCA9IHByb2Nlc3Moc3JjLmNfc3RyKCksIGRzdC5jX3N0cigpLCA0LCB0cnVlLCBmYWxzZSwgNDA5Nik7CisgIGludCBwcm9jZXNzZWQgPSBwcm9jZXNzKHNyYy5jX3N0cigpLCBkc3QuY19zdHIoKSwgNCwgdHJ1ZSwgZmFsc2UsIHRydWUsIHBhZ2VTaXplKTsKICAgQVNTRVJUX0VRKDAsIHByb2Nlc3NlZCk7CiAgIEFTU0VSVF9FUSh0cnVlLCBzYW1lQ29udGVudChzcmMsIGRzdCkpOwogCi0gIGludCB2ZXJpZmllZCA9IHZlcmlmeShkc3QuY19zdHIoKSwgNCwgZmFsc2UsIHRydWUpOworICBpbnQgdmVyaWZpZWQgPSB2ZXJpZnkoZHN0LmNfc3RyKCksIDQsIGZhbHNlLCB0cnVlLCBwYWdlU2l6ZSk7CisgIEFTU0VSVF9FUSgwLCB2ZXJpZmllZCk7Cit9CisKK2NsYXNzIFVuY29tcHJlc3NlZFNoYXJlZExpYnNUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgIHByb3RlY3RlZDoKKyAgICBzdGF0aWMgdm9pZCBTZXRVcFRlc3RTdWl0ZSgpIHsKKyAgICAgIHNyYyA9IEdldFRlc3RQYXRoKCJhcGtXaXRoVW5jb21wcmVzc2VkU2hhcmVkTGlicy56aXAiKTsKKyAgICAgIGRzdCA9IEdldFRlbXBQYXRoKCJhcGtXaXRoVW5jb21wcmVzc2VkU2hhcmVkTGlic19vdXQuemlwIik7CisgICAgfQorCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIHNyYzsKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZHN0OworfTsKKworc3RkOjpzdHJpbmcgVW5jb21wcmVzc2VkU2hhcmVkTGlic1Rlc3Q6OnNyYzsKK3N0ZDo6c3RyaW5nIFVuY29tcHJlc3NlZFNoYXJlZExpYnNUZXN0Ojpkc3Q7CisKK1RFU1RfRihVbmNvbXByZXNzZWRTaGFyZWRMaWJzVGVzdCwgVW5hbGlnbmVkKSB7CisgIGludCBwYWdlU2l6ZSA9IDQwOTY7CisKKyAgaW50IHByb2Nlc3NlZCA9IHByb2Nlc3Moc3JjLmNfc3RyKCksIGRzdC5jX3N0cigpLCA0LCB0cnVlLCBmYWxzZSwgZmFsc2UsIHBhZ2VTaXplKTsKKyAgQVNTRVJUX0VRKDAsIHByb2Nlc3NlZCk7CisKKyAgaW50IHZlcmlmaWVkID0gdmVyaWZ5KGRzdC5jX3N0cigpLCA0LCB0cnVlLCB0cnVlLCBwYWdlU2l6ZSk7CisgIEFTU0VSVF9ORSgwLCB2ZXJpZmllZCk7IC8vIC5zbydzIG5vdCBwYWdlLWFsaWduZWQKK30KKworVEVTVF9GKFVuY29tcHJlc3NlZFNoYXJlZExpYnNUZXN0LCBBbGlnbmVkUGFnZVNpemU0a0IpIHsKKyAgaW50IHBhZ2VTaXplID0gNDA5NjsKKworICBpbnQgcHJvY2Vzc2VkID0gcHJvY2VzcyhzcmMuY19zdHIoKSwgZHN0LmNfc3RyKCksIDQsIHRydWUsIGZhbHNlLCB0cnVlLCBwYWdlU2l6ZSk7CisgIEFTU0VSVF9FUSgwLCBwcm9jZXNzZWQpOworCisgIGludCB2ZXJpZmllZCA9IHZlcmlmeShkc3QuY19zdHIoKSwgNCwgdHJ1ZSwgdHJ1ZSwgcGFnZVNpemUpOworICBBU1NFUlRfRVEoMCwgdmVyaWZpZWQpOworfQorCitURVNUX0YoVW5jb21wcmVzc2VkU2hhcmVkTGlic1Rlc3QsIEFsaWduZWRQYWdlU2l6ZTE2a0IpIHsKKyAgaW50IHBhZ2VTaXplID0gMTYzODQ7CisKKyAgaW50IHByb2Nlc3NlZCA9IHByb2Nlc3Moc3JjLmNfc3RyKCksIGRzdC5jX3N0cigpLCA0LCB0cnVlLCBmYWxzZSwgdHJ1ZSwgcGFnZVNpemUpOworICBBU1NFUlRfRVEoMCwgcHJvY2Vzc2VkKTsKKworICBpbnQgdmVyaWZpZWQgPSB2ZXJpZnkoZHN0LmNfc3RyKCksIDQsIHRydWUsIHRydWUsIHBhZ2VTaXplKTsKKyAgQVNTRVJUX0VRKDAsIHZlcmlmaWVkKTsKK30KKworVEVTVF9GKFVuY29tcHJlc3NlZFNoYXJlZExpYnNUZXN0LCBBbGlnbmVkUGFnZVNpemU2NGtCKSB7CisgIGludCBwYWdlU2l6ZSA9IDY1NTM2OworCisgIGludCBwcm9jZXNzZWQgPSBwcm9jZXNzKHNyYy5jX3N0cigpLCBkc3QuY19zdHIoKSwgNCwgdHJ1ZSwgZmFsc2UsIHRydWUsIHBhZ2VTaXplKTsKKyAgQVNTRVJUX0VRKDAsIHByb2Nlc3NlZCk7CisKKyAgaW50IHZlcmlmaWVkID0gdmVyaWZ5KGRzdC5jX3N0cigpLCA0LCB0cnVlLCB0cnVlLCBwYWdlU2l6ZSk7CiAgIEFTU0VSVF9FUSgwLCB2ZXJpZmllZCk7CiB9Cg==