@sapui5/sap.fe.navigation 1.148.2 → 1.148.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -904,7 +904,10 @@ sap.ui.define(["sap/base/Log", "sap/base/assert", "sap/base/util/extend", "sap/b
|
|
|
904
904
|
this._oLastSavedInnerAppData.iCacheHit++;
|
|
905
905
|
|
|
906
906
|
// replace inner app hash with cached appStateKey in url (just in case the app has changed the hash in meantime)
|
|
907
|
-
|
|
907
|
+
// bSkipHashReplace must be checked here too, same as in the cache-miss paths below
|
|
908
|
+
if (!bSkipHashReplace) {
|
|
909
|
+
fnReplaceHash(sAppStateKeyCached);
|
|
910
|
+
}
|
|
908
911
|
oMyDeferred.resolve(sAppStateKeyCached);
|
|
909
912
|
return oMyDeferred.promise();
|
|
910
913
|
}
|
|
@@ -2223,4 +2226,4 @@ sap.ui.define(["sap/base/Log", "sap/base/assert", "sap/base/util/extend", "sap/b
|
|
|
2223
2226
|
const NavigationHandlerUI5Class = BaseObject.extend("sap.fe.navigation.NavigationHandler", NavigationHandler.prototype);
|
|
2224
2227
|
return NavigationHandlerUI5Class;
|
|
2225
2228
|
}, false);
|
|
2226
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOYXZUeXBlIiwiTmF2TGlicmFyeSIsIlBhcmFtSGFuZGxpbmdNb2RlIiwiU3VwcHJlc3Npb25CZWhhdmlvciIsIk1vZGUiLCJJQVBQX1NUQVRFIiwiREVGQVVMVEVEX1BBUkFNRVRFUl9QUk9QRVJUWSIsIkhZQlJJRF9JQVBQX1NUQVRFX0tFWSIsIk5hdmlnYXRpb25IYW5kbGVyIiwiX0Jhc2VPYmplY3QiLCJvQ29udHJvbGxlciIsIl90aGlzIiwic01vZGUiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJPRGF0YVY0Iiwic1BhcmFtSGFuZGxpbmdNb2RlIiwiU2VsVmFyV2lucyIsImNhbGwiLCJfYVRlY2huaWNhbFBhcmFtYXRlcnMiLCJfb0xhc3RTYXZlZElubmVyQXBwRGF0YSIsInNBcHBTdGF0ZUtleSIsIm9BcHBEYXRhIiwiaUNhY2hlSGl0IiwiaUNhY2hlTWlzcyIsIl9ySUFwcFN0YXRlT2xkIiwiUmVnRXhwIiwiX3JJQXBwU3RhdGVPbGRBdFN0YXJ0IiwiX3JJQXBwU3RhdGVOZXciLCJOYXZFcnJvciIsIlVJQ29tcG9uZW50Iiwib1JvdXRlciIsImdldFJvdXRlciIsIm9Db21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudCIsIl9nZXRSb3V0ZXIiLCJnZXRBcHBDb21wb25lbnQiLCJnZXRDb21wb25lbnREYXRhIiwiVVJMUGFyYW1XaW5zIiwiSW5zZXJ0SW5TZWxPcHQiLCJPRGF0YVYyIiwiX3NNb2RlIiwiX2V4cG9ydHMiLCJfaW5oZXJpdHNMb29zZSIsIl9wcm90byIsInByb3RvdHlwZSIsIl9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZSIsInVzaGVsbENvbnRhaW5lciIsInNhcCIsInVpIiwicmVxdWlyZSIsImdldFNlcnZpY2UiLCJfZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2VBc3luYyIsImdldFNlcnZpY2VBc3luYyIsInRoZW4iLCJvQ3Jvc3NBcHBOYXZTZXJ2aWNlIiwiY2F0Y2giLCJMb2ciLCJlcnJvciIsImdldFJvdXRlckZvciIsInJlZ2lzdGVyTmF2aWdhdGVDYWxsYmFjayIsImZuQ2FsbGJhY2siLCJfbmF2aWdhdGVDYWxsYmFjayIsIm5hdmlnYXRlIiwic1NlbWFudGljT2JqZWN0Iiwic0FjdGlvbk5hbWUiLCJ2TmF2aWdhdGlvblBhcmFtZXRlcnMiLCJvSW5uZXJBcHBEYXRhIiwiZm5PbkVycm9yIiwib0V4dGVybmFsQXBwRGF0YSIsInNOYXZNb2RlIiwic1NlbGVjdGlvblZhcmlhbnQiLCJtUGFyYW1ldGVycyIsIm9YQXBwRGF0YU9iaiIsIm9TdGFydHVwUGFyYW1ldGVycyIsImJFeFBsYWNlIiwib1RtcERhdGEiLCJvTmF2SGFuZGxlciIsIm9Db21wb25lbnREYXRhIiwic3RhcnR1cFBhcmFtZXRlcnMiLCJvRW5yaWNoZWRTZWxWYXIiLCJfc3BsaXRJbmJvdW5kTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJTZWxlY3Rpb25WYXJpYW50Iiwib05hdmlnYXRpb25TZWxWYXIiLCJ0b0pTT05TdHJpbmciLCJzZWxlY3Rpb25WYXJpYW50IiwiX3JlbW92ZVRlY2huaWNhbFBhcmFtZXRlcnMiLCJ0b0pTT05PYmplY3QiLCJfcmVtb3ZlTWVhc3VyZUJhc2VkSW5mb3JtYXRpb24iLCJfY2hlY2tJc1BvdGVudGlhbGx5U2Vuc2l0aXZlIiwiX2dldFVSTFBhcmFtZXRlcnNGcm9tU2VsZWN0aW9uVmFyaWFudCIsIm9OYXZBcmd1bWVudHMiLCJ0YXJnZXQiLCJzZW1hbnRpY09iamVjdCIsImFjdGlvbiIsInBhcmFtcyIsImZuTmF2aWdhdGUiLCJmbk5hdkV4cGxhY2UiLCJzTmV3SHJlZlByb21pc2UiLCJnZXRIcmVmIiwic05ld0hyZWYiLCJvcGVuV2luZG93Iiwib0Vycm9yIiwiX2ZuU2F2ZUFwcFN0YXRlQXN5bmMiLCJvU2F2ZUFwcFN0YXRlUmV0dXJuIiwiYXBwU3RhdGVLZXkiLCJwdG9FeHQiLCJmblN0b3JlQW5kTmF2aWdhdGUiLCJzdG9yZUlubmVyQXBwU3RhdGVBc3luYyIsInJlcGxhY2VIYXNoIiwib1RhcmdldHMiLCJpc05hdmlnYXRpb25TdXBwb3J0ZWQiLCJzdXBwb3J0ZWQiLCJ0ZWNobmljYWxFcnJvciIsIl9jcmVhdGVUZWNobmljYWxFcnJvciIsInBhcnNlTmF2aWdhdGlvbiIsInNBcHBIYXNoIiwiSGFzaENoYW5nZXIiLCJnZXRJbnN0YW5jZSIsImdldEhhc2giLCJzSUFwcFN0YXRlIiwiX2dldElubmVyQXBwU3RhdGVLZXkiLCJ3YXJuaW5nIiwiaHlicmlkSUFwcFN0YXRlS2V5UGFyYW1zIiwiaHlicmlkRGVmZXJyZWQiLCJqUXVlcnkiLCJEZWZlcnJlZCIsImlBcHBTdGF0ZUh5YnJpZERlZmVycmVkIiwiX2xvYWRBcHBTdGF0ZSIsImh5YnJpZCIsImFEZWZhdWx0ZWRQYXJhbWV0ZXJzIiwiSlNPTiIsInBhcnNlIiwib015RGVmZXJyZWQiLCJwYXJzZVVybFBhcmFtcyIsIm9TdWJTdGFydHVwUGFyYW1ldGVycyIsImFTdWJEZWZhdWx0ZWRQYXJhbWV0ZXJzIiwib1N1Yk15RGVmZXJyZWQiLCJzTmF2VHlwZSIsIm9TZWxWYXJzIiwiaXNFbXB0eSIsIm9EZWZhdWx0ZWRTZWxWYXIiLCJ4QXBwU3RhdGUiLCJyZWplY3QiLCJyZXNvbHZlIiwiaW5pdGlhbCIsIm9BcHBTdGF0ZURhdGEiLCJvU2VsZWN0aW9uVmFyaWFudCIsIm9EZWZhdWx0ZWRTZWxlY3Rpb25WYXJpYW50IiwiYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSIsInN1Y2Nlc3NIYW5kbGVySHlicmlkU3RhdGUiLCJpQXBwU3RhdGVEYXRhIiwiX3JlZiIsIm5hdlR5cGUiLCJpQXBwU3RhdGUiLCJmYWlsdXJlSGFuZGxlckh5YnJpZFN0YXRlIiwiZG9uZSIsImZhaWwiLCJiSXNYYXBwU3RhdGVOYXZpZ2F0aW9uIiwidGhhdCIsImdldFN0YXJ0dXBBcHBTdGF0ZSIsIm9BcHBTdGF0ZSIsImdldERhdGEiLCJzdHJpbmdpZnkiLCJ4IiwicHJvbWlzZSIsIm9TZWxWYXIiLCJVUkxQYXJhbXMiLCJzZXRUZWNobmljYWxQYXJhbWV0ZXJzIiwiYVRlY2huaWNhbFBhcmFtZXRlcnMiLCJBcnJheSIsImlzQXJyYXkiLCJnZXRUZWNobmljYWxQYXJhbWV0ZXJzIiwiY29uY2F0IiwiX2lzVGVjaG5pY2FsUGFyYW1ldGVyIiwic1BhcmFtZXRlck5hbWUiLCJ0b0xvd2VyQ2FzZSIsImluZGV4T2YiLCJpbmNsdWRlcyIsIl9pc0ZFUGFyYW1ldGVyIiwic1Byb3BOYW1lIiwiaSIsImFTZWxWYXJQcm9wTmFtZXMiLCJnZXRTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcyIsInJlbW92ZVNlbGVjdE9wdGlvbiIsIm9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkIiwiaGFzT3duUHJvcGVydHkiLCJnZXRQYXJhbWV0ZXJOYW1lcyIsIm1hc3NBZGRTZWxlY3RPcHRpb24iLCJnZXRWYWx1ZSIsIl9hZGRQYXJhbWV0ZXJWYWx1ZXMiLCJhUHJvcE5hbWVzIiwib1NlbFZhcmlhbnQiLCJzU2lnbiIsInNPcHRpb24iLCJvVmFsdWVzIiwiYWRkU2VsZWN0T3B0aW9uIiwib0hhc2hDaGFuZ2VyIiwic0FwcEhhc2hPbGQiLCJzQXBwSGFzaE5ldyIsIl9yZXBsYWNlSW5uZXJBcHBTdGF0ZUtleSIsIm1Jbm5lckFwcERhdGEiLCJiSW1tZWRpYXRlSGFzaFJlcGxhY2UiLCJiU2tpcEhhc2hSZXBsYWNlIiwiZm5SZXBsYWNlSGFzaCIsImlzRW1wdHlPYmplY3QiLCJzQXBwU3RhdGVLZXlDYWNoZWQiLCJiSW5uZXJBcHBEYXRhRXF1YWwiLCJmbk9uQWZ0ZXJTYXZlIiwiX3NhdmVBcHBTdGF0ZUFzeW5jIiwic3RvcmVJbm5lckFwcFN0YXRlIiwiX3NhdmVBcHBTdGF0ZSIsInN0b3JlSW5uZXJBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4iLCJvQXBwU3RhdGVQcm9taXNlIiwicHJvY2Vzc0JlZm9yZVNtYXJ0TGlua1BvcG92ZXJPcGVucyIsIm9UYWJsZUV2ZW50UGFyYW1ldGVycyIsIm1TZW1hbnRpY0F0dHJpYnV0ZXMiLCJzZW1hbnRpY0F0dHJpYnV0ZXMiLCJmblN0b3JlWGFwcEFuZENhbGxPcGVuIiwibVN1YlNlbWFudGljQXR0cmlidXRlcyIsInNTdWJTZWxlY3Rpb25WYXJpYW50IiwiaVN1cHByZXNzaW9uQmVoYXZpb3IiLCJyYWlzZUVycm9yT25OdWxsIiwicmFpc2VFcnJvck9uVW5kZWZpbmVkIiwib01peGVkU2VsVmFyIiwibWl4QXR0cmlidXRlc0FuZFNlbGVjdGlvblZhcmlhbnQiLCJmbk9uQ29udGFpbmVyU2F2ZSIsInNldFNlbWFudGljQXR0cmlidXRlcyIsInNldEFwcFN0YXRlS2V5Iiwib3BlbiIsIm9TdG9yZUlubmVyQXBwU3RhdGVQcm9taXNlIiwiX2dldEFwcFN0YXRlS2V5QW5kVXJsUGFyYW1ldGVycyIsIl9nZXRBcHBTcGVjaWZpY0hhc2giLCJhcHBIYXNoIiwiY3Jvc3NBcHBTZXJ2aWNlIiwiYXBwU3BlY2lmaWNSb3V0ZSIsIm1lc3NhZ2UiLCJFcnJvciIsIlN0cmluZyIsIl9taXhBdHRyaWJ1dGVzVG9TZWxWYXJpYW50Iiwic1Byb3BlcnR5TmFtZSIsInZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlIiwiRGF0ZSIsInRvSlNPTiIsInRvU3RyaW5nIiwiaWdub3JlRW1wdHlTdHJpbmciLCJpbmZvIiwidlNlbWFudGljQXR0cmlidXRlcyIsInN0YW5kYXJkIiwib05ld1NlbFZhcmlhbnQiLCJmaWx0ZXJVcmwiLCJnZXRGaWx0ZXJDb250ZXh0VXJsIiwic2V0RmlsdGVyQ29udGV4dFVybCIsImNvbnRleHRVcmwiLCJnZXRQYXJhbWV0ZXJDb250ZXh0VXJsIiwic2V0UGFyYW1ldGVyQ29udGV4dFVybCIsImZvckVhY2giLCJhUGFyYW1ldGVycyIsImdldFNlbGVjdE9wdGlvbiIsImdldFBhcmFtZXRlciIsImFTZWxPcHRpb25OYW1lcyIsImFTZWxlY3RPcHRpb24iLCJqIiwiU2lnbiIsIk9wdGlvbiIsIkxvdyIsIkhpZ2giLCJfZW5zdXJlU2VsZWN0aW9uVmFyaWFudEZvcm1hdFN0cmluZyIsInZTZWxlY3Rpb25WYXJpYW50IiwidkNvbnZlcnRlZFNlbGVjdGlvblZhcmlhbnQiLCJfZm5IYW5kbGVBcHBTdGF0ZVByb21pc2UiLCJvUmV0dXJuIiwiX3NhdmVBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4iLCJfZm5TYXZlQXBwU3RhdGVXaXRoSW1tZWRpYXRlUmV0dXJuIiwiZ2V0S2V5Iiwib0FwcERhdGFGb3JTYXZlIiwiX2ZldGNoQXBwRGF0YUZvclNhdmUiLCJzZXREYXRhIiwib1NhdmVQcm9taXNlIiwic2F2ZSIsImV4dGVuZCIsInRhYmxlVmFyaWFudElkIiwiY3VzdG9tRGF0YSIsInByZXNlbnRhdGlvblZhcmlhbnQiLCJ2YWx1ZVRleHRzIiwic2VtYW50aWNEYXRlcyIsIm9BcHBEYXRhQ2xvbmUiLCJPYmplY3QiLCJhc3NpZ24iLCJtZXJnZSIsImNyZWF0ZUVtcHR5QXBwU3RhdGUiLCJvRGVmZXJyZWQiLCJnZXRBcHBTdGF0ZSIsIm9BcHBEYXRhTG9hZGVkIiwiZGF0YSIsImFNYXRjaGVzIiwiZXhlYyIsInNOZXdJQXBwU3RhdGUiLCJmbkFwcGVuZFRvUXVlcnlQYXJhbWV0ZXIiLCJzU3ViQXBwSGFzaCIsInRlc3QiLCJyZXBsYWNlIiwic05lZWRsZSIsImZuUmVwbGFjZU9sZEFwcHJvYWNoIiwick9sZEFwcHJvYWNoIiwiYXNzZXJ0IiwibVVSTFBhcmFtZXRlcnMiLCJhU2VsZWN0UHJvcGVydGllcyIsImFTZWxlY3RPcHRpb25zIiwiYVBhcmFtZXRlck5hbWVzIiwic1BhcmFtZXRlclZhbHVlIiwic0Vycm9yQ29kZSIsInNldE1vZGVsIiwib01vZGVsIiwiX29Nb2RlbCIsIl9nZXRNb2RlbCIsImdldE1vZGVsIiwiX3JlbW92ZUFsbFByb3BlcnRpZXMiLCJvRGF0YSIsIl9yZW1vdmVQcm9wZXJ0aWVzIiwiYUZpbHRlck5hbWUiLCJhUGFyYW1ldGVyTmFtZSIsInNOYW1lIiwiU2VsZWN0T3B0aW9ucyIsInNvbWUiLCJvVmFsdWUiLCJuSWR4IiwiUHJvcGVydHlOYW1lIiwic3BsaWNlIiwiVGV4dHMiLCJvVGV4dHMiLCJQcm9wZXJ0eVRleHRzIiwiRGF0ZXMiLCJvRGF0ZXMiLCJQYXJhbWV0ZXJzIiwiX2lzVGVybVRydWUiLCJvUHJvcGVydHkiLCJzVGVybSIsImZJc1Rlcm1EZWZhdWx0VHJ1ZSIsIm9UZXJtIiwiQm9vbCIsIl9pc0V4Y2x1ZGVkRnJvbU5hdmlnYXRpb25Db250ZXh0IiwiX2lzUG90ZW50aWFsbHlTZW5zaXRpdmUiLCJfaXNNZWFzdXJlUHJvcGVydHkiLCJfaXNUb0JlRXhjbHVkZWQiLCJjb25zdHJ1Y3RDb250ZXh0VXJsIiwic0VudGl0eVNldE5hbWUiLCJfY29uc3RydWN0Q29udGV4dFVybCIsInNTZXJ2ZXJVcmwiLCJpc0EiLCJfZ2V0U2VydmVyVXJsIiwib1NlcnZpY2VVUkkiLCJVUkkiLCJnZXRTZXJ2aWNlVXJsIiwiYWJzb2x1dGVUbyIsImRvY3VtZW50IiwiYmFzZVVSSSIsImxhc3RJbmRleE9mIiwic3Vic3RyaW5nIiwic1NlcnZpY2VVcmwiLCJvQWRhcHRlZERhdGEiLCJGaWx0ZXJDb250ZXh0VXJsIiwiUGFyYW1ldGVyQ29udGV4dFVybCIsImFTZW5zaXRpdmVGaWx0ZXJOYW1lIiwiYVNlbnNpdGl2ZVBhcmFtZXRlck5hbWUiLCJvRW50aXR5U2V0Iiwib0VudGl0eURlZiIsIm9TdWJFbnRpdHlEZWYiLCJvRW5kUm9sZSIsImFGaWx0ZXJDb250ZXh0UGFydCIsImFQYXJhbUNvbnRleHRQYXJ0Iiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsImdldFNlcnZpY2VNZXRhZGF0YSIsInNwbGl0IiwiZ2V0T0RhdGFFbnRpdHlTZXQiLCJnZXRPRGF0YUVudGl0eVR5cGUiLCJlbnRpdHlUeXBlIiwicHJvcGVydHkiLCJwdXNoIiwibmFtZSIsIm5hdmlnYXRpb25Qcm9wZXJ0eSIsImdldE9EYXRhQXNzb2NpYXRpb25FbmQiLCJ0eXBlIiwibXVsdGlwbGljaXR5IiwiX3JlbW92ZVNlbnNpdGl2ZURhdGFGb3JPRGF0YVY0IiwiX3JlbW92ZU1lYXN1cmVCYXNlZFByb3BlcnRpZXMiLCJhTWVhc3VyZUZpbHRlck5hbWUiLCJhTWVhc3VyZVBhcmFtZXRlck5hbWUiLCJiTWVhc3VyZSIsIm9TViIsImdldE9iamVjdCIsInNFbnRpdHlTZXQiLCJhUHJvcGVydHlOYW1lcyIsImdldFByb3BlcnR5TmFtZXMiLCJmbklzU2Vuc2l0aXZlRGF0YSIsInNQcm9wIiwiZXNOYW1lIiwiYVByb3BlcnR5QW5ub3RhdGlvbnMiLCJfY2hlY2tQcm9wZXJ0eUFubm90YXRpb25zRm9yU2Vuc2l0aXZlRGF0YSIsIm9GaWVsZENvbnRyb2wiLCJrIiwic1Byb3BlcnR5IiwiZ2V0SUFwcFN0YXRlS2V5IiwiQmFzZU9iamVjdCIsIk5hdmlnYXRpb25IYW5kbGVyVUk1Q2xhc3MiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIk5hdmlnYXRpb25IYW5kbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwic2FwL2Jhc2UvYXNzZXJ0XCI7XG5pbXBvcnQgZXh0ZW5kIGZyb20gXCJzYXAvYmFzZS91dGlsL2V4dGVuZFwiO1xuaW1wb3J0IGlzRW1wdHlPYmplY3QgZnJvbSBcInNhcC9iYXNlL3V0aWwvaXNFbXB0eU9iamVjdFwiO1xuaW1wb3J0IG1lcmdlIGZyb20gXCJzYXAvYmFzZS91dGlsL21lcmdlXCI7XG5pbXBvcnQgQmFzZU9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IFVJQ29tcG9uZW50IGZyb20gXCJzYXAvdWkvY29yZS9VSUNvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbGxlciBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJcIjtcbmltcG9ydCBIYXNoQ2hhbmdlciBmcm9tIFwic2FwL3VpL2NvcmUvcm91dGluZy9IYXNoQ2hhbmdlclwiO1xuaW1wb3J0IHR5cGUgUm91dGVyIGZyb20gXCJzYXAvdWkvY29yZS9yb3V0aW5nL1JvdXRlclwiO1xuaW1wb3J0IHR5cGUgVjJPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjIvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgVjRPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IFVSSSBmcm9tIFwic2FwL3VpL3RoaXJkcGFydHkvVVJJXCI7XG5pbXBvcnQgalF1ZXJ5IGZyb20gXCJzYXAvdWkvdGhpcmRwYXJ0eS9qcXVlcnlcIjtcbmltcG9ydCBvcGVuV2luZG93IGZyb20gXCJzYXAvdWkvdXRpbC9vcGVuV2luZG93XCI7XG5pbXBvcnQgdHlwZSBDb250YWluZXIgZnJvbSBcInNhcC91c2hlbGwvQ29udGFpbmVyXCI7XG5pbXBvcnQgdHlwZSBDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbiBmcm9tIFwic2FwL3VzaGVsbC9zZXJ2aWNlcy9Dcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvblwiO1xuaW1wb3J0IHR5cGUgTmF2aWdhdGlvbiBmcm9tIFwic2FwL3VzaGVsbC9zZXJ2aWNlcy9OYXZpZ2F0aW9uXCI7XG5pbXBvcnQgTmF2RXJyb3IgZnJvbSBcIi4vTmF2RXJyb3JcIjtcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQgfSBmcm9tIFwiLi9TZWxlY3Rpb25WYXJpYW50XCI7XG5pbXBvcnQgU2VsZWN0aW9uVmFyaWFudCBmcm9tIFwiLi9TZWxlY3Rpb25WYXJpYW50XCI7XG5pbXBvcnQgTmF2TGlicmFyeSBmcm9tIFwiLi9saWJyYXJ5XCI7XG5cbnR5cGUgU2hlbGxBcHBTdGF0ZVJldHVybiA9IHtcblx0cHJvbWlzZTogSlF1ZXJ5LlByb21pc2U8c3RyaW5nPjtcblx0YXBwU3RhdGVLZXk6IHN0cmluZztcbn07XG5cbnR5cGUgU2hlbGxBcHBTdGF0ZSA9IHtcblx0Z2V0S2V5KCk6IHN0cmluZztcblx0c2V0RGF0YShvYmo6IG9iamVjdCk6IHZvaWQ7XG5cdGdldERhdGEoKTogSW5uZXJBcHBEYXRhO1xuXHRzYXZlKCk6IEpRdWVyeS5Qcm9taXNlPHN0cmluZz47XG59O1xuLyoqXG4gKiBTdHJ1Y3R1cmUgb2Ygc3RvcmVkIGFwcCBzdGF0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbm5lckFwcERhdGEge1xuXHRba2V5OiBzdHJpbmddOiB1bmtub3duO1xuXHQvKipcblx0ICogU3JpbmdpZmllZCBKU09OIG9iamVjdCBhcyByZXR1cm5lZCwgZm9yIGV4YW1wbGUsIGZyb20gZ2V0RGF0YVN1aXRlRm9ybWF0KCkgb2YgdGhlIFNtYXJ0RmlsdGVyQmFyIGNvbnRyb2xcblx0ICovXG5cdHNlbGVjdGlvblZhcmlhbnQ/OiBzdHJpbmcgfCBTZXJpYWxpemVkU2VsZWN0aW9uVmFyaWFudDtcblxuXHQvKipcblx0ICogSUQgb2YgdGhlIFNtYXJ0VGFibGUgdmFyaWFudC5cblx0ICovXG5cdHRhYmxlVmFyaWFudElkPzogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBPYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBhcmJpdHJhcnkgZGF0YS5cblx0ICovXG5cdGN1c3RvbURhdGE/OiBvYmplY3Q7XG5cblx0LyoqXG5cdCAqIE9iamVjdCBjb250YWluaW5nIHRoZSBjdXJyZW50IHVpIHN0YXRlIG9mIHRoZSBhcHAuXG5cdCAqL1xuXHRwcmVzZW50YXRpb25WYXJpYW50Pzogb2JqZWN0O1xuXG5cdC8qKlxuXHQgKiBPYmplY3QgY29udGFpbmluZyB2YWx1ZSBkZXNjcmlwdGlvbnMuXG5cdCAqL1xuXHR2YWx1ZVRleHRzPzogb2JqZWN0IHwgbnVsbDtcblxuXHQvKipcblx0ICogT2JqZWN0IGNvbnRhaW5pbmcgc2VtYW50aWNEYXRlcyBmaWx0ZXIgaW5mb3JtYXRpb24uXG5cdCAqL1xuXHRzZW1hbnRpY0RhdGVzPzogb2JqZWN0IHwgbnVsbDtcbn1cblxuLy8gc2hvcnRjdXRzIGZvciBzYXAudWkuZ2VuZXJpYy5hcHAgZW51bXNcbmNvbnN0IE5hdlR5cGUgPSBOYXZMaWJyYXJ5Lk5hdlR5cGU7XG5jb25zdCBQYXJhbUhhbmRsaW5nTW9kZSA9IE5hdkxpYnJhcnkuUGFyYW1IYW5kbGluZ01vZGU7XG5jb25zdCBTdXBwcmVzc2lvbkJlaGF2aW9yID0gTmF2TGlicmFyeS5TdXBwcmVzc2lvbkJlaGF2aW9yO1xuY29uc3QgTW9kZSA9IE5hdkxpYnJhcnkuTW9kZTtcblxuY29uc3QgSUFQUF9TVEFURSA9IFwic2FwLWlhcHAtc3RhdGVcIjtcbmNvbnN0IERFRkFVTFRFRF9QQVJBTUVURVJfUFJPUEVSVFkgPSBcInNhcC11c2hlbGwtZGVmYXVsdGVkUGFyYW1ldGVyTmFtZXNcIjtcbmNvbnN0IEhZQlJJRF9JQVBQX1NUQVRFX0tFWSA9IFwibmhIeWJyaWRJQXBwU3RhdGVLZXlcIjtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBzdWNjZXNzb3Igb2Yge0BsaW5rIHNhcC51aS5nZW5lcmljLmFwcC5uYXZpZ2F0aW9uLnNlcnZpY2UuTmF2aWdhdGlvbkhhbmRsZXJ9Ljxicj4gQ3JlYXRlcyBhIG5ldyBOYXZpZ2F0aW9uSGFuZGxlciBjbGFzcyBieSBwcm92aWRpbmcgdGhlIHJlcXVpcmVkIGVudmlyb25tZW50LiA8YnI+XG4gKiBUaGUgPGNvZGU+TmF2aWdhdGlvbkhhbmRsZXI8L2NvZGU+IHN1cHBvcnRzIHRoZSB2ZXJpZmljYXRpb24gb2Ygc2Vuc2l0aXZlIGluZm9ybWF0aW9uLiBBbGwgcHJvcGVydGllcyB0aGF0IGFyZSBwYXJ0IG9mXG4gKiA8Y29kZT5zZWxlY3Rpb25WYXJpYW50PC9jb2RlPiBhbmQgPGNvZGU+dmFsdWVUZXh0czwvY29kZT4gd2lsbCBiZSB2ZXJpZmllZCBpZiB0aGV5IGFyZSBhbm5vdGF0ZWQgYXNcbiAqIDxjb2RlPmNvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5Jc1BvdGVudGlhbGx5U2Vuc2l0aXZlPC9jb2RlPiBvclxuICogPGNvZGU+Y29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRXhjbHVkZUZyb21OYXZpZ2F0aW9uQ29udGV4dDwvY29kZT4gYW5kIHdpbGwgYmUgcmVtb3ZlZCBiZWZvcmUgdGhlIGRhdGEgaXMgcGVyc2lzdGVkIGFzIHRoZSBhcHBcbiAqIHN0YXRlLjxicj5cbiAqIEFsc28sIGFsbCBwcm9wZXJ0aWVzIGFubm90YXRlZCBhcyA8Y29kZT5jb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuTWVhc3VyZTwvY29kZT4gd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGRhdGEgc3RvcmVkIGFzIHRoZVxuICogeGFwcCBzdGF0ZS48YnI+XG4gKiBUbyB2ZXJpZnkgdGhlIGluZm9ybWF0aW9uIHRvIGJlIHJlbW92ZWQsIHRoZSA8Y29kZT5OYXZpZ2F0aW9uSGFuZGxlcjwvY29kZT4gcmVxdWlyZXMgYW4gdW5uYW1lZCBtb2RlbCBvZiB0eXBlXG4gKiB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnYyLk9EYXRhTW9kZWx9IG9uIGNvbXBvbmVudCBsZXZlbC4gSXQgaXMgcG9zc2libGUgdG8gc2V0IHN1Y2ggYSBtb2RlbCB1c2luZyB0aGUgPGNvZGU+c2V0TW9kZWw8L2NvZGU+XG4gKiBtZXRob2QuPGJyPlxuICogPGI+Tm90ZTo8L2I+IFRoZSBjaGVjayBmb3IgZXhjbHVkZWQgZGF0YSByZXF1aXJlcyB0aGF0IHRoZSBPRGF0YSBtZXRhZGF0YSBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZCBjb21wbGV0ZWx5Ljxicj5cbiAqIElmIHRoZSBPRGF0YSBtZXRhZGF0YSBtb2RlbCBoYXMgbm90IGJlZW4gbG9hZGVkIGNvbXBsZXRlbHksIGFsbCBwcm9wZXJ0aWVzIGFyZSByZW1vdmVkIGZyb20gdGhlIGFwcGxpY2F0aW9uIGNvbnRleHQuPGJyPlxuICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MgcmVxdWlyZXMgdGhhdCB0aGUgVVNoZWxsIHtAbGluayBzYXAudXNoZWxsLnNlcnZpY2VzLkNyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9ufSBpcyBhdmFpbGFibGUgYW5kIGluaXRpYWxpemVkLlxuICogQHB1YmxpY1xuICogQHNpbmNlIDEuODMuMFxuICovXG5leHBvcnQgY2xhc3MgTmF2aWdhdGlvbkhhbmRsZXIgZXh0ZW5kcyBCYXNlT2JqZWN0IHtcblx0cHJpdmF0ZSBvUm91dGVyOiBhbnk7XG5cblx0cHJpdmF0ZSBvQ29tcG9uZW50OiBDb21wb25lbnQ7XG5cblx0cHJpdmF0ZSBfb01vZGVsOiBhbnk7XG5cblx0cHJpdmF0ZSBzUGFyYW1IYW5kbGluZ01vZGU6IHN0cmluZztcblxuXHRwcml2YXRlIF9zTW9kZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5cdC8vIGxpc3Qgb2YgdGVjaG5pY2FsIHBhcmFtZXRlcnNcblx0cHJpdmF0ZSBfYVRlY2huaWNhbFBhcmFtYXRlcnMgPSBbXCJoY3BBcHBsaWNhdGlvbklkXCJdO1xuXG5cdHByaXZhdGUgX29MYXN0U2F2ZWRJbm5lckFwcERhdGE6IGFueSA9IHtcblx0XHRzQXBwU3RhdGVLZXk6IFwiXCIsXG5cdFx0b0FwcERhdGE6IHt9LFxuXHRcdGlDYWNoZUhpdDogMCxcblx0XHRpQ2FjaGVNaXNzOiAwXG5cdH07XG5cblx0Lypcblx0ICogVGhlcmUgZXhpc3RzIGEgZ2VuZXJhdGlvbiBvZiBcIm9sZFwiIHNhcC1pYXBwLXN0YXRlcyB3aGljaCBhcmUgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBVUkwgc2NoZW1hOlxuXHQgKiAjU2VtT2JqLWFjdGlvbiYvcm91dGUvc2FwLWlhcHAtc3RhdGU9QUJDMTIzNDU2NzggVGhlIG5ldyBVUkwgc2NoZW1hIGlzOiAjU2VtT2JqLWFjdGlvbiYvcm91dGU/c2FwLWlhcHAtc3RhdGU9QUJDMTIzNDU2NzggKG1pbmQgdGhlXG5cdCAqIGRpZmZlcmVuY2UgYmV0d2VlbiAvIGFuZCA/IGFib3ZlKSwgaS5lLiB0aGUgc2FwLWlhcHAtc3RhdGUgaGFzIGJlY29tZSBhIHBhcmFtZXRlciBvZiB0aGUgcXVlcnkgcGFyYW1ldGVyIHNlY3Rpb24gaW4gdGhlIEFwcEhhc2ggc3RyaW5nLlxuXHQgKiBZZXQsIHRoaXMgdG9vbCBzaGFsbCBiZSBhYmxlIHRvIGRlYWwgZXZlbiB3aXRoIG9sZCBzYXAtaWFwcC1zdGF0ZXMuIFRoZXJlZm9yZSwgd2UgdXNlIHR3byBSZWd1bGFyIEV4cHJlc3Npb25zIChySUFwcFN0YXRlT2xkIGFuZFxuXHQgKiBySUFwcFN0YXRlT2xkQXRTdGFydCkgYXMgZGVmaW5lZCBiZWxvdyB0byBzY2FuIGZvciB0aGVzZSBvbGQgdmFyaWFudHMuIFRoZSBuZXcgdmFyaWFudCBpcyBiZWluZyBzY2FubmVkIHVzaW5nIHJJQXBwU3RhdGVOZXcgYXMgUmVndWxhclxuXHQgKiBFeHByZXNzaW9uIHNlYXJjaCBzdHJpbmcuIENvbXBhdGliaWxpdHkgaXMgY2VudHJhbGx5IGVuc3VyZWQgYnkgdGhlIHR3byBtZXRob2RzIF9nZXRJbm5lckFwcFN0YXRlS2V5IGFuZCBfcmVwbGFjZUlubmVyQXBwU3RhdGVLZXkgKHNlZVxuXHQgKiBiZWxvdykuIE5ldmVyIHVzZSB0aGVzZSBSZWdFeHAgaW4gYSBtZXRob2Qgb24geW91ciBvd24sIGFzIGl0IHR5cGljYWxseSBpbmRpY2F0ZXMgdGhhdCB5b3Ugd2lsbCBmYWxsIGludG8gdGhlIGNvbXBhdGliaWxpdHkgdHJhcCFcblx0ICovXG5cdC8vIFdhcm5pbmchIERvIG5vdCB1c2UgR0xPQkFMIGZsYWdzIGhlcmU7IFJlZ0V4cCBpbiBHTE9CQUwgbW9kZSBzdG9yZSB0aGUgbGFzdEluZGV4IHZhbHVlXG5cdC8vIFRoZXJlZm9yZSwgcmVwZWF0ZWQgY2FsbHMgdG8gdGhlIFJlZ0V4cCB3aWxsIHRoZW4gb25seSBzdGFydCBiZWdpbm5pbmcgd2l0aCB0aGF0IHN0b3JlZFxuXHQvLyBsYXN0SW5kZXguIFRodXMsIG11bHRpcGxlIGNhbGxzIHRoZXJlZm9yZSBjb3VsZCB5aWVsZCBzdHJhbmdlIHJlc3VsdHMuXG5cdC8vIE1vcmVvdmVyLCB0aGVyZSBzaGFsbCBvbmx5IGJlIGV4YWN0bHkgb25lIElBUFBfU1RBVEUgcGVyIFJlZ0V4cCBpbiBhbiBBcHBIYXNoLlxuXHQvLyBUaGVyZWZvcmUsIEdMT0JBTCBzZWFyY2ggc2hvdWxkIGJlIHN1cGVyZmx1b3VzLlxuXHRwcml2YXRlIF9ySUFwcFN0YXRlT2xkID0gbmV3IFJlZ0V4cChcIi9cIiArIElBUFBfU1RBVEUgKyBcIj0oW14vP10rKVwiKTtcblxuXHRwcml2YXRlIF9ySUFwcFN0YXRlT2xkQXRTdGFydCA9IG5ldyBSZWdFeHAoXCJeXCIgKyBJQVBQX1NUQVRFICsgXCI9KFteLz9dKylcIik7XG5cblx0Lypcblx0ICogUmVndWxhciBFeHByZXNzaW9uIGluIHdvcmRzOiBTZWFyY2ggZm9yIHNvbWV0aGluZyB0aGF0IGVpdGhlciBzdGFydHMgd2l0aCA/IG9yICYsIGZvbGxvd2VkIGJ5IHRoZSB0ZXJtIFwic2FwLWlhcHAtc3RhdGVcIi4gVGhhdCBvbmUgaXNcblx0ICogZm9sbG93ZWQgYnkgYW4gZXF1YWwgc2lnbiAoPSkuIFRoZSBzdHVmZiB0aGF0IGlzIGFmdGVyIHRoZSBlcXVhbCBzaWduIGZvcm1zIHRoZSBmaXJzdCByZWdleHAgZ3JvdXAuIFRoaXMgZ3JvdXAgY29uc2lzdHMgb2YgYXQgbGVhc3Qgb25lXG5cdCAqIChvciBhcmJpdHJhcnkgbWFueSkgY2hhcmFjdGVycywgYXMgbG9uZyBhcyBpdCBpcyBub3QgYW4gYW1wZXJzYW5kIHNpZ24gKCYpLiBDaGFyYWN0ZXJzIGFmdGVyIHN1Y2ggYW4gYW1wZXJzYW5kIHdvdWxkIGJlIGlnbm9yZWQgYW5kIGRvXG5cdCAqIG5vdCBiZWxvbmcgdG8gdGhlIGdyb3VwLiBBbHRlcm5hdGl2ZWx5LCB0aGUgc3RyaW5nIGFsc28gbWF5IGVuZC5cblx0ICovXG5cdHByaXZhdGUgX3JJQXBwU3RhdGVOZXcgPSBuZXcgUmVnRXhwKFwiWz8mXVwiICsgSUFQUF9TVEFURSArIFwiPShbXiZdKylcIik7XG5cblx0cHJpdmF0ZSBfbmF2aWdhdGVDYWxsYmFjazogRnVuY3Rpb24gfCB1bmRlZmluZWQ7XG5cblx0LyoqXG5cdCAqIFRlbXBvcmFyaWx5IGFkZGVkIGFnYWluIGJlY2F1c2UgYW4gYXBwbGljYXRpb24gd2FzIChpbGxlZ2lhbGx5KSByZWx5aW5nIG9uIGl0LiBTaG91bGQgYmUgcmVtb3ZlZCBhZ2Fpbiwgb25jZSB0aGUgYXBwIGlzIGNvcnJlY3RlZFxuXHQgKi9cblx0cHJpdmF0ZSBJQVBQX1NUQVRFID0gSUFQUF9TVEFURTtcblxuXHQvKipcblx0ICogQ29uc3RydWN0b3IgcmVxdWlyaW5nIGEgY29udHJvbGxlci9jb21wb25lbnQgb3duaW5nIHRoZSBuYXZpZ2F0aW9uIGhhbmRsZXIuXG5cdCAqIEBwYXJhbSBvQ29udHJvbGxlciBVSTUgY29udHJvbGxlciB0aGF0IGNvbnRhaW5zIGEgcm91dGVyIGFuZCBhIGNvbXBvbmVudDsgdHlwaWNhbGx5IHRoZSBtYWluIGNvbnRyb2xsZXIgb2YgeW91ciBhcHBsaWNhdGlvbiwgZm9yXG5cdCAqICAgICAgICBleGFtcGxlLCBhIHN1YmNsYXNzIG9mIHRoZSBzYXAuY2Euc2NmbGQubWQuY29udHJvbGxlci5CYXNlRnVsbHNjcmVlbkNvbnRyb2xsZXIgaWYgc2NhZmZvbGRpbmcgaXMgdXNlZFxuXHQgKiBAcGFyYW0gc01vZGUgTW9kZSB0byBiZSB1c2VkIHRvIGluZGljYXRlcyB0aGUgT2RhdGEgdmVyc2lvbiB1c2VkIGZvciBydW5ubmluZyB0aGUgTmF2aWdhdGlvbiBIYW5kbGVyLFxuXHQgKiAgICAgICAgc2VlIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5Nb2RlfS48YnI+XG5cdCAqIFx0XHQgIE5vdGU6IE1vZGUgaGFzIHRvIGJlIHNhcC5mZS5uYXZpZ2F0aW9uLk1vZGUuT0RhdGFWMiB3aGVuZXZlciB0aGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBhIE9EYXRhIFYyIGJhc2VkIHNlcnZpY2UuXG5cdCAqIEBwYXJhbSBzUGFyYW1IYW5kbGluZ01vZGUgTW9kZSB0byBiZSB1c2VkIHRvIGhhbmRsZSBjb25mbGljdHMgd2hlbiBtZXJnaW5nIFVSTCBwYXJhbWV0ZXJzIGFuZCB0aGUgU2VsZWN0aW9uVmFyaWFudCBjbGFzcyxcblx0ICogICAgICAgIHNlZSB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uUGFyYW1IYW5kbGluZ01vZGV9XG5cdCAqIEB0aHJvd3MgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdkVycm9yfSBpbiBjYXNlIG9mIGlucHV0IGVycm9ycy4gVmFsaWQgZXJyb3IgY29kZXMgYXJlOiA8dGFibGU+XG5cdCAqICAgICAgICAgPHRyPlxuXHQgKiAgICAgICAgIDx0aCBhbGlnbj1cImxlZnRcIj5OYXZFcnJvciBjb2RlPC90aD5cblx0ICogICAgICAgICA8dGggYWxpZ249XCJsZWZ0XCI+RGVzY3JpcHRpb248L3RoPlxuXHQgKiAgICAgICAgIDwvdHI+XG5cdCAqICAgICAgICAgPHRyPlxuXHQgKiAgICAgICAgIDx0ZD5OYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUPC90ZD5cblx0ICogICAgICAgICA8dGQ+SW5kaWNhdGVzIHRoYXQgdGhlIGlucHV0IHBhcmFtZXRlciBpcyBpbnZhbGlkPC90ZD5cblx0ICogICAgICAgICA8L3RyPlxuXHQgKiAgICAgICAgIDwvdGFibGU+XG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcihcblx0XHRvQ29udHJvbGxlcjogQ29udHJvbGxlciB8IFVJQ29tcG9uZW50LFxuXHRcdHNNb2RlOiBzdHJpbmcgPSBNb2RlLk9EYXRhVjQsXG5cdFx0c1BhcmFtSGFuZGxpbmdNb2RlOiBzdHJpbmcgPSBQYXJhbUhhbmRsaW5nTW9kZS5TZWxWYXJXaW5zXG5cdCkge1xuXHRcdHN1cGVyKCk7XG5cdFx0aWYgKCFvQ29udHJvbGxlcikge1xuXHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHR9XG5cblx0XHRpZiAob0NvbnRyb2xsZXIgaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkge1xuXHRcdFx0dGhpcy5vUm91dGVyID0gb0NvbnRyb2xsZXIuZ2V0Um91dGVyKCk7XG5cdFx0XHR0aGlzLm9Db21wb25lbnQgPSBvQ29udHJvbGxlcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHR5cGVvZiBvQ29udHJvbGxlci5nZXRPd25lckNvbXBvbmVudCAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMub1JvdXRlciA9IHRoaXMuX2dldFJvdXRlcihvQ29udHJvbGxlcik7XG5cdFx0XHR0aGlzLm9Db21wb25lbnQgPSBvQ29udHJvbGxlci5nZXRPd25lckNvbXBvbmVudCgpIGFzIENvbXBvbmVudDtcblx0XHR9XG5cblx0XHQvLyBzcGVjaWFsIGhhbmRsaW5nIGZvciBTbWFydFRlbXBsYXRlc1xuXHRcdGlmICh0aGlzLm9Db21wb25lbnQgJiYgKHRoaXMub0NvbXBvbmVudCBhcyB7IGdldEFwcENvbXBvbmVudD86IEZ1bmN0aW9uIH0pLmdldEFwcENvbXBvbmVudCkge1xuXHRcdFx0dGhpcy5vQ29tcG9uZW50ID0gKHRoaXMub0NvbXBvbmVudCBhcyB7IGdldEFwcENvbXBvbmVudD86IEZ1bmN0aW9uIH0pLmdldEFwcENvbXBvbmVudD8uKCk7XG5cdFx0fVxuXG5cdFx0aWYgKFxuXHRcdFx0dHlwZW9mIHRoaXMub1JvdXRlciA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuXHRcdFx0dHlwZW9mIHRoaXMub0NvbXBvbmVudCA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuXHRcdFx0dHlwZW9mIHRoaXMub0NvbXBvbmVudC5nZXRDb21wb25lbnREYXRhICE9PSBcImZ1bmN0aW9uXCJcblx0XHQpIHtcblx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0fVxuXG5cdFx0aWYgKHNQYXJhbUhhbmRsaW5nTW9kZSA9PT0gUGFyYW1IYW5kbGluZ01vZGUuVVJMUGFyYW1XaW5zIHx8IHNQYXJhbUhhbmRsaW5nTW9kZSA9PT0gUGFyYW1IYW5kbGluZ01vZGUuSW5zZXJ0SW5TZWxPcHQpIHtcblx0XHRcdHRoaXMuc1BhcmFtSGFuZGxpbmdNb2RlID0gc1BhcmFtSGFuZGxpbmdNb2RlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNQYXJhbUhhbmRsaW5nTW9kZSA9IFBhcmFtSGFuZGxpbmdNb2RlLlNlbFZhcldpbnM7IC8vIGRlZmF1bHRcblx0XHR9XG5cdFx0aWYgKHNNb2RlID09PSBNb2RlLk9EYXRhVjIpIHtcblx0XHRcdHRoaXMuX3NNb2RlID0gc01vZGU7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgc2hlbGwgbmF2aWdhdGlvbiBzZXJ2aWNlLlxuXHQgKiBAcmV0dXJucyBUaGUgTmF2aWdhdGlvbiBzZXJ2aWNlXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cblx0X2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlKCk6IENyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uIHtcblx0XHRjb25zdCB1c2hlbGxDb250YWluZXI6IENvbnRhaW5lciA9IHNhcC51aS5yZXF1aXJlKFwic2FwL3VzaGVsbC9Db250YWluZXJcIik7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG5cdFx0cmV0dXJuIHVzaGVsbENvbnRhaW5lci5nZXRTZXJ2aWNlKFwiQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb25cIikgYXMgQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb247XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBzaGVsbCBuYXZpZ2F0aW9uIHNlcnZpY2UuXG5cdCAqIEByZXR1cm5zIFRoZSBOYXZpZ2F0aW9uIHNlcnZpY2Vcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGFzeW5jIF9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZUFzeW5jKCk6IFByb21pc2U8TmF2aWdhdGlvbj4ge1xuXHRcdGNvbnN0IHVzaGVsbENvbnRhaW5lcjogQ29udGFpbmVyID0gc2FwLnVpLnJlcXVpcmUoXCJzYXAvdXNoZWxsL0NvbnRhaW5lclwiKTtcblx0XHRyZXR1cm4gdXNoZWxsQ29udGFpbmVyXG5cdFx0XHQ/LmdldFNlcnZpY2VBc3luYyhcIk5hdmlnYXRpb25cIilcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvQ3Jvc3NBcHBOYXZTZXJ2aWNlOiBvYmplY3QpIHtcblx0XHRcdFx0cmV0dXJuIG9Dcm9zc0FwcE5hdlNlcnZpY2UgYXMgTmF2aWdhdGlvbjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlcjogTmF2aWdhdGlvbiBpcyBub3QgYXZhaWxhYmxlLlwiKTtcblx0XHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuTk8uWEFQUFNFUlZJQ0VcIik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHJlZmVyZW5jZSB0byB0aGUgcm91dGVyIG9iamVjdCBmb3IgbmF2aWdhdGlvbiBmb3IgdGhpcyBnaXZlbiBDb250cm9sbGVyLlxuXHQgKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIHJlZmVyZW5jZSB0byB0aGUgQ29udHJvbGxlciBmb3Igd2hpY2ggdGhlIFJvdXRlciBpbnN0YW5jZSBzaGFsbCBiZSBkZXRlcm1pbmVkLlxuXHQgKiBAcmV0dXJucyBUaGUgUm91dGVyIGZvciB0aGUgZ2l2ZW4gQ29udHJvbGxlclxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2dldFJvdXRlcihvQ29udHJvbGxlcjogQ29udHJvbGxlcik6IFJvdXRlciB7XG5cdFx0cmV0dXJuIFVJQ29tcG9uZW50LmdldFJvdXRlckZvcihvQ29udHJvbGxlcik7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgdG8gYmUgdXNlZCBvbmx5IGJ5IEZFIFYyIHRvIGdldCBhY2Nlc3MgdG8gdG9FeHRlcm5hbCBwcm9taXNlLlxuXHQgKiBAcGFyYW0gZm5DYWxsYmFjayBDYWxsYmFjayB0byBiZSBjYWxsZWQgYnkgJ25hdmlnYXRlJyBtZXRob2QgaW4gY2FzZSBvZiB0b0V4dGVybmFsIGlzIHVzZWQgdG8gbmF2aWdhdGUuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRyZWdpc3Rlck5hdmlnYXRlQ2FsbGJhY2soZm5DYWxsYmFjazogRnVuY3Rpb24pOiB2b2lkIHtcblx0XHR0aGlzLl9uYXZpZ2F0ZUNhbGxiYWNrID0gZm5DYWxsYmFjaztcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmlnZ2VycyBhIGNyb3NzLWFwcCBuYXZpZ2F0aW9uIGFmdGVyIHNhdmluZyB0aGUgaW5uZXIgYW5kIHRoZSBjcm9zcy1hcHAgc3RhdGVzLiBUaGUgbmF2aWdhdGlvbiBtb2RlIGJhc2VkIG9uXG5cdCAqIDxjb2RlPnNhcC11c2hlbGwtbmV4dC1uYXZtb2RlPC9jb2RlPiBpcyB0YWtlbiBpbnRvIGFjY291bnQuIElmIHNldCB0byA8Y29kZT5leHBsYWNlPC9jb2RlPiB0aGUgaW5uZXIgYXBwIHN0YXRlIHdpbGwgbm90IGJlIGNoYW5nZWQuXG5cdCAqIDxiPk5vdGU6PC9iPiBUaGUgPGNvZGU+c05hdk1vZGU8L2NvZGU+IGFyZ3VtZW50IGNhbiBiZSB1c2VkIHRvIG92ZXJ3cml0ZSB0aGUgU0FQIEZpb3JpIGxhdW5jaHBhZCBkZWZhdWx0IG5hdmlnYXRpb24gZm9yIG9wZW5pbmcgYSBVUkxcblx0ICogaW4tcGxhY2Ugb3IgZXgtcGxhY2UuXG5cdCAqIDxicj5cblx0ICogPGI+Tm9kZTo8L2I+IElmIHRoZSA8Y29kZT5vRXh0ZXJuYWxBcHBEYXRhPC9jb2RlPiBwYXJhbWV0ZXIgaXMgbm90IHN1cHBsaWVkLCB0aGUgZXh0ZXJuYWwgYXBwIGRhdGEgd2lsbCBiZSBjYWxjdWxhdGVkIGJhc2VkIG9uXG5cdCAqIHRoZSA8Y29kZT5vSW5uZXJBcHBEYXRhPC9jb2RlPiBkYXRhLjxicj5cblx0ICogU21hcnRGaWx0ZXJCYXIgY29udHJvbCA8Yj5QYXJhbWV0ZXJzOjwvYj4gPHRhYmxlPlxuXHQgKiA8dHI+XG5cdCAqIDx0ZCBhbGlnbj1cImNlbnRlclwiPntvYmplY3R9PC90ZD5cblx0ICogPHRkPjxiPm9FcnJvcjwvYj48L3RkPlxuXHQgKiA8dGQ+TmF2RXJyb3Igb2JqZWN0IChpbnN0YW5jZSBvZiB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2RXJyb3J9KSB0aGF0IGRlc2NyaWJlcyB3aGljaCBraW5kIG9mIGVycm9yIG9jY3VycmVkPC90ZD5cblx0ICogPHRyPlxuXHQgKiA8dGQgYWxpZ249XCJjZW50ZXJcIj57c3RyaW5nfTwvdGQ+XG5cdCAqIDx0ZD48Yj5vRXJyb3IuZXJyb3JDb2RlPC9iPjwvdGQ+XG5cdCAqIDx0ZD5Db2RlIHRvIGlkZW50aWZ5IHRoZSBlcnJvcjwvdGQ+XG5cdCAqIDx0cj5cblx0ICogPHRkIGFsaWduPVwiY2VudGVyXCI+e3N0cmluZ308L3RkPlxuXHQgKiA8dGQ+PGI+b0Vycm9yLnR5cGU8L2I+PC90ZD5cblx0ICogPHRkPlNldmVyaXR5IG9mIHRoZSBlcnJvciAoaW5mby93YXJuaW5nL2Vycm9yKTwvdGQ+XG5cdCAqIDx0cj5cblx0ICogPHRkIGFsaWduPVwiY2VudGVyXCI+e2FycmF5fTwvdGQ+XG5cdCAqIDx0ZD48Yj5vRXJyb3IucGFyYW1zPC9iPjwvdGQ+XG5cdCAqIDx0ZD5BbiBhcnJheSBvZiBvYmplY3RzICh0eXBpY2FsbHkgc3RyaW5ncykgdGhhdCBkZXNjcmliZSBhZGRpdGlvbmFsIHZhbHVlIHBhcmFtZXRlcnMgcmVxdWlyZWQgZm9yIGdlbmVyYXRpbmcgdGhlIG1lc3NhZ2U8L3RkPlxuXHQgKiA8L3RhYmxlPi5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0gc1NlbWFudGljT2JqZWN0IE5hbWUgb2YgdGhlIHNlbWFudGljIG9iamVjdCBvZiB0aGUgdGFyZ2V0IGFwcFxuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgTmFtZSBvZiB0aGUgYWN0aW9uIG9mIHRoZSB0YXJnZXQgYXBwXG5cdCAqIEBwYXJhbSB2TmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzIGFzIGFuIG9iamVjdCB3aXRoIGtleS92YWx1ZSBwYWlycyBvciBhcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBzdWNoIGFuIG9iamVjdC4gSWYgcGFzc2VkIGFzIGFuIG9iamVjdCwgdGhlIHByb3BlcnRpZXMgYXJlIG5vdCBjaGVja2VkIGFnYWluc3QgdGhlIDxjb2RlPklzUG90ZW50aWFsU2Vuc2l0aXZlPC9jb2RlPiBvciA8Y29kZT5NZWFzdXJlPC9jb2RlPiB0eXBlLlxuXHQgKiBAcGFyYW0gb0lubmVyQXBwRGF0YSBPYmplY3QgZm9yIHN0b3JpbmcgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwXG5cdCAqIEBwYXJhbSBmbk9uRXJyb3IgQ2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBuYXZpZ2F0aW9uIDxicj5cblx0ICogQHBhcmFtIG9FeHRlcm5hbEFwcERhdGEgT2JqZWN0IGZvciBzdG9yaW5nIHRoZSBzdGF0ZSB3aGljaCB3aWxsIGJlIGZvcndhcmRlZCB0byB0aGUgdGFyZ2V0IGNvbXBvbmVudC5cblx0ICogQHBhcmFtIG9FeHRlcm5hbEFwcERhdGEucHJlc2VudGF0aW9uVmFyaWFudCBPYmplY3QgY29udGFpbmluZyB0aGUgY3VycmVudCB1aSBzdGF0ZSBvZiB0aGUgYXBwIHdoaWNoIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZVxuXHQgKiAgICAgICAgdGFyZ2V0IGNvbXBvbmVudC5cblx0ICogQHBhcmFtIG9FeHRlcm5hbEFwcERhdGEudmFsdWVUZXh0cyBPYmplY3QgY29udGFpbmluZyB2YWx1ZSBkZXNjcmlwdGlvbnMgd2hpY2ggd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlIHRhcmdldCBjb21wb25lbnQuXG5cdCAqIEBwYXJhbSBvRXh0ZXJuYWxBcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQgU3RyaW5naWZpZWQgSlNPTiBvYmplY3QsIHdoaWNoIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZSB0YXJnZXQgY29tcG9uZW50LiBJZiBub3Rcblx0ICogICAgICAgIHByb3ZpZGVkIHRoZSBzZWxlY3Rpb25WYXJpYW50IHdpbGwgYmUgY29uc3RydWN0ZWQgYmFzZWQgb24gdGhlIHZOYXZpZ2F0aW9uUGFyYW1ldGVycy5cblx0ICogQHBhcmFtIHNOYXZNb2RlIEFyZ3VtZW50IGlzIHVzZWQgdG8gb3ZlcndyaXRlIHRoZSBGTFAtY29uZmlndXJlZCB0YXJnZXQgZm9yIG9wZW5pbmcgYSBVUkwuIElmIHVzZWQsIG9ubHkgdGhlXG5cdCAqICAgICAgICA8Y29kZT5leHBsYWNlPC9jb2RlPiBvciA8Y29kZT5pbnBsYWNlPC9jb2RlPiB2YWx1ZXMgYXJlIGFsbG93ZWQuIEFueSBvdGhlciB2YWx1ZSB3aWxsIGxlYWQgdG8gYW4gZXhjZXB0aW9uXG5cdCAqICAgICAgICA8Y29kZT5OYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX05BVl9NT0RFPC9jb2RlPi5cblx0ICogQGV4YW1wbGUgPGNvZGU+XG5cdCAqIHNhcC51aS5kZWZpbmUoW1wic2FwL2ZlL25hdmlnYXRpb24vTmF2aWdhdGlvbkhhbmRsZXJcIiwgXCJzYXAvZmUvbmF2aWdhdGlvbi9TZWxlY3Rpb25WYXJpYW50XCJdLCBmdW5jdGlvbiAoTmF2aWdhdGlvbkhhbmRsZXIsIFNlbGVjdGlvblZhcmlhbnQpIHtcblx0ICogXHR2YXIgb05hdmlnYXRpb25IYW5kbGVyID0gbmV3IE5hdmlnYXRpb25IYW5kbGVyKG9Db250cm9sbGVyKTtcblx0ICogXHR2YXIgc1NlbWFudGljT2JqZWN0ID0gXCJTYWxlc09yZGVyXCI7XG5cdCAqIFx0dmFyIHNBY3Rpb25OYW1lID0gXCJjcmVhdGVcIjtcblx0ICpcblx0ICogXHQvL3NpbXBsZSBwYXJhbWV0ZXJzIGFzIE9iamVjdFxuXHQgKiBcdHZhciB2TmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7XG5cdCAqIFx0XHRDb21wYW55Q29kZSA6IFwiMDAwMVwiLFxuXHQgKiBcdFx0Q3VzdG9tZXIgOiBcIkMwMDAxXCJcblx0ICogXHR9O1xuXHQgKlxuXHQgKiBcdC8vb3IgYXMgc2VsZWN0aW9uIHZhcmlhbnRcblx0ICogXHR2YXIgb1NlbGVjdGlvblZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudCgpO1xuXHQgKlx0IG9TZWxlY3Rpb25WYXJpYW50LmFkZFNlbGVjdE9wdGlvbihcIkNvbXBhbnlDb2RlXCIsIFwiSVwiLCBcIkVRXCIsIFwiMDAwMVwiKTtcblx0ICogXHRvU2VsZWN0aW9uVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oXCJDdXN0b21lclwiLCBcIklcIiwgXCJFUVwiLCBcIkMwMDAxXCIpO1xuXHQgKiBcdHZOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IG9TZWxlY3Rpb25WYXJpYW50LnRvSlNPTlN0cmluZygpO1xuXHQgKlxuXHQgKiBcdC8vb3IgZGlyZWN0bHkgZnJvbSBTbWFydEZpbHRlckJhclxuXHQgKiBcdHZOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IG9TbWFydEZpbHRlckJhci5nZXREYXRhU3VpdGVGb3JtYXQoKTtcblx0ICpcblx0ICogXHQvL2FwcCBzdGF0ZSBmb3IgYmFjayBuYXZpZ2F0aW9uXG5cdCAqXHQgdmFyIG9Jbm5lckFwcERhdGEgPSB7XG5cdCAqIFx0XHRzZWxlY3Rpb25WYXJpYW50IDogb1NtYXJ0RmlsdGVyQmFyLmdldERhdGFTdWl0ZUZvcm1hdCgpLFxuXHQgKiBcdFx0dGFibGVWYXJpYW50SWQgOiBvU21hcnRUYWJsZS5nZXRDdXJyZW50VmFyaWFudElkKCksXG5cdCAqIFx0XHRjdXN0b21EYXRhIDogb015Q3VzdG9tRGF0YVxuXHQgKiBcdH07XG5cdCAqXG5cdCAqIFx0Ly8gY2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvcnNcblx0ICogXHR2YXIgZm5PbkVycm9yID0gZnVuY3Rpb24ob0Vycm9yKXtcblx0ICogXHRcdHZhciBvaTE4biA9IG9Db250cm9sbGVyLmdldFZpZXcoKS5nZXRNb2RlbChcImkxOG5cIikuZ2V0UmVzb3VyY2VCdW5kbGUoKTtcblx0ICogXHRcdG9FcnJvci5zZXRVSVRleHQoe29pMThuIDogb2kxOG4sIHNUZXh0S2V5IDogXCJPVVRCT1VORF9OQVZfRVJST1JcIn0pO1xuXHQgKiBcdFx0b0Vycm9yLnNob3dNZXNzYWdlQm94KCk7XG5cdCAqIFx0fTtcblx0ICpcblx0ICogXHRvTmF2aWdhdGlvbkhhbmRsZXIubmF2aWdhdGUoc1NlbWFudGljT2JqZWN0LCBzQWN0aW9uTmFtZSwgdk5hdmlnYXRpb25QYXJhbWV0ZXJzLCBvSW5uZXJBcHBEYXRhLCBmbk9uRXJyb3IpO1xuXHQgKiB9KTtcblx0ICogPC9jb2RlPlxuXHQgKi9cblx0bmF2aWdhdGUoXG5cdFx0c1NlbWFudGljT2JqZWN0OiBzdHJpbmcsXG5cdFx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0XHR2TmF2aWdhdGlvblBhcmFtZXRlcnM6IG9iamVjdCB8IHN0cmluZyxcblx0XHRvSW5uZXJBcHBEYXRhPzogSW5uZXJBcHBEYXRhLFxuXHRcdGZuT25FcnJvcj86IEZ1bmN0aW9uLFxuXHRcdG9FeHRlcm5hbEFwcERhdGE/OiB7XG5cdFx0XHR2YWx1ZVRleHRzPzogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRcdFx0cHJlc2VudGF0aW9uVmFyaWFudD86IG9iamVjdCB8IHVuZGVmaW5lZDtcblx0XHRcdHNlbGVjdGlvblZhcmlhbnQ/OiBvYmplY3QgfCB1bmRlZmluZWQ7XG5cdFx0fSxcblx0XHRzTmF2TW9kZT86IHN0cmluZ1xuXHQpOiB2b2lkIHtcblx0XHRsZXQgc1NlbGVjdGlvblZhcmlhbnQ6IGFueSxcblx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0b1hBcHBEYXRhT2JqOiBhbnksXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMsXG5cdFx0XHRiRXhQbGFjZSA9IGZhbHNlLFxuXHRcdFx0b1RtcERhdGE6IGFueSA9IHt9O1xuXHRcdGNvbnN0IG9OYXZIYW5kbGVyOiBOYXZpZ2F0aW9uSGFuZGxlciA9IHRoaXM7XG5cblx0XHRjb25zdCBvQ29tcG9uZW50RGF0YSA9IHRoaXMub0NvbXBvbmVudC5nZXRDb21wb25lbnREYXRhKCkgYXMgUmVjb3JkPHN0cmluZywgYW55Pjtcblx0XHQvKlxuXHRcdCAqIFRoZXJlIGFyZSBzb21lIHJhY2UgY29uZGl0aW9ucyB3aGVyZSB0aGUgb0NvbXBvbmVudERhdGEgbWF5IG5vdCBiZSBzZXQsIGZvciBleGFtcGxlIGluIGNhc2UgdGhlIFVTaGVsbCB3YXMgbm90IGluaXRpYWxpemVkIHByb3Blcmx5LiBUb1xuXHRcdCAqIG1ha2Ugc3VyZSB0aGF0IHdlIGRvIG5vdCBkdW1wIGhlcmUgd2l0aCBhbiBleGNlcHRpb24sIHdlIHRha2UgdGhpcyBzcGVjaWFsIGVycm9yIGhhbmRsaW5nIGJlaGF2aW9yOlxuXHRcdCAqL1xuXHRcdGlmIChvQ29tcG9uZW50RGF0YSkge1xuXHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzID0gb0NvbXBvbmVudERhdGEuc3RhcnR1cFBhcmFtZXRlcnM7XG5cblx0XHRcdGlmIChcblx0XHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzICYmXG5cdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVyc1tcInNhcC11c2hlbGwtbmV4dC1uYXZtb2RlXCJdICYmXG5cdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVyc1tcInNhcC11c2hlbGwtbmV4dC1uYXZtb2RlXCJdLmxlbmd0aCA+IDBcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBiRXhQbGFjZSA9IChKU09OLnBhcnNlKG9TdGFydHVwUGFyYW1ldGVyc1tcInNhcC11c2hlbGwtbmV4dC1uYXZtb2RlXCJdWzBdKSA9PT0gXCJleHBsYWNlXCIpO1xuXHRcdFx0XHRiRXhQbGFjZSA9IG9TdGFydHVwUGFyYW1ldGVyc1tcInNhcC11c2hlbGwtbmV4dC1uYXZtb2RlXCJdWzBdID09PSBcImV4cGxhY2VcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBvbmx5IG5hdi1tb2RlICdpbnBsYWNlJyBvciAnZXhwbGFjZScgYXJlIHN1cHBvcnRlZC4gQW55IG90aGVyIHZhbHVlIHdpbGwgbGVhZCB0byBhbiBleGNlcHRpb24uXG5cdFx0aWYgKHNOYXZNb2RlICYmIChzTmF2TW9kZSA9PT0gXCJpbnBsYWNlXCIgfHwgc05hdk1vZGUgPT09IFwiZXhwbGFjZVwiKSkge1xuXHRcdFx0YkV4UGxhY2UgPSBzTmF2TW9kZSA9PT0gXCJleHBsYWNlXCI7XG5cdFx0fSBlbHNlIGlmIChzTmF2TW9kZSkge1xuXHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9OQVZfTU9ERVwiKTtcblx0XHR9XG5cblx0XHRpZiAob0V4dGVybmFsQXBwRGF0YSA9PT0gdW5kZWZpbmVkIHx8IG9FeHRlcm5hbEFwcERhdGEgPT09IG51bGwpIHtcblx0XHRcdG9YQXBwRGF0YU9iaiA9IHt9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvWEFwcERhdGFPYmogPSBvRXh0ZXJuYWxBcHBEYXRhO1xuXHRcdH1cblxuXHRcdC8vIGZvciBuYXZpZ2F0aW9uIHdlIG5lZWQgVVJMIHBhcmFtZXRlcnMgKGxlZ2FjeSBuYXZpZ2F0aW9uKSBhbmQgc2FwLXhhcHAtc3RhdGUsIHRoZXJlZm9yZSB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgbWlzc2luZyBvbmUgZnJvbSB0aGVcblx0XHQvLyBwYXNzZWQgb25lXG5cdFx0aWYgKHR5cGVvZiB2TmF2aWdhdGlvblBhcmFtZXRlcnMgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHNTZWxlY3Rpb25WYXJpYW50ID0gdk5hdmlnYXRpb25QYXJhbWV0ZXJzO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZOYXZpZ2F0aW9uUGFyYW1ldGVycyA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0Y29uc3Qgb0VucmljaGVkU2VsVmFyID0gdGhpcy5fc3BsaXRJbmJvdW5kTmF2aWdhdGlvblBhcmFtZXRlcnMoXG5cdFx0XHRcdG5ldyBTZWxlY3Rpb25WYXJpYW50KCksXG5cdFx0XHRcdHZOYXZpZ2F0aW9uUGFyYW1ldGVycyxcblx0XHRcdFx0W11cblx0XHRcdCkub05hdmlnYXRpb25TZWxWYXI7XG5cdFx0XHRzU2VsZWN0aW9uVmFyaWFudCA9IG9FbnJpY2hlZFNlbFZhci50b0pTT05TdHJpbmcoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHR9XG5cblx0XHRvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoc1NlbGVjdGlvblZhcmlhbnQpO1xuXHRcdGlmICh0eXBlb2Ygdk5hdmlnYXRpb25QYXJhbWV0ZXJzID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50ID0gdGhpcy5fcmVtb3ZlVGVjaG5pY2FsUGFyYW1ldGVycyhvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50KTtcblx0XHR9XG5cdFx0b1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudCA9IG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQgJiYgb1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudC50b0pTT05PYmplY3QoKTtcblx0XHRvVG1wRGF0YSA9IHRoaXMuX3JlbW92ZU1lYXN1cmVCYXNlZEluZm9ybWF0aW9uKG9UbXBEYXRhKTsgLy8gcmVtb3ZlIGV2ZW50dWFsIG1lYXN1cmVzXG5cdFx0b1RtcERhdGEgPSB0aGlzLl9jaGVja0lzUG90ZW50aWFsbHlTZW5zaXRpdmUob1RtcERhdGEpOyAvLyByZW1vdmUgZXZlbnR1YWwgc2Vuc2l0aXZlIGRhdGFcblxuXHRcdGlmIChvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0XHRtUGFyYW1ldGVycyA9IHRoaXMuX2dldFVSTFBhcmFtZXRlcnNGcm9tU2VsZWN0aW9uVmFyaWFudChuZXcgU2VsZWN0aW9uVmFyaWFudChvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50KSk7XG5cdFx0XHRzU2VsZWN0aW9uVmFyaWFudCA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQpLnRvSlNPTlN0cmluZygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycyA9IHt9O1xuXHRcdFx0c1NlbGVjdGlvblZhcmlhbnQgPSBudWxsO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9OYXZBcmd1bWVudHM6IGFueSA9IHtcblx0XHRcdHRhcmdldDoge1xuXHRcdFx0XHRzZW1hbnRpY09iamVjdDogc1NlbWFudGljT2JqZWN0LFxuXHRcdFx0XHRhY3Rpb246IHNBY3Rpb25OYW1lXG5cdFx0XHR9LFxuXHRcdFx0cGFyYW1zOiBtUGFyYW1ldGVycyB8fCB7fVxuXHRcdH07XG5cblx0XHRjb25zdCBmbk5hdmlnYXRlID0gYXN5bmMgZnVuY3Rpb24gKG9Dcm9zc0FwcE5hdlNlcnZpY2U6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdFx0aWYgKCFvWEFwcERhdGFPYmouc2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdFx0XHRvWEFwcERhdGFPYmouc2VsZWN0aW9uVmFyaWFudCA9IHNTZWxlY3Rpb25WYXJpYW50O1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBmbk5hdkV4cGxhY2UgPSBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdGNvbnN0IHNOZXdIcmVmUHJvbWlzZSA9IG9Dcm9zc0FwcE5hdlNlcnZpY2UuZ2V0SHJlZihvTmF2QXJndW1lbnRzLCBvTmF2SGFuZGxlci5vQ29tcG9uZW50KTtcblx0XHRcdFx0c05ld0hyZWZQcm9taXNlXG5cdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKHNOZXdIcmVmOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRcdFx0XHRcdG9wZW5XaW5kb3coc05ld0hyZWYpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IHVua25vd24pOiB2b2lkIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJldGlyZXZpbmcgaHJlZkZvckV4dGVybmFsIDogXCIgKyBvRXJyb3IpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fTtcblxuXHRcdFx0b1hBcHBEYXRhT2JqID0gb05hdkhhbmRsZXIuX3JlbW92ZU1lYXN1cmVCYXNlZEluZm9ybWF0aW9uKG9YQXBwRGF0YU9iaik7XG5cdFx0XHRyZXR1cm4gb05hdkhhbmRsZXIuX2ZuU2F2ZUFwcFN0YXRlQXN5bmMob1hBcHBEYXRhT2JqLCBmbk9uRXJyb3IpLnRoZW4oZnVuY3Rpb24gKG9TYXZlQXBwU3RhdGVSZXR1cm46IGFueSk6IHZvaWQge1xuXHRcdFx0XHRpZiAob1NhdmVBcHBTdGF0ZVJldHVybikge1xuXHRcdFx0XHRcdG9OYXZBcmd1bWVudHMuYXBwU3RhdGVLZXkgPSBvU2F2ZUFwcFN0YXRlUmV0dXJuLmFwcFN0YXRlS2V5O1xuXG5cdFx0XHRcdFx0Ly8gUmVtYXJrOlxuXHRcdFx0XHRcdC8vIFRoZSBDcm9zcyBBcHAgU2VydmljZSB0YWtlcyBjYXJlIG9mIGVuY29kaW5nIHBhcmFtZXRlciBrZXlzIGFuZCB2YWx1ZXMuIEV4YW1wbGU6XG5cdFx0XHRcdFx0Ly8gbVBhcmFtcyA9IHsgXCIkQCVcIiA6IFwiJi89XCIgfSByZXN1bHRzIGluIHRoZSBVUkwgcGFyYW1ldGVyICUyNTI0JTI1NDAlMjUyNT0lMjUyNiUyNTJGJTI1M0Rcblx0XHRcdFx0XHQvLyBOb3RlIHRoZSBkb3VibGUgZW5jb2RpbmcsIHRoaXMgaXMgY29ycmVjdC5cblxuXHRcdFx0XHRcdC8vIHRvRXh0ZXJuYWwgc2V0cyBzYXAteGFwcC1zdGF0ZSBpbiB0aGUgVVJMIGlmIGFwcFN0YXRlS2V5IGlzIHByb3ZpZGVkIGluIG9OYXZBcmd1bWVudHNcblx0XHRcdFx0XHQvLyB0b0V4dGVybmFsIGhhcyBpc3N1ZXMgb24gc3RpY2t5IGFwcHMgRklPUklURUNIUDEtMTQ0MDAsIHRlbXAgZml4IHVzaW5nIGhyZWZGb3JFeHRlcm5hbFxuXHRcdFx0XHRcdGlmIChzTmF2TW9kZSA9PSBcImV4cGxhY2VcIikge1xuXHRcdFx0XHRcdFx0Zm5OYXZFeHBsYWNlKCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNvbnN0IHB0b0V4dCA9IG9Dcm9zc0FwcE5hdlNlcnZpY2UubmF2aWdhdGUob05hdkFyZ3VtZW50cywgb05hdkhhbmRsZXIub0NvbXBvbmVudCk7XG5cdFx0XHRcdFx0XHQvLyBUT0RPOiBUaGlzIGlzIGp1c3QgYSB0ZW1wb3Jhcnkgc29sdXRpb24gdG8gYWxsb3cgRkUgVjIgdG8gdXNlIHRvRXh0ZXJuYWwgcHJvbWlzZS5cblx0XHRcdFx0XHRcdGlmIChvTmF2SGFuZGxlci5fbmF2aWdhdGVDYWxsYmFjaykge1xuXHRcdFx0XHRcdFx0XHRvTmF2SGFuZGxlci5fbmF2aWdhdGVDYWxsYmFjayhwdG9FeHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSAvLyBlbHNlIDogZXJyb3Igd2FzIGFscmVhZHkgcmVwb3J0ZWRcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSk7XG5cdFx0fTtcblx0XHRjb25zdCBmblN0b3JlQW5kTmF2aWdhdGUgPSBmdW5jdGlvbiAob0Nyb3NzQXBwTmF2U2VydmljZTogYW55KTogdm9pZCB7XG5cdFx0XHRvTmF2SGFuZGxlclxuXHRcdFx0XHQuc3RvcmVJbm5lckFwcFN0YXRlQXN5bmMob0lubmVyQXBwRGF0YSBhcyBhbnksIHRydWUpXG5cdFx0XHRcdC50aGVuKGFzeW5jIGZ1bmN0aW9uIChzQXBwU3RhdGVLZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdFx0XHRcdGlmIChzQXBwU3RhdGVLZXkpIHtcblx0XHRcdFx0XHRcdG9OYXZIYW5kbGVyLnJlcGxhY2VIYXNoKHNBcHBTdGF0ZUtleSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBmbk5hdmlnYXRlKG9Dcm9zc0FwcE5hdlNlcnZpY2UpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0aWYgKGZuT25FcnJvcikge1xuXHRcdFx0XHRcdFx0Zm5PbkVycm9yKG9FcnJvcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHR9O1xuXHRcdGlmIChzTmF2TW9kZSkge1xuXHRcdFx0b05hdkFyZ3VtZW50cy5wYXJhbXNbXCJzYXAtdXNoZWxsLW5hdm1vZGVcIl0gPSBiRXhQbGFjZSA/IFwiZXhwbGFjZVwiIDogXCJpbnBsYWNlXCI7XG5cdFx0fVxuXHRcdG9OYXZIYW5kbGVyXG5cdFx0XHQuX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlQXN5bmMoKVxuXHRcdFx0LnRoZW4oYXN5bmMgZnVuY3Rpb24gKG9Dcm9zc0FwcE5hdlNlcnZpY2U6IE5hdmlnYXRpb24pIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRjb25zdCBvVGFyZ2V0cyA9IGF3YWl0IChvQ3Jvc3NBcHBOYXZTZXJ2aWNlLmlzTmF2aWdhdGlvblN1cHBvcnRlZChcblx0XHRcdFx0XHRcdFtvTmF2QXJndW1lbnRzXSxcblx0XHRcdFx0XHRcdG9OYXZIYW5kbGVyLm9Db21wb25lbnRcblx0XHRcdFx0XHQpIGFzIHVua25vd24gYXMgUHJvbWlzZTx7IHN1cHBvcnRlZDogYm9vbGVhbiB9W10+KTtcblx0XHRcdFx0XHRpZiAob1RhcmdldHNbMF0uc3VwcG9ydGVkKSB7XG5cdFx0XHRcdFx0XHRpZiAoIWJFeFBsYWNlKSB7XG5cdFx0XHRcdFx0XHRcdGZuU3RvcmVBbmROYXZpZ2F0ZShvQ3Jvc3NBcHBOYXZTZXJ2aWNlKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGZuTmF2aWdhdGUob0Nyb3NzQXBwTmF2U2VydmljZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChmbk9uRXJyb3IpIHtcblx0XHRcdFx0XHRcdC8vIGludGVudCBpcyBub3Qgc3VwcG9ydGVkXG5cdFx0XHRcdFx0XHRjb25zdCBvRXJyb3IgPSBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5pc0ludGVudFN1cHBvcnRlZC5ub3RTdXBwb3J0ZWRcIik7XG5cdFx0XHRcdFx0XHRmbk9uRXJyb3Iob0Vycm9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0XHRcdGlmIChmbk9uRXJyb3IpIHtcblx0XHRcdFx0XHRcdC8vIHRlY2huaWNhbCBlcnJvcjogY291bGQgbm90IGRldGVybWluZSBpZiBpbnRlbnQgaXMgc3VwcG9ydGVkXG5cdFx0XHRcdFx0XHRjb25zdCB0ZWNobmljYWxFcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLmlzSW50ZW50U3VwcG9ydGVkLmZhaWxlZFwiKTtcblx0XHRcdFx0XHRcdGZuT25FcnJvcih0ZWNobmljYWxFcnJvcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdGlmIChmbk9uRXJyb3IpIHtcblx0XHRcdFx0XHRmbk9uRXJyb3Iob0Vycm9yKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogUGFyc2VzIHRoZSBpbmNvbWluZyBVUkwgYW5kIHJldHVybnMgYSBQcm9taXNlLiBJZiB0aGlzIG1ldGhvZCBkZXRlY3RzIGEgYmFjayBuYXZpZ2F0aW9uLCB0aGUgaW5uZXIgYXBwIHN0YXRlIGlzIHJldHVybmVkIGluIHRoZSByZXNvbHZlZFxuXHQgKiBQcm9taXNlLiBPdGhlcndpc2Ugc3RhcnR1cCBwYXJhbWV0ZXJzIHdpbGwgYmUgbWVyZ2VkIGludG8gdGhlIGFwcCBzdGF0ZSBwcm92aWRlZCBieSBjcm9zcyBhcHAgbmF2aWdhdGlvbiwgYW5kIGEgY29tYmluZWQgYXBwIHN0YXRlIHdpbGwgYmVcblx0ICogcmV0dXJuZWQuIFRoZSBjb25mbGljdCByZXNvbHV0aW9uIGNhbiBiZSBpbmZsdWVuY2VkIHdpdGggc1BhcmFtSGFuZGxpbmdNb2RlIGRlZmluZWQgaW4gdGhlIGNvbnN0cnVjdG9yLlxuXHQgKiBAcmV0dXJucyBBIFByb21pc2Ugb2JqZWN0IHRvIG1vbml0b3Igd2hlbiBhbGwgdGhlIGFjdGlvbnMgb2YgdGhlIGZ1bmN0aW9uIGhhdmUgYmVlbiBleGVjdXRlZC4gSWYgdGhlIGV4ZWN1dGlvbiBpcyBzdWNjZXNzZnVsLCB0aGVcblx0ICogICAgICAgICAgZXh0cmFjdGVkIGFwcCBzdGF0ZSwgdGhlIHN0YXJ0dXAgcGFyYW1ldGVycywgYW5kIHRoZSB0eXBlIG9mIG5hdmlnYXRpb24gYXJlIHJldHVybmVkLCBzZWUgYWxzbyB0aGUgZXhhbXBsZSBhYm92ZS4gVGhlIGFwcCBzdGF0ZSBpc1xuXHQgKiAgICAgICAgICBhbiBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOlxuXHQgKiAgICAgICAgICA8dWw+XG5cdCAqICAgICAgICAgIDxsaT48Y29kZT5vQXBwRGF0YS5vU2VsZWN0aW9uVmFyaWFudDwvY29kZT46IEFuIGluc3RhbmNlIG9mIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5TZWxlY3Rpb25WYXJpYW50fVxuXHQgKiAgICAgICAgICBjb250YWluaW5nIG9ubHkgcGFyYW1ldGVycy9zZWxlY3Qgb3B0aW9ucyB0aGF0IGFyZSByZWxhdGVkIHRvIG5hdmlnYXRpb248L2xpPlxuXHQgKiAgICAgICAgICA8bGk+PGNvZGU+b0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudDwvY29kZT46IFRoZSBuYXZpZ2F0aW9uLXJlbGF0ZWQgc2VsZWN0aW9uIHZhcmlhbnQgYXMgYSBKU09OLWZvcm1hdHRlZCBzdHJpbmc8L2xpPlxuXHQgKiAgICAgICAgICA8bGk+PGNvZGU+b0FwcERhdGEub0RlZmF1bHRlZFNlbGVjdGlvblZhcmlhbnQ8L2NvZGU+OiBBbiBpbnN0YW5jZSBvZlxuXHQgKiAgICAgICAgICB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uU2VsZWN0aW9uVmFyaWFudH0gY29udGFpbmluZyBvbmx5IHRoZSBwYXJhbWV0ZXJzL3NlbGVjdCBvcHRpb25zIHRoYXQgYXJlIHNldCBieSB1c2VyXG5cdCAqICAgICAgICAgIGRlZmF1bHQgZGF0YTwvbGk+XG5cdCAqICAgICAgICAgIDxsaT48Y29kZT5vQXBwRGF0YS5iTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5PC9jb2RlPjogQSBCb29sZWFuIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBvbmx5IGRlZmF1bHRlZCBwYXJhbWV0ZXJzIGFuZCBub1xuXHQgKiAgICAgICAgICBuYXZpZ2F0aW9uIHBhcmFtZXRlcnMgYXJlIHByZXNlbnQuPGJyPlxuXHQgKiAgICAgICAgICA8Yj5Ob3RlOjwvYj4gSWYgbm8gbmF2aWdhdGlvbiBwYXJhbWV0ZXJzIGFyZSBhdmFpbGFibGUsIDxjb2RlPmJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHk8L2NvZGU+IGlzIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPixcblx0ICogICAgICAgICAgZXZlbiB0aG91Z2ggcGFyYW1ldGVycyB3aXRob3V0IGRlZmF1bHQgbWlnaHQgYmUgYXZhaWxhYmxlIGFzIHdlbGwuPC9saT5cblx0ICogICAgICAgICAgPC91bD5cblx0ICogICAgICAgICAgSWYgdGhlIG5hdmlnYXRpb24tcmVsYXRlZCBzZWxlY3Rpb24gdmFyaWFudCBpcyBlbXB0eSwgaXQgaXMgcmVwbGFjZWQgYnkgYSBjb3B5IG9mIHRoZSBkZWZhdWx0ZWQgc2VsZWN0aW9uIHZhcmlhbnQuPGJyPlxuXHQgKiAgICAgICAgICBUaGUgbmF2aWdhdGlvbiB0eXBlIGlzIGFuIGVudW1lcmF0aW9uIHR5cGUgb2YgdHlwZSB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2VHlwZX0gKHBvc3NpYmxlIHZhbHVlcyBhcmVcblx0ICogICAgICAgICAgaW5pdGlhbCwgVVJMUGFyYW1zLCB4QXBwU3RhdGUsIGFuZCBpQXBwU3RhdGUpLjxicj5cblx0ICogICAgICAgICAgPGI+Tm90ZTo8L2I+IElmIHRoZSBuYXZpZ2F0aW9uIHR5cGUgaXMge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdlR5cGUuaUFwcFN0YXRlfSBvQXBwRGF0YSBoYXMgdHdvXG5cdCAqICAgICAgICAgIGFkZGl0aW9uYWwgcHJvcGVydGllc1xuXHQgKiAgICAgICAgICA8dWw+XG5cdCAqICAgICAgICAgIDxsaT48Y29kZT5vQXBwRGF0YS50YWJsZVZhcmlhbnRJZDwvY29kZT48L2xpPlxuXHQgKiAgICAgICAgICA8bGk+PGNvZGU+b0FwcERhdGEuY3VzdG9tRGF0YTwvY29kZT48L2xpPlxuXHQgKiAgICAgICAgICA8L3VsPlxuXHQgKiAgICAgICAgICB3aGljaCByZXR1cm4gdGhlIGlubmVyIGFwcCBkYXRhIGFzIHN0b3JlZCBpbiB7QGxpbmsgIy5uYXZpZ2F0ZSBuYXZpZ2F0ZX0gb3Ige0BsaW5rICMuc3RvcmVJbm5lckFwcFN0YXRlQXN5bmMgc3RvcmVJbm5lckFwcFN0YXRlQXN5bmN9LlxuXHQgKiAgICAgICAgICA8Y29kZT5vQXBwRGF0YS5vRGVmYXVsdGVkU2VsZWN0aW9uVmFyaWFudDwvY29kZT4gaXMgYW4gZW1wdHkgc2VsZWN0aW9uIHZhcmlhbnQgYW5kXG5cdCAqICAgICAgICAgIDxjb2RlPm9BcHBEYXRhLmJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHk8L2NvZGU+IGlzIDxjb2RlPmZhbHNlPC9jb2RlPiBpbiB0aGlzIGNhc2UuPGJyPlxuXHQgKiAgICAgICAgICA8Yj5Ob3RlOjwvYj4gSWYgdGhlIG5hdmlnYXRpb24gdHlwZSBpcyB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2VHlwZS5pbml0aWFsfSBvQXBwRGF0YSBpcyBhbiBlbXB0eSBvYmplY3QhPGJyPlxuXHQgKiAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMsIGFuIGVycm9yIG9iamVjdCBvZiB0eXBlIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZFcnJvcn0sIFVSTCBwYXJhbWV0ZXJzIChpZiBhdmFpbGFibGUpXG5cdCAqICAgICAgICAgIGFuZCB0aGUgdHlwZSBvZiBuYXZpZ2F0aW9uIGFyZSByZXR1cm5lZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAZXhhbXBsZSA8Y29kZT5cblx0ICogc2FwLnVpLmRlZmluZShbXCJzYXAvZmUvbmF2aWdhdGlvbi9OYXZpZ2F0aW9uSGFuZGxlclwiXSwgZnVuY3Rpb24gKE5hdmlnYXRpb25IYW5kbGVyKSB7XG5cdCAqIFx0dmFyIG9OYXZpZ2F0aW9uSGFuZGxlciA9IG5ldyBOYXZpZ2F0aW9uSGFuZGxlcihvQ29udHJvbGxlcik7XG5cdCAqIFx0dmFyIG9QYXJzZU5hdmlnYXRpb25Qcm9taXNlID0gb05hdmlnYXRpb25IYW5kbGVyLnBhcnNlTmF2aWdhdGlvbigpO1xuXHQgKlxuXHQgKiBcdG9QYXJzZU5hdmlnYXRpb25Qcm9taXNlLmRvbmUoZnVuY3Rpb24ob0FwcERhdGEsIG9TdGFydHVwUGFyYW1ldGVycywgc05hdlR5cGUpe1xuXHQgKiBcdFx0XHRvU21hcnRGaWx0ZXJCYXIuc2V0RGF0YVN1aXRlRm9ybWF0KG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQpO1xuXHQgKiBcdFx0XHQvLyBvQXBwRGF0YS5vU2VsZWN0aW9uVmFyaWFudCBjYW4gYmUgdXNlZCB0byBtYW5pcHVsYXRlIHRoZSBzZWxlY3Rpb24gdmFyaWFudFxuXHQgKiBcdFx0XHQvLyBvQXBwRGF0YS5vRGVmYXVsdGVkU2VsZWN0aW9uVmFyaWFudCBjb250YWlucyB0aGUgcGFyYW1ldGVycyB3aGljaCBhcmUgc2V0IGJ5IHVzZXIgZGVmYXVsdHNcblx0ICogXHRcdFx0Ly8gb0FwcERhdGEuYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSBpbmRpY2F0ZXMgd2hldGhlciBvbmx5IGRlZmF1bHRlZCBwYXJhbWV0ZXJzIGFuZCBubyBuYXZpZ2F0aW9uIHBhcmFtZXRlcnMgYXJlIHByZXNlbnRcblx0ICogXHR9KTtcblx0ICogXHRvUGFyc2VOYXZpZ2F0aW9uUHJvbWlzZS5mYWlsKGZ1bmN0aW9uKG9FcnJvciwgb1VSTFBhcmFtZXRlcnMsIHNOYXZUeXBlKXtcblx0ICogXHRcdC8vIGlmIGUuZy4gdGhlIHhhcHAgc3RhdGUgY291bGQgbm90IGJlIGxvYWRlZCwgbmV2ZXJ0aGVsZXNzIHRoZXJlIG1heSBiZSBVUkwgcGFyYW1ldGVycyBhdmFpbGFibGVcblx0ICogXHRcdC8vc29tZSBlcnJvciBoYW5kbGluZ1xuXHQgKiBcdH0pO1xuXHQgKiB9KTtcblx0ICogPC9jb2RlPlxuXHQgKi9cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcm9taXNlLWZ1bmN0aW9uLWFzeW5jXG5cdHBhcnNlTmF2aWdhdGlvbigpOiBKUXVlcnkuUHJvbWlzZTx1bmtub3duPiB7XG5cdFx0Y29uc3Qgc0FwcEhhc2ggPSBIYXNoQ2hhbmdlci5nZXRJbnN0YW5jZSgpLmdldEhhc2goKTtcblx0XHQvKlxuXHRcdCAqIHVzZSAuZ2V0SGFzaCgpIGhlcmUgaW5zdGVhZCBvZiAuZ2V0QXBwSGFzaCgpIHRvIGFsc28gYmUgYWJsZSBkZWFsaW5nIHdpdGggZW52aXJvbm1lbnRzIHdoZXJlIG9ubHkgU0FQVUk1IGlzIGxvYWRlZCBhbmQgdGhlIFVTaGVsbCBpc1xuXHRcdCAqIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseS5cblx0XHQgKi9cblx0XHRjb25zdCBzSUFwcFN0YXRlID0gdGhpcy5fZ2V0SW5uZXJBcHBTdGF0ZUtleShzQXBwSGFzaCk7XG5cblx0XHRsZXQgb0NvbXBvbmVudERhdGEgPSB0aGlzLm9Db21wb25lbnQuZ2V0Q29tcG9uZW50RGF0YSgpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdC8qXG5cdFx0ICogVGhlcmUgYXJlIHNvbWUgcmFjZSBjb25kaXRpb25zIHdoZXJlIHRoZSBvQ29tcG9uZW50RGF0YSBtYXkgbm90IGJlIHNldCwgZm9yIGV4YW1wbGUgaW4gY2FzZSB0aGUgVVNoZWxsIHdhcyBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkuIFRvXG5cdFx0ICogbWFrZSBzdXJlIHRoYXQgd2UgZG8gbm90IGR1bXAgaGVyZSB3aXRoIGFuIGV4Y2VwdGlvbiwgd2UgdGFrZSB0aGlzIHNwZWNpYWwgZXJyb3IgaGFuZGxpbmcgYmVoYXZpb3I6XG5cdFx0ICovXG5cdFx0aWYgKG9Db21wb25lbnREYXRhID09PSB1bmRlZmluZWQpIHtcblx0XHRcdExvZy53YXJuaW5nKFwiVGhlIG5hdmlnYXRpb24gQ29tcG9uZW50J3MgZGF0YSB3YXMgbm90IHNldCBwcm9wZXJseTsgYXNzdW1pbmcgaW5zdGVhZCB0aGF0IG5vIHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkLlwiKTtcblx0XHRcdG9Db21wb25lbnREYXRhID0ge307XG5cdFx0fVxuXG5cdFx0Ly8gUmVtYXJrOlxuXHRcdC8vIFRoZSBzdGFydHVwIHBhcmFtZXRlcnMgYXJlIGFscmVhZHkgZGVjb2RlZC4gRXhhbXBsZTpcblx0XHQvLyBUaGUgb3JpZ2luYWwgVVJMIHBhcmFtZXRlciAlMjUyNCUyNTQwJTI1MjU9JTI1MjYlMjUyRiUyNTNEIHJlc3VsdHMgaW4gb1N0YXJ0dXBQYXJhbWV0ZXJzID0geyBcIiRAJVwiIDogXCImLz1cIiB9XG5cdFx0Ly8gTm90ZSB0aGUgZG91YmxlIGVuY29kaW5nIGluIHRoZSBVUkwsIHRoaXMgaXMgY29ycmVjdC4gQW4gVVJMIHBhcmFtZXRlciBsaWtlIHh5ej0lMjUgY2F1c2VzIGFuIFwiVVJJIG1hbGZvcm1lZFwiIGVycm9yLlxuXHRcdC8vIElmIHRoZSBkZWNvZGVkIHZhbHVlIHNob3VsZCBiZSBlLmcuIFwiJTI1XCIsIHRoZSBwYXJhbWV0ZXIgaW4gdGhlIFVSTCBuZWVkcyB0byBiZTogeHl6PSUyNTI1MjVcblx0XHRjb25zdCBvU3RhcnR1cFBhcmFtZXRlcnMgPSBvQ29tcG9uZW50RGF0YS5zdGFydHVwUGFyYW1ldGVycyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXHRcdGNvbnN0IGh5YnJpZElBcHBTdGF0ZUtleVBhcmFtczogc3RyaW5nIHwgdW5kZWZpbmVkID0gb1N0YXJ0dXBQYXJhbWV0ZXJzPy5bSFlCUklEX0lBUFBfU1RBVEVfS0VZXT8uWzBdO1xuXHRcdGNvbnN0IGh5YnJpZERlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCkgYXMgSlF1ZXJ5LkRlZmVycmVkPHVua25vd24+O1xuXHRcdGxldCBpQXBwU3RhdGVIeWJyaWREZWZlcnJlZDogSlF1ZXJ5LkRlZmVycmVkPHVua25vd24+IHwgdW5kZWZpbmVkO1xuXHRcdGlmIChoeWJyaWRJQXBwU3RhdGVLZXlQYXJhbXMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aUFwcFN0YXRlSHlicmlkRGVmZXJyZWQgPSB0aGlzLl9sb2FkQXBwU3RhdGUoaHlicmlkSUFwcFN0YXRlS2V5UGFyYW1zLCBoeWJyaWREZWZlcnJlZCwgTmF2VHlwZS5oeWJyaWQpO1xuXHRcdH1cblxuXHRcdGxldCBhRGVmYXVsdGVkUGFyYW1ldGVyczogYW55ID0gW107XG5cdFx0aWYgKFxuXHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzICYmXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnNbREVGQVVMVEVEX1BBUkFNRVRFUl9QUk9QRVJUWV0gJiZcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVyc1tERUZBVUxURURfUEFSQU1FVEVSX1BST1BFUlRZXS5sZW5ndGggPiAwXG5cdFx0KSB7XG5cdFx0XHRhRGVmYXVsdGVkUGFyYW1ldGVycyA9IEpTT04ucGFyc2Uob1N0YXJ0dXBQYXJhbWV0ZXJzW0RFRkFVTFRFRF9QQVJBTUVURVJfUFJPUEVSVFldWzBdKTtcblx0XHR9XG5cblx0XHRjb25zdCBvTXlEZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpIGFzIEpRdWVyeS5EZWZlcnJlZDx1bmtub3duPjtcblxuXHRcdGNvbnN0IG9OYXZIYW5kbGVyID0gdGhpcztcblx0XHRjb25zdCBwYXJzZVVybFBhcmFtcyA9IGZ1bmN0aW9uIChcblx0XHRcdG9TdWJTdGFydHVwUGFyYW1ldGVyczogYW55LFxuXHRcdFx0YVN1YkRlZmF1bHRlZFBhcmFtZXRlcnM6IGFueSxcblx0XHRcdG9TdWJNeURlZmVycmVkOiBKUXVlcnkuRGVmZXJyZWQ8dW5rbm93bj4sXG5cdFx0XHRzTmF2VHlwZTogc3RyaW5nXG5cdFx0KTogdm9pZCB7XG5cdFx0XHQvLyBzdGFuZGFyZCBVUkwgbmF2aWdhdGlvblxuXHRcdFx0Y29uc3Qgb1NlbFZhcnMgPSBvTmF2SGFuZGxlci5fc3BsaXRJbmJvdW5kTmF2aWdhdGlvblBhcmFtZXRlcnMoXG5cdFx0XHRcdG5ldyBTZWxlY3Rpb25WYXJpYW50KCksXG5cdFx0XHRcdG9TdWJTdGFydHVwUGFyYW1ldGVycyxcblx0XHRcdFx0YVN1YkRlZmF1bHRlZFBhcmFtZXRlcnNcblx0XHRcdCk7XG5cdFx0XHQvLyBGb3Igc2NlbmFyaW8sIHdoZXJlIG9ubHkgaHlicmlkSUFwcFN0YXRlS2V5IGlzIHBhcnQgb2YgdXJsUGFyYW1zLCB3ZSBpZ25vcmUgdGhpcyBjb25kaXRpb25cblx0XHRcdGlmIChvU2VsVmFycy5vTmF2aWdhdGlvblNlbFZhci5pc0VtcHR5KCkgJiYgb1NlbFZhcnMub0RlZmF1bHRlZFNlbFZhci5pc0VtcHR5KCkgJiYgc05hdlR5cGUgIT09IE5hdlR5cGUuaHlicmlkKSB7XG5cdFx0XHRcdC8vIFN0YXJ0dXAgcGFyYW1ldGVycyBjb250YWluIG9ubHkgdGVjaG5pY2FsIHBhcmFtZXRlcnMgKFNBUCBzeXN0ZW0pIHdoaWNoIHdlcmUgZmlsdGVyZWQgb3V0LlxuXHRcdFx0XHQvLyBvTmF2aWdhdGlvblNlbFZhciBhbmQgb0RlZmF1bHRlZFNlbFZhciBhcmUgZW1wdHkuXG5cdFx0XHRcdC8vIFRodXMsIGNvbnNpZGVyIHRoaXMgdHlwZSBvZiBuYXZpZ2F0aW9uIGFzIGFuIGluaXRpYWwgbmF2aWdhdGlvbi5cblx0XHRcdFx0aWYgKHNOYXZUeXBlID09PSBOYXZUeXBlLnhBcHBTdGF0ZSkge1xuXHRcdFx0XHRcdGNvbnN0IG9FcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLmdldERhdGFGcm9tQXBwU3RhdGUuZmFpbGVkXCIpO1xuXHRcdFx0XHRcdG9TdWJNeURlZmVycmVkLnJlamVjdChvRXJyb3IsIG9TdWJTdGFydHVwUGFyYW1ldGVycyB8fCB7fSwgTmF2VHlwZS54QXBwU3RhdGUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9TdWJNeURlZmVycmVkLnJlc29sdmUoe30sIG9TdWJTdGFydHVwUGFyYW1ldGVycywgTmF2VHlwZS5pbml0aWFsKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgb0FwcFN0YXRlRGF0YTogYW55ID0ge307XG5cdFx0XHRcdG9BcHBTdGF0ZURhdGEuc2VsZWN0aW9uVmFyaWFudCA9IG9TZWxWYXJzLm9OYXZpZ2F0aW9uU2VsVmFyLnRvSlNPTlN0cmluZygpO1xuXHRcdFx0XHRvQXBwU3RhdGVEYXRhLm9TZWxlY3Rpb25WYXJpYW50ID0gb1NlbFZhcnMub05hdmlnYXRpb25TZWxWYXI7XG5cdFx0XHRcdG9BcHBTdGF0ZURhdGEub0RlZmF1bHRlZFNlbGVjdGlvblZhcmlhbnQgPSBvU2VsVmFycy5vRGVmYXVsdGVkU2VsVmFyO1xuXHRcdFx0XHRvQXBwU3RhdGVEYXRhLmJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHkgPSBvU2VsVmFycy5iTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5O1xuXG5cdFx0XHRcdC8vIG5vIHNhcC14YXBwLXN0YXRlIGJ1dCBuYXZUeXBlIGlzIGh5YnJpZCwgZXh0cmFjdCB0aGUgSUFwcFN0YXRlRGF0YVxuXHRcdFx0XHRpZiAoc05hdlR5cGUgPT09IE5hdlR5cGUuaHlicmlkKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc3VjY2Vzc0hhbmRsZXJIeWJyaWRTdGF0ZSA9IGZ1bmN0aW9uIChpQXBwU3RhdGVEYXRhOiB1bmtub3duLCBfcmVmOiB1bmtub3duLCBuYXZUeXBlOiB1bmtub3duKTogdm9pZCB7XG5cdFx0XHRcdFx0XHRvQXBwU3RhdGVEYXRhLmlBcHBTdGF0ZSA9IGlBcHBTdGF0ZURhdGE7XG5cdFx0XHRcdFx0XHRvU3ViTXlEZWZlcnJlZC5yZXNvbHZlKG9BcHBTdGF0ZURhdGEsIG9TdGFydHVwUGFyYW1ldGVycywgbmF2VHlwZSk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRjb25zdCBmYWlsdXJlSGFuZGxlckh5YnJpZFN0YXRlID0gZnVuY3Rpb24gKG9FcnJvcjogb2JqZWN0LCBfcmVmOiBvYmplY3QsIG5hdlR5cGU6IHN0cmluZyk6IHZvaWQge1xuXHRcdFx0XHRcdFx0b1N1Yk15RGVmZXJyZWQucmVqZWN0KG9FcnJvciwgX3JlZiwgbmF2VHlwZSk7XG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGlmIChpQXBwU3RhdGVIeWJyaWREZWZlcnJlZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRpQXBwU3RhdGVIeWJyaWREZWZlcnJlZC5kb25lKHN1Y2Nlc3NIYW5kbGVySHlicmlkU3RhdGUpO1xuXHRcdFx0XHRcdFx0aUFwcFN0YXRlSHlicmlkRGVmZXJyZWQuZmFpbChmYWlsdXJlSGFuZGxlckh5YnJpZFN0YXRlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b1N1Yk15RGVmZXJyZWQucmVzb2x2ZShvQXBwU3RhdGVEYXRhLCBvU3ViU3RhcnR1cFBhcmFtZXRlcnMsIHNOYXZUeXBlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdFx0aWYgKHNJQXBwU3RhdGUpIHtcblx0XHRcdC8vIGlubmVyIGFwcCBzdGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIEFwcEhhc2ggKGJhY2sgbmF2aWdhdGlvbik7IGV4dHJhY3QgdGhlIHBhcmFtZXRlciB2YWx1ZVxuXHRcdFx0dGhpcy5fbG9hZEFwcFN0YXRlKHNJQXBwU3RhdGUsIG9NeURlZmVycmVkLCBOYXZUeXBlLmlBcHBTdGF0ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIG5vIGJhY2sgbmF2aWdhdGlvblxuXHRcdFx0Y29uc3QgYklzWGFwcFN0YXRlTmF2aWdhdGlvbiA9IG9Db21wb25lbnREYXRhW1wic2FwLXhhcHAtc3RhdGVcIl0gIT09IHVuZGVmaW5lZDtcblx0XHRcdGlmIChiSXNYYXBwU3RhdGVOYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdGNvbnN0IHRoYXQgPSB0aGlzO1xuXHRcdFx0XHQvLyBpbm5lciBhcHAgc3RhdGUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgQXBwSGFzaCwgYnV0IHhhcHAgc3RhdGUgPT4gdHJ5IHRvIHJlYWQgdGhlIHhhcHAgc3RhdGVcblx0XHRcdFx0dGhpcy5fZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2VBc3luYygpXG5cdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9Dcm9zc0FwcE5hdlNlcnZpY2U6IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9Dcm9zc0FwcE5hdlNlcnZpY2UuZ2V0U3RhcnR1cEFwcFN0YXRlKHRoYXQub0NvbXBvbmVudCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0Vycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuZ2V0U3RhcnR1cFN0YXRlLmZhaWxlZFwiKTtcblx0XHRcdFx0XHRcdG9NeURlZmVycmVkLnJlamVjdChvRXJyb3IsIHt9LCBOYXZUeXBlLnhBcHBTdGF0ZSk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Byb21pc2UtZnVuY3Rpb24tYXN5bmNcblx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAob0FwcFN0YXRlOiBTaGVsbEFwcFN0YXRlKTogSlF1ZXJ5LlByb21pc2U8dW5rbm93bj4gfCB1bmRlZmluZWQge1xuXHRcdFx0XHRcdFx0Ly8gZ2V0IGFwcCBzdGF0ZSBmcm9tIHNhcC14YXBwLXN0YXRlLFxuXHRcdFx0XHRcdFx0Ly8gY3JlYXRlIGEgY29weSwgbm90IG9ubHkgYSByZWZlcmVuY2UsIGJlY2F1c2Ugd2Ugd2FudCB0byBtb2RpZnkgdGhlIG9iamVjdFxuXHRcdFx0XHRcdFx0bGV0IG9BcHBTdGF0ZURhdGEgPSBvQXBwU3RhdGUuZ2V0RGF0YSgpO1xuXHRcdFx0XHRcdFx0bGV0IG9FcnJvcjtcblx0XHRcdFx0XHRcdGlmIChvQXBwU3RhdGVEYXRhKSB7XG5cdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0b0FwcFN0YXRlRGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob0FwcFN0YXRlRGF0YSkpO1xuXHRcdFx0XHRcdFx0XHR9IGNhdGNoICh4KSB7XG5cdFx0XHRcdFx0XHRcdFx0b0Vycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuQXBwU3RhdGVEYXRhLnBhcnNlRXJyb3JcIik7XG5cdFx0XHRcdFx0XHRcdFx0b015RGVmZXJyZWQucmVqZWN0KG9FcnJvciwgb1N0YXJ0dXBQYXJhbWV0ZXJzLCBOYXZUeXBlLnhBcHBTdGF0ZSk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9NeURlZmVycmVkLnByb21pc2UoKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAob0FwcFN0YXRlRGF0YSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvU2VsVmFyID0gbmV3IFNlbGVjdGlvblZhcmlhbnQob0FwcFN0YXRlRGF0YS5zZWxlY3Rpb25WYXJpYW50KTtcblxuXHRcdFx0XHRcdFx0XHRjb25zdCBvU2VsVmFycyA9IG9OYXZIYW5kbGVyLl9zcGxpdEluYm91bmROYXZpZ2F0aW9uUGFyYW1ldGVycyhcblx0XHRcdFx0XHRcdFx0XHRvU2VsVmFyLFxuXHRcdFx0XHRcdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0XHRhRGVmYXVsdGVkUGFyYW1ldGVyc1xuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRvQXBwU3RhdGVEYXRhLnNlbGVjdGlvblZhcmlhbnQgPSBvU2VsVmFycy5vTmF2aWdhdGlvblNlbFZhci50b0pTT05TdHJpbmcoKTtcblx0XHRcdFx0XHRcdFx0b0FwcFN0YXRlRGF0YS5vU2VsZWN0aW9uVmFyaWFudCA9IG9TZWxWYXJzLm9OYXZpZ2F0aW9uU2VsVmFyO1xuXHRcdFx0XHRcdFx0XHRvQXBwU3RhdGVEYXRhLm9EZWZhdWx0ZWRTZWxlY3Rpb25WYXJpYW50ID0gb1NlbFZhcnMub0RlZmF1bHRlZFNlbFZhcjtcblx0XHRcdFx0XHRcdFx0b0FwcFN0YXRlRGF0YS5iTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5ID0gb1NlbFZhcnMuYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc3VjY2Vzc0hhbmRsZXJIeWJyaWRTdGF0ZSA9IGZ1bmN0aW9uIChpQXBwU3RhdGVEYXRhOiB1bmtub3duLCBfcmVmOiB1bmtub3duLCBuYXZUeXBlOiB1bmtub3duKTogdm9pZCB7XG5cdFx0XHRcdFx0XHRcdFx0b0FwcFN0YXRlRGF0YS5pQXBwU3RhdGUgPSBpQXBwU3RhdGVEYXRhO1xuXHRcdFx0XHRcdFx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUob0FwcFN0YXRlRGF0YSwgb1N0YXJ0dXBQYXJhbWV0ZXJzLCBuYXZUeXBlKTtcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgZmFpbHVyZUhhbmRsZXJIeWJyaWRTdGF0ZSA9IGZ1bmN0aW9uIChlcnJvcjogb2JqZWN0LCBfcmVmOiBvYmplY3QsIG5hdlR5cGU6IHN0cmluZyk6IHZvaWQge1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuZ2V0QXBwU3RhdGUuZmFpbGVkXCIpO1xuXHRcdFx0XHRcdFx0XHRcdG9NeURlZmVycmVkLnJlamVjdChlcnJvciwgX3JlZiwgbmF2VHlwZSk7XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdGlmIChoeWJyaWRJQXBwU3RhdGVLZXlQYXJhbXMgIT09IHVuZGVmaW5lZCAmJiBpQXBwU3RhdGVIeWJyaWREZWZlcnJlZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0aUFwcFN0YXRlSHlicmlkRGVmZXJyZWQuZG9uZShzdWNjZXNzSGFuZGxlckh5YnJpZFN0YXRlKTtcblx0XHRcdFx0XHRcdFx0XHRpQXBwU3RhdGVIeWJyaWREZWZlcnJlZC5mYWlsKGZhaWx1cmVIYW5kbGVySHlicmlkU3RhdGUpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG9BcHBTdGF0ZURhdGFbSFlCUklEX0lBUFBfU1RBVEVfS0VZXSkge1xuXHRcdFx0XHRcdFx0XHRcdHRoYXQuX2xvYWRBcHBTdGF0ZShvQXBwU3RhdGVEYXRhW0hZQlJJRF9JQVBQX1NUQVRFX0tFWV0gYXMgc3RyaW5nLCBoeWJyaWREZWZlcnJlZCwgTmF2VHlwZS5oeWJyaWQpLmRvbmUoXG5cdFx0XHRcdFx0XHRcdFx0XHRzdWNjZXNzSGFuZGxlckh5YnJpZFN0YXRlXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKG9BcHBTdGF0ZURhdGEsIG9TdGFydHVwUGFyYW1ldGVycywgTmF2VHlwZS54QXBwU3RhdGUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG9TdGFydHVwUGFyYW1ldGVycykge1xuXHRcdFx0XHRcdFx0XHRwYXJzZVVybFBhcmFtcyhvU3RhcnR1cFBhcmFtZXRlcnMsIGFEZWZhdWx0ZWRQYXJhbWV0ZXJzLCBvTXlEZWZlcnJlZCwgTmF2VHlwZS54QXBwU3RhdGUpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gc2FwLXhhcHAtc3RhdGUgbmF2aWdhdGlvbiwgYnV0IElEIGhhcyBhbHJlYWR5IGV4cGlyZWQsIGJ1dCBVUkwgcGFyYW1ldGVycyBhdmFpbGFibGVcblx0XHRcdFx0XHRcdFx0b0Vycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuZ2V0RGF0YUZyb21BcHBTdGF0ZS5mYWlsZWRcIik7XG5cdFx0XHRcdFx0XHRcdG9NeURlZmVycmVkLnJlamVjdChvRXJyb3IsIG9TdGFydHVwUGFyYW1ldGVycyB8fCB7fSwgTmF2VHlwZS54QXBwU3RhdGUpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9FcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLl9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZUFzeW5jLmZhaWxlZFwiKTtcblx0XHRcdFx0XHRcdG9NeURlZmVycmVkLnJlamVjdChvRXJyb3IsIHt9LCBOYXZUeXBlLnhBcHBTdGF0ZSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2UgaWYgKG9TdGFydHVwUGFyYW1ldGVycykge1xuXHRcdFx0XHQvLyBubyBzYXAteGFwcC1zdGF0ZVxuXHRcdFx0XHRwYXJzZVVybFBhcmFtcyhcblx0XHRcdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0YURlZmF1bHRlZFBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0b015RGVmZXJyZWQsXG5cdFx0XHRcdFx0aHlicmlkSUFwcFN0YXRlS2V5UGFyYW1zICE9PSB1bmRlZmluZWQgPyBOYXZUeXBlLmh5YnJpZCA6IE5hdlR5cGUuVVJMUGFyYW1zXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBpbml0aWFsIG5hdmlnYXRpb25cblx0XHRcdFx0b015RGVmZXJyZWQucmVzb2x2ZSh7fSwge30sIE5hdlR5cGUuaW5pdGlhbCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9NeURlZmVycmVkLnByb21pc2UoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBhcHBsaWNhdGlvbiBzcGVjaWZpYyB0ZWNobmljYWwgcGFyYW1ldGVycy4gVGVjaG5pY2FsIHBhcmFtZXRlcnMgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIHNlbGVjdGlvbiB2YXJpYW50IHBhc3NlZCB0byB0aGVcblx0ICogYXBwbGljYXRpb24uIEFzIGEgZGVmYXVsdCB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgY29uc2lkZXJlZCBhcyB0ZWNobmljYWwgcGFyYW1ldGVyczpcblx0ICogPHVsPlxuXHQgKiA8bGk+PGNvZGU+c2FwLXN5c3RlbTwvY29kZT48L2xpPlxuXHQgKiA8bGk+PGNvZGU+c2FwLXVzaGVsbC1kZWZhdWx0ZWRQYXJhbWV0ZXJOYW1lczwvY29kZT48L2xpPlxuXHQgKiA8bGk+PGNvZGU+XCJoY3BBcHBsaWNhdGlvbklkXCI8L2NvZGU+PC9saT5cblx0ICogPC91bD4uXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIGFUZWNobmljYWxQYXJhbWV0ZXJzIExpc3Qgb2YgcGFyYW1ldGVyIG5hbWVzIHRvIGJlIGNvbnNpZGVyZWQgYXMgdGVjaG5pY2FsIHBhcmFtZXRlcnMuIDxjb2RlPm51bGw8L2NvZGU+IG9yXG5cdCAqICAgICAgICA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IG1heSBiZSB1c2VkIHRvIHJlc2V0IHRoZSBjb21wbGV0ZSBsaXN0LlxuXHQgKi9cblx0c2V0VGVjaG5pY2FsUGFyYW1ldGVycyhhVGVjaG5pY2FsUGFyYW1ldGVycz86IGFueVtdKTogdm9pZCB7XG5cdFx0aWYgKCFhVGVjaG5pY2FsUGFyYW1ldGVycykge1xuXHRcdFx0YVRlY2huaWNhbFBhcmFtZXRlcnMgPSBbXTtcblx0XHR9XG5cblx0XHRpZiAoIUFycmF5LmlzQXJyYXkoYVRlY2huaWNhbFBhcmFtZXRlcnMpKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlcjogcGFyYW1ldGVyIGluY29ycmVjdCwgYXJyYXkgb2Ygc3RyaW5ncyBleHBlY3RlZFwiKTtcblx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0fVxuXG5cdFx0dGhpcy5fYVRlY2huaWNhbFBhcmFtYXRlcnMgPSBhVGVjaG5pY2FsUGFyYW1ldGVycztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBhcHBsaWNhdGlvbiBzcGVjaWZpYyB0ZWNobmljYWwgcGFyYW1ldGVycy4gVGVjaG5pY2FsIHBhcmFtZXRlcnMgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIHNlbGVjdGlvbiB2YXJpYW50IHBhc3NlZCB0byB0aGVcblx0ICogYXBwbGljYXRpb24uIEFzIGEgZGVmYXVsdCB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgY29uc2lkZXJlZCBhcyB0ZWNobmljYWwgcGFyYW1ldGVyczpcblx0ICogPHVsPlxuXHQgKiA8bGk+PGNvZGU+c2FwLXN5c3RlbTwvY29kZT48L2xpPlxuXHQgKiA8bGk+PGNvZGU+c2FwLXVzaGVsbC1kZWZhdWx0ZWRQYXJhbWV0ZXJOYW1lczwvY29kZT48L2xpPlxuXHQgKiA8bGk+PGNvZGU+XCJoY3BBcHBsaWNhdGlvbklkXCI8L2NvZGU+PC9saT5cblx0ICogPC91bD4uXG5cdCAqIEBwdWJsaWNcblx0ICogQHJldHVybnMgQW4gQXJyYXkgY29udGFpbmluZyB0aGUgdGVjaG5pY2FsIHBhcmFtZXRlcnMuXG5cdCAqL1xuXHRnZXRUZWNobmljYWxQYXJhbWV0ZXJzKCk6IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gdGhpcy5fYVRlY2huaWNhbFBhcmFtYXRlcnMuY29uY2F0KFtdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIHBhc3NlZCBwYXJhbWV0ZXIgaXMgY29uc2lkZXJlZCBhcyB0ZWNobmljYWwgcGFyYW1ldGVyLlxuXHQgKiBAcGFyYW0gc1BhcmFtZXRlck5hbWUgTmFtZSBvZiBhIHJlcXVlc3QgcGFyYW1ldGVyLCBjb25zaWRlcmVkIGFzIHRlY2huaWNhbCBwYXJhbWV0ZXIuXG5cdCAqIEByZXR1cm5zIEluZGljYXRlcyBpZiB0aGUgcGFyYW1ldGVyIGlzIGNvbnNpZGVyZWQgYXMgdGVjaG5pY2FsIHBhcmFtZXRlciBvciBub3QuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfaXNUZWNobmljYWxQYXJhbWV0ZXIoc1BhcmFtZXRlck5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGlmIChzUGFyYW1ldGVyTmFtZSkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQhKFxuXHRcdFx0XHRcdHNQYXJhbWV0ZXJOYW1lID09PSBcInNhcC11aS1mZS12YXJpYW50LWlkXCIgfHxcblx0XHRcdFx0XHRzUGFyYW1ldGVyTmFtZSA9PT0gXCJzYXAtdWktZmUtdGFibGUtdmFyaWFudC1pZFwiIHx8XG5cdFx0XHRcdFx0c1BhcmFtZXRlck5hbWUgPT09IFwic2FwLXVpLWZlLWNoYXJ0LXZhcmlhbnQtaWRcIiB8fFxuXHRcdFx0XHRcdHNQYXJhbWV0ZXJOYW1lID09PSBcInNhcC11aS1mZS1maWx0ZXJiYXItdmFyaWFudC1pZFwiXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRpZiAoc1BhcmFtZXRlck5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwic2FwLVwiKSA9PT0gMCkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMuX2FUZWNobmljYWxQYXJhbWF0ZXJzLmluY2x1ZGVzKHNQYXJhbWV0ZXJOYW1lKSkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdF9pc0ZFUGFyYW1ldGVyKHNQYXJhbWV0ZXJOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gc1BhcmFtZXRlck5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwic2FwLXVpLWZlXCIpID09PSAwO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJtb3ZlcyBpZiB0aGUgcGFzc2VkIHBhcmFtZXRlciBpcyBjb25zaWRlcmVkIGFzIHRlY2huaWNhbCBwYXJhbWV0ZXIuXG5cdCAqIEBwYXJhbSBvU2VsZWN0aW9uVmFyaWFudCBTZWxlY3Rpb24gVmFyaWFudCB3aGljaCBjb25zaXN0cyBvZiB0ZWNobmljYWwgUGFyYW1ldGVycy5cblx0ICogQHJldHVybnMgU2VsZWN0aW9uIFZhcmlhbnQgd2l0aG91dCB0ZWNobmljYWwgUGFyYW1ldGVycy5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9yZW1vdmVUZWNobmljYWxQYXJhbWV0ZXJzKG9TZWxlY3Rpb25WYXJpYW50OiBTZWxlY3Rpb25WYXJpYW50KTogU2VsZWN0aW9uVmFyaWFudCB7XG5cdFx0bGV0IHNQcm9wTmFtZSwgaTtcblx0XHRjb25zdCBhU2VsVmFyUHJvcE5hbWVzID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMoKTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgYVNlbFZhclByb3BOYW1lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0c1Byb3BOYW1lID0gYVNlbFZhclByb3BOYW1lc1tpXTtcblx0XHRcdGlmICh0aGlzLl9pc1RlY2huaWNhbFBhcmFtZXRlcihzUHJvcE5hbWUpKSB7XG5cdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50LnJlbW92ZVNlbGVjdE9wdGlvbihzUHJvcE5hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb1NlbGVjdGlvblZhcmlhbnQ7XG5cdH1cblxuXHQvKipcblx0ICogU3BsaXRzIHRoZSBwYXJhbWV0ZXJzIHByb3ZpZGVkIGR1cmluZyBpbmJvdW5kIG5hdmlnYXRpb24gYW5kIHNlcGFyYXRlcyB0aGUgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBiZXR3ZWVuIGRlZmF1bHRlZCBwYXJhbWV0ZXIgdmFsdWVzIGFuZFxuXHQgKiBuYXZpZ2F0aW9uIHBhcmFtZXRlcnMuXG5cdCAqIEBwYXJhbSBvU2VsZWN0aW9uVmFyaWFudCBJbnN0YW5jZSBvZiB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uU2VsZWN0aW9uVmFyaWFudH0gY29udGFpbmluZyBuYXZpZ2F0aW9uIGRhdGEgb2Zcblx0ICogICAgICAgIHRoZSBhcHBcblx0ICogQHBhcmFtIG9TdGFydHVwUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyBzdGFydHVwIHBhcmFtZXRlcnMgb2YgdGhlIGFwcCAoZGVyaXZlZCBmcm9tIHRoZSBjb21wb25lbnQpXG5cdCAqIEBwYXJhbSBhRGVmYXVsdGVkUGFyYW1ldGVycyBBcnJheSBjb250YWluaW5nIGRlZmF1bHRlZCBwYXJhbWV0ZXIgbmFtZXNcblx0ICogQHJldHVybnMgT2JqZWN0IGNvbnRhaW5pbmcgdHdvIFNlbGVjdGlvblZhcmlhbnRzLCBvbmUgZm9yIG5hdmlnYXRpb24gKG9OYXZpZ2F0aW9uU2VsVmFyKSBhbmQgb25lIGZvciBkZWZhdWx0ZWQgc3RhcnR1cCBwYXJhbWV0ZXJzXG5cdCAqICAgICAgICAgIChvRGVmYXVsdGVkU2VsVmFyKSwgYW5kIGEgZmxhZyAoYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSkgaW5kaWNhdGluZyB3aGV0aGVyIGFsbCBwYXJhbWV0ZXJzIHdlcmUgZGVmYXVsdGVkLiBUaGUgZnVuY3Rpb24gaXNcblx0ICogICAgICAgICAgaGFuZGVkIHR3byBvYmplY3RzIGNvbnRhaW5pbmcgcGFyYW1ldGVycyAobmFtZXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsdWVzKSwgb1NlbGVjdGlvblZhcmlhbnQgYW5kIG9TdGFydHVwUGFyYW1ldGVycy4gQVxuXHQgKiAgICAgICAgICBwYXJhbWV0ZXIgY291bGQgYmUgc3RvcmVkIGluIGp1c3Qgb25lIG9mIHRoZXNlIHR3byBvYmplY3RzIG9yIGluIGJvdGggb2YgdGhlbSBzaW11bHRhbmVvdXNseS4gQmVjYXVzZSBvZiB0aGUgbGF0dGVyIGNhc2UgYVxuXHQgKiAgICAgICAgICBwYXJhbWV0ZXIgY291bGQgYmUgYXNzb2NpYXRlZCB3aXRoIGNvbmZsaWN0aW5nIHZhbHVlcyBhbmQgaXQgaXMgdGhlIGpvYiBvZiB0aGlzIGZ1bmN0aW9uIHRvIHJlc29sdmUgYW55IHN1Y2ggY29uZmxpY3QuIFBhcmFtZXRlcnNcblx0ICogICAgICAgICAgYXJlIGFzc2lnbmVkIHRvIHRoZSB0d28gcmV0dXJuZWQgU2VsZWN0aW9uVmFyaWFudHMsIG9OYXZpZ2F0aW9uU2VsVmFyIGFuZCBvRGVmYXVsdGVkU2VsVmFyLCBhcyBmb2xsb3dzOiB8IHBhcmFtZXRlciBOT1QgaW4gfFxuXHQgKiAgICAgICAgICBwYXJhbWV0ZXIgaW4gfCBvU2VsZWN0aW9uVmFyaWFudCB8IG9TZWxlY3Rpb25WYXJpYW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0gcGFyYW1ldGVyIE5PVCBpbiB8XG5cdCAqICAgICAgICAgIG5vdGhpbmcgdG8gZG8gfCBBZGQgcGFyYW1ldGVyIG9TdGFydHVwUGFyYW1ldGVycyB8IGhlcmUgfCAoc2VlIGJlbG93KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCAqICAgICAgICAgIHBhcmFtZXRlciBpbiB8IEFkZCBwYXJhbWV0ZXIgfCBDb25mbGljdCByZXNvbHV0aW9uIG9TdGFydHVwUGFyYW1ldGVycyB8IChzZWUgYmVsb3cpIHwgKHNlZSBiZWxvdykgQWRkIHBhcmFtZXRlcjogaWYgcGFyYW1ldGVyIGluXG5cdCAqICAgICAgICAgIGFEZWZhdWx0ZWRQYXJhbWV0ZXJzOiBhZGQgcGFyYW1ldGVyIHRvIG9EZWZhdWx0ZWRTZWxWYXIgZWxzZTogYWRkIHBhcmFtZXRlciB0byBvTmF2aWdhdGlvblNlbFZhciBDb25mbGljdCByZXNvbHV0aW9uOiBpZiBwYXJhbWV0ZXJcblx0ICogICAgICAgICAgaW4gYURlZmF1bHRlZFBhcmFtZXRlcnM6IGFkZCBwYXJhbWV0ZXIgdmFsdWUgZnJvbSBvU2VsZWN0aW9uVmFyaWFudCB0byBvTmF2aWdhdGlvblNlbFZhciBhZGQgcGFyYW1ldGVyIHZhbHVlIGZyb21cblx0ICogICAgICAgICAgb1N0YXJ0dXBQYXJhbWV0ZXJzIHRvIG9EZWZhdWx0ZWRTZWxWYXIgTm90ZTogVGhpcyBjYXNlIG9ubHkgb2NjdXJzIGluIFVJNSAxLjMyLiBJbiBsYXRlciB2ZXJzaW9ucyBVU2hlbGwgc3RvcmVzIGFueSBkZWZhdWx0ZWRcblx0ICogICAgICAgICAgcGFyYW1ldGVyIGVpdGhlciBpbiBvU2VsZWN0aW9uVmFyaWFudCBvciBvU3RhcnR1cFBhcmFtZXRlcnMgYnV0IG5ldmVyIHNpbXVsdGFuZW91c2x5IGluIGJvdGguIGVsc2U6IENob29zZSAxIG9mIHRoZSBmb2xsb3dpbmdcblx0ICogICAgICAgICAgb3B0aW9ucyBiYXNlZCBvbiBnaXZlbiBoYW5kbGluZyBtb2RlICh0aGlzLnNQYXJhbUhhbmRsaW5nTW9kZSkuIC0+IGFkZCBwYXJhbWV0ZXIgdmFsdWUgZnJvbSBvU3RhcnR1cFBhcmFtZXRlcnMgdG9cblx0ICogICAgICAgICAgb05hdmlnYXRpb25TZWxWYXIgfCAtPiBhZGQgcGFyYW1ldGVyIHZhbHVlIGZyb20gb0FwcFN0YXRlLnNlbGVjdGlvblZhcmlhbnQgdG8gb05hdmlnYXRpb25TZWxWYXIgLT4gYWRkIGJvdGggcGFyYW1ldGVyIHZhbHVlcyB0b1xuXHQgKiAgICAgICAgICBuYXZpZ2F0aW9uU2VsVmFyIElmIG5hdmlnYXRpb25TZWxWYXIgaXMgc3RpbGwgZW1wdHkgYXQgdGhlIGVuZCBvZiBleGVjdXRpb24sIG5hdmlnYXRpb25TZWxWYXIgaXMgcmVwbGFjZWQgYnkgYSBjb3B5IG9mXG5cdCAqICAgICAgICAgIG9EZWZhdWx0ZWRTZWxWYXIgYW5kIHRoZSBmbGFnIGJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHkgaXMgc2V0IHRvIHRydWUuIFRoZSBzZWxlY3Rpb24gdmFyaWFudCBvRGVmYXVsdGVkU2VsVmFyIGl0c2VsZiBpcyBhbHdheXNcblx0ICogICAgICAgICAgcmV0dXJuZWQgYXMgaXMuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfc3BsaXRJbmJvdW5kTmF2aWdhdGlvblBhcmFtZXRlcnMoXG5cdFx0b1NlbGVjdGlvblZhcmlhbnQ6IFNlbGVjdGlvblZhcmlhbnQsXG5cdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuXHRcdGFEZWZhdWx0ZWRQYXJhbWV0ZXJzOiBhbnlbXVxuXHQpOiB7XG5cdFx0b05hdmlnYXRpb25TZWxWYXI6IFNlbGVjdGlvblZhcmlhbnQ7XG5cdFx0b0RlZmF1bHRlZFNlbFZhcjogU2VsZWN0aW9uVmFyaWFudDtcblx0XHRiTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5OiBib29sZWFuO1xuXHR9IHtcblx0XHRpZiAoIUFycmF5LmlzQXJyYXkoYURlZmF1bHRlZFBhcmFtZXRlcnMpKSB7XG5cdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUXCIpO1xuXHRcdH1cblxuXHRcdGxldCBzUHJvcE5hbWUsIGk7XG5cdFx0Ly8gRmlyc3Qgd2UgZG8gc29tZSBwYXJzaW5nIG9mIHRoZSBTdGFydFVwIFBhcmFtZXRlcnMuXG5cdFx0Y29uc3Qgb1N0YXJ0dXBQYXJhbWV0ZXJzQWRqdXN0ZWQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcblx0XHRmb3IgKHNQcm9wTmFtZSBpbiBvU3RhcnR1cFBhcmFtZXRlcnMpIHtcblx0XHRcdGlmICghb1N0YXJ0dXBQYXJhbWV0ZXJzLmhhc093blByb3BlcnR5KHNQcm9wTmFtZSkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGlmIChzUHJvcE5hbWUgPT09IFNBUF9TWVNURU1fUFJPUEVSVFkgfHwgc1Byb3BOYW1lID09PSBERUZBVUxURURfUEFSQU1FVEVSX1BST1BFUlRZKSB7XG5cdFx0XHRpZiAodGhpcy5faXNUZWNobmljYWxQYXJhbWV0ZXIoc1Byb3BOYW1lKSB8fCB0aGlzLl9pc0ZFUGFyYW1ldGVyKHNQcm9wTmFtZSkgfHwgc1Byb3BOYW1lID09PSBIWUJSSURfSUFQUF9TVEFURV9LRVkpIHtcblx0XHRcdFx0Ly8gRG8gbm90IGFkZCB0aGUgU0FQIHN5c3RlbSBwYXJhbWV0ZXIgdG8gdGhlIHNlbGVjdGlvbiB2YXJpYW50IGFzIGl0IGlzIGEgdGVjaG5pY2FsIHBhcmFtZXRlclxuXHRcdFx0XHQvLyBub3QgcmVsZXZhbnQgZm9yIHRoZSBzZWxlY3Rpb24gdmFyaWFudC5cblx0XHRcdFx0Ly8gRG8gbm90IGFkZCB0aGUgc3RhcnR1cCBwYXJhbWV0ZXIgZm9yIGRlZmF1bHQgdmFsdWVzIHRvIHRoZSBzZWxlY3Rpb24gdmFyaWFudC4gVGhlIGluZm9ybWF0aW9uLCB3aGljaCBwYXJhbWV0ZXJzXG5cdFx0XHRcdC8vIGFyZSBkZWZhdWx0ZWQsIGlzIGF2YWlsYWJsZSBpbiB0aGUgZGVmYXVsdGVkIHNlbGVjdGlvbiB2YXJpYW50LlxuXHRcdFx0XHQvLyBJbiBjYXNlLCBGRSBQYXJhbWV0ZXJzIHdlIHNoYWxsIHNraXAgaXQuKHRoZSBhcHBsaWNhdGlvbiBuZWVkcyB0byBmZXRjaCBpdCBmcm9tIFVSTCBwYXJhbXMpXG5cdFx0XHRcdC8vIFNraXAgdGhlIGh5YnJpZElBcHBTdGF0ZUtleSBwcmVzZW50IGFzIHBhcnQgb2YgJ0h5YnJpZCcgbmF2aWdhdGlvbiB0eXBlIG5vdCByZWxldmFudCBmb3IgdGhlIHNlbGVjdGlvbiB2YXJpYW50XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXZSBzdXBwb3J0IHBhcmFtZXRlcnMgYXMgYSBtYXAgd2l0aCBzdHJpbmdzIGFuZCBhcyBhIG1hcCB3aXRoIHZhbHVlIGFycmF5c1xuXHRcdFx0aWYgKHR5cGVvZiBvU3RhcnR1cFBhcmFtZXRlcnNbc1Byb3BOYW1lXSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZFtzUHJvcE5hbWVdID0gb1N0YXJ0dXBQYXJhbWV0ZXJzW3NQcm9wTmFtZV07XG5cdFx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob1N0YXJ0dXBQYXJhbWV0ZXJzW3NQcm9wTmFtZV0pICYmIG9TdGFydHVwUGFyYW1ldGVyc1tzUHJvcE5hbWVdLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZFtzUHJvcE5hbWVdID0gb1N0YXJ0dXBQYXJhbWV0ZXJzW3NQcm9wTmFtZV1bMF07IC8vIHNpbmdsZS12YWx1ZWQgcGFyYW1ldGVyc1xuXHRcdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9TdGFydHVwUGFyYW1ldGVyc1tzUHJvcE5hbWVdKSAmJiBvU3RhcnR1cFBhcmFtZXRlcnNbc1Byb3BOYW1lXS5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkW3NQcm9wTmFtZV0gPSBvU3RhcnR1cFBhcmFtZXRlcnNbc1Byb3BOYW1lXTsgLy8gbXVsdGktdmFsdWVkIHBhcmFtZXRlcnNcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ29uc3RydWN0IHR3byBzZWxlY3Rpb24gdmFyaWFudHMgZm9yIGRlZmF1bHRzIGFuZCBuYXZpZ2F0aW9uIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbi5cblx0XHRjb25zdCBvRGVmYXVsdGVkU2VsVmFyID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoKTtcblx0XHRjb25zdCBvTmF2aWdhdGlvblNlbFZhciA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KCk7XG5cblx0XHRjb25zdCBhU2VsVmFyUHJvcE5hbWVzID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0UGFyYW1ldGVyTmFtZXMoKS5jb25jYXQob1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMoKSk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGFTZWxWYXJQcm9wTmFtZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHNQcm9wTmFtZSA9IGFTZWxWYXJQcm9wTmFtZXNbaV07XG5cdFx0XHRpZiAoc1Byb3BOYW1lIGluIG9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkKSB7XG5cdFx0XHRcdC8vIFJlc29sdmUgY29uZmxpY3QuXG5cdFx0XHRcdGlmIChhRGVmYXVsdGVkUGFyYW1ldGVycy5pbmNsdWRlcyhzUHJvcE5hbWUpKSB7XG5cdFx0XHRcdFx0b05hdmlnYXRpb25TZWxWYXIubWFzc0FkZFNlbGVjdE9wdGlvbihzUHJvcE5hbWUsIG9TZWxlY3Rpb25WYXJpYW50LmdldFZhbHVlKHNQcm9wTmFtZSkhKTtcblx0XHRcdFx0XHR0aGlzLl9hZGRQYXJhbWV0ZXJWYWx1ZXMob0RlZmF1bHRlZFNlbFZhciwgc1Byb3BOYW1lLCBcIklcIiwgXCJFUVwiLCBvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZFtzUHJvcE5hbWVdKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzd2l0Y2ggKHRoaXMuc1BhcmFtSGFuZGxpbmdNb2RlKSB7XG5cdFx0XHRcdFx0XHRjYXNlIFBhcmFtSGFuZGxpbmdNb2RlLlNlbFZhcldpbnM6XG5cdFx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uU2VsVmFyLm1hc3NBZGRTZWxlY3RPcHRpb24oc1Byb3BOYW1lLCBvU2VsZWN0aW9uVmFyaWFudC5nZXRWYWx1ZShzUHJvcE5hbWUpISk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBQYXJhbUhhbmRsaW5nTW9kZS5VUkxQYXJhbVdpbnM6XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2FkZFBhcmFtZXRlclZhbHVlcyhvTmF2aWdhdGlvblNlbFZhciwgc1Byb3BOYW1lLCBcIklcIiwgXCJFUVwiLCBvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZFtzUHJvcE5hbWVdKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFBhcmFtSGFuZGxpbmdNb2RlLkluc2VydEluU2VsT3B0OlxuXHRcdFx0XHRcdFx0XHRvTmF2aWdhdGlvblNlbFZhci5tYXNzQWRkU2VsZWN0T3B0aW9uKHNQcm9wTmFtZSwgb1NlbGVjdGlvblZhcmlhbnQuZ2V0VmFsdWUoc1Byb3BOYW1lKSEpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9hZGRQYXJhbWV0ZXJWYWx1ZXMob05hdmlnYXRpb25TZWxWYXIsIHNQcm9wTmFtZSwgXCJJXCIsIFwiRVFcIiwgb1N0YXJ0dXBQYXJhbWV0ZXJzQWRqdXN0ZWRbc1Byb3BOYW1lXSk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoYURlZmF1bHRlZFBhcmFtZXRlcnMuaW5jbHVkZXMoc1Byb3BOYW1lKSkge1xuXHRcdFx0XHQvLyBwYXJhbWV0ZXIgb25seSBpbiBTZWxWYXJcblx0XHRcdFx0b0RlZmF1bHRlZFNlbFZhci5tYXNzQWRkU2VsZWN0T3B0aW9uKHNQcm9wTmFtZSwgb1NlbGVjdGlvblZhcmlhbnQuZ2V0VmFsdWUoc1Byb3BOYW1lKSEpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b05hdmlnYXRpb25TZWxWYXIubWFzc0FkZFNlbGVjdE9wdGlvbihzUHJvcE5hbWUsIG9TZWxlY3Rpb25WYXJpYW50LmdldFZhbHVlKHNQcm9wTmFtZSkhKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKHNQcm9wTmFtZSBpbiBvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZCkge1xuXHRcdFx0Ly8gVGhlIGNhc2Ugd2hlcmUgdGhlIHBhcmFtZXRlciBhcHBlYXJzIHR3aWNlIGhhcyBhbHJlYWR5IGJlZW4gdGFrZW4gY2FyZSBvZiBhYm92ZSBzbyB3ZSBza2lwIGl0IGhlcmUuXG5cdFx0XHRpZiAoYVNlbFZhclByb3BOYW1lcy5pbmNsdWRlcyhzUHJvcE5hbWUpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYURlZmF1bHRlZFBhcmFtZXRlcnMuaW5jbHVkZXMoc1Byb3BOYW1lKSkge1xuXHRcdFx0XHR0aGlzLl9hZGRQYXJhbWV0ZXJWYWx1ZXMob0RlZmF1bHRlZFNlbFZhciwgc1Byb3BOYW1lLCBcIklcIiwgXCJFUVwiLCBvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZFtzUHJvcE5hbWVdKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX2FkZFBhcmFtZXRlclZhbHVlcyhvTmF2aWdhdGlvblNlbFZhciwgc1Byb3BOYW1lLCBcIklcIiwgXCJFUVwiLCBvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZFtzUHJvcE5hbWVdKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyB0aGUgc2VsZWN0aW9uIHZhcmlhbnQgdXNlZCBmb3IgbmF2aWdhdGlvbiBzaG91bGQgYmUgZmlsbGVkIHdpdGggZGVmYXVsdHMgaW4gY2FzZSB0aGF0IG9ubHkgZGVmYXVsdHMgZXhpc3Rcblx0XHRsZXQgYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSA9IGZhbHNlO1xuXHRcdGlmIChvTmF2aWdhdGlvblNlbFZhci5pc0VtcHR5KCkpIHtcblx0XHRcdGJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHkgPSB0cnVlO1xuXHRcdFx0Y29uc3QgYVByb3BOYW1lcyA9IG9EZWZhdWx0ZWRTZWxWYXIuZ2V0U2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMoKTtcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBhUHJvcE5hbWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdG9OYXZpZ2F0aW9uU2VsVmFyLm1hc3NBZGRTZWxlY3RPcHRpb24oYVByb3BOYW1lc1tpXSwgb0RlZmF1bHRlZFNlbFZhci5nZXRWYWx1ZShhUHJvcE5hbWVzW2ldKSEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRvTmF2aWdhdGlvblNlbFZhcjogb05hdmlnYXRpb25TZWxWYXIsXG5cdFx0XHRvRGVmYXVsdGVkU2VsVmFyOiBvRGVmYXVsdGVkU2VsVmFyLFxuXHRcdFx0Yk5hdlNlbFZhckhhc0RlZmF1bHRzT25seTogYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seVxuXHRcdH07XG5cdH1cblxuXHRfYWRkUGFyYW1ldGVyVmFsdWVzKFxuXHRcdG9TZWxWYXJpYW50OiBTZWxlY3Rpb25WYXJpYW50LFxuXHRcdHNQcm9wTmFtZTogc3RyaW5nLFxuXHRcdHNTaWduOiBzdHJpbmcsXG5cdFx0c09wdGlvbjogc3RyaW5nLFxuXHRcdG9WYWx1ZXM6IHN0cmluZyB8IHN0cmluZ1tdXG5cdCk6IHZvaWQge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KG9WYWx1ZXMpKSB7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG9WYWx1ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0b1NlbFZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKHNQcm9wTmFtZSwgc1NpZ24sIHNPcHRpb24sIG9WYWx1ZXNbaV0pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRvU2VsVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oc1Byb3BOYW1lLCBzU2lnbiwgc09wdGlvbiwgb1ZhbHVlcyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgdGhlIFVSTCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc0FwcFN0YXRlS2V5LiBBcyBhbiByZWFjdGlvbiByb3V0ZSBjaGFuZ2UgZXZlbnQgd2lsbCBiZSB0cmlnZ2VyZWQuXG5cdCAqIEBwYXJhbSBzQXBwU3RhdGVLZXkgVGhlIG5ldyBhcHAgc3RhdGUga2V5LlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRyZXBsYWNlSGFzaChzQXBwU3RhdGVLZXk6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IG9IYXNoQ2hhbmdlciA9IHRoaXMub1JvdXRlci5vSGFzaENoYW5nZXIgPyB0aGlzLm9Sb3V0ZXIub0hhc2hDaGFuZ2VyIDogSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRjb25zdCBzQXBwSGFzaE9sZCA9IG9IYXNoQ2hhbmdlci5nZXRIYXNoKCk7XG5cdFx0Lypcblx0XHQgKiB1c2UgLmdldEhhc2goKSBoZXJlIGluc3RlYWQgb2YgLmdldEFwcEhhc2goKSB0byBhbHNvIGJlIGFibGUgZGVhbGluZyB3aXRoIGVudmlyb25tZW50cyB3aGVyZSBvbmx5IFNBUFVJNSBpcyBsb2FkZWQgYW5kIHRoZSBVU2hlbGwgaXNcblx0XHQgKiBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkuXG5cdFx0ICovXG5cdFx0Y29uc3Qgc0FwcEhhc2hOZXcgPSB0aGlzLl9yZXBsYWNlSW5uZXJBcHBTdGF0ZUtleShzQXBwSGFzaE9sZCwgc0FwcFN0YXRlS2V5KTtcblx0XHRvSGFzaENoYW5nZXIucmVwbGFjZUhhc2goc0FwcEhhc2hOZXcpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgdGhlIFVSTCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgYXBwIHN0YXRlIGFuZCBzdG9yZXMgdGhlIGFwcCBzdGF0ZSBmb3IgbGF0ZXIgcmV0cmlldmFsLlxuXHQgKiBAcGFyYW0gbUlubmVyQXBwRGF0YSBPYmplY3QgY29udGFpbmluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwXG5cdCAqIEBwYXJhbSBiSW1tZWRpYXRlSGFzaFJlcGxhY2UgSWYgc2V0IHRvIGZhbHNlLCB0aGUgaW5uZXIgYXBwIGhhc2ggd2lsbCBub3QgYmUgcmVwbGFjZWQgdW50aWwgc3RvcmluZyBpcyBzdWNjZXNzZnVsOyBkbyBub3Rcblx0ICogICAgICAgIHNldCB0byBmYWxzZSBpZiB5b3UgY2Fubm90IHJlYWN0IHRvIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBQcm9taXNlLCBmb3IgZXhhbXBsZSwgd2hlbiBjYWxsaW5nIHRoZSBiZWZvcmVMaW5rUHJlc3NlZCBldmVudFxuXHQgKiBAcGFyYW0gYlNraXBIYXNoUmVwbGFjZSBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGlubmVyIGFwcCBoYXNoIHdpbGwgbm90IGJlIHJlcGxhY2VkIGluIHRoZSBzdG9yZUlubmVyQXBwU3RhdGVBc3luYy4gQWxzbyB0aGUgYkltbWVkaWF0ZUhhc2hSZXBsYWNlXG5cdCAqIFx0XHQgIHdpbGwgYmUgaWdub3JlZC5cblx0ICogQHJldHVybnMgQSBQcm9taXNlIG9iamVjdCB0byBtb25pdG9yIHdoZW4gYWxsIHRoZSBhY3Rpb25zIG9mIHRoZSBmdW5jdGlvbiBoYXZlIGJlZW4gZXhlY3V0ZWQ7IGlmIHRoZSBleGVjdXRpb24gaXMgc3VjY2Vzc2Z1bCwgdGhlXG5cdCAqICAgICAgICAgIGFwcCBzdGF0ZSBrZXkgaXMgcmV0dXJuZWQ7IGlmIGFuIGVycm9yIG9jY3VycywgYW4gb2JqZWN0IG9mIHR5cGUge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdkVycm9yfSBpc1xuXHQgKiAgICAgICAgICByZXR1cm5lZFxuXHQgKiBAcHVibGljXG5cdCAqIEBleGFtcGxlIDxjb2RlPlxuXHQgKiBzYXAudWkuZGVmaW5lKFtcInNhcC9mZS9uYXZpZ2F0aW9uL05hdmlnYXRpb25IYW5kbGVyXCJdLCBmdW5jdGlvbiAoTmF2aWdhdGlvbkhhbmRsZXIpIHtcblx0ICogXHR2YXIgb05hdmlnYXRpb25IYW5kbGVyID0gbmV3IE5hdmlnYXRpb25IYW5kbGVyKG9Db250cm9sbGVyKTtcblx0ICogXHR2YXIgbUlubmVyQXBwRGF0YSA9IHtcblx0ICogXHRcdHNlbGVjdGlvblZhcmlhbnQgOiBvU21hcnRGaWx0ZXJCYXIuZ2V0RGF0YVN1aXRlRm9ybWF0KCksXG5cdCAqIFx0XHR0YWJsZVZhcmlhbnRJZCA6IG9TbWFydFRhYmxlLmdldEN1cnJlbnRWYXJpYW50SWQoKSxcblx0ICogXHRcdGN1c3RvbURhdGEgOiBvTXlDdXN0b21EYXRhXG5cdCAqIFx0fTtcblx0ICpcblx0ICogXHR2YXIgb1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UgPSBvTmF2aWdhdGlvbkhhbmRsZXIuc3RvcmVJbm5lckFwcFN0YXRlQXN5bmMobUlubmVyQXBwRGF0YSk7XG5cdCAqXG5cdCAqIFx0b1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UuZG9uZShmdW5jdGlvbihzQXBwU3RhdGVLZXkpe1xuXHQgKiBcdFx0Ly95b3VyIGlubmVyIGFwcCBzdGF0ZSBpcyBzYXZlZCBub3csIHNBcHBTdGF0ZUtleSB3YXMgYWRkZWQgdG8gVVJMXG5cdCAqIFx0XHQvL3BlcmZvcm0gYWN0aW9ucyB0aGF0IG11c3QgcnVuIGFmdGVyIHNhdmVcblx0ICogXHR9KTtcblx0ICpcblx0ICogXHRvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZS5mYWlsKGZ1bmN0aW9uKG9FcnJvcil7XG5cdCAqIFx0XHQvL3NvbWUgZXJyb3IgaGFuZGxpbmdcblx0ICogXHR9KTtcblx0ICogfSk7XG5cdCAqIDwvY29kZT5cblx0ICovXG5cdHN0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jKFxuXHRcdG1Jbm5lckFwcERhdGE6IElubmVyQXBwRGF0YSxcblx0XHRiSW1tZWRpYXRlSGFzaFJlcGxhY2U/OiBib29sZWFuLFxuXHRcdGJTa2lwSGFzaFJlcGxhY2U/OiBib29sZWFuXG5cdCk6IGpRdWVyeS5Qcm9taXNlPHN0cmluZz4ge1xuXHRcdGlmICh0eXBlb2YgYkltbWVkaWF0ZUhhc2hSZXBsYWNlICE9PSBcImJvb2xlYW5cIikge1xuXHRcdFx0YkltbWVkaWF0ZUhhc2hSZXBsYWNlID0gdHJ1ZTsgLy8gZGVmYXVsdFxuXHRcdH1cblx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXM7XG5cdFx0Y29uc3Qgb015RGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKTtcblxuXHRcdGNvbnN0IGZuUmVwbGFjZUhhc2ggPSBmdW5jdGlvbiAoc0FwcFN0YXRlS2V5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRcdGNvbnN0IG9IYXNoQ2hhbmdlciA9IG9OYXZIYW5kbGVyLm9Sb3V0ZXIub0hhc2hDaGFuZ2VyID8gb05hdkhhbmRsZXIub1JvdXRlci5vSGFzaENoYW5nZXIgOiBIYXNoQ2hhbmdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdFx0Y29uc3Qgc0FwcEhhc2hPbGQgPSBvSGFzaENoYW5nZXIuZ2V0SGFzaCgpO1xuXHRcdFx0Lypcblx0XHRcdCAqIHVzZSAuZ2V0SGFzaCgpIGhlcmUgaW5zdGVhZCBvZiAuZ2V0QXBwSGFzaCgpIHRvIGFsc28gYmUgYWJsZSBkZWFsaW5nIHdpdGggZW52aXJvbm1lbnRzIHdoZXJlIG9ubHkgU0FQVUk1IGlzIGxvYWRlZCBhbmQgdGhlIFVTaGVsbFxuXHRcdFx0ICogaXMgbm90IGluaXRpYWxpemVkIHByb3Blcmx5LlxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBzQXBwSGFzaE5ldyA9IG9OYXZIYW5kbGVyLl9yZXBsYWNlSW5uZXJBcHBTdGF0ZUtleShzQXBwSGFzaE9sZCwgc0FwcFN0YXRlS2V5KTtcblx0XHRcdG9IYXNoQ2hhbmdlci5yZXBsYWNlSGFzaChzQXBwSGFzaE5ldyk7XG5cdFx0fTtcblxuXHRcdC8vIGluIGNhc2UgbUlubmVyQXBwU3RhdGUgaXMgZW1wdHksIGRvIG5vdCBvdmVyd3JpdGUgdGhlIGxhc3Qgc2F2ZWQgc3RhdGVcblx0XHRpZiAoaXNFbXB0eU9iamVjdChtSW5uZXJBcHBEYXRhIGFzIG9iamVjdCkpIHtcblx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUoXCJcIik7XG5cdFx0XHRyZXR1cm4gb015RGVmZXJyZWQucHJvbWlzZSgpO1xuXHRcdH1cblxuXHRcdC8vIGNoZWNrIGlmIHdlIGFscmVhZHkgc2F2ZWQgdGhlIHNhbWUgZGF0YVxuXHRcdGNvbnN0IHNBcHBTdGF0ZUtleUNhY2hlZCA9IHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEuc0FwcFN0YXRlS2V5O1xuXG5cdFx0Y29uc3QgYklubmVyQXBwRGF0YUVxdWFsID0gSlNPTi5zdHJpbmdpZnkobUlubmVyQXBwRGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEub0FwcERhdGEpO1xuXHRcdGlmIChiSW5uZXJBcHBEYXRhRXF1YWwgJiYgc0FwcFN0YXRlS2V5Q2FjaGVkKSB7XG5cdFx0XHQvLyBwYXNzZWQgaW5uZXIgYXBwIHN0YXRlIGZvdW5kIGluIGNhY2hlXG5cdFx0XHR0aGlzLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLmlDYWNoZUhpdCsrO1xuXG5cdFx0XHQvLyByZXBsYWNlIGlubmVyIGFwcCBoYXNoIHdpdGggY2FjaGVkIGFwcFN0YXRlS2V5IGluIHVybCAoanVzdCBpbiBjYXNlIHRoZSBhcHAgaGFzIGNoYW5nZWQgdGhlIGhhc2ggaW4gbWVhbnRpbWUpXG5cdFx0XHRmblJlcGxhY2VIYXNoKHNBcHBTdGF0ZUtleUNhY2hlZCk7XG5cdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKHNBcHBTdGF0ZUtleUNhY2hlZCk7XG5cdFx0XHRyZXR1cm4gb015RGVmZXJyZWQucHJvbWlzZSgpO1xuXHRcdH1cblxuXHRcdC8vIHBhc3NlZCBpbm5lciBhcHAgc3RhdGUgbm90IGZvdW5kIGluIGNhY2hlXG5cdFx0dGhpcy5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5pQ2FjaGVNaXNzKys7XG5cblx0XHRjb25zdCBmbk9uQWZ0ZXJTYXZlID0gZnVuY3Rpb24gKHNBcHBTdGF0ZUtleTogc3RyaW5nKTogdm9pZCB7XG5cdFx0XHQvLyByZXBsYWNlIGlubmVyIGFwcCBoYXNoIHdpdGggbmV3IGFwcFN0YXRlS2V5IGluIHVybFxuXHRcdFx0aWYgKCFiU2tpcEhhc2hSZXBsYWNlICYmICFiSW1tZWRpYXRlSGFzaFJlcGxhY2UpIHtcblx0XHRcdFx0Zm5SZXBsYWNlSGFzaChzQXBwU3RhdGVLZXkpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyByZW1lbWJlciBsYXN0IHNhdmVkIHN0YXRlXG5cdFx0XHRvTmF2SGFuZGxlci5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5vQXBwRGF0YSA9IG1Jbm5lckFwcERhdGE7XG5cdFx0XHRvTmF2SGFuZGxlci5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5zQXBwU3RhdGVLZXkgPSBzQXBwU3RhdGVLZXk7XG5cdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKHNBcHBTdGF0ZUtleSk7XG5cdFx0fTtcblxuXHRcdGNvbnN0IGZuT25FcnJvciA9IGZ1bmN0aW9uIChvRXJyb3I6IHVua25vd24pOiB2b2lkIHtcblx0XHRcdG9NeURlZmVycmVkLnJlamVjdChvRXJyb3IpO1xuXHRcdH07XG5cblx0XHR0aGlzLl9zYXZlQXBwU3RhdGVBc3luYyhtSW5uZXJBcHBEYXRhLCBmbk9uQWZ0ZXJTYXZlLCBmbk9uRXJyb3IpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoc0FwcFN0YXRlS2V5OiBhbnkpIHtcblx0XHRcdFx0LyogTm90ZSB0aGF0IF9zYXBBcHBTdGF0ZSBtYXkgcmV0dXJuICd1bmRlZmluZWQnIGluIGNhc2UgdGhhdCB0aGUgcGFyc2luZyBoYXMgZmFpbGVkLiBJbiB0aGlzIGNhc2UsIHdlIHNob3VsZCBub3QgdHJpZ2dlciB0aGUgcmVwbGFjZW1lbnRcblx0XHRcdFx0ICogb2YgdGhlIEFwcCBIYXNoIHdpdGggdGhlIGdlbmVyYXRlZCBrZXksIGFzIHRoZSBjb250YWluZXIgd2FzIG5vdCB3cml0dGVuIGJlZm9yZS4gTm90ZSBhcyB3ZWxsIHRoYXQgdGhlIGVycm9yIGhhbmRsaW5nIGhhcyBhbHJlYWR5XG5cdFx0XHRcdCAqIGhhcHBlbmVkIGJlZm9yZSBieSBtYWtpbmcgdGhlIG9NeURlZmVycmVkIHByb21pc2UgZmFpbCAoc2VlIGZuT25FcnJvciBhYm92ZSkuXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRpZiAoc0FwcFN0YXRlS2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHQvLyByZXBsYWNlIGlubmVyIGFwcCBoYXNoIHdpdGggbmV3IGFwcFN0YXRlS2V5IGluIHVybFxuXHRcdFx0XHRcdC8vIG5vdGU6IHdlIGRvIG5vdCB3YWl0IGZvciB0aGUgc2F2ZSB0byBiZSBjb21wbGV0ZWQ6IHRoaXMgYXN5bmNocm9ub3VzbHkgYmVoYXZpb3VyIGlzIG5lY2Vzc2FyeSBpZlxuXHRcdFx0XHRcdC8vIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBlLmcuIGluIGEgb25MaW5rUHJlc3NlZCBldmVudCB3aXRoIG5vIHBvc3NpYmlsaXR5IHRvIHdhaXQgZm9yIHRoZSBwcm9taXNlIHJlc29sdXRpb25cblx0XHRcdFx0XHRpZiAoIWJTa2lwSGFzaFJlcGxhY2UgJiYgYkltbWVkaWF0ZUhhc2hSZXBsYWNlKSB7XG5cdFx0XHRcdFx0XHRmblJlcGxhY2VIYXNoKHNBcHBTdGF0ZUtleSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5fc2F2ZUFwcFN0YXRlQXN5bmMgZmFpbGVkXCIpO1xuXHRcdFx0fSk7XG5cblx0XHRyZXR1cm4gb015RGVmZXJyZWQucHJvbWlzZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgdGhlIFVSTCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgYXBwIHN0YXRlIGFuZCBzdG9yZXMgdGhlIGFwcCBzdGF0ZSBmb3IgbGF0ZXIgcmV0cmlldmFsLlxuXHQgKiBAcGFyYW0gbUlubmVyQXBwRGF0YSBPYmplY3QgY29udGFpbmluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwXG5cdCAqIEBwYXJhbSBiSW1tZWRpYXRlSGFzaFJlcGxhY2UgSWYgc2V0IHRvIGZhbHNlLCB0aGUgaW5uZXIgYXBwIGhhc2ggd2lsbCBub3QgYmUgcmVwbGFjZWQgdW50aWwgc3RvcmluZyBpcyBzdWNjZXNzZnVsOyBkbyBub3Rcblx0ICogICAgICAgIHNldCB0byBmYWxzZSBpZiB5b3UgY2Fubm90IHJlYWN0IHRvIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBQcm9taXNlLCBmb3IgZXhhbXBsZSwgd2hlbiBjYWxsaW5nIHRoZSBiZWZvcmVMaW5rUHJlc3NlZCBldmVudFxuXHQgKiBAcmV0dXJucyBBIFByb21pc2Ugb2JqZWN0IHRvIG1vbml0b3Igd2hlbiBhbGwgdGhlIGFjdGlvbnMgb2YgdGhlIGZ1bmN0aW9uIGhhdmUgYmVlbiBleGVjdXRlZDsgaWYgdGhlIGV4ZWN1dGlvbiBpcyBzdWNjZXNzZnVsLCB0aGVcblx0ICogICAgICAgICAgYXBwIHN0YXRlIGtleSBpcyByZXR1cm5lZDsgaWYgYW4gZXJyb3Igb2NjdXJzLCBhbiBvYmplY3Qgb2YgdHlwZSB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2RXJyb3J9IGlzXG5cdCAqICAgICAgICAgIHJldHVybmVkXG5cdCAqIEBwdWJsaWNcblx0ICogQGV4YW1wbGUgPGNvZGU+XG5cdCAqIHNhcC51aS5kZWZpbmUoW1wic2FwL2ZlL25hdmlnYXRpb24vTmF2aWdhdGlvbkhhbmRsZXJcIl0sIGZ1bmN0aW9uIChOYXZpZ2F0aW9uSGFuZGxlcikge1xuXHQgKiBcdHZhciBvTmF2aWdhdGlvbkhhbmRsZXIgPSBuZXcgTmF2aWdhdGlvbkhhbmRsZXIob0NvbnRyb2xsZXIpO1xuXHQgKiBcdHZhciBtSW5uZXJBcHBEYXRhID0ge1xuXHQgKiBcdFx0c2VsZWN0aW9uVmFyaWFudCA6IG9TbWFydEZpbHRlckJhci5nZXREYXRhU3VpdGVGb3JtYXQoKSxcblx0ICogXHRcdHRhYmxlVmFyaWFudElkIDogb1NtYXJ0VGFibGUuZ2V0Q3VycmVudFZhcmlhbnRJZCgpLFxuXHQgKiBcdFx0Y3VzdG9tRGF0YSA6IG9NeUN1c3RvbURhdGFcblx0ICogXHR9O1xuXHQgKlxuXHQgKiBcdHZhciBvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZSA9IG9OYXZpZ2F0aW9uSGFuZGxlci5zdG9yZUlubmVyQXBwU3RhdGUobUlubmVyQXBwRGF0YSk7XG5cdCAqXG5cdCAqIFx0b1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UuZG9uZShmdW5jdGlvbihzQXBwU3RhdGVLZXkpe1xuXHQgKiBcdFx0Ly95b3VyIGlubmVyIGFwcCBzdGF0ZSBpcyBzYXZlZCBub3csIHNBcHBTdGF0ZUtleSB3YXMgYWRkZWQgdG8gVVJMXG5cdCAqIFx0XHQvL3BlcmZvcm0gYWN0aW9ucyB0aGF0IG11c3QgcnVuIGFmdGVyIHNhdmVcblx0ICogXHR9KTtcblx0ICpcblx0ICogXHRvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZS5mYWlsKGZ1bmN0aW9uKG9FcnJvcil7XG5cdCAqIFx0XHQvL3NvbWUgZXJyb3IgaGFuZGxpbmdcblx0ICogXHR9KTtcblx0ICogfSk7XG5cdCAqIDwvY29kZT5cblx0ICogQGRlcHJlY2F0ZWRzaW5jZSAxLjEwNFxuXHQgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZpZ2F0aW9uSGFuZGxlci5zdG9yZUlubmVyQXBwU3RhdGVBc3luY30gaW5zdGVhZC5cblx0ICovXG5cdHN0b3JlSW5uZXJBcHBTdGF0ZShtSW5uZXJBcHBEYXRhOiBJbm5lckFwcERhdGEsIGJJbW1lZGlhdGVIYXNoUmVwbGFjZT86IGJvb2xlYW4pOiBqUXVlcnkuUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRMb2cuZXJyb3IoXG5cdFx0XHRcIkRlcHJlY2F0ZWQgQVBJIGNhbGwgb2YgJ3NhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyLnN0b3JlSW5uZXJBcHBTdGF0ZScuIFBsZWFzZSB1c2UgJ3N0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jJyBpbnN0ZWFkXCIsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcInNhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyXCJcblx0XHQpO1xuXHRcdGlmICh0eXBlb2YgYkltbWVkaWF0ZUhhc2hSZXBsYWNlICE9PSBcImJvb2xlYW5cIikge1xuXHRcdFx0YkltbWVkaWF0ZUhhc2hSZXBsYWNlID0gdHJ1ZTsgLy8gZGVmYXVsdFxuXHRcdH1cblx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXM7XG5cdFx0Y29uc3Qgb015RGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKTtcblxuXHRcdGNvbnN0IGZuUmVwbGFjZUhhc2ggPSBmdW5jdGlvbiAoc0FwcFN0YXRlS2V5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRcdGNvbnN0IG9IYXNoQ2hhbmdlciA9IG9OYXZIYW5kbGVyLm9Sb3V0ZXIub0hhc2hDaGFuZ2VyID8gb05hdkhhbmRsZXIub1JvdXRlci5vSGFzaENoYW5nZXIgOiBIYXNoQ2hhbmdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdFx0Y29uc3Qgc0FwcEhhc2hPbGQgPSBvSGFzaENoYW5nZXIuZ2V0SGFzaCgpO1xuXHRcdFx0Lypcblx0XHRcdCAqIHVzZSAuZ2V0SGFzaCgpIGhlcmUgaW5zdGVhZCBvZiAuZ2V0QXBwSGFzaCgpIHRvIGFsc28gYmUgYWJsZSBkZWFsaW5nIHdpdGggZW52aXJvbm1lbnRzIHdoZXJlIG9ubHkgU0FQVUk1IGlzIGxvYWRlZCBhbmQgdGhlIFVTaGVsbFxuXHRcdFx0ICogaXMgbm90IGluaXRpYWxpemVkIHByb3Blcmx5LlxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBzQXBwSGFzaE5ldyA9IG9OYXZIYW5kbGVyLl9yZXBsYWNlSW5uZXJBcHBTdGF0ZUtleShzQXBwSGFzaE9sZCwgc0FwcFN0YXRlS2V5KTtcblx0XHRcdG9IYXNoQ2hhbmdlci5yZXBsYWNlSGFzaChzQXBwSGFzaE5ldyk7XG5cdFx0fTtcblxuXHRcdC8vIGluIGNhc2UgbUlubmVyQXBwU3RhdGUgaXMgZW1wdHksIGRvIG5vdCBvdmVyd3JpdGUgdGhlIGxhc3Qgc2F2ZWQgc3RhdGVcblx0XHRpZiAoaXNFbXB0eU9iamVjdChtSW5uZXJBcHBEYXRhIGFzIG9iamVjdCkpIHtcblx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUoXCJcIik7XG5cdFx0XHRyZXR1cm4gb015RGVmZXJyZWQucHJvbWlzZSgpO1xuXHRcdH1cblxuXHRcdC8vIGNoZWNrIGlmIHdlIGFscmVhZHkgc2F2ZWQgdGhlIHNhbWUgZGF0YVxuXHRcdGNvbnN0IHNBcHBTdGF0ZUtleUNhY2hlZCA9IHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEuc0FwcFN0YXRlS2V5O1xuXG5cdFx0Y29uc3QgYklubmVyQXBwRGF0YUVxdWFsID0gSlNPTi5zdHJpbmdpZnkobUlubmVyQXBwRGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEub0FwcERhdGEpO1xuXHRcdGlmIChiSW5uZXJBcHBEYXRhRXF1YWwgJiYgc0FwcFN0YXRlS2V5Q2FjaGVkKSB7XG5cdFx0XHQvLyBwYXNzZWQgaW5uZXIgYXBwIHN0YXRlIGZvdW5kIGluIGNhY2hlXG5cdFx0XHR0aGlzLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLmlDYWNoZUhpdCsrO1xuXG5cdFx0XHQvLyByZXBsYWNlIGlubmVyIGFwcCBoYXNoIHdpdGggY2FjaGVkIGFwcFN0YXRlS2V5IGluIHVybCAoanVzdCBpbiBjYXNlIHRoZSBhcHAgaGFzIGNoYW5nZWQgdGhlIGhhc2ggaW4gbWVhbnRpbWUpXG5cdFx0XHRmblJlcGxhY2VIYXNoKHNBcHBTdGF0ZUtleUNhY2hlZCk7XG5cdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKHNBcHBTdGF0ZUtleUNhY2hlZCk7XG5cdFx0XHRyZXR1cm4gb015RGVmZXJyZWQucHJvbWlzZSgpO1xuXHRcdH1cblxuXHRcdC8vIHBhc3NlZCBpbm5lciBhcHAgc3RhdGUgbm90IGZvdW5kIGluIGNhY2hlXG5cdFx0dGhpcy5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5pQ2FjaGVNaXNzKys7XG5cblx0XHRjb25zdCBmbk9uQWZ0ZXJTYXZlID0gZnVuY3Rpb24gKHNBcHBTdGF0ZUtleTogYW55KTogdm9pZCB7XG5cdFx0XHQvLyByZXBsYWNlIGlubmVyIGFwcCBoYXNoIHdpdGggbmV3IGFwcFN0YXRlS2V5IGluIHVybFxuXHRcdFx0aWYgKCFiSW1tZWRpYXRlSGFzaFJlcGxhY2UpIHtcblx0XHRcdFx0Zm5SZXBsYWNlSGFzaChzQXBwU3RhdGVLZXkpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyByZW1lbWJlciBsYXN0IHNhdmVkIHN0YXRlXG5cdFx0XHRvTmF2SGFuZGxlci5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5vQXBwRGF0YSA9IG1Jbm5lckFwcERhdGE7XG5cdFx0XHRvTmF2SGFuZGxlci5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5zQXBwU3RhdGVLZXkgPSBzQXBwU3RhdGVLZXk7XG5cdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKHNBcHBTdGF0ZUtleSk7XG5cdFx0fTtcblxuXHRcdGNvbnN0IGZuT25FcnJvciA9IGZ1bmN0aW9uIChvRXJyb3I6IGFueSk6IHZvaWQge1xuXHRcdFx0b015RGVmZXJyZWQucmVqZWN0KG9FcnJvcik7XG5cdFx0fTtcblxuXHRcdGNvbnN0IHNBcHBTdGF0ZUtleSA9IHRoaXMuX3NhdmVBcHBTdGF0ZShtSW5uZXJBcHBEYXRhLCBmbk9uQWZ0ZXJTYXZlLCBmbk9uRXJyb3IpO1xuXHRcdC8qXG5cdFx0ICogTm90ZSB0aGF0IF9zYXBBcHBTdGF0ZSBtYXkgcmV0dXJuICd1bmRlZmluZWQnIGluIGNhc2UgdGhhdCB0aGUgcGFyc2luZyBoYXMgZmFpbGVkLiBJbiB0aGlzIGNhc2UsIHdlIHNob3VsZCBub3QgdHJpZ2dlciB0aGUgcmVwbGFjZW1lbnRcblx0XHQgKiBvZiB0aGUgQXBwIEhhc2ggd2l0aCB0aGUgZ2VuZXJhdGVkIGtleSwgYXMgdGhlIGNvbnRhaW5lciB3YXMgbm90IHdyaXR0ZW4gYmVmb3JlLiBOb3RlIGFzIHdlbGwgdGhhdCB0aGUgZXJyb3IgaGFuZGxpbmcgaGFzIGFscmVhZHlcblx0XHQgKiBoYXBwZW5lZCBiZWZvcmUgYnkgbWFraW5nIHRoZSBvTXlEZWZlcnJlZCBwcm9taXNlIGZhaWwgKHNlZSBmbk9uRXJyb3IgYWJvdmUpLlxuXHRcdCAqL1xuXHRcdGlmIChzQXBwU3RhdGVLZXkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gcmVwbGFjZSBpbm5lciBhcHAgaGFzaCB3aXRoIG5ldyBhcHBTdGF0ZUtleSBpbiB1cmxcblx0XHRcdC8vIG5vdGU6IHdlIGRvIG5vdCB3YWl0IGZvciB0aGUgc2F2ZSB0byBiZSBjb21wbGV0ZWQ6IHRoaXMgYXN5bmNocm9ub3VzbHkgYmVoYXZpb3VyIGlzIG5lY2Vzc2FyeSBpZlxuXHRcdFx0Ly8gdGhpcyBtZXRob2QgaXMgY2FsbGVkIGUuZy4gaW4gYSBvbkxpbmtQcmVzc2VkIGV2ZW50IHdpdGggbm8gcG9zc2liaWxpdHkgdG8gd2FpdCBmb3IgdGhlIHByb21pc2UgcmVzb2x1dGlvblxuXHRcdFx0aWYgKGJJbW1lZGlhdGVIYXNoUmVwbGFjZSkge1xuXHRcdFx0XHRmblJlcGxhY2VIYXNoKHNBcHBTdGF0ZUtleSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9NeURlZmVycmVkLnByb21pc2UoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2VzIHRoZSBVUkwgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGFwcCBzdGF0ZSBhbmQgc3RvcmVzIHRoZSBhcHAgc3RhdGUgZm9yIGxhdGVyIHJldHJpZXZhbC5cblx0ICogQHBhcmFtIG1Jbm5lckFwcERhdGEgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFwcFxuXHQgKiBAcGFyYW0gYkltbWVkaWF0ZUhhc2hSZXBsYWNlIElmIHNldCB0byBmYWxzZSwgdGhlIGlubmVyIGFwcCBoYXNoIHdpbGwgbm90IGJlIHJlcGxhY2VkIHVudGlsIHN0b3JpbmcgaXMgc3VjY2Vzc2Z1bDsgZG8gbm90XG5cdCAqICAgICAgICBzZXQgdG8gZmFsc2UgaWYgeW91IGNhbm5vdCByZWFjdCB0byB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgUHJvbWlzZSwgZm9yIGV4YW1wbGUsIHdoZW4gY2FsbGluZyB0aGUgYmVmb3JlTGlua1ByZXNzZWQgZXZlbnQuIDxiPk5vdGU6PC9iPklmXG5cdCAqICAgICAgICBub3QgcHJvdmlkZWQgaXQgd2lsbCBiZSB0cmVhdGVkIGFzIHNldCB0byBmYWxzZS4gPGI+Tm90ZTo8L2I+SWYgc2V0IHRvIHRydWUsIHRoZSBjYWxsaW5nIGluc3RhbmNlIGhhcyB0byBlbnN1cmUgdGhhdCBhIGZvbGxvdy1vblxuXHQgKiAgICAgICAgY2FsbCB0byA8Y29kZT5yZXBsYWNlSGFzaDwvY29kZT4gd2lsbCB0YWtlIHBsYWNlIVxuXHQgKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgYXBwU3RhdGVJZCBhbmQgYSBwcm9taXNlIG9iamVjdCB0byBtb25pdG9yIHdoZW4gYWxsIHRoZSBhY3Rpb25zIG9mIHRoZSBmdW5jdGlvbiBoYXZlIGJlZW5cblx0ICogICAgICAgICAgZXhlY3V0ZWQ7IFBsZWFzZSBub3RlIHRoYXQgdGhlIGFwcFN0YXRlS2V5IG1heSBiZSB1bmRlZmluZWQgb3IgZW1wdHkuXG5cdCAqIEBleGFtcGxlIDxjb2RlPlxuXHQgKiBzYXAudWkuZGVmaW5lKFtcInNhcC9mZS9uYXZpZ2F0aW9uL05hdmlnYXRpb25IYW5kbGVyXCJdLCBmdW5jdGlvbiAoTmF2aWdhdGlvbkhhbmRsZXIpIHtcblx0ICogXHR2YXIgb05hdmlnYXRpb25IYW5kbGVyID0gbmV3IE5hdmlnYXRpb25IYW5kbGVyKG9Db250cm9sbGVyKTtcblx0ICogXHR2YXIgbUlubmVyQXBwRGF0YSA9IHtcblx0ICogXHRcdHNlbGVjdGlvblZhcmlhbnQgOiBvU21hcnRGaWx0ZXJCYXIuZ2V0RGF0YVN1aXRlRm9ybWF0KCksXG5cdCAqIFx0XHR0YWJsZVZhcmlhbnRJZCA6IG9TbWFydFRhYmxlLmdldEN1cnJlbnRWYXJpYW50SWQoKSxcblx0ICogXHRcdGN1c3RvbURhdGEgOiBvTXlDdXN0b21EYXRhXG5cdCAqIFx0fTtcblx0ICpcblx0ICogXHR2YXIgb1N0b3JlSW5uZXJBcHBTdGF0ZSA9IHN0b3JlSW5uZXJBcHBTdGF0ZVdpdGhOb25EZWxheWVkUmV0dXJuKG1Jbm5lckFwcERhdGEpO1xuXHQgKiBcdHZhciBzQXBwU3RhdGVLZXkgPSBvU3RvcmVJbm5lckFwcFN0YXRlLmFwcFN0YXRlS2V5O1xuXHQgKiBcdGlmICghc0FwcFN0YXRlS2V5KSB7XG5cdCAqICAgIC8vIG5vIGFwcFN0YXRlS2V5IG9idGFpbmVkLi4uXG5cdCAqIFx0fTtcblx0ICogXHR2YXIgb1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UgPSBvU3RvcmVJbm5lckFwcFN0YXRlLnByb21pc2U7XG5cdCAqXG5cdCAqIFx0b1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UuZG9uZShmdW5jdGlvbihzQXBwU3RhdGVLZXkpe1xuXHQgKiBcdFx0Ly95b3VyIGlubmVyIGFwcCBzdGF0ZSBpcyBzYXZlZCBub3csIHNBcHBTdGF0ZUtleSB3YXMgYWRkZWQgdG8gVVJMXG5cdCAqIFx0XHQvL3BlcmZvcm0gYWN0aW9ucyB0aGF0IG11c3QgcnVuIGFmdGVyIHNhdmVcblx0ICogXHR9KTtcblx0ICpcblx0ICogXHRvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZS5mYWlsKGZ1bmN0aW9uKG9FcnJvcil7XG5cdCAqIFx0XHQvL3NvbWUgZXJyb3IgaGFuZGxpbmdcblx0ICogXHR9KTtcblx0ICogfSk7XG5cdCAqIDwvY29kZT5cblx0ICogQHB1YmxpY1xuXHQgKiBAZGVwcmVjYXRlZHNpbmNlIDEuMTA0XG5cdCAqIEBkZXByZWNhdGVkIFVzZSB0aGUge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyLnN0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jfSBpbnN0ZWFkLlxuXHQgKi9cblx0c3RvcmVJbm5lckFwcFN0YXRlV2l0aEltbWVkaWF0ZVJldHVybihtSW5uZXJBcHBEYXRhOiBJbm5lckFwcERhdGEsIGJJbW1lZGlhdGVIYXNoUmVwbGFjZT86IGJvb2xlYW4pOiBvYmplY3Qge1xuXHRcdExvZy5lcnJvcihcblx0XHRcdFwiRGVwcmVjYXRlZCBBUEkgY2FsbCBvZiAnc2FwLmZlLm5hdmlnYXRpb24uTmF2aWdhdGlvbkhhbmRsZXIuc3RvcmVJbm5lckFwcFN0YXRlV2l0aEltbWVkaWF0ZVJldHVybicuIFBsZWFzZSB1c2UgJ3N0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jJyBpbnN0ZWFkXCIsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcInNhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyXCJcblx0XHQpO1xuXHRcdGlmICh0eXBlb2YgYkltbWVkaWF0ZUhhc2hSZXBsYWNlICE9PSBcImJvb2xlYW5cIikge1xuXHRcdFx0YkltbWVkaWF0ZUhhc2hSZXBsYWNlID0gZmFsc2U7IC8vIGRlZmF1bHRcblx0XHR9XG5cblx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXM7XG5cdFx0Y29uc3Qgb0FwcFN0YXRlUHJvbWlzZSA9IGpRdWVyeS5EZWZlcnJlZCgpO1xuXG5cdFx0Ly8gaW4gY2FzZSBtSW5uZXJBcHBTdGF0ZSBpcyBlbXB0eSwgZG8gbm90IG92ZXJ3cml0ZSB0aGUgbGFzdCBzYXZlZCBzdGF0ZVxuXHRcdGlmIChpc0VtcHR5T2JqZWN0KG1Jbm5lckFwcERhdGEpKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRhcHBTdGF0ZUtleTogXCJcIixcblx0XHRcdFx0cHJvbWlzZTogb0FwcFN0YXRlUHJvbWlzZS5yZXNvbHZlKFwiXCIpXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIGNoZWNrIGlmIHdlIGFscmVhZHkgc2F2ZWQgdGhlIHNhbWUgZGF0YVxuXHRcdGNvbnN0IHNBcHBTdGF0ZUtleUNhY2hlZCA9IHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEuc0FwcFN0YXRlS2V5O1xuXG5cdFx0Y29uc3QgYklubmVyQXBwRGF0YUVxdWFsID0gSlNPTi5zdHJpbmdpZnkobUlubmVyQXBwRGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEub0FwcERhdGEpO1xuXHRcdGlmIChiSW5uZXJBcHBEYXRhRXF1YWwgJiYgc0FwcFN0YXRlS2V5Q2FjaGVkKSB7XG5cdFx0XHQvLyBwYXNzZWQgaW5uZXIgYXBwIHN0YXRlIGZvdW5kIGluIGNhY2hlXG5cdFx0XHR0aGlzLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLmlDYWNoZUhpdCsrO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0YXBwU3RhdGVLZXk6IHNBcHBTdGF0ZUtleUNhY2hlZCxcblx0XHRcdFx0cHJvbWlzZTogb0FwcFN0YXRlUHJvbWlzZS5yZXNvbHZlKHNBcHBTdGF0ZUtleUNhY2hlZClcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly8gcGFzc2VkIGlubmVyIGFwcCBzdGF0ZSBub3QgZm91bmQgaW4gY2FjaGVcblx0XHR0aGlzLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLmlDYWNoZU1pc3MrKztcblxuXHRcdGNvbnN0IGZuT25BZnRlclNhdmUgPSBmdW5jdGlvbiAoc0FwcFN0YXRlS2V5OiBhbnkpOiB2b2lkIHtcblx0XHRcdC8vIHJlcGxhY2UgaW5uZXIgYXBwIGhhc2ggd2l0aCBuZXcgYXBwU3RhdGVLZXkgaW4gdXJsXG5cdFx0XHRpZiAoIWJJbW1lZGlhdGVIYXNoUmVwbGFjZSkge1xuXHRcdFx0XHRvTmF2SGFuZGxlci5yZXBsYWNlSGFzaChzQXBwU3RhdGVLZXkpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyByZW1lbWJlciBsYXN0IHNhdmVkIHN0YXRlXG5cdFx0XHRvTmF2SGFuZGxlci5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5vQXBwRGF0YSA9IG1Jbm5lckFwcERhdGE7XG5cdFx0XHRvTmF2SGFuZGxlci5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5zQXBwU3RhdGVLZXkgPSBzQXBwU3RhdGVLZXk7XG5cdFx0XHRvQXBwU3RhdGVQcm9taXNlLnJlc29sdmUoc0FwcFN0YXRlS2V5KTtcblx0XHR9O1xuXG5cdFx0Y29uc3QgZm5PbkVycm9yID0gZnVuY3Rpb24gKG9FcnJvcjogYW55KTogdm9pZCB7XG5cdFx0XHRvQXBwU3RhdGVQcm9taXNlLnJlamVjdChvRXJyb3IpO1xuXHRcdH07XG5cblx0XHRjb25zdCBzQXBwU3RhdGVLZXkgPSB0aGlzLl9zYXZlQXBwU3RhdGUobUlubmVyQXBwRGF0YSwgZm5PbkFmdGVyU2F2ZSwgZm5PbkVycm9yKTtcblx0XHQvKlxuXHRcdCAqIE5vdGUgdGhhdCBfc2FwQXBwU3RhdGUgbWF5IHJldHVybiAndW5kZWZpbmVkJyBpbiBjYXNlIHRoYXQgdGhlIHBhcnNpbmcgaGFzIGZhaWxlZC4gSW4gdGhpcyBjYXNlLCB3ZSBzaG91bGQgbm90IHRyaWdnZXIgdGhlIHJlcGxhY2VtZW50XG5cdFx0ICogb2YgdGhlIEFwcCBIYXNoIHdpdGggdGhlIGdlbmVyYXRlZCBrZXksIGFzIHRoZSBjb250YWluZXIgd2FzIG5vdCB3cml0dGVuIGJlZm9yZS4gTm90ZSBhcyB3ZWxsIHRoYXQgdGhlIGVycm9yIGhhbmRsaW5nIGhhcyBhbHJlYWR5XG5cdFx0ICogaGFwcGVuZWQgYmVmb3JlIGJ5IG1ha2luZyB0aGUgb015RGVmZXJyZWQgcHJvbWlzZSBmYWlsIChzZWUgZm5PbkVycm9yIGFib3ZlKS5cblx0XHQgKi9cblx0XHQvLyBpZiAoc0FwcFN0YXRlS2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHQvLyAvL3JlcGxhY2UgaW5uZXIgYXBwIGhhc2ggd2l0aCBuZXcgYXBwU3RhdGVLZXkgaW4gdXJsXG5cdFx0Ly8gLy9ub3RlOiB3ZSBkbyBub3Qgd2FpdCBmb3IgdGhlIHNhdmUgdG8gYmUgY29tcGxldGVkOiB0aGlzIGFzeW5jaHJvbm91c2x5IGJlaGF2aW91ciBpcyBuZWNlc3NhcnkgaWZcblx0XHQvLyAvL3RoaXMgbWV0aG9kIGlzIGNhbGxlZCBlLmcuIGluIGEgb25MaW5rUHJlc3NlZCBldmVudCB3aXRoIG5vIHBvc3NpYmlsaXR5IHRvIHdhaXQgZm9yIHRoZSBwcm9taXNlIHJlc29sdXRpb25cblx0XHQvLyBpZiAoYkltbWVkaWF0ZUhhc2hSZXBsYWNlKSB7XG5cdFx0Ly8gZm5SZXBsYWNlSGFzaChzQXBwU3RhdGVLZXkpO1xuXHRcdC8vIH1cblx0XHQvLyB9XG5cdFx0cmV0dXJuIHtcblx0XHRcdGFwcFN0YXRlS2V5OiBzQXBwU3RhdGVLZXksXG5cdFx0XHRwcm9taXNlOiBvQXBwU3RhdGVQcm9taXNlLnByb21pc2UoKVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2Vzc2VzIG5hdmlnYXRpb24tcmVsYXRlZCB0YXNrcyByZWxhdGVkIHRvIGJlZm9yZVBvcG92ZXJPcGVucyBldmVudCBoYW5kbGluZyBmb3IgdGhlIFNtYXJ0TGluayBjb250cm9sIGFuZCByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QuIEluXG5cdCAqIHBhcnRpY3VsYXIsIHRoZSBmb2xsb3dpbmcgdGFza3MgYXJlIHBlcmZvcm1lZCBiZWZvcmUgdGhlIFNtYXJ0TGluayBwb3BvdmVyIGNhbiBiZSBvcGVuZWQ6XG5cdCAqIDx1bD5cblx0ICogPGxpPklmIDxjb2RlPm1Jbm5lckFwcERhdGE8L2NvZGU+IGlzIHByb3ZpZGVkLCB0aGlzIGlubmVyIGFwcCBzdGF0ZSBpcyBzYXZlZCBmb3IgYmFjayBuYXZpZ2F0aW9uIGF0IGEgbGF0ZXIgdGltZS48L2xpPlxuXHQgKiA8bGk+VGhlIHRhYmxlIGV2ZW50IHBhcmFtZXRlcnMgKHNlbWFudGljIGF0dHJpYnV0ZXMpIGFuZCB0aGUgc2VsZWN0aW9uIHZhcmlhbnQgZGF0YSBhcmUgY29tYmluZWQgYnkgY2FsbGluZyB0aGUgbWV0aG9kXG5cdCAqIHtAbGluayAjLm1peEF0dHJpYnV0ZXNBbmRTZWxlY3Rpb25WYXJpYW50IG1peEF0dHJpYnV0ZXNBbmRTZWxlY3Rpb25WYXJpYW50fS48L2xpPlxuXHQgKiA8bGk+VGhlIGNvbWJpbmVkIGRhdGEgaXMgc2F2ZWQgYXMgdGhlIGNyb3NzIGFwcCBzdGF0ZSB0byBiZSBoYW5kZWQgb3ZlciB0byB0aGUgdGFyZ2V0IGFwcCwgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHNhcC14YXBwLXN0YXRlIGtleSBpcyBzZXRcblx0ICogaW4gdGhlIFVSTC48L2xpPlxuXHQgKiA8bGk+QWxsIHNpbmdsZSBzZWxlY3Rpb25zIChcImluY2x1ZGluZyBlcXVhbFwiKSBvZiB0aGUgY29tYmluZWQgc2VsZWN0aW9uIGRhdGEgYXJlIHBhc3NlZCB0byB0aGUgU21hcnRMaW5rIHBvcG92ZXIgYXMgc2VtYW50aWMgYXR0cmlidXRlcy48L2xpPlxuXHQgKiA8bGk+VGhlIG1ldGhvZCA8Y29kZT5vVGFibGVFdmVudFBhcmFtZXRlcnMub3BlbigpPC9jb2RlPiBpcyBjYWxsZWQuIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IHJlYWxseSBvcGVuIHRoZSBwb3BvdmVyLCBidXQgdGhlIFNtYXJ0TGlua1xuXHQgKiBjb250cm9sIHByb2NlZWRzIHdpdGggZmlyaW5nIHRoZSBldmVudCA8Y29kZT5uYXZpZ2F0aW9uVGFyZ2V0c09idGFpbmVkPC9jb2RlPi48L2xpPlxuXHQgKiA8L3VsPi5cblx0ICogPGJyPlxuXHQgKiA8Yj5Ob2RlOjwvYj4gSWYgdGhlIDxjb2RlPm9FeHRlcm5hbEFwcERhdGE8L2NvZGU+IHBhcmFtZXRlciBpcyBub3Qgc3VwcGxpZWQsIHRoZSBleHRlcm5hbCBhcHAgZGF0YSB3aWxsIGJlIGNhbGN1bGF0ZWQgYmFzZWQgb25cblx0ICogdGhlIDxjb2RlPm1Jbm5lckFwcERhdGE8L2NvZGU+IGRhdGEuPGJyPi5cblx0ICogQHBhcmFtIG9UYWJsZUV2ZW50UGFyYW1ldGVycyBUaGUgcGFyYW1ldGVycyBtYWRlIGF2YWlsYWJsZSBieSB0aGUgU21hcnRUYWJsZSBjb250cm9sIHdoZW4gdGhlIFNtYXJ0TGluayBjb250cm9sIGhhcyBiZWVuIGNsaWNrZWQsXG5cdCAqICAgICAgICBhbiBpbnN0YW5jZSBvZiBhIFBvcE92ZXIgb2JqZWN0XG5cdCAqIEBwYXJhbSBzU2VsZWN0aW9uVmFyaWFudCBTdHJpbmdpZmllZCBKU09OIG9iamVjdCBhcyByZXR1cm5lZCwgZm9yIGV4YW1wbGUsIGZyb20gZ2V0RGF0YVN1aXRlRm9ybWF0KCkgb2YgdGhlIFNtYXJ0RmlsdGVyQmFyIGNvbnRyb2xcblx0ICogQHBhcmFtIG1Jbm5lckFwcERhdGEgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFwcC4gSWYgcHJvdmlkZWQsIG9wZW5pbmcgdGhlIFBvcG92ZXIgaXMgZGVmZXJyZWQgdW50aWwgdGhlXG5cdCAqICAgICAgICBpbm5lciBhcHAgZGF0YSBpcyBzYXZlZCBpbiBhIGNvbnNpc3RlbnQgd2F5LlxuXHQgKiBAcGFyYW0gb0V4dGVybmFsQXBwRGF0YSBPYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHRhcmdldCBzY3JlZW4uXG5cdCAqIEBwYXJhbSBvRXh0ZXJuYWxBcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQgT2JqZWN0IGNvbnRhaW5pbmcgc2VsZWN0aW9uVmFyaWFudCwgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHRhcmdldCBzY3JlZW4uIElmIG5vdFxuXHQgKiAgICAgICAgc2V0IHRoZSBzU2VsZWN0aW9uVmFyaWFudCB3aWxsIGJlIHVzZWQuXG5cdCAqIEBwYXJhbSBvRXh0ZXJuYWxBcHBEYXRhLnByZXNlbnRhdGlvblZhcmlhbnQgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgdWkgcHJlc2VudGF0aW9uVmFyaWFudCBvZiB0aGUgYXBwLCB3aGljaCB3aWxsIGJlXG5cdCAqICAgICAgICBwYXNzZWQgdG8gdGhlIHRhcmdldCBzY3JlZW5cblx0ICogQHBhcmFtIG9FeHRlcm5hbEFwcERhdGEudmFsdWVUZXh0cyBPYmplY3QgY29udGFpbmluZyB2YWx1ZSBkZXNjcmlwdGlvbnMsIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSB0YXJnZXQgc2NyZWVuXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSBvYmplY3QgdG8gbW9uaXRvciB3aGVuIGFsbCBhY3Rpb25zIG9mIHRoZSBmdW5jdGlvbiBoYXZlIGJlZW4gZXhlY3V0ZWQ7IGlmIHRoZSBleGVjdXRpb24gaXMgc3VjY2Vzc2Z1bCwgdGhlXG5cdCAqICAgICAgICAgIG1vZGlmaWVkIG9UYWJsZUV2ZW50UGFyYW1ldGVycyBpcyByZXR1cm5lZDsgaWYgYW4gZXJyb3Igb2NjdXJzLCBhbiBlcnJvciBvYmplY3Qgb2YgdHlwZVxuXHQgKiAgICAgICAgICB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2RXJyb3J9IGlzIHJldHVybmVkXG5cdCAqIEBwdWJsaWNcblx0ICogQGV4YW1wbGUgPGNvZGU+XG5cdCAqIHNhcC51aS5kZWZpbmUoW1wic2FwL2ZlL25hdmlnYXRpb24vTmF2aWdhdGlvbkhhbmRsZXJcIiwgXCJzYXAvZmUvbmF2aWdhdGlvbi9TZWxlY3Rpb25WYXJpYW50XCJdLCBmdW5jdGlvbiAoTmF2aWdhdGlvbkhhbmRsZXIsIFNlbGVjdGlvblZhcmlhbnQpIHtcblx0ICogXHQvL2V2ZW50IGhhbmRsZXIgZm9yIHRoZSBzbWFydCBsaW5rIGV2ZW50IFwiYmVmb3JlUG9wb3Zlck9wZW5zXCJcblx0ICogXHRcdG9uQmVmb3JlUG9wb3Zlck9wZW5zOiBmdW5jdGlvbihvRXZlbnQpIHtcblx0ICogXHRcdFx0dmFyIG9UYWJsZUV2ZW50UGFyYW1ldGVycyA9IG9FdmVudC5nZXRQYXJhbWV0ZXJzKCk7XG5cdCAqXG5cdCAqIFx0XHRcdHZhciBtSW5uZXJBcHBEYXRhID0ge1xuXHQgKiBcdFx0XHRcdHNlbGVjdGlvblZhcmlhbnQgOiBvU21hcnRGaWx0ZXJCYXIuZ2V0RGF0YVN1aXRlRm9ybWF0KCksXG5cdCAqIFx0XHRcdFx0dGFibGVWYXJpYW50SWQgOiBvU21hcnRUYWJsZS5nZXRDdXJyZW50VmFyaWFudElkKCksXG5cdCAqIFx0XHRcdFx0Y3VzdG9tRGF0YSA6IG9NeUN1c3RvbURhdGFcblx0ICogXHRcdFx0fTtcblx0ICpcblx0ICogXHRcdFx0dmFyIG9TZWxlY3Rpb25WYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoKTtcblx0ICogXHRcdFx0b1NlbGVjdGlvblZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKFwiQ29tcGFueUNvZGVcIiwgXCJJXCIsIFwiRVFcIiwgXCIwMDAxXCIpO1xuXHQgKiBcdFx0XHRvU2VsZWN0aW9uVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oXCJDdXN0b21lclwiLCBcIklcIiwgXCJFUVwiLCBcIkMwMDAxXCIpO1xuXHQgKiBcdFx0XHR2YXIgc1NlbGVjdGlvblZhcmlhbnQ9IG9TZWxlY3Rpb25WYXJpYW50LnRvSlNPTlN0cmluZygpO1xuXHQgKlxuXHQgKiBcdFx0XHR2YXIgb05hdmlnYXRpb25IYW5kbGVyID0gbmV3IE5hdmlnYXRpb25IYW5kbGVyKG9Db250cm9sbGVyKTtcblx0ICogXHRcdFx0dmFyIG9TbWFydExpbmtQcm9taXNlID0gb05hdmlnYXRpb25IYW5kbGVyLnByb2Nlc3NCZWZvcmVTbWFydExpbmtQb3BvdmVyT3BlbnMob1RhYmxlRXZlbnRQYXJhbWV0ZXJzLCBzU2VsZWN0aW9uVmFyaWFudCwgbUlubmVyQXBwRGF0YSk7XG5cdCAqXG5cdCAqIFx0XHRcdG9TbWFydExpbmtQcm9taXNlLmRvbmUoZnVuY3Rpb24ob1RhYmxlRXZlbnRQYXJhbWV0ZXJzKXtcblx0ICogXHRcdFx0XHQvLyBoZXJlIHlvdSBjYW4gYWRkIGNvZGluZyB0aGF0IHNob3VsZCBydW4gYWZ0ZXIgYWxsIGFwcCBzdGF0ZXMgYXJlIHNhdmVkIGFuZCB0aGUgc2VtYW50aWMgYXR0cmlidXRlcyBhcmUgc2V0XG5cdCAqIFx0XHRcdH0pO1xuXHQgKlxuXHQgKiBcdFx0XHRvU21hcnRMaW5rUHJvbWlzZS5mYWlsKGZ1bmN0aW9uKG9FcnJvcil7XG5cdCAqIFx0XHRcdC8vc29tZSBlcnJvciBoYW5kbGluZ1xuXHQgKiBcdFx0XHR9KTtcblx0ICogXHRcdH07XG5cdCAqIFx0fSk7XG5cdCAqIDwvY29kZT5cblx0ICovXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJvbWlzZS1mdW5jdGlvbi1hc3luY1xuXHRwcm9jZXNzQmVmb3JlU21hcnRMaW5rUG9wb3Zlck9wZW5zKFxuXHRcdG9UYWJsZUV2ZW50UGFyYW1ldGVyczogYW55LFxuXHRcdHNTZWxlY3Rpb25WYXJpYW50OiBzdHJpbmcsXG5cdFx0bUlubmVyQXBwRGF0YT86IElubmVyQXBwRGF0YSxcblx0XHRvRXh0ZXJuYWxBcHBEYXRhPzoge1xuXHRcdFx0c2VsZWN0aW9uVmFyaWFudD86IG9iamVjdDtcblx0XHRcdHByZXNlbnRhdGlvblZhcmlhbnQ/OiBvYmplY3Q7XG5cdFx0XHR2YWx1ZVRleHRzPzogb2JqZWN0O1xuXHRcdH1cblx0KTogSlF1ZXJ5LlByb21pc2U8c3RyaW5nW10sIHVua25vd24sIHVua25vd24+IHtcblx0XHRjb25zdCBvTXlEZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpIGFzIEpRdWVyeS5EZWZlcnJlZDxzdHJpbmdbXSwgdW5rbm93biwgdW5rbm93bj47XG5cdFx0bGV0IG1TZW1hbnRpY0F0dHJpYnV0ZXM6IGFueTtcblx0XHRpZiAob1RhYmxlRXZlbnRQYXJhbWV0ZXJzICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0bVNlbWFudGljQXR0cmlidXRlcyA9IG9UYWJsZUV2ZW50UGFyYW1ldGVycy5zZW1hbnRpY0F0dHJpYnV0ZXM7XG5cdFx0fVxuXG5cdFx0bGV0IG9YQXBwRGF0YU9iajogYW55O1xuXHRcdGNvbnN0IG9OYXZIYW5kbGVyOiBOYXZpZ2F0aW9uSGFuZGxlciA9IHRoaXM7XG5cblx0XHRpZiAob0V4dGVybmFsQXBwRGF0YSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRvWEFwcERhdGFPYmogPSB7fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1hBcHBEYXRhT2JqID0gb0V4dGVybmFsQXBwRGF0YTtcblx0XHR9XG5cblx0XHRjb25zdCBmblN0b3JlWGFwcEFuZENhbGxPcGVuID0gZnVuY3Rpb24gKG1TdWJTZW1hbnRpY0F0dHJpYnV0ZXM6IGFueSwgc1N1YlNlbGVjdGlvblZhcmlhbnQ6IGFueSk6IHZvaWQge1xuXHRcdFx0Ly8gbWl4IHRoZSBzZW1hbnRpYyBhdHRyaWJ1dGVzIChlLmcuIGZyb20gdGhlIHJvdyBsaW5lKSB3aXRoIHRoZSBzZWxlY3Rpb24gdmFyaWFudCAoZS5nLiBmcm9tIHRoZSBmaWx0ZXIgYmFyKVxuXHRcdFx0c1N1YlNlbGVjdGlvblZhcmlhbnQgPSBvWEFwcERhdGFPYmouc2VsZWN0aW9uVmFyaWFudCB8fCBzU3ViU2VsZWN0aW9uVmFyaWFudCB8fCBcInt9XCI7XG5cblx0XHRcdGNvbnN0IGlTdXBwcmVzc2lvbkJlaGF2aW9yID0gU3VwcHJlc3Npb25CZWhhdmlvci5yYWlzZUVycm9yT25OdWxsIHwgU3VwcHJlc3Npb25CZWhhdmlvci5yYWlzZUVycm9yT25VbmRlZmluZWQ7XG5cdFx0XHQvKlxuXHRcdFx0ICogY29tcGF0aWJsaXR5OiBVbnRpbCBTQVBVSTUgMS4yOC41IChvciBldmVuIGxhdGVyKSB0aGUgU21hcnQgTGluayBpbiBhIFNtYXJ0IFRhYmxlIGlzIGZpbHRlcmluZyBhbGwgbnVsbC0gYW5kIHVuZGVmaW5lZCB2YWx1ZXMuXG5cdFx0XHQgKiBUaGVyZWZvcmUsIG1TZW1hbnRpY0F0dHJpYnV0ZXMgYXJlIGFscmVhZHkgcmVkdWNlZCBhcHByb3ByaWF0ZWx5IC0tIHRoaXMgZG9lcyBub3QgbmVlZCB0byBiZSBkb25lIGJ5XG5cdFx0XHQgKiBtaXhBdHRyaWJ1dGVzQW5kU2VsZWN0aW9uVmFyaWFudCBhZ2Fpbi4gVG8gZW5zdXJlIHRoYXQgd2Ugc3RpbGwgaGF2ZSB0aGUgb2xkIGJlaGF2aW91ciAoaS5lLiBhbiBOYXZFcnJvciBpcyByYWlzZWQgaW4gY2FzZSB0aGF0XG5cdFx0XHQgKiBiZWhhdmlvdXIgb2YgdGhlIFNtYXJ0IExpbmsgY29udHJvbCBoYXMgY2hhbmdlZCksIHRoZSBcIm9sZFwiIFN1cHByZXNzaW9uIEJlaGF2aW91ciBpcyByZXRhaW5lZC5cblx0XHRcdCAqL1xuXG5cdFx0XHRjb25zdCBvTWl4ZWRTZWxWYXIgPSBvTmF2SGFuZGxlci5taXhBdHRyaWJ1dGVzQW5kU2VsZWN0aW9uVmFyaWFudChcblx0XHRcdFx0bVN1YlNlbWFudGljQXR0cmlidXRlcyxcblx0XHRcdFx0c1N1YlNlbGVjdGlvblZhcmlhbnQsXG5cdFx0XHRcdGlTdXBwcmVzc2lvbkJlaGF2aW9yXG5cdFx0XHQpO1xuXHRcdFx0c1N1YlNlbGVjdGlvblZhcmlhbnQgPSBvTWl4ZWRTZWxWYXIudG9KU09OU3RyaW5nKCk7XG5cblx0XHRcdC8vIGVucmljaCB0aGUgc2VtYW50aWMgYXR0cmlidXRlcyB3aXRoIHNpbmdsZSBzZWxlY3Rpb25zIGZyb20gdGhlIHNlbGVjdGlvbiB2YXJpYW50XG5cdFx0XHRsZXQgb1RtcERhdGE6IGFueSA9IHt9O1xuXHRcdFx0b1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudCA9IG9NaXhlZFNlbFZhci50b0pTT05PYmplY3QoKTtcblxuXHRcdFx0b1RtcERhdGEgPSBvTmF2SGFuZGxlci5fcmVtb3ZlTWVhc3VyZUJhc2VkSW5mb3JtYXRpb24ob1RtcERhdGEpO1xuXG5cdFx0XHRvVG1wRGF0YSA9IG9OYXZIYW5kbGVyLl9jaGVja0lzUG90ZW50aWFsbHlTZW5zaXRpdmUob1RtcERhdGEpO1xuXG5cdFx0XHRtU3ViU2VtYW50aWNBdHRyaWJ1dGVzID0gb1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudFxuXHRcdFx0XHQ/IG9OYXZIYW5kbGVyLl9nZXRVUkxQYXJhbWV0ZXJzRnJvbVNlbGVjdGlvblZhcmlhbnQobmV3IFNlbGVjdGlvblZhcmlhbnQob1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudCkpXG5cdFx0XHRcdDoge307XG5cblx0XHRcdGNvbnN0IGZuT25Db250YWluZXJTYXZlID0gZnVuY3Rpb24gKHNBcHBTdGF0ZUtleTogYW55KTogdm9pZCB7XG5cdFx0XHRcdGlmIChvVGFibGVFdmVudFBhcmFtZXRlcnMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdC8vIElmIG9UYWJsZUV2ZW50UGFyYW1ldGVycyBpcyB1bmRlZmluZWQsIHJldHVybiBib3RoIHNlbWFudGljQXR0cmlidXRlcyBhbmQgYXBwU3RhdGVrZXlcblx0XHRcdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKG1TdWJTZW1hbnRpY0F0dHJpYnV0ZXMsIHNBcHBTdGF0ZUtleSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gc2V0IHRoZSBzdG9yZWQgZGF0YSBpbiBwb3BvdmVyIGFuZCBjYWxsIG9wZW4oKVxuXHRcdFx0XHRcdG9UYWJsZUV2ZW50UGFyYW1ldGVycy5zZXRTZW1hbnRpY0F0dHJpYnV0ZXMobVN1YlNlbWFudGljQXR0cmlidXRlcyk7XG5cdFx0XHRcdFx0b1RhYmxlRXZlbnRQYXJhbWV0ZXJzLnNldEFwcFN0YXRlS2V5KHNBcHBTdGF0ZUtleSk7XG5cdFx0XHRcdFx0b1RhYmxlRXZlbnRQYXJhbWV0ZXJzLm9wZW4oKTsgLy8gPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4gTm90ZSB0aGF0IFwib3BlblwiIGRvZXMgbm90IG9wZW4gdGhlIHBvcG92ZXIsIGJ1dCBwcm9jZWVkc1xuXHRcdFx0XHRcdC8vIHdpdGggZmlyaW5nIHRoZSBvbk5hdlRhcmdldHNPYnRhaW5lZCBldmVudC5cblx0XHRcdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKG9UYWJsZUV2ZW50UGFyYW1ldGVycyk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdGNvbnN0IGZuT25FcnJvciA9IGZ1bmN0aW9uIChvRXJyb3I6IGFueSk6IHZvaWQge1xuXHRcdFx0XHRvTXlEZWZlcnJlZC5yZWplY3Qob0Vycm9yKTtcblx0XHRcdH07XG5cblx0XHRcdG9YQXBwRGF0YU9iai5zZWxlY3Rpb25WYXJpYW50ID0gc1N1YlNlbGVjdGlvblZhcmlhbnQ7XG5cblx0XHRcdG9YQXBwRGF0YU9iaiA9IG9OYXZIYW5kbGVyLl9yZW1vdmVNZWFzdXJlQmFzZWRJbmZvcm1hdGlvbihvWEFwcERhdGFPYmopO1xuXG5cdFx0XHRvTmF2SGFuZGxlci5fc2F2ZUFwcFN0YXRlQXN5bmMob1hBcHBEYXRhT2JqLCBmbk9uQ29udGFpbmVyU2F2ZSwgZm5PbkVycm9yKTtcblx0XHR9O1xuXG5cdFx0aWYgKG1Jbm5lckFwcERhdGEpIHtcblx0XHRcdGNvbnN0IG9TdG9yZUlubmVyQXBwU3RhdGVQcm9taXNlID0gdGhpcy5zdG9yZUlubmVyQXBwU3RhdGVBc3luYyhtSW5uZXJBcHBEYXRhLCB0cnVlKTtcblxuXHRcdFx0Ly8gaWYgdGhlIGlubmVyIGFwcCBzdGF0ZSB3YXMgc3VjY2Vzc2Z1bGx5IHN0b3JlZCwgc3RvcmUgYWxzbyB0aGUgeGFwcC1zdGF0ZVxuXHRcdFx0b1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UuZG9uZShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGZuU3RvcmVYYXBwQW5kQ2FsbE9wZW4obVNlbWFudGljQXR0cmlidXRlcywgc1NlbGVjdGlvblZhcmlhbnQpO1xuXHRcdFx0fSk7XG5cblx0XHRcdG9TdG9yZUlubmVyQXBwU3RhdGVQcm9taXNlLmZhaWwoZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdG9NeURlZmVycmVkLnJlamVjdChvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHRoZXJlIGlzIG5vIGlubmVyIGFwcCBzdGF0ZSB0byBzYXZlLCBqdXN0IHB1dCB0aGUgcGFyYW1ldGVycyBpbnRvIHhhcHAtc3RhdGVcblx0XHRcdGZuU3RvcmVYYXBwQW5kQ2FsbE9wZW4obVNlbWFudGljQXR0cmlidXRlcywgc1NlbGVjdGlvblZhcmlhbnQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBvTXlEZWZlcnJlZC5wcm9taXNlKCk7XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2Vzc2VzIHNlbGVjdGlvblZhcmlhbnQgc3RyaW5nIGFuZCByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgKHNlbWFudGljQXR0cmlidXRlcyBhbmQgQXBwU3RhdGVLZXkpLlxuXHQgKiBAcGFyYW0gc1NlbGVjdGlvblZhcmlhbnQgU3RyaW5naWZpZWQgSlNPTiBvYmplY3Rcblx0ICogQHJldHVybnMgQSBQcm9taXNlIG9iamVjdCB0byBtb25pdG9yIHdoZW4gYWxsIGFjdGlvbnMgb2YgdGhlIGZ1bmN0aW9uIGhhdmUgYmVlbiBleGVjdXRlZDsgaWYgdGhlIGV4ZWN1dGlvbiBpcyBzdWNjZXNzZnVsLCB0aGVcblx0ICogICAgICAgICAgc2VtYW50aWNBdHRyaWJ1dGVzIGFzIHdlbGwgYXMgdGhlIGFwcFN0YXRlS2V5IGFyZSByZXR1cm5lZDsgaWYgYW4gZXJyb3Igb2NjdXJzLCBhbiBlcnJvciBvYmplY3Qgb2YgdHlwZVxuXHQgKiAgICAgICAgICB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2RXJyb3J9IGlzIHJldHVybmVkXG5cdCAqIDxicj5cblx0ICogQGV4YW1wbGUgPGNvZGU+XG5cdCAqIHNhcC51aS5kZWZpbmUoW1wic2FwL2ZlL25hdmlnYXRpb24vTmF2aWdhdGlvbkhhbmRsZXJcIiwgXCJzYXAvZmUvbmF2aWdhdGlvbi9TZWxlY3Rpb25WYXJpYW50XCJdLCBmdW5jdGlvbiAoTmF2aWdhdGlvbkhhbmRsZXIsIFNlbGVjdGlvblZhcmlhbnQpIHtcblx0ICogXHRcdHZhciBvU2VsZWN0aW9uVmFyaWFudCA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KCk7XG5cdCAqIFx0XHRvU2VsZWN0aW9uVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oXCJDb21wYW55Q29kZVwiLCBcIklcIiwgXCJFUVwiLCBcIjAwMDFcIik7XG5cdCAqIFx0XHRvU2VsZWN0aW9uVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oXCJDdXN0b21lclwiLCBcIklcIiwgXCJFUVwiLCBcIkMwMDAxXCIpO1xuXHQgKiBcdFx0dmFyIHNTZWxlY3Rpb25WYXJpYW50PSBvU2VsZWN0aW9uVmFyaWFudC50b0pTT05TdHJpbmcoKTtcblx0ICpcblx0ICogXHRcdHZhciBvTmF2aWdhdGlvbkhhbmRsZXIgPSBuZXcgTmF2aWdhdGlvbkhhbmRsZXIob0NvbnRyb2xsZXIpO1xuXHQgKiBcdFx0dmFyIG9Qcm9taXNlT2JqZWN0ID0gb05hdmlnYXRpb25IYW5kbGVyLl9nZXRBcHBTdGF0ZUtleUFuZFVybFBhcmFtZXRlcnMoc1NlbGVjdGlvblZhcmlhbnQpO1xuXHQgKlxuXHQgKiBcdFx0b1Byb21pc2VPYmplY3QuZG9uZShmdW5jdGlvbihvU2VtYW50aWNBdHRyaWJ1dGVzLCBzQXBwU3RhdGVLZXkpe1xuXHQgKiBcdFx0XHQvLyBoZXJlIHlvdSBjYW4gYWRkIGNvZGluZyB0aGF0IHNob3VsZCBydW4gYWZ0ZXIgYWxsIGFwcCBzdGF0ZSBhbmQgdGhlIHNlbWFudGljIGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIHJldHVybmVkLlxuXHQgKiBcdFx0fSk7XG5cdCAqXG5cdCAqIFx0XHRvUHJvbWlzZU9iamVjdC5mYWlsKGZ1bmN0aW9uKG9FcnJvcil7XG5cdCAqIFx0XHRcdC8vc29tZSBlcnJvciBoYW5kbGluZ1xuXHQgKiBcdFx0fSk7XG5cdCAqXHR9KTtcblx0ICogPC9jb2RlPlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcm9taXNlLWZ1bmN0aW9uLWFzeW5jXG5cdF9nZXRBcHBTdGF0ZUtleUFuZFVybFBhcmFtZXRlcnMoc1NlbGVjdGlvblZhcmlhbnQ6IHN0cmluZyk6IEpRdWVyeS5Qcm9taXNlPHN0cmluZ1tdLCB1bmtub3duLCB1bmtub3duPiB7XG5cdFx0cmV0dXJuIHRoaXMucHJvY2Vzc0JlZm9yZVNtYXJ0TGlua1BvcG92ZXJPcGVucyh1bmRlZmluZWQsIHNTZWxlY3Rpb25WYXJpYW50LCB1bmRlZmluZWQsIHVuZGVmaW5lZCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IEFwcCBzcGVjaWZpYyBoYXNoLlxuXHQgKiBAcGFyYW0gYXBwSGFzaCBUaGUgcGF0aCBzdHJpbmdcblx0ICogQHJldHVybnMgQSBzdHJpbmcgcmVwcmVzZW50aW5nIGJhc2UgcGF0aFxuXHQgKi9cblx0YXN5bmMgX2dldEFwcFNwZWNpZmljSGFzaChhcHBIYXNoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBjcm9zc0FwcFNlcnZpY2UgPSBhd2FpdCB0aGlzLl9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZUFzeW5jKCk7XG5cdFx0XHRyZXR1cm4gYXdhaXQgY3Jvc3NBcHBTZXJ2aWNlLmdldEhyZWYoeyBhcHBTcGVjaWZpY1JvdXRlOiBhcHBIYXNoIH0pO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuXHRcdFx0TG9nLmVycm9yKGBGRSA6IENhbiBub3QgZmV0Y2ggQXBwIHNlcGNpZmljIFVSTCA6ICR7bWVzc2FnZX1gKTtcblx0XHRcdHRocm93IEVycm9yKG1lc3NhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdF9taXhBdHRyaWJ1dGVzVG9TZWxWYXJpYW50KFxuXHRcdG1TZW1hbnRpY0F0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdG9TZWxWYXJpYW50OiBTZWxlY3Rpb25WYXJpYW50LFxuXHRcdGlTdXBwcmVzc2lvbkJlaGF2aW9yOiBhbnlcblx0KTogU2VsZWN0aW9uVmFyaWFudCB7XG5cdFx0Ly8gYWRkIGFsbCBzZW1hbnRpYyBhdHRyaWJ1dGVzIHRvIHRoZSBtaXhlZCBzZWxlY3Rpb24gdmFyaWFudFxuXHRcdGZvciAoY29uc3Qgc1Byb3BlcnR5TmFtZSBpbiBtU2VtYW50aWNBdHRyaWJ1dGVzKSB7XG5cdFx0XHRpZiAobVNlbWFudGljQXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eShzUHJvcGVydHlOYW1lKSkge1xuXHRcdFx0XHQvLyBBIHZhbHVlIG9mIGEgc2VtYW50aWMgYXR0cmlidXRlIG1heSBub3QgYmUgYSBzdHJpbmcsIGJ1dCBjYW4gYmUgZS5nLiBhIGRhdGUuXG5cdFx0XHRcdC8vIFNpbmNlIHRoZSBzZWxlY3Rpb24gdmFyaWFudCBhY2NlcHRzIG9ubHkgYSBzdHJpbmcsIHdlIGhhdmUgdG8gY29udmVydCBpdCBpbiBkZXBlbmRlbmNlIG9mIHRoZSB0eXBlLlxuXHRcdFx0XHRsZXQgdlNlbWFudGljQXR0cmlidXRlVmFsdWUgPSBtU2VtYW50aWNBdHRyaWJ1dGVzW3NQcm9wZXJ0eU5hbWVdO1xuXHRcdFx0XHRpZiAodlNlbWFudGljQXR0cmlidXRlVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG5cdFx0XHRcdFx0Ly8gdXNlIHRoZSBzYW1lIGNvbnZlcnNpb24gbWV0aG9kIGZvciBkYXRlcyBhcyB0aGUgU21hcnRGaWx0ZXJCYXI6IHRvSlNPTigpXG5cdFx0XHRcdFx0dlNlbWFudGljQXR0cmlidXRlVmFsdWUgPSB2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZS50b0pTT04oKTtcblx0XHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0XHRBcnJheS5pc0FycmF5KHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlKSB8fFxuXHRcdFx0XHRcdCh2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSAmJiB0eXBlb2YgdlNlbWFudGljQXR0cmlidXRlVmFsdWUgPT09IFwib2JqZWN0XCIpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlID0gSlNPTi5zdHJpbmdpZnkodlNlbWFudGljQXR0cmlidXRlVmFsdWUpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdlNlbWFudGljQXR0cmlidXRlVmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG5cdFx0XHRcdFx0dlNlbWFudGljQXR0cmlidXRlVmFsdWUgPSB2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZS50b1N0cmluZygpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlID09PSBcIlwiKSB7XG5cdFx0XHRcdFx0aWYgKGlTdXBwcmVzc2lvbkJlaGF2aW9yICYgU3VwcHJlc3Npb25CZWhhdmlvci5pZ25vcmVFbXB0eVN0cmluZykge1xuXHRcdFx0XHRcdFx0TG9nLmluZm8oXG5cdFx0XHRcdFx0XHRcdFwiU2VtYW50aWMgYXR0cmlidXRlIFwiICtcblx0XHRcdFx0XHRcdFx0XHRzUHJvcGVydHlOYW1lICtcblx0XHRcdFx0XHRcdFx0XHRcIiBpcyBhbiBlbXB0eSBzdHJpbmcgYW5kIGR1ZSB0byB0aGUgY2hvc2VuIFN1cHByZXNzaW9uIEJlaGlhdm91ciBpcyBiZWluZyBpZ25vcmVkLlwiXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlID09PSBudWxsKSB7XG5cdFx0XHRcdFx0aWYgKGlTdXBwcmVzc2lvbkJlaGF2aW9yICYgU3VwcHJlc3Npb25CZWhhdmlvci5yYWlzZUVycm9yT25OdWxsKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUXCIpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRMb2cud2FybmluZyhcIlNlbWFudGljIGF0dHJpYnV0ZSBcIiArIHNQcm9wZXJ0eU5hbWUgKyBcIiBpcyBudWxsIGFuZCBpZ25vcmVkIGZvciBtaXggaW4gdG8gc2VsZWN0aW9uIHZhcmlhbnRcIik7XG5cdFx0XHRcdFx0XHRjb250aW51ZTsgLy8gaWdub3JlIVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0aWYgKGlTdXBwcmVzc2lvbkJlaGF2aW9yICYgU3VwcHJlc3Npb25CZWhhdmlvci5yYWlzZUVycm9yT25VbmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdExvZy53YXJuaW5nKFwiU2VtYW50aWMgYXR0cmlidXRlIFwiICsgc1Byb3BlcnR5TmFtZSArIFwiIGlzIHVuZGVmaW5lZCBhbmQgaWdub3JlZCBmb3IgbWl4IGluIHRvIHNlbGVjdGlvbiB2YXJpYW50XCIpO1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHR5cGVvZiB2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykge1xuXHRcdFx0XHRcdG9TZWxWYXJpYW50LmFkZFNlbGVjdE9wdGlvbihzUHJvcGVydHlOYW1lLCBcIklcIiwgXCJFUVwiLCB2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZS50b1N0cmluZygpKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvU2VsVmFyaWFudDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb21iaW5lcyB0aGUgZ2l2ZW4gcGFyYW1ldGVycyBhbmQgc2VsZWN0aW9uIHZhcmlhbnQgaW50byBhIG5ldyBzZWxlY3Rpb24gdmFyaWFudCBjb250YWluaW5nIHByb3BlcnRpZXMgZnJvbSBib3RoLCB3aXRoIHRoZSBwYXJhbWV0ZXJzXG5cdCAqIG92ZXJyaWRpbmcgZXhpc3RpbmcgcHJvcGVydGllcyBpbiB0aGUgc2VsZWN0aW9uIHZhcmlhbnQuIFRoZSBuZXcgc2VsZWN0aW9uIHZhcmlhbnQgZG9lcyBub3QgY29udGFpbiBhbnkgcGFyYW1ldGVycy4gQWxsIHBhcmFtZXRlcnMgYXJlXG5cdCAqIG1lcmdlZCBpbnRvIHNlbGVjdCBvcHRpb25zLiBUaGUgb3V0cHV0IG9mIHRoaXMgZnVuY3Rpb24sIGNvbnZlcnRlZCB0byBhIEpTT04gc3RyaW5nLCBjYW4gYmUgdXNlZCBmb3IgdGhlXG5cdCAqIHtAbGluayAjLm5hdmlnYXRlIE5hdmlnYXRpb25IYW5kbGVyLm5hdmlnYXRlfSBtZXRob2QuXG5cdCAqIEBwYXJhbSB2U2VtYW50aWNBdHRyaWJ1dGVzIE9iamVjdC8oQXJyYXkgb2YgT2JqZWN0cykgY29udGFpbmluZyBrZXkvdmFsdWUgcGFpcnNcblx0ICogQHBhcmFtIHNTZWxlY3Rpb25WYXJpYW50IFRoZSBzZWxlY3Rpb24gdmFyaWFudCBpbiBzdHJpbmcgZm9ybWF0IGFzIHByb3ZpZGVkIGJ5IHRoZSBTbWFydEZpbHRlckJhciBjb250cm9sXG5cdCAqIEBwYXJhbSBpU3VwcHJlc3Npb25CZWhhdmlvciBJbmRpY2F0ZXMgd2hldGhlciBzZW1hbnRpY1xuXHQgKiAgICAgICAgYXR0cmlidXRlcyB3aXRoIHNwZWNpYWwgdmFsdWVzIChzZWUge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLlN1cHByZXNzaW9uQmVoYXZpb3Igc3VwcHJlc3Npb24gYmVoYXZpb3J9KSBtdXN0IGJlXG5cdCAqICAgICAgICBzdXBwcmVzc2VkIGJlZm9yZSB0aGV5IGFyZSBjb21iaW5lZCB3aXRoIHRoZSBzZWxlY3Rpb24gdmFyaWFudDsgc2V2ZXJhbFxuXHQgKiAgICAgICAge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLlN1cHByZXNzaW9uQmVoYXZpb3Igc3VwcHJlc3Npb24gYmVoYXZpb3JzfSBjYW4gYmUgY29tYmluZWQgd2l0aCB0aGUgYml0d2lzZSBPUiBvcGVyYXRvclxuXHQgKiAgICAgICAgKHwpXG5cdCAqIEByZXR1cm5zIEluc3RhbmNlIG9mIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5TZWxlY3Rpb25WYXJpYW50fVxuXHQgKiBAcHVibGljXG5cdCAqIEBleGFtcGxlIDxjb2RlPlxuXHQgKiBzYXAudWkuZGVmaW5lKFtcInNhcC9mZS9uYXZpZ2F0aW9uL05hdmlnYXRpb25IYW5kbGVyXCIsIFwic2FwL2ZlL25hdmlnYXRpb24vU2VsZWN0aW9uVmFyaWFudFwiXSwgZnVuY3Rpb24gKE5hdmlnYXRpb25IYW5kbGVyLCBTZWxlY3Rpb25WYXJpYW50KSB7XG5cdCAqIFx0dmFyIHZTZW1hbnRpY0F0dHJpYnV0ZXMgPSB7IFwiQ3VzdG9tZXJcIiA6IFwiQzAwMDFcIiB9O1xuXHQgKiBcdG9yXG5cdCAqIFx0dmFyIHZTZW1hbnRpY0F0dHJpYnV0ZXMgPSBbeyBcIkN1c3RvbWVyXCIgOiBcIkMwMDAxXCIgfSx7IFwiQ3VzdG9tZXJcIiA6IFwiQzAwMDJcIiB9XTtcblx0ICogXHR2YXIgc1NlbGVjdGlvblZhcmlhbnQgPSBvU21hcnRGaWx0ZXJCYXIuZ2V0RGF0YVN1aXRlRm9ybWF0KCk7XG5cdCAqIFx0dmFyIG9OYXZpZ2F0aW9uSGFuZGxlciA9IG5ldyBOYXZpZ2F0aW9uSGFuZGxlcihvQ29udHJvbGxlcik7XG5cdCAqIFx0dmFyIHNOYXZpZ2F0aW9uU2VsZWN0aW9uVmFyaWFudCA9IG9OYXZpZ2F0aW9uSGFuZGxlci5taXhBdHRyaWJ1dGVzQW5kU2VsZWN0aW9uVmFyaWFudCh2U2VtYW50aWNBdHRyaWJ1dGVzLCBzU2VsZWN0aW9uVmFyaWFudCkudG9KU09OU3RyaW5nKCk7XG5cdCAqIFx0Ly8gSW4gY2FzZSBvZiBhbiB2U2VtYW50aWNBdHRyaWJ1dGVzIGJlaW5nIGFuIGFycmF5LCB0aGUgc2VtYW50aWNBdHRyaWJ1dGVzIGFyZSBtZXJnZWQgdG8gYSBzaW5nbGUgU1YgYW5kIGNvbXBhcmVkIGFnYWluc3QgdGhlIHNTZWxlY3Rpb25WYXJpYW50KHNlY29uZCBhZ3J1bWVudCkuXG5cdCAqIFx0Ly8gT3B0aW9uYWxseSwgeW91IGNhbiBzcGVjaWZ5IG9uZSBvciBzZXZlcmFsIHN1cHByZXNzaW9uIGJlaGF2aW9ycy4gU2V2ZXJhbCBzdXBwcmVzc2lvbiBiZWhhdmlvcnMgYXJlIGNvbWJpbmVkIHdpdGggdGhlIGJpdHdpc2UgT1Igb3BlcmF0b3IsIGUuZy5cblx0ICogXHQvLyB2YXIgaVN1cHByZXNzaW9uQmVoYXZpb3IgPSBzYXAuZmUubmF2aWdhdGlvbi5TdXBwcmVzc2lvbkJlaGF2aW9yLnJhaXNlRXJyb3JPbk51bGwgfCBzYXAuZmUubmF2aWdhdGlvbi5TdXBwcmVzc2lvbkJlaGF2aW9yLnJhaXNlRXJyb3JPblVuZGVmaW5lZDtcblx0ICogXHQvLyB2YXIgc05hdmlnYXRpb25TZWxlY3Rpb25WYXJpYW50ID0gb05hdmlnYXRpb25IYW5kbGVyLm1peEF0dHJpYnV0ZXNBbmRTZWxlY3Rpb25WYXJpYW50KG1TZW1hbnRpY0F0dHJpYnV0ZXMsIHNTZWxlY3Rpb25WYXJpYW50LCBpU3VwcHJlc3Npb25CZWhhdmlvcikudG9KU09OU3RyaW5nKCk7XG5cdCAqXG5cdCAqIFx0b05hdmlnYXRpb25IYW5kbGVyLm5hdmlnYXRlKFwiU2FsZXNPcmRlclwiLCBcImNyZWF0ZVwiLCBzTmF2aWdhdGlvblNlbGVjdGlvblZhcmlhbnQpO1xuXHQgKiB9KTtcblx0ICogPC9jb2RlPlxuXHQgKi9cblx0bWl4QXR0cmlidXRlc0FuZFNlbGVjdGlvblZhcmlhbnQoXG5cdFx0dlNlbWFudGljQXR0cmlidXRlczogb2JqZWN0IHwgYW55W10sXG5cdFx0c1NlbGVjdGlvblZhcmlhbnQ6IHN0cmluZyB8IFNlcmlhbGl6ZWRTZWxlY3Rpb25WYXJpYW50LFxuXHRcdGlTdXBwcmVzc2lvbkJlaGF2aW9yOiBudW1iZXIgPSBTdXBwcmVzc2lvbkJlaGF2aW9yLnN0YW5kYXJkXG5cdCk6IFNlbGVjdGlvblZhcmlhbnQge1xuXHRcdGNvbnN0IG9TZWxlY3Rpb25WYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoc1NlbGVjdGlvblZhcmlhbnQpO1xuXHRcdGNvbnN0IG9OZXdTZWxWYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoKTtcblx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXM7XG5cblx0XHRjb25zdCBmaWx0ZXJVcmwgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRGaWx0ZXJDb250ZXh0VXJsKCk7XG5cdFx0aWYgKGZpbHRlclVybCkge1xuXHRcdFx0b05ld1NlbFZhcmlhbnQuc2V0RmlsdGVyQ29udGV4dFVybChmaWx0ZXJVcmwpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbnRleHRVcmwgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRQYXJhbWV0ZXJDb250ZXh0VXJsKCk7XG5cdFx0aWYgKGNvbnRleHRVcmwpIHtcblx0XHRcdG9OZXdTZWxWYXJpYW50LnNldFBhcmFtZXRlckNvbnRleHRVcmwoY29udGV4dFVybCk7XG5cdFx0fVxuXHRcdGlmIChBcnJheS5pc0FycmF5KHZTZW1hbnRpY0F0dHJpYnV0ZXMpKSB7XG5cdFx0XHR2U2VtYW50aWNBdHRyaWJ1dGVzLmZvckVhY2goZnVuY3Rpb24gKG1TZW1hbnRpY0F0dHJpYnV0ZXM6IGFueSkge1xuXHRcdFx0XHRvTmF2SGFuZGxlci5fbWl4QXR0cmlidXRlc1RvU2VsVmFyaWFudChtU2VtYW50aWNBdHRyaWJ1dGVzLCBvTmV3U2VsVmFyaWFudCwgaVN1cHByZXNzaW9uQmVoYXZpb3IpO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX21peEF0dHJpYnV0ZXNUb1NlbFZhcmlhbnQodlNlbWFudGljQXR0cmlidXRlcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgb05ld1NlbFZhcmlhbnQsIGlTdXBwcmVzc2lvbkJlaGF2aW9yKTtcblx0XHR9XG5cblx0XHQvLyBhZGQgcGFyYW1ldGVycyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgb05ld1NlbFZhcmlhbnQgeWV0XG5cdFx0Y29uc3QgYVBhcmFtZXRlcnMgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRQYXJhbWV0ZXJOYW1lcygpO1xuXHRcdGxldCBpO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBhUGFyYW1ldGVycy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKCFvTmV3U2VsVmFyaWFudC5nZXRTZWxlY3RPcHRpb24oYVBhcmFtZXRlcnNbaV0pKSB7XG5cdFx0XHRcdG9OZXdTZWxWYXJpYW50LmFkZFNlbGVjdE9wdGlvbihhUGFyYW1ldGVyc1tpXSwgXCJJXCIsIFwiRVFcIiwgb1NlbGVjdGlvblZhcmlhbnQuZ2V0UGFyYW1ldGVyKGFQYXJhbWV0ZXJzW2ldKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gYWRkIHNlbE9wdGlvbnMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIG9OZXdTZWxWYXJpYW50IHlldFxuXHRcdGNvbnN0IGFTZWxPcHRpb25OYW1lcyA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzKCk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGFTZWxPcHRpb25OYW1lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Ly8gYWRkIHNlbE9wdGlvbnMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIG9OZXdTZWxWYXJpYW50IHlldFxuXHRcdFx0Y29uc3QgYVNlbGVjdE9wdGlvbjogYW55W10gPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb24oYVNlbE9wdGlvbk5hbWVzW2ldKSE7XG5cdFx0XHRpZiAoIW9OZXdTZWxWYXJpYW50LmdldFNlbGVjdE9wdGlvbihhU2VsT3B0aW9uTmFtZXNbaV0pKSB7XG5cdFx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgYVNlbGVjdE9wdGlvbi5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRcdG9OZXdTZWxWYXJpYW50LmFkZFNlbGVjdE9wdGlvbihcblx0XHRcdFx0XHRcdGFTZWxPcHRpb25OYW1lc1tpXSxcblx0XHRcdFx0XHRcdGFTZWxlY3RPcHRpb25bal0uU2lnbixcblx0XHRcdFx0XHRcdGFTZWxlY3RPcHRpb25bal0uT3B0aW9uLFxuXHRcdFx0XHRcdFx0YVNlbGVjdE9wdGlvbltqXS5Mb3csXG5cdFx0XHRcdFx0XHRhU2VsZWN0T3B0aW9uW2pdLkhpZ2hcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9OZXdTZWxWYXJpYW50O1xuXHR9XG5cblx0X2Vuc3VyZVNlbGVjdGlvblZhcmlhbnRGb3JtYXRTdHJpbmcodlNlbGVjdGlvblZhcmlhbnQ6IHVua25vd24pOiB1bmtub3duIHtcblx0XHQvKlxuXHRcdCAqIFRoZXJlIGFyZSBsZWdhY3kgQXBwU3RhdGVzIHdoZXJlIHRoZSBTZWxlY3Rpb25WYXJpYW50IGlzIGJlaW5nIHN0b3JlZCBhcyBhIHN0cmluZy4gSG93ZXZlciwgdGhhdCBpcyBub3QgY29tcGxpYW50IHRvIHRoZSBzcGVjaWZpY2F0aW9uLFxuXHRcdCAqIHdoaWNoIHN0YXRlcyB0aGF0IGEgc3RhbmRhcmQgSlMgb2JqZWN0IHNoYWxsIGJlIHByb3ZpZGVkLiBJbnRlcm5hbGx5LCBob3dldmVyLCB0aGUgc2VsZWN0aW9uVmFyaWFudCBpcyBhbHdheXMgb2YgdHlwZSBzdHJpbmcuIFNpdHVhdGlvblxuXHRcdCAqIFBlcnNpc3RlbmN5IGludGVybmFsIEFQSSAtLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gbGVnYWN5IHN0cmluZyBzdHJpbmcgbmV3IGFwcHJvYWNoIChKU09OKSBvYmplY3Rcblx0XHQgKiBzdHJpbmdcblx0XHQgKi9cblxuXHRcdGlmICh2U2VsZWN0aW9uVmFyaWFudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGxldCB2Q29udmVydGVkU2VsZWN0aW9uVmFyaWFudCA9IHZTZWxlY3Rpb25WYXJpYW50O1xuXG5cdFx0aWYgKHR5cGVvZiB2U2VsZWN0aW9uVmFyaWFudCA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0dkNvbnZlcnRlZFNlbGVjdGlvblZhcmlhbnQgPSBKU09OLnN0cmluZ2lmeSh2U2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZDb252ZXJ0ZWRTZWxlY3Rpb25WYXJpYW50O1xuXHR9XG5cblx0X2ZuSGFuZGxlQXBwU3RhdGVQcm9taXNlKG9SZXR1cm46IFNoZWxsQXBwU3RhdGVSZXR1cm4sIGZuT25BZnRlclNhdmU/OiBGdW5jdGlvbiwgZm5PbkVycm9yPzogRnVuY3Rpb24pOiB2b2lkIHtcblx0XHRvUmV0dXJuLnByb21pc2UuZG9uZShmdW5jdGlvbiAoKSB7XG5cdFx0XHRpZiAoZm5PbkFmdGVyU2F2ZSkge1xuXHRcdFx0XHRmbk9uQWZ0ZXJTYXZlKG9SZXR1cm4uYXBwU3RhdGVLZXkpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aWYgKGZuT25FcnJvcikge1xuXHRcdFx0Y29uc3Qgb05hdkhhbmRsZXIgPSB0aGlzO1xuXHRcdFx0b1JldHVybi5wcm9taXNlLmZhaWwoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRjb25zdCBvRXJyb3IgPSBvTmF2SGFuZGxlci5fY3JlYXRlVGVjaG5pY2FsRXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5BcHBTdGF0ZVNhdmUuZmFpbGVkXCIpO1xuXHRcdFx0XHRmbk9uRXJyb3Iob0Vycm9yKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIF9zYXZlQXBwU3RhdGVBc3luYyhvQXBwRGF0YTogSW5uZXJBcHBEYXRhLCBmbk9uQWZ0ZXJTYXZlOiBGdW5jdGlvbiwgZm5PbkVycm9yOiBGdW5jdGlvbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG5cdFx0Y29uc3Qgb05hdkhhbmRsZXIgPSB0aGlzO1xuXHRcdHJldHVybiB0aGlzLl9mblNhdmVBcHBTdGF0ZUFzeW5jKG9BcHBEYXRhLCBmbk9uRXJyb3IpLnRoZW4oZnVuY3Rpb24gKFxuXHRcdFx0b1JldHVybjogU2hlbGxBcHBTdGF0ZVJldHVybiB8IHVuZGVmaW5lZCB8IHZvaWRcblx0XHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdFx0aWYgKG9SZXR1cm4pIHtcblx0XHRcdFx0b05hdkhhbmRsZXIuX2ZuSGFuZGxlQXBwU3RhdGVQcm9taXNlKG9SZXR1cm4sIGZuT25BZnRlclNhdmUsIGZuT25FcnJvcik7XG5cdFx0XHRcdHJldHVybiBvUmV0dXJuLmFwcFN0YXRlS2V5O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH0pO1xuXHR9XG5cblx0X3NhdmVBcHBTdGF0ZShvQXBwRGF0YTogSW5uZXJBcHBEYXRhLCBmbk9uQWZ0ZXJTYXZlOiBGdW5jdGlvbiwgZm5PbkVycm9yOiBGdW5jdGlvbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgb1JldHVybiA9IHRoaXMuX3NhdmVBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4ob0FwcERhdGEsIGZuT25FcnJvcik7XG5cdFx0aWYgKG9SZXR1cm4pIHtcblx0XHRcdHRoaXMuX2ZuSGFuZGxlQXBwU3RhdGVQcm9taXNlKG9SZXR1cm4sIGZuT25BZnRlclNhdmUsIGZuT25FcnJvcik7XG5cdFx0XHRyZXR1cm4gb1JldHVybi5hcHBTdGF0ZUtleTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0X2ZuU2F2ZUFwcFN0YXRlV2l0aEltbWVkaWF0ZVJldHVybihcblx0XHRvQXBwRGF0YTogSW5uZXJBcHBEYXRhLFxuXHRcdG9BcHBTdGF0ZTogU2hlbGxBcHBTdGF0ZSxcblx0XHRmbk9uRXJyb3I/OiBGdW5jdGlvblxuXHQpOiB7IGFwcFN0YXRlS2V5OiBzdHJpbmc7IHByb21pc2U6IEpRdWVyeS5Qcm9taXNlPHN0cmluZz4gfSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgc0FwcFN0YXRlS2V5ID0gb0FwcFN0YXRlLmdldEtleSgpO1xuXHRcdGNvbnN0IG9BcHBEYXRhRm9yU2F2ZSA9IHRoaXMuX2ZldGNoQXBwRGF0YUZvclNhdmUob0FwcERhdGEsIGZuT25FcnJvcik7XG5cdFx0aWYgKCFvQXBwRGF0YUZvclNhdmUpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdG9BcHBTdGF0ZS5zZXREYXRhKG9BcHBEYXRhRm9yU2F2ZSk7XG5cdFx0Y29uc3Qgb1NhdmVQcm9taXNlID0gb0FwcFN0YXRlLnNhdmUoKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRhcHBTdGF0ZUtleTogc0FwcFN0YXRlS2V5LFxuXHRcdFx0cHJvbWlzZTogb1NhdmVQcm9taXNlLnByb21pc2UoKVxuXHRcdH07XG5cdH1cblxuXHRfZmV0Y2hBcHBEYXRhRm9yU2F2ZShvQXBwRGF0YTogSW5uZXJBcHBEYXRhLCBmbk9uRXJyb3I6IGFueSk6IElubmVyQXBwRGF0YSB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IG9BcHBEYXRhRm9yU2F2ZTogUGFydGlhbDxJbm5lckFwcERhdGE+ID0ge307XG5cblx0XHRpZiAob0FwcERhdGEuaGFzT3duUHJvcGVydHkoXCJzZWxlY3Rpb25WYXJpYW50XCIpKSB7XG5cdFx0XHRvQXBwRGF0YUZvclNhdmUuc2VsZWN0aW9uVmFyaWFudCA9IG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQ7XG5cblx0XHRcdGlmIChvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0XHRcdC8qXG5cdFx0XHRcdCAqIFRoZSBzcGVjaWZpY2F0aW9uIHN0YXRlcyB0aGF0IFNlbGVjdGlvbiBWYXJpYW50cyBuZWVkIHRvIGJlIEpTT04gb2JqZWN0cy4gSG93ZXZlciwgaW50ZXJuYWxseSwgd2Ugd29yayB3aXRoIHN0cmluZ3MgZm9yXG5cdFx0XHRcdCAqIFwic2VsZWN0aW9uVmFyaWFudFwiLiBUaGVyZWZvcmUsIGluIGNhc2UgdGhhdCB0aGlzIGlzIGEgc3RyaW5nLCB3ZSBuZWVkIHRvIEpTT04tcGFyc2UgdGhlIGRhdGEuXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRpZiAodHlwZW9mIG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0b0FwcERhdGFGb3JTYXZlLnNlbGVjdGlvblZhcmlhbnQgPSBKU09OLnBhcnNlKG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKHgpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9FcnJvciA9IHRoaXMuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuQXBwU3RhdGVTYXZlLnBhcnNlRXJyb3JcIik7XG5cdFx0XHRcdFx0XHRpZiAoZm5PbkVycm9yKSB7XG5cdFx0XHRcdFx0XHRcdGZuT25FcnJvcihvRXJyb3IpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5fc01vZGUgPT09IE1vZGUuT0RhdGFWMikge1xuXHRcdFx0b0FwcERhdGFGb3JTYXZlID0gZXh0ZW5kKFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0c2VsZWN0aW9uVmFyaWFudDoge30sXG5cdFx0XHRcdFx0dGFibGVWYXJpYW50SWQ6IFwiXCIsXG5cdFx0XHRcdFx0Y3VzdG9tRGF0YToge31cblx0XHRcdFx0fSxcblx0XHRcdFx0b0FwcERhdGFGb3JTYXZlXG5cdFx0XHQpIGFzIElubmVyQXBwRGF0YTtcblxuXHRcdFx0aWYgKG9BcHBEYXRhLnRhYmxlVmFyaWFudElkKSB7XG5cdFx0XHRcdG9BcHBEYXRhRm9yU2F2ZS50YWJsZVZhcmlhbnRJZCA9IG9BcHBEYXRhLnRhYmxlVmFyaWFudElkO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9BcHBEYXRhLmN1c3RvbURhdGEpIHtcblx0XHRcdFx0b0FwcERhdGFGb3JTYXZlLmN1c3RvbURhdGEgPSBvQXBwRGF0YS5jdXN0b21EYXRhO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9BcHBEYXRhLnByZXNlbnRhdGlvblZhcmlhbnQpIHtcblx0XHRcdFx0b0FwcERhdGFGb3JTYXZlLnByZXNlbnRhdGlvblZhcmlhbnQgPSBvQXBwRGF0YS5wcmVzZW50YXRpb25WYXJpYW50O1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9BcHBEYXRhLnZhbHVlVGV4dHMpIHtcblx0XHRcdFx0b0FwcERhdGFGb3JTYXZlLnZhbHVlVGV4dHMgPSBvQXBwRGF0YS52YWx1ZVRleHRzO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9BcHBEYXRhLnNlbWFudGljRGF0ZXMpIHtcblx0XHRcdFx0b0FwcERhdGFGb3JTYXZlLnNlbWFudGljRGF0ZXMgPSBvQXBwRGF0YS5zZW1hbnRpY0RhdGVzO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBvQXBwRGF0YUNsb25lID0gT2JqZWN0LmFzc2lnbih7fSwgb0FwcERhdGEpO1xuXHRcdFx0b0FwcERhdGFGb3JTYXZlID0gbWVyZ2Uob0FwcERhdGFDbG9uZSwgb0FwcERhdGFGb3JTYXZlKTtcblx0XHR9XG5cdFx0b0FwcERhdGFGb3JTYXZlID0gdGhpcy5fY2hlY2tJc1BvdGVudGlhbGx5U2Vuc2l0aXZlKG9BcHBEYXRhRm9yU2F2ZSkgYXMgSW5uZXJBcHBEYXRhO1xuXHRcdHJldHVybiBvQXBwRGF0YUZvclNhdmUgYXMgSW5uZXJBcHBEYXRhO1xuXHR9XG5cblx0YXN5bmMgX2ZuU2F2ZUFwcFN0YXRlQXN5bmMob0FwcERhdGE6IGFueSwgZm5PbkVycm9yPzogYW55KTogUHJvbWlzZTxTaGVsbEFwcFN0YXRlUmV0dXJuIHwgdW5kZWZpbmVkIHwgdm9pZD4ge1xuXHRcdGNvbnN0IG9OYXZIYW5kbGVyID0gdGhpcztcblx0XHRyZXR1cm4gdGhpcy5fZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2VBc3luYygpXG5cdFx0XHQudGhlbihhc3luYyBmdW5jdGlvbiAob0Nyb3NzQXBwTmF2U2VydmljZTogTmF2aWdhdGlvbik6IFByb21pc2U8U2hlbGxBcHBTdGF0ZT4ge1xuXHRcdFx0XHRyZXR1cm4gb0Nyb3NzQXBwTmF2U2VydmljZS5jcmVhdGVFbXB0eUFwcFN0YXRlKG9OYXZIYW5kbGVyLm9Db21wb25lbnQpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvQXBwU3RhdGU6IFNoZWxsQXBwU3RhdGUpIHtcblx0XHRcdFx0cmV0dXJuIG9OYXZIYW5kbGVyLl9mblNhdmVBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4ob0FwcERhdGEsIG9BcHBTdGF0ZSwgZm5PbkVycm9yKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcikge1xuXHRcdFx0XHRpZiAoZm5PbkVycm9yKSB7XG5cdFx0XHRcdFx0Zm5PbkVycm9yKG9FcnJvcik7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHR9XG5cblx0X3NhdmVBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4ob0FwcERhdGE6IElubmVyQXBwRGF0YSwgZm5PbkVycm9yPzogRnVuY3Rpb24pOiBTaGVsbEFwcFN0YXRlUmV0dXJuIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvQXBwU3RhdGUgPSB0aGlzLl9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZSgpLmNyZWF0ZUVtcHR5QXBwU3RhdGUodGhpcy5vQ29tcG9uZW50KTtcblx0XHRyZXR1cm4gdGhpcy5fZm5TYXZlQXBwU3RhdGVXaXRoSW1tZWRpYXRlUmV0dXJuKG9BcHBEYXRhLCBvQXBwU3RhdGUsIGZuT25FcnJvcik7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBsb2FkZWQgSUFwcCBTdGF0ZSBhbmQgbmF2aWdhdGlvbiB0eXBlIG9uY2UgcmVzb2x2ZWQuXG5cdCAqIEBwYXJhbSBzQXBwU3RhdGVLZXkgVGhlIElBcHBTdGF0ZUtleSB0byByZXRyaWV2ZSB0aGUgQXBwU3RhdGUgZGF0YS5cblx0ICogQHBhcmFtIG9EZWZlcnJlZCBKcXVlcnkgZGVmZXJyZWQgb2JqZWN0IHRvIHJlc29sdmUgdGhlIEFwcFN0YXRlIGRhdGEuXG5cdCAqIEBwYXJhbSBuYXZUeXBlIE5hdmlnYXRpb24gdHlwZSBmb3Igd2hpY2ggQXBwU3RhdGUgaXMgcmV0cmlldmVkLlxuXHQgKiBAcmV0dXJucyBUaGUgZGVmZXJyZWQgb2JqZWN0IHdoaWNoIGlzIHJlc29sdmVkIHdpdGggbG9hZGVkIGFwcCBzdGF0ZSBkYXRhXG5cdCBhbmQgbmF2aWdhdGlvbiB0eXBlLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2xvYWRBcHBTdGF0ZShzQXBwU3RhdGVLZXk6IHN0cmluZywgb0RlZmVycmVkOiBKUXVlcnkuRGVmZXJyZWQ8dW5rbm93bj4sIG5hdlR5cGU6IHN0cmluZyk6IEpRdWVyeS5EZWZlcnJlZDx1bmtub3duPiB7XG5cdFx0Y29uc3Qgb05hdkhhbmRsZXIgPSB0aGlzO1xuXHRcdHRoaXMuX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlQXN5bmMoKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9Dcm9zc0FwcE5hdlNlcnZpY2U6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0Nyb3NzQXBwTmF2U2VydmljZS5nZXRBcHBTdGF0ZShvTmF2SGFuZGxlci5vQ29tcG9uZW50LCBzQXBwU3RhdGVLZXkpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGNvbnN0IG9FcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLl9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZUFzeW5jLmZhaWxlZFwiKTtcblx0XHRcdFx0b0RlZmVycmVkLnJlamVjdChvRXJyb3IsIHt9LCBuYXZUeXBlKTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob0FwcFN0YXRlOiBhbnkpIHtcblx0XHRcdFx0bGV0IG9BcHBEYXRhOiBhbnkgPSB7fTtcblx0XHRcdFx0Y29uc3Qgb0FwcERhdGFMb2FkZWQgPSBvQXBwU3RhdGUuZ2V0RGF0YSgpO1xuXG5cdFx0XHRcdGlmICh0eXBlb2Ygb0FwcERhdGFMb2FkZWQgPT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHRcdFx0XHRjb25zdCBvRXJyb3IgPSBvTmF2SGFuZGxlci5fY3JlYXRlVGVjaG5pY2FsRXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5nZXREYXRhRnJvbUFwcFN0YXRlLmZhaWxlZFwiKTtcblx0XHRcdFx0XHRvRGVmZXJyZWQucmVqZWN0KG9FcnJvciwge30sIG5hdlR5cGUpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG9OYXZIYW5kbGVyLl9zTW9kZSA9PT0gTW9kZS5PRGF0YVYyKSB7XG5cdFx0XHRcdFx0b0FwcERhdGEgPSB7XG5cdFx0XHRcdFx0XHRzZWxlY3Rpb25WYXJpYW50OiBcInt9XCIsXG5cdFx0XHRcdFx0XHRvU2VsZWN0aW9uVmFyaWFudDogbmV3IFNlbGVjdGlvblZhcmlhbnQoKSxcblx0XHRcdFx0XHRcdG9EZWZhdWx0ZWRTZWxlY3Rpb25WYXJpYW50OiBuZXcgU2VsZWN0aW9uVmFyaWFudCgpLFxuXHRcdFx0XHRcdFx0Yk5hdlNlbFZhckhhc0RlZmF1bHRzT25seTogZmFsc2UsXG5cdFx0XHRcdFx0XHR0YWJsZVZhcmlhbnRJZDogXCJcIixcblx0XHRcdFx0XHRcdGN1c3RvbURhdGE6IHt9LFxuXHRcdFx0XHRcdFx0YXBwU3RhdGVLZXk6IHNBcHBTdGF0ZUtleSxcblx0XHRcdFx0XHRcdHByZXNlbnRhdGlvblZhcmlhbnQ6IHt9LFxuXHRcdFx0XHRcdFx0dmFsdWVUZXh0czoge30sXG5cdFx0XHRcdFx0XHRzZW1hbnRpY0RhdGVzOiB7fSxcblx0XHRcdFx0XHRcdGRhdGE6IHt9XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRpZiAob0FwcERhdGFMb2FkZWQuc2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdFx0XHRcdFx0Lypcblx0XHRcdFx0XHRcdCAqIEluIGNhc2UgdGhhdCB3ZSBnZXQgYW4gb2JqZWN0IGZyb20gdGhlIHN0b3JlZCBBcHBEYXRhICg9cGVyc2lzdGVuY3kpLCB3ZSBuZWVkIHRvIHN0cmluZ2lmeSB0aGUgSlNPTiBvYmplY3QuXG5cdFx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHRcdG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQgPSBvTmF2SGFuZGxlci5fZW5zdXJlU2VsZWN0aW9uVmFyaWFudEZvcm1hdFN0cmluZyhvQXBwRGF0YUxvYWRlZC5zZWxlY3Rpb25WYXJpYW50KTtcblx0XHRcdFx0XHRcdG9BcHBEYXRhLm9TZWxlY3Rpb25WYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQob0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChvQXBwRGF0YUxvYWRlZC50YWJsZVZhcmlhbnRJZCkge1xuXHRcdFx0XHRcdFx0b0FwcERhdGEudGFibGVWYXJpYW50SWQgPSBvQXBwRGF0YUxvYWRlZC50YWJsZVZhcmlhbnRJZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG9BcHBEYXRhTG9hZGVkLmN1c3RvbURhdGEpIHtcblx0XHRcdFx0XHRcdG9BcHBEYXRhLmN1c3RvbURhdGEgPSBvQXBwRGF0YUxvYWRlZC5jdXN0b21EYXRhO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAob0FwcERhdGFMb2FkZWQucHJlc2VudGF0aW9uVmFyaWFudCkge1xuXHRcdFx0XHRcdFx0b0FwcERhdGEucHJlc2VudGF0aW9uVmFyaWFudCA9IG9BcHBEYXRhTG9hZGVkLnByZXNlbnRhdGlvblZhcmlhbnQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChvQXBwRGF0YUxvYWRlZC52YWx1ZVRleHRzKSB7XG5cdFx0XHRcdFx0XHRvQXBwRGF0YS52YWx1ZVRleHRzID0gb0FwcERhdGFMb2FkZWQudmFsdWVUZXh0cztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG9BcHBEYXRhTG9hZGVkLnNlbWFudGljRGF0ZXMpIHtcblx0XHRcdFx0XHRcdG9BcHBEYXRhLnNlbWFudGljRGF0ZXMgPSBvQXBwRGF0YUxvYWRlZC5zZW1hbnRpY0RhdGVzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvKiBJbiBWMiBjYXNlLCB3ZSBuZWVkIHRoZSBkYXRhIGluIHRoZSBiZWxvdyBmb3JtYXQgZm9yIGh5YnJpZCBjYXNlICovXG5cdFx0XHRcdFx0aWYgKG5hdlR5cGUgPT09IE5hdlR5cGUuaHlicmlkKSB7XG5cdFx0XHRcdFx0XHRvQXBwRGF0YS5kYXRhID0gb0FwcERhdGFMb2FkZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9BcHBEYXRhID0gbWVyZ2Uob0FwcERhdGEsIG9BcHBEYXRhTG9hZGVkKTtcblx0XHRcdFx0XHRpZiAob0FwcERhdGFMb2FkZWQuc2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdFx0XHRcdFx0Lypcblx0XHRcdFx0XHRcdCAqIEluIGNhc2UgdGhhdCB3ZSBnZXQgYW4gb2JqZWN0IGZyb20gdGhlIHN0b3JlZCBBcHBEYXRhICg9cGVyc2lzdGVuY3kpLCB3ZSBuZWVkIHRvIHN0cmluZ2lmeSB0aGUgSlNPTiBvYmplY3QuXG5cdFx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHRcdG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQgPSBvTmF2SGFuZGxlci5fZW5zdXJlU2VsZWN0aW9uVmFyaWFudEZvcm1hdFN0cmluZyhvQXBwRGF0YUxvYWRlZC5zZWxlY3Rpb25WYXJpYW50KTtcblx0XHRcdFx0XHRcdG9BcHBEYXRhLm9TZWxlY3Rpb25WYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQob0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gcmVzb2x2ZSBpcyBjYWxsZWQgb24gcGFzc2VkIERlZmVycmVkIG9iamVjdCB0byB0cmlnZ2VyIGEgY2FsbCBvZiB0aGUgZG9uZSBtZXRob2QsIGlmIGltcGxlbWVudGVkXG5cdFx0XHRcdC8vIHRoZSBkb25lIG1ldGhvZCB3aWxsIHJlY2VpdmUgdGhlIGxvYWRlZCBhcHBTdGF0ZSBhbmQgdGhlIG5hdmlnYXRpb24gdHlwZSBhcyBwYXJhbWV0ZXJzXG5cdFx0XHRcdG9EZWZlcnJlZC5yZXNvbHZlKG9BcHBEYXRhLCB7fSwgbmF2VHlwZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRjb25zdCBvRXJyb3IgPSBvTmF2SGFuZGxlci5fY3JlYXRlVGVjaG5pY2FsRXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5nZXRBcHBTdGF0ZS5mYWlsZWRcIik7XG5cdFx0XHRcdG9EZWZlcnJlZC5yZWplY3Qob0Vycm9yLCB7fSwgbmF2VHlwZSk7XG5cdFx0XHR9KTtcblxuXHRcdHJldHVybiBvRGVmZXJyZWQ7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBwYXJhbWV0ZXIgdmFsdWUgb2YgdGhlIHNhcC1pYXBwLXN0YXRlICh0aGUgaW50ZXJuYWwgYXBwcykgZnJvbSB0aGUgQXBwSGFzaCBzdHJpbmcuIEl0IGF1dG9tYXRpY2FsbHkgdGFrZXMgY2FyZSBhYm91dFxuXHQgKiBjb21wYXRpYmlsaXR5IGJldHdlZW4gdGhlIG9sZCBhbmQgdGhlIG5ldyBhcHByb2FjaCBvZiB0aGUgc2FwLWlhcHAtc3RhdGUuIFByZWNlZGVuY2UgaXMgdGhhdCB0aGUgbmV3IGFwcHJvYWNoIGlzIGZhdm91cmVkIGFnYWluc3QgdGhlIG9sZFxuXHQgKiBhcHByb2FjaC5cblx0ICogQHBhcmFtIHNBcHBIYXNoIFRoZSBBcHBIYXNoLCB3aGljaCBtYXkgY29udGFpbiBhIHNhcC1pYXBwLXN0YXRlIHBhcmFtZXRlciAoYm90aCBvbGQgYW5kL29yIG5ldyBhcHByb2FjaClcblx0ICogQHJldHVybnMgVGhlIHZhbHVlIG9mIHNhcC1pYXBwLXN0YXRlIChpLmUuIHRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgdG8gcmV0cmlldmUgdGhlIHBhcmFtZXRlcnMpLCBvciA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IGluXG5cdCAqICAgICAgICAgY2FzZSB0aGF0IG5vIHNhcC1pYXBwLXN0YXRlIHdhcyBmb3VuZCBpbiA8Y29kZT5zQXBwSGFzaDwvY29kZT4uXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfZ2V0SW5uZXJBcHBTdGF0ZUtleShzQXBwSGFzaDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHQvLyB0cml2aWFsIGNhc2U6IG5vIGFwcCBoYXNoIGF2YWlsYWJsZSBhdCBhbGwuXG5cdFx0aWYgKCFzQXBwSGFzaCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvKiBuZXcgYXBwcm9hY2g6IHNlcGFyYXRlZCB2aWEgcXVlc3Rpb24gbWFyayAvIHBhcnQgb2YgdGhlIHF1ZXJ5IHBhcmFtZXRlciBvZiB0aGUgQXBwSGFzaCAqL1xuXHRcdGxldCBhTWF0Y2hlcyA9IHRoaXMuX3JJQXBwU3RhdGVOZXcuZXhlYyhzQXBwSGFzaCk7XG5cblx0XHQvKiBvbGQgYXBwcm9hY2g6IHNwZWFyYXRlZCB2aWEgc2xhc2hlcyAvIGkuZS4gcGFydCBvZiB0aGUgcm91dGUgaXRzZWxmICovXG5cdFx0aWYgKGFNYXRjaGVzID09PSBudWxsKSB7XG5cdFx0XHRhTWF0Y2hlcyA9IHRoaXMuX3JJQXBwU3RhdGVPbGQuZXhlYyhzQXBwSGFzaCk7XG5cdFx0fVxuXG5cdFx0Lypcblx0XHQgKiBvbGQgYXBwcm9hY2g6IHNwZWNpYWwgY2FzZTogaWYgdGhlcmUgaXMgbm8gZGVlcCByb3V0ZS9rZXkgZGVmaW5lZCwgdGhlIHNhcC1pYXBwLXN0YXRlIG1heSBiZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcsIHdpdGhvdXRcblx0XHQgKiBhbnkgc2VwYXJhdGlvbiB3aXRoIHRoZSBzbGFzaGVzXG5cdFx0ICovXG5cdFx0aWYgKGFNYXRjaGVzID09PSBudWxsKSB7XG5cdFx0XHRhTWF0Y2hlcyA9IHRoaXMuX3JJQXBwU3RhdGVPbGRBdFN0YXJ0LmV4ZWMoc0FwcEhhc2gpO1xuXHRcdH1cblxuXHRcdGlmIChhTWF0Y2hlcyA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gdGhlcmUgaXMgbm8gKHZhbGlkKSBzYXAtaWFwcC1zdGF0ZSBpbiB0aGUgQXBwIEhhc2hcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFNYXRjaGVzWzFdO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcGxhY2VzIChvciBpbnNlcnRzKSBhIHBhcmFtZXRlciB2YWx1ZSAoYW4gQXBwU3RhdGVLZXkpIGZvciB0aGUgc2FwLWlhcHAtc3RhdGUgaW50byBhbiBleGlzdGluZyBBcHBIYXNoIHN0cmluZy4gT3RoZXIgcm91dGVzL3BhcmFtZXRlcnNcblx0ICogYXJlIGlnbm9yZWQgYW5kIHJldHVybmVkIHdpdGhvdXQgbW9kaWZpY2F0aW9uIChcImVudmlyb25tZW50YWwgYWdub3N0aWNcIiBwcm9wZXJ0eSkuIE9ubHkgdGhlIG5ldyBhcHByb2FjaCAoc2FwLWlhcHAtc3RhdGUgYXMgcXVlcnkgcGFyYW1ldGVyXG5cdCAqIGluIHRoZSBBcHBIYXNoKSBpcyBiZWluZyBpc3N1ZWQuXG5cdCAqIEBwYXJhbSBzQXBwSGFzaCBUaGUgQXBwSGFzaCBpbnRvIHdoaWNoIHRoZSBzYXAtaWFwcC1zdGF0ZSBwYXJhbWV0ZXIgc2hhbGwgYmUgbWFkZSBhdmFpbGFibGVcblx0ICogQHBhcmFtIHNBcHBTdGF0ZUtleSBUaGUga2V5IHZhbHVlIG9mIHRoZSBBcHBTdGF0ZSB3aGljaCBzaGFsbCBiZSBzdG9yZWQgYXMgcGFyYW1ldGVyIHZhbHVlIG9mIHRoZSBzYXAtaWFwcC1zdGF0ZSBwcm9wZXJ0eS5cblx0ICogQHJldHVybnMgVGhlIG1vZGlmaWVkIHNBcHBIYXNoIHN0cmluZywgc3VjaCB0aGF0IHRoZSBzYXAtaWFwcC1zdGF0ZSBoYXMgYmVlbiBzZXQgYmFzZWQgb24gdGhlIG5ldyAocXVlcnkgb3B0aW9uLWJhc2VkKVxuXHQgKiAgICAgICAgIHNhcC1pYXBwLXN0YXRlLiBJZiBhIHNhcC1pYXBwLXN0YXRlIGhhcyBiZWVuIHNwZWNpZmllZCBiZWZvcmUsIHRoZSBrZXkgaXMgcmVwbGFjZWQuIElmIDxjb2RlPnNBcHBIYXNoPC9jb2RlPiB3YXMgb2YgdGhlIG9sZFxuXHQgKiAgICAgICAgIGZvcm1hdCAoc2FwLWlhcHAtc3RhdGUgYXMgcGFydCBvZiB0aGUga2V5cy9yb3V0ZSksIHRoZSBmb3JtYXQgaXMgY29udmVydGVkIHRvIHRoZSBuZXcgZm9ybWF0IGJlZm9yZSB0aGUgcmVzdWx0IGlzIHJldHVybmVkLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X3JlcGxhY2VJbm5lckFwcFN0YXRlS2V5KHNBcHBIYXNoOiBzdHJpbmcsIHNBcHBTdGF0ZUtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBzTmV3SUFwcFN0YXRlID0gSUFQUF9TVEFURSArIFwiPVwiICsgc0FwcFN0YXRlS2V5O1xuXG5cdFx0Lypcblx0XHQgKiBnZW5lcmF0ZSBzYXAtaWFwcC1zdGF0ZXMgd2l0aCB0aGUgbmV3IHdheVxuXHRcdCAqL1xuXHRcdGlmICghc0FwcEhhc2gpIHtcblx0XHRcdC8vIHRoZXJlJ3Mgbm8gc0FwcEhhc2gga2V5IHlldFxuXHRcdFx0cmV0dXJuIFwiP1wiICsgc05ld0lBcHBTdGF0ZTtcblx0XHR9XG5cblx0XHRjb25zdCBmbkFwcGVuZFRvUXVlcnlQYXJhbWV0ZXIgPSBmdW5jdGlvbiAoc1N1YkFwcEhhc2g6IGFueSk6IHN0cmluZyB7XG5cdFx0XHQvLyB0aGVyZSBpcyBhbiBBcHBIYXNoIGF2YWlsYWJsZSwgYnV0IGl0IGRvZXMgbm90IGNvbnRhaW4gYSBzYXAtaWFwcC1zdGF0ZSBwYXJhbWV0ZXIgeWV0IC0gd2UgbmVlZCB0byBhcHBlbmQgb25lXG5cblx0XHRcdC8vIG5ldyBhcHByb2FjaDogd2UgbmVlZCB0byBjaGVjaywgaWYgYSBzZXQgb2YgcXVlcnkgcGFyYW1ldGVycyBpcyBhbHJlYWR5IGF2YWlsYWJsZVxuXHRcdFx0aWYgKHNTdWJBcHBIYXNoLmluZGV4T2YoXCI/XCIpICE9PSAtMSkge1xuXHRcdFx0XHQvLyB0aGVyZSBhcmUgYWxyZWFkeSBxdWVyeSBwYXJhbWV0ZXJzIGF2YWlsYWJsZSAtIGFwcGVuZCBpdCBhcyBhbm90aGVyIHBhcmFtZXRlclxuXHRcdFx0XHRyZXR1cm4gc1N1YkFwcEhhc2ggKyBcIiZcIiArIHNOZXdJQXBwU3RhdGU7XG5cdFx0XHR9XG5cdFx0XHQvLyB0aGVyZSBhcmUgbm8gYSBxdWVyeSBwYXJhbWV0ZXJzIGF2YWlsYWJsZSB5ZXQ7IGNyZWF0ZSBhIHNldCB3aXRoIGEgc2luZ2xlIHBhcmFtZXRlclxuXHRcdFx0cmV0dXJuIHNTdWJBcHBIYXNoICsgXCI/XCIgKyBzTmV3SUFwcFN0YXRlO1xuXHRcdH07XG5cblx0XHRpZiAoIXRoaXMuX2dldElubmVyQXBwU3RhdGVLZXkoc0FwcEhhc2gpKSB7XG5cdFx0XHRyZXR1cm4gZm5BcHBlbmRUb1F1ZXJ5UGFyYW1ldGVyKHNBcHBIYXNoKTtcblx0XHR9XG5cdFx0Ly8gVGhlcmUgaXMgYW4gQXBwSGFzaCBhdmFpbGFibGUgYW5kIHRoZXJlIGlzIGFscmVhZHkgYW4gc2FwLWlhcHAtc3RhdGUgaW4gdGhlIEFwcEhhc2hcblxuXHRcdGlmICh0aGlzLl9ySUFwcFN0YXRlTmV3LnRlc3Qoc0FwcEhhc2gpKSB7XG5cdFx0XHQvLyB0aGUgbmV3IGFwcHJvYWNoIGlzIGJlaW5nIHVzZWRcblx0XHRcdHJldHVybiBzQXBwSGFzaC5yZXBsYWNlKHRoaXMuX3JJQXBwU3RhdGVOZXcsIGZ1bmN0aW9uIChzTmVlZGxlOiBzdHJpbmcpIHtcblx0XHRcdFx0cmV0dXJuIHNOZWVkbGUucmVwbGFjZSgvWz1dLiovZ2ksIFwiPVwiICsgc0FwcFN0YXRlS2V5KTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8vIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBvbGQgQXBwSGFzaCBlbnRpcmVseSBhbmQgcmVwbGFjZSBpdCB3aXRoIGEgbmV3IG9uZS5cblxuXHRcdGNvbnN0IGZuUmVwbGFjZU9sZEFwcHJvYWNoID0gZnVuY3Rpb24gKHJPbGRBcHByb2FjaDogYW55LCBzU3ViQXBwSGFzaDogYW55KTogc3RyaW5nIHtcblx0XHRcdHNTdWJBcHBIYXNoID0gc1N1YkFwcEhhc2gucmVwbGFjZShyT2xkQXBwcm9hY2gsIFwiXCIpO1xuXHRcdFx0cmV0dXJuIGZuQXBwZW5kVG9RdWVyeVBhcmFtZXRlcihzU3ViQXBwSGFzaCk7XG5cdFx0fTtcblxuXHRcdGlmICh0aGlzLl9ySUFwcFN0YXRlT2xkLnRlc3Qoc0FwcEhhc2gpKSB7XG5cdFx0XHRyZXR1cm4gZm5SZXBsYWNlT2xkQXBwcm9hY2godGhpcy5fcklBcHBTdGF0ZU9sZCwgc0FwcEhhc2gpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9ySUFwcFN0YXRlT2xkQXRTdGFydC50ZXN0KHNBcHBIYXNoKSkge1xuXHRcdFx0cmV0dXJuIGZuUmVwbGFjZU9sZEFwcHJvYWNoKHRoaXMuX3JJQXBwU3RhdGVPbGRBdFN0YXJ0LCBzQXBwSGFzaCk7XG5cdFx0fVxuXG5cdFx0YXNzZXJ0KGZhbHNlLCBcImludGVybmFsIGluY29uc2lzdGVuY3k6IEFwcHJvYWNoIG9mIHNhcC1pYXBwLXN0YXRlIG5vdCBrbm93biwgYnV0IF9nZXRJbm5lckFwcFN0YXRlS2V5IHJldHVybmVkIGl0XCIpO1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRfZ2V0VVJMUGFyYW1ldGVyc0Zyb21TZWxlY3Rpb25WYXJpYW50KHZTZWxlY3Rpb25WYXJpYW50PzogU2VsZWN0aW9uVmFyaWFudCB8IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuXHRcdGNvbnN0IG1VUkxQYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cdFx0bGV0IGkgPSAwO1xuXHRcdGxldCBvU2VsZWN0aW9uVmFyaWFudDtcblxuXHRcdGlmICh0eXBlb2YgdlNlbGVjdGlvblZhcmlhbnQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdG9TZWxlY3Rpb25WYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQodlNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZTZWxlY3Rpb25WYXJpYW50ID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRvU2VsZWN0aW9uVmFyaWFudCA9IHZTZWxlY3Rpb25WYXJpYW50O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUXCIpO1xuXHRcdH1cblxuXHRcdC8vIGFkZCBVUkxzIHBhcmFtZXRlcnMgZnJvbSBTZWxlY3Rpb25WYXJpYW50LlNlbGVjdE9wdGlvbnMgKGlmIHNpbmdsZSB2YWx1ZSlcblx0XHRjb25zdCBhU2VsZWN0UHJvcGVydGllcyA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzKCk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGFTZWxlY3RQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBhU2VsZWN0T3B0aW9ucyA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFNlbGVjdE9wdGlvbihhU2VsZWN0UHJvcGVydGllc1tpXSk7XG5cdFx0XHRpZiAoYVNlbGVjdE9wdGlvbnMgJiYgYVNlbGVjdE9wdGlvbnMubGVuZ3RoID09PSAxICYmIGFTZWxlY3RPcHRpb25zWzBdLlNpZ24gPT09IFwiSVwiICYmIGFTZWxlY3RPcHRpb25zWzBdLk9wdGlvbiA9PT0gXCJFUVwiKSB7XG5cdFx0XHRcdG1VUkxQYXJhbWV0ZXJzW2FTZWxlY3RQcm9wZXJ0aWVzW2ldXSA9IGFTZWxlY3RPcHRpb25zWzBdLkxvdztcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBhZGQgcGFyYW1ldGVycyBmcm9tIFNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVyc1xuXHRcdGNvbnN0IGFQYXJhbWV0ZXJOYW1lcyA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFBhcmFtZXRlck5hbWVzKCk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGFQYXJhbWV0ZXJOYW1lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3Qgc1BhcmFtZXRlclZhbHVlID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0UGFyYW1ldGVyKGFQYXJhbWV0ZXJOYW1lc1tpXSk7XG5cblx0XHRcdG1VUkxQYXJhbWV0ZXJzW2FQYXJhbWV0ZXJOYW1lc1tpXV0gPSBzUGFyYW1ldGVyVmFsdWU7XG5cdFx0fVxuXHRcdHJldHVybiBtVVJMUGFyYW1ldGVycztcblx0fVxuXG5cdF9jcmVhdGVUZWNobmljYWxFcnJvcihzRXJyb3JDb2RlOiBhbnkpOiBOYXZFcnJvciB7XG5cdFx0cmV0dXJuIG5ldyBOYXZFcnJvcihzRXJyb3JDb2RlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBtb2RlbCB0aGF0IGlzIHVzZWQgZm9yIHZlcmlmaWNhdGlvbiBvZiBzZW5zaXRpdmUgaW5mb3JtYXRpb24uIElmIHRoZSBtb2RlbCBpcyBub3Qgc2V0LCB0aGUgdW5uYW1lZCBjb21wb25lbnQgbW9kZWwgaXMgdXNlZCBmb3IgdGhlXG5cdCAqIHZlcmlmaWNhdGlvbiBvZiBzZW5zaXRpdmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIG9Nb2RlbCBGb3IgY2hlY2tpbmcgc2Vuc2l0aXZlIGluZm9ybWF0aW9uXG5cdCAqL1xuXHRzZXRNb2RlbChvTW9kZWw6IFYyT0RhdGFNb2RlbCB8IFY0T0RhdGFNb2RlbCk6IHZvaWQge1xuXHRcdHRoaXMuX29Nb2RlbCA9IG9Nb2RlbDtcblx0fVxuXG5cdF9nZXRNb2RlbCgpOiBWMk9EYXRhTW9kZWwgfCBWNE9EYXRhTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLl9vTW9kZWwgfHwgdGhpcy5vQ29tcG9uZW50LmdldE1vZGVsKCk7XG5cdH1cblxuXHRfcmVtb3ZlQWxsUHJvcGVydGllcyhvRGF0YTogSW5uZXJBcHBEYXRhKTogdm9pZCB7XG5cdFx0aWYgKG9EYXRhKSB7XG5cdFx0XHRpZiAob0RhdGEuc2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50ID0gbnVsbCBhcyB1bmtub3duIGFzIHVuZGVmaW5lZDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9EYXRhLnZhbHVlVGV4dHMpIHtcblx0XHRcdFx0b0RhdGEudmFsdWVUZXh0cyA9IG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvRGF0YS5zZW1hbnRpY0RhdGVzKSB7XG5cdFx0XHRcdG9EYXRhLnNlbWFudGljRGF0ZXMgPSBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9yZW1vdmVQcm9wZXJ0aWVzKGFGaWx0ZXJOYW1lOiBhbnksIGFQYXJhbWV0ZXJOYW1lOiBhbnksIG9EYXRhOiBhbnkpOiB2b2lkIHtcblx0XHRpZiAoYUZpbHRlck5hbWUubGVuZ3RoICYmIG9EYXRhICYmIChvRGF0YS5zZWxlY3Rpb25WYXJpYW50IHx8IG9EYXRhLnZhbHVlVGV4dHMgfHwgb0RhdGEuc2VtYW50aWNEYXRlcykpIHtcblx0XHRcdGFGaWx0ZXJOYW1lLmZvckVhY2goZnVuY3Rpb24gKHNOYW1lOiBhbnkpIHtcblx0XHRcdFx0aWYgKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuU2VsZWN0T3B0aW9ucykge1xuXHRcdFx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuU2VsZWN0T3B0aW9ucy5zb21lKGZ1bmN0aW9uIChvVmFsdWU6IGFueSwgbklkeDogYW55KSB7XG5cdFx0XHRcdFx0XHRpZiAoc05hbWUgPT09IG9WYWx1ZS5Qcm9wZXJ0eU5hbWUpIHtcblx0XHRcdFx0XHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zLnNwbGljZShuSWR4LCAxKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChvRGF0YS52YWx1ZVRleHRzICYmIG9EYXRhLnZhbHVlVGV4dHMuVGV4dHMpIHtcblx0XHRcdFx0XHRvRGF0YS52YWx1ZVRleHRzLlRleHRzLmZvckVhY2goZnVuY3Rpb24gKG9UZXh0czogYW55KSB7XG5cdFx0XHRcdFx0XHRpZiAob1RleHRzLlByb3BlcnR5VGV4dHMpIHtcblx0XHRcdFx0XHRcdFx0b1RleHRzLlByb3BlcnR5VGV4dHMuc29tZShmdW5jdGlvbiAob1ZhbHVlOiBhbnksIG5JZHg6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzTmFtZSA9PT0gb1ZhbHVlLlByb3BlcnR5TmFtZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0b1RleHRzLlByb3BlcnR5VGV4dHMuc3BsaWNlKG5JZHgsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChvRGF0YS5zZW1hbnRpY0RhdGVzICYmIG9EYXRhLnNlbWFudGljRGF0ZXMuRGF0ZXMpIHtcblx0XHRcdFx0XHRvRGF0YS5zZW1hbnRpY0RhdGVzLkRhdGVzLmZvckVhY2goZnVuY3Rpb24gKG9EYXRlczogYW55LCBuSWR4OiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmIChzTmFtZSA9PT0gb0RhdGVzLlByb3BlcnR5TmFtZSkge1xuXHRcdFx0XHRcdFx0XHRvRGF0YS5zZW1hbnRpY0RhdGVzLkRhdGVzLnNwbGljZShuSWR4LCAxKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKGFQYXJhbWV0ZXJOYW1lLmxlbmd0aCAmJiBvRGF0YSAmJiBvRGF0YS5zZWxlY3Rpb25WYXJpYW50ICYmIG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVycykge1xuXHRcdFx0YVBhcmFtZXRlck5hbWUuZm9yRWFjaChmdW5jdGlvbiAoc05hbWU6IGFueSkge1xuXHRcdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlcnMuc29tZShmdW5jdGlvbiAob1ZhbHVlOiBhbnksIG5JZHg6IGFueSkge1xuXHRcdFx0XHRcdGlmIChzTmFtZSA9PT0gb1ZhbHVlLlByb3BlcnR5TmFtZSB8fCBcIiRQYXJhbWV0ZXIuXCIgKyBzTmFtZSA9PT0gb1ZhbHVlLlByb3BlcnR5TmFtZSkge1xuXHRcdFx0XHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJzLnNwbGljZShuSWR4LCAxKTtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRfaXNUZXJtVHJ1ZShvUHJvcGVydHk6IGFueSwgc1Rlcm06IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGZJc1Rlcm1EZWZhdWx0VHJ1ZSA9IGZ1bmN0aW9uIChvVGVybTogYW55KTogYm9vbGVhbiB7XG5cdFx0XHRpZiAob1Rlcm0pIHtcblx0XHRcdFx0cmV0dXJuIG9UZXJtLkJvb2wgPyBvVGVybS5Cb29sICE9PSBcImZhbHNlXCIgOiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cblx0XHRyZXR1cm4gISFvUHJvcGVydHlbc1Rlcm1dICYmIGZJc1Rlcm1EZWZhdWx0VHJ1ZShvUHJvcGVydHlbc1Rlcm1dKTtcblx0fVxuXG5cdF9pc0V4Y2x1ZGVkRnJvbU5hdmlnYXRpb25Db250ZXh0KG9Qcm9wZXJ0eTogYW55KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX2lzVGVybVRydWUob1Byb3BlcnR5LCBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkV4Y2x1ZGVGcm9tTmF2aWdhdGlvbkNvbnRleHRcIik7XG5cdH1cblxuXHRfaXNQb3RlbnRpYWxseVNlbnNpdGl2ZShvUHJvcGVydHk6IGFueSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9pc1Rlcm1UcnVlKG9Qcm9wZXJ0eSwgXCJjb20uc2FwLnZvY2FidWxhcmllcy5QZXJzb25hbERhdGEudjEuSXNQb3RlbnRpYWxseVNlbnNpdGl2ZVwiKTtcblx0fVxuXG5cdF9pc01lYXN1cmVQcm9wZXJ0eShvUHJvcGVydHk6IGFueSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9pc1Rlcm1UcnVlKG9Qcm9wZXJ0eSwgXCJjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuTWVhc3VyZVwiKTtcblx0fVxuXG5cdF9pc1RvQmVFeGNsdWRlZChvUHJvcGVydHk6IGFueSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9pc1BvdGVudGlhbGx5U2Vuc2l0aXZlKG9Qcm9wZXJ0eSkgfHwgdGhpcy5faXNFeGNsdWRlZEZyb21OYXZpZ2F0aW9uQ29udGV4dChvUHJvcGVydHkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBtZXRob2QgY3JlYXRlcyBhIGNvbnRleHQgdXJsIGJhc2VkIG9uIHByb3ZpZGVkIGRhdGEuIFRoaXMgY29udGV4dCB1cmwgY2FuIGVpdGhlciBiZSB1c2VkIGFzXG5cdCAqIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZpZ2F0aW9uSGFuZGxlciNzZXRQYXJhbWV0ZXJDb250ZXh0VXJsIFBhcmFtZXRlckNvbnRleHRVcmx9IG9yXG5cdCAqIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZpZ2F0aW9uSGFuZGxlciNzZXRGaWx0ZXJDb250ZXh0VXJsIEZpbHRlckNvbnRleHRVcmx9LlxuXHQgKiBAcGFyYW0gc0VudGl0eVNldE5hbWUgVXNlZCBmb3IgdXJsIGRldGVybWluYXRpb25cblx0ICogQHBhcmFtIFtvTW9kZWxdIFVzZWQgZm9yIHVybCBkZXRlcm1pbmF0aW9uLiBJZiBvbWl0dGVkLCB0aGUgTmF2aWdhdGlvbkhhbmRsZXIgbW9kZWwgaXMgdXNlZC5cblx0ICogQHRocm93cyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2RXJyb3J9IGluIGNhc2Ugb2YgbWlzc2luZyBvciB3cm9uZyBwYXNzZWQgcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBUaGUgY29udGV4dCB1cmwgZm9yIHRoZSBnaXZlbiBlbnRpdGllc1xuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRjb25zdHJ1Y3RDb250ZXh0VXJsKHNFbnRpdHlTZXROYW1lOiBzdHJpbmcsIG9Nb2RlbD86IFYyT0RhdGFNb2RlbCB8IFY0T0RhdGFNb2RlbCk6IHN0cmluZyB7XG5cdFx0aWYgKCFzRW50aXR5U2V0TmFtZSkge1xuXHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuTk9fRU5USVRZX1NFVF9QUk9WSURFRFwiKTtcblx0XHR9XG5cblx0XHRpZiAob01vZGVsID09PSB1bmRlZmluZWQpIHtcblx0XHRcdG9Nb2RlbCA9IHRoaXMuX2dldE1vZGVsKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX2NvbnN0cnVjdENvbnRleHRVcmwob01vZGVsKSArIFwiI1wiICsgc0VudGl0eVNldE5hbWU7XG5cdH1cblxuXHRfY29uc3RydWN0Q29udGV4dFVybChvTW9kZWw6IFYyT0RhdGFNb2RlbCB8IFY0T0RhdGFNb2RlbCk6IHN0cmluZyB7XG5cdFx0bGV0IHNTZXJ2ZXJVcmw7XG5cblx0XHRpZiAob01vZGVsLmlzQTxWMk9EYXRhTW9kZWw+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnYyLk9EYXRhTW9kZWxcIikpIHtcblx0XHRcdHNTZXJ2ZXJVcmwgPSBvTW9kZWwuX2dldFNlcnZlclVybCgpO1xuXHRcdH0gZWxzZSBpZiAob01vZGVsLmlzQTxWNE9EYXRhTW9kZWw+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWxcIikpIHtcblx0XHRcdGNvbnN0IG9TZXJ2aWNlVVJJID0gbmV3IFVSSShvTW9kZWwuZ2V0U2VydmljZVVybCgpKS5hYnNvbHV0ZVRvKGRvY3VtZW50LmJhc2VVUkkpO1xuXHRcdFx0c1NlcnZlclVybCA9IG5ldyBVUkkoXCIvXCIpLmFic29sdXRlVG8ob1NlcnZpY2VVUkkpLnRvU3RyaW5nKCk7XG5cdFx0fVxuXG5cdFx0aWYgKHNTZXJ2ZXJVcmwgJiYgc1NlcnZlclVybC5sYXN0SW5kZXhPZihcIi9cIikgPT09IHNTZXJ2ZXJVcmwubGVuZ3RoIC0gMSkge1xuXHRcdFx0c1NlcnZlclVybCA9IHNTZXJ2ZXJVcmwuc3Vic3RyaW5nKDAsIHNTZXJ2ZXJVcmwubGVuZ3RoIC0gMSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNTZXJ2ZXJVcmwgKyBvTW9kZWwuc1NlcnZpY2VVcmwgKyBcIi8kbWV0YWRhdGFcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgbWV0aG9kIHZlcmlmaWVzLCBpZiBhbnkgb2YgdGhlIHBhc3NlZCBwYXJhbWV0ZXJzL2ZpbHRlcnMgYXJlIG1hcmtlZCBhcyBzZW5zaXRpdmUsIGFuZCBpZiB0aGlzIGlzIHRoZSBjYXNlIHJlbW92ZSB0aG9zZSBmcm9tIHRoZSBhcHBcblx0ICogZGF0YS4gPGI+Tm90ZTo8L2I+IFRvIHVzZSB0aGlzIG1ldGhvZCwgdGhlIG1ldGFkYXRhIG11c3QgYmUgbG9hZGVkIGZpcnN0LlxuXHQgKiBAcGFyYW0gb0RhdGEgV2l0aCBwb3RlbnRpYWwgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIChmb3IgT0RhdGEsIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIHVzaW5nXG5cdCAqIDxjb2RlPm9TZWxlY3Rpb25WYXJpYW50LnRvSlNPTk9iamVjdCgpPC9jb2RlPiBtdXN0IGJlIHVzZWQpLCB3aXRoIHRoZSA8Y29kZT5GaWx0ZXJDb250ZXh0VXJsPC9jb2RlPiBvclxuXHQgKiA8Y29kZT5QYXJhbWV0ZXJDb250ZXh0VXJsPC9jb2RlPiBwcm9wZXJ0eS5cblx0ICogQHJldHVybnMgRGF0YSB3aXRob3V0IHByb3BlcnRpZXMgbWFya2VkIGFzIHNlbnNpdGl2ZSBvciBhbiBlbXB0eSBvYmplY3QgaWYgdGhlIE9EYXRhIG1ldGFkYXRhIGlzIG5vdCBmdWxseSBsb2FkZWQgeWV0XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfY2hlY2tJc1BvdGVudGlhbGx5U2Vuc2l0aXZlKG9EYXRhOiBhbnkpOiB1bmtub3duIHtcblx0XHRsZXQgb0FkYXB0ZWREYXRhID0gb0RhdGE7XG5cdFx0aWYgKFxuXHRcdFx0b0RhdGEgJiZcblx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgJiZcblx0XHRcdCgob0RhdGEuc2VsZWN0aW9uVmFyaWFudC5GaWx0ZXJDb250ZXh0VXJsICYmIG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuU2VsZWN0T3B0aW9ucykgfHxcblx0XHRcdFx0KG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVyQ29udGV4dFVybCAmJiBvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlcnMpKVxuXHRcdCkge1xuXHRcdFx0Y29uc3Qgb01vZGVsID0gdGhpcy5fZ2V0TW9kZWwoKTtcblx0XHRcdGlmICh0aGlzLm9Db21wb25lbnQgJiYgb01vZGVsICYmIG9Nb2RlbC5pc0E8VjJPRGF0YU1vZGVsPihcInNhcC51aS5tb2RlbC5vZGF0YS52Mi5PRGF0YU1vZGVsXCIpKSB7XG5cdFx0XHRcdGNvbnN0IGFTZW5zaXRpdmVGaWx0ZXJOYW1lID0gW107XG5cdFx0XHRcdGNvbnN0IGFTZW5zaXRpdmVQYXJhbWV0ZXJOYW1lID0gW107XG5cdFx0XHRcdGxldCBpLFxuXHRcdFx0XHRcdG9FbnRpdHlTZXQ6IGFueSxcblx0XHRcdFx0XHRvRW50aXR5RGVmOiBhbnksXG5cdFx0XHRcdFx0b1N1YkVudGl0eURlZjogYW55LFxuXHRcdFx0XHRcdG9FbmRSb2xlOiBhbnksXG5cdFx0XHRcdFx0YUZpbHRlckNvbnRleHRQYXJ0ID0gW10sXG5cdFx0XHRcdFx0YVBhcmFtQ29udGV4dFBhcnQgPSBbXTtcblxuXHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRpZiAob01vZGVsLmdldFNlcnZpY2VNZXRhZGF0YSgpICYmIG9NZXRhTW9kZWw/Lm9Nb2RlbCkge1xuXHRcdFx0XHRcdGlmIChvRGF0YS5zZWxlY3Rpb25WYXJpYW50LkZpbHRlckNvbnRleHRVcmwpIHtcblx0XHRcdFx0XHRcdGFGaWx0ZXJDb250ZXh0UGFydCA9IG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuRmlsdGVyQ29udGV4dFVybC5zcGxpdChcIiNcIik7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0YUZpbHRlckNvbnRleHRQYXJ0Lmxlbmd0aCA9PT0gMiAmJlxuXHRcdFx0XHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zICYmXG5cdFx0XHRcdFx0XHR0aGlzLl9jb25zdHJ1Y3RDb250ZXh0VXJsKG9Nb2RlbCkuaW5kZXhPZihhRmlsdGVyQ29udGV4dFBhcnRbMF0pID09PSAwXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvRW50aXR5U2V0ID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVNldChhRmlsdGVyQ29udGV4dFBhcnRbMV0pO1xuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlTZXQpIHtcblx0XHRcdFx0XHRcdFx0b0VudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKG9FbnRpdHlTZXQuZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUoYUZpbHRlckNvbnRleHRQYXJ0WzFdKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYgJiYgb0VudGl0eURlZi5wcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBvRW50aXR5RGVmLnByb3BlcnR5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5faXNUb0JlRXhjbHVkZWQob0VudGl0eURlZi5wcm9wZXJ0eVtpXSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YVNlbnNpdGl2ZUZpbHRlck5hbWUucHVzaChvRW50aXR5RGVmLnByb3BlcnR5W2ldLm5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChvRW50aXR5RGVmLm5hdmlnYXRpb25Qcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBvRW50aXR5RGVmLm5hdmlnYXRpb25Qcm9wZXJ0eS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0VuZFJvbGUgPSBvTWV0YU1vZGVsLmdldE9EYXRhQXNzb2NpYXRpb25FbmQob0VudGl0eURlZiwgb0VudGl0eURlZi5uYXZpZ2F0aW9uUHJvcGVydHlbaV0ubmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIW9FbmRSb2xlIHx8IG9FbmRSb2xlLnR5cGUgPT09IG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuRmlsdGVyQ29udGV4dFVybCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdC8vIGNoZWNrIGlmIHRoZSBlbmQgcm9sZSBoYXMgY2FyZGluYWxpdHkgMC4uMSBvciAxXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAob0VuZFJvbGUubXVsdGlwbGljaXR5ID09PSBcIjFcIiB8fCBvRW5kUm9sZS5tdWx0aXBsaWNpdHkgPT09IFwiMC4uMVwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9TdWJFbnRpdHlEZWYgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5VHlwZShvRW5kUm9sZS50eXBlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9TdWJFbnRpdHlEZWYgJiYgb1N1YkVudGl0eURlZi5wcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgb1N1YkVudGl0eURlZi5wcm9wZXJ0eS5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuX2lzVG9CZUV4Y2x1ZGVkKG9TdWJFbnRpdHlEZWYucHJvcGVydHlbal0pKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFTZW5zaXRpdmVGaWx0ZXJOYW1lLnB1c2goXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0VudGl0eURlZi5uYXZpZ2F0aW9uUHJvcGVydHlbaV0ubmFtZSArIFwiLlwiICsgb1N1YkVudGl0eURlZi5wcm9wZXJ0eVtqXS5uYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVyQ29udGV4dFVybCkge1xuXHRcdFx0XHRcdFx0YVBhcmFtQ29udGV4dFBhcnQgPSBvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlckNvbnRleHRVcmwuc3BsaXQoXCIjXCIpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdGFQYXJhbUNvbnRleHRQYXJ0Lmxlbmd0aCA9PT0gMiAmJlxuXHRcdFx0XHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJzICYmXG5cdFx0XHRcdFx0XHR0aGlzLl9jb25zdHJ1Y3RDb250ZXh0VXJsKG9Nb2RlbCkuaW5kZXhPZihhUGFyYW1Db250ZXh0UGFydFswXSkgPT09IDBcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9FbnRpdHlTZXQgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5U2V0KGFQYXJhbUNvbnRleHRQYXJ0WzFdKTtcblx0XHRcdFx0XHRcdGlmIChvRW50aXR5U2V0KSB7XG5cdFx0XHRcdFx0XHRcdG9FbnRpdHlEZWYgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5VHlwZShvRW50aXR5U2V0LmVudGl0eVR5cGUpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b0VudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKGFGaWx0ZXJDb250ZXh0UGFydFsxXSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChvRW50aXR5RGVmKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChvRW50aXR5RGVmLnByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IG9FbnRpdHlEZWYucHJvcGVydHkubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLl9pc1RvQmVFeGNsdWRlZChvRW50aXR5RGVmLnByb3BlcnR5W2ldKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRhU2Vuc2l0aXZlUGFyYW1ldGVyTmFtZS5wdXNoKG9FbnRpdHlEZWYucHJvcGVydHlbaV0ubmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGFTZW5zaXRpdmVGaWx0ZXJOYW1lLmxlbmd0aCB8fCBhU2Vuc2l0aXZlUGFyYW1ldGVyTmFtZS5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdG9BZGFwdGVkRGF0YSA9IGV4dGVuZCh0cnVlIGFzIGFueSwge30sIG9BZGFwdGVkRGF0YSk7XG5cblx0XHRcdFx0XHRcdHRoaXMuX3JlbW92ZVByb3BlcnRpZXMoYVNlbnNpdGl2ZUZpbHRlck5hbWUsIGFTZW5zaXRpdmVQYXJhbWV0ZXJOYW1lLCBvQWRhcHRlZERhdGEpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBhbm5vdGF0aW9ucyBhcmUgbm90IGxvYWRlZFxuXG5cdFx0XHRcdFx0dGhpcy5fcmVtb3ZlQWxsUHJvcGVydGllcyhvQWRhcHRlZERhdGEpO1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyOiBvTWV0YWRhdGEgYXJlIG5vdCBmdWxseSBsb2FkZWQhXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMub0NvbXBvbmVudCAmJiBvTW9kZWwgJiYgb01vZGVsLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsXCIpKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9yZW1vdmVTZW5zaXRpdmVEYXRhRm9yT0RhdGFWNChvQWRhcHRlZERhdGEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBvQWRhcHRlZERhdGE7XG5cdH1cblxuXHRfcmVtb3ZlTWVhc3VyZUJhc2VkSW5mb3JtYXRpb24ob0FwcERhdGE6IElubmVyQXBwRGF0YSk6IElubmVyQXBwRGF0YSB7XG5cdFx0bGV0IG9BcHBEYXRhRm9yU2F2ZSA9IG9BcHBEYXRhO1xuXG5cdFx0aWYgKG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRcdC8qXG5cdFx0XHQgKiBUaGUgc3BlY2lmaWNhdGlvbiBzdGF0ZXMgdGhhdCBTZWxlY3Rpb24gVmFyaWFudHMgbmVlZCB0byBiZSBKU09OIG9iamVjdHMuIEhvd2V2ZXIsIGludGVybmFsbHksIHdlIHdvcmsgd2l0aCBzdHJpbmdzIGZvclxuXHRcdFx0ICogXCJzZWxlY3Rpb25WYXJpYW50XCIuIFRoZXJlZm9yZSwgaW4gY2FzZSB0aGF0IHRoaXMgaXMgYSBzdHJpbmcsIHdlIG5lZWQgdG8gSlNPTi1wYXJzZSB0aGUgZGF0YS5cblx0XHRcdCAqL1xuXHRcdFx0aWYgKHR5cGVvZiBvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50ID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0b0FwcERhdGFGb3JTYXZlLnNlbGVjdGlvblZhcmlhbnQgPSBKU09OLnBhcnNlKG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdFx0XHR9IGNhdGNoICh4KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXI6IF9yZW1vdmVNZWFzdXJlQmFzZWRJbmZvcm1hdGlvbiBwYXJzZSBlcnJvclwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRvQXBwRGF0YUZvclNhdmUgPSB0aGlzLl9yZW1vdmVNZWFzdXJlQmFzZWRQcm9wZXJ0aWVzKG9BcHBEYXRhRm9yU2F2ZSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9BcHBEYXRhRm9yU2F2ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgbWV0aG9kIHZlcmlmaWVzIGlmIGFueSBvZiB0aGUgcGFzc2VkIHBhcmFtZXRlcnMvZmlsdGVycyBhcmUgbWFya2VkIGFzIGEgbWVhc3VyZS4gSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhleSBhcmUgcmVtb3ZlZCBmcm9tIHRoZSB4YXBwXG5cdCAqIGFwcCBkYXRhLiA8Yj5Ob3RlOjwvYj4gVG8gdXNlIHRoaXMgbWV0aG9kLCB0aGUgbWV0YWRhdGEgbXVzdCBiZSBsb2FkZWQgZmlyc3QuXG5cdCAqIEBwYXJhbSBvRGF0YSBXaXRoIHBvdGVudGlhbCBzZW5zaXRpdmUgaW5mb3JtYXRpb24gKGZvciBPRGF0YSwgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gdXNpbmdcblx0ICogPGNvZGU+b1NlbGVjdGlvblZhcmlhbnQudG9KU09OT2JqZWN0KCk8L2NvZGU+IG11c3QgYmUgdXNlZCksIHdpdGggdGhlIDxjb2RlPkZpbHRlckNvbnRleHRVcmw8L2NvZGU+IG9yXG5cdCAqIDxjb2RlPlBhcmFtZXRlckNvbnRleHRVcmw8L2NvZGU+IHByb3BlcnR5LlxuXHQgKiBAcmV0dXJucyBEYXRhIHdpdGhvdXQgcHJvcGVydGllcyBtYXJrZWQgYXMgbWVhc3VyZXMgb3IgYW4gZW1wdHkgb2JqZWN0IGlmIHRoZSBPRGF0YSBtZXRhZGF0YSBpcyBub3QgZnVsbHkgbG9hZGVkIHlldFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X3JlbW92ZU1lYXN1cmVCYXNlZFByb3BlcnRpZXMob0RhdGE6IElubmVyQXBwRGF0YSk6IElubmVyQXBwRGF0YSB7XG5cdFx0bGV0IG9BZGFwdGVkRGF0YSA9IG9EYXRhO1xuXHRcdGNvbnN0IGFNZWFzdXJlRmlsdGVyTmFtZSA9IFtdO1xuXHRcdGNvbnN0IGFNZWFzdXJlUGFyYW1ldGVyTmFtZSA9IFtdO1xuXHRcdGxldCBpLFxuXHRcdFx0b01vZGVsLFxuXHRcdFx0b01ldGFNb2RlbCxcblx0XHRcdG9FbnRpdHlTZXQ6IGFueSxcblx0XHRcdG9FbnRpdHlEZWY6IGFueSxcblx0XHRcdG9TdWJFbnRpdHlEZWY6IGFueSxcblx0XHRcdG9FbmRSb2xlOiBhbnksXG5cdFx0XHRhRmlsdGVyQ29udGV4dFBhcnQ6IHN0cmluZ1tdID0gW10sXG5cdFx0XHRhUGFyYW1Db250ZXh0UGFydDogc3RyaW5nW10gPSBbXTtcblxuXHRcdGlmIChcblx0XHRcdG9EYXRhICYmXG5cdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50ICYmXG5cdFx0XHQoKChvRGF0YS5zZWxlY3Rpb25WYXJpYW50IGFzIFNlcmlhbGl6ZWRTZWxlY3Rpb25WYXJpYW50KS5GaWx0ZXJDb250ZXh0VXJsICYmXG5cdFx0XHRcdChvRGF0YS5zZWxlY3Rpb25WYXJpYW50IGFzIFNlcmlhbGl6ZWRTZWxlY3Rpb25WYXJpYW50KS5TZWxlY3RPcHRpb25zKSB8fFxuXHRcdFx0XHQoKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgYXMgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQpLlBhcmFtZXRlckNvbnRleHRVcmwgJiZcblx0XHRcdFx0XHQob0RhdGEuc2VsZWN0aW9uVmFyaWFudCBhcyBTZXJpYWxpemVkU2VsZWN0aW9uVmFyaWFudCkuUGFyYW1ldGVycykpXG5cdFx0KSB7XG5cdFx0XHRvTW9kZWwgPSB0aGlzLl9nZXRNb2RlbCgpO1xuXHRcdFx0aWYgKHRoaXMub0NvbXBvbmVudCAmJiBvTW9kZWwgJiYgb01vZGVsLmlzQTxWMk9EYXRhTW9kZWw+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnYyLk9EYXRhTW9kZWxcIikpIHtcblx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0aWYgKG9Nb2RlbC5nZXRTZXJ2aWNlTWV0YWRhdGEoKSAmJiBvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWwub01vZGVsKSB7XG5cdFx0XHRcdFx0aWYgKChvRGF0YS5zZWxlY3Rpb25WYXJpYW50IGFzIFNlcmlhbGl6ZWRTZWxlY3Rpb25WYXJpYW50KS5GaWx0ZXJDb250ZXh0VXJsKSB7XG5cdFx0XHRcdFx0XHRhRmlsdGVyQ29udGV4dFBhcnQgPSAob0RhdGEuc2VsZWN0aW9uVmFyaWFudCBhcyBTZXJpYWxpemVkU2VsZWN0aW9uVmFyaWFudCkuRmlsdGVyQ29udGV4dFVybCEuc3BsaXQoXCIjXCIpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdGFGaWx0ZXJDb250ZXh0UGFydC5sZW5ndGggPT09IDIgJiZcblx0XHRcdFx0XHRcdChvRGF0YS5zZWxlY3Rpb25WYXJpYW50IGFzIFNlcmlhbGl6ZWRTZWxlY3Rpb25WYXJpYW50KS5TZWxlY3RPcHRpb25zICYmXG5cdFx0XHRcdFx0XHR0aGlzLl9jb25zdHJ1Y3RDb250ZXh0VXJsKG9Nb2RlbCkuaW5kZXhPZihhRmlsdGVyQ29udGV4dFBhcnRbMF0pID09PSAwXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvRW50aXR5U2V0ID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVNldChhRmlsdGVyQ29udGV4dFBhcnRbMV0pO1xuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlTZXQpIHtcblx0XHRcdFx0XHRcdFx0b0VudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKG9FbnRpdHlTZXQuZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUoYUZpbHRlckNvbnRleHRQYXJ0WzFdKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYgJiYgb0VudGl0eURlZi5wcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBvRW50aXR5RGVmLnByb3BlcnR5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5faXNNZWFzdXJlUHJvcGVydHkob0VudGl0eURlZi5wcm9wZXJ0eVtpXSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YU1lYXN1cmVGaWx0ZXJOYW1lLnB1c2gob0VudGl0eURlZi5wcm9wZXJ0eVtpXS5uYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAob0VudGl0eURlZi5uYXZpZ2F0aW9uUHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgb0VudGl0eURlZi5uYXZpZ2F0aW9uUHJvcGVydHkubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9FbmRSb2xlID0gb01ldGFNb2RlbC5nZXRPRGF0YUFzc29jaWF0aW9uRW5kKG9FbnRpdHlEZWYsIG9FbnRpdHlEZWYubmF2aWdhdGlvblByb3BlcnR5W2ldLm5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQhb0VuZFJvbGUgfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0b0VuZFJvbGUudHlwZSA9PT0gKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgYXMgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQpLkZpbHRlckNvbnRleHRVcmxcblx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdC8vIGNoZWNrIGlmIHRoZSBlbmQgcm9sZSBoYXMgY2FyZGluYWxpdHkgMC4uMSBvciAxXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAob0VuZFJvbGUubXVsdGlwbGljaXR5ID09PSBcIjFcIiB8fCBvRW5kUm9sZS5tdWx0aXBsaWNpdHkgPT09IFwiMC4uMVwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9TdWJFbnRpdHlEZWYgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5VHlwZShvRW5kUm9sZS50eXBlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9TdWJFbnRpdHlEZWYgJiYgb1N1YkVudGl0eURlZi5wcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgb1N1YkVudGl0eURlZi5wcm9wZXJ0eS5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuX2lzTWVhc3VyZVByb3BlcnR5KG9TdWJFbnRpdHlEZWYucHJvcGVydHlbal0pKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFNZWFzdXJlRmlsdGVyTmFtZS5wdXNoKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9FbnRpdHlEZWYubmF2aWdhdGlvblByb3BlcnR5W2ldLm5hbWUgKyBcIi5cIiArIG9TdWJFbnRpdHlEZWYucHJvcGVydHlbal0ubmFtZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICgob0RhdGEuc2VsZWN0aW9uVmFyaWFudCBhcyBTZXJpYWxpemVkU2VsZWN0aW9uVmFyaWFudCkuUGFyYW1ldGVyQ29udGV4dFVybCkge1xuXHRcdFx0XHRcdFx0YVBhcmFtQ29udGV4dFBhcnQgPSAob0RhdGEuc2VsZWN0aW9uVmFyaWFudCBhcyBTZXJpYWxpemVkU2VsZWN0aW9uVmFyaWFudCkuUGFyYW1ldGVyQ29udGV4dFVybCEuc3BsaXQoXCIjXCIpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdGFQYXJhbUNvbnRleHRQYXJ0Lmxlbmd0aCA9PT0gMiAmJlxuXHRcdFx0XHRcdFx0KG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgYXMgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQpLlBhcmFtZXRlcnMgJiZcblx0XHRcdFx0XHRcdHRoaXMuX2NvbnN0cnVjdENvbnRleHRVcmwob01vZGVsKS5pbmRleE9mKGFQYXJhbUNvbnRleHRQYXJ0WzBdKSA9PT0gMFxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b0VudGl0eVNldCA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlTZXQoYVBhcmFtQ29udGV4dFBhcnRbMV0pO1xuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlTZXQpIHtcblx0XHRcdFx0XHRcdFx0b0VudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKG9FbnRpdHlTZXQuZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUoYUZpbHRlckNvbnRleHRQYXJ0WzFdKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYucHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgb0VudGl0eURlZi5wcm9wZXJ0eS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuX2lzTWVhc3VyZVByb3BlcnR5KG9FbnRpdHlEZWYucHJvcGVydHlbaV0pKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFNZWFzdXJlUGFyYW1ldGVyTmFtZS5wdXNoKG9FbnRpdHlEZWYucHJvcGVydHlbaV0ubmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGFNZWFzdXJlRmlsdGVyTmFtZS5sZW5ndGggfHwgYU1lYXN1cmVQYXJhbWV0ZXJOYW1lLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0Ly8gVFE6IG5lZWRzIGF0dGVudGlvblxuXHRcdFx0XHRcdFx0b0FkYXB0ZWREYXRhID0gZXh0ZW5kKHRydWUgYXMgYW55LCB7fSwgb0FkYXB0ZWREYXRhKSBhcyBJbm5lckFwcERhdGE7XG5cblx0XHRcdFx0XHRcdHRoaXMuX3JlbW92ZVByb3BlcnRpZXMoYU1lYXN1cmVGaWx0ZXJOYW1lLCBhTWVhc3VyZVBhcmFtZXRlck5hbWUsIG9BZGFwdGVkRGF0YSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGFubm90YXRpb25zIGFyZSBub3QgbG9hZGVkXG5cblx0XHRcdFx0XHR0aGlzLl9yZW1vdmVBbGxQcm9wZXJ0aWVzKG9BZGFwdGVkRGF0YSk7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXI6IG9NZXRhZGF0YSBhcmUgbm90IGZ1bGx5IGxvYWRlZCFcIik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAodGhpcy5vQ29tcG9uZW50ICYmIG9Nb2RlbCAmJiBvTW9kZWwuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWxcIikpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX3JlbW92ZVNlbnNpdGl2ZURhdGFGb3JPRGF0YVY0KG9BZGFwdGVkRGF0YSwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvQWRhcHRlZERhdGE7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBzZW5zaXRpdmUgZGF0YSBmcm9tIHRoZSBuYXZpZ2F0aW9uIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBvRGF0YSBTZWxlY3Rpb24gdmFyaWFudFxuXHQgKiBAcGFyYW0gYk1lYXN1cmUgU2hvdWxkIG1lYXN1cmVzIGJlIHJlbW92ZWRcblx0ICogQHJldHVybnMgVGhlIHNlbGVjdGlvbiB2YXJpYW50IGFmdGVyIHNlbnNpdGl2ZSBkYXRhIGhhcyBiZWVuIHJlbW92ZWRcblx0ICovXG5cdF9yZW1vdmVTZW5zaXRpdmVEYXRhRm9yT0RhdGFWNChvRGF0YTogSW5uZXJBcHBEYXRhLCBiTWVhc3VyZT86IGJvb2xlYW4pOiBJbm5lckFwcERhdGEge1xuXHRcdGNvbnN0IG9OYXZIYW5kbGVyID0gdGhpcyxcblx0XHRcdG9TViA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KG9EYXRhLnNlbGVjdGlvblZhcmlhbnQpLFxuXHRcdFx0b01vZGVsID0gdGhpcy5fZ2V0TW9kZWwoKTtcblx0XHRsZXQgYUZpbHRlckNvbnRleHRQYXJ0OiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblxuXHRcdGlmICghb01vZGVsLmdldE1ldGFNb2RlbCgpLmdldE9iamVjdChcIi9cIikpIHtcblx0XHRcdC8vIGFubm90YXRpb25zIGFyZSBub3QgbG9hZGVkXG5cdFx0XHR0aGlzLl9yZW1vdmVBbGxQcm9wZXJ0aWVzKG9EYXRhKTtcblx0XHRcdExvZy5lcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyOiBvTWV0YWRhdGEgYXJlIG5vdCBmdWxseSBsb2FkZWQhXCIpO1xuXHRcdFx0cmV0dXJuIG9EYXRhO1xuXHRcdH1cblxuXHRcdGlmICgob0RhdGEuc2VsZWN0aW9uVmFyaWFudCBhcyBTZXJpYWxpemVkU2VsZWN0aW9uVmFyaWFudCkuRmlsdGVyQ29udGV4dFVybCkge1xuXHRcdFx0YUZpbHRlckNvbnRleHRQYXJ0ID0gKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgYXMgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQpLkZpbHRlckNvbnRleHRVcmwhLnNwbGl0KFwiI1wiKTtcblx0XHR9XG5cblx0XHRpZiAoXG5cdFx0XHRhRmlsdGVyQ29udGV4dFBhcnQ/Lmxlbmd0aCA9PT0gMiAmJlxuXHRcdFx0KG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgYXMgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQpLlNlbGVjdE9wdGlvbnMgJiZcblx0XHRcdHRoaXMuX2NvbnN0cnVjdENvbnRleHRVcmwob01vZGVsKS5pbmRleE9mKGFGaWx0ZXJDb250ZXh0UGFydFswXSkgPT09IDBcblx0XHQpIHtcblx0XHRcdG9TVi5yZW1vdmVTZWxlY3RPcHRpb24oXCJAb2RhdGEuY29udGV4dFwiKTtcblx0XHRcdG9TVi5yZW1vdmVTZWxlY3RPcHRpb24oXCJAb2RhdGEubWV0YWRhdGFFdGFnXCIpO1xuXHRcdFx0b1NWLnJlbW92ZVNlbGVjdE9wdGlvbihcIlNBUF9fTWVzc2FnZXNcIik7XG5cblx0XHRcdGNvbnN0IHNFbnRpdHlTZXQgPSBhRmlsdGVyQ29udGV4dFBhcnRbMV0sXG5cdFx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRcdGFQcm9wZXJ0eU5hbWVzID0gb1NWLmdldFByb3BlcnR5TmFtZXMoKSB8fCBbXSxcblx0XHRcdFx0Zm5Jc1NlbnNpdGl2ZURhdGEgPSBmdW5jdGlvbiAoc1Byb3A6IHN0cmluZywgZXNOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRcdFx0XHRlc05hbWUgPSBlc05hbWUgfHwgc0VudGl0eVNldDtcblx0XHRcdFx0XHRjb25zdCBhUHJvcGVydHlBbm5vdGF0aW9ucyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFwiL1wiICsgZXNOYW1lICsgXCIvXCIgKyBzUHJvcCArIFwiQFwiKTtcblx0XHRcdFx0XHRpZiAoYVByb3BlcnR5QW5ub3RhdGlvbnMpIHtcblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0KGJNZWFzdXJlICYmIGFQcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5NZWFzdXJlXCJdKSB8fFxuXHRcdFx0XHRcdFx0XHRvTmF2SGFuZGxlci5fY2hlY2tQcm9wZXJ0eUFubm90YXRpb25zRm9yU2Vuc2l0aXZlRGF0YShhUHJvcGVydHlBbm5vdGF0aW9ucylcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoYVByb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpZWxkQ29udHJvbFwiXSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvRmllbGRDb250cm9sID0gYVByb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpZWxkQ29udHJvbFwiXTtcblx0XHRcdFx0XHRcdFx0aWYgKG9GaWVsZENvbnRyb2xbXCIkRW51bU1lbWJlclwiXSAmJiBvRmllbGRDb250cm9sW1wiJEVudW1NZW1iZXJcIl0uc3BsaXQoXCIvXCIpWzFdID09PSBcIkluYXBwbGljYWJsZVwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRmb3IgKGxldCBrID0gMDsgayA8IGFQcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaysrKSB7XG5cdFx0XHRcdGNvbnN0IHNQcm9wZXJ0eSA9IGFQcm9wZXJ0eU5hbWVzW2tdO1xuXHRcdFx0XHQvLyBwcm9wZXJ0aWVzIG9mIHRoZSBlbnRpdHkgc2V0XG5cdFx0XHRcdGlmIChmbklzU2Vuc2l0aXZlRGF0YShzUHJvcGVydHksIHNFbnRpdHlTZXQpKSB7XG5cdFx0XHRcdFx0b1NWLnJlbW92ZVNlbGVjdE9wdGlvbihzUHJvcGVydHkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50ID0gb1NWLnRvSlNPTk9iamVjdCgpO1xuXHRcdH1cblx0XHRyZXR1cm4gb0RhdGE7XG5cdH1cblxuXHRfY2hlY2tQcm9wZXJ0eUFubm90YXRpb25zRm9yU2Vuc2l0aXZlRGF0YShhUHJvcGVydHlBbm5vdGF0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBib29sZWFuIHtcblx0XHRyZXR1cm4gISEoXG5cdFx0XHRhUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5QZXJzb25hbERhdGEudjEuSXNQb3RlbnRpYWxseVNlbnNpdGl2ZVwiXSB8fFxuXHRcdFx0YVByb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRXhjbHVkZUZyb21OYXZpZ2F0aW9uQ29udGV4dFwiXVxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBwYXJhbWV0ZXIgdmFsdWUgb2YgdGhlIHNhcC1pYXBwLXN0YXRlICh0aGUgaW50ZXJuYWwgYXBwcykgZnJvbSB0aGUgQXBwSGFzaCBzdHJpbmcuIEl0IGF1dG9tYXRpY2FsbHkgdGFrZXMgY2FyZSBhYm91dFxuXHQgKiBjb21wYXRpYmlsaXR5IGJldHdlZW4gdGhlIG9sZCBhbmQgdGhlIG5ldyBhcHByb2FjaCBvZiB0aGUgc2FwLWlhcHAtc3RhdGUuIFByZWNlZGVuY2UgaXMgdGhhdCB0aGUgbmV3IGFwcHJvYWNoIGlzIGZhdm91cmVkIGFnYWluc3QgdGhlIG9sZFxuXHQgKiBhcHByb2FjaC5cblx0ICogQHJldHVybnMgVGhlIHZhbHVlIG9mIHNhcC1pYXBwLXN0YXRlIChpLmUuIHRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgdG8gcmV0cmlldmUgdGhlIHBhcmFtZXRlcnMpLCBvciA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IGluXG5cdCAqICAgICAgICAgY2FzZSB0aGF0IG5vIHNhcC1pYXBwLXN0YXRlIHdhcyBmb3VuZCBpbiA8Y29kZT5zQXBwSGFzaDwvY29kZT4uXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRnZXRJQXBwU3RhdGVLZXkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBzQXBwSGFzaCA9IEhhc2hDaGFuZ2VyLmdldEluc3RhbmNlKCkuZ2V0SGFzaCgpO1xuXHRcdHJldHVybiB0aGlzLl9nZXRJbm5lckFwcFN0YXRlS2V5KHNBcHBIYXNoKTtcblx0fVxufVxuXG4vLyBFeHBvcnRpbmcgdGhlIGNsYXNzIGFzIHByb3Blcmx5IHR5cGVkIFVJNUNsYXNzXG5cbmNvbnN0IE5hdmlnYXRpb25IYW5kbGVyVUk1Q2xhc3MgPSBCYXNlT2JqZWN0LmV4dGVuZChcblx0XCJzYXAuZmUubmF2aWdhdGlvbi5OYXZpZ2F0aW9uSGFuZGxlclwiLFxuXHROYXZpZ2F0aW9uSGFuZGxlci5wcm90b3R5cGUgYXMgYW55XG4pIGFzIHR5cGVvZiBOYXZpZ2F0aW9uSGFuZGxlcjtcbnR5cGUgTmF2aWdhdGlvbkhhbmRsZXJVSTVDbGFzcyA9IEluc3RhbmNlVHlwZTx0eXBlb2YgTmF2aWdhdGlvbkhhbmRsZXI+O1xuZXhwb3J0IGRlZmF1bHQgTmF2aWdhdGlvbkhhbmRsZXJVSTVDbGFzcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztFQW1DQTtBQUNBO0FBQ0E7O0VBa0NBO0VBQ0EsTUFBTUEsT0FBTyxHQUFHQyxVQUFVLENBQUNELE9BQU87RUFDbEMsTUFBTUUsaUJBQWlCLEdBQUdELFVBQVUsQ0FBQ0MsaUJBQWlCO0VBQ3RELE1BQU1DLG1CQUFtQixHQUFHRixVQUFVLENBQUNFLG1CQUFtQjtFQUMxRCxNQUFNQyxJQUFJLEdBQUdILFVBQVUsQ0FBQ0csSUFBSTtFQUU1QixNQUFNQyxVQUFVLEdBQUcsZ0JBQWdCO0VBQ25DLE1BQU1DLDRCQUE0QixHQUFHLG9DQUFvQztFQUN6RSxNQUFNQyxxQkFBcUIsR0FBRyxzQkFBc0I7O0VBRXBEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQWpCQSxJQWtCYUMsaUJBQWlCLDBCQUFBQyxXQUFBO0lBc0Q3QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0MsU0FBQUQsa0JBQ0NFLFdBQXFDLEVBR3BDO01BQUEsSUFBQUMsS0FBQTtNQUFBLElBRkRDLEtBQWEsR0FBQUMsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUdULElBQUksQ0FBQ1ksT0FBTztNQUFBLElBQzVCQyxrQkFBMEIsR0FBQUosU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixT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
|
|
2229
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOYXZUeXBlIiwiTmF2TGlicmFyeSIsIlBhcmFtSGFuZGxpbmdNb2RlIiwiU3VwcHJlc3Npb25CZWhhdmlvciIsIk1vZGUiLCJJQVBQX1NUQVRFIiwiREVGQVVMVEVEX1BBUkFNRVRFUl9QUk9QRVJUWSIsIkhZQlJJRF9JQVBQX1NUQVRFX0tFWSIsIk5hdmlnYXRpb25IYW5kbGVyIiwiX0Jhc2VPYmplY3QiLCJvQ29udHJvbGxlciIsIl90aGlzIiwic01vZGUiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJPRGF0YVY0Iiwic1BhcmFtSGFuZGxpbmdNb2RlIiwiU2VsVmFyV2lucyIsImNhbGwiLCJfYVRlY2huaWNhbFBhcmFtYXRlcnMiLCJfb0xhc3RTYXZlZElubmVyQXBwRGF0YSIsInNBcHBTdGF0ZUtleSIsIm9BcHBEYXRhIiwiaUNhY2hlSGl0IiwiaUNhY2hlTWlzcyIsIl9ySUFwcFN0YXRlT2xkIiwiUmVnRXhwIiwiX3JJQXBwU3RhdGVPbGRBdFN0YXJ0IiwiX3JJQXBwU3RhdGVOZXciLCJOYXZFcnJvciIsIlVJQ29tcG9uZW50Iiwib1JvdXRlciIsImdldFJvdXRlciIsIm9Db21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudCIsIl9nZXRSb3V0ZXIiLCJnZXRBcHBDb21wb25lbnQiLCJnZXRDb21wb25lbnREYXRhIiwiVVJMUGFyYW1XaW5zIiwiSW5zZXJ0SW5TZWxPcHQiLCJPRGF0YVYyIiwiX3NNb2RlIiwiX2V4cG9ydHMiLCJfaW5oZXJpdHNMb29zZSIsIl9wcm90byIsInByb3RvdHlwZSIsIl9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZSIsInVzaGVsbENvbnRhaW5lciIsInNhcCIsInVpIiwicmVxdWlyZSIsImdldFNlcnZpY2UiLCJfZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2VBc3luYyIsImdldFNlcnZpY2VBc3luYyIsInRoZW4iLCJvQ3Jvc3NBcHBOYXZTZXJ2aWNlIiwiY2F0Y2giLCJMb2ciLCJlcnJvciIsImdldFJvdXRlckZvciIsInJlZ2lzdGVyTmF2aWdhdGVDYWxsYmFjayIsImZuQ2FsbGJhY2siLCJfbmF2aWdhdGVDYWxsYmFjayIsIm5hdmlnYXRlIiwic1NlbWFudGljT2JqZWN0Iiwic0FjdGlvbk5hbWUiLCJ2TmF2aWdhdGlvblBhcmFtZXRlcnMiLCJvSW5uZXJBcHBEYXRhIiwiZm5PbkVycm9yIiwib0V4dGVybmFsQXBwRGF0YSIsInNOYXZNb2RlIiwic1NlbGVjdGlvblZhcmlhbnQiLCJtUGFyYW1ldGVycyIsIm9YQXBwRGF0YU9iaiIsIm9TdGFydHVwUGFyYW1ldGVycyIsImJFeFBsYWNlIiwib1RtcERhdGEiLCJvTmF2SGFuZGxlciIsIm9Db21wb25lbnREYXRhIiwic3RhcnR1cFBhcmFtZXRlcnMiLCJvRW5yaWNoZWRTZWxWYXIiLCJfc3BsaXRJbmJvdW5kTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJTZWxlY3Rpb25WYXJpYW50Iiwib05hdmlnYXRpb25TZWxWYXIiLCJ0b0pTT05TdHJpbmciLCJzZWxlY3Rpb25WYXJpYW50IiwiX3JlbW92ZVRlY2huaWNhbFBhcmFtZXRlcnMiLCJ0b0pTT05PYmplY3QiLCJfcmVtb3ZlTWVhc3VyZUJhc2VkSW5mb3JtYXRpb24iLCJfY2hlY2tJc1BvdGVudGlhbGx5U2Vuc2l0aXZlIiwiX2dldFVSTFBhcmFtZXRlcnNGcm9tU2VsZWN0aW9uVmFyaWFudCIsIm9OYXZBcmd1bWVudHMiLCJ0YXJnZXQiLCJzZW1hbnRpY09iamVjdCIsImFjdGlvbiIsInBhcmFtcyIsImZuTmF2aWdhdGUiLCJmbk5hdkV4cGxhY2UiLCJzTmV3SHJlZlByb21pc2UiLCJnZXRIcmVmIiwic05ld0hyZWYiLCJvcGVuV2luZG93Iiwib0Vycm9yIiwiX2ZuU2F2ZUFwcFN0YXRlQXN5bmMiLCJvU2F2ZUFwcFN0YXRlUmV0dXJuIiwiYXBwU3RhdGVLZXkiLCJwdG9FeHQiLCJmblN0b3JlQW5kTmF2aWdhdGUiLCJzdG9yZUlubmVyQXBwU3RhdGVBc3luYyIsInJlcGxhY2VIYXNoIiwib1RhcmdldHMiLCJpc05hdmlnYXRpb25TdXBwb3J0ZWQiLCJzdXBwb3J0ZWQiLCJ0ZWNobmljYWxFcnJvciIsIl9jcmVhdGVUZWNobmljYWxFcnJvciIsInBhcnNlTmF2aWdhdGlvbiIsInNBcHBIYXNoIiwiSGFzaENoYW5nZXIiLCJnZXRJbnN0YW5jZSIsImdldEhhc2giLCJzSUFwcFN0YXRlIiwiX2dldElubmVyQXBwU3RhdGVLZXkiLCJ3YXJuaW5nIiwiaHlicmlkSUFwcFN0YXRlS2V5UGFyYW1zIiwiaHlicmlkRGVmZXJyZWQiLCJqUXVlcnkiLCJEZWZlcnJlZCIsImlBcHBTdGF0ZUh5YnJpZERlZmVycmVkIiwiX2xvYWRBcHBTdGF0ZSIsImh5YnJpZCIsImFEZWZhdWx0ZWRQYXJhbWV0ZXJzIiwiSlNPTiIsInBhcnNlIiwib015RGVmZXJyZWQiLCJwYXJzZVVybFBhcmFtcyIsIm9TdWJTdGFydHVwUGFyYW1ldGVycyIsImFTdWJEZWZhdWx0ZWRQYXJhbWV0ZXJzIiwib1N1Yk15RGVmZXJyZWQiLCJzTmF2VHlwZSIsIm9TZWxWYXJzIiwiaXNFbXB0eSIsIm9EZWZhdWx0ZWRTZWxWYXIiLCJ4QXBwU3RhdGUiLCJyZWplY3QiLCJyZXNvbHZlIiwiaW5pdGlhbCIsIm9BcHBTdGF0ZURhdGEiLCJvU2VsZWN0aW9uVmFyaWFudCIsIm9EZWZhdWx0ZWRTZWxlY3Rpb25WYXJpYW50IiwiYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSIsInN1Y2Nlc3NIYW5kbGVySHlicmlkU3RhdGUiLCJpQXBwU3RhdGVEYXRhIiwiX3JlZiIsIm5hdlR5cGUiLCJpQXBwU3RhdGUiLCJmYWlsdXJlSGFuZGxlckh5YnJpZFN0YXRlIiwiZG9uZSIsImZhaWwiLCJiSXNYYXBwU3RhdGVOYXZpZ2F0aW9uIiwidGhhdCIsImdldFN0YXJ0dXBBcHBTdGF0ZSIsIm9BcHBTdGF0ZSIsImdldERhdGEiLCJzdHJpbmdpZnkiLCJ4IiwicHJvbWlzZSIsIm9TZWxWYXIiLCJVUkxQYXJhbXMiLCJzZXRUZWNobmljYWxQYXJhbWV0ZXJzIiwiYVRlY2huaWNhbFBhcmFtZXRlcnMiLCJBcnJheSIsImlzQXJyYXkiLCJnZXRUZWNobmljYWxQYXJhbWV0ZXJzIiwiY29uY2F0IiwiX2lzVGVjaG5pY2FsUGFyYW1ldGVyIiwic1BhcmFtZXRlck5hbWUiLCJ0b0xvd2VyQ2FzZSIsImluZGV4T2YiLCJpbmNsdWRlcyIsIl9pc0ZFUGFyYW1ldGVyIiwic1Byb3BOYW1lIiwiaSIsImFTZWxWYXJQcm9wTmFtZXMiLCJnZXRTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcyIsInJlbW92ZVNlbGVjdE9wdGlvbiIsIm9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkIiwiaGFzT3duUHJvcGVydHkiLCJnZXRQYXJhbWV0ZXJOYW1lcyIsIm1hc3NBZGRTZWxlY3RPcHRpb24iLCJnZXRWYWx1ZSIsIl9hZGRQYXJhbWV0ZXJWYWx1ZXMiLCJhUHJvcE5hbWVzIiwib1NlbFZhcmlhbnQiLCJzU2lnbiIsInNPcHRpb24iLCJvVmFsdWVzIiwiYWRkU2VsZWN0T3B0aW9uIiwib0hhc2hDaGFuZ2VyIiwic0FwcEhhc2hPbGQiLCJzQXBwSGFzaE5ldyIsIl9yZXBsYWNlSW5uZXJBcHBTdGF0ZUtleSIsIm1Jbm5lckFwcERhdGEiLCJiSW1tZWRpYXRlSGFzaFJlcGxhY2UiLCJiU2tpcEhhc2hSZXBsYWNlIiwiZm5SZXBsYWNlSGFzaCIsImlzRW1wdHlPYmplY3QiLCJzQXBwU3RhdGVLZXlDYWNoZWQiLCJiSW5uZXJBcHBEYXRhRXF1YWwiLCJmbk9uQWZ0ZXJTYXZlIiwiX3NhdmVBcHBTdGF0ZUFzeW5jIiwic3RvcmVJbm5lckFwcFN0YXRlIiwiX3NhdmVBcHBTdGF0ZSIsInN0b3JlSW5uZXJBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4iLCJvQXBwU3RhdGVQcm9taXNlIiwicHJvY2Vzc0JlZm9yZVNtYXJ0TGlua1BvcG92ZXJPcGVucyIsIm9UYWJsZUV2ZW50UGFyYW1ldGVycyIsIm1TZW1hbnRpY0F0dHJpYnV0ZXMiLCJzZW1hbnRpY0F0dHJpYnV0ZXMiLCJmblN0b3JlWGFwcEFuZENhbGxPcGVuIiwibVN1YlNlbWFudGljQXR0cmlidXRlcyIsInNTdWJTZWxlY3Rpb25WYXJpYW50IiwiaVN1cHByZXNzaW9uQmVoYXZpb3IiLCJyYWlzZUVycm9yT25OdWxsIiwicmFpc2VFcnJvck9uVW5kZWZpbmVkIiwib01peGVkU2VsVmFyIiwibWl4QXR0cmlidXRlc0FuZFNlbGVjdGlvblZhcmlhbnQiLCJmbk9uQ29udGFpbmVyU2F2ZSIsInNldFNlbWFudGljQXR0cmlidXRlcyIsInNldEFwcFN0YXRlS2V5Iiwib3BlbiIsIm9TdG9yZUlubmVyQXBwU3RhdGVQcm9taXNlIiwiX2dldEFwcFN0YXRlS2V5QW5kVXJsUGFyYW1ldGVycyIsIl9nZXRBcHBTcGVjaWZpY0hhc2giLCJhcHBIYXNoIiwiY3Jvc3NBcHBTZXJ2aWNlIiwiYXBwU3BlY2lmaWNSb3V0ZSIsIm1lc3NhZ2UiLCJFcnJvciIsIlN0cmluZyIsIl9taXhBdHRyaWJ1dGVzVG9TZWxWYXJpYW50Iiwic1Byb3BlcnR5TmFtZSIsInZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlIiwiRGF0ZSIsInRvSlNPTiIsInRvU3RyaW5nIiwiaWdub3JlRW1wdHlTdHJpbmciLCJpbmZvIiwidlNlbWFudGljQXR0cmlidXRlcyIsInN0YW5kYXJkIiwib05ld1NlbFZhcmlhbnQiLCJmaWx0ZXJVcmwiLCJnZXRGaWx0ZXJDb250ZXh0VXJsIiwic2V0RmlsdGVyQ29udGV4dFVybCIsImNvbnRleHRVcmwiLCJnZXRQYXJhbWV0ZXJDb250ZXh0VXJsIiwic2V0UGFyYW1ldGVyQ29udGV4dFVybCIsImZvckVhY2giLCJhUGFyYW1ldGVycyIsImdldFNlbGVjdE9wdGlvbiIsImdldFBhcmFtZXRlciIsImFTZWxPcHRpb25OYW1lcyIsImFTZWxlY3RPcHRpb24iLCJqIiwiU2lnbiIsIk9wdGlvbiIsIkxvdyIsIkhpZ2giLCJfZW5zdXJlU2VsZWN0aW9uVmFyaWFudEZvcm1hdFN0cmluZyIsInZTZWxlY3Rpb25WYXJpYW50IiwidkNvbnZlcnRlZFNlbGVjdGlvblZhcmlhbnQiLCJfZm5IYW5kbGVBcHBTdGF0ZVByb21pc2UiLCJvUmV0dXJuIiwiX3NhdmVBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4iLCJfZm5TYXZlQXBwU3RhdGVXaXRoSW1tZWRpYXRlUmV0dXJuIiwiZ2V0S2V5Iiwib0FwcERhdGFGb3JTYXZlIiwiX2ZldGNoQXBwRGF0YUZvclNhdmUiLCJzZXREYXRhIiwib1NhdmVQcm9taXNlIiwic2F2ZSIsImV4dGVuZCIsInRhYmxlVmFyaWFudElkIiwiY3VzdG9tRGF0YSIsInByZXNlbnRhdGlvblZhcmlhbnQiLCJ2YWx1ZVRleHRzIiwic2VtYW50aWNEYXRlcyIsIm9BcHBEYXRhQ2xvbmUiLCJPYmplY3QiLCJhc3NpZ24iLCJtZXJnZSIsImNyZWF0ZUVtcHR5QXBwU3RhdGUiLCJvRGVmZXJyZWQiLCJnZXRBcHBTdGF0ZSIsIm9BcHBEYXRhTG9hZGVkIiwiZGF0YSIsImFNYXRjaGVzIiwiZXhlYyIsInNOZXdJQXBwU3RhdGUiLCJmbkFwcGVuZFRvUXVlcnlQYXJhbWV0ZXIiLCJzU3ViQXBwSGFzaCIsInRlc3QiLCJyZXBsYWNlIiwic05lZWRsZSIsImZuUmVwbGFjZU9sZEFwcHJvYWNoIiwick9sZEFwcHJvYWNoIiwiYXNzZXJ0IiwibVVSTFBhcmFtZXRlcnMiLCJhU2VsZWN0UHJvcGVydGllcyIsImFTZWxlY3RPcHRpb25zIiwiYVBhcmFtZXRlck5hbWVzIiwic1BhcmFtZXRlclZhbHVlIiwic0Vycm9yQ29kZSIsInNldE1vZGVsIiwib01vZGVsIiwiX29Nb2RlbCIsIl9nZXRNb2RlbCIsImdldE1vZGVsIiwiX3JlbW92ZUFsbFByb3BlcnRpZXMiLCJvRGF0YSIsIl9yZW1vdmVQcm9wZXJ0aWVzIiwiYUZpbHRlck5hbWUiLCJhUGFyYW1ldGVyTmFtZSIsInNOYW1lIiwiU2VsZWN0T3B0aW9ucyIsInNvbWUiLCJvVmFsdWUiLCJuSWR4IiwiUHJvcGVydHlOYW1lIiwic3BsaWNlIiwiVGV4dHMiLCJvVGV4dHMiLCJQcm9wZXJ0eVRleHRzIiwiRGF0ZXMiLCJvRGF0ZXMiLCJQYXJhbWV0ZXJzIiwiX2lzVGVybVRydWUiLCJvUHJvcGVydHkiLCJzVGVybSIsImZJc1Rlcm1EZWZhdWx0VHJ1ZSIsIm9UZXJtIiwiQm9vbCIsIl9pc0V4Y2x1ZGVkRnJvbU5hdmlnYXRpb25Db250ZXh0IiwiX2lzUG90ZW50aWFsbHlTZW5zaXRpdmUiLCJfaXNNZWFzdXJlUHJvcGVydHkiLCJfaXNUb0JlRXhjbHVkZWQiLCJjb25zdHJ1Y3RDb250ZXh0VXJsIiwic0VudGl0eVNldE5hbWUiLCJfY29uc3RydWN0Q29udGV4dFVybCIsInNTZXJ2ZXJVcmwiLCJpc0EiLCJfZ2V0U2VydmVyVXJsIiwib1NlcnZpY2VVUkkiLCJVUkkiLCJnZXRTZXJ2aWNlVXJsIiwiYWJzb2x1dGVUbyIsImRvY3VtZW50IiwiYmFzZVVSSSIsImxhc3RJbmRleE9mIiwic3Vic3RyaW5nIiwic1NlcnZpY2VVcmwiLCJvQWRhcHRlZERhdGEiLCJGaWx0ZXJDb250ZXh0VXJsIiwiUGFyYW1ldGVyQ29udGV4dFVybCIsImFTZW5zaXRpdmVGaWx0ZXJOYW1lIiwiYVNlbnNpdGl2ZVBhcmFtZXRlck5hbWUiLCJvRW50aXR5U2V0Iiwib0VudGl0eURlZiIsIm9TdWJFbnRpdHlEZWYiLCJvRW5kUm9sZSIsImFGaWx0ZXJDb250ZXh0UGFydCIsImFQYXJhbUNvbnRleHRQYXJ0Iiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsImdldFNlcnZpY2VNZXRhZGF0YSIsInNwbGl0IiwiZ2V0T0RhdGFFbnRpdHlTZXQiLCJnZXRPRGF0YUVudGl0eVR5cGUiLCJlbnRpdHlUeXBlIiwicHJvcGVydHkiLCJwdXNoIiwibmFtZSIsIm5hdmlnYXRpb25Qcm9wZXJ0eSIsImdldE9EYXRhQXNzb2NpYXRpb25FbmQiLCJ0eXBlIiwibXVsdGlwbGljaXR5IiwiX3JlbW92ZVNlbnNpdGl2ZURhdGFGb3JPRGF0YVY0IiwiX3JlbW92ZU1lYXN1cmVCYXNlZFByb3BlcnRpZXMiLCJhTWVhc3VyZUZpbHRlck5hbWUiLCJhTWVhc3VyZVBhcmFtZXRlck5hbWUiLCJiTWVhc3VyZSIsIm9TViIsImdldE9iamVjdCIsInNFbnRpdHlTZXQiLCJhUHJvcGVydHlOYW1lcyIsImdldFByb3BlcnR5TmFtZXMiLCJmbklzU2Vuc2l0aXZlRGF0YSIsInNQcm9wIiwiZXNOYW1lIiwiYVByb3BlcnR5QW5ub3RhdGlvbnMiLCJfY2hlY2tQcm9wZXJ0eUFubm90YXRpb25zRm9yU2Vuc2l0aXZlRGF0YSIsIm9GaWVsZENvbnRyb2wiLCJrIiwic1Byb3BlcnR5IiwiZ2V0SUFwcFN0YXRlS2V5IiwiQmFzZU9iamVjdCIsIk5hdmlnYXRpb25IYW5kbGVyVUk1Q2xhc3MiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIk5hdmlnYXRpb25IYW5kbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwic2FwL2Jhc2UvYXNzZXJ0XCI7XG5pbXBvcnQgZXh0ZW5kIGZyb20gXCJzYXAvYmFzZS91dGlsL2V4dGVuZFwiO1xuaW1wb3J0IGlzRW1wdHlPYmplY3QgZnJvbSBcInNhcC9iYXNlL3V0aWwvaXNFbXB0eU9iamVjdFwiO1xuaW1wb3J0IG1lcmdlIGZyb20gXCJzYXAvYmFzZS91dGlsL21lcmdlXCI7XG5pbXBvcnQgQmFzZU9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IFVJQ29tcG9uZW50IGZyb20gXCJzYXAvdWkvY29yZS9VSUNvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbGxlciBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJcIjtcbmltcG9ydCBIYXNoQ2hhbmdlciBmcm9tIFwic2FwL3VpL2NvcmUvcm91dGluZy9IYXNoQ2hhbmdlclwiO1xuaW1wb3J0IHR5cGUgUm91dGVyIGZyb20gXCJzYXAvdWkvY29yZS9yb3V0aW5nL1JvdXRlclwiO1xuaW1wb3J0IHR5cGUgVjJPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjIvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgVjRPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IFVSSSBmcm9tIFwic2FwL3VpL3RoaXJkcGFydHkvVVJJXCI7XG5pbXBvcnQgalF1ZXJ5IGZyb20gXCJzYXAvdWkvdGhpcmRwYXJ0eS9qcXVlcnlcIjtcbmltcG9ydCBvcGVuV2luZG93IGZyb20gXCJzYXAvdWkvdXRpbC9vcGVuV2luZG93XCI7XG5pbXBvcnQgdHlwZSBDb250YWluZXIgZnJvbSBcInNhcC91c2hlbGwvQ29udGFpbmVyXCI7XG5pbXBvcnQgdHlwZSBDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbiBmcm9tIFwic2FwL3VzaGVsbC9zZXJ2aWNlcy9Dcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvblwiO1xuaW1wb3J0IHR5cGUgTmF2aWdhdGlvbiBmcm9tIFwic2FwL3VzaGVsbC9zZXJ2aWNlcy9OYXZpZ2F0aW9uXCI7XG5pbXBvcnQgTmF2RXJyb3IgZnJvbSBcIi4vTmF2RXJyb3JcIjtcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQgfSBmcm9tIFwiLi9TZWxlY3Rpb25WYXJpYW50XCI7XG5pbXBvcnQgU2VsZWN0aW9uVmFyaWFudCBmcm9tIFwiLi9TZWxlY3Rpb25WYXJpYW50XCI7XG5pbXBvcnQgTmF2TGlicmFyeSBmcm9tIFwiLi9saWJyYXJ5XCI7XG5cbnR5cGUgU2hlbGxBcHBTdGF0ZVJldHVybiA9IHtcblx0cHJvbWlzZTogSlF1ZXJ5LlByb21pc2U8c3RyaW5nPjtcblx0YXBwU3RhdGVLZXk6IHN0cmluZztcbn07XG5cbnR5cGUgU2hlbGxBcHBTdGF0ZSA9IHtcblx0Z2V0S2V5KCk6IHN0cmluZztcblx0c2V0RGF0YShvYmo6IG9iamVjdCk6IHZvaWQ7XG5cdGdldERhdGEoKTogSW5uZXJBcHBEYXRhO1xuXHRzYXZlKCk6IEpRdWVyeS5Qcm9taXNlPHN0cmluZz47XG59O1xuLyoqXG4gKiBTdHJ1Y3R1cmUgb2Ygc3RvcmVkIGFwcCBzdGF0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbm5lckFwcERhdGEge1xuXHRba2V5OiBzdHJpbmddOiB1bmtub3duO1xuXHQvKipcblx0ICogU3JpbmdpZmllZCBKU09OIG9iamVjdCBhcyByZXR1cm5lZCwgZm9yIGV4YW1wbGUsIGZyb20gZ2V0RGF0YVN1aXRlRm9ybWF0KCkgb2YgdGhlIFNtYXJ0RmlsdGVyQmFyIGNvbnRyb2xcblx0ICovXG5cdHNlbGVjdGlvblZhcmlhbnQ/OiBzdHJpbmcgfCBTZXJpYWxpemVkU2VsZWN0aW9uVmFyaWFudDtcblxuXHQvKipcblx0ICogSUQgb2YgdGhlIFNtYXJ0VGFibGUgdmFyaWFudC5cblx0ICovXG5cdHRhYmxlVmFyaWFudElkPzogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBPYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBhcmJpdHJhcnkgZGF0YS5cblx0ICovXG5cdGN1c3RvbURhdGE/OiBvYmplY3Q7XG5cblx0LyoqXG5cdCAqIE9iamVjdCBjb250YWluaW5nIHRoZSBjdXJyZW50IHVpIHN0YXRlIG9mIHRoZSBhcHAuXG5cdCAqL1xuXHRwcmVzZW50YXRpb25WYXJpYW50Pzogb2JqZWN0O1xuXG5cdC8qKlxuXHQgKiBPYmplY3QgY29udGFpbmluZyB2YWx1ZSBkZXNjcmlwdGlvbnMuXG5cdCAqL1xuXHR2YWx1ZVRleHRzPzogb2JqZWN0IHwgbnVsbDtcblxuXHQvKipcblx0ICogT2JqZWN0IGNvbnRhaW5pbmcgc2VtYW50aWNEYXRlcyBmaWx0ZXIgaW5mb3JtYXRpb24uXG5cdCAqL1xuXHRzZW1hbnRpY0RhdGVzPzogb2JqZWN0IHwgbnVsbDtcbn1cblxuLy8gc2hvcnRjdXRzIGZvciBzYXAudWkuZ2VuZXJpYy5hcHAgZW51bXNcbmNvbnN0IE5hdlR5cGUgPSBOYXZMaWJyYXJ5Lk5hdlR5cGU7XG5jb25zdCBQYXJhbUhhbmRsaW5nTW9kZSA9IE5hdkxpYnJhcnkuUGFyYW1IYW5kbGluZ01vZGU7XG5jb25zdCBTdXBwcmVzc2lvbkJlaGF2aW9yID0gTmF2TGlicmFyeS5TdXBwcmVzc2lvbkJlaGF2aW9yO1xuY29uc3QgTW9kZSA9IE5hdkxpYnJhcnkuTW9kZTtcblxuY29uc3QgSUFQUF9TVEFURSA9IFwic2FwLWlhcHAtc3RhdGVcIjtcbmNvbnN0IERFRkFVTFRFRF9QQVJBTUVURVJfUFJPUEVSVFkgPSBcInNhcC11c2hlbGwtZGVmYXVsdGVkUGFyYW1ldGVyTmFtZXNcIjtcbmNvbnN0IEhZQlJJRF9JQVBQX1NUQVRFX0tFWSA9IFwibmhIeWJyaWRJQXBwU3RhdGVLZXlcIjtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBzdWNjZXNzb3Igb2Yge0BsaW5rIHNhcC51aS5nZW5lcmljLmFwcC5uYXZpZ2F0aW9uLnNlcnZpY2UuTmF2aWdhdGlvbkhhbmRsZXJ9Ljxicj4gQ3JlYXRlcyBhIG5ldyBOYXZpZ2F0aW9uSGFuZGxlciBjbGFzcyBieSBwcm92aWRpbmcgdGhlIHJlcXVpcmVkIGVudmlyb25tZW50LiA8YnI+XG4gKiBUaGUgPGNvZGU+TmF2aWdhdGlvbkhhbmRsZXI8L2NvZGU+IHN1cHBvcnRzIHRoZSB2ZXJpZmljYXRpb24gb2Ygc2Vuc2l0aXZlIGluZm9ybWF0aW9uLiBBbGwgcHJvcGVydGllcyB0aGF0IGFyZSBwYXJ0IG9mXG4gKiA8Y29kZT5zZWxlY3Rpb25WYXJpYW50PC9jb2RlPiBhbmQgPGNvZGU+dmFsdWVUZXh0czwvY29kZT4gd2lsbCBiZSB2ZXJpZmllZCBpZiB0aGV5IGFyZSBhbm5vdGF0ZWQgYXNcbiAqIDxjb2RlPmNvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5Jc1BvdGVudGlhbGx5U2Vuc2l0aXZlPC9jb2RlPiBvclxuICogPGNvZGU+Y29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRXhjbHVkZUZyb21OYXZpZ2F0aW9uQ29udGV4dDwvY29kZT4gYW5kIHdpbGwgYmUgcmVtb3ZlZCBiZWZvcmUgdGhlIGRhdGEgaXMgcGVyc2lzdGVkIGFzIHRoZSBhcHBcbiAqIHN0YXRlLjxicj5cbiAqIEFsc28sIGFsbCBwcm9wZXJ0aWVzIGFubm90YXRlZCBhcyA8Y29kZT5jb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuTWVhc3VyZTwvY29kZT4gd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGRhdGEgc3RvcmVkIGFzIHRoZVxuICogeGFwcCBzdGF0ZS48YnI+XG4gKiBUbyB2ZXJpZnkgdGhlIGluZm9ybWF0aW9uIHRvIGJlIHJlbW92ZWQsIHRoZSA8Y29kZT5OYXZpZ2F0aW9uSGFuZGxlcjwvY29kZT4gcmVxdWlyZXMgYW4gdW5uYW1lZCBtb2RlbCBvZiB0eXBlXG4gKiB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnYyLk9EYXRhTW9kZWx9IG9uIGNvbXBvbmVudCBsZXZlbC4gSXQgaXMgcG9zc2libGUgdG8gc2V0IHN1Y2ggYSBtb2RlbCB1c2luZyB0aGUgPGNvZGU+c2V0TW9kZWw8L2NvZGU+XG4gKiBtZXRob2QuPGJyPlxuICogPGI+Tm90ZTo8L2I+IFRoZSBjaGVjayBmb3IgZXhjbHVkZWQgZGF0YSByZXF1aXJlcyB0aGF0IHRoZSBPRGF0YSBtZXRhZGF0YSBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZCBjb21wbGV0ZWx5Ljxicj5cbiAqIElmIHRoZSBPRGF0YSBtZXRhZGF0YSBtb2RlbCBoYXMgbm90IGJlZW4gbG9hZGVkIGNvbXBsZXRlbHksIGFsbCBwcm9wZXJ0aWVzIGFyZSByZW1vdmVkIGZyb20gdGhlIGFwcGxpY2F0aW9uIGNvbnRleHQuPGJyPlxuICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MgcmVxdWlyZXMgdGhhdCB0aGUgVVNoZWxsIHtAbGluayBzYXAudXNoZWxsLnNlcnZpY2VzLkNyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9ufSBpcyBhdmFpbGFibGUgYW5kIGluaXRpYWxpemVkLlxuICogQHB1YmxpY1xuICogQHNpbmNlIDEuODMuMFxuICovXG5leHBvcnQgY2xhc3MgTmF2aWdhdGlvbkhhbmRsZXIgZXh0ZW5kcyBCYXNlT2JqZWN0IHtcblx0cHJpdmF0ZSBvUm91dGVyOiBhbnk7XG5cblx0cHJpdmF0ZSBvQ29tcG9uZW50OiBDb21wb25lbnQ7XG5cblx0cHJpdmF0ZSBfb01vZGVsOiBhbnk7XG5cblx0cHJpdmF0ZSBzUGFyYW1IYW5kbGluZ01vZGU6IHN0cmluZztcblxuXHRwcml2YXRlIF9zTW9kZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5cdC8vIGxpc3Qgb2YgdGVjaG5pY2FsIHBhcmFtZXRlcnNcblx0cHJpdmF0ZSBfYVRlY2huaWNhbFBhcmFtYXRlcnMgPSBbXCJoY3BBcHBsaWNhdGlvbklkXCJdO1xuXG5cdHByaXZhdGUgX29MYXN0U2F2ZWRJbm5lckFwcERhdGE6IGFueSA9IHtcblx0XHRzQXBwU3RhdGVLZXk6IFwiXCIsXG5cdFx0b0FwcERhdGE6IHt9LFxuXHRcdGlDYWNoZUhpdDogMCxcblx0XHRpQ2FjaGVNaXNzOiAwXG5cdH07XG5cblx0Lypcblx0ICogVGhlcmUgZXhpc3RzIGEgZ2VuZXJhdGlvbiBvZiBcIm9sZFwiIHNhcC1pYXBwLXN0YXRlcyB3aGljaCBhcmUgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBVUkwgc2NoZW1hOlxuXHQgKiAjU2VtT2JqLWFjdGlvbiYvcm91dGUvc2FwLWlhcHAtc3RhdGU9QUJDMTIzNDU2NzggVGhlIG5ldyBVUkwgc2NoZW1hIGlzOiAjU2VtT2JqLWFjdGlvbiYvcm91dGU/c2FwLWlhcHAtc3RhdGU9QUJDMTIzNDU2NzggKG1pbmQgdGhlXG5cdCAqIGRpZmZlcmVuY2UgYmV0d2VlbiAvIGFuZCA/IGFib3ZlKSwgaS5lLiB0aGUgc2FwLWlhcHAtc3RhdGUgaGFzIGJlY29tZSBhIHBhcmFtZXRlciBvZiB0aGUgcXVlcnkgcGFyYW1ldGVyIHNlY3Rpb24gaW4gdGhlIEFwcEhhc2ggc3RyaW5nLlxuXHQgKiBZZXQsIHRoaXMgdG9vbCBzaGFsbCBiZSBhYmxlIHRvIGRlYWwgZXZlbiB3aXRoIG9sZCBzYXAtaWFwcC1zdGF0ZXMuIFRoZXJlZm9yZSwgd2UgdXNlIHR3byBSZWd1bGFyIEV4cHJlc3Npb25zIChySUFwcFN0YXRlT2xkIGFuZFxuXHQgKiBySUFwcFN0YXRlT2xkQXRTdGFydCkgYXMgZGVmaW5lZCBiZWxvdyB0byBzY2FuIGZvciB0aGVzZSBvbGQgdmFyaWFudHMuIFRoZSBuZXcgdmFyaWFudCBpcyBiZWluZyBzY2FubmVkIHVzaW5nIHJJQXBwU3RhdGVOZXcgYXMgUmVndWxhclxuXHQgKiBFeHByZXNzaW9uIHNlYXJjaCBzdHJpbmcuIENvbXBhdGliaWxpdHkgaXMgY2VudHJhbGx5IGVuc3VyZWQgYnkgdGhlIHR3byBtZXRob2RzIF9nZXRJbm5lckFwcFN0YXRlS2V5IGFuZCBfcmVwbGFjZUlubmVyQXBwU3RhdGVLZXkgKHNlZVxuXHQgKiBiZWxvdykuIE5ldmVyIHVzZSB0aGVzZSBSZWdFeHAgaW4gYSBtZXRob2Qgb24geW91ciBvd24sIGFzIGl0IHR5cGljYWxseSBpbmRpY2F0ZXMgdGhhdCB5b3Ugd2lsbCBmYWxsIGludG8gdGhlIGNvbXBhdGliaWxpdHkgdHJhcCFcblx0ICovXG5cdC8vIFdhcm5pbmchIERvIG5vdCB1c2UgR0xPQkFMIGZsYWdzIGhlcmU7IFJlZ0V4cCBpbiBHTE9CQUwgbW9kZSBzdG9yZSB0aGUgbGFzdEluZGV4IHZhbHVlXG5cdC8vIFRoZXJlZm9yZSwgcmVwZWF0ZWQgY2FsbHMgdG8gdGhlIFJlZ0V4cCB3aWxsIHRoZW4gb25seSBzdGFydCBiZWdpbm5pbmcgd2l0aCB0aGF0IHN0b3JlZFxuXHQvLyBsYXN0SW5kZXguIFRodXMsIG11bHRpcGxlIGNhbGxzIHRoZXJlZm9yZSBjb3VsZCB5aWVsZCBzdHJhbmdlIHJlc3VsdHMuXG5cdC8vIE1vcmVvdmVyLCB0aGVyZSBzaGFsbCBvbmx5IGJlIGV4YWN0bHkgb25lIElBUFBfU1RBVEUgcGVyIFJlZ0V4cCBpbiBhbiBBcHBIYXNoLlxuXHQvLyBUaGVyZWZvcmUsIEdMT0JBTCBzZWFyY2ggc2hvdWxkIGJlIHN1cGVyZmx1b3VzLlxuXHRwcml2YXRlIF9ySUFwcFN0YXRlT2xkID0gbmV3IFJlZ0V4cChcIi9cIiArIElBUFBfU1RBVEUgKyBcIj0oW14vP10rKVwiKTtcblxuXHRwcml2YXRlIF9ySUFwcFN0YXRlT2xkQXRTdGFydCA9IG5ldyBSZWdFeHAoXCJeXCIgKyBJQVBQX1NUQVRFICsgXCI9KFteLz9dKylcIik7XG5cblx0Lypcblx0ICogUmVndWxhciBFeHByZXNzaW9uIGluIHdvcmRzOiBTZWFyY2ggZm9yIHNvbWV0aGluZyB0aGF0IGVpdGhlciBzdGFydHMgd2l0aCA/IG9yICYsIGZvbGxvd2VkIGJ5IHRoZSB0ZXJtIFwic2FwLWlhcHAtc3RhdGVcIi4gVGhhdCBvbmUgaXNcblx0ICogZm9sbG93ZWQgYnkgYW4gZXF1YWwgc2lnbiAoPSkuIFRoZSBzdHVmZiB0aGF0IGlzIGFmdGVyIHRoZSBlcXVhbCBzaWduIGZvcm1zIHRoZSBmaXJzdCByZWdleHAgZ3JvdXAuIFRoaXMgZ3JvdXAgY29uc2lzdHMgb2YgYXQgbGVhc3Qgb25lXG5cdCAqIChvciBhcmJpdHJhcnkgbWFueSkgY2hhcmFjdGVycywgYXMgbG9uZyBhcyBpdCBpcyBub3QgYW4gYW1wZXJzYW5kIHNpZ24gKCYpLiBDaGFyYWN0ZXJzIGFmdGVyIHN1Y2ggYW4gYW1wZXJzYW5kIHdvdWxkIGJlIGlnbm9yZWQgYW5kIGRvXG5cdCAqIG5vdCBiZWxvbmcgdG8gdGhlIGdyb3VwLiBBbHRlcm5hdGl2ZWx5LCB0aGUgc3RyaW5nIGFsc28gbWF5IGVuZC5cblx0ICovXG5cdHByaXZhdGUgX3JJQXBwU3RhdGVOZXcgPSBuZXcgUmVnRXhwKFwiWz8mXVwiICsgSUFQUF9TVEFURSArIFwiPShbXiZdKylcIik7XG5cblx0cHJpdmF0ZSBfbmF2aWdhdGVDYWxsYmFjazogRnVuY3Rpb24gfCB1bmRlZmluZWQ7XG5cblx0LyoqXG5cdCAqIFRlbXBvcmFyaWx5IGFkZGVkIGFnYWluIGJlY2F1c2UgYW4gYXBwbGljYXRpb24gd2FzIChpbGxlZ2lhbGx5KSByZWx5aW5nIG9uIGl0LiBTaG91bGQgYmUgcmVtb3ZlZCBhZ2Fpbiwgb25jZSB0aGUgYXBwIGlzIGNvcnJlY3RlZFxuXHQgKi9cblx0cHJpdmF0ZSBJQVBQX1NUQVRFID0gSUFQUF9TVEFURTtcblxuXHQvKipcblx0ICogQ29uc3RydWN0b3IgcmVxdWlyaW5nIGEgY29udHJvbGxlci9jb21wb25lbnQgb3duaW5nIHRoZSBuYXZpZ2F0aW9uIGhhbmRsZXIuXG5cdCAqIEBwYXJhbSBvQ29udHJvbGxlciBVSTUgY29udHJvbGxlciB0aGF0IGNvbnRhaW5zIGEgcm91dGVyIGFuZCBhIGNvbXBvbmVudDsgdHlwaWNhbGx5IHRoZSBtYWluIGNvbnRyb2xsZXIgb2YgeW91ciBhcHBsaWNhdGlvbiwgZm9yXG5cdCAqICAgICAgICBleGFtcGxlLCBhIHN1YmNsYXNzIG9mIHRoZSBzYXAuY2Euc2NmbGQubWQuY29udHJvbGxlci5CYXNlRnVsbHNjcmVlbkNvbnRyb2xsZXIgaWYgc2NhZmZvbGRpbmcgaXMgdXNlZFxuXHQgKiBAcGFyYW0gc01vZGUgTW9kZSB0byBiZSB1c2VkIHRvIGluZGljYXRlcyB0aGUgT2RhdGEgdmVyc2lvbiB1c2VkIGZvciBydW5ubmluZyB0aGUgTmF2aWdhdGlvbiBIYW5kbGVyLFxuXHQgKiAgICAgICAgc2VlIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5Nb2RlfS48YnI+XG5cdCAqIFx0XHQgIE5vdGU6IE1vZGUgaGFzIHRvIGJlIHNhcC5mZS5uYXZpZ2F0aW9uLk1vZGUuT0RhdGFWMiB3aGVuZXZlciB0aGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBhIE9EYXRhIFYyIGJhc2VkIHNlcnZpY2UuXG5cdCAqIEBwYXJhbSBzUGFyYW1IYW5kbGluZ01vZGUgTW9kZSB0byBiZSB1c2VkIHRvIGhhbmRsZSBjb25mbGljdHMgd2hlbiBtZXJnaW5nIFVSTCBwYXJhbWV0ZXJzIGFuZCB0aGUgU2VsZWN0aW9uVmFyaWFudCBjbGFzcyxcblx0ICogICAgICAgIHNlZSB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uUGFyYW1IYW5kbGluZ01vZGV9XG5cdCAqIEB0aHJvd3MgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdkVycm9yfSBpbiBjYXNlIG9mIGlucHV0IGVycm9ycy4gVmFsaWQgZXJyb3IgY29kZXMgYXJlOiA8dGFibGU+XG5cdCAqICAgICAgICAgPHRyPlxuXHQgKiAgICAgICAgIDx0aCBhbGlnbj1cImxlZnRcIj5OYXZFcnJvciBjb2RlPC90aD5cblx0ICogICAgICAgICA8dGggYWxpZ249XCJsZWZ0XCI+RGVzY3JpcHRpb248L3RoPlxuXHQgKiAgICAgICAgIDwvdHI+XG5cdCAqICAgICAgICAgPHRyPlxuXHQgKiAgICAgICAgIDx0ZD5OYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUPC90ZD5cblx0ICogICAgICAgICA8dGQ+SW5kaWNhdGVzIHRoYXQgdGhlIGlucHV0IHBhcmFtZXRlciBpcyBpbnZhbGlkPC90ZD5cblx0ICogICAgICAgICA8L3RyPlxuXHQgKiAgICAgICAgIDwvdGFibGU+XG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcihcblx0XHRvQ29udHJvbGxlcjogQ29udHJvbGxlciB8IFVJQ29tcG9uZW50LFxuXHRcdHNNb2RlOiBzdHJpbmcgPSBNb2RlLk9EYXRhVjQsXG5cdFx0c1BhcmFtSGFuZGxpbmdNb2RlOiBzdHJpbmcgPSBQYXJhbUhhbmRsaW5nTW9kZS5TZWxWYXJXaW5zXG5cdCkge1xuXHRcdHN1cGVyKCk7XG5cdFx0aWYgKCFvQ29udHJvbGxlcikge1xuXHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHR9XG5cblx0XHRpZiAob0NvbnRyb2xsZXIgaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkge1xuXHRcdFx0dGhpcy5vUm91dGVyID0gb0NvbnRyb2xsZXIuZ2V0Um91dGVyKCk7XG5cdFx0XHR0aGlzLm9Db21wb25lbnQgPSBvQ29udHJvbGxlcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHR5cGVvZiBvQ29udHJvbGxlci5nZXRPd25lckNvbXBvbmVudCAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMub1JvdXRlciA9IHRoaXMuX2dldFJvdXRlcihvQ29udHJvbGxlcik7XG5cdFx0XHR0aGlzLm9Db21wb25lbnQgPSBvQ29udHJvbGxlci5nZXRPd25lckNvbXBvbmVudCgpIGFzIENvbXBvbmVudDtcblx0XHR9XG5cblx0XHQvLyBzcGVjaWFsIGhhbmRsaW5nIGZvciBTbWFydFRlbXBsYXRlc1xuXHRcdGlmICh0aGlzLm9Db21wb25lbnQgJiYgKHRoaXMub0NvbXBvbmVudCBhcyB7IGdldEFwcENvbXBvbmVudD86IEZ1bmN0aW9uIH0pLmdldEFwcENvbXBvbmVudCkge1xuXHRcdFx0dGhpcy5vQ29tcG9uZW50ID0gKHRoaXMub0NvbXBvbmVudCBhcyB7IGdldEFwcENvbXBvbmVudD86IEZ1bmN0aW9uIH0pLmdldEFwcENvbXBvbmVudD8uKCk7XG5cdFx0fVxuXG5cdFx0aWYgKFxuXHRcdFx0dHlwZW9mIHRoaXMub1JvdXRlciA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuXHRcdFx0dHlwZW9mIHRoaXMub0NvbXBvbmVudCA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuXHRcdFx0dHlwZW9mIHRoaXMub0NvbXBvbmVudC5nZXRDb21wb25lbnREYXRhICE9PSBcImZ1bmN0aW9uXCJcblx0XHQpIHtcblx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0fVxuXG5cdFx0aWYgKHNQYXJhbUhhbmRsaW5nTW9kZSA9PT0gUGFyYW1IYW5kbGluZ01vZGUuVVJMUGFyYW1XaW5zIHx8IHNQYXJhbUhhbmRsaW5nTW9kZSA9PT0gUGFyYW1IYW5kbGluZ01vZGUuSW5zZXJ0SW5TZWxPcHQpIHtcblx0XHRcdHRoaXMuc1BhcmFtSGFuZGxpbmdNb2RlID0gc1BhcmFtSGFuZGxpbmdNb2RlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNQYXJhbUhhbmRsaW5nTW9kZSA9IFBhcmFtSGFuZGxpbmdNb2RlLlNlbFZhcldpbnM7IC8vIGRlZmF1bHRcblx0XHR9XG5cdFx0aWYgKHNNb2RlID09PSBNb2RlLk9EYXRhVjIpIHtcblx0XHRcdHRoaXMuX3NNb2RlID0gc01vZGU7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgc2hlbGwgbmF2aWdhdGlvbiBzZXJ2aWNlLlxuXHQgKiBAcmV0dXJucyBUaGUgTmF2aWdhdGlvbiBzZXJ2aWNlXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cblx0X2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlKCk6IENyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uIHtcblx0XHRjb25zdCB1c2hlbGxDb250YWluZXI6IENvbnRhaW5lciA9IHNhcC51aS5yZXF1aXJlKFwic2FwL3VzaGVsbC9Db250YWluZXJcIik7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG5cdFx0cmV0dXJuIHVzaGVsbENvbnRhaW5lci5nZXRTZXJ2aWNlKFwiQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb25cIikgYXMgQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb247XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBzaGVsbCBuYXZpZ2F0aW9uIHNlcnZpY2UuXG5cdCAqIEByZXR1cm5zIFRoZSBOYXZpZ2F0aW9uIHNlcnZpY2Vcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGFzeW5jIF9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZUFzeW5jKCk6IFByb21pc2U8TmF2aWdhdGlvbj4ge1xuXHRcdGNvbnN0IHVzaGVsbENvbnRhaW5lcjogQ29udGFpbmVyID0gc2FwLnVpLnJlcXVpcmUoXCJzYXAvdXNoZWxsL0NvbnRhaW5lclwiKTtcblx0XHRyZXR1cm4gdXNoZWxsQ29udGFpbmVyXG5cdFx0XHQ/LmdldFNlcnZpY2VBc3luYyhcIk5hdmlnYXRpb25cIilcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvQ3Jvc3NBcHBOYXZTZXJ2aWNlOiBvYmplY3QpIHtcblx0XHRcdFx0cmV0dXJuIG9Dcm9zc0FwcE5hdlNlcnZpY2UgYXMgTmF2aWdhdGlvbjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlcjogTmF2aWdhdGlvbiBpcyBub3QgYXZhaWxhYmxlLlwiKTtcblx0XHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuTk8uWEFQUFNFUlZJQ0VcIik7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHJlZmVyZW5jZSB0byB0aGUgcm91dGVyIG9iamVjdCBmb3IgbmF2aWdhdGlvbiBmb3IgdGhpcyBnaXZlbiBDb250cm9sbGVyLlxuXHQgKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIHJlZmVyZW5jZSB0byB0aGUgQ29udHJvbGxlciBmb3Igd2hpY2ggdGhlIFJvdXRlciBpbnN0YW5jZSBzaGFsbCBiZSBkZXRlcm1pbmVkLlxuXHQgKiBAcmV0dXJucyBUaGUgUm91dGVyIGZvciB0aGUgZ2l2ZW4gQ29udHJvbGxlclxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2dldFJvdXRlcihvQ29udHJvbGxlcjogQ29udHJvbGxlcik6IFJvdXRlciB7XG5cdFx0cmV0dXJuIFVJQ29tcG9uZW50LmdldFJvdXRlckZvcihvQ29udHJvbGxlcik7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgdG8gYmUgdXNlZCBvbmx5IGJ5IEZFIFYyIHRvIGdldCBhY2Nlc3MgdG8gdG9FeHRlcm5hbCBwcm9taXNlLlxuXHQgKiBAcGFyYW0gZm5DYWxsYmFjayBDYWxsYmFjayB0byBiZSBjYWxsZWQgYnkgJ25hdmlnYXRlJyBtZXRob2QgaW4gY2FzZSBvZiB0b0V4dGVybmFsIGlzIHVzZWQgdG8gbmF2aWdhdGUuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRyZWdpc3Rlck5hdmlnYXRlQ2FsbGJhY2soZm5DYWxsYmFjazogRnVuY3Rpb24pOiB2b2lkIHtcblx0XHR0aGlzLl9uYXZpZ2F0ZUNhbGxiYWNrID0gZm5DYWxsYmFjaztcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmlnZ2VycyBhIGNyb3NzLWFwcCBuYXZpZ2F0aW9uIGFmdGVyIHNhdmluZyB0aGUgaW5uZXIgYW5kIHRoZSBjcm9zcy1hcHAgc3RhdGVzLiBUaGUgbmF2aWdhdGlvbiBtb2RlIGJhc2VkIG9uXG5cdCAqIDxjb2RlPnNhcC11c2hlbGwtbmV4dC1uYXZtb2RlPC9jb2RlPiBpcyB0YWtlbiBpbnRvIGFjY291bnQuIElmIHNldCB0byA8Y29kZT5leHBsYWNlPC9jb2RlPiB0aGUgaW5uZXIgYXBwIHN0YXRlIHdpbGwgbm90IGJlIGNoYW5nZWQuXG5cdCAqIDxiPk5vdGU6PC9iPiBUaGUgPGNvZGU+c05hdk1vZGU8L2NvZGU+IGFyZ3VtZW50IGNhbiBiZSB1c2VkIHRvIG92ZXJ3cml0ZSB0aGUgU0FQIEZpb3JpIGxhdW5jaHBhZCBkZWZhdWx0IG5hdmlnYXRpb24gZm9yIG9wZW5pbmcgYSBVUkxcblx0ICogaW4tcGxhY2Ugb3IgZXgtcGxhY2UuXG5cdCAqIDxicj5cblx0ICogPGI+Tm9kZTo8L2I+IElmIHRoZSA8Y29kZT5vRXh0ZXJuYWxBcHBEYXRhPC9jb2RlPiBwYXJhbWV0ZXIgaXMgbm90IHN1cHBsaWVkLCB0aGUgZXh0ZXJuYWwgYXBwIGRhdGEgd2lsbCBiZSBjYWxjdWxhdGVkIGJhc2VkIG9uXG5cdCAqIHRoZSA8Y29kZT5vSW5uZXJBcHBEYXRhPC9jb2RlPiBkYXRhLjxicj5cblx0ICogU21hcnRGaWx0ZXJCYXIgY29udHJvbCA8Yj5QYXJhbWV0ZXJzOjwvYj4gPHRhYmxlPlxuXHQgKiA8dHI+XG5cdCAqIDx0ZCBhbGlnbj1cImNlbnRlclwiPntvYmplY3R9PC90ZD5cblx0ICogPHRkPjxiPm9FcnJvcjwvYj48L3RkPlxuXHQgKiA8dGQ+TmF2RXJyb3Igb2JqZWN0IChpbnN0YW5jZSBvZiB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2RXJyb3J9KSB0aGF0IGRlc2NyaWJlcyB3aGljaCBraW5kIG9mIGVycm9yIG9jY3VycmVkPC90ZD5cblx0ICogPHRyPlxuXHQgKiA8dGQgYWxpZ249XCJjZW50ZXJcIj57c3RyaW5nfTwvdGQ+XG5cdCAqIDx0ZD48Yj5vRXJyb3IuZXJyb3JDb2RlPC9iPjwvdGQ+XG5cdCAqIDx0ZD5Db2RlIHRvIGlkZW50aWZ5IHRoZSBlcnJvcjwvdGQ+XG5cdCAqIDx0cj5cblx0ICogPHRkIGFsaWduPVwiY2VudGVyXCI+e3N0cmluZ308L3RkPlxuXHQgKiA8dGQ+PGI+b0Vycm9yLnR5cGU8L2I+PC90ZD5cblx0ICogPHRkPlNldmVyaXR5IG9mIHRoZSBlcnJvciAoaW5mby93YXJuaW5nL2Vycm9yKTwvdGQ+XG5cdCAqIDx0cj5cblx0ICogPHRkIGFsaWduPVwiY2VudGVyXCI+e2FycmF5fTwvdGQ+XG5cdCAqIDx0ZD48Yj5vRXJyb3IucGFyYW1zPC9iPjwvdGQ+XG5cdCAqIDx0ZD5BbiBhcnJheSBvZiBvYmplY3RzICh0eXBpY2FsbHkgc3RyaW5ncykgdGhhdCBkZXNjcmliZSBhZGRpdGlvbmFsIHZhbHVlIHBhcmFtZXRlcnMgcmVxdWlyZWQgZm9yIGdlbmVyYXRpbmcgdGhlIG1lc3NhZ2U8L3RkPlxuXHQgKiA8L3RhYmxlPi5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0gc1NlbWFudGljT2JqZWN0IE5hbWUgb2YgdGhlIHNlbWFudGljIG9iamVjdCBvZiB0aGUgdGFyZ2V0IGFwcFxuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgTmFtZSBvZiB0aGUgYWN0aW9uIG9mIHRoZSB0YXJnZXQgYXBwXG5cdCAqIEBwYXJhbSB2TmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzIGFzIGFuIG9iamVjdCB3aXRoIGtleS92YWx1ZSBwYWlycyBvciBhcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBzdWNoIGFuIG9iamVjdC4gSWYgcGFzc2VkIGFzIGFuIG9iamVjdCwgdGhlIHByb3BlcnRpZXMgYXJlIG5vdCBjaGVja2VkIGFnYWluc3QgdGhlIDxjb2RlPklzUG90ZW50aWFsU2Vuc2l0aXZlPC9jb2RlPiBvciA8Y29kZT5NZWFzdXJlPC9jb2RlPiB0eXBlLlxuXHQgKiBAcGFyYW0gb0lubmVyQXBwRGF0YSBPYmplY3QgZm9yIHN0b3JpbmcgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwXG5cdCAqIEBwYXJhbSBmbk9uRXJyb3IgQ2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBuYXZpZ2F0aW9uIDxicj5cblx0ICogQHBhcmFtIG9FeHRlcm5hbEFwcERhdGEgT2JqZWN0IGZvciBzdG9yaW5nIHRoZSBzdGF0ZSB3aGljaCB3aWxsIGJlIGZvcndhcmRlZCB0byB0aGUgdGFyZ2V0IGNvbXBvbmVudC5cblx0ICogQHBhcmFtIG9FeHRlcm5hbEFwcERhdGEucHJlc2VudGF0aW9uVmFyaWFudCBPYmplY3QgY29udGFpbmluZyB0aGUgY3VycmVudCB1aSBzdGF0ZSBvZiB0aGUgYXBwIHdoaWNoIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZVxuXHQgKiAgICAgICAgdGFyZ2V0IGNvbXBvbmVudC5cblx0ICogQHBhcmFtIG9FeHRlcm5hbEFwcERhdGEudmFsdWVUZXh0cyBPYmplY3QgY29udGFpbmluZyB2YWx1ZSBkZXNjcmlwdGlvbnMgd2hpY2ggd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlIHRhcmdldCBjb21wb25lbnQuXG5cdCAqIEBwYXJhbSBvRXh0ZXJuYWxBcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQgU3RyaW5naWZpZWQgSlNPTiBvYmplY3QsIHdoaWNoIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZSB0YXJnZXQgY29tcG9uZW50LiBJZiBub3Rcblx0ICogICAgICAgIHByb3ZpZGVkIHRoZSBzZWxlY3Rpb25WYXJpYW50IHdpbGwgYmUgY29uc3RydWN0ZWQgYmFzZWQgb24gdGhlIHZOYXZpZ2F0aW9uUGFyYW1ldGVycy5cblx0ICogQHBhcmFtIHNOYXZNb2RlIEFyZ3VtZW50IGlzIHVzZWQgdG8gb3ZlcndyaXRlIHRoZSBGTFAtY29uZmlndXJlZCB0YXJnZXQgZm9yIG9wZW5pbmcgYSBVUkwuIElmIHVzZWQsIG9ubHkgdGhlXG5cdCAqICAgICAgICA8Y29kZT5leHBsYWNlPC9jb2RlPiBvciA8Y29kZT5pbnBsYWNlPC9jb2RlPiB2YWx1ZXMgYXJlIGFsbG93ZWQuIEFueSBvdGhlciB2YWx1ZSB3aWxsIGxlYWQgdG8gYW4gZXhjZXB0aW9uXG5cdCAqICAgICAgICA8Y29kZT5OYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX05BVl9NT0RFPC9jb2RlPi5cblx0ICogQGV4YW1wbGUgPGNvZGU+XG5cdCAqIHNhcC51aS5kZWZpbmUoW1wic2FwL2ZlL25hdmlnYXRpb24vTmF2aWdhdGlvbkhhbmRsZXJcIiwgXCJzYXAvZmUvbmF2aWdhdGlvbi9TZWxlY3Rpb25WYXJpYW50XCJdLCBmdW5jdGlvbiAoTmF2aWdhdGlvbkhhbmRsZXIsIFNlbGVjdGlvblZhcmlhbnQpIHtcblx0ICogXHR2YXIgb05hdmlnYXRpb25IYW5kbGVyID0gbmV3IE5hdmlnYXRpb25IYW5kbGVyKG9Db250cm9sbGVyKTtcblx0ICogXHR2YXIgc1NlbWFudGljT2JqZWN0ID0gXCJTYWxlc09yZGVyXCI7XG5cdCAqIFx0dmFyIHNBY3Rpb25OYW1lID0gXCJjcmVhdGVcIjtcblx0ICpcblx0ICogXHQvL3NpbXBsZSBwYXJhbWV0ZXJzIGFzIE9iamVjdFxuXHQgKiBcdHZhciB2TmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7XG5cdCAqIFx0XHRDb21wYW55Q29kZSA6IFwiMDAwMVwiLFxuXHQgKiBcdFx0Q3VzdG9tZXIgOiBcIkMwMDAxXCJcblx0ICogXHR9O1xuXHQgKlxuXHQgKiBcdC8vb3IgYXMgc2VsZWN0aW9uIHZhcmlhbnRcblx0ICogXHR2YXIgb1NlbGVjdGlvblZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudCgpO1xuXHQgKlx0IG9TZWxlY3Rpb25WYXJpYW50LmFkZFNlbGVjdE9wdGlvbihcIkNvbXBhbnlDb2RlXCIsIFwiSVwiLCBcIkVRXCIsIFwiMDAwMVwiKTtcblx0ICogXHRvU2VsZWN0aW9uVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oXCJDdXN0b21lclwiLCBcIklcIiwgXCJFUVwiLCBcIkMwMDAxXCIpO1xuXHQgKiBcdHZOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IG9TZWxlY3Rpb25WYXJpYW50LnRvSlNPTlN0cmluZygpO1xuXHQgKlxuXHQgKiBcdC8vb3IgZGlyZWN0bHkgZnJvbSBTbWFydEZpbHRlckJhclxuXHQgKiBcdHZOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IG9TbWFydEZpbHRlckJhci5nZXREYXRhU3VpdGVGb3JtYXQoKTtcblx0ICpcblx0ICogXHQvL2FwcCBzdGF0ZSBmb3IgYmFjayBuYXZpZ2F0aW9uXG5cdCAqXHQgdmFyIG9Jbm5lckFwcERhdGEgPSB7XG5cdCAqIFx0XHRzZWxlY3Rpb25WYXJpYW50IDogb1NtYXJ0RmlsdGVyQmFyLmdldERhdGFTdWl0ZUZvcm1hdCgpLFxuXHQgKiBcdFx0dGFibGVWYXJpYW50SWQgOiBvU21hcnRUYWJsZS5nZXRDdXJyZW50VmFyaWFudElkKCksXG5cdCAqIFx0XHRjdXN0b21EYXRhIDogb015Q3VzdG9tRGF0YVxuXHQgKiBcdH07XG5cdCAqXG5cdCAqIFx0Ly8gY2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvcnNcblx0ICogXHR2YXIgZm5PbkVycm9yID0gZnVuY3Rpb24ob0Vycm9yKXtcblx0ICogXHRcdHZhciBvaTE4biA9IG9Db250cm9sbGVyLmdldFZpZXcoKS5nZXRNb2RlbChcImkxOG5cIikuZ2V0UmVzb3VyY2VCdW5kbGUoKTtcblx0ICogXHRcdG9FcnJvci5zZXRVSVRleHQoe29pMThuIDogb2kxOG4sIHNUZXh0S2V5IDogXCJPVVRCT1VORF9OQVZfRVJST1JcIn0pO1xuXHQgKiBcdFx0b0Vycm9yLnNob3dNZXNzYWdlQm94KCk7XG5cdCAqIFx0fTtcblx0ICpcblx0ICogXHRvTmF2aWdhdGlvbkhhbmRsZXIubmF2aWdhdGUoc1NlbWFudGljT2JqZWN0LCBzQWN0aW9uTmFtZSwgdk5hdmlnYXRpb25QYXJhbWV0ZXJzLCBvSW5uZXJBcHBEYXRhLCBmbk9uRXJyb3IpO1xuXHQgKiB9KTtcblx0ICogPC9jb2RlPlxuXHQgKi9cblx0bmF2aWdhdGUoXG5cdFx0c1NlbWFudGljT2JqZWN0OiBzdHJpbmcsXG5cdFx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0XHR2TmF2aWdhdGlvblBhcmFtZXRlcnM6IG9iamVjdCB8IHN0cmluZyxcblx0XHRvSW5uZXJBcHBEYXRhPzogSW5uZXJBcHBEYXRhLFxuXHRcdGZuT25FcnJvcj86IEZ1bmN0aW9uLFxuXHRcdG9FeHRlcm5hbEFwcERhdGE/OiB7XG5cdFx0XHR2YWx1ZVRleHRzPzogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRcdFx0cHJlc2VudGF0aW9uVmFyaWFudD86IG9iamVjdCB8IHVuZGVmaW5lZDtcblx0XHRcdHNlbGVjdGlvblZhcmlhbnQ/OiBvYmplY3QgfCB1bmRlZmluZWQ7XG5cdFx0fSxcblx0XHRzTmF2TW9kZT86IHN0cmluZ1xuXHQpOiB2b2lkIHtcblx0XHRsZXQgc1NlbGVjdGlvblZhcmlhbnQ6IGFueSxcblx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0b1hBcHBEYXRhT2JqOiBhbnksXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMsXG5cdFx0XHRiRXhQbGFjZSA9IGZhbHNlLFxuXHRcdFx0b1RtcERhdGE6IGFueSA9IHt9O1xuXHRcdGNvbnN0IG9OYXZIYW5kbGVyOiBOYXZpZ2F0aW9uSGFuZGxlciA9IHRoaXM7XG5cblx0XHRjb25zdCBvQ29tcG9uZW50RGF0YSA9IHRoaXMub0NvbXBvbmVudC5nZXRDb21wb25lbnREYXRhKCkgYXMgUmVjb3JkPHN0cmluZywgYW55Pjtcblx0XHQvKlxuXHRcdCAqIFRoZXJlIGFyZSBzb21lIHJhY2UgY29uZGl0aW9ucyB3aGVyZSB0aGUgb0NvbXBvbmVudERhdGEgbWF5IG5vdCBiZSBzZXQsIGZvciBleGFtcGxlIGluIGNhc2UgdGhlIFVTaGVsbCB3YXMgbm90IGluaXRpYWxpemVkIHByb3Blcmx5LiBUb1xuXHRcdCAqIG1ha2Ugc3VyZSB0aGF0IHdlIGRvIG5vdCBkdW1wIGhlcmUgd2l0aCBhbiBleGNlcHRpb24sIHdlIHRha2UgdGhpcyBzcGVjaWFsIGVycm9yIGhhbmRsaW5nIGJlaGF2aW9yOlxuXHRcdCAqL1xuXHRcdGlmIChvQ29tcG9uZW50RGF0YSkge1xuXHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzID0gb0NvbXBvbmVudERhdGEuc3RhcnR1cFBhcmFtZXRlcnM7XG5cblx0XHRcdGlmIChcblx0XHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzICYmXG5cdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVyc1tcInNhcC11c2hlbGwtbmV4dC1uYXZtb2RlXCJdICYmXG5cdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVyc1tcInNhcC11c2hlbGwtbmV4dC1uYXZtb2RlXCJdLmxlbmd0aCA+IDBcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBiRXhQbGFjZSA9IChKU09OLnBhcnNlKG9TdGFydHVwUGFyYW1ldGVyc1tcInNhcC11c2hlbGwtbmV4dC1uYXZtb2RlXCJdWzBdKSA9PT0gXCJleHBsYWNlXCIpO1xuXHRcdFx0XHRiRXhQbGFjZSA9IG9TdGFydHVwUGFyYW1ldGVyc1tcInNhcC11c2hlbGwtbmV4dC1uYXZtb2RlXCJdWzBdID09PSBcImV4cGxhY2VcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBvbmx5IG5hdi1tb2RlICdpbnBsYWNlJyBvciAnZXhwbGFjZScgYXJlIHN1cHBvcnRlZC4gQW55IG90aGVyIHZhbHVlIHdpbGwgbGVhZCB0byBhbiBleGNlcHRpb24uXG5cdFx0aWYgKHNOYXZNb2RlICYmIChzTmF2TW9kZSA9PT0gXCJpbnBsYWNlXCIgfHwgc05hdk1vZGUgPT09IFwiZXhwbGFjZVwiKSkge1xuXHRcdFx0YkV4UGxhY2UgPSBzTmF2TW9kZSA9PT0gXCJleHBsYWNlXCI7XG5cdFx0fSBlbHNlIGlmIChzTmF2TW9kZSkge1xuXHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9OQVZfTU9ERVwiKTtcblx0XHR9XG5cblx0XHRpZiAob0V4dGVybmFsQXBwRGF0YSA9PT0gdW5kZWZpbmVkIHx8IG9FeHRlcm5hbEFwcERhdGEgPT09IG51bGwpIHtcblx0XHRcdG9YQXBwRGF0YU9iaiA9IHt9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvWEFwcERhdGFPYmogPSBvRXh0ZXJuYWxBcHBEYXRhO1xuXHRcdH1cblxuXHRcdC8vIGZvciBuYXZpZ2F0aW9uIHdlIG5lZWQgVVJMIHBhcmFtZXRlcnMgKGxlZ2FjeSBuYXZpZ2F0aW9uKSBhbmQgc2FwLXhhcHAtc3RhdGUsIHRoZXJlZm9yZSB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgbWlzc2luZyBvbmUgZnJvbSB0aGVcblx0XHQvLyBwYXNzZWQgb25lXG5cdFx0aWYgKHR5cGVvZiB2TmF2aWdhdGlvblBhcmFtZXRlcnMgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHNTZWxlY3Rpb25WYXJpYW50ID0gdk5hdmlnYXRpb25QYXJhbWV0ZXJzO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZOYXZpZ2F0aW9uUGFyYW1ldGVycyA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0Y29uc3Qgb0VucmljaGVkU2VsVmFyID0gdGhpcy5fc3BsaXRJbmJvdW5kTmF2aWdhdGlvblBhcmFtZXRlcnMoXG5cdFx0XHRcdG5ldyBTZWxlY3Rpb25WYXJpYW50KCksXG5cdFx0XHRcdHZOYXZpZ2F0aW9uUGFyYW1ldGVycyxcblx0XHRcdFx0W11cblx0XHRcdCkub05hdmlnYXRpb25TZWxWYXI7XG5cdFx0XHRzU2VsZWN0aW9uVmFyaWFudCA9IG9FbnJpY2hlZFNlbFZhci50b0pTT05TdHJpbmcoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHR9XG5cblx0XHRvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoc1NlbGVjdGlvblZhcmlhbnQpO1xuXHRcdGlmICh0eXBlb2Ygdk5hdmlnYXRpb25QYXJhbWV0ZXJzID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50ID0gdGhpcy5fcmVtb3ZlVGVjaG5pY2FsUGFyYW1ldGVycyhvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50KTtcblx0XHR9XG5cdFx0b1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudCA9IG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQgJiYgb1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudC50b0pTT05PYmplY3QoKTtcblx0XHRvVG1wRGF0YSA9IHRoaXMuX3JlbW92ZU1lYXN1cmVCYXNlZEluZm9ybWF0aW9uKG9UbXBEYXRhKTsgLy8gcmVtb3ZlIGV2ZW50dWFsIG1lYXN1cmVzXG5cdFx0b1RtcERhdGEgPSB0aGlzLl9jaGVja0lzUG90ZW50aWFsbHlTZW5zaXRpdmUob1RtcERhdGEpOyAvLyByZW1vdmUgZXZlbnR1YWwgc2Vuc2l0aXZlIGRhdGFcblxuXHRcdGlmIChvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0XHRtUGFyYW1ldGVycyA9IHRoaXMuX2dldFVSTFBhcmFtZXRlcnNGcm9tU2VsZWN0aW9uVmFyaWFudChuZXcgU2VsZWN0aW9uVmFyaWFudChvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50KSk7XG5cdFx0XHRzU2VsZWN0aW9uVmFyaWFudCA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQpLnRvSlNPTlN0cmluZygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycyA9IHt9O1xuXHRcdFx0c1NlbGVjdGlvblZhcmlhbnQgPSBudWxsO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9OYXZBcmd1bWVudHM6IGFueSA9IHtcblx0XHRcdHRhcmdldDoge1xuXHRcdFx0XHRzZW1hbnRpY09iamVjdDogc1NlbWFudGljT2JqZWN0LFxuXHRcdFx0XHRhY3Rpb246IHNBY3Rpb25OYW1lXG5cdFx0XHR9LFxuXHRcdFx0cGFyYW1zOiBtUGFyYW1ldGVycyB8fCB7fVxuXHRcdH07XG5cblx0XHRjb25zdCBmbk5hdmlnYXRlID0gYXN5bmMgZnVuY3Rpb24gKG9Dcm9zc0FwcE5hdlNlcnZpY2U6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdFx0aWYgKCFvWEFwcERhdGFPYmouc2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdFx0XHRvWEFwcERhdGFPYmouc2VsZWN0aW9uVmFyaWFudCA9IHNTZWxlY3Rpb25WYXJpYW50O1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBmbk5hdkV4cGxhY2UgPSBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdGNvbnN0IHNOZXdIcmVmUHJvbWlzZSA9IG9Dcm9zc0FwcE5hdlNlcnZpY2UuZ2V0SHJlZihvTmF2QXJndW1lbnRzLCBvTmF2SGFuZGxlci5vQ29tcG9uZW50KTtcblx0XHRcdFx0c05ld0hyZWZQcm9taXNlXG5cdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKHNOZXdIcmVmOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRcdFx0XHRcdG9wZW5XaW5kb3coc05ld0hyZWYpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IHVua25vd24pOiB2b2lkIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJldGlyZXZpbmcgaHJlZkZvckV4dGVybmFsIDogXCIgKyBvRXJyb3IpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fTtcblxuXHRcdFx0b1hBcHBEYXRhT2JqID0gb05hdkhhbmRsZXIuX3JlbW92ZU1lYXN1cmVCYXNlZEluZm9ybWF0aW9uKG9YQXBwRGF0YU9iaik7XG5cdFx0XHRyZXR1cm4gb05hdkhhbmRsZXIuX2ZuU2F2ZUFwcFN0YXRlQXN5bmMob1hBcHBEYXRhT2JqLCBmbk9uRXJyb3IpLnRoZW4oZnVuY3Rpb24gKG9TYXZlQXBwU3RhdGVSZXR1cm46IGFueSk6IHZvaWQge1xuXHRcdFx0XHRpZiAob1NhdmVBcHBTdGF0ZVJldHVybikge1xuXHRcdFx0XHRcdG9OYXZBcmd1bWVudHMuYXBwU3RhdGVLZXkgPSBvU2F2ZUFwcFN0YXRlUmV0dXJuLmFwcFN0YXRlS2V5O1xuXG5cdFx0XHRcdFx0Ly8gUmVtYXJrOlxuXHRcdFx0XHRcdC8vIFRoZSBDcm9zcyBBcHAgU2VydmljZSB0YWtlcyBjYXJlIG9mIGVuY29kaW5nIHBhcmFtZXRlciBrZXlzIGFuZCB2YWx1ZXMuIEV4YW1wbGU6XG5cdFx0XHRcdFx0Ly8gbVBhcmFtcyA9IHsgXCIkQCVcIiA6IFwiJi89XCIgfSByZXN1bHRzIGluIHRoZSBVUkwgcGFyYW1ldGVyICUyNTI0JTI1NDAlMjUyNT0lMjUyNiUyNTJGJTI1M0Rcblx0XHRcdFx0XHQvLyBOb3RlIHRoZSBkb3VibGUgZW5jb2RpbmcsIHRoaXMgaXMgY29ycmVjdC5cblxuXHRcdFx0XHRcdC8vIHRvRXh0ZXJuYWwgc2V0cyBzYXAteGFwcC1zdGF0ZSBpbiB0aGUgVVJMIGlmIGFwcFN0YXRlS2V5IGlzIHByb3ZpZGVkIGluIG9OYXZBcmd1bWVudHNcblx0XHRcdFx0XHQvLyB0b0V4dGVybmFsIGhhcyBpc3N1ZXMgb24gc3RpY2t5IGFwcHMgRklPUklURUNIUDEtMTQ0MDAsIHRlbXAgZml4IHVzaW5nIGhyZWZGb3JFeHRlcm5hbFxuXHRcdFx0XHRcdGlmIChzTmF2TW9kZSA9PSBcImV4cGxhY2VcIikge1xuXHRcdFx0XHRcdFx0Zm5OYXZFeHBsYWNlKCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNvbnN0IHB0b0V4dCA9IG9Dcm9zc0FwcE5hdlNlcnZpY2UubmF2aWdhdGUob05hdkFyZ3VtZW50cywgb05hdkhhbmRsZXIub0NvbXBvbmVudCk7XG5cdFx0XHRcdFx0XHQvLyBUT0RPOiBUaGlzIGlzIGp1c3QgYSB0ZW1wb3Jhcnkgc29sdXRpb24gdG8gYWxsb3cgRkUgVjIgdG8gdXNlIHRvRXh0ZXJuYWwgcHJvbWlzZS5cblx0XHRcdFx0XHRcdGlmIChvTmF2SGFuZGxlci5fbmF2aWdhdGVDYWxsYmFjaykge1xuXHRcdFx0XHRcdFx0XHRvTmF2SGFuZGxlci5fbmF2aWdhdGVDYWxsYmFjayhwdG9FeHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSAvLyBlbHNlIDogZXJyb3Igd2FzIGFscmVhZHkgcmVwb3J0ZWRcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSk7XG5cdFx0fTtcblx0XHRjb25zdCBmblN0b3JlQW5kTmF2aWdhdGUgPSBmdW5jdGlvbiAob0Nyb3NzQXBwTmF2U2VydmljZTogYW55KTogdm9pZCB7XG5cdFx0XHRvTmF2SGFuZGxlclxuXHRcdFx0XHQuc3RvcmVJbm5lckFwcFN0YXRlQXN5bmMob0lubmVyQXBwRGF0YSBhcyBhbnksIHRydWUpXG5cdFx0XHRcdC50aGVuKGFzeW5jIGZ1bmN0aW9uIChzQXBwU3RhdGVLZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdFx0XHRcdGlmIChzQXBwU3RhdGVLZXkpIHtcblx0XHRcdFx0XHRcdG9OYXZIYW5kbGVyLnJlcGxhY2VIYXNoKHNBcHBTdGF0ZUtleSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBmbk5hdmlnYXRlKG9Dcm9zc0FwcE5hdlNlcnZpY2UpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0aWYgKGZuT25FcnJvcikge1xuXHRcdFx0XHRcdFx0Zm5PbkVycm9yKG9FcnJvcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHR9O1xuXHRcdGlmIChzTmF2TW9kZSkge1xuXHRcdFx0b05hdkFyZ3VtZW50cy5wYXJhbXNbXCJzYXAtdXNoZWxsLW5hdm1vZGVcIl0gPSBiRXhQbGFjZSA/IFwiZXhwbGFjZVwiIDogXCJpbnBsYWNlXCI7XG5cdFx0fVxuXHRcdG9OYXZIYW5kbGVyXG5cdFx0XHQuX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlQXN5bmMoKVxuXHRcdFx0LnRoZW4oYXN5bmMgZnVuY3Rpb24gKG9Dcm9zc0FwcE5hdlNlcnZpY2U6IE5hdmlnYXRpb24pIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRjb25zdCBvVGFyZ2V0cyA9IGF3YWl0IChvQ3Jvc3NBcHBOYXZTZXJ2aWNlLmlzTmF2aWdhdGlvblN1cHBvcnRlZChcblx0XHRcdFx0XHRcdFtvTmF2QXJndW1lbnRzXSxcblx0XHRcdFx0XHRcdG9OYXZIYW5kbGVyLm9Db21wb25lbnRcblx0XHRcdFx0XHQpIGFzIHVua25vd24gYXMgUHJvbWlzZTx7IHN1cHBvcnRlZDogYm9vbGVhbiB9W10+KTtcblx0XHRcdFx0XHRpZiAob1RhcmdldHNbMF0uc3VwcG9ydGVkKSB7XG5cdFx0XHRcdFx0XHRpZiAoIWJFeFBsYWNlKSB7XG5cdFx0XHRcdFx0XHRcdGZuU3RvcmVBbmROYXZpZ2F0ZShvQ3Jvc3NBcHBOYXZTZXJ2aWNlKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGZuTmF2aWdhdGUob0Nyb3NzQXBwTmF2U2VydmljZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChmbk9uRXJyb3IpIHtcblx0XHRcdFx0XHRcdC8vIGludGVudCBpcyBub3Qgc3VwcG9ydGVkXG5cdFx0XHRcdFx0XHRjb25zdCBvRXJyb3IgPSBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5pc0ludGVudFN1cHBvcnRlZC5ub3RTdXBwb3J0ZWRcIik7XG5cdFx0XHRcdFx0XHRmbk9uRXJyb3Iob0Vycm9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0XHRcdGlmIChmbk9uRXJyb3IpIHtcblx0XHRcdFx0XHRcdC8vIHRlY2huaWNhbCBlcnJvcjogY291bGQgbm90IGRldGVybWluZSBpZiBpbnRlbnQgaXMgc3VwcG9ydGVkXG5cdFx0XHRcdFx0XHRjb25zdCB0ZWNobmljYWxFcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLmlzSW50ZW50U3VwcG9ydGVkLmZhaWxlZFwiKTtcblx0XHRcdFx0XHRcdGZuT25FcnJvcih0ZWNobmljYWxFcnJvcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdGlmIChmbk9uRXJyb3IpIHtcblx0XHRcdFx0XHRmbk9uRXJyb3Iob0Vycm9yKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogUGFyc2VzIHRoZSBpbmNvbWluZyBVUkwgYW5kIHJldHVybnMgYSBQcm9taXNlLiBJZiB0aGlzIG1ldGhvZCBkZXRlY3RzIGEgYmFjayBuYXZpZ2F0aW9uLCB0aGUgaW5uZXIgYXBwIHN0YXRlIGlzIHJldHVybmVkIGluIHRoZSByZXNvbHZlZFxuXHQgKiBQcm9taXNlLiBPdGhlcndpc2Ugc3RhcnR1cCBwYXJhbWV0ZXJzIHdpbGwgYmUgbWVyZ2VkIGludG8gdGhlIGFwcCBzdGF0ZSBwcm92aWRlZCBieSBjcm9zcyBhcHAgbmF2aWdhdGlvbiwgYW5kIGEgY29tYmluZWQgYXBwIHN0YXRlIHdpbGwgYmVcblx0ICogcmV0dXJuZWQuIFRoZSBjb25mbGljdCByZXNvbHV0aW9uIGNhbiBiZSBpbmZsdWVuY2VkIHdpdGggc1BhcmFtSGFuZGxpbmdNb2RlIGRlZmluZWQgaW4gdGhlIGNvbnN0cnVjdG9yLlxuXHQgKiBAcmV0dXJucyBBIFByb21pc2Ugb2JqZWN0IHRvIG1vbml0b3Igd2hlbiBhbGwgdGhlIGFjdGlvbnMgb2YgdGhlIGZ1bmN0aW9uIGhhdmUgYmVlbiBleGVjdXRlZC4gSWYgdGhlIGV4ZWN1dGlvbiBpcyBzdWNjZXNzZnVsLCB0aGVcblx0ICogICAgICAgICAgZXh0cmFjdGVkIGFwcCBzdGF0ZSwgdGhlIHN0YXJ0dXAgcGFyYW1ldGVycywgYW5kIHRoZSB0eXBlIG9mIG5hdmlnYXRpb24gYXJlIHJldHVybmVkLCBzZWUgYWxzbyB0aGUgZXhhbXBsZSBhYm92ZS4gVGhlIGFwcCBzdGF0ZSBpc1xuXHQgKiAgICAgICAgICBhbiBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOlxuXHQgKiAgICAgICAgICA8dWw+XG5cdCAqICAgICAgICAgIDxsaT48Y29kZT5vQXBwRGF0YS5vU2VsZWN0aW9uVmFyaWFudDwvY29kZT46IEFuIGluc3RhbmNlIG9mIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5TZWxlY3Rpb25WYXJpYW50fVxuXHQgKiAgICAgICAgICBjb250YWluaW5nIG9ubHkgcGFyYW1ldGVycy9zZWxlY3Qgb3B0aW9ucyB0aGF0IGFyZSByZWxhdGVkIHRvIG5hdmlnYXRpb248L2xpPlxuXHQgKiAgICAgICAgICA8bGk+PGNvZGU+b0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudDwvY29kZT46IFRoZSBuYXZpZ2F0aW9uLXJlbGF0ZWQgc2VsZWN0aW9uIHZhcmlhbnQgYXMgYSBKU09OLWZvcm1hdHRlZCBzdHJpbmc8L2xpPlxuXHQgKiAgICAgICAgICA8bGk+PGNvZGU+b0FwcERhdGEub0RlZmF1bHRlZFNlbGVjdGlvblZhcmlhbnQ8L2NvZGU+OiBBbiBpbnN0YW5jZSBvZlxuXHQgKiAgICAgICAgICB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uU2VsZWN0aW9uVmFyaWFudH0gY29udGFpbmluZyBvbmx5IHRoZSBwYXJhbWV0ZXJzL3NlbGVjdCBvcHRpb25zIHRoYXQgYXJlIHNldCBieSB1c2VyXG5cdCAqICAgICAgICAgIGRlZmF1bHQgZGF0YTwvbGk+XG5cdCAqICAgICAgICAgIDxsaT48Y29kZT5vQXBwRGF0YS5iTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5PC9jb2RlPjogQSBCb29sZWFuIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBvbmx5IGRlZmF1bHRlZCBwYXJhbWV0ZXJzIGFuZCBub1xuXHQgKiAgICAgICAgICBuYXZpZ2F0aW9uIHBhcmFtZXRlcnMgYXJlIHByZXNlbnQuPGJyPlxuXHQgKiAgICAgICAgICA8Yj5Ob3RlOjwvYj4gSWYgbm8gbmF2aWdhdGlvbiBwYXJhbWV0ZXJzIGFyZSBhdmFpbGFibGUsIDxjb2RlPmJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHk8L2NvZGU+IGlzIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPixcblx0ICogICAgICAgICAgZXZlbiB0aG91Z2ggcGFyYW1ldGVycyB3aXRob3V0IGRlZmF1bHQgbWlnaHQgYmUgYXZhaWxhYmxlIGFzIHdlbGwuPC9saT5cblx0ICogICAgICAgICAgPC91bD5cblx0ICogICAgICAgICAgSWYgdGhlIG5hdmlnYXRpb24tcmVsYXRlZCBzZWxlY3Rpb24gdmFyaWFudCBpcyBlbXB0eSwgaXQgaXMgcmVwbGFjZWQgYnkgYSBjb3B5IG9mIHRoZSBkZWZhdWx0ZWQgc2VsZWN0aW9uIHZhcmlhbnQuPGJyPlxuXHQgKiAgICAgICAgICBUaGUgbmF2aWdhdGlvbiB0eXBlIGlzIGFuIGVudW1lcmF0aW9uIHR5cGUgb2YgdHlwZSB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2VHlwZX0gKHBvc3NpYmxlIHZhbHVlcyBhcmVcblx0ICogICAgICAgICAgaW5pdGlhbCwgVVJMUGFyYW1zLCB4QXBwU3RhdGUsIGFuZCBpQXBwU3RhdGUpLjxicj5cblx0ICogICAgICAgICAgPGI+Tm90ZTo8L2I+IElmIHRoZSBuYXZpZ2F0aW9uIHR5cGUgaXMge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdlR5cGUuaUFwcFN0YXRlfSBvQXBwRGF0YSBoYXMgdHdvXG5cdCAqICAgICAgICAgIGFkZGl0aW9uYWwgcHJvcGVydGllc1xuXHQgKiAgICAgICAgICA8dWw+XG5cdCAqICAgICAgICAgIDxsaT48Y29kZT5vQXBwRGF0YS50YWJsZVZhcmlhbnRJZDwvY29kZT48L2xpPlxuXHQgKiAgICAgICAgICA8bGk+PGNvZGU+b0FwcERhdGEuY3VzdG9tRGF0YTwvY29kZT48L2xpPlxuXHQgKiAgICAgICAgICA8L3VsPlxuXHQgKiAgICAgICAgICB3aGljaCByZXR1cm4gdGhlIGlubmVyIGFwcCBkYXRhIGFzIHN0b3JlZCBpbiB7QGxpbmsgIy5uYXZpZ2F0ZSBuYXZpZ2F0ZX0gb3Ige0BsaW5rICMuc3RvcmVJbm5lckFwcFN0YXRlQXN5bmMgc3RvcmVJbm5lckFwcFN0YXRlQXN5bmN9LlxuXHQgKiAgICAgICAgICA8Y29kZT5vQXBwRGF0YS5vRGVmYXVsdGVkU2VsZWN0aW9uVmFyaWFudDwvY29kZT4gaXMgYW4gZW1wdHkgc2VsZWN0aW9uIHZhcmlhbnQgYW5kXG5cdCAqICAgICAgICAgIDxjb2RlPm9BcHBEYXRhLmJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHk8L2NvZGU+IGlzIDxjb2RlPmZhbHNlPC9jb2RlPiBpbiB0aGlzIGNhc2UuPGJyPlxuXHQgKiAgICAgICAgICA8Yj5Ob3RlOjwvYj4gSWYgdGhlIG5hdmlnYXRpb24gdHlwZSBpcyB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2VHlwZS5pbml0aWFsfSBvQXBwRGF0YSBpcyBhbiBlbXB0eSBvYmplY3QhPGJyPlxuXHQgKiAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMsIGFuIGVycm9yIG9iamVjdCBvZiB0eXBlIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZFcnJvcn0sIFVSTCBwYXJhbWV0ZXJzIChpZiBhdmFpbGFibGUpXG5cdCAqICAgICAgICAgIGFuZCB0aGUgdHlwZSBvZiBuYXZpZ2F0aW9uIGFyZSByZXR1cm5lZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAZXhhbXBsZSA8Y29kZT5cblx0ICogc2FwLnVpLmRlZmluZShbXCJzYXAvZmUvbmF2aWdhdGlvbi9OYXZpZ2F0aW9uSGFuZGxlclwiXSwgZnVuY3Rpb24gKE5hdmlnYXRpb25IYW5kbGVyKSB7XG5cdCAqIFx0dmFyIG9OYXZpZ2F0aW9uSGFuZGxlciA9IG5ldyBOYXZpZ2F0aW9uSGFuZGxlcihvQ29udHJvbGxlcik7XG5cdCAqIFx0dmFyIG9QYXJzZU5hdmlnYXRpb25Qcm9taXNlID0gb05hdmlnYXRpb25IYW5kbGVyLnBhcnNlTmF2aWdhdGlvbigpO1xuXHQgKlxuXHQgKiBcdG9QYXJzZU5hdmlnYXRpb25Qcm9taXNlLmRvbmUoZnVuY3Rpb24ob0FwcERhdGEsIG9TdGFydHVwUGFyYW1ldGVycywgc05hdlR5cGUpe1xuXHQgKiBcdFx0XHRvU21hcnRGaWx0ZXJCYXIuc2V0RGF0YVN1aXRlRm9ybWF0KG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQpO1xuXHQgKiBcdFx0XHQvLyBvQXBwRGF0YS5vU2VsZWN0aW9uVmFyaWFudCBjYW4gYmUgdXNlZCB0byBtYW5pcHVsYXRlIHRoZSBzZWxlY3Rpb24gdmFyaWFudFxuXHQgKiBcdFx0XHQvLyBvQXBwRGF0YS5vRGVmYXVsdGVkU2VsZWN0aW9uVmFyaWFudCBjb250YWlucyB0aGUgcGFyYW1ldGVycyB3aGljaCBhcmUgc2V0IGJ5IHVzZXIgZGVmYXVsdHNcblx0ICogXHRcdFx0Ly8gb0FwcERhdGEuYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSBpbmRpY2F0ZXMgd2hldGhlciBvbmx5IGRlZmF1bHRlZCBwYXJhbWV0ZXJzIGFuZCBubyBuYXZpZ2F0aW9uIHBhcmFtZXRlcnMgYXJlIHByZXNlbnRcblx0ICogXHR9KTtcblx0ICogXHRvUGFyc2VOYXZpZ2F0aW9uUHJvbWlzZS5mYWlsKGZ1bmN0aW9uKG9FcnJvciwgb1VSTFBhcmFtZXRlcnMsIHNOYXZUeXBlKXtcblx0ICogXHRcdC8vIGlmIGUuZy4gdGhlIHhhcHAgc3RhdGUgY291bGQgbm90IGJlIGxvYWRlZCwgbmV2ZXJ0aGVsZXNzIHRoZXJlIG1heSBiZSBVUkwgcGFyYW1ldGVycyBhdmFpbGFibGVcblx0ICogXHRcdC8vc29tZSBlcnJvciBoYW5kbGluZ1xuXHQgKiBcdH0pO1xuXHQgKiB9KTtcblx0ICogPC9jb2RlPlxuXHQgKi9cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcm9taXNlLWZ1bmN0aW9uLWFzeW5jXG5cdHBhcnNlTmF2aWdhdGlvbigpOiBKUXVlcnkuUHJvbWlzZTx1bmtub3duPiB7XG5cdFx0Y29uc3Qgc0FwcEhhc2ggPSBIYXNoQ2hhbmdlci5nZXRJbnN0YW5jZSgpLmdldEhhc2goKTtcblx0XHQvKlxuXHRcdCAqIHVzZSAuZ2V0SGFzaCgpIGhlcmUgaW5zdGVhZCBvZiAuZ2V0QXBwSGFzaCgpIHRvIGFsc28gYmUgYWJsZSBkZWFsaW5nIHdpdGggZW52aXJvbm1lbnRzIHdoZXJlIG9ubHkgU0FQVUk1IGlzIGxvYWRlZCBhbmQgdGhlIFVTaGVsbCBpc1xuXHRcdCAqIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseS5cblx0XHQgKi9cblx0XHRjb25zdCBzSUFwcFN0YXRlID0gdGhpcy5fZ2V0SW5uZXJBcHBTdGF0ZUtleShzQXBwSGFzaCk7XG5cblx0XHRsZXQgb0NvbXBvbmVudERhdGEgPSB0aGlzLm9Db21wb25lbnQuZ2V0Q29tcG9uZW50RGF0YSgpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdC8qXG5cdFx0ICogVGhlcmUgYXJlIHNvbWUgcmFjZSBjb25kaXRpb25zIHdoZXJlIHRoZSBvQ29tcG9uZW50RGF0YSBtYXkgbm90IGJlIHNldCwgZm9yIGV4YW1wbGUgaW4gY2FzZSB0aGUgVVNoZWxsIHdhcyBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkuIFRvXG5cdFx0ICogbWFrZSBzdXJlIHRoYXQgd2UgZG8gbm90IGR1bXAgaGVyZSB3aXRoIGFuIGV4Y2VwdGlvbiwgd2UgdGFrZSB0aGlzIHNwZWNpYWwgZXJyb3IgaGFuZGxpbmcgYmVoYXZpb3I6XG5cdFx0ICovXG5cdFx0aWYgKG9Db21wb25lbnREYXRhID09PSB1bmRlZmluZWQpIHtcblx0XHRcdExvZy53YXJuaW5nKFwiVGhlIG5hdmlnYXRpb24gQ29tcG9uZW50J3MgZGF0YSB3YXMgbm90IHNldCBwcm9wZXJseTsgYXNzdW1pbmcgaW5zdGVhZCB0aGF0IG5vIHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkLlwiKTtcblx0XHRcdG9Db21wb25lbnREYXRhID0ge307XG5cdFx0fVxuXG5cdFx0Ly8gUmVtYXJrOlxuXHRcdC8vIFRoZSBzdGFydHVwIHBhcmFtZXRlcnMgYXJlIGFscmVhZHkgZGVjb2RlZC4gRXhhbXBsZTpcblx0XHQvLyBUaGUgb3JpZ2luYWwgVVJMIHBhcmFtZXRlciAlMjUyNCUyNTQwJTI1MjU9JTI1MjYlMjUyRiUyNTNEIHJlc3VsdHMgaW4gb1N0YXJ0dXBQYXJhbWV0ZXJzID0geyBcIiRAJVwiIDogXCImLz1cIiB9XG5cdFx0Ly8gTm90ZSB0aGUgZG91YmxlIGVuY29kaW5nIGluIHRoZSBVUkwsIHRoaXMgaXMgY29ycmVjdC4gQW4gVVJMIHBhcmFtZXRlciBsaWtlIHh5ej0lMjUgY2F1c2VzIGFuIFwiVVJJIG1hbGZvcm1lZFwiIGVycm9yLlxuXHRcdC8vIElmIHRoZSBkZWNvZGVkIHZhbHVlIHNob3VsZCBiZSBlLmcuIFwiJTI1XCIsIHRoZSBwYXJhbWV0ZXIgaW4gdGhlIFVSTCBuZWVkcyB0byBiZTogeHl6PSUyNTI1MjVcblx0XHRjb25zdCBvU3RhcnR1cFBhcmFtZXRlcnMgPSBvQ29tcG9uZW50RGF0YS5zdGFydHVwUGFyYW1ldGVycyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXHRcdGNvbnN0IGh5YnJpZElBcHBTdGF0ZUtleVBhcmFtczogc3RyaW5nIHwgdW5kZWZpbmVkID0gb1N0YXJ0dXBQYXJhbWV0ZXJzPy5bSFlCUklEX0lBUFBfU1RBVEVfS0VZXT8uWzBdO1xuXHRcdGNvbnN0IGh5YnJpZERlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCkgYXMgSlF1ZXJ5LkRlZmVycmVkPHVua25vd24+O1xuXHRcdGxldCBpQXBwU3RhdGVIeWJyaWREZWZlcnJlZDogSlF1ZXJ5LkRlZmVycmVkPHVua25vd24+IHwgdW5kZWZpbmVkO1xuXHRcdGlmIChoeWJyaWRJQXBwU3RhdGVLZXlQYXJhbXMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aUFwcFN0YXRlSHlicmlkRGVmZXJyZWQgPSB0aGlzLl9sb2FkQXBwU3RhdGUoaHlicmlkSUFwcFN0YXRlS2V5UGFyYW1zLCBoeWJyaWREZWZlcnJlZCwgTmF2VHlwZS5oeWJyaWQpO1xuXHRcdH1cblxuXHRcdGxldCBhRGVmYXVsdGVkUGFyYW1ldGVyczogYW55ID0gW107XG5cdFx0aWYgKFxuXHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzICYmXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnNbREVGQVVMVEVEX1BBUkFNRVRFUl9QUk9QRVJUWV0gJiZcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVyc1tERUZBVUxURURfUEFSQU1FVEVSX1BST1BFUlRZXS5sZW5ndGggPiAwXG5cdFx0KSB7XG5cdFx0XHRhRGVmYXVsdGVkUGFyYW1ldGVycyA9IEpTT04ucGFyc2Uob1N0YXJ0dXBQYXJhbWV0ZXJzW0RFRkFVTFRFRF9QQVJBTUVURVJfUFJPUEVSVFldWzBdKTtcblx0XHR9XG5cblx0XHRjb25zdCBvTXlEZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpIGFzIEpRdWVyeS5EZWZlcnJlZDx1bmtub3duPjtcblxuXHRcdGNvbnN0IG9OYXZIYW5kbGVyID0gdGhpcztcblx0XHRjb25zdCBwYXJzZVVybFBhcmFtcyA9IGZ1bmN0aW9uIChcblx0XHRcdG9TdWJTdGFydHVwUGFyYW1ldGVyczogYW55LFxuXHRcdFx0YVN1YkRlZmF1bHRlZFBhcmFtZXRlcnM6IGFueSxcblx0XHRcdG9TdWJNeURlZmVycmVkOiBKUXVlcnkuRGVmZXJyZWQ8dW5rbm93bj4sXG5cdFx0XHRzTmF2VHlwZTogc3RyaW5nXG5cdFx0KTogdm9pZCB7XG5cdFx0XHQvLyBzdGFuZGFyZCBVUkwgbmF2aWdhdGlvblxuXHRcdFx0Y29uc3Qgb1NlbFZhcnMgPSBvTmF2SGFuZGxlci5fc3BsaXRJbmJvdW5kTmF2aWdhdGlvblBhcmFtZXRlcnMoXG5cdFx0XHRcdG5ldyBTZWxlY3Rpb25WYXJpYW50KCksXG5cdFx0XHRcdG9TdWJTdGFydHVwUGFyYW1ldGVycyxcblx0XHRcdFx0YVN1YkRlZmF1bHRlZFBhcmFtZXRlcnNcblx0XHRcdCk7XG5cdFx0XHQvLyBGb3Igc2NlbmFyaW8sIHdoZXJlIG9ubHkgaHlicmlkSUFwcFN0YXRlS2V5IGlzIHBhcnQgb2YgdXJsUGFyYW1zLCB3ZSBpZ25vcmUgdGhpcyBjb25kaXRpb25cblx0XHRcdGlmIChvU2VsVmFycy5vTmF2aWdhdGlvblNlbFZhci5pc0VtcHR5KCkgJiYgb1NlbFZhcnMub0RlZmF1bHRlZFNlbFZhci5pc0VtcHR5KCkgJiYgc05hdlR5cGUgIT09IE5hdlR5cGUuaHlicmlkKSB7XG5cdFx0XHRcdC8vIFN0YXJ0dXAgcGFyYW1ldGVycyBjb250YWluIG9ubHkgdGVjaG5pY2FsIHBhcmFtZXRlcnMgKFNBUCBzeXN0ZW0pIHdoaWNoIHdlcmUgZmlsdGVyZWQgb3V0LlxuXHRcdFx0XHQvLyBvTmF2aWdhdGlvblNlbFZhciBhbmQgb0RlZmF1bHRlZFNlbFZhciBhcmUgZW1wdHkuXG5cdFx0XHRcdC8vIFRodXMsIGNvbnNpZGVyIHRoaXMgdHlwZSBvZiBuYXZpZ2F0aW9uIGFzIGFuIGluaXRpYWwgbmF2aWdhdGlvbi5cblx0XHRcdFx0aWYgKHNOYXZUeXBlID09PSBOYXZUeXBlLnhBcHBTdGF0ZSkge1xuXHRcdFx0XHRcdGNvbnN0IG9FcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLmdldERhdGFGcm9tQXBwU3RhdGUuZmFpbGVkXCIpO1xuXHRcdFx0XHRcdG9TdWJNeURlZmVycmVkLnJlamVjdChvRXJyb3IsIG9TdWJTdGFydHVwUGFyYW1ldGVycyB8fCB7fSwgTmF2VHlwZS54QXBwU3RhdGUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9TdWJNeURlZmVycmVkLnJlc29sdmUoe30sIG9TdWJTdGFydHVwUGFyYW1ldGVycywgTmF2VHlwZS5pbml0aWFsKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgb0FwcFN0YXRlRGF0YTogYW55ID0ge307XG5cdFx0XHRcdG9BcHBTdGF0ZURhdGEuc2VsZWN0aW9uVmFyaWFudCA9IG9TZWxWYXJzLm9OYXZpZ2F0aW9uU2VsVmFyLnRvSlNPTlN0cmluZygpO1xuXHRcdFx0XHRvQXBwU3RhdGVEYXRhLm9TZWxlY3Rpb25WYXJpYW50ID0gb1NlbFZhcnMub05hdmlnYXRpb25TZWxWYXI7XG5cdFx0XHRcdG9BcHBTdGF0ZURhdGEub0RlZmF1bHRlZFNlbGVjdGlvblZhcmlhbnQgPSBvU2VsVmFycy5vRGVmYXVsdGVkU2VsVmFyO1xuXHRcdFx0XHRvQXBwU3RhdGVEYXRhLmJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHkgPSBvU2VsVmFycy5iTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5O1xuXG5cdFx0XHRcdC8vIG5vIHNhcC14YXBwLXN0YXRlIGJ1dCBuYXZUeXBlIGlzIGh5YnJpZCwgZXh0cmFjdCB0aGUgSUFwcFN0YXRlRGF0YVxuXHRcdFx0XHRpZiAoc05hdlR5cGUgPT09IE5hdlR5cGUuaHlicmlkKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc3VjY2Vzc0hhbmRsZXJIeWJyaWRTdGF0ZSA9IGZ1bmN0aW9uIChpQXBwU3RhdGVEYXRhOiB1bmtub3duLCBfcmVmOiB1bmtub3duLCBuYXZUeXBlOiB1bmtub3duKTogdm9pZCB7XG5cdFx0XHRcdFx0XHRvQXBwU3RhdGVEYXRhLmlBcHBTdGF0ZSA9IGlBcHBTdGF0ZURhdGE7XG5cdFx0XHRcdFx0XHRvU3ViTXlEZWZlcnJlZC5yZXNvbHZlKG9BcHBTdGF0ZURhdGEsIG9TdGFydHVwUGFyYW1ldGVycywgbmF2VHlwZSk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRjb25zdCBmYWlsdXJlSGFuZGxlckh5YnJpZFN0YXRlID0gZnVuY3Rpb24gKG9FcnJvcjogb2JqZWN0LCBfcmVmOiBvYmplY3QsIG5hdlR5cGU6IHN0cmluZyk6IHZvaWQge1xuXHRcdFx0XHRcdFx0b1N1Yk15RGVmZXJyZWQucmVqZWN0KG9FcnJvciwgX3JlZiwgbmF2VHlwZSk7XG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGlmIChpQXBwU3RhdGVIeWJyaWREZWZlcnJlZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRpQXBwU3RhdGVIeWJyaWREZWZlcnJlZC5kb25lKHN1Y2Nlc3NIYW5kbGVySHlicmlkU3RhdGUpO1xuXHRcdFx0XHRcdFx0aUFwcFN0YXRlSHlicmlkRGVmZXJyZWQuZmFpbChmYWlsdXJlSGFuZGxlckh5YnJpZFN0YXRlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b1N1Yk15RGVmZXJyZWQucmVzb2x2ZShvQXBwU3RhdGVEYXRhLCBvU3ViU3RhcnR1cFBhcmFtZXRlcnMsIHNOYXZUeXBlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdFx0aWYgKHNJQXBwU3RhdGUpIHtcblx0XHRcdC8vIGlubmVyIGFwcCBzdGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIEFwcEhhc2ggKGJhY2sgbmF2aWdhdGlvbik7IGV4dHJhY3QgdGhlIHBhcmFtZXRlciB2YWx1ZVxuXHRcdFx0dGhpcy5fbG9hZEFwcFN0YXRlKHNJQXBwU3RhdGUsIG9NeURlZmVycmVkLCBOYXZUeXBlLmlBcHBTdGF0ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIG5vIGJhY2sgbmF2aWdhdGlvblxuXHRcdFx0Y29uc3QgYklzWGFwcFN0YXRlTmF2aWdhdGlvbiA9IG9Db21wb25lbnREYXRhW1wic2FwLXhhcHAtc3RhdGVcIl0gIT09IHVuZGVmaW5lZDtcblx0XHRcdGlmIChiSXNYYXBwU3RhdGVOYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdGNvbnN0IHRoYXQgPSB0aGlzO1xuXHRcdFx0XHQvLyBpbm5lciBhcHAgc3RhdGUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgQXBwSGFzaCwgYnV0IHhhcHAgc3RhdGUgPT4gdHJ5IHRvIHJlYWQgdGhlIHhhcHAgc3RhdGVcblx0XHRcdFx0dGhpcy5fZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2VBc3luYygpXG5cdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9Dcm9zc0FwcE5hdlNlcnZpY2U6IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9Dcm9zc0FwcE5hdlNlcnZpY2UuZ2V0U3RhcnR1cEFwcFN0YXRlKHRoYXQub0NvbXBvbmVudCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0Vycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuZ2V0U3RhcnR1cFN0YXRlLmZhaWxlZFwiKTtcblx0XHRcdFx0XHRcdG9NeURlZmVycmVkLnJlamVjdChvRXJyb3IsIHt9LCBOYXZUeXBlLnhBcHBTdGF0ZSk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Byb21pc2UtZnVuY3Rpb24tYXN5bmNcblx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAob0FwcFN0YXRlOiBTaGVsbEFwcFN0YXRlKTogSlF1ZXJ5LlByb21pc2U8dW5rbm93bj4gfCB1bmRlZmluZWQge1xuXHRcdFx0XHRcdFx0Ly8gZ2V0IGFwcCBzdGF0ZSBmcm9tIHNhcC14YXBwLXN0YXRlLFxuXHRcdFx0XHRcdFx0Ly8gY3JlYXRlIGEgY29weSwgbm90IG9ubHkgYSByZWZlcmVuY2UsIGJlY2F1c2Ugd2Ugd2FudCB0byBtb2RpZnkgdGhlIG9iamVjdFxuXHRcdFx0XHRcdFx0bGV0IG9BcHBTdGF0ZURhdGEgPSBvQXBwU3RhdGUuZ2V0RGF0YSgpO1xuXHRcdFx0XHRcdFx0bGV0IG9FcnJvcjtcblx0XHRcdFx0XHRcdGlmIChvQXBwU3RhdGVEYXRhKSB7XG5cdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0b0FwcFN0YXRlRGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob0FwcFN0YXRlRGF0YSkpO1xuXHRcdFx0XHRcdFx0XHR9IGNhdGNoICh4KSB7XG5cdFx0XHRcdFx0XHRcdFx0b0Vycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuQXBwU3RhdGVEYXRhLnBhcnNlRXJyb3JcIik7XG5cdFx0XHRcdFx0XHRcdFx0b015RGVmZXJyZWQucmVqZWN0KG9FcnJvciwgb1N0YXJ0dXBQYXJhbWV0ZXJzLCBOYXZUeXBlLnhBcHBTdGF0ZSk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9NeURlZmVycmVkLnByb21pc2UoKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAob0FwcFN0YXRlRGF0YSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvU2VsVmFyID0gbmV3IFNlbGVjdGlvblZhcmlhbnQob0FwcFN0YXRlRGF0YS5zZWxlY3Rpb25WYXJpYW50KTtcblxuXHRcdFx0XHRcdFx0XHRjb25zdCBvU2VsVmFycyA9IG9OYXZIYW5kbGVyLl9zcGxpdEluYm91bmROYXZpZ2F0aW9uUGFyYW1ldGVycyhcblx0XHRcdFx0XHRcdFx0XHRvU2VsVmFyLFxuXHRcdFx0XHRcdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0XHRhRGVmYXVsdGVkUGFyYW1ldGVyc1xuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRvQXBwU3RhdGVEYXRhLnNlbGVjdGlvblZhcmlhbnQgPSBvU2VsVmFycy5vTmF2aWdhdGlvblNlbFZhci50b0pTT05TdHJpbmcoKTtcblx0XHRcdFx0XHRcdFx0b0FwcFN0YXRlRGF0YS5vU2VsZWN0aW9uVmFyaWFudCA9IG9TZWxWYXJzLm9OYXZpZ2F0aW9uU2VsVmFyO1xuXHRcdFx0XHRcdFx0XHRvQXBwU3RhdGVEYXRhLm9EZWZhdWx0ZWRTZWxlY3Rpb25WYXJpYW50ID0gb1NlbFZhcnMub0RlZmF1bHRlZFNlbFZhcjtcblx0XHRcdFx0XHRcdFx0b0FwcFN0YXRlRGF0YS5iTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5ID0gb1NlbFZhcnMuYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc3VjY2Vzc0hhbmRsZXJIeWJyaWRTdGF0ZSA9IGZ1bmN0aW9uIChpQXBwU3RhdGVEYXRhOiB1bmtub3duLCBfcmVmOiB1bmtub3duLCBuYXZUeXBlOiB1bmtub3duKTogdm9pZCB7XG5cdFx0XHRcdFx0XHRcdFx0b0FwcFN0YXRlRGF0YS5pQXBwU3RhdGUgPSBpQXBwU3RhdGVEYXRhO1xuXHRcdFx0XHRcdFx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUob0FwcFN0YXRlRGF0YSwgb1N0YXJ0dXBQYXJhbWV0ZXJzLCBuYXZUeXBlKTtcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgZmFpbHVyZUhhbmRsZXJIeWJyaWRTdGF0ZSA9IGZ1bmN0aW9uIChlcnJvcjogb2JqZWN0LCBfcmVmOiBvYmplY3QsIG5hdlR5cGU6IHN0cmluZyk6IHZvaWQge1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuZ2V0QXBwU3RhdGUuZmFpbGVkXCIpO1xuXHRcdFx0XHRcdFx0XHRcdG9NeURlZmVycmVkLnJlamVjdChlcnJvciwgX3JlZiwgbmF2VHlwZSk7XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdGlmIChoeWJyaWRJQXBwU3RhdGVLZXlQYXJhbXMgIT09IHVuZGVmaW5lZCAmJiBpQXBwU3RhdGVIeWJyaWREZWZlcnJlZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0aUFwcFN0YXRlSHlicmlkRGVmZXJyZWQuZG9uZShzdWNjZXNzSGFuZGxlckh5YnJpZFN0YXRlKTtcblx0XHRcdFx0XHRcdFx0XHRpQXBwU3RhdGVIeWJyaWREZWZlcnJlZC5mYWlsKGZhaWx1cmVIYW5kbGVySHlicmlkU3RhdGUpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG9BcHBTdGF0ZURhdGFbSFlCUklEX0lBUFBfU1RBVEVfS0VZXSkge1xuXHRcdFx0XHRcdFx0XHRcdHRoYXQuX2xvYWRBcHBTdGF0ZShvQXBwU3RhdGVEYXRhW0hZQlJJRF9JQVBQX1NUQVRFX0tFWV0gYXMgc3RyaW5nLCBoeWJyaWREZWZlcnJlZCwgTmF2VHlwZS5oeWJyaWQpLmRvbmUoXG5cdFx0XHRcdFx0XHRcdFx0XHRzdWNjZXNzSGFuZGxlckh5YnJpZFN0YXRlXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKG9BcHBTdGF0ZURhdGEsIG9TdGFydHVwUGFyYW1ldGVycywgTmF2VHlwZS54QXBwU3RhdGUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG9TdGFydHVwUGFyYW1ldGVycykge1xuXHRcdFx0XHRcdFx0XHRwYXJzZVVybFBhcmFtcyhvU3RhcnR1cFBhcmFtZXRlcnMsIGFEZWZhdWx0ZWRQYXJhbWV0ZXJzLCBvTXlEZWZlcnJlZCwgTmF2VHlwZS54QXBwU3RhdGUpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gc2FwLXhhcHAtc3RhdGUgbmF2aWdhdGlvbiwgYnV0IElEIGhhcyBhbHJlYWR5IGV4cGlyZWQsIGJ1dCBVUkwgcGFyYW1ldGVycyBhdmFpbGFibGVcblx0XHRcdFx0XHRcdFx0b0Vycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuZ2V0RGF0YUZyb21BcHBTdGF0ZS5mYWlsZWRcIik7XG5cdFx0XHRcdFx0XHRcdG9NeURlZmVycmVkLnJlamVjdChvRXJyb3IsIG9TdGFydHVwUGFyYW1ldGVycyB8fCB7fSwgTmF2VHlwZS54QXBwU3RhdGUpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9FcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLl9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZUFzeW5jLmZhaWxlZFwiKTtcblx0XHRcdFx0XHRcdG9NeURlZmVycmVkLnJlamVjdChvRXJyb3IsIHt9LCBOYXZUeXBlLnhBcHBTdGF0ZSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2UgaWYgKG9TdGFydHVwUGFyYW1ldGVycykge1xuXHRcdFx0XHQvLyBubyBzYXAteGFwcC1zdGF0ZVxuXHRcdFx0XHRwYXJzZVVybFBhcmFtcyhcblx0XHRcdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0YURlZmF1bHRlZFBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0b015RGVmZXJyZWQsXG5cdFx0XHRcdFx0aHlicmlkSUFwcFN0YXRlS2V5UGFyYW1zICE9PSB1bmRlZmluZWQgPyBOYXZUeXBlLmh5YnJpZCA6IE5hdlR5cGUuVVJMUGFyYW1zXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBpbml0aWFsIG5hdmlnYXRpb25cblx0XHRcdFx0b015RGVmZXJyZWQucmVzb2x2ZSh7fSwge30sIE5hdlR5cGUuaW5pdGlhbCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9NeURlZmVycmVkLnByb21pc2UoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBhcHBsaWNhdGlvbiBzcGVjaWZpYyB0ZWNobmljYWwgcGFyYW1ldGVycy4gVGVjaG5pY2FsIHBhcmFtZXRlcnMgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIHNlbGVjdGlvbiB2YXJpYW50IHBhc3NlZCB0byB0aGVcblx0ICogYXBwbGljYXRpb24uIEFzIGEgZGVmYXVsdCB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgY29uc2lkZXJlZCBhcyB0ZWNobmljYWwgcGFyYW1ldGVyczpcblx0ICogPHVsPlxuXHQgKiA8bGk+PGNvZGU+c2FwLXN5c3RlbTwvY29kZT48L2xpPlxuXHQgKiA8bGk+PGNvZGU+c2FwLXVzaGVsbC1kZWZhdWx0ZWRQYXJhbWV0ZXJOYW1lczwvY29kZT48L2xpPlxuXHQgKiA8bGk+PGNvZGU+XCJoY3BBcHBsaWNhdGlvbklkXCI8L2NvZGU+PC9saT5cblx0ICogPC91bD4uXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIGFUZWNobmljYWxQYXJhbWV0ZXJzIExpc3Qgb2YgcGFyYW1ldGVyIG5hbWVzIHRvIGJlIGNvbnNpZGVyZWQgYXMgdGVjaG5pY2FsIHBhcmFtZXRlcnMuIDxjb2RlPm51bGw8L2NvZGU+IG9yXG5cdCAqICAgICAgICA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IG1heSBiZSB1c2VkIHRvIHJlc2V0IHRoZSBjb21wbGV0ZSBsaXN0LlxuXHQgKi9cblx0c2V0VGVjaG5pY2FsUGFyYW1ldGVycyhhVGVjaG5pY2FsUGFyYW1ldGVycz86IGFueVtdKTogdm9pZCB7XG5cdFx0aWYgKCFhVGVjaG5pY2FsUGFyYW1ldGVycykge1xuXHRcdFx0YVRlY2huaWNhbFBhcmFtZXRlcnMgPSBbXTtcblx0XHR9XG5cblx0XHRpZiAoIUFycmF5LmlzQXJyYXkoYVRlY2huaWNhbFBhcmFtZXRlcnMpKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlcjogcGFyYW1ldGVyIGluY29ycmVjdCwgYXJyYXkgb2Ygc3RyaW5ncyBleHBlY3RlZFwiKTtcblx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0fVxuXG5cdFx0dGhpcy5fYVRlY2huaWNhbFBhcmFtYXRlcnMgPSBhVGVjaG5pY2FsUGFyYW1ldGVycztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBhcHBsaWNhdGlvbiBzcGVjaWZpYyB0ZWNobmljYWwgcGFyYW1ldGVycy4gVGVjaG5pY2FsIHBhcmFtZXRlcnMgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIHNlbGVjdGlvbiB2YXJpYW50IHBhc3NlZCB0byB0aGVcblx0ICogYXBwbGljYXRpb24uIEFzIGEgZGVmYXVsdCB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgY29uc2lkZXJlZCBhcyB0ZWNobmljYWwgcGFyYW1ldGVyczpcblx0ICogPHVsPlxuXHQgKiA8bGk+PGNvZGU+c2FwLXN5c3RlbTwvY29kZT48L2xpPlxuXHQgKiA8bGk+PGNvZGU+c2FwLXVzaGVsbC1kZWZhdWx0ZWRQYXJhbWV0ZXJOYW1lczwvY29kZT48L2xpPlxuXHQgKiA8bGk+PGNvZGU+XCJoY3BBcHBsaWNhdGlvbklkXCI8L2NvZGU+PC9saT5cblx0ICogPC91bD4uXG5cdCAqIEBwdWJsaWNcblx0ICogQHJldHVybnMgQW4gQXJyYXkgY29udGFpbmluZyB0aGUgdGVjaG5pY2FsIHBhcmFtZXRlcnMuXG5cdCAqL1xuXHRnZXRUZWNobmljYWxQYXJhbWV0ZXJzKCk6IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gdGhpcy5fYVRlY2huaWNhbFBhcmFtYXRlcnMuY29uY2F0KFtdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIHBhc3NlZCBwYXJhbWV0ZXIgaXMgY29uc2lkZXJlZCBhcyB0ZWNobmljYWwgcGFyYW1ldGVyLlxuXHQgKiBAcGFyYW0gc1BhcmFtZXRlck5hbWUgTmFtZSBvZiBhIHJlcXVlc3QgcGFyYW1ldGVyLCBjb25zaWRlcmVkIGFzIHRlY2huaWNhbCBwYXJhbWV0ZXIuXG5cdCAqIEByZXR1cm5zIEluZGljYXRlcyBpZiB0aGUgcGFyYW1ldGVyIGlzIGNvbnNpZGVyZWQgYXMgdGVjaG5pY2FsIHBhcmFtZXRlciBvciBub3QuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfaXNUZWNobmljYWxQYXJhbWV0ZXIoc1BhcmFtZXRlck5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGlmIChzUGFyYW1ldGVyTmFtZSkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQhKFxuXHRcdFx0XHRcdHNQYXJhbWV0ZXJOYW1lID09PSBcInNhcC11aS1mZS12YXJpYW50LWlkXCIgfHxcblx0XHRcdFx0XHRzUGFyYW1ldGVyTmFtZSA9PT0gXCJzYXAtdWktZmUtdGFibGUtdmFyaWFudC1pZFwiIHx8XG5cdFx0XHRcdFx0c1BhcmFtZXRlck5hbWUgPT09IFwic2FwLXVpLWZlLWNoYXJ0LXZhcmlhbnQtaWRcIiB8fFxuXHRcdFx0XHRcdHNQYXJhbWV0ZXJOYW1lID09PSBcInNhcC11aS1mZS1maWx0ZXJiYXItdmFyaWFudC1pZFwiXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRpZiAoc1BhcmFtZXRlck5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwic2FwLVwiKSA9PT0gMCkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMuX2FUZWNobmljYWxQYXJhbWF0ZXJzLmluY2x1ZGVzKHNQYXJhbWV0ZXJOYW1lKSkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdF9pc0ZFUGFyYW1ldGVyKHNQYXJhbWV0ZXJOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gc1BhcmFtZXRlck5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwic2FwLXVpLWZlXCIpID09PSAwO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJtb3ZlcyBpZiB0aGUgcGFzc2VkIHBhcmFtZXRlciBpcyBjb25zaWRlcmVkIGFzIHRlY2huaWNhbCBwYXJhbWV0ZXIuXG5cdCAqIEBwYXJhbSBvU2VsZWN0aW9uVmFyaWFudCBTZWxlY3Rpb24gVmFyaWFudCB3aGljaCBjb25zaXN0cyBvZiB0ZWNobmljYWwgUGFyYW1ldGVycy5cblx0ICogQHJldHVybnMgU2VsZWN0aW9uIFZhcmlhbnQgd2l0aG91dCB0ZWNobmljYWwgUGFyYW1ldGVycy5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9yZW1vdmVUZWNobmljYWxQYXJhbWV0ZXJzKG9TZWxlY3Rpb25WYXJpYW50OiBTZWxlY3Rpb25WYXJpYW50KTogU2VsZWN0aW9uVmFyaWFudCB7XG5cdFx0bGV0IHNQcm9wTmFtZSwgaTtcblx0XHRjb25zdCBhU2VsVmFyUHJvcE5hbWVzID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMoKTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgYVNlbFZhclByb3BOYW1lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0c1Byb3BOYW1lID0gYVNlbFZhclByb3BOYW1lc1tpXTtcblx0XHRcdGlmICh0aGlzLl9pc1RlY2huaWNhbFBhcmFtZXRlcihzUHJvcE5hbWUpKSB7XG5cdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50LnJlbW92ZVNlbGVjdE9wdGlvbihzUHJvcE5hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb1NlbGVjdGlvblZhcmlhbnQ7XG5cdH1cblxuXHQvKipcblx0ICogU3BsaXRzIHRoZSBwYXJhbWV0ZXJzIHByb3ZpZGVkIGR1cmluZyBpbmJvdW5kIG5hdmlnYXRpb24gYW5kIHNlcGFyYXRlcyB0aGUgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBiZXR3ZWVuIGRlZmF1bHRlZCBwYXJhbWV0ZXIgdmFsdWVzIGFuZFxuXHQgKiBuYXZpZ2F0aW9uIHBhcmFtZXRlcnMuXG5cdCAqIEBwYXJhbSBvU2VsZWN0aW9uVmFyaWFudCBJbnN0YW5jZSBvZiB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uU2VsZWN0aW9uVmFyaWFudH0gY29udGFpbmluZyBuYXZpZ2F0aW9uIGRhdGEgb2Zcblx0ICogICAgICAgIHRoZSBhcHBcblx0ICogQHBhcmFtIG9TdGFydHVwUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyBzdGFydHVwIHBhcmFtZXRlcnMgb2YgdGhlIGFwcCAoZGVyaXZlZCBmcm9tIHRoZSBjb21wb25lbnQpXG5cdCAqIEBwYXJhbSBhRGVmYXVsdGVkUGFyYW1ldGVycyBBcnJheSBjb250YWluaW5nIGRlZmF1bHRlZCBwYXJhbWV0ZXIgbmFtZXNcblx0ICogQHJldHVybnMgT2JqZWN0IGNvbnRhaW5pbmcgdHdvIFNlbGVjdGlvblZhcmlhbnRzLCBvbmUgZm9yIG5hdmlnYXRpb24gKG9OYXZpZ2F0aW9uU2VsVmFyKSBhbmQgb25lIGZvciBkZWZhdWx0ZWQgc3RhcnR1cCBwYXJhbWV0ZXJzXG5cdCAqICAgICAgICAgIChvRGVmYXVsdGVkU2VsVmFyKSwgYW5kIGEgZmxhZyAoYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSkgaW5kaWNhdGluZyB3aGV0aGVyIGFsbCBwYXJhbWV0ZXJzIHdlcmUgZGVmYXVsdGVkLiBUaGUgZnVuY3Rpb24gaXNcblx0ICogICAgICAgICAgaGFuZGVkIHR3byBvYmplY3RzIGNvbnRhaW5pbmcgcGFyYW1ldGVycyAobmFtZXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsdWVzKSwgb1NlbGVjdGlvblZhcmlhbnQgYW5kIG9TdGFydHVwUGFyYW1ldGVycy4gQVxuXHQgKiAgICAgICAgICBwYXJhbWV0ZXIgY291bGQgYmUgc3RvcmVkIGluIGp1c3Qgb25lIG9mIHRoZXNlIHR3byBvYmplY3RzIG9yIGluIGJvdGggb2YgdGhlbSBzaW11bHRhbmVvdXNseS4gQmVjYXVzZSBvZiB0aGUgbGF0dGVyIGNhc2UgYVxuXHQgKiAgICAgICAgICBwYXJhbWV0ZXIgY291bGQgYmUgYXNzb2NpYXRlZCB3aXRoIGNvbmZsaWN0aW5nIHZhbHVlcyBhbmQgaXQgaXMgdGhlIGpvYiBvZiB0aGlzIGZ1bmN0aW9uIHRvIHJlc29sdmUgYW55IHN1Y2ggY29uZmxpY3QuIFBhcmFtZXRlcnNcblx0ICogICAgICAgICAgYXJlIGFzc2lnbmVkIHRvIHRoZSB0d28gcmV0dXJuZWQgU2VsZWN0aW9uVmFyaWFudHMsIG9OYXZpZ2F0aW9uU2VsVmFyIGFuZCBvRGVmYXVsdGVkU2VsVmFyLCBhcyBmb2xsb3dzOiB8IHBhcmFtZXRlciBOT1QgaW4gfFxuXHQgKiAgICAgICAgICBwYXJhbWV0ZXIgaW4gfCBvU2VsZWN0aW9uVmFyaWFudCB8IG9TZWxlY3Rpb25WYXJpYW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0gcGFyYW1ldGVyIE5PVCBpbiB8XG5cdCAqICAgICAgICAgIG5vdGhpbmcgdG8gZG8gfCBBZGQgcGFyYW1ldGVyIG9TdGFydHVwUGFyYW1ldGVycyB8IGhlcmUgfCAoc2VlIGJlbG93KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCAqICAgICAgICAgIHBhcmFtZXRlciBpbiB8IEFkZCBwYXJhbWV0ZXIgfCBDb25mbGljdCByZXNvbHV0aW9uIG9TdGFydHVwUGFyYW1ldGVycyB8IChzZWUgYmVsb3cpIHwgKHNlZSBiZWxvdykgQWRkIHBhcmFtZXRlcjogaWYgcGFyYW1ldGVyIGluXG5cdCAqICAgICAgICAgIGFEZWZhdWx0ZWRQYXJhbWV0ZXJzOiBhZGQgcGFyYW1ldGVyIHRvIG9EZWZhdWx0ZWRTZWxWYXIgZWxzZTogYWRkIHBhcmFtZXRlciB0byBvTmF2aWdhdGlvblNlbFZhciBDb25mbGljdCByZXNvbHV0aW9uOiBpZiBwYXJhbWV0ZXJcblx0ICogICAgICAgICAgaW4gYURlZmF1bHRlZFBhcmFtZXRlcnM6IGFkZCBwYXJhbWV0ZXIgdmFsdWUgZnJvbSBvU2VsZWN0aW9uVmFyaWFudCB0byBvTmF2aWdhdGlvblNlbFZhciBhZGQgcGFyYW1ldGVyIHZhbHVlIGZyb21cblx0ICogICAgICAgICAgb1N0YXJ0dXBQYXJhbWV0ZXJzIHRvIG9EZWZhdWx0ZWRTZWxWYXIgTm90ZTogVGhpcyBjYXNlIG9ubHkgb2NjdXJzIGluIFVJNSAxLjMyLiBJbiBsYXRlciB2ZXJzaW9ucyBVU2hlbGwgc3RvcmVzIGFueSBkZWZhdWx0ZWRcblx0ICogICAgICAgICAgcGFyYW1ldGVyIGVpdGhlciBpbiBvU2VsZWN0aW9uVmFyaWFudCBvciBvU3RhcnR1cFBhcmFtZXRlcnMgYnV0IG5ldmVyIHNpbXVsdGFuZW91c2x5IGluIGJvdGguIGVsc2U6IENob29zZSAxIG9mIHRoZSBmb2xsb3dpbmdcblx0ICogICAgICAgICAgb3B0aW9ucyBiYXNlZCBvbiBnaXZlbiBoYW5kbGluZyBtb2RlICh0aGlzLnNQYXJhbUhhbmRsaW5nTW9kZSkuIC0+IGFkZCBwYXJhbWV0ZXIgdmFsdWUgZnJvbSBvU3RhcnR1cFBhcmFtZXRlcnMgdG9cblx0ICogICAgICAgICAgb05hdmlnYXRpb25TZWxWYXIgfCAtPiBhZGQgcGFyYW1ldGVyIHZhbHVlIGZyb20gb0FwcFN0YXRlLnNlbGVjdGlvblZhcmlhbnQgdG8gb05hdmlnYXRpb25TZWxWYXIgLT4gYWRkIGJvdGggcGFyYW1ldGVyIHZhbHVlcyB0b1xuXHQgKiAgICAgICAgICBuYXZpZ2F0aW9uU2VsVmFyIElmIG5hdmlnYXRpb25TZWxWYXIgaXMgc3RpbGwgZW1wdHkgYXQgdGhlIGVuZCBvZiBleGVjdXRpb24sIG5hdmlnYXRpb25TZWxWYXIgaXMgcmVwbGFjZWQgYnkgYSBjb3B5IG9mXG5cdCAqICAgICAgICAgIG9EZWZhdWx0ZWRTZWxWYXIgYW5kIHRoZSBmbGFnIGJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHkgaXMgc2V0IHRvIHRydWUuIFRoZSBzZWxlY3Rpb24gdmFyaWFudCBvRGVmYXVsdGVkU2VsVmFyIGl0c2VsZiBpcyBhbHdheXNcblx0ICogICAgICAgICAgcmV0dXJuZWQgYXMgaXMuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfc3BsaXRJbmJvdW5kTmF2aWdhdGlvblBhcmFtZXRlcnMoXG5cdFx0b1NlbGVjdGlvblZhcmlhbnQ6IFNlbGVjdGlvblZhcmlhbnQsXG5cdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuXHRcdGFEZWZhdWx0ZWRQYXJhbWV0ZXJzOiBhbnlbXVxuXHQpOiB7XG5cdFx0b05hdmlnYXRpb25TZWxWYXI6IFNlbGVjdGlvblZhcmlhbnQ7XG5cdFx0b0RlZmF1bHRlZFNlbFZhcjogU2VsZWN0aW9uVmFyaWFudDtcblx0XHRiTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5OiBib29sZWFuO1xuXHR9IHtcblx0XHRpZiAoIUFycmF5LmlzQXJyYXkoYURlZmF1bHRlZFBhcmFtZXRlcnMpKSB7XG5cdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUXCIpO1xuXHRcdH1cblxuXHRcdGxldCBzUHJvcE5hbWUsIGk7XG5cdFx0Ly8gRmlyc3Qgd2UgZG8gc29tZSBwYXJzaW5nIG9mIHRoZSBTdGFydFVwIFBhcmFtZXRlcnMuXG5cdFx0Y29uc3Qgb1N0YXJ0dXBQYXJhbWV0ZXJzQWRqdXN0ZWQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcblx0XHRmb3IgKHNQcm9wTmFtZSBpbiBvU3RhcnR1cFBhcmFtZXRlcnMpIHtcblx0XHRcdGlmICghb1N0YXJ0dXBQYXJhbWV0ZXJzLmhhc093blByb3BlcnR5KHNQcm9wTmFtZSkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGlmIChzUHJvcE5hbWUgPT09IFNBUF9TWVNURU1fUFJPUEVSVFkgfHwgc1Byb3BOYW1lID09PSBERUZBVUxURURfUEFSQU1FVEVSX1BST1BFUlRZKSB7XG5cdFx0XHRpZiAodGhpcy5faXNUZWNobmljYWxQYXJhbWV0ZXIoc1Byb3BOYW1lKSB8fCB0aGlzLl9pc0ZFUGFyYW1ldGVyKHNQcm9wTmFtZSkgfHwgc1Byb3BOYW1lID09PSBIWUJSSURfSUFQUF9TVEFURV9LRVkpIHtcblx0XHRcdFx0Ly8gRG8gbm90IGFkZCB0aGUgU0FQIHN5c3RlbSBwYXJhbWV0ZXIgdG8gdGhlIHNlbGVjdGlvbiB2YXJpYW50IGFzIGl0IGlzIGEgdGVjaG5pY2FsIHBhcmFtZXRlclxuXHRcdFx0XHQvLyBub3QgcmVsZXZhbnQgZm9yIHRoZSBzZWxlY3Rpb24gdmFyaWFudC5cblx0XHRcdFx0Ly8gRG8gbm90IGFkZCB0aGUgc3RhcnR1cCBwYXJhbWV0ZXIgZm9yIGRlZmF1bHQgdmFsdWVzIHRvIHRoZSBzZWxlY3Rpb24gdmFyaWFudC4gVGhlIGluZm9ybWF0aW9uLCB3aGljaCBwYXJhbWV0ZXJzXG5cdFx0XHRcdC8vIGFyZSBkZWZhdWx0ZWQsIGlzIGF2YWlsYWJsZSBpbiB0aGUgZGVmYXVsdGVkIHNlbGVjdGlvbiB2YXJpYW50LlxuXHRcdFx0XHQvLyBJbiBjYXNlLCBGRSBQYXJhbWV0ZXJzIHdlIHNoYWxsIHNraXAgaXQuKHRoZSBhcHBsaWNhdGlvbiBuZWVkcyB0byBmZXRjaCBpdCBmcm9tIFVSTCBwYXJhbXMpXG5cdFx0XHRcdC8vIFNraXAgdGhlIGh5YnJpZElBcHBTdGF0ZUtleSBwcmVzZW50IGFzIHBhcnQgb2YgJ0h5YnJpZCcgbmF2aWdhdGlvbiB0eXBlIG5vdCByZWxldmFudCBmb3IgdGhlIHNlbGVjdGlvbiB2YXJpYW50XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXZSBzdXBwb3J0IHBhcmFtZXRlcnMgYXMgYSBtYXAgd2l0aCBzdHJpbmdzIGFuZCBhcyBhIG1hcCB3aXRoIHZhbHVlIGFycmF5c1xuXHRcdFx0aWYgKHR5cGVvZiBvU3RhcnR1cFBhcmFtZXRlcnNbc1Byb3BOYW1lXSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZFtzUHJvcE5hbWVdID0gb1N0YXJ0dXBQYXJhbWV0ZXJzW3NQcm9wTmFtZV07XG5cdFx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob1N0YXJ0dXBQYXJhbWV0ZXJzW3NQcm9wTmFtZV0pICYmIG9TdGFydHVwUGFyYW1ldGVyc1tzUHJvcE5hbWVdLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZFtzUHJvcE5hbWVdID0gb1N0YXJ0dXBQYXJhbWV0ZXJzW3NQcm9wTmFtZV1bMF07IC8vIHNpbmdsZS12YWx1ZWQgcGFyYW1ldGVyc1xuXHRcdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9TdGFydHVwUGFyYW1ldGVyc1tzUHJvcE5hbWVdKSAmJiBvU3RhcnR1cFBhcmFtZXRlcnNbc1Byb3BOYW1lXS5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkW3NQcm9wTmFtZV0gPSBvU3RhcnR1cFBhcmFtZXRlcnNbc1Byb3BOYW1lXTsgLy8gbXVsdGktdmFsdWVkIHBhcmFtZXRlcnNcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ29uc3RydWN0IHR3byBzZWxlY3Rpb24gdmFyaWFudHMgZm9yIGRlZmF1bHRzIGFuZCBuYXZpZ2F0aW9uIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbi5cblx0XHRjb25zdCBvRGVmYXVsdGVkU2VsVmFyID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoKTtcblx0XHRjb25zdCBvTmF2aWdhdGlvblNlbFZhciA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KCk7XG5cblx0XHRjb25zdCBhU2VsVmFyUHJvcE5hbWVzID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0UGFyYW1ldGVyTmFtZXMoKS5jb25jYXQob1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMoKSk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGFTZWxWYXJQcm9wTmFtZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHNQcm9wTmFtZSA9IGFTZWxWYXJQcm9wTmFtZXNbaV07XG5cdFx0XHRpZiAoc1Byb3BOYW1lIGluIG9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkKSB7XG5cdFx0XHRcdC8vIFJlc29sdmUgY29uZmxpY3QuXG5cdFx0XHRcdGlmIChhRGVmYXVsdGVkUGFyYW1ldGVycy5pbmNsdWRlcyhzUHJvcE5hbWUpKSB7XG5cdFx0XHRcdFx0b05hdmlnYXRpb25TZWxWYXIubWFzc0FkZFNlbGVjdE9wdGlvbihzUHJvcE5hbWUsIG9TZWxlY3Rpb25WYXJpYW50LmdldFZhbHVlKHNQcm9wTmFtZSkhKTtcblx0XHRcdFx0XHR0aGlzLl9hZGRQYXJhbWV0ZXJWYWx1ZXMob0RlZmF1bHRlZFNlbFZhciwgc1Byb3BOYW1lLCBcIklcIiwgXCJFUVwiLCBvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZFtzUHJvcE5hbWVdKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzd2l0Y2ggKHRoaXMuc1BhcmFtSGFuZGxpbmdNb2RlKSB7XG5cdFx0XHRcdFx0XHRjYXNlIFBhcmFtSGFuZGxpbmdNb2RlLlNlbFZhcldpbnM6XG5cdFx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uU2VsVmFyLm1hc3NBZGRTZWxlY3RPcHRpb24oc1Byb3BOYW1lLCBvU2VsZWN0aW9uVmFyaWFudC5nZXRWYWx1ZShzUHJvcE5hbWUpISk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBQYXJhbUhhbmRsaW5nTW9kZS5VUkxQYXJhbVdpbnM6XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2FkZFBhcmFtZXRlclZhbHVlcyhvTmF2aWdhdGlvblNlbFZhciwgc1Byb3BOYW1lLCBcIklcIiwgXCJFUVwiLCBvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZFtzUHJvcE5hbWVdKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFBhcmFtSGFuZGxpbmdNb2RlLkluc2VydEluU2VsT3B0OlxuXHRcdFx0XHRcdFx0XHRvTmF2aWdhdGlvblNlbFZhci5tYXNzQWRkU2VsZWN0T3B0aW9uKHNQcm9wTmFtZSwgb1NlbGVjdGlvblZhcmlhbnQuZ2V0VmFsdWUoc1Byb3BOYW1lKSEpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9hZGRQYXJhbWV0ZXJWYWx1ZXMob05hdmlnYXRpb25TZWxWYXIsIHNQcm9wTmFtZSwgXCJJXCIsIFwiRVFcIiwgb1N0YXJ0dXBQYXJhbWV0ZXJzQWRqdXN0ZWRbc1Byb3BOYW1lXSk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoYURlZmF1bHRlZFBhcmFtZXRlcnMuaW5jbHVkZXMoc1Byb3BOYW1lKSkge1xuXHRcdFx0XHQvLyBwYXJhbWV0ZXIgb25seSBpbiBTZWxWYXJcblx0XHRcdFx0b0RlZmF1bHRlZFNlbFZhci5tYXNzQWRkU2VsZWN0T3B0aW9uKHNQcm9wTmFtZSwgb1NlbGVjdGlvblZhcmlhbnQuZ2V0VmFsdWUoc1Byb3BOYW1lKSEpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b05hdmlnYXRpb25TZWxWYXIubWFzc0FkZFNlbGVjdE9wdGlvbihzUHJvcE5hbWUsIG9TZWxlY3Rpb25WYXJpYW50LmdldFZhbHVlKHNQcm9wTmFtZSkhKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKHNQcm9wTmFtZSBpbiBvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZCkge1xuXHRcdFx0Ly8gVGhlIGNhc2Ugd2hlcmUgdGhlIHBhcmFtZXRlciBhcHBlYXJzIHR3aWNlIGhhcyBhbHJlYWR5IGJlZW4gdGFrZW4gY2FyZSBvZiBhYm92ZSBzbyB3ZSBza2lwIGl0IGhlcmUuXG5cdFx0XHRpZiAoYVNlbFZhclByb3BOYW1lcy5pbmNsdWRlcyhzUHJvcE5hbWUpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYURlZmF1bHRlZFBhcmFtZXRlcnMuaW5jbHVkZXMoc1Byb3BOYW1lKSkge1xuXHRcdFx0XHR0aGlzLl9hZGRQYXJhbWV0ZXJWYWx1ZXMob0RlZmF1bHRlZFNlbFZhciwgc1Byb3BOYW1lLCBcIklcIiwgXCJFUVwiLCBvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZFtzUHJvcE5hbWVdKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX2FkZFBhcmFtZXRlclZhbHVlcyhvTmF2aWdhdGlvblNlbFZhciwgc1Byb3BOYW1lLCBcIklcIiwgXCJFUVwiLCBvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZFtzUHJvcE5hbWVdKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyB0aGUgc2VsZWN0aW9uIHZhcmlhbnQgdXNlZCBmb3IgbmF2aWdhdGlvbiBzaG91bGQgYmUgZmlsbGVkIHdpdGggZGVmYXVsdHMgaW4gY2FzZSB0aGF0IG9ubHkgZGVmYXVsdHMgZXhpc3Rcblx0XHRsZXQgYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSA9IGZhbHNlO1xuXHRcdGlmIChvTmF2aWdhdGlvblNlbFZhci5pc0VtcHR5KCkpIHtcblx0XHRcdGJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHkgPSB0cnVlO1xuXHRcdFx0Y29uc3QgYVByb3BOYW1lcyA9IG9EZWZhdWx0ZWRTZWxWYXIuZ2V0U2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMoKTtcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBhUHJvcE5hbWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdG9OYXZpZ2F0aW9uU2VsVmFyLm1hc3NBZGRTZWxlY3RPcHRpb24oYVByb3BOYW1lc1tpXSwgb0RlZmF1bHRlZFNlbFZhci5nZXRWYWx1ZShhUHJvcE5hbWVzW2ldKSEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRvTmF2aWdhdGlvblNlbFZhcjogb05hdmlnYXRpb25TZWxWYXIsXG5cdFx0XHRvRGVmYXVsdGVkU2VsVmFyOiBvRGVmYXVsdGVkU2VsVmFyLFxuXHRcdFx0Yk5hdlNlbFZhckhhc0RlZmF1bHRzT25seTogYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seVxuXHRcdH07XG5cdH1cblxuXHRfYWRkUGFyYW1ldGVyVmFsdWVzKFxuXHRcdG9TZWxWYXJpYW50OiBTZWxlY3Rpb25WYXJpYW50LFxuXHRcdHNQcm9wTmFtZTogc3RyaW5nLFxuXHRcdHNTaWduOiBzdHJpbmcsXG5cdFx0c09wdGlvbjogc3RyaW5nLFxuXHRcdG9WYWx1ZXM6IHN0cmluZyB8IHN0cmluZ1tdXG5cdCk6IHZvaWQge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KG9WYWx1ZXMpKSB7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG9WYWx1ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0b1NlbFZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKHNQcm9wTmFtZSwgc1NpZ24sIHNPcHRpb24sIG9WYWx1ZXNbaV0pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRvU2VsVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oc1Byb3BOYW1lLCBzU2lnbiwgc09wdGlvbiwgb1ZhbHVlcyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgdGhlIFVSTCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc0FwcFN0YXRlS2V5LiBBcyBhbiByZWFjdGlvbiByb3V0ZSBjaGFuZ2UgZXZlbnQgd2lsbCBiZSB0cmlnZ2VyZWQuXG5cdCAqIEBwYXJhbSBzQXBwU3RhdGVLZXkgVGhlIG5ldyBhcHAgc3RhdGUga2V5LlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRyZXBsYWNlSGFzaChzQXBwU3RhdGVLZXk6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IG9IYXNoQ2hhbmdlciA9IHRoaXMub1JvdXRlci5vSGFzaENoYW5nZXIgPyB0aGlzLm9Sb3V0ZXIub0hhc2hDaGFuZ2VyIDogSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRjb25zdCBzQXBwSGFzaE9sZCA9IG9IYXNoQ2hhbmdlci5nZXRIYXNoKCk7XG5cdFx0Lypcblx0XHQgKiB1c2UgLmdldEhhc2goKSBoZXJlIGluc3RlYWQgb2YgLmdldEFwcEhhc2goKSB0byBhbHNvIGJlIGFibGUgZGVhbGluZyB3aXRoIGVudmlyb25tZW50cyB3aGVyZSBvbmx5IFNBUFVJNSBpcyBsb2FkZWQgYW5kIHRoZSBVU2hlbGwgaXNcblx0XHQgKiBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkuXG5cdFx0ICovXG5cdFx0Y29uc3Qgc0FwcEhhc2hOZXcgPSB0aGlzLl9yZXBsYWNlSW5uZXJBcHBTdGF0ZUtleShzQXBwSGFzaE9sZCwgc0FwcFN0YXRlS2V5KTtcblx0XHRvSGFzaENoYW5nZXIucmVwbGFjZUhhc2goc0FwcEhhc2hOZXcpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgdGhlIFVSTCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgYXBwIHN0YXRlIGFuZCBzdG9yZXMgdGhlIGFwcCBzdGF0ZSBmb3IgbGF0ZXIgcmV0cmlldmFsLlxuXHQgKiBAcGFyYW0gbUlubmVyQXBwRGF0YSBPYmplY3QgY29udGFpbmluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwXG5cdCAqIEBwYXJhbSBiSW1tZWRpYXRlSGFzaFJlcGxhY2UgSWYgc2V0IHRvIGZhbHNlLCB0aGUgaW5uZXIgYXBwIGhhc2ggd2lsbCBub3QgYmUgcmVwbGFjZWQgdW50aWwgc3RvcmluZyBpcyBzdWNjZXNzZnVsOyBkbyBub3Rcblx0ICogICAgICAgIHNldCB0byBmYWxzZSBpZiB5b3UgY2Fubm90IHJlYWN0IHRvIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBQcm9taXNlLCBmb3IgZXhhbXBsZSwgd2hlbiBjYWxsaW5nIHRoZSBiZWZvcmVMaW5rUHJlc3NlZCBldmVudFxuXHQgKiBAcGFyYW0gYlNraXBIYXNoUmVwbGFjZSBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGlubmVyIGFwcCBoYXNoIHdpbGwgbm90IGJlIHJlcGxhY2VkIGluIHRoZSBzdG9yZUlubmVyQXBwU3RhdGVBc3luYy4gQWxzbyB0aGUgYkltbWVkaWF0ZUhhc2hSZXBsYWNlXG5cdCAqIFx0XHQgIHdpbGwgYmUgaWdub3JlZC5cblx0ICogQHJldHVybnMgQSBQcm9taXNlIG9iamVjdCB0byBtb25pdG9yIHdoZW4gYWxsIHRoZSBhY3Rpb25zIG9mIHRoZSBmdW5jdGlvbiBoYXZlIGJlZW4gZXhlY3V0ZWQ7IGlmIHRoZSBleGVjdXRpb24gaXMgc3VjY2Vzc2Z1bCwgdGhlXG5cdCAqICAgICAgICAgIGFwcCBzdGF0ZSBrZXkgaXMgcmV0dXJuZWQ7IGlmIGFuIGVycm9yIG9jY3VycywgYW4gb2JqZWN0IG9mIHR5cGUge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdkVycm9yfSBpc1xuXHQgKiAgICAgICAgICByZXR1cm5lZFxuXHQgKiBAcHVibGljXG5cdCAqIEBleGFtcGxlIDxjb2RlPlxuXHQgKiBzYXAudWkuZGVmaW5lKFtcInNhcC9mZS9uYXZpZ2F0aW9uL05hdmlnYXRpb25IYW5kbGVyXCJdLCBmdW5jdGlvbiAoTmF2aWdhdGlvbkhhbmRsZXIpIHtcblx0ICogXHR2YXIgb05hdmlnYXRpb25IYW5kbGVyID0gbmV3IE5hdmlnYXRpb25IYW5kbGVyKG9Db250cm9sbGVyKTtcblx0ICogXHR2YXIgbUlubmVyQXBwRGF0YSA9IHtcblx0ICogXHRcdHNlbGVjdGlvblZhcmlhbnQgOiBvU21hcnRGaWx0ZXJCYXIuZ2V0RGF0YVN1aXRlRm9ybWF0KCksXG5cdCAqIFx0XHR0YWJsZVZhcmlhbnRJZCA6IG9TbWFydFRhYmxlLmdldEN1cnJlbnRWYXJpYW50SWQoKSxcblx0ICogXHRcdGN1c3RvbURhdGEgOiBvTXlDdXN0b21EYXRhXG5cdCAqIFx0fTtcblx0ICpcblx0ICogXHR2YXIgb1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UgPSBvTmF2aWdhdGlvbkhhbmRsZXIuc3RvcmVJbm5lckFwcFN0YXRlQXN5bmMobUlubmVyQXBwRGF0YSk7XG5cdCAqXG5cdCAqIFx0b1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UuZG9uZShmdW5jdGlvbihzQXBwU3RhdGVLZXkpe1xuXHQgKiBcdFx0Ly95b3VyIGlubmVyIGFwcCBzdGF0ZSBpcyBzYXZlZCBub3csIHNBcHBTdGF0ZUtleSB3YXMgYWRkZWQgdG8gVVJMXG5cdCAqIFx0XHQvL3BlcmZvcm0gYWN0aW9ucyB0aGF0IG11c3QgcnVuIGFmdGVyIHNhdmVcblx0ICogXHR9KTtcblx0ICpcblx0ICogXHRvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZS5mYWlsKGZ1bmN0aW9uKG9FcnJvcil7XG5cdCAqIFx0XHQvL3NvbWUgZXJyb3IgaGFuZGxpbmdcblx0ICogXHR9KTtcblx0ICogfSk7XG5cdCAqIDwvY29kZT5cblx0ICovXG5cdHN0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jKFxuXHRcdG1Jbm5lckFwcERhdGE6IElubmVyQXBwRGF0YSxcblx0XHRiSW1tZWRpYXRlSGFzaFJlcGxhY2U/OiBib29sZWFuLFxuXHRcdGJTa2lwSGFzaFJlcGxhY2U/OiBib29sZWFuXG5cdCk6IGpRdWVyeS5Qcm9taXNlPHN0cmluZz4ge1xuXHRcdGlmICh0eXBlb2YgYkltbWVkaWF0ZUhhc2hSZXBsYWNlICE9PSBcImJvb2xlYW5cIikge1xuXHRcdFx0YkltbWVkaWF0ZUhhc2hSZXBsYWNlID0gdHJ1ZTsgLy8gZGVmYXVsdFxuXHRcdH1cblx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXM7XG5cdFx0Y29uc3Qgb015RGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKTtcblxuXHRcdGNvbnN0IGZuUmVwbGFjZUhhc2ggPSBmdW5jdGlvbiAoc0FwcFN0YXRlS2V5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRcdGNvbnN0IG9IYXNoQ2hhbmdlciA9IG9OYXZIYW5kbGVyLm9Sb3V0ZXIub0hhc2hDaGFuZ2VyID8gb05hdkhhbmRsZXIub1JvdXRlci5vSGFzaENoYW5nZXIgOiBIYXNoQ2hhbmdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdFx0Y29uc3Qgc0FwcEhhc2hPbGQgPSBvSGFzaENoYW5nZXIuZ2V0SGFzaCgpO1xuXHRcdFx0Lypcblx0XHRcdCAqIHVzZSAuZ2V0SGFzaCgpIGhlcmUgaW5zdGVhZCBvZiAuZ2V0QXBwSGFzaCgpIHRvIGFsc28gYmUgYWJsZSBkZWFsaW5nIHdpdGggZW52aXJvbm1lbnRzIHdoZXJlIG9ubHkgU0FQVUk1IGlzIGxvYWRlZCBhbmQgdGhlIFVTaGVsbFxuXHRcdFx0ICogaXMgbm90IGluaXRpYWxpemVkIHByb3Blcmx5LlxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBzQXBwSGFzaE5ldyA9IG9OYXZIYW5kbGVyLl9yZXBsYWNlSW5uZXJBcHBTdGF0ZUtleShzQXBwSGFzaE9sZCwgc0FwcFN0YXRlS2V5KTtcblx0XHRcdG9IYXNoQ2hhbmdlci5yZXBsYWNlSGFzaChzQXBwSGFzaE5ldyk7XG5cdFx0fTtcblxuXHRcdC8vIGluIGNhc2UgbUlubmVyQXBwU3RhdGUgaXMgZW1wdHksIGRvIG5vdCBvdmVyd3JpdGUgdGhlIGxhc3Qgc2F2ZWQgc3RhdGVcblx0XHRpZiAoaXNFbXB0eU9iamVjdChtSW5uZXJBcHBEYXRhIGFzIG9iamVjdCkpIHtcblx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUoXCJcIik7XG5cdFx0XHRyZXR1cm4gb015RGVmZXJyZWQucHJvbWlzZSgpO1xuXHRcdH1cblxuXHRcdC8vIGNoZWNrIGlmIHdlIGFscmVhZHkgc2F2ZWQgdGhlIHNhbWUgZGF0YVxuXHRcdGNvbnN0IHNBcHBTdGF0ZUtleUNhY2hlZCA9IHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEuc0FwcFN0YXRlS2V5O1xuXG5cdFx0Y29uc3QgYklubmVyQXBwRGF0YUVxdWFsID0gSlNPTi5zdHJpbmdpZnkobUlubmVyQXBwRGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEub0FwcERhdGEpO1xuXHRcdGlmIChiSW5uZXJBcHBEYXRhRXF1YWwgJiYgc0FwcFN0YXRlS2V5Q2FjaGVkKSB7XG5cdFx0XHQvLyBwYXNzZWQgaW5uZXIgYXBwIHN0YXRlIGZvdW5kIGluIGNhY2hlXG5cdFx0XHR0aGlzLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLmlDYWNoZUhpdCsrO1xuXG5cdFx0XHQvLyByZXBsYWNlIGlubmVyIGFwcCBoYXNoIHdpdGggY2FjaGVkIGFwcFN0YXRlS2V5IGluIHVybCAoanVzdCBpbiBjYXNlIHRoZSBhcHAgaGFzIGNoYW5nZWQgdGhlIGhhc2ggaW4gbWVhbnRpbWUpXG5cdFx0XHQvLyBiU2tpcEhhc2hSZXBsYWNlIG11c3QgYmUgY2hlY2tlZCBoZXJlIHRvbywgc2FtZSBhcyBpbiB0aGUgY2FjaGUtbWlzcyBwYXRocyBiZWxvd1xuXHRcdFx0aWYgKCFiU2tpcEhhc2hSZXBsYWNlKSB7XG5cdFx0XHRcdGZuUmVwbGFjZUhhc2goc0FwcFN0YXRlS2V5Q2FjaGVkKTtcblx0XHRcdH1cblx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUoc0FwcFN0YXRlS2V5Q2FjaGVkKTtcblx0XHRcdHJldHVybiBvTXlEZWZlcnJlZC5wcm9taXNlKCk7XG5cdFx0fVxuXG5cdFx0Ly8gcGFzc2VkIGlubmVyIGFwcCBzdGF0ZSBub3QgZm91bmQgaW4gY2FjaGVcblx0XHR0aGlzLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLmlDYWNoZU1pc3MrKztcblxuXHRcdGNvbnN0IGZuT25BZnRlclNhdmUgPSBmdW5jdGlvbiAoc0FwcFN0YXRlS2V5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRcdC8vIHJlcGxhY2UgaW5uZXIgYXBwIGhhc2ggd2l0aCBuZXcgYXBwU3RhdGVLZXkgaW4gdXJsXG5cdFx0XHRpZiAoIWJTa2lwSGFzaFJlcGxhY2UgJiYgIWJJbW1lZGlhdGVIYXNoUmVwbGFjZSkge1xuXHRcdFx0XHRmblJlcGxhY2VIYXNoKHNBcHBTdGF0ZUtleSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIHJlbWVtYmVyIGxhc3Qgc2F2ZWQgc3RhdGVcblx0XHRcdG9OYXZIYW5kbGVyLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLm9BcHBEYXRhID0gbUlubmVyQXBwRGF0YTtcblx0XHRcdG9OYXZIYW5kbGVyLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLnNBcHBTdGF0ZUtleSA9IHNBcHBTdGF0ZUtleTtcblx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUoc0FwcFN0YXRlS2V5KTtcblx0XHR9O1xuXG5cdFx0Y29uc3QgZm5PbkVycm9yID0gZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bik6IHZvaWQge1xuXHRcdFx0b015RGVmZXJyZWQucmVqZWN0KG9FcnJvcik7XG5cdFx0fTtcblxuXHRcdHRoaXMuX3NhdmVBcHBTdGF0ZUFzeW5jKG1Jbm5lckFwcERhdGEsIGZuT25BZnRlclNhdmUsIGZuT25FcnJvcilcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChzQXBwU3RhdGVLZXk6IGFueSkge1xuXHRcdFx0XHQvKiBOb3RlIHRoYXQgX3NhcEFwcFN0YXRlIG1heSByZXR1cm4gJ3VuZGVmaW5lZCcgaW4gY2FzZSB0aGF0IHRoZSBwYXJzaW5nIGhhcyBmYWlsZWQuIEluIHRoaXMgY2FzZSwgd2Ugc2hvdWxkIG5vdCB0cmlnZ2VyIHRoZSByZXBsYWNlbWVudFxuXHRcdFx0XHQgKiBvZiB0aGUgQXBwIEhhc2ggd2l0aCB0aGUgZ2VuZXJhdGVkIGtleSwgYXMgdGhlIGNvbnRhaW5lciB3YXMgbm90IHdyaXR0ZW4gYmVmb3JlLiBOb3RlIGFzIHdlbGwgdGhhdCB0aGUgZXJyb3IgaGFuZGxpbmcgaGFzIGFscmVhZHlcblx0XHRcdFx0ICogaGFwcGVuZWQgYmVmb3JlIGJ5IG1ha2luZyB0aGUgb015RGVmZXJyZWQgcHJvbWlzZSBmYWlsIChzZWUgZm5PbkVycm9yIGFib3ZlKS5cblx0XHRcdFx0ICovXG5cdFx0XHRcdGlmIChzQXBwU3RhdGVLZXkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdC8vIHJlcGxhY2UgaW5uZXIgYXBwIGhhc2ggd2l0aCBuZXcgYXBwU3RhdGVLZXkgaW4gdXJsXG5cdFx0XHRcdFx0Ly8gbm90ZTogd2UgZG8gbm90IHdhaXQgZm9yIHRoZSBzYXZlIHRvIGJlIGNvbXBsZXRlZDogdGhpcyBhc3luY2hyb25vdXNseSBiZWhhdmlvdXIgaXMgbmVjZXNzYXJ5IGlmXG5cdFx0XHRcdFx0Ly8gdGhpcyBtZXRob2QgaXMgY2FsbGVkIGUuZy4gaW4gYSBvbkxpbmtQcmVzc2VkIGV2ZW50IHdpdGggbm8gcG9zc2liaWxpdHkgdG8gd2FpdCBmb3IgdGhlIHByb21pc2UgcmVzb2x1dGlvblxuXHRcdFx0XHRcdGlmICghYlNraXBIYXNoUmVwbGFjZSAmJiBiSW1tZWRpYXRlSGFzaFJlcGxhY2UpIHtcblx0XHRcdFx0XHRcdGZuUmVwbGFjZUhhc2goc0FwcFN0YXRlS2V5KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLl9zYXZlQXBwU3RhdGVBc3luYyBmYWlsZWRcIik7XG5cdFx0XHR9KTtcblxuXHRcdHJldHVybiBvTXlEZWZlcnJlZC5wcm9taXNlKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhbmdlcyB0aGUgVVJMIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBhcHAgc3RhdGUgYW5kIHN0b3JlcyB0aGUgYXBwIHN0YXRlIGZvciBsYXRlciByZXRyaWV2YWwuXG5cdCAqIEBwYXJhbSBtSW5uZXJBcHBEYXRhIE9iamVjdCBjb250YWluaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBhcHBcblx0ICogQHBhcmFtIGJJbW1lZGlhdGVIYXNoUmVwbGFjZSBJZiBzZXQgdG8gZmFsc2UsIHRoZSBpbm5lciBhcHAgaGFzaCB3aWxsIG5vdCBiZSByZXBsYWNlZCB1bnRpbCBzdG9yaW5nIGlzIHN1Y2Nlc3NmdWw7IGRvIG5vdFxuXHQgKiAgICAgICAgc2V0IHRvIGZhbHNlIGlmIHlvdSBjYW5ub3QgcmVhY3QgdG8gdGhlIHJlc29sdXRpb24gb2YgdGhlIFByb21pc2UsIGZvciBleGFtcGxlLCB3aGVuIGNhbGxpbmcgdGhlIGJlZm9yZUxpbmtQcmVzc2VkIGV2ZW50XG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSBvYmplY3QgdG8gbW9uaXRvciB3aGVuIGFsbCB0aGUgYWN0aW9ucyBvZiB0aGUgZnVuY3Rpb24gaGF2ZSBiZWVuIGV4ZWN1dGVkOyBpZiB0aGUgZXhlY3V0aW9uIGlzIHN1Y2Nlc3NmdWwsIHRoZVxuXHQgKiAgICAgICAgICBhcHAgc3RhdGUga2V5IGlzIHJldHVybmVkOyBpZiBhbiBlcnJvciBvY2N1cnMsIGFuIG9iamVjdCBvZiB0eXBlIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZFcnJvcn0gaXNcblx0ICogICAgICAgICAgcmV0dXJuZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAZXhhbXBsZSA8Y29kZT5cblx0ICogc2FwLnVpLmRlZmluZShbXCJzYXAvZmUvbmF2aWdhdGlvbi9OYXZpZ2F0aW9uSGFuZGxlclwiXSwgZnVuY3Rpb24gKE5hdmlnYXRpb25IYW5kbGVyKSB7XG5cdCAqIFx0dmFyIG9OYXZpZ2F0aW9uSGFuZGxlciA9IG5ldyBOYXZpZ2F0aW9uSGFuZGxlcihvQ29udHJvbGxlcik7XG5cdCAqIFx0dmFyIG1Jbm5lckFwcERhdGEgPSB7XG5cdCAqIFx0XHRzZWxlY3Rpb25WYXJpYW50IDogb1NtYXJ0RmlsdGVyQmFyLmdldERhdGFTdWl0ZUZvcm1hdCgpLFxuXHQgKiBcdFx0dGFibGVWYXJpYW50SWQgOiBvU21hcnRUYWJsZS5nZXRDdXJyZW50VmFyaWFudElkKCksXG5cdCAqIFx0XHRjdXN0b21EYXRhIDogb015Q3VzdG9tRGF0YVxuXHQgKiBcdH07XG5cdCAqXG5cdCAqIFx0dmFyIG9TdG9yZUlubmVyQXBwU3RhdGVQcm9taXNlID0gb05hdmlnYXRpb25IYW5kbGVyLnN0b3JlSW5uZXJBcHBTdGF0ZShtSW5uZXJBcHBEYXRhKTtcblx0ICpcblx0ICogXHRvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZS5kb25lKGZ1bmN0aW9uKHNBcHBTdGF0ZUtleSl7XG5cdCAqIFx0XHQvL3lvdXIgaW5uZXIgYXBwIHN0YXRlIGlzIHNhdmVkIG5vdywgc0FwcFN0YXRlS2V5IHdhcyBhZGRlZCB0byBVUkxcblx0ICogXHRcdC8vcGVyZm9ybSBhY3Rpb25zIHRoYXQgbXVzdCBydW4gYWZ0ZXIgc2F2ZVxuXHQgKiBcdH0pO1xuXHQgKlxuXHQgKiBcdG9TdG9yZUlubmVyQXBwU3RhdGVQcm9taXNlLmZhaWwoZnVuY3Rpb24ob0Vycm9yKXtcblx0ICogXHRcdC8vc29tZSBlcnJvciBoYW5kbGluZ1xuXHQgKiBcdH0pO1xuXHQgKiB9KTtcblx0ICogPC9jb2RlPlxuXHQgKiBAZGVwcmVjYXRlZHNpbmNlIDEuMTA0XG5cdCAqIEBkZXByZWNhdGVkIFVzZSB0aGUge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyLnN0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jfSBpbnN0ZWFkLlxuXHQgKi9cblx0c3RvcmVJbm5lckFwcFN0YXRlKG1Jbm5lckFwcERhdGE6IElubmVyQXBwRGF0YSwgYkltbWVkaWF0ZUhhc2hSZXBsYWNlPzogYm9vbGVhbik6IGpRdWVyeS5Qcm9taXNlPHN0cmluZz4ge1xuXHRcdExvZy5lcnJvcihcblx0XHRcdFwiRGVwcmVjYXRlZCBBUEkgY2FsbCBvZiAnc2FwLmZlLm5hdmlnYXRpb24uTmF2aWdhdGlvbkhhbmRsZXIuc3RvcmVJbm5lckFwcFN0YXRlJy4gUGxlYXNlIHVzZSAnc3RvcmVJbm5lckFwcFN0YXRlQXN5bmMnIGluc3RlYWRcIixcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFwic2FwLmZlLm5hdmlnYXRpb24uTmF2aWdhdGlvbkhhbmRsZXJcIlxuXHRcdCk7XG5cdFx0aWYgKHR5cGVvZiBiSW1tZWRpYXRlSGFzaFJlcGxhY2UgIT09IFwiYm9vbGVhblwiKSB7XG5cdFx0XHRiSW1tZWRpYXRlSGFzaFJlcGxhY2UgPSB0cnVlOyAvLyBkZWZhdWx0XG5cdFx0fVxuXHRcdGNvbnN0IG9OYXZIYW5kbGVyID0gdGhpcztcblx0XHRjb25zdCBvTXlEZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpO1xuXG5cdFx0Y29uc3QgZm5SZXBsYWNlSGFzaCA9IGZ1bmN0aW9uIChzQXBwU3RhdGVLZXk6IHN0cmluZyk6IHZvaWQge1xuXHRcdFx0Y29uc3Qgb0hhc2hDaGFuZ2VyID0gb05hdkhhbmRsZXIub1JvdXRlci5vSGFzaENoYW5nZXIgPyBvTmF2SGFuZGxlci5vUm91dGVyLm9IYXNoQ2hhbmdlciA6IEhhc2hDaGFuZ2VyLmdldEluc3RhbmNlKCk7XG5cdFx0XHRjb25zdCBzQXBwSGFzaE9sZCA9IG9IYXNoQ2hhbmdlci5nZXRIYXNoKCk7XG5cdFx0XHQvKlxuXHRcdFx0ICogdXNlIC5nZXRIYXNoKCkgaGVyZSBpbnN0ZWFkIG9mIC5nZXRBcHBIYXNoKCkgdG8gYWxzbyBiZSBhYmxlIGRlYWxpbmcgd2l0aCBlbnZpcm9ubWVudHMgd2hlcmUgb25seSBTQVBVSTUgaXMgbG9hZGVkIGFuZCB0aGUgVVNoZWxsXG5cdFx0XHQgKiBpcyBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkuXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IHNBcHBIYXNoTmV3ID0gb05hdkhhbmRsZXIuX3JlcGxhY2VJbm5lckFwcFN0YXRlS2V5KHNBcHBIYXNoT2xkLCBzQXBwU3RhdGVLZXkpO1xuXHRcdFx0b0hhc2hDaGFuZ2VyLnJlcGxhY2VIYXNoKHNBcHBIYXNoTmV3KTtcblx0XHR9O1xuXG5cdFx0Ly8gaW4gY2FzZSBtSW5uZXJBcHBTdGF0ZSBpcyBlbXB0eSwgZG8gbm90IG92ZXJ3cml0ZSB0aGUgbGFzdCBzYXZlZCBzdGF0ZVxuXHRcdGlmIChpc0VtcHR5T2JqZWN0KG1Jbm5lckFwcERhdGEgYXMgb2JqZWN0KSkge1xuXHRcdFx0b015RGVmZXJyZWQucmVzb2x2ZShcIlwiKTtcblx0XHRcdHJldHVybiBvTXlEZWZlcnJlZC5wcm9taXNlKCk7XG5cdFx0fVxuXG5cdFx0Ly8gY2hlY2sgaWYgd2UgYWxyZWFkeSBzYXZlZCB0aGUgc2FtZSBkYXRhXG5cdFx0Y29uc3Qgc0FwcFN0YXRlS2V5Q2FjaGVkID0gdGhpcy5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5zQXBwU3RhdGVLZXk7XG5cblx0XHRjb25zdCBiSW5uZXJBcHBEYXRhRXF1YWwgPSBKU09OLnN0cmluZ2lmeShtSW5uZXJBcHBEYXRhKSA9PT0gSlNPTi5zdHJpbmdpZnkodGhpcy5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5vQXBwRGF0YSk7XG5cdFx0aWYgKGJJbm5lckFwcERhdGFFcXVhbCAmJiBzQXBwU3RhdGVLZXlDYWNoZWQpIHtcblx0XHRcdC8vIHBhc3NlZCBpbm5lciBhcHAgc3RhdGUgZm91bmQgaW4gY2FjaGVcblx0XHRcdHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEuaUNhY2hlSGl0Kys7XG5cblx0XHRcdC8vIHJlcGxhY2UgaW5uZXIgYXBwIGhhc2ggd2l0aCBjYWNoZWQgYXBwU3RhdGVLZXkgaW4gdXJsIChqdXN0IGluIGNhc2UgdGhlIGFwcCBoYXMgY2hhbmdlZCB0aGUgaGFzaCBpbiBtZWFudGltZSlcblx0XHRcdGZuUmVwbGFjZUhhc2goc0FwcFN0YXRlS2V5Q2FjaGVkKTtcblx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUoc0FwcFN0YXRlS2V5Q2FjaGVkKTtcblx0XHRcdHJldHVybiBvTXlEZWZlcnJlZC5wcm9taXNlKCk7XG5cdFx0fVxuXG5cdFx0Ly8gcGFzc2VkIGlubmVyIGFwcCBzdGF0ZSBub3QgZm91bmQgaW4gY2FjaGVcblx0XHR0aGlzLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLmlDYWNoZU1pc3MrKztcblxuXHRcdGNvbnN0IGZuT25BZnRlclNhdmUgPSBmdW5jdGlvbiAoc0FwcFN0YXRlS2V5OiBhbnkpOiB2b2lkIHtcblx0XHRcdC8vIHJlcGxhY2UgaW5uZXIgYXBwIGhhc2ggd2l0aCBuZXcgYXBwU3RhdGVLZXkgaW4gdXJsXG5cdFx0XHRpZiAoIWJJbW1lZGlhdGVIYXNoUmVwbGFjZSkge1xuXHRcdFx0XHRmblJlcGxhY2VIYXNoKHNBcHBTdGF0ZUtleSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIHJlbWVtYmVyIGxhc3Qgc2F2ZWQgc3RhdGVcblx0XHRcdG9OYXZIYW5kbGVyLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLm9BcHBEYXRhID0gbUlubmVyQXBwRGF0YTtcblx0XHRcdG9OYXZIYW5kbGVyLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLnNBcHBTdGF0ZUtleSA9IHNBcHBTdGF0ZUtleTtcblx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUoc0FwcFN0YXRlS2V5KTtcblx0XHR9O1xuXG5cdFx0Y29uc3QgZm5PbkVycm9yID0gZnVuY3Rpb24gKG9FcnJvcjogYW55KTogdm9pZCB7XG5cdFx0XHRvTXlEZWZlcnJlZC5yZWplY3Qob0Vycm9yKTtcblx0XHR9O1xuXG5cdFx0Y29uc3Qgc0FwcFN0YXRlS2V5ID0gdGhpcy5fc2F2ZUFwcFN0YXRlKG1Jbm5lckFwcERhdGEsIGZuT25BZnRlclNhdmUsIGZuT25FcnJvcik7XG5cdFx0Lypcblx0XHQgKiBOb3RlIHRoYXQgX3NhcEFwcFN0YXRlIG1heSByZXR1cm4gJ3VuZGVmaW5lZCcgaW4gY2FzZSB0aGF0IHRoZSBwYXJzaW5nIGhhcyBmYWlsZWQuIEluIHRoaXMgY2FzZSwgd2Ugc2hvdWxkIG5vdCB0cmlnZ2VyIHRoZSByZXBsYWNlbWVudFxuXHRcdCAqIG9mIHRoZSBBcHAgSGFzaCB3aXRoIHRoZSBnZW5lcmF0ZWQga2V5LCBhcyB0aGUgY29udGFpbmVyIHdhcyBub3Qgd3JpdHRlbiBiZWZvcmUuIE5vdGUgYXMgd2VsbCB0aGF0IHRoZSBlcnJvciBoYW5kbGluZyBoYXMgYWxyZWFkeVxuXHRcdCAqIGhhcHBlbmVkIGJlZm9yZSBieSBtYWtpbmcgdGhlIG9NeURlZmVycmVkIHByb21pc2UgZmFpbCAoc2VlIGZuT25FcnJvciBhYm92ZSkuXG5cdFx0ICovXG5cdFx0aWYgKHNBcHBTdGF0ZUtleSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyByZXBsYWNlIGlubmVyIGFwcCBoYXNoIHdpdGggbmV3IGFwcFN0YXRlS2V5IGluIHVybFxuXHRcdFx0Ly8gbm90ZTogd2UgZG8gbm90IHdhaXQgZm9yIHRoZSBzYXZlIHRvIGJlIGNvbXBsZXRlZDogdGhpcyBhc3luY2hyb25vdXNseSBiZWhhdmlvdXIgaXMgbmVjZXNzYXJ5IGlmXG5cdFx0XHQvLyB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgZS5nLiBpbiBhIG9uTGlua1ByZXNzZWQgZXZlbnQgd2l0aCBubyBwb3NzaWJpbGl0eSB0byB3YWl0IGZvciB0aGUgcHJvbWlzZSByZXNvbHV0aW9uXG5cdFx0XHRpZiAoYkltbWVkaWF0ZUhhc2hSZXBsYWNlKSB7XG5cdFx0XHRcdGZuUmVwbGFjZUhhc2goc0FwcFN0YXRlS2V5KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb015RGVmZXJyZWQucHJvbWlzZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgdGhlIFVSTCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgYXBwIHN0YXRlIGFuZCBzdG9yZXMgdGhlIGFwcCBzdGF0ZSBmb3IgbGF0ZXIgcmV0cmlldmFsLlxuXHQgKiBAcGFyYW0gbUlubmVyQXBwRGF0YSBPYmplY3QgY29udGFpbmluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwXG5cdCAqIEBwYXJhbSBiSW1tZWRpYXRlSGFzaFJlcGxhY2UgSWYgc2V0IHRvIGZhbHNlLCB0aGUgaW5uZXIgYXBwIGhhc2ggd2lsbCBub3QgYmUgcmVwbGFjZWQgdW50aWwgc3RvcmluZyBpcyBzdWNjZXNzZnVsOyBkbyBub3Rcblx0ICogICAgICAgIHNldCB0byBmYWxzZSBpZiB5b3UgY2Fubm90IHJlYWN0IHRvIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBQcm9taXNlLCBmb3IgZXhhbXBsZSwgd2hlbiBjYWxsaW5nIHRoZSBiZWZvcmVMaW5rUHJlc3NlZCBldmVudC4gPGI+Tm90ZTo8L2I+SWZcblx0ICogICAgICAgIG5vdCBwcm92aWRlZCBpdCB3aWxsIGJlIHRyZWF0ZWQgYXMgc2V0IHRvIGZhbHNlLiA8Yj5Ob3RlOjwvYj5JZiBzZXQgdG8gdHJ1ZSwgdGhlIGNhbGxpbmcgaW5zdGFuY2UgaGFzIHRvIGVuc3VyZSB0aGF0IGEgZm9sbG93LW9uXG5cdCAqICAgICAgICBjYWxsIHRvIDxjb2RlPnJlcGxhY2VIYXNoPC9jb2RlPiB3aWxsIHRha2UgcGxhY2UhXG5cdCAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBhcHBTdGF0ZUlkIGFuZCBhIHByb21pc2Ugb2JqZWN0IHRvIG1vbml0b3Igd2hlbiBhbGwgdGhlIGFjdGlvbnMgb2YgdGhlIGZ1bmN0aW9uIGhhdmUgYmVlblxuXHQgKiAgICAgICAgICBleGVjdXRlZDsgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYXBwU3RhdGVLZXkgbWF5IGJlIHVuZGVmaW5lZCBvciBlbXB0eS5cblx0ICogQGV4YW1wbGUgPGNvZGU+XG5cdCAqIHNhcC51aS5kZWZpbmUoW1wic2FwL2ZlL25hdmlnYXRpb24vTmF2aWdhdGlvbkhhbmRsZXJcIl0sIGZ1bmN0aW9uIChOYXZpZ2F0aW9uSGFuZGxlcikge1xuXHQgKiBcdHZhciBvTmF2aWdhdGlvbkhhbmRsZXIgPSBuZXcgTmF2aWdhdGlvbkhhbmRsZXIob0NvbnRyb2xsZXIpO1xuXHQgKiBcdHZhciBtSW5uZXJBcHBEYXRhID0ge1xuXHQgKiBcdFx0c2VsZWN0aW9uVmFyaWFudCA6IG9TbWFydEZpbHRlckJhci5nZXREYXRhU3VpdGVGb3JtYXQoKSxcblx0ICogXHRcdHRhYmxlVmFyaWFudElkIDogb1NtYXJ0VGFibGUuZ2V0Q3VycmVudFZhcmlhbnRJZCgpLFxuXHQgKiBcdFx0Y3VzdG9tRGF0YSA6IG9NeUN1c3RvbURhdGFcblx0ICogXHR9O1xuXHQgKlxuXHQgKiBcdHZhciBvU3RvcmVJbm5lckFwcFN0YXRlID0gc3RvcmVJbm5lckFwcFN0YXRlV2l0aE5vbkRlbGF5ZWRSZXR1cm4obUlubmVyQXBwRGF0YSk7XG5cdCAqIFx0dmFyIHNBcHBTdGF0ZUtleSA9IG9TdG9yZUlubmVyQXBwU3RhdGUuYXBwU3RhdGVLZXk7XG5cdCAqIFx0aWYgKCFzQXBwU3RhdGVLZXkpIHtcblx0ICogICAgLy8gbm8gYXBwU3RhdGVLZXkgb2J0YWluZWQuLi5cblx0ICogXHR9O1xuXHQgKiBcdHZhciBvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZSA9IG9TdG9yZUlubmVyQXBwU3RhdGUucHJvbWlzZTtcblx0ICpcblx0ICogXHRvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZS5kb25lKGZ1bmN0aW9uKHNBcHBTdGF0ZUtleSl7XG5cdCAqIFx0XHQvL3lvdXIgaW5uZXIgYXBwIHN0YXRlIGlzIHNhdmVkIG5vdywgc0FwcFN0YXRlS2V5IHdhcyBhZGRlZCB0byBVUkxcblx0ICogXHRcdC8vcGVyZm9ybSBhY3Rpb25zIHRoYXQgbXVzdCBydW4gYWZ0ZXIgc2F2ZVxuXHQgKiBcdH0pO1xuXHQgKlxuXHQgKiBcdG9TdG9yZUlubmVyQXBwU3RhdGVQcm9taXNlLmZhaWwoZnVuY3Rpb24ob0Vycm9yKXtcblx0ICogXHRcdC8vc29tZSBlcnJvciBoYW5kbGluZ1xuXHQgKiBcdH0pO1xuXHQgKiB9KTtcblx0ICogPC9jb2RlPlxuXHQgKiBAcHVibGljXG5cdCAqIEBkZXByZWNhdGVkc2luY2UgMS4xMDRcblx0ICogQGRlcHJlY2F0ZWQgVXNlIHRoZSB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2aWdhdGlvbkhhbmRsZXIuc3RvcmVJbm5lckFwcFN0YXRlQXN5bmN9IGluc3RlYWQuXG5cdCAqL1xuXHRzdG9yZUlubmVyQXBwU3RhdGVXaXRoSW1tZWRpYXRlUmV0dXJuKG1Jbm5lckFwcERhdGE6IElubmVyQXBwRGF0YSwgYkltbWVkaWF0ZUhhc2hSZXBsYWNlPzogYm9vbGVhbik6IG9iamVjdCB7XG5cdFx0TG9nLmVycm9yKFxuXHRcdFx0XCJEZXByZWNhdGVkIEFQSSBjYWxsIG9mICdzYXAuZmUubmF2aWdhdGlvbi5OYXZpZ2F0aW9uSGFuZGxlci5zdG9yZUlubmVyQXBwU3RhdGVXaXRoSW1tZWRpYXRlUmV0dXJuJy4gUGxlYXNlIHVzZSAnc3RvcmVJbm5lckFwcFN0YXRlQXN5bmMnIGluc3RlYWRcIixcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFwic2FwLmZlLm5hdmlnYXRpb24uTmF2aWdhdGlvbkhhbmRsZXJcIlxuXHRcdCk7XG5cdFx0aWYgKHR5cGVvZiBiSW1tZWRpYXRlSGFzaFJlcGxhY2UgIT09IFwiYm9vbGVhblwiKSB7XG5cdFx0XHRiSW1tZWRpYXRlSGFzaFJlcGxhY2UgPSBmYWxzZTsgLy8gZGVmYXVsdFxuXHRcdH1cblxuXHRcdGNvbnN0IG9OYXZIYW5kbGVyID0gdGhpcztcblx0XHRjb25zdCBvQXBwU3RhdGVQcm9taXNlID0galF1ZXJ5LkRlZmVycmVkKCk7XG5cblx0XHQvLyBpbiBjYXNlIG1Jbm5lckFwcFN0YXRlIGlzIGVtcHR5LCBkbyBub3Qgb3ZlcndyaXRlIHRoZSBsYXN0IHNhdmVkIHN0YXRlXG5cdFx0aWYgKGlzRW1wdHlPYmplY3QobUlubmVyQXBwRGF0YSkpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGFwcFN0YXRlS2V5OiBcIlwiLFxuXHRcdFx0XHRwcm9taXNlOiBvQXBwU3RhdGVQcm9taXNlLnJlc29sdmUoXCJcIilcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly8gY2hlY2sgaWYgd2UgYWxyZWFkeSBzYXZlZCB0aGUgc2FtZSBkYXRhXG5cdFx0Y29uc3Qgc0FwcFN0YXRlS2V5Q2FjaGVkID0gdGhpcy5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5zQXBwU3RhdGVLZXk7XG5cblx0XHRjb25zdCBiSW5uZXJBcHBEYXRhRXF1YWwgPSBKU09OLnN0cmluZ2lmeShtSW5uZXJBcHBEYXRhKSA9PT0gSlNPTi5zdHJpbmdpZnkodGhpcy5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5vQXBwRGF0YSk7XG5cdFx0aWYgKGJJbm5lckFwcERhdGFFcXVhbCAmJiBzQXBwU3RhdGVLZXlDYWNoZWQpIHtcblx0XHRcdC8vIHBhc3NlZCBpbm5lciBhcHAgc3RhdGUgZm91bmQgaW4gY2FjaGVcblx0XHRcdHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEuaUNhY2hlSGl0Kys7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRhcHBTdGF0ZUtleTogc0FwcFN0YXRlS2V5Q2FjaGVkLFxuXHRcdFx0XHRwcm9taXNlOiBvQXBwU3RhdGVQcm9taXNlLnJlc29sdmUoc0FwcFN0YXRlS2V5Q2FjaGVkKVxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHQvLyBwYXNzZWQgaW5uZXIgYXBwIHN0YXRlIG5vdCBmb3VuZCBpbiBjYWNoZVxuXHRcdHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEuaUNhY2hlTWlzcysrO1xuXG5cdFx0Y29uc3QgZm5PbkFmdGVyU2F2ZSA9IGZ1bmN0aW9uIChzQXBwU3RhdGVLZXk6IGFueSk6IHZvaWQge1xuXHRcdFx0Ly8gcmVwbGFjZSBpbm5lciBhcHAgaGFzaCB3aXRoIG5ldyBhcHBTdGF0ZUtleSBpbiB1cmxcblx0XHRcdGlmICghYkltbWVkaWF0ZUhhc2hSZXBsYWNlKSB7XG5cdFx0XHRcdG9OYXZIYW5kbGVyLnJlcGxhY2VIYXNoKHNBcHBTdGF0ZUtleSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIHJlbWVtYmVyIGxhc3Qgc2F2ZWQgc3RhdGVcblx0XHRcdG9OYXZIYW5kbGVyLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLm9BcHBEYXRhID0gbUlubmVyQXBwRGF0YTtcblx0XHRcdG9OYXZIYW5kbGVyLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLnNBcHBTdGF0ZUtleSA9IHNBcHBTdGF0ZUtleTtcblx0XHRcdG9BcHBTdGF0ZVByb21pc2UucmVzb2x2ZShzQXBwU3RhdGVLZXkpO1xuXHRcdH07XG5cblx0XHRjb25zdCBmbk9uRXJyb3IgPSBmdW5jdGlvbiAob0Vycm9yOiBhbnkpOiB2b2lkIHtcblx0XHRcdG9BcHBTdGF0ZVByb21pc2UucmVqZWN0KG9FcnJvcik7XG5cdFx0fTtcblxuXHRcdGNvbnN0IHNBcHBTdGF0ZUtleSA9IHRoaXMuX3NhdmVBcHBTdGF0ZShtSW5uZXJBcHBEYXRhLCBmbk9uQWZ0ZXJTYXZlLCBmbk9uRXJyb3IpO1xuXHRcdC8qXG5cdFx0ICogTm90ZSB0aGF0IF9zYXBBcHBTdGF0ZSBtYXkgcmV0dXJuICd1bmRlZmluZWQnIGluIGNhc2UgdGhhdCB0aGUgcGFyc2luZyBoYXMgZmFpbGVkLiBJbiB0aGlzIGNhc2UsIHdlIHNob3VsZCBub3QgdHJpZ2dlciB0aGUgcmVwbGFjZW1lbnRcblx0XHQgKiBvZiB0aGUgQXBwIEhhc2ggd2l0aCB0aGUgZ2VuZXJhdGVkIGtleSwgYXMgdGhlIGNvbnRhaW5lciB3YXMgbm90IHdyaXR0ZW4gYmVmb3JlLiBOb3RlIGFzIHdlbGwgdGhhdCB0aGUgZXJyb3IgaGFuZGxpbmcgaGFzIGFscmVhZHlcblx0XHQgKiBoYXBwZW5lZCBiZWZvcmUgYnkgbWFraW5nIHRoZSBvTXlEZWZlcnJlZCBwcm9taXNlIGZhaWwgKHNlZSBmbk9uRXJyb3IgYWJvdmUpLlxuXHRcdCAqL1xuXHRcdC8vIGlmIChzQXBwU3RhdGVLZXkgIT09IHVuZGVmaW5lZCkge1xuXHRcdC8vIC8vcmVwbGFjZSBpbm5lciBhcHAgaGFzaCB3aXRoIG5ldyBhcHBTdGF0ZUtleSBpbiB1cmxcblx0XHQvLyAvL25vdGU6IHdlIGRvIG5vdCB3YWl0IGZvciB0aGUgc2F2ZSB0byBiZSBjb21wbGV0ZWQ6IHRoaXMgYXN5bmNocm9ub3VzbHkgYmVoYXZpb3VyIGlzIG5lY2Vzc2FyeSBpZlxuXHRcdC8vIC8vdGhpcyBtZXRob2QgaXMgY2FsbGVkIGUuZy4gaW4gYSBvbkxpbmtQcmVzc2VkIGV2ZW50IHdpdGggbm8gcG9zc2liaWxpdHkgdG8gd2FpdCBmb3IgdGhlIHByb21pc2UgcmVzb2x1dGlvblxuXHRcdC8vIGlmIChiSW1tZWRpYXRlSGFzaFJlcGxhY2UpIHtcblx0XHQvLyBmblJlcGxhY2VIYXNoKHNBcHBTdGF0ZUtleSk7XG5cdFx0Ly8gfVxuXHRcdC8vIH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0YXBwU3RhdGVLZXk6IHNBcHBTdGF0ZUtleSxcblx0XHRcdHByb21pc2U6IG9BcHBTdGF0ZVByb21pc2UucHJvbWlzZSgpXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzZXMgbmF2aWdhdGlvbi1yZWxhdGVkIHRhc2tzIHJlbGF0ZWQgdG8gYmVmb3JlUG9wb3Zlck9wZW5zIGV2ZW50IGhhbmRsaW5nIGZvciB0aGUgU21hcnRMaW5rIGNvbnRyb2wgYW5kIHJldHVybnMgYSBQcm9taXNlIG9iamVjdC4gSW5cblx0ICogcGFydGljdWxhciwgdGhlIGZvbGxvd2luZyB0YXNrcyBhcmUgcGVyZm9ybWVkIGJlZm9yZSB0aGUgU21hcnRMaW5rIHBvcG92ZXIgY2FuIGJlIG9wZW5lZDpcblx0ICogPHVsPlxuXHQgKiA8bGk+SWYgPGNvZGU+bUlubmVyQXBwRGF0YTwvY29kZT4gaXMgcHJvdmlkZWQsIHRoaXMgaW5uZXIgYXBwIHN0YXRlIGlzIHNhdmVkIGZvciBiYWNrIG5hdmlnYXRpb24gYXQgYSBsYXRlciB0aW1lLjwvbGk+XG5cdCAqIDxsaT5UaGUgdGFibGUgZXZlbnQgcGFyYW1ldGVycyAoc2VtYW50aWMgYXR0cmlidXRlcykgYW5kIHRoZSBzZWxlY3Rpb24gdmFyaWFudCBkYXRhIGFyZSBjb21iaW5lZCBieSBjYWxsaW5nIHRoZSBtZXRob2Rcblx0ICoge0BsaW5rICMubWl4QXR0cmlidXRlc0FuZFNlbGVjdGlvblZhcmlhbnQgbWl4QXR0cmlidXRlc0FuZFNlbGVjdGlvblZhcmlhbnR9LjwvbGk+XG5cdCAqIDxsaT5UaGUgY29tYmluZWQgZGF0YSBpcyBzYXZlZCBhcyB0aGUgY3Jvc3MgYXBwIHN0YXRlIHRvIGJlIGhhbmRlZCBvdmVyIHRvIHRoZSB0YXJnZXQgYXBwLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgc2FwLXhhcHAtc3RhdGUga2V5IGlzIHNldFxuXHQgKiBpbiB0aGUgVVJMLjwvbGk+XG5cdCAqIDxsaT5BbGwgc2luZ2xlIHNlbGVjdGlvbnMgKFwiaW5jbHVkaW5nIGVxdWFsXCIpIG9mIHRoZSBjb21iaW5lZCBzZWxlY3Rpb24gZGF0YSBhcmUgcGFzc2VkIHRvIHRoZSBTbWFydExpbmsgcG9wb3ZlciBhcyBzZW1hbnRpYyBhdHRyaWJ1dGVzLjwvbGk+XG5cdCAqIDxsaT5UaGUgbWV0aG9kIDxjb2RlPm9UYWJsZUV2ZW50UGFyYW1ldGVycy5vcGVuKCk8L2NvZGU+IGlzIGNhbGxlZC4gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgcmVhbGx5IG9wZW4gdGhlIHBvcG92ZXIsIGJ1dCB0aGUgU21hcnRMaW5rXG5cdCAqIGNvbnRyb2wgcHJvY2VlZHMgd2l0aCBmaXJpbmcgdGhlIGV2ZW50IDxjb2RlPm5hdmlnYXRpb25UYXJnZXRzT2J0YWluZWQ8L2NvZGU+LjwvbGk+XG5cdCAqIDwvdWw+LlxuXHQgKiA8YnI+XG5cdCAqIDxiPk5vZGU6PC9iPiBJZiB0aGUgPGNvZGU+b0V4dGVybmFsQXBwRGF0YTwvY29kZT4gcGFyYW1ldGVyIGlzIG5vdCBzdXBwbGllZCwgdGhlIGV4dGVybmFsIGFwcCBkYXRhIHdpbGwgYmUgY2FsY3VsYXRlZCBiYXNlZCBvblxuXHQgKiB0aGUgPGNvZGU+bUlubmVyQXBwRGF0YTwvY29kZT4gZGF0YS48YnI+LlxuXHQgKiBAcGFyYW0gb1RhYmxlRXZlbnRQYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBTbWFydFRhYmxlIGNvbnRyb2wgd2hlbiB0aGUgU21hcnRMaW5rIGNvbnRyb2wgaGFzIGJlZW4gY2xpY2tlZCxcblx0ICogICAgICAgIGFuIGluc3RhbmNlIG9mIGEgUG9wT3ZlciBvYmplY3Rcblx0ICogQHBhcmFtIHNTZWxlY3Rpb25WYXJpYW50IFN0cmluZ2lmaWVkIEpTT04gb2JqZWN0IGFzIHJldHVybmVkLCBmb3IgZXhhbXBsZSwgZnJvbSBnZXREYXRhU3VpdGVGb3JtYXQoKSBvZiB0aGUgU21hcnRGaWx0ZXJCYXIgY29udHJvbFxuXHQgKiBAcGFyYW0gbUlubmVyQXBwRGF0YSBPYmplY3QgY29udGFpbmluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwLiBJZiBwcm92aWRlZCwgb3BlbmluZyB0aGUgUG9wb3ZlciBpcyBkZWZlcnJlZCB1bnRpbCB0aGVcblx0ICogICAgICAgIGlubmVyIGFwcCBkYXRhIGlzIHNhdmVkIGluIGEgY29uc2lzdGVudCB3YXkuXG5cdCAqIEBwYXJhbSBvRXh0ZXJuYWxBcHBEYXRhIE9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdGFyZ2V0IHNjcmVlbi5cblx0ICogQHBhcmFtIG9FeHRlcm5hbEFwcERhdGEuc2VsZWN0aW9uVmFyaWFudCBPYmplY3QgY29udGFpbmluZyBzZWxlY3Rpb25WYXJpYW50LCB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdGFyZ2V0IHNjcmVlbi4gSWYgbm90XG5cdCAqICAgICAgICBzZXQgdGhlIHNTZWxlY3Rpb25WYXJpYW50IHdpbGwgYmUgdXNlZC5cblx0ICogQHBhcmFtIG9FeHRlcm5hbEFwcERhdGEucHJlc2VudGF0aW9uVmFyaWFudCBPYmplY3QgY29udGFpbmluZyB0aGUgY3VycmVudCB1aSBwcmVzZW50YXRpb25WYXJpYW50IG9mIHRoZSBhcHAsIHdoaWNoIHdpbGwgYmVcblx0ICogICAgICAgIHBhc3NlZCB0byB0aGUgdGFyZ2V0IHNjcmVlblxuXHQgKiBAcGFyYW0gb0V4dGVybmFsQXBwRGF0YS52YWx1ZVRleHRzIE9iamVjdCBjb250YWluaW5nIHZhbHVlIGRlc2NyaXB0aW9ucywgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHRhcmdldCBzY3JlZW5cblx0ICogQHJldHVybnMgQSBQcm9taXNlIG9iamVjdCB0byBtb25pdG9yIHdoZW4gYWxsIGFjdGlvbnMgb2YgdGhlIGZ1bmN0aW9uIGhhdmUgYmVlbiBleGVjdXRlZDsgaWYgdGhlIGV4ZWN1dGlvbiBpcyBzdWNjZXNzZnVsLCB0aGVcblx0ICogICAgICAgICAgbW9kaWZpZWQgb1RhYmxlRXZlbnRQYXJhbWV0ZXJzIGlzIHJldHVybmVkOyBpZiBhbiBlcnJvciBvY2N1cnMsIGFuIGVycm9yIG9iamVjdCBvZiB0eXBlXG5cdCAqICAgICAgICAgIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZFcnJvcn0gaXMgcmV0dXJuZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAZXhhbXBsZSA8Y29kZT5cblx0ICogc2FwLnVpLmRlZmluZShbXCJzYXAvZmUvbmF2aWdhdGlvbi9OYXZpZ2F0aW9uSGFuZGxlclwiLCBcInNhcC9mZS9uYXZpZ2F0aW9uL1NlbGVjdGlvblZhcmlhbnRcIl0sIGZ1bmN0aW9uIChOYXZpZ2F0aW9uSGFuZGxlciwgU2VsZWN0aW9uVmFyaWFudCkge1xuXHQgKiBcdC8vZXZlbnQgaGFuZGxlciBmb3IgdGhlIHNtYXJ0IGxpbmsgZXZlbnQgXCJiZWZvcmVQb3BvdmVyT3BlbnNcIlxuXHQgKiBcdFx0b25CZWZvcmVQb3BvdmVyT3BlbnM6IGZ1bmN0aW9uKG9FdmVudCkge1xuXHQgKiBcdFx0XHR2YXIgb1RhYmxlRXZlbnRQYXJhbWV0ZXJzID0gb0V2ZW50LmdldFBhcmFtZXRlcnMoKTtcblx0ICpcblx0ICogXHRcdFx0dmFyIG1Jbm5lckFwcERhdGEgPSB7XG5cdCAqIFx0XHRcdFx0c2VsZWN0aW9uVmFyaWFudCA6IG9TbWFydEZpbHRlckJhci5nZXREYXRhU3VpdGVGb3JtYXQoKSxcblx0ICogXHRcdFx0XHR0YWJsZVZhcmlhbnRJZCA6IG9TbWFydFRhYmxlLmdldEN1cnJlbnRWYXJpYW50SWQoKSxcblx0ICogXHRcdFx0XHRjdXN0b21EYXRhIDogb015Q3VzdG9tRGF0YVxuXHQgKiBcdFx0XHR9O1xuXHQgKlxuXHQgKiBcdFx0XHR2YXIgb1NlbGVjdGlvblZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudCgpO1xuXHQgKiBcdFx0XHRvU2VsZWN0aW9uVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oXCJDb21wYW55Q29kZVwiLCBcIklcIiwgXCJFUVwiLCBcIjAwMDFcIik7XG5cdCAqIFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50LmFkZFNlbGVjdE9wdGlvbihcIkN1c3RvbWVyXCIsIFwiSVwiLCBcIkVRXCIsIFwiQzAwMDFcIik7XG5cdCAqIFx0XHRcdHZhciBzU2VsZWN0aW9uVmFyaWFudD0gb1NlbGVjdGlvblZhcmlhbnQudG9KU09OU3RyaW5nKCk7XG5cdCAqXG5cdCAqIFx0XHRcdHZhciBvTmF2aWdhdGlvbkhhbmRsZXIgPSBuZXcgTmF2aWdhdGlvbkhhbmRsZXIob0NvbnRyb2xsZXIpO1xuXHQgKiBcdFx0XHR2YXIgb1NtYXJ0TGlua1Byb21pc2UgPSBvTmF2aWdhdGlvbkhhbmRsZXIucHJvY2Vzc0JlZm9yZVNtYXJ0TGlua1BvcG92ZXJPcGVucyhvVGFibGVFdmVudFBhcmFtZXRlcnMsIHNTZWxlY3Rpb25WYXJpYW50LCBtSW5uZXJBcHBEYXRhKTtcblx0ICpcblx0ICogXHRcdFx0b1NtYXJ0TGlua1Byb21pc2UuZG9uZShmdW5jdGlvbihvVGFibGVFdmVudFBhcmFtZXRlcnMpe1xuXHQgKiBcdFx0XHRcdC8vIGhlcmUgeW91IGNhbiBhZGQgY29kaW5nIHRoYXQgc2hvdWxkIHJ1biBhZnRlciBhbGwgYXBwIHN0YXRlcyBhcmUgc2F2ZWQgYW5kIHRoZSBzZW1hbnRpYyBhdHRyaWJ1dGVzIGFyZSBzZXRcblx0ICogXHRcdFx0fSk7XG5cdCAqXG5cdCAqIFx0XHRcdG9TbWFydExpbmtQcm9taXNlLmZhaWwoZnVuY3Rpb24ob0Vycm9yKXtcblx0ICogXHRcdFx0Ly9zb21lIGVycm9yIGhhbmRsaW5nXG5cdCAqIFx0XHRcdH0pO1xuXHQgKiBcdFx0fTtcblx0ICogXHR9KTtcblx0ICogPC9jb2RlPlxuXHQgKi9cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcm9taXNlLWZ1bmN0aW9uLWFzeW5jXG5cdHByb2Nlc3NCZWZvcmVTbWFydExpbmtQb3BvdmVyT3BlbnMoXG5cdFx0b1RhYmxlRXZlbnRQYXJhbWV0ZXJzOiBhbnksXG5cdFx0c1NlbGVjdGlvblZhcmlhbnQ6IHN0cmluZyxcblx0XHRtSW5uZXJBcHBEYXRhPzogSW5uZXJBcHBEYXRhLFxuXHRcdG9FeHRlcm5hbEFwcERhdGE/OiB7XG5cdFx0XHRzZWxlY3Rpb25WYXJpYW50Pzogb2JqZWN0O1xuXHRcdFx0cHJlc2VudGF0aW9uVmFyaWFudD86IG9iamVjdDtcblx0XHRcdHZhbHVlVGV4dHM/OiBvYmplY3Q7XG5cdFx0fVxuXHQpOiBKUXVlcnkuUHJvbWlzZTxzdHJpbmdbXSwgdW5rbm93biwgdW5rbm93bj4ge1xuXHRcdGNvbnN0IG9NeURlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCkgYXMgSlF1ZXJ5LkRlZmVycmVkPHN0cmluZ1tdLCB1bmtub3duLCB1bmtub3duPjtcblx0XHRsZXQgbVNlbWFudGljQXR0cmlidXRlczogYW55O1xuXHRcdGlmIChvVGFibGVFdmVudFBhcmFtZXRlcnMgIT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRtU2VtYW50aWNBdHRyaWJ1dGVzID0gb1RhYmxlRXZlbnRQYXJhbWV0ZXJzLnNlbWFudGljQXR0cmlidXRlcztcblx0XHR9XG5cblx0XHRsZXQgb1hBcHBEYXRhT2JqOiBhbnk7XG5cdFx0Y29uc3Qgb05hdkhhbmRsZXI6IE5hdmlnYXRpb25IYW5kbGVyID0gdGhpcztcblxuXHRcdGlmIChvRXh0ZXJuYWxBcHBEYXRhID09PSB1bmRlZmluZWQpIHtcblx0XHRcdG9YQXBwRGF0YU9iaiA9IHt9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvWEFwcERhdGFPYmogPSBvRXh0ZXJuYWxBcHBEYXRhO1xuXHRcdH1cblxuXHRcdGNvbnN0IGZuU3RvcmVYYXBwQW5kQ2FsbE9wZW4gPSBmdW5jdGlvbiAobVN1YlNlbWFudGljQXR0cmlidXRlczogYW55LCBzU3ViU2VsZWN0aW9uVmFyaWFudDogYW55KTogdm9pZCB7XG5cdFx0XHQvLyBtaXggdGhlIHNlbWFudGljIGF0dHJpYnV0ZXMgKGUuZy4gZnJvbSB0aGUgcm93IGxpbmUpIHdpdGggdGhlIHNlbGVjdGlvbiB2YXJpYW50IChlLmcuIGZyb20gdGhlIGZpbHRlciBiYXIpXG5cdFx0XHRzU3ViU2VsZWN0aW9uVmFyaWFudCA9IG9YQXBwRGF0YU9iai5zZWxlY3Rpb25WYXJpYW50IHx8IHNTdWJTZWxlY3Rpb25WYXJpYW50IHx8IFwie31cIjtcblxuXHRcdFx0Y29uc3QgaVN1cHByZXNzaW9uQmVoYXZpb3IgPSBTdXBwcmVzc2lvbkJlaGF2aW9yLnJhaXNlRXJyb3JPbk51bGwgfCBTdXBwcmVzc2lvbkJlaGF2aW9yLnJhaXNlRXJyb3JPblVuZGVmaW5lZDtcblx0XHRcdC8qXG5cdFx0XHQgKiBjb21wYXRpYmxpdHk6IFVudGlsIFNBUFVJNSAxLjI4LjUgKG9yIGV2ZW4gbGF0ZXIpIHRoZSBTbWFydCBMaW5rIGluIGEgU21hcnQgVGFibGUgaXMgZmlsdGVyaW5nIGFsbCBudWxsLSBhbmQgdW5kZWZpbmVkIHZhbHVlcy5cblx0XHRcdCAqIFRoZXJlZm9yZSwgbVNlbWFudGljQXR0cmlidXRlcyBhcmUgYWxyZWFkeSByZWR1Y2VkIGFwcHJvcHJpYXRlbHkgLS0gdGhpcyBkb2VzIG5vdCBuZWVkIHRvIGJlIGRvbmUgYnlcblx0XHRcdCAqIG1peEF0dHJpYnV0ZXNBbmRTZWxlY3Rpb25WYXJpYW50IGFnYWluLiBUbyBlbnN1cmUgdGhhdCB3ZSBzdGlsbCBoYXZlIHRoZSBvbGQgYmVoYXZpb3VyIChpLmUuIGFuIE5hdkVycm9yIGlzIHJhaXNlZCBpbiBjYXNlIHRoYXRcblx0XHRcdCAqIGJlaGF2aW91ciBvZiB0aGUgU21hcnQgTGluayBjb250cm9sIGhhcyBjaGFuZ2VkKSwgdGhlIFwib2xkXCIgU3VwcHJlc3Npb24gQmVoYXZpb3VyIGlzIHJldGFpbmVkLlxuXHRcdFx0ICovXG5cblx0XHRcdGNvbnN0IG9NaXhlZFNlbFZhciA9IG9OYXZIYW5kbGVyLm1peEF0dHJpYnV0ZXNBbmRTZWxlY3Rpb25WYXJpYW50KFxuXHRcdFx0XHRtU3ViU2VtYW50aWNBdHRyaWJ1dGVzLFxuXHRcdFx0XHRzU3ViU2VsZWN0aW9uVmFyaWFudCxcblx0XHRcdFx0aVN1cHByZXNzaW9uQmVoYXZpb3Jcblx0XHRcdCk7XG5cdFx0XHRzU3ViU2VsZWN0aW9uVmFyaWFudCA9IG9NaXhlZFNlbFZhci50b0pTT05TdHJpbmcoKTtcblxuXHRcdFx0Ly8gZW5yaWNoIHRoZSBzZW1hbnRpYyBhdHRyaWJ1dGVzIHdpdGggc2luZ2xlIHNlbGVjdGlvbnMgZnJvbSB0aGUgc2VsZWN0aW9uIHZhcmlhbnRcblx0XHRcdGxldCBvVG1wRGF0YTogYW55ID0ge307XG5cdFx0XHRvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50ID0gb01peGVkU2VsVmFyLnRvSlNPTk9iamVjdCgpO1xuXG5cdFx0XHRvVG1wRGF0YSA9IG9OYXZIYW5kbGVyLl9yZW1vdmVNZWFzdXJlQmFzZWRJbmZvcm1hdGlvbihvVG1wRGF0YSk7XG5cblx0XHRcdG9UbXBEYXRhID0gb05hdkhhbmRsZXIuX2NoZWNrSXNQb3RlbnRpYWxseVNlbnNpdGl2ZShvVG1wRGF0YSk7XG5cblx0XHRcdG1TdWJTZW1hbnRpY0F0dHJpYnV0ZXMgPSBvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50XG5cdFx0XHRcdD8gb05hdkhhbmRsZXIuX2dldFVSTFBhcmFtZXRlcnNGcm9tU2VsZWN0aW9uVmFyaWFudChuZXcgU2VsZWN0aW9uVmFyaWFudChvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50KSlcblx0XHRcdFx0OiB7fTtcblxuXHRcdFx0Y29uc3QgZm5PbkNvbnRhaW5lclNhdmUgPSBmdW5jdGlvbiAoc0FwcFN0YXRlS2V5OiBhbnkpOiB2b2lkIHtcblx0XHRcdFx0aWYgKG9UYWJsZUV2ZW50UGFyYW1ldGVycyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0Ly8gSWYgb1RhYmxlRXZlbnRQYXJhbWV0ZXJzIGlzIHVuZGVmaW5lZCwgcmV0dXJuIGJvdGggc2VtYW50aWNBdHRyaWJ1dGVzIGFuZCBhcHBTdGF0ZWtleVxuXHRcdFx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUobVN1YlNlbWFudGljQXR0cmlidXRlcywgc0FwcFN0YXRlS2V5KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBzZXQgdGhlIHN0b3JlZCBkYXRhIGluIHBvcG92ZXIgYW5kIGNhbGwgb3BlbigpXG5cdFx0XHRcdFx0b1RhYmxlRXZlbnRQYXJhbWV0ZXJzLnNldFNlbWFudGljQXR0cmlidXRlcyhtU3ViU2VtYW50aWNBdHRyaWJ1dGVzKTtcblx0XHRcdFx0XHRvVGFibGVFdmVudFBhcmFtZXRlcnMuc2V0QXBwU3RhdGVLZXkoc0FwcFN0YXRlS2V5KTtcblx0XHRcdFx0XHRvVGFibGVFdmVudFBhcmFtZXRlcnMub3BlbigpOyAvLyA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PiBOb3RlIHRoYXQgXCJvcGVuXCIgZG9lcyBub3Qgb3BlbiB0aGUgcG9wb3ZlciwgYnV0IHByb2NlZWRzXG5cdFx0XHRcdFx0Ly8gd2l0aCBmaXJpbmcgdGhlIG9uTmF2VGFyZ2V0c09idGFpbmVkIGV2ZW50LlxuXHRcdFx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUob1RhYmxlRXZlbnRQYXJhbWV0ZXJzKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdFx0Y29uc3QgZm5PbkVycm9yID0gZnVuY3Rpb24gKG9FcnJvcjogYW55KTogdm9pZCB7XG5cdFx0XHRcdG9NeURlZmVycmVkLnJlamVjdChvRXJyb3IpO1xuXHRcdFx0fTtcblxuXHRcdFx0b1hBcHBEYXRhT2JqLnNlbGVjdGlvblZhcmlhbnQgPSBzU3ViU2VsZWN0aW9uVmFyaWFudDtcblxuXHRcdFx0b1hBcHBEYXRhT2JqID0gb05hdkhhbmRsZXIuX3JlbW92ZU1lYXN1cmVCYXNlZEluZm9ybWF0aW9uKG9YQXBwRGF0YU9iaik7XG5cblx0XHRcdG9OYXZIYW5kbGVyLl9zYXZlQXBwU3RhdGVBc3luYyhvWEFwcERhdGFPYmosIGZuT25Db250YWluZXJTYXZlLCBmbk9uRXJyb3IpO1xuXHRcdH07XG5cblx0XHRpZiAobUlubmVyQXBwRGF0YSkge1xuXHRcdFx0Y29uc3Qgb1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UgPSB0aGlzLnN0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jKG1Jbm5lckFwcERhdGEsIHRydWUpO1xuXG5cdFx0XHQvLyBpZiB0aGUgaW5uZXIgYXBwIHN0YXRlIHdhcyBzdWNjZXNzZnVsbHkgc3RvcmVkLCBzdG9yZSBhbHNvIHRoZSB4YXBwLXN0YXRlXG5cdFx0XHRvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZS5kb25lKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Zm5TdG9yZVhhcHBBbmRDYWxsT3BlbihtU2VtYW50aWNBdHRyaWJ1dGVzLCBzU2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0b1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UuZmFpbChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0b015RGVmZXJyZWQucmVqZWN0KG9FcnJvcik7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gdGhlcmUgaXMgbm8gaW5uZXIgYXBwIHN0YXRlIHRvIHNhdmUsIGp1c3QgcHV0IHRoZSBwYXJhbWV0ZXJzIGludG8geGFwcC1zdGF0ZVxuXHRcdFx0Zm5TdG9yZVhhcHBBbmRDYWxsT3BlbihtU2VtYW50aWNBdHRyaWJ1dGVzLCBzU2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9NeURlZmVycmVkLnByb21pc2UoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzZXMgc2VsZWN0aW9uVmFyaWFudCBzdHJpbmcgYW5kIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCAoc2VtYW50aWNBdHRyaWJ1dGVzIGFuZCBBcHBTdGF0ZUtleSkuXG5cdCAqIEBwYXJhbSBzU2VsZWN0aW9uVmFyaWFudCBTdHJpbmdpZmllZCBKU09OIG9iamVjdFxuXHQgKiBAcmV0dXJucyBBIFByb21pc2Ugb2JqZWN0IHRvIG1vbml0b3Igd2hlbiBhbGwgYWN0aW9ucyBvZiB0aGUgZnVuY3Rpb24gaGF2ZSBiZWVuIGV4ZWN1dGVkOyBpZiB0aGUgZXhlY3V0aW9uIGlzIHN1Y2Nlc3NmdWwsIHRoZVxuXHQgKiAgICAgICAgICBzZW1hbnRpY0F0dHJpYnV0ZXMgYXMgd2VsbCBhcyB0aGUgYXBwU3RhdGVLZXkgYXJlIHJldHVybmVkOyBpZiBhbiBlcnJvciBvY2N1cnMsIGFuIGVycm9yIG9iamVjdCBvZiB0eXBlXG5cdCAqICAgICAgICAgIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZFcnJvcn0gaXMgcmV0dXJuZWRcblx0ICogPGJyPlxuXHQgKiBAZXhhbXBsZSA8Y29kZT5cblx0ICogc2FwLnVpLmRlZmluZShbXCJzYXAvZmUvbmF2aWdhdGlvbi9OYXZpZ2F0aW9uSGFuZGxlclwiLCBcInNhcC9mZS9uYXZpZ2F0aW9uL1NlbGVjdGlvblZhcmlhbnRcIl0sIGZ1bmN0aW9uIChOYXZpZ2F0aW9uSGFuZGxlciwgU2VsZWN0aW9uVmFyaWFudCkge1xuXHQgKiBcdFx0dmFyIG9TZWxlY3Rpb25WYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoKTtcblx0ICogXHRcdG9TZWxlY3Rpb25WYXJpYW50LmFkZFNlbGVjdE9wdGlvbihcIkNvbXBhbnlDb2RlXCIsIFwiSVwiLCBcIkVRXCIsIFwiMDAwMVwiKTtcblx0ICogXHRcdG9TZWxlY3Rpb25WYXJpYW50LmFkZFNlbGVjdE9wdGlvbihcIkN1c3RvbWVyXCIsIFwiSVwiLCBcIkVRXCIsIFwiQzAwMDFcIik7XG5cdCAqIFx0XHR2YXIgc1NlbGVjdGlvblZhcmlhbnQ9IG9TZWxlY3Rpb25WYXJpYW50LnRvSlNPTlN0cmluZygpO1xuXHQgKlxuXHQgKiBcdFx0dmFyIG9OYXZpZ2F0aW9uSGFuZGxlciA9IG5ldyBOYXZpZ2F0aW9uSGFuZGxlcihvQ29udHJvbGxlcik7XG5cdCAqIFx0XHR2YXIgb1Byb21pc2VPYmplY3QgPSBvTmF2aWdhdGlvbkhhbmRsZXIuX2dldEFwcFN0YXRlS2V5QW5kVXJsUGFyYW1ldGVycyhzU2VsZWN0aW9uVmFyaWFudCk7XG5cdCAqXG5cdCAqIFx0XHRvUHJvbWlzZU9iamVjdC5kb25lKGZ1bmN0aW9uKG9TZW1hbnRpY0F0dHJpYnV0ZXMsIHNBcHBTdGF0ZUtleSl7XG5cdCAqIFx0XHRcdC8vIGhlcmUgeW91IGNhbiBhZGQgY29kaW5nIHRoYXQgc2hvdWxkIHJ1biBhZnRlciBhbGwgYXBwIHN0YXRlIGFuZCB0aGUgc2VtYW50aWMgYXR0cmlidXRlcyBoYXZlIGJlZW4gcmV0dXJuZWQuXG5cdCAqIFx0XHR9KTtcblx0ICpcblx0ICogXHRcdG9Qcm9taXNlT2JqZWN0LmZhaWwoZnVuY3Rpb24ob0Vycm9yKXtcblx0ICogXHRcdFx0Ly9zb21lIGVycm9yIGhhbmRsaW5nXG5cdCAqIFx0XHR9KTtcblx0ICpcdH0pO1xuXHQgKiA8L2NvZGU+XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Byb21pc2UtZnVuY3Rpb24tYXN5bmNcblx0X2dldEFwcFN0YXRlS2V5QW5kVXJsUGFyYW1ldGVycyhzU2VsZWN0aW9uVmFyaWFudDogc3RyaW5nKTogSlF1ZXJ5LlByb21pc2U8c3RyaW5nW10sIHVua25vd24sIHVua25vd24+IHtcblx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzQmVmb3JlU21hcnRMaW5rUG9wb3Zlck9wZW5zKHVuZGVmaW5lZCwgc1NlbGVjdGlvblZhcmlhbnQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgQXBwIHNwZWNpZmljIGhhc2guXG5cdCAqIEBwYXJhbSBhcHBIYXNoIFRoZSBwYXRoIHN0cmluZ1xuXHQgKiBAcmV0dXJucyBBIHN0cmluZyByZXByZXNlbnRpbmcgYmFzZSBwYXRoXG5cdCAqL1xuXHRhc3luYyBfZ2V0QXBwU3BlY2lmaWNIYXNoKGFwcEhhc2g6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGNyb3NzQXBwU2VydmljZSA9IGF3YWl0IHRoaXMuX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlQXN5bmMoKTtcblx0XHRcdHJldHVybiBhd2FpdCBjcm9zc0FwcFNlcnZpY2UuZ2V0SHJlZih7IGFwcFNwZWNpZmljUm91dGU6IGFwcEhhc2ggfSk7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG5cdFx0XHRMb2cuZXJyb3IoYEZFIDogQ2FuIG5vdCBmZXRjaCBBcHAgc2VwY2lmaWMgVVJMIDogJHttZXNzYWdlfWApO1xuXHRcdFx0dGhyb3cgRXJyb3IobWVzc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0X21peEF0dHJpYnV0ZXNUb1NlbFZhcmlhbnQoXG5cdFx0bVNlbWFudGljQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdFx0b1NlbFZhcmlhbnQ6IFNlbGVjdGlvblZhcmlhbnQsXG5cdFx0aVN1cHByZXNzaW9uQmVoYXZpb3I6IGFueVxuXHQpOiBTZWxlY3Rpb25WYXJpYW50IHtcblx0XHQvLyBhZGQgYWxsIHNlbWFudGljIGF0dHJpYnV0ZXMgdG8gdGhlIG1peGVkIHNlbGVjdGlvbiB2YXJpYW50XG5cdFx0Zm9yIChjb25zdCBzUHJvcGVydHlOYW1lIGluIG1TZW1hbnRpY0F0dHJpYnV0ZXMpIHtcblx0XHRcdGlmIChtU2VtYW50aWNBdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KHNQcm9wZXJ0eU5hbWUpKSB7XG5cdFx0XHRcdC8vIEEgdmFsdWUgb2YgYSBzZW1hbnRpYyBhdHRyaWJ1dGUgbWF5IG5vdCBiZSBhIHN0cmluZywgYnV0IGNhbiBiZSBlLmcuIGEgZGF0ZS5cblx0XHRcdFx0Ly8gU2luY2UgdGhlIHNlbGVjdGlvbiB2YXJpYW50IGFjY2VwdHMgb25seSBhIHN0cmluZywgd2UgaGF2ZSB0byBjb252ZXJ0IGl0IGluIGRlcGVuZGVuY2Ugb2YgdGhlIHR5cGUuXG5cdFx0XHRcdGxldCB2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSA9IG1TZW1hbnRpY0F0dHJpYnV0ZXNbc1Byb3BlcnR5TmFtZV07XG5cdFx0XHRcdGlmICh2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcblx0XHRcdFx0XHQvLyB1c2UgdGhlIHNhbWUgY29udmVyc2lvbiBtZXRob2QgZm9yIGRhdGVzIGFzIHRoZSBTbWFydEZpbHRlckJhcjogdG9KU09OKClcblx0XHRcdFx0XHR2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSA9IHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlLnRvSlNPTigpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdEFycmF5LmlzQXJyYXkodlNlbWFudGljQXR0cmlidXRlVmFsdWUpIHx8XG5cdFx0XHRcdFx0KHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlICYmIHR5cGVvZiB2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSA9PT0gXCJvYmplY3RcIilcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0dlNlbWFudGljQXR0cmlidXRlVmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiB2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcblx0XHRcdFx0XHR2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSA9IHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlLnRvU3RyaW5nKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodlNlbWFudGljQXR0cmlidXRlVmFsdWUgPT09IFwiXCIpIHtcblx0XHRcdFx0XHRpZiAoaVN1cHByZXNzaW9uQmVoYXZpb3IgJiBTdXBwcmVzc2lvbkJlaGF2aW9yLmlnbm9yZUVtcHR5U3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRMb2cuaW5mbyhcblx0XHRcdFx0XHRcdFx0XCJTZW1hbnRpYyBhdHRyaWJ1dGUgXCIgK1xuXHRcdFx0XHRcdFx0XHRcdHNQcm9wZXJ0eU5hbWUgK1xuXHRcdFx0XHRcdFx0XHRcdFwiIGlzIGFuIGVtcHR5IHN0cmluZyBhbmQgZHVlIHRvIHRoZSBjaG9zZW4gU3VwcHJlc3Npb24gQmVoaWF2b3VyIGlzIGJlaW5nIGlnbm9yZWQuXCJcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodlNlbWFudGljQXR0cmlidXRlVmFsdWUgPT09IG51bGwpIHtcblx0XHRcdFx0XHRpZiAoaVN1cHByZXNzaW9uQmVoYXZpb3IgJiBTdXBwcmVzc2lvbkJlaGF2aW9yLnJhaXNlRXJyb3JPbk51bGwpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdExvZy53YXJuaW5nKFwiU2VtYW50aWMgYXR0cmlidXRlIFwiICsgc1Byb3BlcnR5TmFtZSArIFwiIGlzIG51bGwgYW5kIGlnbm9yZWQgZm9yIG1peCBpbiB0byBzZWxlY3Rpb24gdmFyaWFudFwiKTtcblx0XHRcdFx0XHRcdGNvbnRpbnVlOyAvLyBpZ25vcmUhXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRpZiAoaVN1cHByZXNzaW9uQmVoYXZpb3IgJiBTdXBwcmVzc2lvbkJlaGF2aW9yLnJhaXNlRXJyb3JPblVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0TG9nLndhcm5pbmcoXCJTZW1hbnRpYyBhdHRyaWJ1dGUgXCIgKyBzUHJvcGVydHlOYW1lICsgXCIgaXMgdW5kZWZpbmVkIGFuZCBpZ25vcmVkIGZvciBtaXggaW4gdG8gc2VsZWN0aW9uIHZhcmlhbnRcIik7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodHlwZW9mIHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlID09PSBcInN0cmluZ1wiIHx8IHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7XG5cdFx0XHRcdFx0b1NlbFZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKHNQcm9wZXJ0eU5hbWUsIFwiSVwiLCBcIkVRXCIsIHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlLnRvU3RyaW5nKCkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9TZWxWYXJpYW50O1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbWJpbmVzIHRoZSBnaXZlbiBwYXJhbWV0ZXJzIGFuZCBzZWxlY3Rpb24gdmFyaWFudCBpbnRvIGEgbmV3IHNlbGVjdGlvbiB2YXJpYW50IGNvbnRhaW5pbmcgcHJvcGVydGllcyBmcm9tIGJvdGgsIHdpdGggdGhlIHBhcmFtZXRlcnNcblx0ICogb3ZlcnJpZGluZyBleGlzdGluZyBwcm9wZXJ0aWVzIGluIHRoZSBzZWxlY3Rpb24gdmFyaWFudC4gVGhlIG5ldyBzZWxlY3Rpb24gdmFyaWFudCBkb2VzIG5vdCBjb250YWluIGFueSBwYXJhbWV0ZXJzLiBBbGwgcGFyYW1ldGVycyBhcmVcblx0ICogbWVyZ2VkIGludG8gc2VsZWN0IG9wdGlvbnMuIFRoZSBvdXRwdXQgb2YgdGhpcyBmdW5jdGlvbiwgY29udmVydGVkIHRvIGEgSlNPTiBzdHJpbmcsIGNhbiBiZSB1c2VkIGZvciB0aGVcblx0ICoge0BsaW5rICMubmF2aWdhdGUgTmF2aWdhdGlvbkhhbmRsZXIubmF2aWdhdGV9IG1ldGhvZC5cblx0ICogQHBhcmFtIHZTZW1hbnRpY0F0dHJpYnV0ZXMgT2JqZWN0LyhBcnJheSBvZiBPYmplY3RzKSBjb250YWluaW5nIGtleS92YWx1ZSBwYWlyc1xuXHQgKiBAcGFyYW0gc1NlbGVjdGlvblZhcmlhbnQgVGhlIHNlbGVjdGlvbiB2YXJpYW50IGluIHN0cmluZyBmb3JtYXQgYXMgcHJvdmlkZWQgYnkgdGhlIFNtYXJ0RmlsdGVyQmFyIGNvbnRyb2xcblx0ICogQHBhcmFtIGlTdXBwcmVzc2lvbkJlaGF2aW9yIEluZGljYXRlcyB3aGV0aGVyIHNlbWFudGljXG5cdCAqICAgICAgICBhdHRyaWJ1dGVzIHdpdGggc3BlY2lhbCB2YWx1ZXMgKHNlZSB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uU3VwcHJlc3Npb25CZWhhdmlvciBzdXBwcmVzc2lvbiBiZWhhdmlvcn0pIG11c3QgYmVcblx0ICogICAgICAgIHN1cHByZXNzZWQgYmVmb3JlIHRoZXkgYXJlIGNvbWJpbmVkIHdpdGggdGhlIHNlbGVjdGlvbiB2YXJpYW50OyBzZXZlcmFsXG5cdCAqICAgICAgICB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uU3VwcHJlc3Npb25CZWhhdmlvciBzdXBwcmVzc2lvbiBiZWhhdmlvcnN9IGNhbiBiZSBjb21iaW5lZCB3aXRoIHRoZSBiaXR3aXNlIE9SIG9wZXJhdG9yXG5cdCAqICAgICAgICAofClcblx0ICogQHJldHVybnMgSW5zdGFuY2Ugb2Yge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLlNlbGVjdGlvblZhcmlhbnR9XG5cdCAqIEBwdWJsaWNcblx0ICogQGV4YW1wbGUgPGNvZGU+XG5cdCAqIHNhcC51aS5kZWZpbmUoW1wic2FwL2ZlL25hdmlnYXRpb24vTmF2aWdhdGlvbkhhbmRsZXJcIiwgXCJzYXAvZmUvbmF2aWdhdGlvbi9TZWxlY3Rpb25WYXJpYW50XCJdLCBmdW5jdGlvbiAoTmF2aWdhdGlvbkhhbmRsZXIsIFNlbGVjdGlvblZhcmlhbnQpIHtcblx0ICogXHR2YXIgdlNlbWFudGljQXR0cmlidXRlcyA9IHsgXCJDdXN0b21lclwiIDogXCJDMDAwMVwiIH07XG5cdCAqIFx0b3Jcblx0ICogXHR2YXIgdlNlbWFudGljQXR0cmlidXRlcyA9IFt7IFwiQ3VzdG9tZXJcIiA6IFwiQzAwMDFcIiB9LHsgXCJDdXN0b21lclwiIDogXCJDMDAwMlwiIH1dO1xuXHQgKiBcdHZhciBzU2VsZWN0aW9uVmFyaWFudCA9IG9TbWFydEZpbHRlckJhci5nZXREYXRhU3VpdGVGb3JtYXQoKTtcblx0ICogXHR2YXIgb05hdmlnYXRpb25IYW5kbGVyID0gbmV3IE5hdmlnYXRpb25IYW5kbGVyKG9Db250cm9sbGVyKTtcblx0ICogXHR2YXIgc05hdmlnYXRpb25TZWxlY3Rpb25WYXJpYW50ID0gb05hdmlnYXRpb25IYW5kbGVyLm1peEF0dHJpYnV0ZXNBbmRTZWxlY3Rpb25WYXJpYW50KHZTZW1hbnRpY0F0dHJpYnV0ZXMsIHNTZWxlY3Rpb25WYXJpYW50KS50b0pTT05TdHJpbmcoKTtcblx0ICogXHQvLyBJbiBjYXNlIG9mIGFuIHZTZW1hbnRpY0F0dHJpYnV0ZXMgYmVpbmcgYW4gYXJyYXksIHRoZSBzZW1hbnRpY0F0dHJpYnV0ZXMgYXJlIG1lcmdlZCB0byBhIHNpbmdsZSBTViBhbmQgY29tcGFyZWQgYWdhaW5zdCB0aGUgc1NlbGVjdGlvblZhcmlhbnQoc2Vjb25kIGFncnVtZW50KS5cblx0ICogXHQvLyBPcHRpb25hbGx5LCB5b3UgY2FuIHNwZWNpZnkgb25lIG9yIHNldmVyYWwgc3VwcHJlc3Npb24gYmVoYXZpb3JzLiBTZXZlcmFsIHN1cHByZXNzaW9uIGJlaGF2aW9ycyBhcmUgY29tYmluZWQgd2l0aCB0aGUgYml0d2lzZSBPUiBvcGVyYXRvciwgZS5nLlxuXHQgKiBcdC8vIHZhciBpU3VwcHJlc3Npb25CZWhhdmlvciA9IHNhcC5mZS5uYXZpZ2F0aW9uLlN1cHByZXNzaW9uQmVoYXZpb3IucmFpc2VFcnJvck9uTnVsbCB8IHNhcC5mZS5uYXZpZ2F0aW9uLlN1cHByZXNzaW9uQmVoYXZpb3IucmFpc2VFcnJvck9uVW5kZWZpbmVkO1xuXHQgKiBcdC8vIHZhciBzTmF2aWdhdGlvblNlbGVjdGlvblZhcmlhbnQgPSBvTmF2aWdhdGlvbkhhbmRsZXIubWl4QXR0cmlidXRlc0FuZFNlbGVjdGlvblZhcmlhbnQobVNlbWFudGljQXR0cmlidXRlcywgc1NlbGVjdGlvblZhcmlhbnQsIGlTdXBwcmVzc2lvbkJlaGF2aW9yKS50b0pTT05TdHJpbmcoKTtcblx0ICpcblx0ICogXHRvTmF2aWdhdGlvbkhhbmRsZXIubmF2aWdhdGUoXCJTYWxlc09yZGVyXCIsIFwiY3JlYXRlXCIsIHNOYXZpZ2F0aW9uU2VsZWN0aW9uVmFyaWFudCk7XG5cdCAqIH0pO1xuXHQgKiA8L2NvZGU+XG5cdCAqL1xuXHRtaXhBdHRyaWJ1dGVzQW5kU2VsZWN0aW9uVmFyaWFudChcblx0XHR2U2VtYW50aWNBdHRyaWJ1dGVzOiBvYmplY3QgfCBhbnlbXSxcblx0XHRzU2VsZWN0aW9uVmFyaWFudDogc3RyaW5nIHwgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQsXG5cdFx0aVN1cHByZXNzaW9uQmVoYXZpb3I6IG51bWJlciA9IFN1cHByZXNzaW9uQmVoYXZpb3Iuc3RhbmRhcmRcblx0KTogU2VsZWN0aW9uVmFyaWFudCB7XG5cdFx0Y29uc3Qgb1NlbGVjdGlvblZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudChzU2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0Y29uc3Qgb05ld1NlbFZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudCgpO1xuXHRcdGNvbnN0IG9OYXZIYW5kbGVyID0gdGhpcztcblxuXHRcdGNvbnN0IGZpbHRlclVybCA9IG9TZWxlY3Rpb25WYXJpYW50LmdldEZpbHRlckNvbnRleHRVcmwoKTtcblx0XHRpZiAoZmlsdGVyVXJsKSB7XG5cdFx0XHRvTmV3U2VsVmFyaWFudC5zZXRGaWx0ZXJDb250ZXh0VXJsKGZpbHRlclVybCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29udGV4dFVybCA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFBhcmFtZXRlckNvbnRleHRVcmwoKTtcblx0XHRpZiAoY29udGV4dFVybCkge1xuXHRcdFx0b05ld1NlbFZhcmlhbnQuc2V0UGFyYW1ldGVyQ29udGV4dFVybChjb250ZXh0VXJsKTtcblx0XHR9XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodlNlbWFudGljQXR0cmlidXRlcykpIHtcblx0XHRcdHZTZW1hbnRpY0F0dHJpYnV0ZXMuZm9yRWFjaChmdW5jdGlvbiAobVNlbWFudGljQXR0cmlidXRlczogYW55KSB7XG5cdFx0XHRcdG9OYXZIYW5kbGVyLl9taXhBdHRyaWJ1dGVzVG9TZWxWYXJpYW50KG1TZW1hbnRpY0F0dHJpYnV0ZXMsIG9OZXdTZWxWYXJpYW50LCBpU3VwcHJlc3Npb25CZWhhdmlvcik7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5fbWl4QXR0cmlidXRlc1RvU2VsVmFyaWFudCh2U2VtYW50aWNBdHRyaWJ1dGVzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBvTmV3U2VsVmFyaWFudCwgaVN1cHByZXNzaW9uQmVoYXZpb3IpO1xuXHRcdH1cblxuXHRcdC8vIGFkZCBwYXJhbWV0ZXJzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBvTmV3U2VsVmFyaWFudCB5ZXRcblx0XHRjb25zdCBhUGFyYW1ldGVycyA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFBhcmFtZXRlck5hbWVzKCk7XG5cdFx0bGV0IGk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGFQYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoIW9OZXdTZWxWYXJpYW50LmdldFNlbGVjdE9wdGlvbihhUGFyYW1ldGVyc1tpXSkpIHtcblx0XHRcdFx0b05ld1NlbFZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKGFQYXJhbWV0ZXJzW2ldLCBcIklcIiwgXCJFUVwiLCBvU2VsZWN0aW9uVmFyaWFudC5nZXRQYXJhbWV0ZXIoYVBhcmFtZXRlcnNbaV0pKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBhZGQgc2VsT3B0aW9ucyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgb05ld1NlbFZhcmlhbnQgeWV0XG5cdFx0Y29uc3QgYVNlbE9wdGlvbk5hbWVzID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMoKTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgYVNlbE9wdGlvbk5hbWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHQvLyBhZGQgc2VsT3B0aW9ucyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgb05ld1NlbFZhcmlhbnQgeWV0XG5cdFx0XHRjb25zdCBhU2VsZWN0T3B0aW9uOiBhbnlbXSA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFNlbGVjdE9wdGlvbihhU2VsT3B0aW9uTmFtZXNbaV0pITtcblx0XHRcdGlmICghb05ld1NlbFZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uKGFTZWxPcHRpb25OYW1lc1tpXSkpIHtcblx0XHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBhU2VsZWN0T3B0aW9uLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0b05ld1NlbFZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKFxuXHRcdFx0XHRcdFx0YVNlbE9wdGlvbk5hbWVzW2ldLFxuXHRcdFx0XHRcdFx0YVNlbGVjdE9wdGlvbltqXS5TaWduLFxuXHRcdFx0XHRcdFx0YVNlbGVjdE9wdGlvbltqXS5PcHRpb24sXG5cdFx0XHRcdFx0XHRhU2VsZWN0T3B0aW9uW2pdLkxvdyxcblx0XHRcdFx0XHRcdGFTZWxlY3RPcHRpb25bal0uSGlnaFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb05ld1NlbFZhcmlhbnQ7XG5cdH1cblxuXHRfZW5zdXJlU2VsZWN0aW9uVmFyaWFudEZvcm1hdFN0cmluZyh2U2VsZWN0aW9uVmFyaWFudDogdW5rbm93bik6IHVua25vd24ge1xuXHRcdC8qXG5cdFx0ICogVGhlcmUgYXJlIGxlZ2FjeSBBcHBTdGF0ZXMgd2hlcmUgdGhlIFNlbGVjdGlvblZhcmlhbnQgaXMgYmVpbmcgc3RvcmVkIGFzIGEgc3RyaW5nLiBIb3dldmVyLCB0aGF0IGlzIG5vdCBjb21wbGlhbnQgdG8gdGhlIHNwZWNpZmljYXRpb24sXG5cdFx0ICogd2hpY2ggc3RhdGVzIHRoYXQgYSBzdGFuZGFyZCBKUyBvYmplY3Qgc2hhbGwgYmUgcHJvdmlkZWQuIEludGVybmFsbHksIGhvd2V2ZXIsIHRoZSBzZWxlY3Rpb25WYXJpYW50IGlzIGFsd2F5cyBvZiB0eXBlIHN0cmluZy4gU2l0dWF0aW9uXG5cdFx0ICogUGVyc2lzdGVuY3kgaW50ZXJuYWwgQVBJIC0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBsZWdhY3kgc3RyaW5nIHN0cmluZyBuZXcgYXBwcm9hY2ggKEpTT04pIG9iamVjdFxuXHRcdCAqIHN0cmluZ1xuXHRcdCAqL1xuXG5cdFx0aWYgKHZTZWxlY3Rpb25WYXJpYW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0bGV0IHZDb252ZXJ0ZWRTZWxlY3Rpb25WYXJpYW50ID0gdlNlbGVjdGlvblZhcmlhbnQ7XG5cblx0XHRpZiAodHlwZW9mIHZTZWxlY3Rpb25WYXJpYW50ID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHR2Q29udmVydGVkU2VsZWN0aW9uVmFyaWFudCA9IEpTT04uc3RyaW5naWZ5KHZTZWxlY3Rpb25WYXJpYW50KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdkNvbnZlcnRlZFNlbGVjdGlvblZhcmlhbnQ7XG5cdH1cblxuXHRfZm5IYW5kbGVBcHBTdGF0ZVByb21pc2Uob1JldHVybjogU2hlbGxBcHBTdGF0ZVJldHVybiwgZm5PbkFmdGVyU2F2ZT86IEZ1bmN0aW9uLCBmbk9uRXJyb3I/OiBGdW5jdGlvbik6IHZvaWQge1xuXHRcdG9SZXR1cm4ucHJvbWlzZS5kb25lKGZ1bmN0aW9uICgpIHtcblx0XHRcdGlmIChmbk9uQWZ0ZXJTYXZlKSB7XG5cdFx0XHRcdGZuT25BZnRlclNhdmUob1JldHVybi5hcHBTdGF0ZUtleSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRpZiAoZm5PbkVycm9yKSB7XG5cdFx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXM7XG5cdFx0XHRvUmV0dXJuLnByb21pc2UuZmFpbChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGNvbnN0IG9FcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLkFwcFN0YXRlU2F2ZS5mYWlsZWRcIik7XG5cdFx0XHRcdGZuT25FcnJvcihvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgX3NhdmVBcHBTdGF0ZUFzeW5jKG9BcHBEYXRhOiBJbm5lckFwcERhdGEsIGZuT25BZnRlclNhdmU6IEZ1bmN0aW9uLCBmbk9uRXJyb3I6IEZ1bmN0aW9uKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcblx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXM7XG5cdFx0cmV0dXJuIHRoaXMuX2ZuU2F2ZUFwcFN0YXRlQXN5bmMob0FwcERhdGEsIGZuT25FcnJvcikudGhlbihmdW5jdGlvbiAoXG5cdFx0XHRvUmV0dXJuOiBTaGVsbEFwcFN0YXRlUmV0dXJuIHwgdW5kZWZpbmVkIHwgdm9pZFxuXHRcdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0XHRpZiAob1JldHVybikge1xuXHRcdFx0XHRvTmF2SGFuZGxlci5fZm5IYW5kbGVBcHBTdGF0ZVByb21pc2Uob1JldHVybiwgZm5PbkFmdGVyU2F2ZSwgZm5PbkVycm9yKTtcblx0XHRcdFx0cmV0dXJuIG9SZXR1cm4uYXBwU3RhdGVLZXk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fSk7XG5cdH1cblxuXHRfc2F2ZUFwcFN0YXRlKG9BcHBEYXRhOiBJbm5lckFwcERhdGEsIGZuT25BZnRlclNhdmU6IEZ1bmN0aW9uLCBmbk9uRXJyb3I6IEZ1bmN0aW9uKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvUmV0dXJuID0gdGhpcy5fc2F2ZUFwcFN0YXRlV2l0aEltbWVkaWF0ZVJldHVybihvQXBwRGF0YSwgZm5PbkVycm9yKTtcblx0XHRpZiAob1JldHVybikge1xuXHRcdFx0dGhpcy5fZm5IYW5kbGVBcHBTdGF0ZVByb21pc2Uob1JldHVybiwgZm5PbkFmdGVyU2F2ZSwgZm5PbkVycm9yKTtcblx0XHRcdHJldHVybiBvUmV0dXJuLmFwcFN0YXRlS2V5O1xuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRfZm5TYXZlQXBwU3RhdGVXaXRoSW1tZWRpYXRlUmV0dXJuKFxuXHRcdG9BcHBEYXRhOiBJbm5lckFwcERhdGEsXG5cdFx0b0FwcFN0YXRlOiBTaGVsbEFwcFN0YXRlLFxuXHRcdGZuT25FcnJvcj86IEZ1bmN0aW9uXG5cdCk6IHsgYXBwU3RhdGVLZXk6IHN0cmluZzsgcHJvbWlzZTogSlF1ZXJ5LlByb21pc2U8c3RyaW5nPiB9IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBzQXBwU3RhdGVLZXkgPSBvQXBwU3RhdGUuZ2V0S2V5KCk7XG5cdFx0Y29uc3Qgb0FwcERhdGFGb3JTYXZlID0gdGhpcy5fZmV0Y2hBcHBEYXRhRm9yU2F2ZShvQXBwRGF0YSwgZm5PbkVycm9yKTtcblx0XHRpZiAoIW9BcHBEYXRhRm9yU2F2ZSkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0b0FwcFN0YXRlLnNldERhdGEob0FwcERhdGFGb3JTYXZlKTtcblx0XHRjb25zdCBvU2F2ZVByb21pc2UgPSBvQXBwU3RhdGUuc2F2ZSgpO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGFwcFN0YXRlS2V5OiBzQXBwU3RhdGVLZXksXG5cdFx0XHRwcm9taXNlOiBvU2F2ZVByb21pc2UucHJvbWlzZSgpXG5cdFx0fTtcblx0fVxuXG5cdF9mZXRjaEFwcERhdGFGb3JTYXZlKG9BcHBEYXRhOiBJbm5lckFwcERhdGEsIGZuT25FcnJvcjogYW55KTogSW5uZXJBcHBEYXRhIHwgdW5kZWZpbmVkIHtcblx0XHRsZXQgb0FwcERhdGFGb3JTYXZlOiBQYXJ0aWFsPElubmVyQXBwRGF0YT4gPSB7fTtcblxuXHRcdGlmIChvQXBwRGF0YS5oYXNPd25Qcm9wZXJ0eShcInNlbGVjdGlvblZhcmlhbnRcIikpIHtcblx0XHRcdG9BcHBEYXRhRm9yU2F2ZS5zZWxlY3Rpb25WYXJpYW50ID0gb0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudDtcblxuXHRcdFx0aWYgKG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRcdFx0Lypcblx0XHRcdFx0ICogVGhlIHNwZWNpZmljYXRpb24gc3RhdGVzIHRoYXQgU2VsZWN0aW9uIFZhcmlhbnRzIG5lZWQgdG8gYmUgSlNPTiBvYmplY3RzLiBIb3dldmVyLCBpbnRlcm5hbGx5LCB3ZSB3b3JrIHdpdGggc3RyaW5ncyBmb3Jcblx0XHRcdFx0ICogXCJzZWxlY3Rpb25WYXJpYW50XCIuIFRoZXJlZm9yZSwgaW4gY2FzZSB0aGF0IHRoaXMgaXMgYSBzdHJpbmcsIHdlIG5lZWQgdG8gSlNPTi1wYXJzZSB0aGUgZGF0YS5cblx0XHRcdFx0ICovXG5cdFx0XHRcdGlmICh0eXBlb2Ygb0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRvQXBwRGF0YUZvclNhdmUuc2VsZWN0aW9uVmFyaWFudCA9IEpTT04ucGFyc2Uob0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoeCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0Vycm9yID0gdGhpcy5fY3JlYXRlVGVjaG5pY2FsRXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5BcHBTdGF0ZVNhdmUucGFyc2VFcnJvclwiKTtcblx0XHRcdFx0XHRcdGlmIChmbk9uRXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0Zm5PbkVycm9yKG9FcnJvcik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9zTW9kZSA9PT0gTW9kZS5PRGF0YVYyKSB7XG5cdFx0XHRvQXBwRGF0YUZvclNhdmUgPSBleHRlbmQoXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRzZWxlY3Rpb25WYXJpYW50OiB7fSxcblx0XHRcdFx0XHR0YWJsZVZhcmlhbnRJZDogXCJcIixcblx0XHRcdFx0XHRjdXN0b21EYXRhOiB7fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRvQXBwRGF0YUZvclNhdmVcblx0XHRcdCkgYXMgSW5uZXJBcHBEYXRhO1xuXG5cdFx0XHRpZiAob0FwcERhdGEudGFibGVWYXJpYW50SWQpIHtcblx0XHRcdFx0b0FwcERhdGFGb3JTYXZlLnRhYmxlVmFyaWFudElkID0gb0FwcERhdGEudGFibGVWYXJpYW50SWQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0FwcERhdGEuY3VzdG9tRGF0YSkge1xuXHRcdFx0XHRvQXBwRGF0YUZvclNhdmUuY3VzdG9tRGF0YSA9IG9BcHBEYXRhLmN1c3RvbURhdGE7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0FwcERhdGEucHJlc2VudGF0aW9uVmFyaWFudCkge1xuXHRcdFx0XHRvQXBwRGF0YUZvclNhdmUucHJlc2VudGF0aW9uVmFyaWFudCA9IG9BcHBEYXRhLnByZXNlbnRhdGlvblZhcmlhbnQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0FwcERhdGEudmFsdWVUZXh0cykge1xuXHRcdFx0XHRvQXBwRGF0YUZvclNhdmUudmFsdWVUZXh0cyA9IG9BcHBEYXRhLnZhbHVlVGV4dHM7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0FwcERhdGEuc2VtYW50aWNEYXRlcykge1xuXHRcdFx0XHRvQXBwRGF0YUZvclNhdmUuc2VtYW50aWNEYXRlcyA9IG9BcHBEYXRhLnNlbWFudGljRGF0ZXM7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG9BcHBEYXRhQ2xvbmUgPSBPYmplY3QuYXNzaWduKHt9LCBvQXBwRGF0YSk7XG5cdFx0XHRvQXBwRGF0YUZvclNhdmUgPSBtZXJnZShvQXBwRGF0YUNsb25lLCBvQXBwRGF0YUZvclNhdmUpO1xuXHRcdH1cblx0XHRvQXBwRGF0YUZvclNhdmUgPSB0aGlzLl9jaGVja0lzUG90ZW50aWFsbHlTZW5zaXRpdmUob0FwcERhdGFGb3JTYXZlKSBhcyBJbm5lckFwcERhdGE7XG5cdFx0cmV0dXJuIG9BcHBEYXRhRm9yU2F2ZSBhcyBJbm5lckFwcERhdGE7XG5cdH1cblxuXHRhc3luYyBfZm5TYXZlQXBwU3RhdGVBc3luYyhvQXBwRGF0YTogYW55LCBmbk9uRXJyb3I/OiBhbnkpOiBQcm9taXNlPFNoZWxsQXBwU3RhdGVSZXR1cm4gfCB1bmRlZmluZWQgfCB2b2lkPiB7XG5cdFx0Y29uc3Qgb05hdkhhbmRsZXIgPSB0aGlzO1xuXHRcdHJldHVybiB0aGlzLl9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZUFzeW5jKClcblx0XHRcdC50aGVuKGFzeW5jIGZ1bmN0aW9uIChvQ3Jvc3NBcHBOYXZTZXJ2aWNlOiBOYXZpZ2F0aW9uKTogUHJvbWlzZTxTaGVsbEFwcFN0YXRlPiB7XG5cdFx0XHRcdHJldHVybiBvQ3Jvc3NBcHBOYXZTZXJ2aWNlLmNyZWF0ZUVtcHR5QXBwU3RhdGUob05hdkhhbmRsZXIub0NvbXBvbmVudCk7XG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9BcHBTdGF0ZTogU2hlbGxBcHBTdGF0ZSkge1xuXHRcdFx0XHRyZXR1cm4gb05hdkhhbmRsZXIuX2ZuU2F2ZUFwcFN0YXRlV2l0aEltbWVkaWF0ZVJldHVybihvQXBwRGF0YSwgb0FwcFN0YXRlLCBmbk9uRXJyb3IpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yKSB7XG5cdFx0XHRcdGlmIChmbk9uRXJyb3IpIHtcblx0XHRcdFx0XHRmbk9uRXJyb3Iob0Vycm9yKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH1cblxuXHRfc2F2ZUFwcFN0YXRlV2l0aEltbWVkaWF0ZVJldHVybihvQXBwRGF0YTogSW5uZXJBcHBEYXRhLCBmbk9uRXJyb3I/OiBGdW5jdGlvbik6IFNoZWxsQXBwU3RhdGVSZXR1cm4gfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG9BcHBTdGF0ZSA9IHRoaXMuX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlKCkuY3JlYXRlRW1wdHlBcHBTdGF0ZSh0aGlzLm9Db21wb25lbnQpO1xuXHRcdHJldHVybiB0aGlzLl9mblNhdmVBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4ob0FwcERhdGEsIG9BcHBTdGF0ZSwgZm5PbkVycm9yKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIGxvYWRlZCBJQXBwIFN0YXRlIGFuZCBuYXZpZ2F0aW9uIHR5cGUgb25jZSByZXNvbHZlZC5cblx0ICogQHBhcmFtIHNBcHBTdGF0ZUtleSBUaGUgSUFwcFN0YXRlS2V5IHRvIHJldHJpZXZlIHRoZSBBcHBTdGF0ZSBkYXRhLlxuXHQgKiBAcGFyYW0gb0RlZmVycmVkIEpxdWVyeSBkZWZlcnJlZCBvYmplY3QgdG8gcmVzb2x2ZSB0aGUgQXBwU3RhdGUgZGF0YS5cblx0ICogQHBhcmFtIG5hdlR5cGUgTmF2aWdhdGlvbiB0eXBlIGZvciB3aGljaCBBcHBTdGF0ZSBpcyByZXRyaWV2ZWQuXG5cdCAqIEByZXR1cm5zIFRoZSBkZWZlcnJlZCBvYmplY3Qgd2hpY2ggaXMgcmVzb2x2ZWQgd2l0aCBsb2FkZWQgYXBwIHN0YXRlIGRhdGFcblx0IGFuZCBuYXZpZ2F0aW9uIHR5cGUuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfbG9hZEFwcFN0YXRlKHNBcHBTdGF0ZUtleTogc3RyaW5nLCBvRGVmZXJyZWQ6IEpRdWVyeS5EZWZlcnJlZDx1bmtub3duPiwgbmF2VHlwZTogc3RyaW5nKTogSlF1ZXJ5LkRlZmVycmVkPHVua25vd24+IHtcblx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXM7XG5cdFx0dGhpcy5fZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2VBc3luYygpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob0Nyb3NzQXBwTmF2U2VydmljZTogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvQ3Jvc3NBcHBOYXZTZXJ2aWNlLmdldEFwcFN0YXRlKG9OYXZIYW5kbGVyLm9Db21wb25lbnQsIHNBcHBTdGF0ZUtleSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Y29uc3Qgb0Vycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlQXN5bmMuZmFpbGVkXCIpO1xuXHRcdFx0XHRvRGVmZXJyZWQucmVqZWN0KG9FcnJvciwge30sIG5hdlR5cGUpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvQXBwU3RhdGU6IGFueSkge1xuXHRcdFx0XHRsZXQgb0FwcERhdGE6IGFueSA9IHt9O1xuXHRcdFx0XHRjb25zdCBvQXBwRGF0YUxvYWRlZCA9IG9BcHBTdGF0ZS5nZXREYXRhKCk7XG5cblx0XHRcdFx0aWYgKHR5cGVvZiBvQXBwRGF0YUxvYWRlZCA9PT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdFx0XHRcdGNvbnN0IG9FcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLmdldERhdGFGcm9tQXBwU3RhdGUuZmFpbGVkXCIpO1xuXHRcdFx0XHRcdG9EZWZlcnJlZC5yZWplY3Qob0Vycm9yLCB7fSwgbmF2VHlwZSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAob05hdkhhbmRsZXIuX3NNb2RlID09PSBNb2RlLk9EYXRhVjIpIHtcblx0XHRcdFx0XHRvQXBwRGF0YSA9IHtcblx0XHRcdFx0XHRcdHNlbGVjdGlvblZhcmlhbnQ6IFwie31cIixcblx0XHRcdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50OiBuZXcgU2VsZWN0aW9uVmFyaWFudCgpLFxuXHRcdFx0XHRcdFx0b0RlZmF1bHRlZFNlbGVjdGlvblZhcmlhbnQ6IG5ldyBTZWxlY3Rpb25WYXJpYW50KCksXG5cdFx0XHRcdFx0XHRiTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5OiBmYWxzZSxcblx0XHRcdFx0XHRcdHRhYmxlVmFyaWFudElkOiBcIlwiLFxuXHRcdFx0XHRcdFx0Y3VzdG9tRGF0YToge30sXG5cdFx0XHRcdFx0XHRhcHBTdGF0ZUtleTogc0FwcFN0YXRlS2V5LFxuXHRcdFx0XHRcdFx0cHJlc2VudGF0aW9uVmFyaWFudDoge30sXG5cdFx0XHRcdFx0XHR2YWx1ZVRleHRzOiB7fSxcblx0XHRcdFx0XHRcdHNlbWFudGljRGF0ZXM6IHt9LFxuXHRcdFx0XHRcdFx0ZGF0YToge31cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGlmIChvQXBwRGF0YUxvYWRlZC5zZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0XHRcdFx0XHQvKlxuXHRcdFx0XHRcdFx0ICogSW4gY2FzZSB0aGF0IHdlIGdldCBhbiBvYmplY3QgZnJvbSB0aGUgc3RvcmVkIEFwcERhdGEgKD1wZXJzaXN0ZW5jeSksIHdlIG5lZWQgdG8gc3RyaW5naWZ5IHRoZSBKU09OIG9iamVjdC5cblx0XHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdFx0b0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudCA9IG9OYXZIYW5kbGVyLl9lbnN1cmVTZWxlY3Rpb25WYXJpYW50Rm9ybWF0U3RyaW5nKG9BcHBEYXRhTG9hZGVkLnNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdFx0XHRcdFx0b0FwcERhdGEub1NlbGVjdGlvblZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudChvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG9BcHBEYXRhTG9hZGVkLnRhYmxlVmFyaWFudElkKSB7XG5cdFx0XHRcdFx0XHRvQXBwRGF0YS50YWJsZVZhcmlhbnRJZCA9IG9BcHBEYXRhTG9hZGVkLnRhYmxlVmFyaWFudElkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAob0FwcERhdGFMb2FkZWQuY3VzdG9tRGF0YSkge1xuXHRcdFx0XHRcdFx0b0FwcERhdGEuY3VzdG9tRGF0YSA9IG9BcHBEYXRhTG9hZGVkLmN1c3RvbURhdGE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChvQXBwRGF0YUxvYWRlZC5wcmVzZW50YXRpb25WYXJpYW50KSB7XG5cdFx0XHRcdFx0XHRvQXBwRGF0YS5wcmVzZW50YXRpb25WYXJpYW50ID0gb0FwcERhdGFMb2FkZWQucHJlc2VudGF0aW9uVmFyaWFudDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG9BcHBEYXRhTG9hZGVkLnZhbHVlVGV4dHMpIHtcblx0XHRcdFx0XHRcdG9BcHBEYXRhLnZhbHVlVGV4dHMgPSBvQXBwRGF0YUxvYWRlZC52YWx1ZVRleHRzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAob0FwcERhdGFMb2FkZWQuc2VtYW50aWNEYXRlcykge1xuXHRcdFx0XHRcdFx0b0FwcERhdGEuc2VtYW50aWNEYXRlcyA9IG9BcHBEYXRhTG9hZGVkLnNlbWFudGljRGF0ZXM7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8qIEluIFYyIGNhc2UsIHdlIG5lZWQgdGhlIGRhdGEgaW4gdGhlIGJlbG93IGZvcm1hdCBmb3IgaHlicmlkIGNhc2UgKi9cblx0XHRcdFx0XHRpZiAobmF2VHlwZSA9PT0gTmF2VHlwZS5oeWJyaWQpIHtcblx0XHRcdFx0XHRcdG9BcHBEYXRhLmRhdGEgPSBvQXBwRGF0YUxvYWRlZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b0FwcERhdGEgPSBtZXJnZShvQXBwRGF0YSwgb0FwcERhdGFMb2FkZWQpO1xuXHRcdFx0XHRcdGlmIChvQXBwRGF0YUxvYWRlZC5zZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0XHRcdFx0XHQvKlxuXHRcdFx0XHRcdFx0ICogSW4gY2FzZSB0aGF0IHdlIGdldCBhbiBvYmplY3QgZnJvbSB0aGUgc3RvcmVkIEFwcERhdGEgKD1wZXJzaXN0ZW5jeSksIHdlIG5lZWQgdG8gc3RyaW5naWZ5IHRoZSBKU09OIG9iamVjdC5cblx0XHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdFx0b0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudCA9IG9OYXZIYW5kbGVyLl9lbnN1cmVTZWxlY3Rpb25WYXJpYW50Rm9ybWF0U3RyaW5nKG9BcHBEYXRhTG9hZGVkLnNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdFx0XHRcdFx0b0FwcERhdGEub1NlbGVjdGlvblZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudChvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyByZXNvbHZlIGlzIGNhbGxlZCBvbiBwYXNzZWQgRGVmZXJyZWQgb2JqZWN0IHRvIHRyaWdnZXIgYSBjYWxsIG9mIHRoZSBkb25lIG1ldGhvZCwgaWYgaW1wbGVtZW50ZWRcblx0XHRcdFx0Ly8gdGhlIGRvbmUgbWV0aG9kIHdpbGwgcmVjZWl2ZSB0aGUgbG9hZGVkIGFwcFN0YXRlIGFuZCB0aGUgbmF2aWdhdGlvbiB0eXBlIGFzIHBhcmFtZXRlcnNcblx0XHRcdFx0b0RlZmVycmVkLnJlc29sdmUob0FwcERhdGEsIHt9LCBuYXZUeXBlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGNvbnN0IG9FcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLmdldEFwcFN0YXRlLmZhaWxlZFwiKTtcblx0XHRcdFx0b0RlZmVycmVkLnJlamVjdChvRXJyb3IsIHt9LCBuYXZUeXBlKTtcblx0XHRcdH0pO1xuXG5cdFx0cmV0dXJuIG9EZWZlcnJlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHBhcmFtZXRlciB2YWx1ZSBvZiB0aGUgc2FwLWlhcHAtc3RhdGUgKHRoZSBpbnRlcm5hbCBhcHBzKSBmcm9tIHRoZSBBcHBIYXNoIHN0cmluZy4gSXQgYXV0b21hdGljYWxseSB0YWtlcyBjYXJlIGFib3V0XG5cdCAqIGNvbXBhdGliaWxpdHkgYmV0d2VlbiB0aGUgb2xkIGFuZCB0aGUgbmV3IGFwcHJvYWNoIG9mIHRoZSBzYXAtaWFwcC1zdGF0ZS4gUHJlY2VkZW5jZSBpcyB0aGF0IHRoZSBuZXcgYXBwcm9hY2ggaXMgZmF2b3VyZWQgYWdhaW5zdCB0aGUgb2xkXG5cdCAqIGFwcHJvYWNoLlxuXHQgKiBAcGFyYW0gc0FwcEhhc2ggVGhlIEFwcEhhc2gsIHdoaWNoIG1heSBjb250YWluIGEgc2FwLWlhcHAtc3RhdGUgcGFyYW1ldGVyIChib3RoIG9sZCBhbmQvb3IgbmV3IGFwcHJvYWNoKVxuXHQgKiBAcmV0dXJucyBUaGUgdmFsdWUgb2Ygc2FwLWlhcHAtc3RhdGUgKGkuZS4gdGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciB0byByZXRyaWV2ZSB0aGUgcGFyYW1ldGVycyksIG9yIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gaW5cblx0ICogICAgICAgICBjYXNlIHRoYXQgbm8gc2FwLWlhcHAtc3RhdGUgd2FzIGZvdW5kIGluIDxjb2RlPnNBcHBIYXNoPC9jb2RlPi5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9nZXRJbm5lckFwcFN0YXRlS2V5KHNBcHBIYXNoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdC8vIHRyaXZpYWwgY2FzZTogbm8gYXBwIGhhc2ggYXZhaWxhYmxlIGF0IGFsbC5cblx0XHRpZiAoIXNBcHBIYXNoKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8qIG5ldyBhcHByb2FjaDogc2VwYXJhdGVkIHZpYSBxdWVzdGlvbiBtYXJrIC8gcGFydCBvZiB0aGUgcXVlcnkgcGFyYW1ldGVyIG9mIHRoZSBBcHBIYXNoICovXG5cdFx0bGV0IGFNYXRjaGVzID0gdGhpcy5fcklBcHBTdGF0ZU5ldy5leGVjKHNBcHBIYXNoKTtcblxuXHRcdC8qIG9sZCBhcHByb2FjaDogc3BlYXJhdGVkIHZpYSBzbGFzaGVzIC8gaS5lLiBwYXJ0IG9mIHRoZSByb3V0ZSBpdHNlbGYgKi9cblx0XHRpZiAoYU1hdGNoZXMgPT09IG51bGwpIHtcblx0XHRcdGFNYXRjaGVzID0gdGhpcy5fcklBcHBTdGF0ZU9sZC5leGVjKHNBcHBIYXNoKTtcblx0XHR9XG5cblx0XHQvKlxuXHRcdCAqIG9sZCBhcHByb2FjaDogc3BlY2lhbCBjYXNlOiBpZiB0aGVyZSBpcyBubyBkZWVwIHJvdXRlL2tleSBkZWZpbmVkLCB0aGUgc2FwLWlhcHAtc3RhdGUgbWF5IGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZywgd2l0aG91dFxuXHRcdCAqIGFueSBzZXBhcmF0aW9uIHdpdGggdGhlIHNsYXNoZXNcblx0XHQgKi9cblx0XHRpZiAoYU1hdGNoZXMgPT09IG51bGwpIHtcblx0XHRcdGFNYXRjaGVzID0gdGhpcy5fcklBcHBTdGF0ZU9sZEF0U3RhcnQuZXhlYyhzQXBwSGFzaCk7XG5cdFx0fVxuXG5cdFx0aWYgKGFNYXRjaGVzID09PSBudWxsKSB7XG5cdFx0XHQvLyB0aGVyZSBpcyBubyAodmFsaWQpIHNhcC1pYXBwLXN0YXRlIGluIHRoZSBBcHAgSGFzaFxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gYU1hdGNoZXNbMV07XG5cdH1cblxuXHQvKipcblx0ICogUmVwbGFjZXMgKG9yIGluc2VydHMpIGEgcGFyYW1ldGVyIHZhbHVlIChhbiBBcHBTdGF0ZUtleSkgZm9yIHRoZSBzYXAtaWFwcC1zdGF0ZSBpbnRvIGFuIGV4aXN0aW5nIEFwcEhhc2ggc3RyaW5nLiBPdGhlciByb3V0ZXMvcGFyYW1ldGVyc1xuXHQgKiBhcmUgaWdub3JlZCBhbmQgcmV0dXJuZWQgd2l0aG91dCBtb2RpZmljYXRpb24gKFwiZW52aXJvbm1lbnRhbCBhZ25vc3RpY1wiIHByb3BlcnR5KS4gT25seSB0aGUgbmV3IGFwcHJvYWNoIChzYXAtaWFwcC1zdGF0ZSBhcyBxdWVyeSBwYXJhbWV0ZXJcblx0ICogaW4gdGhlIEFwcEhhc2gpIGlzIGJlaW5nIGlzc3VlZC5cblx0ICogQHBhcmFtIHNBcHBIYXNoIFRoZSBBcHBIYXNoIGludG8gd2hpY2ggdGhlIHNhcC1pYXBwLXN0YXRlIHBhcmFtZXRlciBzaGFsbCBiZSBtYWRlIGF2YWlsYWJsZVxuXHQgKiBAcGFyYW0gc0FwcFN0YXRlS2V5IFRoZSBrZXkgdmFsdWUgb2YgdGhlIEFwcFN0YXRlIHdoaWNoIHNoYWxsIGJlIHN0b3JlZCBhcyBwYXJhbWV0ZXIgdmFsdWUgb2YgdGhlIHNhcC1pYXBwLXN0YXRlIHByb3BlcnR5LlxuXHQgKiBAcmV0dXJucyBUaGUgbW9kaWZpZWQgc0FwcEhhc2ggc3RyaW5nLCBzdWNoIHRoYXQgdGhlIHNhcC1pYXBwLXN0YXRlIGhhcyBiZWVuIHNldCBiYXNlZCBvbiB0aGUgbmV3IChxdWVyeSBvcHRpb24tYmFzZWQpXG5cdCAqICAgICAgICAgc2FwLWlhcHAtc3RhdGUuIElmIGEgc2FwLWlhcHAtc3RhdGUgaGFzIGJlZW4gc3BlY2lmaWVkIGJlZm9yZSwgdGhlIGtleSBpcyByZXBsYWNlZC4gSWYgPGNvZGU+c0FwcEhhc2g8L2NvZGU+IHdhcyBvZiB0aGUgb2xkXG5cdCAqICAgICAgICAgZm9ybWF0IChzYXAtaWFwcC1zdGF0ZSBhcyBwYXJ0IG9mIHRoZSBrZXlzL3JvdXRlKSwgdGhlIGZvcm1hdCBpcyBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBmb3JtYXQgYmVmb3JlIHRoZSByZXN1bHQgaXMgcmV0dXJuZWQuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfcmVwbGFjZUlubmVyQXBwU3RhdGVLZXkoc0FwcEhhc2g6IHN0cmluZywgc0FwcFN0YXRlS2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IHNOZXdJQXBwU3RhdGUgPSBJQVBQX1NUQVRFICsgXCI9XCIgKyBzQXBwU3RhdGVLZXk7XG5cblx0XHQvKlxuXHRcdCAqIGdlbmVyYXRlIHNhcC1pYXBwLXN0YXRlcyB3aXRoIHRoZSBuZXcgd2F5XG5cdFx0ICovXG5cdFx0aWYgKCFzQXBwSGFzaCkge1xuXHRcdFx0Ly8gdGhlcmUncyBubyBzQXBwSGFzaCBrZXkgeWV0XG5cdFx0XHRyZXR1cm4gXCI/XCIgKyBzTmV3SUFwcFN0YXRlO1xuXHRcdH1cblxuXHRcdGNvbnN0IGZuQXBwZW5kVG9RdWVyeVBhcmFtZXRlciA9IGZ1bmN0aW9uIChzU3ViQXBwSGFzaDogYW55KTogc3RyaW5nIHtcblx0XHRcdC8vIHRoZXJlIGlzIGFuIEFwcEhhc2ggYXZhaWxhYmxlLCBidXQgaXQgZG9lcyBub3QgY29udGFpbiBhIHNhcC1pYXBwLXN0YXRlIHBhcmFtZXRlciB5ZXQgLSB3ZSBuZWVkIHRvIGFwcGVuZCBvbmVcblxuXHRcdFx0Ly8gbmV3IGFwcHJvYWNoOiB3ZSBuZWVkIHRvIGNoZWNrLCBpZiBhIHNldCBvZiBxdWVyeSBwYXJhbWV0ZXJzIGlzIGFscmVhZHkgYXZhaWxhYmxlXG5cdFx0XHRpZiAoc1N1YkFwcEhhc2guaW5kZXhPZihcIj9cIikgIT09IC0xKSB7XG5cdFx0XHRcdC8vIHRoZXJlIGFyZSBhbHJlYWR5IHF1ZXJ5IHBhcmFtZXRlcnMgYXZhaWxhYmxlIC0gYXBwZW5kIGl0IGFzIGFub3RoZXIgcGFyYW1ldGVyXG5cdFx0XHRcdHJldHVybiBzU3ViQXBwSGFzaCArIFwiJlwiICsgc05ld0lBcHBTdGF0ZTtcblx0XHRcdH1cblx0XHRcdC8vIHRoZXJlIGFyZSBubyBhIHF1ZXJ5IHBhcmFtZXRlcnMgYXZhaWxhYmxlIHlldDsgY3JlYXRlIGEgc2V0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyXG5cdFx0XHRyZXR1cm4gc1N1YkFwcEhhc2ggKyBcIj9cIiArIHNOZXdJQXBwU3RhdGU7XG5cdFx0fTtcblxuXHRcdGlmICghdGhpcy5fZ2V0SW5uZXJBcHBTdGF0ZUtleShzQXBwSGFzaCkpIHtcblx0XHRcdHJldHVybiBmbkFwcGVuZFRvUXVlcnlQYXJhbWV0ZXIoc0FwcEhhc2gpO1xuXHRcdH1cblx0XHQvLyBUaGVyZSBpcyBhbiBBcHBIYXNoIGF2YWlsYWJsZSBhbmQgdGhlcmUgaXMgYWxyZWFkeSBhbiBzYXAtaWFwcC1zdGF0ZSBpbiB0aGUgQXBwSGFzaFxuXG5cdFx0aWYgKHRoaXMuX3JJQXBwU3RhdGVOZXcudGVzdChzQXBwSGFzaCkpIHtcblx0XHRcdC8vIHRoZSBuZXcgYXBwcm9hY2ggaXMgYmVpbmcgdXNlZFxuXHRcdFx0cmV0dXJuIHNBcHBIYXNoLnJlcGxhY2UodGhpcy5fcklBcHBTdGF0ZU5ldywgZnVuY3Rpb24gKHNOZWVkbGU6IHN0cmluZykge1xuXHRcdFx0XHRyZXR1cm4gc05lZWRsZS5yZXBsYWNlKC9bPV0uKi9naSwgXCI9XCIgKyBzQXBwU3RhdGVLZXkpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Ly8gd2UgbmVlZCB0byByZW1vdmUgdGhlIG9sZCBBcHBIYXNoIGVudGlyZWx5IGFuZCByZXBsYWNlIGl0IHdpdGggYSBuZXcgb25lLlxuXG5cdFx0Y29uc3QgZm5SZXBsYWNlT2xkQXBwcm9hY2ggPSBmdW5jdGlvbiAock9sZEFwcHJvYWNoOiBhbnksIHNTdWJBcHBIYXNoOiBhbnkpOiBzdHJpbmcge1xuXHRcdFx0c1N1YkFwcEhhc2ggPSBzU3ViQXBwSGFzaC5yZXBsYWNlKHJPbGRBcHByb2FjaCwgXCJcIik7XG5cdFx0XHRyZXR1cm4gZm5BcHBlbmRUb1F1ZXJ5UGFyYW1ldGVyKHNTdWJBcHBIYXNoKTtcblx0XHR9O1xuXG5cdFx0aWYgKHRoaXMuX3JJQXBwU3RhdGVPbGQudGVzdChzQXBwSGFzaCkpIHtcblx0XHRcdHJldHVybiBmblJlcGxhY2VPbGRBcHByb2FjaCh0aGlzLl9ySUFwcFN0YXRlT2xkLCBzQXBwSGFzaCk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX3JJQXBwU3RhdGVPbGRBdFN0YXJ0LnRlc3Qoc0FwcEhhc2gpKSB7XG5cdFx0XHRyZXR1cm4gZm5SZXBsYWNlT2xkQXBwcm9hY2godGhpcy5fcklBcHBTdGF0ZU9sZEF0U3RhcnQsIHNBcHBIYXNoKTtcblx0XHR9XG5cblx0XHRhc3NlcnQoZmFsc2UsIFwiaW50ZXJuYWwgaW5jb25zaXN0ZW5jeTogQXBwcm9hY2ggb2Ygc2FwLWlhcHAtc3RhdGUgbm90IGtub3duLCBidXQgX2dldElubmVyQXBwU3RhdGVLZXkgcmV0dXJuZWQgaXRcIik7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdF9nZXRVUkxQYXJhbWV0ZXJzRnJvbVNlbGVjdGlvblZhcmlhbnQodlNlbGVjdGlvblZhcmlhbnQ/OiBTZWxlY3Rpb25WYXJpYW50IHwgc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG5cdFx0Y29uc3QgbVVSTFBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0XHRsZXQgaSA9IDA7XG5cdFx0bGV0IG9TZWxlY3Rpb25WYXJpYW50O1xuXG5cdFx0aWYgKHR5cGVvZiB2U2VsZWN0aW9uVmFyaWFudCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0b1NlbGVjdGlvblZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudCh2U2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdlNlbGVjdGlvblZhcmlhbnQgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdG9TZWxlY3Rpb25WYXJpYW50ID0gdlNlbGVjdGlvblZhcmlhbnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0fVxuXG5cdFx0Ly8gYWRkIFVSTHMgcGFyYW1ldGVycyBmcm9tIFNlbGVjdGlvblZhcmlhbnQuU2VsZWN0T3B0aW9ucyAoaWYgc2luZ2xlIHZhbHVlKVxuXHRcdGNvbnN0IGFTZWxlY3RQcm9wZXJ0aWVzID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMoKTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgYVNlbGVjdFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IGFTZWxlY3RPcHRpb25zID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uKGFTZWxlY3RQcm9wZXJ0aWVzW2ldKTtcblx0XHRcdGlmIChhU2VsZWN0T3B0aW9ucyAmJiBhU2VsZWN0T3B0aW9ucy5sZW5ndGggPT09IDEgJiYgYVNlbGVjdE9wdGlvbnNbMF0uU2lnbiA9PT0gXCJJXCIgJiYgYVNlbGVjdE9wdGlvbnNbMF0uT3B0aW9uID09PSBcIkVRXCIpIHtcblx0XHRcdFx0bVVSTFBhcmFtZXRlcnNbYVNlbGVjdFByb3BlcnRpZXNbaV1dID0gYVNlbGVjdE9wdGlvbnNbMF0uTG93O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIGFkZCBwYXJhbWV0ZXJzIGZyb20gU2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJzXG5cdFx0Y29uc3QgYVBhcmFtZXRlck5hbWVzID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0UGFyYW1ldGVyTmFtZXMoKTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgYVBhcmFtZXRlck5hbWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBzUGFyYW1ldGVyVmFsdWUgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRQYXJhbWV0ZXIoYVBhcmFtZXRlck5hbWVzW2ldKTtcblxuXHRcdFx0bVVSTFBhcmFtZXRlcnNbYVBhcmFtZXRlck5hbWVzW2ldXSA9IHNQYXJhbWV0ZXJWYWx1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIG1VUkxQYXJhbWV0ZXJzO1xuXHR9XG5cblx0X2NyZWF0ZVRlY2huaWNhbEVycm9yKHNFcnJvckNvZGU6IGFueSk6IE5hdkVycm9yIHtcblx0XHRyZXR1cm4gbmV3IE5hdkVycm9yKHNFcnJvckNvZGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIG1vZGVsIHRoYXQgaXMgdXNlZCBmb3IgdmVyaWZpY2F0aW9uIG9mIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi4gSWYgdGhlIG1vZGVsIGlzIG5vdCBzZXQsIHRoZSB1bm5hbWVkIGNvbXBvbmVudCBtb2RlbCBpcyB1c2VkIGZvciB0aGVcblx0ICogdmVyaWZpY2F0aW9uIG9mIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0gb01vZGVsIEZvciBjaGVja2luZyBzZW5zaXRpdmUgaW5mb3JtYXRpb25cblx0ICovXG5cdHNldE1vZGVsKG9Nb2RlbDogVjJPRGF0YU1vZGVsIHwgVjRPRGF0YU1vZGVsKTogdm9pZCB7XG5cdFx0dGhpcy5fb01vZGVsID0gb01vZGVsO1xuXHR9XG5cblx0X2dldE1vZGVsKCk6IFYyT0RhdGFNb2RlbCB8IFY0T0RhdGFNb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuX29Nb2RlbCB8fCB0aGlzLm9Db21wb25lbnQuZ2V0TW9kZWwoKTtcblx0fVxuXG5cdF9yZW1vdmVBbGxQcm9wZXJ0aWVzKG9EYXRhOiBJbm5lckFwcERhdGEpOiB2b2lkIHtcblx0XHRpZiAob0RhdGEpIHtcblx0XHRcdGlmIChvRGF0YS5zZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgPSBudWxsIGFzIHVua25vd24gYXMgdW5kZWZpbmVkO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob0RhdGEudmFsdWVUZXh0cykge1xuXHRcdFx0XHRvRGF0YS52YWx1ZVRleHRzID0gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9EYXRhLnNlbWFudGljRGF0ZXMpIHtcblx0XHRcdFx0b0RhdGEuc2VtYW50aWNEYXRlcyA9IG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X3JlbW92ZVByb3BlcnRpZXMoYUZpbHRlck5hbWU6IGFueSwgYVBhcmFtZXRlck5hbWU6IGFueSwgb0RhdGE6IGFueSk6IHZvaWQge1xuXHRcdGlmIChhRmlsdGVyTmFtZS5sZW5ndGggJiYgb0RhdGEgJiYgKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgfHwgb0RhdGEudmFsdWVUZXh0cyB8fCBvRGF0YS5zZW1hbnRpY0RhdGVzKSkge1xuXHRcdFx0YUZpbHRlck5hbWUuZm9yRWFjaChmdW5jdGlvbiAoc05hbWU6IGFueSkge1xuXHRcdFx0XHRpZiAob0RhdGEuc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zKSB7XG5cdFx0XHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zLnNvbWUoZnVuY3Rpb24gKG9WYWx1ZTogYW55LCBuSWR4OiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmIChzTmFtZSA9PT0gb1ZhbHVlLlByb3BlcnR5TmFtZSkge1xuXHRcdFx0XHRcdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlNlbGVjdE9wdGlvbnMuc3BsaWNlKG5JZHgsIDEpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKG9EYXRhLnZhbHVlVGV4dHMgJiYgb0RhdGEudmFsdWVUZXh0cy5UZXh0cykge1xuXHRcdFx0XHRcdG9EYXRhLnZhbHVlVGV4dHMuVGV4dHMuZm9yRWFjaChmdW5jdGlvbiAob1RleHRzOiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmIChvVGV4dHMuUHJvcGVydHlUZXh0cykge1xuXHRcdFx0XHRcdFx0XHRvVGV4dHMuUHJvcGVydHlUZXh0cy5zb21lKGZ1bmN0aW9uIChvVmFsdWU6IGFueSwgbklkeDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNOYW1lID09PSBvVmFsdWUuUHJvcGVydHlOYW1lKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvVGV4dHMuUHJvcGVydHlUZXh0cy5zcGxpY2UobklkeCwgMSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKG9EYXRhLnNlbWFudGljRGF0ZXMgJiYgb0RhdGEuc2VtYW50aWNEYXRlcy5EYXRlcykge1xuXHRcdFx0XHRcdG9EYXRhLnNlbWFudGljRGF0ZXMuRGF0ZXMuZm9yRWFjaChmdW5jdGlvbiAob0RhdGVzOiBhbnksIG5JZHg6IGFueSkge1xuXHRcdFx0XHRcdFx0aWYgKHNOYW1lID09PSBvRGF0ZXMuUHJvcGVydHlOYW1lKSB7XG5cdFx0XHRcdFx0XHRcdG9EYXRhLnNlbWFudGljRGF0ZXMuRGF0ZXMuc3BsaWNlKG5JZHgsIDEpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAoYVBhcmFtZXRlck5hbWUubGVuZ3RoICYmIG9EYXRhICYmIG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgJiYgb0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJzKSB7XG5cdFx0XHRhUGFyYW1ldGVyTmFtZS5mb3JFYWNoKGZ1bmN0aW9uIChzTmFtZTogYW55KSB7XG5cdFx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVycy5zb21lKGZ1bmN0aW9uIChvVmFsdWU6IGFueSwgbklkeDogYW55KSB7XG5cdFx0XHRcdFx0aWYgKHNOYW1lID09PSBvVmFsdWUuUHJvcGVydHlOYW1lIHx8IFwiJFBhcmFtZXRlci5cIiArIHNOYW1lID09PSBvVmFsdWUuUHJvcGVydHlOYW1lKSB7XG5cdFx0XHRcdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlcnMuc3BsaWNlKG5JZHgsIDEpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdF9pc1Rlcm1UcnVlKG9Qcm9wZXJ0eTogYW55LCBzVGVybTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgZklzVGVybURlZmF1bHRUcnVlID0gZnVuY3Rpb24gKG9UZXJtOiBhbnkpOiBib29sZWFuIHtcblx0XHRcdGlmIChvVGVybSkge1xuXHRcdFx0XHRyZXR1cm4gb1Rlcm0uQm9vbCA/IG9UZXJtLkJvb2wgIT09IFwiZmFsc2VcIiA6IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcblxuXHRcdHJldHVybiAhIW9Qcm9wZXJ0eVtzVGVybV0gJiYgZklzVGVybURlZmF1bHRUcnVlKG9Qcm9wZXJ0eVtzVGVybV0pO1xuXHR9XG5cblx0X2lzRXhjbHVkZWRGcm9tTmF2aWdhdGlvbkNvbnRleHQob1Byb3BlcnR5OiBhbnkpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5faXNUZXJtVHJ1ZShvUHJvcGVydHksIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRXhjbHVkZUZyb21OYXZpZ2F0aW9uQ29udGV4dFwiKTtcblx0fVxuXG5cdF9pc1BvdGVudGlhbGx5U2Vuc2l0aXZlKG9Qcm9wZXJ0eTogYW55KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX2lzVGVybVRydWUob1Byb3BlcnR5LCBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5Jc1BvdGVudGlhbGx5U2Vuc2l0aXZlXCIpO1xuXHR9XG5cblx0X2lzTWVhc3VyZVByb3BlcnR5KG9Qcm9wZXJ0eTogYW55KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX2lzVGVybVRydWUob1Byb3BlcnR5LCBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5NZWFzdXJlXCIpO1xuXHR9XG5cblx0X2lzVG9CZUV4Y2x1ZGVkKG9Qcm9wZXJ0eTogYW55KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX2lzUG90ZW50aWFsbHlTZW5zaXRpdmUob1Byb3BlcnR5KSB8fCB0aGlzLl9pc0V4Y2x1ZGVkRnJvbU5hdmlnYXRpb25Db250ZXh0KG9Qcm9wZXJ0eSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIG1ldGhvZCBjcmVhdGVzIGEgY29udGV4dCB1cmwgYmFzZWQgb24gcHJvdmlkZWQgZGF0YS4gVGhpcyBjb250ZXh0IHVybCBjYW4gZWl0aGVyIGJlIHVzZWQgYXNcblx0ICoge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyI3NldFBhcmFtZXRlckNvbnRleHRVcmwgUGFyYW1ldGVyQ29udGV4dFVybH0gb3Jcblx0ICoge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyI3NldEZpbHRlckNvbnRleHRVcmwgRmlsdGVyQ29udGV4dFVybH0uXG5cdCAqIEBwYXJhbSBzRW50aXR5U2V0TmFtZSBVc2VkIGZvciB1cmwgZGV0ZXJtaW5hdGlvblxuXHQgKiBAcGFyYW0gW29Nb2RlbF0gVXNlZCBmb3IgdXJsIGRldGVybWluYXRpb24uIElmIG9taXR0ZWQsIHRoZSBOYXZpZ2F0aW9uSGFuZGxlciBtb2RlbCBpcyB1c2VkLlxuXHQgKiBAdGhyb3dzIEFuIGluc3RhbmNlIG9mIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZFcnJvcn0gaW4gY2FzZSBvZiBtaXNzaW5nIG9yIHdyb25nIHBhc3NlZCBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFRoZSBjb250ZXh0IHVybCBmb3IgdGhlIGdpdmVuIGVudGl0aWVzXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdGNvbnN0cnVjdENvbnRleHRVcmwoc0VudGl0eVNldE5hbWU6IHN0cmluZywgb01vZGVsPzogVjJPRGF0YU1vZGVsIHwgVjRPRGF0YU1vZGVsKTogc3RyaW5nIHtcblx0XHRpZiAoIXNFbnRpdHlTZXROYW1lKSB7XG5cdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5OT19FTlRJVFlfU0VUX1BST1ZJREVEXCIpO1xuXHRcdH1cblxuXHRcdGlmIChvTW9kZWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0b01vZGVsID0gdGhpcy5fZ2V0TW9kZWwoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fY29uc3RydWN0Q29udGV4dFVybChvTW9kZWwpICsgXCIjXCIgKyBzRW50aXR5U2V0TmFtZTtcblx0fVxuXG5cdF9jb25zdHJ1Y3RDb250ZXh0VXJsKG9Nb2RlbDogVjJPRGF0YU1vZGVsIHwgVjRPRGF0YU1vZGVsKTogc3RyaW5nIHtcblx0XHRsZXQgc1NlcnZlclVybDtcblxuXHRcdGlmIChvTW9kZWwuaXNBPFYyT0RhdGFNb2RlbD4oXCJzYXAudWkubW9kZWwub2RhdGEudjIuT0RhdGFNb2RlbFwiKSkge1xuXHRcdFx0c1NlcnZlclVybCA9IG9Nb2RlbC5fZ2V0U2VydmVyVXJsKCk7XG5cdFx0fSBlbHNlIGlmIChvTW9kZWwuaXNBPFY0T0RhdGFNb2RlbD4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbFwiKSkge1xuXHRcdFx0Y29uc3Qgb1NlcnZpY2VVUkkgPSBuZXcgVVJJKG9Nb2RlbC5nZXRTZXJ2aWNlVXJsKCkpLmFic29sdXRlVG8oZG9jdW1lbnQuYmFzZVVSSSk7XG5cdFx0XHRzU2VydmVyVXJsID0gbmV3IFVSSShcIi9cIikuYWJzb2x1dGVUbyhvU2VydmljZVVSSSkudG9TdHJpbmcoKTtcblx0XHR9XG5cblx0XHRpZiAoc1NlcnZlclVybCAmJiBzU2VydmVyVXJsLmxhc3RJbmRleE9mKFwiL1wiKSA9PT0gc1NlcnZlclVybC5sZW5ndGggLSAxKSB7XG5cdFx0XHRzU2VydmVyVXJsID0gc1NlcnZlclVybC5zdWJzdHJpbmcoMCwgc1NlcnZlclVybC5sZW5ndGggLSAxKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gc1NlcnZlclVybCArIG9Nb2RlbC5zU2VydmljZVVybCArIFwiLyRtZXRhZGF0YVwiO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBtZXRob2QgdmVyaWZpZXMsIGlmIGFueSBvZiB0aGUgcGFzc2VkIHBhcmFtZXRlcnMvZmlsdGVycyBhcmUgbWFya2VkIGFzIHNlbnNpdGl2ZSwgYW5kIGlmIHRoaXMgaXMgdGhlIGNhc2UgcmVtb3ZlIHRob3NlIGZyb20gdGhlIGFwcFxuXHQgKiBkYXRhLiA8Yj5Ob3RlOjwvYj4gVG8gdXNlIHRoaXMgbWV0aG9kLCB0aGUgbWV0YWRhdGEgbXVzdCBiZSBsb2FkZWQgZmlyc3QuXG5cdCAqIEBwYXJhbSBvRGF0YSBXaXRoIHBvdGVudGlhbCBzZW5zaXRpdmUgaW5mb3JtYXRpb24gKGZvciBPRGF0YSwgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gdXNpbmdcblx0ICogPGNvZGU+b1NlbGVjdGlvblZhcmlhbnQudG9KU09OT2JqZWN0KCk8L2NvZGU+IG11c3QgYmUgdXNlZCksIHdpdGggdGhlIDxjb2RlPkZpbHRlckNvbnRleHRVcmw8L2NvZGU+IG9yXG5cdCAqIDxjb2RlPlBhcmFtZXRlckNvbnRleHRVcmw8L2NvZGU+IHByb3BlcnR5LlxuXHQgKiBAcmV0dXJucyBEYXRhIHdpdGhvdXQgcHJvcGVydGllcyBtYXJrZWQgYXMgc2Vuc2l0aXZlIG9yIGFuIGVtcHR5IG9iamVjdCBpZiB0aGUgT0RhdGEgbWV0YWRhdGEgaXMgbm90IGZ1bGx5IGxvYWRlZCB5ZXRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9jaGVja0lzUG90ZW50aWFsbHlTZW5zaXRpdmUob0RhdGE6IGFueSk6IHVua25vd24ge1xuXHRcdGxldCBvQWRhcHRlZERhdGEgPSBvRGF0YTtcblx0XHRpZiAoXG5cdFx0XHRvRGF0YSAmJlxuXHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudCAmJlxuXHRcdFx0KChvRGF0YS5zZWxlY3Rpb25WYXJpYW50LkZpbHRlckNvbnRleHRVcmwgJiYgb0RhdGEuc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zKSB8fFxuXHRcdFx0XHQob0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJDb250ZXh0VXJsICYmIG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVycykpXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBvTW9kZWwgPSB0aGlzLl9nZXRNb2RlbCgpO1xuXHRcdFx0aWYgKHRoaXMub0NvbXBvbmVudCAmJiBvTW9kZWwgJiYgb01vZGVsLmlzQTxWMk9EYXRhTW9kZWw+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnYyLk9EYXRhTW9kZWxcIikpIHtcblx0XHRcdFx0Y29uc3QgYVNlbnNpdGl2ZUZpbHRlck5hbWUgPSBbXTtcblx0XHRcdFx0Y29uc3QgYVNlbnNpdGl2ZVBhcmFtZXRlck5hbWUgPSBbXTtcblx0XHRcdFx0bGV0IGksXG5cdFx0XHRcdFx0b0VudGl0eVNldDogYW55LFxuXHRcdFx0XHRcdG9FbnRpdHlEZWY6IGFueSxcblx0XHRcdFx0XHRvU3ViRW50aXR5RGVmOiBhbnksXG5cdFx0XHRcdFx0b0VuZFJvbGU6IGFueSxcblx0XHRcdFx0XHRhRmlsdGVyQ29udGV4dFBhcnQgPSBbXSxcblx0XHRcdFx0XHRhUGFyYW1Db250ZXh0UGFydCA9IFtdO1xuXG5cdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdGlmIChvTW9kZWwuZ2V0U2VydmljZU1ldGFkYXRhKCkgJiYgb01ldGFNb2RlbD8ub01vZGVsKSB7XG5cdFx0XHRcdFx0aWYgKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuRmlsdGVyQ29udGV4dFVybCkge1xuXHRcdFx0XHRcdFx0YUZpbHRlckNvbnRleHRQYXJ0ID0gb0RhdGEuc2VsZWN0aW9uVmFyaWFudC5GaWx0ZXJDb250ZXh0VXJsLnNwbGl0KFwiI1wiKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRhRmlsdGVyQ29udGV4dFBhcnQubGVuZ3RoID09PSAyICYmXG5cdFx0XHRcdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlNlbGVjdE9wdGlvbnMgJiZcblx0XHRcdFx0XHRcdHRoaXMuX2NvbnN0cnVjdENvbnRleHRVcmwob01vZGVsKS5pbmRleE9mKGFGaWx0ZXJDb250ZXh0UGFydFswXSkgPT09IDBcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9FbnRpdHlTZXQgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5U2V0KGFGaWx0ZXJDb250ZXh0UGFydFsxXSk7XG5cdFx0XHRcdFx0XHRpZiAob0VudGl0eVNldCkge1xuXHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUob0VudGl0eVNldC5lbnRpdHlUeXBlKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG9FbnRpdHlEZWYgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5VHlwZShhRmlsdGVyQ29udGV4dFBhcnRbMV0pO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAob0VudGl0eURlZikge1xuXHRcdFx0XHRcdFx0XHRpZiAob0VudGl0eURlZiAmJiBvRW50aXR5RGVmLnByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IG9FbnRpdHlEZWYucHJvcGVydHkubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLl9pc1RvQmVFeGNsdWRlZChvRW50aXR5RGVmLnByb3BlcnR5W2ldKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRhU2Vuc2l0aXZlRmlsdGVyTmFtZS5wdXNoKG9FbnRpdHlEZWYucHJvcGVydHlbaV0ubmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYubmF2aWdhdGlvblByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IG9FbnRpdHlEZWYubmF2aWdhdGlvblByb3BlcnR5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRW5kUm9sZSA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFBc3NvY2lhdGlvbkVuZChvRW50aXR5RGVmLCBvRW50aXR5RGVmLm5hdmlnYXRpb25Qcm9wZXJ0eVtpXS5uYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICghb0VuZFJvbGUgfHwgb0VuZFJvbGUudHlwZSA9PT0gb0RhdGEuc2VsZWN0aW9uVmFyaWFudC5GaWx0ZXJDb250ZXh0VXJsKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gY2hlY2sgaWYgdGhlIGVuZCByb2xlIGhhcyBjYXJkaW5hbGl0eSAwLi4xIG9yIDFcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChvRW5kUm9sZS5tdWx0aXBsaWNpdHkgPT09IFwiMVwiIHx8IG9FbmRSb2xlLm11bHRpcGxpY2l0eSA9PT0gXCIwLi4xXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1N1YkVudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKG9FbmRSb2xlLnR5cGUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob1N1YkVudGl0eURlZiAmJiBvU3ViRW50aXR5RGVmLnByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBvU3ViRW50aXR5RGVmLnByb3BlcnR5Lmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5faXNUb0JlRXhjbHVkZWQob1N1YkVudGl0eURlZi5wcm9wZXJ0eVtqXSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YVNlbnNpdGl2ZUZpbHRlck5hbWUucHVzaChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmLm5hdmlnYXRpb25Qcm9wZXJ0eVtpXS5uYW1lICsgXCIuXCIgKyBvU3ViRW50aXR5RGVmLnByb3BlcnR5W2pdLm5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAob0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJDb250ZXh0VXJsKSB7XG5cdFx0XHRcdFx0XHRhUGFyYW1Db250ZXh0UGFydCA9IG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVyQ29udGV4dFVybC5zcGxpdChcIiNcIik7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0YVBhcmFtQ29udGV4dFBhcnQubGVuZ3RoID09PSAyICYmXG5cdFx0XHRcdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlcnMgJiZcblx0XHRcdFx0XHRcdHRoaXMuX2NvbnN0cnVjdENvbnRleHRVcmwob01vZGVsKS5pbmRleE9mKGFQYXJhbUNvbnRleHRQYXJ0WzBdKSA9PT0gMFxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b0VudGl0eVNldCA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlTZXQoYVBhcmFtQ29udGV4dFBhcnRbMV0pO1xuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlTZXQpIHtcblx0XHRcdFx0XHRcdFx0b0VudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKG9FbnRpdHlTZXQuZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUoYUZpbHRlckNvbnRleHRQYXJ0WzFdKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYucHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgb0VudGl0eURlZi5wcm9wZXJ0eS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuX2lzVG9CZUV4Y2x1ZGVkKG9FbnRpdHlEZWYucHJvcGVydHlbaV0pKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFTZW5zaXRpdmVQYXJhbWV0ZXJOYW1lLnB1c2gob0VudGl0eURlZi5wcm9wZXJ0eVtpXS5uYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoYVNlbnNpdGl2ZUZpbHRlck5hbWUubGVuZ3RoIHx8IGFTZW5zaXRpdmVQYXJhbWV0ZXJOYW1lLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0b0FkYXB0ZWREYXRhID0gZXh0ZW5kKHRydWUgYXMgYW55LCB7fSwgb0FkYXB0ZWREYXRhKTtcblxuXHRcdFx0XHRcdFx0dGhpcy5fcmVtb3ZlUHJvcGVydGllcyhhU2Vuc2l0aXZlRmlsdGVyTmFtZSwgYVNlbnNpdGl2ZVBhcmFtZXRlck5hbWUsIG9BZGFwdGVkRGF0YSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGFubm90YXRpb25zIGFyZSBub3QgbG9hZGVkXG5cblx0XHRcdFx0XHR0aGlzLl9yZW1vdmVBbGxQcm9wZXJ0aWVzKG9BZGFwdGVkRGF0YSk7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXI6IG9NZXRhZGF0YSBhcmUgbm90IGZ1bGx5IGxvYWRlZCFcIik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAodGhpcy5vQ29tcG9uZW50ICYmIG9Nb2RlbCAmJiBvTW9kZWwuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWxcIikpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX3JlbW92ZVNlbnNpdGl2ZURhdGFGb3JPRGF0YVY0KG9BZGFwdGVkRGF0YSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9BZGFwdGVkRGF0YTtcblx0fVxuXG5cdF9yZW1vdmVNZWFzdXJlQmFzZWRJbmZvcm1hdGlvbihvQXBwRGF0YTogSW5uZXJBcHBEYXRhKTogSW5uZXJBcHBEYXRhIHtcblx0XHRsZXQgb0FwcERhdGFGb3JTYXZlID0gb0FwcERhdGE7XG5cblx0XHRpZiAob0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdFx0Lypcblx0XHRcdCAqIFRoZSBzcGVjaWZpY2F0aW9uIHN0YXRlcyB0aGF0IFNlbGVjdGlvbiBWYXJpYW50cyBuZWVkIHRvIGJlIEpTT04gb2JqZWN0cy4gSG93ZXZlciwgaW50ZXJuYWxseSwgd2Ugd29yayB3aXRoIHN0cmluZ3MgZm9yXG5cdFx0XHQgKiBcInNlbGVjdGlvblZhcmlhbnRcIi4gVGhlcmVmb3JlLCBpbiBjYXNlIHRoYXQgdGhpcyBpcyBhIHN0cmluZywgd2UgbmVlZCB0byBKU09OLXBhcnNlIHRoZSBkYXRhLlxuXHRcdFx0ICovXG5cdFx0XHRpZiAodHlwZW9mIG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRvQXBwRGF0YUZvclNhdmUuc2VsZWN0aW9uVmFyaWFudCA9IEpTT04ucGFyc2Uob0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0XHRcdH0gY2F0Y2ggKHgpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlcjogX3JlbW92ZU1lYXN1cmVCYXNlZEluZm9ybWF0aW9uIHBhcnNlIGVycm9yXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdG9BcHBEYXRhRm9yU2F2ZSA9IHRoaXMuX3JlbW92ZU1lYXN1cmVCYXNlZFByb3BlcnRpZXMob0FwcERhdGFGb3JTYXZlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gb0FwcERhdGFGb3JTYXZlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBtZXRob2QgdmVyaWZpZXMgaWYgYW55IG9mIHRoZSBwYXNzZWQgcGFyYW1ldGVycy9maWx0ZXJzIGFyZSBtYXJrZWQgYXMgYSBtZWFzdXJlLiBJZiB0aGlzIGlzIHRoZSBjYXNlLCB0aGV5IGFyZSByZW1vdmVkIGZyb20gdGhlIHhhcHBcblx0ICogYXBwIGRhdGEuIDxiPk5vdGU6PC9iPiBUbyB1c2UgdGhpcyBtZXRob2QsIHRoZSBtZXRhZGF0YSBtdXN0IGJlIGxvYWRlZCBmaXJzdC5cblx0ICogQHBhcmFtIG9EYXRhIFdpdGggcG90ZW50aWFsIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiAoZm9yIE9EYXRhLCBleHRlcm5hbCByZXByZXNlbnRhdGlvbiB1c2luZ1xuXHQgKiA8Y29kZT5vU2VsZWN0aW9uVmFyaWFudC50b0pTT05PYmplY3QoKTwvY29kZT4gbXVzdCBiZSB1c2VkKSwgd2l0aCB0aGUgPGNvZGU+RmlsdGVyQ29udGV4dFVybDwvY29kZT4gb3Jcblx0ICogPGNvZGU+UGFyYW1ldGVyQ29udGV4dFVybDwvY29kZT4gcHJvcGVydHkuXG5cdCAqIEByZXR1cm5zIERhdGEgd2l0aG91dCBwcm9wZXJ0aWVzIG1hcmtlZCBhcyBtZWFzdXJlcyBvciBhbiBlbXB0eSBvYmplY3QgaWYgdGhlIE9EYXRhIG1ldGFkYXRhIGlzIG5vdCBmdWxseSBsb2FkZWQgeWV0XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfcmVtb3ZlTWVhc3VyZUJhc2VkUHJvcGVydGllcyhvRGF0YTogSW5uZXJBcHBEYXRhKTogSW5uZXJBcHBEYXRhIHtcblx0XHRsZXQgb0FkYXB0ZWREYXRhID0gb0RhdGE7XG5cdFx0Y29uc3QgYU1lYXN1cmVGaWx0ZXJOYW1lID0gW107XG5cdFx0Y29uc3QgYU1lYXN1cmVQYXJhbWV0ZXJOYW1lID0gW107XG5cdFx0bGV0IGksXG5cdFx0XHRvTW9kZWwsXG5cdFx0XHRvTWV0YU1vZGVsLFxuXHRcdFx0b0VudGl0eVNldDogYW55LFxuXHRcdFx0b0VudGl0eURlZjogYW55LFxuXHRcdFx0b1N1YkVudGl0eURlZjogYW55LFxuXHRcdFx0b0VuZFJvbGU6IGFueSxcblx0XHRcdGFGaWx0ZXJDb250ZXh0UGFydDogc3RyaW5nW10gPSBbXSxcblx0XHRcdGFQYXJhbUNvbnRleHRQYXJ0OiBzdHJpbmdbXSA9IFtdO1xuXG5cdFx0aWYgKFxuXHRcdFx0b0RhdGEgJiZcblx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgJiZcblx0XHRcdCgoKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgYXMgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQpLkZpbHRlckNvbnRleHRVcmwgJiZcblx0XHRcdFx0KG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgYXMgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQpLlNlbGVjdE9wdGlvbnMpIHx8XG5cdFx0XHRcdCgob0RhdGEuc2VsZWN0aW9uVmFyaWFudCBhcyBTZXJpYWxpemVkU2VsZWN0aW9uVmFyaWFudCkuUGFyYW1ldGVyQ29udGV4dFVybCAmJlxuXHRcdFx0XHRcdChvRGF0YS5zZWxlY3Rpb25WYXJpYW50IGFzIFNlcmlhbGl6ZWRTZWxlY3Rpb25WYXJpYW50KS5QYXJhbWV0ZXJzKSlcblx0XHQpIHtcblx0XHRcdG9Nb2RlbCA9IHRoaXMuX2dldE1vZGVsKCk7XG5cdFx0XHRpZiAodGhpcy5vQ29tcG9uZW50ICYmIG9Nb2RlbCAmJiBvTW9kZWwuaXNBPFYyT0RhdGFNb2RlbD4oXCJzYXAudWkubW9kZWwub2RhdGEudjIuT0RhdGFNb2RlbFwiKSkge1xuXHRcdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRpZiAob01vZGVsLmdldFNlcnZpY2VNZXRhZGF0YSgpICYmIG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbC5vTW9kZWwpIHtcblx0XHRcdFx0XHRpZiAoKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgYXMgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQpLkZpbHRlckNvbnRleHRVcmwpIHtcblx0XHRcdFx0XHRcdGFGaWx0ZXJDb250ZXh0UGFydCA9IChvRGF0YS5zZWxlY3Rpb25WYXJpYW50IGFzIFNlcmlhbGl6ZWRTZWxlY3Rpb25WYXJpYW50KS5GaWx0ZXJDb250ZXh0VXJsIS5zcGxpdChcIiNcIik7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0YUZpbHRlckNvbnRleHRQYXJ0Lmxlbmd0aCA9PT0gMiAmJlxuXHRcdFx0XHRcdFx0KG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgYXMgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQpLlNlbGVjdE9wdGlvbnMgJiZcblx0XHRcdFx0XHRcdHRoaXMuX2NvbnN0cnVjdENvbnRleHRVcmwob01vZGVsKS5pbmRleE9mKGFGaWx0ZXJDb250ZXh0UGFydFswXSkgPT09IDBcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9FbnRpdHlTZXQgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5U2V0KGFGaWx0ZXJDb250ZXh0UGFydFsxXSk7XG5cdFx0XHRcdFx0XHRpZiAob0VudGl0eVNldCkge1xuXHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUob0VudGl0eVNldC5lbnRpdHlUeXBlKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG9FbnRpdHlEZWYgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5VHlwZShhRmlsdGVyQ29udGV4dFBhcnRbMV0pO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAob0VudGl0eURlZikge1xuXHRcdFx0XHRcdFx0XHRpZiAob0VudGl0eURlZiAmJiBvRW50aXR5RGVmLnByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IG9FbnRpdHlEZWYucHJvcGVydHkubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLl9pc01lYXN1cmVQcm9wZXJ0eShvRW50aXR5RGVmLnByb3BlcnR5W2ldKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRhTWVhc3VyZUZpbHRlck5hbWUucHVzaChvRW50aXR5RGVmLnByb3BlcnR5W2ldLm5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChvRW50aXR5RGVmLm5hdmlnYXRpb25Qcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBvRW50aXR5RGVmLm5hdmlnYXRpb25Qcm9wZXJ0eS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0VuZFJvbGUgPSBvTWV0YU1vZGVsLmdldE9EYXRhQXNzb2NpYXRpb25FbmQob0VudGl0eURlZiwgb0VudGl0eURlZi5uYXZpZ2F0aW9uUHJvcGVydHlbaV0ubmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCFvRW5kUm9sZSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvRW5kUm9sZS50eXBlID09PSAob0RhdGEuc2VsZWN0aW9uVmFyaWFudCBhcyBTZXJpYWxpemVkU2VsZWN0aW9uVmFyaWFudCkuRmlsdGVyQ29udGV4dFVybFxuXHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gY2hlY2sgaWYgdGhlIGVuZCByb2xlIGhhcyBjYXJkaW5hbGl0eSAwLi4xIG9yIDFcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChvRW5kUm9sZS5tdWx0aXBsaWNpdHkgPT09IFwiMVwiIHx8IG9FbmRSb2xlLm11bHRpcGxpY2l0eSA9PT0gXCIwLi4xXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1N1YkVudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKG9FbmRSb2xlLnR5cGUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob1N1YkVudGl0eURlZiAmJiBvU3ViRW50aXR5RGVmLnByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBvU3ViRW50aXR5RGVmLnByb3BlcnR5Lmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5faXNNZWFzdXJlUHJvcGVydHkob1N1YkVudGl0eURlZi5wcm9wZXJ0eVtqXSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YU1lYXN1cmVGaWx0ZXJOYW1lLnB1c2goXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0VudGl0eURlZi5uYXZpZ2F0aW9uUHJvcGVydHlbaV0ubmFtZSArIFwiLlwiICsgb1N1YkVudGl0eURlZi5wcm9wZXJ0eVtqXS5uYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKChvRGF0YS5zZWxlY3Rpb25WYXJpYW50IGFzIFNlcmlhbGl6ZWRTZWxlY3Rpb25WYXJpYW50KS5QYXJhbWV0ZXJDb250ZXh0VXJsKSB7XG5cdFx0XHRcdFx0XHRhUGFyYW1Db250ZXh0UGFydCA9IChvRGF0YS5zZWxlY3Rpb25WYXJpYW50IGFzIFNlcmlhbGl6ZWRTZWxlY3Rpb25WYXJpYW50KS5QYXJhbWV0ZXJDb250ZXh0VXJsIS5zcGxpdChcIiNcIik7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0YVBhcmFtQ29udGV4dFBhcnQubGVuZ3RoID09PSAyICYmXG5cdFx0XHRcdFx0XHQob0RhdGEuc2VsZWN0aW9uVmFyaWFudCBhcyBTZXJpYWxpemVkU2VsZWN0aW9uVmFyaWFudCkuUGFyYW1ldGVycyAmJlxuXHRcdFx0XHRcdFx0dGhpcy5fY29uc3RydWN0Q29udGV4dFVybChvTW9kZWwpLmluZGV4T2YoYVBhcmFtQ29udGV4dFBhcnRbMF0pID09PSAwXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvRW50aXR5U2V0ID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVNldChhUGFyYW1Db250ZXh0UGFydFsxXSk7XG5cdFx0XHRcdFx0XHRpZiAob0VudGl0eVNldCkge1xuXHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUob0VudGl0eVNldC5lbnRpdHlUeXBlKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG9FbnRpdHlEZWYgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5VHlwZShhRmlsdGVyQ29udGV4dFBhcnRbMV0pO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAob0VudGl0eURlZikge1xuXHRcdFx0XHRcdFx0XHRpZiAob0VudGl0eURlZi5wcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBvRW50aXR5RGVmLnByb3BlcnR5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5faXNNZWFzdXJlUHJvcGVydHkob0VudGl0eURlZi5wcm9wZXJ0eVtpXSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YU1lYXN1cmVQYXJhbWV0ZXJOYW1lLnB1c2gob0VudGl0eURlZi5wcm9wZXJ0eVtpXS5uYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoYU1lYXN1cmVGaWx0ZXJOYW1lLmxlbmd0aCB8fCBhTWVhc3VyZVBhcmFtZXRlck5hbWUubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHQvLyBUUTogbmVlZHMgYXR0ZW50aW9uXG5cdFx0XHRcdFx0XHRvQWRhcHRlZERhdGEgPSBleHRlbmQodHJ1ZSBhcyBhbnksIHt9LCBvQWRhcHRlZERhdGEpIGFzIElubmVyQXBwRGF0YTtcblxuXHRcdFx0XHRcdFx0dGhpcy5fcmVtb3ZlUHJvcGVydGllcyhhTWVhc3VyZUZpbHRlck5hbWUsIGFNZWFzdXJlUGFyYW1ldGVyTmFtZSwgb0FkYXB0ZWREYXRhKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gYW5ub3RhdGlvbnMgYXJlIG5vdCBsb2FkZWRcblxuXHRcdFx0XHRcdHRoaXMuX3JlbW92ZUFsbFByb3BlcnRpZXMob0FkYXB0ZWREYXRhKTtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlcjogb01ldGFkYXRhIGFyZSBub3QgZnVsbHkgbG9hZGVkIVwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICh0aGlzLm9Db21wb25lbnQgJiYgb01vZGVsICYmIG9Nb2RlbC5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbFwiKSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fcmVtb3ZlU2Vuc2l0aXZlRGF0YUZvck9EYXRhVjQob0FkYXB0ZWREYXRhLCB0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9BZGFwdGVkRGF0YTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHNlbnNpdGl2ZSBkYXRhIGZyb20gdGhlIG5hdmlnYXRpb24gY29udGV4dC5cblx0ICogQHBhcmFtIG9EYXRhIFNlbGVjdGlvbiB2YXJpYW50XG5cdCAqIEBwYXJhbSBiTWVhc3VyZSBTaG91bGQgbWVhc3VyZXMgYmUgcmVtb3ZlZFxuXHQgKiBAcmV0dXJucyBUaGUgc2VsZWN0aW9uIHZhcmlhbnQgYWZ0ZXIgc2Vuc2l0aXZlIGRhdGEgaGFzIGJlZW4gcmVtb3ZlZFxuXHQgKi9cblx0X3JlbW92ZVNlbnNpdGl2ZURhdGFGb3JPRGF0YVY0KG9EYXRhOiBJbm5lckFwcERhdGEsIGJNZWFzdXJlPzogYm9vbGVhbik6IElubmVyQXBwRGF0YSB7XG5cdFx0Y29uc3Qgb05hdkhhbmRsZXIgPSB0aGlzLFxuXHRcdFx0b1NWID0gbmV3IFNlbGVjdGlvblZhcmlhbnQob0RhdGEuc2VsZWN0aW9uVmFyaWFudCksXG5cdFx0XHRvTW9kZWwgPSB0aGlzLl9nZXRNb2RlbCgpO1xuXHRcdGxldCBhRmlsdGVyQ29udGV4dFBhcnQ6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG5cdFx0aWYgKCFvTW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0T2JqZWN0KFwiL1wiKSkge1xuXHRcdFx0Ly8gYW5ub3RhdGlvbnMgYXJlIG5vdCBsb2FkZWRcblx0XHRcdHRoaXMuX3JlbW92ZUFsbFByb3BlcnRpZXMob0RhdGEpO1xuXHRcdFx0TG9nLmVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXI6IG9NZXRhZGF0YSBhcmUgbm90IGZ1bGx5IGxvYWRlZCFcIik7XG5cdFx0XHRyZXR1cm4gb0RhdGE7XG5cdFx0fVxuXG5cdFx0aWYgKChvRGF0YS5zZWxlY3Rpb25WYXJpYW50IGFzIFNlcmlhbGl6ZWRTZWxlY3Rpb25WYXJpYW50KS5GaWx0ZXJDb250ZXh0VXJsKSB7XG5cdFx0XHRhRmlsdGVyQ29udGV4dFBhcnQgPSAob0RhdGEuc2VsZWN0aW9uVmFyaWFudCBhcyBTZXJpYWxpemVkU2VsZWN0aW9uVmFyaWFudCkuRmlsdGVyQ29udGV4dFVybCEuc3BsaXQoXCIjXCIpO1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdGFGaWx0ZXJDb250ZXh0UGFydD8ubGVuZ3RoID09PSAyICYmXG5cdFx0XHQob0RhdGEuc2VsZWN0aW9uVmFyaWFudCBhcyBTZXJpYWxpemVkU2VsZWN0aW9uVmFyaWFudCkuU2VsZWN0T3B0aW9ucyAmJlxuXHRcdFx0dGhpcy5fY29uc3RydWN0Q29udGV4dFVybChvTW9kZWwpLmluZGV4T2YoYUZpbHRlckNvbnRleHRQYXJ0WzBdKSA9PT0gMFxuXHRcdCkge1xuXHRcdFx0b1NWLnJlbW92ZVNlbGVjdE9wdGlvbihcIkBvZGF0YS5jb250ZXh0XCIpO1xuXHRcdFx0b1NWLnJlbW92ZVNlbGVjdE9wdGlvbihcIkBvZGF0YS5tZXRhZGF0YUV0YWdcIik7XG5cdFx0XHRvU1YucmVtb3ZlU2VsZWN0T3B0aW9uKFwiU0FQX19NZXNzYWdlc1wiKTtcblxuXHRcdFx0Y29uc3Qgc0VudGl0eVNldCA9IGFGaWx0ZXJDb250ZXh0UGFydFsxXSxcblx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0YVByb3BlcnR5TmFtZXMgPSBvU1YuZ2V0UHJvcGVydHlOYW1lcygpIHx8IFtdLFxuXHRcdFx0XHRmbklzU2Vuc2l0aXZlRGF0YSA9IGZ1bmN0aW9uIChzUHJvcDogc3RyaW5nLCBlc05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdFx0XHRcdGVzTmFtZSA9IGVzTmFtZSB8fCBzRW50aXR5U2V0O1xuXHRcdFx0XHRcdGNvbnN0IGFQcm9wZXJ0eUFubm90YXRpb25zID0gb01ldGFNb2RlbC5nZXRPYmplY3QoXCIvXCIgKyBlc05hbWUgKyBcIi9cIiArIHNQcm9wICsgXCJAXCIpO1xuXHRcdFx0XHRcdGlmIChhUHJvcGVydHlBbm5vdGF0aW9ucykge1xuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHQoYk1lYXN1cmUgJiYgYVByb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLk1lYXN1cmVcIl0pIHx8XG5cdFx0XHRcdFx0XHRcdG9OYXZIYW5kbGVyLl9jaGVja1Byb3BlcnR5QW5ub3RhdGlvbnNGb3JTZW5zaXRpdmVEYXRhKGFQcm9wZXJ0eUFubm90YXRpb25zKVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChhUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sXCJdKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9GaWVsZENvbnRyb2wgPSBhUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sXCJdO1xuXHRcdFx0XHRcdFx0XHRpZiAob0ZpZWxkQ29udHJvbFtcIiRFbnVtTWVtYmVyXCJdICYmIG9GaWVsZENvbnRyb2xbXCIkRW51bU1lbWJlclwiXS5zcGxpdChcIi9cIilbMV0gPT09IFwiSW5hcHBsaWNhYmxlXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH07XG5cblx0XHRcdGZvciAobGV0IGsgPSAwOyBrIDwgYVByb3BlcnR5TmFtZXMubGVuZ3RoOyBrKyspIHtcblx0XHRcdFx0Y29uc3Qgc1Byb3BlcnR5ID0gYVByb3BlcnR5TmFtZXNba107XG5cdFx0XHRcdC8vIHByb3BlcnRpZXMgb2YgdGhlIGVudGl0eSBzZXRcblx0XHRcdFx0aWYgKGZuSXNTZW5zaXRpdmVEYXRhKHNQcm9wZXJ0eSwgc0VudGl0eVNldCkpIHtcblx0XHRcdFx0XHRvU1YucmVtb3ZlU2VsZWN0T3B0aW9uKHNQcm9wZXJ0eSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgPSBvU1YudG9KU09OT2JqZWN0KCk7XG5cdFx0fVxuXHRcdHJldHVybiBvRGF0YTtcblx0fVxuXG5cdF9jaGVja1Byb3BlcnR5QW5ub3RhdGlvbnNGb3JTZW5zaXRpdmVEYXRhKGFQcm9wZXJ0eUFubm90YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAhIShcblx0XHRcdGFQcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5Jc1BvdGVudGlhbGx5U2Vuc2l0aXZlXCJdIHx8XG5cdFx0XHRhUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5FeGNsdWRlRnJvbU5hdmlnYXRpb25Db250ZXh0XCJdXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHBhcmFtZXRlciB2YWx1ZSBvZiB0aGUgc2FwLWlhcHAtc3RhdGUgKHRoZSBpbnRlcm5hbCBhcHBzKSBmcm9tIHRoZSBBcHBIYXNoIHN0cmluZy4gSXQgYXV0b21hdGljYWxseSB0YWtlcyBjYXJlIGFib3V0XG5cdCAqIGNvbXBhdGliaWxpdHkgYmV0d2VlbiB0aGUgb2xkIGFuZCB0aGUgbmV3IGFwcHJvYWNoIG9mIHRoZSBzYXAtaWFwcC1zdGF0ZS4gUHJlY2VkZW5jZSBpcyB0aGF0IHRoZSBuZXcgYXBwcm9hY2ggaXMgZmF2b3VyZWQgYWdhaW5zdCB0aGUgb2xkXG5cdCAqIGFwcHJvYWNoLlxuXHQgKiBAcmV0dXJucyBUaGUgdmFsdWUgb2Ygc2FwLWlhcHAtc3RhdGUgKGkuZS4gdGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciB0byByZXRyaWV2ZSB0aGUgcGFyYW1ldGVycyksIG9yIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gaW5cblx0ICogICAgICAgICBjYXNlIHRoYXQgbm8gc2FwLWlhcHAtc3RhdGUgd2FzIGZvdW5kIGluIDxjb2RlPnNBcHBIYXNoPC9jb2RlPi5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdGdldElBcHBTdGF0ZUtleSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IHNBcHBIYXNoID0gSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKS5nZXRIYXNoKCk7XG5cdFx0cmV0dXJuIHRoaXMuX2dldElubmVyQXBwU3RhdGVLZXkoc0FwcEhhc2gpO1xuXHR9XG59XG5cbi8vIEV4cG9ydGluZyB0aGUgY2xhc3MgYXMgcHJvcGVybHkgdHlwZWQgVUk1Q2xhc3NcblxuY29uc3QgTmF2aWdhdGlvbkhhbmRsZXJVSTVDbGFzcyA9IEJhc2VPYmplY3QuZXh0ZW5kKFxuXHRcInNhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyXCIsXG5cdE5hdmlnYXRpb25IYW5kbGVyLnByb3RvdHlwZSBhcyBhbnlcbikgYXMgdHlwZW9mIE5hdmlnYXRpb25IYW5kbGVyO1xudHlwZSBOYXZpZ2F0aW9uSGFuZGxlclVJNUNsYXNzID0gSW5zdGFuY2VUeXBlPHR5cGVvZiBOYXZpZ2F0aW9uSGFuZGxlcj47XG5leHBvcnQgZGVmYXVsdCBOYXZpZ2F0aW9uSGFuZGxlclVJNUNsYXNzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0VBbUNBO0FBQ0E7QUFDQTs7RUFrQ0E7RUFDQSxNQUFNQSxPQUFPLEdBQUdDLFVBQVUsQ0FBQ0QsT0FBTztFQUNsQyxNQUFNRSxpQkFBaUIsR0FBR0QsVUFBVSxDQUFDQyxpQkFBaUI7RUFDdEQsTUFBTUMsbUJBQW1CLEdBQUdGLFVBQVUsQ0FBQ0UsbUJBQW1CO0VBQzFELE1BQU1DLElBQUksR0FBR0gsVUFBVSxDQUFDRyxJQUFJO0VBRTVCLE1BQU1DLFVBQVUsR0FBRyxnQkFBZ0I7RUFDbkMsTUFBTUMsNEJBQTRCLEdBQUcsb0NBQW9DO0VBQ3pFLE1BQU1DLHFCQUFxQixHQUFHLHNCQUFzQjs7RUFFcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBakJBLElBa0JhQyxpQkFBaUIsMEJBQUFDLFdBQUE7SUFzRDdCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQyxTQUFBRCxrQkFDQ0UsV0FBcUMsRUFHcEM7TUFBQSxJQUFBQyxLQUFBO01BQUEsSUFGREMsS0FBYSxHQUFBQyxTQUFBLENB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
|