@sapui5/sap.fe.navigation 1.150.0 → 1.152.0

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.
@@ -435,7 +435,8 @@ sap.ui.define(["sap/base/Log", "sap/base/assert", "sap/base/util/extend", "sap/b
435
435
  * <li><code>oAppData.customData</code></li>
436
436
  * </ul>
437
437
  * which return the inner app data as stored in {@link #.navigate navigate} or {@link #.storeInnerAppStateAsync storeInnerAppStateAsync}.
438
- * <code>oAppData.oDefaultedSelectionVariant</code> is an empty selection variant and
438
+ * <code>oAppData.oDefaultedSelectionVariant</code> is populated with the user default values when they are
439
+ * available (fetched from the cross-app state), otherwise it is an empty selection variant, and
439
440
  * <code>oAppData.bNavSelVarHasDefaultsOnly</code> is <code>false</code> in this case.<br>
440
441
  * <b>Note:</b> If the navigation type is {@link sap.fe.navigation.NavType.initial} oAppData is an empty object!<br>
441
442
  * If an error occurs, an error object of type {@link sap.fe.navigation.NavError}, URL parameters (if available)
@@ -902,7 +903,10 @@ sap.ui.define(["sap/base/Log", "sap/base/assert", "sap/base/util/extend", "sap/b
902
903
  this._oLastSavedInnerAppData.iCacheHit++;
903
904
 
904
905
  // replace inner app hash with cached appStateKey in url (just in case the app has changed the hash in meantime)
905
- fnReplaceHash(sAppStateKeyCached);
906
+ // bSkipHashReplace must be checked here too, same as in the cache-miss paths below
907
+ if (!bSkipHashReplace) {
908
+ fnReplaceHash(sAppStateKeyCached);
909
+ }
906
910
  oMyDeferred.resolve(sAppStateKeyCached);
907
911
  return oMyDeferred.promise();
908
912
  }
@@ -1504,16 +1508,22 @@ sap.ui.define(["sap/base/Log", "sap/base/assert", "sap/base/util/extend", "sap/b
1504
1508
  return undefined;
1505
1509
  };
1506
1510
  _proto._fnSaveAppStateWithImmediateReturn = function _fnSaveAppStateWithImmediateReturn(oAppData, oAppState, fnOnError) {
1511
+ const oAppStatePromise = jQuery.Deferred();
1507
1512
  const sAppStateKey = oAppState.getKey();
1508
1513
  const oAppDataForSave = this._fetchAppDataForSave(oAppData, fnOnError);
1509
1514
  if (!oAppDataForSave) {
1510
1515
  return undefined;
1511
1516
  }
1512
1517
  oAppState.setData(oAppDataForSave);
1513
- const oSavePromise = oAppState.save();
1518
+ oAppState.save().then(function () {
1519
+ oAppStatePromise.resolve();
1520
+ return;
1521
+ }).catch(function (oError) {
1522
+ oAppStatePromise.reject(oError);
1523
+ });
1514
1524
  return {
1515
1525
  appStateKey: sAppStateKey,
1516
- promise: oSavePromise.promise()
1526
+ promise: oAppStatePromise.promise()
1517
1527
  };
1518
1528
  };
1519
1529
  _proto._fetchAppDataForSave = function _fetchAppDataForSave(oAppData, fnOnError) {
@@ -1605,6 +1615,7 @@ sap.ui.define(["sap/base/Log", "sap/base/assert", "sap/base/util/extend", "sap/b
1605
1615
  if (typeof oAppDataLoaded === "undefined") {
1606
1616
  const oError = oNavHandler._createTechnicalError("NavigationHandler.getDataFromAppState.failed");
1607
1617
  oDeferred.reject(oError, {}, navType);
1618
+ return;
1608
1619
  } else if (oNavHandler._sMode === Mode.ODataV2) {
1609
1620
  oAppData = {
1610
1621
  selectionVariant: "{}",
@@ -1654,15 +1665,20 @@ sap.ui.define(["sap/base/Log", "sap/base/assert", "sap/base/util/extend", "sap/b
1654
1665
  oAppData.selectionVariant = oNavHandler._ensureSelectionVariantFormatString(oAppDataLoaded.selectionVariant);
1655
1666
  oAppData.oSelectionVariant = new SelectionVariant(oAppData.selectionVariant);
1656
1667
  }
1657
- if (navType === NavType.iAppState) {
1658
- const oComponentData = oNavHandler.oComponent.getComponentData();
1659
- const oStartupParameters = oComponentData?.startupParameters;
1660
- const bHasDefaultedParams = oStartupParameters?.[DEFAULTED_PARAMETER_PROPERTY]?.length > 0;
1661
- const bHasXAppState = oComponentData?.["sap-xapp-state"] !== undefined;
1662
- if (bHasDefaultedParams && bHasXAppState) {
1663
- oNavHandler._enrichDefaultedSelectionVariant(oAppData, oStartupParameters[DEFAULTED_PARAMETER_PROPERTY][0], oDeferred, navType);
1664
- return;
1665
- }
1668
+ }
1669
+
1670
+ // On an iAppState reload (F5), FLP still passes the defaulted parameter names but not their
1671
+ // values, so oDefaultedSelectionVariant would be empty. Re-fetch the original defaults from the
1672
+ // xAppState. This runs after the V2/V4 if/else so it applies to both ODataV2 (FEv2) and V4 apps
1673
+ // (it was previously inside the V4 branch only, which missed the ODataV2 path).
1674
+ if (navType === NavType.iAppState) {
1675
+ const oComponentData = oNavHandler.oComponent.getComponentData();
1676
+ const oStartupParameters = oComponentData?.startupParameters;
1677
+ const bHasDefaultedParams = oStartupParameters?.[DEFAULTED_PARAMETER_PROPERTY]?.length > 0;
1678
+ const bHasXAppState = oComponentData?.["sap-xapp-state"] !== undefined;
1679
+ if (bHasDefaultedParams && bHasXAppState) {
1680
+ oNavHandler._enrichDefaultedSelectionVariant(oAppData, oStartupParameters[DEFAULTED_PARAMETER_PROPERTY][0], oDeferred, navType);
1681
+ return;
1666
1682
  }
1667
1683
  }
1668
1684
 
@@ -2266,4 +2282,4 @@ sap.ui.define(["sap/base/Log", "sap/base/assert", "sap/base/util/extend", "sap/b
2266
2282
  const NavigationHandlerUI5Class = BaseObject.extend("sap.fe.navigation.NavigationHandler", NavigationHandler.prototype);
2267
2283
  return NavigationHandlerUI5Class;
2268
2284
  }, false);
2269
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOYXZUeXBlIiwiTmF2TGlicmFyeSIsIlBhcmFtSGFuZGxpbmdNb2RlIiwiU3VwcHJlc3Npb25CZWhhdmlvciIsIk1vZGUiLCJJQVBQX1NUQVRFIiwiREVGQVVMVEVEX1BBUkFNRVRFUl9QUk9QRVJUWSIsIkhZQlJJRF9JQVBQX1NUQVRFX0tFWSIsIk5hdmlnYXRpb25IYW5kbGVyIiwiX0Jhc2VPYmplY3QiLCJvQ29udHJvbGxlciIsInNNb2RlIiwiT0RhdGFWNCIsInNQYXJhbUhhbmRsaW5nTW9kZSIsIlNlbFZhcldpbnMiLCJfdGhpcyIsImNhbGwiLCJfYVRlY2huaWNhbFBhcmFtYXRlcnMiLCJfb0xhc3RTYXZlZElubmVyQXBwRGF0YSIsInNBcHBTdGF0ZUtleSIsIm9BcHBEYXRhIiwiaUNhY2hlSGl0IiwiaUNhY2hlTWlzcyIsIl9ySUFwcFN0YXRlT2xkIiwiUmVnRXhwIiwiX3JJQXBwU3RhdGVPbGRBdFN0YXJ0IiwiX3JJQXBwU3RhdGVOZXciLCJOYXZFcnJvciIsIlVJQ29tcG9uZW50Iiwib1JvdXRlciIsImdldFJvdXRlciIsIm9Db21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudCIsIl9nZXRSb3V0ZXIiLCJnZXRBcHBDb21wb25lbnQiLCJnZXRDb21wb25lbnREYXRhIiwiVVJMUGFyYW1XaW5zIiwiSW5zZXJ0SW5TZWxPcHQiLCJPRGF0YVYyIiwiX3NNb2RlIiwiX2V4cG9ydHMiLCJfaW5oZXJpdHNMb29zZSIsIl9wcm90byIsInByb3RvdHlwZSIsIl9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZSIsInVzaGVsbENvbnRhaW5lciIsInNhcCIsInVpIiwicmVxdWlyZSIsImdldFNlcnZpY2UiLCJfZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2VBc3luYyIsImdldFNlcnZpY2VBc3luYyIsInRoZW4iLCJvQ3Jvc3NBcHBOYXZTZXJ2aWNlIiwiY2F0Y2giLCJMb2ciLCJlcnJvciIsImdldFJvdXRlckZvciIsInJlZ2lzdGVyTmF2aWdhdGVDYWxsYmFjayIsImZuQ2FsbGJhY2siLCJfbmF2aWdhdGVDYWxsYmFjayIsIm5hdmlnYXRlIiwic1NlbWFudGljT2JqZWN0Iiwic0FjdGlvbk5hbWUiLCJ2TmF2aWdhdGlvblBhcmFtZXRlcnMiLCJvSW5uZXJBcHBEYXRhIiwiZm5PbkVycm9yIiwib0V4dGVybmFsQXBwRGF0YSIsInNOYXZNb2RlIiwic1NlbGVjdGlvblZhcmlhbnQiLCJtUGFyYW1ldGVycyIsIm9YQXBwRGF0YU9iaiIsIm9TdGFydHVwUGFyYW1ldGVycyIsImJFeFBsYWNlIiwib1RtcERhdGEiLCJvTmF2SGFuZGxlciIsIm9Db21wb25lbnREYXRhIiwic3RhcnR1cFBhcmFtZXRlcnMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJvRW5yaWNoZWRTZWxWYXIiLCJfc3BsaXRJbmJvdW5kTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJTZWxlY3Rpb25WYXJpYW50Iiwib05hdmlnYXRpb25TZWxWYXIiLCJ0b0pTT05TdHJpbmciLCJzZWxlY3Rpb25WYXJpYW50IiwiX3JlbW92ZVRlY2huaWNhbFBhcmFtZXRlcnMiLCJ0b0pTT05PYmplY3QiLCJfcmVtb3ZlTWVhc3VyZUJhc2VkSW5mb3JtYXRpb24iLCJfY2hlY2tJc1BvdGVudGlhbGx5U2Vuc2l0aXZlIiwiX2dldFVSTFBhcmFtZXRlcnNGcm9tU2VsZWN0aW9uVmFyaWFudCIsIm9OYXZBcmd1bWVudHMiLCJ0YXJnZXQiLCJzZW1hbnRpY09iamVjdCIsImFjdGlvbiIsInBhcmFtcyIsImZuTmF2aWdhdGUiLCJmbk5hdkV4cGxhY2UiLCJzTmV3SHJlZlByb21pc2UiLCJnZXRIcmVmIiwic05ld0hyZWYiLCJvcGVuV2luZG93Iiwib0Vycm9yIiwiX2ZuU2F2ZUFwcFN0YXRlQXN5bmMiLCJvU2F2ZUFwcFN0YXRlUmV0dXJuIiwiYXBwU3RhdGVLZXkiLCJwdG9FeHQiLCJmblN0b3JlQW5kTmF2aWdhdGUiLCJzdG9yZUlubmVyQXBwU3RhdGVBc3luYyIsInJlcGxhY2VIYXNoIiwib1RhcmdldHMiLCJpc05hdmlnYXRpb25TdXBwb3J0ZWQiLCJzdXBwb3J0ZWQiLCJ0ZWNobmljYWxFcnJvciIsIl9jcmVhdGVUZWNobmljYWxFcnJvciIsInBhcnNlTmF2aWdhdGlvbiIsInNBcHBIYXNoIiwiSGFzaENoYW5nZXIiLCJnZXRJbnN0YW5jZSIsImdldEhhc2giLCJzSUFwcFN0YXRlIiwiX2dldElubmVyQXBwU3RhdGVLZXkiLCJ3YXJuaW5nIiwiaHlicmlkSUFwcFN0YXRlS2V5UGFyYW1zIiwiaHlicmlkRGVmZXJyZWQiLCJqUXVlcnkiLCJEZWZlcnJlZCIsImlBcHBTdGF0ZUh5YnJpZERlZmVycmVkIiwiX2xvYWRBcHBTdGF0ZSIsImh5YnJpZCIsImFEZWZhdWx0ZWRQYXJhbWV0ZXJzIiwiSlNPTiIsInBhcnNlIiwib015RGVmZXJyZWQiLCJwYXJzZVVybFBhcmFtcyIsIm9TdWJTdGFydHVwUGFyYW1ldGVycyIsImFTdWJEZWZhdWx0ZWRQYXJhbWV0ZXJzIiwib1N1Yk15RGVmZXJyZWQiLCJzTmF2VHlwZSIsIm9TZWxWYXJzIiwiaXNFbXB0eSIsIm9EZWZhdWx0ZWRTZWxWYXIiLCJ4QXBwU3RhdGUiLCJyZWplY3QiLCJyZXNvbHZlIiwiaW5pdGlhbCIsIm9BcHBTdGF0ZURhdGEiLCJvU2VsZWN0aW9uVmFyaWFudCIsIm9EZWZhdWx0ZWRTZWxlY3Rpb25WYXJpYW50IiwiYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSIsInN1Y2Nlc3NIYW5kbGVySHlicmlkU3RhdGUiLCJpQXBwU3RhdGVEYXRhIiwiX3JlZiIsIm5hdlR5cGUiLCJpQXBwU3RhdGUiLCJmYWlsdXJlSGFuZGxlckh5YnJpZFN0YXRlIiwiZG9uZSIsImZhaWwiLCJiSXNYYXBwU3RhdGVOYXZpZ2F0aW9uIiwidGhhdCIsImdldFN0YXJ0dXBBcHBTdGF0ZSIsIm9BcHBTdGF0ZSIsImdldERhdGEiLCJzdHJpbmdpZnkiLCJ4IiwicHJvbWlzZSIsIm9TZWxWYXIiLCJVUkxQYXJhbXMiLCJzZXRUZWNobmljYWxQYXJhbWV0ZXJzIiwiYVRlY2huaWNhbFBhcmFtZXRlcnMiLCJBcnJheSIsImlzQXJyYXkiLCJnZXRUZWNobmljYWxQYXJhbWV0ZXJzIiwiY29uY2F0IiwiX2lzVGVjaG5pY2FsUGFyYW1ldGVyIiwic1BhcmFtZXRlck5hbWUiLCJ0b0xvd2VyQ2FzZSIsImluZGV4T2YiLCJpbmNsdWRlcyIsIl9pc0ZFUGFyYW1ldGVyIiwic1Byb3BOYW1lIiwiaSIsImFTZWxWYXJQcm9wTmFtZXMiLCJnZXRTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcyIsInJlbW92ZVNlbGVjdE9wdGlvbiIsIm9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkIiwiaGFzT3duUHJvcGVydHkiLCJnZXRQYXJhbWV0ZXJOYW1lcyIsIm1hc3NBZGRTZWxlY3RPcHRpb24iLCJnZXRWYWx1ZSIsIl9hZGRQYXJhbWV0ZXJWYWx1ZXMiLCJhUHJvcE5hbWVzIiwib1NlbFZhcmlhbnQiLCJzU2lnbiIsInNPcHRpb24iLCJvVmFsdWVzIiwiYWRkU2VsZWN0T3B0aW9uIiwib0hhc2hDaGFuZ2VyIiwic0FwcEhhc2hPbGQiLCJzQXBwSGFzaE5ldyIsIl9yZXBsYWNlSW5uZXJBcHBTdGF0ZUtleSIsIm1Jbm5lckFwcERhdGEiLCJiSW1tZWRpYXRlSGFzaFJlcGxhY2UiLCJiU2tpcEhhc2hSZXBsYWNlIiwiZm5SZXBsYWNlSGFzaCIsImlzRW1wdHlPYmplY3QiLCJzQXBwU3RhdGVLZXlDYWNoZWQiLCJiSW5uZXJBcHBEYXRhRXF1YWwiLCJmbk9uQWZ0ZXJTYXZlIiwiX3NhdmVBcHBTdGF0ZUFzeW5jIiwic3RvcmVJbm5lckFwcFN0YXRlIiwiX3NhdmVBcHBTdGF0ZSIsInN0b3JlSW5uZXJBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4iLCJvQXBwU3RhdGVQcm9taXNlIiwicHJvY2Vzc0JlZm9yZVNtYXJ0TGlua1BvcG92ZXJPcGVucyIsIm9UYWJsZUV2ZW50UGFyYW1ldGVycyIsIm1TZW1hbnRpY0F0dHJpYnV0ZXMiLCJzZW1hbnRpY0F0dHJpYnV0ZXMiLCJmblN0b3JlWGFwcEFuZENhbGxPcGVuIiwibVN1YlNlbWFudGljQXR0cmlidXRlcyIsInNTdWJTZWxlY3Rpb25WYXJpYW50IiwiaVN1cHByZXNzaW9uQmVoYXZpb3IiLCJyYWlzZUVycm9yT25OdWxsIiwicmFpc2VFcnJvck9uVW5kZWZpbmVkIiwib01peGVkU2VsVmFyIiwibWl4QXR0cmlidXRlc0FuZFNlbGVjdGlvblZhcmlhbnQiLCJmbk9uQ29udGFpbmVyU2F2ZSIsInNldFNlbWFudGljQXR0cmlidXRlcyIsInNldEFwcFN0YXRlS2V5Iiwib3BlbiIsIm9TdG9yZUlubmVyQXBwU3RhdGVQcm9taXNlIiwiX2dldEFwcFN0YXRlS2V5QW5kVXJsUGFyYW1ldGVycyIsIl9nZXRBcHBTcGVjaWZpY0hhc2giLCJhcHBIYXNoIiwiY3Jvc3NBcHBTZXJ2aWNlIiwiYXBwU3BlY2lmaWNSb3V0ZSIsIm1lc3NhZ2UiLCJFcnJvciIsIlN0cmluZyIsIl9taXhBdHRyaWJ1dGVzVG9TZWxWYXJpYW50Iiwic1Byb3BlcnR5TmFtZSIsInZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlIiwiRGF0ZSIsInRvSlNPTiIsInRvU3RyaW5nIiwiaWdub3JlRW1wdHlTdHJpbmciLCJpbmZvIiwidlNlbWFudGljQXR0cmlidXRlcyIsInN0YW5kYXJkIiwib05ld1NlbFZhcmlhbnQiLCJmaWx0ZXJVcmwiLCJnZXRGaWx0ZXJDb250ZXh0VXJsIiwic2V0RmlsdGVyQ29udGV4dFVybCIsImNvbnRleHRVcmwiLCJnZXRQYXJhbWV0ZXJDb250ZXh0VXJsIiwic2V0UGFyYW1ldGVyQ29udGV4dFVybCIsImZvckVhY2giLCJhUGFyYW1ldGVycyIsImdldFNlbGVjdE9wdGlvbiIsImdldFBhcmFtZXRlciIsImFTZWxPcHRpb25OYW1lcyIsImFTZWxlY3RPcHRpb24iLCJqIiwiU2lnbiIsIk9wdGlvbiIsIkxvdyIsIkhpZ2giLCJfZW5zdXJlU2VsZWN0aW9uVmFyaWFudEZvcm1hdFN0cmluZyIsInZTZWxlY3Rpb25WYXJpYW50IiwidkNvbnZlcnRlZFNlbGVjdGlvblZhcmlhbnQiLCJfZm5IYW5kbGVBcHBTdGF0ZVByb21pc2UiLCJvUmV0dXJuIiwiX3NhdmVBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4iLCJfZm5TYXZlQXBwU3RhdGVXaXRoSW1tZWRpYXRlUmV0dXJuIiwiZ2V0S2V5Iiwib0FwcERhdGFGb3JTYXZlIiwiX2ZldGNoQXBwRGF0YUZvclNhdmUiLCJzZXREYXRhIiwib1NhdmVQcm9taXNlIiwic2F2ZSIsImV4dGVuZCIsInRhYmxlVmFyaWFudElkIiwiY3VzdG9tRGF0YSIsInByZXNlbnRhdGlvblZhcmlhbnQiLCJ2YWx1ZVRleHRzIiwic2VtYW50aWNEYXRlcyIsIm9BcHBEYXRhQ2xvbmUiLCJPYmplY3QiLCJhc3NpZ24iLCJtZXJnZSIsImNyZWF0ZUVtcHR5QXBwU3RhdGUiLCJvRGVmZXJyZWQiLCJnZXRBcHBTdGF0ZSIsIm9BcHBEYXRhTG9hZGVkIiwiZGF0YSIsImJIYXNEZWZhdWx0ZWRQYXJhbXMiLCJiSGFzWEFwcFN0YXRlIiwiX2VucmljaERlZmF1bHRlZFNlbGVjdGlvblZhcmlhbnQiLCJzRGVmYXVsdGVkUGFyYW1ldGVyc0pzb24iLCJvWEFwcFN0YXRlIiwib1hBcHBTdGF0ZURhdGEiLCJvWEFwcFNlbFZhciIsInNQYXJhbU5hbWUiLCJhUmFuZ2VzIiwiYU1hdGNoZXMiLCJleGVjIiwic05ld0lBcHBTdGF0ZSIsImZuQXBwZW5kVG9RdWVyeVBhcmFtZXRlciIsInNTdWJBcHBIYXNoIiwidGVzdCIsInJlcGxhY2UiLCJzTmVlZGxlIiwiZm5SZXBsYWNlT2xkQXBwcm9hY2giLCJyT2xkQXBwcm9hY2giLCJhc3NlcnQiLCJtVVJMUGFyYW1ldGVycyIsImFTZWxlY3RQcm9wZXJ0aWVzIiwiYVNlbGVjdE9wdGlvbnMiLCJhUGFyYW1ldGVyTmFtZXMiLCJzUGFyYW1ldGVyVmFsdWUiLCJzRXJyb3JDb2RlIiwic2V0TW9kZWwiLCJvTW9kZWwiLCJfb01vZGVsIiwiX2dldE1vZGVsIiwiZ2V0TW9kZWwiLCJfcmVtb3ZlQWxsUHJvcGVydGllcyIsIm9EYXRhIiwiX3JlbW92ZVByb3BlcnRpZXMiLCJhRmlsdGVyTmFtZSIsImFQYXJhbWV0ZXJOYW1lIiwic05hbWUiLCJTZWxlY3RPcHRpb25zIiwic29tZSIsIm9WYWx1ZSIsIm5JZHgiLCJQcm9wZXJ0eU5hbWUiLCJzcGxpY2UiLCJUZXh0cyIsIm9UZXh0cyIsIlByb3BlcnR5VGV4dHMiLCJEYXRlcyIsIm9EYXRlcyIsIlBhcmFtZXRlcnMiLCJfaXNUZXJtVHJ1ZSIsIm9Qcm9wZXJ0eSIsInNUZXJtIiwiZklzVGVybURlZmF1bHRUcnVlIiwib1Rlcm0iLCJCb29sIiwiX2lzRXhjbHVkZWRGcm9tTmF2aWdhdGlvbkNvbnRleHQiLCJfaXNQb3RlbnRpYWxseVNlbnNpdGl2ZSIsIl9pc01lYXN1cmVQcm9wZXJ0eSIsIl9pc1RvQmVFeGNsdWRlZCIsImNvbnN0cnVjdENvbnRleHRVcmwiLCJzRW50aXR5U2V0TmFtZSIsIl9jb25zdHJ1Y3RDb250ZXh0VXJsIiwic1NlcnZlclVybCIsImlzQSIsIl9nZXRTZXJ2ZXJVcmwiLCJvU2VydmljZVVSSSIsIlVSSSIsImdldFNlcnZpY2VVcmwiLCJhYnNvbHV0ZVRvIiwiZG9jdW1lbnQiLCJiYXNlVVJJIiwibGFzdEluZGV4T2YiLCJzdWJzdHJpbmciLCJzU2VydmljZVVybCIsIm9BZGFwdGVkRGF0YSIsIkZpbHRlckNvbnRleHRVcmwiLCJQYXJhbWV0ZXJDb250ZXh0VXJsIiwiYVNlbnNpdGl2ZUZpbHRlck5hbWUiLCJhU2Vuc2l0aXZlUGFyYW1ldGVyTmFtZSIsIm9FbnRpdHlTZXQiLCJvRW50aXR5RGVmIiwib1N1YkVudGl0eURlZiIsIm9FbmRSb2xlIiwiYUZpbHRlckNvbnRleHRQYXJ0IiwiYVBhcmFtQ29udGV4dFBhcnQiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiZ2V0U2VydmljZU1ldGFkYXRhIiwic3BsaXQiLCJnZXRPRGF0YUVudGl0eVNldCIsImdldE9EYXRhRW50aXR5VHlwZSIsImVudGl0eVR5cGUiLCJwcm9wZXJ0eSIsInB1c2giLCJuYW1lIiwibmF2aWdhdGlvblByb3BlcnR5IiwiZ2V0T0RhdGFBc3NvY2lhdGlvbkVuZCIsInR5cGUiLCJtdWx0aXBsaWNpdHkiLCJfcmVtb3ZlU2Vuc2l0aXZlRGF0YUZvck9EYXRhVjQiLCJfcmVtb3ZlTWVhc3VyZUJhc2VkUHJvcGVydGllcyIsImFNZWFzdXJlRmlsdGVyTmFtZSIsImFNZWFzdXJlUGFyYW1ldGVyTmFtZSIsImJNZWFzdXJlIiwib1NWIiwiZ2V0T2JqZWN0Iiwic0VudGl0eVNldCIsImFQcm9wZXJ0eU5hbWVzIiwiZ2V0UHJvcGVydHlOYW1lcyIsImZuSXNTZW5zaXRpdmVEYXRhIiwic1Byb3AiLCJlc05hbWUiLCJhUHJvcGVydHlBbm5vdGF0aW9ucyIsIl9jaGVja1Byb3BlcnR5QW5ub3RhdGlvbnNGb3JTZW5zaXRpdmVEYXRhIiwib0ZpZWxkQ29udHJvbCIsImsiLCJzUHJvcGVydHkiLCJnZXRJQXBwU3RhdGVLZXkiLCJCYXNlT2JqZWN0IiwiTmF2aWdhdGlvbkhhbmRsZXJVSTVDbGFzcyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiTmF2aWdhdGlvbkhhbmRsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJzYXAvYmFzZS9hc3NlcnRcIjtcbmltcG9ydCBleHRlbmQgZnJvbSBcInNhcC9iYXNlL3V0aWwvZXh0ZW5kXCI7XG5pbXBvcnQgaXNFbXB0eU9iamVjdCBmcm9tIFwic2FwL2Jhc2UvdXRpbC9pc0VtcHR5T2JqZWN0XCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCBCYXNlT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9PYmplY3RcIjtcbmltcG9ydCB0eXBlIENvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50XCI7XG5pbXBvcnQgVUlDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL1VJQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sbGVyIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlclwiO1xuaW1wb3J0IEhhc2hDaGFuZ2VyIGZyb20gXCJzYXAvdWkvY29yZS9yb3V0aW5nL0hhc2hDaGFuZ2VyXCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvUm91dGVyXCI7XG5pbXBvcnQgdHlwZSBWMk9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92Mi9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBWNE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgVVJJIGZyb20gXCJzYXAvdWkvdGhpcmRwYXJ0eS9VUklcIjtcbmltcG9ydCBqUXVlcnkgZnJvbSBcInNhcC91aS90aGlyZHBhcnR5L2pxdWVyeVwiO1xuaW1wb3J0IG9wZW5XaW5kb3cgZnJvbSBcInNhcC91aS91dGlsL29wZW5XaW5kb3dcIjtcbmltcG9ydCB0eXBlIENvbnRhaW5lciBmcm9tIFwic2FwL3VzaGVsbC9Db250YWluZXJcIjtcbmltcG9ydCB0eXBlIENyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uIGZyb20gXCJzYXAvdXNoZWxsL3NlcnZpY2VzL0Nyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uXCI7XG5pbXBvcnQgdHlwZSBOYXZpZ2F0aW9uIGZyb20gXCJzYXAvdXNoZWxsL3NlcnZpY2VzL05hdmlnYXRpb25cIjtcbmltcG9ydCBOYXZFcnJvciBmcm9tIFwiLi9OYXZFcnJvclwiO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemVkU2VsZWN0aW9uVmFyaWFudCB9IGZyb20gXCIuL1NlbGVjdGlvblZhcmlhbnRcIjtcbmltcG9ydCBTZWxlY3Rpb25WYXJpYW50IGZyb20gXCIuL1NlbGVjdGlvblZhcmlhbnRcIjtcbmltcG9ydCBOYXZMaWJyYXJ5IGZyb20gXCIuL2xpYnJhcnlcIjtcblxudHlwZSBTaGVsbEFwcFN0YXRlUmV0dXJuID0ge1xuXHRwcm9taXNlOiBKUXVlcnkuUHJvbWlzZTxzdHJpbmc+O1xuXHRhcHBTdGF0ZUtleTogc3RyaW5nO1xufTtcblxudHlwZSBTaGVsbEFwcFN0YXRlID0ge1xuXHRnZXRLZXkoKTogc3RyaW5nO1xuXHRzZXREYXRhKG9iajogb2JqZWN0KTogdm9pZDtcblx0Z2V0RGF0YSgpOiBJbm5lckFwcERhdGE7XG5cdHNhdmUoKTogSlF1ZXJ5LlByb21pc2U8c3RyaW5nPjtcbn07XG4vKipcbiAqIFN0cnVjdHVyZSBvZiBzdG9yZWQgYXBwIHN0YXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElubmVyQXBwRGF0YSB7XG5cdFtrZXk6IHN0cmluZ106IHVua25vd247XG5cdC8qKlxuXHQgKiBTcmluZ2lmaWVkIEpTT04gb2JqZWN0IGFzIHJldHVybmVkLCBmb3IgZXhhbXBsZSwgZnJvbSBnZXREYXRhU3VpdGVGb3JtYXQoKSBvZiB0aGUgU21hcnRGaWx0ZXJCYXIgY29udHJvbFxuXHQgKi9cblx0c2VsZWN0aW9uVmFyaWFudD86IHN0cmluZyB8IFNlcmlhbGl6ZWRTZWxlY3Rpb25WYXJpYW50O1xuXG5cdC8qKlxuXHQgKiBJRCBvZiB0aGUgU21hcnRUYWJsZSB2YXJpYW50LlxuXHQgKi9cblx0dGFibGVWYXJpYW50SWQ/OiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIE9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIGFyYml0cmFyeSBkYXRhLlxuXHQgKi9cblx0Y3VzdG9tRGF0YT86IG9iamVjdDtcblxuXHQvKipcblx0ICogT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgdWkgc3RhdGUgb2YgdGhlIGFwcC5cblx0ICovXG5cdHByZXNlbnRhdGlvblZhcmlhbnQ/OiBvYmplY3Q7XG5cblx0LyoqXG5cdCAqIE9iamVjdCBjb250YWluaW5nIHZhbHVlIGRlc2NyaXB0aW9ucy5cblx0ICovXG5cdHZhbHVlVGV4dHM/OiBvYmplY3QgfCBudWxsO1xuXG5cdC8qKlxuXHQgKiBPYmplY3QgY29udGFpbmluZyBzZW1hbnRpY0RhdGVzIGZpbHRlciBpbmZvcm1hdGlvbi5cblx0ICovXG5cdHNlbWFudGljRGF0ZXM/OiBvYmplY3QgfCBudWxsO1xufVxuXG4vLyBzaG9ydGN1dHMgZm9yIHNhcC51aS5nZW5lcmljLmFwcCBlbnVtc1xuY29uc3QgTmF2VHlwZSA9IE5hdkxpYnJhcnkuTmF2VHlwZTtcbmNvbnN0IFBhcmFtSGFuZGxpbmdNb2RlID0gTmF2TGlicmFyeS5QYXJhbUhhbmRsaW5nTW9kZTtcbmNvbnN0IFN1cHByZXNzaW9uQmVoYXZpb3IgPSBOYXZMaWJyYXJ5LlN1cHByZXNzaW9uQmVoYXZpb3I7XG5jb25zdCBNb2RlID0gTmF2TGlicmFyeS5Nb2RlO1xuXG5jb25zdCBJQVBQX1NUQVRFID0gXCJzYXAtaWFwcC1zdGF0ZVwiO1xuY29uc3QgREVGQVVMVEVEX1BBUkFNRVRFUl9QUk9QRVJUWSA9IFwic2FwLXVzaGVsbC1kZWZhdWx0ZWRQYXJhbWV0ZXJOYW1lc1wiO1xuY29uc3QgSFlCUklEX0lBUFBfU1RBVEVfS0VZID0gXCJuaEh5YnJpZElBcHBTdGF0ZUtleVwiO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHN1Y2Nlc3NvciBvZiB7QGxpbmsgc2FwLnVpLmdlbmVyaWMuYXBwLm5hdmlnYXRpb24uc2VydmljZS5OYXZpZ2F0aW9uSGFuZGxlcn0uPGJyPiBDcmVhdGVzIGEgbmV3IE5hdmlnYXRpb25IYW5kbGVyIGNsYXNzIGJ5IHByb3ZpZGluZyB0aGUgcmVxdWlyZWQgZW52aXJvbm1lbnQuIDxicj5cbiAqIFRoZSA8Y29kZT5OYXZpZ2F0aW9uSGFuZGxlcjwvY29kZT4gc3VwcG9ydHMgdGhlIHZlcmlmaWNhdGlvbiBvZiBzZW5zaXRpdmUgaW5mb3JtYXRpb24uIEFsbCBwcm9wZXJ0aWVzIHRoYXQgYXJlIHBhcnQgb2ZcbiAqIDxjb2RlPnNlbGVjdGlvblZhcmlhbnQ8L2NvZGU+IGFuZCA8Y29kZT52YWx1ZVRleHRzPC9jb2RlPiB3aWxsIGJlIHZlcmlmaWVkIGlmIHRoZXkgYXJlIGFubm90YXRlZCBhc1xuICogPGNvZGU+Y29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxLklzUG90ZW50aWFsbHlTZW5zaXRpdmU8L2NvZGU+IG9yXG4gKiA8Y29kZT5jb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5FeGNsdWRlRnJvbU5hdmlnYXRpb25Db250ZXh0PC9jb2RlPiBhbmQgd2lsbCBiZSByZW1vdmVkIGJlZm9yZSB0aGUgZGF0YSBpcyBwZXJzaXN0ZWQgYXMgdGhlIGFwcFxuICogc3RhdGUuPGJyPlxuICogQWxzbywgYWxsIHByb3BlcnRpZXMgYW5ub3RhdGVkIGFzIDxjb2RlPmNvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5NZWFzdXJlPC9jb2RlPiB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgZGF0YSBzdG9yZWQgYXMgdGhlXG4gKiB4YXBwIHN0YXRlLjxicj5cbiAqIFRvIHZlcmlmeSB0aGUgaW5mb3JtYXRpb24gdG8gYmUgcmVtb3ZlZCwgdGhlIDxjb2RlPk5hdmlnYXRpb25IYW5kbGVyPC9jb2RlPiByZXF1aXJlcyBhbiB1bm5hbWVkIG1vZGVsIG9mIHR5cGVcbiAqIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjIuT0RhdGFNb2RlbH0gb24gY29tcG9uZW50IGxldmVsLiBJdCBpcyBwb3NzaWJsZSB0byBzZXQgc3VjaCBhIG1vZGVsIHVzaW5nIHRoZSA8Y29kZT5zZXRNb2RlbDwvY29kZT5cbiAqIG1ldGhvZC48YnI+XG4gKiA8Yj5Ob3RlOjwvYj4gVGhlIGNoZWNrIGZvciBleGNsdWRlZCBkYXRhIHJlcXVpcmVzIHRoYXQgdGhlIE9EYXRhIG1ldGFkYXRhIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkIGNvbXBsZXRlbHkuPGJyPlxuICogSWYgdGhlIE9EYXRhIG1ldGFkYXRhIG1vZGVsIGhhcyBub3QgYmVlbiBsb2FkZWQgY29tcGxldGVseSwgYWxsIHByb3BlcnRpZXMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgYXBwbGljYXRpb24gY29udGV4dC48YnI+XG4gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcyByZXF1aXJlcyB0aGF0IHRoZSBVU2hlbGwge0BsaW5rIHNhcC51c2hlbGwuc2VydmljZXMuQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb259IGlzIGF2YWlsYWJsZSBhbmQgaW5pdGlhbGl6ZWQuXG4gKiBAcHVibGljXG4gKiBAc2luY2UgMS44My4wXG4gKi9cbmV4cG9ydCBjbGFzcyBOYXZpZ2F0aW9uSGFuZGxlciBleHRlbmRzIEJhc2VPYmplY3Qge1xuXHRwcml2YXRlIG9Sb3V0ZXI6IGFueTtcblxuXHRwcml2YXRlIG9Db21wb25lbnQ6IENvbXBvbmVudDtcblxuXHRwcml2YXRlIF9vTW9kZWw6IGFueTtcblxuXHRwcml2YXRlIHNQYXJhbUhhbmRsaW5nTW9kZTogc3RyaW5nO1xuXG5cdHByaXZhdGUgX3NNb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cblx0Ly8gbGlzdCBvZiB0ZWNobmljYWwgcGFyYW1ldGVyc1xuXHRwcml2YXRlIF9hVGVjaG5pY2FsUGFyYW1hdGVycyA9IFtcImhjcEFwcGxpY2F0aW9uSWRcIl07XG5cblx0cHJpdmF0ZSBfb0xhc3RTYXZlZElubmVyQXBwRGF0YTogYW55ID0ge1xuXHRcdHNBcHBTdGF0ZUtleTogXCJcIixcblx0XHRvQXBwRGF0YToge30sXG5cdFx0aUNhY2hlSGl0OiAwLFxuXHRcdGlDYWNoZU1pc3M6IDBcblx0fTtcblxuXHQvKlxuXHQgKiBUaGVyZSBleGlzdHMgYSBnZW5lcmF0aW9uIG9mIFwib2xkXCIgc2FwLWlhcHAtc3RhdGVzIHdoaWNoIGFyZSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIFVSTCBzY2hlbWE6XG5cdCAqICNTZW1PYmotYWN0aW9uJi9yb3V0ZS9zYXAtaWFwcC1zdGF0ZT1BQkMxMjM0NTY3OCBUaGUgbmV3IFVSTCBzY2hlbWEgaXM6ICNTZW1PYmotYWN0aW9uJi9yb3V0ZT9zYXAtaWFwcC1zdGF0ZT1BQkMxMjM0NTY3OCAobWluZCB0aGVcblx0ICogZGlmZmVyZW5jZSBiZXR3ZWVuIC8gYW5kID8gYWJvdmUpLCBpLmUuIHRoZSBzYXAtaWFwcC1zdGF0ZSBoYXMgYmVjb21lIGEgcGFyYW1ldGVyIG9mIHRoZSBxdWVyeSBwYXJhbWV0ZXIgc2VjdGlvbiBpbiB0aGUgQXBwSGFzaCBzdHJpbmcuXG5cdCAqIFlldCwgdGhpcyB0b29sIHNoYWxsIGJlIGFibGUgdG8gZGVhbCBldmVuIHdpdGggb2xkIHNhcC1pYXBwLXN0YXRlcy4gVGhlcmVmb3JlLCB3ZSB1c2UgdHdvIFJlZ3VsYXIgRXhwcmVzc2lvbnMgKHJJQXBwU3RhdGVPbGQgYW5kXG5cdCAqIHJJQXBwU3RhdGVPbGRBdFN0YXJ0KSBhcyBkZWZpbmVkIGJlbG93IHRvIHNjYW4gZm9yIHRoZXNlIG9sZCB2YXJpYW50cy4gVGhlIG5ldyB2YXJpYW50IGlzIGJlaW5nIHNjYW5uZWQgdXNpbmcgcklBcHBTdGF0ZU5ldyBhcyBSZWd1bGFyXG5cdCAqIEV4cHJlc3Npb24gc2VhcmNoIHN0cmluZy4gQ29tcGF0aWJpbGl0eSBpcyBjZW50cmFsbHkgZW5zdXJlZCBieSB0aGUgdHdvIG1ldGhvZHMgX2dldElubmVyQXBwU3RhdGVLZXkgYW5kIF9yZXBsYWNlSW5uZXJBcHBTdGF0ZUtleSAoc2VlXG5cdCAqIGJlbG93KS4gTmV2ZXIgdXNlIHRoZXNlIFJlZ0V4cCBpbiBhIG1ldGhvZCBvbiB5b3VyIG93biwgYXMgaXQgdHlwaWNhbGx5IGluZGljYXRlcyB0aGF0IHlvdSB3aWxsIGZhbGwgaW50byB0aGUgY29tcGF0aWJpbGl0eSB0cmFwIVxuXHQgKi9cblx0Ly8gV2FybmluZyEgRG8gbm90IHVzZSBHTE9CQUwgZmxhZ3MgaGVyZTsgUmVnRXhwIGluIEdMT0JBTCBtb2RlIHN0b3JlIHRoZSBsYXN0SW5kZXggdmFsdWVcblx0Ly8gVGhlcmVmb3JlLCByZXBlYXRlZCBjYWxscyB0byB0aGUgUmVnRXhwIHdpbGwgdGhlbiBvbmx5IHN0YXJ0IGJlZ2lubmluZyB3aXRoIHRoYXQgc3RvcmVkXG5cdC8vIGxhc3RJbmRleC4gVGh1cywgbXVsdGlwbGUgY2FsbHMgdGhlcmVmb3JlIGNvdWxkIHlpZWxkIHN0cmFuZ2UgcmVzdWx0cy5cblx0Ly8gTW9yZW92ZXIsIHRoZXJlIHNoYWxsIG9ubHkgYmUgZXhhY3RseSBvbmUgSUFQUF9TVEFURSBwZXIgUmVnRXhwIGluIGFuIEFwcEhhc2guXG5cdC8vIFRoZXJlZm9yZSwgR0xPQkFMIHNlYXJjaCBzaG91bGQgYmUgc3VwZXJmbHVvdXMuXG5cdHByaXZhdGUgX3JJQXBwU3RhdGVPbGQgPSBuZXcgUmVnRXhwKFwiL1wiICsgSUFQUF9TVEFURSArIFwiPShbXi8/XSspXCIpO1xuXG5cdHByaXZhdGUgX3JJQXBwU3RhdGVPbGRBdFN0YXJ0ID0gbmV3IFJlZ0V4cChcIl5cIiArIElBUFBfU1RBVEUgKyBcIj0oW14vP10rKVwiKTtcblxuXHQvKlxuXHQgKiBSZWd1bGFyIEV4cHJlc3Npb24gaW4gd29yZHM6IFNlYXJjaCBmb3Igc29tZXRoaW5nIHRoYXQgZWl0aGVyIHN0YXJ0cyB3aXRoID8gb3IgJiwgZm9sbG93ZWQgYnkgdGhlIHRlcm0gXCJzYXAtaWFwcC1zdGF0ZVwiLiBUaGF0IG9uZSBpc1xuXHQgKiBmb2xsb3dlZCBieSBhbiBlcXVhbCBzaWduICg9KS4gVGhlIHN0dWZmIHRoYXQgaXMgYWZ0ZXIgdGhlIGVxdWFsIHNpZ24gZm9ybXMgdGhlIGZpcnN0IHJlZ2V4cCBncm91cC4gVGhpcyBncm91cCBjb25zaXN0cyBvZiBhdCBsZWFzdCBvbmVcblx0ICogKG9yIGFyYml0cmFyeSBtYW55KSBjaGFyYWN0ZXJzLCBhcyBsb25nIGFzIGl0IGlzIG5vdCBhbiBhbXBlcnNhbmQgc2lnbiAoJikuIENoYXJhY3RlcnMgYWZ0ZXIgc3VjaCBhbiBhbXBlcnNhbmQgd291bGQgYmUgaWdub3JlZCBhbmQgZG9cblx0ICogbm90IGJlbG9uZyB0byB0aGUgZ3JvdXAuIEFsdGVybmF0aXZlbHksIHRoZSBzdHJpbmcgYWxzbyBtYXkgZW5kLlxuXHQgKi9cblx0cHJpdmF0ZSBfcklBcHBTdGF0ZU5ldyA9IG5ldyBSZWdFeHAoXCJbPyZdXCIgKyBJQVBQX1NUQVRFICsgXCI9KFteJl0rKVwiKTtcblxuXHRwcml2YXRlIF9uYXZpZ2F0ZUNhbGxiYWNrOiBGdW5jdGlvbiB8IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogVGVtcG9yYXJpbHkgYWRkZWQgYWdhaW4gYmVjYXVzZSBhbiBhcHBsaWNhdGlvbiB3YXMgKGlsbGVnaWFsbHkpIHJlbHlpbmcgb24gaXQuIFNob3VsZCBiZSByZW1vdmVkIGFnYWluLCBvbmNlIHRoZSBhcHAgaXMgY29ycmVjdGVkXG5cdCAqL1xuXHRwcml2YXRlIElBUFBfU1RBVEUgPSBJQVBQX1NUQVRFO1xuXG5cdC8qKlxuXHQgKiBDb25zdHJ1Y3RvciByZXF1aXJpbmcgYSBjb250cm9sbGVyL2NvbXBvbmVudCBvd25pbmcgdGhlIG5hdmlnYXRpb24gaGFuZGxlci5cblx0ICogQHBhcmFtIG9Db250cm9sbGVyIFVJNSBjb250cm9sbGVyIHRoYXQgY29udGFpbnMgYSByb3V0ZXIgYW5kIGEgY29tcG9uZW50OyB0eXBpY2FsbHkgdGhlIG1haW4gY29udHJvbGxlciBvZiB5b3VyIGFwcGxpY2F0aW9uLCBmb3Jcblx0ICogICAgICAgIGV4YW1wbGUsIGEgc3ViY2xhc3Mgb2YgdGhlIHNhcC5jYS5zY2ZsZC5tZC5jb250cm9sbGVyLkJhc2VGdWxsc2NyZWVuQ29udHJvbGxlciBpZiBzY2FmZm9sZGluZyBpcyB1c2VkXG5cdCAqIEBwYXJhbSBzTW9kZSBNb2RlIHRvIGJlIHVzZWQgdG8gaW5kaWNhdGVzIHRoZSBPZGF0YSB2ZXJzaW9uIHVzZWQgZm9yIHJ1bm5uaW5nIHRoZSBOYXZpZ2F0aW9uIEhhbmRsZXIsXG5cdCAqICAgICAgICBzZWUge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk1vZGV9Ljxicj5cblx0ICogXHRcdCAgTm90ZTogTW9kZSBoYXMgdG8gYmUgc2FwLmZlLm5hdmlnYXRpb24uTW9kZS5PRGF0YVYyIHdoZW5ldmVyIHRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB0byBpbml0aWFsaXplIGEgT0RhdGEgVjIgYmFzZWQgc2VydmljZS5cblx0ICogQHBhcmFtIHNQYXJhbUhhbmRsaW5nTW9kZSBNb2RlIHRvIGJlIHVzZWQgdG8gaGFuZGxlIGNvbmZsaWN0cyB3aGVuIG1lcmdpbmcgVVJMIHBhcmFtZXRlcnMgYW5kIHRoZSBTZWxlY3Rpb25WYXJpYW50IGNsYXNzLFxuXHQgKiAgICAgICAgc2VlIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5QYXJhbUhhbmRsaW5nTW9kZX1cblx0ICogQHRocm93cyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2RXJyb3J9IGluIGNhc2Ugb2YgaW5wdXQgZXJyb3JzLiBWYWxpZCBlcnJvciBjb2RlcyBhcmU6IDx0YWJsZT5cblx0ICogICAgICAgICA8dHI+XG5cdCAqICAgICAgICAgPHRoIGFsaWduPVwibGVmdFwiPk5hdkVycm9yIGNvZGU8L3RoPlxuXHQgKiAgICAgICAgIDx0aCBhbGlnbj1cImxlZnRcIj5EZXNjcmlwdGlvbjwvdGg+XG5cdCAqICAgICAgICAgPC90cj5cblx0ICogICAgICAgICA8dHI+XG5cdCAqICAgICAgICAgPHRkPk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVQ8L3RkPlxuXHQgKiAgICAgICAgIDx0ZD5JbmRpY2F0ZXMgdGhhdCB0aGUgaW5wdXQgcGFyYW1ldGVyIGlzIGludmFsaWQ8L3RkPlxuXHQgKiAgICAgICAgIDwvdHI+XG5cdCAqICAgICAgICAgPC90YWJsZT5cblx0ICovXG5cdGNvbnN0cnVjdG9yKFxuXHRcdG9Db250cm9sbGVyOiBDb250cm9sbGVyIHwgVUlDb21wb25lbnQsXG5cdFx0c01vZGU6IHN0cmluZyA9IE1vZGUuT0RhdGFWNCxcblx0XHRzUGFyYW1IYW5kbGluZ01vZGU6IHN0cmluZyA9IFBhcmFtSGFuZGxpbmdNb2RlLlNlbFZhcldpbnNcblx0KSB7XG5cdFx0c3VwZXIoKTtcblx0XHRpZiAoIW9Db250cm9sbGVyKSB7XG5cdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUXCIpO1xuXHRcdH1cblxuXHRcdGlmIChvQ29udHJvbGxlciBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KSB7XG5cdFx0XHR0aGlzLm9Sb3V0ZXIgPSBvQ29udHJvbGxlci5nZXRSb3V0ZXIoKTtcblx0XHRcdHRoaXMub0NvbXBvbmVudCA9IG9Db250cm9sbGVyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAodHlwZW9mIG9Db250cm9sbGVyLmdldE93bmVyQ29tcG9uZW50ICE9PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5vUm91dGVyID0gdGhpcy5fZ2V0Um91dGVyKG9Db250cm9sbGVyKTtcblx0XHRcdHRoaXMub0NvbXBvbmVudCA9IG9Db250cm9sbGVyLmdldE93bmVyQ29tcG9uZW50KCkgYXMgQ29tcG9uZW50O1xuXHRcdH1cblxuXHRcdC8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIFNtYXJ0VGVtcGxhdGVzXG5cdFx0aWYgKHRoaXMub0NvbXBvbmVudCAmJiAodGhpcy5vQ29tcG9uZW50IGFzIHsgZ2V0QXBwQ29tcG9uZW50PzogRnVuY3Rpb24gfSkuZ2V0QXBwQ29tcG9uZW50KSB7XG5cdFx0XHR0aGlzLm9Db21wb25lbnQgPSAodGhpcy5vQ29tcG9uZW50IGFzIHsgZ2V0QXBwQ29tcG9uZW50PzogRnVuY3Rpb24gfSkuZ2V0QXBwQ29tcG9uZW50Py4oKTtcblx0XHR9XG5cblx0XHRpZiAoXG5cdFx0XHR0eXBlb2YgdGhpcy5vUm91dGVyID09PSBcInVuZGVmaW5lZFwiIHx8XG5cdFx0XHR0eXBlb2YgdGhpcy5vQ29tcG9uZW50ID09PSBcInVuZGVmaW5lZFwiIHx8XG5cdFx0XHR0eXBlb2YgdGhpcy5vQ29tcG9uZW50LmdldENvbXBvbmVudERhdGEgIT09IFwiZnVuY3Rpb25cIlxuXHRcdCkge1xuXHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHR9XG5cblx0XHRpZiAoc1BhcmFtSGFuZGxpbmdNb2RlID09PSBQYXJhbUhhbmRsaW5nTW9kZS5VUkxQYXJhbVdpbnMgfHwgc1BhcmFtSGFuZGxpbmdNb2RlID09PSBQYXJhbUhhbmRsaW5nTW9kZS5JbnNlcnRJblNlbE9wdCkge1xuXHRcdFx0dGhpcy5zUGFyYW1IYW5kbGluZ01vZGUgPSBzUGFyYW1IYW5kbGluZ01vZGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc1BhcmFtSGFuZGxpbmdNb2RlID0gUGFyYW1IYW5kbGluZ01vZGUuU2VsVmFyV2luczsgLy8gZGVmYXVsdFxuXHRcdH1cblx0XHRpZiAoc01vZGUgPT09IE1vZGUuT0RhdGFWMikge1xuXHRcdFx0dGhpcy5fc01vZGUgPSBzTW9kZTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBzaGVsbCBuYXZpZ2F0aW9uIHNlcnZpY2UuXG5cdCAqIEByZXR1cm5zIFRoZSBOYXZpZ2F0aW9uIHNlcnZpY2Vcblx0ICogQHByaXZhdGVcblx0ICovXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuXHRfZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2UoKTogQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb24ge1xuXHRcdGNvbnN0IHVzaGVsbENvbnRhaW5lcjogQ29udGFpbmVyID0gc2FwLnVpLnJlcXVpcmUoXCJzYXAvdXNoZWxsL0NvbnRhaW5lclwiKTtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cblx0XHRyZXR1cm4gdXNoZWxsQ29udGFpbmVyLmdldFNlcnZpY2UoXCJDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvblwiKSBhcyBDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHNoZWxsIG5hdmlnYXRpb24gc2VydmljZS5cblx0ICogQHJldHVybnMgVGhlIE5hdmlnYXRpb24gc2VydmljZVxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0YXN5bmMgX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlQXN5bmMoKTogUHJvbWlzZTxOYXZpZ2F0aW9uPiB7XG5cdFx0Y29uc3QgdXNoZWxsQ29udGFpbmVyOiBDb250YWluZXIgPSBzYXAudWkucmVxdWlyZShcInNhcC91c2hlbGwvQ29udGFpbmVyXCIpO1xuXHRcdHJldHVybiB1c2hlbGxDb250YWluZXJcblx0XHRcdD8uZ2V0U2VydmljZUFzeW5jKFwiTmF2aWdhdGlvblwiKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9Dcm9zc0FwcE5hdlNlcnZpY2U6IG9iamVjdCkge1xuXHRcdFx0XHRyZXR1cm4gb0Nyb3NzQXBwTmF2U2VydmljZSBhcyBOYXZpZ2F0aW9uO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyOiBOYXZpZ2F0aW9uIGlzIG5vdCBhdmFpbGFibGUuXCIpO1xuXHRcdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5OTy5YQVBQU0VSVklDRVwiKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgcmVmZXJlbmNlIHRvIHRoZSByb3V0ZXIgb2JqZWN0IGZvciBuYXZpZ2F0aW9uIGZvciB0aGlzIGdpdmVuIENvbnRyb2xsZXIuXG5cdCAqIEBwYXJhbSBvQ29udHJvbGxlciBUaGUgcmVmZXJlbmNlIHRvIHRoZSBDb250cm9sbGVyIGZvciB3aGljaCB0aGUgUm91dGVyIGluc3RhbmNlIHNoYWxsIGJlIGRldGVybWluZWQuXG5cdCAqIEByZXR1cm5zIFRoZSBSb3V0ZXIgZm9yIHRoZSBnaXZlbiBDb250cm9sbGVyXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfZ2V0Um91dGVyKG9Db250cm9sbGVyOiBDb250cm9sbGVyKTogUm91dGVyIHtcblx0XHRyZXR1cm4gVUlDb21wb25lbnQuZ2V0Um91dGVyRm9yKG9Db250cm9sbGVyKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyB0byBiZSB1c2VkIG9ubHkgYnkgRkUgVjIgdG8gZ2V0IGFjY2VzcyB0byB0b0V4dGVybmFsIHByb21pc2UuXG5cdCAqIEBwYXJhbSBmbkNhbGxiYWNrIENhbGxiYWNrIHRvIGJlIGNhbGxlZCBieSAnbmF2aWdhdGUnIG1ldGhvZCBpbiBjYXNlIG9mIHRvRXh0ZXJuYWwgaXMgdXNlZCB0byBuYXZpZ2F0ZS5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdHJlZ2lzdGVyTmF2aWdhdGVDYWxsYmFjayhmbkNhbGxiYWNrOiBGdW5jdGlvbik6IHZvaWQge1xuXHRcdHRoaXMuX25hdmlnYXRlQ2FsbGJhY2sgPSBmbkNhbGxiYWNrO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRyaWdnZXJzIGEgY3Jvc3MtYXBwIG5hdmlnYXRpb24gYWZ0ZXIgc2F2aW5nIHRoZSBpbm5lciBhbmQgdGhlIGNyb3NzLWFwcCBzdGF0ZXMuIFRoZSBuYXZpZ2F0aW9uIG1vZGUgYmFzZWQgb25cblx0ICogPGNvZGU+c2FwLXVzaGVsbC1uZXh0LW5hdm1vZGU8L2NvZGU+IGlzIHRha2VuIGludG8gYWNjb3VudC4gSWYgc2V0IHRvIDxjb2RlPmV4cGxhY2U8L2NvZGU+IHRoZSBpbm5lciBhcHAgc3RhdGUgd2lsbCBub3QgYmUgY2hhbmdlZC5cblx0ICogPGI+Tm90ZTo8L2I+IFRoZSA8Y29kZT5zTmF2TW9kZTwvY29kZT4gYXJndW1lbnQgY2FuIGJlIHVzZWQgdG8gb3ZlcndyaXRlIHRoZSBTQVAgRmlvcmkgbGF1bmNocGFkIGRlZmF1bHQgbmF2aWdhdGlvbiBmb3Igb3BlbmluZyBhIFVSTFxuXHQgKiBpbi1wbGFjZSBvciBleC1wbGFjZS5cblx0ICogPGJyPlxuXHQgKiA8Yj5Ob2RlOjwvYj4gSWYgdGhlIDxjb2RlPm9FeHRlcm5hbEFwcERhdGE8L2NvZGU+IHBhcmFtZXRlciBpcyBub3Qgc3VwcGxpZWQsIHRoZSBleHRlcm5hbCBhcHAgZGF0YSB3aWxsIGJlIGNhbGN1bGF0ZWQgYmFzZWQgb25cblx0ICogdGhlIDxjb2RlPm9Jbm5lckFwcERhdGE8L2NvZGU+IGRhdGEuPGJyPlxuXHQgKiBTbWFydEZpbHRlckJhciBjb250cm9sIDxiPlBhcmFtZXRlcnM6PC9iPiA8dGFibGU+XG5cdCAqIDx0cj5cblx0ICogPHRkIGFsaWduPVwiY2VudGVyXCI+e29iamVjdH08L3RkPlxuXHQgKiA8dGQ+PGI+b0Vycm9yPC9iPjwvdGQ+XG5cdCAqIDx0ZD5OYXZFcnJvciBvYmplY3QgKGluc3RhbmNlIG9mIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZFcnJvcn0pIHRoYXQgZGVzY3JpYmVzIHdoaWNoIGtpbmQgb2YgZXJyb3Igb2NjdXJyZWQ8L3RkPlxuXHQgKiA8dHI+XG5cdCAqIDx0ZCBhbGlnbj1cImNlbnRlclwiPntzdHJpbmd9PC90ZD5cblx0ICogPHRkPjxiPm9FcnJvci5lcnJvckNvZGU8L2I+PC90ZD5cblx0ICogPHRkPkNvZGUgdG8gaWRlbnRpZnkgdGhlIGVycm9yPC90ZD5cblx0ICogPHRyPlxuXHQgKiA8dGQgYWxpZ249XCJjZW50ZXJcIj57c3RyaW5nfTwvdGQ+XG5cdCAqIDx0ZD48Yj5vRXJyb3IudHlwZTwvYj48L3RkPlxuXHQgKiA8dGQ+U2V2ZXJpdHkgb2YgdGhlIGVycm9yIChpbmZvL3dhcm5pbmcvZXJyb3IpPC90ZD5cblx0ICogPHRyPlxuXHQgKiA8dGQgYWxpZ249XCJjZW50ZXJcIj57YXJyYXl9PC90ZD5cblx0ICogPHRkPjxiPm9FcnJvci5wYXJhbXM8L2I+PC90ZD5cblx0ICogPHRkPkFuIGFycmF5IG9mIG9iamVjdHMgKHR5cGljYWxseSBzdHJpbmdzKSB0aGF0IGRlc2NyaWJlIGFkZGl0aW9uYWwgdmFsdWUgcGFyYW1ldGVycyByZXF1aXJlZCBmb3IgZ2VuZXJhdGluZyB0aGUgbWVzc2FnZTwvdGQ+XG5cdCAqIDwvdGFibGU+LlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSBzU2VtYW50aWNPYmplY3QgTmFtZSBvZiB0aGUgc2VtYW50aWMgb2JqZWN0IG9mIHRoZSB0YXJnZXQgYXBwXG5cdCAqIEBwYXJhbSBzQWN0aW9uTmFtZSBOYW1lIG9mIHRoZSBhY3Rpb24gb2YgdGhlIHRhcmdldCBhcHBcblx0ICogQHBhcmFtIHZOYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnMgYXMgYW4gb2JqZWN0IHdpdGgga2V5L3ZhbHVlIHBhaXJzIG9yIGFzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHN1Y2ggYW4gb2JqZWN0LiBJZiBwYXNzZWQgYXMgYW4gb2JqZWN0LCB0aGUgcHJvcGVydGllcyBhcmUgbm90IGNoZWNrZWQgYWdhaW5zdCB0aGUgPGNvZGU+SXNQb3RlbnRpYWxTZW5zaXRpdmU8L2NvZGU+IG9yIDxjb2RlPk1lYXN1cmU8L2NvZGU+IHR5cGUuXG5cdCAqIEBwYXJhbSBvSW5uZXJBcHBEYXRhIE9iamVjdCBmb3Igc3RvcmluZyBjdXJyZW50IHN0YXRlIG9mIHRoZSBhcHBcblx0ICogQHBhcmFtIGZuT25FcnJvciBDYWxsYmFjayB0aGF0IGlzIGNhbGxlZCBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIG5hdmlnYXRpb24gPGJyPlxuXHQgKiBAcGFyYW0gb0V4dGVybmFsQXBwRGF0YSBPYmplY3QgZm9yIHN0b3JpbmcgdGhlIHN0YXRlIHdoaWNoIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZSB0YXJnZXQgY29tcG9uZW50LlxuXHQgKiBAcGFyYW0gb0V4dGVybmFsQXBwRGF0YS5wcmVzZW50YXRpb25WYXJpYW50IE9iamVjdCBjb250YWluaW5nIHRoZSBjdXJyZW50IHVpIHN0YXRlIG9mIHRoZSBhcHAgd2hpY2ggd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlXG5cdCAqICAgICAgICB0YXJnZXQgY29tcG9uZW50LlxuXHQgKiBAcGFyYW0gb0V4dGVybmFsQXBwRGF0YS52YWx1ZVRleHRzIE9iamVjdCBjb250YWluaW5nIHZhbHVlIGRlc2NyaXB0aW9ucyB3aGljaCB3aWxsIGJlIGZvcndhcmRlZCB0byB0aGUgdGFyZ2V0IGNvbXBvbmVudC5cblx0ICogQHBhcmFtIG9FeHRlcm5hbEFwcERhdGEuc2VsZWN0aW9uVmFyaWFudCBTdHJpbmdpZmllZCBKU09OIG9iamVjdCwgd2hpY2ggd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlIHRhcmdldCBjb21wb25lbnQuIElmIG5vdFxuXHQgKiAgICAgICAgcHJvdmlkZWQgdGhlIHNlbGVjdGlvblZhcmlhbnQgd2lsbCBiZSBjb25zdHJ1Y3RlZCBiYXNlZCBvbiB0aGUgdk5hdmlnYXRpb25QYXJhbWV0ZXJzLlxuXHQgKiBAcGFyYW0gc05hdk1vZGUgQXJndW1lbnQgaXMgdXNlZCB0byBvdmVyd3JpdGUgdGhlIEZMUC1jb25maWd1cmVkIHRhcmdldCBmb3Igb3BlbmluZyBhIFVSTC4gSWYgdXNlZCwgb25seSB0aGVcblx0ICogICAgICAgIDxjb2RlPmV4cGxhY2U8L2NvZGU+IG9yIDxjb2RlPmlucGxhY2U8L2NvZGU+IHZhbHVlcyBhcmUgYWxsb3dlZC4gQW55IG90aGVyIHZhbHVlIHdpbGwgbGVhZCB0byBhbiBleGNlcHRpb25cblx0ICogICAgICAgIDxjb2RlPk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfTkFWX01PREU8L2NvZGU+LlxuXHQgKiBAZXhhbXBsZSA8Y29kZT5cblx0ICogc2FwLnVpLmRlZmluZShbXCJzYXAvZmUvbmF2aWdhdGlvbi9OYXZpZ2F0aW9uSGFuZGxlclwiLCBcInNhcC9mZS9uYXZpZ2F0aW9uL1NlbGVjdGlvblZhcmlhbnRcIl0sIGZ1bmN0aW9uIChOYXZpZ2F0aW9uSGFuZGxlciwgU2VsZWN0aW9uVmFyaWFudCkge1xuXHQgKiBcdHZhciBvTmF2aWdhdGlvbkhhbmRsZXIgPSBuZXcgTmF2aWdhdGlvbkhhbmRsZXIob0NvbnRyb2xsZXIpO1xuXHQgKiBcdHZhciBzU2VtYW50aWNPYmplY3QgPSBcIlNhbGVzT3JkZXJcIjtcblx0ICogXHR2YXIgc0FjdGlvbk5hbWUgPSBcImNyZWF0ZVwiO1xuXHQgKlxuXHQgKiBcdC8vc2ltcGxlIHBhcmFtZXRlcnMgYXMgT2JqZWN0XG5cdCAqIFx0dmFyIHZOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IHtcblx0ICogXHRcdENvbXBhbnlDb2RlIDogXCIwMDAxXCIsXG5cdCAqIFx0XHRDdXN0b21lciA6IFwiQzAwMDFcIlxuXHQgKiBcdH07XG5cdCAqXG5cdCAqIFx0Ly9vciBhcyBzZWxlY3Rpb24gdmFyaWFudFxuXHQgKiBcdHZhciBvU2VsZWN0aW9uVmFyaWFudCA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KCk7XG5cdCAqXHQgb1NlbGVjdGlvblZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKFwiQ29tcGFueUNvZGVcIiwgXCJJXCIsIFwiRVFcIiwgXCIwMDAxXCIpO1xuXHQgKiBcdG9TZWxlY3Rpb25WYXJpYW50LmFkZFNlbGVjdE9wdGlvbihcIkN1c3RvbWVyXCIsIFwiSVwiLCBcIkVRXCIsIFwiQzAwMDFcIik7XG5cdCAqIFx0dk5hdmlnYXRpb25QYXJhbWV0ZXJzID0gb1NlbGVjdGlvblZhcmlhbnQudG9KU09OU3RyaW5nKCk7XG5cdCAqXG5cdCAqIFx0Ly9vciBkaXJlY3RseSBmcm9tIFNtYXJ0RmlsdGVyQmFyXG5cdCAqIFx0dk5hdmlnYXRpb25QYXJhbWV0ZXJzID0gb1NtYXJ0RmlsdGVyQmFyLmdldERhdGFTdWl0ZUZvcm1hdCgpO1xuXHQgKlxuXHQgKiBcdC8vYXBwIHN0YXRlIGZvciBiYWNrIG5hdmlnYXRpb25cblx0ICpcdCB2YXIgb0lubmVyQXBwRGF0YSA9IHtcblx0ICogXHRcdHNlbGVjdGlvblZhcmlhbnQgOiBvU21hcnRGaWx0ZXJCYXIuZ2V0RGF0YVN1aXRlRm9ybWF0KCksXG5cdCAqIFx0XHR0YWJsZVZhcmlhbnRJZCA6IG9TbWFydFRhYmxlLmdldEN1cnJlbnRWYXJpYW50SWQoKSxcblx0ICogXHRcdGN1c3RvbURhdGEgOiBvTXlDdXN0b21EYXRhXG5cdCAqIFx0fTtcblx0ICpcblx0ICogXHQvLyBjYWxsYmFjayBmdW5jdGlvbiBpbiBjYXNlIG9mIGVycm9yc1xuXHQgKiBcdHZhciBmbk9uRXJyb3IgPSBmdW5jdGlvbihvRXJyb3Ipe1xuXHQgKiBcdFx0dmFyIG9pMThuID0gb0NvbnRyb2xsZXIuZ2V0VmlldygpLmdldE1vZGVsKFwiaTE4blwiKS5nZXRSZXNvdXJjZUJ1bmRsZSgpO1xuXHQgKiBcdFx0b0Vycm9yLnNldFVJVGV4dCh7b2kxOG4gOiBvaTE4biwgc1RleHRLZXkgOiBcIk9VVEJPVU5EX05BVl9FUlJPUlwifSk7XG5cdCAqIFx0XHRvRXJyb3Iuc2hvd01lc3NhZ2VCb3goKTtcblx0ICogXHR9O1xuXHQgKlxuXHQgKiBcdG9OYXZpZ2F0aW9uSGFuZGxlci5uYXZpZ2F0ZShzU2VtYW50aWNPYmplY3QsIHNBY3Rpb25OYW1lLCB2TmF2aWdhdGlvblBhcmFtZXRlcnMsIG9Jbm5lckFwcERhdGEsIGZuT25FcnJvcik7XG5cdCAqIH0pO1xuXHQgKiA8L2NvZGU+XG5cdCAqL1xuXHRuYXZpZ2F0ZShcblx0XHRzU2VtYW50aWNPYmplY3Q6IHN0cmluZyxcblx0XHRzQWN0aW9uTmFtZTogc3RyaW5nLFxuXHRcdHZOYXZpZ2F0aW9uUGFyYW1ldGVyczogb2JqZWN0IHwgc3RyaW5nLFxuXHRcdG9Jbm5lckFwcERhdGE/OiBJbm5lckFwcERhdGEsXG5cdFx0Zm5PbkVycm9yPzogRnVuY3Rpb24sXG5cdFx0b0V4dGVybmFsQXBwRGF0YT86IHtcblx0XHRcdHZhbHVlVGV4dHM/OiBvYmplY3QgfCB1bmRlZmluZWQ7XG5cdFx0XHRwcmVzZW50YXRpb25WYXJpYW50Pzogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRcdFx0c2VsZWN0aW9uVmFyaWFudD86IG9iamVjdCB8IHVuZGVmaW5lZDtcblx0XHR9LFxuXHRcdHNOYXZNb2RlPzogc3RyaW5nXG5cdCk6IHZvaWQge1xuXHRcdGxldCBzU2VsZWN0aW9uVmFyaWFudDogYW55LFxuXHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRvWEFwcERhdGFPYmo6IGFueSxcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVycyxcblx0XHRcdGJFeFBsYWNlID0gZmFsc2UsXG5cdFx0XHRvVG1wRGF0YTogYW55ID0ge307XG5cdFx0Y29uc3Qgb05hdkhhbmRsZXI6IE5hdmlnYXRpb25IYW5kbGVyID0gdGhpcztcblxuXHRcdGNvbnN0IG9Db21wb25lbnREYXRhID0gdGhpcy5vQ29tcG9uZW50LmdldENvbXBvbmVudERhdGEoKSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXHRcdC8qXG5cdFx0ICogVGhlcmUgYXJlIHNvbWUgcmFjZSBjb25kaXRpb25zIHdoZXJlIHRoZSBvQ29tcG9uZW50RGF0YSBtYXkgbm90IGJlIHNldCwgZm9yIGV4YW1wbGUgaW4gY2FzZSB0aGUgVVNoZWxsIHdhcyBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkuIFRvXG5cdFx0ICogbWFrZSBzdXJlIHRoYXQgd2UgZG8gbm90IGR1bXAgaGVyZSB3aXRoIGFuIGV4Y2VwdGlvbiwgd2UgdGFrZSB0aGlzIHNwZWNpYWwgZXJyb3IgaGFuZGxpbmcgYmVoYXZpb3I6XG5cdFx0ICovXG5cdFx0aWYgKG9Db21wb25lbnREYXRhKSB7XG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMgPSBvQ29tcG9uZW50RGF0YS5zdGFydHVwUGFyYW1ldGVycztcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMgJiZcblx0XHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzW1wic2FwLXVzaGVsbC1uZXh0LW5hdm1vZGVcIl0gJiZcblx0XHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzW1wic2FwLXVzaGVsbC1uZXh0LW5hdm1vZGVcIl0ubGVuZ3RoID4gMFxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIGJFeFBsYWNlID0gKEpTT04ucGFyc2Uob1N0YXJ0dXBQYXJhbWV0ZXJzW1wic2FwLXVzaGVsbC1uZXh0LW5hdm1vZGVcIl1bMF0pID09PSBcImV4cGxhY2VcIik7XG5cdFx0XHRcdGJFeFBsYWNlID0gb1N0YXJ0dXBQYXJhbWV0ZXJzW1wic2FwLXVzaGVsbC1uZXh0LW5hdm1vZGVcIl1bMF0gPT09IFwiZXhwbGFjZVwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIG9ubHkgbmF2LW1vZGUgJ2lucGxhY2UnIG9yICdleHBsYWNlJyBhcmUgc3VwcG9ydGVkLiBBbnkgb3RoZXIgdmFsdWUgd2lsbCBsZWFkIHRvIGFuIGV4Y2VwdGlvbi5cblx0XHRpZiAoc05hdk1vZGUgJiYgKHNOYXZNb2RlID09PSBcImlucGxhY2VcIiB8fCBzTmF2TW9kZSA9PT0gXCJleHBsYWNlXCIpKSB7XG5cdFx0XHRiRXhQbGFjZSA9IHNOYXZNb2RlID09PSBcImV4cGxhY2VcIjtcblx0XHR9IGVsc2UgaWYgKHNOYXZNb2RlKSB7XG5cdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX05BVl9NT0RFXCIpO1xuXHRcdH1cblxuXHRcdGlmIChvRXh0ZXJuYWxBcHBEYXRhID09PSB1bmRlZmluZWQgfHwgb0V4dGVybmFsQXBwRGF0YSA9PT0gbnVsbCkge1xuXHRcdFx0b1hBcHBEYXRhT2JqID0ge307XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9YQXBwRGF0YU9iaiA9IG9FeHRlcm5hbEFwcERhdGE7XG5cdFx0fVxuXG5cdFx0Ly8gZm9yIG5hdmlnYXRpb24gd2UgbmVlZCBVUkwgcGFyYW1ldGVycyAobGVnYWN5IG5hdmlnYXRpb24pIGFuZCBzYXAteGFwcC1zdGF0ZSwgdGhlcmVmb3JlIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSBtaXNzaW5nIG9uZSBmcm9tIHRoZVxuXHRcdC8vIHBhc3NlZCBvbmVcblx0XHRpZiAodHlwZW9mIHZOYXZpZ2F0aW9uUGFyYW1ldGVycyA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0c1NlbGVjdGlvblZhcmlhbnQgPSB2TmF2aWdhdGlvblBhcmFtZXRlcnM7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2Ygdk5hdmlnYXRpb25QYXJhbWV0ZXJzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRjb25zdCBvRW5yaWNoZWRTZWxWYXIgPSB0aGlzLl9zcGxpdEluYm91bmROYXZpZ2F0aW9uUGFyYW1ldGVycyhcblx0XHRcdFx0bmV3IFNlbGVjdGlvblZhcmlhbnQoKSxcblx0XHRcdFx0dk5hdmlnYXRpb25QYXJhbWV0ZXJzLFxuXHRcdFx0XHRbXVxuXHRcdFx0KS5vTmF2aWdhdGlvblNlbFZhcjtcblx0XHRcdHNTZWxlY3Rpb25WYXJpYW50ID0gb0VucmljaGVkU2VsVmFyLnRvSlNPTlN0cmluZygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUXCIpO1xuXHRcdH1cblxuXHRcdG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudChzU2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0aWYgKHR5cGVvZiB2TmF2aWdhdGlvblBhcmFtZXRlcnMgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQgPSB0aGlzLl9yZW1vdmVUZWNobmljYWxQYXJhbWV0ZXJzKG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdH1cblx0XHRvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50ID0gb1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudCAmJiBvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50LnRvSlNPTk9iamVjdCgpO1xuXHRcdG9UbXBEYXRhID0gdGhpcy5fcmVtb3ZlTWVhc3VyZUJhc2VkSW5mb3JtYXRpb24ob1RtcERhdGEpOyAvLyByZW1vdmUgZXZlbnR1YWwgbWVhc3VyZXNcblx0XHRvVG1wRGF0YSA9IHRoaXMuX2NoZWNrSXNQb3RlbnRpYWxseVNlbnNpdGl2ZShvVG1wRGF0YSk7IC8vIHJlbW92ZSBldmVudHVhbCBzZW5zaXRpdmUgZGF0YVxuXG5cdFx0aWYgKG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRcdG1QYXJhbWV0ZXJzID0gdGhpcy5fZ2V0VVJMUGFyYW1ldGVyc0Zyb21TZWxlY3Rpb25WYXJpYW50KG5ldyBTZWxlY3Rpb25WYXJpYW50KG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQpKTtcblx0XHRcdHNTZWxlY3Rpb25WYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQob1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudCkudG9KU09OU3RyaW5nKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzID0ge307XG5cdFx0XHRzU2VsZWN0aW9uVmFyaWFudCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb05hdkFyZ3VtZW50czogYW55ID0ge1xuXHRcdFx0dGFyZ2V0OiB7XG5cdFx0XHRcdHNlbWFudGljT2JqZWN0OiBzU2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdGFjdGlvbjogc0FjdGlvbk5hbWVcblx0XHRcdH0sXG5cdFx0XHRwYXJhbXM6IG1QYXJhbWV0ZXJzIHx8IHt9XG5cdFx0fTtcblxuXHRcdGNvbnN0IGZuTmF2aWdhdGUgPSBhc3luYyBmdW5jdGlvbiAob0Nyb3NzQXBwTmF2U2VydmljZTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0XHRpZiAoIW9YQXBwRGF0YU9iai5zZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0XHRcdG9YQXBwRGF0YU9iai5zZWxlY3Rpb25WYXJpYW50ID0gc1NlbGVjdGlvblZhcmlhbnQ7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGZuTmF2RXhwbGFjZSA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0Y29uc3Qgc05ld0hyZWZQcm9taXNlID0gb0Nyb3NzQXBwTmF2U2VydmljZS5nZXRIcmVmKG9OYXZBcmd1bWVudHMsIG9OYXZIYW5kbGVyLm9Db21wb25lbnQpO1xuXHRcdFx0XHRzTmV3SHJlZlByb21pc2Vcblx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoc05ld0hyZWY6IHN0cmluZyk6IHZvaWQge1xuXHRcdFx0XHRcdFx0b3BlbldpbmRvdyhzTmV3SHJlZik7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bik6IHZvaWQge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmV0aXJldmluZyBocmVmRm9yRXh0ZXJuYWwgOiBcIiArIG9FcnJvcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9O1xuXG5cdFx0XHRvWEFwcERhdGFPYmogPSBvTmF2SGFuZGxlci5fcmVtb3ZlTWVhc3VyZUJhc2VkSW5mb3JtYXRpb24ob1hBcHBEYXRhT2JqKTtcblx0XHRcdHJldHVybiBvTmF2SGFuZGxlci5fZm5TYXZlQXBwU3RhdGVBc3luYyhvWEFwcERhdGFPYmosIGZuT25FcnJvcikudGhlbihmdW5jdGlvbiAob1NhdmVBcHBTdGF0ZVJldHVybjogYW55KTogdm9pZCB7XG5cdFx0XHRcdGlmIChvU2F2ZUFwcFN0YXRlUmV0dXJuKSB7XG5cdFx0XHRcdFx0b05hdkFyZ3VtZW50cy5hcHBTdGF0ZUtleSA9IG9TYXZlQXBwU3RhdGVSZXR1cm4uYXBwU3RhdGVLZXk7XG5cblx0XHRcdFx0XHQvLyBSZW1hcms6XG5cdFx0XHRcdFx0Ly8gVGhlIENyb3NzIEFwcCBTZXJ2aWNlIHRha2VzIGNhcmUgb2YgZW5jb2RpbmcgcGFyYW1ldGVyIGtleXMgYW5kIHZhbHVlcy4gRXhhbXBsZTpcblx0XHRcdFx0XHQvLyBtUGFyYW1zID0geyBcIiRAJVwiIDogXCImLz1cIiB9IHJlc3VsdHMgaW4gdGhlIFVSTCBwYXJhbWV0ZXIgJTI1MjQlMjU0MCUyNTI1PSUyNTI2JTI1MkYlMjUzRFxuXHRcdFx0XHRcdC8vIE5vdGUgdGhlIGRvdWJsZSBlbmNvZGluZywgdGhpcyBpcyBjb3JyZWN0LlxuXG5cdFx0XHRcdFx0Ly8gdG9FeHRlcm5hbCBzZXRzIHNhcC14YXBwLXN0YXRlIGluIHRoZSBVUkwgaWYgYXBwU3RhdGVLZXkgaXMgcHJvdmlkZWQgaW4gb05hdkFyZ3VtZW50c1xuXHRcdFx0XHRcdC8vIHRvRXh0ZXJuYWwgaGFzIGlzc3VlcyBvbiBzdGlja3kgYXBwcyBGSU9SSVRFQ0hQMS0xNDQwMCwgdGVtcCBmaXggdXNpbmcgaHJlZkZvckV4dGVybmFsXG5cdFx0XHRcdFx0aWYgKHNOYXZNb2RlID09IFwiZXhwbGFjZVwiKSB7XG5cdFx0XHRcdFx0XHRmbk5hdkV4cGxhY2UoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29uc3QgcHRvRXh0ID0gb0Nyb3NzQXBwTmF2U2VydmljZS5uYXZpZ2F0ZShvTmF2QXJndW1lbnRzLCBvTmF2SGFuZGxlci5vQ29tcG9uZW50KTtcblx0XHRcdFx0XHRcdC8vIFRPRE86IFRoaXMgaXMganVzdCBhIHRlbXBvcmFyeSBzb2x1dGlvbiB0byBhbGxvdyBGRSBWMiB0byB1c2UgdG9FeHRlcm5hbCBwcm9taXNlLlxuXHRcdFx0XHRcdFx0aWYgKG9OYXZIYW5kbGVyLl9uYXZpZ2F0ZUNhbGxiYWNrKSB7XG5cdFx0XHRcdFx0XHRcdG9OYXZIYW5kbGVyLl9uYXZpZ2F0ZUNhbGxiYWNrKHB0b0V4dCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IC8vIGVsc2UgOiBlcnJvciB3YXMgYWxyZWFkeSByZXBvcnRlZFxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9KTtcblx0XHR9O1xuXHRcdGNvbnN0IGZuU3RvcmVBbmROYXZpZ2F0ZSA9IGZ1bmN0aW9uIChvQ3Jvc3NBcHBOYXZTZXJ2aWNlOiBhbnkpOiB2b2lkIHtcblx0XHRcdG9OYXZIYW5kbGVyXG5cdFx0XHRcdC5zdG9yZUlubmVyQXBwU3RhdGVBc3luYyhvSW5uZXJBcHBEYXRhIGFzIGFueSwgdHJ1ZSlcblx0XHRcdFx0LnRoZW4oYXN5bmMgZnVuY3Rpb24gKHNBcHBTdGF0ZUtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0XHRcdFx0aWYgKHNBcHBTdGF0ZUtleSkge1xuXHRcdFx0XHRcdFx0b05hdkhhbmRsZXIucmVwbGFjZUhhc2goc0FwcFN0YXRlS2V5KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIGZuTmF2aWdhdGUob0Nyb3NzQXBwTmF2U2VydmljZSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRpZiAoZm5PbkVycm9yKSB7XG5cdFx0XHRcdFx0XHRmbk9uRXJyb3Iob0Vycm9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdH07XG5cdFx0aWYgKHNOYXZNb2RlKSB7XG5cdFx0XHRvTmF2QXJndW1lbnRzLnBhcmFtc1tcInNhcC11c2hlbGwtbmF2bW9kZVwiXSA9IGJFeFBsYWNlID8gXCJleHBsYWNlXCIgOiBcImlucGxhY2VcIjtcblx0XHR9XG5cdFx0b05hdkhhbmRsZXJcblx0XHRcdC5fZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2VBc3luYygpXG5cdFx0XHQudGhlbihhc3luYyBmdW5jdGlvbiAob0Nyb3NzQXBwTmF2U2VydmljZTogTmF2aWdhdGlvbikge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IG9UYXJnZXRzID0gYXdhaXQgKG9Dcm9zc0FwcE5hdlNlcnZpY2UuaXNOYXZpZ2F0aW9uU3VwcG9ydGVkKFxuXHRcdFx0XHRcdFx0W29OYXZBcmd1bWVudHNdLFxuXHRcdFx0XHRcdFx0b05hdkhhbmRsZXIub0NvbXBvbmVudFxuXHRcdFx0XHRcdCkgYXMgdW5rbm93biBhcyBQcm9taXNlPHsgc3VwcG9ydGVkOiBib29sZWFuIH1bXT4pO1xuXHRcdFx0XHRcdGlmIChvVGFyZ2V0c1swXS5zdXBwb3J0ZWQpIHtcblx0XHRcdFx0XHRcdGlmICghYkV4UGxhY2UpIHtcblx0XHRcdFx0XHRcdFx0Zm5TdG9yZUFuZE5hdmlnYXRlKG9Dcm9zc0FwcE5hdlNlcnZpY2UpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Zm5OYXZpZ2F0ZShvQ3Jvc3NBcHBOYXZTZXJ2aWNlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKGZuT25FcnJvcikge1xuXHRcdFx0XHRcdFx0Ly8gaW50ZW50IGlzIG5vdCBzdXBwb3J0ZWRcblx0XHRcdFx0XHRcdGNvbnN0IG9FcnJvciA9IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLmlzSW50ZW50U3VwcG9ydGVkLm5vdFN1cHBvcnRlZFwiKTtcblx0XHRcdFx0XHRcdGZuT25FcnJvcihvRXJyb3IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHRcdFx0aWYgKGZuT25FcnJvcikge1xuXHRcdFx0XHRcdFx0Ly8gdGVjaG5pY2FsIGVycm9yOiBjb3VsZCBub3QgZGV0ZXJtaW5lIGlmIGludGVudCBpcyBzdXBwb3J0ZWRcblx0XHRcdFx0XHRcdGNvbnN0IHRlY2huaWNhbEVycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuaXNJbnRlbnRTdXBwb3J0ZWQuZmFpbGVkXCIpO1xuXHRcdFx0XHRcdFx0Zm5PbkVycm9yKHRlY2huaWNhbEVycm9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0aWYgKGZuT25FcnJvcikge1xuXHRcdFx0XHRcdGZuT25FcnJvcihvRXJyb3IpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQYXJzZXMgdGhlIGluY29taW5nIFVSTCBhbmQgcmV0dXJucyBhIFByb21pc2UuIElmIHRoaXMgbWV0aG9kIGRldGVjdHMgYSBiYWNrIG5hdmlnYXRpb24sIHRoZSBpbm5lciBhcHAgc3RhdGUgaXMgcmV0dXJuZWQgaW4gdGhlIHJlc29sdmVkXG5cdCAqIFByb21pc2UuIE90aGVyd2lzZSBzdGFydHVwIHBhcmFtZXRlcnMgd2lsbCBiZSBtZXJnZWQgaW50byB0aGUgYXBwIHN0YXRlIHByb3ZpZGVkIGJ5IGNyb3NzIGFwcCBuYXZpZ2F0aW9uLCBhbmQgYSBjb21iaW5lZCBhcHAgc3RhdGUgd2lsbCBiZVxuXHQgKiByZXR1cm5lZC4gVGhlIGNvbmZsaWN0IHJlc29sdXRpb24gY2FuIGJlIGluZmx1ZW5jZWQgd2l0aCBzUGFyYW1IYW5kbGluZ01vZGUgZGVmaW5lZCBpbiB0aGUgY29uc3RydWN0b3IuXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSBvYmplY3QgdG8gbW9uaXRvciB3aGVuIGFsbCB0aGUgYWN0aW9ucyBvZiB0aGUgZnVuY3Rpb24gaGF2ZSBiZWVuIGV4ZWN1dGVkLiBJZiB0aGUgZXhlY3V0aW9uIGlzIHN1Y2Nlc3NmdWwsIHRoZVxuXHQgKiAgICAgICAgICBleHRyYWN0ZWQgYXBwIHN0YXRlLCB0aGUgc3RhcnR1cCBwYXJhbWV0ZXJzLCBhbmQgdGhlIHR5cGUgb2YgbmF2aWdhdGlvbiBhcmUgcmV0dXJuZWQsIHNlZSBhbHNvIHRoZSBleGFtcGxlIGFib3ZlLiBUaGUgYXBwIHN0YXRlIGlzXG5cdCAqICAgICAgICAgIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246XG5cdCAqICAgICAgICAgIDx1bD5cblx0ICogICAgICAgICAgPGxpPjxjb2RlPm9BcHBEYXRhLm9TZWxlY3Rpb25WYXJpYW50PC9jb2RlPjogQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLlNlbGVjdGlvblZhcmlhbnR9XG5cdCAqICAgICAgICAgIGNvbnRhaW5pbmcgb25seSBwYXJhbWV0ZXJzL3NlbGVjdCBvcHRpb25zIHRoYXQgYXJlIHJlbGF0ZWQgdG8gbmF2aWdhdGlvbjwvbGk+XG5cdCAqICAgICAgICAgIDxsaT48Y29kZT5vQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50PC9jb2RlPjogVGhlIG5hdmlnYXRpb24tcmVsYXRlZCBzZWxlY3Rpb24gdmFyaWFudCBhcyBhIEpTT04tZm9ybWF0dGVkIHN0cmluZzwvbGk+XG5cdCAqICAgICAgICAgIDxsaT48Y29kZT5vQXBwRGF0YS5vRGVmYXVsdGVkU2VsZWN0aW9uVmFyaWFudDwvY29kZT46IEFuIGluc3RhbmNlIG9mXG5cdCAqICAgICAgICAgIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5TZWxlY3Rpb25WYXJpYW50fSBjb250YWluaW5nIG9ubHkgdGhlIHBhcmFtZXRlcnMvc2VsZWN0IG9wdGlvbnMgdGhhdCBhcmUgc2V0IGJ5IHVzZXJcblx0ICogICAgICAgICAgZGVmYXVsdCBkYXRhPC9saT5cblx0ICogICAgICAgICAgPGxpPjxjb2RlPm9BcHBEYXRhLmJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHk8L2NvZGU+OiBBIEJvb2xlYW4gZmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIG9ubHkgZGVmYXVsdGVkIHBhcmFtZXRlcnMgYW5kIG5vXG5cdCAqICAgICAgICAgIG5hdmlnYXRpb24gcGFyYW1ldGVycyBhcmUgcHJlc2VudC48YnI+XG5cdCAqICAgICAgICAgIDxiPk5vdGU6PC9iPiBJZiBubyBuYXZpZ2F0aW9uIHBhcmFtZXRlcnMgYXJlIGF2YWlsYWJsZSwgPGNvZGU+Yk5hdlNlbFZhckhhc0RlZmF1bHRzT25seTwvY29kZT4gaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LFxuXHQgKiAgICAgICAgICBldmVuIHRob3VnaCBwYXJhbWV0ZXJzIHdpdGhvdXQgZGVmYXVsdCBtaWdodCBiZSBhdmFpbGFibGUgYXMgd2VsbC48L2xpPlxuXHQgKiAgICAgICAgICA8L3VsPlxuXHQgKiAgICAgICAgICBJZiB0aGUgbmF2aWdhdGlvbi1yZWxhdGVkIHNlbGVjdGlvbiB2YXJpYW50IGlzIGVtcHR5LCBpdCBpcyByZXBsYWNlZCBieSBhIGNvcHkgb2YgdGhlIGRlZmF1bHRlZCBzZWxlY3Rpb24gdmFyaWFudC48YnI+XG5cdCAqICAgICAgICAgIFRoZSBuYXZpZ2F0aW9uIHR5cGUgaXMgYW4gZW51bWVyYXRpb24gdHlwZSBvZiB0eXBlIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZUeXBlfSAocG9zc2libGUgdmFsdWVzIGFyZVxuXHQgKiAgICAgICAgICBpbml0aWFsLCBVUkxQYXJhbXMsIHhBcHBTdGF0ZSwgYW5kIGlBcHBTdGF0ZSkuPGJyPlxuXHQgKiAgICAgICAgICA8Yj5Ob3RlOjwvYj4gSWYgdGhlIG5hdmlnYXRpb24gdHlwZSBpcyB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2VHlwZS5pQXBwU3RhdGV9IG9BcHBEYXRhIGhhcyB0d29cblx0ICogICAgICAgICAgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG5cdCAqICAgICAgICAgIDx1bD5cblx0ICogICAgICAgICAgPGxpPjxjb2RlPm9BcHBEYXRhLnRhYmxlVmFyaWFudElkPC9jb2RlPjwvbGk+XG5cdCAqICAgICAgICAgIDxsaT48Y29kZT5vQXBwRGF0YS5jdXN0b21EYXRhPC9jb2RlPjwvbGk+XG5cdCAqICAgICAgICAgIDwvdWw+XG5cdCAqICAgICAgICAgIHdoaWNoIHJldHVybiB0aGUgaW5uZXIgYXBwIGRhdGEgYXMgc3RvcmVkIGluIHtAbGluayAjLm5hdmlnYXRlIG5hdmlnYXRlfSBvciB7QGxpbmsgIy5zdG9yZUlubmVyQXBwU3RhdGVBc3luYyBzdG9yZUlubmVyQXBwU3RhdGVBc3luY30uXG5cdCAqICAgICAgICAgIDxjb2RlPm9BcHBEYXRhLm9EZWZhdWx0ZWRTZWxlY3Rpb25WYXJpYW50PC9jb2RlPiBpcyBhbiBlbXB0eSBzZWxlY3Rpb24gdmFyaWFudCBhbmRcblx0ICogICAgICAgICAgPGNvZGU+b0FwcERhdGEuYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seTwvY29kZT4gaXMgPGNvZGU+ZmFsc2U8L2NvZGU+IGluIHRoaXMgY2FzZS48YnI+XG5cdCAqICAgICAgICAgIDxiPk5vdGU6PC9iPiBJZiB0aGUgbmF2aWdhdGlvbiB0eXBlIGlzIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZUeXBlLmluaXRpYWx9IG9BcHBEYXRhIGlzIGFuIGVtcHR5IG9iamVjdCE8YnI+XG5cdCAqICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycywgYW4gZXJyb3Igb2JqZWN0IG9mIHR5cGUge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdkVycm9yfSwgVVJMIHBhcmFtZXRlcnMgKGlmIGF2YWlsYWJsZSlcblx0ICogICAgICAgICAgYW5kIHRoZSB0eXBlIG9mIG5hdmlnYXRpb24gYXJlIHJldHVybmVkLlxuXHQgKiBAcHVibGljXG5cdCAqIEBleGFtcGxlIDxjb2RlPlxuXHQgKiBzYXAudWkuZGVmaW5lKFtcInNhcC9mZS9uYXZpZ2F0aW9uL05hdmlnYXRpb25IYW5kbGVyXCJdLCBmdW5jdGlvbiAoTmF2aWdhdGlvbkhhbmRsZXIpIHtcblx0ICogXHR2YXIgb05hdmlnYXRpb25IYW5kbGVyID0gbmV3IE5hdmlnYXRpb25IYW5kbGVyKG9Db250cm9sbGVyKTtcblx0ICogXHR2YXIgb1BhcnNlTmF2aWdhdGlvblByb21pc2UgPSBvTmF2aWdhdGlvbkhhbmRsZXIucGFyc2VOYXZpZ2F0aW9uKCk7XG5cdCAqXG5cdCAqIFx0b1BhcnNlTmF2aWdhdGlvblByb21pc2UuZG9uZShmdW5jdGlvbihvQXBwRGF0YSwgb1N0YXJ0dXBQYXJhbWV0ZXJzLCBzTmF2VHlwZSl7XG5cdCAqIFx0XHRcdG9TbWFydEZpbHRlckJhci5zZXREYXRhU3VpdGVGb3JtYXQob0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudCk7XG5cdCAqIFx0XHRcdC8vIG9BcHBEYXRhLm9TZWxlY3Rpb25WYXJpYW50IGNhbiBiZSB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIHNlbGVjdGlvbiB2YXJpYW50XG5cdCAqIFx0XHRcdC8vIG9BcHBEYXRhLm9EZWZhdWx0ZWRTZWxlY3Rpb25WYXJpYW50IGNvbnRhaW5zIHRoZSBwYXJhbWV0ZXJzIHdoaWNoIGFyZSBzZXQgYnkgdXNlciBkZWZhdWx0c1xuXHQgKiBcdFx0XHQvLyBvQXBwRGF0YS5iTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5IGluZGljYXRlcyB3aGV0aGVyIG9ubHkgZGVmYXVsdGVkIHBhcmFtZXRlcnMgYW5kIG5vIG5hdmlnYXRpb24gcGFyYW1ldGVycyBhcmUgcHJlc2VudFxuXHQgKiBcdH0pO1xuXHQgKiBcdG9QYXJzZU5hdmlnYXRpb25Qcm9taXNlLmZhaWwoZnVuY3Rpb24ob0Vycm9yLCBvVVJMUGFyYW1ldGVycywgc05hdlR5cGUpe1xuXHQgKiBcdFx0Ly8gaWYgZS5nLiB0aGUgeGFwcCBzdGF0ZSBjb3VsZCBub3QgYmUgbG9hZGVkLCBuZXZlcnRoZWxlc3MgdGhlcmUgbWF5IGJlIFVSTCBwYXJhbWV0ZXJzIGF2YWlsYWJsZVxuXHQgKiBcdFx0Ly9zb21lIGVycm9yIGhhbmRsaW5nXG5cdCAqIFx0fSk7XG5cdCAqIH0pO1xuXHQgKiA8L2NvZGU+XG5cdCAqL1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Byb21pc2UtZnVuY3Rpb24tYXN5bmNcblx0cGFyc2VOYXZpZ2F0aW9uKCk6IEpRdWVyeS5Qcm9taXNlPHVua25vd24+IHtcblx0XHRjb25zdCBzQXBwSGFzaCA9IEhhc2hDaGFuZ2VyLmdldEluc3RhbmNlKCkuZ2V0SGFzaCgpO1xuXHRcdC8qXG5cdFx0ICogdXNlIC5nZXRIYXNoKCkgaGVyZSBpbnN0ZWFkIG9mIC5nZXRBcHBIYXNoKCkgdG8gYWxzbyBiZSBhYmxlIGRlYWxpbmcgd2l0aCBlbnZpcm9ubWVudHMgd2hlcmUgb25seSBTQVBVSTUgaXMgbG9hZGVkIGFuZCB0aGUgVVNoZWxsIGlzXG5cdFx0ICogbm90IGluaXRpYWxpemVkIHByb3Blcmx5LlxuXHRcdCAqL1xuXHRcdGNvbnN0IHNJQXBwU3RhdGUgPSB0aGlzLl9nZXRJbm5lckFwcFN0YXRlS2V5KHNBcHBIYXNoKTtcblxuXHRcdGxldCBvQ29tcG9uZW50RGF0YSA9IHRoaXMub0NvbXBvbmVudC5nZXRDb21wb25lbnREYXRhKCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0Lypcblx0XHQgKiBUaGVyZSBhcmUgc29tZSByYWNlIGNvbmRpdGlvbnMgd2hlcmUgdGhlIG9Db21wb25lbnREYXRhIG1heSBub3QgYmUgc2V0LCBmb3IgZXhhbXBsZSBpbiBjYXNlIHRoZSBVU2hlbGwgd2FzIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseS4gVG9cblx0XHQgKiBtYWtlIHN1cmUgdGhhdCB3ZSBkbyBub3QgZHVtcCBoZXJlIHdpdGggYW4gZXhjZXB0aW9uLCB3ZSB0YWtlIHRoaXMgc3BlY2lhbCBlcnJvciBoYW5kbGluZyBiZWhhdmlvcjpcblx0XHQgKi9cblx0XHRpZiAob0NvbXBvbmVudERhdGEgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0TG9nLndhcm5pbmcoXCJUaGUgbmF2aWdhdGlvbiBDb21wb25lbnQncyBkYXRhIHdhcyBub3Qgc2V0IHByb3Blcmx5OyBhc3N1bWluZyBpbnN0ZWFkIHRoYXQgbm8gcGFyYW1ldGVycyBhcmUgcHJvdmlkZWQuXCIpO1xuXHRcdFx0b0NvbXBvbmVudERhdGEgPSB7fTtcblx0XHR9XG5cblx0XHQvLyBSZW1hcms6XG5cdFx0Ly8gVGhlIHN0YXJ0dXAgcGFyYW1ldGVycyBhcmUgYWxyZWFkeSBkZWNvZGVkLiBFeGFtcGxlOlxuXHRcdC8vIFRoZSBvcmlnaW5hbCBVUkwgcGFyYW1ldGVyICUyNTI0JTI1NDAlMjUyNT0lMjUyNiUyNTJGJTI1M0QgcmVzdWx0cyBpbiBvU3RhcnR1cFBhcmFtZXRlcnMgPSB7IFwiJEAlXCIgOiBcIiYvPVwiIH1cblx0XHQvLyBOb3RlIHRoZSBkb3VibGUgZW5jb2RpbmcgaW4gdGhlIFVSTCwgdGhpcyBpcyBjb3JyZWN0LiBBbiBVUkwgcGFyYW1ldGVyIGxpa2UgeHl6PSUyNSBjYXVzZXMgYW4gXCJVUkkgbWFsZm9ybWVkXCIgZXJyb3IuXG5cdFx0Ly8gSWYgdGhlIGRlY29kZWQgdmFsdWUgc2hvdWxkIGJlIGUuZy4gXCIlMjVcIiwgdGhlIHBhcmFtZXRlciBpbiB0aGUgVVJMIG5lZWRzIHRvIGJlOiB4eXo9JTI1MjUyNVxuXHRcdGNvbnN0IG9TdGFydHVwUGFyYW1ldGVycyA9IG9Db21wb25lbnREYXRhLnN0YXJ0dXBQYXJhbWV0ZXJzIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG5cdFx0Y29uc3QgaHlicmlkSUFwcFN0YXRlS2V5UGFyYW1zOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvU3RhcnR1cFBhcmFtZXRlcnM/LltIWUJSSURfSUFQUF9TVEFURV9LRVldPy5bMF07XG5cdFx0Y29uc3QgaHlicmlkRGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKSBhcyBKUXVlcnkuRGVmZXJyZWQ8dW5rbm93bj47XG5cdFx0bGV0IGlBcHBTdGF0ZUh5YnJpZERlZmVycmVkOiBKUXVlcnkuRGVmZXJyZWQ8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cdFx0aWYgKGh5YnJpZElBcHBTdGF0ZUtleVBhcmFtcyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpQXBwU3RhdGVIeWJyaWREZWZlcnJlZCA9IHRoaXMuX2xvYWRBcHBTdGF0ZShoeWJyaWRJQXBwU3RhdGVLZXlQYXJhbXMsIGh5YnJpZERlZmVycmVkLCBOYXZUeXBlLmh5YnJpZCk7XG5cdFx0fVxuXG5cdFx0bGV0IGFEZWZhdWx0ZWRQYXJhbWV0ZXJzOiBhbnkgPSBbXTtcblx0XHRpZiAoXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMgJiZcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVyc1tERUZBVUxURURfUEFSQU1FVEVSX1BST1BFUlRZXSAmJlxuXHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzW0RFRkFVTFRFRF9QQVJBTUVURVJfUFJPUEVSVFldLmxlbmd0aCA+IDBcblx0XHQpIHtcblx0XHRcdGFEZWZhdWx0ZWRQYXJhbWV0ZXJzID0gSlNPTi5wYXJzZShvU3RhcnR1cFBhcmFtZXRlcnNbREVGQVVMVEVEX1BBUkFNRVRFUl9QUk9QRVJUWV1bMF0pO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9NeURlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCkgYXMgSlF1ZXJ5LkRlZmVycmVkPHVua25vd24+O1xuXG5cdFx0Y29uc3Qgb05hdkhhbmRsZXIgPSB0aGlzO1xuXHRcdGNvbnN0IHBhcnNlVXJsUGFyYW1zID0gZnVuY3Rpb24gKFxuXHRcdFx0b1N1YlN0YXJ0dXBQYXJhbWV0ZXJzOiBhbnksXG5cdFx0XHRhU3ViRGVmYXVsdGVkUGFyYW1ldGVyczogYW55LFxuXHRcdFx0b1N1Yk15RGVmZXJyZWQ6IEpRdWVyeS5EZWZlcnJlZDx1bmtub3duPixcblx0XHRcdHNOYXZUeXBlOiBzdHJpbmdcblx0XHQpOiB2b2lkIHtcblx0XHRcdC8vIHN0YW5kYXJkIFVSTCBuYXZpZ2F0aW9uXG5cdFx0XHRjb25zdCBvU2VsVmFycyA9IG9OYXZIYW5kbGVyLl9zcGxpdEluYm91bmROYXZpZ2F0aW9uUGFyYW1ldGVycyhcblx0XHRcdFx0bmV3IFNlbGVjdGlvblZhcmlhbnQoKSxcblx0XHRcdFx0b1N1YlN0YXJ0dXBQYXJhbWV0ZXJzLFxuXHRcdFx0XHRhU3ViRGVmYXVsdGVkUGFyYW1ldGVyc1xuXHRcdFx0KTtcblx0XHRcdC8vIEZvciBzY2VuYXJpbywgd2hlcmUgb25seSBoeWJyaWRJQXBwU3RhdGVLZXkgaXMgcGFydCBvZiB1cmxQYXJhbXMsIHdlIGlnbm9yZSB0aGlzIGNvbmRpdGlvblxuXHRcdFx0aWYgKG9TZWxWYXJzLm9OYXZpZ2F0aW9uU2VsVmFyLmlzRW1wdHkoKSAmJiBvU2VsVmFycy5vRGVmYXVsdGVkU2VsVmFyLmlzRW1wdHkoKSAmJiBzTmF2VHlwZSAhPT0gTmF2VHlwZS5oeWJyaWQpIHtcblx0XHRcdFx0Ly8gU3RhcnR1cCBwYXJhbWV0ZXJzIGNvbnRhaW4gb25seSB0ZWNobmljYWwgcGFyYW1ldGVycyAoU0FQIHN5c3RlbSkgd2hpY2ggd2VyZSBmaWx0ZXJlZCBvdXQuXG5cdFx0XHRcdC8vIG9OYXZpZ2F0aW9uU2VsVmFyIGFuZCBvRGVmYXVsdGVkU2VsVmFyIGFyZSBlbXB0eS5cblx0XHRcdFx0Ly8gVGh1cywgY29uc2lkZXIgdGhpcyB0eXBlIG9mIG5hdmlnYXRpb24gYXMgYW4gaW5pdGlhbCBuYXZpZ2F0aW9uLlxuXHRcdFx0XHRpZiAoc05hdlR5cGUgPT09IE5hdlR5cGUueEFwcFN0YXRlKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0Vycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuZ2V0RGF0YUZyb21BcHBTdGF0ZS5mYWlsZWRcIik7XG5cdFx0XHRcdFx0b1N1Yk15RGVmZXJyZWQucmVqZWN0KG9FcnJvciwgb1N1YlN0YXJ0dXBQYXJhbWV0ZXJzIHx8IHt9LCBOYXZUeXBlLnhBcHBTdGF0ZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b1N1Yk15RGVmZXJyZWQucmVzb2x2ZSh7fSwgb1N1YlN0YXJ0dXBQYXJhbWV0ZXJzLCBOYXZUeXBlLmluaXRpYWwpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBvQXBwU3RhdGVEYXRhOiBhbnkgPSB7fTtcblx0XHRcdFx0b0FwcFN0YXRlRGF0YS5zZWxlY3Rpb25WYXJpYW50ID0gb1NlbFZhcnMub05hdmlnYXRpb25TZWxWYXIudG9KU09OU3RyaW5nKCk7XG5cdFx0XHRcdG9BcHBTdGF0ZURhdGEub1NlbGVjdGlvblZhcmlhbnQgPSBvU2VsVmFycy5vTmF2aWdhdGlvblNlbFZhcjtcblx0XHRcdFx0b0FwcFN0YXRlRGF0YS5vRGVmYXVsdGVkU2VsZWN0aW9uVmFyaWFudCA9IG9TZWxWYXJzLm9EZWZhdWx0ZWRTZWxWYXI7XG5cdFx0XHRcdG9BcHBTdGF0ZURhdGEuYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSA9IG9TZWxWYXJzLmJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHk7XG5cblx0XHRcdFx0Ly8gbm8gc2FwLXhhcHAtc3RhdGUgYnV0IG5hdlR5cGUgaXMgaHlicmlkLCBleHRyYWN0IHRoZSBJQXBwU3RhdGVEYXRhXG5cdFx0XHRcdGlmIChzTmF2VHlwZSA9PT0gTmF2VHlwZS5oeWJyaWQpIHtcblx0XHRcdFx0XHRjb25zdCBzdWNjZXNzSGFuZGxlckh5YnJpZFN0YXRlID0gZnVuY3Rpb24gKGlBcHBTdGF0ZURhdGE6IHVua25vd24sIF9yZWY6IHVua25vd24sIG5hdlR5cGU6IHVua25vd24pOiB2b2lkIHtcblx0XHRcdFx0XHRcdG9BcHBTdGF0ZURhdGEuaUFwcFN0YXRlID0gaUFwcFN0YXRlRGF0YTtcblx0XHRcdFx0XHRcdG9TdWJNeURlZmVycmVkLnJlc29sdmUob0FwcFN0YXRlRGF0YSwgb1N0YXJ0dXBQYXJhbWV0ZXJzLCBuYXZUeXBlKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGNvbnN0IGZhaWx1cmVIYW5kbGVySHlicmlkU3RhdGUgPSBmdW5jdGlvbiAob0Vycm9yOiBvYmplY3QsIF9yZWY6IG9iamVjdCwgbmF2VHlwZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0XHRcdFx0XHRvU3ViTXlEZWZlcnJlZC5yZWplY3Qob0Vycm9yLCBfcmVmLCBuYXZUeXBlKTtcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0aWYgKGlBcHBTdGF0ZUh5YnJpZERlZmVycmVkICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdGlBcHBTdGF0ZUh5YnJpZERlZmVycmVkLmRvbmUoc3VjY2Vzc0hhbmRsZXJIeWJyaWRTdGF0ZSk7XG5cdFx0XHRcdFx0XHRpQXBwU3RhdGVIeWJyaWREZWZlcnJlZC5mYWlsKGZhaWx1cmVIYW5kbGVySHlicmlkU3RhdGUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvU3ViTXlEZWZlcnJlZC5yZXNvbHZlKG9BcHBTdGF0ZURhdGEsIG9TdWJTdGFydHVwUGFyYW1ldGVycywgc05hdlR5cGUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRpZiAoc0lBcHBTdGF0ZSkge1xuXHRcdFx0Ly8gaW5uZXIgYXBwIHN0YXRlIGlzIGF2YWlsYWJsZSBpbiB0aGUgQXBwSGFzaCAoYmFjayBuYXZpZ2F0aW9uKTsgZXh0cmFjdCB0aGUgcGFyYW1ldGVyIHZhbHVlXG5cdFx0XHR0aGlzLl9sb2FkQXBwU3RhdGUoc0lBcHBTdGF0ZSwgb015RGVmZXJyZWQsIE5hdlR5cGUuaUFwcFN0YXRlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gbm8gYmFjayBuYXZpZ2F0aW9uXG5cdFx0XHRjb25zdCBiSXNYYXBwU3RhdGVOYXZpZ2F0aW9uID0gb0NvbXBvbmVudERhdGFbXCJzYXAteGFwcC1zdGF0ZVwiXSAhPT0gdW5kZWZpbmVkO1xuXHRcdFx0aWYgKGJJc1hhcHBTdGF0ZU5hdmlnYXRpb24pIHtcblx0XHRcdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0XHRcdC8vIGlubmVyIGFwcCBzdGF0ZSB3YXMgbm90IGZvdW5kIGluIHRoZSBBcHBIYXNoLCBidXQgeGFwcCBzdGF0ZSA9PiB0cnkgdG8gcmVhZCB0aGUgeGFwcCBzdGF0ZVxuXHRcdFx0XHR0aGlzLl9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZUFzeW5jKClcblx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAob0Nyb3NzQXBwTmF2U2VydmljZTogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0Nyb3NzQXBwTmF2U2VydmljZS5nZXRTdGFydHVwQXBwU3RhdGUodGhhdC5vQ29tcG9uZW50KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvRXJyb3IgPSBvTmF2SGFuZGxlci5fY3JlYXRlVGVjaG5pY2FsRXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5nZXRTdGFydHVwU3RhdGUuZmFpbGVkXCIpO1xuXHRcdFx0XHRcdFx0b015RGVmZXJyZWQucmVqZWN0KG9FcnJvciwge30sIE5hdlR5cGUueEFwcFN0YXRlKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJvbWlzZS1mdW5jdGlvbi1hc3luY1xuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvQXBwU3RhdGU6IFNoZWxsQXBwU3RhdGUpOiBKUXVlcnkuUHJvbWlzZTx1bmtub3duPiB8IHVuZGVmaW5lZCB7XG5cdFx0XHRcdFx0XHQvLyBnZXQgYXBwIHN0YXRlIGZyb20gc2FwLXhhcHAtc3RhdGUsXG5cdFx0XHRcdFx0XHQvLyBjcmVhdGUgYSBjb3B5LCBub3Qgb25seSBhIHJlZmVyZW5jZSwgYmVjYXVzZSB3ZSB3YW50IHRvIG1vZGlmeSB0aGUgb2JqZWN0XG5cdFx0XHRcdFx0XHRsZXQgb0FwcFN0YXRlRGF0YSA9IG9BcHBTdGF0ZS5nZXREYXRhKCk7XG5cdFx0XHRcdFx0XHRsZXQgb0Vycm9yO1xuXHRcdFx0XHRcdFx0aWYgKG9BcHBTdGF0ZURhdGEpIHtcblx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRvQXBwU3RhdGVEYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvQXBwU3RhdGVEYXRhKSk7XG5cdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKHgpIHtcblx0XHRcdFx0XHRcdFx0XHRvRXJyb3IgPSBvTmF2SGFuZGxlci5fY3JlYXRlVGVjaG5pY2FsRXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5BcHBTdGF0ZURhdGEucGFyc2VFcnJvclwiKTtcblx0XHRcdFx0XHRcdFx0XHRvTXlEZWZlcnJlZC5yZWplY3Qob0Vycm9yLCBvU3RhcnR1cFBhcmFtZXRlcnMsIE5hdlR5cGUueEFwcFN0YXRlKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb015RGVmZXJyZWQucHJvbWlzZSgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChvQXBwU3RhdGVEYXRhKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9TZWxWYXIgPSBuZXcgU2VsZWN0aW9uVmFyaWFudChvQXBwU3RhdGVEYXRhLnNlbGVjdGlvblZhcmlhbnQpO1xuXG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9TZWxWYXJzID0gb05hdkhhbmRsZXIuX3NwbGl0SW5ib3VuZE5hdmlnYXRpb25QYXJhbWV0ZXJzKFxuXHRcdFx0XHRcdFx0XHRcdG9TZWxWYXIsXG5cdFx0XHRcdFx0XHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRcdGFEZWZhdWx0ZWRQYXJhbWV0ZXJzXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdG9BcHBTdGF0ZURhdGEuc2VsZWN0aW9uVmFyaWFudCA9IG9TZWxWYXJzLm9OYXZpZ2F0aW9uU2VsVmFyLnRvSlNPTlN0cmluZygpO1xuXHRcdFx0XHRcdFx0XHRvQXBwU3RhdGVEYXRhLm9TZWxlY3Rpb25WYXJpYW50ID0gb1NlbFZhcnMub05hdmlnYXRpb25TZWxWYXI7XG5cdFx0XHRcdFx0XHRcdG9BcHBTdGF0ZURhdGEub0RlZmF1bHRlZFNlbGVjdGlvblZhcmlhbnQgPSBvU2VsVmFycy5vRGVmYXVsdGVkU2VsVmFyO1xuXHRcdFx0XHRcdFx0XHRvQXBwU3RhdGVEYXRhLmJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHkgPSBvU2VsVmFycy5iTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5O1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzdWNjZXNzSGFuZGxlckh5YnJpZFN0YXRlID0gZnVuY3Rpb24gKGlBcHBTdGF0ZURhdGE6IHVua25vd24sIF9yZWY6IHVua25vd24sIG5hdlR5cGU6IHVua25vd24pOiB2b2lkIHtcblx0XHRcdFx0XHRcdFx0XHRvQXBwU3RhdGVEYXRhLmlBcHBTdGF0ZSA9IGlBcHBTdGF0ZURhdGE7XG5cdFx0XHRcdFx0XHRcdFx0b015RGVmZXJyZWQucmVzb2x2ZShvQXBwU3RhdGVEYXRhLCBvU3RhcnR1cFBhcmFtZXRlcnMsIG5hdlR5cGUpO1xuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRjb25zdCBmYWlsdXJlSGFuZGxlckh5YnJpZFN0YXRlID0gZnVuY3Rpb24gKGVycm9yOiBvYmplY3QsIF9yZWY6IG9iamVjdCwgbmF2VHlwZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0XHRcdFx0XHRcdFx0ZXJyb3IgPSBvTmF2SGFuZGxlci5fY3JlYXRlVGVjaG5pY2FsRXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5nZXRBcHBTdGF0ZS5mYWlsZWRcIik7XG5cdFx0XHRcdFx0XHRcdFx0b015RGVmZXJyZWQucmVqZWN0KGVycm9yLCBfcmVmLCBuYXZUeXBlKTtcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0aWYgKGh5YnJpZElBcHBTdGF0ZUtleVBhcmFtcyAhPT0gdW5kZWZpbmVkICYmIGlBcHBTdGF0ZUh5YnJpZERlZmVycmVkICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRpQXBwU3RhdGVIeWJyaWREZWZlcnJlZC5kb25lKHN1Y2Nlc3NIYW5kbGVySHlicmlkU3RhdGUpO1xuXHRcdFx0XHRcdFx0XHRcdGlBcHBTdGF0ZUh5YnJpZERlZmVycmVkLmZhaWwoZmFpbHVyZUhhbmRsZXJIeWJyaWRTdGF0ZSk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAob0FwcFN0YXRlRGF0YVtIWUJSSURfSUFQUF9TVEFURV9LRVldKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhhdC5fbG9hZEFwcFN0YXRlKG9BcHBTdGF0ZURhdGFbSFlCUklEX0lBUFBfU1RBVEVfS0VZXSBhcyBzdHJpbmcsIGh5YnJpZERlZmVycmVkLCBOYXZUeXBlLmh5YnJpZCkuZG9uZShcblx0XHRcdFx0XHRcdFx0XHRcdHN1Y2Nlc3NIYW5kbGVySHlicmlkU3RhdGVcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUob0FwcFN0YXRlRGF0YSwgb1N0YXJ0dXBQYXJhbWV0ZXJzLCBOYXZUeXBlLnhBcHBTdGF0ZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAob1N0YXJ0dXBQYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0XHRcdHBhcnNlVXJsUGFyYW1zKG9TdGFydHVwUGFyYW1ldGVycywgYURlZmF1bHRlZFBhcmFtZXRlcnMsIG9NeURlZmVycmVkLCBOYXZUeXBlLnhBcHBTdGF0ZSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBzYXAteGFwcC1zdGF0ZSBuYXZpZ2F0aW9uLCBidXQgSUQgaGFzIGFscmVhZHkgZXhwaXJlZCwgYnV0IFVSTCBwYXJhbWV0ZXJzIGF2YWlsYWJsZVxuXHRcdFx0XHRcdFx0XHRvRXJyb3IgPSBvTmF2SGFuZGxlci5fY3JlYXRlVGVjaG5pY2FsRXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5nZXREYXRhRnJvbUFwcFN0YXRlLmZhaWxlZFwiKTtcblx0XHRcdFx0XHRcdFx0b015RGVmZXJyZWQucmVqZWN0KG9FcnJvciwgb1N0YXJ0dXBQYXJhbWV0ZXJzIHx8IHt9LCBOYXZUeXBlLnhBcHBTdGF0ZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0Vycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlQXN5bmMuZmFpbGVkXCIpO1xuXHRcdFx0XHRcdFx0b015RGVmZXJyZWQucmVqZWN0KG9FcnJvciwge30sIE5hdlR5cGUueEFwcFN0YXRlKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSBpZiAob1N0YXJ0dXBQYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdC8vIG5vIHNhcC14YXBwLXN0YXRlXG5cdFx0XHRcdHBhcnNlVXJsUGFyYW1zKFxuXHRcdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVycyxcblx0XHRcdFx0XHRhRGVmYXVsdGVkUGFyYW1ldGVycyxcblx0XHRcdFx0XHRvTXlEZWZlcnJlZCxcblx0XHRcdFx0XHRoeWJyaWRJQXBwU3RhdGVLZXlQYXJhbXMgIT09IHVuZGVmaW5lZCA/IE5hdlR5cGUuaHlicmlkIDogTmF2VHlwZS5VUkxQYXJhbXNcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIGluaXRpYWwgbmF2aWdhdGlvblxuXHRcdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKHt9LCB7fSwgTmF2VHlwZS5pbml0aWFsKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb015RGVmZXJyZWQucHJvbWlzZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmljIHRlY2huaWNhbCBwYXJhbWV0ZXJzLiBUZWNobmljYWwgcGFyYW1ldGVycyB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgc2VsZWN0aW9uIHZhcmlhbnQgcGFzc2VkIHRvIHRoZVxuXHQgKiBhcHBsaWNhdGlvbi4gQXMgYSBkZWZhdWx0IHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBjb25zaWRlcmVkIGFzIHRlY2huaWNhbCBwYXJhbWV0ZXJzOlxuXHQgKiA8dWw+XG5cdCAqIDxsaT48Y29kZT5zYXAtc3lzdGVtPC9jb2RlPjwvbGk+XG5cdCAqIDxsaT48Y29kZT5zYXAtdXNoZWxsLWRlZmF1bHRlZFBhcmFtZXRlck5hbWVzPC9jb2RlPjwvbGk+XG5cdCAqIDxsaT48Y29kZT5cImhjcEFwcGxpY2F0aW9uSWRcIjwvY29kZT48L2xpPlxuXHQgKiA8L3VsPi5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0gYVRlY2huaWNhbFBhcmFtZXRlcnMgTGlzdCBvZiBwYXJhbWV0ZXIgbmFtZXMgdG8gYmUgY29uc2lkZXJlZCBhcyB0ZWNobmljYWwgcGFyYW1ldGVycy4gPGNvZGU+bnVsbDwvY29kZT4gb3Jcblx0ICogICAgICAgIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gbWF5IGJlIHVzZWQgdG8gcmVzZXQgdGhlIGNvbXBsZXRlIGxpc3QuXG5cdCAqL1xuXHRzZXRUZWNobmljYWxQYXJhbWV0ZXJzKGFUZWNobmljYWxQYXJhbWV0ZXJzPzogYW55W10pOiB2b2lkIHtcblx0XHRpZiAoIWFUZWNobmljYWxQYXJhbWV0ZXJzKSB7XG5cdFx0XHRhVGVjaG5pY2FsUGFyYW1ldGVycyA9IFtdO1xuXHRcdH1cblxuXHRcdGlmICghQXJyYXkuaXNBcnJheShhVGVjaG5pY2FsUGFyYW1ldGVycykpIHtcblx0XHRcdExvZy5lcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyOiBwYXJhbWV0ZXIgaW5jb3JyZWN0LCBhcnJheSBvZiBzdHJpbmdzIGV4cGVjdGVkXCIpO1xuXHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHR9XG5cblx0XHR0aGlzLl9hVGVjaG5pY2FsUGFyYW1hdGVycyA9IGFUZWNobmljYWxQYXJhbWV0ZXJzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmljIHRlY2huaWNhbCBwYXJhbWV0ZXJzLiBUZWNobmljYWwgcGFyYW1ldGVycyB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgc2VsZWN0aW9uIHZhcmlhbnQgcGFzc2VkIHRvIHRoZVxuXHQgKiBhcHBsaWNhdGlvbi4gQXMgYSBkZWZhdWx0IHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBjb25zaWRlcmVkIGFzIHRlY2huaWNhbCBwYXJhbWV0ZXJzOlxuXHQgKiA8dWw+XG5cdCAqIDxsaT48Y29kZT5zYXAtc3lzdGVtPC9jb2RlPjwvbGk+XG5cdCAqIDxsaT48Y29kZT5zYXAtdXNoZWxsLWRlZmF1bHRlZFBhcmFtZXRlck5hbWVzPC9jb2RlPjwvbGk+XG5cdCAqIDxsaT48Y29kZT5cImhjcEFwcGxpY2F0aW9uSWRcIjwvY29kZT48L2xpPlxuXHQgKiA8L3VsPi5cblx0ICogQHB1YmxpY1xuXHQgKiBAcmV0dXJucyBBbiBBcnJheSBjb250YWluaW5nIHRoZSB0ZWNobmljYWwgcGFyYW1ldGVycy5cblx0ICovXG5cdGdldFRlY2huaWNhbFBhcmFtZXRlcnMoKTogc3RyaW5nW10ge1xuXHRcdHJldHVybiB0aGlzLl9hVGVjaG5pY2FsUGFyYW1hdGVycy5jb25jYXQoW10pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgcGFzc2VkIHBhcmFtZXRlciBpcyBjb25zaWRlcmVkIGFzIHRlY2huaWNhbCBwYXJhbWV0ZXIuXG5cdCAqIEBwYXJhbSBzUGFyYW1ldGVyTmFtZSBOYW1lIG9mIGEgcmVxdWVzdCBwYXJhbWV0ZXIsIGNvbnNpZGVyZWQgYXMgdGVjaG5pY2FsIHBhcmFtZXRlci5cblx0ICogQHJldHVybnMgSW5kaWNhdGVzIGlmIHRoZSBwYXJhbWV0ZXIgaXMgY29uc2lkZXJlZCBhcyB0ZWNobmljYWwgcGFyYW1ldGVyIG9yIG5vdC5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9pc1RlY2huaWNhbFBhcmFtZXRlcihzUGFyYW1ldGVyTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0aWYgKHNQYXJhbWV0ZXJOYW1lKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdCEoXG5cdFx0XHRcdFx0c1BhcmFtZXRlck5hbWUgPT09IFwic2FwLXVpLWZlLXZhcmlhbnQtaWRcIiB8fFxuXHRcdFx0XHRcdHNQYXJhbWV0ZXJOYW1lID09PSBcInNhcC11aS1mZS10YWJsZS12YXJpYW50LWlkXCIgfHxcblx0XHRcdFx0XHRzUGFyYW1ldGVyTmFtZSA9PT0gXCJzYXAtdWktZmUtY2hhcnQtdmFyaWFudC1pZFwiIHx8XG5cdFx0XHRcdFx0c1BhcmFtZXRlck5hbWUgPT09IFwic2FwLXVpLWZlLWZpbHRlcmJhci12YXJpYW50LWlkXCJcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdGlmIChzUGFyYW1ldGVyTmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJzYXAtXCIpID09PSAwKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5fYVRlY2huaWNhbFBhcmFtYXRlcnMuaW5jbHVkZXMoc1BhcmFtZXRlck5hbWUpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0X2lzRkVQYXJhbWV0ZXIoc1BhcmFtZXRlck5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBzUGFyYW1ldGVyTmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJzYXAtdWktZmVcIikgPT09IDA7XG5cdH1cblxuXHQvKipcblx0ICogUm1vdmVzIGlmIHRoZSBwYXNzZWQgcGFyYW1ldGVyIGlzIGNvbnNpZGVyZWQgYXMgdGVjaG5pY2FsIHBhcmFtZXRlci5cblx0ICogQHBhcmFtIG9TZWxlY3Rpb25WYXJpYW50IFNlbGVjdGlvbiBWYXJpYW50IHdoaWNoIGNvbnNpc3RzIG9mIHRlY2huaWNhbCBQYXJhbWV0ZXJzLlxuXHQgKiBAcmV0dXJucyBTZWxlY3Rpb24gVmFyaWFudCB3aXRob3V0IHRlY2huaWNhbCBQYXJhbWV0ZXJzLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X3JlbW92ZVRlY2huaWNhbFBhcmFtZXRlcnMob1NlbGVjdGlvblZhcmlhbnQ6IFNlbGVjdGlvblZhcmlhbnQpOiBTZWxlY3Rpb25WYXJpYW50IHtcblx0XHRsZXQgc1Byb3BOYW1lLCBpO1xuXHRcdGNvbnN0IGFTZWxWYXJQcm9wTmFtZXMgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcygpO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBhU2VsVmFyUHJvcE5hbWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRzUHJvcE5hbWUgPSBhU2VsVmFyUHJvcE5hbWVzW2ldO1xuXHRcdFx0aWYgKHRoaXMuX2lzVGVjaG5pY2FsUGFyYW1ldGVyKHNQcm9wTmFtZSkpIHtcblx0XHRcdFx0b1NlbGVjdGlvblZhcmlhbnQucmVtb3ZlU2VsZWN0T3B0aW9uKHNQcm9wTmFtZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvU2VsZWN0aW9uVmFyaWFudDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTcGxpdHMgdGhlIHBhcmFtZXRlcnMgcHJvdmlkZWQgZHVyaW5nIGluYm91bmQgbmF2aWdhdGlvbiBhbmQgc2VwYXJhdGVzIHRoZSBjb250ZXh0dWFsIGluZm9ybWF0aW9uIGJldHdlZW4gZGVmYXVsdGVkIHBhcmFtZXRlciB2YWx1ZXMgYW5kXG5cdCAqIG5hdmlnYXRpb24gcGFyYW1ldGVycy5cblx0ICogQHBhcmFtIG9TZWxlY3Rpb25WYXJpYW50IEluc3RhbmNlIG9mIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5TZWxlY3Rpb25WYXJpYW50fSBjb250YWluaW5nIG5hdmlnYXRpb24gZGF0YSBvZlxuXHQgKiAgICAgICAgdGhlIGFwcFxuXHQgKiBAcGFyYW0gb1N0YXJ0dXBQYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHN0YXJ0dXAgcGFyYW1ldGVycyBvZiB0aGUgYXBwIChkZXJpdmVkIGZyb20gdGhlIGNvbXBvbmVudClcblx0ICogQHBhcmFtIGFEZWZhdWx0ZWRQYXJhbWV0ZXJzIEFycmF5IGNvbnRhaW5pbmcgZGVmYXVsdGVkIHBhcmFtZXRlciBuYW1lc1xuXHQgKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyB0d28gU2VsZWN0aW9uVmFyaWFudHMsIG9uZSBmb3IgbmF2aWdhdGlvbiAob05hdmlnYXRpb25TZWxWYXIpIGFuZCBvbmUgZm9yIGRlZmF1bHRlZCBzdGFydHVwIHBhcmFtZXRlcnNcblx0ICogICAgICAgICAgKG9EZWZhdWx0ZWRTZWxWYXIpLCBhbmQgYSBmbGFnIChiTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5KSBpbmRpY2F0aW5nIHdoZXRoZXIgYWxsIHBhcmFtZXRlcnMgd2VyZSBkZWZhdWx0ZWQuIFRoZSBmdW5jdGlvbiBpc1xuXHQgKiAgICAgICAgICBoYW5kZWQgdHdvIG9iamVjdHMgY29udGFpbmluZyBwYXJhbWV0ZXJzIChuYW1lcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyB2YWx1ZXMpLCBvU2VsZWN0aW9uVmFyaWFudCBhbmQgb1N0YXJ0dXBQYXJhbWV0ZXJzLiBBXG5cdCAqICAgICAgICAgIHBhcmFtZXRlciBjb3VsZCBiZSBzdG9yZWQgaW4ganVzdCBvbmUgb2YgdGhlc2UgdHdvIG9iamVjdHMgb3IgaW4gYm90aCBvZiB0aGVtIHNpbXVsdGFuZW91c2x5LiBCZWNhdXNlIG9mIHRoZSBsYXR0ZXIgY2FzZSBhXG5cdCAqICAgICAgICAgIHBhcmFtZXRlciBjb3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggY29uZmxpY3RpbmcgdmFsdWVzIGFuZCBpdCBpcyB0aGUgam9iIG9mIHRoaXMgZnVuY3Rpb24gdG8gcmVzb2x2ZSBhbnkgc3VjaCBjb25mbGljdC4gUGFyYW1ldGVyc1xuXHQgKiAgICAgICAgICBhcmUgYXNzaWduZWQgdG8gdGhlIHR3byByZXR1cm5lZCBTZWxlY3Rpb25WYXJpYW50cywgb05hdmlnYXRpb25TZWxWYXIgYW5kIG9EZWZhdWx0ZWRTZWxWYXIsIGFzIGZvbGxvd3M6IHwgcGFyYW1ldGVyIE5PVCBpbiB8XG5cdCAqICAgICAgICAgIHBhcmFtZXRlciBpbiB8IG9TZWxlY3Rpb25WYXJpYW50IHwgb1NlbGVjdGlvblZhcmlhbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLSBwYXJhbWV0ZXIgTk9UIGluIHxcblx0ICogICAgICAgICAgbm90aGluZyB0byBkbyB8IEFkZCBwYXJhbWV0ZXIgb1N0YXJ0dXBQYXJhbWV0ZXJzIHwgaGVyZSB8IChzZWUgYmVsb3cpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0ICogICAgICAgICAgcGFyYW1ldGVyIGluIHwgQWRkIHBhcmFtZXRlciB8IENvbmZsaWN0IHJlc29sdXRpb24gb1N0YXJ0dXBQYXJhbWV0ZXJzIHwgKHNlZSBiZWxvdykgfCAoc2VlIGJlbG93KSBBZGQgcGFyYW1ldGVyOiBpZiBwYXJhbWV0ZXIgaW5cblx0ICogICAgICAgICAgYURlZmF1bHRlZFBhcmFtZXRlcnM6IGFkZCBwYXJhbWV0ZXIgdG8gb0RlZmF1bHRlZFNlbFZhciBlbHNlOiBhZGQgcGFyYW1ldGVyIHRvIG9OYXZpZ2F0aW9uU2VsVmFyIENvbmZsaWN0IHJlc29sdXRpb246IGlmIHBhcmFtZXRlclxuXHQgKiAgICAgICAgICBpbiBhRGVmYXVsdGVkUGFyYW1ldGVyczogYWRkIHBhcmFtZXRlciB2YWx1ZSBmcm9tIG9TZWxlY3Rpb25WYXJpYW50IHRvIG9OYXZpZ2F0aW9uU2VsVmFyIGFkZCBwYXJhbWV0ZXIgdmFsdWUgZnJvbVxuXHQgKiAgICAgICAgICBvU3RhcnR1cFBhcmFtZXRlcnMgdG8gb0RlZmF1bHRlZFNlbFZhciBOb3RlOiBUaGlzIGNhc2Ugb25seSBvY2N1cnMgaW4gVUk1IDEuMzIuIEluIGxhdGVyIHZlcnNpb25zIFVTaGVsbCBzdG9yZXMgYW55IGRlZmF1bHRlZFxuXHQgKiAgICAgICAgICBwYXJhbWV0ZXIgZWl0aGVyIGluIG9TZWxlY3Rpb25WYXJpYW50IG9yIG9TdGFydHVwUGFyYW1ldGVycyBidXQgbmV2ZXIgc2ltdWx0YW5lb3VzbHkgaW4gYm90aC4gZWxzZTogQ2hvb3NlIDEgb2YgdGhlIGZvbGxvd2luZ1xuXHQgKiAgICAgICAgICBvcHRpb25zIGJhc2VkIG9uIGdpdmVuIGhhbmRsaW5nIG1vZGUgKHRoaXMuc1BhcmFtSGFuZGxpbmdNb2RlKS4gLT4gYWRkIHBhcmFtZXRlciB2YWx1ZSBmcm9tIG9TdGFydHVwUGFyYW1ldGVycyB0b1xuXHQgKiAgICAgICAgICBvTmF2aWdhdGlvblNlbFZhciB8IC0+IGFkZCBwYXJhbWV0ZXIgdmFsdWUgZnJvbSBvQXBwU3RhdGUuc2VsZWN0aW9uVmFyaWFudCB0byBvTmF2aWdhdGlvblNlbFZhciAtPiBhZGQgYm90aCBwYXJhbWV0ZXIgdmFsdWVzIHRvXG5cdCAqICAgICAgICAgIG5hdmlnYXRpb25TZWxWYXIgSWYgbmF2aWdhdGlvblNlbFZhciBpcyBzdGlsbCBlbXB0eSBhdCB0aGUgZW5kIG9mIGV4ZWN1dGlvbiwgbmF2aWdhdGlvblNlbFZhciBpcyByZXBsYWNlZCBieSBhIGNvcHkgb2Zcblx0ICogICAgICAgICAgb0RlZmF1bHRlZFNlbFZhciBhbmQgdGhlIGZsYWcgYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSBpcyBzZXQgdG8gdHJ1ZS4gVGhlIHNlbGVjdGlvbiB2YXJpYW50IG9EZWZhdWx0ZWRTZWxWYXIgaXRzZWxmIGlzIGFsd2F5c1xuXHQgKiAgICAgICAgICByZXR1cm5lZCBhcyBpcy5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9zcGxpdEluYm91bmROYXZpZ2F0aW9uUGFyYW1ldGVycyhcblx0XHRvU2VsZWN0aW9uVmFyaWFudDogU2VsZWN0aW9uVmFyaWFudCxcblx0XHRvU3RhcnR1cFBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG5cdFx0YURlZmF1bHRlZFBhcmFtZXRlcnM6IGFueVtdXG5cdCk6IHtcblx0XHRvTmF2aWdhdGlvblNlbFZhcjogU2VsZWN0aW9uVmFyaWFudDtcblx0XHRvRGVmYXVsdGVkU2VsVmFyOiBTZWxlY3Rpb25WYXJpYW50O1xuXHRcdGJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHk6IGJvb2xlYW47XG5cdH0ge1xuXHRcdGlmICghQXJyYXkuaXNBcnJheShhRGVmYXVsdGVkUGFyYW1ldGVycykpIHtcblx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0fVxuXG5cdFx0bGV0IHNQcm9wTmFtZSwgaTtcblx0XHQvLyBGaXJzdCB3ZSBkbyBzb21lIHBhcnNpbmcgb2YgdGhlIFN0YXJ0VXAgUGFyYW1ldGVycy5cblx0XHRjb25zdCBvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuXHRcdGZvciAoc1Byb3BOYW1lIGluIG9TdGFydHVwUGFyYW1ldGVycykge1xuXHRcdFx0aWYgKCFvU3RhcnR1cFBhcmFtZXRlcnMuaGFzT3duUHJvcGVydHkoc1Byb3BOYW1lKSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gaWYgKHNQcm9wTmFtZSA9PT0gU0FQX1NZU1RFTV9QUk9QRVJUWSB8fCBzUHJvcE5hbWUgPT09IERFRkFVTFRFRF9QQVJBTUVURVJfUFJPUEVSVFkpIHtcblx0XHRcdGlmICh0aGlzLl9pc1RlY2huaWNhbFBhcmFtZXRlcihzUHJvcE5hbWUpIHx8IHRoaXMuX2lzRkVQYXJhbWV0ZXIoc1Byb3BOYW1lKSB8fCBzUHJvcE5hbWUgPT09IEhZQlJJRF9JQVBQX1NUQVRFX0tFWSkge1xuXHRcdFx0XHQvLyBEbyBub3QgYWRkIHRoZSBTQVAgc3lzdGVtIHBhcmFtZXRlciB0byB0aGUgc2VsZWN0aW9uIHZhcmlhbnQgYXMgaXQgaXMgYSB0ZWNobmljYWwgcGFyYW1ldGVyXG5cdFx0XHRcdC8vIG5vdCByZWxldmFudCBmb3IgdGhlIHNlbGVjdGlvbiB2YXJpYW50LlxuXHRcdFx0XHQvLyBEbyBub3QgYWRkIHRoZSBzdGFydHVwIHBhcmFtZXRlciBmb3IgZGVmYXVsdCB2YWx1ZXMgdG8gdGhlIHNlbGVjdGlvbiB2YXJpYW50LiBUaGUgaW5mb3JtYXRpb24sIHdoaWNoIHBhcmFtZXRlcnNcblx0XHRcdFx0Ly8gYXJlIGRlZmF1bHRlZCwgaXMgYXZhaWxhYmxlIGluIHRoZSBkZWZhdWx0ZWQgc2VsZWN0aW9uIHZhcmlhbnQuXG5cdFx0XHRcdC8vIEluIGNhc2UsIEZFIFBhcmFtZXRlcnMgd2Ugc2hhbGwgc2tpcCBpdC4odGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIGZldGNoIGl0IGZyb20gVVJMIHBhcmFtcylcblx0XHRcdFx0Ly8gU2tpcCB0aGUgaHlicmlkSUFwcFN0YXRlS2V5IHByZXNlbnQgYXMgcGFydCBvZiAnSHlicmlkJyBuYXZpZ2F0aW9uIHR5cGUgbm90IHJlbGV2YW50IGZvciB0aGUgc2VsZWN0aW9uIHZhcmlhbnRcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdlIHN1cHBvcnQgcGFyYW1ldGVycyBhcyBhIG1hcCB3aXRoIHN0cmluZ3MgYW5kIGFzIGEgbWFwIHdpdGggdmFsdWUgYXJyYXlzXG5cdFx0XHRpZiAodHlwZW9mIG9TdGFydHVwUGFyYW1ldGVyc1tzUHJvcE5hbWVdID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkW3NQcm9wTmFtZV0gPSBvU3RhcnR1cFBhcmFtZXRlcnNbc1Byb3BOYW1lXTtcblx0XHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvU3RhcnR1cFBhcmFtZXRlcnNbc1Byb3BOYW1lXSkgJiYgb1N0YXJ0dXBQYXJhbWV0ZXJzW3NQcm9wTmFtZV0ubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkW3NQcm9wTmFtZV0gPSBvU3RhcnR1cFBhcmFtZXRlcnNbc1Byb3BOYW1lXVswXTsgLy8gc2luZ2xlLXZhbHVlZCBwYXJhbWV0ZXJzXG5cdFx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob1N0YXJ0dXBQYXJhbWV0ZXJzW3NQcm9wTmFtZV0pICYmIG9TdGFydHVwUGFyYW1ldGVyc1tzUHJvcE5hbWVdLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzQWRqdXN0ZWRbc1Byb3BOYW1lXSA9IG9TdGFydHVwUGFyYW1ldGVyc1tzUHJvcE5hbWVdOyAvLyBtdWx0aS12YWx1ZWQgcGFyYW1ldGVyc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDb25zdHJ1Y3QgdHdvIHNlbGVjdGlvbiB2YXJpYW50cyBmb3IgZGVmYXVsdHMgYW5kIG5hdmlnYXRpb24gdG8gYmUgcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uLlxuXHRcdGNvbnN0IG9EZWZhdWx0ZWRTZWxWYXIgPSBuZXcgU2VsZWN0aW9uVmFyaWFudCgpO1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uU2VsVmFyID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoKTtcblxuXHRcdGNvbnN0IGFTZWxWYXJQcm9wTmFtZXMgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRQYXJhbWV0ZXJOYW1lcygpLmNvbmNhdChvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcygpKTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgYVNlbFZhclByb3BOYW1lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0c1Byb3BOYW1lID0gYVNlbFZhclByb3BOYW1lc1tpXTtcblx0XHRcdGlmIChzUHJvcE5hbWUgaW4gb1N0YXJ0dXBQYXJhbWV0ZXJzQWRqdXN0ZWQpIHtcblx0XHRcdFx0Ly8gUmVzb2x2ZSBjb25mbGljdC5cblx0XHRcdFx0aWYgKGFEZWZhdWx0ZWRQYXJhbWV0ZXJzLmluY2x1ZGVzKHNQcm9wTmFtZSkpIHtcblx0XHRcdFx0XHRvTmF2aWdhdGlvblNlbFZhci5tYXNzQWRkU2VsZWN0T3B0aW9uKHNQcm9wTmFtZSwgb1NlbGVjdGlvblZhcmlhbnQuZ2V0VmFsdWUoc1Byb3BOYW1lKSEpO1xuXHRcdFx0XHRcdHRoaXMuX2FkZFBhcmFtZXRlclZhbHVlcyhvRGVmYXVsdGVkU2VsVmFyLCBzUHJvcE5hbWUsIFwiSVwiLCBcIkVRXCIsIG9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkW3NQcm9wTmFtZV0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHN3aXRjaCAodGhpcy5zUGFyYW1IYW5kbGluZ01vZGUpIHtcblx0XHRcdFx0XHRcdGNhc2UgUGFyYW1IYW5kbGluZ01vZGUuU2VsVmFyV2luczpcblx0XHRcdFx0XHRcdFx0b05hdmlnYXRpb25TZWxWYXIubWFzc0FkZFNlbGVjdE9wdGlvbihzUHJvcE5hbWUsIG9TZWxlY3Rpb25WYXJpYW50LmdldFZhbHVlKHNQcm9wTmFtZSkhKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFBhcmFtSGFuZGxpbmdNb2RlLlVSTFBhcmFtV2luczpcblx0XHRcdFx0XHRcdFx0dGhpcy5fYWRkUGFyYW1ldGVyVmFsdWVzKG9OYXZpZ2F0aW9uU2VsVmFyLCBzUHJvcE5hbWUsIFwiSVwiLCBcIkVRXCIsIG9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkW3NQcm9wTmFtZV0pO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgUGFyYW1IYW5kbGluZ01vZGUuSW5zZXJ0SW5TZWxPcHQ6XG5cdFx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uU2VsVmFyLm1hc3NBZGRTZWxlY3RPcHRpb24oc1Byb3BOYW1lLCBvU2VsZWN0aW9uVmFyaWFudC5nZXRWYWx1ZShzUHJvcE5hbWUpISk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2FkZFBhcmFtZXRlclZhbHVlcyhvTmF2aWdhdGlvblNlbFZhciwgc1Byb3BOYW1lLCBcIklcIiwgXCJFUVwiLCBvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZFtzUHJvcE5hbWVdKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUXCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChhRGVmYXVsdGVkUGFyYW1ldGVycy5pbmNsdWRlcyhzUHJvcE5hbWUpKSB7XG5cdFx0XHRcdC8vIHBhcmFtZXRlciBvbmx5IGluIFNlbFZhclxuXHRcdFx0XHRvRGVmYXVsdGVkU2VsVmFyLm1hc3NBZGRTZWxlY3RPcHRpb24oc1Byb3BOYW1lLCBvU2VsZWN0aW9uVmFyaWFudC5nZXRWYWx1ZShzUHJvcE5hbWUpISk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvTmF2aWdhdGlvblNlbFZhci5tYXNzQWRkU2VsZWN0T3B0aW9uKHNQcm9wTmFtZSwgb1NlbGVjdGlvblZhcmlhbnQuZ2V0VmFsdWUoc1Byb3BOYW1lKSEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoc1Byb3BOYW1lIGluIG9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkKSB7XG5cdFx0XHQvLyBUaGUgY2FzZSB3aGVyZSB0aGUgcGFyYW1ldGVyIGFwcGVhcnMgdHdpY2UgaGFzIGFscmVhZHkgYmVlbiB0YWtlbiBjYXJlIG9mIGFib3ZlIHNvIHdlIHNraXAgaXQgaGVyZS5cblx0XHRcdGlmIChhU2VsVmFyUHJvcE5hbWVzLmluY2x1ZGVzKHNQcm9wTmFtZSkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChhRGVmYXVsdGVkUGFyYW1ldGVycy5pbmNsdWRlcyhzUHJvcE5hbWUpKSB7XG5cdFx0XHRcdHRoaXMuX2FkZFBhcmFtZXRlclZhbHVlcyhvRGVmYXVsdGVkU2VsVmFyLCBzUHJvcE5hbWUsIFwiSVwiLCBcIkVRXCIsIG9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkW3NQcm9wTmFtZV0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5fYWRkUGFyYW1ldGVyVmFsdWVzKG9OYXZpZ2F0aW9uU2VsVmFyLCBzUHJvcE5hbWUsIFwiSVwiLCBcIkVRXCIsIG9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkW3NQcm9wTmFtZV0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIHRoZSBzZWxlY3Rpb24gdmFyaWFudCB1c2VkIGZvciBuYXZpZ2F0aW9uIHNob3VsZCBiZSBmaWxsZWQgd2l0aCBkZWZhdWx0cyBpbiBjYXNlIHRoYXQgb25seSBkZWZhdWx0cyBleGlzdFxuXHRcdGxldCBiTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5ID0gZmFsc2U7XG5cdFx0aWYgKG9OYXZpZ2F0aW9uU2VsVmFyLmlzRW1wdHkoKSkge1xuXHRcdFx0Yk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSA9IHRydWU7XG5cdFx0XHRjb25zdCBhUHJvcE5hbWVzID0gb0RlZmF1bHRlZFNlbFZhci5nZXRTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcygpO1xuXHRcdFx0Zm9yIChpID0gMDsgaSA8IGFQcm9wTmFtZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0b05hdmlnYXRpb25TZWxWYXIubWFzc0FkZFNlbGVjdE9wdGlvbihhUHJvcE5hbWVzW2ldLCBvRGVmYXVsdGVkU2VsVmFyLmdldFZhbHVlKGFQcm9wTmFtZXNbaV0pISk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG9OYXZpZ2F0aW9uU2VsVmFyOiBvTmF2aWdhdGlvblNlbFZhcixcblx0XHRcdG9EZWZhdWx0ZWRTZWxWYXI6IG9EZWZhdWx0ZWRTZWxWYXIsXG5cdFx0XHRiTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5OiBiTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5XG5cdFx0fTtcblx0fVxuXG5cdF9hZGRQYXJhbWV0ZXJWYWx1ZXMoXG5cdFx0b1NlbFZhcmlhbnQ6IFNlbGVjdGlvblZhcmlhbnQsXG5cdFx0c1Byb3BOYW1lOiBzdHJpbmcsXG5cdFx0c1NpZ246IHN0cmluZyxcblx0XHRzT3B0aW9uOiBzdHJpbmcsXG5cdFx0b1ZhbHVlczogc3RyaW5nIHwgc3RyaW5nW11cblx0KTogdm9pZCB7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkob1ZhbHVlcykpIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgb1ZhbHVlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRvU2VsVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oc1Byb3BOYW1lLCBzU2lnbiwgc09wdGlvbiwgb1ZhbHVlc1tpXSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9TZWxWYXJpYW50LmFkZFNlbGVjdE9wdGlvbihzUHJvcE5hbWUsIHNTaWduLCBzT3B0aW9uLCBvVmFsdWVzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hhbmdlcyB0aGUgVVJMIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBzQXBwU3RhdGVLZXkuIEFzIGFuIHJlYWN0aW9uIHJvdXRlIGNoYW5nZSBldmVudCB3aWxsIGJlIHRyaWdnZXJlZC5cblx0ICogQHBhcmFtIHNBcHBTdGF0ZUtleSBUaGUgbmV3IGFwcCBzdGF0ZSBrZXkuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdHJlcGxhY2VIYXNoKHNBcHBTdGF0ZUtleTogc3RyaW5nKTogdm9pZCB7XG5cdFx0Y29uc3Qgb0hhc2hDaGFuZ2VyID0gdGhpcy5vUm91dGVyLm9IYXNoQ2hhbmdlciA/IHRoaXMub1JvdXRlci5vSGFzaENoYW5nZXIgOiBIYXNoQ2hhbmdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdGNvbnN0IHNBcHBIYXNoT2xkID0gb0hhc2hDaGFuZ2VyLmdldEhhc2goKTtcblx0XHQvKlxuXHRcdCAqIHVzZSAuZ2V0SGFzaCgpIGhlcmUgaW5zdGVhZCBvZiAuZ2V0QXBwSGFzaCgpIHRvIGFsc28gYmUgYWJsZSBkZWFsaW5nIHdpdGggZW52aXJvbm1lbnRzIHdoZXJlIG9ubHkgU0FQVUk1IGlzIGxvYWRlZCBhbmQgdGhlIFVTaGVsbCBpc1xuXHRcdCAqIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseS5cblx0XHQgKi9cblx0XHRjb25zdCBzQXBwSGFzaE5ldyA9IHRoaXMuX3JlcGxhY2VJbm5lckFwcFN0YXRlS2V5KHNBcHBIYXNoT2xkLCBzQXBwU3RhdGVLZXkpO1xuXHRcdG9IYXNoQ2hhbmdlci5yZXBsYWNlSGFzaChzQXBwSGFzaE5ldyk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhbmdlcyB0aGUgVVJMIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBhcHAgc3RhdGUgYW5kIHN0b3JlcyB0aGUgYXBwIHN0YXRlIGZvciBsYXRlciByZXRyaWV2YWwuXG5cdCAqIEBwYXJhbSBtSW5uZXJBcHBEYXRhIE9iamVjdCBjb250YWluaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBhcHBcblx0ICogQHBhcmFtIGJJbW1lZGlhdGVIYXNoUmVwbGFjZSBJZiBzZXQgdG8gZmFsc2UsIHRoZSBpbm5lciBhcHAgaGFzaCB3aWxsIG5vdCBiZSByZXBsYWNlZCB1bnRpbCBzdG9yaW5nIGlzIHN1Y2Nlc3NmdWw7IGRvIG5vdFxuXHQgKiAgICAgICAgc2V0IHRvIGZhbHNlIGlmIHlvdSBjYW5ub3QgcmVhY3QgdG8gdGhlIHJlc29sdXRpb24gb2YgdGhlIFByb21pc2UsIGZvciBleGFtcGxlLCB3aGVuIGNhbGxpbmcgdGhlIGJlZm9yZUxpbmtQcmVzc2VkIGV2ZW50XG5cdCAqIEBwYXJhbSBiU2tpcEhhc2hSZXBsYWNlIElmIHNldCB0byB0cnVlLCB0aGUgaW5uZXIgYXBwIGhhc2ggd2lsbCBub3QgYmUgcmVwbGFjZWQgaW4gdGhlIHN0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jLiBBbHNvIHRoZSBiSW1tZWRpYXRlSGFzaFJlcGxhY2Vcblx0ICogXHRcdCAgd2lsbCBiZSBpZ25vcmVkLlxuXHQgKiBAcmV0dXJucyBBIFByb21pc2Ugb2JqZWN0IHRvIG1vbml0b3Igd2hlbiBhbGwgdGhlIGFjdGlvbnMgb2YgdGhlIGZ1bmN0aW9uIGhhdmUgYmVlbiBleGVjdXRlZDsgaWYgdGhlIGV4ZWN1dGlvbiBpcyBzdWNjZXNzZnVsLCB0aGVcblx0ICogICAgICAgICAgYXBwIHN0YXRlIGtleSBpcyByZXR1cm5lZDsgaWYgYW4gZXJyb3Igb2NjdXJzLCBhbiBvYmplY3Qgb2YgdHlwZSB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2RXJyb3J9IGlzXG5cdCAqICAgICAgICAgIHJldHVybmVkXG5cdCAqIEBwdWJsaWNcblx0ICogQGV4YW1wbGUgPGNvZGU+XG5cdCAqIHNhcC51aS5kZWZpbmUoW1wic2FwL2ZlL25hdmlnYXRpb24vTmF2aWdhdGlvbkhhbmRsZXJcIl0sIGZ1bmN0aW9uIChOYXZpZ2F0aW9uSGFuZGxlcikge1xuXHQgKiBcdHZhciBvTmF2aWdhdGlvbkhhbmRsZXIgPSBuZXcgTmF2aWdhdGlvbkhhbmRsZXIob0NvbnRyb2xsZXIpO1xuXHQgKiBcdHZhciBtSW5uZXJBcHBEYXRhID0ge1xuXHQgKiBcdFx0c2VsZWN0aW9uVmFyaWFudCA6IG9TbWFydEZpbHRlckJhci5nZXREYXRhU3VpdGVGb3JtYXQoKSxcblx0ICogXHRcdHRhYmxlVmFyaWFudElkIDogb1NtYXJ0VGFibGUuZ2V0Q3VycmVudFZhcmlhbnRJZCgpLFxuXHQgKiBcdFx0Y3VzdG9tRGF0YSA6IG9NeUN1c3RvbURhdGFcblx0ICogXHR9O1xuXHQgKlxuXHQgKiBcdHZhciBvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZSA9IG9OYXZpZ2F0aW9uSGFuZGxlci5zdG9yZUlubmVyQXBwU3RhdGVBc3luYyhtSW5uZXJBcHBEYXRhKTtcblx0ICpcblx0ICogXHRvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZS5kb25lKGZ1bmN0aW9uKHNBcHBTdGF0ZUtleSl7XG5cdCAqIFx0XHQvL3lvdXIgaW5uZXIgYXBwIHN0YXRlIGlzIHNhdmVkIG5vdywgc0FwcFN0YXRlS2V5IHdhcyBhZGRlZCB0byBVUkxcblx0ICogXHRcdC8vcGVyZm9ybSBhY3Rpb25zIHRoYXQgbXVzdCBydW4gYWZ0ZXIgc2F2ZVxuXHQgKiBcdH0pO1xuXHQgKlxuXHQgKiBcdG9TdG9yZUlubmVyQXBwU3RhdGVQcm9taXNlLmZhaWwoZnVuY3Rpb24ob0Vycm9yKXtcblx0ICogXHRcdC8vc29tZSBlcnJvciBoYW5kbGluZ1xuXHQgKiBcdH0pO1xuXHQgKiB9KTtcblx0ICogPC9jb2RlPlxuXHQgKi9cblx0c3RvcmVJbm5lckFwcFN0YXRlQXN5bmMoXG5cdFx0bUlubmVyQXBwRGF0YTogSW5uZXJBcHBEYXRhLFxuXHRcdGJJbW1lZGlhdGVIYXNoUmVwbGFjZT86IGJvb2xlYW4sXG5cdFx0YlNraXBIYXNoUmVwbGFjZT86IGJvb2xlYW5cblx0KTogalF1ZXJ5LlByb21pc2U8c3RyaW5nPiB7XG5cdFx0aWYgKHR5cGVvZiBiSW1tZWRpYXRlSGFzaFJlcGxhY2UgIT09IFwiYm9vbGVhblwiKSB7XG5cdFx0XHRiSW1tZWRpYXRlSGFzaFJlcGxhY2UgPSB0cnVlOyAvLyBkZWZhdWx0XG5cdFx0fVxuXHRcdGNvbnN0IG9OYXZIYW5kbGVyID0gdGhpcztcblx0XHRjb25zdCBvTXlEZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpO1xuXG5cdFx0Y29uc3QgZm5SZXBsYWNlSGFzaCA9IGZ1bmN0aW9uIChzQXBwU3RhdGVLZXk6IHN0cmluZyk6IHZvaWQge1xuXHRcdFx0Y29uc3Qgb0hhc2hDaGFuZ2VyID0gb05hdkhhbmRsZXIub1JvdXRlci5vSGFzaENoYW5nZXIgPyBvTmF2SGFuZGxlci5vUm91dGVyLm9IYXNoQ2hhbmdlciA6IEhhc2hDaGFuZ2VyLmdldEluc3RhbmNlKCk7XG5cdFx0XHRjb25zdCBzQXBwSGFzaE9sZCA9IG9IYXNoQ2hhbmdlci5nZXRIYXNoKCk7XG5cdFx0XHQvKlxuXHRcdFx0ICogdXNlIC5nZXRIYXNoKCkgaGVyZSBpbnN0ZWFkIG9mIC5nZXRBcHBIYXNoKCkgdG8gYWxzbyBiZSBhYmxlIGRlYWxpbmcgd2l0aCBlbnZpcm9ubWVudHMgd2hlcmUgb25seSBTQVBVSTUgaXMgbG9hZGVkIGFuZCB0aGUgVVNoZWxsXG5cdFx0XHQgKiBpcyBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkuXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IHNBcHBIYXNoTmV3ID0gb05hdkhhbmRsZXIuX3JlcGxhY2VJbm5lckFwcFN0YXRlS2V5KHNBcHBIYXNoT2xkLCBzQXBwU3RhdGVLZXkpO1xuXHRcdFx0b0hhc2hDaGFuZ2VyLnJlcGxhY2VIYXNoKHNBcHBIYXNoTmV3KTtcblx0XHR9O1xuXG5cdFx0Ly8gaW4gY2FzZSBtSW5uZXJBcHBTdGF0ZSBpcyBlbXB0eSwgZG8gbm90IG92ZXJ3cml0ZSB0aGUgbGFzdCBzYXZlZCBzdGF0ZVxuXHRcdGlmIChpc0VtcHR5T2JqZWN0KG1Jbm5lckFwcERhdGEgYXMgb2JqZWN0KSkge1xuXHRcdFx0b015RGVmZXJyZWQucmVzb2x2ZShcIlwiKTtcblx0XHRcdHJldHVybiBvTXlEZWZlcnJlZC5wcm9taXNlKCk7XG5cdFx0fVxuXG5cdFx0Ly8gY2hlY2sgaWYgd2UgYWxyZWFkeSBzYXZlZCB0aGUgc2FtZSBkYXRhXG5cdFx0Y29uc3Qgc0FwcFN0YXRlS2V5Q2FjaGVkID0gdGhpcy5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5zQXBwU3RhdGVLZXk7XG5cblx0XHRjb25zdCBiSW5uZXJBcHBEYXRhRXF1YWwgPSBKU09OLnN0cmluZ2lmeShtSW5uZXJBcHBEYXRhKSA9PT0gSlNPTi5zdHJpbmdpZnkodGhpcy5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5vQXBwRGF0YSk7XG5cdFx0aWYgKGJJbm5lckFwcERhdGFFcXVhbCAmJiBzQXBwU3RhdGVLZXlDYWNoZWQpIHtcblx0XHRcdC8vIHBhc3NlZCBpbm5lciBhcHAgc3RhdGUgZm91bmQgaW4gY2FjaGVcblx0XHRcdHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEuaUNhY2hlSGl0Kys7XG5cblx0XHRcdC8vIHJlcGxhY2UgaW5uZXIgYXBwIGhhc2ggd2l0aCBjYWNoZWQgYXBwU3RhdGVLZXkgaW4gdXJsIChqdXN0IGluIGNhc2UgdGhlIGFwcCBoYXMgY2hhbmdlZCB0aGUgaGFzaCBpbiBtZWFudGltZSlcblx0XHRcdGZuUmVwbGFjZUhhc2goc0FwcFN0YXRlS2V5Q2FjaGVkKTtcblx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUoc0FwcFN0YXRlS2V5Q2FjaGVkKTtcblx0XHRcdHJldHVybiBvTXlEZWZlcnJlZC5wcm9taXNlKCk7XG5cdFx0fVxuXG5cdFx0Ly8gcGFzc2VkIGlubmVyIGFwcCBzdGF0ZSBub3QgZm91bmQgaW4gY2FjaGVcblx0XHR0aGlzLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLmlDYWNoZU1pc3MrKztcblxuXHRcdGNvbnN0IGZuT25BZnRlclNhdmUgPSBmdW5jdGlvbiAoc0FwcFN0YXRlS2V5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRcdC8vIHJlcGxhY2UgaW5uZXIgYXBwIGhhc2ggd2l0aCBuZXcgYXBwU3RhdGVLZXkgaW4gdXJsXG5cdFx0XHRpZiAoIWJTa2lwSGFzaFJlcGxhY2UgJiYgIWJJbW1lZGlhdGVIYXNoUmVwbGFjZSkge1xuXHRcdFx0XHRmblJlcGxhY2VIYXNoKHNBcHBTdGF0ZUtleSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIHJlbWVtYmVyIGxhc3Qgc2F2ZWQgc3RhdGVcblx0XHRcdG9OYXZIYW5kbGVyLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLm9BcHBEYXRhID0gbUlubmVyQXBwRGF0YTtcblx0XHRcdG9OYXZIYW5kbGVyLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLnNBcHBTdGF0ZUtleSA9IHNBcHBTdGF0ZUtleTtcblx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUoc0FwcFN0YXRlS2V5KTtcblx0XHR9O1xuXG5cdFx0Y29uc3QgZm5PbkVycm9yID0gZnVuY3Rpb24gKG9FcnJvcjogdW5rbm93bik6IHZvaWQge1xuXHRcdFx0b015RGVmZXJyZWQucmVqZWN0KG9FcnJvcik7XG5cdFx0fTtcblxuXHRcdHRoaXMuX3NhdmVBcHBTdGF0ZUFzeW5jKG1Jbm5lckFwcERhdGEsIGZuT25BZnRlclNhdmUsIGZuT25FcnJvcilcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChzQXBwU3RhdGVLZXk6IGFueSkge1xuXHRcdFx0XHQvKiBOb3RlIHRoYXQgX3NhcEFwcFN0YXRlIG1heSByZXR1cm4gJ3VuZGVmaW5lZCcgaW4gY2FzZSB0aGF0IHRoZSBwYXJzaW5nIGhhcyBmYWlsZWQuIEluIHRoaXMgY2FzZSwgd2Ugc2hvdWxkIG5vdCB0cmlnZ2VyIHRoZSByZXBsYWNlbWVudFxuXHRcdFx0XHQgKiBvZiB0aGUgQXBwIEhhc2ggd2l0aCB0aGUgZ2VuZXJhdGVkIGtleSwgYXMgdGhlIGNvbnRhaW5lciB3YXMgbm90IHdyaXR0ZW4gYmVmb3JlLiBOb3RlIGFzIHdlbGwgdGhhdCB0aGUgZXJyb3IgaGFuZGxpbmcgaGFzIGFscmVhZHlcblx0XHRcdFx0ICogaGFwcGVuZWQgYmVmb3JlIGJ5IG1ha2luZyB0aGUgb015RGVmZXJyZWQgcHJvbWlzZSBmYWlsIChzZWUgZm5PbkVycm9yIGFib3ZlKS5cblx0XHRcdFx0ICovXG5cdFx0XHRcdGlmIChzQXBwU3RhdGVLZXkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdC8vIHJlcGxhY2UgaW5uZXIgYXBwIGhhc2ggd2l0aCBuZXcgYXBwU3RhdGVLZXkgaW4gdXJsXG5cdFx0XHRcdFx0Ly8gbm90ZTogd2UgZG8gbm90IHdhaXQgZm9yIHRoZSBzYXZlIHRvIGJlIGNvbXBsZXRlZDogdGhpcyBhc3luY2hyb25vdXNseSBiZWhhdmlvdXIgaXMgbmVjZXNzYXJ5IGlmXG5cdFx0XHRcdFx0Ly8gdGhpcyBtZXRob2QgaXMgY2FsbGVkIGUuZy4gaW4gYSBvbkxpbmtQcmVzc2VkIGV2ZW50IHdpdGggbm8gcG9zc2liaWxpdHkgdG8gd2FpdCBmb3IgdGhlIHByb21pc2UgcmVzb2x1dGlvblxuXHRcdFx0XHRcdGlmICghYlNraXBIYXNoUmVwbGFjZSAmJiBiSW1tZWRpYXRlSGFzaFJlcGxhY2UpIHtcblx0XHRcdFx0XHRcdGZuUmVwbGFjZUhhc2goc0FwcFN0YXRlS2V5KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLl9zYXZlQXBwU3RhdGVBc3luYyBmYWlsZWRcIik7XG5cdFx0XHR9KTtcblxuXHRcdHJldHVybiBvTXlEZWZlcnJlZC5wcm9taXNlKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhbmdlcyB0aGUgVVJMIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBhcHAgc3RhdGUgYW5kIHN0b3JlcyB0aGUgYXBwIHN0YXRlIGZvciBsYXRlciByZXRyaWV2YWwuXG5cdCAqIEBwYXJhbSBtSW5uZXJBcHBEYXRhIE9iamVjdCBjb250YWluaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBhcHBcblx0ICogQHBhcmFtIGJJbW1lZGlhdGVIYXNoUmVwbGFjZSBJZiBzZXQgdG8gZmFsc2UsIHRoZSBpbm5lciBhcHAgaGFzaCB3aWxsIG5vdCBiZSByZXBsYWNlZCB1bnRpbCBzdG9yaW5nIGlzIHN1Y2Nlc3NmdWw7IGRvIG5vdFxuXHQgKiAgICAgICAgc2V0IHRvIGZhbHNlIGlmIHlvdSBjYW5ub3QgcmVhY3QgdG8gdGhlIHJlc29sdXRpb24gb2YgdGhlIFByb21pc2UsIGZvciBleGFtcGxlLCB3aGVuIGNhbGxpbmcgdGhlIGJlZm9yZUxpbmtQcmVzc2VkIGV2ZW50XG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSBvYmplY3QgdG8gbW9uaXRvciB3aGVuIGFsbCB0aGUgYWN0aW9ucyBvZiB0aGUgZnVuY3Rpb24gaGF2ZSBiZWVuIGV4ZWN1dGVkOyBpZiB0aGUgZXhlY3V0aW9uIGlzIHN1Y2Nlc3NmdWwsIHRoZVxuXHQgKiAgICAgICAgICBhcHAgc3RhdGUga2V5IGlzIHJldHVybmVkOyBpZiBhbiBlcnJvciBvY2N1cnMsIGFuIG9iamVjdCBvZiB0eXBlIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZFcnJvcn0gaXNcblx0ICogICAgICAgICAgcmV0dXJuZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAZXhhbXBsZSA8Y29kZT5cblx0ICogc2FwLnVpLmRlZmluZShbXCJzYXAvZmUvbmF2aWdhdGlvbi9OYXZpZ2F0aW9uSGFuZGxlclwiXSwgZnVuY3Rpb24gKE5hdmlnYXRpb25IYW5kbGVyKSB7XG5cdCAqIFx0dmFyIG9OYXZpZ2F0aW9uSGFuZGxlciA9IG5ldyBOYXZpZ2F0aW9uSGFuZGxlcihvQ29udHJvbGxlcik7XG5cdCAqIFx0dmFyIG1Jbm5lckFwcERhdGEgPSB7XG5cdCAqIFx0XHRzZWxlY3Rpb25WYXJpYW50IDogb1NtYXJ0RmlsdGVyQmFyLmdldERhdGFTdWl0ZUZvcm1hdCgpLFxuXHQgKiBcdFx0dGFibGVWYXJpYW50SWQgOiBvU21hcnRUYWJsZS5nZXRDdXJyZW50VmFyaWFudElkKCksXG5cdCAqIFx0XHRjdXN0b21EYXRhIDogb015Q3VzdG9tRGF0YVxuXHQgKiBcdH07XG5cdCAqXG5cdCAqIFx0dmFyIG9TdG9yZUlubmVyQXBwU3RhdGVQcm9taXNlID0gb05hdmlnYXRpb25IYW5kbGVyLnN0b3JlSW5uZXJBcHBTdGF0ZShtSW5uZXJBcHBEYXRhKTtcblx0ICpcblx0ICogXHRvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZS5kb25lKGZ1bmN0aW9uKHNBcHBTdGF0ZUtleSl7XG5cdCAqIFx0XHQvL3lvdXIgaW5uZXIgYXBwIHN0YXRlIGlzIHNhdmVkIG5vdywgc0FwcFN0YXRlS2V5IHdhcyBhZGRlZCB0byBVUkxcblx0ICogXHRcdC8vcGVyZm9ybSBhY3Rpb25zIHRoYXQgbXVzdCBydW4gYWZ0ZXIgc2F2ZVxuXHQgKiBcdH0pO1xuXHQgKlxuXHQgKiBcdG9TdG9yZUlubmVyQXBwU3RhdGVQcm9taXNlLmZhaWwoZnVuY3Rpb24ob0Vycm9yKXtcblx0ICogXHRcdC8vc29tZSBlcnJvciBoYW5kbGluZ1xuXHQgKiBcdH0pO1xuXHQgKiB9KTtcblx0ICogPC9jb2RlPlxuXHQgKiBAZGVwcmVjYXRlZHNpbmNlIDEuMTA0XG5cdCAqIEBkZXByZWNhdGVkIFVzZSB0aGUge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyLnN0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jfSBpbnN0ZWFkLlxuXHQgKi9cblx0c3RvcmVJbm5lckFwcFN0YXRlKG1Jbm5lckFwcERhdGE6IElubmVyQXBwRGF0YSwgYkltbWVkaWF0ZUhhc2hSZXBsYWNlPzogYm9vbGVhbik6IGpRdWVyeS5Qcm9taXNlPHN0cmluZz4ge1xuXHRcdExvZy5lcnJvcihcblx0XHRcdFwiRGVwcmVjYXRlZCBBUEkgY2FsbCBvZiAnc2FwLmZlLm5hdmlnYXRpb24uTmF2aWdhdGlvbkhhbmRsZXIuc3RvcmVJbm5lckFwcFN0YXRlJy4gUGxlYXNlIHVzZSAnc3RvcmVJbm5lckFwcFN0YXRlQXN5bmMnIGluc3RlYWRcIixcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFwic2FwLmZlLm5hdmlnYXRpb24uTmF2aWdhdGlvbkhhbmRsZXJcIlxuXHRcdCk7XG5cdFx0aWYgKHR5cGVvZiBiSW1tZWRpYXRlSGFzaFJlcGxhY2UgIT09IFwiYm9vbGVhblwiKSB7XG5cdFx0XHRiSW1tZWRpYXRlSGFzaFJlcGxhY2UgPSB0cnVlOyAvLyBkZWZhdWx0XG5cdFx0fVxuXHRcdGNvbnN0IG9OYXZIYW5kbGVyID0gdGhpcztcblx0XHRjb25zdCBvTXlEZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpO1xuXG5cdFx0Y29uc3QgZm5SZXBsYWNlSGFzaCA9IGZ1bmN0aW9uIChzQXBwU3RhdGVLZXk6IHN0cmluZyk6IHZvaWQge1xuXHRcdFx0Y29uc3Qgb0hhc2hDaGFuZ2VyID0gb05hdkhhbmRsZXIub1JvdXRlci5vSGFzaENoYW5nZXIgPyBvTmF2SGFuZGxlci5vUm91dGVyLm9IYXNoQ2hhbmdlciA6IEhhc2hDaGFuZ2VyLmdldEluc3RhbmNlKCk7XG5cdFx0XHRjb25zdCBzQXBwSGFzaE9sZCA9IG9IYXNoQ2hhbmdlci5nZXRIYXNoKCk7XG5cdFx0XHQvKlxuXHRcdFx0ICogdXNlIC5nZXRIYXNoKCkgaGVyZSBpbnN0ZWFkIG9mIC5nZXRBcHBIYXNoKCkgdG8gYWxzbyBiZSBhYmxlIGRlYWxpbmcgd2l0aCBlbnZpcm9ubWVudHMgd2hlcmUgb25seSBTQVBVSTUgaXMgbG9hZGVkIGFuZCB0aGUgVVNoZWxsXG5cdFx0XHQgKiBpcyBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkuXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IHNBcHBIYXNoTmV3ID0gb05hdkhhbmRsZXIuX3JlcGxhY2VJbm5lckFwcFN0YXRlS2V5KHNBcHBIYXNoT2xkLCBzQXBwU3RhdGVLZXkpO1xuXHRcdFx0b0hhc2hDaGFuZ2VyLnJlcGxhY2VIYXNoKHNBcHBIYXNoTmV3KTtcblx0XHR9O1xuXG5cdFx0Ly8gaW4gY2FzZSBtSW5uZXJBcHBTdGF0ZSBpcyBlbXB0eSwgZG8gbm90IG92ZXJ3cml0ZSB0aGUgbGFzdCBzYXZlZCBzdGF0ZVxuXHRcdGlmIChpc0VtcHR5T2JqZWN0KG1Jbm5lckFwcERhdGEgYXMgb2JqZWN0KSkge1xuXHRcdFx0b015RGVmZXJyZWQucmVzb2x2ZShcIlwiKTtcblx0XHRcdHJldHVybiBvTXlEZWZlcnJlZC5wcm9taXNlKCk7XG5cdFx0fVxuXG5cdFx0Ly8gY2hlY2sgaWYgd2UgYWxyZWFkeSBzYXZlZCB0aGUgc2FtZSBkYXRhXG5cdFx0Y29uc3Qgc0FwcFN0YXRlS2V5Q2FjaGVkID0gdGhpcy5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5zQXBwU3RhdGVLZXk7XG5cblx0XHRjb25zdCBiSW5uZXJBcHBEYXRhRXF1YWwgPSBKU09OLnN0cmluZ2lmeShtSW5uZXJBcHBEYXRhKSA9PT0gSlNPTi5zdHJpbmdpZnkodGhpcy5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5vQXBwRGF0YSk7XG5cdFx0aWYgKGJJbm5lckFwcERhdGFFcXVhbCAmJiBzQXBwU3RhdGVLZXlDYWNoZWQpIHtcblx0XHRcdC8vIHBhc3NlZCBpbm5lciBhcHAgc3RhdGUgZm91bmQgaW4gY2FjaGVcblx0XHRcdHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEuaUNhY2hlSGl0Kys7XG5cblx0XHRcdC8vIHJlcGxhY2UgaW5uZXIgYXBwIGhhc2ggd2l0aCBjYWNoZWQgYXBwU3RhdGVLZXkgaW4gdXJsIChqdXN0IGluIGNhc2UgdGhlIGFwcCBoYXMgY2hhbmdlZCB0aGUgaGFzaCBpbiBtZWFudGltZSlcblx0XHRcdGZuUmVwbGFjZUhhc2goc0FwcFN0YXRlS2V5Q2FjaGVkKTtcblx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUoc0FwcFN0YXRlS2V5Q2FjaGVkKTtcblx0XHRcdHJldHVybiBvTXlEZWZlcnJlZC5wcm9taXNlKCk7XG5cdFx0fVxuXG5cdFx0Ly8gcGFzc2VkIGlubmVyIGFwcCBzdGF0ZSBub3QgZm91bmQgaW4gY2FjaGVcblx0XHR0aGlzLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLmlDYWNoZU1pc3MrKztcblxuXHRcdGNvbnN0IGZuT25BZnRlclNhdmUgPSBmdW5jdGlvbiAoc0FwcFN0YXRlS2V5OiBhbnkpOiB2b2lkIHtcblx0XHRcdC8vIHJlcGxhY2UgaW5uZXIgYXBwIGhhc2ggd2l0aCBuZXcgYXBwU3RhdGVLZXkgaW4gdXJsXG5cdFx0XHRpZiAoIWJJbW1lZGlhdGVIYXNoUmVwbGFjZSkge1xuXHRcdFx0XHRmblJlcGxhY2VIYXNoKHNBcHBTdGF0ZUtleSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIHJlbWVtYmVyIGxhc3Qgc2F2ZWQgc3RhdGVcblx0XHRcdG9OYXZIYW5kbGVyLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLm9BcHBEYXRhID0gbUlubmVyQXBwRGF0YTtcblx0XHRcdG9OYXZIYW5kbGVyLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLnNBcHBTdGF0ZUtleSA9IHNBcHBTdGF0ZUtleTtcblx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUoc0FwcFN0YXRlS2V5KTtcblx0XHR9O1xuXG5cdFx0Y29uc3QgZm5PbkVycm9yID0gZnVuY3Rpb24gKG9FcnJvcjogYW55KTogdm9pZCB7XG5cdFx0XHRvTXlEZWZlcnJlZC5yZWplY3Qob0Vycm9yKTtcblx0XHR9O1xuXG5cdFx0Y29uc3Qgc0FwcFN0YXRlS2V5ID0gdGhpcy5fc2F2ZUFwcFN0YXRlKG1Jbm5lckFwcERhdGEsIGZuT25BZnRlclNhdmUsIGZuT25FcnJvcik7XG5cdFx0Lypcblx0XHQgKiBOb3RlIHRoYXQgX3NhcEFwcFN0YXRlIG1heSByZXR1cm4gJ3VuZGVmaW5lZCcgaW4gY2FzZSB0aGF0IHRoZSBwYXJzaW5nIGhhcyBmYWlsZWQuIEluIHRoaXMgY2FzZSwgd2Ugc2hvdWxkIG5vdCB0cmlnZ2VyIHRoZSByZXBsYWNlbWVudFxuXHRcdCAqIG9mIHRoZSBBcHAgSGFzaCB3aXRoIHRoZSBnZW5lcmF0ZWQga2V5LCBhcyB0aGUgY29udGFpbmVyIHdhcyBub3Qgd3JpdHRlbiBiZWZvcmUuIE5vdGUgYXMgd2VsbCB0aGF0IHRoZSBlcnJvciBoYW5kbGluZyBoYXMgYWxyZWFkeVxuXHRcdCAqIGhhcHBlbmVkIGJlZm9yZSBieSBtYWtpbmcgdGhlIG9NeURlZmVycmVkIHByb21pc2UgZmFpbCAoc2VlIGZuT25FcnJvciBhYm92ZSkuXG5cdFx0ICovXG5cdFx0aWYgKHNBcHBTdGF0ZUtleSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyByZXBsYWNlIGlubmVyIGFwcCBoYXNoIHdpdGggbmV3IGFwcFN0YXRlS2V5IGluIHVybFxuXHRcdFx0Ly8gbm90ZTogd2UgZG8gbm90IHdhaXQgZm9yIHRoZSBzYXZlIHRvIGJlIGNvbXBsZXRlZDogdGhpcyBhc3luY2hyb25vdXNseSBiZWhhdmlvdXIgaXMgbmVjZXNzYXJ5IGlmXG5cdFx0XHQvLyB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgZS5nLiBpbiBhIG9uTGlua1ByZXNzZWQgZXZlbnQgd2l0aCBubyBwb3NzaWJpbGl0eSB0byB3YWl0IGZvciB0aGUgcHJvbWlzZSByZXNvbHV0aW9uXG5cdFx0XHRpZiAoYkltbWVkaWF0ZUhhc2hSZXBsYWNlKSB7XG5cdFx0XHRcdGZuUmVwbGFjZUhhc2goc0FwcFN0YXRlS2V5KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb015RGVmZXJyZWQucHJvbWlzZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgdGhlIFVSTCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgYXBwIHN0YXRlIGFuZCBzdG9yZXMgdGhlIGFwcCBzdGF0ZSBmb3IgbGF0ZXIgcmV0cmlldmFsLlxuXHQgKiBAcGFyYW0gbUlubmVyQXBwRGF0YSBPYmplY3QgY29udGFpbmluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwXG5cdCAqIEBwYXJhbSBiSW1tZWRpYXRlSGFzaFJlcGxhY2UgSWYgc2V0IHRvIGZhbHNlLCB0aGUgaW5uZXIgYXBwIGhhc2ggd2lsbCBub3QgYmUgcmVwbGFjZWQgdW50aWwgc3RvcmluZyBpcyBzdWNjZXNzZnVsOyBkbyBub3Rcblx0ICogICAgICAgIHNldCB0byBmYWxzZSBpZiB5b3UgY2Fubm90IHJlYWN0IHRvIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBQcm9taXNlLCBmb3IgZXhhbXBsZSwgd2hlbiBjYWxsaW5nIHRoZSBiZWZvcmVMaW5rUHJlc3NlZCBldmVudC4gPGI+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+IHtcblx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXM7XG5cdFx0dGhpcy5fZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2VBc3luYygpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob0Nyb3NzQXBwTmF2U2VydmljZTogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvQ3Jvc3NBcHBOYXZTZXJ2aWNlLmdldEFwcFN0YXRlKG9OYXZIYW5kbGVyLm9Db21wb25lbnQsIHNBcHBTdGF0ZUtleSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Y29uc3Qgb0Vycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlQXN5bmMuZmFpbGVkXCIpO1xuXHRcdFx0XHRvRGVmZXJyZWQucmVqZWN0KG9FcnJvciwge30sIG5hdlR5cGUpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvQXBwU3RhdGU6IGFueSkge1xuXHRcdFx0XHRsZXQgb0FwcERhdGE6IGFueSA9IHt9O1xuXHRcdFx0XHRjb25zdCBvQXBwRGF0YUxvYWRlZCA9IG9BcHBTdGF0ZS5nZXREYXRhKCk7XG5cblx0XHRcdFx0aWYgKHR5cGVvZiBvQXBwRGF0YUxvYWRlZCA9PT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdFx0XHRcdGNvbnN0IG9FcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLmdldERhdGFGcm9tQXBwU3RhdGUuZmFpbGVkXCIpO1xuXHRcdFx0XHRcdG9EZWZlcnJlZC5yZWplY3Qob0Vycm9yLCB7fSwgbmF2VHlwZSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAob05hdkhhbmRsZXIuX3NNb2RlID09PSBNb2RlLk9EYXRhVjIpIHtcblx0XHRcdFx0XHRvQXBwRGF0YSA9IHtcblx0XHRcdFx0XHRcdHNlbGVjdGlvblZhcmlhbnQ6IFwie31cIixcblx0XHRcdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50OiBuZXcgU2VsZWN0aW9uVmFyaWFudCgpLFxuXHRcdFx0XHRcdFx0b0RlZmF1bHRlZFNlbGVjdGlvblZhcmlhbnQ6IG5ldyBTZWxlY3Rpb25WYXJpYW50KCksXG5cdFx0XHRcdFx0XHRiTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5OiBmYWxzZSxcblx0XHRcdFx0XHRcdHRhYmxlVmFyaWFudElkOiBcIlwiLFxuXHRcdFx0XHRcdFx0Y3VzdG9tRGF0YToge30sXG5cdFx0XHRcdFx0XHRhcHBTdGF0ZUtleTogc0FwcFN0YXRlS2V5LFxuXHRcdFx0XHRcdFx0cHJlc2VudGF0aW9uVmFyaWFudDoge30sXG5cdFx0XHRcdFx0XHR2YWx1ZVRleHRzOiB7fSxcblx0XHRcdFx0XHRcdHNlbWFudGljRGF0ZXM6IHt9LFxuXHRcdFx0XHRcdFx0ZGF0YToge31cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGlmIChvQXBwRGF0YUxvYWRlZC5zZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0XHRcdFx0XHQvKlxuXHRcdFx0XHRcdFx0ICogSW4gY2FzZSB0aGF0IHdlIGdldCBhbiBvYmplY3QgZnJvbSB0aGUgc3RvcmVkIEFwcERhdGEgKD1wZXJzaXN0ZW5jeSksIHdlIG5lZWQgdG8gc3RyaW5naWZ5IHRoZSBKU09OIG9iamVjdC5cblx0XHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdFx0b0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudCA9IG9OYXZIYW5kbGVyLl9lbnN1cmVTZWxlY3Rpb25WYXJpYW50Rm9ybWF0U3RyaW5nKG9BcHBEYXRhTG9hZGVkLnNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdFx0XHRcdFx0b0FwcERhdGEub1NlbGVjdGlvblZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudChvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG9BcHBEYXRhTG9hZGVkLnRhYmxlVmFyaWFudElkKSB7XG5cdFx0XHRcdFx0XHRvQXBwRGF0YS50YWJsZVZhcmlhbnRJZCA9IG9BcHBEYXRhTG9hZGVkLnRhYmxlVmFyaWFudElkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAob0FwcERhdGFMb2FkZWQuY3VzdG9tRGF0YSkge1xuXHRcdFx0XHRcdFx0b0FwcERhdGEuY3VzdG9tRGF0YSA9IG9BcHBEYXRhTG9hZGVkLmN1c3RvbURhdGE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChvQXBwRGF0YUxvYWRlZC5wcmVzZW50YXRpb25WYXJpYW50KSB7XG5cdFx0XHRcdFx0XHRvQXBwRGF0YS5wcmVzZW50YXRpb25WYXJpYW50ID0gb0FwcERhdGFMb2FkZWQucHJlc2VudGF0aW9uVmFyaWFudDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG9BcHBEYXRhTG9hZGVkLnZhbHVlVGV4dHMpIHtcblx0XHRcdFx0XHRcdG9BcHBEYXRhLnZhbHVlVGV4dHMgPSBvQXBwRGF0YUxvYWRlZC52YWx1ZVRleHRzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAob0FwcERhdGFMb2FkZWQuc2VtYW50aWNEYXRlcykge1xuXHRcdFx0XHRcdFx0b0FwcERhdGEuc2VtYW50aWNEYXRlcyA9IG9BcHBEYXRhTG9hZGVkLnNlbWFudGljRGF0ZXM7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8qIEluIFYyIGNhc2UsIHdlIG5lZWQgdGhlIGRhdGEgaW4gdGhlIGJlbG93IGZvcm1hdCBmb3IgaHlicmlkIGNhc2UgKi9cblx0XHRcdFx0XHRpZiAobmF2VHlwZSA9PT0gTmF2VHlwZS5oeWJyaWQpIHtcblx0XHRcdFx0XHRcdG9BcHBEYXRhLmRhdGEgPSBvQXBwRGF0YUxvYWRlZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b0FwcERhdGEgPSBtZXJnZShvQXBwRGF0YSwgb0FwcERhdGFMb2FkZWQpO1xuXHRcdFx0XHRcdGlmIChvQXBwRGF0YUxvYWRlZC5zZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0XHRcdFx0XHQvKlxuXHRcdFx0XHRcdFx0ICogSW4gY2FzZSB0aGF0IHdlIGdldCBhbiBvYmplY3QgZnJvbSB0aGUgc3RvcmVkIEFwcERhdGEgKD1wZXJzaXN0ZW5jeSksIHdlIG5lZWQgdG8gc3RyaW5naWZ5IHRoZSBKU09OIG9iamVjdC5cblx0XHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdFx0b0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudCA9IG9OYXZIYW5kbGVyLl9lbnN1cmVTZWxlY3Rpb25WYXJpYW50Rm9ybWF0U3RyaW5nKG9BcHBEYXRhTG9hZGVkLnNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdFx0XHRcdFx0b0FwcERhdGEub1NlbGVjdGlvblZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudChvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAobmF2VHlwZSA9PT0gTmF2VHlwZS5pQXBwU3RhdGUpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9Db21wb25lbnREYXRhID0gb05hdkhhbmRsZXIub0NvbXBvbmVudC5nZXRDb21wb25lbnREYXRhKCkgYXMgUmVjb3JkPHN0cmluZywgYW55Pjtcblx0XHRcdFx0XHRcdGNvbnN0IG9TdGFydHVwUGFyYW1ldGVycyA9IG9Db21wb25lbnREYXRhPy5zdGFydHVwUGFyYW1ldGVycyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXHRcdFx0XHRcdFx0Y29uc3QgYkhhc0RlZmF1bHRlZFBhcmFtcyA9IG9TdGFydHVwUGFyYW1ldGVycz8uW0RFRkFVTFRFRF9QQVJBTUVURVJfUFJPUEVSVFldPy5sZW5ndGggPiAwO1xuXHRcdFx0XHRcdFx0Y29uc3QgYkhhc1hBcHBTdGF0ZSA9IG9Db21wb25lbnREYXRhPy5bXCJzYXAteGFwcC1zdGF0ZVwiXSAhPT0gdW5kZWZpbmVkO1xuXG5cdFx0XHRcdFx0XHRpZiAoYkhhc0RlZmF1bHRlZFBhcmFtcyAmJiBiSGFzWEFwcFN0YXRlKSB7XG5cdFx0XHRcdFx0XHRcdG9OYXZIYW5kbGVyLl9lbnJpY2hEZWZhdWx0ZWRTZWxlY3Rpb25WYXJpYW50KFxuXHRcdFx0XHRcdFx0XHRcdG9BcHBEYXRhLFxuXHRcdFx0XHRcdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVyc1tERUZBVUxURURfUEFSQU1FVEVSX1BST1BFUlRZXVswXSxcblx0XHRcdFx0XHRcdFx0XHRvRGVmZXJyZWQsXG5cdFx0XHRcdFx0XHRcdFx0bmF2VHlwZVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gcmVzb2x2ZSBpcyBjYWxsZWQgb24gcGFzc2VkIERlZmVycmVkIG9iamVjdCB0byB0cmlnZ2VyIGEgY2FsbCBvZiB0aGUgZG9uZSBtZXRob2QsIGlmIGltcGxlbWVudGVkXG5cdFx0XHRcdC8vIHRoZSBkb25lIG1ldGhvZCB3aWxsIHJlY2VpdmUgdGhlIGxvYWRlZCBhcHBTdGF0ZSBhbmQgdGhlIG5hdmlnYXRpb24gdHlwZSBhcyBwYXJhbWV0ZXJzXG5cdFx0XHRcdG9EZWZlcnJlZC5yZXNvbHZlKG9BcHBEYXRhLCB7fSwgbmF2VHlwZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRjb25zdCBvRXJyb3IgPSBvTmF2SGFuZGxlci5fY3JlYXRlVGVjaG5pY2FsRXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5nZXRBcHBTdGF0ZS5mYWlsZWRcIik7XG5cdFx0XHRcdG9EZWZlcnJlZC5yZWplY3Qob0Vycm9yLCB7fSwgbmF2VHlwZSk7XG5cdFx0XHR9KTtcblxuXHRcdHJldHVybiBvRGVmZXJyZWQ7XG5cdH1cblxuXHQvKipcblx0ICogRmV0Y2hlcyB0aGUgb3JpZ2luYWwgRkxQIGRlZmF1bHQgdmFsdWVzIGZyb20gdGhlIHhBcHBTdGF0ZSBhbmQgZW5yaWNoZXMgb0FwcERhdGEgd2l0aCBvRGVmYXVsdGVkU2VsZWN0aW9uVmFyaWFudC5cblx0ICogQHBhcmFtIG9BcHBEYXRhIFRoZSBhcHAgZGF0YSBvYmplY3QgdG8gZW5yaWNoLlxuXHQgKiBAcGFyYW0gc0RlZmF1bHRlZFBhcmFtZXRlcnNKc29uIFRoZSByYXcgSlNPTiBzdHJpbmcgb2YgZGVmYXVsdGVkIHBhcmFtZXRlciBuYW1lcyBmcm9tIEZMUC5cblx0ICogQHBhcmFtIG9EZWZlcnJlZCBUaGUgZGVmZXJyZWQgdG8gcmVzb2x2ZSBhZnRlciBlbnJpY2htZW50LlxuXHQgKiBAcGFyYW0gbmF2VHlwZSBUaGUgbmF2aWdhdGlvbiB0eXBlLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0YXN5bmMgX2VucmljaERlZmF1bHRlZFNlbGVjdGlvblZhcmlhbnQoXG5cdFx0b0FwcERhdGE6IGFueSxcblx0XHRzRGVmYXVsdGVkUGFyYW1ldGVyc0pzb246IHN0cmluZyxcblx0XHRvRGVmZXJyZWQ6IEpRdWVyeS5EZWZlcnJlZDx1bmtub3duPixcblx0XHRuYXZUeXBlOiBzdHJpbmdcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGFEZWZhdWx0ZWRQYXJhbWV0ZXJzOiBzdHJpbmdbXSA9IEpTT04ucGFyc2Uoc0RlZmF1bHRlZFBhcmFtZXRlcnNKc29uKTtcblx0XHRcdGNvbnN0IG9Dcm9zc0FwcE5hdlNlcnZpY2U6IGFueSA9IGF3YWl0IHRoaXMuX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlQXN5bmMoKTtcblx0XHRcdGNvbnN0IG9YQXBwU3RhdGU6IGFueSA9IGF3YWl0IG9Dcm9zc0FwcE5hdlNlcnZpY2UuZ2V0U3RhcnR1cEFwcFN0YXRlKHRoaXMub0NvbXBvbmVudCk7XG5cdFx0XHRjb25zdCBvWEFwcFN0YXRlRGF0YSA9IG9YQXBwU3RhdGUuZ2V0RGF0YSgpO1xuXHRcdFx0aWYgKG9YQXBwU3RhdGVEYXRhPy5zZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0XHRcdGNvbnN0IG9YQXBwU2VsVmFyID0gbmV3IFNlbGVjdGlvblZhcmlhbnQob1hBcHBTdGF0ZURhdGEuc2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0XHRcdGNvbnN0IG9EZWZhdWx0ZWRTZWxWYXIgPSBuZXcgU2VsZWN0aW9uVmFyaWFudCgpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IHNQYXJhbU5hbWUgb2YgYURlZmF1bHRlZFBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRpZiAodGhpcy5faXNUZWNobmljYWxQYXJhbWV0ZXIoc1BhcmFtTmFtZSkpIHtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBhUmFuZ2VzID0gb1hBcHBTZWxWYXIuZ2V0U2VsZWN0T3B0aW9uKHNQYXJhbU5hbWUpO1xuXHRcdFx0XHRcdGlmIChhUmFuZ2VzKSB7XG5cdFx0XHRcdFx0XHRvRGVmYXVsdGVkU2VsVmFyLm1hc3NBZGRTZWxlY3RPcHRpb24oc1BhcmFtTmFtZSwgYVJhbmdlcyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghb0RlZmF1bHRlZFNlbFZhci5pc0VtcHR5KCkpIHtcblx0XHRcdFx0XHRvQXBwRGF0YS5vRGVmYXVsdGVkU2VsZWN0aW9uVmFyaWFudCA9IG9EZWZhdWx0ZWRTZWxWYXI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdExvZy5lcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyOiBGYWlsZWQgdG8gZW5yaWNoIGRlZmF1bHRlZCBzZWxlY3Rpb24gdmFyaWFudC5cIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHRcdG9EZWZlcnJlZC5yZXNvbHZlKG9BcHBEYXRhLCB7fSwgbmF2VHlwZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBwYXJhbWV0ZXIgdmFsdWUgb2YgdGhlIHNhcC1pYXBwLXN0YXRlICh0aGUgaW50ZXJuYWwgYXBwcykgZnJvbSB0aGUgQXBwSGFzaCBzdHJpbmcuIEl0IGF1dG9tYXRpY2FsbHkgdGFrZXMgY2FyZSBhYm91dFxuXHQgKiBjb21wYXRpYmlsaXR5IGJldHdlZW4gdGhlIG9sZCBhbmQgdGhlIG5ldyBhcHByb2FjaCBvZiB0aGUgc2FwLWlhcHAtc3RhdGUuIFByZWNlZGVuY2UgaXMgdGhhdCB0aGUgbmV3IGFwcHJvYWNoIGlzIGZhdm91cmVkIGFnYWluc3QgdGhlIG9sZFxuXHQgKiBhcHByb2FjaC5cblx0ICogQHBhcmFtIHNBcHBIYXNoIFRoZSBBcHBIYXNoLCB3aGljaCBtYXkgY29udGFpbiBhIHNhcC1pYXBwLXN0YXRlIHBhcmFtZXRlciAoYm90aCBvbGQgYW5kL29yIG5ldyBhcHByb2FjaClcblx0ICogQHJldHVybnMgVGhlIHZhbHVlIG9mIHNhcC1pYXBwLXN0YXRlIChpLmUuIHRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgdG8gcmV0cmlldmUgdGhlIHBhcmFtZXRlcnMpLCBvciA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IGluXG5cdCAqICAgICAgICAgY2FzZSB0aGF0IG5vIHNhcC1pYXBwLXN0YXRlIHdhcyBmb3VuZCBpbiA8Y29kZT5zQXBwSGFzaDwvY29kZT4uXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfZ2V0SW5uZXJBcHBTdGF0ZUtleShzQXBwSGFzaDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHQvLyB0cml2aWFsIGNhc2U6IG5vIGFwcCBoYXNoIGF2YWlsYWJsZSBhdCBhbGwuXG5cdFx0aWYgKCFzQXBwSGFzaCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvKiBuZXcgYXBwcm9hY2g6IHNlcGFyYXRlZCB2aWEgcXVlc3Rpb24gbWFyayAvIHBhcnQgb2YgdGhlIHF1ZXJ5IHBhcmFtZXRlciBvZiB0aGUgQXBwSGFzaCAqL1xuXHRcdGxldCBhTWF0Y2hlcyA9IHRoaXMuX3JJQXBwU3RhdGVOZXcuZXhlYyhzQXBwSGFzaCk7XG5cblx0XHQvKiBvbGQgYXBwcm9hY2g6IHNwZWFyYXRlZCB2aWEgc2xhc2hlcyAvIGkuZS4gcGFydCBvZiB0aGUgcm91dGUgaXRzZWxmICovXG5cdFx0aWYgKGFNYXRjaGVzID09PSBudWxsKSB7XG5cdFx0XHRhTWF0Y2hlcyA9IHRoaXMuX3JJQXBwU3RhdGVPbGQuZXhlYyhzQXBwSGFzaCk7XG5cdFx0fVxuXG5cdFx0Lypcblx0XHQgKiBvbGQgYXBwcm9hY2g6IHNwZWNpYWwgY2FzZTogaWYgdGhlcmUgaXMgbm8gZGVlcCByb3V0ZS9rZXkgZGVmaW5lZCwgdGhlIHNhcC1pYXBwLXN0YXRlIG1heSBiZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcsIHdpdGhvdXRcblx0XHQgKiBhbnkgc2VwYXJhdGlvbiB3aXRoIHRoZSBzbGFzaGVzXG5cdFx0ICovXG5cdFx0aWYgKGFNYXRjaGVzID09PSBudWxsKSB7XG5cdFx0XHRhTWF0Y2hlcyA9IHRoaXMuX3JJQXBwU3RhdGVPbGRBdFN0YXJ0LmV4ZWMoc0FwcEhhc2gpO1xuXHRcdH1cblxuXHRcdGlmIChhTWF0Y2hlcyA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gdGhlcmUgaXMgbm8gKHZhbGlkKSBzYXAtaWFwcC1zdGF0ZSBpbiB0aGUgQXBwIEhhc2hcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFNYXRjaGVzWzFdO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcGxhY2VzIChvciBpbnNlcnRzKSBhIHBhcmFtZXRlciB2YWx1ZSAoYW4gQXBwU3RhdGVLZXkpIGZvciB0aGUgc2FwLWlhcHAtc3RhdGUgaW50byBhbiBleGlzdGluZyBBcHBIYXNoIHN0cmluZy4gT3RoZXIgcm91dGVzL3BhcmFtZXRlcnNcblx0ICogYXJlIGlnbm9yZWQgYW5kIHJldHVybmVkIHdpdGhvdXQgbW9kaWZpY2F0aW9uIChcImVudmlyb25tZW50YWwgYWdub3N0aWNcIiBwcm9wZXJ0eSkuIE9ubHkgdGhlIG5ldyBhcHByb2FjaCAoc2FwLWlhcHAtc3RhdGUgYXMgcXVlcnkgcGFyYW1ldGVyXG5cdCAqIGluIHRoZSBBcHBIYXNoKSBpcyBiZWluZyBpc3N1ZWQuXG5cdCAqIEBwYXJhbSBzQXBwSGFzaCBUaGUgQXBwSGFzaCBpbnRvIHdoaWNoIHRoZSBzYXAtaWFwcC1zdGF0ZSBwYXJhbWV0ZXIgc2hhbGwgYmUgbWFkZSBhdmFpbGFibGVcblx0ICogQHBhcmFtIHNBcHBTdGF0ZUtleSBUaGUga2V5IHZhbHVlIG9mIHRoZSBBcHBTdGF0ZSB3aGljaCBzaGFsbCBiZSBzdG9yZWQgYXMgcGFyYW1ldGVyIHZhbHVlIG9mIHRoZSBzYXAtaWFwcC1zdGF0ZSBwcm9wZXJ0eS5cblx0ICogQHJldHVybnMgVGhlIG1vZGlmaWVkIHNBcHBIYXNoIHN0cmluZywgc3VjaCB0aGF0IHRoZSBzYXAtaWFwcC1zdGF0ZSBoYXMgYmVlbiBzZXQgYmFzZWQgb24gdGhlIG5ldyAocXVlcnkgb3B0aW9uLWJhc2VkKVxuXHQgKiAgICAgICAgIHNhcC1pYXBwLXN0YXRlLiBJZiBhIHNhcC1pYXBwLXN0YXRlIGhhcyBiZWVuIHNwZWNpZmllZCBiZWZvcmUsIHRoZSBrZXkgaXMgcmVwbGFjZWQuIElmIDxjb2RlPnNBcHBIYXNoPC9jb2RlPiB3YXMgb2YgdGhlIG9sZFxuXHQgKiAgICAgICAgIGZvcm1hdCAoc2FwLWlhcHAtc3RhdGUgYXMgcGFydCBvZiB0aGUga2V5cy9yb3V0ZSksIHRoZSBmb3JtYXQgaXMgY29udmVydGVkIHRvIHRoZSBuZXcgZm9ybWF0IGJlZm9yZSB0aGUgcmVzdWx0IGlzIHJldHVybmVkLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X3JlcGxhY2VJbm5lckFwcFN0YXRlS2V5KHNBcHBIYXNoOiBzdHJpbmcsIHNBcHBTdGF0ZUtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBzTmV3SUFwcFN0YXRlID0gSUFQUF9TVEFURSArIFwiPVwiICsgc0FwcFN0YXRlS2V5O1xuXG5cdFx0Lypcblx0XHQgKiBnZW5lcmF0ZSBzYXAtaWFwcC1zdGF0ZXMgd2l0aCB0aGUgbmV3IHdheVxuXHRcdCAqL1xuXHRcdGlmICghc0FwcEhhc2gpIHtcblx0XHRcdC8vIHRoZXJlJ3Mgbm8gc0FwcEhhc2gga2V5IHlldFxuXHRcdFx0cmV0dXJuIFwiP1wiICsgc05ld0lBcHBTdGF0ZTtcblx0XHR9XG5cblx0XHRjb25zdCBmbkFwcGVuZFRvUXVlcnlQYXJhbWV0ZXIgPSBmdW5jdGlvbiAoc1N1YkFwcEhhc2g6IGFueSk6IHN0cmluZyB7XG5cdFx0XHQvLyB0aGVyZSBpcyBhbiBBcHBIYXNoIGF2YWlsYWJsZSwgYnV0IGl0IGRvZXMgbm90IGNvbnRhaW4gYSBzYXAtaWFwcC1zdGF0ZSBwYXJhbWV0ZXIgeWV0IC0gd2UgbmVlZCB0byBhcHBlbmQgb25lXG5cblx0XHRcdC8vIG5ldyBhcHByb2FjaDogd2UgbmVlZCB0byBjaGVjaywgaWYgYSBzZXQgb2YgcXVlcnkgcGFyYW1ldGVycyBpcyBhbHJlYWR5IGF2YWlsYWJsZVxuXHRcdFx0aWYgKHNTdWJBcHBIYXNoLmluZGV4T2YoXCI/XCIpICE9PSAtMSkge1xuXHRcdFx0XHQvLyB0aGVyZSBhcmUgYWxyZWFkeSBxdWVyeSBwYXJhbWV0ZXJzIGF2YWlsYWJsZSAtIGFwcGVuZCBpdCBhcyBhbm90aGVyIHBhcmFtZXRlclxuXHRcdFx0XHRyZXR1cm4gc1N1YkFwcEhhc2ggKyBcIiZcIiArIHNOZXdJQXBwU3RhdGU7XG5cdFx0XHR9XG5cdFx0XHQvLyB0aGVyZSBhcmUgbm8gYSBxdWVyeSBwYXJhbWV0ZXJzIGF2YWlsYWJsZSB5ZXQ7IGNyZWF0ZSBhIHNldCB3aXRoIGEgc2luZ2xlIHBhcmFtZXRlclxuXHRcdFx0cmV0dXJuIHNTdWJBcHBIYXNoICsgXCI/XCIgKyBzTmV3SUFwcFN0YXRlO1xuXHRcdH07XG5cblx0XHRpZiAoIXRoaXMuX2dldElubmVyQXBwU3RhdGVLZXkoc0FwcEhhc2gpKSB7XG5cdFx0XHRyZXR1cm4gZm5BcHBlbmRUb1F1ZXJ5UGFyYW1ldGVyKHNBcHBIYXNoKTtcblx0XHR9XG5cdFx0Ly8gVGhlcmUgaXMgYW4gQXBwSGFzaCBhdmFpbGFibGUgYW5kIHRoZXJlIGlzIGFscmVhZHkgYW4gc2FwLWlhcHAtc3RhdGUgaW4gdGhlIEFwcEhhc2hcblxuXHRcdGlmICh0aGlzLl9ySUFwcFN0YXRlTmV3LnRlc3Qoc0FwcEhhc2gpKSB7XG5cdFx0XHQvLyB0aGUgbmV3IGFwcHJvYWNoIGlzIGJlaW5nIHVzZWRcblx0XHRcdHJldHVybiBzQXBwSGFzaC5yZXBsYWNlKHRoaXMuX3JJQXBwU3RhdGVOZXcsIGZ1bmN0aW9uIChzTmVlZGxlOiBzdHJpbmcpIHtcblx0XHRcdFx0cmV0dXJuIHNOZWVkbGUucmVwbGFjZSgvWz1dLiovZ2ksIFwiPVwiICsgc0FwcFN0YXRlS2V5KTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8vIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBvbGQgQXBwSGFzaCBlbnRpcmVseSBhbmQgcmVwbGFjZSBpdCB3aXRoIGEgbmV3IG9uZS5cblxuXHRcdGNvbnN0IGZuUmVwbGFjZU9sZEFwcHJvYWNoID0gZnVuY3Rpb24gKHJPbGRBcHByb2FjaDogYW55LCBzU3ViQXBwSGFzaDogYW55KTogc3RyaW5nIHtcblx0XHRcdHNTdWJBcHBIYXNoID0gc1N1YkFwcEhhc2gucmVwbGFjZShyT2xkQXBwcm9hY2gsIFwiXCIpO1xuXHRcdFx0cmV0dXJuIGZuQXBwZW5kVG9RdWVyeVBhcmFtZXRlcihzU3ViQXBwSGFzaCk7XG5cdFx0fTtcblxuXHRcdGlmICh0aGlzLl9ySUFwcFN0YXRlT2xkLnRlc3Qoc0FwcEhhc2gpKSB7XG5cdFx0XHRyZXR1cm4gZm5SZXBsYWNlT2xkQXBwcm9hY2godGhpcy5fcklBcHBTdGF0ZU9sZCwgc0FwcEhhc2gpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9ySUFwcFN0YXRlT2xkQXRTdGFydC50ZXN0KHNBcHBIYXNoKSkge1xuXHRcdFx0cmV0dXJuIGZuUmVwbGFjZU9sZEFwcHJvYWNoKHRoaXMuX3JJQXBwU3RhdGVPbGRBdFN0YXJ0LCBzQXBwSGFzaCk7XG5cdFx0fVxuXG5cdFx0YXNzZXJ0KGZhbHNlLCBcImludGVybmFsIGluY29uc2lzdGVuY3k6IEFwcHJvYWNoIG9mIHNhcC1pYXBwLXN0YXRlIG5vdCBrbm93biwgYnV0IF9nZXRJbm5lckFwcFN0YXRlS2V5IHJldHVybmVkIGl0XCIpO1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRfZ2V0VVJMUGFyYW1ldGVyc0Zyb21TZWxlY3Rpb25WYXJpYW50KHZTZWxlY3Rpb25WYXJpYW50PzogU2VsZWN0aW9uVmFyaWFudCB8IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuXHRcdGNvbnN0IG1VUkxQYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cdFx0bGV0IGkgPSAwO1xuXHRcdGxldCBvU2VsZWN0aW9uVmFyaWFudDtcblxuXHRcdGlmICh0eXBlb2YgdlNlbGVjdGlvblZhcmlhbnQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdG9TZWxlY3Rpb25WYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQodlNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZTZWxlY3Rpb25WYXJpYW50ID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRvU2VsZWN0aW9uVmFyaWFudCA9IHZTZWxlY3Rpb25WYXJpYW50O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUXCIpO1xuXHRcdH1cblxuXHRcdC8vIGFkZCBVUkxzIHBhcmFtZXRlcnMgZnJvbSBTZWxlY3Rpb25WYXJpYW50LlNlbGVjdE9wdGlvbnMgKGlmIHNpbmdsZSB2YWx1ZSlcblx0XHRjb25zdCBhU2VsZWN0UHJvcGVydGllcyA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzKCk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGFTZWxlY3RQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBhU2VsZWN0T3B0aW9ucyA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFNlbGVjdE9wdGlvbihhU2VsZWN0UHJvcGVydGllc1tpXSk7XG5cdFx0XHRpZiAoYVNlbGVjdE9wdGlvbnMgJiYgYVNlbGVjdE9wdGlvbnMubGVuZ3RoID09PSAxICYmIGFTZWxlY3RPcHRpb25zWzBdLlNpZ24gPT09IFwiSVwiICYmIGFTZWxlY3RPcHRpb25zWzBdLk9wdGlvbiA9PT0gXCJFUVwiKSB7XG5cdFx0XHRcdG1VUkxQYXJhbWV0ZXJzW2FTZWxlY3RQcm9wZXJ0aWVzW2ldXSA9IGFTZWxlY3RPcHRpb25zWzBdLkxvdztcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBhZGQgcGFyYW1ldGVycyBmcm9tIFNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVyc1xuXHRcdGNvbnN0IGFQYXJhbWV0ZXJOYW1lcyA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFBhcmFtZXRlck5hbWVzKCk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGFQYXJhbWV0ZXJOYW1lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3Qgc1BhcmFtZXRlclZhbHVlID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0UGFyYW1ldGVyKGFQYXJhbWV0ZXJOYW1lc1tpXSk7XG5cblx0XHRcdG1VUkxQYXJhbWV0ZXJzW2FQYXJhbWV0ZXJOYW1lc1tpXV0gPSBzUGFyYW1ldGVyVmFsdWU7XG5cdFx0fVxuXHRcdHJldHVybiBtVVJMUGFyYW1ldGVycztcblx0fVxuXG5cdF9jcmVhdGVUZWNobmljYWxFcnJvcihzRXJyb3JDb2RlOiBhbnkpOiBOYXZFcnJvciB7XG5cdFx0cmV0dXJuIG5ldyBOYXZFcnJvcihzRXJyb3JDb2RlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBtb2RlbCB0aGF0IGlzIHVzZWQgZm9yIHZlcmlmaWNhdGlvbiBvZiBzZW5zaXRpdmUgaW5mb3JtYXRpb24uIElmIHRoZSBtb2RlbCBpcyBub3Qgc2V0LCB0aGUgdW5uYW1lZCBjb21wb25lbnQgbW9kZWwgaXMgdXNlZCBmb3IgdGhlXG5cdCAqIHZlcmlmaWNhdGlvbiBvZiBzZW5zaXRpdmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIG9Nb2RlbCBGb3IgY2hlY2tpbmcgc2Vuc2l0aXZlIGluZm9ybWF0aW9uXG5cdCAqL1xuXHRzZXRNb2RlbChvTW9kZWw6IFYyT0RhdGFNb2RlbCB8IFY0T0RhdGFNb2RlbCk6IHZvaWQge1xuXHRcdHRoaXMuX29Nb2RlbCA9IG9Nb2RlbDtcblx0fVxuXG5cdF9nZXRNb2RlbCgpOiBWMk9EYXRhTW9kZWwgfCBWNE9EYXRhTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLl9vTW9kZWwgfHwgdGhpcy5vQ29tcG9uZW50LmdldE1vZGVsKCk7XG5cdH1cblxuXHRfcmVtb3ZlQWxsUHJvcGVydGllcyhvRGF0YTogSW5uZXJBcHBEYXRhKTogdm9pZCB7XG5cdFx0aWYgKG9EYXRhKSB7XG5cdFx0XHRpZiAob0RhdGEuc2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50ID0gbnVsbCBhcyB1bmtub3duIGFzIHVuZGVmaW5lZDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9EYXRhLnZhbHVlVGV4dHMpIHtcblx0XHRcdFx0b0RhdGEudmFsdWVUZXh0cyA9IG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvRGF0YS5zZW1hbnRpY0RhdGVzKSB7XG5cdFx0XHRcdG9EYXRhLnNlbWFudGljRGF0ZXMgPSBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9yZW1vdmVQcm9wZXJ0aWVzKGFGaWx0ZXJOYW1lOiBhbnksIGFQYXJhbWV0ZXJOYW1lOiBhbnksIG9EYXRhOiBhbnkpOiB2b2lkIHtcblx0XHRpZiAoYUZpbHRlck5hbWUubGVuZ3RoICYmIG9EYXRhICYmIChvRGF0YS5zZWxlY3Rpb25WYXJpYW50IHx8IG9EYXRhLnZhbHVlVGV4dHMgfHwgb0RhdGEuc2VtYW50aWNEYXRlcykpIHtcblx0XHRcdGFGaWx0ZXJOYW1lLmZvckVhY2goZnVuY3Rpb24gKHNOYW1lOiBhbnkpIHtcblx0XHRcdFx0aWYgKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuU2VsZWN0T3B0aW9ucykge1xuXHRcdFx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuU2VsZWN0T3B0aW9ucy5zb21lKGZ1bmN0aW9uIChvVmFsdWU6IGFueSwgbklkeDogYW55KSB7XG5cdFx0XHRcdFx0XHRpZiAoc05hbWUgPT09IG9WYWx1ZS5Qcm9wZXJ0eU5hbWUpIHtcblx0XHRcdFx0XHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zLnNwbGljZShuSWR4LCAxKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChvRGF0YS52YWx1ZVRleHRzICYmIG9EYXRhLnZhbHVlVGV4dHMuVGV4dHMpIHtcblx0XHRcdFx0XHRvRGF0YS52YWx1ZVRleHRzLlRleHRzLmZvckVhY2goZnVuY3Rpb24gKG9UZXh0czogYW55KSB7XG5cdFx0XHRcdFx0XHRpZiAob1RleHRzLlByb3BlcnR5VGV4dHMpIHtcblx0XHRcdFx0XHRcdFx0b1RleHRzLlByb3BlcnR5VGV4dHMuc29tZShmdW5jdGlvbiAob1ZhbHVlOiBhbnksIG5JZHg6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzTmFtZSA9PT0gb1ZhbHVlLlByb3BlcnR5TmFtZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0b1RleHRzLlByb3BlcnR5VGV4dHMuc3BsaWNlKG5JZHgsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChvRGF0YS5zZW1hbnRpY0RhdGVzICYmIG9EYXRhLnNlbWFudGljRGF0ZXMuRGF0ZXMpIHtcblx0XHRcdFx0XHRvRGF0YS5zZW1hbnRpY0RhdGVzLkRhdGVzLmZvckVhY2goZnVuY3Rpb24gKG9EYXRlczogYW55LCBuSWR4OiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmIChzTmFtZSA9PT0gb0RhdGVzLlByb3BlcnR5TmFtZSkge1xuXHRcdFx0XHRcdFx0XHRvRGF0YS5zZW1hbnRpY0RhdGVzLkRhdGVzLnNwbGljZShuSWR4LCAxKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKGFQYXJhbWV0ZXJOYW1lLmxlbmd0aCAmJiBvRGF0YSAmJiBvRGF0YS5zZWxlY3Rpb25WYXJpYW50ICYmIG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVycykge1xuXHRcdFx0YVBhcmFtZXRlck5hbWUuZm9yRWFjaChmdW5jdGlvbiAoc05hbWU6IGFueSkge1xuXHRcdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlcnMuc29tZShmdW5jdGlvbiAob1ZhbHVlOiBhbnksIG5JZHg6IGFueSkge1xuXHRcdFx0XHRcdGlmIChzTmFtZSA9PT0gb1ZhbHVlLlByb3BlcnR5TmFtZSB8fCBcIiRQYXJhbWV0ZXIuXCIgKyBzTmFtZSA9PT0gb1ZhbHVlLlByb3BlcnR5TmFtZSkge1xuXHRcdFx0XHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJzLnNwbGljZShuSWR4LCAxKTtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRfaXNUZXJtVHJ1ZShvUHJvcGVydHk6IGFueSwgc1Rlcm06IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGZJc1Rlcm1EZWZhdWx0VHJ1ZSA9IGZ1bmN0aW9uIChvVGVybTogYW55KTogYm9vbGVhbiB7XG5cdFx0XHRpZiAob1Rlcm0pIHtcblx0XHRcdFx0cmV0dXJuIG9UZXJtLkJvb2wgPyBvVGVybS5Cb29sICE9PSBcImZhbHNlXCIgOiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cblx0XHRyZXR1cm4gISFvUHJvcGVydHlbc1Rlcm1dICYmIGZJc1Rlcm1EZWZhdWx0VHJ1ZShvUHJvcGVydHlbc1Rlcm1dKTtcblx0fVxuXG5cdF9pc0V4Y2x1ZGVkRnJvbU5hdmlnYXRpb25Db250ZXh0KG9Qcm9wZXJ0eTogYW55KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX2lzVGVybVRydWUob1Byb3BlcnR5LCBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkV4Y2x1ZGVGcm9tTmF2aWdhdGlvbkNvbnRleHRcIik7XG5cdH1cblxuXHRfaXNQb3RlbnRpYWxseVNlbnNpdGl2ZShvUHJvcGVydHk6IGFueSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9pc1Rlcm1UcnVlKG9Qcm9wZXJ0eSwgXCJjb20uc2FwLnZvY2FidWxhcmllcy5QZXJzb25hbERhdGEudjEuSXNQb3RlbnRpYWxseVNlbnNpdGl2ZVwiKTtcblx0fVxuXG5cdF9pc01lYXN1cmVQcm9wZXJ0eShvUHJvcGVydHk6IGFueSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9pc1Rlcm1UcnVlKG9Qcm9wZXJ0eSwgXCJjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuTWVhc3VyZVwiKTtcblx0fVxuXG5cdF9pc1RvQmVFeGNsdWRlZChvUHJvcGVydHk6IGFueSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9pc1BvdGVudGlhbGx5U2Vuc2l0aXZlKG9Qcm9wZXJ0eSkgfHwgdGhpcy5faXNFeGNsdWRlZEZyb21OYXZpZ2F0aW9uQ29udGV4dChvUHJvcGVydHkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBtZXRob2QgY3JlYXRlcyBhIGNvbnRleHQgdXJsIGJhc2VkIG9uIHByb3ZpZGVkIGRhdGEuIFRoaXMgY29udGV4dCB1cmwgY2FuIGVpdGhlciBiZSB1c2VkIGFzXG5cdCAqIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZpZ2F0aW9uSGFuZGxlciNzZXRQYXJhbWV0ZXJDb250ZXh0VXJsIFBhcmFtZXRlckNvbnRleHRVcmx9IG9yXG5cdCAqIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZpZ2F0aW9uSGFuZGxlciNzZXRGaWx0ZXJDb250ZXh0VXJsIEZpbHRlckNvbnRleHRVcmx9LlxuXHQgKiBAcGFyYW0gc0VudGl0eVNldE5hbWUgVXNlZCBmb3IgdXJsIGRldGVybWluYXRpb25cblx0ICogQHBhcmFtIFtvTW9kZWxdIFVzZWQgZm9yIHVybCBkZXRlcm1pbmF0aW9uLiBJZiBvbWl0dGVkLCB0aGUgTmF2aWdhdGlvbkhhbmRsZXIgbW9kZWwgaXMgdXNlZC5cblx0ICogQHRocm93cyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2RXJyb3J9IGluIGNhc2Ugb2YgbWlzc2luZyBvciB3cm9uZyBwYXNzZWQgcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBUaGUgY29udGV4dCB1cmwgZm9yIHRoZSBnaXZlbiBlbnRpdGllc1xuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRjb25zdHJ1Y3RDb250ZXh0VXJsKHNFbnRpdHlTZXROYW1lOiBzdHJpbmcsIG9Nb2RlbD86IFYyT0RhdGFNb2RlbCB8IFY0T0RhdGFNb2RlbCk6IHN0cmluZyB7XG5cdFx0aWYgKCFzRW50aXR5U2V0TmFtZSkge1xuXHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuTk9fRU5USVRZX1NFVF9QUk9WSURFRFwiKTtcblx0XHR9XG5cblx0XHRpZiAob01vZGVsID09PSB1bmRlZmluZWQpIHtcblx0XHRcdG9Nb2RlbCA9IHRoaXMuX2dldE1vZGVsKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX2NvbnN0cnVjdENvbnRleHRVcmwob01vZGVsKSArIFwiI1wiICsgc0VudGl0eVNldE5hbWU7XG5cdH1cblxuXHRfY29uc3RydWN0Q29udGV4dFVybChvTW9kZWw6IFYyT0RhdGFNb2RlbCB8IFY0T0RhdGFNb2RlbCk6IHN0cmluZyB7XG5cdFx0bGV0IHNTZXJ2ZXJVcmw7XG5cblx0XHRpZiAob01vZGVsLmlzQTxWMk9EYXRhTW9kZWw+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnYyLk9EYXRhTW9kZWxcIikpIHtcblx0XHRcdHNTZXJ2ZXJVcmwgPSBvTW9kZWwuX2dldFNlcnZlclVybCgpO1xuXHRcdH0gZWxzZSBpZiAob01vZGVsLmlzQTxWNE9EYXRhTW9kZWw+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWxcIikpIHtcblx0XHRcdGNvbnN0IG9TZXJ2aWNlVVJJID0gbmV3IFVSSShvTW9kZWwuZ2V0U2VydmljZVVybCgpKS5hYnNvbHV0ZVRvKGRvY3VtZW50LmJhc2VVUkkpO1xuXHRcdFx0c1NlcnZlclVybCA9IG5ldyBVUkkoXCIvXCIpLmFic29sdXRlVG8ob1NlcnZpY2VVUkkpLnRvU3RyaW5nKCk7XG5cdFx0fVxuXG5cdFx0aWYgKHNTZXJ2ZXJVcmwgJiYgc1NlcnZlclVybC5sYXN0SW5kZXhPZihcIi9cIikgPT09IHNTZXJ2ZXJVcmwubGVuZ3RoIC0gMSkge1xuXHRcdFx0c1NlcnZlclVybCA9IHNTZXJ2ZXJVcmwuc3Vic3RyaW5nKDAsIHNTZXJ2ZXJVcmwubGVuZ3RoIC0gMSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNTZXJ2ZXJVcmwgKyBvTW9kZWwuc1NlcnZpY2VVcmwgKyBcIi8kbWV0YWRhdGFcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgbWV0aG9kIHZlcmlmaWVzLCBpZiBhbnkgb2YgdGhlIHBhc3NlZCBwYXJhbWV0ZXJzL2ZpbHRlcnMgYXJlIG1hcmtlZCBhcyBzZW5zaXRpdmUsIGFuZCBpZiB0aGlzIGlzIHRoZSBjYXNlIHJlbW92ZSB0aG9zZSBmcm9tIHRoZSBhcHBcblx0ICogZGF0YS4gPGI+Tm90ZTo8L2I+IFRvIHVzZSB0aGlzIG1ldGhvZCwgdGhlIG1ldGFkYXRhIG11c3QgYmUgbG9hZGVkIGZpcnN0LlxuXHQgKiBAcGFyYW0gb0RhdGEgV2l0aCBwb3RlbnRpYWwgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIChmb3IgT0RhdGEsIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIHVzaW5nXG5cdCAqIDxjb2RlPm9TZWxlY3Rpb25WYXJpYW50LnRvSlNPTk9iamVjdCgpPC9jb2RlPiBtdXN0IGJlIHVzZWQpLCB3aXRoIHRoZSA8Y29kZT5GaWx0ZXJDb250ZXh0VXJsPC9jb2RlPiBvclxuXHQgKiA8Y29kZT5QYXJhbWV0ZXJDb250ZXh0VXJsPC9jb2RlPiBwcm9wZXJ0eS5cblx0ICogQHJldHVybnMgRGF0YSB3aXRob3V0IHByb3BlcnRpZXMgbWFya2VkIGFzIHNlbnNpdGl2ZSBvciBhbiBlbXB0eSBvYmplY3QgaWYgdGhlIE9EYXRhIG1ldGFkYXRhIGlzIG5vdCBmdWxseSBsb2FkZWQgeWV0XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfY2hlY2tJc1BvdGVudGlhbGx5U2Vuc2l0aXZlKG9EYXRhOiBhbnkpOiB1bmtub3duIHtcblx0XHRsZXQgb0FkYXB0ZWREYXRhID0gb0RhdGE7XG5cdFx0aWYgKFxuXHRcdFx0b0RhdGEgJiZcblx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgJiZcblx0XHRcdCgob0RhdGEuc2VsZWN0aW9uVmFyaWFudC5GaWx0ZXJDb250ZXh0VXJsICYmIG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuU2VsZWN0T3B0aW9ucykgfHxcblx0XHRcdFx0KG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVyQ29udGV4dFVybCAmJiBvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlcnMpKVxuXHRcdCkge1xuXHRcdFx0Y29uc3Qgb01vZGVsID0gdGhpcy5fZ2V0TW9kZWwoKTtcblx0XHRcdGlmICh0aGlzLm9Db21wb25lbnQgJiYgb01vZGVsICYmIG9Nb2RlbC5pc0E8VjJPRGF0YU1vZGVsPihcInNhcC51aS5tb2RlbC5vZGF0YS52Mi5PRGF0YU1vZGVsXCIpKSB7XG5cdFx0XHRcdGNvbnN0IGFTZW5zaXRpdmVGaWx0ZXJOYW1lID0gW107XG5cdFx0XHRcdGNvbnN0IGFTZW5zaXRpdmVQYXJhbWV0ZXJOYW1lID0gW107XG5cdFx0XHRcdGxldCBpLFxuXHRcdFx0XHRcdG9FbnRpdHlTZXQ6IGFueSxcblx0XHRcdFx0XHRvRW50aXR5RGVmOiBhbnksXG5cdFx0XHRcdFx0b1N1YkVudGl0eURlZjogYW55LFxuXHRcdFx0XHRcdG9FbmRSb2xlOiBhbnksXG5cdFx0XHRcdFx0YUZpbHRlckNvbnRleHRQYXJ0ID0gW10sXG5cdFx0XHRcdFx0YVBhcmFtQ29udGV4dFBhcnQgPSBbXTtcblxuXHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRpZiAob01vZGVsLmdldFNlcnZpY2VNZXRhZGF0YSgpICYmIG9NZXRhTW9kZWw/Lm9Nb2RlbCkge1xuXHRcdFx0XHRcdGlmIChvRGF0YS5zZWxlY3Rpb25WYXJpYW50LkZpbHRlckNvbnRleHRVcmwpIHtcblx0XHRcdFx0XHRcdGFGaWx0ZXJDb250ZXh0UGFydCA9IG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuRmlsdGVyQ29udGV4dFVybC5zcGxpdChcIiNcIik7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0YUZpbHRlckNvbnRleHRQYXJ0Lmxlbmd0aCA9PT0gMiAmJlxuXHRcdFx0XHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zICYmXG5cdFx0XHRcdFx0XHR0aGlzLl9jb25zdHJ1Y3RDb250ZXh0VXJsKG9Nb2RlbCkuaW5kZXhPZihhRmlsdGVyQ29udGV4dFBhcnRbMF0pID09PSAwXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvRW50aXR5U2V0ID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVNldChhRmlsdGVyQ29udGV4dFBhcnRbMV0pO1xuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlTZXQpIHtcblx0XHRcdFx0XHRcdFx0b0VudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKG9FbnRpdHlTZXQuZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUoYUZpbHRlckNvbnRleHRQYXJ0WzFdKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYgJiYgb0VudGl0eURlZi5wcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBvRW50aXR5RGVmLnByb3BlcnR5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5faXNUb0JlRXhjbHVkZWQob0VudGl0eURlZi5wcm9wZXJ0eVtpXSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YVNlbnNpdGl2ZUZpbHRlck5hbWUucHVzaChvRW50aXR5RGVmLnByb3BlcnR5W2ldLm5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChvRW50aXR5RGVmLm5hdmlnYXRpb25Qcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBvRW50aXR5RGVmLm5hdmlnYXRpb25Qcm9wZXJ0eS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0VuZFJvbGUgPSBvTWV0YU1vZGVsLmdldE9EYXRhQXNzb2NpYXRpb25FbmQob0VudGl0eURlZiwgb0VudGl0eURlZi5uYXZpZ2F0aW9uUHJvcGVydHlbaV0ubmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIW9FbmRSb2xlIHx8IG9FbmRSb2xlLnR5cGUgPT09IG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuRmlsdGVyQ29udGV4dFVybCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdC8vIGNoZWNrIGlmIHRoZSBlbmQgcm9sZSBoYXMgY2FyZGluYWxpdHkgMC4uMSBvciAxXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAob0VuZFJvbGUubXVsdGlwbGljaXR5ID09PSBcIjFcIiB8fCBvRW5kUm9sZS5tdWx0aXBsaWNpdHkgPT09IFwiMC4uMVwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9TdWJFbnRpdHlEZWYgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5VHlwZShvRW5kUm9sZS50eXBlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9TdWJFbnRpdHlEZWYgJiYgb1N1YkVudGl0eURlZi5wcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgb1N1YkVudGl0eURlZi5wcm9wZXJ0eS5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuX2lzVG9CZUV4Y2x1ZGVkKG9TdWJFbnRpdHlEZWYucHJvcGVydHlbal0pKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFTZW5zaXRpdmVGaWx0ZXJOYW1lLnB1c2goXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0VudGl0eURlZi5uYXZpZ2F0aW9uUHJvcGVydHlbaV0ubmFtZSArIFwiLlwiICsgb1N1YkVudGl0eURlZi5wcm9wZXJ0eVtqXS5uYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVyQ29udGV4dFVybCkge1xuXHRcdFx0XHRcdFx0YVBhcmFtQ29udGV4dFBhcnQgPSBvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlckNvbnRleHRVcmwuc3BsaXQoXCIjXCIpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdGFQYXJhbUNvbnRleHRQYXJ0Lmxlbmd0aCA9PT0gMiAmJlxuXHRcdFx0XHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJzICYmXG5cdFx0XHRcdFx0XHR0aGlzLl9jb25zdHJ1Y3RDb250ZXh0VXJsKG9Nb2RlbCkuaW5kZXhPZihhUGFyYW1Db250ZXh0UGFydFswXSkgPT09IDBcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9FbnRpdHlTZXQgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5U2V0KGFQYXJhbUNvbnRleHRQYXJ0WzFdKTtcblx0XHRcdFx0XHRcdGlmIChvRW50aXR5U2V0KSB7XG5cdFx0XHRcdFx0XHRcdG9FbnRpdHlEZWYgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5VHlwZShvRW50aXR5U2V0LmVudGl0eVR5cGUpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b0VudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKGFGaWx0ZXJDb250ZXh0UGFydFsxXSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChvRW50aXR5RGVmKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChvRW50aXR5RGVmLnByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IG9FbnRpdHlEZWYucHJvcGVydHkubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLl9pc1RvQmVFeGNsdWRlZChvRW50aXR5RGVmLnByb3BlcnR5W2ldKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRhU2Vuc2l0aXZlUGFyYW1ldGVyTmFtZS5wdXNoKG9FbnRpdHlEZWYucHJvcGVydHlbaV0ubmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGFTZW5zaXRpdmVGaWx0ZXJOYW1lLmxlbmd0aCB8fCBhU2Vuc2l0aXZlUGFyYW1ldGVyTmFtZS5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdG9BZGFwdGVkRGF0YSA9IGV4dGVuZCh0cnVlIGFzIGFueSwge30sIG9BZGFwdGVkRGF0YSk7XG5cblx0XHRcdFx0XHRcdHRoaXMuX3JlbW92ZVByb3BlcnRpZXMoYVNlbnNpdGl2ZUZpbHRlck5hbWUsIGFTZW5zaXRpdmVQYXJhbWV0ZXJOYW1lLCBvQWRhcHRlZERhdGEpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBhbm5vdGF0aW9ucyBhcmUgbm90IGxvYWRlZFxuXG5cdFx0XHRcdFx0dGhpcy5fcmVtb3ZlQWxsUHJvcGVydGllcyhvQWRhcHRlZERhdGEpO1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyOiBvTWV0YWRhdGEgYXJlIG5vdCBmdWxseSBsb2FkZWQhXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMub0NvbXBvbmVudCAmJiBvTW9kZWwgJiYgb01vZGVsLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsXCIpKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9yZW1vdmVTZW5zaXRpdmVEYXRhRm9yT0RhdGFWNChvQWRhcHRlZERhdGEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBvQWRhcHRlZERhdGE7XG5cdH1cblxuXHRfcmVtb3ZlTWVhc3VyZUJhc2VkSW5mb3JtYXRpb24ob0FwcERhdGE6IElubmVyQXBwRGF0YSk6IElubmVyQXBwRGF0YSB7XG5cdFx0bGV0IG9BcHBEYXRhRm9yU2F2ZSA9IG9BcHBEYXRhO1xuXG5cdFx0aWYgKG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRcdC8qXG5cdFx0XHQgKiBUaGUgc3BlY2lmaWNhdGlvbiBzdGF0ZXMgdGhhdCBTZWxlY3Rpb24gVmFyaWFudHMgbmVlZCB0byBiZSBKU09OIG9iamVjdHMuIEhvd2V2ZXIsIGludGVybmFsbHksIHdlIHdvcmsgd2l0aCBzdHJpbmdzIGZvclxuXHRcdFx0ICogXCJzZWxlY3Rpb25WYXJpYW50XCIuIFRoZXJlZm9yZSwgaW4gY2FzZSB0aGF0IHRoaXMgaXMgYSBzdHJpbmcsIHdlIG5lZWQgdG8gSlNPTi1wYXJzZSB0aGUgZGF0YS5cblx0XHRcdCAqL1xuXHRcdFx0aWYgKHR5cGVvZiBvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50ID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0b0FwcERhdGFGb3JTYXZlLnNlbGVjdGlvblZhcmlhbnQgPSBKU09OLnBhcnNlKG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdFx0XHR9IGNhdGNoICh4KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXI6IF9yZW1vdmVNZWFzdXJlQmFzZWRJbmZvcm1hdGlvbiBwYXJzZSBlcnJvclwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRvQXBwRGF0YUZvclNhdmUgPSB0aGlzLl9yZW1vdmVNZWFzdXJlQmFzZWRQcm9wZXJ0aWVzKG9BcHBEYXRhRm9yU2F2ZSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9BcHBEYXRhRm9yU2F2ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgbWV0aG9kIHZlcmlmaWVzIGlmIGFueSBvZiB0aGUgcGFzc2VkIHBhcmFtZXRlcnMvZmlsdGVycyBhcmUgbWFya2VkIGFzIGEgbWVhc3VyZS4gSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhleSBhcmUgcmVtb3ZlZCBmcm9tIHRoZSB4YXBwXG5cdCAqIGFwcCBkYXRhLiA8Yj5Ob3RlOjwvYj4gVG8gdXNlIHRoaXMgbWV0aG9kLCB0aGUgbWV0YWRhdGEgbXVzdCBiZSBsb2FkZWQgZmlyc3QuXG5cdCAqIEBwYXJhbSBvRGF0YSBXaXRoIHBvdGVudGlhbCBzZW5zaXRpdmUgaW5mb3JtYXRpb24gKGZvciBPRGF0YSwgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gdXNpbmdcblx0ICogPGNvZGU+b1NlbGVjdGlvblZhcmlhbnQudG9KU09OT2JqZWN0KCk8L2NvZGU+IG11c3QgYmUgdXNlZCksIHdpdGggdGhlIDxjb2RlPkZpbHRlckNvbnRleHRVcmw8L2NvZGU+IG9yXG5cdCAqIDxjb2RlPlBhcmFtZXRlckNvbnRleHRVcmw8L2NvZGU+IHByb3BlcnR5LlxuXHQgKiBAcmV0dXJucyBEYXRhIHdpdGhvdXQgcHJvcGVydGllcyBtYXJrZWQgYXMgbWVhc3VyZXMgb3IgYW4gZW1wdHkgb2JqZWN0IGlmIHRoZSBPRGF0YSBtZXRhZGF0YSBpcyBub3QgZnVsbHkgbG9hZGVkIHlldFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X3JlbW92ZU1lYXN1cmVCYXNlZFByb3BlcnRpZXMob0RhdGE6IElubmVyQXBwRGF0YSk6IElubmVyQXBwRGF0YSB7XG5cdFx0bGV0IG9BZGFwdGVkRGF0YSA9IG9EYXRhO1xuXHRcdGNvbnN0IGFNZWFzdXJlRmlsdGVyTmFtZSA9IFtdO1xuXHRcdGNvbnN0IGFNZWFzdXJlUGFyYW1ldGVyTmFtZSA9IFtdO1xuXHRcdGxldCBpLFxuXHRcdFx0b01vZGVsLFxuXHRcdFx0b01ldGFNb2RlbCxcblx0XHRcdG9FbnRpdHlTZXQ6IGFueSxcblx0XHRcdG9FbnRpdHlEZWY6IGFueSxcblx0XHRcdG9TdWJFbnRpdHlEZWY6IGFueSxcblx0XHRcdG9FbmRSb2xlOiBhbnksXG5cdFx0XHRhRmlsdGVyQ29udGV4dFBhcnQ6IHN0cmluZ1tdID0gW10sXG5cdFx0XHRhUGFyYW1Db250ZXh0UGFydDogc3RyaW5nW10gPSBbXTtcblxuXHRcdGlmIChcblx0XHRcdG9EYXRhICYmXG5cdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50ICYmXG5cdFx0XHQoKChvRGF0YS5zZWxlY3Rpb25WYXJpYW50IGFzIFNlcmlhbGl6ZWRTZWxlY3Rpb25WYXJpYW50KS5GaWx0ZXJDb250ZXh0VXJsICYmXG5cdFx0XHRcdChvRGF0YS5zZWxlY3Rpb25WYXJpYW50IGFzIFNlcmlhbGl6ZWRTZWxlY3Rpb25WYXJpYW50KS5TZWxlY3RPcHRpb25zKSB8fFxuXHRcdFx0XHQoKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgYXMgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQpLlBhcmFtZXRlckNvbnRleHRVcmwgJiZcblx0XHRcdFx0XHQob0RhdGEuc2VsZWN0aW9uVmFyaWFudCBhcyBTZXJpYWxpemVkU2VsZWN0aW9uVmFyaWFudCkuUGFyYW1ldGVycykpXG5cdFx0KSB7XG5cdFx0XHRvTW9kZWwgPSB0aGlzLl9nZXRNb2RlbCgpO1xuXHRcdFx0aWYgKHRoaXMub0NvbXBvbmVudCAmJiBvTW9kZWwgJiYgb01vZGVsLmlzQTxWMk9EYXRhTW9kZWw+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnYyLk9EYXRhTW9kZWxcIikpIHtcblx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0aWYgKG9Nb2RlbC5nZXRTZXJ2aWNlTWV0YWRhdGEoKSAmJiBvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWwub01vZGVsKSB7XG5cdFx0XHRcdFx0aWYgKChvRGF0YS5zZWxlY3Rpb25WYXJpYW50IGFzIFNlcmlhbGl6ZWRTZWxlY3Rpb25WYXJpYW50KS5GaWx0ZXJDb250ZXh0VXJsKSB7XG5cdFx0XHRcdFx0XHRhRmlsdGVyQ29udGV4dFBhcnQgPSAob0RhdGEuc2VsZWN0aW9uVmFyaWFudCBhcyBTZXJpYWxpemVkU2VsZWN0aW9uVmFyaWFudCkuRmlsdGVyQ29udGV4dFVybCEuc3BsaXQoXCIjXCIpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdGFGaWx0ZXJDb250ZXh0UGFydC5sZW5ndGggPT09IDIgJiZcblx0XHRcdFx0XHRcdChvRGF0YS5zZWxlY3Rpb25WYXJpYW50IGFzIFNlcmlhbGl6ZWRTZWxlY3Rpb25WYXJpYW50KS5TZWxlY3RPcHRpb25zICYmXG5cdFx0XHRcdFx0XHR0aGlzLl9jb25zdHJ1Y3RDb250ZXh0VXJsKG9Nb2RlbCkuaW5kZXhPZihhRmlsdGVyQ29udGV4dFBhcnRbMF0pID09PSAwXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvRW50aXR5U2V0ID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVNldChhRmlsdGVyQ29udGV4dFBhcnRbMV0pO1xuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlTZXQpIHtcblx0XHRcdFx0XHRcdFx0b0VudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKG9FbnRpdHlTZXQuZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUoYUZpbHRlckNvbnRleHRQYXJ0WzFdKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYgJiYgb0VudGl0eURlZi5wcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBvRW50aXR5RGVmLnByb3BlcnR5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5faXNNZWFzdXJlUHJvcGVydHkob0VudGl0eURlZi5wcm9wZXJ0eVtpXSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YU1lYXN1cmVGaWx0ZXJOYW1lLnB1c2gob0VudGl0eURlZi5wcm9wZXJ0eVtpXS5uYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAob0VudGl0eURlZi5uYXZpZ2F0aW9uUHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgb0VudGl0eURlZi5uYXZpZ2F0aW9uUHJvcGVydHkubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9FbmRSb2xlID0gb01ldGFNb2RlbC5nZXRPRGF0YUFzc29jaWF0aW9uRW5kKG9FbnRpdHlEZWYsIG9FbnRpdHlEZWYubmF2aWdhdGlvblByb3BlcnR5W2ldLm5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQhb0VuZFJvbGUgfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0b0VuZFJvbGUudHlwZSA9PT0gKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgYXMgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQpLkZpbHRlckNvbnRleHRVcmxcblx0XHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdC8vIGNoZWNrIGlmIHRoZSBlbmQgcm9sZSBoYXMgY2FyZGluYWxpdHkgMC4uMSBvciAxXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAob0VuZFJvbGUubXVsdGlwbGljaXR5ID09PSBcIjFcIiB8fCBvRW5kUm9sZS5tdWx0aXBsaWNpdHkgPT09IFwiMC4uMVwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9TdWJFbnRpdHlEZWYgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5VHlwZShvRW5kUm9sZS50eXBlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9TdWJFbnRpdHlEZWYgJiYgb1N1YkVudGl0eURlZi5wcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgb1N1YkVudGl0eURlZi5wcm9wZXJ0eS5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuX2lzTWVhc3VyZVByb3BlcnR5KG9TdWJFbnRpdHlEZWYucHJvcGVydHlbal0pKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFNZWFzdXJlRmlsdGVyTmFtZS5wdXNoKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9FbnRpdHlEZWYubmF2aWdhdGlvblByb3BlcnR5W2ldLm5hbWUgKyBcIi5cIiArIG9TdWJFbnRpdHlEZWYucHJvcGVydHlbal0ubmFtZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICgob0RhdGEuc2VsZWN0aW9uVmFyaWFudCBhcyBTZXJpYWxpemVkU2VsZWN0aW9uVmFyaWFudCkuUGFyYW1ldGVyQ29udGV4dFVybCkge1xuXHRcdFx0XHRcdFx0YVBhcmFtQ29udGV4dFBhcnQgPSAob0RhdGEuc2VsZWN0aW9uVmFyaWFudCBhcyBTZXJpYWxpemVkU2VsZWN0aW9uVmFyaWFudCkuUGFyYW1ldGVyQ29udGV4dFVybCEuc3BsaXQoXCIjXCIpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdGFQYXJhbUNvbnRleHRQYXJ0Lmxlbmd0aCA9PT0gMiAmJlxuXHRcdFx0XHRcdFx0KG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgYXMgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQpLlBhcmFtZXRlcnMgJiZcblx0XHRcdFx0XHRcdHRoaXMuX2NvbnN0cnVjdENvbnRleHRVcmwob01vZGVsKS5pbmRleE9mKGFQYXJhbUNvbnRleHRQYXJ0WzBdKSA9PT0gMFxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b0VudGl0eVNldCA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlTZXQoYVBhcmFtQ29udGV4dFBhcnRbMV0pO1xuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlTZXQpIHtcblx0XHRcdFx0XHRcdFx0b0VudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKG9FbnRpdHlTZXQuZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUoYUZpbHRlckNvbnRleHRQYXJ0WzFdKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYucHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgb0VudGl0eURlZi5wcm9wZXJ0eS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuX2lzTWVhc3VyZVByb3BlcnR5KG9FbnRpdHlEZWYucHJvcGVydHlbaV0pKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFNZWFzdXJlUGFyYW1ldGVyTmFtZS5wdXNoKG9FbnRpdHlEZWYucHJvcGVydHlbaV0ubmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGFNZWFzdXJlRmlsdGVyTmFtZS5sZW5ndGggfHwgYU1lYXN1cmVQYXJhbWV0ZXJOYW1lLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0Ly8gVFE6IG5lZWRzIGF0dGVudGlvblxuXHRcdFx0XHRcdFx0b0FkYXB0ZWREYXRhID0gZXh0ZW5kKHRydWUgYXMgYW55LCB7fSwgb0FkYXB0ZWREYXRhKSBhcyBJbm5lckFwcERhdGE7XG5cblx0XHRcdFx0XHRcdHRoaXMuX3JlbW92ZVByb3BlcnRpZXMoYU1lYXN1cmVGaWx0ZXJOYW1lLCBhTWVhc3VyZVBhcmFtZXRlck5hbWUsIG9BZGFwdGVkRGF0YSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGFubm90YXRpb25zIGFyZSBub3QgbG9hZGVkXG5cblx0XHRcdFx0XHR0aGlzLl9yZW1vdmVBbGxQcm9wZXJ0aWVzKG9BZGFwdGVkRGF0YSk7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXI6IG9NZXRhZGF0YSBhcmUgbm90IGZ1bGx5IGxvYWRlZCFcIik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAodGhpcy5vQ29tcG9uZW50ICYmIG9Nb2RlbCAmJiBvTW9kZWwuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWxcIikpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX3JlbW92ZVNlbnNpdGl2ZURhdGFGb3JPRGF0YVY0KG9BZGFwdGVkRGF0YSwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvQWRhcHRlZERhdGE7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBzZW5zaXRpdmUgZGF0YSBmcm9tIHRoZSBuYXZpZ2F0aW9uIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBvRGF0YSBTZWxlY3Rpb24gdmFyaWFudFxuXHQgKiBAcGFyYW0gYk1lYXN1cmUgU2hvdWxkIG1lYXN1cmVzIGJlIHJlbW92ZWRcblx0ICogQHJldHVybnMgVGhlIHNlbGVjdGlvbiB2YXJpYW50IGFmdGVyIHNlbnNpdGl2ZSBkYXRhIGhhcyBiZWVuIHJlbW92ZWRcblx0ICovXG5cdF9yZW1vdmVTZW5zaXRpdmVEYXRhRm9yT0RhdGFWNChvRGF0YTogSW5uZXJBcHBEYXRhLCBiTWVhc3VyZT86IGJvb2xlYW4pOiBJbm5lckFwcERhdGEge1xuXHRcdGNvbnN0IG9OYXZIYW5kbGVyID0gdGhpcyxcblx0XHRcdG9TViA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KG9EYXRhLnNlbGVjdGlvblZhcmlhbnQpLFxuXHRcdFx0b01vZGVsID0gdGhpcy5fZ2V0TW9kZWwoKTtcblx0XHRsZXQgYUZpbHRlckNvbnRleHRQYXJ0OiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblxuXHRcdGlmICghb01vZGVsLmdldE1ldGFNb2RlbCgpLmdldE9iamVjdChcIi9cIikpIHtcblx0XHRcdC8vIGFubm90YXRpb25zIGFyZSBub3QgbG9hZGVkXG5cdFx0XHR0aGlzLl9yZW1vdmVBbGxQcm9wZXJ0aWVzKG9EYXRhKTtcblx0XHRcdExvZy5lcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyOiBvTWV0YWRhdGEgYXJlIG5vdCBmdWxseSBsb2FkZWQhXCIpO1xuXHRcdFx0cmV0dXJuIG9EYXRhO1xuXHRcdH1cblxuXHRcdGlmICgob0RhdGEuc2VsZWN0aW9uVmFyaWFudCBhcyBTZXJpYWxpemVkU2VsZWN0aW9uVmFyaWFudCkuRmlsdGVyQ29udGV4dFVybCkge1xuXHRcdFx0YUZpbHRlckNvbnRleHRQYXJ0ID0gKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgYXMgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQpLkZpbHRlckNvbnRleHRVcmwhLnNwbGl0KFwiI1wiKTtcblx0XHR9XG5cblx0XHRpZiAoXG5cdFx0XHRhRmlsdGVyQ29udGV4dFBhcnQ/Lmxlbmd0aCA9PT0gMiAmJlxuXHRcdFx0KG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgYXMgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQpLlNlbGVjdE9wdGlvbnMgJiZcblx0XHRcdHRoaXMuX2NvbnN0cnVjdENvbnRleHRVcmwob01vZGVsKS5pbmRleE9mKGFGaWx0ZXJDb250ZXh0UGFydFswXSkgPT09IDBcblx0XHQpIHtcblx0XHRcdG9TVi5yZW1vdmVTZWxlY3RPcHRpb24oXCJAb2RhdGEuY29udGV4dFwiKTtcblx0XHRcdG9TVi5yZW1vdmVTZWxlY3RPcHRpb24oXCJAb2RhdGEubWV0YWRhdGFFdGFnXCIpO1xuXHRcdFx0b1NWLnJlbW92ZVNlbGVjdE9wdGlvbihcIlNBUF9fTWVzc2FnZXNcIik7XG5cblx0XHRcdGNvbnN0IHNFbnRpdHlTZXQgPSBhRmlsdGVyQ29udGV4dFBhcnRbMV0sXG5cdFx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRcdGFQcm9wZXJ0eU5hbWVzID0gb1NWLmdldFByb3BlcnR5TmFtZXMoKSB8fCBbXSxcblx0XHRcdFx0Zm5Jc1NlbnNpdGl2ZURhdGEgPSBmdW5jdGlvbiAoc1Byb3A6IHN0cmluZywgZXNOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRcdFx0XHRlc05hbWUgPSBlc05hbWUgfHwgc0VudGl0eVNldDtcblx0XHRcdFx0XHRjb25zdCBhUHJvcGVydHlBbm5vdGF0aW9ucyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFwiL1wiICsgZXNOYW1lICsgXCIvXCIgKyBzUHJvcCArIFwiQFwiKTtcblx0XHRcdFx0XHRpZiAoYVByb3BlcnR5QW5ub3RhdGlvbnMpIHtcblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0KGJNZWFzdXJlICYmIGFQcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5NZWFzdXJlXCJdKSB8fFxuXHRcdFx0XHRcdFx0XHRvTmF2SGFuZGxlci5fY2hlY2tQcm9wZXJ0eUFubm90YXRpb25zRm9yU2Vuc2l0aXZlRGF0YShhUHJvcGVydHlBbm5vdGF0aW9ucylcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoYVByb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpZWxkQ29udHJvbFwiXSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvRmllbGRDb250cm9sID0gYVByb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpZWxkQ29udHJvbFwiXTtcblx0XHRcdFx0XHRcdFx0aWYgKG9GaWVsZENvbnRyb2xbXCIkRW51bU1lbWJlclwiXSAmJiBvRmllbGRDb250cm9sW1wiJEVudW1NZW1iZXJcIl0uc3BsaXQoXCIvXCIpWzFdID09PSBcIkluYXBwbGljYWJsZVwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRmb3IgKGxldCBrID0gMDsgayA8IGFQcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaysrKSB7XG5cdFx0XHRcdGNvbnN0IHNQcm9wZXJ0eSA9IGFQcm9wZXJ0eU5hbWVzW2tdO1xuXHRcdFx0XHQvLyBwcm9wZXJ0aWVzIG9mIHRoZSBlbnRpdHkgc2V0XG5cdFx0XHRcdGlmIChmbklzU2Vuc2l0aXZlRGF0YShzUHJvcGVydHksIHNFbnRpdHlTZXQpKSB7XG5cdFx0XHRcdFx0b1NWLnJlbW92ZVNlbGVjdE9wdGlvbihzUHJvcGVydHkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50ID0gb1NWLnRvSlNPTk9iamVjdCgpO1xuXHRcdH1cblx0XHRyZXR1cm4gb0RhdGE7XG5cdH1cblxuXHRfY2hlY2tQcm9wZXJ0eUFubm90YXRpb25zRm9yU2Vuc2l0aXZlRGF0YShhUHJvcGVydHlBbm5vdGF0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBib29sZWFuIHtcblx0XHRyZXR1cm4gISEoXG5cdFx0XHRhUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5QZXJzb25hbERhdGEudjEuSXNQb3RlbnRpYWxseVNlbnNpdGl2ZVwiXSB8fFxuXHRcdFx0YVByb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRXhjbHVkZUZyb21OYXZpZ2F0aW9uQ29udGV4dFwiXVxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBwYXJhbWV0ZXIgdmFsdWUgb2YgdGhlIHNhcC1pYXBwLXN0YXRlICh0aGUgaW50ZXJuYWwgYXBwcykgZnJvbSB0aGUgQXBwSGFzaCBzdHJpbmcuIEl0IGF1dG9tYXRpY2FsbHkgdGFrZXMgY2FyZSBhYm91dFxuXHQgKiBjb21wYXRpYmlsaXR5IGJldHdlZW4gdGhlIG9sZCBhbmQgdGhlIG5ldyBhcHByb2FjaCBvZiB0aGUgc2FwLWlhcHAtc3RhdGUuIFByZWNlZGVuY2UgaXMgdGhhdCB0aGUgbmV3IGFwcHJvYWNoIGlzIGZhdm91cmVkIGFnYWluc3QgdGhlIG9sZFxuXHQgKiBhcHByb2FjaC5cblx0ICogQHJldHVybnMgVGhlIHZhbHVlIG9mIHNhcC1pYXBwLXN0YXRlIChpLmUuIHRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgdG8gcmV0cmlldmUgdGhlIHBhcmFtZXRlcnMpLCBvciA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IGluXG5cdCAqICAgICAgICAgY2FzZSB0aGF0IG5vIHNhcC1pYXBwLXN0YXRlIHdhcyBmb3VuZCBpbiA8Y29kZT5zQXBwSGFzaDwvY29kZT4uXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRnZXRJQXBwU3RhdGVLZXkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBzQXBwSGFzaCA9IEhhc2hDaGFuZ2VyLmdldEluc3RhbmNlKCkuZ2V0SGFzaCgpO1xuXHRcdHJldHVybiB0aGlzLl9nZXRJbm5lckFwcFN0YXRlS2V5KHNBcHBIYXNoKTtcblx0fVxufVxuXG4vLyBFeHBvcnRpbmcgdGhlIGNsYXNzIGFzIHByb3Blcmx5IHR5cGVkIFVJNUNsYXNzXG5cbmNvbnN0IE5hdmlnYXRpb25IYW5kbGVyVUk1Q2xhc3MgPSBCYXNlT2JqZWN0LmV4dGVuZChcblx0XCJzYXAuZmUubmF2aWdhdGlvbi5OYXZpZ2F0aW9uSGFuZGxlclwiLFxuXHROYXZpZ2F0aW9uSGFuZGxlci5wcm90b3R5cGUgYXMgYW55XG4pIGFzIHR5cGVvZiBOYXZpZ2F0aW9uSGFuZGxlcjtcbnR5cGUgTmF2aWdhdGlvbkhhbmRsZXJVSTVDbGFzcyA9IEluc3RhbmNlVHlwZTx0eXBlb2YgTmF2aWdhdGlvbkhhbmRsZXI+O1xuZXhwb3J0IGRlZmF1bHQgTmF2aWdhdGlvbkhhbmRsZXJVSTVDbGFzcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztFQW1DQTtBQUNBO0FBQ0E7O0VBa0NBO0VBQ0EsTUFBTUEsT0FBTyxHQUFHQyxVQUFVLENBQUNELE9BQU87RUFDbEMsTUFBTUUsaUJBQWlCLEdBQUdELFVBQVUsQ0FBQ0MsaUJBQWlCO0VBQ3RELE1BQU1DLG1CQUFtQixHQUFHRixVQUFVLENBQUNFLG1CQUFtQjtFQUMxRCxNQUFNQyxJQUFJLEdBQUdILFVBQVUsQ0FBQ0csSUFBSTtFQUU1QixNQUFNQyxVQUFVLEdBQUcsZ0JBQWdCO0VBQ25DLE1BQU1DLDRCQUE0QixHQUFHLG9DQUFvQztFQUN6RSxNQUFNQyxxQkFBcUIsR0FBRyxzQkFBc0I7O0VBRXBEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQWpCQSxJQWtCYUMsaUJBQWlCLDBCQUFBQyxXQUFBO0lBc0Q3QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0MsU0FBQUQsa0JBQ0NFLFdBQXFDLEVBQ3JDQyxLQUFhLEdBQUdQLElBQUksQ0FBQ1EsT0FBTyxFQUM1QkMsa0JBQTBCLEdBQUdYLGlCQUFpQixDQUFDWSxVQUFVLEVBQ3hEO01BQUEsSUFBQUMsS0FBQTtNQUNEQSxLQUFBLEdBQUFOLFdBQUEsQ0FBQU8sSUFBQSxLQUFNLENBQUM7TUFwRVI7TUFBQUQsS0FBQSxDQUNRRSxxQkFBcUIsR0FBRyxDQUFDLGtC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
2285
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOYXZUeXBlIiwiTmF2TGlicmFyeSIsIlBhcmFtSGFuZGxpbmdNb2RlIiwiU3VwcHJlc3Npb25CZWhhdmlvciIsIk1vZGUiLCJJQVBQX1NUQVRFIiwiREVGQVVMVEVEX1BBUkFNRVRFUl9QUk9QRVJUWSIsIkhZQlJJRF9JQVBQX1NUQVRFX0tFWSIsIk5hdmlnYXRpb25IYW5kbGVyIiwiX0Jhc2VPYmplY3QiLCJvQ29udHJvbGxlciIsInNNb2RlIiwiT0RhdGFWNCIsInNQYXJhbUhhbmRsaW5nTW9kZSIsIlNlbFZhcldpbnMiLCJfdGhpcyIsImNhbGwiLCJfYVRlY2huaWNhbFBhcmFtYXRlcnMiLCJfb0xhc3RTYXZlZElubmVyQXBwRGF0YSIsInNBcHBTdGF0ZUtleSIsIm9BcHBEYXRhIiwiaUNhY2hlSGl0IiwiaUNhY2hlTWlzcyIsIl9ySUFwcFN0YXRlT2xkIiwiUmVnRXhwIiwiX3JJQXBwU3RhdGVPbGRBdFN0YXJ0IiwiX3JJQXBwU3RhdGVOZXciLCJOYXZFcnJvciIsIlVJQ29tcG9uZW50Iiwib1JvdXRlciIsImdldFJvdXRlciIsIm9Db21wb25lbnQiLCJnZXRPd25lckNvbXBvbmVudCIsIl9nZXRSb3V0ZXIiLCJnZXRBcHBDb21wb25lbnQiLCJnZXRDb21wb25lbnREYXRhIiwiVVJMUGFyYW1XaW5zIiwiSW5zZXJ0SW5TZWxPcHQiLCJPRGF0YVYyIiwiX3NNb2RlIiwiX2V4cG9ydHMiLCJfaW5oZXJpdHNMb29zZSIsIl9wcm90byIsInByb3RvdHlwZSIsIl9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZSIsInVzaGVsbENvbnRhaW5lciIsInNhcCIsInVpIiwicmVxdWlyZSIsImdldFNlcnZpY2UiLCJfZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2VBc3luYyIsImdldFNlcnZpY2VBc3luYyIsInRoZW4iLCJvQ3Jvc3NBcHBOYXZTZXJ2aWNlIiwiY2F0Y2giLCJMb2ciLCJlcnJvciIsImdldFJvdXRlckZvciIsInJlZ2lzdGVyTmF2aWdhdGVDYWxsYmFjayIsImZuQ2FsbGJhY2siLCJfbmF2aWdhdGVDYWxsYmFjayIsIm5hdmlnYXRlIiwic1NlbWFudGljT2JqZWN0Iiwic0FjdGlvbk5hbWUiLCJ2TmF2aWdhdGlvblBhcmFtZXRlcnMiLCJvSW5uZXJBcHBEYXRhIiwiZm5PbkVycm9yIiwib0V4dGVybmFsQXBwRGF0YSIsInNOYXZNb2RlIiwic1NlbGVjdGlvblZhcmlhbnQiLCJtUGFyYW1ldGVycyIsIm9YQXBwRGF0YU9iaiIsIm9TdGFydHVwUGFyYW1ldGVycyIsImJFeFBsYWNlIiwib1RtcERhdGEiLCJvTmF2SGFuZGxlciIsIm9Db21wb25lbnREYXRhIiwic3RhcnR1cFBhcmFtZXRlcnMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJvRW5yaWNoZWRTZWxWYXIiLCJfc3BsaXRJbmJvdW5kTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJTZWxlY3Rpb25WYXJpYW50Iiwib05hdmlnYXRpb25TZWxWYXIiLCJ0b0pTT05TdHJpbmciLCJzZWxlY3Rpb25WYXJpYW50IiwiX3JlbW92ZVRlY2huaWNhbFBhcmFtZXRlcnMiLCJ0b0pTT05PYmplY3QiLCJfcmVtb3ZlTWVhc3VyZUJhc2VkSW5mb3JtYXRpb24iLCJfY2hlY2tJc1BvdGVudGlhbGx5U2Vuc2l0aXZlIiwiX2dldFVSTFBhcmFtZXRlcnNGcm9tU2VsZWN0aW9uVmFyaWFudCIsIm9OYXZBcmd1bWVudHMiLCJ0YXJnZXQiLCJzZW1hbnRpY09iamVjdCIsImFjdGlvbiIsInBhcmFtcyIsImZuTmF2aWdhdGUiLCJmbk5hdkV4cGxhY2UiLCJzTmV3SHJlZlByb21pc2UiLCJnZXRIcmVmIiwic05ld0hyZWYiLCJvcGVuV2luZG93Iiwib0Vycm9yIiwiX2ZuU2F2ZUFwcFN0YXRlQXN5bmMiLCJvU2F2ZUFwcFN0YXRlUmV0dXJuIiwiYXBwU3RhdGVLZXkiLCJwdG9FeHQiLCJmblN0b3JlQW5kTmF2aWdhdGUiLCJzdG9yZUlubmVyQXBwU3RhdGVBc3luYyIsInJlcGxhY2VIYXNoIiwib1RhcmdldHMiLCJpc05hdmlnYXRpb25TdXBwb3J0ZWQiLCJzdXBwb3J0ZWQiLCJ0ZWNobmljYWxFcnJvciIsIl9jcmVhdGVUZWNobmljYWxFcnJvciIsInBhcnNlTmF2aWdhdGlvbiIsInNBcHBIYXNoIiwiSGFzaENoYW5nZXIiLCJnZXRJbnN0YW5jZSIsImdldEhhc2giLCJzSUFwcFN0YXRlIiwiX2dldElubmVyQXBwU3RhdGVLZXkiLCJ3YXJuaW5nIiwiaHlicmlkSUFwcFN0YXRlS2V5UGFyYW1zIiwiaHlicmlkRGVmZXJyZWQiLCJqUXVlcnkiLCJEZWZlcnJlZCIsImlBcHBTdGF0ZUh5YnJpZERlZmVycmVkIiwiX2xvYWRBcHBTdGF0ZSIsImh5YnJpZCIsImFEZWZhdWx0ZWRQYXJhbWV0ZXJzIiwiSlNPTiIsInBhcnNlIiwib015RGVmZXJyZWQiLCJwYXJzZVVybFBhcmFtcyIsIm9TdWJTdGFydHVwUGFyYW1ldGVycyIsImFTdWJEZWZhdWx0ZWRQYXJhbWV0ZXJzIiwib1N1Yk15RGVmZXJyZWQiLCJzTmF2VHlwZSIsIm9TZWxWYXJzIiwiaXNFbXB0eSIsIm9EZWZhdWx0ZWRTZWxWYXIiLCJ4QXBwU3RhdGUiLCJyZWplY3QiLCJyZXNvbHZlIiwiaW5pdGlhbCIsIm9BcHBTdGF0ZURhdGEiLCJvU2VsZWN0aW9uVmFyaWFudCIsIm9EZWZhdWx0ZWRTZWxlY3Rpb25WYXJpYW50IiwiYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSIsInN1Y2Nlc3NIYW5kbGVySHlicmlkU3RhdGUiLCJpQXBwU3RhdGVEYXRhIiwiX3JlZiIsIm5hdlR5cGUiLCJpQXBwU3RhdGUiLCJmYWlsdXJlSGFuZGxlckh5YnJpZFN0YXRlIiwiZG9uZSIsImZhaWwiLCJiSXNYYXBwU3RhdGVOYXZpZ2F0aW9uIiwidGhhdCIsImdldFN0YXJ0dXBBcHBTdGF0ZSIsIm9BcHBTdGF0ZSIsImdldERhdGEiLCJzdHJpbmdpZnkiLCJ4IiwicHJvbWlzZSIsIm9TZWxWYXIiLCJVUkxQYXJhbXMiLCJzZXRUZWNobmljYWxQYXJhbWV0ZXJzIiwiYVRlY2huaWNhbFBhcmFtZXRlcnMiLCJBcnJheSIsImlzQXJyYXkiLCJnZXRUZWNobmljYWxQYXJhbWV0ZXJzIiwiY29uY2F0IiwiX2lzVGVjaG5pY2FsUGFyYW1ldGVyIiwic1BhcmFtZXRlck5hbWUiLCJ0b0xvd2VyQ2FzZSIsImluZGV4T2YiLCJpbmNsdWRlcyIsIl9pc0ZFUGFyYW1ldGVyIiwic1Byb3BOYW1lIiwiaSIsImFTZWxWYXJQcm9wTmFtZXMiLCJnZXRTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcyIsInJlbW92ZVNlbGVjdE9wdGlvbiIsIm9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkIiwiaGFzT3duUHJvcGVydHkiLCJnZXRQYXJhbWV0ZXJOYW1lcyIsIm1hc3NBZGRTZWxlY3RPcHRpb24iLCJnZXRWYWx1ZSIsIl9hZGRQYXJhbWV0ZXJWYWx1ZXMiLCJhUHJvcE5hbWVzIiwib1NlbFZhcmlhbnQiLCJzU2lnbiIsInNPcHRpb24iLCJvVmFsdWVzIiwiYWRkU2VsZWN0T3B0aW9uIiwib0hhc2hDaGFuZ2VyIiwic0FwcEhhc2hPbGQiLCJzQXBwSGFzaE5ldyIsIl9yZXBsYWNlSW5uZXJBcHBTdGF0ZUtleSIsIm1Jbm5lckFwcERhdGEiLCJiSW1tZWRpYXRlSGFzaFJlcGxhY2UiLCJiU2tpcEhhc2hSZXBsYWNlIiwiZm5SZXBsYWNlSGFzaCIsImlzRW1wdHlPYmplY3QiLCJzQXBwU3RhdGVLZXlDYWNoZWQiLCJiSW5uZXJBcHBEYXRhRXF1YWwiLCJmbk9uQWZ0ZXJTYXZlIiwiX3NhdmVBcHBTdGF0ZUFzeW5jIiwic3RvcmVJbm5lckFwcFN0YXRlIiwiX3NhdmVBcHBTdGF0ZSIsInN0b3JlSW5uZXJBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4iLCJvQXBwU3RhdGVQcm9taXNlIiwicHJvY2Vzc0JlZm9yZVNtYXJ0TGlua1BvcG92ZXJPcGVucyIsIm9UYWJsZUV2ZW50UGFyYW1ldGVycyIsIm1TZW1hbnRpY0F0dHJpYnV0ZXMiLCJzZW1hbnRpY0F0dHJpYnV0ZXMiLCJmblN0b3JlWGFwcEFuZENhbGxPcGVuIiwibVN1YlNlbWFudGljQXR0cmlidXRlcyIsInNTdWJTZWxlY3Rpb25WYXJpYW50IiwiaVN1cHByZXNzaW9uQmVoYXZpb3IiLCJyYWlzZUVycm9yT25OdWxsIiwicmFpc2VFcnJvck9uVW5kZWZpbmVkIiwib01peGVkU2VsVmFyIiwibWl4QXR0cmlidXRlc0FuZFNlbGVjdGlvblZhcmlhbnQiLCJmbk9uQ29udGFpbmVyU2F2ZSIsInNldFNlbWFudGljQXR0cmlidXRlcyIsInNldEFwcFN0YXRlS2V5Iiwib3BlbiIsIm9TdG9yZUlubmVyQXBwU3RhdGVQcm9taXNlIiwiX2dldEFwcFN0YXRlS2V5QW5kVXJsUGFyYW1ldGVycyIsIl9nZXRBcHBTcGVjaWZpY0hhc2giLCJhcHBIYXNoIiwiY3Jvc3NBcHBTZXJ2aWNlIiwiYXBwU3BlY2lmaWNSb3V0ZSIsIm1lc3NhZ2UiLCJFcnJvciIsIlN0cmluZyIsIl9taXhBdHRyaWJ1dGVzVG9TZWxWYXJpYW50Iiwic1Byb3BlcnR5TmFtZSIsInZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlIiwiRGF0ZSIsInRvSlNPTiIsInRvU3RyaW5nIiwiaWdub3JlRW1wdHlTdHJpbmciLCJpbmZvIiwidlNlbWFudGljQXR0cmlidXRlcyIsInN0YW5kYXJkIiwib05ld1NlbFZhcmlhbnQiLCJmaWx0ZXJVcmwiLCJnZXRGaWx0ZXJDb250ZXh0VXJsIiwic2V0RmlsdGVyQ29udGV4dFVybCIsImNvbnRleHRVcmwiLCJnZXRQYXJhbWV0ZXJDb250ZXh0VXJsIiwic2V0UGFyYW1ldGVyQ29udGV4dFVybCIsImZvckVhY2giLCJhUGFyYW1ldGVycyIsImdldFNlbGVjdE9wdGlvbiIsImdldFBhcmFtZXRlciIsImFTZWxPcHRpb25OYW1lcyIsImFTZWxlY3RPcHRpb24iLCJqIiwiU2lnbiIsIk9wdGlvbiIsIkxvdyIsIkhpZ2giLCJfZW5zdXJlU2VsZWN0aW9uVmFyaWFudEZvcm1hdFN0cmluZyIsInZTZWxlY3Rpb25WYXJpYW50IiwidkNvbnZlcnRlZFNlbGVjdGlvblZhcmlhbnQiLCJfZm5IYW5kbGVBcHBTdGF0ZVByb21pc2UiLCJvUmV0dXJuIiwiX3NhdmVBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4iLCJfZm5TYXZlQXBwU3RhdGVXaXRoSW1tZWRpYXRlUmV0dXJuIiwiZ2V0S2V5Iiwib0FwcERhdGFGb3JTYXZlIiwiX2ZldGNoQXBwRGF0YUZvclNhdmUiLCJzZXREYXRhIiwic2F2ZSIsImV4dGVuZCIsInRhYmxlVmFyaWFudElkIiwiY3VzdG9tRGF0YSIsInByZXNlbnRhdGlvblZhcmlhbnQiLCJ2YWx1ZVRleHRzIiwic2VtYW50aWNEYXRlcyIsIm9BcHBEYXRhQ2xvbmUiLCJPYmplY3QiLCJhc3NpZ24iLCJtZXJnZSIsImNyZWF0ZUVtcHR5QXBwU3RhdGUiLCJvRGVmZXJyZWQiLCJnZXRBcHBTdGF0ZSIsIm9BcHBEYXRhTG9hZGVkIiwiZGF0YSIsImJIYXNEZWZhdWx0ZWRQYXJhbXMiLCJiSGFzWEFwcFN0YXRlIiwiX2VucmljaERlZmF1bHRlZFNlbGVjdGlvblZhcmlhbnQiLCJzRGVmYXVsdGVkUGFyYW1ldGVyc0pzb24iLCJvWEFwcFN0YXRlIiwib1hBcHBTdGF0ZURhdGEiLCJvWEFwcFNlbFZhciIsInNQYXJhbU5hbWUiLCJhUmFuZ2VzIiwiYU1hdGNoZXMiLCJleGVjIiwic05ld0lBcHBTdGF0ZSIsImZuQXBwZW5kVG9RdWVyeVBhcmFtZXRlciIsInNTdWJBcHBIYXNoIiwidGVzdCIsInJlcGxhY2UiLCJzTmVlZGxlIiwiZm5SZXBsYWNlT2xkQXBwcm9hY2giLCJyT2xkQXBwcm9hY2giLCJhc3NlcnQiLCJtVVJMUGFyYW1ldGVycyIsImFTZWxlY3RQcm9wZXJ0aWVzIiwiYVNlbGVjdE9wdGlvbnMiLCJhUGFyYW1ldGVyTmFtZXMiLCJzUGFyYW1ldGVyVmFsdWUiLCJzRXJyb3JDb2RlIiwic2V0TW9kZWwiLCJvTW9kZWwiLCJfb01vZGVsIiwiX2dldE1vZGVsIiwiZ2V0TW9kZWwiLCJfcmVtb3ZlQWxsUHJvcGVydGllcyIsIm9EYXRhIiwiX3JlbW92ZVByb3BlcnRpZXMiLCJhRmlsdGVyTmFtZSIsImFQYXJhbWV0ZXJOYW1lIiwic05hbWUiLCJTZWxlY3RPcHRpb25zIiwic29tZSIsIm9WYWx1ZSIsIm5JZHgiLCJQcm9wZXJ0eU5hbWUiLCJzcGxpY2UiLCJUZXh0cyIsIm9UZXh0cyIsIlByb3BlcnR5VGV4dHMiLCJEYXRlcyIsIm9EYXRlcyIsIlBhcmFtZXRlcnMiLCJfaXNUZXJtVHJ1ZSIsIm9Qcm9wZXJ0eSIsInNUZXJtIiwiZklzVGVybURlZmF1bHRUcnVlIiwib1Rlcm0iLCJCb29sIiwiX2lzRXhjbHVkZWRGcm9tTmF2aWdhdGlvbkNvbnRleHQiLCJfaXNQb3RlbnRpYWxseVNlbnNpdGl2ZSIsIl9pc01lYXN1cmVQcm9wZXJ0eSIsIl9pc1RvQmVFeGNsdWRlZCIsImNvbnN0cnVjdENvbnRleHRVcmwiLCJzRW50aXR5U2V0TmFtZSIsIl9jb25zdHJ1Y3RDb250ZXh0VXJsIiwic1NlcnZlclVybCIsImlzQSIsIl9nZXRTZXJ2ZXJVcmwiLCJvU2VydmljZVVSSSIsIlVSSSIsImdldFNlcnZpY2VVcmwiLCJhYnNvbHV0ZVRvIiwiZG9jdW1lbnQiLCJiYXNlVVJJIiwibGFzdEluZGV4T2YiLCJzdWJzdHJpbmciLCJzU2VydmljZVVybCIsIm9BZGFwdGVkRGF0YSIsIkZpbHRlckNvbnRleHRVcmwiLCJQYXJhbWV0ZXJDb250ZXh0VXJsIiwiYVNlbnNpdGl2ZUZpbHRlck5hbWUiLCJhU2Vuc2l0aXZlUGFyYW1ldGVyTmFtZSIsIm9FbnRpdHlTZXQiLCJvRW50aXR5RGVmIiwib1N1YkVudGl0eURlZiIsIm9FbmRSb2xlIiwiYUZpbHRlckNvbnRleHRQYXJ0IiwiYVBhcmFtQ29udGV4dFBhcnQiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiZ2V0U2VydmljZU1ldGFkYXRhIiwic3BsaXQiLCJnZXRPRGF0YUVudGl0eVNldCIsImdldE9EYXRhRW50aXR5VHlwZSIsImVudGl0eVR5cGUiLCJwcm9wZXJ0eSIsInB1c2giLCJuYW1lIiwibmF2aWdhdGlvblByb3BlcnR5IiwiZ2V0T0RhdGFBc3NvY2lhdGlvbkVuZCIsInR5cGUiLCJtdWx0aXBsaWNpdHkiLCJfcmVtb3ZlU2Vuc2l0aXZlRGF0YUZvck9EYXRhVjQiLCJfcmVtb3ZlTWVhc3VyZUJhc2VkUHJvcGVydGllcyIsImFNZWFzdXJlRmlsdGVyTmFtZSIsImFNZWFzdXJlUGFyYW1ldGVyTmFtZSIsImJNZWFzdXJlIiwib1NWIiwiZ2V0T2JqZWN0Iiwic0VudGl0eVNldCIsImFQcm9wZXJ0eU5hbWVzIiwiZ2V0UHJvcGVydHlOYW1lcyIsImZuSXNTZW5zaXRpdmVEYXRhIiwic1Byb3AiLCJlc05hbWUiLCJhUHJvcGVydHlBbm5vdGF0aW9ucyIsIl9jaGVja1Byb3BlcnR5QW5ub3RhdGlvbnNGb3JTZW5zaXRpdmVEYXRhIiwib0ZpZWxkQ29udHJvbCIsImsiLCJzUHJvcGVydHkiLCJnZXRJQXBwU3RhdGVLZXkiLCJCYXNlT2JqZWN0IiwiTmF2aWdhdGlvbkhhbmRsZXJVSTVDbGFzcyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiTmF2aWdhdGlvbkhhbmRsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJzYXAvYmFzZS9hc3NlcnRcIjtcbmltcG9ydCBleHRlbmQgZnJvbSBcInNhcC9iYXNlL3V0aWwvZXh0ZW5kXCI7XG5pbXBvcnQgaXNFbXB0eU9iamVjdCBmcm9tIFwic2FwL2Jhc2UvdXRpbC9pc0VtcHR5T2JqZWN0XCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCBCYXNlT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9PYmplY3RcIjtcbmltcG9ydCB0eXBlIENvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50XCI7XG5pbXBvcnQgVUlDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL1VJQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sbGVyIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlclwiO1xuaW1wb3J0IEhhc2hDaGFuZ2VyIGZyb20gXCJzYXAvdWkvY29yZS9yb3V0aW5nL0hhc2hDaGFuZ2VyXCI7XG5pbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvUm91dGVyXCI7XG5pbXBvcnQgdHlwZSBWMk9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92Mi9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBWNE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgVVJJIGZyb20gXCJzYXAvdWkvdGhpcmRwYXJ0eS9VUklcIjtcbmltcG9ydCBqUXVlcnkgZnJvbSBcInNhcC91aS90aGlyZHBhcnR5L2pxdWVyeVwiO1xuaW1wb3J0IG9wZW5XaW5kb3cgZnJvbSBcInNhcC91aS91dGlsL29wZW5XaW5kb3dcIjtcbmltcG9ydCB0eXBlIENvbnRhaW5lciBmcm9tIFwic2FwL3VzaGVsbC9Db250YWluZXJcIjtcbmltcG9ydCB0eXBlIENyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uIGZyb20gXCJzYXAvdXNoZWxsL3NlcnZpY2VzL0Nyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uXCI7XG5pbXBvcnQgdHlwZSBOYXZpZ2F0aW9uIGZyb20gXCJzYXAvdXNoZWxsL3NlcnZpY2VzL05hdmlnYXRpb25cIjtcbmltcG9ydCBOYXZFcnJvciBmcm9tIFwiLi9OYXZFcnJvclwiO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemVkU2VsZWN0aW9uVmFyaWFudCB9IGZyb20gXCIuL1NlbGVjdGlvblZhcmlhbnRcIjtcbmltcG9ydCBTZWxlY3Rpb25WYXJpYW50IGZyb20gXCIuL1NlbGVjdGlvblZhcmlhbnRcIjtcbmltcG9ydCBOYXZMaWJyYXJ5IGZyb20gXCIuL2xpYnJhcnlcIjtcblxudHlwZSBTaGVsbEFwcFN0YXRlUmV0dXJuID0ge1xuXHRwcm9taXNlOiBKUXVlcnkuUHJvbWlzZTxzdHJpbmc+O1xuXHRhcHBTdGF0ZUtleTogc3RyaW5nO1xufTtcblxudHlwZSBTaGVsbEFwcFN0YXRlID0ge1xuXHRnZXRLZXkoKTogc3RyaW5nO1xuXHRzZXREYXRhKG9iajogb2JqZWN0KTogdm9pZDtcblx0Z2V0RGF0YSgpOiBJbm5lckFwcERhdGE7XG5cdHNhdmUoKTogUHJvbWlzZTx1bmRlZmluZWQ+O1xufTtcbi8qKlxuICogU3RydWN0dXJlIG9mIHN0b3JlZCBhcHAgc3RhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5uZXJBcHBEYXRhIHtcblx0W2tleTogc3RyaW5nXTogdW5rbm93bjtcblx0LyoqXG5cdCAqIFNyaW5naWZpZWQgSlNPTiBvYmplY3QgYXMgcmV0dXJuZWQsIGZvciBleGFtcGxlLCBmcm9tIGdldERhdGFTdWl0ZUZvcm1hdCgpIG9mIHRoZSBTbWFydEZpbHRlckJhciBjb250cm9sXG5cdCAqL1xuXHRzZWxlY3Rpb25WYXJpYW50Pzogc3RyaW5nIHwgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQ7XG5cblx0LyoqXG5cdCAqIElEIG9mIHRoZSBTbWFydFRhYmxlIHZhcmlhbnQuXG5cdCAqL1xuXHR0YWJsZVZhcmlhbnRJZD86IHN0cmluZztcblxuXHQvKipcblx0ICogT2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgYXJiaXRyYXJ5IGRhdGEuXG5cdCAqL1xuXHRjdXN0b21EYXRhPzogb2JqZWN0O1xuXG5cdC8qKlxuXHQgKiBPYmplY3QgY29udGFpbmluZyB0aGUgY3VycmVudCB1aSBzdGF0ZSBvZiB0aGUgYXBwLlxuXHQgKi9cblx0cHJlc2VudGF0aW9uVmFyaWFudD86IG9iamVjdDtcblxuXHQvKipcblx0ICogT2JqZWN0IGNvbnRhaW5pbmcgdmFsdWUgZGVzY3JpcHRpb25zLlxuXHQgKi9cblx0dmFsdWVUZXh0cz86IG9iamVjdCB8IG51bGw7XG5cblx0LyoqXG5cdCAqIE9iamVjdCBjb250YWluaW5nIHNlbWFudGljRGF0ZXMgZmlsdGVyIGluZm9ybWF0aW9uLlxuXHQgKi9cblx0c2VtYW50aWNEYXRlcz86IG9iamVjdCB8IG51bGw7XG59XG5cbi8vIHNob3J0Y3V0cyBmb3Igc2FwLnVpLmdlbmVyaWMuYXBwIGVudW1zXG5jb25zdCBOYXZUeXBlID0gTmF2TGlicmFyeS5OYXZUeXBlO1xuY29uc3QgUGFyYW1IYW5kbGluZ01vZGUgPSBOYXZMaWJyYXJ5LlBhcmFtSGFuZGxpbmdNb2RlO1xuY29uc3QgU3VwcHJlc3Npb25CZWhhdmlvciA9IE5hdkxpYnJhcnkuU3VwcHJlc3Npb25CZWhhdmlvcjtcbmNvbnN0IE1vZGUgPSBOYXZMaWJyYXJ5Lk1vZGU7XG5cbmNvbnN0IElBUFBfU1RBVEUgPSBcInNhcC1pYXBwLXN0YXRlXCI7XG5jb25zdCBERUZBVUxURURfUEFSQU1FVEVSX1BST1BFUlRZID0gXCJzYXAtdXNoZWxsLWRlZmF1bHRlZFBhcmFtZXRlck5hbWVzXCI7XG5jb25zdCBIWUJSSURfSUFQUF9TVEFURV9LRVkgPSBcIm5oSHlicmlkSUFwcFN0YXRlS2V5XCI7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgc3VjY2Vzc29yIG9mIHtAbGluayBzYXAudWkuZ2VuZXJpYy5hcHAubmF2aWdhdGlvbi5zZXJ2aWNlLk5hdmlnYXRpb25IYW5kbGVyfS48YnI+IENyZWF0ZXMgYSBuZXcgTmF2aWdhdGlvbkhhbmRsZXIgY2xhc3MgYnkgcHJvdmlkaW5nIHRoZSByZXF1aXJlZCBlbnZpcm9ubWVudC4gPGJyPlxuICogVGhlIDxjb2RlPk5hdmlnYXRpb25IYW5kbGVyPC9jb2RlPiBzdXBwb3J0cyB0aGUgdmVyaWZpY2F0aW9uIG9mIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi4gQWxsIHByb3BlcnRpZXMgdGhhdCBhcmUgcGFydCBvZlxuICogPGNvZGU+c2VsZWN0aW9uVmFyaWFudDwvY29kZT4gYW5kIDxjb2RlPnZhbHVlVGV4dHM8L2NvZGU+IHdpbGwgYmUgdmVyaWZpZWQgaWYgdGhleSBhcmUgYW5ub3RhdGVkIGFzXG4gKiA8Y29kZT5jb20uc2FwLnZvY2FidWxhcmllcy5QZXJzb25hbERhdGEudjEuSXNQb3RlbnRpYWxseVNlbnNpdGl2ZTwvY29kZT4gb3JcbiAqIDxjb2RlPmNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkV4Y2x1ZGVGcm9tTmF2aWdhdGlvbkNvbnRleHQ8L2NvZGU+IGFuZCB3aWxsIGJlIHJlbW92ZWQgYmVmb3JlIHRoZSBkYXRhIGlzIHBlcnNpc3RlZCBhcyB0aGUgYXBwXG4gKiBzdGF0ZS48YnI+XG4gKiBBbHNvLCBhbGwgcHJvcGVydGllcyBhbm5vdGF0ZWQgYXMgPGNvZGU+Y29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLk1lYXN1cmU8L2NvZGU+IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBkYXRhIHN0b3JlZCBhcyB0aGVcbiAqIHhhcHAgc3RhdGUuPGJyPlxuICogVG8gdmVyaWZ5IHRoZSBpbmZvcm1hdGlvbiB0byBiZSByZW1vdmVkLCB0aGUgPGNvZGU+TmF2aWdhdGlvbkhhbmRsZXI8L2NvZGU+IHJlcXVpcmVzIGFuIHVubmFtZWQgbW9kZWwgb2YgdHlwZVxuICoge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52Mi5PRGF0YU1vZGVsfSBvbiBjb21wb25lbnQgbGV2ZWwuIEl0IGlzIHBvc3NpYmxlIHRvIHNldCBzdWNoIGEgbW9kZWwgdXNpbmcgdGhlIDxjb2RlPnNldE1vZGVsPC9jb2RlPlxuICogbWV0aG9kLjxicj5cbiAqIDxiPk5vdGU6PC9iPiBUaGUgY2hlY2sgZm9yIGV4Y2x1ZGVkIGRhdGEgcmVxdWlyZXMgdGhhdCB0aGUgT0RhdGEgbWV0YWRhdGEgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQgY29tcGxldGVseS48YnI+XG4gKiBJZiB0aGUgT0RhdGEgbWV0YWRhdGEgbW9kZWwgaGFzIG5vdCBiZWVuIGxvYWRlZCBjb21wbGV0ZWx5LCBhbGwgcHJvcGVydGllcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBhcHBsaWNhdGlvbiBjb250ZXh0Ljxicj5cbiAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzIHJlcXVpcmVzIHRoYXQgdGhlIFVTaGVsbCB7QGxpbmsgc2FwLnVzaGVsbC5zZXJ2aWNlcy5Dcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbn0gaXMgYXZhaWxhYmxlIGFuZCBpbml0aWFsaXplZC5cbiAqIEBwdWJsaWNcbiAqIEBzaW5jZSAxLjgzLjBcbiAqL1xuZXhwb3J0IGNsYXNzIE5hdmlnYXRpb25IYW5kbGVyIGV4dGVuZHMgQmFzZU9iamVjdCB7XG5cdHByaXZhdGUgb1JvdXRlcjogYW55O1xuXG5cdHByaXZhdGUgb0NvbXBvbmVudDogQ29tcG9uZW50O1xuXG5cdHByaXZhdGUgX29Nb2RlbDogYW55O1xuXG5cdHByaXZhdGUgc1BhcmFtSGFuZGxpbmdNb2RlOiBzdHJpbmc7XG5cblx0cHJpdmF0ZSBfc01vZGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuXHQvLyBsaXN0IG9mIHRlY2huaWNhbCBwYXJhbWV0ZXJzXG5cdHByaXZhdGUgX2FUZWNobmljYWxQYXJhbWF0ZXJzID0gW1wiaGNwQXBwbGljYXRpb25JZFwiXTtcblxuXHRwcml2YXRlIF9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhOiBhbnkgPSB7XG5cdFx0c0FwcFN0YXRlS2V5OiBcIlwiLFxuXHRcdG9BcHBEYXRhOiB7fSxcblx0XHRpQ2FjaGVIaXQ6IDAsXG5cdFx0aUNhY2hlTWlzczogMFxuXHR9O1xuXG5cdC8qXG5cdCAqIFRoZXJlIGV4aXN0cyBhIGdlbmVyYXRpb24gb2YgXCJvbGRcIiBzYXAtaWFwcC1zdGF0ZXMgd2hpY2ggYXJlIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgVVJMIHNjaGVtYTpcblx0ICogI1NlbU9iai1hY3Rpb24mL3JvdXRlL3NhcC1pYXBwLXN0YXRlPUFCQzEyMzQ1Njc4IFRoZSBuZXcgVVJMIHNjaGVtYSBpczogI1NlbU9iai1hY3Rpb24mL3JvdXRlP3NhcC1pYXBwLXN0YXRlPUFCQzEyMzQ1Njc4IChtaW5kIHRoZVxuXHQgKiBkaWZmZXJlbmNlIGJldHdlZW4gLyBhbmQgPyBhYm92ZSksIGkuZS4gdGhlIHNhcC1pYXBwLXN0YXRlIGhhcyBiZWNvbWUgYSBwYXJhbWV0ZXIgb2YgdGhlIHF1ZXJ5IHBhcmFtZXRlciBzZWN0aW9uIGluIHRoZSBBcHBIYXNoIHN0cmluZy5cblx0ICogWWV0LCB0aGlzIHRvb2wgc2hhbGwgYmUgYWJsZSB0byBkZWFsIGV2ZW4gd2l0aCBvbGQgc2FwLWlhcHAtc3RhdGVzLiBUaGVyZWZvcmUsIHdlIHVzZSB0d28gUmVndWxhciBFeHByZXNzaW9ucyAocklBcHBTdGF0ZU9sZCBhbmRcblx0ICogcklBcHBTdGF0ZU9sZEF0U3RhcnQpIGFzIGRlZmluZWQgYmVsb3cgdG8gc2NhbiBmb3IgdGhlc2Ugb2xkIHZhcmlhbnRzLiBUaGUgbmV3IHZhcmlhbnQgaXMgYmVpbmcgc2Nhbm5lZCB1c2luZyBySUFwcFN0YXRlTmV3IGFzIFJlZ3VsYXJcblx0ICogRXhwcmVzc2lvbiBzZWFyY2ggc3RyaW5nLiBDb21wYXRpYmlsaXR5IGlzIGNlbnRyYWxseSBlbnN1cmVkIGJ5IHRoZSB0d28gbWV0aG9kcyBfZ2V0SW5uZXJBcHBTdGF0ZUtleSBhbmQgX3JlcGxhY2VJbm5lckFwcFN0YXRlS2V5IChzZWVcblx0ICogYmVsb3cpLiBOZXZlciB1c2UgdGhlc2UgUmVnRXhwIGluIGEgbWV0aG9kIG9uIHlvdXIgb3duLCBhcyBpdCB0eXBpY2FsbHkgaW5kaWNhdGVzIHRoYXQgeW91IHdpbGwgZmFsbCBpbnRvIHRoZSBjb21wYXRpYmlsaXR5IHRyYXAhXG5cdCAqL1xuXHQvLyBXYXJuaW5nISBEbyBub3QgdXNlIEdMT0JBTCBmbGFncyBoZXJlOyBSZWdFeHAgaW4gR0xPQkFMIG1vZGUgc3RvcmUgdGhlIGxhc3RJbmRleCB2YWx1ZVxuXHQvLyBUaGVyZWZvcmUsIHJlcGVhdGVkIGNhbGxzIHRvIHRoZSBSZWdFeHAgd2lsbCB0aGVuIG9ubHkgc3RhcnQgYmVnaW5uaW5nIHdpdGggdGhhdCBzdG9yZWRcblx0Ly8gbGFzdEluZGV4LiBUaHVzLCBtdWx0aXBsZSBjYWxscyB0aGVyZWZvcmUgY291bGQgeWllbGQgc3RyYW5nZSByZXN1bHRzLlxuXHQvLyBNb3Jlb3ZlciwgdGhlcmUgc2hhbGwgb25seSBiZSBleGFjdGx5IG9uZSBJQVBQX1NUQVRFIHBlciBSZWdFeHAgaW4gYW4gQXBwSGFzaC5cblx0Ly8gVGhlcmVmb3JlLCBHTE9CQUwgc2VhcmNoIHNob3VsZCBiZSBzdXBlcmZsdW91cy5cblx0cHJpdmF0ZSBfcklBcHBTdGF0ZU9sZCA9IG5ldyBSZWdFeHAoXCIvXCIgKyBJQVBQX1NUQVRFICsgXCI9KFteLz9dKylcIik7XG5cblx0cHJpdmF0ZSBfcklBcHBTdGF0ZU9sZEF0U3RhcnQgPSBuZXcgUmVnRXhwKFwiXlwiICsgSUFQUF9TVEFURSArIFwiPShbXi8/XSspXCIpO1xuXG5cdC8qXG5cdCAqIFJlZ3VsYXIgRXhwcmVzc2lvbiBpbiB3b3JkczogU2VhcmNoIGZvciBzb21ldGhpbmcgdGhhdCBlaXRoZXIgc3RhcnRzIHdpdGggPyBvciAmLCBmb2xsb3dlZCBieSB0aGUgdGVybSBcInNhcC1pYXBwLXN0YXRlXCIuIFRoYXQgb25lIGlzXG5cdCAqIGZvbGxvd2VkIGJ5IGFuIGVxdWFsIHNpZ24gKD0pLiBUaGUgc3R1ZmYgdGhhdCBpcyBhZnRlciB0aGUgZXF1YWwgc2lnbiBmb3JtcyB0aGUgZmlyc3QgcmVnZXhwIGdyb3VwLiBUaGlzIGdyb3VwIGNvbnNpc3RzIG9mIGF0IGxlYXN0IG9uZVxuXHQgKiAob3IgYXJiaXRyYXJ5IG1hbnkpIGNoYXJhY3RlcnMsIGFzIGxvbmcgYXMgaXQgaXMgbm90IGFuIGFtcGVyc2FuZCBzaWduICgmKS4gQ2hhcmFjdGVycyBhZnRlciBzdWNoIGFuIGFtcGVyc2FuZCB3b3VsZCBiZSBpZ25vcmVkIGFuZCBkb1xuXHQgKiBub3QgYmVsb25nIHRvIHRoZSBncm91cC4gQWx0ZXJuYXRpdmVseSwgdGhlIHN0cmluZyBhbHNvIG1heSBlbmQuXG5cdCAqL1xuXHRwcml2YXRlIF9ySUFwcFN0YXRlTmV3ID0gbmV3IFJlZ0V4cChcIls/Jl1cIiArIElBUFBfU1RBVEUgKyBcIj0oW14mXSspXCIpO1xuXG5cdHByaXZhdGUgX25hdmlnYXRlQ2FsbGJhY2s6IEZ1bmN0aW9uIHwgdW5kZWZpbmVkO1xuXG5cdC8qKlxuXHQgKiBUZW1wb3JhcmlseSBhZGRlZCBhZ2FpbiBiZWNhdXNlIGFuIGFwcGxpY2F0aW9uIHdhcyAoaWxsZWdpYWxseSkgcmVseWluZyBvbiBpdC4gU2hvdWxkIGJlIHJlbW92ZWQgYWdhaW4sIG9uY2UgdGhlIGFwcCBpcyBjb3JyZWN0ZWRcblx0ICovXG5cdHByaXZhdGUgSUFQUF9TVEFURSA9IElBUFBfU1RBVEU7XG5cblx0LyoqXG5cdCAqIENvbnN0cnVjdG9yIHJlcXVpcmluZyBhIGNvbnRyb2xsZXIvY29tcG9uZW50IG93bmluZyB0aGUgbmF2aWdhdGlvbiBoYW5kbGVyLlxuXHQgKiBAcGFyYW0gb0NvbnRyb2xsZXIgVUk1IGNvbnRyb2xsZXIgdGhhdCBjb250YWlucyBhIHJvdXRlciBhbmQgYSBjb21wb25lbnQ7IHR5cGljYWxseSB0aGUgbWFpbiBjb250cm9sbGVyIG9mIHlvdXIgYXBwbGljYXRpb24sIGZvclxuXHQgKiAgICAgICAgZXhhbXBsZSwgYSBzdWJjbGFzcyBvZiB0aGUgc2FwLmNhLnNjZmxkLm1kLmNvbnRyb2xsZXIuQmFzZUZ1bGxzY3JlZW5Db250cm9sbGVyIGlmIHNjYWZmb2xkaW5nIGlzIHVzZWRcblx0ICogQHBhcmFtIHNNb2RlIE1vZGUgdG8gYmUgdXNlZCB0byBpbmRpY2F0ZXMgdGhlIE9kYXRhIHZlcnNpb24gdXNlZCBmb3IgcnVubm5pbmcgdGhlIE5hdmlnYXRpb24gSGFuZGxlcixcblx0ICogICAgICAgIHNlZSB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTW9kZX0uPGJyPlxuXHQgKiBcdFx0ICBOb3RlOiBNb2RlIGhhcyB0byBiZSBzYXAuZmUubmF2aWdhdGlvbi5Nb2RlLk9EYXRhVjIgd2hlbmV2ZXIgdGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIHRvIGluaXRpYWxpemUgYSBPRGF0YSBWMiBiYXNlZCBzZXJ2aWNlLlxuXHQgKiBAcGFyYW0gc1BhcmFtSGFuZGxpbmdNb2RlIE1vZGUgdG8gYmUgdXNlZCB0byBoYW5kbGUgY29uZmxpY3RzIHdoZW4gbWVyZ2luZyBVUkwgcGFyYW1ldGVycyBhbmQgdGhlIFNlbGVjdGlvblZhcmlhbnQgY2xhc3MsXG5cdCAqICAgICAgICBzZWUge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLlBhcmFtSGFuZGxpbmdNb2RlfVxuXHQgKiBAdGhyb3dzIEFuIGluc3RhbmNlIG9mIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZFcnJvcn0gaW4gY2FzZSBvZiBpbnB1dCBlcnJvcnMuIFZhbGlkIGVycm9yIGNvZGVzIGFyZTogPHRhYmxlPlxuXHQgKiAgICAgICAgIDx0cj5cblx0ICogICAgICAgICA8dGggYWxpZ249XCJsZWZ0XCI+TmF2RXJyb3IgY29kZTwvdGg+XG5cdCAqICAgICAgICAgPHRoIGFsaWduPVwibGVmdFwiPkRlc2NyaXB0aW9uPC90aD5cblx0ICogICAgICAgICA8L3RyPlxuXHQgKiAgICAgICAgIDx0cj5cblx0ICogICAgICAgICA8dGQ+TmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVDwvdGQ+XG5cdCAqICAgICAgICAgPHRkPkluZGljYXRlcyB0aGF0IHRoZSBpbnB1dCBwYXJhbWV0ZXIgaXMgaW52YWxpZDwvdGQ+XG5cdCAqICAgICAgICAgPC90cj5cblx0ICogICAgICAgICA8L3RhYmxlPlxuXHQgKi9cblx0Y29uc3RydWN0b3IoXG5cdFx0b0NvbnRyb2xsZXI6IENvbnRyb2xsZXIgfCBVSUNvbXBvbmVudCxcblx0XHRzTW9kZTogc3RyaW5nID0gTW9kZS5PRGF0YVY0LFxuXHRcdHNQYXJhbUhhbmRsaW5nTW9kZTogc3RyaW5nID0gUGFyYW1IYW5kbGluZ01vZGUuU2VsVmFyV2luc1xuXHQpIHtcblx0XHRzdXBlcigpO1xuXHRcdGlmICghb0NvbnRyb2xsZXIpIHtcblx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0fVxuXG5cdFx0aWYgKG9Db250cm9sbGVyIGluc3RhbmNlb2YgVUlDb21wb25lbnQpIHtcblx0XHRcdHRoaXMub1JvdXRlciA9IG9Db250cm9sbGVyLmdldFJvdXRlcigpO1xuXHRcdFx0dGhpcy5vQ29tcG9uZW50ID0gb0NvbnRyb2xsZXI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh0eXBlb2Ygb0NvbnRyb2xsZXIuZ2V0T3duZXJDb21wb25lbnQgIT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm9Sb3V0ZXIgPSB0aGlzLl9nZXRSb3V0ZXIob0NvbnRyb2xsZXIpO1xuXHRcdFx0dGhpcy5vQ29tcG9uZW50ID0gb0NvbnRyb2xsZXIuZ2V0T3duZXJDb21wb25lbnQoKSBhcyBDb21wb25lbnQ7XG5cdFx0fVxuXG5cdFx0Ly8gc3BlY2lhbCBoYW5kbGluZyBmb3IgU21hcnRUZW1wbGF0ZXNcblx0XHRpZiAodGhpcy5vQ29tcG9uZW50ICYmICh0aGlzLm9Db21wb25lbnQgYXMgeyBnZXRBcHBDb21wb25lbnQ/OiBGdW5jdGlvbiB9KS5nZXRBcHBDb21wb25lbnQpIHtcblx0XHRcdHRoaXMub0NvbXBvbmVudCA9ICh0aGlzLm9Db21wb25lbnQgYXMgeyBnZXRBcHBDb21wb25lbnQ/OiBGdW5jdGlvbiB9KS5nZXRBcHBDb21wb25lbnQ/LigpO1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdHR5cGVvZiB0aGlzLm9Sb3V0ZXIgPT09IFwidW5kZWZpbmVkXCIgfHxcblx0XHRcdHR5cGVvZiB0aGlzLm9Db21wb25lbnQgPT09IFwidW5kZWZpbmVkXCIgfHxcblx0XHRcdHR5cGVvZiB0aGlzLm9Db21wb25lbnQuZ2V0Q29tcG9uZW50RGF0YSAhPT0gXCJmdW5jdGlvblwiXG5cdFx0KSB7XG5cdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUXCIpO1xuXHRcdH1cblxuXHRcdGlmIChzUGFyYW1IYW5kbGluZ01vZGUgPT09IFBhcmFtSGFuZGxpbmdNb2RlLlVSTFBhcmFtV2lucyB8fCBzUGFyYW1IYW5kbGluZ01vZGUgPT09IFBhcmFtSGFuZGxpbmdNb2RlLkluc2VydEluU2VsT3B0KSB7XG5cdFx0XHR0aGlzLnNQYXJhbUhhbmRsaW5nTW9kZSA9IHNQYXJhbUhhbmRsaW5nTW9kZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zUGFyYW1IYW5kbGluZ01vZGUgPSBQYXJhbUhhbmRsaW5nTW9kZS5TZWxWYXJXaW5zOyAvLyBkZWZhdWx0XG5cdFx0fVxuXHRcdGlmIChzTW9kZSA9PT0gTW9kZS5PRGF0YVYyKSB7XG5cdFx0XHR0aGlzLl9zTW9kZSA9IHNNb2RlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHNoZWxsIG5hdmlnYXRpb24gc2VydmljZS5cblx0ICogQHJldHVybnMgVGhlIE5hdmlnYXRpb24gc2VydmljZVxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG5cdF9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZSgpOiBDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvbiB7XG5cdFx0Y29uc3QgdXNoZWxsQ29udGFpbmVyOiBDb250YWluZXIgPSBzYXAudWkucmVxdWlyZShcInNhcC91c2hlbGwvQ29udGFpbmVyXCIpO1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuXHRcdHJldHVybiB1c2hlbGxDb250YWluZXIuZ2V0U2VydmljZShcIkNyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uXCIpIGFzIENyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgc2hlbGwgbmF2aWdhdGlvbiBzZXJ2aWNlLlxuXHQgKiBAcmV0dXJucyBUaGUgTmF2aWdhdGlvbiBzZXJ2aWNlXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRhc3luYyBfZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2VBc3luYygpOiBQcm9taXNlPE5hdmlnYXRpb24+IHtcblx0XHRjb25zdCB1c2hlbGxDb250YWluZXI6IENvbnRhaW5lciA9IHNhcC51aS5yZXF1aXJlKFwic2FwL3VzaGVsbC9Db250YWluZXJcIik7XG5cdFx0cmV0dXJuIHVzaGVsbENvbnRhaW5lclxuXHRcdFx0Py5nZXRTZXJ2aWNlQXN5bmMoXCJOYXZpZ2F0aW9uXCIpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob0Nyb3NzQXBwTmF2U2VydmljZTogb2JqZWN0KSB7XG5cdFx0XHRcdHJldHVybiBvQ3Jvc3NBcHBOYXZTZXJ2aWNlIGFzIE5hdmlnYXRpb247XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXI6IE5hdmlnYXRpb24gaXMgbm90IGF2YWlsYWJsZS5cIik7XG5cdFx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLk5PLlhBUFBTRVJWSUNFXCIpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSByZWZlcmVuY2UgdG8gdGhlIHJvdXRlciBvYmplY3QgZm9yIG5hdmlnYXRpb24gZm9yIHRoaXMgZ2l2ZW4gQ29udHJvbGxlci5cblx0ICogQHBhcmFtIG9Db250cm9sbGVyIFRoZSByZWZlcmVuY2UgdG8gdGhlIENvbnRyb2xsZXIgZm9yIHdoaWNoIHRoZSBSb3V0ZXIgaW5zdGFuY2Ugc2hhbGwgYmUgZGV0ZXJtaW5lZC5cblx0ICogQHJldHVybnMgVGhlIFJvdXRlciBmb3IgdGhlIGdpdmVuIENvbnRyb2xsZXJcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9nZXRSb3V0ZXIob0NvbnRyb2xsZXI6IENvbnRyb2xsZXIpOiBSb3V0ZXIge1xuXHRcdHJldHVybiBVSUNvbXBvbmVudC5nZXRSb3V0ZXJGb3Iob0NvbnRyb2xsZXIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIHRvIGJlIHVzZWQgb25seSBieSBGRSBWMiB0byBnZXQgYWNjZXNzIHRvIHRvRXh0ZXJuYWwgcHJvbWlzZS5cblx0ICogQHBhcmFtIGZuQ2FsbGJhY2sgQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIGJ5ICduYXZpZ2F0ZScgbWV0aG9kIGluIGNhc2Ugb2YgdG9FeHRlcm5hbCBpcyB1c2VkIHRvIG5hdmlnYXRlLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0cmVnaXN0ZXJOYXZpZ2F0ZUNhbGxiYWNrKGZuQ2FsbGJhY2s6IEZ1bmN0aW9uKTogdm9pZCB7XG5cdFx0dGhpcy5fbmF2aWdhdGVDYWxsYmFjayA9IGZuQ2FsbGJhY2s7XG5cdH1cblxuXHQvKipcblx0ICogVHJpZ2dlcnMgYSBjcm9zcy1hcHAgbmF2aWdhdGlvbiBhZnRlciBzYXZpbmcgdGhlIGlubmVyIGFuZCB0aGUgY3Jvc3MtYXBwIHN0YXRlcy4gVGhlIG5hdmlnYXRpb24gbW9kZSBiYXNlZCBvblxuXHQgKiA8Y29kZT5zYXAtdXNoZWxsLW5leHQtbmF2bW9kZTwvY29kZT4gaXMgdGFrZW4gaW50byBhY2NvdW50LiBJZiBzZXQgdG8gPGNvZGU+ZXhwbGFjZTwvY29kZT4gdGhlIGlubmVyIGFwcCBzdGF0ZSB3aWxsIG5vdCBiZSBjaGFuZ2VkLlxuXHQgKiA8Yj5Ob3RlOjwvYj4gVGhlIDxjb2RlPnNOYXZNb2RlPC9jb2RlPiBhcmd1bWVudCBjYW4gYmUgdXNlZCB0byBvdmVyd3JpdGUgdGhlIFNBUCBGaW9yaSBsYXVuY2hwYWQgZGVmYXVsdCBuYXZpZ2F0aW9uIGZvciBvcGVuaW5nIGEgVVJMXG5cdCAqIGluLXBsYWNlIG9yIGV4LXBsYWNlLlxuXHQgKiA8YnI+XG5cdCAqIDxiPk5vZGU6PC9iPiBJZiB0aGUgPGNvZGU+b0V4dGVybmFsQXBwRGF0YTwvY29kZT4gcGFyYW1ldGVyIGlzIG5vdCBzdXBwbGllZCwgdGhlIGV4dGVybmFsIGFwcCBkYXRhIHdpbGwgYmUgY2FsY3VsYXRlZCBiYXNlZCBvblxuXHQgKiB0aGUgPGNvZGU+b0lubmVyQXBwRGF0YTwvY29kZT4gZGF0YS48YnI+XG5cdCAqIFNtYXJ0RmlsdGVyQmFyIGNvbnRyb2wgPGI+UGFyYW1ldGVyczo8L2I+IDx0YWJsZT5cblx0ICogPHRyPlxuXHQgKiA8dGQgYWxpZ249XCJjZW50ZXJcIj57b2JqZWN0fTwvdGQ+XG5cdCAqIDx0ZD48Yj5vRXJyb3I8L2I+PC90ZD5cblx0ICogPHRkPk5hdkVycm9yIG9iamVjdCAoaW5zdGFuY2Ugb2Yge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdkVycm9yfSkgdGhhdCBkZXNjcmliZXMgd2hpY2gga2luZCBvZiBlcnJvciBvY2N1cnJlZDwvdGQ+XG5cdCAqIDx0cj5cblx0ICogPHRkIGFsaWduPVwiY2VudGVyXCI+e3N0cmluZ308L3RkPlxuXHQgKiA8dGQ+PGI+b0Vycm9yLmVycm9yQ29kZTwvYj48L3RkPlxuXHQgKiA8dGQ+Q29kZSB0byBpZGVudGlmeSB0aGUgZXJyb3I8L3RkPlxuXHQgKiA8dHI+XG5cdCAqIDx0ZCBhbGlnbj1cImNlbnRlclwiPntzdHJpbmd9PC90ZD5cblx0ICogPHRkPjxiPm9FcnJvci50eXBlPC9iPjwvdGQ+XG5cdCAqIDx0ZD5TZXZlcml0eSBvZiB0aGUgZXJyb3IgKGluZm8vd2FybmluZy9lcnJvcik8L3RkPlxuXHQgKiA8dHI+XG5cdCAqIDx0ZCBhbGlnbj1cImNlbnRlclwiPnthcnJheX08L3RkPlxuXHQgKiA8dGQ+PGI+b0Vycm9yLnBhcmFtczwvYj48L3RkPlxuXHQgKiA8dGQ+QW4gYXJyYXkgb2Ygb2JqZWN0cyAodHlwaWNhbGx5IHN0cmluZ3MpIHRoYXQgZGVzY3JpYmUgYWRkaXRpb25hbCB2YWx1ZSBwYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBnZW5lcmF0aW5nIHRoZSBtZXNzYWdlPC90ZD5cblx0ICogPC90YWJsZT4uXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHNTZW1hbnRpY09iamVjdCBOYW1lIG9mIHRoZSBzZW1hbnRpYyBvYmplY3Qgb2YgdGhlIHRhcmdldCBhcHBcblx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIE5hbWUgb2YgdGhlIGFjdGlvbiBvZiB0aGUgdGFyZ2V0IGFwcFxuXHQgKiBAcGFyYW0gdk5hdmlnYXRpb25QYXJhbWV0ZXJzIE5hdmlnYXRpb24gcGFyYW1ldGVycyBhcyBhbiBvYmplY3Qgd2l0aCBrZXkvdmFsdWUgcGFpcnMgb3IgYXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2Ygc3VjaCBhbiBvYmplY3QuIElmIHBhc3NlZCBhcyBhbiBvYmplY3QsIHRoZSBwcm9wZXJ0aWVzIGFyZSBub3QgY2hlY2tlZCBhZ2FpbnN0IHRoZSA8Y29kZT5Jc1BvdGVudGlhbFNlbnNpdGl2ZTwvY29kZT4gb3IgPGNvZGU+TWVhc3VyZTwvY29kZT4gdHlwZS5cblx0ICogQHBhcmFtIG9Jbm5lckFwcERhdGEgT2JqZWN0IGZvciBzdG9yaW5nIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFwcFxuXHQgKiBAcGFyYW0gZm5PbkVycm9yIENhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgbmF2aWdhdGlvbiA8YnI+XG5cdCAqIEBwYXJhbSBvRXh0ZXJuYWxBcHBEYXRhIE9iamVjdCBmb3Igc3RvcmluZyB0aGUgc3RhdGUgd2hpY2ggd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlIHRhcmdldCBjb21wb25lbnQuXG5cdCAqIEBwYXJhbSBvRXh0ZXJuYWxBcHBEYXRhLnByZXNlbnRhdGlvblZhcmlhbnQgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgdWkgc3RhdGUgb2YgdGhlIGFwcCB3aGljaCB3aWxsIGJlIGZvcndhcmRlZCB0byB0aGVcblx0ICogICAgICAgIHRhcmdldCBjb21wb25lbnQuXG5cdCAqIEBwYXJhbSBvRXh0ZXJuYWxBcHBEYXRhLnZhbHVlVGV4dHMgT2JqZWN0IGNvbnRhaW5pbmcgdmFsdWUgZGVzY3JpcHRpb25zIHdoaWNoIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZSB0YXJnZXQgY29tcG9uZW50LlxuXHQgKiBAcGFyYW0gb0V4dGVybmFsQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50IFN0cmluZ2lmaWVkIEpTT04gb2JqZWN0LCB3aGljaCB3aWxsIGJlIGZvcndhcmRlZCB0byB0aGUgdGFyZ2V0IGNvbXBvbmVudC4gSWYgbm90XG5cdCAqICAgICAgICBwcm92aWRlZCB0aGUgc2VsZWN0aW9uVmFyaWFudCB3aWxsIGJlIGNvbnN0cnVjdGVkIGJhc2VkIG9uIHRoZSB2TmF2aWdhdGlvblBhcmFtZXRlcnMuXG5cdCAqIEBwYXJhbSBzTmF2TW9kZSBBcmd1bWVudCBpcyB1c2VkIHRvIG92ZXJ3cml0ZSB0aGUgRkxQLWNvbmZpZ3VyZWQgdGFyZ2V0IGZvciBvcGVuaW5nIGEgVVJMLiBJZiB1c2VkLCBvbmx5IHRoZVxuXHQgKiAgICAgICAgPGNvZGU+ZXhwbGFjZTwvY29kZT4gb3IgPGNvZGU+aW5wbGFjZTwvY29kZT4gdmFsdWVzIGFyZSBhbGxvd2VkLiBBbnkgb3RoZXIgdmFsdWUgd2lsbCBsZWFkIHRvIGFuIGV4Y2VwdGlvblxuXHQgKiAgICAgICAgPGNvZGU+TmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9OQVZfTU9ERTwvY29kZT4uXG5cdCAqIEBleGFtcGxlIDxjb2RlPlxuXHQgKiBzYXAudWkuZGVmaW5lKFtcInNhcC9mZS9uYXZpZ2F0aW9uL05hdmlnYXRpb25IYW5kbGVyXCIsIFwic2FwL2ZlL25hdmlnYXRpb24vU2VsZWN0aW9uVmFyaWFudFwiXSwgZnVuY3Rpb24gKE5hdmlnYXRpb25IYW5kbGVyLCBTZWxlY3Rpb25WYXJpYW50KSB7XG5cdCAqIFx0dmFyIG9OYXZpZ2F0aW9uSGFuZGxlciA9IG5ldyBOYXZpZ2F0aW9uSGFuZGxlcihvQ29udHJvbGxlcik7XG5cdCAqIFx0dmFyIHNTZW1hbnRpY09iamVjdCA9IFwiU2FsZXNPcmRlclwiO1xuXHQgKiBcdHZhciBzQWN0aW9uTmFtZSA9IFwiY3JlYXRlXCI7XG5cdCAqXG5cdCAqIFx0Ly9zaW1wbGUgcGFyYW1ldGVycyBhcyBPYmplY3Rcblx0ICogXHR2YXIgdk5hdmlnYXRpb25QYXJhbWV0ZXJzID0ge1xuXHQgKiBcdFx0Q29tcGFueUNvZGUgOiBcIjAwMDFcIixcblx0ICogXHRcdEN1c3RvbWVyIDogXCJDMDAwMVwiXG5cdCAqIFx0fTtcblx0ICpcblx0ICogXHQvL29yIGFzIHNlbGVjdGlvbiB2YXJpYW50XG5cdCAqIFx0dmFyIG9TZWxlY3Rpb25WYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoKTtcblx0ICpcdCBvU2VsZWN0aW9uVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oXCJDb21wYW55Q29kZVwiLCBcIklcIiwgXCJFUVwiLCBcIjAwMDFcIik7XG5cdCAqIFx0b1NlbGVjdGlvblZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKFwiQ3VzdG9tZXJcIiwgXCJJXCIsIFwiRVFcIiwgXCJDMDAwMVwiKTtcblx0ICogXHR2TmF2aWdhdGlvblBhcmFtZXRlcnMgPSBvU2VsZWN0aW9uVmFyaWFudC50b0pTT05TdHJpbmcoKTtcblx0ICpcblx0ICogXHQvL29yIGRpcmVjdGx5IGZyb20gU21hcnRGaWx0ZXJCYXJcblx0ICogXHR2TmF2aWdhdGlvblBhcmFtZXRlcnMgPSBvU21hcnRGaWx0ZXJCYXIuZ2V0RGF0YVN1aXRlRm9ybWF0KCk7XG5cdCAqXG5cdCAqIFx0Ly9hcHAgc3RhdGUgZm9yIGJhY2sgbmF2aWdhdGlvblxuXHQgKlx0IHZhciBvSW5uZXJBcHBEYXRhID0ge1xuXHQgKiBcdFx0c2VsZWN0aW9uVmFyaWFudCA6IG9TbWFydEZpbHRlckJhci5nZXREYXRhU3VpdGVGb3JtYXQoKSxcblx0ICogXHRcdHRhYmxlVmFyaWFudElkIDogb1NtYXJ0VGFibGUuZ2V0Q3VycmVudFZhcmlhbnRJZCgpLFxuXHQgKiBcdFx0Y3VzdG9tRGF0YSA6IG9NeUN1c3RvbURhdGFcblx0ICogXHR9O1xuXHQgKlxuXHQgKiBcdC8vIGNhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3JzXG5cdCAqIFx0dmFyIGZuT25FcnJvciA9IGZ1bmN0aW9uKG9FcnJvcil7XG5cdCAqIFx0XHR2YXIgb2kxOG4gPSBvQ29udHJvbGxlci5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpMThuXCIpLmdldFJlc291cmNlQnVuZGxlKCk7XG5cdCAqIFx0XHRvRXJyb3Iuc2V0VUlUZXh0KHtvaTE4biA6IG9pMThuLCBzVGV4dEtleSA6IFwiT1VUQk9VTkRfTkFWX0VSUk9SXCJ9KTtcblx0ICogXHRcdG9FcnJvci5zaG93TWVzc2FnZUJveCgpO1xuXHQgKiBcdH07XG5cdCAqXG5cdCAqIFx0b05hdmlnYXRpb25IYW5kbGVyLm5hdmlnYXRlKHNTZW1hbnRpY09iamVjdCwgc0FjdGlvbk5hbWUsIHZOYXZpZ2F0aW9uUGFyYW1ldGVycywgb0lubmVyQXBwRGF0YSwgZm5PbkVycm9yKTtcblx0ICogfSk7XG5cdCAqIDwvY29kZT5cblx0ICovXG5cdG5hdmlnYXRlKFxuXHRcdHNTZW1hbnRpY09iamVjdDogc3RyaW5nLFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0dk5hdmlnYXRpb25QYXJhbWV0ZXJzOiBvYmplY3QgfCBzdHJpbmcsXG5cdFx0b0lubmVyQXBwRGF0YT86IElubmVyQXBwRGF0YSxcblx0XHRmbk9uRXJyb3I/OiBGdW5jdGlvbixcblx0XHRvRXh0ZXJuYWxBcHBEYXRhPzoge1xuXHRcdFx0dmFsdWVUZXh0cz86IG9iamVjdCB8IHVuZGVmaW5lZDtcblx0XHRcdHByZXNlbnRhdGlvblZhcmlhbnQ/OiBvYmplY3QgfCB1bmRlZmluZWQ7XG5cdFx0XHRzZWxlY3Rpb25WYXJpYW50Pzogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRcdH0sXG5cdFx0c05hdk1vZGU/OiBzdHJpbmdcblx0KTogdm9pZCB7XG5cdFx0bGV0IHNTZWxlY3Rpb25WYXJpYW50OiBhbnksXG5cdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdG9YQXBwRGF0YU9iajogYW55LFxuXHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzLFxuXHRcdFx0YkV4UGxhY2UgPSBmYWxzZSxcblx0XHRcdG9UbXBEYXRhOiBhbnkgPSB7fTtcblx0XHRjb25zdCBvTmF2SGFuZGxlcjogTmF2aWdhdGlvbkhhbmRsZXIgPSB0aGlzO1xuXG5cdFx0Y29uc3Qgb0NvbXBvbmVudERhdGEgPSB0aGlzLm9Db21wb25lbnQuZ2V0Q29tcG9uZW50RGF0YSgpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG5cdFx0Lypcblx0XHQgKiBUaGVyZSBhcmUgc29tZSByYWNlIGNvbmRpdGlvbnMgd2hlcmUgdGhlIG9Db21wb25lbnREYXRhIG1heSBub3QgYmUgc2V0LCBmb3IgZXhhbXBsZSBpbiBjYXNlIHRoZSBVU2hlbGwgd2FzIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseS4gVG9cblx0XHQgKiBtYWtlIHN1cmUgdGhhdCB3ZSBkbyBub3QgZHVtcCBoZXJlIHdpdGggYW4gZXhjZXB0aW9uLCB3ZSB0YWtlIHRoaXMgc3BlY2lhbCBlcnJvciBoYW5kbGluZyBiZWhhdmlvcjpcblx0XHQgKi9cblx0XHRpZiAob0NvbXBvbmVudERhdGEpIHtcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVycyA9IG9Db21wb25lbnREYXRhLnN0YXJ0dXBQYXJhbWV0ZXJzO1xuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVycyAmJlxuXHRcdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnNbXCJzYXAtdXNoZWxsLW5leHQtbmF2bW9kZVwiXSAmJlxuXHRcdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnNbXCJzYXAtdXNoZWxsLW5leHQtbmF2bW9kZVwiXS5sZW5ndGggPiAwXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gYkV4UGxhY2UgPSAoSlNPTi5wYXJzZShvU3RhcnR1cFBhcmFtZXRlcnNbXCJzYXAtdXNoZWxsLW5leHQtbmF2bW9kZVwiXVswXSkgPT09IFwiZXhwbGFjZVwiKTtcblx0XHRcdFx0YkV4UGxhY2UgPSBvU3RhcnR1cFBhcmFtZXRlcnNbXCJzYXAtdXNoZWxsLW5leHQtbmF2bW9kZVwiXVswXSA9PT0gXCJleHBsYWNlXCI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gb25seSBuYXYtbW9kZSAnaW5wbGFjZScgb3IgJ2V4cGxhY2UnIGFyZSBzdXBwb3J0ZWQuIEFueSBvdGhlciB2YWx1ZSB3aWxsIGxlYWQgdG8gYW4gZXhjZXB0aW9uLlxuXHRcdGlmIChzTmF2TW9kZSAmJiAoc05hdk1vZGUgPT09IFwiaW5wbGFjZVwiIHx8IHNOYXZNb2RlID09PSBcImV4cGxhY2VcIikpIHtcblx0XHRcdGJFeFBsYWNlID0gc05hdk1vZGUgPT09IFwiZXhwbGFjZVwiO1xuXHRcdH0gZWxzZSBpZiAoc05hdk1vZGUpIHtcblx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfTkFWX01PREVcIik7XG5cdFx0fVxuXG5cdFx0aWYgKG9FeHRlcm5hbEFwcERhdGEgPT09IHVuZGVmaW5lZCB8fCBvRXh0ZXJuYWxBcHBEYXRhID09PSBudWxsKSB7XG5cdFx0XHRvWEFwcERhdGFPYmogPSB7fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1hBcHBEYXRhT2JqID0gb0V4dGVybmFsQXBwRGF0YTtcblx0XHR9XG5cblx0XHQvLyBmb3IgbmF2aWdhdGlvbiB3ZSBuZWVkIFVSTCBwYXJhbWV0ZXJzIChsZWdhY3kgbmF2aWdhdGlvbikgYW5kIHNhcC14YXBwLXN0YXRlLCB0aGVyZWZvcmUgd2UgbmVlZCB0byBjcmVhdGUgdGhlIG1pc3Npbmcgb25lIGZyb20gdGhlXG5cdFx0Ly8gcGFzc2VkIG9uZVxuXHRcdGlmICh0eXBlb2Ygdk5hdmlnYXRpb25QYXJhbWV0ZXJzID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRzU2VsZWN0aW9uVmFyaWFudCA9IHZOYXZpZ2F0aW9uUGFyYW1ldGVycztcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2TmF2aWdhdGlvblBhcmFtZXRlcnMgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdGNvbnN0IG9FbnJpY2hlZFNlbFZhciA9IHRoaXMuX3NwbGl0SW5ib3VuZE5hdmlnYXRpb25QYXJhbWV0ZXJzKFxuXHRcdFx0XHRuZXcgU2VsZWN0aW9uVmFyaWFudCgpLFxuXHRcdFx0XHR2TmF2aWdhdGlvblBhcmFtZXRlcnMsXG5cdFx0XHRcdFtdXG5cdFx0XHQpLm9OYXZpZ2F0aW9uU2VsVmFyO1xuXHRcdFx0c1NlbGVjdGlvblZhcmlhbnQgPSBvRW5yaWNoZWRTZWxWYXIudG9KU09OU3RyaW5nKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0fVxuXG5cdFx0b1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudCA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KHNTZWxlY3Rpb25WYXJpYW50KTtcblx0XHRpZiAodHlwZW9mIHZOYXZpZ2F0aW9uUGFyYW1ldGVycyA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0b1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudCA9IHRoaXMuX3JlbW92ZVRlY2huaWNhbFBhcmFtZXRlcnMob1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0fVxuXHRcdG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQgPSBvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50ICYmIG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQudG9KU09OT2JqZWN0KCk7XG5cdFx0b1RtcERhdGEgPSB0aGlzLl9yZW1vdmVNZWFzdXJlQmFzZWRJbmZvcm1hdGlvbihvVG1wRGF0YSk7IC8vIHJlbW92ZSBldmVudHVhbCBtZWFzdXJlc1xuXHRcdG9UbXBEYXRhID0gdGhpcy5fY2hlY2tJc1BvdGVudGlhbGx5U2Vuc2l0aXZlKG9UbXBEYXRhKTsgLy8gcmVtb3ZlIGV2ZW50dWFsIHNlbnNpdGl2ZSBkYXRhXG5cblx0XHRpZiAob1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdFx0bVBhcmFtZXRlcnMgPSB0aGlzLl9nZXRVUkxQYXJhbWV0ZXJzRnJvbVNlbGVjdGlvblZhcmlhbnQobmV3IFNlbGVjdGlvblZhcmlhbnQob1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudCkpO1xuXHRcdFx0c1NlbGVjdGlvblZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudChvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50KS50b0pTT05TdHJpbmcoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMgPSB7fTtcblx0XHRcdHNTZWxlY3Rpb25WYXJpYW50ID0gbnVsbDtcblx0XHR9XG5cblx0XHRjb25zdCBvTmF2QXJndW1lbnRzOiBhbnkgPSB7XG5cdFx0XHR0YXJnZXQ6IHtcblx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IHNTZW1hbnRpY09iamVjdCxcblx0XHRcdFx0YWN0aW9uOiBzQWN0aW9uTmFtZVxuXHRcdFx0fSxcblx0XHRcdHBhcmFtczogbVBhcmFtZXRlcnMgfHwge31cblx0XHR9O1xuXG5cdFx0Y29uc3QgZm5OYXZpZ2F0ZSA9IGFzeW5jIGZ1bmN0aW9uIChvQ3Jvc3NBcHBOYXZTZXJ2aWNlOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRcdGlmICghb1hBcHBEYXRhT2JqLnNlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRcdFx0b1hBcHBEYXRhT2JqLnNlbGVjdGlvblZhcmlhbnQgPSBzU2VsZWN0aW9uVmFyaWFudDtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZm5OYXZFeHBsYWNlID0gZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRjb25zdCBzTmV3SHJlZlByb21pc2UgPSBvQ3Jvc3NBcHBOYXZTZXJ2aWNlLmdldEhyZWYob05hdkFyZ3VtZW50cywgb05hdkhhbmRsZXIub0NvbXBvbmVudCk7XG5cdFx0XHRcdHNOZXdIcmVmUHJvbWlzZVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChzTmV3SHJlZjogc3RyaW5nKTogdm9pZCB7XG5cdFx0XHRcdFx0XHRvcGVuV2luZG93KHNOZXdIcmVmKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKTogdm9pZCB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXRpcmV2aW5nIGhyZWZGb3JFeHRlcm5hbCA6IFwiICsgb0Vycm9yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH07XG5cblx0XHRcdG9YQXBwRGF0YU9iaiA9IG9OYXZIYW5kbGVyLl9yZW1vdmVNZWFzdXJlQmFzZWRJbmZvcm1hdGlvbihvWEFwcERhdGFPYmopO1xuXHRcdFx0cmV0dXJuIG9OYXZIYW5kbGVyLl9mblNhdmVBcHBTdGF0ZUFzeW5jKG9YQXBwRGF0YU9iaiwgZm5PbkVycm9yKS50aGVuKGZ1bmN0aW9uIChvU2F2ZUFwcFN0YXRlUmV0dXJuOiBhbnkpOiB2b2lkIHtcblx0XHRcdFx0aWYgKG9TYXZlQXBwU3RhdGVSZXR1cm4pIHtcblx0XHRcdFx0XHRvTmF2QXJndW1lbnRzLmFwcFN0YXRlS2V5ID0gb1NhdmVBcHBTdGF0ZVJldHVybi5hcHBTdGF0ZUtleTtcblxuXHRcdFx0XHRcdC8vIFJlbWFyazpcblx0XHRcdFx0XHQvLyBUaGUgQ3Jvc3MgQXBwIFNlcnZpY2UgdGFrZXMgY2FyZSBvZiBlbmNvZGluZyBwYXJhbWV0ZXIga2V5cyBhbmQgdmFsdWVzLiBFeGFtcGxlOlxuXHRcdFx0XHRcdC8vIG1QYXJhbXMgPSB7IFwiJEAlXCIgOiBcIiYvPVwiIH0gcmVzdWx0cyBpbiB0aGUgVVJMIHBhcmFtZXRlciAlMjUyNCUyNTQwJTI1MjU9JTI1MjYlMjUyRiUyNTNEXG5cdFx0XHRcdFx0Ly8gTm90ZSB0aGUgZG91YmxlIGVuY29kaW5nLCB0aGlzIGlzIGNvcnJlY3QuXG5cblx0XHRcdFx0XHQvLyB0b0V4dGVybmFsIHNldHMgc2FwLXhhcHAtc3RhdGUgaW4gdGhlIFVSTCBpZiBhcHBTdGF0ZUtleSBpcyBwcm92aWRlZCBpbiBvTmF2QXJndW1lbnRzXG5cdFx0XHRcdFx0Ly8gdG9FeHRlcm5hbCBoYXMgaXNzdWVzIG9uIHN0aWNreSBhcHBzIEZJT1JJVEVDSFAxLTE0NDAwLCB0ZW1wIGZpeCB1c2luZyBocmVmRm9yRXh0ZXJuYWxcblx0XHRcdFx0XHRpZiAoc05hdk1vZGUgPT0gXCJleHBsYWNlXCIpIHtcblx0XHRcdFx0XHRcdGZuTmF2RXhwbGFjZSgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjb25zdCBwdG9FeHQgPSBvQ3Jvc3NBcHBOYXZTZXJ2aWNlLm5hdmlnYXRlKG9OYXZBcmd1bWVudHMsIG9OYXZIYW5kbGVyLm9Db21wb25lbnQpO1xuXHRcdFx0XHRcdFx0Ly8gVE9ETzogVGhpcyBpcyBqdXN0IGEgdGVtcG9yYXJ5IHNvbHV0aW9uIHRvIGFsbG93IEZFIFYyIHRvIHVzZSB0b0V4dGVybmFsIHByb21pc2UuXG5cdFx0XHRcdFx0XHRpZiAob05hdkhhbmRsZXIuX25hdmlnYXRlQ2FsbGJhY2spIHtcblx0XHRcdFx0XHRcdFx0b05hdkhhbmRsZXIuX25hdmlnYXRlQ2FsbGJhY2socHRvRXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gLy8gZWxzZSA6IGVycm9yIHdhcyBhbHJlYWR5IHJlcG9ydGVkXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pO1xuXHRcdH07XG5cdFx0Y29uc3QgZm5TdG9yZUFuZE5hdmlnYXRlID0gZnVuY3Rpb24gKG9Dcm9zc0FwcE5hdlNlcnZpY2U6IGFueSk6IHZvaWQge1xuXHRcdFx0b05hdkhhbmRsZXJcblx0XHRcdFx0LnN0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jKG9Jbm5lckFwcERhdGEgYXMgYW55LCB0cnVlKVxuXHRcdFx0XHQudGhlbihhc3luYyBmdW5jdGlvbiAoc0FwcFN0YXRlS2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRcdFx0XHRpZiAoc0FwcFN0YXRlS2V5KSB7XG5cdFx0XHRcdFx0XHRvTmF2SGFuZGxlci5yZXBsYWNlSGFzaChzQXBwU3RhdGVLZXkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gZm5OYXZpZ2F0ZShvQ3Jvc3NBcHBOYXZTZXJ2aWNlKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdGlmIChmbk9uRXJyb3IpIHtcblx0XHRcdFx0XHRcdGZuT25FcnJvcihvRXJyb3IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0fTtcblx0XHRpZiAoc05hdk1vZGUpIHtcblx0XHRcdG9OYXZBcmd1bWVudHMucGFyYW1zW1wic2FwLXVzaGVsbC1uYXZtb2RlXCJdID0gYkV4UGxhY2UgPyBcImV4cGxhY2VcIiA6IFwiaW5wbGFjZVwiO1xuXHRcdH1cblx0XHRvTmF2SGFuZGxlclxuXHRcdFx0Ll9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZUFzeW5jKClcblx0XHRcdC50aGVuKGFzeW5jIGZ1bmN0aW9uIChvQ3Jvc3NBcHBOYXZTZXJ2aWNlOiBOYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1RhcmdldHMgPSBhd2FpdCAob0Nyb3NzQXBwTmF2U2VydmljZS5pc05hdmlnYXRpb25TdXBwb3J0ZWQoXG5cdFx0XHRcdFx0XHRbb05hdkFyZ3VtZW50c10sXG5cdFx0XHRcdFx0XHRvTmF2SGFuZGxlci5vQ29tcG9uZW50XG5cdFx0XHRcdFx0KSBhcyB1bmtub3duIGFzIFByb21pc2U8eyBzdXBwb3J0ZWQ6IGJvb2xlYW4gfVtdPik7XG5cdFx0XHRcdFx0aWYgKG9UYXJnZXRzWzBdLnN1cHBvcnRlZCkge1xuXHRcdFx0XHRcdFx0aWYgKCFiRXhQbGFjZSkge1xuXHRcdFx0XHRcdFx0XHRmblN0b3JlQW5kTmF2aWdhdGUob0Nyb3NzQXBwTmF2U2VydmljZSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRmbk5hdmlnYXRlKG9Dcm9zc0FwcE5hdlNlcnZpY2UpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoZm5PbkVycm9yKSB7XG5cdFx0XHRcdFx0XHQvLyBpbnRlbnQgaXMgbm90IHN1cHBvcnRlZFxuXHRcdFx0XHRcdFx0Y29uc3Qgb0Vycm9yID0gbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuaXNJbnRlbnRTdXBwb3J0ZWQubm90U3VwcG9ydGVkXCIpO1xuXHRcdFx0XHRcdFx0Zm5PbkVycm9yKG9FcnJvcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdFx0XHRpZiAoZm5PbkVycm9yKSB7XG5cdFx0XHRcdFx0XHQvLyB0ZWNobmljYWwgZXJyb3I6IGNvdWxkIG5vdCBkZXRlcm1pbmUgaWYgaW50ZW50IGlzIHN1cHBvcnRlZFxuXHRcdFx0XHRcdFx0Y29uc3QgdGVjaG5pY2FsRXJyb3IgPSBvTmF2SGFuZGxlci5fY3JlYXRlVGVjaG5pY2FsRXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5pc0ludGVudFN1cHBvcnRlZC5mYWlsZWRcIik7XG5cdFx0XHRcdFx0XHRmbk9uRXJyb3IodGVjaG5pY2FsRXJyb3IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRpZiAoZm5PbkVycm9yKSB7XG5cdFx0XHRcdFx0Zm5PbkVycm9yKG9FcnJvcik7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFBhcnNlcyB0aGUgaW5jb21pbmcgVVJMIGFuZCByZXR1cm5zIGEgUHJvbWlzZS4gSWYgdGhpcyBtZXRob2QgZGV0ZWN0cyBhIGJhY2sgbmF2aWdhdGlvbiwgdGhlIGlubmVyIGFwcCBzdGF0ZSBpcyByZXR1cm5lZCBpbiB0aGUgcmVzb2x2ZWRcblx0ICogUHJvbWlzZS4gT3RoZXJ3aXNlIHN0YXJ0dXAgcGFyYW1ldGVycyB3aWxsIGJlIG1lcmdlZCBpbnRvIHRoZSBhcHAgc3RhdGUgcHJvdmlkZWQgYnkgY3Jvc3MgYXBwIG5hdmlnYXRpb24sIGFuZCBhIGNvbWJpbmVkIGFwcCBzdGF0ZSB3aWxsIGJlXG5cdCAqIHJldHVybmVkLiBUaGUgY29uZmxpY3QgcmVzb2x1dGlvbiBjYW4gYmUgaW5mbHVlbmNlZCB3aXRoIHNQYXJhbUhhbmRsaW5nTW9kZSBkZWZpbmVkIGluIHRoZSBjb25zdHJ1Y3Rvci5cblx0ICogQHJldHVybnMgQSBQcm9taXNlIG9iamVjdCB0byBtb25pdG9yIHdoZW4gYWxsIHRoZSBhY3Rpb25zIG9mIHRoZSBmdW5jdGlvbiBoYXZlIGJlZW4gZXhlY3V0ZWQuIElmIHRoZSBleGVjdXRpb24gaXMgc3VjY2Vzc2Z1bCwgdGhlXG5cdCAqICAgICAgICAgIGV4dHJhY3RlZCBhcHAgc3RhdGUsIHRoZSBzdGFydHVwIHBhcmFtZXRlcnMsIGFuZCB0aGUgdHlwZSBvZiBuYXZpZ2F0aW9uIGFyZSByZXR1cm5lZCwgc2VlIGFsc28gdGhlIGV4YW1wbGUgYWJvdmUuIFRoZSBhcHAgc3RhdGUgaXNcblx0ICogICAgICAgICAgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjpcblx0ICogICAgICAgICAgPHVsPlxuXHQgKiAgICAgICAgICA8bGk+PGNvZGU+b0FwcERhdGEub1NlbGVjdGlvblZhcmlhbnQ8L2NvZGU+OiBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uU2VsZWN0aW9uVmFyaWFudH1cblx0ICogICAgICAgICAgY29udGFpbmluZyBvbmx5IHBhcmFtZXRlcnMvc2VsZWN0IG9wdGlvbnMgdGhhdCBhcmUgcmVsYXRlZCB0byBuYXZpZ2F0aW9uPC9saT5cblx0ICogICAgICAgICAgPGxpPjxjb2RlPm9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQ8L2NvZGU+OiBUaGUgbmF2aWdhdGlvbi1yZWxhdGVkIHNlbGVjdGlvbiB2YXJpYW50IGFzIGEgSlNPTi1mb3JtYXR0ZWQgc3RyaW5nPC9saT5cblx0ICogICAgICAgICAgPGxpPjxjb2RlPm9BcHBEYXRhLm9EZWZhdWx0ZWRTZWxlY3Rpb25WYXJpYW50PC9jb2RlPjogQW4gaW5zdGFuY2Ugb2Zcblx0ICogICAgICAgICAge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLlNlbGVjdGlvblZhcmlhbnR9IGNvbnRhaW5pbmcgb25seSB0aGUgcGFyYW1ldGVycy9zZWxlY3Qgb3B0aW9ucyB0aGF0IGFyZSBzZXQgYnkgdXNlclxuXHQgKiAgICAgICAgICBkZWZhdWx0IGRhdGE8L2xpPlxuXHQgKiAgICAgICAgICA8bGk+PGNvZGU+b0FwcERhdGEuYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seTwvY29kZT46IEEgQm9vbGVhbiBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgb25seSBkZWZhdWx0ZWQgcGFyYW1ldGVycyBhbmQgbm9cblx0ICogICAgICAgICAgbmF2aWdhdGlvbiBwYXJhbWV0ZXJzIGFyZSBwcmVzZW50Ljxicj5cblx0ICogICAgICAgICAgPGI+Tm90ZTo8L2I+IElmIG5vIG5hdmlnYXRpb24gcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlLCA8Y29kZT5iTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5PC9jb2RlPiBpcyBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sXG5cdCAqICAgICAgICAgIGV2ZW4gdGhvdWdoIHBhcmFtZXRlcnMgd2l0aG91dCBkZWZhdWx0IG1pZ2h0IGJlIGF2YWlsYWJsZSBhcyB3ZWxsLjwvbGk+XG5cdCAqICAgICAgICAgIDwvdWw+XG5cdCAqICAgICAgICAgIElmIHRoZSBuYXZpZ2F0aW9uLXJlbGF0ZWQgc2VsZWN0aW9uIHZhcmlhbnQgaXMgZW1wdHksIGl0IGlzIHJlcGxhY2VkIGJ5IGEgY29weSBvZiB0aGUgZGVmYXVsdGVkIHNlbGVjdGlvbiB2YXJpYW50Ljxicj5cblx0ICogICAgICAgICAgVGhlIG5hdmlnYXRpb24gdHlwZSBpcyBhbiBlbnVtZXJhdGlvbiB0eXBlIG9mIHR5cGUge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdlR5cGV9IChwb3NzaWJsZSB2YWx1ZXMgYXJlXG5cdCAqICAgICAgICAgIGluaXRpYWwsIFVSTFBhcmFtcywgeEFwcFN0YXRlLCBhbmQgaUFwcFN0YXRlKS48YnI+XG5cdCAqICAgICAgICAgIDxiPk5vdGU6PC9iPiBJZiB0aGUgbmF2aWdhdGlvbiB0eXBlIGlzIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZUeXBlLmlBcHBTdGF0ZX0gb0FwcERhdGEgaGFzIHR3b1xuXHQgKiAgICAgICAgICBhZGRpdGlvbmFsIHByb3BlcnRpZXNcblx0ICogICAgICAgICAgPHVsPlxuXHQgKiAgICAgICAgICA8bGk+PGNvZGU+b0FwcERhdGEudGFibGVWYXJpYW50SWQ8L2NvZGU+PC9saT5cblx0ICogICAgICAgICAgPGxpPjxjb2RlPm9BcHBEYXRhLmN1c3RvbURhdGE8L2NvZGU+PC9saT5cblx0ICogICAgICAgICAgPC91bD5cblx0ICogICAgICAgICAgd2hpY2ggcmV0dXJuIHRoZSBpbm5lciBhcHAgZGF0YSBhcyBzdG9yZWQgaW4ge0BsaW5rICMubmF2aWdhdGUgbmF2aWdhdGV9IG9yIHtAbGluayAjLnN0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jIHN0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jfS5cblx0ICogICAgICAgICAgPGNvZGU+b0FwcERhdGEub0RlZmF1bHRlZFNlbGVjdGlvblZhcmlhbnQ8L2NvZGU+IGlzIHBvcHVsYXRlZCB3aXRoIHRoZSB1c2VyIGRlZmF1bHQgdmFsdWVzIHdoZW4gdGhleSBhcmVcblx0ICogICAgICAgICAgYXZhaWxhYmxlIChmZXRjaGVkIGZyb20gdGhlIGNyb3NzLWFwcCBzdGF0ZSksIG90aGVyd2lzZSBpdCBpcyBhbiBlbXB0eSBzZWxlY3Rpb24gdmFyaWFudCwgYW5kXG5cdCAqICAgICAgICAgIDxjb2RlPm9BcHBEYXRhLmJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHk8L2NvZGU+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+IHtcblx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXM7XG5cdFx0cmV0dXJuIHRoaXMuX2ZuU2F2ZUFwcFN0YXRlQXN5bmMob0FwcERhdGEsIGZuT25FcnJvcikudGhlbihmdW5jdGlvbiAoXG5cdFx0XHRvUmV0dXJuOiBTaGVsbEFwcFN0YXRlUmV0dXJuIHwgdW5kZWZpbmVkIHwgdm9pZFxuXHRcdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0XHRpZiAob1JldHVybikge1xuXHRcdFx0XHRvTmF2SGFuZGxlci5fZm5IYW5kbGVBcHBTdGF0ZVByb21pc2Uob1JldHVybiwgZm5PbkFmdGVyU2F2ZSwgZm5PbkVycm9yKTtcblx0XHRcdFx0cmV0dXJuIG9SZXR1cm4uYXBwU3RhdGVLZXk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fSk7XG5cdH1cblxuXHRfc2F2ZUFwcFN0YXRlKG9BcHBEYXRhOiBJbm5lckFwcERhdGEsIGZuT25BZnRlclNhdmU6IEZ1bmN0aW9uLCBmbk9uRXJyb3I6IEZ1bmN0aW9uKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvUmV0dXJuID0gdGhpcy5fc2F2ZUFwcFN0YXRlV2l0aEltbWVkaWF0ZVJldHVybihvQXBwRGF0YSwgZm5PbkVycm9yKTtcblx0XHRpZiAob1JldHVybikge1xuXHRcdFx0dGhpcy5fZm5IYW5kbGVBcHBTdGF0ZVByb21pc2Uob1JldHVybiwgZm5PbkFmdGVyU2F2ZSwgZm5PbkVycm9yKTtcblx0XHRcdHJldHVybiBvUmV0dXJuLmFwcFN0YXRlS2V5O1xuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRfZm5TYXZlQXBwU3RhdGVXaXRoSW1tZWRpYXRlUmV0dXJuKFxuXHRcdG9BcHBEYXRhOiBJbm5lckFwcERhdGEsXG5cdFx0b0FwcFN0YXRlOiBTaGVsbEFwcFN0YXRlLFxuXHRcdGZuT25FcnJvcj86IEZ1bmN0aW9uXG5cdCk6IHsgYXBwU3RhdGVLZXk6IHN0cmluZzsgcHJvbWlzZTogSlF1ZXJ5LlByb21pc2U8c3RyaW5nPiB9IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvQXBwU3RhdGVQcm9taXNlID0galF1ZXJ5LkRlZmVycmVkKCk7XG5cdFx0Y29uc3Qgc0FwcFN0YXRlS2V5ID0gb0FwcFN0YXRlLmdldEtleSgpO1xuXHRcdGNvbnN0IG9BcHBEYXRhRm9yU2F2ZSA9IHRoaXMuX2ZldGNoQXBwRGF0YUZvclNhdmUob0FwcERhdGEsIGZuT25FcnJvcik7XG5cdFx0aWYgKCFvQXBwRGF0YUZvclNhdmUpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdG9BcHBTdGF0ZS5zZXREYXRhKG9BcHBEYXRhRm9yU2F2ZSk7XG5cdFx0b0FwcFN0YXRlXG5cdFx0XHQuc2F2ZSgpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdG9BcHBTdGF0ZVByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3IpIHtcblx0XHRcdFx0b0FwcFN0YXRlUHJvbWlzZS5yZWplY3Qob0Vycm9yKTtcblx0XHRcdH0pO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGFwcFN0YXRlS2V5OiBzQXBwU3RhdGVLZXksXG5cdFx0XHRwcm9taXNlOiBvQXBwU3RhdGVQcm9taXNlLnByb21pc2UoKVxuXHRcdH07XG5cdH1cblxuXHRfZmV0Y2hBcHBEYXRhRm9yU2F2ZShvQXBwRGF0YTogSW5uZXJBcHBEYXRhLCBmbk9uRXJyb3I6IGFueSk6IElubmVyQXBwRGF0YSB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IG9BcHBEYXRhRm9yU2F2ZTogUGFydGlhbDxJbm5lckFwcERhdGE+ID0ge307XG5cblx0XHRpZiAob0FwcERhdGEuaGFzT3duUHJvcGVydHkoXCJzZWxlY3Rpb25WYXJpYW50XCIpKSB7XG5cdFx0XHRvQXBwRGF0YUZvclNhdmUuc2VsZWN0aW9uVmFyaWFudCA9IG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQ7XG5cblx0XHRcdGlmIChvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0XHRcdC8qXG5cdFx0XHRcdCAqIFRoZSBzcGVjaWZpY2F0aW9uIHN0YXRlcyB0aGF0IFNlbGVjdGlvbiBWYXJpYW50cyBuZWVkIHRvIGJlIEpTT04gb2JqZWN0cy4gSG93ZXZlciwgaW50ZXJuYWxseSwgd2Ugd29yayB3aXRoIHN0cmluZ3MgZm9yXG5cdFx0XHRcdCAqIFwic2VsZWN0aW9uVmFyaWFudFwiLiBUaGVyZWZvcmUsIGluIGNhc2UgdGhhdCB0aGlzIGlzIGEgc3RyaW5nLCB3ZSBuZWVkIHRvIEpTT04tcGFyc2UgdGhlIGRhdGEuXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRpZiAodHlwZW9mIG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0b0FwcERhdGFGb3JTYXZlLnNlbGVjdGlvblZhcmlhbnQgPSBKU09OLnBhcnNlKG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKHgpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9FcnJvciA9IHRoaXMuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuQXBwU3RhdGVTYXZlLnBhcnNlRXJyb3JcIik7XG5cdFx0XHRcdFx0XHRpZiAoZm5PbkVycm9yKSB7XG5cdFx0XHRcdFx0XHRcdGZuT25FcnJvcihvRXJyb3IpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5fc01vZGUgPT09IE1vZGUuT0RhdGFWMikge1xuXHRcdFx0b0FwcERhdGFGb3JTYXZlID0gZXh0ZW5kKFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0c2VsZWN0aW9uVmFyaWFudDoge30sXG5cdFx0XHRcdFx0dGFibGVWYXJpYW50SWQ6IFwiXCIsXG5cdFx0XHRcdFx0Y3VzdG9tRGF0YToge31cblx0XHRcdFx0fSxcblx0XHRcdFx0b0FwcERhdGFGb3JTYXZlXG5cdFx0XHQpIGFzIElubmVyQXBwRGF0YTtcblxuXHRcdFx0aWYgKG9BcHBEYXRhLnRhYmxlVmFyaWFudElkKSB7XG5cdFx0XHRcdG9BcHBEYXRhRm9yU2F2ZS50YWJsZVZhcmlhbnRJZCA9IG9BcHBEYXRhLnRhYmxlVmFyaWFudElkO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9BcHBEYXRhLmN1c3RvbURhdGEpIHtcblx0XHRcdFx0b0FwcERhdGFGb3JTYXZlLmN1c3RvbURhdGEgPSBvQXBwRGF0YS5jdXN0b21EYXRhO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9BcHBEYXRhLnByZXNlbnRhdGlvblZhcmlhbnQpIHtcblx0XHRcdFx0b0FwcERhdGFGb3JTYXZlLnByZXNlbnRhdGlvblZhcmlhbnQgPSBvQXBwRGF0YS5wcmVzZW50YXRpb25WYXJpYW50O1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9BcHBEYXRhLnZhbHVlVGV4dHMpIHtcblx0XHRcdFx0b0FwcERhdGFGb3JTYXZlLnZhbHVlVGV4dHMgPSBvQXBwRGF0YS52YWx1ZVRleHRzO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9BcHBEYXRhLnNlbWFudGljRGF0ZXMpIHtcblx0XHRcdFx0b0FwcERhdGFGb3JTYXZlLnNlbWFudGljRGF0ZXMgPSBvQXBwRGF0YS5zZW1hbnRpY0RhdGVzO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBvQXBwRGF0YUNsb25lID0gT2JqZWN0LmFzc2lnbih7fSwgb0FwcERhdGEpO1xuXHRcdFx0b0FwcERhdGFGb3JTYXZlID0gbWVyZ2Uob0FwcERhdGFDbG9uZSwgb0FwcERhdGFGb3JTYXZlKTtcblx0XHR9XG5cdFx0b0FwcERhdGFGb3JTYXZlID0gdGhpcy5fY2hlY2tJc1BvdGVudGlhbGx5U2Vuc2l0aXZlKG9BcHBEYXRhRm9yU2F2ZSkgYXMgSW5uZXJBcHBEYXRhO1xuXHRcdHJldHVybiBvQXBwRGF0YUZvclNhdmUgYXMgSW5uZXJBcHBEYXRhO1xuXHR9XG5cblx0YXN5bmMgX2ZuU2F2ZUFwcFN0YXRlQXN5bmMob0FwcERhdGE6IGFueSwgZm5PbkVycm9yPzogYW55KTogUHJvbWlzZTxTaGVsbEFwcFN0YXRlUmV0dXJuIHwgdW5kZWZpbmVkIHwgdm9pZD4ge1xuXHRcdGNvbnN0IG9OYXZIYW5kbGVyID0gdGhpcztcblx0XHRyZXR1cm4gdGhpcy5fZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2VBc3luYygpXG5cdFx0XHQudGhlbihhc3luYyBmdW5jdGlvbiAob0Nyb3NzQXBwTmF2U2VydmljZTogTmF2aWdhdGlvbik6IFByb21pc2U8U2hlbGxBcHBTdGF0ZT4ge1xuXHRcdFx0XHRyZXR1cm4gb0Nyb3NzQXBwTmF2U2VydmljZS5jcmVhdGVFbXB0eUFwcFN0YXRlKG9OYXZIYW5kbGVyLm9Db21wb25lbnQpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvQXBwU3RhdGU6IFNoZWxsQXBwU3RhdGUpIHtcblx0XHRcdFx0cmV0dXJuIG9OYXZIYW5kbGVyLl9mblNhdmVBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4ob0FwcERhdGEsIG9BcHBTdGF0ZSwgZm5PbkVycm9yKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcikge1xuXHRcdFx0XHRpZiAoZm5PbkVycm9yKSB7XG5cdFx0XHRcdFx0Zm5PbkVycm9yKG9FcnJvcik7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHR9XG5cblx0X3NhdmVBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4ob0FwcERhdGE6IElubmVyQXBwRGF0YSwgZm5PbkVycm9yPzogRnVuY3Rpb24pOiBTaGVsbEFwcFN0YXRlUmV0dXJuIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvQXBwU3RhdGUgPSB0aGlzLl9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZSgpLmNyZWF0ZUVtcHR5QXBwU3RhdGUodGhpcy5vQ29tcG9uZW50KTtcblx0XHRyZXR1cm4gdGhpcy5fZm5TYXZlQXBwU3RhdGVXaXRoSW1tZWRpYXRlUmV0dXJuKG9BcHBEYXRhLCBvQXBwU3RhdGUsIGZuT25FcnJvcik7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBsb2FkZWQgSUFwcCBTdGF0ZSBhbmQgbmF2aWdhdGlvbiB0eXBlIG9uY2UgcmVzb2x2ZWQuXG5cdCAqIEBwYXJhbSBzQXBwU3RhdGVLZXkgVGhlIElBcHBTdGF0ZUtleSB0byByZXRyaWV2ZSB0aGUgQXBwU3RhdGUgZGF0YS5cblx0ICogQHBhcmFtIG9EZWZlcnJlZCBKcXVlcnkgZGVmZXJyZWQgb2JqZWN0IHRvIHJlc29sdmUgdGhlIEFwcFN0YXRlIGRhdGEuXG5cdCAqIEBwYXJhbSBuYXZUeXBlIE5hdmlnYXRpb24gdHlwZSBmb3Igd2hpY2ggQXBwU3RhdGUgaXMgcmV0cmlldmVkLlxuXHQgKiBAcmV0dXJucyBUaGUgZGVmZXJyZWQgb2JqZWN0IHdoaWNoIGlzIHJlc29sdmVkIHdpdGggbG9hZGVkIGFwcCBzdGF0ZSBkYXRhXG5cdCBhbmQgbmF2aWdhdGlvbiB0eXBlLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2xvYWRBcHBTdGF0ZShzQXBwU3RhdGVLZXk6IHN0cmluZywgb0RlZmVycmVkOiBKUXVlcnkuRGVmZXJyZWQ8dW5rbm93bj4sIG5hdlR5cGU6IHN0cmluZyk6IEpRdWVyeS5EZWZlcnJlZDx1bmtub3duPiB7XG5cdFx0Y29uc3Qgb05hdkhhbmRsZXIgPSB0aGlzO1xuXHRcdHRoaXMuX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlQXN5bmMoKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9Dcm9zc0FwcE5hdlNlcnZpY2U6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0Nyb3NzQXBwTmF2U2VydmljZS5nZXRBcHBTdGF0ZShvTmF2SGFuZGxlci5vQ29tcG9uZW50LCBzQXBwU3RhdGVLZXkpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGNvbnN0IG9FcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLl9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZUFzeW5jLmZhaWxlZFwiKTtcblx0XHRcdFx0b0RlZmVycmVkLnJlamVjdChvRXJyb3IsIHt9LCBuYXZUeXBlKTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob0FwcFN0YXRlOiBhbnkpIHtcblx0XHRcdFx0bGV0IG9BcHBEYXRhOiBhbnkgPSB7fTtcblx0XHRcdFx0Y29uc3Qgb0FwcERhdGFMb2FkZWQgPSBvQXBwU3RhdGUuZ2V0RGF0YSgpO1xuXG5cdFx0XHRcdGlmICh0eXBlb2Ygb0FwcERhdGFMb2FkZWQgPT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHRcdFx0XHRjb25zdCBvRXJyb3IgPSBvTmF2SGFuZGxlci5fY3JlYXRlVGVjaG5pY2FsRXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5nZXREYXRhRnJvbUFwcFN0YXRlLmZhaWxlZFwiKTtcblx0XHRcdFx0XHRvRGVmZXJyZWQucmVqZWN0KG9FcnJvciwge30sIG5hdlR5cGUpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fSBlbHNlIGlmIChvTmF2SGFuZGxlci5fc01vZGUgPT09IE1vZGUuT0RhdGFWMikge1xuXHRcdFx0XHRcdG9BcHBEYXRhID0ge1xuXHRcdFx0XHRcdFx0c2VsZWN0aW9uVmFyaWFudDogXCJ7fVwiLFxuXHRcdFx0XHRcdFx0b1NlbGVjdGlvblZhcmlhbnQ6IG5ldyBTZWxlY3Rpb25WYXJpYW50KCksXG5cdFx0XHRcdFx0XHRvRGVmYXVsdGVkU2VsZWN0aW9uVmFyaWFudDogbmV3IFNlbGVjdGlvblZhcmlhbnQoKSxcblx0XHRcdFx0XHRcdGJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHk6IGZhbHNlLFxuXHRcdFx0XHRcdFx0dGFibGVWYXJpYW50SWQ6IFwiXCIsXG5cdFx0XHRcdFx0XHRjdXN0b21EYXRhOiB7fSxcblx0XHRcdFx0XHRcdGFwcFN0YXRlS2V5OiBzQXBwU3RhdGVLZXksXG5cdFx0XHRcdFx0XHRwcmVzZW50YXRpb25WYXJpYW50OiB7fSxcblx0XHRcdFx0XHRcdHZhbHVlVGV4dHM6IHt9LFxuXHRcdFx0XHRcdFx0c2VtYW50aWNEYXRlczoge30sXG5cdFx0XHRcdFx0XHRkYXRhOiB7fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0aWYgKG9BcHBEYXRhTG9hZGVkLnNlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRcdFx0XHRcdC8qXG5cdFx0XHRcdFx0XHQgKiBJbiBjYXNlIHRoYXQgd2UgZ2V0IGFuIG9iamVjdCBmcm9tIHRoZSBzdG9yZWQgQXBwRGF0YSAoPXBlcnNpc3RlbmN5KSwgd2UgbmVlZCB0byBzdHJpbmdpZnkgdGhlIEpTT04gb2JqZWN0LlxuXHRcdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0XHRvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50ID0gb05hdkhhbmRsZXIuX2Vuc3VyZVNlbGVjdGlvblZhcmlhbnRGb3JtYXRTdHJpbmcob0FwcERhdGFMb2FkZWQuc2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0XHRcdFx0XHRvQXBwRGF0YS5vU2VsZWN0aW9uVmFyaWFudCA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAob0FwcERhdGFMb2FkZWQudGFibGVWYXJpYW50SWQpIHtcblx0XHRcdFx0XHRcdG9BcHBEYXRhLnRhYmxlVmFyaWFudElkID0gb0FwcERhdGFMb2FkZWQudGFibGVWYXJpYW50SWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChvQXBwRGF0YUxvYWRlZC5jdXN0b21EYXRhKSB7XG5cdFx0XHRcdFx0XHRvQXBwRGF0YS5jdXN0b21EYXRhID0gb0FwcERhdGFMb2FkZWQuY3VzdG9tRGF0YTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG9BcHBEYXRhTG9hZGVkLnByZXNlbnRhdGlvblZhcmlhbnQpIHtcblx0XHRcdFx0XHRcdG9BcHBEYXRhLnByZXNlbnRhdGlvblZhcmlhbnQgPSBvQXBwRGF0YUxvYWRlZC5wcmVzZW50YXRpb25WYXJpYW50O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAob0FwcERhdGFMb2FkZWQudmFsdWVUZXh0cykge1xuXHRcdFx0XHRcdFx0b0FwcERhdGEudmFsdWVUZXh0cyA9IG9BcHBEYXRhTG9hZGVkLnZhbHVlVGV4dHM7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChvQXBwRGF0YUxvYWRlZC5zZW1hbnRpY0RhdGVzKSB7XG5cdFx0XHRcdFx0XHRvQXBwRGF0YS5zZW1hbnRpY0RhdGVzID0gb0FwcERhdGFMb2FkZWQuc2VtYW50aWNEYXRlcztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LyogSW4gVjIgY2FzZSwgd2UgbmVlZCB0aGUgZGF0YSBpbiB0aGUgYmVsb3cgZm9ybWF0IGZvciBoeWJyaWQgY2FzZSAqL1xuXHRcdFx0XHRcdGlmIChuYXZUeXBlID09PSBOYXZUeXBlLmh5YnJpZCkge1xuXHRcdFx0XHRcdFx0b0FwcERhdGEuZGF0YSA9IG9BcHBEYXRhTG9hZGVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvQXBwRGF0YSA9IG1lcmdlKG9BcHBEYXRhLCBvQXBwRGF0YUxvYWRlZCk7XG5cdFx0XHRcdFx0aWYgKG9BcHBEYXRhTG9hZGVkLnNlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRcdFx0XHRcdC8qXG5cdFx0XHRcdFx0XHQgKiBJbiBjYXNlIHRoYXQgd2UgZ2V0IGFuIG9iamVjdCBmcm9tIHRoZSBzdG9yZWQgQXBwRGF0YSAoPXBlcnNpc3RlbmN5KSwgd2UgbmVlZCB0byBzdHJpbmdpZnkgdGhlIEpTT04gb2JqZWN0LlxuXHRcdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0XHRvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50ID0gb05hdkhhbmRsZXIuX2Vuc3VyZVNlbGVjdGlvblZhcmlhbnRGb3JtYXRTdHJpbmcob0FwcERhdGFMb2FkZWQuc2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0XHRcdFx0XHRvQXBwRGF0YS5vU2VsZWN0aW9uVmFyaWFudCA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE9uIGFuIGlBcHBTdGF0ZSByZWxvYWQgKEY1KSwgRkxQIHN0aWxsIHBhc3NlcyB0aGUgZGVmYXVsdGVkIHBhcmFtZXRlciBuYW1lcyBidXQgbm90IHRoZWlyXG5cdFx0XHRcdC8vIHZhbHVlcywgc28gb0RlZmF1bHRlZFNlbGVjdGlvblZhcmlhbnQgd291bGQgYmUgZW1wdHkuIFJlLWZldGNoIHRoZSBvcmlnaW5hbCBkZWZhdWx0cyBmcm9tIHRoZVxuXHRcdFx0XHQvLyB4QXBwU3RhdGUuIFRoaXMgcnVucyBhZnRlciB0aGUgVjIvVjQgaWYvZWxzZSBzbyBpdCBhcHBsaWVzIHRvIGJvdGggT0RhdGFWMiAoRkV2MikgYW5kIFY0IGFwcHNcblx0XHRcdFx0Ly8gKGl0IHdhcyBwcmV2aW91c2x5IGluc2lkZSB0aGUgVjQgYnJhbmNoIG9ubHksIHdoaWNoIG1pc3NlZCB0aGUgT0RhdGFWMiBwYXRoKS5cblx0XHRcdFx0aWYgKG5hdlR5cGUgPT09IE5hdlR5cGUuaUFwcFN0YXRlKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0NvbXBvbmVudERhdGEgPSBvTmF2SGFuZGxlci5vQ29tcG9uZW50LmdldENvbXBvbmVudERhdGEoKSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXHRcdFx0XHRcdGNvbnN0IG9TdGFydHVwUGFyYW1ldGVycyA9IG9Db21wb25lbnREYXRhPy5zdGFydHVwUGFyYW1ldGVycyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXHRcdFx0XHRcdGNvbnN0IGJIYXNEZWZhdWx0ZWRQYXJhbXMgPSBvU3RhcnR1cFBhcmFtZXRlcnM/LltERUZBVUxURURfUEFSQU1FVEVSX1BST1BFUlRZXT8ubGVuZ3RoID4gMDtcblx0XHRcdFx0XHRjb25zdCBiSGFzWEFwcFN0YXRlID0gb0NvbXBvbmVudERhdGE/LltcInNhcC14YXBwLXN0YXRlXCJdICE9PSB1bmRlZmluZWQ7XG5cblx0XHRcdFx0XHRpZiAoYkhhc0RlZmF1bHRlZFBhcmFtcyAmJiBiSGFzWEFwcFN0YXRlKSB7XG5cdFx0XHRcdFx0XHRvTmF2SGFuZGxlci5fZW5yaWNoRGVmYXVsdGVkU2VsZWN0aW9uVmFyaWFudChcblx0XHRcdFx0XHRcdFx0b0FwcERhdGEsXG5cdFx0XHRcdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVyc1tERUZBVUxURURfUEFSQU1FVEVSX1BST1BFUlRZXVswXSxcblx0XHRcdFx0XHRcdFx0b0RlZmVycmVkLFxuXHRcdFx0XHRcdFx0XHRuYXZUeXBlXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIHJlc29sdmUgaXMgY2FsbGVkIG9uIHBhc3NlZCBEZWZlcnJlZCBvYmplY3QgdG8gdHJpZ2dlciBhIGNhbGwgb2YgdGhlIGRvbmUgbWV0aG9kLCBpZiBpbXBsZW1lbnRlZFxuXHRcdFx0XHQvLyB0aGUgZG9uZSBtZXRob2Qgd2lsbCByZWNlaXZlIHRoZSBsb2FkZWQgYXBwU3RhdGUgYW5kIHRoZSBuYXZpZ2F0aW9uIHR5cGUgYXMgcGFyYW1ldGVyc1xuXHRcdFx0XHRvRGVmZXJyZWQucmVzb2x2ZShvQXBwRGF0YSwge30sIG5hdlR5cGUpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Y29uc3Qgb0Vycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuZ2V0QXBwU3RhdGUuZmFpbGVkXCIpO1xuXHRcdFx0XHRvRGVmZXJyZWQucmVqZWN0KG9FcnJvciwge30sIG5hdlR5cGUpO1xuXHRcdFx0fSk7XG5cblx0XHRyZXR1cm4gb0RlZmVycmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEZldGNoZXMgdGhlIG9yaWdpbmFsIEZMUCBkZWZhdWx0IHZhbHVlcyBmcm9tIHRoZSB4QXBwU3RhdGUgYW5kIGVucmljaGVzIG9BcHBEYXRhIHdpdGggb0RlZmF1bHRlZFNlbGVjdGlvblZhcmlhbnQuXG5cdCAqIEBwYXJhbSBvQXBwRGF0YSBUaGUgYXBwIGRhdGEgb2JqZWN0IHRvIGVucmljaC5cblx0ICogQHBhcmFtIHNEZWZhdWx0ZWRQYXJhbWV0ZXJzSnNvbiBUaGUgcmF3IEpTT04gc3RyaW5nIG9mIGRlZmF1bHRlZCBwYXJhbWV0ZXIgbmFtZXMgZnJvbSBGTFAuXG5cdCAqIEBwYXJhbSBvRGVmZXJyZWQgVGhlIGRlZmVycmVkIHRvIHJlc29sdmUgYWZ0ZXIgZW5yaWNobWVudC5cblx0ICogQHBhcmFtIG5hdlR5cGUgVGhlIG5hdmlnYXRpb24gdHlwZS5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdGFzeW5jIF9lbnJpY2hEZWZhdWx0ZWRTZWxlY3Rpb25WYXJpYW50KFxuXHRcdG9BcHBEYXRhOiBhbnksXG5cdFx0c0RlZmF1bHRlZFBhcmFtZXRlcnNKc29uOiBzdHJpbmcsXG5cdFx0b0RlZmVycmVkOiBKUXVlcnkuRGVmZXJyZWQ8dW5rbm93bj4sXG5cdFx0bmF2VHlwZTogc3RyaW5nXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBhRGVmYXVsdGVkUGFyYW1ldGVyczogc3RyaW5nW10gPSBKU09OLnBhcnNlKHNEZWZhdWx0ZWRQYXJhbWV0ZXJzSnNvbik7XG5cdFx0XHRjb25zdCBvQ3Jvc3NBcHBOYXZTZXJ2aWNlOiBhbnkgPSBhd2FpdCB0aGlzLl9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZUFzeW5jKCk7XG5cdFx0XHRjb25zdCBvWEFwcFN0YXRlOiBhbnkgPSBhd2FpdCBvQ3Jvc3NBcHBOYXZTZXJ2aWNlLmdldFN0YXJ0dXBBcHBTdGF0ZSh0aGlzLm9Db21wb25lbnQpO1xuXHRcdFx0Y29uc3Qgb1hBcHBTdGF0ZURhdGEgPSBvWEFwcFN0YXRlLmdldERhdGEoKTtcblx0XHRcdGlmIChvWEFwcFN0YXRlRGF0YT8uc2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdFx0XHRjb25zdCBvWEFwcFNlbFZhciA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KG9YQXBwU3RhdGVEYXRhLnNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdFx0XHRjb25zdCBvRGVmYXVsdGVkU2VsVmFyID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoKTtcblx0XHRcdFx0Zm9yIChjb25zdCBzUGFyYW1OYW1lIG9mIGFEZWZhdWx0ZWRQYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0aWYgKHRoaXMuX2lzVGVjaG5pY2FsUGFyYW1ldGVyKHNQYXJhbU5hbWUpKSB7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgYVJhbmdlcyA9IG9YQXBwU2VsVmFyLmdldFNlbGVjdE9wdGlvbihzUGFyYW1OYW1lKTtcblx0XHRcdFx0XHRpZiAoYVJhbmdlcykge1xuXHRcdFx0XHRcdFx0b0RlZmF1bHRlZFNlbFZhci5tYXNzQWRkU2VsZWN0T3B0aW9uKHNQYXJhbU5hbWUsIGFSYW5nZXMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIW9EZWZhdWx0ZWRTZWxWYXIuaXNFbXB0eSgpKSB7XG5cdFx0XHRcdFx0b0FwcERhdGEub0RlZmF1bHRlZFNlbGVjdGlvblZhcmlhbnQgPSBvRGVmYXVsdGVkU2VsVmFyO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlcjogRmFpbGVkIHRvIGVucmljaCBkZWZhdWx0ZWQgc2VsZWN0aW9uIHZhcmlhbnQuXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdH1cblx0XHRvRGVmZXJyZWQucmVzb2x2ZShvQXBwRGF0YSwge30sIG5hdlR5cGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgcGFyYW1ldGVyIHZhbHVlIG9mIHRoZSBzYXAtaWFwcC1zdGF0ZSAodGhlIGludGVybmFsIGFwcHMpIGZyb20gdGhlIEFwcEhhc2ggc3RyaW5nLiBJdCBhdXRvbWF0aWNhbGx5IHRha2VzIGNhcmUgYWJvdXRcblx0ICogY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHRoZSBvbGQgYW5kIHRoZSBuZXcgYXBwcm9hY2ggb2YgdGhlIHNhcC1pYXBwLXN0YXRlLiBQcmVjZWRlbmNlIGlzIHRoYXQgdGhlIG5ldyBhcHByb2FjaCBpcyBmYXZvdXJlZCBhZ2FpbnN0IHRoZSBvbGRcblx0ICogYXBwcm9hY2guXG5cdCAqIEBwYXJhbSBzQXBwSGFzaCBUaGUgQXBwSGFzaCwgd2hpY2ggbWF5IGNvbnRhaW4gYSBzYXAtaWFwcC1zdGF0ZSBwYXJhbWV0ZXIgKGJvdGggb2xkIGFuZC9vciBuZXcgYXBwcm9hY2gpXG5cdCAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiBzYXAtaWFwcC1zdGF0ZSAoaS5lLiB0aGUgbmFtZSBvZiB0aGUgY29udGFpbmVyIHRvIHJldHJpZXZlIHRoZSBwYXJhbWV0ZXJzKSwgb3IgPGNvZGU+dW5kZWZpbmVkPC9jb2RlPiBpblxuXHQgKiAgICAgICAgIGNhc2UgdGhhdCBubyBzYXAtaWFwcC1zdGF0ZSB3YXMgZm91bmQgaW4gPGNvZGU+c0FwcEhhc2g8L2NvZGU+LlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2dldElubmVyQXBwU3RhdGVLZXkoc0FwcEhhc2g6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Ly8gdHJpdmlhbCBjYXNlOiBubyBhcHAgaGFzaCBhdmFpbGFibGUgYXQgYWxsLlxuXHRcdGlmICghc0FwcEhhc2gpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0LyogbmV3IGFwcHJvYWNoOiBzZXBhcmF0ZWQgdmlhIHF1ZXN0aW9uIG1hcmsgLyBwYXJ0IG9mIHRoZSBxdWVyeSBwYXJhbWV0ZXIgb2YgdGhlIEFwcEhhc2ggKi9cblx0XHRsZXQgYU1hdGNoZXMgPSB0aGlzLl9ySUFwcFN0YXRlTmV3LmV4ZWMoc0FwcEhhc2gpO1xuXG5cdFx0Lyogb2xkIGFwcHJvYWNoOiBzcGVhcmF0ZWQgdmlhIHNsYXNoZXMgLyBpLmUuIHBhcnQgb2YgdGhlIHJvdXRlIGl0c2VsZiAqL1xuXHRcdGlmIChhTWF0Y2hlcyA9PT0gbnVsbCkge1xuXHRcdFx0YU1hdGNoZXMgPSB0aGlzLl9ySUFwcFN0YXRlT2xkLmV4ZWMoc0FwcEhhc2gpO1xuXHRcdH1cblxuXHRcdC8qXG5cdFx0ICogb2xkIGFwcHJvYWNoOiBzcGVjaWFsIGNhc2U6IGlmIHRoZXJlIGlzIG5vIGRlZXAgcm91dGUva2V5IGRlZmluZWQsIHRoZSBzYXAtaWFwcC1zdGF0ZSBtYXkgYmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLCB3aXRob3V0XG5cdFx0ICogYW55IHNlcGFyYXRpb24gd2l0aCB0aGUgc2xhc2hlc1xuXHRcdCAqL1xuXHRcdGlmIChhTWF0Y2hlcyA9PT0gbnVsbCkge1xuXHRcdFx0YU1hdGNoZXMgPSB0aGlzLl9ySUFwcFN0YXRlT2xkQXRTdGFydC5leGVjKHNBcHBIYXNoKTtcblx0XHR9XG5cblx0XHRpZiAoYU1hdGNoZXMgPT09IG51bGwpIHtcblx0XHRcdC8vIHRoZXJlIGlzIG5vICh2YWxpZCkgc2FwLWlhcHAtc3RhdGUgaW4gdGhlIEFwcCBIYXNoXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiBhTWF0Y2hlc1sxXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXBsYWNlcyAob3IgaW5zZXJ0cykgYSBwYXJhbWV0ZXIgdmFsdWUgKGFuIEFwcFN0YXRlS2V5KSBmb3IgdGhlIHNhcC1pYXBwLXN0YXRlIGludG8gYW4gZXhpc3RpbmcgQXBwSGFzaCBzdHJpbmcuIE90aGVyIHJvdXRlcy9wYXJhbWV0ZXJzXG5cdCAqIGFyZSBpZ25vcmVkIGFuZCByZXR1cm5lZCB3aXRob3V0IG1vZGlmaWNhdGlvbiAoXCJlbnZpcm9ubWVudGFsIGFnbm9zdGljXCIgcHJvcGVydHkpLiBPbmx5IHRoZSBuZXcgYXBwcm9hY2ggKHNhcC1pYXBwLXN0YXRlIGFzIHF1ZXJ5IHBhcmFtZXRlclxuXHQgKiBpbiB0aGUgQXBwSGFzaCkgaXMgYmVpbmcgaXNzdWVkLlxuXHQgKiBAcGFyYW0gc0FwcEhhc2ggVGhlIEFwcEhhc2ggaW50byB3aGljaCB0aGUgc2FwLWlhcHAtc3RhdGUgcGFyYW1ldGVyIHNoYWxsIGJlIG1hZGUgYXZhaWxhYmxlXG5cdCAqIEBwYXJhbSBzQXBwU3RhdGVLZXkgVGhlIGtleSB2YWx1ZSBvZiB0aGUgQXBwU3RhdGUgd2hpY2ggc2hhbGwgYmUgc3RvcmVkIGFzIHBhcmFtZXRlciB2YWx1ZSBvZiB0aGUgc2FwLWlhcHAtc3RhdGUgcHJvcGVydHkuXG5cdCAqIEByZXR1cm5zIFRoZSBtb2RpZmllZCBzQXBwSGFzaCBzdHJpbmcsIHN1Y2ggdGhhdCB0aGUgc2FwLWlhcHAtc3RhdGUgaGFzIGJlZW4gc2V0IGJhc2VkIG9uIHRoZSBuZXcgKHF1ZXJ5IG9wdGlvbi1iYXNlZClcblx0ICogICAgICAgICBzYXAtaWFwcC1zdGF0ZS4gSWYgYSBzYXAtaWFwcC1zdGF0ZSBoYXMgYmVlbiBzcGVjaWZpZWQgYmVmb3JlLCB0aGUga2V5IGlzIHJlcGxhY2VkLiBJZiA8Y29kZT5zQXBwSGFzaDwvY29kZT4gd2FzIG9mIHRoZSBvbGRcblx0ICogICAgICAgICBmb3JtYXQgKHNhcC1pYXBwLXN0YXRlIGFzIHBhcnQgb2YgdGhlIGtleXMvcm91dGUpLCB0aGUgZm9ybWF0IGlzIGNvbnZlcnRlZCB0byB0aGUgbmV3IGZvcm1hdCBiZWZvcmUgdGhlIHJlc3VsdCBpcyByZXR1cm5lZC5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9yZXBsYWNlSW5uZXJBcHBTdGF0ZUtleShzQXBwSGFzaDogc3RyaW5nLCBzQXBwU3RhdGVLZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgc05ld0lBcHBTdGF0ZSA9IElBUFBfU1RBVEUgKyBcIj1cIiArIHNBcHBTdGF0ZUtleTtcblxuXHRcdC8qXG5cdFx0ICogZ2VuZXJhdGUgc2FwLWlhcHAtc3RhdGVzIHdpdGggdGhlIG5ldyB3YXlcblx0XHQgKi9cblx0XHRpZiAoIXNBcHBIYXNoKSB7XG5cdFx0XHQvLyB0aGVyZSdzIG5vIHNBcHBIYXNoIGtleSB5ZXRcblx0XHRcdHJldHVybiBcIj9cIiArIHNOZXdJQXBwU3RhdGU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZm5BcHBlbmRUb1F1ZXJ5UGFyYW1ldGVyID0gZnVuY3Rpb24gKHNTdWJBcHBIYXNoOiBhbnkpOiBzdHJpbmcge1xuXHRcdFx0Ly8gdGhlcmUgaXMgYW4gQXBwSGFzaCBhdmFpbGFibGUsIGJ1dCBpdCBkb2VzIG5vdCBjb250YWluIGEgc2FwLWlhcHAtc3RhdGUgcGFyYW1ldGVyIHlldCAtIHdlIG5lZWQgdG8gYXBwZW5kIG9uZVxuXG5cdFx0XHQvLyBuZXcgYXBwcm9hY2g6IHdlIG5lZWQgdG8gY2hlY2ssIGlmIGEgc2V0IG9mIHF1ZXJ5IHBhcmFtZXRlcnMgaXMgYWxyZWFkeSBhdmFpbGFibGVcblx0XHRcdGlmIChzU3ViQXBwSGFzaC5pbmRleE9mKFwiP1wiKSAhPT0gLTEpIHtcblx0XHRcdFx0Ly8gdGhlcmUgYXJlIGFscmVhZHkgcXVlcnkgcGFyYW1ldGVycyBhdmFpbGFibGUgLSBhcHBlbmQgaXQgYXMgYW5vdGhlciBwYXJhbWV0ZXJcblx0XHRcdFx0cmV0dXJuIHNTdWJBcHBIYXNoICsgXCImXCIgKyBzTmV3SUFwcFN0YXRlO1xuXHRcdFx0fVxuXHRcdFx0Ly8gdGhlcmUgYXJlIG5vIGEgcXVlcnkgcGFyYW1ldGVycyBhdmFpbGFibGUgeWV0OyBjcmVhdGUgYSBzZXQgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXJcblx0XHRcdHJldHVybiBzU3ViQXBwSGFzaCArIFwiP1wiICsgc05ld0lBcHBTdGF0ZTtcblx0XHR9O1xuXG5cdFx0aWYgKCF0aGlzLl9nZXRJbm5lckFwcFN0YXRlS2V5KHNBcHBIYXNoKSkge1xuXHRcdFx0cmV0dXJuIGZuQXBwZW5kVG9RdWVyeVBhcmFtZXRlcihzQXBwSGFzaCk7XG5cdFx0fVxuXHRcdC8vIFRoZXJlIGlzIGFuIEFwcEhhc2ggYXZhaWxhYmxlIGFuZCB0aGVyZSBpcyBhbHJlYWR5IGFuIHNhcC1pYXBwLXN0YXRlIGluIHRoZSBBcHBIYXNoXG5cblx0XHRpZiAodGhpcy5fcklBcHBTdGF0ZU5ldy50ZXN0KHNBcHBIYXNoKSkge1xuXHRcdFx0Ly8gdGhlIG5ldyBhcHByb2FjaCBpcyBiZWluZyB1c2VkXG5cdFx0XHRyZXR1cm4gc0FwcEhhc2gucmVwbGFjZSh0aGlzLl9ySUFwcFN0YXRlTmV3LCBmdW5jdGlvbiAoc05lZWRsZTogc3RyaW5nKSB7XG5cdFx0XHRcdHJldHVybiBzTmVlZGxlLnJlcGxhY2UoL1s9XS4qL2dpLCBcIj1cIiArIHNBcHBTdGF0ZUtleSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvLyB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgb2xkIEFwcEhhc2ggZW50aXJlbHkgYW5kIHJlcGxhY2UgaXQgd2l0aCBhIG5ldyBvbmUuXG5cblx0XHRjb25zdCBmblJlcGxhY2VPbGRBcHByb2FjaCA9IGZ1bmN0aW9uIChyT2xkQXBwcm9hY2g6IGFueSwgc1N1YkFwcEhhc2g6IGFueSk6IHN0cmluZyB7XG5cdFx0XHRzU3ViQXBwSGFzaCA9IHNTdWJBcHBIYXNoLnJlcGxhY2Uock9sZEFwcHJvYWNoLCBcIlwiKTtcblx0XHRcdHJldHVybiBmbkFwcGVuZFRvUXVlcnlQYXJhbWV0ZXIoc1N1YkFwcEhhc2gpO1xuXHRcdH07XG5cblx0XHRpZiAodGhpcy5fcklBcHBTdGF0ZU9sZC50ZXN0KHNBcHBIYXNoKSkge1xuXHRcdFx0cmV0dXJuIGZuUmVwbGFjZU9sZEFwcHJvYWNoKHRoaXMuX3JJQXBwU3RhdGVPbGQsIHNBcHBIYXNoKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5fcklBcHBTdGF0ZU9sZEF0U3RhcnQudGVzdChzQXBwSGFzaCkpIHtcblx0XHRcdHJldHVybiBmblJlcGxhY2VPbGRBcHByb2FjaCh0aGlzLl9ySUFwcFN0YXRlT2xkQXRTdGFydCwgc0FwcEhhc2gpO1xuXHRcdH1cblxuXHRcdGFzc2VydChmYWxzZSwgXCJpbnRlcm5hbCBpbmNvbnNpc3RlbmN5OiBBcHByb2FjaCBvZiBzYXAtaWFwcC1zdGF0ZSBub3Qga25vd24sIGJ1dCBfZ2V0SW5uZXJBcHBTdGF0ZUtleSByZXR1cm5lZCBpdFwiKTtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0X2dldFVSTFBhcmFtZXRlcnNGcm9tU2VsZWN0aW9uVmFyaWFudCh2U2VsZWN0aW9uVmFyaWFudD86IFNlbGVjdGlvblZhcmlhbnQgfCBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcblx0XHRjb25zdCBtVVJMUGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXHRcdGxldCBpID0gMDtcblx0XHRsZXQgb1NlbGVjdGlvblZhcmlhbnQ7XG5cblx0XHRpZiAodHlwZW9mIHZTZWxlY3Rpb25WYXJpYW50ID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRvU2VsZWN0aW9uVmFyaWFudCA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KHZTZWxlY3Rpb25WYXJpYW50KTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2U2VsZWN0aW9uVmFyaWFudCA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0b1NlbGVjdGlvblZhcmlhbnQgPSB2U2VsZWN0aW9uVmFyaWFudDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHR9XG5cblx0XHQvLyBhZGQgVVJMcyBwYXJhbWV0ZXJzIGZyb20gU2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zIChpZiBzaW5nbGUgdmFsdWUpXG5cdFx0Y29uc3QgYVNlbGVjdFByb3BlcnRpZXMgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcygpO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBhU2VsZWN0UHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgYVNlbGVjdE9wdGlvbnMgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb24oYVNlbGVjdFByb3BlcnRpZXNbaV0pO1xuXHRcdFx0aWYgKGFTZWxlY3RPcHRpb25zICYmIGFTZWxlY3RPcHRpb25zLmxlbmd0aCA9PT0gMSAmJiBhU2VsZWN0T3B0aW9uc1swXS5TaWduID09PSBcIklcIiAmJiBhU2VsZWN0T3B0aW9uc1swXS5PcHRpb24gPT09IFwiRVFcIikge1xuXHRcdFx0XHRtVVJMUGFyYW1ldGVyc1thU2VsZWN0UHJvcGVydGllc1tpXV0gPSBhU2VsZWN0T3B0aW9uc1swXS5Mb3c7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gYWRkIHBhcmFtZXRlcnMgZnJvbSBTZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlcnNcblx0XHRjb25zdCBhUGFyYW1ldGVyTmFtZXMgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRQYXJhbWV0ZXJOYW1lcygpO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBhUGFyYW1ldGVyTmFtZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IHNQYXJhbWV0ZXJWYWx1ZSA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFBhcmFtZXRlcihhUGFyYW1ldGVyTmFtZXNbaV0pO1xuXG5cdFx0XHRtVVJMUGFyYW1ldGVyc1thUGFyYW1ldGVyTmFtZXNbaV1dID0gc1BhcmFtZXRlclZhbHVlO1xuXHRcdH1cblx0XHRyZXR1cm4gbVVSTFBhcmFtZXRlcnM7XG5cdH1cblxuXHRfY3JlYXRlVGVjaG5pY2FsRXJyb3Ioc0Vycm9yQ29kZTogYW55KTogTmF2RXJyb3Ige1xuXHRcdHJldHVybiBuZXcgTmF2RXJyb3Ioc0Vycm9yQ29kZSk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgbW9kZWwgdGhhdCBpcyB1c2VkIGZvciB2ZXJpZmljYXRpb24gb2Ygc2Vuc2l0aXZlIGluZm9ybWF0aW9uLiBJZiB0aGUgbW9kZWwgaXMgbm90IHNldCwgdGhlIHVubmFtZWQgY29tcG9uZW50IG1vZGVsIGlzIHVzZWQgZm9yIHRoZVxuXHQgKiB2ZXJpZmljYXRpb24gb2Ygc2Vuc2l0aXZlIGluZm9ybWF0aW9uLlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSBvTW9kZWwgRm9yIGNoZWNraW5nIHNlbnNpdGl2ZSBpbmZvcm1hdGlvblxuXHQgKi9cblx0c2V0TW9kZWwob01vZGVsOiBWMk9EYXRhTW9kZWwgfCBWNE9EYXRhTW9kZWwpOiB2b2lkIHtcblx0XHR0aGlzLl9vTW9kZWwgPSBvTW9kZWw7XG5cdH1cblxuXHRfZ2V0TW9kZWwoKTogVjJPRGF0YU1vZGVsIHwgVjRPRGF0YU1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5fb01vZGVsIHx8IHRoaXMub0NvbXBvbmVudC5nZXRNb2RlbCgpO1xuXHR9XG5cblx0X3JlbW92ZUFsbFByb3BlcnRpZXMob0RhdGE6IElubmVyQXBwRGF0YSk6IHZvaWQge1xuXHRcdGlmIChvRGF0YSkge1xuXHRcdFx0aWYgKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudCA9IG51bGwgYXMgdW5rbm93biBhcyB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvRGF0YS52YWx1ZVRleHRzKSB7XG5cdFx0XHRcdG9EYXRhLnZhbHVlVGV4dHMgPSBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob0RhdGEuc2VtYW50aWNEYXRlcykge1xuXHRcdFx0XHRvRGF0YS5zZW1hbnRpY0RhdGVzID0gbnVsbDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfcmVtb3ZlUHJvcGVydGllcyhhRmlsdGVyTmFtZTogYW55LCBhUGFyYW1ldGVyTmFtZTogYW55LCBvRGF0YTogYW55KTogdm9pZCB7XG5cdFx0aWYgKGFGaWx0ZXJOYW1lLmxlbmd0aCAmJiBvRGF0YSAmJiAob0RhdGEuc2VsZWN0aW9uVmFyaWFudCB8fCBvRGF0YS52YWx1ZVRleHRzIHx8IG9EYXRhLnNlbWFudGljRGF0ZXMpKSB7XG5cdFx0XHRhRmlsdGVyTmFtZS5mb3JFYWNoKGZ1bmN0aW9uIChzTmFtZTogYW55KSB7XG5cdFx0XHRcdGlmIChvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlNlbGVjdE9wdGlvbnMpIHtcblx0XHRcdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlNlbGVjdE9wdGlvbnMuc29tZShmdW5jdGlvbiAob1ZhbHVlOiBhbnksIG5JZHg6IGFueSkge1xuXHRcdFx0XHRcdFx0aWYgKHNOYW1lID09PSBvVmFsdWUuUHJvcGVydHlOYW1lKSB7XG5cdFx0XHRcdFx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuU2VsZWN0T3B0aW9ucy5zcGxpY2UobklkeCwgMSk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAob0RhdGEudmFsdWVUZXh0cyAmJiBvRGF0YS52YWx1ZVRleHRzLlRleHRzKSB7XG5cdFx0XHRcdFx0b0RhdGEudmFsdWVUZXh0cy5UZXh0cy5mb3JFYWNoKGZ1bmN0aW9uIChvVGV4dHM6IGFueSkge1xuXHRcdFx0XHRcdFx0aWYgKG9UZXh0cy5Qcm9wZXJ0eVRleHRzKSB7XG5cdFx0XHRcdFx0XHRcdG9UZXh0cy5Qcm9wZXJ0eVRleHRzLnNvbWUoZnVuY3Rpb24gKG9WYWx1ZTogYW55LCBuSWR4OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoc05hbWUgPT09IG9WYWx1ZS5Qcm9wZXJ0eU5hbWUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9UZXh0cy5Qcm9wZXJ0eVRleHRzLnNwbGljZShuSWR4LCAxKTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAob0RhdGEuc2VtYW50aWNEYXRlcyAmJiBvRGF0YS5zZW1hbnRpY0RhdGVzLkRhdGVzKSB7XG5cdFx0XHRcdFx0b0RhdGEuc2VtYW50aWNEYXRlcy5EYXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChvRGF0ZXM6IGFueSwgbklkeDogYW55KSB7XG5cdFx0XHRcdFx0XHRpZiAoc05hbWUgPT09IG9EYXRlcy5Qcm9wZXJ0eU5hbWUpIHtcblx0XHRcdFx0XHRcdFx0b0RhdGEuc2VtYW50aWNEYXRlcy5EYXRlcy5zcGxpY2UobklkeCwgMSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmIChhUGFyYW1ldGVyTmFtZS5sZW5ndGggJiYgb0RhdGEgJiYgb0RhdGEuc2VsZWN0aW9uVmFyaWFudCAmJiBvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlcnMpIHtcblx0XHRcdGFQYXJhbWV0ZXJOYW1lLmZvckVhY2goZnVuY3Rpb24gKHNOYW1lOiBhbnkpIHtcblx0XHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJzLnNvbWUoZnVuY3Rpb24gKG9WYWx1ZTogYW55LCBuSWR4OiBhbnkpIHtcblx0XHRcdFx0XHRpZiAoc05hbWUgPT09IG9WYWx1ZS5Qcm9wZXJ0eU5hbWUgfHwgXCIkUGFyYW1ldGVyLlwiICsgc05hbWUgPT09IG9WYWx1ZS5Qcm9wZXJ0eU5hbWUpIHtcblx0XHRcdFx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVycy5zcGxpY2UobklkeCwgMSk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0X2lzVGVybVRydWUob1Byb3BlcnR5OiBhbnksIHNUZXJtOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRjb25zdCBmSXNUZXJtRGVmYXVsdFRydWUgPSBmdW5jdGlvbiAob1Rlcm06IGFueSk6IGJvb2xlYW4ge1xuXHRcdFx0aWYgKG9UZXJtKSB7XG5cdFx0XHRcdHJldHVybiBvVGVybS5Cb29sID8gb1Rlcm0uQm9vbCAhPT0gXCJmYWxzZVwiIDogdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xuXG5cdFx0cmV0dXJuICEhb1Byb3BlcnR5W3NUZXJtXSAmJiBmSXNUZXJtRGVmYXVsdFRydWUob1Byb3BlcnR5W3NUZXJtXSk7XG5cdH1cblxuXHRfaXNFeGNsdWRlZEZyb21OYXZpZ2F0aW9uQ29udGV4dChvUHJvcGVydHk6IGFueSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9pc1Rlcm1UcnVlKG9Qcm9wZXJ0eSwgXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5FeGNsdWRlRnJvbU5hdmlnYXRpb25Db250ZXh0XCIpO1xuXHR9XG5cblx0X2lzUG90ZW50aWFsbHlTZW5zaXRpdmUob1Byb3BlcnR5OiBhbnkpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5faXNUZXJtVHJ1ZShvUHJvcGVydHksIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxLklzUG90ZW50aWFsbHlTZW5zaXRpdmVcIik7XG5cdH1cblxuXHRfaXNNZWFzdXJlUHJvcGVydHkob1Byb3BlcnR5OiBhbnkpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5faXNUZXJtVHJ1ZShvUHJvcGVydHksIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLk1lYXN1cmVcIik7XG5cdH1cblxuXHRfaXNUb0JlRXhjbHVkZWQob1Byb3BlcnR5OiBhbnkpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5faXNQb3RlbnRpYWxseVNlbnNpdGl2ZShvUHJvcGVydHkpIHx8IHRoaXMuX2lzRXhjbHVkZWRGcm9tTmF2aWdhdGlvbkNvbnRleHQob1Byb3BlcnR5KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgbWV0aG9kIGNyZWF0ZXMgYSBjb250ZXh0IHVybCBiYXNlZCBvbiBwcm92aWRlZCBkYXRhLiBUaGlzIGNvbnRleHQgdXJsIGNhbiBlaXRoZXIgYmUgdXNlZCBhc1xuXHQgKiB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2aWdhdGlvbkhhbmRsZXIjc2V0UGFyYW1ldGVyQ29udGV4dFVybCBQYXJhbWV0ZXJDb250ZXh0VXJsfSBvclxuXHQgKiB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2aWdhdGlvbkhhbmRsZXIjc2V0RmlsdGVyQ29udGV4dFVybCBGaWx0ZXJDb250ZXh0VXJsfS5cblx0ICogQHBhcmFtIHNFbnRpdHlTZXROYW1lIFVzZWQgZm9yIHVybCBkZXRlcm1pbmF0aW9uXG5cdCAqIEBwYXJhbSBbb01vZGVsXSBVc2VkIGZvciB1cmwgZGV0ZXJtaW5hdGlvbi4gSWYgb21pdHRlZCwgdGhlIE5hdmlnYXRpb25IYW5kbGVyIG1vZGVsIGlzIHVzZWQuXG5cdCAqIEB0aHJvd3MgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdkVycm9yfSBpbiBjYXNlIG9mIG1pc3Npbmcgb3Igd3JvbmcgcGFzc2VkIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMgVGhlIGNvbnRleHQgdXJsIGZvciB0aGUgZ2l2ZW4gZW50aXRpZXNcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0Y29uc3RydWN0Q29udGV4dFVybChzRW50aXR5U2V0TmFtZTogc3RyaW5nLCBvTW9kZWw/OiBWMk9EYXRhTW9kZWwgfCBWNE9EYXRhTW9kZWwpOiBzdHJpbmcge1xuXHRcdGlmICghc0VudGl0eVNldE5hbWUpIHtcblx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLk5PX0VOVElUWV9TRVRfUFJPVklERURcIik7XG5cdFx0fVxuXG5cdFx0aWYgKG9Nb2RlbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRvTW9kZWwgPSB0aGlzLl9nZXRNb2RlbCgpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLl9jb25zdHJ1Y3RDb250ZXh0VXJsKG9Nb2RlbCkgKyBcIiNcIiArIHNFbnRpdHlTZXROYW1lO1xuXHR9XG5cblx0X2NvbnN0cnVjdENvbnRleHRVcmwob01vZGVsOiBWMk9EYXRhTW9kZWwgfCBWNE9EYXRhTW9kZWwpOiBzdHJpbmcge1xuXHRcdGxldCBzU2VydmVyVXJsO1xuXG5cdFx0aWYgKG9Nb2RlbC5pc0E8VjJPRGF0YU1vZGVsPihcInNhcC51aS5tb2RlbC5vZGF0YS52Mi5PRGF0YU1vZGVsXCIpKSB7XG5cdFx0XHRzU2VydmVyVXJsID0gb01vZGVsLl9nZXRTZXJ2ZXJVcmwoKTtcblx0XHR9IGVsc2UgaWYgKG9Nb2RlbC5pc0E8VjRPRGF0YU1vZGVsPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsXCIpKSB7XG5cdFx0XHRjb25zdCBvU2VydmljZVVSSSA9IG5ldyBVUkkob01vZGVsLmdldFNlcnZpY2VVcmwoKSkuYWJzb2x1dGVUbyhkb2N1bWVudC5iYXNlVVJJKTtcblx0XHRcdHNTZXJ2ZXJVcmwgPSBuZXcgVVJJKFwiL1wiKS5hYnNvbHV0ZVRvKG9TZXJ2aWNlVVJJKS50b1N0cmluZygpO1xuXHRcdH1cblxuXHRcdGlmIChzU2VydmVyVXJsICYmIHNTZXJ2ZXJVcmwubGFzdEluZGV4T2YoXCIvXCIpID09PSBzU2VydmVyVXJsLmxlbmd0aCAtIDEpIHtcblx0XHRcdHNTZXJ2ZXJVcmwgPSBzU2VydmVyVXJsLnN1YnN0cmluZygwLCBzU2VydmVyVXJsLmxlbmd0aCAtIDEpO1xuXHRcdH1cblxuXHRcdHJldHVybiBzU2VydmVyVXJsICsgb01vZGVsLnNTZXJ2aWNlVXJsICsgXCIvJG1ldGFkYXRhXCI7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIG1ldGhvZCB2ZXJpZmllcywgaWYgYW55IG9mIHRoZSBwYXNzZWQgcGFyYW1ldGVycy9maWx0ZXJzIGFyZSBtYXJrZWQgYXMgc2Vuc2l0aXZlLCBhbmQgaWYgdGhpcyBpcyB0aGUgY2FzZSByZW1vdmUgdGhvc2UgZnJvbSB0aGUgYXBwXG5cdCAqIGRhdGEuIDxiPk5vdGU6PC9iPiBUbyB1c2UgdGhpcyBtZXRob2QsIHRoZSBtZXRhZGF0YSBtdXN0IGJlIGxvYWRlZCBmaXJzdC5cblx0ICogQHBhcmFtIG9EYXRhIFdpdGggcG90ZW50aWFsIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiAoZm9yIE9EYXRhLCBleHRlcm5hbCByZXByZXNlbnRhdGlvbiB1c2luZ1xuXHQgKiA8Y29kZT5vU2VsZWN0aW9uVmFyaWFudC50b0pTT05PYmplY3QoKTwvY29kZT4gbXVzdCBiZSB1c2VkKSwgd2l0aCB0aGUgPGNvZGU+RmlsdGVyQ29udGV4dFVybDwvY29kZT4gb3Jcblx0ICogPGNvZGU+UGFyYW1ldGVyQ29udGV4dFVybDwvY29kZT4gcHJvcGVydHkuXG5cdCAqIEByZXR1cm5zIERhdGEgd2l0aG91dCBwcm9wZXJ0aWVzIG1hcmtlZCBhcyBzZW5zaXRpdmUgb3IgYW4gZW1wdHkgb2JqZWN0IGlmIHRoZSBPRGF0YSBtZXRhZGF0YSBpcyBub3QgZnVsbHkgbG9hZGVkIHlldFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2NoZWNrSXNQb3RlbnRpYWxseVNlbnNpdGl2ZShvRGF0YTogYW55KTogdW5rbm93biB7XG5cdFx0bGV0IG9BZGFwdGVkRGF0YSA9IG9EYXRhO1xuXHRcdGlmIChcblx0XHRcdG9EYXRhICYmXG5cdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50ICYmXG5cdFx0XHQoKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuRmlsdGVyQ29udGV4dFVybCAmJiBvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlNlbGVjdE9wdGlvbnMpIHx8XG5cdFx0XHRcdChvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlckNvbnRleHRVcmwgJiYgb0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJzKSlcblx0XHQpIHtcblx0XHRcdGNvbnN0IG9Nb2RlbCA9IHRoaXMuX2dldE1vZGVsKCk7XG5cdFx0XHRpZiAodGhpcy5vQ29tcG9uZW50ICYmIG9Nb2RlbCAmJiBvTW9kZWwuaXNBPFYyT0RhdGFNb2RlbD4oXCJzYXAudWkubW9kZWwub2RhdGEudjIuT0RhdGFNb2RlbFwiKSkge1xuXHRcdFx0XHRjb25zdCBhU2Vuc2l0aXZlRmlsdGVyTmFtZSA9IFtdO1xuXHRcdFx0XHRjb25zdCBhU2Vuc2l0aXZlUGFyYW1ldGVyTmFtZSA9IFtdO1xuXHRcdFx0XHRsZXQgaSxcblx0XHRcdFx0XHRvRW50aXR5U2V0OiBhbnksXG5cdFx0XHRcdFx0b0VudGl0eURlZjogYW55LFxuXHRcdFx0XHRcdG9TdWJFbnRpdHlEZWY6IGFueSxcblx0XHRcdFx0XHRvRW5kUm9sZTogYW55LFxuXHRcdFx0XHRcdGFGaWx0ZXJDb250ZXh0UGFydCA9IFtdLFxuXHRcdFx0XHRcdGFQYXJhbUNvbnRleHRQYXJ0ID0gW107XG5cblx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0aWYgKG9Nb2RlbC5nZXRTZXJ2aWNlTWV0YWRhdGEoKSAmJiBvTWV0YU1vZGVsPy5vTW9kZWwpIHtcblx0XHRcdFx0XHRpZiAob0RhdGEuc2VsZWN0aW9uVmFyaWFudC5GaWx0ZXJDb250ZXh0VXJsKSB7XG5cdFx0XHRcdFx0XHRhRmlsdGVyQ29udGV4dFBhcnQgPSBvRGF0YS5zZWxlY3Rpb25WYXJpYW50LkZpbHRlckNvbnRleHRVcmwuc3BsaXQoXCIjXCIpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdGFGaWx0ZXJDb250ZXh0UGFydC5sZW5ndGggPT09IDIgJiZcblx0XHRcdFx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuU2VsZWN0T3B0aW9ucyAmJlxuXHRcdFx0XHRcdFx0dGhpcy5fY29uc3RydWN0Q29udGV4dFVybChvTW9kZWwpLmluZGV4T2YoYUZpbHRlckNvbnRleHRQYXJ0WzBdKSA9PT0gMFxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b0VudGl0eVNldCA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlTZXQoYUZpbHRlckNvbnRleHRQYXJ0WzFdKTtcblx0XHRcdFx0XHRcdGlmIChvRW50aXR5U2V0KSB7XG5cdFx0XHRcdFx0XHRcdG9FbnRpdHlEZWYgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5VHlwZShvRW50aXR5U2V0LmVudGl0eVR5cGUpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b0VudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKGFGaWx0ZXJDb250ZXh0UGFydFsxXSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChvRW50aXR5RGVmKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChvRW50aXR5RGVmICYmIG9FbnRpdHlEZWYucHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgb0VudGl0eURlZi5wcm9wZXJ0eS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuX2lzVG9CZUV4Y2x1ZGVkKG9FbnRpdHlEZWYucHJvcGVydHlbaV0pKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFTZW5zaXRpdmVGaWx0ZXJOYW1lLnB1c2gob0VudGl0eURlZi5wcm9wZXJ0eVtpXS5uYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAob0VudGl0eURlZi5uYXZpZ2F0aW9uUHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgb0VudGl0eURlZi5uYXZpZ2F0aW9uUHJvcGVydHkubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9FbmRSb2xlID0gb01ldGFNb2RlbC5nZXRPRGF0YUFzc29jaWF0aW9uRW5kKG9FbnRpdHlEZWYsIG9FbnRpdHlEZWYubmF2aWdhdGlvblByb3BlcnR5W2ldLm5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFvRW5kUm9sZSB8fCBvRW5kUm9sZS50eXBlID09PSBvRGF0YS5zZWxlY3Rpb25WYXJpYW50LkZpbHRlckNvbnRleHRVcmwpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBjaGVjayBpZiB0aGUgZW5kIHJvbGUgaGFzIGNhcmRpbmFsaXR5IDAuLjEgb3IgMVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9FbmRSb2xlLm11bHRpcGxpY2l0eSA9PT0gXCIxXCIgfHwgb0VuZFJvbGUubXVsdGlwbGljaXR5ID09PSBcIjAuLjFcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvU3ViRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUob0VuZFJvbGUudHlwZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvU3ViRW50aXR5RGVmICYmIG9TdWJFbnRpdHlEZWYucHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IG9TdWJFbnRpdHlEZWYucHJvcGVydHkubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLl9pc1RvQmVFeGNsdWRlZChvU3ViRW50aXR5RGVmLnByb3BlcnR5W2pdKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhU2Vuc2l0aXZlRmlsdGVyTmFtZS5wdXNoKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9FbnRpdHlEZWYubmF2aWdhdGlvblByb3BlcnR5W2ldLm5hbWUgKyBcIi5cIiArIG9TdWJFbnRpdHlEZWYucHJvcGVydHlbal0ubmFtZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlckNvbnRleHRVcmwpIHtcblx0XHRcdFx0XHRcdGFQYXJhbUNvbnRleHRQYXJ0ID0gb0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJDb250ZXh0VXJsLnNwbGl0KFwiI1wiKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRhUGFyYW1Db250ZXh0UGFydC5sZW5ndGggPT09IDIgJiZcblx0XHRcdFx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVycyAmJlxuXHRcdFx0XHRcdFx0dGhpcy5fY29uc3RydWN0Q29udGV4dFVybChvTW9kZWwpLmluZGV4T2YoYVBhcmFtQ29udGV4dFBhcnRbMF0pID09PSAwXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvRW50aXR5U2V0ID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVNldChhUGFyYW1Db250ZXh0UGFydFsxXSk7XG5cdFx0XHRcdFx0XHRpZiAob0VudGl0eVNldCkge1xuXHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUob0VudGl0eVNldC5lbnRpdHlUeXBlKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG9FbnRpdHlEZWYgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5VHlwZShhRmlsdGVyQ29udGV4dFBhcnRbMV0pO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAob0VudGl0eURlZikge1xuXHRcdFx0XHRcdFx0XHRpZiAob0VudGl0eURlZi5wcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBvRW50aXR5RGVmLnByb3BlcnR5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5faXNUb0JlRXhjbHVkZWQob0VudGl0eURlZi5wcm9wZXJ0eVtpXSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YVNlbnNpdGl2ZVBhcmFtZXRlck5hbWUucHVzaChvRW50aXR5RGVmLnByb3BlcnR5W2ldLm5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChhU2Vuc2l0aXZlRmlsdGVyTmFtZS5sZW5ndGggfHwgYVNlbnNpdGl2ZVBhcmFtZXRlck5hbWUubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRvQWRhcHRlZERhdGEgPSBleHRlbmQodHJ1ZSBhcyBhbnksIHt9LCBvQWRhcHRlZERhdGEpO1xuXG5cdFx0XHRcdFx0XHR0aGlzLl9yZW1vdmVQcm9wZXJ0aWVzKGFTZW5zaXRpdmVGaWx0ZXJOYW1lLCBhU2Vuc2l0aXZlUGFyYW1ldGVyTmFtZSwgb0FkYXB0ZWREYXRhKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gYW5ub3RhdGlvbnMgYXJlIG5vdCBsb2FkZWRcblxuXHRcdFx0XHRcdHRoaXMuX3JlbW92ZUFsbFByb3BlcnRpZXMob0FkYXB0ZWREYXRhKTtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlcjogb01ldGFkYXRhIGFyZSBub3QgZnVsbHkgbG9hZGVkIVwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICh0aGlzLm9Db21wb25lbnQgJiYgb01vZGVsICYmIG9Nb2RlbC5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbFwiKSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fcmVtb3ZlU2Vuc2l0aXZlRGF0YUZvck9EYXRhVjQob0FkYXB0ZWREYXRhKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb0FkYXB0ZWREYXRhO1xuXHR9XG5cblx0X3JlbW92ZU1lYXN1cmVCYXNlZEluZm9ybWF0aW9uKG9BcHBEYXRhOiBJbm5lckFwcERhdGEpOiBJbm5lckFwcERhdGEge1xuXHRcdGxldCBvQXBwRGF0YUZvclNhdmUgPSBvQXBwRGF0YTtcblxuXHRcdGlmIChvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0XHQvKlxuXHRcdFx0ICogVGhlIHNwZWNpZmljYXRpb24gc3RhdGVzIHRoYXQgU2VsZWN0aW9uIFZhcmlhbnRzIG5lZWQgdG8gYmUgSlNPTiBvYmplY3RzLiBIb3dldmVyLCBpbnRlcm5hbGx5LCB3ZSB3b3JrIHdpdGggc3RyaW5ncyBmb3Jcblx0XHRcdCAqIFwic2VsZWN0aW9uVmFyaWFudFwiLiBUaGVyZWZvcmUsIGluIGNhc2UgdGhhdCB0aGlzIGlzIGEgc3RyaW5nLCB3ZSBuZWVkIHRvIEpTT04tcGFyc2UgdGhlIGRhdGEuXG5cdFx0XHQgKi9cblx0XHRcdGlmICh0eXBlb2Ygb0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdG9BcHBEYXRhRm9yU2F2ZS5zZWxlY3Rpb25WYXJpYW50ID0gSlNPTi5wYXJzZShvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50KTtcblx0XHRcdFx0fSBjYXRjaCAoeCkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyOiBfcmVtb3ZlTWVhc3VyZUJhc2VkSW5mb3JtYXRpb24gcGFyc2UgZXJyb3JcIik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0b0FwcERhdGFGb3JTYXZlID0gdGhpcy5fcmVtb3ZlTWVhc3VyZUJhc2VkUHJvcGVydGllcyhvQXBwRGF0YUZvclNhdmUpO1xuXHRcdH1cblxuXHRcdHJldHVybiBvQXBwRGF0YUZvclNhdmU7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIG1ldGhvZCB2ZXJpZmllcyBpZiBhbnkgb2YgdGhlIHBhc3NlZCBwYXJhbWV0ZXJzL2ZpbHRlcnMgYXJlIG1hcmtlZCBhcyBhIG1lYXN1cmUuIElmIHRoaXMgaXMgdGhlIGNhc2UsIHRoZXkgYXJlIHJlbW92ZWQgZnJvbSB0aGUgeGFwcFxuXHQgKiBhcHAgZGF0YS4gPGI+Tm90ZTo8L2I+IFRvIHVzZSB0aGlzIG1ldGhvZCwgdGhlIG1ldGFkYXRhIG11c3QgYmUgbG9hZGVkIGZpcnN0LlxuXHQgKiBAcGFyYW0gb0RhdGEgV2l0aCBwb3RlbnRpYWwgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIChmb3IgT0RhdGEsIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIHVzaW5nXG5cdCAqIDxjb2RlPm9TZWxlY3Rpb25WYXJpYW50LnRvSlNPTk9iamVjdCgpPC9jb2RlPiBtdXN0IGJlIHVzZWQpLCB3aXRoIHRoZSA8Y29kZT5GaWx0ZXJDb250ZXh0VXJsPC9jb2RlPiBvclxuXHQgKiA8Y29kZT5QYXJhbWV0ZXJDb250ZXh0VXJsPC9jb2RlPiBwcm9wZXJ0eS5cblx0ICogQHJldHVybnMgRGF0YSB3aXRob3V0IHByb3BlcnRpZXMgbWFya2VkIGFzIG1lYXN1cmVzIG9yIGFuIGVtcHR5IG9iamVjdCBpZiB0aGUgT0RhdGEgbWV0YWRhdGEgaXMgbm90IGZ1bGx5IGxvYWRlZCB5ZXRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9yZW1vdmVNZWFzdXJlQmFzZWRQcm9wZXJ0aWVzKG9EYXRhOiBJbm5lckFwcERhdGEpOiBJbm5lckFwcERhdGEge1xuXHRcdGxldCBvQWRhcHRlZERhdGEgPSBvRGF0YTtcblx0XHRjb25zdCBhTWVhc3VyZUZpbHRlck5hbWUgPSBbXTtcblx0XHRjb25zdCBhTWVhc3VyZVBhcmFtZXRlck5hbWUgPSBbXTtcblx0XHRsZXQgaSxcblx0XHRcdG9Nb2RlbCxcblx0XHRcdG9NZXRhTW9kZWwsXG5cdFx0XHRvRW50aXR5U2V0OiBhbnksXG5cdFx0XHRvRW50aXR5RGVmOiBhbnksXG5cdFx0XHRvU3ViRW50aXR5RGVmOiBhbnksXG5cdFx0XHRvRW5kUm9sZTogYW55LFxuXHRcdFx0YUZpbHRlckNvbnRleHRQYXJ0OiBzdHJpbmdbXSA9IFtdLFxuXHRcdFx0YVBhcmFtQ29udGV4dFBhcnQ6IHN0cmluZ1tdID0gW107XG5cblx0XHRpZiAoXG5cdFx0XHRvRGF0YSAmJlxuXHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudCAmJlxuXHRcdFx0KCgob0RhdGEuc2VsZWN0aW9uVmFyaWFudCBhcyBTZXJpYWxpemVkU2VsZWN0aW9uVmFyaWFudCkuRmlsdGVyQ29udGV4dFVybCAmJlxuXHRcdFx0XHQob0RhdGEuc2VsZWN0aW9uVmFyaWFudCBhcyBTZXJpYWxpemVkU2VsZWN0aW9uVmFyaWFudCkuU2VsZWN0T3B0aW9ucykgfHxcblx0XHRcdFx0KChvRGF0YS5zZWxlY3Rpb25WYXJpYW50IGFzIFNlcmlhbGl6ZWRTZWxlY3Rpb25WYXJpYW50KS5QYXJhbWV0ZXJDb250ZXh0VXJsICYmXG5cdFx0XHRcdFx0KG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgYXMgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQpLlBhcmFtZXRlcnMpKVxuXHRcdCkge1xuXHRcdFx0b01vZGVsID0gdGhpcy5fZ2V0TW9kZWwoKTtcblx0XHRcdGlmICh0aGlzLm9Db21wb25lbnQgJiYgb01vZGVsICYmIG9Nb2RlbC5pc0E8VjJPRGF0YU1vZGVsPihcInNhcC51aS5tb2RlbC5vZGF0YS52Mi5PRGF0YU1vZGVsXCIpKSB7XG5cdFx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdGlmIChvTW9kZWwuZ2V0U2VydmljZU1ldGFkYXRhKCkgJiYgb01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLm9Nb2RlbCkge1xuXHRcdFx0XHRcdGlmICgob0RhdGEuc2VsZWN0aW9uVmFyaWFudCBhcyBTZXJpYWxpemVkU2VsZWN0aW9uVmFyaWFudCkuRmlsdGVyQ29udGV4dFVybCkge1xuXHRcdFx0XHRcdFx0YUZpbHRlckNvbnRleHRQYXJ0ID0gKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgYXMgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQpLkZpbHRlckNvbnRleHRVcmwhLnNwbGl0KFwiI1wiKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRhRmlsdGVyQ29udGV4dFBhcnQubGVuZ3RoID09PSAyICYmXG5cdFx0XHRcdFx0XHQob0RhdGEuc2VsZWN0aW9uVmFyaWFudCBhcyBTZXJpYWxpemVkU2VsZWN0aW9uVmFyaWFudCkuU2VsZWN0T3B0aW9ucyAmJlxuXHRcdFx0XHRcdFx0dGhpcy5fY29uc3RydWN0Q29udGV4dFVybChvTW9kZWwpLmluZGV4T2YoYUZpbHRlckNvbnRleHRQYXJ0WzBdKSA9PT0gMFxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b0VudGl0eVNldCA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlTZXQoYUZpbHRlckNvbnRleHRQYXJ0WzFdKTtcblx0XHRcdFx0XHRcdGlmIChvRW50aXR5U2V0KSB7XG5cdFx0XHRcdFx0XHRcdG9FbnRpdHlEZWYgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5VHlwZShvRW50aXR5U2V0LmVudGl0eVR5cGUpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b0VudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKGFGaWx0ZXJDb250ZXh0UGFydFsxXSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChvRW50aXR5RGVmKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChvRW50aXR5RGVmICYmIG9FbnRpdHlEZWYucHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgb0VudGl0eURlZi5wcm9wZXJ0eS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuX2lzTWVhc3VyZVByb3BlcnR5KG9FbnRpdHlEZWYucHJvcGVydHlbaV0pKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFNZWFzdXJlRmlsdGVyTmFtZS5wdXNoKG9FbnRpdHlEZWYucHJvcGVydHlbaV0ubmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYubmF2aWdhdGlvblByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IG9FbnRpdHlEZWYubmF2aWdhdGlvblByb3BlcnR5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRW5kUm9sZSA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFBc3NvY2lhdGlvbkVuZChvRW50aXR5RGVmLCBvRW50aXR5RGVmLm5hdmlnYXRpb25Qcm9wZXJ0eVtpXS5uYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0IW9FbmRSb2xlIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9FbmRSb2xlLnR5cGUgPT09IChvRGF0YS5zZWxlY3Rpb25WYXJpYW50IGFzIFNlcmlhbGl6ZWRTZWxlY3Rpb25WYXJpYW50KS5GaWx0ZXJDb250ZXh0VXJsXG5cdFx0XHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBjaGVjayBpZiB0aGUgZW5kIHJvbGUgaGFzIGNhcmRpbmFsaXR5IDAuLjEgb3IgMVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9FbmRSb2xlLm11bHRpcGxpY2l0eSA9PT0gXCIxXCIgfHwgb0VuZFJvbGUubXVsdGlwbGljaXR5ID09PSBcIjAuLjFcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvU3ViRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUob0VuZFJvbGUudHlwZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvU3ViRW50aXR5RGVmICYmIG9TdWJFbnRpdHlEZWYucHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IG9TdWJFbnRpdHlEZWYucHJvcGVydHkubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLl9pc01lYXN1cmVQcm9wZXJ0eShvU3ViRW50aXR5RGVmLnByb3BlcnR5W2pdKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhTWVhc3VyZUZpbHRlck5hbWUucHVzaChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmLm5hdmlnYXRpb25Qcm9wZXJ0eVtpXS5uYW1lICsgXCIuXCIgKyBvU3ViRW50aXR5RGVmLnByb3BlcnR5W2pdLm5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgYXMgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQpLlBhcmFtZXRlckNvbnRleHRVcmwpIHtcblx0XHRcdFx0XHRcdGFQYXJhbUNvbnRleHRQYXJ0ID0gKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgYXMgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQpLlBhcmFtZXRlckNvbnRleHRVcmwhLnNwbGl0KFwiI1wiKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRhUGFyYW1Db250ZXh0UGFydC5sZW5ndGggPT09IDIgJiZcblx0XHRcdFx0XHRcdChvRGF0YS5zZWxlY3Rpb25WYXJpYW50IGFzIFNlcmlhbGl6ZWRTZWxlY3Rpb25WYXJpYW50KS5QYXJhbWV0ZXJzICYmXG5cdFx0XHRcdFx0XHR0aGlzLl9jb25zdHJ1Y3RDb250ZXh0VXJsKG9Nb2RlbCkuaW5kZXhPZihhUGFyYW1Db250ZXh0UGFydFswXSkgPT09IDBcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9FbnRpdHlTZXQgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5U2V0KGFQYXJhbUNvbnRleHRQYXJ0WzFdKTtcblx0XHRcdFx0XHRcdGlmIChvRW50aXR5U2V0KSB7XG5cdFx0XHRcdFx0XHRcdG9FbnRpdHlEZWYgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5VHlwZShvRW50aXR5U2V0LmVudGl0eVR5cGUpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b0VudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKGFGaWx0ZXJDb250ZXh0UGFydFsxXSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChvRW50aXR5RGVmKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChvRW50aXR5RGVmLnByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IG9FbnRpdHlEZWYucHJvcGVydHkubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLl9pc01lYXN1cmVQcm9wZXJ0eShvRW50aXR5RGVmLnByb3BlcnR5W2ldKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRhTWVhc3VyZVBhcmFtZXRlck5hbWUucHVzaChvRW50aXR5RGVmLnByb3BlcnR5W2ldLm5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChhTWVhc3VyZUZpbHRlck5hbWUubGVuZ3RoIHx8IGFNZWFzdXJlUGFyYW1ldGVyTmFtZS5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdC8vIFRROiBuZWVkcyBhdHRlbnRpb25cblx0XHRcdFx0XHRcdG9BZGFwdGVkRGF0YSA9IGV4dGVuZCh0cnVlIGFzIGFueSwge30sIG9BZGFwdGVkRGF0YSkgYXMgSW5uZXJBcHBEYXRhO1xuXG5cdFx0XHRcdFx0XHR0aGlzLl9yZW1vdmVQcm9wZXJ0aWVzKGFNZWFzdXJlRmlsdGVyTmFtZSwgYU1lYXN1cmVQYXJhbWV0ZXJOYW1lLCBvQWRhcHRlZERhdGEpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBhbm5vdGF0aW9ucyBhcmUgbm90IGxvYWRlZFxuXG5cdFx0XHRcdFx0dGhpcy5fcmVtb3ZlQWxsUHJvcGVydGllcyhvQWRhcHRlZERhdGEpO1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyOiBvTWV0YWRhdGEgYXJlIG5vdCBmdWxseSBsb2FkZWQhXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMub0NvbXBvbmVudCAmJiBvTW9kZWwgJiYgb01vZGVsLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsXCIpKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9yZW1vdmVTZW5zaXRpdmVEYXRhRm9yT0RhdGFWNChvQWRhcHRlZERhdGEsIHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb0FkYXB0ZWREYXRhO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgc2Vuc2l0aXZlIGRhdGEgZnJvbSB0aGUgbmF2aWdhdGlvbiBjb250ZXh0LlxuXHQgKiBAcGFyYW0gb0RhdGEgU2VsZWN0aW9uIHZhcmlhbnRcblx0ICogQHBhcmFtIGJNZWFzdXJlIFNob3VsZCBtZWFzdXJlcyBiZSByZW1vdmVkXG5cdCAqIEByZXR1cm5zIFRoZSBzZWxlY3Rpb24gdmFyaWFudCBhZnRlciBzZW5zaXRpdmUgZGF0YSBoYXMgYmVlbiByZW1vdmVkXG5cdCAqL1xuXHRfcmVtb3ZlU2Vuc2l0aXZlRGF0YUZvck9EYXRhVjQob0RhdGE6IElubmVyQXBwRGF0YSwgYk1lYXN1cmU/OiBib29sZWFuKTogSW5uZXJBcHBEYXRhIHtcblx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXMsXG5cdFx0XHRvU1YgPSBuZXcgU2VsZWN0aW9uVmFyaWFudChvRGF0YS5zZWxlY3Rpb25WYXJpYW50KSxcblx0XHRcdG9Nb2RlbCA9IHRoaXMuX2dldE1vZGVsKCk7XG5cdFx0bGV0IGFGaWx0ZXJDb250ZXh0UGFydDogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cblx0XHRpZiAoIW9Nb2RlbC5nZXRNZXRhTW9kZWwoKS5nZXRPYmplY3QoXCIvXCIpKSB7XG5cdFx0XHQvLyBhbm5vdGF0aW9ucyBhcmUgbm90IGxvYWRlZFxuXHRcdFx0dGhpcy5fcmVtb3ZlQWxsUHJvcGVydGllcyhvRGF0YSk7XG5cdFx0XHRMb2cuZXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlcjogb01ldGFkYXRhIGFyZSBub3QgZnVsbHkgbG9hZGVkIVwiKTtcblx0XHRcdHJldHVybiBvRGF0YTtcblx0XHR9XG5cblx0XHRpZiAoKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgYXMgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQpLkZpbHRlckNvbnRleHRVcmwpIHtcblx0XHRcdGFGaWx0ZXJDb250ZXh0UGFydCA9IChvRGF0YS5zZWxlY3Rpb25WYXJpYW50IGFzIFNlcmlhbGl6ZWRTZWxlY3Rpb25WYXJpYW50KS5GaWx0ZXJDb250ZXh0VXJsIS5zcGxpdChcIiNcIik7XG5cdFx0fVxuXG5cdFx0aWYgKFxuXHRcdFx0YUZpbHRlckNvbnRleHRQYXJ0Py5sZW5ndGggPT09IDIgJiZcblx0XHRcdChvRGF0YS5zZWxlY3Rpb25WYXJpYW50IGFzIFNlcmlhbGl6ZWRTZWxlY3Rpb25WYXJpYW50KS5TZWxlY3RPcHRpb25zICYmXG5cdFx0XHR0aGlzLl9jb25zdHJ1Y3RDb250ZXh0VXJsKG9Nb2RlbCkuaW5kZXhPZihhRmlsdGVyQ29udGV4dFBhcnRbMF0pID09PSAwXG5cdFx0KSB7XG5cdFx0XHRvU1YucmVtb3ZlU2VsZWN0T3B0aW9uKFwiQG9kYXRhLmNvbnRleHRcIik7XG5cdFx0XHRvU1YucmVtb3ZlU2VsZWN0T3B0aW9uKFwiQG9kYXRhLm1ldGFkYXRhRXRhZ1wiKTtcblx0XHRcdG9TVi5yZW1vdmVTZWxlY3RPcHRpb24oXCJTQVBfX01lc3NhZ2VzXCIpO1xuXG5cdFx0XHRjb25zdCBzRW50aXR5U2V0ID0gYUZpbHRlckNvbnRleHRQYXJ0WzFdLFxuXHRcdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRhUHJvcGVydHlOYW1lcyA9IG9TVi5nZXRQcm9wZXJ0eU5hbWVzKCkgfHwgW10sXG5cdFx0XHRcdGZuSXNTZW5zaXRpdmVEYXRhID0gZnVuY3Rpb24gKHNQcm9wOiBzdHJpbmcsIGVzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0XHRcdFx0ZXNOYW1lID0gZXNOYW1lIHx8IHNFbnRpdHlTZXQ7XG5cdFx0XHRcdFx0Y29uc3QgYVByb3BlcnR5QW5ub3RhdGlvbnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChcIi9cIiArIGVzTmFtZSArIFwiL1wiICsgc1Byb3AgKyBcIkBcIik7XG5cdFx0XHRcdFx0aWYgKGFQcm9wZXJ0eUFubm90YXRpb25zKSB7XG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdChiTWVhc3VyZSAmJiBhUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuTWVhc3VyZVwiXSkgfHxcblx0XHRcdFx0XHRcdFx0b05hdkhhbmRsZXIuX2NoZWNrUHJvcGVydHlBbm5vdGF0aW9uc0ZvclNlbnNpdGl2ZURhdGEoYVByb3BlcnR5QW5ub3RhdGlvbnMpXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGFQcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xcIl0pIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0ZpZWxkQ29udHJvbCA9IGFQcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xcIl07XG5cdFx0XHRcdFx0XHRcdGlmIChvRmllbGRDb250cm9sW1wiJEVudW1NZW1iZXJcIl0gJiYgb0ZpZWxkQ29udHJvbFtcIiRFbnVtTWVtYmVyXCJdLnNwbGl0KFwiL1wiKVsxXSA9PT0gXCJJbmFwcGxpY2FibGVcIikge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fTtcblxuXHRcdFx0Zm9yIChsZXQgayA9IDA7IGsgPCBhUHJvcGVydHlOYW1lcy5sZW5ndGg7IGsrKykge1xuXHRcdFx0XHRjb25zdCBzUHJvcGVydHkgPSBhUHJvcGVydHlOYW1lc1trXTtcblx0XHRcdFx0Ly8gcHJvcGVydGllcyBvZiB0aGUgZW50aXR5IHNldFxuXHRcdFx0XHRpZiAoZm5Jc1NlbnNpdGl2ZURhdGEoc1Byb3BlcnR5LCBzRW50aXR5U2V0KSkge1xuXHRcdFx0XHRcdG9TVi5yZW1vdmVTZWxlY3RPcHRpb24oc1Byb3BlcnR5KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudCA9IG9TVi50b0pTT05PYmplY3QoKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9EYXRhO1xuXHR9XG5cblx0X2NoZWNrUHJvcGVydHlBbm5vdGF0aW9uc0ZvclNlbnNpdGl2ZURhdGEoYVByb3BlcnR5QW5ub3RhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuICEhKFxuXHRcdFx0YVByb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxLklzUG90ZW50aWFsbHlTZW5zaXRpdmVcIl0gfHxcblx0XHRcdGFQcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkV4Y2x1ZGVGcm9tTmF2aWdhdGlvbkNvbnRleHRcIl1cblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgcGFyYW1ldGVyIHZhbHVlIG9mIHRoZSBzYXAtaWFwcC1zdGF0ZSAodGhlIGludGVybmFsIGFwcHMpIGZyb20gdGhlIEFwcEhhc2ggc3RyaW5nLiBJdCBhdXRvbWF0aWNhbGx5IHRha2VzIGNhcmUgYWJvdXRcblx0ICogY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHRoZSBvbGQgYW5kIHRoZSBuZXcgYXBwcm9hY2ggb2YgdGhlIHNhcC1pYXBwLXN0YXRlLiBQcmVjZWRlbmNlIGlzIHRoYXQgdGhlIG5ldyBhcHByb2FjaCBpcyBmYXZvdXJlZCBhZ2FpbnN0IHRoZSBvbGRcblx0ICogYXBwcm9hY2guXG5cdCAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiBzYXAtaWFwcC1zdGF0ZSAoaS5lLiB0aGUgbmFtZSBvZiB0aGUgY29udGFpbmVyIHRvIHJldHJpZXZlIHRoZSBwYXJhbWV0ZXJzKSwgb3IgPGNvZGU+dW5kZWZpbmVkPC9jb2RlPiBpblxuXHQgKiAgICAgICAgIGNhc2UgdGhhdCBubyBzYXAtaWFwcC1zdGF0ZSB3YXMgZm91bmQgaW4gPGNvZGU+c0FwcEhhc2g8L2NvZGU+LlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0Z2V0SUFwcFN0YXRlS2V5KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgc0FwcEhhc2ggPSBIYXNoQ2hhbmdlci5nZXRJbnN0YW5jZSgpLmdldEhhc2goKTtcblx0XHRyZXR1cm4gdGhpcy5fZ2V0SW5uZXJBcHBTdGF0ZUtleShzQXBwSGFzaCk7XG5cdH1cbn1cblxuLy8gRXhwb3J0aW5nIHRoZSBjbGFzcyBhcyBwcm9wZXJseSB0eXBlZCBVSTVDbGFzc1xuXG5jb25zdCBOYXZpZ2F0aW9uSGFuZGxlclVJNUNsYXNzID0gQmFzZU9iamVjdC5leHRlbmQoXG5cdFwic2FwLmZlLm5hdmlnYXRpb24uTmF2aWdhdGlvbkhhbmRsZXJcIixcblx0TmF2aWdhdGlvbkhhbmRsZXIucHJvdG90eXBlIGFzIGFueVxuKSBhcyB0eXBlb2YgTmF2aWdhdGlvbkhhbmRsZXI7XG50eXBlIE5hdmlnYXRpb25IYW5kbGVyVUk1Q2xhc3MgPSBJbnN0YW5jZVR5cGU8dHlwZW9mIE5hdmlnYXRpb25IYW5kbGVyPjtcbmV4cG9ydCBkZWZhdWx0IE5hdmlnYXRpb25IYW5kbGVyVUk1Q2xhc3M7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7RUFtQ0E7QUFDQTtBQUNBOztFQWtDQTtFQUNBLE1BQU1BLE9BQU8sR0FBR0MsVUFBVSxDQUFDRCxPQUFPO0VBQ2xDLE1BQU1FLGlCQUFpQixHQUFHRCxVQUFVLENBQUNDLGlCQUFpQjtFQUN0RCxNQUFNQyxtQkFBbUIsR0FBR0YsVUFBVSxDQUFDRSxtQkFBbUI7RUFDMUQsTUFBTUMsSUFBSSxHQUFHSCxVQUFVLENBQUNHLElBQUk7RUFFNUIsTUFBTUMsVUFBVSxHQUFHLGdCQUFnQjtFQUNuQyxNQUFNQyw0QkFBNEIsR0FBRyxvQ0FBb0M7RUFDekUsTUFBTUMscUJBQXFCLEdBQUcsc0JBQXNCOztFQUVwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFqQkEsSUFrQmFDLGlCQUFpQiwwQkFBQUMsV0FBQTtJQXNEN0I7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDLFNBQUFELGtCQUNDRSxXQUFxQyxFQUNyQ0MsS0FBYSxHQUFHUCxJQUFJLENBQUNRLE9BQU8sRUFDNUJDLGtCQUEwQixHQUFHWCxpQkFBaUIsQ0FBQ1ksVUFBVSxFQUN4RDtNQUFBLElBQUFDLEtBQUE7TUFDREEsS0FBQSxHQUFBTixXQUFBLENBQUFPLElBQUEsS0FBTSxDQUFDO01BcEVSO01BQUFELEtBQUEsQ0FDUUUscUJBQXFCLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQztNQUFBRixLQUFBLENBRTVDRyx1QkFBdUIsR0FBUTtRQUN0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