ZGlmZiAtLWdpdCBhL01pc2MvQUNLUyBiL01pc2MvQUNLUwppbmRleCBhNjBlM2E0Li42ZWM1OThjIDEwMDY0NAotLS0gYS9NaXNjL0FDS1MKKysrIGIvTWlzYy9BQ0tTCkBAIC0yMjAsNiArMjIwLDcgQEAKIEphbWVzIEhlbnN0cmlkZ2UKIENocmlzIEhlcmJvcnRoCiBJdmFuIEhlcm1hbgorSvxyZ2VuIEhlcm1hbm4KIEdhcnkgSGVycm9uCiBCZXJuaGFyZCBIZXJ6b2cKIE1hZ251cyBMLiBIZXRsYW5kCmRpZmYgLS1naXQgYS9NaXNjL05FV1MgYi9NaXNjL05FV1MKaW5kZXggZDI5Y2NjYi4uNWVlNGE5MiAxMDA2NDQKLS0tIGEvTWlzYy9ORVdTCisrKyBiL01pc2MvTkVXUwpAQCAtNjIxLDYgKzYyMSw5IEBACiBUb29scy9EZW1vcwogLS0tLS0tLS0tLS0KIAorLSBweWdldHRleHQucHkgbm93IHN1cHBvcnRzIGdsb2JiaW5nIG9uIFdpbmRvd3MsIGFuZCBhY2NlcHRzIG1vZHVsZQorICBuYW1lcyBpbiBhZGRpdGlvbiB0byBhY2NlcHRpbmcgZmlsZSBuYW1lcy4KKwogLSBUaGUgU0dJIGRlbW9zIChEZW1vL3NnaSkgaGF2ZSBiZWVuIHJlbW92ZWQuICBOb2JvZHkgdGhvdWdodCB0aGV5CiAgIHdlcmUgaW50ZXJlc3RpbmcgYW55IG1vcmUuICAoVGhlIFNHSSBsaWJyYXJ5IG1vZHVsZXMgYW5kIGV4dGVuc2lvbnMKICAgYXJlIHN0aWxsIHRoZXJlOyBpdCBpcyBiZWxpZXZlZCB0aGF0IGF0IGxlYXN0IHNvbWUgb2YgdGhlc2UgYXJlCmRpZmYgLS1naXQgYS9Ub29scy9pMThuL3B5Z2V0dGV4dC5weSBiL1Rvb2xzL2kxOG4vcHlnZXR0ZXh0LnB5CmluZGV4IGI0MGJkYTEuLmQwMzIwY2YgMTAwNzU1Ci0tLSBhL1Rvb2xzL2kxOG4vcHlnZXR0ZXh0LnB5CisrKyBiL1Rvb2xzL2kxOG4vcHlnZXR0ZXh0LnB5CkBAIC0xLDMxICsxLDQ5IEBACiAjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIC0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCiAjIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBCYXJyeSBXYXJzYXcgPGJhcnJ5QHpvcGUuY29tPgogIwogIyBNaW5pbWFsbHkgcGF0Y2hlZCB0byBtYWtlIGl0IGV2ZW4gbW9yZSB4Z2V0dGV4dCBjb21wYXRpYmxlIAogIyBieSBQZXRlciBGdW5rIDxwZkBhcnRjb20tZ21iaC5kZT4KKyMKKyMgMjAwMi0xMS0yMiBK/HJnZW4gSGVybWFubiA8amhAd2ViLmRlPgorIyBBZGRlZCBjaGVja3MgdGhhdCBfKCkgb25seSBjb250YWlucyBzdHJpbmcgbGl0ZXJhbHMsIGFuZAorIyBjb21tYW5kIGxpbmUgYXJncyBhcmUgcmVzb2x2ZWQgdG8gbW9kdWxlIGxpc3RzLCBpLmUuIHlvdQorIyBjYW4gbm93IHBhc3MgYSBmaWxlbmFtZSwgYSBtb2R1bGUgb3IgcGFja2FnZSBuYW1lLCBvciBhCisjIGRpcmVjdG9yeSAoaW5jbHVkaW5nIGdsb2JiaW5nIGNoYXJzLCBpbXBvcnRhbnQgZm9yIFdpbjMyKS4KKyMgTWFkZSBkb2NzdHJpbmcgZml0IGluIDgwIGNoYXJzIHdpZGUgZGlzcGxheXMgdXNpbmcgcHlkb2MuCisjCiAKLSIiInB5Z2V0dGV4dCAtLSBQeXRob24gZXF1aXZhbGVudCBvZiB4Z2V0dGV4dCgxKQorIyBmb3Igc2VsZnRlc3RpbmcKK3RyeToKKyAgICBpbXBvcnQgZmludGwKKyAgICBfID0gZmludGwuZ2V0dGV4dAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIF8gPSBsYW1iZGEgczogcworCitfX2RvY19fID0gXygiIiJweWdldHRleHQgLS0gUHl0aG9uIGVxdWl2YWxlbnQgb2YgeGdldHRleHQoMSkKIAogTWFueSBzeXN0ZW1zIChTb2xhcmlzLCBMaW51eCwgR251KSBwcm92aWRlIGV4dGVuc2l2ZSB0b29scyB0aGF0IGVhc2UgdGhlCi1pbnRlcm5hdGlvbmFsaXphdGlvbiBvZiBDIHByb2dyYW1zLiAgTW9zdCBvZiB0aGVzZSB0b29scyBhcmUgaW5kZXBlbmRlbnQgb2YKLXRoZSBwcm9ncmFtbWluZyBsYW5ndWFnZSBhbmQgY2FuIGJlIHVzZWQgZnJvbSB3aXRoaW4gUHl0aG9uIHByb2dyYW1zLiAgTWFydGluCi12b24gTG9ld2lzJyB3b3JrWzFdIGhlbHBzIGNvbnNpZGVyYWJseSBpbiB0aGlzIHJlZ2FyZC4KK2ludGVybmF0aW9uYWxpemF0aW9uIG9mIEMgcHJvZ3JhbXMuIE1vc3Qgb2YgdGhlc2UgdG9vbHMgYXJlIGluZGVwZW5kZW50IG9mCit0aGUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgYW5kIGNhbiBiZSB1c2VkIGZyb20gd2l0aGluIFB5dGhvbiBwcm9ncmFtcy4KK01hcnRpbiB2b24gTG9ld2lzJyB3b3JrWzFdIGhlbHBzIGNvbnNpZGVyYWJseSBpbiB0aGlzIHJlZ2FyZC4gCiAKIFRoZXJlJ3Mgb25lIHByb2JsZW0gdGhvdWdoOyB4Z2V0dGV4dCBpcyB0aGUgcHJvZ3JhbSB0aGF0IHNjYW5zIHNvdXJjZSBjb2RlCi1sb29raW5nIGZvciBtZXNzYWdlIHN0cmluZ3MsIGJ1dCBpdCBncm9rcyBvbmx5IEMgKG9yIEMrKykuICBQeXRob24gaW50cm9kdWNlcwotYSBmZXcgd3JpbmtsZXMsIHN1Y2ggYXMgZHVhbCBxdW90aW5nIGNoYXJhY3RlcnMsIHRyaXBsZSBxdW90ZWQgc3RyaW5ncywgYW5kCi1yYXcgc3RyaW5ncy4gIHhnZXR0ZXh0IHVuZGVyc3RhbmRzIG5vbmUgb2YgdGhpcy4KK2xvb2tpbmcgZm9yIG1lc3NhZ2Ugc3RyaW5ncywgYnV0IGl0IGdyb2tzIG9ubHkgQyAob3IgQysrKS4gUHl0aG9uCitpbnRyb2R1Y2VzIGEgZmV3IHdyaW5rbGVzLCBzdWNoIGFzIGR1YWwgcXVvdGluZyBjaGFyYWN0ZXJzLCB0cmlwbGUgcXVvdGVkCitzdHJpbmdzLCBhbmQgcmF3IHN0cmluZ3MuIHhnZXR0ZXh0IHVuZGVyc3RhbmRzIG5vbmUgb2YgdGhpcy4gCiAKLUVudGVyIHB5Z2V0dGV4dCwgd2hpY2ggdXNlcyBQeXRob24ncyBzdGFuZGFyZCB0b2tlbml6ZSBtb2R1bGUgdG8gc2NhbiBQeXRob24KLXNvdXJjZSBjb2RlLCBnZW5lcmF0aW5nIC5wb3QgZmlsZXMgaWRlbnRpY2FsIHRvIHdoYXQgR05VIHhnZXR0ZXh0WzJdIGdlbmVyYXRlcwotZm9yIEMgYW5kIEMrKyBjb2RlLiAgRnJvbSB0aGVyZSwgdGhlIHN0YW5kYXJkIEdOVSB0b29scyBjYW4gYmUgdXNlZC4KK0VudGVyIHB5Z2V0dGV4dCwgd2hpY2ggdXNlcyBQeXRob24ncyBzdGFuZGFyZCB0b2tlbml6ZSBtb2R1bGUgdG8gc2NhbgorUHl0aG9uIHNvdXJjZSBjb2RlLCBnZW5lcmF0aW5nIC5wb3QgZmlsZXMgaWRlbnRpY2FsIHRvIHdoYXQgR05VIHhnZXR0ZXh0WzJdCitnZW5lcmF0ZXMgZm9yIEMgYW5kIEMrKyBjb2RlLiBGcm9tIHRoZXJlLCB0aGUgc3RhbmRhcmQgR05VIHRvb2xzIGNhbiBiZQordXNlZC4gCiAKLUEgd29yZCBhYm91dCBtYXJraW5nIFB5dGhvbiBzdHJpbmdzIGFzIGNhbmRpZGF0ZXMgZm9yIHRyYW5zbGF0aW9uLiAgR05VCi14Z2V0dGV4dCByZWNvZ25pemVzIHRoZSBmb2xsb3dpbmcga2V5d29yZHM6IGdldHRleHQsIGRnZXR0ZXh0LCBkY2dldHRleHQsIGFuZAotZ2V0dGV4dF9ub29wLiAgQnV0IHRob3NlIGNhbiBiZSBhIGxvdCBvZiB0ZXh0IHRvIGluY2x1ZGUgYWxsIG92ZXIgeW91ciBjb2RlLgotQyBhbmQgQysrIGhhdmUgYSB0cmljazogdGhleSB1c2UgdGhlIEMgcHJlcHJvY2Vzc29yLiAgTW9zdCBpbnRlcm5hdGlvbmFsaXplZCBDCi1zb3VyY2UgaW5jbHVkZXMgYSAjZGVmaW5lIGZvciBnZXR0ZXh0KCkgdG8gXygpIHNvIHRoYXQgd2hhdCBoYXMgdG8gYmUgd3JpdHRlbgotaW4gdGhlIHNvdXJjZSBpcyBtdWNoIGxlc3MuICBUaHVzIHRoZXNlIGFyZSBib3RoIHRyYW5zbGF0YWJsZSBzdHJpbmdzOgorQSB3b3JkIGFib3V0IG1hcmtpbmcgUHl0aG9uIHN0cmluZ3MgYXMgY2FuZGlkYXRlcyBmb3IgdHJhbnNsYXRpb24uIEdOVQoreGdldHRleHQgcmVjb2duaXplcyB0aGUgZm9sbG93aW5nIGtleXdvcmRzOiBnZXR0ZXh0LCBkZ2V0dGV4dCwgZGNnZXR0ZXh0LAorYW5kIGdldHRleHRfbm9vcC4gQnV0IHRob3NlIGNhbiBiZSBhIGxvdCBvZiB0ZXh0IHRvIGluY2x1ZGUgYWxsIG92ZXIgeW91cgorY29kZS4gQyBhbmQgQysrIGhhdmUgYSB0cmljazogdGhleSB1c2UgdGhlIEMgcHJlcHJvY2Vzc29yLiBNb3N0CitpbnRlcm5hdGlvbmFsaXplZCBDIHNvdXJjZSBpbmNsdWRlcyBhICNkZWZpbmUgZm9yIGdldHRleHQoKSB0byBfKCkgc28gdGhhdAord2hhdCBoYXMgdG8gYmUgd3JpdHRlbiBpbiB0aGUgc291cmNlIGlzIG11Y2ggbGVzcy4gVGh1cyB0aGVzZSBhcmUgYm90aAordHJhbnNsYXRhYmxlIHN0cmluZ3M6IAogCiAgICAgZ2V0dGV4dCgiVHJhbnNsYXRhYmxlIFN0cmluZyIpCiAgICAgXygiVHJhbnNsYXRhYmxlIFN0cmluZyIpCkBAIC0zNywxMSArNTUsMTEgQEAKICBbMV0gaHR0cDovL3d3dy5weXRob24ub3JnL3dvcmtzaG9wcy8xOTk3LTEwL3Byb2NlZWRpbmdzL2xvZXdpcy5odG1sCiAgWzJdIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nZXR0ZXh0L2dldHRleHQuaHRtbAogCi1OT1RFOiBweWdldHRleHQgYXR0ZW1wdHMgdG8gYmUgb3B0aW9uIGFuZCBmZWF0dXJlIGNvbXBhdGlibGUgd2l0aCBHTlUgeGdldHRleHQKLXdoZXJlIGV2ZXIgcG9zc2libGUuICBIb3dldmVyIHNvbWUgb3B0aW9ucyBhcmUgc3RpbGwgbWlzc2luZyBvciBhcmUgbm90IGZ1bGx5Ci1pbXBsZW1lbnRlZC4gIEFsc28sIHhnZXR0ZXh0J3MgdXNlIG9mIGNvbW1hbmQgbGluZSBzd2l0Y2hlcyB3aXRoIG9wdGlvbgotYXJndW1lbnRzIGlzIGJyb2tlbiwgYW5kIGluIHRoZXNlIGNhc2VzLCBweWdldHRleHQganVzdCBkZWZpbmVzIGFkZGl0aW9uYWwKLXN3aXRjaGVzLgorTk9URTogcHlnZXR0ZXh0IGF0dGVtcHRzIHRvIGJlIG9wdGlvbiBhbmQgZmVhdHVyZSBjb21wYXRpYmxlIHdpdGggR05VCit4Z2V0dGV4dCB3aGVyZSBldmVyIHBvc3NpYmxlLiBIb3dldmVyIHNvbWUgb3B0aW9ucyBhcmUgc3RpbGwgbWlzc2luZyBvciBhcmUKK25vdCBmdWxseSBpbXBsZW1lbnRlZC4gQWxzbywgeGdldHRleHQncyB1c2Ugb2YgY29tbWFuZCBsaW5lIHN3aXRjaGVzIHdpdGgKK29wdGlvbiBhcmd1bWVudHMgaXMgYnJva2VuLCBhbmQgaW4gdGhlc2UgY2FzZXMsIHB5Z2V0dGV4dCBqdXN0IGRlZmluZXMKK2FkZGl0aW9uYWwgc3dpdGNoZXMuIAogCiBVc2FnZTogcHlnZXR0ZXh0IFtvcHRpb25zXSBpbnB1dGZpbGUgLi4uCiAKQEAgLTYxLDkgKzc5LDkgQEAKIAogICAgIC1ECiAgICAgLS1kb2NzdHJpbmdzCi0gICAgICAgIEV4dHJhY3QgbW9kdWxlLCBjbGFzcywgbWV0aG9kLCBhbmQgZnVuY3Rpb24gZG9jc3RyaW5ncy4gIFRoZXNlIGRvIG5vdAotICAgICAgICBuZWVkIHRvIGJlIHdyYXBwZWQgaW4gXygpIG1hcmtlcnMsIGFuZCBpbiBmYWN0IGNhbm5vdCBiZSBmb3IgUHl0aG9uIHRvCi0gICAgICAgIGNvbnNpZGVyIHRoZW0gZG9jc3RyaW5ncy4gKFNlZSBhbHNvIHRoZSAtWCBvcHRpb24pLgorICAgICAgICBFeHRyYWN0IG1vZHVsZSwgY2xhc3MsIG1ldGhvZCwgYW5kIGZ1bmN0aW9uIGRvY3N0cmluZ3MuICBUaGVzZSBkbworICAgICAgICBub3QgbmVlZCB0byBiZSB3cmFwcGVkIGluIF8oKSBtYXJrZXJzLCBhbmQgaW4gZmFjdCBjYW5ub3QgYmUgZm9yCisgICAgICAgIFB5dGhvbiB0byBjb25zaWRlciB0aGVtIGRvY3N0cmluZ3MuIChTZWUgYWxzbyB0aGUgLVggb3B0aW9uKS4KIAogICAgIC1oCiAgICAgLS1oZWxwCkBAIC0xMzUsMjMgKzE1MywxNyBAQAogICAgICAgICBjb25qdW5jdGlvbiB3aXRoIHRoZSAtRCBvcHRpb24gYWJvdmUuCiAKIElmIGBpbnB1dGZpbGUnIGlzIC0sIHN0YW5kYXJkIGlucHV0IGlzIHJlYWQuCi0iIiIKKyIiIikKIAogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCiBpbXBvcnQgdGltZQogaW1wb3J0IGdldG9wdAoraW1wb3J0IHRva2VuCiBpbXBvcnQgdG9rZW5pemUKIGltcG9ydCBvcGVyYXRvcgogCi0jIGZvciBzZWxmdGVzdGluZwotdHJ5OgotICAgIGltcG9ydCBmaW50bAotICAgIF8gPSBmaW50bC5nZXR0ZXh0Ci1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgZGVmIF8ocyk6IHJldHVybiBzCi0KLV9fdmVyc2lvbl9fID0gJzEuNCcKK19fdmVyc2lvbl9fID0gJzEuNScKIAogZGVmYXVsdF9rZXl3b3JkcyA9IFsnXyddCiBERUZBVUxUS0VZV09SRFMgPSAnLCAnLmpvaW4oZGVmYXVsdF9rZXl3b3JkcykKQEAgLTE4Myw3ICsxOTUsNyBAQAogCiAMCiBkZWYgdXNhZ2UoY29kZSwgbXNnPScnKToKLSAgICBwcmludCA+PiBzeXMuc3RkZXJyLCBfKF9fZG9jX18pICUgZ2xvYmFscygpCisgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgX19kb2NfXyAlIGdsb2JhbHMoKQogICAgIGlmIG1zZzoKICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgbXNnCiAgICAgc3lzLmV4aXQoY29kZSkKQEAgLTI0Miw2ICsyNTQsMTAzIEBACiAgICAgICAgIHMgPSAnIiJcbiInICsgbGluZXRlcm0uam9pbihsaW5lcykgKyAnIicKICAgICByZXR1cm4gcwogCisMCitkZWYgY29udGFpbnNBbnkoc3RyLCBzZXQpOgorICAgICIiIiBDaGVjayB3aGV0aGVyICdzdHInIGNvbnRhaW5zIEFOWSBvZiB0aGUgY2hhcnMgaW4gJ3NldCcKKyAgICAiIiIKKyAgICByZXR1cm4gMSBpbiBbYyBpbiBzdHIgZm9yIGMgaW4gc2V0XQorCisKK2RlZiBfdmlzaXRfcHlmaWxlcyhsaXN0LCBkaXJuYW1lLCBuYW1lcyk6CisgICAgIiIiIEhlbHBlciBmb3IgZ2V0RmlsZXNGb3JOYW1lKCkuCisgICAgIiIiCisgICAgIyBnZXQgZXh0ZW5zaW9uIGZvciBweXRob24gc291cmNlIGZpbGVzCisgICAgaWYgbm90IGdsb2JhbHMoKS5oYXNfa2V5KCdfcHlfZXh0Jyk6CisgICAgICAgIGltcG9ydCBpbXAKKyAgICAgICAgZ2xvYmFsIF9weV9leHQKKyAgICAgICAgX3B5X2V4dCA9IFt0cmlwbGVbMF0gZm9yIHRyaXBsZSBpbiBpbXAuZ2V0X3N1ZmZpeGVzKCkgaWYgdHJpcGxlWzJdID09IGltcC5QWV9TT1VSQ0VdWzBdCisKKyAgICAjIGRvbid0IHJlY3Vyc2UgaW50byBDVlMgZGlyZWN0b3JpZXMKKyAgICBpZiAnQ1ZTJyBpbiBuYW1lczoKKyAgICAgICAgbmFtZXMucmVtb3ZlKCdDVlMnKQorCisgICAgIyBhZGQgYWxsICoucHkgZmlsZXMgdG8gbGlzdAorICAgIGxpc3QuZXh0ZW5kKAorICAgICAgICBbb3MucGF0aC5qb2luKGRpcm5hbWUsIGZpbGUpCisgICAgICAgICAgICBmb3IgZmlsZSBpbiBuYW1lcworICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguc3BsaXRleHQoZmlsZSlbMV0gPT0gX3B5X2V4dF0pCisKKworZGVmIF9nZXRfbW9kcGtnX3BhdGgoZG90dGVkX25hbWUsIHBhdGhsaXN0PU5vbmUpOgorICAgICIiIiBHZXQgdGhlIGZpbGVzeXN0ZW0gcGF0aCBmb3IgYSBtb2R1bGUgb3IgYSBwYWNrYWdlLgorCisgICAgICAgIFJldHVybiB0aGUgZmlsZSBzeXN0ZW0gcGF0aCB0byBhIGZpbGUgZm9yIGEgbW9kdWxlLAorICAgICAgICBhbmQgdG8gYSBkaXJlY3RvcnkgZm9yIGEgcGFja2FnZS4gUmV0dXJuIE5vbmUgaWYKKyAgICAgICAgdGhlIG5hbWUgaXMgbm90IGZvdW5kLCBvciBpcyBhIGJ1aWx0aW4gb3IgZXh0ZW5zaW9uIG1vZHVsZS4KKyAgICAiIiIKKyAgICBpbXBvcnQgaW1wCisKKyAgICAjIHNwbGl0IG9mZiB0b3AtbW9zdCBuYW1lCisgICAgcGFydHMgPSBkb3R0ZWRfbmFtZS5zcGxpdCgnLicsIDEpCisKKyAgICBpZiBsZW4ocGFydHMpID4gMToKKyAgICAgICAgIyB3ZSBoYXZlIGEgZG90dGVkIHBhdGgsIGltcG9ydCB0b3AtbGV2ZWwgcGFja2FnZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlLCBwYXRobmFtZSwgZGVzY3JpcHRpb24gPSBpbXAuZmluZF9tb2R1bGUocGFydHNbMF0sIHBhdGhsaXN0KQorICAgICAgICAgICAgaWYgZmlsZTogZmlsZS5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgIyBjaGVjayBpZiBpdCdzIGluZGVlZCBhIHBhY2thZ2UKKyAgICAgICAgaWYgZGVzY3JpcHRpb25bMl0gPT0gaW1wLlBLR19ESVJFQ1RPUlk6CisgICAgICAgICAgICAjIHJlY3Vyc2l2ZWx5IGhhbmRsZSB0aGUgcmVtYWluaW5nIG5hbWUgcGFydHMKKyAgICAgICAgICAgIHBhdGhuYW1lID0gX2dldF9tb2Rwa2dfcGF0aChwYXJ0c1sxXSwgW3BhdGhuYW1lXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhdGhuYW1lID0gTm9uZQorICAgIGVsc2U6CisgICAgICAgICMgcGxhaW4gbmFtZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlLCBwYXRobmFtZSwgZGVzY3JpcHRpb24gPSBpbXAuZmluZF9tb2R1bGUoZG90dGVkX25hbWUsIHBhdGhsaXN0KQorICAgICAgICAgICAgaWYgZmlsZTogZmlsZS5jbG9zZSgpCisgICAgICAgICAgICBpZiBkZXNjcmlwdGlvblsyXSBub3QgaW4gW2ltcC5QWV9TT1VSQ0UsIGltcC5QS0dfRElSRUNUT1JZXToKKyAgICAgICAgICAgICAgICBwYXRobmFtZSA9IE5vbmUKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcGF0aG5hbWUgPSBOb25lCisKKyAgICByZXR1cm4gcGF0aG5hbWUKKworCitkZWYgZ2V0RmlsZXNGb3JOYW1lKG5hbWUpOgorICAgICIiIiBHZXQgYSBsaXN0IG9mIG1vZHVsZSBmaWxlcyBmb3IgYSBmaWxlbmFtZSwgYSBtb2R1bGUgb3IgcGFja2FnZSBuYW1lLAorICAgICAgICBvciBhIGRpcmVjdG9yeS4KKyAgICAiIiIKKyAgICBpbXBvcnQgaW1wCisKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMobmFtZSk6CisgICAgICAgICMgY2hlY2sgZm9yIGdsb2IgY2hhcnMKKyAgICAgICAgaWYgY29udGFpbnNBbnkobmFtZSwgIio/W10iKToKKyAgICAgICAgICAgIGltcG9ydCBnbG9iCisgICAgICAgICAgICBmaWxlcyA9IGdsb2IuZ2xvYihuYW1lKQorICAgICAgICAgICAgbGlzdCA9IFtdCisgICAgICAgICAgICBmb3IgZmlsZSBpbiBmaWxlczoKKyAgICAgICAgICAgICAgICBsaXN0LmV4dGVuZChnZXRGaWxlc0Zvck5hbWUoZmlsZSkpCisgICAgICAgICAgICByZXR1cm4gbGlzdAorCisgICAgICAgICMgdHJ5IHRvIGZpbmQgbW9kdWxlIG9yIHBhY2thZ2UKKyAgICAgICAgbmFtZSA9IF9nZXRfbW9kcGtnX3BhdGgobmFtZSkKKyAgICAgICAgaWYgbm90IG5hbWU6CisgICAgICAgICAgICByZXR1cm4gW10KKworICAgIGlmIG9zLnBhdGguaXNkaXIobmFtZSk6CisgICAgICAgICMgZmluZCBhbGwgcHl0aG9uIGZpbGVzIGluIGRpcmVjdG9yeQorICAgICAgICBsaXN0ID0gW10KKyAgICAgICAgb3MucGF0aC53YWxrKG5hbWUsIF92aXNpdF9weWZpbGVzLCBsaXN0KQorICAgICAgICByZXR1cm4gbGlzdAorICAgIGVsaWYgb3MucGF0aC5leGlzdHMobmFtZSk6CisgICAgICAgICMgYSBzaW5nbGUgZmlsZQorICAgICAgICByZXR1cm4gW25hbWVdCisKKyAgICByZXR1cm4gW10KIAogDAogY2xhc3MgVG9rZW5FYXRlcjoKQEAgLTMxNCw3ICs0MjMsMTIgQEAKICAgICAgICAgICAgIHNlbGYuX19zdGF0ZSA9IHNlbGYuX193YWl0aW5nCiAgICAgICAgIGVsaWYgdHR5cGUgPT0gdG9rZW5pemUuU1RSSU5HOgogICAgICAgICAgICAgc2VsZi5fX2RhdGEuYXBwZW5kKHNhZmVfZXZhbCh0c3RyaW5nKSkKLSAgICAgICAgIyBUQkQ6IHNob3VsZCB3ZSB3YXJuIGlmIHdlIHNlZW4gYW55dGhpbmcgZWxzZT8KKyAgICAgICAgZWxpZiB0dHlwZSBub3QgaW4gW3Rva2VuaXplLkNPTU1FTlQsIHRva2VuLklOREVOVCwgdG9rZW4uREVERU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uTkVXTElORSwgdG9rZW5pemUuTkxdOgorICAgICAgICAgICAgIyB3YXJuIGlmIHdlIHNlZSBhbnl0aGluZyBlbHNlIHRoYW4gU1RSSU5HIG9yIHdoaXRlc3BhY2UKKyAgICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgXygnKioqICUoZmlsZSlzOiUobGluZW5vKXM6IFNlZW4gdW5leHBlY3RlZCB0b2tlbiAiJSh0b2tlbilzIicpICUgeworICAgICAgICAgICAgICAgICd0b2tlbic6IHRzdHJpbmcsICdmaWxlJzogc2VsZi5fX2N1cmZpbGUsICdsaW5lbm8nOiBzZWxmLl9fbGluZW5vfQorICAgICAgICAgICAgc2VsZi5fX3N0YXRlID0gc2VsZi5fX3dhaXRpbmcKIAogICAgIGRlZiBfX2FkZGVudHJ5KHNlbGYsIG1zZywgbGluZW5vPU5vbmUsIGlzZG9jc3RyaW5nPTApOgogICAgICAgICBpZiBsaW5lbm8gaXMgTm9uZToKQEAgLTQ5NSw2ICs2MDksMTUgQEAKICAgICBlbHNlOgogICAgICAgICBvcHRpb25zLnRvZXhjbHVkZSA9IFtdCiAKKyAgICAjIHJlc29sdmUgYXJncyB0byBtb2R1bGUgbGlzdHMKKyAgICBleHBhbmRlZCA9IFtdCisgICAgZm9yIGFyZyBpbiBhcmdzOgorICAgICAgICBpZiBhcmcgPT0gJy0nOgorICAgICAgICAgICAgZXhwYW5kZWQuYXBwZW5kKGFyZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGV4cGFuZGVkLmV4dGVuZChnZXRGaWxlc0Zvck5hbWUoYXJnKSkKKyAgICBhcmdzID0gZXhwYW5kZWQKKwogICAgICMgc2x1cnAgdGhyb3VnaCBhbGwgdGhlIGZpbGVzCiAgICAgZWF0ZXIgPSBUb2tlbkVhdGVyKG9wdGlvbnMpCiAgICAgZm9yIGZpbGVuYW1lIGluIGFyZ3M6CkBAIC01MzksMyArNjYyLDYgQEAKICAgICBtYWluKCkKICAgICAjIHNvbWUgbW9yZSB0ZXN0IHN0cmluZ3MKICAgICBfKHUnYSB1bmljb2RlIHN0cmluZycpCisgICAgXygnKioqIFNlZW4gdW5leHBlY3RlZCB0b2tlbiAiJSh0b2tlbilzIicgJSB7J3Rva2VuJzogJ3Rlc3QnfSkgIyB0aGlzIG9uZSBjcmVhdGVzIGEgd2FybmluZworICAgIF8oJ21vcmUnICd0aGFuJyAnb25lJyAnc3RyaW5nJykKKwo=