@sapui5/sap.fe.core 1.136.10 → 1.136.11

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.
Files changed (35) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/PageController.controller.js +10 -0
  4. package/src/sap/fe/core/PageController.controller.ts +3 -0
  5. package/src/sap/fe/core/controllerextensions/InternalRouting.js +23 -13
  6. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +34 -13
  7. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +7 -6
  8. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +8 -5
  9. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +2 -1
  10. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +1 -0
  11. package/src/sap/fe/core/converters/controls/Common/Action.js +15 -1
  12. package/src/sap/fe/core/converters/controls/Common/Action.ts +21 -1
  13. package/src/sap/fe/core/converters/controls/Common/Table.js +54 -46
  14. package/src/sap/fe/core/converters/controls/Common/Table.ts +65 -45
  15. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +26 -6
  16. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +32 -10
  17. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +12 -18
  18. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +13 -27
  19. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +5 -2
  20. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +7 -1
  21. package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +8 -3
  22. package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +7 -2
  23. package/src/sap/fe/core/fpm/manifest.json +1 -1
  24. package/src/sap/fe/core/helpers/AppStartupHelper.js +75 -18
  25. package/src/sap/fe/core/helpers/AppStartupHelper.ts +79 -25
  26. package/src/sap/fe/core/helpers/MetaModelFunction.js +10 -3
  27. package/src/sap/fe/core/helpers/MetaModelFunction.ts +9 -3
  28. package/src/sap/fe/core/library.js +1 -1
  29. package/src/sap/fe/core/messagebundle_es.properties +1 -1
  30. package/src/sap/fe/core/messagebundle_fr.properties +1 -1
  31. package/src/sap/fe/core/messagebundle_ko.properties +1 -1
  32. package/src/sap/fe/core/messagebundle_no.properties +2 -2
  33. package/src/sap/fe/core/services/RoutingServiceFactory.js +4 -2
  34. package/src/sap/fe/core/services/RoutingServiceFactory.ts +5 -2
  35. package/ui5.yaml +1 -0
@@ -303,8 +303,10 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
303
303
  const propertyTypeConfig = getTypeConfig(property, dataType);
304
304
  const isAPropertyFromTextOnlyAnnotation = displayModeOfDescriptionPropertiesMap[relativePath] === "Description";
305
305
  const sortable = (!isHidden || isAPropertyFromTextOnlyAnnotation) && !restrictionsOnProperties?.nonSortableProperties.includes(relativePath);
306
+ const isAnalyticalTable = aggregationHelper.isAnalyticsSupported() && tableType === "AnalyticalTable";
306
307
  const filterable = !restrictionsOnProperties?.nonFilterableProperties.includes(relativePath);
307
- const groupable = aggregationHelper.isAnalyticsSupported() && tableType === "AnalyticalTable" ? !!aggregationHelper.isPropertyGroupable(property) : sortable;
308
+ // groupable properties on an analytical table should consider hidden properties and text only annotations as other table types do
309
+ const groupable = isAnalyticalTable ? !!aggregationHelper.isPropertyGroupable(property) && (!isHidden || isAPropertyFromTextOnlyAnnotation) : sortable;
308
310
  const typeConfig = {
309
311
  className: property.type || dataType,
310
312
  formatOptions: propertyTypeConfig.formatOptions,
@@ -346,15 +348,33 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
346
348
  };
347
349
  _addToolTip(property, column);
348
350
  _setExportSettingsForDataPoint(property, column);
349
- if (aggregationHelper.isAnalyticsSupported() && ModelHelper.isObjectPathDraftSupported(converterContext.getDataModelObjectPath()) && (relativePath === "HasActiveEntity" || relativePath === "HasDraftEntity" || relativePath === "IsActiveEntity")) {
350
- // In case of analytical table on a draft-enabled entity, we always consider the HasDraftEntity, HasActiveEntity and IsActiveEntity properties as
351
- // technically groupable, as we need to load them for our internal logic.
351
+ if (isAnalyticalTable) {
352
+ setTechnicalExtension(column, property, aggregationHelper, converterContext, relativePath);
353
+ }
354
+ return column;
355
+ };
356
+
357
+ /**
358
+ * Sets the technical extension for analytics scenarios.
359
+ * @param column The table column
360
+ * @param property The property linked to the column
361
+ * @param aggregationHelper The aggregation helper
362
+ * @param converterContext The converter context
363
+ * @param relativePath The relative path of the property
364
+ */
365
+ const setTechnicalExtension = function (column, property, aggregationHelper, converterContext, relativePath) {
366
+ const isDraftSupported = ModelHelper.isObjectPathDraftSupported(converterContext.getDataModelObjectPath());
367
+ const draftProperties = ["HasActiveEntity", "HasDraftEntity", "IsActiveEntity"];
368
+ const isDraftProperty = draftProperties.includes(relativePath);
369
+ const isGroupableProperty = !!aggregationHelper.isPropertyGroupable(property);
370
+ if (isDraftSupported && isDraftProperty ||
371
+ // column.isGroupable can be false when the property is hidden but it could be technically groupable
372
+ isGroupableProperty && !column.isGroupable) {
352
373
  column.extension = {
353
374
  technicallyAggregatable: false,
354
375
  technicallyGroupable: true
355
376
  };
356
377
  }
357
- return column;
358
378
  };
359
379
 
360
380
  /**
@@ -1684,4 +1704,4 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
1684
1704
  }
1685
1705
  return _exports;
1686
1706
  }, false);
1687
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb2x1bW5UeXBlIiwiX2V4cG9ydHMiLCJnZXRUYWJsZUNvbHVtbnMiLCJsaW5lSXRlbUFubm90YXRpb24iLCJ0YWJsZVR5cGUiLCJ2aXN1YWxpemF0aW9uUGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJhbm5vdGF0aW9uQ29sdW1ucyIsImdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMiLCJtYW5pZmVzdENvbHVtbnMiLCJnZXRDb2x1bW5zRnJvbU1hbmlmZXN0IiwiZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbiIsImNvbHVtbnMiLCJnZXRBbm5vdGF0aW9uRW50aXR5VHlwZSIsInRhYmxlQ29sdW1ucyIsImluc2VydEN1c3RvbUVsZW1lbnRzIiwid2lkdGgiLCJPdmVycmlkZVR5cGUiLCJvdmVyd3JpdGUiLCJ3aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlciIsImltcG9ydGFuY2UiLCJob3Jpem9udGFsQWxpZ24iLCJhdmFpbGFiaWxpdHkiLCJpc05hdmlnYWJsZSIsInNldHRpbmdzIiwiZm9ybWF0T3B0aW9ucyIsImV4cG9ydFNldHRpbmdzIiwiYWRkQ29tcHV0ZWRDb2x1bW5zIiwiZmluZENvbHVtbkJ5UGF0aCIsInBhdGgiLCJmaW5kIiwiY29sdW1uIiwiYW5ub3RhdGlvbkNvbHVtbiIsInByb3BlcnR5SW5mb3MiLCJ1bmRlZmluZWQiLCJyZWxhdGl2ZVBhdGgiLCJ1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsImdldENvbnZlcnRlckNvbnRleHRGb3IiLCJnZXRDb250ZXh0UGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJmb3JFYWNoIiwib0NvbHVtbiIsInRhYmxlQ29sdW1uIiwicHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwiZW5oYW5jZURhdGFNb2RlbFBhdGgiLCJwcm9wZXJ0eSIsInRhcmdldE9iamVjdCIsImFkZEN1cnJlbmN5T3JVb01Ub1Byb3BlcnR5IiwidGltZXpvbmVQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5IiwidGltZXpvbmUiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIlRpbWV6b25lIiwib1RpbWV6b25lQ29sdW1uIiwibmFtZSIsInRpbWV6b25lVGV4dCIsInRvU3RyaW5nIiwiYWRkVGV4dEFycmFuZ2VudEluZm9Ub1Byb3BlcnR5IiwiY3VycmVuY3lPclVvTVByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoIiwiZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgiLCJjdXJyZW5jeU9yVW9NUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwiY3VycmVuY3lPclVvTVJlbGF0aXZlUGF0aCIsImdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgiLCJ1bml0Q29sdW1uIiwidW5pdCIsIk1lYXN1cmVzIiwiSVNPQ3VycmVuY3kiLCJVbml0IiwidW5pdFRleHQiLCJkaXNwbGF5TW9kZSIsImdldERpc3BsYXlNb2RlIiwidGFyZ2V0RW50aXR5VHlwZSIsInRleHRQcm9wZXJ0eVBhdGgiLCJnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5UGF0aCIsInRleHRQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgiLCJ0ZXh0UmVsYXRpdmVQYXRoIiwidGV4dENvbHVtbiIsInRleHRBcnJhbmdlbWVudCIsInRleHRQcm9wZXJ0eSIsIm1vZGUiLCJ0eXBlIiwiZ2V0Q29sdW1uc0Zyb21FbnRpdHlUeXBlIiwiY29sdW1uc1RvQmVDcmVhdGVkIiwiZW50aXR5VHlwZSIsInRhYmxlQ3JlYXRpb25Nb2RlIiwiZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCIsInJlc3RyaWN0aW9uc09uUHJvcGVydGllcyIsInByb3BlcnRpZXNOb3RUb0JlQ29uc2lkZXJlZCIsImFnZ3JlZ2F0aW9uSGVscGVyIiwiQWdncmVnYXRpb25IZWxwZXIiLCJncm91cGFibGVQcm9wZXJ0aWVzIiwiZ2V0R3JvdXBhYmxlUHJvcGVydGllcyIsImlzQW5hbHl0aWNzU3VwcG9ydGVkIiwibWFwIiwiJHRhcmdldCIsImZpbHRlciIsInRhcmdldCIsImdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHkiLCJ0ZXh0UHJvcCIsImlzUHJvcGVydHlHcm91cGFibGUiLCJwcm9wIiwiZW50aXR5UHJvcGVydGllcyIsImV4aXN0cyIsInNvbWUiLCJ0YXJnZXRUeXBlIiwiaW5jbHVkZXMiLCJyZWxhdGVkUHJvcGVydGllc0luZm8iLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMiLCJyZWxhdGVkUHJvcGVydHlOYW1lcyIsIk9iamVjdCIsImtleXMiLCJwcm9wZXJ0aWVzIiwiYWRkaXRpb25hbFByb3BlcnR5TmFtZXMiLCJhZGRpdGlvbmFsUHJvcGVydGllcyIsImFkZFByb3BlcnR5VG9EaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwIiwiY29sdW1uSW5mbyIsImdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkiLCJnZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwibGVuZ3RoIiwiZGF0YVBvaW50VGFyZ2V0VmFsdWUiLCJleHBvcnREYXRhUG9pbnRUYXJnZXRWYWx1ZSIsImFubm90YXRpb25Qcm9wZXJ0eSIsImFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zIiwiYWRkaXRpb25hbFByb3BlcnR5TmFtZSIsInB1c2giLCJub25Tb3J0YWJsZVByb3BlcnRpZXMiLCJpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiIsIlRleHQiLCJyZWxhdGVkQ29sdW1ucyIsIl9jcmVhdGVSZWxhdGVkQ29sdW1ucyIsImNvbmNhdCIsImZ1bGxQcm9wZXJ0eVBhdGgiLCJ1c2VEYXRhRmllbGRQcmVmaXgiLCJhdmFpbGFibGVGb3JBZGFwdGF0aW9uIiwicmVsYXRpdmVQYXRoRm9yTXVsdGlWYWx1ZSIsInNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGgiLCJnZXRTZW1hbnRpY09iamVjdFBhdGgiLCJpc0hpZGRlbiIsImlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuIiwiZ3JvdXBQYXRoIiwiX3NsaWNlQXRTbGFzaCIsImlzR3JvdXAiLCJsYWJlbCIsImdldExhYmVsIiwiZGF0YVR5cGUiLCJnZXREYXRhRmllbGREYXRhVHlwZSIsInByb3BlcnR5VHlwZUNvbmZpZyIsImdldFR5cGVDb25maWciLCJpc0FQcm9wZXJ0eUZyb21UZXh0T25seUFubm90YXRpb24iLCJzb3J0YWJsZSIsImZpbHRlcmFibGUiLCJub25GaWx0ZXJhYmxlUHJvcGVydGllcyIsImdyb3VwYWJsZSIsInR5cGVDb25maWciLCJjbGFzc05hbWUiLCJjb25zdHJhaW50cyIsIl9pc0V4cG9ydGFibGVDb2x1bW4iLCJjcmVhdGVDb2x1bW5FeHBvcnRTZXR0aW5ncyIsImNvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscyIsIl9nZXRDb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHMiLCJrZXkiLCJyZXBsYWNlU3BlY2lhbENoYXJzIiwiQW5ub3RhdGlvbiIsImdyb3VwTGFiZWwiLCJncm91cCIsImFubm90YXRpb25QYXRoIiwic2VtYW50aWNPYmplY3RQYXRoIiwiaXNHcm91cGFibGUiLCJpc0tleSIsImNhc2VTZW5zaXRpdmUiLCJpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUiLCJnZXRJbXBvcnRhbmNlIiwiVUkiLCJEYXRhRmllbGREZWZhdWx0IiwicmVxdWlyZWQiLCJpc1JlcXVpcmVkQ29sdW1uIiwiYWRkaXRpb25hbExhYmVscyIsIl9hZGRUb29sVGlwIiwiX3NldEV4cG9ydFNldHRpbmdzRm9yRGF0YVBvaW50IiwiTW9kZWxIZWxwZXIiLCJpc09iamVjdFBhdGhEcmFmdFN1cHBvcnRlZCIsImV4dGVuc2lvbiIsInRlY2huaWNhbGx5QWdncmVnYXRhYmxlIiwidGVjaG5pY2FsbHlHcm91cGFibGUiLCJ1bml0UHJvcGVydHkiLCJ1dGMiLCJpc0FUaW1lem9uZSIsImN1cnJlbmN5UHJvcGVydHkiLCJzY2FsZSIsImlzUHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkiLCJnZXRTdGF0aWNVbml0T3JDdXJyZW5jeSIsImdldFN0YXRpY1RpbWV6b25lIiwiaXNUaW1lem9uZSIsImV4cG9ydFR5cGUiLCJnZXRFeHBvcnREYXRhVHlwZSIsImlucHV0Rm9ybWF0IiwiZ2V0RGF0ZUlucHV0Rm9ybWF0IiwiZGVsaW1pdGVyIiwiZ2V0RGVsaW1pdGVyIiwidGVtcGxhdGUiLCJ3cmFwIiwiYXV0b1NjYWxlIiwicmVtb3ZlVW5kZWZpbmVkRnJvbUV4cG9ydFNldHRpbmdzIiwic2V0dGluZyIsInNvdXJjZSIsInByb3BlcnR5VHlwZSIsImRhdGFGaWVsZERlZmF1bHRQcm9wZXJ0eSIsIiRUeXBlIiwiVGFyZ2V0IiwiVmFsdWUiLCJDb3JlIiwiTWVkaWFUeXBlIiwidGVybSIsImlzVVJMIiwiX2lzVmFsaWRDb2x1bW4iLCJkYXRhRmllbGQiLCJJbmxpbmUiLCJfZ2V0VmlzaWJsZUV4cHJlc3Npb24iLCJkYXRhRmllbGRNb2RlbFBhdGgiLCJwcm9wZXJ0eVZhbHVlIiwiaXNBbmFseXRpY2FsR3JvdXBIZWFkZXJFeHBhbmRlZCIsImNvbnN0YW50IiwiaXNBbmFseXRpY2FsTGVhZiIsImFuZCIsIm5vdCIsImVxdWFsIiwiZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uIiwiSGlkZGVuIiwiaWZFbHNlIiwib3IiLCJfZ2V0RmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zIiwiZGF0YUZpZWxkR3JvdXAiLCJmaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMiLCJjb21waWxlRXhwcmVzc2lvbiIsIkRhdGEiLCJpbm5lckRhdGFGaWVsZCIsImFyZ3VtZW50cyIsImlzTmF2aWdhdGlvblByb3BlcnR5IiwiZGF0YUZpZWxkRGVmYXVsdCIsInF1YWxpZmllciIsIkxhYmVsIiwiaXNEYXRhRmllbGRUeXBlcyIsInZhbHVlT2YiLCJfZ2V0VG9vbHRpcCIsIlF1aWNrSW5mbyIsImRhdGFwb2ludFRhcmdldCIsImdldFJvd1N0YXR1c1Zpc2liaWxpdHkiLCJjb2xOYW1lIiwiaXNTZW1hbnRpY0tleUluRmllbGRHcm91cCIsImZvcm1hdFJlc3VsdCIsInBhdGhJbk1vZGVsIiwidGFibGVGb3JtYXR0ZXJzIiwiZ2V0RXJyb3JTdGF0dXNUZXh0VmlzaWJpbGl0eUZvcm1hdHRlciIsImV4aXN0aW5nQ29sdW1ucyIsInJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXAiLCJnZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoIiwicmVsYXRlZENvbHVtbiIsInByb3BlcnR5T2JqZWN0UGF0aCIsImlzTXVsdGlWYWx1ZUZpZWxkIiwibmV3TmFtZVJlbGF0aXZlVGFyZ2V0UGF0aCIsImNvbXB1dGVIaWRkZW5PblJlbGF0ZWRDb2x1bW5zIiwibmV3TmFtZSIsInByb3BlcnR5SW5mbyIsIl9nZXRBbm5vdGF0aW9uQ29sdW1uTmFtZSIsIktleUhlbHBlciIsImdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZCIsIl9nZXRTaG93RGF0YUZpZWxkc0xhYmVsIiwiZmllbGRHcm91cE5hbWUiLCJjb2x1bW5LZXlzIiwic2hvd0RhdGFGaWVsZHNMYWJlbCIsIl9nZXRSZWxhdGl2ZVBhdGgiLCJ2YWx1ZSIsImlzTGFzdFNsYXNoIiwiaXNMYXN0UGFydCIsImlTbGFzaEluZGV4IiwibGFzdEluZGV4T2YiLCJpbmRleE9mIiwic3Vic3RyaW5nIiwiX2lzQ29sdW1uTXVsdGlWYWx1ZWQiLCJfaXNDb2x1bW5Tb3J0YWJsZSIsInByb3BlcnR5UGF0aCIsIm5vblNvcnRhYmxlQ29sdW1ucyIsInByb3BOYW1lIiwiZmlsdGVyRnVuY3Rpb25zIiwiX2dldEZpbHRlckZ1bmN0aW9ucyIsIkNvbnZlcnRlckNvbnRleHQiLCJlbnRpdHlTZXQiLCJnZXRFbnRpdHlTZXQiLCJUeXBlR3VhcmRzIiwiaXNFbnRpdHlTZXQiLCJDYXBhYmlsaXRpZXMiLCJGaWx0ZXJGdW5jdGlvbnMiLCJnZXRFbnRpdHlDb250YWluZXIiLCJfZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZSIsInRleHRMaW5lc0VkaXQiLCJfZmluZFNlbWFudGljS2V5VmFsdWVzIiwic2VtYW50aWNLZXlzIiwiYVNlbWFudGljS2V5VmFsdWVzIiwiYlNlbWFudGljS2V5Rm91bmQiLCJpIiwidmFsdWVzIiwic2VtYW50aWNLZXlGb3VuZCIsIl9maW5kUHJvcGVydGllcyIsInNlbWFudGljS2V5VmFsdWVzIiwiZmllbGRHcm91cFByb3BlcnRpZXMiLCJzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwIiwic1Byb3BlcnR5UGF0aCIsInRtcCIsImZpZWxkR3JvdXBQcm9wZXJ0eVBhdGgiLCJfZmluZFNlbWFudGljS2V5VmFsdWVzSW5GaWVsZEdyb3VwIiwiYVByb3BlcnRpZXMiLCJfcHJvcGVydGllc0ZvdW5kIiwiZ2V0RGVmYXVsdERyYWZ0SW5kaWNhdG9yRm9yQ29sdW1uIiwic2VtYW50aWNLZXkiLCJzZW1hbnRpY0tleUluRmllbGRHcm91cCIsImZpZWxkR3JvdXBEcmFmdEluZGljYXRvclByb3BlcnR5UGF0aCIsInNob3dFcnJvck9iamVjdFN0YXR1cyIsImhhc0RyYWZ0SW5kaWNhdG9yIiwiX2dldEltcE51bWJlciIsIkltcG9ydGFuY2UiLCJfZ2V0RGF0YUZpZWxkSW1wb3J0YW5jZSIsInNwbGl0IiwiTm9uZSIsInRhcmdldFZhbHVlZnJvbURQIiwiZ2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludCIsImlzRGF0YVBvaW50RnJvbURhdGFGaWVsZERlZmF1bHQiLCJfZ2V0TWF4SW1wb3J0YW5jZSIsImZpZWxkcyIsIm1heEltcE51bWJlciIsImltcE51bWJlciIsIkRhdGFGaWVsZFdpdGhNYXhJbXBvcnRhbmNlIiwiZmllbGQiLCJTZW1hbnRpY0tleSIsInJlcXVpcmVkUHJvcGVydGllcyIsImdldFJlcXVpcmVkUHJvcGVydGllcyIsImhpZ2hLZXlzIiwiZmllbGRzV2l0aEltcG9ydGFuY2UiLCJpc0Fubm90YXRpb25PZlR5cGUiLCJkYXRhRmllbGRUYXJnZXQiLCJmaWVsZEdyb3VwRGF0YSIsImZpZWxkR3JvdXBEYXRhRmllbGQiLCJIaWdoIiwiaXRlbSIsImdldFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyIsInRhYmxlTWFuaWZlc3RTZXR0aW5ncyIsImRlZmF1bHRDcmVhdGlvbk1vZGUiLCJnZXRNYW5pZmVzdFdyYXBwZXIiLCJnZXRTYXBGZU1hbmlmZXN0Q29uZmlndXJhdGlvbiIsIm1hY3JvcyIsInRhYmxlIiwiQ3JlYXRpb25Nb2RlIiwiSW5saW5lQ3JlYXRpb25Sb3dzIiwidGFibGVTZXR0aW5ncyIsImNyZWF0aW9uTW9kZSIsImdldEFubm90YXRpb25zQnlUZXJtIiwiZ2V0RW50aXR5VHlwZSIsInRhYmxlQ29udmVydGVyQ29udGV4dCIsImdldFRhcmdldE9iamVjdFBhdGgiLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseSIsImlzRmllbGRHcm91cENvbHVtbiIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwic2l0dWF0aW9uc05hdlByb3BzIiwibmF2aWdhdGlvblByb3BlcnR5IiwiaXNDb2xsZWN0aW9uIiwiU0FQT2JqZWN0Tm9kZVR5cGUiLCJOYW1lIiwic2l0dWF0aW9uc05hdlByb3AiLCJoYXNTaXR1YXRpb25zSW5kaWNhdG9yIiwiaXNNdWx0aVZhbHVlIiwidmlzdWFsU2V0dGluZ3MiLCJ3aWR0aENhbGN1bGF0aW9uIiwiRmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zIiwiSFRNTDUiLCJDc3NEZWZhdWx0cyIsImlzUGFydE9mTGluZUl0ZW0iLCJ0b29sdGlwIiwicmVsYXRlZFByb3BlcnR5TmFtZSIsImRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uIiwiY3JlYXRlUHJvcGVydHlBbm5vdGF0ZWRUZXh0T25seSIsIl9nZXRQcm9wZXJ0eU5hbWVzIiwibWF0Y2hlZFByb3BlcnRpZXMiLCJBcnJheSIsImlzQXJyYXkiLCJyZXNvbHZlUGF0aCIsImlzUmVxdWlyZWRGaWVsZEdyb3VwIiwiZmllbGRHcm91cCIsImlzRGF0YUZpZWxkIiwiaXNTdGF0aWNhbGx5TWFuZGF0b3J5IiwiaXNBbm5vdGF0ZWRSZXF1aXJlZFByb3BlcnR5IiwiaXNSZXF1aXJlZERhdGFGaWVsZEZvckFubm90YXRpb24iLCJkYXRhRmllbGRGb3JBbm5vdGF0aW9uIiwiRGF0YUZpZWxkRm9yQW5ub3RhdGlvbkZpZWxkQ29udHJvbE5vdE1hbmRhdG9yeSIsImhhc0ZpZWxkQ29udHJvbE5vdE1hbmRhdG9yeSIsImhhc0ZpZWxkR3JvdXBUYXJnZXQiLCJoYXNEYXRhUG9pbnRUYXJnZXQiLCJWaXN1YWxpemF0aW9uIiwiaXNSZXF1aXJlZERhdGFQb2ludCIsImlzUmVxdWlyZWRQcm9wZXJ0eSIsImlzUmF0aW5nVmlzdWFsaXphdGlvbkZyb21EYXRhRmllbGREZWZhdWx0IiwiZGF0YVBvaW50IiwiZ2V0VGVtcGxhdGVUeXBlIiwiVGVtcGxhdGVUeXBlIiwiTGlzdFJlcG9ydCIsIkFuYWx5dGljYWxMaXN0UGFnZSIsIklzRWRpdGFibGUiLCJpc0RhdGFGaWVsZEZvckFubm90YXRpb24iLCJfYXBwZW5kQ3VzdG9tVGVtcGxhdGUiLCJleHBvcnRQcm9wZXJ0aWVzIiwiam9pbiIsImludGVybmFsQ29sdW1ucyIsImlzQ29sdW1uT3ZlcnJpZGUiLCJpc1Nsb3RDb2x1bW4iLCJtYW5pZmVzdENvbHVtbiIsIlNsb3QiLCJpc0N1c3RvbUNvbHVtbiIsIl91cGRhdGVMaW5rZWRQcm9wZXJ0aWVzT25DdXN0b21Db2x1bW5zIiwiYW5ub3RhdGlvblRhYmxlQ29sdW1ucyIsInJlcGxhY2UiLCJpc1BhcnRPZkN1c3RvbUNvbHVtbiIsInZhbGlkYXRlS2V5IiwiYmFzZVRhYmxlQ29sdW1uIiwicG9zaXRpb24iLCJhbmNob3IiLCJwbGFjZW1lbnQiLCJQbGFjZW1lbnQiLCJBZnRlciIsInByb3BlcnRpZXNUb092ZXJ3cml0ZUFubm90YXRpb25Db2x1bW4iLCJnZXRDdXN0b21FeHBvcnRTZXR0aW5ncyIsInRvb2x0aXBUZXh0IiwiZmV0Y2hUZXh0RnJvbU1ldGFNb2RlbCIsImhlYWRlclRleHQiLCJoZWFkZXIiLCJjdXN0b21Db2x1bW5FeHBvcnRTZXR0aW5ncyIsImJhc2VNYW5pZmVzdENvbHVtbiIsIkhvcml6b250YWxBbGlnbiIsIkJlZ2luIiwiaWQiLCJjdXN0b21UYWJsZUNvbHVtbiIsIkRlZmF1bHQiLCJtZXNzYWdlIiwiZ2V0RGlhZ25vc3RpY3MiLCJhZGRJc3N1ZSIsIklzc3VlQ2F0ZWdvcnkiLCJNYW5pZmVzdCIsIklzc3VlU2V2ZXJpdHkiLCJMb3ciLCJJc3N1ZUNhdGVnb3J5VHlwZSIsIkFubm90YXRpb25Db2x1bW5zIiwiSW52YWxpZEtleSIsImNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yIiwic2l0dWF0aW9uc0luZGljYXRvckNvbHVtbiIsInByb3BlcnR5S2V5IiwiaXNTaXR1YXRpb25zSW5kaWNhdG9yIiwiQ29tcHV0ZWQiLCJjbGlwYm9hcmRTZXR0aW5ncyIsImluZGV4T2ZGaXJzdFZpc2libGVDb2x1bW4iLCJmaW5kSW5kZXgiLCJzcGxpY2UiLCJjb2x1bW5zV2l0aERyYWZ0SW5kaWNhdG9yIiwiaXNEcmFmdE5vZGUiLCJpc0RyYWZ0Um9vdCIsImNvbHVtbldpdGhEcmFmdEluZGljYXRvciIsImRyYWZ0SW5kaWNhdG9yQ29sdW1uIiwiaXNEcmFmdEluZGljYXRvciIsImNvbHVtbkluZGV4VG9JbnNlcnRBZnRlciIsImdldENvbnRleHRQcm9wZXJ0eVJlc3RyaWN0aW9uIiwiY2FwYWJpbGl0aWVzIiwiSW5zZXJ0UmVzdHJpY3Rpb25zIiwiUmVxdWlyZWRQcm9wZXJ0aWVzIiwiaXNDdXJyZW5jeSIsImV4cG9ydERhdGFUeXBlIiwibmF2UHJvcGVydHkiLCJsaW5lSXRlbSIsImlzUHJvcGVydHlOYXZpZ2F0ZWQiLCJpbmhlcmVkUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwiaXNJbmhlcmVkUHJvcGVydHlOYXZpZ2F0ZWQiLCJ0YXJnZXRNYXBwaW5nIiwiaXNUeXBlRGVmaW5pdGlvbiIsIkVETV9UWVBFX01BUFBJTkciLCJ1bmRlcmx5aW5nVHlwZSIsInNldFVwQ29uc3RyYWludHMiLCJwYXJzZUFzU3RyaW5nIiwiZW1wdHlTdHJpbmciLCJudWxsYWJsZSIsInBhcnNlS2VlcHNFbXB0eVN0cmluZyIsInJlbGF0ZWRBbm5vdGF0aW9uQ29sdW1ucyIsImV4aXN0aW5nQ29sdW1uIiwiY29sdW1uS2V5IiwiY29sdW1uRnJvbUFubm90YXRpb25zIiwiZW5hYmxlV3JhcHBpbmciLCJjdXN0b21FeHBvcnRTZXR0aW5ncyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQ29sdW1ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEVudGl0eVR5cGUsIE5hdmlnYXRpb25Qcm9wZXJ0eSwgUHJvcGVydHksIFByb3BlcnR5UGF0aCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBGaWx0ZXJGdW5jdGlvbnMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NhcGFiaWxpdGllc1wiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXRBbm5vdGF0aW9uc19DYXBhYmlsaXRpZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NhcGFiaWxpdGllc19FZG1cIjtcbmltcG9ydCB0eXBlIHsgU2VtYW50aWNLZXkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW1vblwiO1xuaW1wb3J0IHsgQ29tbW9uQW5ub3RhdGlvblRlcm1zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25cIjtcbmltcG9ydCB0eXBlIHtcblx0RGF0YUZpZWxkLFxuXHREYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHREYXRhRmllbGRGb3JBbm5vdGF0aW9uLFxuXHREYXRhRmllbGRUeXBlcyxcblx0RGF0YVBvaW50LFxuXHREYXRhUG9pbnRUeXBlVHlwZXMsXG5cdEZpZWxkR3JvdXAsXG5cdExpbmVJdGVtXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB7IFVJQW5ub3RhdGlvblRlcm1zLCBVSUFubm90YXRpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB0eXBlIHsgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLCBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHtcblx0RURNX1RZUEVfTUFQUElORyxcblx0YW5kLFxuXHRjb21waWxlRXhwcmVzc2lvbixcblx0Y29uc3RhbnQsXG5cdGVxdWFsLFxuXHRmb3JtYXRSZXN1bHQsXG5cdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbixcblx0aWZFbHNlLFxuXHRub3QsXG5cdG9yLFxuXHRwYXRoSW5Nb2RlbCxcblx0c2V0VXBDb25zdHJhaW50c1xufSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB0eXBlIENvbnZlcnRlckNvbnRleHQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUge1xuXHRBdmFpbGFiaWxpdHlUeXBlLFxuXHRDdXN0b21EZWZpbmVkVGFibGVDb2x1bW4sXG5cdEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbkZvck92ZXJyaWRlLFxuXHRGb3JtYXRPcHRpb25zVHlwZSxcblx0VGFibGVDb2x1bW5TZXR0aW5ncyxcblx0VGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgQ3JlYXRpb25Nb2RlLCBIb3Jpem9udGFsQWxpZ24sIEltcG9ydGFuY2UsIFRlbXBsYXRlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB0eXBlIHsgUGFnZUNvbnRleHRQYXRoVGFyZ2V0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgQ29tcGxleFByb3BlcnR5SW5mbyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2Fubm90YXRpb25zL0RhdGFGaWVsZFwiO1xuaW1wb3J0IHtcblx0Y29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseSxcblx0Z2V0RGF0YUZpZWxkRGF0YVR5cGUsXG5cdGdldFNlbWFudGljT2JqZWN0UGF0aCxcblx0Z2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludCxcblx0aGFzRGF0YVBvaW50VGFyZ2V0LFxuXHRoYXNGaWVsZEdyb3VwVGFyZ2V0LFxuXHRpc0RhdGFGaWVsZCxcblx0aXNEYXRhRmllbGRGb3JBbm5vdGF0aW9uLFxuXHRpc0RhdGFGaWVsZFR5cGVzLFxuXHRpc0RhdGFQb2ludEZyb21EYXRhRmllbGREZWZhdWx0LFxuXHRpc1JhdGluZ1Zpc3VhbGl6YXRpb25Gcm9tRGF0YUZpZWxkRGVmYXVsdFxufSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9hbm5vdGF0aW9ucy9EYXRhRmllbGRcIjtcbmltcG9ydCB7IHR5cGUgVGFibGVUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL1RhYmxlXCI7XG5pbXBvcnQgeyBBZ2dyZWdhdGlvbkhlbHBlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQWdncmVnYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhYmxlT2JqZWN0LCBDdXN0b21FbGVtZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7IE92ZXJyaWRlVHlwZSwgUGxhY2VtZW50LCBpbnNlcnRDdXN0b21FbGVtZW50cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgeyBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvRGF0YUZpZWxkSGVscGVyXCI7XG5pbXBvcnQgeyBJc3N1ZUNhdGVnb3J5LCBJc3N1ZUNhdGVnb3J5VHlwZSwgSXNzdWVTZXZlcml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvSXNzdWVNYW5hZ2VyXCI7XG5pbXBvcnQgeyBLZXlIZWxwZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0tleVwiO1xuaW1wb3J0IHsgVUkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB7IHJlcGxhY2VTcGVjaWFsQ2hhcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TdGFibGVJZEhlbHBlclwiO1xuaW1wb3J0ICogYXMgVHlwZUd1YXJkcyBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQge1xuXHRpc0Fubm90YXRpb25PZlR5cGUsXG5cdGlzTmF2aWdhdGlvblByb3BlcnR5LFxuXHRpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0aXNQcm9wZXJ0eSxcblx0aXNUeXBlRGVmaW5pdGlvblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQge1xuXHRlbmhhbmNlRGF0YU1vZGVsUGF0aCxcblx0Z2V0Q29udGV4dFByb3BlcnR5UmVzdHJpY3Rpb24sXG5cdGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgsXG5cdGdldFRhcmdldE9iamVjdFBhdGgsXG5cdHR5cGUgRGF0YU1vZGVsT2JqZWN0UGF0aFxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBnZXREaXNwbGF5TW9kZSwgdHlwZSBEaXNwbGF5TW9kZSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0Rpc3BsYXlNb2RlRm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBnZXRSZXN0cmljdGlvbnNPblByb3BlcnRpZXMsIHR5cGUgUmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRW50aXR5U2V0SGVscGVyXCI7XG5pbXBvcnQgeyBoYXNGaWVsZENvbnRyb2xOb3RNYW5kYXRvcnksIGlzU3RhdGljYWxseU1hbmRhdG9yeSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0ZpZWxkQ29udHJvbEhlbHBlclwiO1xuaW1wb3J0IHtcblx0Z2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5UGF0aCxcblx0Z2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgsXG5cdGdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5UGF0aCxcblx0Z2V0U3RhdGljVGltZXpvbmUsXG5cdGdldFN0YXRpY1VuaXRPckN1cnJlbmN5LFxuXHRpc1RpbWV6b25lXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgeyBpc011bHRpVmFsdWVGaWVsZCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1VJRm9ybWF0dGVyc1wiO1xuaW1wb3J0IHR5cGUgeyBEZWZhdWx0VHlwZUZvckVkbVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdHlwZS9FRE1cIjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVzdHJpY3RlZC1pbXBvcnRzXG5pbXBvcnQgdGFibGVGb3JtYXR0ZXJzIGZyb20gXCJzYXAvZmUvbWFjcm9zL2Zvcm1hdHRlcnMvVGFibGVGb3JtYXR0ZXJcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIHsgTURDVGFibGVQcm9wZXJ0eUluZm8gYXMgUHJvcGVydHlJbmZvLCBWaXN1YWxTZXR0aW5ncyB9IGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBTaW1wbGVUeXBlIGZyb20gXCJzYXAvdWkvbW9kZWwvU2ltcGxlVHlwZVwiO1xuXG4vLyBDdXN0b20gQ29sdW1uIGZyb20gTWFuaWZlc3RcbnR5cGUgTWFuaWZlc3REZWZpbmVkQ3VzdG9tQ29sdW1uID0gQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uICYge1xuXHR0eXBlPzogQ29sdW1uVHlwZS5EZWZhdWx0O1xufTtcblxuLy8gU2xvdCBDb2x1bW4gZnJvbSBCdWlsZGluZyBCbG9ja1xudHlwZSBGcmFnbWVudERlZmluZWRTbG90Q29sdW1uID0gQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uICYge1xuXHR0eXBlOiBDb2x1bW5UeXBlLlNsb3Q7XG59O1xuLy8gUHJvcGVydGllcyBhbGwgQ29sdW1uVHlwZXMgaGF2ZTpcbnR5cGUgQmFzZVRhYmxlQ29sdW1uID0gQ29uZmlndXJhYmxlT2JqZWN0ICYge1xuXHR0eXBlOiBDb2x1bW5UeXBlOyAvL09yaWdpbiBvZiB0aGUgc291cmNlIHdoZXJlIHdlIGFyZSBnZXR0aW5nIHRoZSB0ZW1wbGF0ZWQgaW5mb3JtYXRpb24gZnJvbVxuXHR3aWR0aD86IHN0cmluZztcblx0d2lkdGhJbmNsdWRpbmdDb2x1bW5IZWFkZXI/OiBib29sZWFuO1xuXHRpbXBvcnRhbmNlPzogSW1wb3J0YW5jZTtcblx0aG9yaXpvbnRhbEFsaWduPzogSG9yaXpvbnRhbEFsaWduO1xuXHRhdmFpbGFiaWxpdHk/OiBBdmFpbGFiaWxpdHlUeXBlO1xuXHRpc05hdmlnYWJsZT86IGJvb2xlYW47XG5cdGNhc2VTZW5zaXRpdmU/OiBib29sZWFuO1xuXHRsYWJlbD86IHN0cmluZztcblx0dG9vbHRpcD86IHN0cmluZztcbn07XG5cbi8vIFByb3BlcnRpZXMgb24gQ3VzdG9tIENvbHVtbnMgYW5kIFNsb3QgQ29sdW1uc1xuZXhwb3J0IHR5cGUgQ3VzdG9tQmFzZWRUYWJsZUNvbHVtbiA9IEJhc2VUYWJsZUNvbHVtbiAmIHtcblx0aWQ6IHN0cmluZztcblx0bmFtZTogc3RyaW5nO1xuXHRoZWFkZXI/OiBzdHJpbmc7XG5cdHRlbXBsYXRlOiBzdHJpbmcgfCBDb250cm9sO1xuXHRwcm9wZXJ0eUluZm9zPzogc3RyaW5nW107XG5cdGV4cG9ydFNldHRpbmdzPzogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCBudWxsO1xuXHRmb3JtYXRPcHRpb25zOiBGb3JtYXRPcHRpb25zVHlwZTtcblx0aXNHcm91cGFibGU6IGJvb2xlYW47XG5cdGlzTmF2aWdhYmxlOiBib29sZWFuO1xuXHRzb3J0YWJsZTogYm9vbGVhbjtcblx0dmlzdWFsU2V0dGluZ3M6IHsgd2lkdGhDYWxjdWxhdGlvbjogbnVsbCB9O1xuXHRwcm9wZXJ0aWVzPzogc3RyaW5nW107XG5cdHJlcXVpcmVkPzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG59O1xuXG5leHBvcnQgdHlwZSBDb21wdXRlZFRhYmxlQ29sdW1uID0gQmFzZVRhYmxlQ29sdW1uICYge1xuXHRuYW1lOiBzdHJpbmc7XG5cdGxhYmVsOiBzdHJpbmc7XG5cdHByb3BlcnR5S2V5OiBzdHJpbmc7XG5cdGlzRHJhZnRJbmRpY2F0b3I/OiBib29sZWFuO1xuXHRpc1NpdHVhdGlvbnNJbmRpY2F0b3I/OiBib29sZWFuO1xuXHRmb3JtYXRPcHRpb25zPzogRm9ybWF0T3B0aW9uc1R5cGUgfCBudWxsO1xuXHRwcm9wZXJ0eUluZm9zPzogc3RyaW5nW107XG5cdGV4cG9ydFNldHRpbmdzPzogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCBudWxsO1xuXHRjbGlwYm9hcmRTZXR0aW5ncz86IE9iamVjdCB8IG51bGw7XG5cdHJlcXVpcmVkPzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG59O1xuXG4vLyBQcm9wZXJ0aWVzIGRlcml2ZWQgZnJvbSBNYW5pZmVzdCB0byBvdmVycmlkZSBBbm5vdGF0aW9uIGNvbmZpZ3VyYXRpb25zXG50eXBlIEFubm90YXRpb25UYWJsZUNvbHVtbkZvck92ZXJyaWRlID0gQmFzZVRhYmxlQ29sdW1uICYge1xuXHRzZXR0aW5ncz86IFRhYmxlQ29sdW1uU2V0dGluZ3M7XG5cdGZvcm1hdE9wdGlvbnM/OiBGb3JtYXRPcHRpb25zVHlwZTtcblx0ZXhwb3J0U2V0dGluZ3M/OiBDb2x1bW5FeHBvcnRTZXR0aW5ncyB8IG51bGw7XG59O1xuXG5leHBvcnQgdHlwZSBQcm9wZXJ0eVR5cGVDb25zdHJhaW50cyA9IFBhcnRpYWw8e1xuXHRzY2FsZTogbnVtYmVyO1xuXHRwcmVjaXNpb246IG51bWJlcjtcblx0bWF4TGVuZ3RoOiBudW1iZXI7XG5cdG51bGxhYmxlOiBib29sZWFuO1xuXHRtaW5pbXVtOiBzdHJpbmc7XG5cdG1heGltdW06IHN0cmluZztcblx0aXNEaWdpdFNlcXVlbmNlOiBib29sZWFuO1xufT47XG5cbmV4cG9ydCB0eXBlIFByb3BlcnR5VHlwZUZvcm1hdE9wdGlvbnMgPSBQYXJ0aWFsPHtcblx0cGFyc2VBc1N0cmluZzogYm9vbGVhbjtcblx0ZW1wdHlTdHJpbmc6IHN0cmluZztcblx0cGFyc2VLZWVwc0VtcHR5U3RyaW5nOiBib29sZWFuO1xuXHRzdHlsZTogc3RyaW5nO1xufT47XG5cbmV4cG9ydCB0eXBlIFByb3BlcnR5VHlwZUNvbmZpZyA9IHtcblx0dHlwZT86IHN0cmluZztcblx0Y29uc3RyYWludHM/OiBQcm9wZXJ0eVR5cGVDb25zdHJhaW50cztcblx0Zm9ybWF0T3B0aW9ucz86IFByb3BlcnR5VHlwZUZvcm1hdE9wdGlvbnM7XG5cdHR5cGVJbnN0YW5jZT86IFNpbXBsZVR5cGU7XG5cdGJhc2VUeXBlPzogc3RyaW5nO1xuXHRjbGFzc05hbWU/OiBrZXlvZiB0eXBlb2YgRGVmYXVsdFR5cGVGb3JFZG1UeXBlO1xufTtcblxuZXhwb3J0IHR5cGUgQ29sdW1uRXhwb3J0U2V0dGluZ3MgPSBQcm9wZXJ0eUluZm9bXCJleHBvcnRTZXR0aW5nc1wiXSAmIHtcblx0ZGF0YVBvaW50VGFyZ2V0VmFsdWU/OiBzdHJpbmc7XG5cdGlzQ3VycmVuY3k/OiBib29sZWFuO1xufTtcblxuLy8gUHJvcGVydGllcyBmb3IgQW5ub3RhdGlvbiBDb2x1bW5zXG5leHBvcnQgdHlwZSBBbm5vdGF0aW9uVGFibGVDb2x1bW4gPSBQcm9wZXJ0eUluZm8gJlxuXHRBbm5vdGF0aW9uVGFibGVDb2x1bW5Gb3JPdmVycmlkZSAmIHtcblx0XHRuYW1lOiBzdHJpbmc7XG5cdFx0YW5ub3RhdGlvblBhdGg6IHN0cmluZztcblx0XHRyZWxhdGl2ZVBhdGg6IHN0cmluZztcblx0XHR0b29sdGlwPzogc3RyaW5nO1xuXHRcdGdyb3VwTGFiZWw/OiBzdHJpbmc7XG5cdFx0Z3JvdXA/OiBzdHJpbmc7XG5cdFx0RmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zPzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG5cdFx0c2hvd0RhdGFGaWVsZHNMYWJlbD86IGJvb2xlYW47XG5cdFx0cmVxdWlyZWQ/OiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0XHRpc0dyb3VwYWJsZT86IGJvb2xlYW47XG5cdFx0dW5pdFRleHQ/OiBzdHJpbmc7XG5cdFx0dGltZXpvbmVUZXh0Pzogc3RyaW5nO1xuXHRcdHRpbWV6b25lPzogc3RyaW5nO1xuXHRcdHNlbWFudGljT2JqZWN0UGF0aD86IHN0cmluZztcblx0XHR0ZXh0QXJyYW5nZW1lbnQ/OiB7XG5cdFx0XHR0ZXh0UHJvcGVydHk6IHN0cmluZztcblx0XHRcdG1vZGU6IERpc3BsYXlNb2RlO1xuXHRcdH07XG5cdFx0YWRkaXRpb25hbFByb3BlcnR5SW5mb3M/OiBzdHJpbmdbXTtcblx0XHR0eXBlQ29uZmlnPzogUHJvcGVydHlUeXBlQ29uZmlnO1xuXHRcdGlzUGFydE9mTGluZUl0ZW0/OiBib29sZWFuOyAvLyB0ZW1wb3JhcnkgaW5kaWNhdG9yIHRvIG9ubHkgYWxsb3cgZmlsdGVyaW5nIG9uIG5hdmlnYXRpb24gcHJvcGVydGllcyB3aGVuIHRoZXkncmUgcGFydCBvZiBhIGxpbmUgaXRlbVxuXHRcdGlzUGFydE9mQ3VzdG9tQ29sdW1uPzogYm9vbGVhbjtcblx0XHRhZGRpdGlvbmFsTGFiZWxzPzogc3RyaW5nW107XG5cdFx0ZXhwb3J0RGF0YVBvaW50VGFyZ2V0VmFsdWU/OiBzdHJpbmc7XG5cdFx0ZXh0ZW5zaW9uPzogRXh0ZW5zaW9uRm9yQW5hbHl0aWNzO1xuXHRcdGlzTXVsdGlWYWx1ZT86IGJvb2xlYW47XG5cdFx0ZGVzY3JpcHRpb25Qcm9wZXJ0eT86IHN0cmluZztcblx0XHRtb2RlPzogRGlzcGxheU1vZGU7XG5cdFx0dmFsdWVQcm9wZXJ0eT86IHN0cmluZztcblx0fTtcblxuZXhwb3J0IHR5cGUgRXh0ZW5zaW9uRm9yQW5hbHl0aWNzID0gUHJvcGVydHlJbmZvW1wiZXh0ZW5zaW9uXCJdICYge1xuXHRhZGRpdGlvbmFsUHJvcGVydGllcz86IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVDb2x1bW4gPSBDdXN0b21CYXNlZFRhYmxlQ29sdW1uIHwgQW5ub3RhdGlvblRhYmxlQ29sdW1uIHwgQ29tcHV0ZWRUYWJsZUNvbHVtbjtcblxudHlwZSBNYW5pZmVzdENvbHVtbiA9IEN1c3RvbUVsZW1lbnQ8Q3VzdG9tQmFzZWRUYWJsZUNvbHVtbiB8IEFubm90YXRpb25UYWJsZUNvbHVtbkZvck92ZXJyaWRlPjtcblxuZXhwb3J0IGVudW0gQ29sdW1uVHlwZSB7XG5cdERlZmF1bHQgPSBcIkRlZmF1bHRcIiwgLy8gRGVmYXVsdCBUeXBlIChDdXN0b20gQ29sdW1uKVxuXHRBbm5vdGF0aW9uID0gXCJBbm5vdGF0aW9uXCIsXG5cdFNsb3QgPSBcIlNsb3RcIixcblx0Q29tcHV0ZWQgPSBcIkNvbXB1dGVkXCJcbn1cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgY29sdW1ucywgYW5ub3RhdGlvbi1iYXNlZCBhcyB3ZWxsIGFzIG1hbmlmZXN0LWJhc2VkLlxuICogVGhleSBhcmUgc29ydGVkIGFuZCBzb21lIHByb3BlcnRpZXMgY2FuIGJlIG92ZXJ3cml0dGVuIHZpYSB0aGUgbWFuaWZlc3QgKGNoZWNrIG91dCB0aGUga2V5cyB0aGF0IGNhbiBiZSBvdmVyd3JpdHRlbikuXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgZm9yIHJlcHJlc2VudGF0aW9uIGluIGEgdGFibGUgb3IgbGlzdFxuICogQHBhcmFtIHRhYmxlVHlwZSBUaGUgdHlwZSBvZiB0aGUgdGFibGVcbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIFJldHVybnMgYWxsIHRhYmxlIGNvbHVtbnMgdGhhdCBzaG91bGQgYmUgYXZhaWxhYmxlLCByZWdhcmRsZXNzIG9mIHRlbXBsYXRpbmcgb3IgcGVyc29uYWxpemF0aW9uIG9yIHRoZWlyIG9yaWdpblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFibGVDb2x1bW5zKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBUYWJsZUNvbHVtbltdIHtcblx0Y29uc3QgYW5ub3RhdGlvbkNvbHVtbnMgPSBnZXRDb2x1bW5zRnJvbUFubm90YXRpb25zKGxpbmVJdGVtQW5ub3RhdGlvbiwgdGFibGVUeXBlLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IG1hbmlmZXN0Q29sdW1ucyA9IGdldENvbHVtbnNGcm9tTWFuaWZlc3QoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uPFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uPih2aXN1YWxpemF0aW9uUGF0aCkuY29sdW1ucyA/PyB7fSxcblx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKVxuXHQpO1xuXG5cdGNvbnN0IHRhYmxlQ29sdW1uczogVGFibGVDb2x1bW5bXSA9IGluc2VydEN1c3RvbUVsZW1lbnRzKFxuXHRcdGFubm90YXRpb25Db2x1bW5zIGFzIFRhYmxlQ29sdW1uW10sXG5cdFx0bWFuaWZlc3RDb2x1bW5zIGFzIFJlY29yZDxzdHJpbmcsIEN1c3RvbUVsZW1lbnQ8VGFibGVDb2x1bW4+Pixcblx0XHR7XG5cdFx0XHR3aWR0aDogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdHdpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdFx0aW1wb3J0YW5jZTogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdGhvcml6b250YWxBbGlnbjogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdGF2YWlsYWJpbGl0eTogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdGlzTmF2aWdhYmxlOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdFx0c2V0dGluZ3M6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0XHRmb3JtYXRPcHRpb25zOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdFx0ZXhwb3J0U2V0dGluZ3M6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGVcblx0XHR9XG5cdCk7XG5cblx0cmV0dXJuIGFkZENvbXB1dGVkQ29sdW1ucyh0YWJsZUNvbHVtbnMsIHRhYmxlVHlwZSwgdmlzdWFsaXphdGlvblBhdGgsIGNvbnZlcnRlckNvbnRleHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZENvbHVtbkJ5UGF0aChwYXRoOiBzdHJpbmcsIHRhYmxlQ29sdW1uczogVGFibGVDb2x1bW5bXSk6IFRhYmxlQ29sdW1uIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIHRhYmxlQ29sdW1ucy5maW5kKChjb2x1bW4pID0+IHtcblx0XHRjb25zdCBhbm5vdGF0aW9uQ29sdW1uID0gY29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRyZXR1cm4gYW5ub3RhdGlvbkNvbHVtbi5wcm9wZXJ0eUluZm9zID09PSB1bmRlZmluZWQgJiYgYW5ub3RhdGlvbkNvbHVtbi5yZWxhdGl2ZVBhdGggPT09IHBhdGg7XG5cdH0pO1xufVxuXG4vKipcbiAqIFNldHMgdGhlICd1bml0JywgJ3RleHRBcnJhbmdlbWVudCcsICd0aW1lem9uZScgYW5kICdleHBvcnRzZXR0aW5ncycgcHJvcGVydGllcyBpbiBjb2x1bW5zIHdoZW4gbmVjZXNzYXJ5LlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHRhYmxlQ29sdW1ucyBUaGUgY29sdW1ucyB0byBiZSB1cGRhdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsIHRhYmxlQ29sdW1uczogVGFibGVDb2x1bW5bXSk6IHZvaWQge1xuXHRjb25zdCBkYXRhTW9kZWxPYmplY3RQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZXJDb250ZXh0Rm9yKGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKSkuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHR0YWJsZUNvbHVtbnMuZm9yRWFjaCgob0NvbHVtbikgPT4ge1xuXHRcdGNvbnN0IHRhYmxlQ29sdW1uID0gb0NvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0aWYgKHRhYmxlQ29sdW1uLnByb3BlcnR5SW5mb3MgPT09IHVuZGVmaW5lZCAmJiB0YWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGgpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFByb3BlcnR5PihkYXRhTW9kZWxPYmplY3RQYXRoLCB0YWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGgpO1xuXHRcdFx0Y29uc3QgcHJvcGVydHkgPSBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0O1xuXHRcdFx0aWYgKHByb3BlcnR5KSB7XG5cdFx0XHRcdGFkZEN1cnJlbmN5T3JVb01Ub1Byb3BlcnR5KHByb3BlcnR5LCBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsIHRhYmxlQ29sdW1ucywgdGFibGVDb2x1bW4pO1xuXHRcdFx0XHRjb25zdCB0aW1lem9uZVByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHkocHJvcGVydHkpO1xuXHRcdFx0XHRjb25zdCB0aW1lem9uZSA9IHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UaW1lem9uZTtcblx0XHRcdFx0aWYgKHRpbWV6b25lUHJvcGVydHkpIHtcblx0XHRcdFx0XHRjb25zdCBvVGltZXpvbmVDb2x1bW4gPSBmaW5kQ29sdW1uQnlQYXRoKHRpbWV6b25lUHJvcGVydHkubmFtZSwgdGFibGVDb2x1bW5zKTtcblx0XHRcdFx0XHR0YWJsZUNvbHVtbi50aW1lem9uZSA9IG9UaW1lem9uZUNvbHVtbj8ubmFtZTtcblx0XHRcdFx0fSBlbHNlIGlmICh0aW1lem9uZSkge1xuXHRcdFx0XHRcdHRhYmxlQ29sdW1uLnRpbWV6b25lVGV4dCA9IHRpbWV6b25lLnRvU3RyaW5nKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YWRkVGV4dEFycmFuZ2VudEluZm9Ub1Byb3BlcnR5KHByb3BlcnR5LCBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsIHRhYmxlQ29sdW1ucywgdGFibGVDb2x1bW4pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59XG5cbi8qKlxuICogQWRkcyB0aGUgXCJ1bml0XCIgcHJvcGVydHkgaW50byB0aGUgY29sdW1ucyB3aGVuIG5lY2Nlc2FyeSBmb3IgY29sdW1ucyB3aXRoIHVuaXQgb2YgbWVhc3VyZSBhbmQgY3VycmVuY2llcy5cbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgcmVmZXJlbmNlZCBvbiB0aGUgY29sdW1uXG4gKiBAcGFyYW0gcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIFRoZSBwcm9wZXJ0eSBEYXRhTW9kZWxPYmplY3RQYXRoLlxuICogQHBhcmFtIHRhYmxlQ29sdW1ucyBUaGUgbGlzdCBvZiBjb2x1bW5zIGRpc3BsYXllZCBvbiB0aGUgdGFibGVcbiAqIEBwYXJhbSB0YWJsZUNvbHVtbiBUaGUgdGFibGUgY29sdW1uIHdoaWNoIGFkZHMgdGhlIGN1cnJlbmN5IG9yIHVuaXRcbiAqL1xuZnVuY3Rpb24gYWRkQ3VycmVuY3lPclVvTVRvUHJvcGVydHkoXG5cdHByb3BlcnR5OiBQcm9wZXJ0eSxcblx0cHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pixcblx0dGFibGVDb2x1bW5zOiBUYWJsZUNvbHVtbltdLFxuXHR0YWJsZUNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uXG4pOiB2b2lkIHtcblx0Y29uc3QgY3VycmVuY3lPclVvTVByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoKHByb3BlcnR5KSB8fCBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5UGF0aChwcm9wZXJ0eSk7XG5cdGlmIChjdXJyZW5jeU9yVW9NUHJvcGVydHkpIHtcblx0XHRjb25zdCBjdXJyZW5jeU9yVW9NUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8UHJvcGVydHk+KHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCwgY3VycmVuY3lPclVvTVByb3BlcnR5KTtcblx0XHRjb25zdCBjdXJyZW5jeU9yVW9NUmVsYXRpdmVQYXRoID0gZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aChjdXJyZW5jeU9yVW9NUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoKTtcblx0XHRpZiAoY3VycmVuY3lPclVvTVJlbGF0aXZlUGF0aCkge1xuXHRcdFx0Y29uc3QgdW5pdENvbHVtbiA9IGZpbmRDb2x1bW5CeVBhdGgoY3VycmVuY3lPclVvTVJlbGF0aXZlUGF0aCwgdGFibGVDb2x1bW5zKTtcblx0XHRcdHRhYmxlQ29sdW1uLnVuaXQgPSB1bml0Q29sdW1uPy5uYW1lO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRjb25zdCB1bml0ID0gcHJvcGVydHk/LmFubm90YXRpb25zPy5NZWFzdXJlcz8uSVNPQ3VycmVuY3kgfHwgcHJvcGVydHk/LmFubm90YXRpb25zPy5NZWFzdXJlcz8uVW5pdDtcblx0XHRpZiAodW5pdCkge1xuXHRcdFx0dGFibGVDb2x1bW4udW5pdFRleHQgPSBgJHt1bml0fWA7XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogQWRkIHRoZSBcInRleHRBcnJhbmdlbWVudFwiIG9iamVjdCB0byBjb2x1bW5zIHdoZW4gbmVjZXNzYXJ5IGZvciBjb2x1bW5zIGNvbnRhaW5pbmcgdGV4dCwgc3VjaCBhcyBkZXNjcmlwdGlvbnMuXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHJlZmVyZW5jZWQgYnkgdGhlIGNvbHVtblxuICogQHBhcmFtIHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCBUaGUgcHJvcGVydHkgRGF0YU1vZGVsT2JqZWN0UGF0aC5cbiAqIEBwYXJhbSB0YWJsZUNvbHVtbnMgVGhlIGxpc3Qgb2YgY29sdW1ucyBkaXNwbGF5ZWQgb24gdGhlIHRhYmxlXG4gKiBAcGFyYW0gdGFibGVDb2x1bW4gVGhlIHRhYmxlIGNvbHVtbiB3aGljaCBhZGRzIHRoZSB0ZXh0XG4gKi9cbmZ1bmN0aW9uIGFkZFRleHRBcnJhbmdlbnRJbmZvVG9Qcm9wZXJ0eShcblx0cHJvcGVydHk6IFByb3BlcnR5LFxuXHRwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+LFxuXHR0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdHRhYmxlQ29sdW1uOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5cbik6IHZvaWQge1xuXHRjb25zdCBkaXNwbGF5TW9kZSA9IGdldERpc3BsYXlNb2RlKHByb3BlcnR5LCBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZSksXG5cdFx0dGV4dFByb3BlcnR5UGF0aCA9IGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoKHByb3BlcnR5KTtcblx0aWYgKHRleHRQcm9wZXJ0eVBhdGggJiYgZGlzcGxheU1vZGUgIT09IFwiVmFsdWVcIikge1xuXHRcdGNvbnN0IHRleHRQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQcm9wZXJ0eT4ocHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLCB0ZXh0UHJvcGVydHlQYXRoKTtcblx0XHRjb25zdCB0ZXh0UmVsYXRpdmVQYXRoID0gZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aCh0ZXh0UHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoKTtcblx0XHRpZiAodGV4dFJlbGF0aXZlUGF0aCkge1xuXHRcdFx0Y29uc3QgdGV4dENvbHVtbiA9IGZpbmRDb2x1bW5CeVBhdGgodGV4dFJlbGF0aXZlUGF0aCwgdGFibGVDb2x1bW5zKTtcblx0XHRcdGlmICh0ZXh0Q29sdW1uICYmIHRleHRDb2x1bW4ubmFtZSAhPT0gdGFibGVDb2x1bW4ubmFtZSkge1xuXHRcdFx0XHR0YWJsZUNvbHVtbi50ZXh0QXJyYW5nZW1lbnQgPSB7XG5cdFx0XHRcdFx0dGV4dFByb3BlcnR5OiB0ZXh0Q29sdW1uLm5hbWUsXG5cdFx0XHRcdFx0bW9kZTogZGlzcGxheU1vZGVcblx0XHRcdFx0fTtcblx0XHRcdFx0Ly8gSWYgdGV4dCBwcm9wZXJ0aWVzIGFyZSB1c2VkIGJ1dCBoaWRkZW4sIHdlIG11c3QgaW5jbHVkZSB0aGVtIHRvIHRoZSBleHBvcnQgYXMgdGhlcmUgYXJlIHVzZWQgaW4gdGhlIHBhc3RlXG5cdFx0XHRcdGlmICghdGV4dENvbHVtbi5leHBvcnRTZXR0aW5ncykge1xuXHRcdFx0XHRcdHRleHRDb2x1bW4uZXhwb3J0U2V0dGluZ3MgPSB7IHR5cGU6IFwiU3RyaW5nXCIgfTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBjb2x1bW5zIGZyb20gdGhlIGVudGl0eVR5cGUuXG4gKiBAcGFyYW0gY29sdW1uc1RvQmVDcmVhdGVkIFRoZSBjb2x1bW5zIHRvIGJlIGNyZWF0ZWQuXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgdGFyZ2V0IGVudGl0eSB0eXBlLlxuICogQHBhcmFtIGFubm90YXRpb25Db2x1bW5zIFRoZSBhcnJheSBvZiBjb2x1bW5zIGNyZWF0ZWQgYmFzZWQgb24gTGluZUl0ZW0gYW5ub3RhdGlvbnMuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHQuXG4gKiBAcGFyYW0gdGFibGVUeXBlIFRoZSB0YWJsZSB0eXBlLlxuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB0YWJsZS5cbiAqIEBwYXJhbSBkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwIFRoZSBtYXAgb2YgcHJvcGVydGllcyByZWZlcmVuY2VkIGFzIGRlc2NyaXB0aW9uIG9uIGEgdGV4dCBhcnJhbmdlbWVudCBhbm5vdGF0aW9uLlxuICogQHBhcmFtIHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyBUaGUgZXhpc3RpbmcgcmVzdHJpY3Rpb25zIG9uIHByb3BlcnRpZXNcbiAqIEByZXR1cm5zIFRoZSBjb2x1bW4gZnJvbSB0aGUgZW50aXR5VHlwZVxuICovXG5leHBvcnQgY29uc3QgZ2V0Q29sdW1uc0Zyb21FbnRpdHlUeXBlID0gZnVuY3Rpb24gKFxuXHRjb2x1bW5zVG9CZUNyZWF0ZWQ6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5Pixcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHR0YWJsZUNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLFxuXHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwOiBSZWNvcmQ8c3RyaW5nLCBEaXNwbGF5TW9kZT4sXG5cdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcz86IFJlc3RyaWN0aW9uc09uUHJvcGVydGllc1xuKTogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10ge1xuXHRpZiAoYW5ub3RhdGlvbkNvbHVtbnMgPT09IHVuZGVmaW5lZCkge1xuXHRcdGFubm90YXRpb25Db2x1bW5zID0gW107XG5cdH1cblxuXHRsZXQgcHJvcGVydGllc05vdFRvQmVDb25zaWRlcmVkOiBzdHJpbmdbXSA9IFtdO1xuXHRjb25zdCBhZ2dyZWdhdGlvbkhlbHBlciA9IG5ldyBBZ2dyZWdhdGlvbkhlbHBlcihlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgZ3JvdXBhYmxlUHJvcGVydGllcyA9IGFnZ3JlZ2F0aW9uSGVscGVyLmdldEdyb3VwYWJsZVByb3BlcnRpZXMoKTtcblx0Ly9Gb3IgQW5hbHl0aWNhbCB0YWJsZSwgd2UgZXhjbHVkZSBhbGwgcHJvcGVydGllcyB0aGF0IGFyZSBub3QgZ3JvdXBhYmxlIGFuZCB1c2VkIGFzIFRleHQgaW4gYSBncm91cGFibGUgUHJvcGVydHkuXG5cdGlmICh0YWJsZVR5cGUgPT09IFwiQW5hbHl0aWNhbFRhYmxlXCIgJiYgYWdncmVnYXRpb25IZWxwZXIuaXNBbmFseXRpY3NTdXBwb3J0ZWQoKSAmJiBncm91cGFibGVQcm9wZXJ0aWVzKSB7XG5cdFx0cHJvcGVydGllc05vdFRvQmVDb25zaWRlcmVkID0gZ3JvdXBhYmxlUHJvcGVydGllc1xuXHRcdFx0Lm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5LiR0YXJnZXQpXG5cdFx0XHQuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldCAhPT0gdW5kZWZpbmVkKVxuXHRcdFx0Lm1hcCgodGFyZ2V0KSA9PiBnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5KHRhcmdldCBhcyBQcm9wZXJ0eSkpXG5cdFx0XHQuZmlsdGVyKCh0ZXh0UHJvcCkgPT4gdGV4dFByb3AgJiYgIWFnZ3JlZ2F0aW9uSGVscGVyLmlzUHJvcGVydHlHcm91cGFibGUodGV4dFByb3ApKVxuXHRcdFx0Lm1hcCgocHJvcCkgPT4gcHJvcD8ubmFtZSlcblx0XHRcdC5maWx0ZXIoKG5hbWUpID0+IG5hbWUgIT09IHVuZGVmaW5lZCkgYXMgc3RyaW5nW107XG5cdH1cblx0ZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5OiBQcm9wZXJ0eSkgPT4ge1xuXHRcdC8vIENhdGNoIGFscmVhZHkgZXhpc3RpbmcgY29sdW1ucyAtIHdoaWNoIHdlcmUgYWRkZWQgYmVmb3JlIGJ5IExpbmVJdGVtIEFubm90YXRpb25zXG5cdFx0Y29uc3QgZXhpc3RzID0gYW5ub3RhdGlvbkNvbHVtbnMuc29tZSgoY29sdW1uKSA9PiB7XG5cdFx0XHRyZXR1cm4gY29sdW1uLm5hbWUgPT09IHByb3BlcnR5Lm5hbWU7XG5cdFx0fSk7XG5cdFx0Ly8gaWYgdGFyZ2V0IHR5cGUgZXhpc3RzLCBpdCBpcyBhIGNvbXBsZXggcHJvcGVydHkgYW5kIHNob3VsZCBiZSBpZ25vcmVkXG5cdFx0aWYgKCFwcm9wZXJ0eS50YXJnZXRUeXBlICYmICFleGlzdHMgJiYgIXByb3BlcnRpZXNOb3RUb0JlQ29uc2lkZXJlZC5pbmNsdWRlcyhwcm9wZXJ0eS5uYW1lKSkge1xuXHRcdFx0Y29uc3QgcmVsYXRlZFByb3BlcnRpZXNJbmZvOiBDb21wbGV4UHJvcGVydHlJbmZvID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzKFxuXHRcdFx0XHRwcm9wZXJ0eS5uYW1lLFxuXHRcdFx0XHRwcm9wZXJ0eSxcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0dGFibGVUeXBlXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgcmVsYXRlZFByb3BlcnR5TmFtZXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXMpO1xuXHRcdFx0Y29uc3QgYWRkaXRpb25hbFByb3BlcnR5TmFtZXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXNJbmZvLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKTtcblx0XHRcdC8vIEluY2x1ZGUgdGhlIHRleHQgcHJvcGVydGllcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyB0ZXh0IGFycmFuZ2VtZW50XG5cdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lcy5mb3JFYWNoKChuYW1lKSA9PiB7XG5cdFx0XHRcdGFkZFByb3BlcnR5VG9EaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwKGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAsIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbywgbmFtZSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3QgY29sdW1uSW5mbyA9IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgocHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdFx0cHJvcGVydHkubmFtZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0YWdncmVnYXRpb25IZWxwZXIsXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAsXG5cdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHRcdFx0XHR0YWJsZUNyZWF0aW9uTW9kZSxcblx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXNJbmZvXG5cdFx0XHQpO1xuXHRcdFx0aWYgKHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Y29sdW1uSW5mby5wcm9wZXJ0eUluZm9zID0gcmVsYXRlZFByb3BlcnR5TmFtZXM7XG5cdFx0XHRcdGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3MuZGF0YVBvaW50VGFyZ2V0VmFsdWUpIHtcblx0XHRcdFx0XHRjb2x1bW5JbmZvLmV4cG9ydERhdGFQb2ludFRhcmdldFZhbHVlID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFNldHRpbmdzLmRhdGFQb2ludFRhcmdldFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIENvbGxlY3QgaW5mb3JtYXRpb24gb2YgcmVsYXRlZCBjb2x1bW5zIHRvIGJlIGNyZWF0ZWQuXG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmZvckVhY2goKG5hbWUpID0+IHtcblx0XHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbbmFtZV0gPSByZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1tuYW1lXS5hbm5vdGF0aW9uUHJvcGVydHk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Y29sdW1uSW5mby5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcyA9IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzO1xuXHRcdFx0XHQvLyBDcmVhdGUgY29sdW1ucyBmb3IgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgZm9yIEFMUCB1c2UgY2FzZS5cblx0XHRcdFx0YWRkaXRpb25hbFByb3BlcnR5TmFtZXMuZm9yRWFjaCgoYWRkaXRpb25hbFByb3BlcnR5TmFtZSkgPT4ge1xuXHRcdFx0XHRcdC8vIEludGVudGlvbmFsIG92ZXJ3cml0ZSBhcyB3ZSByZXF1aXJlIG9ubHkgb25lIG5ldyBQcm9wZXJ0eUluZm8gZm9yIGEgcmVsYXRlZCBQcm9wZXJ0eS5cblx0XHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbYWRkaXRpb25hbFByb3BlcnR5TmFtZV0gPSByZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXNbYWRkaXRpb25hbFByb3BlcnR5TmFtZV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMucHVzaChjb2x1bW5JbmZvKTtcblx0XHR9XG5cdFx0Ly8gSW4gY2FzZSBhIHByb3BlcnR5IGhhcyBkZWZpbmVkIGEgI1RleHRPbmx5IHRleHQgYXJyYW5nZW1lbnQgdGhhdCBwb2ludHMgdG8gYSB0ZXh0IHByb3BlcnR5IChhbmQgbm90IGEgJ2hhcmQgY29kZWQgdGV4dCcpIGRvbid0IG9ubHkgY3JlYXRlIHRoZSBjb21wbGV4IHByb3BlcnR5IHdpdGggdGhlIHRleHQgcHJvcGVydHkgYXMgYSBjaGlsZCBwcm9wZXJ0eSxcblx0XHQvLyBidXQgYWxzbyB0aGUgcHJvcGVydHkgaXRzZWxmIGFzIGl0IGNhbiBiZSB1c2VkIGFzIHdpdGhpbiB0aGUgc29ydENvbmRpdGlvbnMgb3Igb24gY3VzdG9tIGNvbHVtbnMuXG5cdFx0Ly8gVGhpcyBzdGVwIG11c3QgYmUgdmFsaWQgYWxzbyBmcm9tIHRoZSBjb2x1bW5zIGFkZGVkIHZpYSBMaW5lSXRlbXMgb3IgZnJvbSBhIGNvbHVtbiBhdmFpbGFibGUgb24gdGhlIHAxM24uXG5cdFx0aWYgKGdldERpc3BsYXlNb2RlKHByb3BlcnR5LCBlbnRpdHlUeXBlKSA9PT0gXCJEZXNjcmlwdGlvblwiKSB7XG5cdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM/Lm5vblNvcnRhYmxlUHJvcGVydGllcy5wdXNoKHByb3BlcnR5Lm5hbWUpO1xuXHRcdFx0aWYgKGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UZXh0KSkge1xuXHRcdFx0XHRhbm5vdGF0aW9uQ29sdW1ucy5wdXNoKFxuXHRcdFx0XHRcdGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eSxcblx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChwcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRcdFx0cHJvcGVydHkubmFtZSxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdFx0XHRcdFx0dGFibGVUeXBlLFxuXHRcdFx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0dGFibGVDcmVhdGlvbk1vZGVcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0Ly8gQ3JlYXRlIGEgcHJvcGVydHlJbmZvIGZvciBlYWNoIHJlbGF0ZWQgcHJvcGVydHkuXG5cdGNvbnN0IHJlbGF0ZWRDb2x1bW5zID0gX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zKFxuXHRcdGNvbHVtbnNUb0JlQ3JlYXRlZCxcblx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdGVudGl0eVR5cGUsXG5cdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCxcblx0XHR0YWJsZVR5cGUsXG5cdFx0dGFibGVDcmVhdGlvbk1vZGUsXG5cdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzXG5cdCk7XG5cdHJldHVybiBhbm5vdGF0aW9uQ29sdW1ucy5jb25jYXQocmVsYXRlZENvbHVtbnMpO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjb2x1bW4gZGVmaW5pdGlvbiBmcm9tIGEgcHJvcGVydHkuXG4gKiBAcGFyYW0gcHJvcGVydHkgRW50aXR5IHR5cGUgcHJvcGVydHkgZm9yIHdoaWNoIHRoZSBjb2x1bW4gaXMgY3JlYXRlZFxuICogQHBhcmFtIGZ1bGxQcm9wZXJ0eVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgdGFyZ2V0IHByb3BlcnR5XG4gKiBAcGFyYW0gcmVsYXRpdmVQYXRoIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSB0YXJnZXQgcHJvcGVydHkgYmFzZWQgb24gdGhlIGNvbnRleHRcbiAqIEBwYXJhbSB1c2VEYXRhRmllbGRQcmVmaXggU2hvdWxkIGJlIHByZWZpeGVkIHdpdGggXCJEYXRhRmllbGQ6OlwiLCBlbHNlIGl0IHdpbGwgYmUgcHJlZml4ZWQgd2l0aCBcIlByb3BlcnR5OjpcIlxuICogQHBhcmFtIGF2YWlsYWJsZUZvckFkYXB0YXRpb24gRGVjaWRlcyB3aGV0aGVyIHRoZSBjb2x1bW4gc2hvdWxkIGJlIGF2YWlsYWJsZSBmb3IgYWRhcHRhdGlvblxuICogQHBhcmFtIGFnZ3JlZ2F0aW9uSGVscGVyIFRoZSBhZ2dyZWdhdGlvbkhlbHBlciBmb3IgdGhlIGVudGl0eVxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCBUaGUgbWFwIG9mIHByb3BlcnRpZXMgcmVmZXJlbmNlZCBhcyBkZXNjcmlwdGlvbiBvbiBhIHRleHQgYXJyYW5nZW1lbnQgYW5ub3RhdGlvblxuICogQHBhcmFtIHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyBUaGUgZXhpc3RpbmcgcmVzdHJpY3Rpb25zIG9uIHByb3BlcnRpZXNcbiAqIEBwYXJhbSB0YWJsZUNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSBvZiB0aGUgdGFibGVcbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllc0luZm8gVGhlIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIgZm9yIHRoZSBjb2x1bW5cbiAqIEBwYXJhbSByZWxhdGl2ZVBhdGhGb3JNdWx0aVZhbHVlIFRoZSBNREMgcGF0aCB1c2VkIGZvciB0aGUgMTpuIHByb3BlcnR5IHRvIGFsbG93IGZpbHRlcmluZyBmcm9tIE1EQ1xuICogQHJldHVybnMgVGhlIGFubm90YXRpb24gY29sdW1uIGRlZmluaXRpb25cbiAqL1xuY29uc3QgZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eSA9IGZ1bmN0aW9uIChcblx0cHJvcGVydHk6IFByb3BlcnR5LFxuXHRmdWxsUHJvcGVydHlQYXRoOiBzdHJpbmcsXG5cdHJlbGF0aXZlUGF0aDogc3RyaW5nLFxuXHR1c2VEYXRhRmllbGRQcmVmaXg6IGJvb2xlYW4sXG5cdGF2YWlsYWJsZUZvckFkYXB0YXRpb246IGJvb2xlYW4sXG5cdGFnZ3JlZ2F0aW9uSGVscGVyOiBBZ2dyZWdhdGlvbkhlbHBlcixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwOiBSZWNvcmQ8c3RyaW5nLCBEaXNwbGF5TW9kZT4sXG5cdHRhYmxlVHlwZT86IFRhYmxlVHlwZSxcblx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzPzogUmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHR0YWJsZUNyZWF0aW9uTW9kZT86IENyZWF0aW9uTW9kZSxcblx0cmVsYXRlZFByb3BlcnRpZXNJbmZvPzogQ29tcGxleFByb3BlcnR5SW5mbyxcblx0cmVsYXRpdmVQYXRoRm9yTXVsdGlWYWx1ZT86IHN0cmluZ1xuKTogQW5ub3RhdGlvblRhYmxlQ29sdW1uIHtcblx0Y29uc3Qgc2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCA9IGdldFNlbWFudGljT2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LCBwcm9wZXJ0eSk7XG5cdGNvbnN0IGlzSGlkZGVuID0gaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4ocHJvcGVydHkpO1xuXHRjb25zdCBncm91cFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHByb3BlcnR5Lm5hbWUgPyBfc2xpY2VBdFNsYXNoKHByb3BlcnR5Lm5hbWUsIHRydWUsIGZhbHNlKSA6IHVuZGVmaW5lZDtcblx0Y29uc3QgaXNHcm91cDogYm9vbGVhbiA9IGdyb3VwUGF0aCAhPSBwcm9wZXJ0eS5uYW1lO1xuXHRjb25zdCBsYWJlbCA9IGdldExhYmVsKHByb3BlcnR5LCBpc0dyb3VwKTtcblx0Y29uc3QgZGF0YVR5cGUgPSBnZXREYXRhRmllbGREYXRhVHlwZShwcm9wZXJ0eSk7XG5cdGNvbnN0IHByb3BlcnR5VHlwZUNvbmZpZyA9IGdldFR5cGVDb25maWcocHJvcGVydHksIGRhdGFUeXBlKTtcblx0Y29uc3QgaXNBUHJvcGVydHlGcm9tVGV4dE9ubHlBbm5vdGF0aW9uID0gZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcFtyZWxhdGl2ZVBhdGhdID09PSBcIkRlc2NyaXB0aW9uXCI7XG5cdGNvbnN0IHNvcnRhYmxlID1cblx0XHQoIWlzSGlkZGVuIHx8IGlzQVByb3BlcnR5RnJvbVRleHRPbmx5QW5ub3RhdGlvbikgJiYgIXJlc3RyaWN0aW9uc09uUHJvcGVydGllcz8ubm9uU29ydGFibGVQcm9wZXJ0aWVzLmluY2x1ZGVzKHJlbGF0aXZlUGF0aCk7XG5cdGNvbnN0IGZpbHRlcmFibGUgPSAhcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzPy5ub25GaWx0ZXJhYmxlUHJvcGVydGllcy5pbmNsdWRlcyhyZWxhdGl2ZVBhdGgpO1xuXHRjb25zdCBncm91cGFibGUgPVxuXHRcdGFnZ3JlZ2F0aW9uSGVscGVyLmlzQW5hbHl0aWNzU3VwcG9ydGVkKCkgJiYgdGFibGVUeXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiXG5cdFx0XHQ/ICEhYWdncmVnYXRpb25IZWxwZXIuaXNQcm9wZXJ0eUdyb3VwYWJsZShwcm9wZXJ0eSlcblx0XHRcdDogc29ydGFibGU7XG5cdGNvbnN0IHR5cGVDb25maWcgPSB7XG5cdFx0Y2xhc3NOYW1lOiBwcm9wZXJ0eS50eXBlIHx8IGRhdGFUeXBlLFxuXHRcdGZvcm1hdE9wdGlvbnM6IHByb3BlcnR5VHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zLFxuXHRcdGNvbnN0cmFpbnRzOiBwcm9wZXJ0eVR5cGVDb25maWcuY29uc3RyYWludHNcblx0fTtcblx0bGV0IGV4cG9ydFNldHRpbmdzOiBQcm9wZXJ0eUluZm9bXCJleHBvcnRTZXR0aW5nc1wiXSA9IG51bGw7XG5cdGlmIChfaXNFeHBvcnRhYmxlQ29sdW1uKHByb3BlcnR5KSkge1xuXHRcdGV4cG9ydFNldHRpbmdzID0gY3JlYXRlQ29sdW1uRXhwb3J0U2V0dGluZ3MocHJvcGVydHksIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyk7XG5cdH1cblx0Y29uc3QgYXZhaWxhYmlsaXR5ID0gIWlzSGlkZGVuICYmIGF2YWlsYWJsZUZvckFkYXB0YXRpb24gPyBcIkFkYXB0YXRpb25cIiA6IFwiSGlkZGVuXCI7XG5cdGNvbnN0IGNvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVsczogc3RyaW5nW10gfCB1bmRlZmluZWQgPSBfZ2V0Q29sbGVjdGVkTmF2aWdhdGlvblByb3BlcnR5TGFiZWxzKHJlbGF0aXZlUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG5cdGlmIChyZWxhdGl2ZVBhdGhGb3JNdWx0aVZhbHVlKSB7XG5cdFx0cmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoRm9yTXVsdGlWYWx1ZTtcblx0fVxuXHRjb25zdCBuYW1lID0gdXNlRGF0YUZpZWxkUHJlZml4ID8gcmVsYXRpdmVQYXRoIDogYFByb3BlcnR5Ojoke3JlbGF0aXZlUGF0aH1gO1xuXHRjb25zdCBrZXkgPSAodXNlRGF0YUZpZWxkUHJlZml4ID8gXCJEYXRhRmllbGQ6OlwiIDogXCJQcm9wZXJ0eTo6XCIpICsgcmVwbGFjZVNwZWNpYWxDaGFycyhyZWxhdGl2ZVBhdGgpO1xuXG5cdGNvbnN0IGNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uID0ge1xuXHRcdGtleToga2V5LFxuXHRcdHR5cGU6IENvbHVtblR5cGUuQW5ub3RhdGlvbixcblx0XHRkYXRhVHlwZTogZGF0YVR5cGUgPz8gcHJvcGVydHkudHlwZSxcblx0XHRsYWJlbDogbGFiZWwgPz8gcHJvcGVydHkubmFtZSxcblx0XHRncm91cExhYmVsOiBpc0dyb3VwID8gZ2V0TGFiZWwocHJvcGVydHkpIDogdW5kZWZpbmVkLFxuXHRcdGdyb3VwOiBpc0dyb3VwID8gZ3JvdXBQYXRoIDogdW5kZWZpbmVkLFxuXHRcdGFubm90YXRpb25QYXRoOiBmdWxsUHJvcGVydHlQYXRoLFxuXHRcdHNlbWFudGljT2JqZWN0UGF0aDogc2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCxcblx0XHRhdmFpbGFiaWxpdHk6IGF2YWlsYWJpbGl0eSxcblx0XHRuYW1lOiBuYW1lLFxuXHRcdHJlbGF0aXZlUGF0aDogcmVsYXRpdmVQYXRoLFxuXHRcdHNvcnRhYmxlOiBzb3J0YWJsZSxcblx0XHRmaWx0ZXJhYmxlOiBmaWx0ZXJhYmxlLFxuXHRcdGlzR3JvdXBhYmxlOiBncm91cGFibGUsXG5cdFx0aXNLZXk6IHByb3BlcnR5LmlzS2V5LFxuXHRcdGV4cG9ydFNldHRpbmdzOiBleHBvcnRTZXR0aW5ncyxcblx0XHRjYXNlU2Vuc2l0aXZlOiBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUoY29udmVydGVyQ29udGV4dCksXG5cdFx0dHlwZUNvbmZpZzogdHlwZUNvbmZpZyBhcyBQcm9wZXJ0eVR5cGVDb25maWcsXG5cdFx0aW1wb3J0YW5jZTogZ2V0SW1wb3J0YW5jZShjb252ZXJ0ZXJDb250ZXh0LCBwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQpLFxuXHRcdHJlcXVpcmVkOiBpc1JlcXVpcmVkQ29sdW1uKGNvbnZlcnRlckNvbnRleHQsIHByb3BlcnR5LCB0YWJsZUNyZWF0aW9uTW9kZSksXG5cdFx0YWRkaXRpb25hbExhYmVsczogY29sbGVjdGVkTmF2aWdhdGlvblByb3BlcnR5TGFiZWxzXG5cdH07XG5cdF9hZGRUb29sVGlwKHByb3BlcnR5LCBjb2x1bW4pO1xuXHRfc2V0RXhwb3J0U2V0dGluZ3NGb3JEYXRhUG9pbnQocHJvcGVydHksIGNvbHVtbik7XG5cblx0aWYgKFxuXHRcdGFnZ3JlZ2F0aW9uSGVscGVyLmlzQW5hbHl0aWNzU3VwcG9ydGVkKCkgJiZcblx0XHRNb2RlbEhlbHBlci5pc09iamVjdFBhdGhEcmFmdFN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSkgJiZcblx0XHQocmVsYXRpdmVQYXRoID09PSBcIkhhc0FjdGl2ZUVudGl0eVwiIHx8IHJlbGF0aXZlUGF0aCA9PT0gXCJIYXNEcmFmdEVudGl0eVwiIHx8IHJlbGF0aXZlUGF0aCA9PT0gXCJJc0FjdGl2ZUVudGl0eVwiKVxuXHQpIHtcblx0XHQvLyBJbiBjYXNlIG9mIGFuYWx5dGljYWwgdGFibGUgb24gYSBkcmFmdC1lbmFibGVkIGVudGl0eSwgd2UgYWx3YXlzIGNvbnNpZGVyIHRoZSBIYXNEcmFmdEVudGl0eSwgSGFzQWN0aXZlRW50aXR5IGFuZCBJc0FjdGl2ZUVudGl0eSBwcm9wZXJ0aWVzIGFzXG5cdFx0Ly8gdGVjaG5pY2FsbHkgZ3JvdXBhYmxlLCBhcyB3ZSBuZWVkIHRvIGxvYWQgdGhlbSBmb3Igb3VyIGludGVybmFsIGxvZ2ljLlxuXHRcdGNvbHVtbi5leHRlbnNpb24gPSB7XG5cdFx0XHR0ZWNobmljYWxseUFnZ3JlZ2F0YWJsZTogZmFsc2UsXG5cdFx0XHR0ZWNobmljYWxseUdyb3VwYWJsZTogdHJ1ZVxuXHRcdH07XG5cdH1cblx0cmV0dXJuIGNvbHVtbjtcbn07XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBleHBvcnQgc2V0dGluZ3MgZm9yIGEgZ2l2ZW4gY29sdW1uLlxuICogQHBhcmFtIGNvbHVtbiBUaGUgZ2l2ZW4gY29sdW1uIGZyb20gYSBsaW5lIGl0ZW0gYXMgYSBkYXRhIGZpZWxkIG9yIGEgcHJvcGVydHkgZnJvbSB0aGUgZW50aXR5IHR5cGVcbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllc0luZm8gVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBsaW5rZWQgdG8gdGhlIGNvbHVtbiAobmFtZWQgYWxzbyBjb21wbGV4IHByb3BlcnR5KVxuICogQHJldHVybnMgVGhlIGV4cG9ydCBzZXR0aW5ncyBpbiBhIHRoZSBnaXZlbiBjb2x1bW5cbiAqL1xuY29uc3QgY3JlYXRlQ29sdW1uRXhwb3J0U2V0dGluZ3MgPSBmdW5jdGlvbiAoXG5cdGNvbHVtbjogUHJvcGVydHkgfCBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHRyZWxhdGVkUHJvcGVydGllc0luZm8/OiBDb21wbGV4UHJvcGVydHlJbmZvXG4pOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyB7XG5cdGxldCB1bml0UHJvcGVydHksIHRpbWV6b25lUHJvcGVydHksIHVuaXRUZXh0LCB0aW1lem9uZVRleHQsIHV0YywgaXNBVGltZXpvbmUsIGN1cnJlbmN5UHJvcGVydHksIHNjYWxlO1xuXHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lcyA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyA/IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzKSA6IFtdO1xuXHRpZiAocmVsYXRlZFByb3BlcnRpZXNJbmZvICYmIHJlbGF0ZWRQcm9wZXJ0eU5hbWVzPy5sZW5ndGggPT09IDEpIHtcblx0XHQvLyBDcmVhdGUgdGhlIGV4cG9ydCBzZXR0aW5ncyBvZiBhIGNvbHVtbiBiYXNlZCBvbiB0aGUgcmVsYXRlZCAoY2hpbGQpIHByb3BlcnR5IGluIGNhc2UgdGhlcmUgaXMgb25seSBvbmUuXG5cdFx0Ly8gVGhpcyBpcyByZXF1aXJlZCB3aGVuIHdlIGhhdmUgYSB0ZXh0IG9ubHkgYW5ub3RhdGlvbiB0byBjb21wdXRlIHRoZSBleHBvcnQgc2V0dGluZ3MgZnJvbSB0aGUgdGV4dCBpbnN0ZWFkIG9mIHRoZSB2YWx1ZVxuXHRcdGNvbHVtbiA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzW3JlbGF0ZWRQcm9wZXJ0eU5hbWVzWzBdXS5hbm5vdGF0aW9uUHJvcGVydHk7XG5cdH1cblx0Y29uc3QgZGF0YVR5cGUgPSBnZXREYXRhRmllbGREYXRhVHlwZShjb2x1bW4pO1xuXHRpZiAoaXNQcm9wZXJ0eShjb2x1bW4pKSB7XG5cdFx0dW5pdFByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eShjb2x1bW4pO1xuXHRcdGN1cnJlbmN5UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eShjb2x1bW4pO1xuXHRcdHRpbWV6b25lUHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkVGltZXpvbmVQcm9wZXJ0eShjb2x1bW4pO1xuXHRcdHVuaXRUZXh0ID0gZ2V0U3RhdGljVW5pdE9yQ3VycmVuY3koY29sdW1uKTtcblx0XHR0aW1lem9uZVRleHQgPSBnZXRTdGF0aWNUaW1lem9uZShjb2x1bW4pO1xuXHRcdGlzQVRpbWV6b25lID0gaXNUaW1lem9uZShjb2x1bW4pO1xuXHRcdHNjYWxlID0gY29sdW1uLnNjYWxlO1xuXHR9XG5cdHVuaXRQcm9wZXJ0eSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3M/LnVuaXRQcm9wZXJ0eSA/PyB1bml0UHJvcGVydHk/Lm5hbWUgPz8gY3VycmVuY3lQcm9wZXJ0eT8ubmFtZTtcblx0dGltZXpvbmVQcm9wZXJ0eSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3M/LnRpbWV6b25lUHJvcGVydHkgPz8gdGltZXpvbmVQcm9wZXJ0eT8ubmFtZTtcblx0c2NhbGUgPSByZWxhdGVkUHJvcGVydGllc0luZm8/LmV4cG9ydFNldHRpbmdzPy5zY2FsZSA/PyBzY2FsZTtcblx0Y29uc3QgZXhwb3J0VHlwZSA9IGdldEV4cG9ydERhdGFUeXBlKGRhdGFUeXBlLCBpc0FUaW1lem9uZSwgISFjdXJyZW5jeVByb3BlcnR5LCByZWxhdGVkUHJvcGVydGllc0luZm8/LmV4cG9ydFNldHRpbmdzKTtcblx0aWYgKHRpbWV6b25lUHJvcGVydHkgfHwgKGV4cG9ydFR5cGUgPT09IFwiRGF0ZVRpbWVcIiAmJiAhdGltZXpvbmVUZXh0KSkge1xuXHRcdHV0YyA9IGZhbHNlO1xuXHR9XG5cdGNvbnN0IGV4cG9ydFNldHRpbmdzOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyA9IHtcblx0XHR0eXBlOiBleHBvcnRUeXBlLFxuXHRcdGlucHV0Rm9ybWF0OiBnZXREYXRlSW5wdXRGb3JtYXQoZGF0YVR5cGUpLFxuXHRcdGRlbGltaXRlcjogZ2V0RGVsaW1pdGVyKGRhdGFUeXBlKSxcblx0XHRzY2FsZTogc2NhbGUsXG5cdFx0dW5pdFByb3BlcnR5OiB1bml0UHJvcGVydHksXG5cdFx0dW5pdDogcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncy51bml0ID8/IHVuaXRUZXh0LFxuXHRcdHRpbWV6b25lUHJvcGVydHk6IHRpbWV6b25lUHJvcGVydHksXG5cdFx0dGltZXpvbmU6IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3MudGltZXpvbmUgPz8gdGltZXpvbmVUZXh0Py50b1N0cmluZygpLFxuXHRcdHRlbXBsYXRlOiByZWxhdGVkUHJvcGVydGllc0luZm8/LmV4cG9ydFNldHRpbmdzLnRlbXBsYXRlLFxuXHRcdC8vb25seSBpbiBjYXNlIG9mIGNvbXBsZXggcHJvcGVydGllcywgd3JhcCB0aGUgY2VsbCBjb250ZW50XHRvbiB0aGUgZXhjZWwgZXhwb3J0ZWQgZmlsZVxuXHRcdHdyYXA6IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3Mud3JhcCxcblx0XHR1dGM6IHV0Yyxcblx0XHRwcm9wZXJ0eTogcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncy5wcm9wZXJ0eVxuXHR9O1xuXHRpZiAoZXhwb3J0U2V0dGluZ3MudW5pdFByb3BlcnR5IHx8IGV4cG9ydFNldHRpbmdzLnVuaXQpIHtcblx0XHRleHBvcnRTZXR0aW5ncy5hdXRvU2NhbGUgPSB0cnVlO1xuXHR9XG5cdHJldHVybiByZW1vdmVVbmRlZmluZWRGcm9tRXhwb3J0U2V0dGluZ3MoZXhwb3J0U2V0dGluZ3MpO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBleHBvcnQgZm9ybWF0IHRlbXBsYXRlIGZvciBjb2x1bW5zIHdpdGggZGF0ZXMuXG4gKiBAcGFyYW0gZGF0YVR5cGUgVGhlIGRhdGEgdHlwZSBvZiB0aGUgY29sdW1uXG4gKiBAcmV0dXJucyBUaGUgaW5wdXRGb3JtYXRcbiAqL1xuY29uc3QgZ2V0RGF0ZUlucHV0Rm9ybWF0ID0gZnVuY3Rpb24gKGRhdGFUeXBlPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIGRhdGFUeXBlID09PSBcIkVkbS5EYXRlXCIgPyBcIllZWVktTU0tRERcIiA6IHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgZGVsaW1pdGVyIGluIG51bWVyaWMgY29sdW1ucy5cbiAqIFRoZSBkZWxpbWl0ZXIgaXMgdXNlZCB0byBkaXNwbGF5IHRob3VzYW5kcyBzZXBhcmF0b3IgaW4gbnVtZXJpYyBjb2x1bW5zLlxuICogQHBhcmFtIGRhdGFUeXBlIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGNvbHVtblxuICogQHJldHVybnMgVHJ1ZSB0byBkaXNwbGF5IHRob3VzYW5kcyBzZXBhcmF0b3IgaW4gbnVtZXJpYyBjb2x1bW5zXG4gKi9cbmNvbnN0IGdldERlbGltaXRlciA9IGZ1bmN0aW9uIChkYXRhVHlwZT86IHN0cmluZyk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuXHRyZXR1cm4gZGF0YVR5cGUgPT09IFwiRWRtLkludDY0XCIgPyB0cnVlIDogdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIHVuZGVmaW5lZCB2YWx1ZXMgZnJvbSB0aGUgZXhwb3J0IHNldHRpbmdzIG9iamVjdCBvZiBhIGNvbHVtbi5cbiAqIEBwYXJhbSBleHBvcnRTZXR0aW5ncyBUaGUgZXhwb3J0IHNldHRpbmdzIGNvbmZpZ3VyYXRpb25zIGZvciBhIGNvbHVtblxuICogQHJldHVybnMgVGhlIGV4cG9ydCBzZXR0aW5ncyBjb25maWd1cmF0aW9ucyB3aXRob3V0IHVuZGVmaW5lZCB2YWx1ZXNcbiAqL1xuY29uc3QgcmVtb3ZlVW5kZWZpbmVkRnJvbUV4cG9ydFNldHRpbmdzID0gZnVuY3Rpb24gKGV4cG9ydFNldHRpbmdzOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyk6IENvbHVtbkV4cG9ydFNldHRpbmdzIHtcblx0Ly9SZW1vdmUgdW5kZWZpbmVkIHNldHRpbmdzIGZyb20gZXhwb3J0U2V0dGluZyBvYmplY3Rcblx0Zm9yIChjb25zdCBzZXR0aW5nIGluIGV4cG9ydFNldHRpbmdzKSB7XG5cdFx0aWYgKGV4cG9ydFNldHRpbmdzW3NldHRpbmcgYXMga2V5b2YgQ29sdW1uRXhwb3J0U2V0dGluZ3NdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGRlbGV0ZSBleHBvcnRTZXR0aW5nc1tzZXR0aW5nIGFzIGtleW9mIENvbHVtbkV4cG9ydFNldHRpbmdzXTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGV4cG9ydFNldHRpbmdzO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIEJvb2xlYW4gdHJ1ZSBmb3IgZXhwb3J0YWJsZSBjb2x1bW5zLCBmYWxzZSBmb3Igbm9uIGV4cG9ydGFibGUgY29sdW1ucy5cbiAqIEBwYXJhbSBzb3VyY2UgVGhlIGRhdGFGaWVsZCBvciBwcm9wZXJ0eSB0byBiZSBldmFsdWF0ZWRcbiAqIEByZXR1cm5zIFRydWUgZm9yIGV4cG9ydGFibGUgY29sdW1uLCBmYWxzZSBmb3Igbm9uIGV4cG9ydGFibGUgY29sdW1uXG4gKi9cbmZ1bmN0aW9uIF9pc0V4cG9ydGFibGVDb2x1bW4oc291cmNlOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHkpOiBib29sZWFuIHtcblx0bGV0IHByb3BlcnR5VHlwZSwgcHJvcGVydHk7XG5cdGNvbnN0IGRhdGFGaWVsZERlZmF1bHRQcm9wZXJ0eSA9IChzb3VyY2UgYXMgUHJvcGVydHkpLmFubm90YXRpb25zLlVJPy5EYXRhRmllbGREZWZhdWx0O1xuXHRpZiAoaXNQcm9wZXJ0eShzb3VyY2UpKSB7XG5cdFx0aWYgKGlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuKHNvdXJjZSkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cHJvcGVydHlUeXBlID0gZGF0YUZpZWxkRGVmYXVsdFByb3BlcnR5Py4kVHlwZTtcblx0fSBlbHNlIGlmIChpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihzb3VyY2UpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9IGVsc2Uge1xuXHRcdHByb3BlcnR5ID0gc291cmNlO1xuXHRcdHByb3BlcnR5VHlwZSA9IHByb3BlcnR5LiRUeXBlO1xuXHRcdGlmIChwcm9wZXJ0eVR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiYgKHByb3BlcnR5IGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pLlRhcmdldD8uJHRhcmdldD8uJFR5cGUpIHtcblx0XHRcdC8vRm9yIENoYXJ0XG5cdFx0XHRwcm9wZXJ0eVR5cGUgPSAocHJvcGVydHkgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZTtcblx0XHRcdHJldHVybiBwcm9wZXJ0eVR5cGUgIT09IHVuZGVmaW5lZCAmJiAhVUlBbm5vdGF0aW9uVHlwZXMuQ2hhcnREZWZpbml0aW9uVHlwZS5pbmNsdWRlcyhwcm9wZXJ0eVR5cGUpO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHQocHJvcGVydHkgYXMgRGF0YUZpZWxkKS5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvcmU/Lk1lZGlhVHlwZT8udGVybSA9PT0gXCJPcmcuT0RhdGEuQ29yZS5WMS5NZWRpYVR5cGVcIiAmJlxuXHRcdFx0KHByb3BlcnR5IGFzIERhdGFGaWVsZCkuVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db3JlPy5pc1VSTCAhPT0gdHJ1ZVxuXHRcdCkge1xuXHRcdFx0Ly9Gb3IgU3RyZWFtXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBwcm9wZXJ0eVR5cGVcblx0XHQ/ICFbXG5cdFx0XHRcdFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbixcblx0XHRcdFx0VUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uLFxuXHRcdFx0XHRVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb25Hcm91cFxuXHRcdCAgXS5pbmNsdWRlcyhwcm9wZXJ0eVR5cGUpXG5cdFx0OiB0cnVlO1xufVxuXG4vKipcbiAqIFJldHVybnMgQm9vbGVhbiB0cnVlIGZvciB2YWxpZCBjb2x1bW5zLCBmYWxzZSBmb3IgaW52YWxpZCBjb2x1bW5zLlxuICogQHBhcmFtIGRhdGFGaWVsZCBEaWZmZXJlbnQgRGF0YUZpZWxkIHR5cGVzIGRlZmluZWQgaW4gdGhlIGFubm90YXRpb25zXG4gKiBAcmV0dXJucyBUcnVlIGZvciB2YWxpZCBjb2x1bW5zLCBmYWxzZSBmb3IgaW52YWxpZCBjb2x1bW5zXG4gKi9cbmNvbnN0IF9pc1ZhbGlkQ29sdW1uID0gZnVuY3Rpb24gKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IGJvb2xlYW4ge1xuXHRzd2l0Y2ggKGRhdGFGaWVsZC4kVHlwZSkge1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0cmV0dXJuICEhZGF0YUZpZWxkLklubGluZTtcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0Ly8gVG9kbzogUmVwbGFjZSB3aXRoIHByb3BlciBMb2cgc3RhdGVtZW50IG9uY2UgYXZhaWxhYmxlXG5cdFx0XHQvLyAgdGhyb3cgbmV3IEVycm9yKFwiVW5oYW5kbGVkIERhdGFGaWVsZCBBYnN0cmFjdCB0eXBlOiBcIiArIGRhdGFGaWVsZC4kVHlwZSk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYmluZGluZyBleHByZXNzaW9uIHRvIGV2YWx1YXRlIHRoZSB2aXNpYmlsaXR5IG9mIGEgRGF0YUZpZWxkIG9yIERhdGFQb2ludCBhbm5vdGF0aW9uLlxuICpcbiAqIFNBUCBGaW9yaSBlbGVtZW50cyB3aWxsIGV2YWx1YXRlIGVpdGhlciB0aGUgVUkuSGlkZGVuIGFubm90YXRpb24gZGVmaW5lZCBvbiB0aGUgYW5ub3RhdGlvbiBpdHNlbGYgb3Igb24gdGhlIHRhcmdldCBwcm9wZXJ0eS5cbiAqIEBwYXJhbSBkYXRhRmllbGRNb2RlbFBhdGggVGhlIG1ldGFwYXRoIHJlZmVycmluZyB0byB0aGUgYW5ub3RhdGlvbiB0aGF0IGlzIGV2YWx1YXRlZCBieSBTQVAgRmlvcmkgZWxlbWVudHMuXG4gKiBAcmV0dXJucyBBbiBleHByZXNzaW9uIHRoYXQgeW91IGNhbiBiaW5kIHRvIHRoZSBVSS5cbiAqL1xuY29uc3QgX2dldFZpc2libGVFeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRkYXRhRmllbGRNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8RGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcz5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IHRhcmdldE9iamVjdCA9IGRhdGFGaWVsZE1vZGVsUGF0aC50YXJnZXRPYmplY3Q7XG5cdGxldCBwcm9wZXJ0eVZhbHVlO1xuXHRpZiAodGFyZ2V0T2JqZWN0KSB7XG5cdFx0c3dpdGNoICh0YXJnZXRPYmplY3QuJFR5cGUpIHtcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGU6XG5cdFx0XHRcdHByb3BlcnR5VmFsdWUgPSB0YXJnZXRPYmplY3QuVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0XHRcdC8vIGlmIGl0IGlzIGEgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBwb2ludGluZyB0byBhIERhdGFQb2ludCB3ZSBsb29rIGF0IHRoZSBkYXRhUG9pbnQncyB2YWx1ZVxuXHRcdFx0XHRpZiAodGFyZ2V0T2JqZWN0Py5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlKSB7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IHRhcmdldE9iamVjdC5UYXJnZXQuJHRhcmdldD8uVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRjb25zdCBpc0FuYWx5dGljYWxHcm91cEhlYWRlckV4cGFuZGVkID0gLypmb3JtYXRPcHRpb25zPy5pc0FuYWx5dGljcyA/IFVJLklzRXhwYW5kZWQgOiovIGNvbnN0YW50KGZhbHNlKTtcblx0Y29uc3QgaXNBbmFseXRpY2FsTGVhZiA9IC8qZm9ybWF0T3B0aW9ucz8uaXNBbmFseXRpY3MgPyBlcXVhbChVSS5Ob2RlTGV2ZWwsIDApIDoqLyBjb25zdGFudChmYWxzZSk7XG5cdC8vIEEgZGF0YSBmaWVsZCBpcyB2aXNpYmxlIGlmOlxuXHQvLyAtIHRoZSBVSS5IaWRkZW4gZXhwcmVzc2lvbiBpbiB0aGUgb3JpZ2luYWwgYW5ub3RhdGlvbiBkb2VzIG5vdCBldmFsdWF0ZSB0byAndHJ1ZSdcblx0Ly8gLSB0aGUgVUkuSGlkZGVuIGV4cHJlc3Npb24gaW4gdGhlIHRhcmdldCBwcm9wZXJ0eSBkb2VzIG5vdCBldmFsdWF0ZSB0byAndHJ1ZSdcblx0Ly8gLSBpbiBjYXNlIG9mIEFuYWx5dGljcyBpdCdzIG5vdCB2aXNpYmxlIGZvciBhbiBleHBhbmRlZCBHcm91cEhlYWRlclxuXHRyZXR1cm4gYW5kKFxuXHRcdC4uLltcblx0XHRcdG5vdChlcXVhbChnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24odGFyZ2V0T2JqZWN0Py5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbiksIHRydWUpKSxcblx0XHRcdGlmRWxzZShcblx0XHRcdFx0ISFwcm9wZXJ0eVZhbHVlLFxuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlICYmIG5vdChlcXVhbChnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24ocHJvcGVydHlWYWx1ZS5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbiksIHRydWUpKSxcblx0XHRcdFx0dHJ1ZVxuXHRcdFx0KSxcblx0XHRcdG9yKG5vdChpc0FuYWx5dGljYWxHcm91cEhlYWRlckV4cGFuZGVkKSwgaXNBbmFseXRpY2FsTGVhZilcblx0XHRdXG5cdCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgaGlkZGVuIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIGEgZmllbGQgZ3JvdXAuXG4gKiBAcGFyYW0gZGF0YUZpZWxkR3JvdXAgRGF0YUZpZWxkIGRlZmluZWQgaW4gdGhlIGFubm90YXRpb25zXG4gKiBAcmV0dXJucyBDb21waWxlIGJpbmRpbmcgb2YgZmllbGQgZ3JvdXAgZXhwcmVzc2lvbnMuXG4gKi9cbmNvbnN0IF9nZXRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMgPSBmdW5jdGlvbiAoZGF0YUZpZWxkR3JvdXA6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IGZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9uczogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+W10gPSBbXTtcblx0aWYgKFxuXHRcdGRhdGFGaWVsZEdyb3VwLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uICYmXG5cdFx0ZGF0YUZpZWxkR3JvdXAuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRmllbGRHcm91cFR5cGVcblx0KSB7XG5cdFx0aWYgKGRhdGFGaWVsZEdyb3VwPy5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbikge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKG5vdChlcXVhbChnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24oZGF0YUZpZWxkR3JvdXAuYW5ub3RhdGlvbnMuVUkuSGlkZGVuKSwgdHJ1ZSkpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGF0YUZpZWxkR3JvdXAuVGFyZ2V0LiR0YXJnZXQuRGF0YT8uZm9yRWFjaCgoaW5uZXJEYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXMpID0+IHtcblx0XHRcdFx0ZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zLnB1c2goXG5cdFx0XHRcdFx0X2dldFZpc2libGVFeHByZXNzaW9uKHsgdGFyZ2V0T2JqZWN0OiBpbm5lckRhdGFGaWVsZCB9IGFzIERhdGFNb2RlbE9iamVjdFBhdGg8XG5cdFx0XHRcdFx0XHREYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgRGF0YVBvaW50VHlwZVR5cGVzXG5cdFx0XHRcdFx0Pilcblx0XHRcdFx0KTtcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGlmRWxzZShvciguLi5maWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMpLCBjb25zdGFudCh0cnVlKSwgY29uc3RhbnQoZmFsc2UpKSk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGFiZWwgZm9yIHRoZSBwcm9wZXJ0eSBhbmQgZGF0YUZpZWxkLlxuICogQHBhcmFtIFtwcm9wZXJ0eV0gUHJvcGVydHksIERhdGFGaWVsZCBvciBOYXZpZ2F0aW9uIFByb3BlcnR5IGRlZmluZWQgaW4gdGhlIGFubm90YXRpb25zXG4gKiBAcGFyYW0gaXNHcm91cFxuICogQHJldHVybnMgTGFiZWwgb2YgdGhlIHByb3BlcnR5IG9yIERhdGFGaWVsZFxuICovXG5jb25zdCBnZXRMYWJlbCA9IGZ1bmN0aW9uIChwcm9wZXJ0eTogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5IHwgTmF2aWdhdGlvblByb3BlcnR5LCBpc0dyb3VwID0gZmFsc2UpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAoIXByb3BlcnR5KSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRpZiAoaXNQcm9wZXJ0eShwcm9wZXJ0eSkgfHwgaXNOYXZpZ2F0aW9uUHJvcGVydHkocHJvcGVydHkpKSB7XG5cdFx0Y29uc3QgZGF0YUZpZWxkRGVmYXVsdCA9IChwcm9wZXJ0eSBhcyBQcm9wZXJ0eSkuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0O1xuXHRcdGlmIChkYXRhRmllbGREZWZhdWx0ICYmICFkYXRhRmllbGREZWZhdWx0LnF1YWxpZmllciAmJiBkYXRhRmllbGREZWZhdWx0LkxhYmVsKSB7XG5cdFx0XHRyZXR1cm4gZGF0YUZpZWxkRGVmYXVsdC5MYWJlbD8udG9TdHJpbmcoKTtcblx0XHR9XG5cdFx0cmV0dXJuIHByb3BlcnR5LmFubm90YXRpb25zLkNvbW1vbj8uTGFiZWw/LnRvU3RyaW5nKCkgPz8gcHJvcGVydHkubmFtZTtcblx0fSBlbHNlIGlmIChpc0RhdGFGaWVsZFR5cGVzKHByb3BlcnR5KSkge1xuXHRcdGlmICghIWlzR3JvdXAgJiYgcHJvcGVydHkuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb24pIHtcblx0XHRcdHJldHVybiBwcm9wZXJ0eT8uTGFiZWw/LnRvU3RyaW5nKCk7XG5cdFx0fVxuXHRcdHJldHVybiAoXG5cdFx0XHRwcm9wZXJ0eT8uTGFiZWw/LnRvU3RyaW5nKCkgPz9cblx0XHRcdGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0XHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24ocHJvcGVydHkuVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkxhYmVsLCBbXSwgcHJvcGVydHkuVmFsdWU/LiR0YXJnZXQ/Lm5hbWUpXG5cdFx0XHQpXG5cdFx0KTtcblx0fSBlbHNlIGlmIChwcm9wZXJ0eS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikge1xuXHRcdHJldHVybiAoXG5cdFx0XHRwcm9wZXJ0eS5MYWJlbD8udG9TdHJpbmcoKSA/P1xuXHRcdFx0Y29tcGlsZUV4cHJlc3Npb24oXG5cdFx0XHRcdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbigocHJvcGVydHkuVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludCk/LlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5MYWJlbD8udmFsdWVPZigpKVxuXHRcdFx0KVxuXHRcdCk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHByb3BlcnR5LkxhYmVsPy50b1N0cmluZygpO1xuXHR9XG59O1xuXG5jb25zdCBfZ2V0VG9vbHRpcCA9IGZ1bmN0aW9uIChzb3VyY2U6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBQcm9wZXJ0eSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmICghc291cmNlKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRpZiAoaXNQcm9wZXJ0eShzb3VyY2UpIHx8IHNvdXJjZS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5RdWlja0luZm8pIHtcblx0XHRyZXR1cm4gc291cmNlLmFubm90YXRpb25zPy5Db21tb24/LlF1aWNrSW5mb1xuXHRcdFx0PyBjb21waWxlRXhwcmVzc2lvbihnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24oc291cmNlLmFubm90YXRpb25zLkNvbW1vbi5RdWlja0luZm8pKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoaXNEYXRhRmllbGRUeXBlcyhzb3VyY2UpKSB7XG5cdFx0cmV0dXJuIHNvdXJjZS5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uUXVpY2tJbmZvXG5cdFx0XHQ/IGNvbXBpbGVFeHByZXNzaW9uKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihzb3VyY2UuVmFsdWUuJHRhcmdldC5hbm5vdGF0aW9ucy5Db21tb24uUXVpY2tJbmZvKSlcblx0XHRcdDogdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKHNvdXJjZS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikge1xuXHRcdGNvbnN0IGRhdGFwb2ludFRhcmdldCA9IHNvdXJjZS5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50O1xuXHRcdHJldHVybiBkYXRhcG9pbnRUYXJnZXQ/LlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5RdWlja0luZm9cblx0XHRcdD8gY29tcGlsZUV4cHJlc3Npb24oZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKGRhdGFwb2ludFRhcmdldC5WYWx1ZS4kdGFyZ2V0LmFubm90YXRpb25zLkNvbW1vbi5RdWlja0luZm8pKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJvd1N0YXR1c1Zpc2liaWxpdHkoY29sTmFtZTogc3RyaW5nLCBpc1NlbWFudGljS2V5SW5GaWVsZEdyb3VwPzogYm9vbGVhbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBmb3JtYXRSZXN1bHQoXG5cdFx0W1xuXHRcdFx0cGF0aEluTW9kZWwoYHNlbWFudGljS2V5SGFzRHJhZnRJbmRpY2F0b3JgLCBcImludGVybmFsXCIpLFxuXHRcdFx0cGF0aEluTW9kZWwoYGZpbHRlcmVkTWVzc2FnZXNgLCBcImludGVybmFsXCIpLFxuXHRcdFx0Y29sTmFtZSxcblx0XHRcdGlzU2VtYW50aWNLZXlJbkZpZWxkR3JvdXBcblx0XHRdLFxuXHRcdHRhYmxlRm9ybWF0dGVycy5nZXRFcnJvclN0YXR1c1RleHRWaXNpYmlsaXR5Rm9ybWF0dGVyXG5cdCk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIFByb3BlcnR5SW5mbyBmb3IgZWFjaCBpZGVudGlmaWVkIHByb3BlcnR5IGNvbnN1bWVkIGJ5IGEgTGluZUl0ZW0uXG4gKiBAcGFyYW0gY29sdW1uc1RvQmVDcmVhdGVkIElkZW50aWZpZWQgcHJvcGVydGllcy5cbiAqIEBwYXJhbSBleGlzdGluZ0NvbHVtbnMgVGhlIGxpc3Qgb2YgY29sdW1ucyBjcmVhdGVkIGZvciBMaW5lSXRlbXMgYW5kIFByb3BlcnRpZXMgb2YgZW50aXR5VHlwZS5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBlbnRpdHkgdHlwZSBmb3IgdGhlIExpbmVJdGVtXG4gKiBAcGFyYW0gZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCBUaGUgbWFwIG9mIHByb3BlcnRpZXMgcmVmZXJlbmNlZCBhcyB0ZXh0IG9uIGEgdGV4dCBhcnJhbmdlbWVudCBhbm5vdGF0aW9uLlxuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB0YWJsZVxuICogQHBhcmFtIHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyBUaGUgZXhpc3RpbmcgcmVzdHJpY3Rpb25zIG9uIHByb3BlcnRpZXNcbiAqIEByZXR1cm5zIFRoZSBhcnJheSBvZiBjb2x1bW5zIGNyZWF0ZWQuXG4gKi9cbmNvbnN0IF9jcmVhdGVSZWxhdGVkQ29sdW1ucyA9IGZ1bmN0aW9uIChcblx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4sXG5cdGV4aXN0aW5nQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcDogUmVjb3JkPHN0cmluZywgRGlzcGxheU1vZGU+LFxuXHR0YWJsZVR5cGU/OiBUYWJsZVR5cGUsXG5cdHRhYmxlQ3JlYXRpb25Nb2RlPzogQ3JlYXRpb25Nb2RlLFxuXHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM/OiBSZXN0cmljdGlvbnNPblByb3BlcnRpZXNcbik6IEFubm90YXRpb25UYWJsZUNvbHVtbltdIHtcblx0Y29uc3QgcmVsYXRlZENvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdID0gW107XG5cdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cdE9iamVjdC5rZXlzKGNvbHVtbnNUb0JlQ3JlYXRlZCkuZm9yRWFjaCgobmFtZSkgPT4ge1xuXHRcdGNvbnN0IHByb3BlcnR5ID0gY29sdW1uc1RvQmVDcmVhdGVkW25hbWVdLFxuXHRcdFx0YW5ub3RhdGlvblBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFic29sdXRlQW5ub3RhdGlvblBhdGgobmFtZSksXG5cdFx0XHQvLyBDaGVjayB3aGV0aGVyIHRoZSByZWxhdGVkIGNvbHVtbiBhbHJlYWR5IGV4aXN0cy5cblx0XHRcdHJlbGF0ZWRDb2x1bW4gPSBleGlzdGluZ0NvbHVtbnMuZmluZCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA9PT0gbmFtZSk7XG5cdFx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcihjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCkpLmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0XHRjb25zdCBwcm9wZXJ0eU9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KGRhdGFNb2RlbE9iamVjdFBhdGgsIG5hbWUpO1xuXHRcdGlmIChpc011bHRpVmFsdWVGaWVsZChwcm9wZXJ0eU9iamVjdFBhdGgpKSB7XG5cdFx0XHRjb25zdCBuZXdOYW1lUmVsYXRpdmVUYXJnZXRQYXRoID0gZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aChwcm9wZXJ0eU9iamVjdFBhdGgsIGZhbHNlLCB0cnVlKTtcblx0XHRcdGNvbnN0IGNvbHVtbiA9IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRhbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0bmFtZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyxcblx0XHRcdFx0dGFibGVDcmVhdGlvbk1vZGUsXG5cdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0bmV3TmFtZVJlbGF0aXZlVGFyZ2V0UGF0aFxuXHRcdFx0KTtcblx0XHRcdGNvbXB1dGVIaWRkZW5PblJlbGF0ZWRDb2x1bW5zKGV4aXN0aW5nQ29sdW1ucywgbmFtZSwgY29sdW1uKTtcblx0XHRcdHJlbGF0ZWRDb2x1bW5zLnB1c2goY29sdW1uKTtcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXBbbmFtZV0gPSBuZXdOYW1lUmVsYXRpdmVUYXJnZXRQYXRoID8/IG5hbWU7XG5cdFx0fSBlbHNlIGlmIChyZWxhdGVkQ29sdW1uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIENhc2UgMTogS2V5IGNvbnRhaW5zIERhdGFGaWVsZCBwcmVmaXggdG8gZW5zdXJlIGFsbCBwcm9wZXJ0eSBjb2x1bW5zIGhhdmUgdGhlIHNhbWUga2V5IGZvcm1hdC5cblx0XHRcdC8vIE5ldyBjcmVhdGVkIHByb3BlcnR5IGNvbHVtbiBpcyBzZXQgdG8gaGlkZGVuLlxuXHRcdFx0Y29uc3QgY29sdW1uID0gZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eShcblx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdGFubm90YXRpb25QYXRoLFxuXHRcdFx0XHRuYW1lLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0YWdncmVnYXRpb25IZWxwZXIsXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAsXG5cdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHRcdFx0XHR0YWJsZUNyZWF0aW9uTW9kZVxuXHRcdFx0KTtcblx0XHRcdGNvbXB1dGVIaWRkZW5PblJlbGF0ZWRDb2x1bW5zKGV4aXN0aW5nQ29sdW1ucywgbmFtZSwgY29sdW1uKTtcblx0XHRcdHJlbGF0ZWRDb2x1bW5zLnB1c2goY29sdW1uKTtcblx0XHR9IGVsc2UgaWYgKHJlbGF0ZWRDb2x1bW4uYW5ub3RhdGlvblBhdGggIT09IGFubm90YXRpb25QYXRoIHx8IHJlbGF0ZWRDb2x1bW4ucHJvcGVydHlJbmZvcykge1xuXHRcdFx0Ly8gQ2FzZSAyOiBUaGUgZXhpc3RpbmcgY29sdW1uIHBvaW50cyB0byBhIExpbmVJdGVtIChvcilcblx0XHRcdC8vIENhc2UgMzogVGhpcyBpcyBhIHNlbGYgcmVmZXJlbmNlIGZyb20gYW4gZXhpc3RpbmcgY29sdW1uXG5cdFx0XHRjb25zdCBuZXdOYW1lID0gYFByb3BlcnR5Ojoke25hbWV9YDtcblx0XHRcdC8vIENoZWNraW5nIHdoZXRoZXIgdGhlIHJlbGF0ZWQgcHJvcGVydHkgY29sdW1uIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCBpbiBhIHByZXZpb3VzIGl0ZXJhdGlvbi5cblx0XHRcdGlmICghZXhpc3RpbmdDb2x1bW5zLnNvbWUoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUgPT09IG5ld05hbWUpKSB7XG5cdFx0XHRcdC8vIENyZWF0ZSBhIG5ldyBwcm9wZXJ0eSBjb2x1bW4gd2l0aCAnUHJvcGVydHk6OicgcHJlZml4LFxuXHRcdFx0XHQvLyBTZXQgaXQgdG8gaGlkZGVuIGFzIGl0IGlzIG9ubHkgY29uc3VtZWQgYnkgQ29tcGxleCBwcm9wZXJ0eSBpbmZvcy5cblx0XHRcdFx0Y29uc3QgY29sdW1uID0gZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eShcblx0XHRcdFx0XHRwcm9wZXJ0eSxcblx0XHRcdFx0XHRhbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0XHRuYW1lLFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdGFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCxcblx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdHRhYmxlQ3JlYXRpb25Nb2RlXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbXB1dGVIaWRkZW5PblJlbGF0ZWRDb2x1bW5zKGV4aXN0aW5nQ29sdW1ucywgbmFtZSwgY29sdW1uKTtcblx0XHRcdFx0cmVsYXRlZENvbHVtbnMucHVzaChjb2x1bW4pO1xuXHRcdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lTWFwW25hbWVdID0gbmV3TmFtZTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdGV4aXN0aW5nQ29sdW1ucy5zb21lKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lID09PSBuZXdOYW1lKSAmJlxuXHRcdFx0XHRleGlzdGluZ0NvbHVtbnMuc29tZSgoY29sdW1uKSA9PiBjb2x1bW4ucHJvcGVydHlJbmZvcz8uaW5jbHVkZXMobmFtZSkpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZU1hcFtuYW1lXSA9IG5ld05hbWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0Ly8gVGhlIHByb3BlcnR5ICduYW1lJyBoYXMgYmVlbiBwcmVmaXhlZCB3aXRoICdQcm9wZXJ0eTo6JyBmb3IgdW5pcXVlbmVzcy5cblx0Ly8gVXBkYXRlIHRoZSBzYW1lIGluIG90aGVyIHByb3BlcnR5SW5mb3NbXSByZWZlcmVuY2VzIHdoaWNoIHBvaW50IHRvIHRoaXMgcHJvcGVydHkuXG5cdGV4aXN0aW5nQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcblx0XHRjb2x1bW4ucHJvcGVydHlJbmZvcyA9IGNvbHVtbi5wcm9wZXJ0eUluZm9zPy5tYXAoKHByb3BlcnR5SW5mbykgPT4gcmVsYXRlZFByb3BlcnR5TmFtZU1hcFtwcm9wZXJ0eUluZm9dID8/IHByb3BlcnR5SW5mbyk7XG5cdFx0Y29sdW1uLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zID0gY29sdW1uLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zPy5tYXAoXG5cdFx0XHQocHJvcGVydHlJbmZvKSA9PiByZWxhdGVkUHJvcGVydHlOYW1lTWFwW3Byb3BlcnR5SW5mb10gPz8gcHJvcGVydHlJbmZvXG5cdFx0KTtcblx0fSk7XG5cdHJldHVybiByZWxhdGVkQ29sdW1ucztcbn07XG5cbi8qKlxuICogR2V0dGluZyB0aGUgQ29sdW1uIE5hbWVcbiAqIElmIGl0IHBvaW50cyB0byBhIERhdGFGaWVsZCB3aXRoIG9uZSBwcm9wZXJ0eSBvciBEYXRhUG9pbnQgd2l0aCBvbmUgcHJvcGVydHksIGl0IHdpbGwgdXNlIHRoZSBwcm9wZXJ0eSBuYW1lXG4gKiBoZXJlIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgZXhpc3RpbmcgZmxleCBjaGFuZ2VzLlxuICogQHBhcmFtIGRhdGFGaWVsZCBEaWZmZXJlbnQgRGF0YUZpZWxkIHR5cGVzIGRlZmluZWQgaW4gdGhlIGFubm90YXRpb25zXG4gKiBAcmV0dXJucyBUaGUgbmFtZSBvZiBhbm5vdGF0aW9uIGNvbHVtbnNcbiAqL1xuY29uc3QgX2dldEFubm90YXRpb25Db2x1bW5OYW1lID0gZnVuY3Rpb24gKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IHN0cmluZyB7XG5cdC8vIFRoaXMgaXMgbmVlZGVkIGFzIHdlIGhhdmUgZmxleGliaWxpdHkgY2hhbmdlcyBhbHJlYWR5IHRoYXQgd2UgaGF2ZSB0byBjaGVjayBhZ2FpbnN0XG5cdGlmIChpc0RhdGFGaWVsZFR5cGVzKGRhdGFGaWVsZCkgJiYgZGF0YUZpZWxkLlZhbHVlPy5wYXRoKSB7XG5cdFx0cmV0dXJuIGRhdGFGaWVsZC5WYWx1ZT8ucGF0aDtcblx0fSBlbHNlIGlmIChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiYgKGRhdGFGaWVsZC5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50KT8uVmFsdWU/LnBhdGgpIHtcblx0XHQvLyBUaGlzIGlzIGZvciByZW1vdmluZyBkdXBsaWNhdGUgcHJvcGVydGllcy4gRm9yIGV4YW1wbGUsICdQcm9ncmVzcycgUHJvcGVydHkgaXMgcmVtb3ZlZCBpZiBpdCBpcyBhbHJlYWR5IGRlZmluZWQgYXMgYSBEYXRhUG9pbnRcblx0XHRyZXR1cm4gKGRhdGFGaWVsZC5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50KT8uVmFsdWUucGF0aDtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpO1xuXHR9XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGRhdGEgZmllbGQgbGFiZWxzIGhhdmUgdG8gYmUgZGlzcGxheWVkIGluIHRoZSB0YWJsZS5cbiAqIEBwYXJhbSBmaWVsZEdyb3VwTmFtZSBUaGUgYERhdGFGaWVsZGAgbmFtZSBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0gdmlzdWFsaXphdGlvblBhdGhcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyBgc2hvd0RhdGFGaWVsZHNMYWJlbGAgdmFsdWUgZnJvbSB0aGUgbWFuaWZlc3RcbiAqL1xuY29uc3QgX2dldFNob3dEYXRhRmllbGRzTGFiZWwgPSBmdW5jdGlvbiAoXG5cdGZpZWxkR3JvdXBOYW1lOiBzdHJpbmcsXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IGNvbHVtbnMgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb248VGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24+KHZpc3VhbGl6YXRpb25QYXRoKT8uY29sdW1ucztcblx0Y29uc3QgY29sdW1uS2V5cyA9IGNvbHVtbnMgJiYgT2JqZWN0LmtleXMoY29sdW1ucyk7XG5cdHJldHVybiAoXG5cdFx0Y29sdW1uS2V5cyAmJlxuXHRcdCEhY29sdW1uS2V5cy5maW5kKGZ1bmN0aW9uIChrZXk6IHN0cmluZykge1xuXHRcdFx0cmV0dXJuIGtleSA9PT0gZmllbGRHcm91cE5hbWUgJiYgKGNvbHVtbnNba2V5XSBhcyBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW5Gb3JPdmVycmlkZSkuc2hvd0RhdGFGaWVsZHNMYWJlbDtcblx0XHR9KVxuXHQpO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB3aXRoIHJlc3BlY3QgdG8gdGhlIHJvb3QgZW50aXR5LlxuICogQHBhcmFtIGRhdGFGaWVsZCBUaGUgYERhdGFGaWVsZGAgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhcbiAqL1xuY29uc3QgX2dldFJlbGF0aXZlUGF0aCA9IGZ1bmN0aW9uIChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpOiBzdHJpbmcge1xuXHRsZXQgcmVsYXRpdmVQYXRoID0gXCJcIjtcblx0c3dpdGNoIChkYXRhRmllbGQuJFR5cGUpIHtcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRcdHJlbGF0aXZlUGF0aCA9IChkYXRhRmllbGQgYXMgRGF0YUZpZWxkKT8uVmFsdWU/LnBhdGg7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0XHRyZWxhdGl2ZVBhdGggPSBkYXRhRmllbGQ/LlRhcmdldD8udmFsdWU7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbkdyb3VwOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbkdyb3VwOlxuXHRcdFx0cmVsYXRpdmVQYXRoID0gS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpO1xuXHRcdFx0YnJlYWs7XG5cdH1cblx0cmV0dXJuIHJlbGF0aXZlUGF0aDtcbn07XG5cbmNvbnN0IF9zbGljZUF0U2xhc2ggPSBmdW5jdGlvbiAocGF0aDogc3RyaW5nLCBpc0xhc3RTbGFzaDogYm9vbGVhbiwgaXNMYXN0UGFydDogYm9vbGVhbik6IHN0cmluZyB7XG5cdGNvbnN0IGlTbGFzaEluZGV4ID0gaXNMYXN0U2xhc2ggPyBwYXRoLmxhc3RJbmRleE9mKFwiL1wiKSA6IHBhdGguaW5kZXhPZihcIi9cIik7XG5cdGlmIChpU2xhc2hJbmRleCA9PT0gLTEpIHtcblx0XHRyZXR1cm4gcGF0aDtcblx0fVxuXHRyZXR1cm4gaXNMYXN0UGFydCA/IHBhdGguc3Vic3RyaW5nKGlTbGFzaEluZGV4ICsgMSwgcGF0aC5sZW5ndGgpIDogcGF0aC5zdWJzdHJpbmcoMCwgaVNsYXNoSW5kZXgpO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBjb2x1bW4gY29udGFpbnMgYSBtdWx0aS12YWx1ZSBmaWVsZC5cbiAqIEBwYXJhbSBkYXRhRmllbGQgVGhlIERhdGFGaWVsZCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgRGF0YUZpZWxkIGNvcnJlc3BvbmRzIHRvIGEgbXVsdGktdmFsdWUgZmllbGQuXG4gKi9cbmNvbnN0IF9pc0NvbHVtbk11bHRpVmFsdWVkID0gZnVuY3Rpb24gKFxuXHRkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogYm9vbGVhbiB7XG5cdGlmIChpc0RhdGFGaWVsZFR5cGVzKGRhdGFGaWVsZCkgJiYgaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24oZGF0YUZpZWxkLlZhbHVlKSkge1xuXHRcdGNvbnN0IHByb3BlcnR5T2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFBhZ2VDb250ZXh0UGF0aFRhcmdldD4oXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSxcblx0XHRcdGRhdGFGaWVsZC5WYWx1ZS5wYXRoXG5cdFx0KTtcblx0XHRyZXR1cm4gaXNNdWx0aVZhbHVlRmllbGQocHJvcGVydHlPYmplY3RQYXRoKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBjb2x1bW4gaXMgc29ydGFibGUuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBkYXRhIGZpZWxkIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHByb3BlcnR5UGF0aCBUaGUgcHJvcGVydHkgcGF0aFxuICogQHBhcmFtIG5vblNvcnRhYmxlQ29sdW1ucyBDb2xsZWN0aW9uIG9mIG5vbi1zb3J0YWJsZSBjb2x1bW4gbmFtZXMgYXMgcGVyIGFubm90YXRpb25cbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllc0luZm8gVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBsaW5rZWQgdG8gdGhlIGNvbHVtblxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY29sdW1uIGlzIHNvcnRhYmxlXG4gKi9cbmNvbnN0IF9pc0NvbHVtblNvcnRhYmxlID0gZnVuY3Rpb24gKFxuXHRkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdHByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRub25Tb3J0YWJsZUNvbHVtbnM6IHN0cmluZ1tdLFxuXHRyZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm9cbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gKFxuXHRcdCFub25Tb3J0YWJsZUNvbHVtbnMuaW5jbHVkZXMocHJvcGVydHlQYXRoKSAmJiAvLyBDb2x1bW4gaXMgbm90IG1hcmtlZCBhcyBub24tc29ydGFibGUgdmlhIGFubm90YXRpb25cblx0XHQoKChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZCB8fCBkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24pICYmXG5cdFx0XHRPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllcykuc29tZSgocHJvcE5hbWUpID0+IHtcblx0XHRcdFx0Y29uc3QgaXNIaWRkZW4gPSBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1twcm9wTmFtZV0uYW5ub3RhdGlvblByb3BlcnR5KTtcblx0XHRcdFx0cmV0dXJuICFpc0hpZGRlbiAmJiAhbm9uU29ydGFibGVDb2x1bW5zLmluY2x1ZGVzKHByb3BOYW1lKTtcblx0XHRcdH0pKSB8fFxuXHRcdFx0ZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsIHx8XG5cdFx0XHRkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb24gfHxcblx0XHRcdGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbilcblx0KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIGZpbHRlcmluZyBvbiB0aGUgdGFibGUgaXMgY2FzZSBzZW5zaXRpdmUuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyBSZXR1cm5zICdmYWxzZScgaWYgRmlsdGVyRnVuY3Rpb25zIGFubm90YXRpb24gc3VwcG9ydHMgJ3RvbG93ZXInLCBlbHNlICd0cnVlJ1xuICovXG5leHBvcnQgY29uc3QgaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlID0gZnVuY3Rpb24gKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pik6IGJvb2xlYW4ge1xuXHRjb25zdCBmaWx0ZXJGdW5jdGlvbnM6IEZpbHRlckZ1bmN0aW9ucyB8IHVuZGVmaW5lZCA9IF9nZXRGaWx0ZXJGdW5jdGlvbnMoY29udmVydGVyQ29udGV4dCk7XG5cdHJldHVybiBNb2RlbEhlbHBlci5pc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUodW5kZWZpbmVkLCBmaWx0ZXJGdW5jdGlvbnMpO1xufTtcblxuZnVuY3Rpb24gX2dldEZpbHRlckZ1bmN0aW9ucyhDb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBGaWx0ZXJGdW5jdGlvbnMgfCB1bmRlZmluZWQge1xuXHRjb25zdCBlbnRpdHlTZXQgPSBDb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpO1xuXHRpZiAoVHlwZUd1YXJkcy5pc0VudGl0eVNldChlbnRpdHlTZXQpKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdGVudGl0eVNldC5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LkZpbHRlckZ1bmN0aW9ucyA/P1xuXHRcdFx0Q29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlDb250YWluZXIoKS5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LkZpbHRlckZ1bmN0aW9uc1xuXHRcdCk7XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGRlZmF1bHQgZm9ybWF0IG9wdGlvbnMgZm9yIHRleHQgZmllbGRzIGluIGEgdGFibGUuXG4gKiBAcGFyYW0gZm9ybWF0T3B0aW9uc1xuICogQHJldHVybnMgQ29sbGVjdGlvbiBvZiBmb3JtYXQgb3B0aW9ucyB3aXRoIGRlZmF1bHQgdmFsdWVzXG4gKi9cbmZ1bmN0aW9uIF9nZXREZWZhdWx0Rm9ybWF0T3B0aW9uc0ZvclRhYmxlKGZvcm1hdE9wdGlvbnM6IEZvcm1hdE9wdGlvbnNUeXBlIHwgdW5kZWZpbmVkKTogRm9ybWF0T3B0aW9uc1R5cGUgfCB1bmRlZmluZWQge1xuXHRyZXR1cm4gZm9ybWF0T3B0aW9ucyA9PT0gdW5kZWZpbmVkXG5cdFx0PyB1bmRlZmluZWRcblx0XHQ6IHtcblx0XHRcdFx0dGV4dExpbmVzRWRpdDogNCxcblx0XHRcdFx0Li4uZm9ybWF0T3B0aW9uc1xuXHRcdCAgfTtcbn1cblxuZnVuY3Rpb24gX2ZpbmRTZW1hbnRpY0tleVZhbHVlcyhzZW1hbnRpY0tleXM6IFNlbWFudGljS2V5LCBuYW1lOiBzdHJpbmcpOiB7IHZhbHVlczogc3RyaW5nW107IHNlbWFudGljS2V5Rm91bmQ6IGJvb2xlYW4gfSB7XG5cdGNvbnN0IGFTZW1hbnRpY0tleVZhbHVlczogc3RyaW5nW10gPSBbXTtcblx0bGV0IGJTZW1hbnRpY0tleUZvdW5kID0gZmFsc2U7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgc2VtYW50aWNLZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0YVNlbWFudGljS2V5VmFsdWVzLnB1c2goc2VtYW50aWNLZXlzW2ldLnZhbHVlKTtcblx0XHRpZiAoc2VtYW50aWNLZXlzW2ldLnZhbHVlID09PSBuYW1lKSB7XG5cdFx0XHRiU2VtYW50aWNLZXlGb3VuZCA9IHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7XG5cdFx0dmFsdWVzOiBhU2VtYW50aWNLZXlWYWx1ZXMsXG5cdFx0c2VtYW50aWNLZXlGb3VuZDogYlNlbWFudGljS2V5Rm91bmRcblx0fTtcbn1cblxuZnVuY3Rpb24gX2ZpbmRQcm9wZXJ0aWVzKFxuXHRzZW1hbnRpY0tleVZhbHVlczogc3RyaW5nW10sXG5cdGZpZWxkR3JvdXBQcm9wZXJ0aWVzOiBzdHJpbmdbXVxuKTogeyBzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBib29sZWFuOyBmaWVsZEdyb3VwUHJvcGVydHlQYXRoPzogc3RyaW5nIH0ge1xuXHRsZXQgc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCA9IGZhbHNlO1xuXHRsZXQgc1Byb3BlcnR5UGF0aDtcblx0aWYgKHNlbWFudGljS2V5VmFsdWVzICYmIHNlbWFudGljS2V5VmFsdWVzLmxlbmd0aCA+PSAxICYmIGZpZWxkR3JvdXBQcm9wZXJ0aWVzICYmIGZpZWxkR3JvdXBQcm9wZXJ0aWVzLmxlbmd0aCA+PSAxKSB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzZW1hbnRpY0tleVZhbHVlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKFtzZW1hbnRpY0tleVZhbHVlc1tpXV0uc29tZSgodG1wKSA9PiBmaWVsZEdyb3VwUHJvcGVydGllcy5pbmNsdWRlcyh0bXApKSkge1xuXHRcdFx0XHRzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwID0gdHJ1ZTtcblx0XHRcdFx0c1Byb3BlcnR5UGF0aCA9IHNlbWFudGljS2V5VmFsdWVzW2ldO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHtcblx0XHRzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwLFxuXHRcdGZpZWxkR3JvdXBQcm9wZXJ0eVBhdGg6IHNQcm9wZXJ0eVBhdGhcblx0fTtcbn1cblxuLyoqXG4gKiBGaW5kIHRoZSBmaXJzdCBwcm9wZXJ0eSBpbiB0aGUgZmllbGRHcm91cCB0aGF0IGlzIHBhcnQgb2YgdGhlIHNlbWFudGljIGtleXMuXG4gKiBAcGFyYW0gZGF0YUZpZWxkR3JvdXBcbiAqIEBwYXJhbSBzZW1hbnRpY0tleVZhbHVlc1xuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgYSBmbGFnIHRydWUgaWYgYSBwcm9wZXJ0eSBpcyBmb3VuZCBhbmQgYSBwcm9wZXJ0eVBhdGguXG4gKi9cbmZ1bmN0aW9uIF9maW5kU2VtYW50aWNLZXlWYWx1ZXNJbkZpZWxkR3JvdXAoXG5cdGRhdGFGaWVsZEdyb3VwOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgbnVsbCxcblx0c2VtYW50aWNLZXlWYWx1ZXM6IHN0cmluZ1tdXG4pOiB7IHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXA6IGJvb2xlYW47IHByb3BlcnR5UGF0aD86IHN0cmluZyB9IHtcblx0Ly8gdGhpcyBpbmZvIGlzIHVzZWQgaW4gRmllbGRIZWxwZXIjaXNEcmFmdEluZGljYXRvclZpc2libGVJbkZpZWxkR3JvdXAgdG8gc2hvdyBhIGRyYWZ0IGluZGljYXRvciBhdCB0aGUgZW5kIG9mIGEgZmllbGQgZ3JvdXBcblx0Y29uc3QgYVByb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cdGxldCBfcHJvcGVydGllc0ZvdW5kOiB7IHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXA6IGJvb2xlYW47IGZpZWxkR3JvdXBQcm9wZXJ0eVBhdGg/OiBzdHJpbmcgfSA9IHtcblx0XHRzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBmYWxzZSxcblx0XHRmaWVsZEdyb3VwUHJvcGVydHlQYXRoOiB1bmRlZmluZWRcblx0fTtcblx0aWYgKFxuXHRcdGRhdGFGaWVsZEdyb3VwICYmXG5cdFx0ZGF0YUZpZWxkR3JvdXAuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiZcblx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZVxuXHQpIHtcblx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQuJHRhcmdldC5EYXRhPy5mb3JFYWNoKChpbm5lckRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykgPT4ge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoaW5uZXJEYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZCB8fCBpbm5lckRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybCkgJiZcblx0XHRcdFx0aW5uZXJEYXRhRmllbGQuVmFsdWVcblx0XHRcdCkge1xuXHRcdFx0XHRhUHJvcGVydGllcy5wdXNoKGlubmVyRGF0YUZpZWxkLlZhbHVlLnBhdGgpO1xuXHRcdFx0fVxuXHRcdFx0X3Byb3BlcnRpZXNGb3VuZCA9IF9maW5kUHJvcGVydGllcyhzZW1hbnRpY0tleVZhbHVlcywgYVByb3BlcnRpZXMpO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0c2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cDogX3Byb3BlcnRpZXNGb3VuZC5zZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwLFxuXHRcdHByb3BlcnR5UGF0aDogX3Byb3BlcnRpZXNGb3VuZC5maWVsZEdyb3VwUHJvcGVydHlQYXRoXG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBkZWZhdWx0IGZvcm1hdCBvcHRpb25zIHdpdGggZHJhZnRJbmRpY2F0b3IgZm9yIGEgY29sdW1uLlxuICogQHBhcmFtIG5hbWVcbiAqIEBwYXJhbSBzZW1hbnRpY0tleXNcbiAqIEBwYXJhbSBkYXRhRmllbGRHcm91cFxuICogQHJldHVybnMgQ29sbGVjdGlvbiBvZiBmb3JtYXQgb3B0aW9ucyB3aXRoIGRlZmF1bHQgdmFsdWVzXG4gKi9cbmZ1bmN0aW9uIGdldERlZmF1bHREcmFmdEluZGljYXRvckZvckNvbHVtbihcblx0bmFtZTogc3RyaW5nLFxuXHRzZW1hbnRpY0tleXM6IFNlbWFudGljS2V5LFxuXHRkYXRhRmllbGRHcm91cDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IG51bGxcbik6IFBhcnRpYWw8e1xuXHRmaWVsZEdyb3VwRHJhZnRJbmRpY2F0b3JQcm9wZXJ0eVBhdGg6IHN0cmluZztcblx0ZmllbGRHcm91cE5hbWU6IHN0cmluZztcblx0c2hvd0Vycm9yT2JqZWN0U3RhdHVzOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0aGFzRHJhZnRJbmRpY2F0b3I6IGJvb2xlYW47XG59PiB7XG5cdGlmICghc2VtYW50aWNLZXlzKSB7XG5cdFx0cmV0dXJuIHt9O1xuXHR9XG5cdGNvbnN0IHNlbWFudGljS2V5ID0gX2ZpbmRTZW1hbnRpY0tleVZhbHVlcyhzZW1hbnRpY0tleXMsIG5hbWUpO1xuXHRjb25zdCBzZW1hbnRpY0tleUluRmllbGRHcm91cCA9IF9maW5kU2VtYW50aWNLZXlWYWx1ZXNJbkZpZWxkR3JvdXAoZGF0YUZpZWxkR3JvdXAsIHNlbWFudGljS2V5LnZhbHVlcyk7XG5cdGlmIChzZW1hbnRpY0tleUluRmllbGRHcm91cC5zZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwKSB7XG5cdFx0Ly8gU2VtYW50aWMgS2V5IGhhcyBhIHByb3BlcnR5IGluIGEgRmllbGRHcm91cFxuXHRcdHJldHVybiB7XG5cdFx0XHQvL1RPRE8gd2Ugc2hvdWxkIHJhdGhlciBzdG9yZSBoYXNTZW1hbnRpY0tleUluRmllbGRHcm91cFxuXHRcdFx0ZmllbGRHcm91cERyYWZ0SW5kaWNhdG9yUHJvcGVydHlQYXRoOiBzZW1hbnRpY0tleUluRmllbGRHcm91cC5wcm9wZXJ0eVBhdGgsXG5cdFx0XHRmaWVsZEdyb3VwTmFtZTogbmFtZSxcblx0XHRcdHNob3dFcnJvck9iamVjdFN0YXR1czogY29tcGlsZUV4cHJlc3Npb24oZ2V0Um93U3RhdHVzVmlzaWJpbGl0eShuYW1lLCB0cnVlKSlcblx0XHR9O1xuXHR9IGVsc2UgaWYgKHNlbWFudGljS2V5LnNlbWFudGljS2V5Rm91bmQpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aGFzRHJhZnRJbmRpY2F0b3I6IHRydWUsXG5cdFx0XHRzaG93RXJyb3JPYmplY3RTdGF0dXM6IGNvbXBpbGVFeHByZXNzaW9uKGdldFJvd1N0YXR1c1Zpc2liaWxpdHkobmFtZSwgZmFsc2UpKVxuXHRcdH07XG5cdH1cblx0cmV0dXJuIHt9O1xufVxuXG5mdW5jdGlvbiBfZ2V0SW1wTnVtYmVyKGRhdGFGaWVsZDogRGF0YUZpZWxkVHlwZXMpOiBudW1iZXIge1xuXHRjb25zdCBpbXBvcnRhbmNlID0gZGF0YUZpZWxkPy5hbm5vdGF0aW9ucz8uVUk/LkltcG9ydGFuY2UgYXMgc3RyaW5nO1xuXHRpZiAoaW1wb3J0YW5jZSAmJiBpbXBvcnRhbmNlLmluY2x1ZGVzKFwiVUkuSW1wb3J0YW5jZVR5cGUvSGlnaFwiKSkge1xuXHRcdHJldHVybiAzO1xuXHR9XG5cdGlmIChpbXBvcnRhbmNlICYmIGltcG9ydGFuY2UuaW5jbHVkZXMoXCJVSS5JbXBvcnRhbmNlVHlwZS9NZWRpdW1cIikpIHtcblx0XHRyZXR1cm4gMjtcblx0fVxuXHRpZiAoaW1wb3J0YW5jZSAmJiBpbXBvcnRhbmNlLmluY2x1ZGVzKFwiVUkuSW1wb3J0YW5jZVR5cGUvTG93XCIpKSB7XG5cdFx0cmV0dXJuIDE7XG5cdH1cblx0cmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIF9nZXREYXRhRmllbGRJbXBvcnRhbmNlKGRhdGFGaWVsZDogRGF0YUZpZWxkVHlwZXMpOiBJbXBvcnRhbmNlIHtcblx0Y29uc3QgaW1wb3J0YW5jZSA9IGRhdGFGaWVsZD8uYW5ub3RhdGlvbnM/LlVJPy5JbXBvcnRhbmNlIGFzIHN0cmluZztcblx0cmV0dXJuIGltcG9ydGFuY2UgPyAoaW1wb3J0YW5jZS5zcGxpdChcIi9cIilbMV0gYXMgSW1wb3J0YW5jZSkgOiBJbXBvcnRhbmNlLk5vbmU7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgZXhwb3J0IHNldHRpbmdzIG9mIGEgY29sdW1uIGNvbnRhaW5pbmcgZGF0YXBvaW50cy5cbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgcmVmZXJlbmNlZCBvbiBhIGdpdmVuIGNvbHVtblxuICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIHRvIGJlIHVwZGF0ZWRcbiAqL1xuZnVuY3Rpb24gX3NldEV4cG9ydFNldHRpbmdzRm9yRGF0YVBvaW50KHByb3BlcnR5OiBQcm9wZXJ0eSwgY29sdW1uOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4pOiB2b2lkIHtcblx0Y29uc3QgdGFyZ2V0VmFsdWVmcm9tRFAgPSBnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50KHByb3BlcnR5KTtcblx0aWYgKFxuXHRcdGlzRGF0YVBvaW50RnJvbURhdGFGaWVsZERlZmF1bHQocHJvcGVydHkpICYmXG5cdFx0dHlwZW9mIHRhcmdldFZhbHVlZnJvbURQID09PSBcInN0cmluZ1wiICYmXG5cdFx0Y29sdW1uLmV4cG9ydFNldHRpbmdzICYmXG5cdFx0Y29sdW1uLmV4cG9ydFNldHRpbmdzPy51bml0ICE9PSBcIiVcIlxuXHQpIHtcblx0XHRjb2x1bW4uZXhwb3J0RGF0YVBvaW50VGFyZ2V0VmFsdWUgPSB0YXJnZXRWYWx1ZWZyb21EUDtcblx0XHRjb2x1bW4uZXhwb3J0U2V0dGluZ3MudGVtcGxhdGUgPSBcInswfS9cIiArIHRhcmdldFZhbHVlZnJvbURQO1xuXHR9XG59XG5cbmZ1bmN0aW9uIF9nZXRNYXhJbXBvcnRhbmNlKGZpZWxkczogRGF0YUZpZWxkVHlwZXNbXSk6IEltcG9ydGFuY2Uge1xuXHRpZiAoZmllbGRzICYmIGZpZWxkcy5sZW5ndGggPiAwKSB7XG5cdFx0bGV0IG1heEltcE51bWJlciA9IC0xO1xuXHRcdGxldCBpbXBOdW1iZXIgPSAtMTtcblx0XHRsZXQgRGF0YUZpZWxkV2l0aE1heEltcG9ydGFuY2U7XG5cdFx0Zm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcblx0XHRcdGltcE51bWJlciA9IF9nZXRJbXBOdW1iZXIoZmllbGQpO1xuXHRcdFx0aWYgKGltcE51bWJlciA+IG1heEltcE51bWJlcikge1xuXHRcdFx0XHRtYXhJbXBOdW1iZXIgPSBpbXBOdW1iZXI7XG5cdFx0XHRcdERhdGFGaWVsZFdpdGhNYXhJbXBvcnRhbmNlID0gZmllbGQ7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBfZ2V0RGF0YUZpZWxkSW1wb3J0YW5jZShEYXRhRmllbGRXaXRoTWF4SW1wb3J0YW5jZSBhcyBEYXRhRmllbGRUeXBlcyk7XG5cdH1cblx0cmV0dXJuIEltcG9ydGFuY2UuTm9uZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbXBvcnRhbmNlIHZhbHVlIGZvciBhIGNvbHVtbi5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gZGF0YUZpZWxkXG4gKiBAcmV0dXJucyBUaGUgaW1wb3J0YW5jZSB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW1wb3J0YW5jZShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCB1bmRlZmluZWRcbik6IEltcG9ydGFuY2UgfCB1bmRlZmluZWQge1xuXHRpZiAoIWRhdGFGaWVsZCkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0Y29uc3Qgc2VtYW50aWNLZXlzID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkudGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucy5Db21tb24/LlNlbWFudGljS2V5ID8/IFtdO1xuXHRjb25zdCByZXF1aXJlZFByb3BlcnRpZXMgPSBnZXRSZXF1aXJlZFByb3BlcnRpZXMoY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGhpZ2hLZXlzID0gWy4uLnNlbWFudGljS2V5cywgLi4ucmVxdWlyZWRQcm9wZXJ0aWVzXS5tYXAoKHByb3BlcnR5UGF0aCkgPT4gcHJvcGVydHlQYXRoLiR0YXJnZXQ/LmZ1bGx5UXVhbGlmaWVkTmFtZSk7XG5cdC8vRXZhbHVhdGUgZGVmYXVsdCBJbXBvcnRhbmNlIGlzIG5vdCBzZXQgZXhwbGljaXRseVxuXHRsZXQgZmllbGRzV2l0aEltcG9ydGFuY2U7XG5cdGlmIChpc0Fubm90YXRpb25PZlR5cGU8RGF0YUZpZWxkRm9yQW5ub3RhdGlvbj4oZGF0YUZpZWxkLCBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uKSkge1xuXHRcdGNvbnN0IGRhdGFGaWVsZFRhcmdldCA9IGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldDtcblx0XHRpZiAoaXNBbm5vdGF0aW9uT2ZUeXBlPEZpZWxkR3JvdXA+KGRhdGFGaWVsZFRhcmdldCwgVUlBbm5vdGF0aW9uVHlwZXMuRmllbGRHcm91cFR5cGUpKSB7XG5cdFx0XHRjb25zdCBmaWVsZEdyb3VwRGF0YSA9IGRhdGFGaWVsZFRhcmdldC5EYXRhO1xuXHRcdFx0Ly9JZiBhIEZpZWxkR3JvdXAgY29udGFpbnMgYSBzZW1hbnRpY0tleSBvciByZXF1aXJlZCBwcm9wZXJ0eSwgaW1wb3J0YW5jZSBzZXQgdG8gSGlnaFxuXHRcdFx0aWYgKFxuXHRcdFx0XHRmaWVsZEdyb3VwRGF0YS5zb21lKGZ1bmN0aW9uIChmaWVsZEdyb3VwRGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogYm9vbGVhbiB7XG5cdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdGlzRGF0YUZpZWxkVHlwZXMoZmllbGRHcm91cERhdGFGaWVsZCkgJiYgaGlnaEtleXMuaW5jbHVkZXMoZmllbGRHcm91cERhdGFGaWVsZC5WYWx1ZT8uJHRhcmdldD8uZnVsbHlRdWFsaWZpZWROYW1lKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0pXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIEltcG9ydGFuY2UuSGlnaDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vSWYgdGhlIERhdGFGaWVsZEZvckFubm90YXRpb24gaGFzIGFuIEltcG9ydGFuY2Ugd2UgdGFrZSBpdFxuXHRcdFx0XHRpZiAoZGF0YUZpZWxkPy5hbm5vdGF0aW9ucz8uVUk/LkltcG9ydGFuY2UpIHtcblx0XHRcdFx0XHRyZXR1cm4gX2dldERhdGFGaWVsZEltcG9ydGFuY2UoZGF0YUZpZWxkIGFzIHVua25vd24gYXMgRGF0YUZpZWxkVHlwZXMpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIGVsc2UgdGhlIGhpZ2hlc3QgaW1wb3J0YW5jZSAoaWYgYW55KSBpcyByZXR1cm5lZFxuXHRcdFx0XHRmaWVsZHNXaXRoSW1wb3J0YW5jZSA9IGZpZWxkR3JvdXBEYXRhLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuXHRcdFx0XHRcdHJldHVybiBpdGVtPy5hbm5vdGF0aW9ucz8uVUk/LkltcG9ydGFuY2U7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gX2dldE1heEltcG9ydGFuY2UoZmllbGRzV2l0aEltcG9ydGFuY2UgYXMgRGF0YUZpZWxkVHlwZXNbXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBoaWdoS2V5cy5pbmNsdWRlcygoZGF0YUZpZWxkIGFzIERhdGFGaWVsZFR5cGVzKS5WYWx1ZT8uJHRhcmdldD8uZnVsbHlRdWFsaWZpZWROYW1lKVxuXHRcdD8gSW1wb3J0YW5jZS5IaWdoXG5cdFx0OiBfZ2V0RGF0YUZpZWxkSW1wb3J0YW5jZShkYXRhRmllbGQgYXMgdW5rbm93biBhcyBEYXRhRmllbGRUeXBlcyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBsaW5lIGl0ZW1zIGZyb20gbWV0YWRhdGEgYW5ub3RhdGlvbnMuXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgd2l0aCB0aGVpciBhbm5vdGF0aW9uc1xuICogQHBhcmFtIHRhYmxlVHlwZSBUaGUgdGFibGUgdHlwZVxuICogQHBhcmFtIHZpc3VhbGl6YXRpb25QYXRoIFRoZSB2aXN1YWxpemF0aW9uIHBhdGhcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgVGhlIGNvbHVtbnMgZnJvbSB0aGUgYW5ub3RhdGlvbnNcbiAqL1xuY29uc3QgZ2V0Q29sdW1uc0Zyb21Bbm5vdGF0aW9ucyA9IGZ1bmN0aW9uIChcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10ge1xuXHRjb25zdCBlbnRpdHlUeXBlOiBFbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZShsaW5lSXRlbUFubm90YXRpb24pLFxuXHRcdGFubm90YXRpb25Db2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSA9IFtdLFxuXHRcdGNvbHVtbnNUb0JlQ3JlYXRlZDogUmVjb3JkPHN0cmluZywgUHJvcGVydHk+ID0ge30sXG5cdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcDogUmVjb3JkPHN0cmluZywgRGlzcGxheU1vZGU+ID0ge30sXG5cdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzID0gZ2V0UmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdHRhYmxlTWFuaWZlc3RTZXR0aW5nczogVGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpLFxuXHRcdGRlZmF1bHRDcmVhdGlvbk1vZGUgPVxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5nZXRTYXBGZU1hbmlmZXN0Q29uZmlndXJhdGlvbigpPy5tYWNyb3M/LnRhYmxlPy5kZWZhdWx0Q3JlYXRpb25Nb2RlID09PVxuXHRcdFx0XCJJbmxpbmVDcmVhdGlvblJvd3NcIlxuXHRcdFx0XHQ/IENyZWF0aW9uTW9kZS5JbmxpbmVDcmVhdGlvblJvd3Ncblx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0dGFibGVDcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZSA9XG5cdFx0XHR0YWJsZU1hbmlmZXN0U2V0dGluZ3M/LnRhYmxlU2V0dGluZ3M/LmNyZWF0aW9uTW9kZT8ubmFtZSA/PyBkZWZhdWx0Q3JlYXRpb25Nb2RlID8/IENyZWF0aW9uTW9kZS5JbmxpbmU7XG5cdGNvbnN0IHNlbWFudGljS2V5czogU2VtYW50aWNLZXkgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25zQnlUZXJtKFwiQ29tbW9uXCIsIENvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY0tleSwgW1xuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpXG5cdF0pWzBdIGFzIFNlbWFudGljS2V5O1xuXHRpZiAobGluZUl0ZW1Bbm5vdGF0aW9uKSB7XG5cdFx0Y29uc3QgdGFibGVDb252ZXJ0ZXJDb250ZXh0ID0gY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZXJDb250ZXh0Rm9yPFBhZ2VDb250ZXh0UGF0aFRhcmdldD4oXG5cdFx0XHRnZXRUYXJnZXRPYmplY3RQYXRoKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKVxuXHRcdCk7XG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLmZvckVhY2goKGRhdGFGaWVsZCkgPT4ge1xuXHRcdFx0Ly8gVE9ETzogdmFyaWFibGUgbmFtZSBzaG91bGQgYmUgZGF0YWZpZWxkIGFuZCBub3QgbGluZUl0ZW1cblx0XHRcdGlmICghX2lzVmFsaWRDb2x1bW4oZGF0YUZpZWxkKSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRsZXQgZXhwb3J0U2V0dGluZ3M6IFByb3BlcnR5SW5mb1tcImV4cG9ydFNldHRpbmdzXCJdID0gbnVsbDtcblx0XHRcdGNvbnN0IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGggPVxuXHRcdFx0XHRpc0RhdGFGaWVsZFR5cGVzKGRhdGFGaWVsZCkgJiYgZGF0YUZpZWxkLlZhbHVlPy4kdGFyZ2V0Py5mdWxseVF1YWxpZmllZE5hbWVcblx0XHRcdFx0XHQ/IGdldFNlbWFudGljT2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LCBkYXRhRmllbGQpXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRjb25zdCByZWxhdGl2ZVBhdGggPSBfZ2V0UmVsYXRpdmVQYXRoKGRhdGFGaWVsZCk7XG5cdFx0XHQvLyBEZXRlcm1pbmUgcHJvcGVydGllcyB3aGljaCBhcmUgY29uc3VtZWQgYnkgdGhpcyBMaW5lSXRlbS5cblx0XHRcdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbzogQ29tcGxleFByb3BlcnR5SW5mbyA9IGNvbGxlY3RSZWxhdGVkUHJvcGVydGllc1JlY3Vyc2l2ZWx5KGRhdGFGaWVsZCwgY29udmVydGVyQ29udGV4dCwgdGFibGVUeXBlKTtcblx0XHRcdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzKTtcblx0XHRcdGNvbnN0IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5hZGRpdGlvbmFsUHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBncm91cFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHJlbGF0aXZlUGF0aCA/IF9zbGljZUF0U2xhc2gocmVsYXRpdmVQYXRoLCB0cnVlLCBmYWxzZSkgOiB1bmRlZmluZWQ7XG5cdFx0XHRjb25zdCBpc0dyb3VwOiBib29sZWFuID0gZ3JvdXBQYXRoICE9IHJlbGF0aXZlUGF0aDtcblx0XHRcdGNvbnN0IGxhYmVsID0gZ2V0TGFiZWwoZGF0YUZpZWxkLCBpc0dyb3VwKTtcblx0XHRcdGNvbnN0IG5hbWUgPSBfZ2V0QW5ub3RhdGlvbkNvbHVtbk5hbWUoZGF0YUZpZWxkKTtcblx0XHRcdGNvbnN0IGlzRmllbGRHcm91cENvbHVtbjogYm9vbGVhbiA9IGdyb3VwUGF0aCA/IGdyb3VwUGF0aC5pbmNsdWRlcyhgQCR7VUlBbm5vdGF0aW9uVGVybXMuRmllbGRHcm91cH1gKSA6IGZhbHNlO1xuXHRcdFx0Y29uc3Qgc2hvd0RhdGFGaWVsZHNMYWJlbDogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGlzRmllbGRHcm91cENvbHVtblxuXHRcdFx0XHQ/IF9nZXRTaG93RGF0YUZpZWxkc0xhYmVsKG5hbWUsIHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0KVxuXHRcdFx0XHQ6IGZhbHNlO1xuXHRcdFx0Y29uc3QgZGF0YVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGdldERhdGFGaWVsZERhdGFUeXBlKGRhdGFGaWVsZCk7XG5cdFx0XHRjb25zdCBmb3JtYXRPcHRpb25zID0gX2dldERlZmF1bHRGb3JtYXRPcHRpb25zRm9yVGFibGUoZ2V0RGVmYXVsdERyYWZ0SW5kaWNhdG9yRm9yQ29sdW1uKG5hbWUsIHNlbWFudGljS2V5cywgZGF0YUZpZWxkKSk7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxEYXRhRmllbGRBYnN0cmFjdFR5cGVzPihcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksXG5cdFx0XHRcdHJlbGF0aXZlUGF0aFxuXHRcdFx0KTtcblx0XHRcdC8vIERldGVybWluZSBpZiB3ZSBuZWVkIGEgc2l0dWF0aW9ucyBpbmRpY2F0b3Jcblx0XHRcdGNvbnN0IG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBOYXZpZ2F0aW9uUHJvcGVydHlbXSA9IHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzO1xuXHRcdFx0Y29uc3Qgc2l0dWF0aW9uc05hdlByb3BzID0gbmF2aWdhdGlvblByb3BlcnRpZXMuZmlsdGVyKFxuXHRcdFx0XHQobmF2aWdhdGlvblByb3BlcnR5KSA9PlxuXHRcdFx0XHRcdCFuYXZpZ2F0aW9uUHJvcGVydHkuaXNDb2xsZWN0aW9uICYmXG5cdFx0XHRcdFx0bmF2aWdhdGlvblByb3BlcnR5LnRhcmdldFR5cGUuYW5ub3RhdGlvbnMuQ29tbW9uPy5TQVBPYmplY3ROb2RlVHlwZT8uTmFtZSA9PT0gXCJCdXNpbmVzc1NpdHVhdGlvblwiXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3Qgc2l0dWF0aW9uc05hdlByb3A6IE5hdmlnYXRpb25Qcm9wZXJ0eSB8IHVuZGVmaW5lZCA9IHNpdHVhdGlvbnNOYXZQcm9wcy5sZW5ndGggPj0gMSA/IHNpdHVhdGlvbnNOYXZQcm9wc1swXSA6IHVuZGVmaW5lZDtcblx0XHRcdGlmIChzaXR1YXRpb25zTmF2UHJvcCAmJiBmb3JtYXRPcHRpb25zKSB7XG5cdFx0XHRcdGZvcm1hdE9wdGlvbnMuaGFzU2l0dWF0aW9uc0luZGljYXRvciA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdGxldCBmaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnM6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiZcblx0XHRcdFx0ZGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkZpZWxkR3JvdXBUeXBlXG5cdFx0XHQpIHtcblx0XHRcdFx0ZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zID0gX2dldEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyhkYXRhRmllbGQpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaXNNdWx0aVZhbHVlID0gX2lzQ29sdW1uTXVsdGlWYWx1ZWQoZGF0YUZpZWxkLCB0YWJsZUNvbnZlcnRlckNvbnRleHQpO1xuXHRcdFx0aWYgKCFpc011bHRpVmFsdWUgJiYgX2lzRXhwb3J0YWJsZUNvbHVtbihkYXRhRmllbGQpKSB7XG5cdFx0XHRcdC8vZXhjbHVkZSB0aGUgdHlwZXMgbGlzdGVkIGFib3ZlIGZvciB0aGUgRXhwb3J0IChnZW5lcmF0ZXMgZXJyb3Igb24gRXhwb3J0IGFzIFBERilcblx0XHRcdFx0ZXhwb3J0U2V0dGluZ3MgPSBjcmVhdGVDb2x1bW5FeHBvcnRTZXR0aW5ncyhkYXRhRmllbGQsIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyk7XG5cdFx0XHR9XG5cdFx0XHRsZXQgcHJvcGVydHlUeXBlQ29uZmlnOiBQcm9wZXJ0eVR5cGVDb25maWcgfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoZGF0YVR5cGUpIHtcblx0XHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnID0gZ2V0VHlwZUNvbmZpZyhkYXRhRmllbGQsIGRhdGFUeXBlKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHR5cGVDb25maWc6IFByb3BlcnR5VHlwZUNvbmZpZyA9IHtcblx0XHRcdFx0Y2xhc3NOYW1lOiBkYXRhVHlwZSBhcyBrZXlvZiB0eXBlb2YgRGVmYXVsdFR5cGVGb3JFZG1UeXBlLFxuXHRcdFx0XHRmb3JtYXRPcHRpb25zOiB7XG5cdFx0XHRcdFx0Li4uZm9ybWF0T3B0aW9ucyxcblx0XHRcdFx0XHQuLi5wcm9wZXJ0eVR5cGVDb25maWc/LmZvcm1hdE9wdGlvbnNcblx0XHRcdFx0fSxcblx0XHRcdFx0Y29uc3RyYWludHM6IHByb3BlcnR5VHlwZUNvbmZpZz8uY29uc3RyYWludHNcblx0XHRcdH07XG5cdFx0XHRjb25zdCB2aXN1YWxTZXR0aW5nczogVmlzdWFsU2V0dGluZ3MgPSB7fTtcblx0XHRcdGlmICghZGF0YVR5cGUgfHwgIXR5cGVDb25maWcpIHtcblx0XHRcdFx0Ly8gZm9yIGNoYXJ0c1xuXHRcdFx0XHR2aXN1YWxTZXR0aW5ncy53aWR0aENhbGN1bGF0aW9uID0gbnVsbDtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHNvcnRhYmxlID1cblx0XHRcdFx0IWlzTXVsdGlWYWx1ZSAmJlxuXHRcdFx0XHRfaXNDb2x1bW5Tb3J0YWJsZShkYXRhRmllbGQsIHJlbGF0aXZlUGF0aCwgcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLm5vblNvcnRhYmxlUHJvcGVydGllcywgcmVsYXRlZFByb3BlcnRpZXNJbmZvKTtcblx0XHRcdGNvbnN0IGF2YWlsYWJpbGl0eSA9IGlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuKGRhdGFGaWVsZCkgPyBcIkhpZGRlblwiIDogXCJEZWZhdWx0XCI7XG5cdFx0XHRjb25zdCBjb2x1bW46IEFubm90YXRpb25UYWJsZUNvbHVtbiA9IHtcblx0XHRcdFx0a2V5OiBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZCksXG5cdFx0XHRcdHR5cGU6IENvbHVtblR5cGUuQW5ub3RhdGlvbixcblx0XHRcdFx0bGFiZWw6IGxhYmVsID8/IG5hbWUsXG5cdFx0XHRcdGdyb3VwTGFiZWw6IGlzR3JvdXAgPyBnZXRMYWJlbChkYXRhRmllbGQpIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRncm91cDogaXNHcm91cCA/IGdyb3VwUGF0aCA6IHVuZGVmaW5lZCxcblx0XHRcdFx0RmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zOiBmaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMsXG5cdFx0XHRcdGFubm90YXRpb25QYXRoOiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgoZGF0YUZpZWxkLmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdHNlbWFudGljT2JqZWN0UGF0aDogc2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0YXZhaWxhYmlsaXR5OiBhdmFpbGFiaWxpdHksXG5cdFx0XHRcdG5hbWU6IG5hbWUsXG5cdFx0XHRcdHNob3dEYXRhRmllbGRzTGFiZWw6IHNob3dEYXRhRmllbGRzTGFiZWwsXG5cdFx0XHRcdHJlcXVpcmVkOiBpc1JlcXVpcmVkQ29sdW1uKGNvbnZlcnRlckNvbnRleHQsIGRhdGFGaWVsZCBhcyBEYXRhRmllbGRUeXBlcywgdGFibGVDcmVhdGlvbk1vZGUpLFxuXHRcdFx0XHRyZWxhdGl2ZVBhdGg6IHJlbGF0aXZlUGF0aCxcblx0XHRcdFx0c29ydGFibGU6IHNvcnRhYmxlLFxuXHRcdFx0XHRwcm9wZXJ0eUluZm9zOiByZWxhdGVkUHJvcGVydHlOYW1lcy5sZW5ndGggPyByZWxhdGVkUHJvcGVydHlOYW1lcyA6IHVuZGVmaW5lZCxcblx0XHRcdFx0YWRkaXRpb25hbFByb3BlcnR5SW5mb3M6IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzLmxlbmd0aCA+IDAgPyBhZGRpdGlvbmFsUHJvcGVydHlOYW1lcyA6IHVuZGVmaW5lZCxcblx0XHRcdFx0ZXhwb3J0U2V0dGluZ3M6IGV4cG9ydFNldHRpbmdzLFxuXHRcdFx0XHR3aWR0aDogKGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uSFRNTDU/LkNzc0RlZmF1bHRzPy53aWR0aD8udmFsdWVPZigpIGFzIHN0cmluZykgfHwgdW5kZWZpbmVkLFxuXHRcdFx0XHRpbXBvcnRhbmNlOiBnZXRJbXBvcnRhbmNlKGNvbnZlcnRlckNvbnRleHQsIGRhdGFGaWVsZCBhcyBEYXRhRmllbGRUeXBlcyksXG5cdFx0XHRcdGlzTmF2aWdhYmxlOiB0cnVlLFxuXHRcdFx0XHRmb3JtYXRPcHRpb25zOiBmb3JtYXRPcHRpb25zLFxuXHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUoY29udmVydGVyQ29udGV4dCksXG5cdFx0XHRcdHR5cGVDb25maWc6IHR5cGVDb25maWcsXG5cdFx0XHRcdHZpc3VhbFNldHRpbmdzOiB2aXN1YWxTZXR0aW5ncyBhcyBQcm9wZXJ0eUluZm9bXCJ2aXN1YWxTZXR0aW5nc1wiXSxcblx0XHRcdFx0dGltZXpvbmVUZXh0OiBleHBvcnRTZXR0aW5ncz8udGltZXpvbmUsXG5cdFx0XHRcdGlzUGFydE9mTGluZUl0ZW06IHRydWUsXG5cdFx0XHRcdGRhdGFUeXBlOiBkYXRhVHlwZSA/PyAoXCJFZG0uU3RyaW5nXCIgYXMga2V5b2YgdHlwZW9mIERlZmF1bHRUeXBlRm9yRWRtVHlwZSksXG5cdFx0XHRcdGlzTXVsdGlWYWx1ZVxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IHRvb2x0aXAgPSBfZ2V0VG9vbHRpcChkYXRhRmllbGQpID8/IGxhYmVsO1xuXHRcdFx0aWYgKHRvb2x0aXApIHtcblx0XHRcdFx0Y29sdW1uLnRvb2x0aXAgPSB0b29sdGlwO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRTZXR0aW5ncy5kYXRhUG9pbnRUYXJnZXRWYWx1ZSkge1xuXHRcdFx0XHRjb2x1bW4uZXhwb3J0RGF0YVBvaW50VGFyZ2V0VmFsdWUgPSByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3MuZGF0YVBvaW50VGFyZ2V0VmFsdWU7XG5cdFx0XHR9XG5cdFx0XHRhbm5vdGF0aW9uQ29sdW1ucy5wdXNoKGNvbHVtbik7XG5cdFx0XHQvLyBDb2xsZWN0IGluZm9ybWF0aW9uIG9mIHJlbGF0ZWQgY29sdW1ucyB0byBiZSBjcmVhdGVkLlxuXHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZXMuZm9yRWFjaCgocmVsYXRlZFByb3BlcnR5TmFtZSkgPT4ge1xuXHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbcmVsYXRlZFByb3BlcnR5TmFtZV0gPSByZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1tyZWxhdGVkUHJvcGVydHlOYW1lXS5hbm5vdGF0aW9uUHJvcGVydHk7XG5cdFx0XHRcdC8vIEluIGNhc2Ugb2YgYSBtdWx0aS12YWx1ZSwgcmVsYXRlZCBwcm9wZXJ0aWVzIGNhbm5vdCBiZSBzb3J0ZWQgYXMgd2UgZ28gdGhyb3VnaCBhIDEtbiByZWxhdGlvblxuXHRcdFx0XHRpZiAoaXNNdWx0aVZhbHVlKSB7XG5cdFx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLm5vblNvcnRhYmxlUHJvcGVydGllcy5wdXNoKHJlbGF0ZWRQcm9wZXJ0eU5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFkZFByb3BlcnR5VG9EaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwKFxuXHRcdFx0XHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAsXG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXNJbmZvLFxuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVcblx0XHRcdFx0KTtcblx0XHRcdFx0Ly8gSW4gY2FzZSB0aGUgbGluZUl0ZW0gcG9pbnRzIHRvIGEgbmF2aWdhdGlvbiBwcm9wZXJ0eSB3aXRoIGEgdGV4dEFycmFuZ2VtZW50IFRleHRPbmx5LCB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgY29sdW1uIHdpdGggdGhlIHZhbHVlIG5hdmlnYXRpb24gcHJvcGVydHkuXG5cdFx0XHRcdC8vIFRoZSB0ZXh0IHByb3BlcnR5IGlzIHJlZmVyZW5jZWQgb24gdGhlIHJlbGF0ZWQgcHJvcGVydGllcyBvZiB0aGUgbGluZUl0ZW0sIHNvIHdpbGwgYmUgY3JlYXRlZCBvbiB0aGUgX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zIG1ldGhvZC5cblx0XHRcdFx0aWYgKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzW3JlbGF0ZWRQcm9wZXJ0eU5hbWVdLmRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uID09PSBcIkRlc2NyaXB0aW9uXCIpIHtcblx0XHRcdFx0XHRjcmVhdGVQcm9wZXJ0eUFubm90YXRlZFRleHRPbmx5KFxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRcdHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHRcdFx0XHRcdGRhdGFGaWVsZCxcblx0XHRcdFx0XHRcdGNvbHVtbnNUb0JlQ3JlYXRlZCxcblx0XHRcdFx0XHRcdHJlbGF0aXZlUGF0aCxcblx0XHRcdFx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllc1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0Ly8gQ3JlYXRlIGNvbHVtbnMgZm9yIGFkZGl0aW9uYWwgcHJvcGVydGllcyBpZGVudGlmaWVkIGZvciBBTFAgdXNlIGNhc2UuXG5cdFx0XHRhZGRpdGlvbmFsUHJvcGVydHlOYW1lcy5mb3JFYWNoKChhZGRpdGlvbmFsUHJvcGVydHlOYW1lKSA9PiB7XG5cdFx0XHRcdC8vIEludGVudGlvbmFsIG92ZXJ3cml0ZSBhcyB3ZSByZXF1aXJlIG9ubHkgb25lIG5ldyBQcm9wZXJ0eUluZm8gZm9yIGEgcmVsYXRlZCBQcm9wZXJ0eS5cblx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW2FkZGl0aW9uYWxQcm9wZXJ0eU5hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmFkZGl0aW9uYWxQcm9wZXJ0aWVzW2FkZGl0aW9uYWxQcm9wZXJ0eU5hbWVdO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblx0Ly8gR2V0IGNvbHVtbnMgZnJvbSB0aGUgUHJvcGVydGllcyBvZiBFbnRpdHlUeXBlXG5cdHJldHVybiBnZXRDb2x1bW5zRnJvbUVudGl0eVR5cGUoXG5cdFx0Y29sdW1uc1RvQmVDcmVhdGVkLFxuXHRcdGVudGl0eVR5cGUsXG5cdFx0YW5ub3RhdGlvbkNvbHVtbnMsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHR0YWJsZVR5cGUsXG5cdFx0dGFibGVDcmVhdGlvbk1vZGUsXG5cdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCxcblx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXNcblx0KTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgcHJvcGVydHkgbmFtZXMgZnJvbSB0aGUgbWFuaWZlc3QgYW5kIGNoZWNrcyBhZ2FpbnN0IGV4aXN0aW5nIHByb3BlcnRpZXMgYWxyZWFkeSBhZGRlZCBieSBhbm5vdGF0aW9ucy5cbiAqIElmIGEgbm90IHlldCBzdG9yZWQgcHJvcGVydHkgaXMgZm91bmQgaXQgYWRkcyBpdCBmb3Igc29ydGluZyBhbmQgZmlsdGVyaW5nIG9ubHkgdG8gdGhlIGFubm90YXRpb25Db2x1bW5zLlxuICogQHBhcmFtIHByb3BlcnRpZXNcbiAqIEBwYXJhbSBhbm5vdGF0aW9uQ29sdW1uc1xuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBlbnRpdHlUeXBlXG4gKiBAcmV0dXJucyBUaGUgY29sdW1ucyBmcm9tIHRoZSBhbm5vdGF0aW9uc1xuICovXG5jb25zdCBfZ2V0UHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIChcblx0cHJvcGVydGllczogc3RyaW5nW10gfCBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdGFubm90YXRpb25Db2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlXG4pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG5cdGxldCBtYXRjaGVkUHJvcGVydGllczogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cdGlmIChBcnJheS5pc0FycmF5KHByb3BlcnRpZXMpKSB7XG5cdFx0bWF0Y2hlZFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLm1hcChmdW5jdGlvbiAocHJvcGVydHlQYXRoKSB7XG5cdFx0XHRjb25zdCBhbm5vdGF0aW9uQ29sdW1uID0gYW5ub3RhdGlvbkNvbHVtbnMuZmluZChmdW5jdGlvbiAoYW5ub3RhdGlvbkNvbHVtbikge1xuXHRcdFx0XHRyZXR1cm4gYW5ub3RhdGlvbkNvbHVtbi5yZWxhdGl2ZVBhdGggPT09IHByb3BlcnR5UGF0aCAmJiBhbm5vdGF0aW9uQ29sdW1uLnByb3BlcnR5SW5mb3MgPT09IHVuZGVmaW5lZDtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKGFubm90YXRpb25Db2x1bW4pIHtcblx0XHRcdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW4ubmFtZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHJlbGF0ZWRDb2x1bW5zID0gX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zKFxuXHRcdFx0XHRcdHsgW3Byb3BlcnR5UGF0aF06IGVudGl0eVR5cGUucmVzb2x2ZVBhdGgocHJvcGVydHlQYXRoKSB9LFxuXHRcdFx0XHRcdGFubm90YXRpb25Db2x1bW5zLFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0ZW50aXR5VHlwZSxcblx0XHRcdFx0XHR7fVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRhbm5vdGF0aW9uQ29sdW1ucy5wdXNoKHJlbGF0ZWRDb2x1bW5zWzBdKTtcblx0XHRcdFx0cmV0dXJuIHJlbGF0ZWRDb2x1bW5zWzBdLm5hbWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIG1hdGNoZWRQcm9wZXJ0aWVzO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBmaWVsZCBncm91cCBoYXMgdG8gYmUgZmxhZ2dlZCBhcyByZXF1aXJlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGZpZWxkR3JvdXAgVGhlIGZpZWxkR3JvdXAgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHVuZGVybHlpbmcgdGFibGVcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGZpZWxkR3JvdXAgaXMgcmVxdWlyZWQuXG4gKi9cbmNvbnN0IGlzUmVxdWlyZWRGaWVsZEdyb3VwID0gZnVuY3Rpb24gKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGZpZWxkR3JvdXA6IEZpZWxkR3JvdXAsXG5cdHRhYmxlQ3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGVcbik6IGJvb2xlYW4ge1xuXHRjb25zdCBmaWVsZEdyb3VwRGF0YSA9IGZpZWxkR3JvdXAuRGF0YTtcblx0cmV0dXJuIGZpZWxkR3JvdXBEYXRhLnNvbWUoZnVuY3Rpb24gKGl0ZW0pIHtcblx0XHQvLyB3ZSBleGNsdWRlIGJvb2xlYW4gdHlwZSwgdGhlIGVuZC11c2VyIG1heSB3YW50IHRvIGtlZXAgdGhlIHVuZGVybHlpbmcgY2hlY2sgYm94IGVtcHR5IG9uIHB1cnBvc2Vcblx0XHRpZiAoaXNEYXRhRmllbGQoaXRlbSkgJiYgaXRlbT8uVmFsdWU/LiR0YXJnZXQudHlwZSAhPT0gXCJFZG0uQm9vbGVhblwiKSB7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRpc1N0YXRpY2FsbHlNYW5kYXRvcnkoaXRlbSkgfHxcblx0XHRcdFx0KHRhYmxlQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzICYmXG5cdFx0XHRcdFx0aXNBbm5vdGF0ZWRSZXF1aXJlZFByb3BlcnR5KGl0ZW0uVmFsdWUuJHRhcmdldC5mdWxseVF1YWxpZmllZE5hbWUsIGNvbnZlcnRlckNvbnRleHQpKVxuXHRcdFx0KTtcblx0XHR9XG5cdH0pO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIGhhcyB0byBiZSBmbGFnZ2VkIGFzIHJlcXVpcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBUaGUgcHJvcGVydHkgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHVuZGVybHlpbmcgdGFibGVcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHJlcXVpcmVkLlxuICovXG5jb25zdCBpc1JlcXVpcmVkRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiA9IGZ1bmN0aW9uIChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRkYXRhRmllbGRGb3JBbm5vdGF0aW9uOiBEYXRhRmllbGRGb3JBbm5vdGF0aW9uLFxuXHR0YWJsZUNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlXG4pOiBib29sZWFuIHtcblx0Y29uc3QgZGF0YUZpZWxkVGFyZ2V0ID0gZGF0YUZpZWxkRm9yQW5ub3RhdGlvbi5UYXJnZXQuJHRhcmdldDtcblx0Y29uc3QgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbkZpZWxkQ29udHJvbE5vdE1hbmRhdG9yeSA9IGhhc0ZpZWxkQ29udHJvbE5vdE1hbmRhdG9yeShkYXRhRmllbGRGb3JBbm5vdGF0aW9uKTtcblx0Ly8gQ2hlY2sgaWYgdGhlIERhdGFGaWVsZEZvckFubm90YXRpb24gcG9pbnRzIHRvIGEgRmllbGRHcm91cFxuXHRpZiAoaGFzRmllbGRHcm91cFRhcmdldChkYXRhRmllbGRGb3JBbm5vdGF0aW9uKSkge1xuXHRcdGlmIChpc1JlcXVpcmVkRmllbGRHcm91cChjb252ZXJ0ZXJDb250ZXh0LCBkYXRhRmllbGRUYXJnZXQgYXMgRmllbGRHcm91cCwgdGFibGVDcmVhdGlvbk1vZGUpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0Y29uc3QgZmllbGRHcm91cERhdGEgPSAoZGF0YUZpZWxkVGFyZ2V0IGFzIEZpZWxkR3JvdXApLkRhdGE7XG5cdFx0cmV0dXJuIGZpZWxkR3JvdXBEYXRhLnNvbWUoKGlubmVyRGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKSA9PiB7XG5cdFx0XHRyZXR1cm4gaXNSZXF1aXJlZENvbHVtbihjb252ZXJ0ZXJDb250ZXh0LCBpbm5lckRhdGFGaWVsZCwgdGFibGVDcmVhdGlvbk1vZGUpO1xuXHRcdH0pO1xuXHR9XG5cdC8qSWYgdGhlIHVuZGVybHlpbmcgZGF0YXBvaW50IGlzIGEgcmF0aW5nIGluZGljYXRvciwgdGhlIGVuZC11c2VyIG1heSB3YW50IHRvIGtlZXAgdGhlIHJhdGluZyBlbXB0eSAodmFsdWUgMCkgb24gcHVycG9zZS5cblx0QmVzaWRlcywgY3VycmVudGx5LCBvbmx5IGEgZmllbGRDb250cm9sIHNldCBvbiBhIGRhdGFGaWVsZEZvckFubm90YXRpb24gcG9pbnRpbmcgdG8gYSBkYXRhUG9pbnQgaGFzIGFuIGluZmx1ZW5jZSBpbiB0aGUgdGFibGUuXG5cdEFjY29yZGluZ2x5LCBpZiBhIGRhdGFwb2ludCBjb21lcyBmcm9tIGEgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiB3aXRoIGEgZmllbGRDb250cm9sIHNldCBhcyBub3QgbWFuZGF0b3J5LCB0aGlzIGRhdGFQb2ludCBtdXN0IG5vdCBiZSBmbGFnZ2VkIGFzIFwicmVxdWlyZWRcIiovXG5cdGlmIChoYXNEYXRhUG9pbnRUYXJnZXQoZGF0YUZpZWxkRm9yQW5ub3RhdGlvbikgJiYgKGRhdGFGaWVsZFRhcmdldCBhcyBEYXRhUG9pbnQpLlZpc3VhbGl6YXRpb24gIT09IFwiVUkuVmlzdWFsaXphdGlvblR5cGUvUmF0aW5nXCIpIHtcblx0XHRpZiAoRGF0YUZpZWxkRm9yQW5ub3RhdGlvbkZpZWxkQ29udHJvbE5vdE1hbmRhdG9yeSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRpZiAoaXNTdGF0aWNhbGx5TWFuZGF0b3J5KGRhdGFGaWVsZEZvckFubm90YXRpb24pKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGlzUmVxdWlyZWREYXRhUG9pbnQoY29udmVydGVyQ29udGV4dCwgZGF0YUZpZWxkVGFyZ2V0IGFzIERhdGFQb2ludCwgdGFibGVDcmVhdGlvbk1vZGUpO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgcHJvcGVydHkgaGFzIHRvIGJlIGZsYWdnZWQgYXMgcmVxdWlyZWQuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHVuZGVybHlpbmcgdGFibGVcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHJlcXVpcmVkLlxuICovXG5jb25zdCBpc1JlcXVpcmVkUHJvcGVydHkgPSBmdW5jdGlvbiAoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0cHJvcGVydHk6IFByb3BlcnR5LFxuXHR0YWJsZUNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlXG4pOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHRwcm9wZXJ0eS50eXBlICE9PSBcIkVkbS5Cb29sZWFuXCIgJiZcblx0XHQhaXNSYXRpbmdWaXN1YWxpemF0aW9uRnJvbURhdGFGaWVsZERlZmF1bHQocHJvcGVydHkpICYmXG5cdFx0KGlzU3RhdGljYWxseU1hbmRhdG9yeShwcm9wZXJ0eSkgfHxcblx0XHRcdCh0YWJsZUNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93cyAmJlxuXHRcdFx0XHRpc0Fubm90YXRlZFJlcXVpcmVkUHJvcGVydHkocHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lLCBjb252ZXJ0ZXJDb250ZXh0KSkpXG5cdCk7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGRhdGFQb2ludCBoYXMgdG8gYmUgZmxhZ2dlZCBhcyByZXF1aXJlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGRhdGFQb2ludCBUaGUgZGF0YVBvaW50IGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB1bmRlcmx5aW5nIHRhYmxlXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBkYXRhUG9pbnQgaXMgcmVxdWlyZWQuXG4gKi9cbmNvbnN0IGlzUmVxdWlyZWREYXRhUG9pbnQgPSBmdW5jdGlvbiAoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZGF0YVBvaW50OiBEYXRhUG9pbnQsXG5cdHRhYmxlQ3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGVcbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gKFxuXHRcdGlzU3RhdGljYWxseU1hbmRhdG9yeShkYXRhUG9pbnQpIHx8XG5cdFx0KHRhYmxlQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzICYmXG5cdFx0XHRpc0Fubm90YXRlZFJlcXVpcmVkUHJvcGVydHkoZGF0YVBvaW50LlZhbHVlLiR0YXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lLCBjb252ZXJ0ZXJDb250ZXh0KSlcblx0KTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgdW5kZXJseWluZyBjb2x1bW4gaGFzIHRvIGJlIGZsYWdnZWQgYXMgcmVxdWlyZWQuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB0YWJsZUNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSBvZiB0aGUgdW5kZXJseWluZyB0YWJsZVxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlICdyZXF1aXJlZCcgcHJvcGVydHkgb2YgdGhlIHRhYmxlIGNvbHVtbi5cbiAqL1xuY29uc3QgaXNSZXF1aXJlZENvbHVtbiA9IGZ1bmN0aW9uIChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHR0YXJnZXQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBQcm9wZXJ0eSxcblx0dGFibGVDcmVhdGlvbk1vZGU/OiBDcmVhdGlvbk1vZGVcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0Y29uc3QgY3JlYXRpb25Nb2RlID0gdGFibGVDcmVhdGlvbk1vZGUgfHwgQ3JlYXRpb25Nb2RlLklubGluZTtcblx0aWYgKFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0IHx8XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZVxuXHQpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGlmIChpc1Byb3BlcnR5KHRhcmdldCkpIHtcblx0XHRyZXR1cm4gaXNSZXF1aXJlZFByb3BlcnR5KGNvbnZlcnRlckNvbnRleHQsIHRhcmdldCwgY3JlYXRpb25Nb2RlKSA/IGNvbXBpbGVFeHByZXNzaW9uKFVJLklzRWRpdGFibGUpIDogdW5kZWZpbmVkO1xuXHR9XG5cdC8vIENoZWNrIGlmIHRoZSBkYXRhRmllbGQgaXMgb2YgdHlwZSBEYXRhRmllbGRGb3JBbm5vdGF0aW9uXG5cdGlmIChpc0RhdGFGaWVsZEZvckFubm90YXRpb24odGFyZ2V0KSkge1xuXHRcdHJldHVybiBpc1JlcXVpcmVkRGF0YUZpZWxkRm9yQW5ub3RhdGlvbihjb252ZXJ0ZXJDb250ZXh0LCB0YXJnZXQsIGNyZWF0aW9uTW9kZSkgPyBjb21waWxlRXhwcmVzc2lvbihVSS5Jc0VkaXRhYmxlKSA6IHVuZGVmaW5lZDtcblx0fVxuXHQvL0lmIHRoZSB1bmRlcmx5aW5nIHByb3BlcnR5IGlzIGEgYm9vbGVhbiwgdGhlIGVuZC11c2VyIG1heSB3YW50IHRvIGtlZXAgdGhlIGNoZWNrIGJveCBlbXB0eSBvbiBwdXJwb3NlXG5cdGlmIChpc0RhdGFGaWVsZCh0YXJnZXQpICYmIHRhcmdldC5WYWx1ZT8uJHRhcmdldD8udHlwZSAhPT0gXCJFZG0uQm9vbGVhblwiKSB7XG5cdFx0cmV0dXJuIGlzU3RhdGljYWxseU1hbmRhdG9yeSh0YXJnZXQpIHx8XG5cdFx0XHQoY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzICYmXG5cdFx0XHRcdGlzQW5ub3RhdGVkUmVxdWlyZWRQcm9wZXJ0eSh0YXJnZXQuVmFsdWUuJHRhcmdldC5mdWxseVF1YWxpZmllZE5hbWUsIGNvbnZlcnRlckNvbnRleHQpKVxuXHRcdFx0PyBjb21waWxlRXhwcmVzc2lvbihVSS5Jc0VkaXRhYmxlKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IF9hcHBlbmRDdXN0b21UZW1wbGF0ZSA9IGZ1bmN0aW9uIChcblx0cHJvcGVydGllczogc3RyaW5nW10gfCB1bmRlZmluZWQsXG5cdGV4cG9ydFByb3BlcnRpZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAoQXJyYXkuaXNBcnJheShleHBvcnRQcm9wZXJ0aWVzKSkge1xuXHRcdHByb3BlcnRpZXMgPSBleHBvcnRQcm9wZXJ0aWVzO1xuXHR9XG5cdGlmIChwcm9wZXJ0aWVzKSB7XG5cdFx0cmV0dXJuIHByb3BlcnRpZXNcblx0XHRcdC5tYXAoKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRcdHJldHVybiBgeyR7cHJvcGVydGllcyEuaW5kZXhPZihwcm9wZXJ0eSl9fWA7XG5cdFx0XHR9KVxuXHRcdFx0LmpvaW4oYCR7XCJcXG5cIn1gKTtcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRhYmxlIGNvbHVtbiBkZWZpbml0aW9ucyBmcm9tIG1hbmlmZXN0LlxuICpcbiAqIFRoZXNlIG1heSBiZSBjdXN0b20gY29sdW1ucyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdCwgc2xvdCBjb2x1bW5zIGNvbWluZyB0aHJvdWdoXG4gKiBhIGJ1aWxkaW5nIGJsb2NrLCBvciBhbm5vdGF0aW9uIGNvbHVtbnMgdG8gb3ZlcndyaXRlIGFubm90YXRpb24tYmFzZWQgY29sdW1ucy5cbiAqIEBwYXJhbSBjb2x1bW5zXG4gKiBAcGFyYW0gYW5ub3RhdGlvbkNvbHVtbnNcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gZW50aXR5VHlwZVxuICogQHJldHVybnMgVGhlIGNvbHVtbnMgZnJvbSB0aGUgbWFuaWZlc3RcbiAqL1xuY29uc3QgZ2V0Q29sdW1uc0Zyb21NYW5pZmVzdCA9IGZ1bmN0aW9uIChcblx0Y29sdW1uczogUmVjb3JkPHN0cmluZywgQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uIHwgQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uRm9yT3ZlcnJpZGU+LFxuXHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZVxuKTogUmVjb3JkPHN0cmluZywgTWFuaWZlc3RDb2x1bW4+IHtcblx0Y29uc3QgaW50ZXJuYWxDb2x1bW5zOiBSZWNvcmQ8c3RyaW5nLCBNYW5pZmVzdENvbHVtbj4gPSB7fTtcblx0ZnVuY3Rpb24gaXNDb2x1bW5PdmVycmlkZShcblx0XHRjb2x1bW46IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbiB8IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbkZvck92ZXJyaWRlLFxuXHRcdGtleTogc3RyaW5nXG5cdCk6IGNvbHVtbiBpcyBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW5Gb3JPdmVycmlkZSB7XG5cdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW5zLnNvbWUoKGFubm90YXRpb25Db2x1bW4pID0+IGFubm90YXRpb25Db2x1bW4ua2V5ID09PSBrZXkpO1xuXHR9XG5cdGZ1bmN0aW9uIGlzU2xvdENvbHVtbihtYW5pZmVzdENvbHVtbjogQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uKTogbWFuaWZlc3RDb2x1bW4gaXMgRnJhZ21lbnREZWZpbmVkU2xvdENvbHVtbiB7XG5cdFx0cmV0dXJuIG1hbmlmZXN0Q29sdW1uLnR5cGUgPT09IENvbHVtblR5cGUuU2xvdDtcblx0fVxuXHRmdW5jdGlvbiBpc0N1c3RvbUNvbHVtbihtYW5pZmVzdENvbHVtbjogQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uKTogbWFuaWZlc3RDb2x1bW4gaXMgTWFuaWZlc3REZWZpbmVkQ3VzdG9tQ29sdW1uIHtcblx0XHRyZXR1cm4gbWFuaWZlc3RDb2x1bW4udHlwZSA9PT0gdW5kZWZpbmVkICYmICEhbWFuaWZlc3RDb2x1bW4udGVtcGxhdGU7XG5cdH1cblx0ZnVuY3Rpb24gX3VwZGF0ZUxpbmtlZFByb3BlcnRpZXNPbkN1c3RvbUNvbHVtbnMocHJvcGVydHlJbmZvczogc3RyaW5nW10sIGFubm90YXRpb25UYWJsZUNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdKTogdm9pZCB7XG5cdFx0Y29uc3QgcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzID0gZ2V0UmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQpO1xuXHRcdHByb3BlcnR5SW5mb3MuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcblx0XHRcdGFubm90YXRpb25UYWJsZUNvbHVtbnMuZm9yRWFjaCgocHJvcCkgPT4ge1xuXHRcdFx0XHRpZiAocHJvcC5uYW1lID09PSBwcm9wZXJ0eSkge1xuXHRcdFx0XHRcdHByb3Auc29ydGFibGUgPSAhcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLm5vblNvcnRhYmxlUHJvcGVydGllcy5pbmNsdWRlcyhwcm9wZXJ0eS5yZXBsYWNlKFwiUHJvcGVydHk6OlwiLCBcIlwiKSk7XG5cdFx0XHRcdFx0cHJvcC5pc0dyb3VwYWJsZSA9IHByb3Auc29ydGFibGU7XG5cdFx0XHRcdFx0cHJvcC5maWx0ZXJhYmxlID0gIXJlc3RyaWN0aW9uc09uUHJvcGVydGllcy5ub25GaWx0ZXJhYmxlUHJvcGVydGllcy5pbmNsdWRlcyhwcm9wZXJ0eS5yZXBsYWNlKFwiUHJvcGVydHk6OlwiLCBcIlwiKSk7XG5cdFx0XHRcdFx0cHJvcC5pc1BhcnRPZkN1c3RvbUNvbHVtbiA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cdGZvciAoY29uc3Qga2V5IGluIGNvbHVtbnMpIHtcblx0XHRjb25zdCBtYW5pZmVzdENvbHVtbiA9IGNvbHVtbnNba2V5XTtcblx0XHRLZXlIZWxwZXIudmFsaWRhdGVLZXkoa2V5KTtcblx0XHQvLyBCYXNlVGFibGVDb2x1bW5cblx0XHRjb25zdCBiYXNlVGFibGVDb2x1bW4gPSB7XG5cdFx0XHRrZXk6IGtleSxcblx0XHRcdHdpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyOiBtYW5pZmVzdENvbHVtbi53aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlcixcblx0XHRcdHdpZHRoOiBtYW5pZmVzdENvbHVtbi53aWR0aCB8fCB1bmRlZmluZWQsXG5cdFx0XHRwb3NpdGlvbjoge1xuXHRcdFx0XHRhbmNob3I6IG1hbmlmZXN0Q29sdW1uLnBvc2l0aW9uPy5hbmNob3IsXG5cdFx0XHRcdHBsYWNlbWVudDogbWFuaWZlc3RDb2x1bW4ucG9zaXRpb24gPT09IHVuZGVmaW5lZCA/IFBsYWNlbWVudC5BZnRlciA6IG1hbmlmZXN0Q29sdW1uLnBvc2l0aW9uLnBsYWNlbWVudFxuXHRcdFx0fSxcblx0XHRcdGNhc2VTZW5zaXRpdmU6IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShjb252ZXJ0ZXJDb250ZXh0KVxuXHRcdH07XG5cdFx0aWYgKGlzQ29sdW1uT3ZlcnJpZGUobWFuaWZlc3RDb2x1bW4sIGtleSkpIHtcblx0XHRcdGNvbnN0IHByb3BlcnRpZXNUb092ZXJ3cml0ZUFubm90YXRpb25Db2x1bW46IEN1c3RvbUVsZW1lbnQ8QW5ub3RhdGlvblRhYmxlQ29sdW1uRm9yT3ZlcnJpZGU+ID0ge1xuXHRcdFx0XHQuLi5iYXNlVGFibGVDb2x1bW4sXG5cdFx0XHRcdGltcG9ydGFuY2U6IG1hbmlmZXN0Q29sdW1uPy5pbXBvcnRhbmNlLFxuXHRcdFx0XHRob3Jpem9udGFsQWxpZ246IG1hbmlmZXN0Q29sdW1uPy5ob3Jpem9udGFsQWxpZ24sXG5cdFx0XHRcdGF2YWlsYWJpbGl0eTogbWFuaWZlc3RDb2x1bW4/LmF2YWlsYWJpbGl0eSxcblx0XHRcdFx0dHlwZTogQ29sdW1uVHlwZS5Bbm5vdGF0aW9uLFxuXHRcdFx0XHRpc05hdmlnYWJsZTogdW5kZWZpbmVkLFxuXHRcdFx0XHRzZXR0aW5nczogbWFuaWZlc3RDb2x1bW4uc2V0dGluZ3MsXG5cdFx0XHRcdGZvcm1hdE9wdGlvbnM6IF9nZXREZWZhdWx0Rm9ybWF0T3B0aW9uc0ZvclRhYmxlKG1hbmlmZXN0Q29sdW1uLmZvcm1hdE9wdGlvbnMpLFxuXHRcdFx0XHRleHBvcnRTZXR0aW5nczogZ2V0Q3VzdG9tRXhwb3J0U2V0dGluZ3MoXG5cdFx0XHRcdFx0bWFuaWZlc3RDb2x1bW4/LmV4cG9ydFNldHRpbmdzLFxuXHRcdFx0XHRcdGFubm90YXRpb25Db2x1bW5zLFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0ZW50aXR5VHlwZSxcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0a2V5XG5cdFx0XHRcdClcblx0XHRcdH07XG5cdFx0XHRpbnRlcm5hbENvbHVtbnNba2V5XSA9IHByb3BlcnRpZXNUb092ZXJ3cml0ZUFubm90YXRpb25Db2x1bW47XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5SW5mb3M6IHN0cmluZ1tdIHwgdW5kZWZpbmVkID0gX2dldFByb3BlcnR5TmFtZXMoXG5cdFx0XHRcdG1hbmlmZXN0Q29sdW1uLnByb3BlcnRpZXMsXG5cdFx0XHRcdGFubm90YXRpb25Db2x1bW5zLFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRlbnRpdHlUeXBlXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgdG9vbHRpcFRleHQgPSBjb252ZXJ0ZXJDb250ZXh0LmZldGNoVGV4dEZyb21NZXRhTW9kZWwobWFuaWZlc3RDb2x1bW4udG9vbHRpcCksXG5cdFx0XHRcdGhlYWRlclRleHQgPSBjb252ZXJ0ZXJDb250ZXh0LmZldGNoVGV4dEZyb21NZXRhTW9kZWwobWFuaWZlc3RDb2x1bW4uaGVhZGVyKTtcblxuXHRcdFx0Y29uc3QgY3VzdG9tQ29sdW1uRXhwb3J0U2V0dGluZ3M6IENvbHVtbkV4cG9ydFNldHRpbmdzIHwgbnVsbCA9IHByb3BlcnR5SW5mb3Ncblx0XHRcdFx0PyBnZXRDdXN0b21FeHBvcnRTZXR0aW5ncyhtYW5pZmVzdENvbHVtbj8uZXhwb3J0U2V0dGluZ3MsIGFubm90YXRpb25Db2x1bW5zLCBjb252ZXJ0ZXJDb250ZXh0LCBlbnRpdHlUeXBlLCBwcm9wZXJ0eUluZm9zKVxuXHRcdFx0XHQ6IG51bGw7XG5cdFx0XHRjb25zdCBiYXNlTWFuaWZlc3RDb2x1bW4gPSB7XG5cdFx0XHRcdC4uLmJhc2VUYWJsZUNvbHVtbixcblx0XHRcdFx0aGVhZGVyOiBoZWFkZXJUZXh0LFxuXHRcdFx0XHRpbXBvcnRhbmNlOiBtYW5pZmVzdENvbHVtbj8uaW1wb3J0YW5jZSB8fCBJbXBvcnRhbmNlLk5vbmUsXG5cdFx0XHRcdGhvcml6b250YWxBbGlnbjogbWFuaWZlc3RDb2x1bW4/Lmhvcml6b250YWxBbGlnbiB8fCBIb3Jpem9udGFsQWxpZ24uQmVnaW4sXG5cdFx0XHRcdGF2YWlsYWJpbGl0eTogbWFuaWZlc3RDb2x1bW4/LmF2YWlsYWJpbGl0eSB8fCBcIkRlZmF1bHRcIixcblx0XHRcdFx0dGVtcGxhdGU6IG1hbmlmZXN0Q29sdW1uLnRlbXBsYXRlLFxuXHRcdFx0XHRwcm9wZXJ0eUluZm9zOiBwcm9wZXJ0eUluZm9zLFxuXHRcdFx0XHRleHBvcnRTZXR0aW5nczogY3VzdG9tQ29sdW1uRXhwb3J0U2V0dGluZ3MsXG5cdFx0XHRcdGlkOiBgQ3VzdG9tQ29sdW1uOjoke2tleX1gLFxuXHRcdFx0XHRuYW1lOiBgQ3VzdG9tQ29sdW1uOjoke2tleX1gLFxuXHRcdFx0XHQvL05lZWRlZCBmb3IgTURDOlxuXHRcdFx0XHRmb3JtYXRPcHRpb25zOiB7IHRleHRMaW5lc0VkaXQ6IDQgfSxcblx0XHRcdFx0aXNHcm91cGFibGU6IGZhbHNlLFxuXHRcdFx0XHRpc05hdmlnYWJsZTogZmFsc2UsXG5cdFx0XHRcdHNvcnRhYmxlOiBmYWxzZSxcblx0XHRcdFx0dmlzdWFsU2V0dGluZ3M6IHsgd2lkdGhDYWxjdWxhdGlvbjogbnVsbCB9LFxuXHRcdFx0XHR0b29sdGlwOiB0b29sdGlwVGV4dCA/IHRvb2x0aXBUZXh0IDogaGVhZGVyVGV4dCxcblx0XHRcdFx0cHJvcGVydGllczogbWFuaWZlc3RDb2x1bW4ucHJvcGVydGllcyxcblx0XHRcdFx0cmVxdWlyZWQ6XG5cdFx0XHRcdFx0bWFuaWZlc3RDb2x1bW4ucmVxdWlyZWQgJiZcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCAmJlxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5BbmFseXRpY2FsTGlzdFBhZ2Vcblx0XHRcdFx0XHRcdD8gY29tcGlsZUV4cHJlc3Npb24oVUkuSXNFZGl0YWJsZSlcblx0XHRcdFx0XHRcdDogdW5kZWZpbmVkXG5cdFx0XHR9O1xuXHRcdFx0aWYgKHByb3BlcnR5SW5mb3MpIHtcblx0XHRcdFx0X3VwZGF0ZUxpbmtlZFByb3BlcnRpZXNPbkN1c3RvbUNvbHVtbnMocHJvcGVydHlJbmZvcywgYW5ub3RhdGlvbkNvbHVtbnMpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGlzU2xvdENvbHVtbihtYW5pZmVzdENvbHVtbikpIHtcblx0XHRcdFx0Y29uc3QgY3VzdG9tVGFibGVDb2x1bW46IEN1c3RvbUVsZW1lbnQ8Q3VzdG9tQmFzZWRUYWJsZUNvbHVtbj4gPSB7XG5cdFx0XHRcdFx0Li4uYmFzZU1hbmlmZXN0Q29sdW1uLFxuXHRcdFx0XHRcdHR5cGU6IENvbHVtblR5cGUuU2xvdFxuXHRcdFx0XHR9O1xuXHRcdFx0XHRpbnRlcm5hbENvbHVtbnNba2V5XSA9IGN1c3RvbVRhYmxlQ29sdW1uO1xuXHRcdFx0fSBlbHNlIGlmIChpc0N1c3RvbUNvbHVtbihtYW5pZmVzdENvbHVtbikpIHtcblx0XHRcdFx0Y29uc3QgY3VzdG9tVGFibGVDb2x1bW46IEN1c3RvbUVsZW1lbnQ8Q3VzdG9tQmFzZWRUYWJsZUNvbHVtbj4gPSB7XG5cdFx0XHRcdFx0Li4uYmFzZU1hbmlmZXN0Q29sdW1uLFxuXHRcdFx0XHRcdHR5cGU6IENvbHVtblR5cGUuRGVmYXVsdFxuXHRcdFx0XHR9O1xuXHRcdFx0XHRpbnRlcm5hbENvbHVtbnNba2V5XSA9IGN1c3RvbVRhYmxlQ29sdW1uO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgbWVzc2FnZSA9IGBUaGUgYW5ub3RhdGlvbiBjb2x1bW4gJyR7a2V5fScgcmVmZXJlbmNlZCBpbiB0aGUgbWFuaWZlc3QgaXMgbm90IGZvdW5kYDtcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHRcdC5nZXREaWFnbm9zdGljcygpXG5cdFx0XHRcdFx0LmFkZElzc3VlKFxuXHRcdFx0XHRcdFx0SXNzdWVDYXRlZ29yeS5NYW5pZmVzdCxcblx0XHRcdFx0XHRcdElzc3VlU2V2ZXJpdHkuTG93LFxuXHRcdFx0XHRcdFx0bWVzc2FnZSxcblx0XHRcdFx0XHRcdElzc3VlQ2F0ZWdvcnlUeXBlLFxuXHRcdFx0XHRcdFx0SXNzdWVDYXRlZ29yeVR5cGU/LkFubm90YXRpb25Db2x1bW5zPy5JbnZhbGlkS2V5XG5cdFx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIGludGVybmFsQ29sdW1ucztcbn07XG5cbi8qKlxuICogQWRkcyBjb21wdXRlZCBjb2x1bW5zIHN1Y2ggYXMgdGhlIGRyYWZ0IHN0YXR1cyBhbmQgc2l0dWF0aW9ucyBzdGF0dXMuXG4gKiBAcGFyYW0gdGFibGVDb2x1bW5zIFRoZSB0YWJsZSBjb2x1bW5zIGNvbGxlY3RlZCBzbyBmYXJcbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGhlIHRhYmxlIHR5cGVcbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBlbnJpY2hlZCBzZXQgb2YgdGFibGUgY29sdW1uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkQ29tcHV0ZWRDb2x1bW5zKFxuXHR0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IFRhYmxlQ29sdW1uW10ge1xuXHRpZiAoIVtcIkdyaWRUYWJsZVwiLCBcIlRyZWVUYWJsZVwiLCBcIkFuYWx5dGljYWxUYWJsZVwiXS5pbmNsdWRlcyh0YWJsZVR5cGUpKSB7XG5cdFx0Ly8gQ29tcHV0ZWQgY29sdW1ucyBhcmUgbm90IHVzZWQgaW4gUmVzcG9uc2l2ZSB0YWJsZXNcblx0XHRyZXR1cm4gdGFibGVDb2x1bW5zO1xuXHR9XG5cblx0Ly8gSW4gY2FzZSBhIGdyaWQgdGFibGUgb3IgdHJlZSB0YWJsZSBpcyB1c2VkLCB3ZSBkaXNwbGF5IHRoZSBzaXR1YXRpb25zIGluZGljYXRvciBpbiBhIHNlcGFyYXRlIGNvbHVtblxuXHQvLyBzbyB3ZSBoYXZlIHRvIGRpc2FibGUgaXQgaGVyZSB0byBlbnN1cmUsIHRoYXQgdGhlIGZpZWxkIGJ1aWxkaW5nIGJsb2NrXG5cdC8vIGRvZXMgbm90IHJlbmRlciBpdCBpbnRvIHRoZSBJRCBjb2x1bW5cblx0Y29uc3QgY29sdW1uV2l0aFNpdHVhdGlvbnNJbmRpY2F0b3I6IFRhYmxlQ29sdW1uIHwgdW5kZWZpbmVkID0gdGFibGVDb2x1bW5zLmZpbmQoXG5cdFx0KGNvbHVtbikgPT4gY29sdW1uLmZvcm1hdE9wdGlvbnM/Lmhhc1NpdHVhdGlvbnNJbmRpY2F0b3IgIT09IHVuZGVmaW5lZCAmJiBjb2x1bW4uZm9ybWF0T3B0aW9ucz8uaGFzU2l0dWF0aW9uc0luZGljYXRvciA9PT0gdHJ1ZVxuXHQpO1xuXHRpZiAoY29sdW1uV2l0aFNpdHVhdGlvbnNJbmRpY2F0b3I/LmZvcm1hdE9wdGlvbnMpIHtcblx0XHQvLyBTd2l0Y2ggb2ZmIHRoZSBzaXR1YXRpb25zIGluZGljYXRvciBpbiB0aGUgZm91bmQgY29sdW1uXG5cdFx0Y29sdW1uV2l0aFNpdHVhdGlvbnNJbmRpY2F0b3IuZm9ybWF0T3B0aW9ucy5oYXNTaXR1YXRpb25zSW5kaWNhdG9yID0gZmFsc2U7XG5cblx0XHQvLyBJbnNlcnQgYSBzZXBhcmF0ZSBzaXR1YXRpb25zIGluZGljYXRvciBjb2x1bW5cblx0XHRjb25zdCBzaXR1YXRpb25zSW5kaWNhdG9yQ29sdW1uOiBDb21wdXRlZFRhYmxlQ29sdW1uID0ge1xuXHRcdFx0a2V5OiBcInNpdHVhdGlvbnNJbmRpY2F0b3JcIixcblx0XHRcdG5hbWU6IFwic2l0dWF0aW9uc0luZGljYXRvclwiLFxuXHRcdFx0cHJvcGVydHlLZXk6IGNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yLm5hbWUsXG5cdFx0XHRpc1NpdHVhdGlvbnNJbmRpY2F0b3I6IHRydWUsXG5cdFx0XHRhdmFpbGFiaWxpdHk6IFwiRGVmYXVsdFwiLFxuXHRcdFx0bGFiZWw6IFwie3NhcC5mZS5pMThuPkNfU0lUVUFUSU9OU19TVEFUVVNfQ09MVU1OX0xBQkVMX1RPT0xUSVB9XCIsXG5cdFx0XHR0b29sdGlwOiBcIntzYXAuZmUuaTE4bj5DX1NJVFVBVElPTlNfU1RBVFVTX0NPTFVNTl9MQUJFTF9UT09MVElQfVwiLFxuXHRcdFx0dHlwZTogQ29sdW1uVHlwZS5Db21wdXRlZCxcblx0XHRcdGZvcm1hdE9wdGlvbnM6IG51bGwsXG5cdFx0XHRleHBvcnRTZXR0aW5nczogbnVsbCxcblx0XHRcdGNsaXBib2FyZFNldHRpbmdzOiBudWxsLFxuXHRcdFx0cHJvcGVydHlJbmZvczogdW5kZWZpbmVkLFxuXHRcdFx0Y2FzZVNlbnNpdGl2ZTogZmFsc2Vcblx0XHR9O1xuXG5cdFx0Ly8gUGxhY2UgdGhlIGRyYWZ0IHN0YXR1cyBjb2x1bW4gYWZ0ZXIgdGhlIGZpcnN0IHZpc2libGUgY29sdW1uXG5cdFx0Y29uc3QgaW5kZXhPZkZpcnN0VmlzaWJsZUNvbHVtbjogaW50ID0gdGFibGVDb2x1bW5zLmZpbmRJbmRleCgoY29sdW1uKSA9PiBjb2x1bW4uYXZhaWxhYmlsaXR5ICE9PSBcIkhpZGRlblwiKTtcblx0XHR0YWJsZUNvbHVtbnMuc3BsaWNlKGluZGV4T2ZGaXJzdFZpc2libGVDb2x1bW4gKyAxLCAwLCBzaXR1YXRpb25zSW5kaWNhdG9yQ29sdW1uKTtcblx0fVxuXG5cdC8vIEluIGNhc2UgYSBncmlkIHRhYmxlIG9yIHRyZWUgdGFibGUgaXMgdXNlZCwgd2UgZGlzcGxheSB0aGUgZHJhZnQgaW5kaWNhdG9yIGluIGEgc2VwYXJhdGUgY29sdW1uXG5cdC8vIHNvIHdlIGhhdmUgdG8gZGlzYWJsZSBpdCBoZXJlIHRvIGVuc3VyZSwgdGhhdCB0aGUgZmllbGQgYnVpbGRpbmcgYmxvY2tcblx0Ly8gZG9lcyBub3QgcmVuZGVyIGl0IGludG8gdGhlIElEIGNvbHVtblxuXHQvLyBUaGUgYWRkaXRpb25hbCBjb2x1bW4gaXMgb25seSBhZGRlZCBmb3IgdGFibGVzIG9uIGEgTFIgYW5kIGluIGNhc2UgdGVoZSBlbnRpdHkgaXMgZHJhZnQgZW5hYmxlZCFcblx0Y29uc3QgY29sdW1uc1dpdGhEcmFmdEluZGljYXRvcjogVGFibGVDb2x1bW5bXSA9IHRhYmxlQ29sdW1ucy5maWx0ZXIoKGNvbHVtbikgPT4gY29sdW1uLmZvcm1hdE9wdGlvbnM/Lmhhc0RyYWZ0SW5kaWNhdG9yID09PSB0cnVlKTtcblx0aWYgKFxuXHRcdGNvbHVtbnNXaXRoRHJhZnRJbmRpY2F0b3IubGVuZ3RoICYmXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQgJiZcblx0XHQoTW9kZWxIZWxwZXIuaXNEcmFmdE5vZGUoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKSkgfHwgTW9kZWxIZWxwZXIuaXNEcmFmdFJvb3QoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKSkpXG5cdCkge1xuXHRcdC8vIFN3aXRjaCBvZmYgdGhlIGRyYWZ0IGluZGljYXRvciBpbiB0aGUgZm91bmQgY29sdW1uXG5cdFx0Y29sdW1uc1dpdGhEcmFmdEluZGljYXRvci5mb3JFYWNoKChjb2x1bW5XaXRoRHJhZnRJbmRpY2F0b3I6IFRhYmxlQ29sdW1uKSA9PiB7XG5cdFx0XHRpZiAoY29sdW1uV2l0aERyYWZ0SW5kaWNhdG9yPy5mb3JtYXRPcHRpb25zKSB7XG5cdFx0XHRcdGNvbHVtbldpdGhEcmFmdEluZGljYXRvci5mb3JtYXRPcHRpb25zLmhhc0RyYWZ0SW5kaWNhdG9yID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBJbnNlcnQgYSBzZXBhcmF0ZSBkcmFmdCBpbmRpY2F0b3IgY29sdW1uXG5cdFx0Y29uc3QgZHJhZnRJbmRpY2F0b3JDb2x1bW46IENvbXB1dGVkVGFibGVDb2x1bW4gPSB7XG5cdFx0XHRrZXk6IFwiZHJhZnRTdGF0dXNcIixcblx0XHRcdG5hbWU6IFwiZHJhZnRTdGF0dXNcIixcblx0XHRcdHByb3BlcnR5S2V5OiBjb2x1bW5zV2l0aERyYWZ0SW5kaWNhdG9yWzBdLm5hbWUsXG5cdFx0XHRpc0RyYWZ0SW5kaWNhdG9yOiB0cnVlLFxuXHRcdFx0YXZhaWxhYmlsaXR5OiBcIkRlZmF1bHRcIixcblx0XHRcdGxhYmVsOiBcIntzYXAuZmUuaTE4bj5DX0RSQUZUX1NUQVRVU19DT0xVTU5fTEFCRUxfVE9PTFRJUH1cIixcblx0XHRcdHRvb2x0aXA6IFwie3NhcC5mZS5pMThuPkNfRFJBRlRfU1RBVFVTX0NPTFVNTl9MQUJFTF9UT09MVElQfVwiLFxuXHRcdFx0dHlwZTogQ29sdW1uVHlwZS5Db21wdXRlZCxcblx0XHRcdGZvcm1hdE9wdGlvbnM6IG51bGwsXG5cdFx0XHRleHBvcnRTZXR0aW5nczogbnVsbCxcblx0XHRcdGNhc2VTZW5zaXRpdmU6IGZhbHNlLFxuXHRcdFx0Y2xpcGJvYXJkU2V0dGluZ3M6IG51bGxcblx0XHR9O1xuXHRcdGxldCBjb2x1bW5JbmRleFRvSW5zZXJ0QWZ0ZXI6IGludCA9IDA7XG5cdFx0aWYgKGNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yKSB7XG5cdFx0XHQvLyBJZiB0aGVyZSdzIGEgc2l0dWF0aW9ucyBpbmRpY2F0b3IgY29sdW1uLCBwbGFjZSB0aGUgZHJhZnQgc3RhdHVzIGNvbHVtbiBiZWZvcmUgaXRcblx0XHRcdGNvbHVtbkluZGV4VG9JbnNlcnRBZnRlciA9XG5cdFx0XHRcdHRhYmxlQ29sdW1ucy5maW5kSW5kZXgoKGNvbHVtbikgPT4gKGNvbHVtbiBhcyBDb21wdXRlZFRhYmxlQ29sdW1uKS5pc1NpdHVhdGlvbnNJbmRpY2F0b3IgPT09IHRydWUpIC0gMTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gT3RoZXJ3aXNlIHBsYWNlIHRoZSBkcmFmdCBzdGF0dXMgY29sdW1uIGFmdGVyIHRoZSBmaXJzdCB2aXNpYmxlIGNvbHVtblxuXHRcdFx0Y29sdW1uSW5kZXhUb0luc2VydEFmdGVyID0gdGFibGVDb2x1bW5zLmZpbmRJbmRleCgoY29sdW1uKSA9PiBjb2x1bW4uYXZhaWxhYmlsaXR5ICE9PSBcIkhpZGRlblwiKTtcblx0XHR9XG5cdFx0dGFibGVDb2x1bW5zLnNwbGljZShjb2x1bW5JbmRleFRvSW5zZXJ0QWZ0ZXIgKyAxLCAwLCBkcmFmdEluZGljYXRvckNvbHVtbik7XG5cdH1cblxuXHRyZXR1cm4gdGFibGVDb2x1bW5zO1xufVxuXG4vKipcbiAqIFByb3ZpZGVzIHRoZSByZXF1aXJlZCBwcm9wZXJ0aWVzIHNldCBvbiB0aGUgYW5ub3RhdGlvbnMuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCAgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgVGhlIHBhdGhzIG9mIHRoZSByZXN0cmljdGVkIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlcXVpcmVkUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBQcm9wZXJ0eVBhdGhbXSB7XG5cdHJldHVybiBnZXRDb250ZXh0UHJvcGVydHlSZXN0cmljdGlvbihcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSxcblx0XHQoY2FwYWJpbGl0aWVzKSA9PiB7XG5cdFx0XHRyZXR1cm4gKGNhcGFiaWxpdGllcyBhcyBFbnRpdHlTZXRBbm5vdGF0aW9uc19DYXBhYmlsaXRpZXMgfCB1bmRlZmluZWQpPy5JbnNlcnRSZXN0cmljdGlvbnM/LlJlcXVpcmVkUHJvcGVydGllcztcblx0XHR9LFxuXHRcdGZhbHNlXG5cdCk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgcHJvcGVydHkgaXMgYW5ub3RhdGVkIGFzIGEgcmVxdWlyZWQgcHJvcGVydHkuXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHlcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHJlcXVpcmVkXG4gKi9cbmZ1bmN0aW9uIGlzQW5ub3RhdGVkUmVxdWlyZWRQcm9wZXJ0eShuYW1lOiBzdHJpbmcsIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQpXG5cdFx0Lm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5LiR0YXJnZXQ/LmZ1bGx5UXVhbGlmaWVkTmFtZSlcblx0XHQuaW5jbHVkZXMobmFtZSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZGF0YSB0eXBlIG9mIGEgY29sdW1uIGZvciB0aGUgZXhwb3J0LlxuICogQHBhcmFtIGRhdGFUeXBlIFRoZSBkYXRhIHR5cGUgb2YgYSBwcm9wZXJ0eSwgY29sdW1uXG4gKiBAcGFyYW0gaXNBVGltZXpvbmUgSXMgdGhlIGdpdmVuIHByb3BlcnR5IGEgdGltZXpvbmVcbiAqIEBwYXJhbSBpc0N1cnJlbmN5IElzIHRoZSBnaXZlbiBwcm9wZXJ0eSBhIGN1cnJlbmN5XG4gKiBAcGFyYW0gZXhwb3J0U2V0dGluZ3MgVGhlIGFscmVhZHkgZGV0ZWN0ZWQgZXhwb3J0IHNldHRpbmdzIGZyb20gZGF0YWZpZWxkc1xuICogQHJldHVybnMgVGhlIHN1cHBvcnRlZCBleHBvcnQgdHlwZVxuICovXG5mdW5jdGlvbiBnZXRFeHBvcnREYXRhVHlwZShcblx0ZGF0YVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0aXNBVGltZXpvbmUgPSBmYWxzZSxcblx0aXNDdXJyZW5jeSA9IGZhbHNlLFxuXHRleHBvcnRTZXR0aW5ncz86IENvbHVtbkV4cG9ydFNldHRpbmdzXG4pOiBzdHJpbmcge1xuXHRsZXQgZXhwb3J0RGF0YVR5cGUgPSBcIlN0cmluZ1wiO1xuXHRpZiAoIWRhdGFUeXBlIHx8IGV4cG9ydFNldHRpbmdzPy5kYXRhUG9pbnRUYXJnZXRWYWx1ZSkge1xuXHRcdHJldHVybiBleHBvcnREYXRhVHlwZTtcblx0fVxuXHRpZiAoZXhwb3J0U2V0dGluZ3M/LmlzQ3VycmVuY3kgfHwgaXNDdXJyZW5jeSkge1xuXHRcdHJldHVybiBcIkN1cnJlbmN5XCI7XG5cdH1cblx0aWYgKGlzQVRpbWV6b25lKSB7XG5cdFx0cmV0dXJuIFwiVGltZXpvbmVcIjtcblx0fVxuXHRpZiAoZXhwb3J0U2V0dGluZ3M/LndyYXApIHtcblx0XHRyZXR1cm4gZXhwb3J0RGF0YVR5cGU7XG5cdH1cblx0c3dpdGNoIChkYXRhVHlwZSkge1xuXHRcdGNhc2UgXCJFZG0uRGVjaW1hbFwiOlxuXHRcdGNhc2UgXCJFZG0uSW50MzJcIjpcblx0XHRjYXNlIFwiRWRtLkludDY0XCI6XG5cdFx0Y2FzZSBcIkVkbS5Eb3VibGVcIjpcblx0XHRjYXNlIFwiRWRtLkJ5dGVcIjpcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJOdW1iZXJcIjtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJFZG0uRGF0ZU9mVGltZVwiOlxuXHRcdGNhc2UgXCJFZG0uRGF0ZVwiOlxuXHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIkRhdGVcIjtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJFZG0uRGF0ZVRpbWVPZmZzZXRcIjpcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJEYXRlVGltZVwiO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkVkbS5UaW1lT2ZEYXlcIjpcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJUaW1lXCI7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiRWRtLkJvb2xlYW5cIjpcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJCb29sZWFuXCI7XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIlN0cmluZ1wiO1xuXHR9XG5cdHJldHVybiBleHBvcnREYXRhVHlwZTtcbn1cblxuLyoqXG4gKiBBZGRzIHRoZSB0b29sdGlwIGNvbmZpZ3VyYXRpb24gZm9yIGEgZ2l2ZW4gY29sdW1uLlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSByZWZlcmVuY2VkIG9uIHRoZSBjb2x1bW5cbiAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiB0byBiZSB1cGRhdGVkXG4gKi9cbmZ1bmN0aW9uIF9hZGRUb29sVGlwKHByb3BlcnR5OiBQcm9wZXJ0eSwgY29sdW1uOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4pOiB2b2lkIHtcblx0Y29uc3QgdG9vbHRpcCA9IF9nZXRUb29sdGlwKHByb3BlcnR5KSA/PyBjb2x1bW4ubGFiZWw7XG5cdGlmICh0b29sdGlwKSB7XG5cdFx0Y29sdW1uLnRvb2x0aXAgPSB0b29sdGlwO1xuXHR9XG59XG5cbmZ1bmN0aW9uIF9nZXRDb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHMoXG5cdHJlbGF0aXZlUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgbmF2aWdhdGlvblByb3BlcnRpZXMgPSBlbmhhbmNlRGF0YU1vZGVsUGF0aChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSwgcmVsYXRpdmVQYXRoKS5uYXZpZ2F0aW9uUHJvcGVydGllcztcblx0aWYgKG5hdmlnYXRpb25Qcm9wZXJ0aWVzPy5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgY29sbGVjdGVkTmF2aWdhdGlvblByb3BlcnR5TGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZvckVhY2goKG5hdlByb3BlcnR5KSA9PiB7XG5cdFx0XHRjb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHMucHVzaChnZXRMYWJlbChuYXZQcm9wZXJ0eSkgfHwgbmF2UHJvcGVydHkubmFtZSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGNvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscztcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBwcm9wZXJ0eSB1c2luZyB0aGUgdGV4dCBhcnJhbmdlbWVudCBhbm5vdGF0aW9uIHNldCB0byB0ZXh0IG9ubHkuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHQuXG4gKiBAcGFyYW0gcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIFRoZSBjb3JyZXNwb25kaW5nIERhdGFNb2RlbE9iamVjdFBhdGguXG4gKiBAcGFyYW0gbGluZUl0ZW0gVGhlIGNvbHVtbiB0byBiZSBldmFsdWF0ZWQuXG4gKiBAcGFyYW0gY29sdW1uc1RvQmVDcmVhdGVkIFRoZSBsaXN0IG9mIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cbiAqIEBwYXJhbSByZWxhdGl2ZVBhdGggVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHRhcmdldCBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgY29udGV4dC5cbiAqIEBwYXJhbSByZXN0cmljdGlvbnNPblByb3BlcnRpZXMgVGhlIGV4aXN0aW5nIHJlc3RyaWN0aW9ucyBvbiBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVByb3BlcnR5QW5ub3RhdGVkVGV4dE9ubHkoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0cHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPERhdGFGaWVsZEFic3RyYWN0VHlwZXM+LFxuXHRsaW5lSXRlbTogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4sXG5cdHJlbGF0aXZlUGF0aDogc3RyaW5nLFxuXHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM6IFJlc3RyaWN0aW9uc09uUHJvcGVydGllc1xuKTogdm9pZCB7XG5cdGNvbnN0IGlzUHJvcGVydHlOYXZpZ2F0ZWQgPVxuXHRcdHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGggIT09IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aDtcblx0aWYgKGlzUHJvcGVydHlOYXZpZ2F0ZWQgJiYgaXNEYXRhRmllbGQobGluZUl0ZW0pKSB7XG5cdFx0Y29sdW1uc1RvQmVDcmVhdGVkW3JlbGF0aXZlUGF0aF0gPSBsaW5lSXRlbS5WYWx1ZS4kdGFyZ2V0O1xuXHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcy5ub25Tb3J0YWJsZVByb3BlcnRpZXMucHVzaChyZWxhdGl2ZVBhdGgpO1xuXHR9IGVsc2UgaWYgKGlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvbihsaW5lSXRlbSkgJiYgaGFzRmllbGRHcm91cFRhcmdldChsaW5lSXRlbSkpIHtcblx0XHQobGluZUl0ZW0uVGFyZ2V0LiR0YXJnZXQgYXMgRmllbGRHcm91cCkuRGF0YS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuXHRcdFx0aWYgKGlzRGF0YUZpZWxkKGZpZWxkKSAmJiBnZXREaXNwbGF5TW9kZShmaWVsZC5WYWx1ZS4kdGFyZ2V0LCBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZSkgPT09IFwiRGVzY3JpcHRpb25cIikge1xuXHRcdFx0XHRjb25zdCBpbmhlcmVkUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGgoXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksXG5cdFx0XHRcdFx0ZmllbGQuVmFsdWUucGF0aFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBpc0luaGVyZWRQcm9wZXJ0eU5hdmlnYXRlZCA9XG5cdFx0XHRcdFx0aW5oZXJlZFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGggIT09XG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkubmF2aWdhdGlvblByb3BlcnRpZXMubGVuZ3RoO1xuXHRcdFx0XHRpZiAoaXNJbmhlcmVkUHJvcGVydHlOYXZpZ2F0ZWQpIHtcblx0XHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbZmllbGQuVmFsdWUucGF0aF0gPSBmaWVsZC5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcy5ub25Tb3J0YWJsZVByb3BlcnRpZXMucHVzaChmaWVsZC5WYWx1ZS5wYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBwcm9wZXJ0eSB0eXBlIGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gdGhlIHByb3ZpZGVkIHByb3BlcnR5IG9yIGRhdGEgdHlwZS5cbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgb3IgZGF0YSBmaWVsZCB0byBkZXRlcm1pbmUgdGhlIHR5cGUgY29uZmlndXJhdGlvbiBmb3IuXG4gKiBAcGFyYW0gZGF0YVR5cGUgVGhlIGRhdGEgdHlwZSB0byB1c2UgZm9yIHR5cGUgY29uZmlndXJhdGlvbiBpZiBub3QgZGV0ZXJtaW5lZCBmcm9tIHRoZSBwcm9wZXJ0eS5cbiAqIEByZXR1cm5zIFRoZSBwcm9wZXJ0eSB0eXBlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZUNvbmZpZyhwcm9wZXJ0eTogUHJvcGVydHkgfCBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgdW5kZWZpbmVkLCBkYXRhVHlwZT86IHN0cmluZyk6IFByb3BlcnR5VHlwZUNvbmZpZyB7XG5cdGxldCB0YXJnZXRNYXBwaW5nLFxuXHRcdGZvcm1hdE9wdGlvbnM6IFByb3BlcnR5VHlwZUZvcm1hdE9wdGlvbnMgfCB1bmRlZmluZWQgPSB7fTtcblx0aWYgKGlzUHJvcGVydHkocHJvcGVydHkpKSB7XG5cdFx0dGFyZ2V0TWFwcGluZyA9IGlzVHlwZURlZmluaXRpb24ocHJvcGVydHkudGFyZ2V0VHlwZSlcblx0XHRcdD8gRURNX1RZUEVfTUFQUElOR1twcm9wZXJ0eS50YXJnZXRUeXBlLnVuZGVybHlpbmdUeXBlXVxuXHRcdFx0OiBFRE1fVFlQRV9NQVBQSU5HW3Byb3BlcnR5LnR5cGVdO1xuXHR9XG5cdGlmICghdGFyZ2V0TWFwcGluZyAmJiBkYXRhVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dGFyZ2V0TWFwcGluZyA9IEVETV9UWVBFX01BUFBJTkdbZGF0YVR5cGVdO1xuXHR9XG5cdGNvbnN0IHByb3BlcnR5VHlwZUNvbmZpZzogUHJvcGVydHlUeXBlQ29uZmlnID0ge1xuXHRcdHR5cGU6IHRhcmdldE1hcHBpbmc/LnR5cGVcblx0fTtcblx0aWYgKHRhcmdldE1hcHBpbmcgJiYgaXNQcm9wZXJ0eShwcm9wZXJ0eSkpIHtcblx0XHRjb25zdCBjb25zdHJhaW50cyA9IHNldFVwQ29uc3RyYWludHModGFyZ2V0TWFwcGluZywgcHJvcGVydHkpO1xuXHRcdGlmIChPYmplY3Qua2V5cyhjb25zdHJhaW50cykubGVuZ3RoKSB7XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWcuY29uc3RyYWludHMgPSBjb25zdHJhaW50cztcblx0XHR9XG5cdH1cblx0aWYgKHByb3BlcnR5VHlwZUNvbmZpZy50eXBlICE9PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmVhbVwiKSB7XG5cdFx0aWYgKFxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuSW50XCIpID09PSAwIHx8XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Eb3VibGVcIikgPT09IDBcblx0XHQpIHtcblx0XHRcdGZvcm1hdE9wdGlvbnMgPSB7IHBhcnNlQXNTdHJpbmc6IGZhbHNlLCBlbXB0eVN0cmluZzogXCJcIiB9O1xuXHRcdH1cblx0XHRpZiAocHJvcGVydHlUeXBlQ29uZmlnLnR5cGUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyaW5nXCIgJiYgcHJvcGVydHlUeXBlQ29uZmlnLmNvbnN0cmFpbnRzPy5udWxsYWJsZSA9PT0gZmFsc2UpIHtcblx0XHRcdGZvcm1hdE9wdGlvbnMgPSB7IHBhcnNlS2VlcHNFbXB0eVN0cmluZzogdHJ1ZSB9O1xuXHRcdH1cblx0fVxuXHRpZiAoT2JqZWN0LmtleXMoZm9ybWF0T3B0aW9ucykubGVuZ3RoKSB7XG5cdFx0cHJvcGVydHlUeXBlQ29uZmlnLmZvcm1hdE9wdGlvbnMgPSBmb3JtYXRPcHRpb25zO1xuXHR9XG5cdHJldHVybiBwcm9wZXJ0eVR5cGVDb25maWc7XG59XG5cbi8qKlxuICogQWRkIGEgZGVzY3JpcHRpb24gcHJvcGVydHkgdG8gdGhlIGxpc3Qgb2YgZGVzY3JpcHRpb24gcHJvcGVydGllcyB1c2VkIGJ5IHRoZSBjb2x1bW5zIG9mIGEgdGFibGUuXG4gKiBAcGFyYW0gZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCBUaGUgbGlzdCBvZiBwcm9wZXJ0aWVzIHJlZmVyZW5jZWQgYXMgdGV4dCBvbiBhIHRleHQgYXJyYW5nZW1lbnQgYW5ub3RhdGlvblxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGxpbmtlZCB0byB0aGUgY29sdW1uIChuYW1lZCBhbHNvIGNvbXBsZXggcHJvcGVydHkpXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnR5TmFtZSBUaGUgcHJvcGVydHkgbmFtZSB0byBiZSBhZGRlZFxuICovXG5mdW5jdGlvbiBhZGRQcm9wZXJ0eVRvRGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcChcblx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcDogUmVjb3JkPHN0cmluZywgRGlzcGxheU1vZGU+LFxuXHRyZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm8sXG5cdHJlbGF0ZWRQcm9wZXJ0eU5hbWU6IHN0cmluZ1xuKTogdm9pZCB7XG5cdGlmIChcblx0XHRyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1tyZWxhdGVkUHJvcGVydHlOYW1lXS5kaXNwbGF5TW9kZU9mUHJvcGVydHlVc2VkQXNEZXNjcmlwdGlvbiAmJlxuXHRcdCFkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwW3JlbGF0ZWRQcm9wZXJ0eU5hbWVdXG5cdCkge1xuXHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXBbcmVsYXRlZFByb3BlcnR5TmFtZV0gPVxuXHRcdFx0cmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbcmVsYXRlZFByb3BlcnR5TmFtZV0uZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24hO1xuXHR9XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIHJlZmVyZW5jZWQgcHJvcGVydGllcyBvZiBhIExpbmVJdGVtIGluIGNhc2UgdGhlIExpbmVJdGVtIGlzIGFubm90YXRlZCBhcyBoaWRkZW4uXG4gKiBAcGFyYW0gZXhpc3RpbmdDb2x1bW5zIFRoZSBsaXN0IG9mIGNvbHVtbnMgY3JlYXRlZCBmcm9tIExpbmVJdGVtcyBhbmQgZnJvbSBwcm9wZXJ0aWVzIG9mIGVudGl0eVR5cGVcbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBldmFsdWF0ZWRcbiAqIEBwYXJhbSBjb2x1bW4gVGhlIGdpdmVuIGNvbHVtbiBmcm9tIGxpbmVJdGVtIG9yIHByb3BlcnR5IG9mIGVudGl0eVNldFxuICovXG5mdW5jdGlvbiBjb21wdXRlSGlkZGVuT25SZWxhdGVkQ29sdW1ucyhleGlzdGluZ0NvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLCBuYW1lOiBzdHJpbmcsIGNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uKTogdm9pZCB7XG5cdGNvbnN0IHJlbGF0ZWRBbm5vdGF0aW9uQ29sdW1ucyA9IGV4aXN0aW5nQ29sdW1ucy5maWx0ZXIoXG5cdFx0KGV4aXN0aW5nQ29sdW1uKSA9PlxuXHRcdFx0KGV4aXN0aW5nQ29sdW1uLnByb3BlcnR5SW5mb3M/LmluY2x1ZGVzKG5hbWUpICYmIGV4aXN0aW5nQ29sdW1uLmlzUGFydE9mTGluZUl0ZW0pIHx8XG5cdFx0XHQoZXhpc3RpbmdDb2x1bW4uaXNQYXJ0T2ZMaW5lSXRlbSAmJiBleGlzdGluZ0NvbHVtbi5yZWxhdGl2ZVBhdGggPT09IGNvbHVtbi5yZWxhdGl2ZVBhdGgpXG5cdCk7XG5cdGNvbHVtbi5pc1BhcnRPZkxpbmVJdGVtID0gISFyZWxhdGVkQW5ub3RhdGlvbkNvbHVtbnMubGVuZ3RoO1xuXHRpZiAoXG5cdFx0cmVsYXRlZEFubm90YXRpb25Db2x1bW5zLmxlbmd0aCAmJlxuXHRcdCFyZWxhdGVkQW5ub3RhdGlvbkNvbHVtbnM/LnNvbWUoKGFubm90YXRpb25Db2x1bW4pID0+IGFubm90YXRpb25Db2x1bW4uYXZhaWxhYmlsaXR5ICE9PSBcIkhpZGRlblwiKVxuXHQpIHtcblx0XHRjb2x1bW4uc29ydGFibGUgPSBmYWxzZTtcblx0XHRjb2x1bW4uaXNHcm91cGFibGUgPSBmYWxzZTtcblx0XHRjb2x1bW4uZmlsdGVyYWJsZSA9IGZhbHNlO1xuXHR9XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZXhwb3J0IHNldHRpbmdzIHByb3BlcnRpZXMgb2YgYSBtYW5pZmVzdCBjb2x1bW4uXG4gKiBAcGFyYW0gZXhwb3J0U2V0dGluZ3MgVGhlIGN1c3RvbWl6ZWQvb3ZlcndyaXR0ZW4gZXhwb3J0IHNldHRpbmdzIG9mIGEgbWFuaWZlc3QgY29sdW1uXG4gKiBAcGFyYW0gYW5ub3RhdGlvbkNvbHVtbnMgVGhlIGxpc3Qgb2YgY29sdW1ucyBjcmVhdGVkIGZyb20gTGluZUl0ZW1zXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB0YXJnZXQgZW50aXR5IHR5cGVcbiAqIEBwYXJhbSBwcm9wZXJ0eUluZm9zIFRoZSBwcm9wZXJ0aWVzIGxpbmtlZCB0byBhIGNvbXBsZXggY29sdW1uXG4gKiBAcGFyYW0gY29sdW1uS2V5IFRoZSBjb2x1bW4ga2V5IG9mIHRoZSBjb2x1bW4gdG8gYmUgb3ZlcndyaXR0ZW5cbiAqIEByZXR1cm5zIFRoZSBleHBvcnQgc2V0dGluZ3Mgb2YgdGhlIGNvbHVtbiBtZXJnaW5nIGN1c3RvbWl6ZWQgZXhwb3J0IHNldHRpbmdzIHdpdGggdGhlIGRlZmF1bHQgdmFsdWVzIGRldGVjdGVkIG9uIHRoZSBhbm5vdGF0aW9uIGNvbHVtblxuICovXG5mdW5jdGlvbiBnZXRDdXN0b21FeHBvcnRTZXR0aW5ncyhcblx0ZXhwb3J0U2V0dGluZ3M6IENvbHVtbkV4cG9ydFNldHRpbmdzIHwgdW5kZWZpbmVkLFxuXHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0cHJvcGVydHlJbmZvcz86IHN0cmluZ1tdLFxuXHRjb2x1bW5LZXk/OiBzdHJpbmdcbik6IENvbHVtbkV4cG9ydFNldHRpbmdzIHwgbnVsbCB7XG5cdGxldCBjb2x1bW5Gcm9tQW5ub3RhdGlvbnM7XG5cdGlmIChjb2x1bW5LZXkpIHtcblx0XHRjb2x1bW5Gcm9tQW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uQ29sdW1ucy5maW5kKChhbm5vdGF0aW9uQ29sdW1uKSA9PiBhbm5vdGF0aW9uQ29sdW1uLmtleSA9PT0gY29sdW1uS2V5KTtcblx0XHRpZiAoY29sdW1uRnJvbUFubm90YXRpb25zPy5leHBvcnRTZXR0aW5ncyA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGNvbHVtbkZyb21Bbm5vdGF0aW9ucz8uZXhwb3J0U2V0dGluZ3M7XG5cdFx0fVxuXHR9XG5cdGNvbnN0IGVuYWJsZVdyYXBwaW5nID1cblx0XHRleHBvcnRTZXR0aW5ncz8ud3JhcCA/P1xuXHRcdCghIShleHBvcnRTZXR0aW5ncz8ucHJvcGVydHkgJiYgZXhwb3J0U2V0dGluZ3MucHJvcGVydHk/Lmxlbmd0aCA+IDEpIHx8ICEhKHByb3BlcnR5SW5mb3MgJiYgcHJvcGVydHlJbmZvcy5sZW5ndGggPiAxKSk7XG5cdGNvbnN0IGN1c3RvbUV4cG9ydFNldHRpbmdzOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyA9IHtcblx0XHQuLi5jb2x1bW5Gcm9tQW5ub3RhdGlvbnM/LmV4cG9ydFNldHRpbmdzLFxuXHRcdHR5cGU6IGV4cG9ydFNldHRpbmdzPy50eXBlID8/IGNvbHVtbkZyb21Bbm5vdGF0aW9ucz8uZXhwb3J0U2V0dGluZ3M/LnR5cGUsXG5cdFx0dGVtcGxhdGU6XG5cdFx0XHRleHBvcnRTZXR0aW5ncz8udGVtcGxhdGUgPz9cblx0XHRcdF9hcHBlbmRDdXN0b21UZW1wbGF0ZShwcm9wZXJ0eUluZm9zLCBleHBvcnRTZXR0aW5ncz8ucHJvcGVydHkpID8/XG5cdFx0XHRjb2x1bW5Gcm9tQW5ub3RhdGlvbnM/LmV4cG9ydFNldHRpbmdzPy50ZW1wbGF0ZSxcblx0XHRwcm9wZXJ0eTogZXhwb3J0U2V0dGluZ3M/LnByb3BlcnR5XG5cdFx0XHQ/IF9nZXRQcm9wZXJ0eU5hbWVzKGV4cG9ydFNldHRpbmdzPy5wcm9wZXJ0eSwgYW5ub3RhdGlvbkNvbHVtbnMsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUpXG5cdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHR3aWR0aDogZXhwb3J0U2V0dGluZ3M/LndpZHRoLFxuXHRcdHdyYXA6IGVuYWJsZVdyYXBwaW5nXG5cdH07XG5cdHJldHVybiByZW1vdmVVbmRlZmluZWRGcm9tRXhwb3J0U2V0dGluZ3MoY3VzdG9tRXhwb3J0U2V0dGluZ3MpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQW1HQTtFQU1BO0VBS0E7RUFJQTtFQWNBO0VBOEJBO0VBc0NBO0VBQUEsSUEwQ1lBLFVBQVUsMEJBQVZBLFVBQVU7SUFBVkEsVUFBVTtJQUNBO0lBRFZBLFVBQVU7SUFBVkEsVUFBVTtJQUFWQSxVQUFVO0lBQUEsT0FBVkEsVUFBVTtFQUFBO0VBTXRCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVJBQyxRQUFBLENBQUFELFVBQUEsR0FBQUEsVUFBQTtFQVNPLFNBQVNFLGVBQWVBLENBQzlCQyxrQkFBNEIsRUFDNUJDLFNBQW9CLEVBQ3BCQyxpQkFBeUIsRUFDekJDLGdCQUF5RCxFQUN6QztJQUNoQixNQUFNQyxpQkFBaUIsR0FBR0MseUJBQXlCLENBQUNMLGtCQUFrQixFQUFFQyxTQUFTLEVBQUVDLGlCQUFpQixFQUFFQyxnQkFBZ0IsQ0FBQztJQUN2SCxNQUFNRyxlQUFlLEdBQUdDLHNCQUFzQixDQUM3Q0osZ0JBQWdCLENBQUNLLCtCQUErQixDQUE2Qk4saUJBQWlCLENBQUMsQ0FBQ08sT0FBTyxJQUFJLENBQUMsQ0FBQyxFQUM3R0wsaUJBQWlCLEVBQ2pCRCxnQkFBZ0IsRUFDaEJBLGdCQUFnQixDQUFDTyx1QkFBdUIsQ0FBQ1Ysa0JBQWtCLENBQzVELENBQUM7SUFFRCxNQUFNVyxZQUEyQixHQUFHQyxvQkFBb0IsQ0FDdkRSLGlCQUFpQixFQUNqQkUsZUFBZSxFQUNmO01BQ0NPLEtBQUssRUFBRUMsWUFBWSxDQUFDQyxTQUFTO01BQzdCQywwQkFBMEIsRUFBRUYsWUFBWSxDQUFDQyxTQUFTO01BQ2xERSxVQUFVLEVBQUVILFlBQVksQ0FBQ0MsU0FBUztNQUNsQ0csZUFBZSxFQUFFSixZQUFZLENBQUNDLFNBQVM7TUFDdkNJLFlBQVksRUFBRUwsWUFBWSxDQUFDQyxTQUFTO01BQ3BDSyxXQUFXLEVBQUVOLFlBQVksQ0FBQ0MsU0FBUztNQUNuQ00sUUFBUSxFQUFFUCxZQUFZLENBQUNDLFNBQVM7TUFDaENPLGFBQWEsRUFBRVIsWUFBWSxDQUFDQyxTQUFTO01BQ3JDUSxjQUFjLEVBQUVULFlBQVksQ0FBQ0M7SUFDOUIsQ0FDRCxDQUFDO0lBRUQsT0FBT1Msa0JBQWtCLENBQUNiLFlBQVksRUFBRVYsU0FBUyxFQUFFQyxpQkFBaUIsRUFBRUMsZ0JBQWdCLENBQUM7RUFDeEY7RUFBQ0wsUUFBQSxDQUFBQyxlQUFBLEdBQUFBLGVBQUE7RUFFTSxTQUFTMEIsZ0JBQWdCQSxDQUFDQyxJQUFZLEVBQUVmLFlBQTJCLEVBQTJCO0lBQ3BHLE9BQU9BLFlBQVksQ0FBQ2dCLElBQUksQ0FBRUMsTUFBTSxJQUFLO01BQ3BDLE1BQU1DLGdCQUFnQixHQUFHRCxNQUErQjtNQUN4RCxPQUFPQyxnQkFBZ0IsQ0FBQ0MsYUFBYSxLQUFLQyxTQUFTLElBQUlGLGdCQUFnQixDQUFDRyxZQUFZLEtBQUtOLElBQUk7SUFDOUYsQ0FBQyxDQUFDO0VBQ0g7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUpBNUIsUUFBQSxDQUFBMkIsZ0JBQUEsR0FBQUEsZ0JBQUE7RUFLTyxTQUFTUSxzQkFBc0JBLENBQUM5QixnQkFBa0MsRUFBRVEsWUFBMkIsRUFBUTtJQUM3RyxNQUFNdUIsbUJBQW1CLEdBQUcvQixnQkFBZ0IsQ0FBQ2dDLHNCQUFzQixDQUFDaEMsZ0JBQWdCLENBQUNpQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUNDLHNCQUFzQixDQUFDLENBQUM7SUFDL0gxQixZQUFZLENBQUMyQixPQUFPLENBQUVDLE9BQU8sSUFBSztNQUNqQyxNQUFNQyxXQUFXLEdBQUdELE9BQWdDO01BQ3BELElBQUlDLFdBQVcsQ0FBQ1YsYUFBYSxLQUFLQyxTQUFTLElBQUlTLFdBQVcsQ0FBQ1IsWUFBWSxFQUFFO1FBQ3hFLE1BQU1TLDJCQUEyQixHQUFHQyxvQkFBb0IsQ0FBV1IsbUJBQW1CLEVBQUVNLFdBQVcsQ0FBQ1IsWUFBWSxDQUFDO1FBQ2pILE1BQU1XLFFBQVEsR0FBR0YsMkJBQTJCLENBQUNHLFlBQVk7UUFDekQsSUFBSUQsUUFBUSxFQUFFO1VBQ2JFLDBCQUEwQixDQUFDRixRQUFRLEVBQUVGLDJCQUEyQixFQUFFOUIsWUFBWSxFQUFFNkIsV0FBVyxDQUFDO1VBQzVGLE1BQU1NLGdCQUFnQixHQUFHQyw2QkFBNkIsQ0FBQ0osUUFBUSxDQUFDO1VBQ2hFLE1BQU1LLFFBQVEsR0FBR0wsUUFBUSxFQUFFTSxXQUFXLEVBQUVDLE1BQU0sRUFBRUMsUUFBUTtVQUN4RCxJQUFJTCxnQkFBZ0IsRUFBRTtZQUNyQixNQUFNTSxlQUFlLEdBQUczQixnQkFBZ0IsQ0FBQ3FCLGdCQUFnQixDQUFDTyxJQUFJLEVBQUUxQyxZQUFZLENBQUM7WUFDN0U2QixXQUFXLENBQUNRLFFBQVEsR0FBR0ksZUFBZSxFQUFFQyxJQUFJO1VBQzdDLENBQUMsTUFBTSxJQUFJTCxRQUFRLEVBQUU7WUFDcEJSLFdBQVcsQ0FBQ2MsWUFBWSxHQUFHTixRQUFRLENBQUNPLFFBQVEsQ0FBQyxDQUFDO1VBQy9DO1VBQ0FDLDhCQUE4QixDQUFDYixRQUFRLEVBQUVGLDJCQUEyQixFQUFFOUIsWUFBWSxFQUFFNkIsV0FBVyxDQUFDO1FBQ2pHO01BQ0Q7SUFDRCxDQUFDLENBQUM7RUFDSDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQU5BMUMsUUFBQSxDQUFBbUMsc0JBQUEsR0FBQUEsc0JBQUE7RUFPQSxTQUFTWSwwQkFBMEJBLENBQ2xDRixRQUFrQixFQUNsQkYsMkJBQTBELEVBQzFEOUIsWUFBMkIsRUFDM0I2QixXQUFrQyxFQUMzQjtJQUNQLE1BQU1pQixxQkFBcUIsR0FBR0MsaUNBQWlDLENBQUNmLFFBQVEsQ0FBQyxJQUFJZ0IsNkJBQTZCLENBQUNoQixRQUFRLENBQUM7SUFDcEgsSUFBSWMscUJBQXFCLEVBQUU7TUFDMUIsTUFBTUcsd0NBQXdDLEdBQUdsQixvQkFBb0IsQ0FBV0QsMkJBQTJCLEVBQUVnQixxQkFBcUIsQ0FBQztNQUNuSSxNQUFNSSx5QkFBeUIsR0FBR0Msa0NBQWtDLENBQUNGLHdDQUF3QyxDQUFDO01BQzlHLElBQUlDLHlCQUF5QixFQUFFO1FBQzlCLE1BQU1FLFVBQVUsR0FBR3RDLGdCQUFnQixDQUFDb0MseUJBQXlCLEVBQUVsRCxZQUFZLENBQUM7UUFDNUU2QixXQUFXLENBQUN3QixJQUFJLEdBQUdELFVBQVUsRUFBRVYsSUFBSTtNQUNwQztJQUNELENBQUMsTUFBTTtNQUNOLE1BQU1XLElBQUksR0FBR3JCLFFBQVEsRUFBRU0sV0FBVyxFQUFFZ0IsUUFBUSxFQUFFQyxXQUFXLElBQUl2QixRQUFRLEVBQUVNLFdBQVcsRUFBRWdCLFFBQVEsRUFBRUUsSUFBSTtNQUNsRyxJQUFJSCxJQUFJLEVBQUU7UUFDVHhCLFdBQVcsQ0FBQzRCLFFBQVEsR0FBRyxHQUFHSixJQUFJLEVBQUU7TUFDakM7SUFDRDtFQUNEOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBU1IsOEJBQThCQSxDQUN0Q2IsUUFBa0IsRUFDbEJGLDJCQUEwRCxFQUMxRDlCLFlBQTJCLEVBQzNCNkIsV0FBa0MsRUFDM0I7SUFDUCxNQUFNNkIsV0FBVyxHQUFHQyxjQUFjLENBQUMzQixRQUFRLEVBQUVGLDJCQUEyQixDQUFDOEIsZ0JBQWdCLENBQUM7TUFDekZDLGdCQUFnQixHQUFHQyw2QkFBNkIsQ0FBQzlCLFFBQVEsQ0FBQztJQUMzRCxJQUFJNkIsZ0JBQWdCLElBQUlILFdBQVcsS0FBSyxPQUFPLEVBQUU7TUFDaEQsTUFBTUssK0JBQStCLEdBQUdoQyxvQkFBb0IsQ0FBV0QsMkJBQTJCLEVBQUUrQixnQkFBZ0IsQ0FBQztNQUNySCxNQUFNRyxnQkFBZ0IsR0FBR2Isa0NBQWtDLENBQUNZLCtCQUErQixDQUFDO01BQzVGLElBQUlDLGdCQUFnQixFQUFFO1FBQ3JCLE1BQU1DLFVBQVUsR0FBR25ELGdCQUFnQixDQUFDa0QsZ0JBQWdCLEVBQUVoRSxZQUFZLENBQUM7UUFDbkUsSUFBSWlFLFVBQVUsSUFBSUEsVUFBVSxDQUFDdkIsSUFBSSxLQUFLYixXQUFXLENBQUNhLElBQUksRUFBRTtVQUN2RGIsV0FBVyxDQUFDcUMsZUFBZSxHQUFHO1lBQzdCQyxZQUFZLEVBQUVGLFVBQVUsQ0FBQ3ZCLElBQUk7WUFDN0IwQixJQUFJLEVBQUVWO1VBQ1AsQ0FBQztVQUNEO1VBQ0EsSUFBSSxDQUFDTyxVQUFVLENBQUNyRCxjQUFjLEVBQUU7WUFDL0JxRCxVQUFVLENBQUNyRCxjQUFjLEdBQUc7Y0FBRXlELElBQUksRUFBRTtZQUFTLENBQUM7VUFDL0M7UUFDRDtNQUNEO0lBQ0Q7RUFDRDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxNQUFNQyx3QkFBd0IsR0FBRyxTQUFBQSxDQUN2Q0Msa0JBQTRDLEVBQzVDQyxVQUFzQixFQUN0Qi9FLGlCQUEwQyxFQUMxQ0QsZ0JBQXlELEVBQ3pERixTQUFvQixFQUNwQm1GLGlCQUErQixFQUMvQkMscUNBQWtFLEVBQ2xFQyx3QkFBbUQsRUFDekI7SUFDMUIsSUFBSWxGLGlCQUFpQixLQUFLMkIsU0FBUyxFQUFFO01BQ3BDM0IsaUJBQWlCLEdBQUcsRUFBRTtJQUN2QjtJQUVBLElBQUltRiwyQkFBcUMsR0FBRyxFQUFFO0lBQzlDLE1BQU1DLGlCQUFpQixHQUFHLElBQUlDLGlCQUFpQixDQUFDTixVQUFVLEVBQUVoRixnQkFBZ0IsQ0FBQztJQUM3RSxNQUFNdUYsbUJBQW1CLEdBQUdGLGlCQUFpQixDQUFDRyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3RFO0lBQ0EsSUFBSTFGLFNBQVMsS0FBSyxpQkFBaUIsSUFBSXVGLGlCQUFpQixDQUFDSSxvQkFBb0IsQ0FBQyxDQUFDLElBQUlGLG1CQUFtQixFQUFFO01BQ3ZHSCwyQkFBMkIsR0FBR0csbUJBQW1CLENBQy9DRyxHQUFHLENBQUVsRCxRQUFRLElBQUtBLFFBQVEsQ0FBQ21ELE9BQU8sQ0FBQyxDQUNuQ0MsTUFBTSxDQUFFQyxNQUFNLElBQUtBLE1BQU0sS0FBS2pFLFNBQVMsQ0FBQyxDQUN4QzhELEdBQUcsQ0FBRUcsTUFBTSxJQUFLQyx5QkFBeUIsQ0FBQ0QsTUFBa0IsQ0FBQyxDQUFDLENBQzlERCxNQUFNLENBQUVHLFFBQVEsSUFBS0EsUUFBUSxJQUFJLENBQUNWLGlCQUFpQixDQUFDVyxtQkFBbUIsQ0FBQ0QsUUFBUSxDQUFDLENBQUMsQ0FDbEZMLEdBQUcsQ0FBRU8sSUFBSSxJQUFLQSxJQUFJLEVBQUUvQyxJQUFJLENBQUMsQ0FDekIwQyxNQUFNLENBQUUxQyxJQUFJLElBQUtBLElBQUksS0FBS3RCLFNBQVMsQ0FBYTtJQUNuRDtJQUNBb0QsVUFBVSxDQUFDa0IsZ0JBQWdCLENBQUMvRCxPQUFPLENBQUVLLFFBQWtCLElBQUs7TUFDM0Q7TUFDQSxNQUFNMkQsTUFBTSxHQUFHbEcsaUJBQWlCLENBQUNtRyxJQUFJLENBQUUzRSxNQUFNLElBQUs7UUFDakQsT0FBT0EsTUFBTSxDQUFDeUIsSUFBSSxLQUFLVixRQUFRLENBQUNVLElBQUk7TUFDckMsQ0FBQyxDQUFDO01BQ0Y7TUFDQSxJQUFJLENBQUNWLFFBQVEsQ0FBQzZELFVBQVUsSUFBSSxDQUFDRixNQUFNLElBQUksQ0FBQ2YsMkJBQTJCLENBQUNrQixRQUFRLENBQUM5RCxRQUFRLENBQUNVLElBQUksQ0FBQyxFQUFFO1FBQzVGLE1BQU1xRCxxQkFBMEMsR0FBR0Msd0JBQXdCLENBQzFFaEUsUUFBUSxDQUFDVSxJQUFJLEVBQ2JWLFFBQVEsRUFDUnhDLGdCQUFnQixFQUNoQixJQUFJLEVBQ0pGLFNBQ0QsQ0FBQztRQUNELE1BQU0yRyxvQkFBOEIsR0FBR0MsTUFBTSxDQUFDQyxJQUFJLENBQUNKLHFCQUFxQixDQUFDSyxVQUFVLENBQUM7UUFDcEYsTUFBTUMsdUJBQWlDLEdBQUdILE1BQU0sQ0FBQ0MsSUFBSSxDQUFDSixxQkFBcUIsQ0FBQ08sb0JBQW9CLENBQUM7UUFDakc7UUFDQUwsb0JBQW9CLENBQUN0RSxPQUFPLENBQUVlLElBQUksSUFBSztVQUN0QzZELGtEQUFrRCxDQUFDN0IscUNBQXFDLEVBQUVxQixxQkFBcUIsRUFBRXJELElBQUksQ0FBQztRQUN2SCxDQUFDLENBQUM7UUFFRixNQUFNOEQsVUFBVSxHQUFHQywrQkFBK0IsQ0FDakR6RSxRQUFRLEVBQ1J4QyxnQkFBZ0IsQ0FBQ2tILCtCQUErQixDQUFDMUUsUUFBUSxDQUFDMkUsa0JBQWtCLENBQUMsRUFDN0UzRSxRQUFRLENBQUNVLElBQUksRUFDYixJQUFJLEVBQ0osSUFBSSxFQUNKbUMsaUJBQWlCLEVBQ2pCckYsZ0JBQWdCLEVBQ2hCa0YscUNBQXFDLEVBQ3JDcEYsU0FBUyxFQUNUcUYsd0JBQXdCLEVBQ3hCRixpQkFBaUIsRUFDakJzQixxQkFDRCxDQUFDO1FBQ0QsSUFBSUUsb0JBQW9CLENBQUNXLE1BQU0sR0FBRyxDQUFDLEVBQUU7VUFDcENKLFVBQVUsQ0FBQ3JGLGFBQWEsR0FBRzhFLG9CQUFvQjtVQUMvQyxJQUFJRixxQkFBcUIsQ0FBQ25GLGNBQWMsQ0FBQ2lHLG9CQUFvQixFQUFFO1lBQzlETCxVQUFVLENBQUNNLDBCQUEwQixHQUFHZixxQkFBcUIsQ0FBQ25GLGNBQWMsQ0FBQ2lHLG9CQUFvQjtVQUNsRztVQUNBO1VBQ0FaLG9CQUFvQixDQUFDdEUsT0FBTyxDQUFFZSxJQUFJLElBQUs7WUFDdEM2QixrQkFBa0IsQ0FBQzdCLElBQUksQ0FBQyxHQUFHcUQscUJBQXFCLENBQUNLLFVBQVUsQ0FBQzFELElBQUksQ0FBQyxDQUFDcUUsa0JBQWtCO1VBQ3JGLENBQUMsQ0FBQztRQUNIO1FBQ0EsSUFBSVYsdUJBQXVCLENBQUNPLE1BQU0sR0FBRyxDQUFDLEVBQUU7VUFDdkNKLFVBQVUsQ0FBQ1EsdUJBQXVCLEdBQUdYLHVCQUF1QjtVQUM1RDtVQUNBQSx1QkFBdUIsQ0FBQzFFLE9BQU8sQ0FBRXNGLHNCQUFzQixJQUFLO1lBQzNEO1lBQ0ExQyxrQkFBa0IsQ0FBQzBDLHNCQUFzQixDQUFDLEdBQUdsQixxQkFBcUIsQ0FBQ08sb0JBQW9CLENBQUNXLHNCQUFzQixDQUFDO1VBQ2hILENBQUMsQ0FBQztRQUNIO1FBQ0F4SCxpQkFBaUIsQ0FBQ3lILElBQUksQ0FBQ1YsVUFBVSxDQUFDO01BQ25DO01BQ0E7TUFDQTtNQUNBO01BQ0EsSUFBSTdDLGNBQWMsQ0FBQzNCLFFBQVEsRUFBRXdDLFVBQVUsQ0FBQyxLQUFLLGFBQWEsRUFBRTtRQUMzREcsd0JBQXdCLEVBQUV3QyxxQkFBcUIsQ0FBQ0QsSUFBSSxDQUFDbEYsUUFBUSxDQUFDVSxJQUFJLENBQUM7UUFDbkUsSUFBSTBFLDBCQUEwQixDQUFDcEYsUUFBUSxFQUFFTSxXQUFXLEVBQUVDLE1BQU0sRUFBRThFLElBQUksQ0FBQyxFQUFFO1VBQ3BFNUgsaUJBQWlCLENBQUN5SCxJQUFJLENBQ3JCVCwrQkFBK0IsQ0FDOUJ6RSxRQUFRLEVBQ1J4QyxnQkFBZ0IsQ0FBQ2tILCtCQUErQixDQUFDMUUsUUFBUSxDQUFDMkUsa0JBQWtCLENBQUMsRUFDN0UzRSxRQUFRLENBQUNVLElBQUksRUFDYixLQUFLLEVBQ0wsS0FBSyxFQUNMbUMsaUJBQWlCLEVBQ2pCckYsZ0JBQWdCLEVBQ2hCa0YscUNBQXFDLEVBQ3JDcEYsU0FBUyxFQUNUcUYsd0JBQXdCLEVBQ3hCRixpQkFDRCxDQUNELENBQUM7UUFDRjtNQUNEO0lBQ0QsQ0FBQyxDQUFDO0lBQ0Y7SUFDQSxNQUFNNkMsY0FBYyxHQUFHQyxxQkFBcUIsQ0FDM0NoRCxrQkFBa0IsRUFDbEI5RSxpQkFBaUIsRUFDakJELGdCQUFnQixFQUNoQmdGLFVBQVUsRUFDVkUscUNBQXFDLEVBQ3JDcEYsU0FBUyxFQUNUbUYsaUJBQWlCLEVBQ2pCRSx3QkFDRCxDQUFDO0lBQ0QsT0FBT2xGLGlCQUFpQixDQUFDK0gsTUFBTSxDQUFDRixjQUFjLENBQUM7RUFDaEQsQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQWZBbkksUUFBQSxDQUFBbUYsd0JBQUEsR0FBQUEsd0JBQUE7RUFnQkEsTUFBTW1DLCtCQUErQixHQUFHLFNBQUFBLENBQ3ZDekUsUUFBa0IsRUFDbEJ5RixnQkFBd0IsRUFDeEJwRyxZQUFvQixFQUNwQnFHLGtCQUEyQixFQUMzQkMsc0JBQStCLEVBQy9COUMsaUJBQW9DLEVBQ3BDckYsZ0JBQXlELEVBQ3pEa0YscUNBQWtFLEVBQ2xFcEYsU0FBcUIsRUFDckJxRix3QkFBbUQsRUFDbkRGLGlCQUFnQyxFQUNoQ3NCLHFCQUEyQyxFQUMzQzZCLHlCQUFrQyxFQUNWO0lBQ3hCLE1BQU1DLDRCQUE0QixHQUFHQyxxQkFBcUIsQ0FBQ3RJLGdCQUFnQixFQUFFd0MsUUFBUSxDQUFDO0lBQ3RGLE1BQU0rRixRQUFRLEdBQUdDLG1DQUFtQyxDQUFDaEcsUUFBUSxDQUFDO0lBQzlELE1BQU1pRyxTQUE2QixHQUFHakcsUUFBUSxDQUFDVSxJQUFJLEdBQUd3RixhQUFhLENBQUNsRyxRQUFRLENBQUNVLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLEdBQUd0QixTQUFTO0lBQzNHLE1BQU0rRyxPQUFnQixHQUFHRixTQUFTLElBQUlqRyxRQUFRLENBQUNVLElBQUk7SUFDbkQsTUFBTTBGLEtBQUssR0FBR0MsUUFBUSxDQUFDckcsUUFBUSxFQUFFbUcsT0FBTyxDQUFDO0lBQ3pDLE1BQU1HLFFBQVEsR0FBR0Msb0JBQW9CLENBQUN2RyxRQUFRLENBQUM7SUFDL0MsTUFBTXdHLGtCQUFrQixHQUFHQyxhQUFhLENBQUN6RyxRQUFRLEVBQUVzRyxRQUFRLENBQUM7SUFDNUQsTUFBTUksaUNBQWlDLEdBQUdoRSxxQ0FBcUMsQ0FBQ3JELFlBQVksQ0FBQyxLQUFLLGFBQWE7SUFDL0csTUFBTXNILFFBQVEsR0FDYixDQUFDLENBQUNaLFFBQVEsSUFBSVcsaUNBQWlDLEtBQUssQ0FBQy9ELHdCQUF3QixFQUFFd0MscUJBQXFCLENBQUNyQixRQUFRLENBQUN6RSxZQUFZLENBQUM7SUFDNUgsTUFBTXVILFVBQVUsR0FBRyxDQUFDakUsd0JBQXdCLEVBQUVrRSx1QkFBdUIsQ0FBQy9DLFFBQVEsQ0FBQ3pFLFlBQVksQ0FBQztJQUM1RixNQUFNeUgsU0FBUyxHQUNkakUsaUJBQWlCLENBQUNJLG9CQUFvQixDQUFDLENBQUMsSUFBSTNGLFNBQVMsS0FBSyxpQkFBaUIsR0FDeEUsQ0FBQyxDQUFDdUYsaUJBQWlCLENBQUNXLG1CQUFtQixDQUFDeEQsUUFBUSxDQUFDLEdBQ2pEMkcsUUFBUTtJQUNaLE1BQU1JLFVBQVUsR0FBRztNQUNsQkMsU0FBUyxFQUFFaEgsUUFBUSxDQUFDcUMsSUFBSSxJQUFJaUUsUUFBUTtNQUNwQzNILGFBQWEsRUFBRTZILGtCQUFrQixDQUFDN0gsYUFBYTtNQUMvQ3NJLFdBQVcsRUFBRVQsa0JBQWtCLENBQUNTO0lBQ2pDLENBQUM7SUFDRCxJQUFJckksY0FBOEMsR0FBRyxJQUFJO0lBQ3pELElBQUlzSSxtQkFBbUIsQ0FBQ2xILFFBQVEsQ0FBQyxFQUFFO01BQ2xDcEIsY0FBYyxHQUFHdUksMEJBQTBCLENBQUNuSCxRQUFRLEVBQUUrRCxxQkFBcUIsQ0FBQztJQUM3RTtJQUNBLE1BQU12RixZQUFZLEdBQUcsQ0FBQ3VILFFBQVEsSUFBSUosc0JBQXNCLEdBQUcsWUFBWSxHQUFHLFFBQVE7SUFDbEYsTUFBTXlCLGlDQUF1RCxHQUFHQyxxQ0FBcUMsQ0FBQ2hJLFlBQVksRUFBRTdCLGdCQUFnQixDQUFDO0lBQ3JJLElBQUlvSSx5QkFBeUIsRUFBRTtNQUM5QnZHLFlBQVksR0FBR3VHLHlCQUF5QjtJQUN6QztJQUNBLE1BQU1sRixJQUFJLEdBQUdnRixrQkFBa0IsR0FBR3JHLFlBQVksR0FBRyxhQUFhQSxZQUFZLEVBQUU7SUFDNUUsTUFBTWlJLEdBQUcsR0FBRyxDQUFDNUIsa0JBQWtCLEdBQUcsYUFBYSxHQUFHLFlBQVksSUFBSTZCLG1CQUFtQixDQUFDbEksWUFBWSxDQUFDO0lBRW5HLE1BQU1KLE1BQTZCLEdBQUc7TUFDckNxSSxHQUFHLEVBQUVBLEdBQUc7TUFDUmpGLElBQUksRUFBRW5GLFVBQVUsQ0FBQ3NLLFVBQVU7TUFDM0JsQixRQUFRLEVBQUVBLFFBQVEsSUFBSXRHLFFBQVEsQ0FBQ3FDLElBQUk7TUFDbkMrRCxLQUFLLEVBQUVBLEtBQUssSUFBSXBHLFFBQVEsQ0FBQ1UsSUFBSTtNQUM3QitHLFVBQVUsRUFBRXRCLE9BQU8sR0FBR0UsUUFBUSxDQUFDckcsUUFBUSxDQUFDLEdBQUdaLFNBQVM7TUFDcERzSSxLQUFLLEVBQUV2QixPQUFPLEdBQUdGLFNBQVMsR0FBRzdHLFNBQVM7TUFDdEN1SSxjQUFjLEVBQUVsQyxnQkFBZ0I7TUFDaENtQyxrQkFBa0IsRUFBRS9CLDRCQUE0QjtNQUNoRHJILFlBQVksRUFBRUEsWUFBWTtNQUMxQmtDLElBQUksRUFBRUEsSUFBSTtNQUNWckIsWUFBWSxFQUFFQSxZQUFZO01BQzFCc0gsUUFBUSxFQUFFQSxRQUFRO01BQ2xCQyxVQUFVLEVBQUVBLFVBQVU7TUFDdEJpQixXQUFXLEVBQUVmLFNBQVM7TUFDdEJnQixLQUFLLEVBQUU5SCxRQUFRLENBQUM4SCxLQUFLO01BQ3JCbEosY0FBYyxFQUFFQSxjQUFjO01BQzlCbUosYUFBYSxFQUFFQyx3QkFBd0IsQ0FBQ3hLLGdCQUFnQixDQUFDO01BQ3pEdUosVUFBVSxFQUFFQSxVQUFnQztNQUM1Q3pJLFVBQVUsRUFBRTJKLGFBQWEsQ0FBQ3pLLGdCQUFnQixFQUFFd0MsUUFBUSxDQUFDTSxXQUFXLEVBQUU0SCxFQUFFLEVBQUVDLGdCQUFnQixDQUFDO01BQ3ZGQyxRQUFRLEVBQUVDLGdCQUFnQixDQUFDN0ssZ0JBQWdCLEVBQUV3QyxRQUFRLEVBQUV5QyxpQkFBaUIsQ0FBQztNQUN6RTZGLGdCQUFnQixFQUFFbEI7SUFDbkIsQ0FBQztJQUNEbUIsV0FBVyxDQUFDdkksUUFBUSxFQUFFZixNQUFNLENBQUM7SUFDN0J1Siw4QkFBOEIsQ0FBQ3hJLFFBQVEsRUFBRWYsTUFBTSxDQUFDO0lBRWhELElBQ0M0RCxpQkFBaUIsQ0FBQ0ksb0JBQW9CLENBQUMsQ0FBQyxJQUN4Q3dGLFdBQVcsQ0FBQ0MsMEJBQTBCLENBQUNsTCxnQkFBZ0IsQ0FBQ2tDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxLQUNoRkwsWUFBWSxLQUFLLGlCQUFpQixJQUFJQSxZQUFZLEtBQUssZ0JBQWdCLElBQUlBLFlBQVksS0FBSyxnQkFBZ0IsQ0FBQyxFQUM3RztNQUNEO01BQ0E7TUFDQUosTUFBTSxDQUFDMEosU0FBUyxHQUFHO1FBQ2xCQyx1QkFBdUIsRUFBRSxLQUFLO1FBQzlCQyxvQkFBb0IsRUFBRTtNQUN2QixDQUFDO0lBQ0Y7SUFDQSxPQUFPNUosTUFBTTtFQUNkLENBQUM7O0VBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTWtJLDBCQUEwQixHQUFHLFNBQUFBLENBQ2xDbEksTUFBeUMsRUFDekM4RSxxQkFBMkMsRUFDcEI7SUFDdkIsSUFBSStFLFlBQVksRUFBRTNJLGdCQUFnQixFQUFFc0IsUUFBUSxFQUFFZCxZQUFZLEVBQUVvSSxHQUFHLEVBQUVDLFdBQVcsRUFBRUMsZ0JBQWdCLEVBQUVDLEtBQUs7SUFDckcsTUFBTWpGLG9CQUFvQixHQUFHRixxQkFBcUIsR0FBR0csTUFBTSxDQUFDQyxJQUFJLENBQUNKLHFCQUFxQixDQUFDSyxVQUFVLENBQUMsR0FBRyxFQUFFO0lBQ3ZHLElBQUlMLHFCQUFxQixJQUFJRSxvQkFBb0IsRUFBRVcsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUNoRTtNQUNBO01BQ0EzRixNQUFNLEdBQUc4RSxxQkFBcUIsQ0FBQ0ssVUFBVSxDQUFDSCxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDYyxrQkFBa0I7SUFDdEY7SUFDQSxNQUFNdUIsUUFBUSxHQUFHQyxvQkFBb0IsQ0FBQ3RILE1BQU0sQ0FBQztJQUM3QyxJQUFJa0ssVUFBVSxDQUFDbEssTUFBTSxDQUFDLEVBQUU7TUFDdkI2SixZQUFZLEdBQUdNLHlCQUF5QixDQUFDbkssTUFBTSxDQUFDO01BQ2hEZ0ssZ0JBQWdCLEdBQUdJLDZCQUE2QixDQUFDcEssTUFBTSxDQUFDO01BQ3hEa0IsZ0JBQWdCLEdBQUdDLDZCQUE2QixDQUFDbkIsTUFBTSxDQUFDO01BQ3hEd0MsUUFBUSxHQUFHNkgsdUJBQXVCLENBQUNySyxNQUFNLENBQUM7TUFDMUMwQixZQUFZLEdBQUc0SSxpQkFBaUIsQ0FBQ3RLLE1BQU0sQ0FBQztNQUN4QytKLFdBQVcsR0FBR1EsVUFBVSxDQUFDdkssTUFBTSxDQUFDO01BQ2hDaUssS0FBSyxHQUFHakssTUFBTSxDQUFDaUssS0FBSztJQUNyQjtJQUNBSixZQUFZLEdBQUcvRSxxQkFBcUIsRUFBRW5GLGNBQWMsRUFBRWtLLFlBQVksSUFBSUEsWUFBWSxFQUFFcEksSUFBSSxJQUFJdUksZ0JBQWdCLEVBQUV2SSxJQUFJO0lBQ2xIUCxnQkFBZ0IsR0FBRzRELHFCQUFxQixFQUFFbkYsY0FBYyxFQUFFdUIsZ0JBQWdCLElBQUlBLGdCQUFnQixFQUFFTyxJQUFJO0lBQ3BHd0ksS0FBSyxHQUFHbkYscUJBQXFCLEVBQUVuRixjQUFjLEVBQUVzSyxLQUFLLElBQUlBLEtBQUs7SUFDN0QsTUFBTU8sVUFBVSxHQUFHQyxpQkFBaUIsQ0FBQ3BELFFBQVEsRUFBRTBDLFdBQVcsRUFBRSxDQUFDLENBQUNDLGdCQUFnQixFQUFFbEYscUJBQXFCLEVBQUVuRixjQUFjLENBQUM7SUFDdEgsSUFBSXVCLGdCQUFnQixJQUFLc0osVUFBVSxLQUFLLFVBQVUsSUFBSSxDQUFDOUksWUFBYSxFQUFFO01BQ3JFb0ksR0FBRyxHQUFHLEtBQUs7SUFDWjtJQUNBLE1BQU1uSyxjQUFvQyxHQUFHO01BQzVDeUQsSUFBSSxFQUFFb0gsVUFBVTtNQUNoQkUsV0FBVyxFQUFFQyxrQkFBa0IsQ0FBQ3RELFFBQVEsQ0FBQztNQUN6Q3VELFNBQVMsRUFBRUMsWUFBWSxDQUFDeEQsUUFBUSxDQUFDO01BQ2pDNEMsS0FBSyxFQUFFQSxLQUFLO01BQ1pKLFlBQVksRUFBRUEsWUFBWTtNQUMxQnpILElBQUksRUFBRTBDLHFCQUFxQixFQUFFbkYsY0FBYyxDQUFDeUMsSUFBSSxJQUFJSSxRQUFRO01BQzVEdEIsZ0JBQWdCLEVBQUVBLGdCQUFnQjtNQUNsQ0UsUUFBUSxFQUFFMEQscUJBQXFCLEVBQUVuRixjQUFjLENBQUN5QixRQUFRLElBQUlNLFlBQVksRUFBRUMsUUFBUSxDQUFDLENBQUM7TUFDcEZtSixRQUFRLEVBQUVoRyxxQkFBcUIsRUFBRW5GLGNBQWMsQ0FBQ21MLFFBQVE7TUFDeEQ7TUFDQUMsSUFBSSxFQUFFakcscUJBQXFCLEVBQUVuRixjQUFjLENBQUNvTCxJQUFJO01BQ2hEakIsR0FBRyxFQUFFQSxHQUFHO01BQ1IvSSxRQUFRLEVBQUUrRCxxQkFBcUIsRUFBRW5GLGNBQWMsQ0FBQ29CO0lBQ2pELENBQUM7SUFDRCxJQUFJcEIsY0FBYyxDQUFDa0ssWUFBWSxJQUFJbEssY0FBYyxDQUFDeUMsSUFBSSxFQUFFO01BQ3ZEekMsY0FBYyxDQUFDcUwsU0FBUyxHQUFHLElBQUk7SUFDaEM7SUFDQSxPQUFPQyxpQ0FBaUMsQ0FBQ3RMLGNBQWMsQ0FBQztFQUN6RCxDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxNQUFNZ0wsa0JBQWtCLEdBQUcsU0FBQUEsQ0FBVXRELFFBQWlCLEVBQXNCO0lBQzNFLE9BQU9BLFFBQVEsS0FBSyxVQUFVLEdBQUcsWUFBWSxHQUFHbEgsU0FBUztFQUMxRCxDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLE1BQU0wSyxZQUFZLEdBQUcsU0FBQUEsQ0FBVXhELFFBQWlCLEVBQXVCO0lBQ3RFLE9BQU9BLFFBQVEsS0FBSyxXQUFXLEdBQUcsSUFBSSxHQUFHbEgsU0FBUztFQUNuRCxDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxNQUFNOEssaUNBQWlDLEdBQUcsU0FBQUEsQ0FBVXRMLGNBQW9DLEVBQXdCO0lBQy9HO0lBQ0EsS0FBSyxNQUFNdUwsT0FBTyxJQUFJdkwsY0FBYyxFQUFFO01BQ3JDLElBQUlBLGNBQWMsQ0FBQ3VMLE9BQU8sQ0FBK0IsS0FBSy9LLFNBQVMsRUFBRTtRQUN4RSxPQUFPUixjQUFjLENBQUN1TCxPQUFPLENBQStCO01BQzdEO0lBQ0Q7SUFDQSxPQUFPdkwsY0FBYztFQUN0QixDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTc0ksbUJBQW1CQSxDQUFDa0QsTUFBeUMsRUFBVztJQUNoRixJQUFJQyxZQUFZLEVBQUVySyxRQUFRO0lBQzFCLE1BQU1zSyx3QkFBd0IsR0FBSUYsTUFBTSxDQUFjOUosV0FBVyxDQUFDNEgsRUFBRSxFQUFFQyxnQkFBZ0I7SUFDdEYsSUFBSWdCLFVBQVUsQ0FBQ2lCLE1BQU0sQ0FBQyxFQUFFO01BQ3ZCLElBQUlwRSxtQ0FBbUMsQ0FBQ29FLE1BQU0sQ0FBQyxFQUFFO1FBQ2hELE9BQU8sS0FBSztNQUNiO01BQ0FDLFlBQVksR0FBR0Msd0JBQXdCLEVBQUVDLEtBQUs7SUFDL0MsQ0FBQyxNQUFNLElBQUl2RSxtQ0FBbUMsQ0FBQ29FLE1BQU0sQ0FBQyxFQUFFO01BQ3ZELE9BQU8sS0FBSztJQUNiLENBQUMsTUFBTTtNQUNOcEssUUFBUSxHQUFHb0ssTUFBTTtNQUNqQkMsWUFBWSxHQUFHckssUUFBUSxDQUFDdUssS0FBSztNQUM3QixJQUFJRixZQUFZLHdEQUE2QyxJQUFLckssUUFBUSxDQUE0QndLLE1BQU0sRUFBRXJILE9BQU8sRUFBRW9ILEtBQUssRUFBRTtRQUM3SDtRQUNBRixZQUFZLEdBQUlySyxRQUFRLENBQTRCd0ssTUFBTSxFQUFFckgsT0FBTyxFQUFFb0gsS0FBSztRQUMxRSxPQUFPRixZQUFZLEtBQUtqTCxTQUFTLElBQUksQ0FBQyxpREFBc0MwRSxRQUFRLENBQUN1RyxZQUFZLENBQUM7TUFDbkcsQ0FBQyxNQUFNLElBQ0xySyxRQUFRLENBQWV5SyxLQUFLLEVBQUV0SCxPQUFPLEVBQUU3QyxXQUFXLEVBQUVvSyxJQUFJLEVBQUVDLFNBQVMsRUFBRUMsSUFBSSxLQUFLLDZCQUE2QixJQUMzRzVLLFFBQVEsQ0FBZXlLLEtBQUssRUFBRXRILE9BQU8sRUFBRTdDLFdBQVcsRUFBRW9LLElBQUksRUFBRUcsS0FBSyxLQUFLLElBQUksRUFDeEU7UUFDRDtRQUNBLE9BQU8sS0FBSztNQUNiO0lBQ0Q7SUFDQSxPQUFPUixZQUFZLEdBQ2hCLENBQUMsdUtBSUEsQ0FBQ3ZHLFFBQVEsQ0FBQ3VHLFlBQVksQ0FBQyxHQUN4QixJQUFJO0VBQ1I7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLE1BQU1TLGNBQWMsR0FBRyxTQUFBQSxDQUFVQyxTQUFpQyxFQUFXO0lBQzVFLFFBQVFBLFNBQVMsQ0FBQ1IsS0FBSztNQUN0QjtNQUNBO1FBQ0MsT0FBTyxDQUFDLENBQUNRLFNBQVMsQ0FBQ0MsTUFBTTtNQUMxQjtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7UUFDQyxPQUFPLElBQUk7TUFDWjtRQUNDO1FBQ0E7UUFDQSxPQUFPLEtBQUs7SUFDZDtFQUNELENBQUM7O0VBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxTQUFBQSxDQUM3QkMsa0JBQW9GLEVBQ2hEO0lBQ3BDLE1BQU1qTCxZQUFZLEdBQUdpTCxrQkFBa0IsQ0FBQ2pMLFlBQVk7SUFDcEQsSUFBSWtMLGFBQWE7SUFDakIsSUFBSWxMLFlBQVksRUFBRTtNQUNqQixRQUFRQSxZQUFZLENBQUNzSyxLQUFLO1FBQ3pCO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtVQUNDWSxhQUFhLEdBQUdsTCxZQUFZLENBQUN3SyxLQUFLLENBQUN0SCxPQUFPO1VBQzFDO1FBQ0Q7VUFDQztVQUNBLElBQUlsRCxZQUFZLEVBQUV1SyxNQUFNLEVBQUVySCxPQUFPLEVBQUVvSCxLQUFLLCtDQUFvQyxFQUFFO1lBQzdFWSxhQUFhLEdBQUdsTCxZQUFZLENBQUN1SyxNQUFNLENBQUNySCxPQUFPLEVBQUVzSCxLQUFLLENBQUN0SCxPQUFPO1VBQzNEO1VBQ0E7UUFDRDtRQUNBO1FBQ0E7VUFDQ2dJLGFBQWEsR0FBRy9MLFNBQVM7TUFDM0I7SUFDRDtJQUNBLE1BQU1nTSwrQkFBK0IsR0FBRyxnREFBaURDLFFBQVEsQ0FBQyxLQUFLLENBQUM7SUFDeEcsTUFBTUMsZ0JBQWdCLEdBQUcseURBQTBERCxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQ2xHO0lBQ0E7SUFDQTtJQUNBO0lBQ0EsT0FBT0UsR0FBRyxDQUNULEdBQUcsQ0FDRkMsR0FBRyxDQUFDQyxLQUFLLENBQUNDLDJCQUEyQixDQUFDekwsWUFBWSxFQUFFSyxXQUFXLEVBQUU0SCxFQUFFLEVBQUV5RCxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUNwRkMsTUFBTSxDQUNMLENBQUMsQ0FBQ1QsYUFBYSxFQUNmQSxhQUFhLElBQUlLLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDQywyQkFBMkIsQ0FBQ1AsYUFBYSxDQUFDN0ssV0FBVyxFQUFFNEgsRUFBRSxFQUFFeUQsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFDckcsSUFDRCxDQUFDLEVBQ0RFLEVBQUUsQ0FBQ0wsR0FBRyxDQUFDSiwrQkFBK0IsQ0FBQyxFQUFFRSxnQkFBZ0IsQ0FBQyxDQUU1RCxDQUFDO0VBQ0YsQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTVEsK0JBQStCLEdBQUcsU0FBQUEsQ0FBVUMsY0FBc0MsRUFBZ0Q7SUFDdkksTUFBTUMsMkJBQWdFLEdBQUcsRUFBRTtJQUMzRSxJQUNDRCxjQUFjLENBQUN4QixLQUFLLHdEQUE2QyxJQUNqRXdCLGNBQWMsQ0FBQ3ZCLE1BQU0sRUFBRXJILE9BQU8sRUFBRW9ILEtBQUssZ0RBQXFDLEVBQ3pFO01BQ0QsSUFBSXdCLGNBQWMsRUFBRXpMLFdBQVcsRUFBRTRILEVBQUUsRUFBRXlELE1BQU0sRUFBRTtRQUM1QyxPQUFPTSxpQkFBaUIsQ0FBQ1QsR0FBRyxDQUFDQyxLQUFLLENBQUNDLDJCQUEyQixDQUFDSyxjQUFjLENBQUN6TCxXQUFXLENBQUM0SCxFQUFFLENBQUN5RCxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO01BQzlHLENBQUMsTUFBTTtRQUNOSSxjQUFjLENBQUN2QixNQUFNLENBQUNySCxPQUFPLENBQUMrSSxJQUFJLEVBQUV2TSxPQUFPLENBQUV3TSxjQUEyRCxJQUFLO1VBQzVHSCwyQkFBMkIsQ0FBQzlHLElBQUksQ0FDL0IrRixxQkFBcUIsQ0FBQztZQUFFaEwsWUFBWSxFQUFFa007VUFBZSxDQUVwRCxDQUNGLENBQUM7UUFDRixDQUFDLENBQUM7UUFDRixPQUFPRixpQkFBaUIsQ0FBQ0wsTUFBTSxDQUFDQyxFQUFFLENBQUMsR0FBR0csMkJBQTJCLENBQUMsRUFBRVgsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFQSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztNQUN0RztJQUNELENBQUMsTUFBTTtNQUNOLE9BQU9qTSxTQUFTO0lBQ2pCO0VBQ0QsQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxNQUFNaUgsUUFBUSxHQUFHLFNBQUFBLENBQVVyRyxRQUFnRSxFQUF1QztJQUFBLElBQXJDbUcsT0FBTyxHQUFBaUcsU0FBQSxDQUFBeEgsTUFBQSxRQUFBd0gsU0FBQSxRQUFBaE4sU0FBQSxHQUFBZ04sU0FBQSxNQUFHLEtBQUs7SUFDM0csSUFBSSxDQUFDcE0sUUFBUSxFQUFFO01BQ2QsT0FBT1osU0FBUztJQUNqQjtJQUNBLElBQUkrSixVQUFVLENBQUNuSixRQUFRLENBQUMsSUFBSXFNLG9CQUFvQixDQUFDck0sUUFBUSxDQUFDLEVBQUU7TUFDM0QsTUFBTXNNLGdCQUFnQixHQUFJdE0sUUFBUSxDQUFjTSxXQUFXLEVBQUU0SCxFQUFFLEVBQUVDLGdCQUFnQjtNQUNqRixJQUFJbUUsZ0JBQWdCLElBQUksQ0FBQ0EsZ0JBQWdCLENBQUNDLFNBQVMsSUFBSUQsZ0JBQWdCLENBQUNFLEtBQUssRUFBRTtRQUM5RSxPQUFPRixnQkFBZ0IsQ0FBQ0UsS0FBSyxFQUFFNUwsUUFBUSxDQUFDLENBQUM7TUFDMUM7TUFDQSxPQUFPWixRQUFRLENBQUNNLFdBQVcsQ0FBQ0MsTUFBTSxFQUFFaU0sS0FBSyxFQUFFNUwsUUFBUSxDQUFDLENBQUMsSUFBSVosUUFBUSxDQUFDVSxJQUFJO0lBQ3ZFLENBQUMsTUFBTSxJQUFJK0wsZ0JBQWdCLENBQUN6TSxRQUFRLENBQUMsRUFBRTtNQUN0QyxJQUFJLENBQUMsQ0FBQ21HLE9BQU8sSUFBSW5HLFFBQVEsQ0FBQ3VLLEtBQUssb0VBQXlELEVBQUU7UUFDekYsT0FBT3ZLLFFBQVEsRUFBRXdNLEtBQUssRUFBRTVMLFFBQVEsQ0FBQyxDQUFDO01BQ25DO01BQ0EsT0FDQ1osUUFBUSxFQUFFd00sS0FBSyxFQUFFNUwsUUFBUSxDQUFDLENBQUMsSUFDM0JxTCxpQkFBaUIsQ0FDaEJQLDJCQUEyQixDQUFDMUwsUUFBUSxDQUFDeUssS0FBSyxFQUFFdEgsT0FBTyxFQUFFN0MsV0FBVyxFQUFFQyxNQUFNLEVBQUVpTSxLQUFLLEVBQUUsRUFBRSxFQUFFeE0sUUFBUSxDQUFDeUssS0FBSyxFQUFFdEgsT0FBTyxFQUFFekMsSUFBSSxDQUNuSCxDQUFDO0lBRUgsQ0FBQyxNQUFNLElBQUlWLFFBQVEsQ0FBQ3VLLEtBQUssd0RBQTZDLEVBQUU7TUFDdkUsT0FDQ3ZLLFFBQVEsQ0FBQ3dNLEtBQUssRUFBRTVMLFFBQVEsQ0FBQyxDQUFDLElBQzFCcUwsaUJBQWlCLENBQ2hCUCwyQkFBMkIsQ0FBRTFMLFFBQVEsQ0FBQ3dLLE1BQU0sRUFBRXJILE9BQU8sRUFBZ0JzSCxLQUFLLEVBQUV0SCxPQUFPLEVBQUU3QyxXQUFXLEVBQUVDLE1BQU0sRUFBRWlNLEtBQUssRUFBRUUsT0FBTyxDQUFDLENBQUMsQ0FDM0gsQ0FBQztJQUVILENBQUMsTUFBTTtNQUNOLE9BQU8xTSxRQUFRLENBQUN3TSxLQUFLLEVBQUU1TCxRQUFRLENBQUMsQ0FBQztJQUNsQztFQUNELENBQUM7RUFFRCxNQUFNK0wsV0FBVyxHQUFHLFNBQUFBLENBQVV2QyxNQUF5QyxFQUFzQjtJQUM1RixJQUFJLENBQUNBLE1BQU0sRUFBRTtNQUNaLE9BQU9oTCxTQUFTO0lBQ2pCO0lBQ0EsSUFBSStKLFVBQVUsQ0FBQ2lCLE1BQU0sQ0FBQyxJQUFJQSxNQUFNLENBQUM5SixXQUFXLEVBQUVDLE1BQU0sRUFBRXFNLFNBQVMsRUFBRTtNQUNoRSxPQUFPeEMsTUFBTSxDQUFDOUosV0FBVyxFQUFFQyxNQUFNLEVBQUVxTSxTQUFTLEdBQ3pDWCxpQkFBaUIsQ0FBQ1AsMkJBQTJCLENBQUN0QixNQUFNLENBQUM5SixXQUFXLENBQUNDLE1BQU0sQ0FBQ3FNLFNBQVMsQ0FBQyxDQUFDLEdBQ25GeE4sU0FBUztJQUNiLENBQUMsTUFBTSxJQUFJcU4sZ0JBQWdCLENBQUNyQyxNQUFNLENBQUMsRUFBRTtNQUNwQyxPQUFPQSxNQUFNLENBQUNLLEtBQUssRUFBRXRILE9BQU8sRUFBRTdDLFdBQVcsRUFBRUMsTUFBTSxFQUFFcU0sU0FBUyxHQUN6RFgsaUJBQWlCLENBQUNQLDJCQUEyQixDQUFDdEIsTUFBTSxDQUFDSyxLQUFLLENBQUN0SCxPQUFPLENBQUM3QyxXQUFXLENBQUNDLE1BQU0sQ0FBQ3FNLFNBQVMsQ0FBQyxDQUFDLEdBQ2pHeE4sU0FBUztJQUNiLENBQUMsTUFBTSxJQUFJZ0wsTUFBTSxDQUFDRyxLQUFLLHdEQUE2QyxFQUFFO01BQ3JFLE1BQU1zQyxlQUFlLEdBQUd6QyxNQUFNLENBQUNJLE1BQU0sRUFBRXJILE9BQW9CO01BQzNELE9BQU8wSixlQUFlLEVBQUVwQyxLQUFLLEVBQUV0SCxPQUFPLEVBQUU3QyxXQUFXLEVBQUVDLE1BQU0sRUFBRXFNLFNBQVMsR0FDbkVYLGlCQUFpQixDQUFDUCwyQkFBMkIsQ0FBQ21CLGVBQWUsQ0FBQ3BDLEtBQUssQ0FBQ3RILE9BQU8sQ0FBQzdDLFdBQVcsQ0FBQ0MsTUFBTSxDQUFDcU0sU0FBUyxDQUFDLENBQUMsR0FDMUd4TixTQUFTO0lBQ2IsQ0FBQyxNQUFNO01BQ04sT0FBT0EsU0FBUztJQUNqQjtFQUNELENBQUM7RUFFTSxTQUFTME4sc0JBQXNCQSxDQUFDQyxPQUFlLEVBQUVDLHlCQUFtQyxFQUFxQztJQUMvSCxPQUFPQyxZQUFZLENBQ2xCLENBQ0NDLFdBQVcsQ0FBQyw4QkFBOEIsRUFBRSxVQUFVLENBQUMsRUFDdkRBLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRSxVQUFVLENBQUMsRUFDM0NILE9BQU8sRUFDUEMseUJBQXlCLENBQ3pCLEVBQ0RHLGVBQWUsQ0FBQ0MscUNBQ2pCLENBQUM7RUFDRjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBVkFqUSxRQUFBLENBQUEyUCxzQkFBQSxHQUFBQSxzQkFBQTtFQVdBLE1BQU12SCxxQkFBcUIsR0FBRyxTQUFBQSxDQUM3QmhELGtCQUE0QyxFQUM1QzhLLGVBQXdDLEVBQ3hDN1AsZ0JBQXlELEVBQ3pEZ0YsVUFBc0IsRUFDdEJFLHFDQUFrRSxFQUNsRXBGLFNBQXFCLEVBQ3JCbUYsaUJBQWdDLEVBQ2hDRSx3QkFBbUQsRUFDekI7SUFDMUIsTUFBTTJDLGNBQXVDLEdBQUcsRUFBRTtJQUNsRCxNQUFNZ0ksc0JBQThDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pELE1BQU16SyxpQkFBaUIsR0FBRyxJQUFJQyxpQkFBaUIsQ0FBQ04sVUFBVSxFQUFFaEYsZ0JBQWdCLENBQUM7SUFDN0UwRyxNQUFNLENBQUNDLElBQUksQ0FBQzVCLGtCQUFrQixDQUFDLENBQUM1QyxPQUFPLENBQUVlLElBQUksSUFBSztNQUNqRCxNQUFNVixRQUFRLEdBQUd1QyxrQkFBa0IsQ0FBQzdCLElBQUksQ0FBQztRQUN4Q2lILGNBQWMsR0FBR25LLGdCQUFnQixDQUFDK1AseUJBQXlCLENBQUM3TSxJQUFJLENBQUM7UUFDakU7UUFDQThNLGFBQWEsR0FBR0gsZUFBZSxDQUFDck8sSUFBSSxDQUFFQyxNQUFNLElBQUtBLE1BQU0sQ0FBQ3lCLElBQUksS0FBS0EsSUFBSSxDQUFDO01BQ3ZFLE1BQU1uQixtQkFBbUIsR0FBRy9CLGdCQUFnQixDQUFDZ0Msc0JBQXNCLENBQUNoQyxnQkFBZ0IsQ0FBQ2lDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQ0Msc0JBQXNCLENBQUMsQ0FBQztNQUMvSCxNQUFNK04sa0JBQWtCLEdBQUcxTixvQkFBb0IsQ0FBd0JSLG1CQUFtQixFQUFFbUIsSUFBSSxDQUFDO01BQ2pHLElBQUlnTixpQkFBaUIsQ0FBQ0Qsa0JBQWtCLENBQUMsRUFBRTtRQUMxQyxNQUFNRSx5QkFBeUIsR0FBR3hNLGtDQUFrQyxDQUFDc00sa0JBQWtCLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQztRQUNyRyxNQUFNeE8sTUFBTSxHQUFHd0YsK0JBQStCLENBQzdDekUsUUFBUSxFQUNSMkgsY0FBYyxFQUNkakgsSUFBSSxFQUNKLElBQUksRUFDSixLQUFLLEVBQ0xtQyxpQkFBaUIsRUFDakJyRixnQkFBZ0IsRUFDaEJrRixxQ0FBcUMsRUFDckNwRixTQUFTLEVBQ1RxRix3QkFBd0IsRUFDeEJGLGlCQUFpQixFQUNqQnJELFNBQVMsRUFDVHVPLHlCQUNELENBQUM7UUFDREMsNkJBQTZCLENBQUNQLGVBQWUsRUFBRTNNLElBQUksRUFBRXpCLE1BQU0sQ0FBQztRQUM1RHFHLGNBQWMsQ0FBQ0osSUFBSSxDQUFDakcsTUFBTSxDQUFDO1FBQzNCcU8sc0JBQXNCLENBQUM1TSxJQUFJLENBQUMsR0FBR2lOLHlCQUF5QixJQUFJak4sSUFBSTtNQUNqRSxDQUFDLE1BQU0sSUFBSThNLGFBQWEsS0FBS3BPLFNBQVMsRUFBRTtRQUN2QztRQUNBO1FBQ0EsTUFBTUgsTUFBTSxHQUFHd0YsK0JBQStCLENBQzdDekUsUUFBUSxFQUNSMkgsY0FBYyxFQUNkakgsSUFBSSxFQUNKLElBQUksRUFDSixLQUFLLEVBQ0xtQyxpQkFBaUIsRUFDakJyRixnQkFBZ0IsRUFDaEJrRixxQ0FBcUMsRUFDckNwRixTQUFTLEVBQ1RxRix3QkFBd0IsRUFDeEJGLGlCQUNELENBQUM7UUFDRG1MLDZCQUE2QixDQUFDUCxlQUFlLEVBQUUzTSxJQUFJLEVBQUV6QixNQUFNLENBQUM7UUFDNURxRyxjQUFjLENBQUNKLElBQUksQ0FBQ2pHLE1BQU0sQ0FBQztNQUM1QixDQUFDLE1BQU0sSUFBSXVPLGFBQWEsQ0FBQzdGLGNBQWMsS0FBS0EsY0FBYyxJQUFJNkYsYUFBYSxDQUFDck8sYUFBYSxFQUFFO1FBQzFGO1FBQ0E7UUFDQSxNQUFNME8sT0FBTyxHQUFHLGFBQWFuTixJQUFJLEVBQUU7UUFDbkM7UUFDQSxJQUFJLENBQUMyTSxlQUFlLENBQUN6SixJQUFJLENBQUUzRSxNQUFNLElBQUtBLE1BQU0sQ0FBQ3lCLElBQUksS0FBS21OLE9BQU8sQ0FBQyxFQUFFO1VBQy9EO1VBQ0E7VUFDQSxNQUFNNU8sTUFBTSxHQUFHd0YsK0JBQStCLENBQzdDekUsUUFBUSxFQUNSMkgsY0FBYyxFQUNkakgsSUFBSSxFQUNKLEtBQUssRUFDTCxLQUFLLEVBQ0xtQyxpQkFBaUIsRUFDakJyRixnQkFBZ0IsRUFDaEJrRixxQ0FBcUMsRUFDckNwRixTQUFTLEVBQ1RxRix3QkFBd0IsRUFDeEJGLGlCQUNELENBQUM7VUFDRG1MLDZCQUE2QixDQUFDUCxlQUFlLEVBQUUzTSxJQUFJLEVBQUV6QixNQUFNLENBQUM7VUFDNURxRyxjQUFjLENBQUNKLElBQUksQ0FBQ2pHLE1BQU0sQ0FBQztVQUMzQnFPLHNCQUFzQixDQUFDNU0sSUFBSSxDQUFDLEdBQUdtTixPQUFPO1FBQ3ZDLENBQUMsTUFBTSxJQUNOUixlQUFlLENBQUN6SixJQUFJLENBQUUzRSxNQUFNLElBQUtBLE1BQU0sQ0FBQ3lCLElBQUksS0FBS21OLE9BQU8sQ0FBQyxJQUN6RFIsZUFBZSxDQUFDekosSUFBSSxDQUFFM0UsTUFBTSxJQUFLQSxNQUFNLENBQUNFLGFBQWEsRUFBRTJFLFFBQVEsQ0FBQ3BELElBQUksQ0FBQyxDQUFDLEVBQ3JFO1VBQ0Q0TSxzQkFBc0IsQ0FBQzVNLElBQUksQ0FBQyxHQUFHbU4sT0FBTztRQUN2QztNQUNEO0lBQ0QsQ0FBQyxDQUFDO0lBQ0Y7SUFDQTtJQUNBUixlQUFlLENBQUMxTixPQUFPLENBQUVWLE1BQU0sSUFBSztNQUNuQ0EsTUFBTSxDQUFDRSxhQUFhLEdBQUdGLE1BQU0sQ0FBQ0UsYUFBYSxFQUFFK0QsR0FBRyxDQUFFNEssWUFBWSxJQUFLUixzQkFBc0IsQ0FBQ1EsWUFBWSxDQUFDLElBQUlBLFlBQVksQ0FBQztNQUN4SDdPLE1BQU0sQ0FBQytGLHVCQUF1QixHQUFHL0YsTUFBTSxDQUFDK0YsdUJBQXVCLEVBQUU5QixHQUFHLENBQ2xFNEssWUFBWSxJQUFLUixzQkFBc0IsQ0FBQ1EsWUFBWSxDQUFDLElBQUlBLFlBQzNELENBQUM7SUFDRixDQUFDLENBQUM7SUFDRixPQUFPeEksY0FBYztFQUN0QixDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTXlJLHdCQUF3QixHQUFHLFNBQUFBLENBQVVoRCxTQUFpQyxFQUFVO0lBQ3JGO0lBQ0EsSUFBSTBCLGdCQUFnQixDQUFDMUIsU0FBUyxDQUFDLElBQUlBLFNBQVMsQ0FBQ04sS0FBSyxFQUFFMUwsSUFBSSxFQUFFO01BQ3pELE9BQU9nTSxTQUFTLENBQUNOLEtBQUssRUFBRTFMLElBQUk7SUFDN0IsQ0FBQyxNQUFNLElBQUlnTSxTQUFTLENBQUNSLEtBQUssd0RBQTZDLElBQUtRLFNBQVMsQ0FBQ1AsTUFBTSxFQUFFckgsT0FBTyxFQUFnQnNILEtBQUssRUFBRTFMLElBQUksRUFBRTtNQUNqSTtNQUNBLE9BQVFnTSxTQUFTLENBQUNQLE1BQU0sRUFBRXJILE9BQU8sRUFBZ0JzSCxLQUFLLENBQUMxTCxJQUFJO0lBQzVELENBQUMsTUFBTTtNQUNOLE9BQU9pUCxTQUFTLENBQUNDLHdCQUF3QixDQUFDbEQsU0FBUyxDQUFDO0lBQ3JEO0VBQ0QsQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLE1BQU1tRCx1QkFBdUIsR0FBRyxTQUFBQSxDQUMvQkMsY0FBc0IsRUFDdEI1USxpQkFBeUIsRUFDekJDLGdCQUF5RCxFQUNuQztJQUN0QixNQUFNTSxPQUFPLEdBQUdOLGdCQUFnQixDQUFDSywrQkFBK0IsQ0FBNkJOLGlCQUFpQixDQUFDLEVBQUVPLE9BQU87SUFDeEgsTUFBTXNRLFVBQVUsR0FBR3RRLE9BQU8sSUFBSW9HLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDckcsT0FBTyxDQUFDO0lBQ2xELE9BQ0NzUSxVQUFVLElBQ1YsQ0FBQyxDQUFDQSxVQUFVLENBQUNwUCxJQUFJLENBQUMsVUFBVXNJLEdBQVcsRUFBRTtNQUN4QyxPQUFPQSxHQUFHLEtBQUs2RyxjQUFjLElBQUtyUSxPQUFPLENBQUN3SixHQUFHLENBQUMsQ0FBeUMrRyxtQkFBbUI7SUFDM0csQ0FBQyxDQUFDO0VBRUosQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsU0FBQUEsQ0FBVXZELFNBQWlDLEVBQVU7SUFDN0UsSUFBSTFMLFlBQVksR0FBRyxFQUFFO0lBQ3JCLFFBQVEwTCxTQUFTLENBQUNSLEtBQUs7TUFDdEI7TUFDQTtNQUNBO01BQ0E7TUFDQTtRQUNDbEwsWUFBWSxHQUFJMEwsU0FBUyxFQUFnQk4sS0FBSyxFQUFFMUwsSUFBSTtRQUNwRDtNQUNEO1FBQ0NNLFlBQVksR0FBRzBMLFNBQVMsRUFBRVAsTUFBTSxFQUFFK0QsS0FBSztRQUN2QztNQUNEO01BQ0E7TUFDQTtNQUNBO1FBQ0NsUCxZQUFZLEdBQUcyTyxTQUFTLENBQUNDLHdCQUF3QixDQUFDbEQsU0FBUyxDQUFDO1FBQzVEO0lBQ0Y7SUFDQSxPQUFPMUwsWUFBWTtFQUNwQixDQUFDO0VBRUQsTUFBTTZHLGFBQWEsR0FBRyxTQUFBQSxDQUFVbkgsSUFBWSxFQUFFeVAsV0FBb0IsRUFBRUMsVUFBbUIsRUFBVTtJQUNoRyxNQUFNQyxXQUFXLEdBQUdGLFdBQVcsR0FBR3pQLElBQUksQ0FBQzRQLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRzVQLElBQUksQ0FBQzZQLE9BQU8sQ0FBQyxHQUFHLENBQUM7SUFDM0UsSUFBSUYsV0FBVyxLQUFLLENBQUMsQ0FBQyxFQUFFO01BQ3ZCLE9BQU8zUCxJQUFJO0lBQ1o7SUFDQSxPQUFPMFAsVUFBVSxHQUFHMVAsSUFBSSxDQUFDOFAsU0FBUyxDQUFDSCxXQUFXLEdBQUcsQ0FBQyxFQUFFM1AsSUFBSSxDQUFDNkYsTUFBTSxDQUFDLEdBQUc3RixJQUFJLENBQUM4UCxTQUFTLENBQUMsQ0FBQyxFQUFFSCxXQUFXLENBQUM7RUFDbEcsQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxNQUFNSSxvQkFBb0IsR0FBRyxTQUFBQSxDQUM1Qi9ELFNBQWlDLEVBQ2pDdk4sZ0JBQXlELEVBQy9DO0lBQ1YsSUFBSWlQLGdCQUFnQixDQUFDMUIsU0FBUyxDQUFDLElBQUkzRiwwQkFBMEIsQ0FBQzJGLFNBQVMsQ0FBQ04sS0FBSyxDQUFDLEVBQUU7TUFDL0UsTUFBTWdELGtCQUFrQixHQUFHMU4sb0JBQW9CLENBQzlDdkMsZ0JBQWdCLENBQUNrQyxzQkFBc0IsQ0FBQyxDQUFDLEVBQ3pDcUwsU0FBUyxDQUFDTixLQUFLLENBQUMxTCxJQUNqQixDQUFDO01BQ0QsT0FBTzJPLGlCQUFpQixDQUFDRCxrQkFBa0IsQ0FBQztJQUM3QyxDQUFDLE1BQU07TUFDTixPQUFPLEtBQUs7SUFDYjtFQUNELENBQUM7O0VBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLE1BQU1zQixpQkFBaUIsR0FBRyxTQUFBQSxDQUN6QmhFLFNBQWlDLEVBQ2pDaUUsWUFBb0IsRUFDcEJDLGtCQUE0QixFQUM1QmxMLHFCQUEwQyxFQUNoQztJQUNWLE9BQ0MsQ0FBQ2tMLGtCQUFrQixDQUFDbkwsUUFBUSxDQUFDa0wsWUFBWSxDQUFDO0lBQUk7SUFDNUMsQ0FBQ2pFLFNBQVMsQ0FBQ1IsS0FBSywyQ0FBZ0MsSUFBSVEsU0FBUyxDQUFDUixLQUFLLHdEQUE2QyxLQUNqSHJHLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDSixxQkFBcUIsQ0FBQ0ssVUFBVSxDQUFDLENBQUNSLElBQUksQ0FBRXNMLFFBQVEsSUFBSztNQUNoRSxNQUFNbkosUUFBUSxHQUFHQyxtQ0FBbUMsQ0FBQ2pDLHFCQUFxQixDQUFDSyxVQUFVLENBQUM4SyxRQUFRLENBQUMsQ0FBQ25LLGtCQUFrQixDQUFDO01BQ25ILE9BQU8sQ0FBQ2dCLFFBQVEsSUFBSSxDQUFDa0osa0JBQWtCLENBQUNuTCxRQUFRLENBQUNvTCxRQUFRLENBQUM7SUFDM0QsQ0FBQyxDQUFDLElBQ0ZuRSxTQUFTLENBQUNSLEtBQUssa0RBQXVDLElBQ3REUSxTQUFTLENBQUNSLEtBQUssb0VBQXlELElBQ3hFUSxTQUFTLENBQUNSLEtBQUsscURBQTBDLENBQUM7RUFFN0QsQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sTUFBTXZDLHdCQUF3QixHQUFHLFNBQUFBLENBQVV4SyxnQkFBeUQsRUFBVztJQUNySCxNQUFNMlIsZUFBNEMsR0FBR0MsbUJBQW1CLENBQUM1UixnQkFBZ0IsQ0FBQztJQUMxRixPQUFPaUwsV0FBVyxDQUFDVCx3QkFBd0IsQ0FBQzVJLFNBQVMsRUFBRStQLGVBQWUsQ0FBQztFQUN4RSxDQUFDO0VBQUNoUyxRQUFBLENBQUE2Syx3QkFBQSxHQUFBQSx3QkFBQTtFQUVGLFNBQVNvSCxtQkFBbUJBLENBQUNDLGdCQUF5RCxFQUErQjtJQUNwSCxNQUFNQyxTQUFTLEdBQUdELGdCQUFnQixDQUFDRSxZQUFZLENBQUMsQ0FBQztJQUNqRCxJQUFJQyxVQUFVLENBQUNDLFdBQVcsQ0FBQ0gsU0FBUyxDQUFDLEVBQUU7TUFDdEMsT0FDQ0EsU0FBUyxDQUFDaFAsV0FBVyxDQUFDb1AsWUFBWSxFQUFFQyxlQUFlLElBQ25ETixnQkFBZ0IsQ0FBQ08sa0JBQWtCLENBQUMsQ0FBQyxDQUFDdFAsV0FBVyxDQUFDb1AsWUFBWSxFQUFFQyxlQUFlO0lBRWpGO0lBQ0EsT0FBT3ZRLFNBQVM7RUFDakI7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVN5USxnQ0FBZ0NBLENBQUNsUixhQUE0QyxFQUFpQztJQUN0SCxPQUFPQSxhQUFhLEtBQUtTLFNBQVMsR0FDL0JBLFNBQVMsR0FDVDtNQUNBMFEsYUFBYSxFQUFFLENBQUM7TUFDaEIsR0FBR25SO0lBQ0gsQ0FBQztFQUNMO0VBRUEsU0FBU29SLHNCQUFzQkEsQ0FBQ0MsWUFBeUIsRUFBRXRQLElBQVksRUFBbUQ7SUFDekgsTUFBTXVQLGtCQUE0QixHQUFHLEVBQUU7SUFDdkMsSUFBSUMsaUJBQWlCLEdBQUcsS0FBSztJQUM3QixLQUFLLElBQUlDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR0gsWUFBWSxDQUFDcEwsTUFBTSxFQUFFdUwsQ0FBQyxFQUFFLEVBQUU7TUFDN0NGLGtCQUFrQixDQUFDL0ssSUFBSSxDQUFDOEssWUFBWSxDQUFDRyxDQUFDLENBQUMsQ0FBQzVCLEtBQUssQ0FBQztNQUM5QyxJQUFJeUIsWUFBWSxDQUFDRyxDQUFDLENBQUMsQ0FBQzVCLEtBQUssS0FBSzdOLElBQUksRUFBRTtRQUNuQ3dQLGlCQUFpQixHQUFHLElBQUk7TUFDekI7SUFDRDtJQUNBLE9BQU87TUFDTkUsTUFBTSxFQUFFSCxrQkFBa0I7TUFDMUJJLGdCQUFnQixFQUFFSDtJQUNuQixDQUFDO0VBQ0Y7RUFFQSxTQUFTSSxlQUFlQSxDQUN2QkMsaUJBQTJCLEVBQzNCQyxvQkFBOEIsRUFDcUQ7SUFDbkYsSUFBSUMsa0NBQWtDLEdBQUcsS0FBSztJQUM5QyxJQUFJQyxhQUFhO0lBQ2pCLElBQUlILGlCQUFpQixJQUFJQSxpQkFBaUIsQ0FBQzNMLE1BQU0sSUFBSSxDQUFDLElBQUk0TCxvQkFBb0IsSUFBSUEsb0JBQW9CLENBQUM1TCxNQUFNLElBQUksQ0FBQyxFQUFFO01BQ25ILEtBQUssSUFBSXVMLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR0ksaUJBQWlCLENBQUMzTCxNQUFNLEVBQUV1TCxDQUFDLEVBQUUsRUFBRTtRQUNsRCxJQUFJLENBQUNJLGlCQUFpQixDQUFDSixDQUFDLENBQUMsQ0FBQyxDQUFDdk0sSUFBSSxDQUFFK00sR0FBRyxJQUFLSCxvQkFBb0IsQ0FBQzFNLFFBQVEsQ0FBQzZNLEdBQUcsQ0FBQyxDQUFDLEVBQUU7VUFDN0VGLGtDQUFrQyxHQUFHLElBQUk7VUFDekNDLGFBQWEsR0FBR0gsaUJBQWlCLENBQUNKLENBQUMsQ0FBQztVQUNwQztRQUNEO01BQ0Q7SUFDRDtJQUNBLE9BQU87TUFDTk0sa0NBQWtDLEVBQUVBLGtDQUFrQztNQUN0RUcsc0JBQXNCLEVBQUVGO0lBQ3pCLENBQUM7RUFDRjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTRyxrQ0FBa0NBLENBQzFDOUUsY0FBNkMsRUFDN0N3RSxpQkFBMkIsRUFDOEM7SUFDekU7SUFDQSxNQUFNTyxXQUFxQixHQUFHLEVBQUU7SUFDaEMsSUFBSUMsZ0JBQWtHLEdBQUc7TUFDeEdOLGtDQUFrQyxFQUFFLEtBQUs7TUFDekNHLHNCQUFzQixFQUFFeFI7SUFDekIsQ0FBQztJQUNELElBQ0MyTSxjQUFjLElBQ2RBLGNBQWMsQ0FBQ3hCLEtBQUssd0RBQTZDLElBQ2pFd0IsY0FBYyxDQUFDdkIsTUFBTSxFQUFFckgsT0FBTyxFQUFFb0gsS0FBSyxnREFBcUMsRUFDekU7TUFDRHdCLGNBQWMsQ0FBQ3ZCLE1BQU0sQ0FBQ3JILE9BQU8sQ0FBQytJLElBQUksRUFBRXZNLE9BQU8sQ0FBRXdNLGNBQXNDLElBQUs7UUFDdkYsSUFDQyxDQUFDQSxjQUFjLENBQUM1QixLQUFLLDJDQUFnQyxJQUFJNEIsY0FBYyxDQUFDNUIsS0FBSyxrREFBdUMsS0FDcEg0QixjQUFjLENBQUMxQixLQUFLLEVBQ25CO1VBQ0RxRyxXQUFXLENBQUM1TCxJQUFJLENBQUNpSCxjQUFjLENBQUMxQixLQUFLLENBQUMxTCxJQUFJLENBQUM7UUFDNUM7UUFDQWdTLGdCQUFnQixHQUFHVCxlQUFlLENBQUNDLGlCQUFpQixFQUFFTyxXQUFXLENBQUM7TUFDbkUsQ0FBQyxDQUFDO0lBQ0g7SUFDQSxPQUFPO01BQ05MLGtDQUFrQyxFQUFFTSxnQkFBZ0IsQ0FBQ04sa0NBQWtDO01BQ3ZGekIsWUFBWSxFQUFFK0IsZ0JBQWdCLENBQUNIO0lBQ2hDLENBQUM7RUFDRjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVNJLGlDQUFpQ0EsQ0FDekN0USxJQUFZLEVBQ1pzUCxZQUF5QixFQUN6QmpFLGNBQTZDLEVBTTNDO0lBQ0YsSUFBSSxDQUFDaUUsWUFBWSxFQUFFO01BQ2xCLE9BQU8sQ0FBQyxDQUFDO0lBQ1Y7SUFDQSxNQUFNaUIsV0FBVyxHQUFHbEIsc0JBQXNCLENBQUNDLFlBQVksRUFBRXRQLElBQUksQ0FBQztJQUM5RCxNQUFNd1EsdUJBQXVCLEdBQUdMLGtDQUFrQyxDQUFDOUUsY0FBYyxFQUFFa0YsV0FBVyxDQUFDYixNQUFNLENBQUM7SUFDdEcsSUFBSWMsdUJBQXVCLENBQUNULGtDQUFrQyxFQUFFO01BQy9EO01BQ0EsT0FBTztRQUNOO1FBQ0FVLG9DQUFvQyxFQUFFRCx1QkFBdUIsQ0FBQ2xDLFlBQVk7UUFDMUViLGNBQWMsRUFBRXpOLElBQUk7UUFDcEIwUSxxQkFBcUIsRUFBRW5GLGlCQUFpQixDQUFDYSxzQkFBc0IsQ0FBQ3BNLElBQUksRUFBRSxJQUFJLENBQUM7TUFDNUUsQ0FBQztJQUNGLENBQUMsTUFBTSxJQUFJdVEsV0FBVyxDQUFDWixnQkFBZ0IsRUFBRTtNQUN4QyxPQUFPO1FBQ05nQixpQkFBaUIsRUFBRSxJQUFJO1FBQ3ZCRCxxQkFBcUIsRUFBRW5GLGlCQUFpQixDQUFDYSxzQkFBc0IsQ0FBQ3BNLElBQUksRUFBRSxLQUFLLENBQUM7TUFDN0UsQ0FBQztJQUNGO0lBQ0EsT0FBTyxDQUFDLENBQUM7RUFDVjtFQUVBLFNBQVM0USxhQUFhQSxDQUFDdkcsU0FBeUIsRUFBVTtJQUN6RCxNQUFNek0sVUFBVSxHQUFHeU0sU0FBUyxFQUFFekssV0FBVyxFQUFFNEgsRUFBRSxFQUFFcUosVUFBb0I7SUFDbkUsSUFBSWpULFVBQVUsSUFBSUEsVUFBVSxDQUFDd0YsUUFBUSxDQUFDLHdCQUF3QixDQUFDLEVBQUU7TUFDaEUsT0FBTyxDQUFDO0lBQ1Q7SUFDQSxJQUFJeEYsVUFBVSxJQUFJQSxVQUFVLENBQUN3RixRQUFRLENBQUMsMEJBQTBCLENBQUMsRUFBRTtNQUNsRSxPQUFPLENBQUM7SUFDVDtJQUNBLElBQUl4RixVQUFVLElBQUlBLFVBQVUsQ0FBQ3dGLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFO01BQy9ELE9BQU8sQ0FBQztJQUNUO0lBQ0EsT0FBTyxDQUFDO0VBQ1Q7RUFFQSxTQUFTME4sdUJBQXVCQSxDQUFDekcsU0FBeUIsRUFBYztJQUN2RSxNQUFNek0sVUFBVSxHQUFHeU0sU0FBUyxFQUFFekssV0FBVyxFQUFFNEgsRUFBRSxFQUFFcUosVUFBb0I7SUFDbkUsT0FBT2pULFVBQVUsR0FBSUEsVUFBVSxDQUFDbVQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFrQkYsVUFBVSxDQUFDRyxJQUFJO0VBQy9FOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTbEosOEJBQThCQSxDQUFDeEksUUFBa0IsRUFBRWYsTUFBNkIsRUFBUTtJQUNoRyxNQUFNMFMsaUJBQWlCLEdBQUdDLHlCQUF5QixDQUFDNVIsUUFBUSxDQUFDO0lBQzdELElBQ0M2UiwrQkFBK0IsQ0FBQzdSLFFBQVEsQ0FBQyxJQUN6QyxPQUFPMlIsaUJBQWlCLEtBQUssUUFBUSxJQUNyQzFTLE1BQU0sQ0FBQ0wsY0FBYyxJQUNyQkssTUFBTSxDQUFDTCxjQUFjLEVBQUV5QyxJQUFJLEtBQUssR0FBRyxFQUNsQztNQUNEcEMsTUFBTSxDQUFDNkYsMEJBQTBCLEdBQUc2TSxpQkFBaUI7TUFDckQxUyxNQUFNLENBQUNMLGNBQWMsQ0FBQ21MLFFBQVEsR0FBRyxNQUFNLEdBQUc0SCxpQkFBaUI7SUFDNUQ7RUFDRDtFQUVBLFNBQVNHLGlCQUFpQkEsQ0FBQ0MsTUFBd0IsRUFBYztJQUNoRSxJQUFJQSxNQUFNLElBQUlBLE1BQU0sQ0FBQ25OLE1BQU0sR0FBRyxDQUFDLEVBQUU7TUFDaEMsSUFBSW9OLFlBQVksR0FBRyxDQUFDLENBQUM7TUFDckIsSUFBSUMsU0FBUyxHQUFHLENBQUMsQ0FBQztNQUNsQixJQUFJQywwQkFBMEI7TUFDOUIsS0FBSyxNQUFNQyxLQUFLLElBQUlKLE1BQU0sRUFBRTtRQUMzQkUsU0FBUyxHQUFHWCxhQUFhLENBQUNhLEtBQUssQ0FBQztRQUNoQyxJQUFJRixTQUFTLEdBQUdELFlBQVksRUFBRTtVQUM3QkEsWUFBWSxHQUFHQyxTQUFTO1VBQ3hCQywwQkFBMEIsR0FBR0MsS0FBSztRQUNuQztNQUNEO01BQ0EsT0FBT1gsdUJBQXVCLENBQUNVLDBCQUE0QyxDQUFDO0lBQzdFO0lBQ0EsT0FBT1gsVUFBVSxDQUFDRyxJQUFJO0VBQ3ZCOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNPLFNBQVN6SixhQUFhQSxDQUM1QnpLLGdCQUF5RCxFQUN6RHVOLFNBQTZDLEVBQ3BCO0lBQ3pCLElBQUksQ0FBQ0EsU0FBUyxFQUFFO01BQ2YsT0FBTzNMLFNBQVM7SUFDakI7SUFDQSxNQUFNNFEsWUFBWSxHQUFHeFMsZ0JBQWdCLENBQUNrQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUNrQyxnQkFBZ0IsQ0FBQ3RCLFdBQVcsQ0FBQ0MsTUFBTSxFQUFFNlIsV0FBVyxJQUFJLEVBQUU7SUFDckgsTUFBTUMsa0JBQWtCLEdBQUdDLHFCQUFxQixDQUFDOVUsZ0JBQWdCLENBQUM7SUFDbEUsTUFBTStVLFFBQVEsR0FBRyxDQUFDLEdBQUd2QyxZQUFZLEVBQUUsR0FBR3FDLGtCQUFrQixDQUFDLENBQUNuUCxHQUFHLENBQUU4TCxZQUFZLElBQUtBLFlBQVksQ0FBQzdMLE9BQU8sRUFBRXdCLGtCQUFrQixDQUFDO0lBQ3pIO0lBQ0EsSUFBSTZOLG9CQUFvQjtJQUN4QixJQUFJQyxrQkFBa0IsQ0FBeUIxSCxTQUFTLHFEQUEwQyxDQUFDLEVBQUU7TUFDcEcsTUFBTTJILGVBQWUsR0FBRzNILFNBQVMsQ0FBQ1AsTUFBTSxDQUFDckgsT0FBTztNQUNoRCxJQUFJc1Asa0JBQWtCLENBQWFDLGVBQWUsNkNBQWtDLENBQUMsRUFBRTtRQUN0RixNQUFNQyxjQUFjLEdBQUdELGVBQWUsQ0FBQ3hHLElBQUk7UUFDM0M7UUFDQSxJQUNDeUcsY0FBYyxDQUFDL08sSUFBSSxDQUFDLFVBQVVnUCxtQkFBMkMsRUFBVztVQUNuRixPQUNDbkcsZ0JBQWdCLENBQUNtRyxtQkFBbUIsQ0FBQyxJQUFJTCxRQUFRLENBQUN6TyxRQUFRLENBQUM4TyxtQkFBbUIsQ0FBQ25JLEtBQUssRUFBRXRILE9BQU8sRUFBRXdCLGtCQUFrQixDQUFDO1FBRXBILENBQUMsQ0FBQyxFQUNEO1VBQ0QsT0FBTzRNLFVBQVUsQ0FBQ3NCLElBQUk7UUFDdkIsQ0FBQyxNQUFNO1VBQ047VUFDQSxJQUFJOUgsU0FBUyxFQUFFekssV0FBVyxFQUFFNEgsRUFBRSxFQUFFcUosVUFBVSxFQUFFO1lBQzNDLE9BQU9DLHVCQUF1QixDQUFDekcsU0FBc0MsQ0FBQztVQUN2RTtVQUNBO1VBQ0F5SCxvQkFBb0IsR0FBR0csY0FBYyxDQUFDdlAsTUFBTSxDQUFDLFVBQVUwUCxJQUFJLEVBQUU7WUFDNUQsT0FBT0EsSUFBSSxFQUFFeFMsV0FBVyxFQUFFNEgsRUFBRSxFQUFFcUosVUFBVTtVQUN6QyxDQUFDLENBQUM7VUFDRixPQUFPTyxpQkFBaUIsQ0FBQ1Usb0JBQXdDLENBQUM7UUFDbkU7TUFDRDtJQUNEO0lBQ0EsT0FBT0QsUUFBUSxDQUFDek8sUUFBUSxDQUFFaUgsU0FBUyxDQUFvQk4sS0FBSyxFQUFFdEgsT0FBTyxFQUFFd0Isa0JBQWtCLENBQUMsR0FDdkY0TSxVQUFVLENBQUNzQixJQUFJLEdBQ2ZyQix1QkFBdUIsQ0FBQ3pHLFNBQXNDLENBQUM7RUFDbkU7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVBBNU4sUUFBQSxDQUFBOEssYUFBQSxHQUFBQSxhQUFBO0VBUUEsTUFBTXZLLHlCQUF5QixHQUFHLFNBQUFBLENBQ2pDTCxrQkFBNEIsRUFDNUJDLFNBQW9CLEVBQ3BCQyxpQkFBeUIsRUFDekJDLGdCQUF5RCxFQUMvQjtJQUMxQixNQUFNZ0YsVUFBc0IsR0FBR2hGLGdCQUFnQixDQUFDTyx1QkFBdUIsQ0FBQ1Ysa0JBQWtCLENBQUM7TUFDMUZJLGlCQUEwQyxHQUFHLEVBQUU7TUFDL0M4RSxrQkFBNEMsR0FBRyxDQUFDLENBQUM7TUFDakRHLHFDQUFrRSxHQUFHLENBQUMsQ0FBQztNQUN2RUMsd0JBQXdCLEdBQUdvUSwyQkFBMkIsQ0FBQ3ZWLGdCQUFnQixDQUFDO01BQ3hFd1YscUJBQWlELEdBQUd4VixnQkFBZ0IsQ0FBQ0ssK0JBQStCLENBQUNOLGlCQUFpQixDQUFDO01BQ3ZIMFYsbUJBQW1CLEdBQ2xCelYsZ0JBQWdCLENBQUMwVixrQkFBa0IsQ0FBQyxDQUFDLENBQUNDLDZCQUE2QixDQUFDLENBQUMsRUFBRUMsTUFBTSxFQUFFQyxLQUFLLEVBQUVKLG1CQUFtQixLQUN6RyxvQkFBb0IsR0FDakJLLFlBQVksQ0FBQ0Msa0JBQWtCLEdBQy9CblUsU0FBUztNQUNicUQsaUJBQStCLEdBQzlCdVEscUJBQXFCLEVBQUVRLGFBQWEsRUFBRUMsWUFBWSxFQUFFL1MsSUFBSSxJQUFJdVMsbUJBQW1CLElBQUlLLFlBQVksQ0FBQ3RJLE1BQU07SUFDeEcsTUFBTWdGLFlBQXlCLEdBQUd4UyxnQkFBZ0IsQ0FBQ2tXLG9CQUFvQixDQUFDLFFBQVEsZ0RBQXFDLENBQ3BIbFcsZ0JBQWdCLENBQUNtVyxhQUFhLENBQUMsQ0FBQyxDQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFnQjtJQUNwQixJQUFJdFcsa0JBQWtCLEVBQUU7TUFDdkIsTUFBTXVXLHFCQUFxQixHQUFHcFcsZ0JBQWdCLENBQUNnQyxzQkFBc0IsQ0FDcEVxVSxtQkFBbUIsQ0FBQ3JXLGdCQUFnQixDQUFDa0Msc0JBQXNCLENBQUMsQ0FBQyxDQUM5RCxDQUFDO01BQ0RyQyxrQkFBa0IsQ0FBQ3NDLE9BQU8sQ0FBRW9MLFNBQVMsSUFBSztRQUN6QztRQUNBLElBQUksQ0FBQ0QsY0FBYyxDQUFDQyxTQUFTLENBQUMsRUFBRTtVQUMvQjtRQUNEO1FBQ0EsSUFBSW5NLGNBQThDLEdBQUcsSUFBSTtRQUN6RCxNQUFNaUgsNEJBQTRCLEdBQ2pDNEcsZ0JBQWdCLENBQUMxQixTQUFTLENBQUMsSUFBSUEsU0FBUyxDQUFDTixLQUFLLEVBQUV0SCxPQUFPLEVBQUV3QixrQkFBa0IsR0FDeEVtQixxQkFBcUIsQ0FBQ3RJLGdCQUFnQixFQUFFdU4sU0FBUyxDQUFDLEdBQ2xEM0wsU0FBUztRQUNiLE1BQU1DLFlBQVksR0FBR2lQLGdCQUFnQixDQUFDdkQsU0FBUyxDQUFDO1FBQ2hEO1FBQ0EsTUFBTWhILHFCQUEwQyxHQUFHK1AsbUNBQW1DLENBQUMvSSxTQUFTLEVBQUV2TixnQkFBZ0IsRUFBRUYsU0FBUyxDQUFDO1FBQzlILE1BQU0yRyxvQkFBOEIsR0FBR0MsTUFBTSxDQUFDQyxJQUFJLENBQUNKLHFCQUFxQixDQUFDSyxVQUFVLENBQUM7UUFDcEYsTUFBTUMsdUJBQWlDLEdBQUdILE1BQU0sQ0FBQ0MsSUFBSSxDQUFDSixxQkFBcUIsQ0FBQ08sb0JBQW9CLENBQUM7UUFDakcsTUFBTTJCLFNBQTZCLEdBQUc1RyxZQUFZLEdBQUc2RyxhQUFhLENBQUM3RyxZQUFZLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxHQUFHRCxTQUFTO1FBQ3pHLE1BQU0rRyxPQUFnQixHQUFHRixTQUFTLElBQUk1RyxZQUFZO1FBQ2xELE1BQU0rRyxLQUFLLEdBQUdDLFFBQVEsQ0FBQzBFLFNBQVMsRUFBRTVFLE9BQU8sQ0FBQztRQUMxQyxNQUFNekYsSUFBSSxHQUFHcU4sd0JBQXdCLENBQUNoRCxTQUFTLENBQUM7UUFDaEQsTUFBTWdKLGtCQUEyQixHQUFHOU4sU0FBUyxHQUFHQSxTQUFTLENBQUNuQyxRQUFRLENBQUMsNkNBQWtDLENBQUMsR0FBRyxLQUFLO1FBQzlHLE1BQU11SyxtQkFBd0MsR0FBRzBGLGtCQUFrQixHQUNoRTdGLHVCQUF1QixDQUFDeE4sSUFBSSxFQUFFbkQsaUJBQWlCLEVBQUVDLGdCQUFnQixDQUFDLEdBQ2xFLEtBQUs7UUFDUixNQUFNOEksUUFBNEIsR0FBR0Msb0JBQW9CLENBQUN3RSxTQUFTLENBQUM7UUFDcEUsTUFBTXBNLGFBQWEsR0FBR2tSLGdDQUFnQyxDQUFDbUIsaUNBQWlDLENBQUN0USxJQUFJLEVBQUVzUCxZQUFZLEVBQUVqRixTQUFTLENBQUMsQ0FBQztRQUN4SCxNQUFNakwsMkJBQTJCLEdBQUdDLG9CQUFvQixDQUN2RHZDLGdCQUFnQixDQUFDa0Msc0JBQXNCLENBQUMsQ0FBQyxFQUN6Q0wsWUFDRCxDQUFDO1FBQ0Q7UUFDQSxNQUFNMlUsb0JBQTBDLEdBQUdsVSwyQkFBMkIsQ0FBQzhCLGdCQUFnQixDQUFDb1Msb0JBQW9CO1FBQ3BILE1BQU1DLGtCQUFrQixHQUFHRCxvQkFBb0IsQ0FBQzVRLE1BQU0sQ0FDcEQ4USxrQkFBa0IsSUFDbEIsQ0FBQ0Esa0JBQWtCLENBQUNDLFlBQVksSUFDaENELGtCQUFrQixDQUFDclEsVUFBVSxDQUFDdkQsV0FBVyxDQUFDQyxNQUFNLEVBQUU2VCxpQkFBaUIsRUFBRUMsSUFBSSxLQUFLLG1CQUNoRixDQUFDO1FBQ0QsTUFBTUMsaUJBQWlELEdBQUdMLGtCQUFrQixDQUFDclAsTUFBTSxJQUFJLENBQUMsR0FBR3FQLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxHQUFHN1UsU0FBUztRQUM1SCxJQUFJa1YsaUJBQWlCLElBQUkzVixhQUFhLEVBQUU7VUFDdkNBLGFBQWEsQ0FBQzRWLHNCQUFzQixHQUFHLElBQUk7UUFDNUM7UUFFQSxJQUFJdkksMkJBQTZEO1FBQ2pFLElBQ0NqQixTQUFTLENBQUNSLEtBQUssd0RBQTZDLElBQzVEUSxTQUFTLENBQUNQLE1BQU0sRUFBRXJILE9BQU8sRUFBRW9ILEtBQUssZ0RBQXFDLEVBQ3BFO1VBQ0R5QiwyQkFBMkIsR0FBR0YsK0JBQStCLENBQUNmLFNBQVMsQ0FBQztRQUN6RTtRQUNBLE1BQU15SixZQUFZLEdBQUcxRixvQkFBb0IsQ0FBQy9ELFNBQVMsRUFBRTZJLHFCQUFxQixDQUFDO1FBQzNFLElBQUksQ0FBQ1ksWUFBWSxJQUFJdE4sbUJBQW1CLENBQUM2RCxTQUFTLENBQUMsRUFBRTtVQUNwRDtVQUNBbk0sY0FBYyxHQUFHdUksMEJBQTBCLENBQUM0RCxTQUFTLEVBQUVoSCxxQkFBcUIsQ0FBQztRQUM5RTtRQUNBLElBQUl5QyxrQkFBa0Q7UUFDdEQsSUFBSUYsUUFBUSxFQUFFO1VBQ2JFLGtCQUFrQixHQUFHQyxhQUFhLENBQUNzRSxTQUFTLEVBQUV6RSxRQUFRLENBQUM7UUFDeEQ7UUFDQSxNQUFNUyxVQUE4QixHQUFHO1VBQ3RDQyxTQUFTLEVBQUVWLFFBQThDO1VBQ3pEM0gsYUFBYSxFQUFFO1lBQ2QsR0FBR0EsYUFBYTtZQUNoQixHQUFHNkgsa0JBQWtCLEVBQUU3SDtVQUN4QixDQUFDO1VBQ0RzSSxXQUFXLEVBQUVULGtCQUFrQixFQUFFUztRQUNsQyxDQUFDO1FBQ0QsTUFBTXdOLGNBQThCLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQ25PLFFBQVEsSUFBSSxDQUFDUyxVQUFVLEVBQUU7VUFDN0I7VUFDQTBOLGNBQWMsQ0FBQ0MsZ0JBQWdCLEdBQUcsSUFBSTtRQUN2QztRQUNBLE1BQU0vTixRQUFRLEdBQ2IsQ0FBQzZOLFlBQVksSUFDYnpGLGlCQUFpQixDQUFDaEUsU0FBUyxFQUFFMUwsWUFBWSxFQUFFc0Qsd0JBQXdCLENBQUN3QyxxQkFBcUIsRUFBRXBCLHFCQUFxQixDQUFDO1FBQ2xILE1BQU12RixZQUFZLEdBQUd3SCxtQ0FBbUMsQ0FBQytFLFNBQVMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxTQUFTO1FBQzFGLE1BQU05TCxNQUE2QixHQUFHO1VBQ3JDcUksR0FBRyxFQUFFMEcsU0FBUyxDQUFDQyx3QkFBd0IsQ0FBQ2xELFNBQVMsQ0FBQztVQUNsRDFJLElBQUksRUFBRW5GLFVBQVUsQ0FBQ3NLLFVBQVU7VUFDM0JwQixLQUFLLEVBQUVBLEtBQUssSUFBSTFGLElBQUk7VUFDcEIrRyxVQUFVLEVBQUV0QixPQUFPLEdBQUdFLFFBQVEsQ0FBQzBFLFNBQVMsQ0FBQyxHQUFHM0wsU0FBUztVQUNyRHNJLEtBQUssRUFBRXZCLE9BQU8sR0FBR0YsU0FBUyxHQUFHN0csU0FBUztVQUN0Q3VWLDJCQUEyQixFQUFFM0ksMkJBQTJCO1VBQ3hEckUsY0FBYyxFQUFFbkssZ0JBQWdCLENBQUNrSCwrQkFBK0IsQ0FBQ3FHLFNBQVMsQ0FBQ3BHLGtCQUFrQixDQUFDO1VBQzlGaUQsa0JBQWtCLEVBQUUvQiw0QkFBNEI7VUFDaERySCxZQUFZLEVBQUVBLFlBQVk7VUFDMUJrQyxJQUFJLEVBQUVBLElBQUk7VUFDVjJOLG1CQUFtQixFQUFFQSxtQkFBbUI7VUFDeENqRyxRQUFRLEVBQUVDLGdCQUFnQixDQUFDN0ssZ0JBQWdCLEVBQUV1TixTQUFTLEVBQW9CdEksaUJBQWlCLENBQUM7VUFDNUZwRCxZQUFZLEVBQUVBLFlBQVk7VUFDMUJzSCxRQUFRLEVBQUVBLFFBQVE7VUFDbEJ4SCxhQUFhLEVBQUU4RSxvQkFBb0IsQ0FBQ1csTUFBTSxHQUFHWCxvQkFBb0IsR0FBRzdFLFNBQVM7VUFDN0U0Rix1QkFBdUIsRUFBRVgsdUJBQXVCLENBQUNPLE1BQU0sR0FBRyxDQUFDLEdBQUdQLHVCQUF1QixHQUFHakYsU0FBUztVQUNqR1IsY0FBYyxFQUFFQSxjQUFjO1VBQzlCVixLQUFLLEVBQUc2TSxTQUFTLENBQUN6SyxXQUFXLEVBQUVzVSxLQUFLLEVBQUVDLFdBQVcsRUFBRTNXLEtBQUssRUFBRXdPLE9BQU8sQ0FBQyxDQUFDLElBQWV0TixTQUFTO1VBQzNGZCxVQUFVLEVBQUUySixhQUFhLENBQUN6SyxnQkFBZ0IsRUFBRXVOLFNBQTJCLENBQUM7VUFDeEV0TSxXQUFXLEVBQUUsSUFBSTtVQUNqQkUsYUFBYSxFQUFFQSxhQUFhO1VBQzVCb0osYUFBYSxFQUFFQyx3QkFBd0IsQ0FBQ3hLLGdCQUFnQixDQUFDO1VBQ3pEdUosVUFBVSxFQUFFQSxVQUFVO1VBQ3RCME4sY0FBYyxFQUFFQSxjQUFnRDtVQUNoRTlULFlBQVksRUFBRS9CLGNBQWMsRUFBRXlCLFFBQVE7VUFDdEN5VSxnQkFBZ0IsRUFBRSxJQUFJO1VBQ3RCeE8sUUFBUSxFQUFFQSxRQUFRLElBQUssWUFBbUQ7VUFDMUVrTztRQUNELENBQUM7UUFDRCxNQUFNTyxPQUFPLEdBQUdwSSxXQUFXLENBQUM1QixTQUFTLENBQUMsSUFBSTNFLEtBQUs7UUFDL0MsSUFBSTJPLE9BQU8sRUFBRTtVQUNaOVYsTUFBTSxDQUFDOFYsT0FBTyxHQUFHQSxPQUFPO1FBQ3pCO1FBQ0EsSUFBSWhSLHFCQUFxQixDQUFDbkYsY0FBYyxDQUFDaUcsb0JBQW9CLEVBQUU7VUFDOUQ1RixNQUFNLENBQUM2RiwwQkFBMEIsR0FBR2YscUJBQXFCLENBQUNuRixjQUFjLENBQUNpRyxvQkFBb0I7UUFDOUY7UUFDQXBILGlCQUFpQixDQUFDeUgsSUFBSSxDQUFDakcsTUFBTSxDQUFDO1FBQzlCO1FBQ0FnRixvQkFBb0IsQ0FBQ3RFLE9BQU8sQ0FBRXFWLG1CQUFtQixJQUFLO1VBQ3JEelMsa0JBQWtCLENBQUN5UyxtQkFBbUIsQ0FBQyxHQUFHalIscUJBQXFCLENBQUNLLFVBQVUsQ0FBQzRRLG1CQUFtQixDQUFDLENBQUNqUSxrQkFBa0I7VUFDbEg7VUFDQSxJQUFJeVAsWUFBWSxFQUFFO1lBQ2pCN1Isd0JBQXdCLENBQUN3QyxxQkFBcUIsQ0FBQ0QsSUFBSSxDQUFDOFAsbUJBQW1CLENBQUM7VUFDekU7VUFDQXpRLGtEQUFrRCxDQUNqRDdCLHFDQUFxQyxFQUNyQ3FCLHFCQUFxQixFQUNyQmlSLG1CQUNELENBQUM7VUFDRDtVQUNBO1VBQ0EsSUFBSWpSLHFCQUFxQixDQUFDSyxVQUFVLENBQUM0USxtQkFBbUIsQ0FBQyxDQUFDQyxzQ0FBc0MsS0FBSyxhQUFhLEVBQUU7WUFDbkhDLCtCQUErQixDQUM5QjFYLGdCQUFnQixFQUNoQnNDLDJCQUEyQixFQUMzQmlMLFNBQVMsRUFDVHhJLGtCQUFrQixFQUNsQmxELFlBQVksRUFDWnNELHdCQUNELENBQUM7VUFDRjtRQUNELENBQUMsQ0FBQztRQUNGO1FBQ0EwQix1QkFBdUIsQ0FBQzFFLE9BQU8sQ0FBRXNGLHNCQUFzQixJQUFLO1VBQzNEO1VBQ0ExQyxrQkFBa0IsQ0FBQzBDLHNCQUFzQixDQUFDLEdBQUdsQixxQkFBcUIsQ0FBQ08sb0JBQW9CLENBQUNXLHNCQUFzQixDQUFDO1FBQ2hILENBQUMsQ0FBQztNQUNILENBQUMsQ0FBQztJQUNIO0lBQ0E7SUFDQSxPQUFPM0Msd0JBQXdCLENBQzlCQyxrQkFBa0IsRUFDbEJDLFVBQVUsRUFDVi9FLGlCQUFpQixFQUNqQkQsZ0JBQWdCLEVBQ2hCRixTQUFTLEVBQ1RtRixpQkFBaUIsRUFDakJDLHFDQUFxQyxFQUNyQ0Msd0JBQ0QsQ0FBQztFQUNGLENBQUM7O0VBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTXdTLGlCQUFpQixHQUFHLFNBQUFBLENBQ3pCL1EsVUFBeUMsRUFDekMzRyxpQkFBMEMsRUFDMUNELGdCQUF5RCxFQUN6RGdGLFVBQXNCLEVBQ0M7SUFDdkIsSUFBSTRTLGlCQUF1QztJQUMzQyxJQUFJQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ2xSLFVBQVUsQ0FBQyxFQUFFO01BQzlCZ1IsaUJBQWlCLEdBQUdoUixVQUFVLENBQUNsQixHQUFHLENBQUMsVUFBVThMLFlBQVksRUFBRTtRQUMxRCxNQUFNOVAsZ0JBQWdCLEdBQUd6QixpQkFBaUIsQ0FBQ3VCLElBQUksQ0FBQyxVQUFVRSxnQkFBZ0IsRUFBRTtVQUMzRSxPQUFPQSxnQkFBZ0IsQ0FBQ0csWUFBWSxLQUFLMlAsWUFBWSxJQUFJOVAsZ0JBQWdCLENBQUNDLGFBQWEsS0FBS0MsU0FBUztRQUN0RyxDQUFDLENBQUM7UUFDRixJQUFJRixnQkFBZ0IsRUFBRTtVQUNyQixPQUFPQSxnQkFBZ0IsQ0FBQ3dCLElBQUk7UUFDN0IsQ0FBQyxNQUFNO1VBQ04sTUFBTTRFLGNBQWMsR0FBR0MscUJBQXFCLENBQzNDO1lBQUUsQ0FBQ3lKLFlBQVksR0FBR3hNLFVBQVUsQ0FBQytTLFdBQVcsQ0FBQ3ZHLFlBQVk7VUFBRSxDQUFDLEVBQ3hEdlIsaUJBQWlCLEVBQ2pCRCxnQkFBZ0IsRUFDaEJnRixVQUFVLEVBQ1YsQ0FBQyxDQUNGLENBQUM7VUFDRC9FLGlCQUFpQixDQUFDeUgsSUFBSSxDQUFDSSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7VUFDekMsT0FBT0EsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDNUUsSUFBSTtRQUM5QjtNQUNELENBQUMsQ0FBQztJQUNIO0lBQ0EsT0FBTzBVLGlCQUFpQjtFQUN6QixDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTUksb0JBQW9CLEdBQUcsU0FBQUEsQ0FDNUJoWSxnQkFBeUQsRUFDekRpWSxVQUFzQixFQUN0QmhULGlCQUErQixFQUNyQjtJQUNWLE1BQU1rUSxjQUFjLEdBQUc4QyxVQUFVLENBQUN2SixJQUFJO0lBQ3RDLE9BQU95RyxjQUFjLENBQUMvTyxJQUFJLENBQUMsVUFBVWtQLElBQUksRUFBRTtNQUMxQztNQUNBLElBQUk0QyxXQUFXLENBQUM1QyxJQUFJLENBQUMsSUFBSUEsSUFBSSxFQUFFckksS0FBSyxFQUFFdEgsT0FBTyxDQUFDZCxJQUFJLEtBQUssYUFBYSxFQUFFO1FBQ3JFLE9BQ0NzVCxxQkFBcUIsQ0FBQzdDLElBQUksQ0FBQyxJQUMxQnJRLGlCQUFpQixLQUFLNlEsWUFBWSxDQUFDQyxrQkFBa0IsSUFDckRxQywyQkFBMkIsQ0FBQzlDLElBQUksQ0FBQ3JJLEtBQUssQ0FBQ3RILE9BQU8sQ0FBQ3dCLGtCQUFrQixFQUFFbkgsZ0JBQWdCLENBQUU7TUFFeEY7SUFDRCxDQUFDLENBQUM7RUFDSCxDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTXFZLGdDQUFnQyxHQUFHLFNBQUFBLENBQ3hDclksZ0JBQXlELEVBQ3pEc1ksc0JBQThDLEVBQzlDclQsaUJBQStCLEVBQ3JCO0lBQ1YsTUFBTWlRLGVBQWUsR0FBR29ELHNCQUFzQixDQUFDdEwsTUFBTSxDQUFDckgsT0FBTztJQUM3RCxNQUFNNFMsOENBQThDLEdBQUdDLDJCQUEyQixDQUFDRixzQkFBc0IsQ0FBQztJQUMxRztJQUNBLElBQUlHLG1CQUFtQixDQUFDSCxzQkFBc0IsQ0FBQyxFQUFFO01BQ2hELElBQUlOLG9CQUFvQixDQUFDaFksZ0JBQWdCLEVBQUVrVixlQUFlLEVBQWdCalEsaUJBQWlCLENBQUMsRUFBRTtRQUM3RixPQUFPLElBQUk7TUFDWjtNQUNBLE1BQU1rUSxjQUFjLEdBQUlELGVBQWUsQ0FBZ0J4RyxJQUFJO01BQzNELE9BQU95RyxjQUFjLENBQUMvTyxJQUFJLENBQUV1SSxjQUFzQyxJQUFLO1FBQ3RFLE9BQU85RCxnQkFBZ0IsQ0FBQzdLLGdCQUFnQixFQUFFMk8sY0FBYyxFQUFFMUosaUJBQWlCLENBQUM7TUFDN0UsQ0FBQyxDQUFDO0lBQ0g7SUFDQTtBQUNEO0FBQ0E7SUFDQyxJQUFJeVQsa0JBQWtCLENBQUNKLHNCQUFzQixDQUFDLElBQUtwRCxlQUFlLENBQWV5RCxhQUFhLEtBQUssNkJBQTZCLEVBQUU7TUFDakksSUFBSUosOENBQThDLEVBQUU7UUFDbkQsT0FBTyxLQUFLO01BQ2I7TUFDQSxJQUFJSixxQkFBcUIsQ0FBQ0csc0JBQXNCLENBQUMsRUFBRTtRQUNsRCxPQUFPLElBQUk7TUFDWjtNQUNBLE9BQU9NLG1CQUFtQixDQUFDNVksZ0JBQWdCLEVBQUVrVixlQUFlLEVBQWVqUSxpQkFBaUIsQ0FBQztJQUM5RjtJQUNBLE9BQU8sS0FBSztFQUNiLENBQUM7O0VBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxNQUFNNFQsa0JBQWtCLEdBQUcsU0FBQUEsQ0FDMUI3WSxnQkFBeUQsRUFDekR3QyxRQUFrQixFQUNsQnlDLGlCQUErQixFQUNyQjtJQUNWLE9BQ0N6QyxRQUFRLENBQUNxQyxJQUFJLEtBQUssYUFBYSxJQUMvQixDQUFDaVUseUNBQXlDLENBQUN0VyxRQUFRLENBQUMsS0FDbkQyVixxQkFBcUIsQ0FBQzNWLFFBQVEsQ0FBQyxJQUM5QnlDLGlCQUFpQixLQUFLNlEsWUFBWSxDQUFDQyxrQkFBa0IsSUFDckRxQywyQkFBMkIsQ0FBQzVWLFFBQVEsQ0FBQzJFLGtCQUFrQixFQUFFbkgsZ0JBQWdCLENBQUUsQ0FBQztFQUVoRixDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTTRZLG1CQUFtQixHQUFHLFNBQUFBLENBQzNCNVksZ0JBQXlELEVBQ3pEK1ksU0FBb0IsRUFDcEI5VCxpQkFBK0IsRUFDckI7SUFDVixPQUNDa1QscUJBQXFCLENBQUNZLFNBQVMsQ0FBQyxJQUMvQjlULGlCQUFpQixLQUFLNlEsWUFBWSxDQUFDQyxrQkFBa0IsSUFDckRxQywyQkFBMkIsQ0FBQ1csU0FBUyxDQUFDOUwsS0FBSyxDQUFDdEgsT0FBTyxDQUFDd0Isa0JBQWtCLEVBQUVuSCxnQkFBZ0IsQ0FBRTtFQUU3RixDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTTZLLGdCQUFnQixHQUFHLFNBQUFBLENBQ3hCN0ssZ0JBQXlELEVBQ3pENkYsTUFBeUMsRUFDekNaLGlCQUFnQyxFQUNHO0lBQ25DLE1BQU1nUixZQUFZLEdBQUdoUixpQkFBaUIsSUFBSTZRLFlBQVksQ0FBQ3RJLE1BQU07SUFDN0QsSUFDQ3hOLGdCQUFnQixDQUFDZ1osZUFBZSxDQUFDLENBQUMsS0FBS0MsWUFBWSxDQUFDQyxVQUFVLElBQzlEbFosZ0JBQWdCLENBQUNnWixlQUFlLENBQUMsQ0FBQyxLQUFLQyxZQUFZLENBQUNFLGtCQUFrQixFQUNyRTtNQUNELE9BQU92WCxTQUFTO0lBQ2pCO0lBQ0EsSUFBSStKLFVBQVUsQ0FBQzlGLE1BQU0sQ0FBQyxFQUFFO01BQ3ZCLE9BQU9nVCxrQkFBa0IsQ0FBQzdZLGdCQUFnQixFQUFFNkYsTUFBTSxFQUFFb1EsWUFBWSxDQUFDLEdBQUd4SCxpQkFBaUIsQ0FBQy9ELEVBQUUsQ0FBQzBPLFVBQVUsQ0FBQyxHQUFHeFgsU0FBUztJQUNqSDtJQUNBO0lBQ0EsSUFBSXlYLHdCQUF3QixDQUFDeFQsTUFBTSxDQUFDLEVBQUU7TUFDckMsT0FBT3dTLGdDQUFnQyxDQUFDclksZ0JBQWdCLEVBQUU2RixNQUFNLEVBQUVvUSxZQUFZLENBQUMsR0FBR3hILGlCQUFpQixDQUFDL0QsRUFBRSxDQUFDME8sVUFBVSxDQUFDLEdBQUd4WCxTQUFTO0lBQy9IO0lBQ0E7SUFDQSxJQUFJc1csV0FBVyxDQUFDclMsTUFBTSxDQUFDLElBQUlBLE1BQU0sQ0FBQ29ILEtBQUssRUFBRXRILE9BQU8sRUFBRWQsSUFBSSxLQUFLLGFBQWEsRUFBRTtNQUN6RSxPQUFPc1QscUJBQXFCLENBQUN0UyxNQUFNLENBQUMsSUFDbENvUSxZQUFZLEtBQUtILFlBQVksQ0FBQ0Msa0JBQWtCLElBQ2hEcUMsMkJBQTJCLENBQUN2UyxNQUFNLENBQUNvSCxLQUFLLENBQUN0SCxPQUFPLENBQUN3QixrQkFBa0IsRUFBRW5ILGdCQUFnQixDQUFFLEdBQ3RGeU8saUJBQWlCLENBQUMvRCxFQUFFLENBQUMwTyxVQUFVLENBQUMsR0FDaEN4WCxTQUFTO0lBQ2I7SUFDQSxPQUFPQSxTQUFTO0VBQ2pCLENBQUM7RUFFRCxNQUFNMFgscUJBQXFCLEdBQUcsU0FBQUEsQ0FDN0IxUyxVQUFnQyxFQUNoQzJTLGdCQUErQyxFQUMxQjtJQUNyQixJQUFJMUIsS0FBSyxDQUFDQyxPQUFPLENBQUN5QixnQkFBZ0IsQ0FBQyxFQUFFO01BQ3BDM1MsVUFBVSxHQUFHMlMsZ0JBQWdCO0lBQzlCO0lBQ0EsSUFBSTNTLFVBQVUsRUFBRTtNQUNmLE9BQU9BLFVBQVUsQ0FDZmxCLEdBQUcsQ0FBRWxELFFBQVEsSUFBSztRQUNsQixPQUFPLElBQUlvRSxVQUFVLENBQUV3SyxPQUFPLENBQUM1TyxRQUFRLENBQUMsR0FBRztNQUM1QyxDQUFDLENBQUMsQ0FDRGdYLElBQUksQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDO0lBQ2xCO0lBQ0EsT0FBTzVYLFNBQVM7RUFDakIsQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsTUFBTXhCLHNCQUFzQixHQUFHLFNBQUFBLENBQzlCRSxPQUF1RixFQUN2RkwsaUJBQTBDLEVBQzFDRCxnQkFBeUQsRUFDekRnRixVQUFzQixFQUNXO0lBQ2pDLE1BQU15VSxlQUErQyxHQUFHLENBQUMsQ0FBQztJQUMxRCxTQUFTQyxnQkFBZ0JBLENBQ3hCalksTUFBc0UsRUFDdEVxSSxHQUFXLEVBQ3FDO01BQ2hELE9BQU83SixpQkFBaUIsQ0FBQ21HLElBQUksQ0FBRTFFLGdCQUFnQixJQUFLQSxnQkFBZ0IsQ0FBQ29JLEdBQUcsS0FBS0EsR0FBRyxDQUFDO0lBQ2xGO0lBQ0EsU0FBUzZQLFlBQVlBLENBQUNDLGNBQXdDLEVBQStDO01BQzVHLE9BQU9BLGNBQWMsQ0FBQy9VLElBQUksS0FBS25GLFVBQVUsQ0FBQ21hLElBQUk7SUFDL0M7SUFDQSxTQUFTQyxjQUFjQSxDQUFDRixjQUF3QyxFQUFpRDtNQUNoSCxPQUFPQSxjQUFjLENBQUMvVSxJQUFJLEtBQUtqRCxTQUFTLElBQUksQ0FBQyxDQUFDZ1ksY0FBYyxDQUFDck4sUUFBUTtJQUN0RTtJQUNBLFNBQVN3TixzQ0FBc0NBLENBQUNwWSxhQUF1QixFQUFFcVksc0JBQStDLEVBQVE7TUFDL0gsTUFBTTdVLHdCQUF3QixHQUFHb1EsMkJBQTJCLENBQUN2VixnQkFBZ0IsQ0FBQztNQUM5RTJCLGFBQWEsQ0FBQ1EsT0FBTyxDQUFFSyxRQUFRLElBQUs7UUFDbkN3WCxzQkFBc0IsQ0FBQzdYLE9BQU8sQ0FBRThELElBQUksSUFBSztVQUN4QyxJQUFJQSxJQUFJLENBQUMvQyxJQUFJLEtBQUtWLFFBQVEsRUFBRTtZQUMzQnlELElBQUksQ0FBQ2tELFFBQVEsR0FBRyxDQUFDaEUsd0JBQXdCLENBQUN3QyxxQkFBcUIsQ0FBQ3JCLFFBQVEsQ0FBQzlELFFBQVEsQ0FBQ3lYLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDNUdoVSxJQUFJLENBQUNvRSxXQUFXLEdBQUdwRSxJQUFJLENBQUNrRCxRQUFRO1lBQ2hDbEQsSUFBSSxDQUFDbUQsVUFBVSxHQUFHLENBQUNqRSx3QkFBd0IsQ0FBQ2tFLHVCQUF1QixDQUFDL0MsUUFBUSxDQUFDOUQsUUFBUSxDQUFDeVgsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoSGhVLElBQUksQ0FBQ2lVLG9CQUFvQixHQUFHLElBQUk7VUFDakM7UUFDRCxDQUFDLENBQUM7TUFDSCxDQUFDLENBQUM7SUFDSDtJQUNBLEtBQUssTUFBTXBRLEdBQUcsSUFBSXhKLE9BQU8sRUFBRTtNQUMxQixNQUFNc1osY0FBYyxHQUFHdFosT0FBTyxDQUFDd0osR0FBRyxDQUFDO01BQ25DMEcsU0FBUyxDQUFDMkosV0FBVyxDQUFDclEsR0FBRyxDQUFDO01BQzFCO01BQ0EsTUFBTXNRLGVBQWUsR0FBRztRQUN2QnRRLEdBQUcsRUFBRUEsR0FBRztRQUNSakosMEJBQTBCLEVBQUUrWSxjQUFjLENBQUMvWSwwQkFBMEI7UUFDckVILEtBQUssRUFBRWtaLGNBQWMsQ0FBQ2xaLEtBQUssSUFBSWtCLFNBQVM7UUFDeEN5WSxRQUFRLEVBQUU7VUFDVEMsTUFBTSxFQUFFVixjQUFjLENBQUNTLFFBQVEsRUFBRUMsTUFBTTtVQUN2Q0MsU0FBUyxFQUFFWCxjQUFjLENBQUNTLFFBQVEsS0FBS3pZLFNBQVMsR0FBRzRZLFNBQVMsQ0FBQ0MsS0FBSyxHQUFHYixjQUFjLENBQUNTLFFBQVEsQ0FBQ0U7UUFDOUYsQ0FBQztRQUNEaFEsYUFBYSxFQUFFQyx3QkFBd0IsQ0FBQ3hLLGdCQUFnQjtNQUN6RCxDQUFDO01BQ0QsSUFBSTBaLGdCQUFnQixDQUFDRSxjQUFjLEVBQUU5UCxHQUFHLENBQUMsRUFBRTtRQUMxQyxNQUFNNFEscUNBQXNGLEdBQUc7VUFDOUYsR0FBR04sZUFBZTtVQUNsQnRaLFVBQVUsRUFBRThZLGNBQWMsRUFBRTlZLFVBQVU7VUFDdENDLGVBQWUsRUFBRTZZLGNBQWMsRUFBRTdZLGVBQWU7VUFDaERDLFlBQVksRUFBRTRZLGNBQWMsRUFBRTVZLFlBQVk7VUFDMUM2RCxJQUFJLEVBQUVuRixVQUFVLENBQUNzSyxVQUFVO1VBQzNCL0ksV0FBVyxFQUFFVyxTQUFTO1VBQ3RCVixRQUFRLEVBQUUwWSxjQUFjLENBQUMxWSxRQUFRO1VBQ2pDQyxhQUFhLEVBQUVrUixnQ0FBZ0MsQ0FBQ3VILGNBQWMsQ0FBQ3pZLGFBQWEsQ0FBQztVQUM3RUMsY0FBYyxFQUFFdVosdUJBQXVCLENBQ3RDZixjQUFjLEVBQUV4WSxjQUFjLEVBQzlCbkIsaUJBQWlCLEVBQ2pCRCxnQkFBZ0IsRUFDaEJnRixVQUFVLEVBQ1ZwRCxTQUFTLEVBQ1RrSSxHQUNEO1FBQ0QsQ0FBQztRQUNEMlAsZUFBZSxDQUFDM1AsR0FBRyxDQUFDLEdBQUc0USxxQ0FBcUM7TUFDN0QsQ0FBQyxNQUFNO1FBQ04sTUFBTS9ZLGFBQW1DLEdBQUdnVyxpQkFBaUIsQ0FDNURpQyxjQUFjLENBQUNoVCxVQUFVLEVBQ3pCM0csaUJBQWlCLEVBQ2pCRCxnQkFBZ0IsRUFDaEJnRixVQUNELENBQUM7UUFDRCxNQUFNNFYsV0FBVyxHQUFHNWEsZ0JBQWdCLENBQUM2YSxzQkFBc0IsQ0FBQ2pCLGNBQWMsQ0FBQ3JDLE9BQU8sQ0FBQztVQUNsRnVELFVBQVUsR0FBRzlhLGdCQUFnQixDQUFDNmEsc0JBQXNCLENBQUNqQixjQUFjLENBQUNtQixNQUFNLENBQUM7UUFFNUUsTUFBTUMsMEJBQXVELEdBQUdyWixhQUFhLEdBQzFFZ1osdUJBQXVCLENBQUNmLGNBQWMsRUFBRXhZLGNBQWMsRUFBRW5CLGlCQUFpQixFQUFFRCxnQkFBZ0IsRUFBRWdGLFVBQVUsRUFBRXJELGFBQWEsQ0FBQyxHQUN2SCxJQUFJO1FBQ1AsTUFBTXNaLGtCQUFrQixHQUFHO1VBQzFCLEdBQUdiLGVBQWU7VUFDbEJXLE1BQU0sRUFBRUQsVUFBVTtVQUNsQmhhLFVBQVUsRUFBRThZLGNBQWMsRUFBRTlZLFVBQVUsSUFBSWlULFVBQVUsQ0FBQ0csSUFBSTtVQUN6RG5ULGVBQWUsRUFBRTZZLGNBQWMsRUFBRTdZLGVBQWUsSUFBSW1hLGVBQWUsQ0FBQ0MsS0FBSztVQUN6RW5hLFlBQVksRUFBRTRZLGNBQWMsRUFBRTVZLFlBQVksSUFBSSxTQUFTO1VBQ3ZEdUwsUUFBUSxFQUFFcU4sY0FBYyxDQUFDck4sUUFBUTtVQUNqQzVLLGFBQWEsRUFBRUEsYUFBYTtVQUM1QlAsY0FBYyxFQUFFNFosMEJBQTBCO1VBQzFDSSxFQUFFLEVBQUUsaUJBQWlCdFIsR0FBRyxFQUFFO1VBQzFCNUcsSUFBSSxFQUFFLGlCQUFpQjRHLEdBQUcsRUFBRTtVQUM1QjtVQUNBM0ksYUFBYSxFQUFFO1lBQUVtUixhQUFhLEVBQUU7VUFBRSxDQUFDO1VBQ25DakksV0FBVyxFQUFFLEtBQUs7VUFDbEJwSixXQUFXLEVBQUUsS0FBSztVQUNsQmtJLFFBQVEsRUFBRSxLQUFLO1VBQ2Y4TixjQUFjLEVBQUU7WUFBRUMsZ0JBQWdCLEVBQUU7VUFBSyxDQUFDO1VBQzFDSyxPQUFPLEVBQUVxRCxXQUFXLEdBQUdBLFdBQVcsR0FBR0UsVUFBVTtVQUMvQ2xVLFVBQVUsRUFBRWdULGNBQWMsQ0FBQ2hULFVBQVU7VUFDckNnRSxRQUFRLEVBQ1BnUCxjQUFjLENBQUNoUCxRQUFRLElBQ3ZCNUssZ0JBQWdCLENBQUNnWixlQUFlLENBQUMsQ0FBQyxLQUFLQyxZQUFZLENBQUNDLFVBQVUsSUFDOURsWixnQkFBZ0IsQ0FBQ2daLGVBQWUsQ0FBQyxDQUFDLEtBQUtDLFlBQVksQ0FBQ0Usa0JBQWtCLEdBQ25FMUssaUJBQWlCLENBQUMvRCxFQUFFLENBQUMwTyxVQUFVLENBQUMsR0FDaEN4WDtRQUNMLENBQUM7UUFDRCxJQUFJRCxhQUFhLEVBQUU7VUFDbEJvWSxzQ0FBc0MsQ0FBQ3BZLGFBQWEsRUFBRTFCLGlCQUFpQixDQUFDO1FBQ3pFO1FBQ0EsSUFBSTBaLFlBQVksQ0FBQ0MsY0FBYyxDQUFDLEVBQUU7VUFDakMsTUFBTXlCLGlCQUF3RCxHQUFHO1lBQ2hFLEdBQUdKLGtCQUFrQjtZQUNyQnBXLElBQUksRUFBRW5GLFVBQVUsQ0FBQ21hO1VBQ2xCLENBQUM7VUFDREosZUFBZSxDQUFDM1AsR0FBRyxDQUFDLEdBQUd1UixpQkFBaUI7UUFDekMsQ0FBQyxNQUFNLElBQUl2QixjQUFjLENBQUNGLGNBQWMsQ0FBQyxFQUFFO1VBQzFDLE1BQU15QixpQkFBd0QsR0FBRztZQUNoRSxHQUFHSixrQkFBa0I7WUFDckJwVyxJQUFJLEVBQUVuRixVQUFVLENBQUM0YjtVQUNsQixDQUFDO1VBQ0Q3QixlQUFlLENBQUMzUCxHQUFHLENBQUMsR0FBR3VSLGlCQUFpQjtRQUN6QyxDQUFDLE1BQU07VUFDTixNQUFNRSxPQUFPLEdBQUcsMEJBQTBCelIsR0FBRywyQ0FBMkM7VUFDeEY5SixnQkFBZ0IsQ0FDZHdiLGNBQWMsQ0FBQyxDQUFDLENBQ2hCQyxRQUFRLENBQ1JDLGFBQWEsQ0FBQ0MsUUFBUSxFQUN0QkMsYUFBYSxDQUFDQyxHQUFHLEVBQ2pCTixPQUFPLEVBQ1BPLGlCQUFpQixFQUNqQkEsaUJBQWlCLEVBQUVDLGlCQUFpQixFQUFFQyxVQUN2QyxDQUFDO1FBQ0g7TUFDRDtJQUNEO0lBQ0EsT0FBT3ZDLGVBQWU7RUFDdkIsQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU3BZLGtCQUFrQkEsQ0FDakNiLFlBQTJCLEVBQzNCVixTQUFvQixFQUNwQkMsaUJBQXlCLEVBQ3pCQyxnQkFBeUQsRUFDekM7SUFDaEIsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDc0csUUFBUSxDQUFDeEcsU0FBUyxDQUFDLEVBQUU7TUFDdkU7TUFDQSxPQUFPVSxZQUFZO0lBQ3BCOztJQUVBO0lBQ0E7SUFDQTtJQUNBLE1BQU15Yiw2QkFBc0QsR0FBR3piLFlBQVksQ0FBQ2dCLElBQUksQ0FDOUVDLE1BQU0sSUFBS0EsTUFBTSxDQUFDTixhQUFhLEVBQUU0VixzQkFBc0IsS0FBS25WLFNBQVMsSUFBSUgsTUFBTSxDQUFDTixhQUFhLEVBQUU0VixzQkFBc0IsS0FBSyxJQUM1SCxDQUFDO0lBQ0QsSUFBSWtGLDZCQUE2QixFQUFFOWEsYUFBYSxFQUFFO01BQ2pEO01BQ0E4YSw2QkFBNkIsQ0FBQzlhLGFBQWEsQ0FBQzRWLHNCQUFzQixHQUFHLEtBQUs7O01BRTFFO01BQ0EsTUFBTW1GLHlCQUE4QyxHQUFHO1FBQ3REcFMsR0FBRyxFQUFFLHFCQUFxQjtRQUMxQjVHLElBQUksRUFBRSxxQkFBcUI7UUFDM0JpWixXQUFXLEVBQUVGLDZCQUE2QixDQUFDL1ksSUFBSTtRQUMvQ2taLHFCQUFxQixFQUFFLElBQUk7UUFDM0JwYixZQUFZLEVBQUUsU0FBUztRQUN2QjRILEtBQUssRUFBRSx3REFBd0Q7UUFDL0QyTyxPQUFPLEVBQUUsd0RBQXdEO1FBQ2pFMVMsSUFBSSxFQUFFbkYsVUFBVSxDQUFDMmMsUUFBUTtRQUN6QmxiLGFBQWEsRUFBRSxJQUFJO1FBQ25CQyxjQUFjLEVBQUUsSUFBSTtRQUNwQmtiLGlCQUFpQixFQUFFLElBQUk7UUFDdkIzYSxhQUFhLEVBQUVDLFNBQVM7UUFDeEIySSxhQUFhLEVBQUU7TUFDaEIsQ0FBQzs7TUFFRDtNQUNBLE1BQU1nUyx5QkFBOEIsR0FBRy9iLFlBQVksQ0FBQ2djLFNBQVMsQ0FBRS9hLE1BQU0sSUFBS0EsTUFBTSxDQUFDVCxZQUFZLEtBQUssUUFBUSxDQUFDO01BQzNHUixZQUFZLENBQUNpYyxNQUFNLENBQUNGLHlCQUF5QixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUVMLHlCQUF5QixDQUFDO0lBQ2pGOztJQUVBO0lBQ0E7SUFDQTtJQUNBO0lBQ0EsTUFBTVEseUJBQXdDLEdBQUdsYyxZQUFZLENBQUNvRixNQUFNLENBQUVuRSxNQUFNLElBQUtBLE1BQU0sQ0FBQ04sYUFBYSxFQUFFMFMsaUJBQWlCLEtBQUssSUFBSSxDQUFDO0lBQ2xJLElBQ0M2SSx5QkFBeUIsQ0FBQ3RWLE1BQU0sSUFDaENwSCxnQkFBZ0IsQ0FBQ2daLGVBQWUsQ0FBQyxDQUFDLEtBQUtDLFlBQVksQ0FBQ0MsVUFBVSxLQUM3RGpPLFdBQVcsQ0FBQzBSLFdBQVcsQ0FBQzNjLGdCQUFnQixDQUFDK1IsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJOUcsV0FBVyxDQUFDMlIsV0FBVyxDQUFDNWMsZ0JBQWdCLENBQUMrUixZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDckg7TUFDRDtNQUNBMksseUJBQXlCLENBQUN2YSxPQUFPLENBQUUwYSx3QkFBcUMsSUFBSztRQUM1RSxJQUFJQSx3QkFBd0IsRUFBRTFiLGFBQWEsRUFBRTtVQUM1QzBiLHdCQUF3QixDQUFDMWIsYUFBYSxDQUFDMFMsaUJBQWlCLEdBQUcsS0FBSztRQUNqRTtNQUNELENBQUMsQ0FBQzs7TUFFRjtNQUNBLE1BQU1pSixvQkFBeUMsR0FBRztRQUNqRGhULEdBQUcsRUFBRSxhQUFhO1FBQ2xCNUcsSUFBSSxFQUFFLGFBQWE7UUFDbkJpWixXQUFXLEVBQUVPLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUFDeFosSUFBSTtRQUM5QzZaLGdCQUFnQixFQUFFLElBQUk7UUFDdEIvYixZQUFZLEVBQUUsU0FBUztRQUN2QjRILEtBQUssRUFBRSxtREFBbUQ7UUFDMUQyTyxPQUFPLEVBQUUsbURBQW1EO1FBQzVEMVMsSUFBSSxFQUFFbkYsVUFBVSxDQUFDMmMsUUFBUTtRQUN6QmxiLGFBQWEsRUFBRSxJQUFJO1FBQ25CQyxjQUFjLEVBQUUsSUFBSTtRQUNwQm1KLGFBQWEsRUFBRSxLQUFLO1FBQ3BCK1IsaUJBQWlCLEVBQUU7TUFDcEIsQ0FBQztNQUNELElBQUlVLHdCQUE2QixHQUFHLENBQUM7TUFDckMsSUFBSWYsNkJBQTZCLEVBQUU7UUFDbEM7UUFDQWUsd0JBQXdCLEdBQ3ZCeGMsWUFBWSxDQUFDZ2MsU0FBUyxDQUFFL2EsTUFBTSxJQUFNQSxNQUFNLENBQXlCMmEscUJBQXFCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQztNQUN4RyxDQUFDLE1BQU07UUFDTjtRQUNBWSx3QkFBd0IsR0FBR3hjLFlBQVksQ0FBQ2djLFNBQVMsQ0FBRS9hLE1BQU0sSUFBS0EsTUFBTSxDQUFDVCxZQUFZLEtBQUssUUFBUSxDQUFDO01BQ2hHO01BQ0FSLFlBQVksQ0FBQ2ljLE1BQU0sQ0FBQ08sd0JBQXdCLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRUYsb0JBQW9CLENBQUM7SUFDM0U7SUFFQSxPQUFPdGMsWUFBWTtFQUNwQjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBSkFiLFFBQUEsQ0FBQTBCLGtCQUFBLEdBQUFBLGtCQUFBO0VBS08sU0FBU3lULHFCQUFxQkEsQ0FBQzlVLGdCQUF5RCxFQUFrQjtJQUNoSCxPQUFPaWQsNkJBQTZCLENBQ25DamQsZ0JBQWdCLENBQUNrQyxzQkFBc0IsQ0FBQyxDQUFDLEVBQ3hDZ2IsWUFBWSxJQUFLO01BQ2pCLE9BQVFBLFlBQVksRUFBb0RDLGtCQUFrQixFQUFFQyxrQkFBa0I7SUFDL0csQ0FBQyxFQUNELEtBQ0QsQ0FBQztFQUNGOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUxBemQsUUFBQSxDQUFBbVYscUJBQUEsR0FBQUEscUJBQUE7RUFNQSxTQUFTc0QsMkJBQTJCQSxDQUFDbFYsSUFBWSxFQUFFbEQsZ0JBQXlELEVBQVc7SUFDdEgsT0FBTzhVLHFCQUFxQixDQUFDOVUsZ0JBQWdCLENBQUMsQ0FDNUMwRixHQUFHLENBQUVsRCxRQUFRLElBQUtBLFFBQVEsQ0FBQ21ELE9BQU8sRUFBRXdCLGtCQUFrQixDQUFDLENBQ3ZEYixRQUFRLENBQUNwRCxJQUFJLENBQUM7RUFDakI7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVNnSixpQkFBaUJBLENBQ3pCcEQsUUFBNEIsRUFJbkI7SUFBQSxJQUhUMEMsV0FBVyxHQUFBb0QsU0FBQSxDQUFBeEgsTUFBQSxRQUFBd0gsU0FBQSxRQUFBaE4sU0FBQSxHQUFBZ04sU0FBQSxNQUFHLEtBQUs7SUFBQSxJQUNuQnlPLFVBQVUsR0FBQXpPLFNBQUEsQ0FBQXhILE1BQUEsUUFBQXdILFNBQUEsUUFBQWhOLFNBQUEsR0FBQWdOLFNBQUEsTUFBRyxLQUFLO0lBQUEsSUFDbEJ4TixjQUFxQyxHQUFBd04sU0FBQSxDQUFBeEgsTUFBQSxPQUFBd0gsU0FBQSxNQUFBaE4sU0FBQTtJQUVyQyxJQUFJMGIsY0FBYyxHQUFHLFFBQVE7SUFDN0IsSUFBSSxDQUFDeFUsUUFBUSxJQUFJMUgsY0FBYyxFQUFFaUcsb0JBQW9CLEVBQUU7TUFDdEQsT0FBT2lXLGNBQWM7SUFDdEI7SUFDQSxJQUFJbGMsY0FBYyxFQUFFaWMsVUFBVSxJQUFJQSxVQUFVLEVBQUU7TUFDN0MsT0FBTyxVQUFVO0lBQ2xCO0lBQ0EsSUFBSTdSLFdBQVcsRUFBRTtNQUNoQixPQUFPLFVBQVU7SUFDbEI7SUFDQSxJQUFJcEssY0FBYyxFQUFFb0wsSUFBSSxFQUFFO01BQ3pCLE9BQU84USxjQUFjO0lBQ3RCO0lBQ0EsUUFBUXhVLFFBQVE7TUFDZixLQUFLLGFBQWE7TUFDbEIsS0FBSyxXQUFXO01BQ2hCLEtBQUssV0FBVztNQUNoQixLQUFLLFlBQVk7TUFDakIsS0FBSyxVQUFVO1FBQ2R3VSxjQUFjLEdBQUcsUUFBUTtRQUN6QjtNQUNELEtBQUssZ0JBQWdCO01BQ3JCLEtBQUssVUFBVTtRQUNkQSxjQUFjLEdBQUcsTUFBTTtRQUN2QjtNQUNELEtBQUssb0JBQW9CO1FBQ3hCQSxjQUFjLEdBQUcsVUFBVTtRQUMzQjtNQUNELEtBQUssZUFBZTtRQUNuQkEsY0FBYyxHQUFHLE1BQU07UUFDdkI7TUFDRCxLQUFLLGFBQWE7UUFDakJBLGNBQWMsR0FBRyxTQUFTO1FBQzFCO01BQ0Q7UUFDQ0EsY0FBYyxHQUFHLFFBQVE7SUFDM0I7SUFDQSxPQUFPQSxjQUFjO0VBQ3RCOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTdlMsV0FBV0EsQ0FBQ3ZJLFFBQWtCLEVBQUVmLE1BQTZCLEVBQVE7SUFDN0UsTUFBTThWLE9BQU8sR0FBR3BJLFdBQVcsQ0FBQzNNLFFBQVEsQ0FBQyxJQUFJZixNQUFNLENBQUNtSCxLQUFLO0lBQ3JELElBQUkyTyxPQUFPLEVBQUU7TUFDWjlWLE1BQU0sQ0FBQzhWLE9BQU8sR0FBR0EsT0FBTztJQUN6QjtFQUNEO0VBRUEsU0FBUzFOLHFDQUFxQ0EsQ0FDN0NoSSxZQUFvQixFQUNwQjdCLGdCQUF5RCxFQUNsQztJQUN2QixNQUFNd1csb0JBQW9CLEdBQUdqVSxvQkFBb0IsQ0FBQ3ZDLGdCQUFnQixDQUFDa0Msc0JBQXNCLENBQUMsQ0FBQyxFQUFFTCxZQUFZLENBQUMsQ0FBQzJVLG9CQUFvQjtJQUMvSCxJQUFJQSxvQkFBb0IsRUFBRXBQLE1BQU0sR0FBRyxDQUFDLEVBQUU7TUFDckMsTUFBTXdDLGlDQUEyQyxHQUFHLEVBQUU7TUFDdEQ0TSxvQkFBb0IsQ0FBQ3JVLE9BQU8sQ0FBRW9iLFdBQVcsSUFBSztRQUM3QzNULGlDQUFpQyxDQUFDbEMsSUFBSSxDQUFDbUIsUUFBUSxDQUFDMFUsV0FBVyxDQUFDLElBQUlBLFdBQVcsQ0FBQ3JhLElBQUksQ0FBQztNQUNsRixDQUFDLENBQUM7TUFDRixPQUFPMEcsaUNBQWlDO0lBQ3pDO0VBQ0Q7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBUzhOLCtCQUErQkEsQ0FDdkMxWCxnQkFBeUQsRUFDekRzQywyQkFBd0UsRUFDeEVrYixRQUFnQyxFQUNoQ3pZLGtCQUE0QyxFQUM1Q2xELFlBQW9CLEVBQ3BCc0Qsd0JBQWtELEVBQzNDO0lBQ1AsTUFBTXNZLG1CQUFtQixHQUN4Qm5iLDJCQUEyQixDQUFDa1Usb0JBQW9CLENBQUNwUCxNQUFNLEtBQUtwSCxnQkFBZ0IsQ0FBQ2tDLHNCQUFzQixDQUFDLENBQUMsQ0FBQ3NVLG9CQUFvQixDQUFDcFAsTUFBTTtJQUNsSSxJQUFJcVcsbUJBQW1CLElBQUl2RixXQUFXLENBQUNzRixRQUFRLENBQUMsRUFBRTtNQUNqRHpZLGtCQUFrQixDQUFDbEQsWUFBWSxDQUFDLEdBQUcyYixRQUFRLENBQUN2USxLQUFLLENBQUN0SCxPQUFPO01BQ3pEUix3QkFBd0IsQ0FBQ3dDLHFCQUFxQixDQUFDRCxJQUFJLENBQUM3RixZQUFZLENBQUM7SUFDbEUsQ0FBQyxNQUFNLElBQUl3WCx3QkFBd0IsQ0FBQ21FLFFBQVEsQ0FBQyxJQUFJL0UsbUJBQW1CLENBQUMrRSxRQUFRLENBQUMsRUFBRTtNQUM5RUEsUUFBUSxDQUFDeFEsTUFBTSxDQUFDckgsT0FBTyxDQUFnQitJLElBQUksQ0FBQ3ZNLE9BQU8sQ0FBRXdTLEtBQUssSUFBSztRQUMvRCxJQUFJdUQsV0FBVyxDQUFDdkQsS0FBSyxDQUFDLElBQUl4USxjQUFjLENBQUN3USxLQUFLLENBQUMxSCxLQUFLLENBQUN0SCxPQUFPLEVBQUVyRCwyQkFBMkIsQ0FBQzhCLGdCQUFnQixDQUFDLEtBQUssYUFBYSxFQUFFO1VBQzlILE1BQU1zWixrQ0FBa0MsR0FBR25iLG9CQUFvQixDQUM5RHZDLGdCQUFnQixDQUFDa0Msc0JBQXNCLENBQUMsQ0FBQyxFQUN6Q3lTLEtBQUssQ0FBQzFILEtBQUssQ0FBQzFMLElBQ2IsQ0FBQztVQUNELE1BQU1vYywwQkFBMEIsR0FDL0JELGtDQUFrQyxDQUFDbEgsb0JBQW9CLENBQUNwUCxNQUFNLEtBQzlEcEgsZ0JBQWdCLENBQUNrQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUNzVSxvQkFBb0IsQ0FBQ3BQLE1BQU07VUFDdEUsSUFBSXVXLDBCQUEwQixFQUFFO1lBQy9CNVksa0JBQWtCLENBQUM0UCxLQUFLLENBQUMxSCxLQUFLLENBQUMxTCxJQUFJLENBQUMsR0FBR29ULEtBQUssQ0FBQzFILEtBQUssQ0FBQ3RILE9BQU87WUFDMURSLHdCQUF3QixDQUFDd0MscUJBQXFCLENBQUNELElBQUksQ0FBQ2lOLEtBQUssQ0FBQzFILEtBQUssQ0FBQzFMLElBQUksQ0FBQztVQUN0RTtRQUNEO01BQ0QsQ0FBQyxDQUFDO0lBQ0g7RUFDRDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxTQUFTMEgsYUFBYUEsQ0FBQ3pHLFFBQXVELEVBQUVzRyxRQUFpQixFQUFzQjtJQUM3SCxJQUFJOFUsYUFBYTtNQUNoQnpjLGFBQW9ELEdBQUcsQ0FBQyxDQUFDO0lBQzFELElBQUl3SyxVQUFVLENBQUNuSixRQUFRLENBQUMsRUFBRTtNQUN6Qm9iLGFBQWEsR0FBR0MsZ0JBQWdCLENBQUNyYixRQUFRLENBQUM2RCxVQUFVLENBQUMsR0FDbER5WCxnQkFBZ0IsQ0FBQ3RiLFFBQVEsQ0FBQzZELFVBQVUsQ0FBQzBYLGNBQWMsQ0FBQyxHQUNwREQsZ0JBQWdCLENBQUN0YixRQUFRLENBQUNxQyxJQUFJLENBQUM7SUFDbkM7SUFDQSxJQUFJLENBQUMrWSxhQUFhLElBQUk5VSxRQUFRLEtBQUtsSCxTQUFTLEVBQUU7TUFDN0NnYyxhQUFhLEdBQUdFLGdCQUFnQixDQUFDaFYsUUFBUSxDQUFDO0lBQzNDO0lBQ0EsTUFBTUUsa0JBQXNDLEdBQUc7TUFDOUNuRSxJQUFJLEVBQUUrWSxhQUFhLEVBQUUvWTtJQUN0QixDQUFDO0lBQ0QsSUFBSStZLGFBQWEsSUFBSWpTLFVBQVUsQ0FBQ25KLFFBQVEsQ0FBQyxFQUFFO01BQzFDLE1BQU1pSCxXQUFXLEdBQUd1VSxnQkFBZ0IsQ0FBQ0osYUFBYSxFQUFFcGIsUUFBUSxDQUFDO01BQzdELElBQUlrRSxNQUFNLENBQUNDLElBQUksQ0FBQzhDLFdBQVcsQ0FBQyxDQUFDckMsTUFBTSxFQUFFO1FBQ3BDNEIsa0JBQWtCLENBQUNTLFdBQVcsR0FBR0EsV0FBVztNQUM3QztJQUNEO0lBQ0EsSUFBSVQsa0JBQWtCLENBQUNuRSxJQUFJLEtBQUssZ0NBQWdDLEVBQUU7TUFDakUsSUFDQ21FLGtCQUFrQixFQUFFbkUsSUFBSSxFQUFFdU0sT0FBTyxDQUFDLDZCQUE2QixDQUFDLEtBQUssQ0FBQyxJQUN0RXBJLGtCQUFrQixFQUFFbkUsSUFBSSxFQUFFdU0sT0FBTyxDQUFDLGdDQUFnQyxDQUFDLEtBQUssQ0FBQyxFQUN4RTtRQUNEalEsYUFBYSxHQUFHO1VBQUU4YyxhQUFhLEVBQUUsS0FBSztVQUFFQyxXQUFXLEVBQUU7UUFBRyxDQUFDO01BQzFEO01BQ0EsSUFBSWxWLGtCQUFrQixDQUFDbkUsSUFBSSxLQUFLLGdDQUFnQyxJQUFJbUUsa0JBQWtCLENBQUNTLFdBQVcsRUFBRTBVLFFBQVEsS0FBSyxLQUFLLEVBQUU7UUFDdkhoZCxhQUFhLEdBQUc7VUFBRWlkLHFCQUFxQixFQUFFO1FBQUssQ0FBQztNQUNoRDtJQUNEO0lBQ0EsSUFBSTFYLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDeEYsYUFBYSxDQUFDLENBQUNpRyxNQUFNLEVBQUU7TUFDdEM0QixrQkFBa0IsQ0FBQzdILGFBQWEsR0FBR0EsYUFBYTtJQUNqRDtJQUNBLE9BQU82SCxrQkFBa0I7RUFDMUI7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEFySixRQUFBLENBQUFzSixhQUFBLEdBQUFBLGFBQUE7RUFNQSxTQUFTbEMsa0RBQWtEQSxDQUMxRDdCLHFDQUFrRSxFQUNsRXFCLHFCQUEwQyxFQUMxQ2lSLG1CQUEyQixFQUNwQjtJQUNQLElBQ0NqUixxQkFBcUIsQ0FBQ0ssVUFBVSxDQUFDNFEsbUJBQW1CLENBQUMsQ0FBQ0Msc0NBQXNDLElBQzVGLENBQUN2UyxxQ0FBcUMsQ0FBQ3NTLG1CQUFtQixDQUFDLEVBQzFEO01BQ0R0UyxxQ0FBcUMsQ0FBQ3NTLG1CQUFtQixDQUFDLEdBQ3pEalIscUJBQXFCLENBQUNLLFVBQVUsQ0FBQzRRLG1CQUFtQixDQUFDLENBQUNDLHNDQUF1QztJQUMvRjtFQUNEOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVNySCw2QkFBNkJBLENBQUNQLGVBQXdDLEVBQUUzTSxJQUFZLEVBQUV6QixNQUE2QixFQUFRO0lBQ25JLE1BQU00Yyx3QkFBd0IsR0FBR3hPLGVBQWUsQ0FBQ2pLLE1BQU0sQ0FDckQwWSxjQUFjLElBQ2JBLGNBQWMsQ0FBQzNjLGFBQWEsRUFBRTJFLFFBQVEsQ0FBQ3BELElBQUksQ0FBQyxJQUFJb2IsY0FBYyxDQUFDaEgsZ0JBQWdCLElBQy9FZ0gsY0FBYyxDQUFDaEgsZ0JBQWdCLElBQUlnSCxjQUFjLENBQUN6YyxZQUFZLEtBQUtKLE1BQU0sQ0FBQ0ksWUFDN0UsQ0FBQztJQUNESixNQUFNLENBQUM2VixnQkFBZ0IsR0FBRyxDQUFDLENBQUMrRyx3QkFBd0IsQ0FBQ2pYLE1BQU07SUFDM0QsSUFDQ2lYLHdCQUF3QixDQUFDalgsTUFBTSxJQUMvQixDQUFDaVgsd0JBQXdCLEVBQUVqWSxJQUFJLENBQUUxRSxnQkFBZ0IsSUFBS0EsZ0JBQWdCLENBQUNWLFlBQVksS0FBSyxRQUFRLENBQUMsRUFDaEc7TUFDRFMsTUFBTSxDQUFDMEgsUUFBUSxHQUFHLEtBQUs7TUFDdkIxSCxNQUFNLENBQUM0SSxXQUFXLEdBQUcsS0FBSztNQUMxQjVJLE1BQU0sQ0FBQzJILFVBQVUsR0FBRyxLQUFLO0lBQzFCO0VBQ0Q7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTdVIsdUJBQXVCQSxDQUMvQnZaLGNBQWdELEVBQ2hEbkIsaUJBQTBDLEVBQzFDRCxnQkFBeUQsRUFDekRnRixVQUFzQixFQUN0QnJELGFBQXdCLEVBQ3hCNGMsU0FBa0IsRUFDWTtJQUM5QixJQUFJQyxxQkFBcUI7SUFDekIsSUFBSUQsU0FBUyxFQUFFO01BQ2RDLHFCQUFxQixHQUFHdmUsaUJBQWlCLENBQUN1QixJQUFJLENBQUVFLGdCQUFnQixJQUFLQSxnQkFBZ0IsQ0FBQ29JLEdBQUcsS0FBS3lVLFNBQVMsQ0FBQztNQUN4RyxJQUFJQyxxQkFBcUIsRUFBRXBkLGNBQWMsS0FBSyxJQUFJLEVBQUU7UUFDbkQsT0FBT29kLHFCQUFxQixFQUFFcGQsY0FBYztNQUM3QztJQUNEO0lBQ0EsTUFBTXFkLGNBQWMsR0FDbkJyZCxjQUFjLEVBQUVvTCxJQUFJLEtBQ25CLENBQUMsRUFBRXBMLGNBQWMsRUFBRW9CLFFBQVEsSUFBSXBCLGNBQWMsQ0FBQ29CLFFBQVEsRUFBRTRFLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUV6RixhQUFhLElBQUlBLGFBQWEsQ0FBQ3lGLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN2SCxNQUFNc1gsb0JBQTBDLEdBQUc7TUFDbEQsR0FBR0YscUJBQXFCLEVBQUVwZCxjQUFjO01BQ3hDeUQsSUFBSSxFQUFFekQsY0FBYyxFQUFFeUQsSUFBSSxJQUFJMloscUJBQXFCLEVBQUVwZCxjQUFjLEVBQUV5RCxJQUFJO01BQ3pFMEgsUUFBUSxFQUNQbkwsY0FBYyxFQUFFbUwsUUFBUSxJQUN4QitNLHFCQUFxQixDQUFDM1gsYUFBYSxFQUFFUCxjQUFjLEVBQUVvQixRQUFRLENBQUMsSUFDOURnYyxxQkFBcUIsRUFBRXBkLGNBQWMsRUFBRW1MLFFBQVE7TUFDaEQvSixRQUFRLEVBQUVwQixjQUFjLEVBQUVvQixRQUFRLEdBQy9CbVYsaUJBQWlCLENBQUN2VyxjQUFjLEVBQUVvQixRQUFRLEVBQUV2QyxpQkFBaUIsRUFBRUQsZ0JBQWdCLEVBQUVnRixVQUFVLENBQUMsR0FDNUZwRCxTQUFTO01BQ1psQixLQUFLLEVBQUVVLGNBQWMsRUFBRVYsS0FBSztNQUM1QjhMLElBQUksRUFBRWlTO0lBQ1AsQ0FBQztJQUNELE9BQU8vUixpQ0FBaUMsQ0FBQ2dTLG9CQUFvQixDQUFDO0VBQy9EO0VBQUMsT0FBQS9lLFFBQUE7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==
1707
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb2x1bW5UeXBlIiwiX2V4cG9ydHMiLCJnZXRUYWJsZUNvbHVtbnMiLCJsaW5lSXRlbUFubm90YXRpb24iLCJ0YWJsZVR5cGUiLCJ2aXN1YWxpemF0aW9uUGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJhbm5vdGF0aW9uQ29sdW1ucyIsImdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMiLCJtYW5pZmVzdENvbHVtbnMiLCJnZXRDb2x1bW5zRnJvbU1hbmlmZXN0IiwiZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbiIsImNvbHVtbnMiLCJnZXRBbm5vdGF0aW9uRW50aXR5VHlwZSIsInRhYmxlQ29sdW1ucyIsImluc2VydEN1c3RvbUVsZW1lbnRzIiwid2lkdGgiLCJPdmVycmlkZVR5cGUiLCJvdmVyd3JpdGUiLCJ3aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlciIsImltcG9ydGFuY2UiLCJob3Jpem9udGFsQWxpZ24iLCJhdmFpbGFiaWxpdHkiLCJpc05hdmlnYWJsZSIsInNldHRpbmdzIiwiZm9ybWF0T3B0aW9ucyIsImV4cG9ydFNldHRpbmdzIiwiYWRkQ29tcHV0ZWRDb2x1bW5zIiwiZmluZENvbHVtbkJ5UGF0aCIsInBhdGgiLCJmaW5kIiwiY29sdW1uIiwiYW5ub3RhdGlvbkNvbHVtbiIsInByb3BlcnR5SW5mb3MiLCJ1bmRlZmluZWQiLCJyZWxhdGl2ZVBhdGgiLCJ1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsImdldENvbnZlcnRlckNvbnRleHRGb3IiLCJnZXRDb250ZXh0UGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJmb3JFYWNoIiwib0NvbHVtbiIsInRhYmxlQ29sdW1uIiwicHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwiZW5oYW5jZURhdGFNb2RlbFBhdGgiLCJwcm9wZXJ0eSIsInRhcmdldE9iamVjdCIsImFkZEN1cnJlbmN5T3JVb01Ub1Byb3BlcnR5IiwidGltZXpvbmVQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5IiwidGltZXpvbmUiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIlRpbWV6b25lIiwib1RpbWV6b25lQ29sdW1uIiwibmFtZSIsInRpbWV6b25lVGV4dCIsInRvU3RyaW5nIiwiYWRkVGV4dEFycmFuZ2VudEluZm9Ub1Byb3BlcnR5IiwiY3VycmVuY3lPclVvTVByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoIiwiZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgiLCJjdXJyZW5jeU9yVW9NUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwiY3VycmVuY3lPclVvTVJlbGF0aXZlUGF0aCIsImdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgiLCJ1bml0Q29sdW1uIiwidW5pdCIsIk1lYXN1cmVzIiwiSVNPQ3VycmVuY3kiLCJVbml0IiwidW5pdFRleHQiLCJkaXNwbGF5TW9kZSIsImdldERpc3BsYXlNb2RlIiwidGFyZ2V0RW50aXR5VHlwZSIsInRleHRQcm9wZXJ0eVBhdGgiLCJnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5UGF0aCIsInRleHRQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgiLCJ0ZXh0UmVsYXRpdmVQYXRoIiwidGV4dENvbHVtbiIsInRleHRBcnJhbmdlbWVudCIsInRleHRQcm9wZXJ0eSIsIm1vZGUiLCJ0eXBlIiwiZ2V0Q29sdW1uc0Zyb21FbnRpdHlUeXBlIiwiY29sdW1uc1RvQmVDcmVhdGVkIiwiZW50aXR5VHlwZSIsInRhYmxlQ3JlYXRpb25Nb2RlIiwiZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCIsInJlc3RyaWN0aW9uc09uUHJvcGVydGllcyIsInByb3BlcnRpZXNOb3RUb0JlQ29uc2lkZXJlZCIsImFnZ3JlZ2F0aW9uSGVscGVyIiwiQWdncmVnYXRpb25IZWxwZXIiLCJncm91cGFibGVQcm9wZXJ0aWVzIiwiZ2V0R3JvdXBhYmxlUHJvcGVydGllcyIsImlzQW5hbHl0aWNzU3VwcG9ydGVkIiwibWFwIiwiJHRhcmdldCIsImZpbHRlciIsInRhcmdldCIsImdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHkiLCJ0ZXh0UHJvcCIsImlzUHJvcGVydHlHcm91cGFibGUiLCJwcm9wIiwiZW50aXR5UHJvcGVydGllcyIsImV4aXN0cyIsInNvbWUiLCJ0YXJnZXRUeXBlIiwiaW5jbHVkZXMiLCJyZWxhdGVkUHJvcGVydGllc0luZm8iLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMiLCJyZWxhdGVkUHJvcGVydHlOYW1lcyIsIk9iamVjdCIsImtleXMiLCJwcm9wZXJ0aWVzIiwiYWRkaXRpb25hbFByb3BlcnR5TmFtZXMiLCJhZGRpdGlvbmFsUHJvcGVydGllcyIsImFkZFByb3BlcnR5VG9EaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwIiwiY29sdW1uSW5mbyIsImdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkiLCJnZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwibGVuZ3RoIiwiZGF0YVBvaW50VGFyZ2V0VmFsdWUiLCJleHBvcnREYXRhUG9pbnRUYXJnZXRWYWx1ZSIsImFubm90YXRpb25Qcm9wZXJ0eSIsImFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zIiwiYWRkaXRpb25hbFByb3BlcnR5TmFtZSIsInB1c2giLCJub25Tb3J0YWJsZVByb3BlcnRpZXMiLCJpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiIsIlRleHQiLCJyZWxhdGVkQ29sdW1ucyIsIl9jcmVhdGVSZWxhdGVkQ29sdW1ucyIsImNvbmNhdCIsImZ1bGxQcm9wZXJ0eVBhdGgiLCJ1c2VEYXRhRmllbGRQcmVmaXgiLCJhdmFpbGFibGVGb3JBZGFwdGF0aW9uIiwicmVsYXRpdmVQYXRoRm9yTXVsdGlWYWx1ZSIsInNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGgiLCJnZXRTZW1hbnRpY09iamVjdFBhdGgiLCJpc0hpZGRlbiIsImlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuIiwiZ3JvdXBQYXRoIiwiX3NsaWNlQXRTbGFzaCIsImlzR3JvdXAiLCJsYWJlbCIsImdldExhYmVsIiwiZGF0YVR5cGUiLCJnZXREYXRhRmllbGREYXRhVHlwZSIsInByb3BlcnR5VHlwZUNvbmZpZyIsImdldFR5cGVDb25maWciLCJpc0FQcm9wZXJ0eUZyb21UZXh0T25seUFubm90YXRpb24iLCJzb3J0YWJsZSIsImlzQW5hbHl0aWNhbFRhYmxlIiwiZmlsdGVyYWJsZSIsIm5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIiwiZ3JvdXBhYmxlIiwidHlwZUNvbmZpZyIsImNsYXNzTmFtZSIsImNvbnN0cmFpbnRzIiwiX2lzRXhwb3J0YWJsZUNvbHVtbiIsImNyZWF0ZUNvbHVtbkV4cG9ydFNldHRpbmdzIiwiY29sbGVjdGVkTmF2aWdhdGlvblByb3BlcnR5TGFiZWxzIiwiX2dldENvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscyIsImtleSIsInJlcGxhY2VTcGVjaWFsQ2hhcnMiLCJBbm5vdGF0aW9uIiwiZ3JvdXBMYWJlbCIsImdyb3VwIiwiYW5ub3RhdGlvblBhdGgiLCJzZW1hbnRpY09iamVjdFBhdGgiLCJpc0dyb3VwYWJsZSIsImlzS2V5IiwiY2FzZVNlbnNpdGl2ZSIsImlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsImdldEltcG9ydGFuY2UiLCJVSSIsIkRhdGFGaWVsZERlZmF1bHQiLCJyZXF1aXJlZCIsImlzUmVxdWlyZWRDb2x1bW4iLCJhZGRpdGlvbmFsTGFiZWxzIiwiX2FkZFRvb2xUaXAiLCJfc2V0RXhwb3J0U2V0dGluZ3NGb3JEYXRhUG9pbnQiLCJzZXRUZWNobmljYWxFeHRlbnNpb24iLCJpc0RyYWZ0U3VwcG9ydGVkIiwiTW9kZWxIZWxwZXIiLCJpc09iamVjdFBhdGhEcmFmdFN1cHBvcnRlZCIsImRyYWZ0UHJvcGVydGllcyIsImlzRHJhZnRQcm9wZXJ0eSIsImlzR3JvdXBhYmxlUHJvcGVydHkiLCJleHRlbnNpb24iLCJ0ZWNobmljYWxseUFnZ3JlZ2F0YWJsZSIsInRlY2huaWNhbGx5R3JvdXBhYmxlIiwidW5pdFByb3BlcnR5IiwidXRjIiwiaXNBVGltZXpvbmUiLCJjdXJyZW5jeVByb3BlcnR5Iiwic2NhbGUiLCJpc1Byb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5IiwiZ2V0U3RhdGljVW5pdE9yQ3VycmVuY3kiLCJnZXRTdGF0aWNUaW1lem9uZSIsImlzVGltZXpvbmUiLCJleHBvcnRUeXBlIiwiZ2V0RXhwb3J0RGF0YVR5cGUiLCJpbnB1dEZvcm1hdCIsImdldERhdGVJbnB1dEZvcm1hdCIsImRlbGltaXRlciIsImdldERlbGltaXRlciIsInRlbXBsYXRlIiwid3JhcCIsImF1dG9TY2FsZSIsInJlbW92ZVVuZGVmaW5lZEZyb21FeHBvcnRTZXR0aW5ncyIsInNldHRpbmciLCJzb3VyY2UiLCJwcm9wZXJ0eVR5cGUiLCJkYXRhRmllbGREZWZhdWx0UHJvcGVydHkiLCIkVHlwZSIsIlRhcmdldCIsIlZhbHVlIiwiQ29yZSIsIk1lZGlhVHlwZSIsInRlcm0iLCJpc1VSTCIsIl9pc1ZhbGlkQ29sdW1uIiwiZGF0YUZpZWxkIiwiSW5saW5lIiwiX2dldFZpc2libGVFeHByZXNzaW9uIiwiZGF0YUZpZWxkTW9kZWxQYXRoIiwicHJvcGVydHlWYWx1ZSIsImlzQW5hbHl0aWNhbEdyb3VwSGVhZGVyRXhwYW5kZWQiLCJjb25zdGFudCIsImlzQW5hbHl0aWNhbExlYWYiLCJhbmQiLCJub3QiLCJlcXVhbCIsImdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbiIsIkhpZGRlbiIsImlmRWxzZSIsIm9yIiwiX2dldEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyIsImRhdGFGaWVsZEdyb3VwIiwiZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zIiwiY29tcGlsZUV4cHJlc3Npb24iLCJEYXRhIiwiaW5uZXJEYXRhRmllbGQiLCJhcmd1bWVudHMiLCJpc05hdmlnYXRpb25Qcm9wZXJ0eSIsImRhdGFGaWVsZERlZmF1bHQiLCJxdWFsaWZpZXIiLCJMYWJlbCIsImlzRGF0YUZpZWxkVHlwZXMiLCJ2YWx1ZU9mIiwiX2dldFRvb2x0aXAiLCJRdWlja0luZm8iLCJkYXRhcG9pbnRUYXJnZXQiLCJnZXRSb3dTdGF0dXNWaXNpYmlsaXR5IiwiY29sTmFtZSIsImlzU2VtYW50aWNLZXlJbkZpZWxkR3JvdXAiLCJmb3JtYXRSZXN1bHQiLCJwYXRoSW5Nb2RlbCIsInRhYmxlRm9ybWF0dGVycyIsImdldEVycm9yU3RhdHVzVGV4dFZpc2liaWxpdHlGb3JtYXR0ZXIiLCJleGlzdGluZ0NvbHVtbnMiLCJyZWxhdGVkUHJvcGVydHlOYW1lTWFwIiwiZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aCIsInJlbGF0ZWRDb2x1bW4iLCJwcm9wZXJ0eU9iamVjdFBhdGgiLCJpc011bHRpVmFsdWVGaWVsZCIsIm5ld05hbWVSZWxhdGl2ZVRhcmdldFBhdGgiLCJjb21wdXRlSGlkZGVuT25SZWxhdGVkQ29sdW1ucyIsIm5ld05hbWUiLCJwcm9wZXJ0eUluZm8iLCJfZ2V0QW5ub3RhdGlvbkNvbHVtbk5hbWUiLCJLZXlIZWxwZXIiLCJnZW5lcmF0ZUtleUZyb21EYXRhRmllbGQiLCJfZ2V0U2hvd0RhdGFGaWVsZHNMYWJlbCIsImZpZWxkR3JvdXBOYW1lIiwiY29sdW1uS2V5cyIsInNob3dEYXRhRmllbGRzTGFiZWwiLCJfZ2V0UmVsYXRpdmVQYXRoIiwidmFsdWUiLCJpc0xhc3RTbGFzaCIsImlzTGFzdFBhcnQiLCJpU2xhc2hJbmRleCIsImxhc3RJbmRleE9mIiwiaW5kZXhPZiIsInN1YnN0cmluZyIsIl9pc0NvbHVtbk11bHRpVmFsdWVkIiwiX2lzQ29sdW1uU29ydGFibGUiLCJwcm9wZXJ0eVBhdGgiLCJub25Tb3J0YWJsZUNvbHVtbnMiLCJwcm9wTmFtZSIsImZpbHRlckZ1bmN0aW9ucyIsIl9nZXRGaWx0ZXJGdW5jdGlvbnMiLCJDb252ZXJ0ZXJDb250ZXh0IiwiZW50aXR5U2V0IiwiZ2V0RW50aXR5U2V0IiwiVHlwZUd1YXJkcyIsImlzRW50aXR5U2V0IiwiQ2FwYWJpbGl0aWVzIiwiRmlsdGVyRnVuY3Rpb25zIiwiZ2V0RW50aXR5Q29udGFpbmVyIiwiX2dldERlZmF1bHRGb3JtYXRPcHRpb25zRm9yVGFibGUiLCJ0ZXh0TGluZXNFZGl0IiwiX2ZpbmRTZW1hbnRpY0tleVZhbHVlcyIsInNlbWFudGljS2V5cyIsImFTZW1hbnRpY0tleVZhbHVlcyIsImJTZW1hbnRpY0tleUZvdW5kIiwiaSIsInZhbHVlcyIsInNlbWFudGljS2V5Rm91bmQiLCJfZmluZFByb3BlcnRpZXMiLCJzZW1hbnRpY0tleVZhbHVlcyIsImZpZWxkR3JvdXBQcm9wZXJ0aWVzIiwic2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCIsInNQcm9wZXJ0eVBhdGgiLCJ0bXAiLCJmaWVsZEdyb3VwUHJvcGVydHlQYXRoIiwiX2ZpbmRTZW1hbnRpY0tleVZhbHVlc0luRmllbGRHcm91cCIsImFQcm9wZXJ0aWVzIiwiX3Byb3BlcnRpZXNGb3VuZCIsImdldERlZmF1bHREcmFmdEluZGljYXRvckZvckNvbHVtbiIsInNlbWFudGljS2V5Iiwic2VtYW50aWNLZXlJbkZpZWxkR3JvdXAiLCJmaWVsZEdyb3VwRHJhZnRJbmRpY2F0b3JQcm9wZXJ0eVBhdGgiLCJzaG93RXJyb3JPYmplY3RTdGF0dXMiLCJoYXNEcmFmdEluZGljYXRvciIsIl9nZXRJbXBOdW1iZXIiLCJJbXBvcnRhbmNlIiwiX2dldERhdGFGaWVsZEltcG9ydGFuY2UiLCJzcGxpdCIsIk5vbmUiLCJ0YXJnZXRWYWx1ZWZyb21EUCIsImdldFRhcmdldFZhbHVlT25EYXRhUG9pbnQiLCJpc0RhdGFQb2ludEZyb21EYXRhRmllbGREZWZhdWx0IiwiX2dldE1heEltcG9ydGFuY2UiLCJmaWVsZHMiLCJtYXhJbXBOdW1iZXIiLCJpbXBOdW1iZXIiLCJEYXRhRmllbGRXaXRoTWF4SW1wb3J0YW5jZSIsImZpZWxkIiwiU2VtYW50aWNLZXkiLCJyZXF1aXJlZFByb3BlcnRpZXMiLCJnZXRSZXF1aXJlZFByb3BlcnRpZXMiLCJoaWdoS2V5cyIsImZpZWxkc1dpdGhJbXBvcnRhbmNlIiwiaXNBbm5vdGF0aW9uT2ZUeXBlIiwiZGF0YUZpZWxkVGFyZ2V0IiwiZmllbGRHcm91cERhdGEiLCJmaWVsZEdyb3VwRGF0YUZpZWxkIiwiSGlnaCIsIml0ZW0iLCJnZXRSZXN0cmljdGlvbnNPblByb3BlcnRpZXMiLCJ0YWJsZU1hbmlmZXN0U2V0dGluZ3MiLCJkZWZhdWx0Q3JlYXRpb25Nb2RlIiwiZ2V0TWFuaWZlc3RXcmFwcGVyIiwiZ2V0U2FwRmVNYW5pZmVzdENvbmZpZ3VyYXRpb24iLCJtYWNyb3MiLCJ0YWJsZSIsIkNyZWF0aW9uTW9kZSIsIklubGluZUNyZWF0aW9uUm93cyIsInRhYmxlU2V0dGluZ3MiLCJjcmVhdGlvbk1vZGUiLCJnZXRBbm5vdGF0aW9uc0J5VGVybSIsImdldEVudGl0eVR5cGUiLCJ0YWJsZUNvbnZlcnRlckNvbnRleHQiLCJnZXRUYXJnZXRPYmplY3RQYXRoIiwiY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHkiLCJpc0ZpZWxkR3JvdXBDb2x1bW4iLCJuYXZpZ2F0aW9uUHJvcGVydGllcyIsInNpdHVhdGlvbnNOYXZQcm9wcyIsIm5hdmlnYXRpb25Qcm9wZXJ0eSIsImlzQ29sbGVjdGlvbiIsIlNBUE9iamVjdE5vZGVUeXBlIiwiTmFtZSIsInNpdHVhdGlvbnNOYXZQcm9wIiwiaGFzU2l0dWF0aW9uc0luZGljYXRvciIsImlzTXVsdGlWYWx1ZSIsInZpc3VhbFNldHRpbmdzIiwid2lkdGhDYWxjdWxhdGlvbiIsIkZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyIsIkhUTUw1IiwiQ3NzRGVmYXVsdHMiLCJpc1BhcnRPZkxpbmVJdGVtIiwidG9vbHRpcCIsInJlbGF0ZWRQcm9wZXJ0eU5hbWUiLCJkaXNwbGF5TW9kZU9mUHJvcGVydHlVc2VkQXNEZXNjcmlwdGlvbiIsImNyZWF0ZVByb3BlcnR5QW5ub3RhdGVkVGV4dE9ubHkiLCJfZ2V0UHJvcGVydHlOYW1lcyIsIm1hdGNoZWRQcm9wZXJ0aWVzIiwiQXJyYXkiLCJpc0FycmF5IiwicmVzb2x2ZVBhdGgiLCJpc1JlcXVpcmVkRmllbGRHcm91cCIsImZpZWxkR3JvdXAiLCJpc0RhdGFGaWVsZCIsImlzU3RhdGljYWxseU1hbmRhdG9yeSIsImlzQW5ub3RhdGVkUmVxdWlyZWRQcm9wZXJ0eSIsImlzUmVxdWlyZWREYXRhRmllbGRGb3JBbm5vdGF0aW9uIiwiZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiIsIkRhdGFGaWVsZEZvckFubm90YXRpb25GaWVsZENvbnRyb2xOb3RNYW5kYXRvcnkiLCJoYXNGaWVsZENvbnRyb2xOb3RNYW5kYXRvcnkiLCJoYXNGaWVsZEdyb3VwVGFyZ2V0IiwiaGFzRGF0YVBvaW50VGFyZ2V0IiwiVmlzdWFsaXphdGlvbiIsImlzUmVxdWlyZWREYXRhUG9pbnQiLCJpc1JlcXVpcmVkUHJvcGVydHkiLCJpc1JhdGluZ1Zpc3VhbGl6YXRpb25Gcm9tRGF0YUZpZWxkRGVmYXVsdCIsImRhdGFQb2ludCIsImdldFRlbXBsYXRlVHlwZSIsIlRlbXBsYXRlVHlwZSIsIkxpc3RSZXBvcnQiLCJBbmFseXRpY2FsTGlzdFBhZ2UiLCJJc0VkaXRhYmxlIiwiaXNEYXRhRmllbGRGb3JBbm5vdGF0aW9uIiwiX2FwcGVuZEN1c3RvbVRlbXBsYXRlIiwiZXhwb3J0UHJvcGVydGllcyIsImpvaW4iLCJpbnRlcm5hbENvbHVtbnMiLCJpc0NvbHVtbk92ZXJyaWRlIiwiaXNTbG90Q29sdW1uIiwibWFuaWZlc3RDb2x1bW4iLCJTbG90IiwiaXNDdXN0b21Db2x1bW4iLCJfdXBkYXRlTGlua2VkUHJvcGVydGllc09uQ3VzdG9tQ29sdW1ucyIsImFubm90YXRpb25UYWJsZUNvbHVtbnMiLCJyZXBsYWNlIiwiaXNQYXJ0T2ZDdXN0b21Db2x1bW4iLCJ2YWxpZGF0ZUtleSIsImJhc2VUYWJsZUNvbHVtbiIsInBvc2l0aW9uIiwiYW5jaG9yIiwicGxhY2VtZW50IiwiUGxhY2VtZW50IiwiQWZ0ZXIiLCJwcm9wZXJ0aWVzVG9PdmVyd3JpdGVBbm5vdGF0aW9uQ29sdW1uIiwiZ2V0Q3VzdG9tRXhwb3J0U2V0dGluZ3MiLCJ0b29sdGlwVGV4dCIsImZldGNoVGV4dEZyb21NZXRhTW9kZWwiLCJoZWFkZXJUZXh0IiwiaGVhZGVyIiwiY3VzdG9tQ29sdW1uRXhwb3J0U2V0dGluZ3MiLCJiYXNlTWFuaWZlc3RDb2x1bW4iLCJIb3Jpem9udGFsQWxpZ24iLCJCZWdpbiIsImlkIiwiY3VzdG9tVGFibGVDb2x1bW4iLCJEZWZhdWx0IiwibWVzc2FnZSIsImdldERpYWdub3N0aWNzIiwiYWRkSXNzdWUiLCJJc3N1ZUNhdGVnb3J5IiwiTWFuaWZlc3QiLCJJc3N1ZVNldmVyaXR5IiwiTG93IiwiSXNzdWVDYXRlZ29yeVR5cGUiLCJBbm5vdGF0aW9uQ29sdW1ucyIsIkludmFsaWRLZXkiLCJjb2x1bW5XaXRoU2l0dWF0aW9uc0luZGljYXRvciIsInNpdHVhdGlvbnNJbmRpY2F0b3JDb2x1bW4iLCJwcm9wZXJ0eUtleSIsImlzU2l0dWF0aW9uc0luZGljYXRvciIsIkNvbXB1dGVkIiwiY2xpcGJvYXJkU2V0dGluZ3MiLCJpbmRleE9mRmlyc3RWaXNpYmxlQ29sdW1uIiwiZmluZEluZGV4Iiwic3BsaWNlIiwiY29sdW1uc1dpdGhEcmFmdEluZGljYXRvciIsImlzRHJhZnROb2RlIiwiaXNEcmFmdFJvb3QiLCJjb2x1bW5XaXRoRHJhZnRJbmRpY2F0b3IiLCJkcmFmdEluZGljYXRvckNvbHVtbiIsImlzRHJhZnRJbmRpY2F0b3IiLCJjb2x1bW5JbmRleFRvSW5zZXJ0QWZ0ZXIiLCJnZXRDb250ZXh0UHJvcGVydHlSZXN0cmljdGlvbiIsImNhcGFiaWxpdGllcyIsIkluc2VydFJlc3RyaWN0aW9ucyIsIlJlcXVpcmVkUHJvcGVydGllcyIsImlzQ3VycmVuY3kiLCJleHBvcnREYXRhVHlwZSIsIm5hdlByb3BlcnR5IiwibGluZUl0ZW0iLCJpc1Byb3BlcnR5TmF2aWdhdGVkIiwiaW5oZXJlZFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCIsImlzSW5oZXJlZFByb3BlcnR5TmF2aWdhdGVkIiwidGFyZ2V0TWFwcGluZyIsImlzVHlwZURlZmluaXRpb24iLCJFRE1fVFlQRV9NQVBQSU5HIiwidW5kZXJseWluZ1R5cGUiLCJzZXRVcENvbnN0cmFpbnRzIiwicGFyc2VBc1N0cmluZyIsImVtcHR5U3RyaW5nIiwibnVsbGFibGUiLCJwYXJzZUtlZXBzRW1wdHlTdHJpbmciLCJyZWxhdGVkQW5ub3RhdGlvbkNvbHVtbnMiLCJleGlzdGluZ0NvbHVtbiIsImNvbHVtbktleSIsImNvbHVtbkZyb21Bbm5vdGF0aW9ucyIsImVuYWJsZVdyYXBwaW5nIiwiY3VzdG9tRXhwb3J0U2V0dGluZ3MiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkNvbHVtbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbnRpdHlUeXBlLCBOYXZpZ2F0aW9uUHJvcGVydHksIFByb3BlcnR5LCBQcm9wZXJ0eVBhdGggfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgRmlsdGVyRnVuY3Rpb25zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9DYXBhYmlsaXRpZXNcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5U2V0QW5ub3RhdGlvbnNfQ2FwYWJpbGl0aWVzIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9DYXBhYmlsaXRpZXNfRWRtXCI7XG5pbXBvcnQgdHlwZSB7IFNlbWFudGljS2V5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25cIjtcbmltcG9ydCB7IENvbW1vbkFubm90YXRpb25UZXJtcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uXCI7XG5pbXBvcnQgdHlwZSB7XG5cdERhdGFGaWVsZCxcblx0RGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0RGF0YUZpZWxkRm9yQW5ub3RhdGlvbixcblx0RGF0YUZpZWxkVHlwZXMsXG5cdERhdGFQb2ludCxcblx0RGF0YVBvaW50VHlwZVR5cGVzLFxuXHRGaWVsZEdyb3VwLFxuXHRMaW5lSXRlbVxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgeyBVSUFubm90YXRpb25UZXJtcywgVUlBbm5vdGF0aW9uVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiwgQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB7XG5cdEVETV9UWVBFX01BUFBJTkcsXG5cdGFuZCxcblx0Y29tcGlsZUV4cHJlc3Npb24sXG5cdGNvbnN0YW50LFxuXHRlcXVhbCxcblx0Zm9ybWF0UmVzdWx0LFxuXHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24sXG5cdGlmRWxzZSxcblx0bm90LFxuXHRvcixcblx0cGF0aEluTW9kZWwsXG5cdHNldFVwQ29uc3RyYWludHNcbn0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgdHlwZSBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB0eXBlIHtcblx0QXZhaWxhYmlsaXR5VHlwZSxcblx0Q3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uLFxuXHRDdXN0b21EZWZpbmVkVGFibGVDb2x1bW5Gb3JPdmVycmlkZSxcblx0Rm9ybWF0T3B0aW9uc1R5cGUsXG5cdFRhYmxlQ29sdW1uU2V0dGluZ3MsXG5cdFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IENyZWF0aW9uTW9kZSwgSG9yaXpvbnRhbEFsaWduLCBJbXBvcnRhbmNlLCBUZW1wbGF0ZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgdHlwZSB7IFBhZ2VDb250ZXh0UGF0aFRhcmdldCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL1RlbXBsYXRlQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSB7IENvbXBsZXhQcm9wZXJ0eUluZm8gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9hbm5vdGF0aW9ucy9EYXRhRmllbGRcIjtcbmltcG9ydCB7XG5cdGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyxcblx0Y29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHksXG5cdGdldERhdGFGaWVsZERhdGFUeXBlLFxuXHRnZXRTZW1hbnRpY09iamVjdFBhdGgsXG5cdGdldFRhcmdldFZhbHVlT25EYXRhUG9pbnQsXG5cdGhhc0RhdGFQb2ludFRhcmdldCxcblx0aGFzRmllbGRHcm91cFRhcmdldCxcblx0aXNEYXRhRmllbGQsXG5cdGlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvbixcblx0aXNEYXRhRmllbGRUeXBlcyxcblx0aXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdCxcblx0aXNSYXRpbmdWaXN1YWxpemF0aW9uRnJvbURhdGFGaWVsZERlZmF1bHRcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvYW5ub3RhdGlvbnMvRGF0YUZpZWxkXCI7XG5pbXBvcnQgeyB0eXBlIFRhYmxlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9UYWJsZVwiO1xuaW1wb3J0IHsgQWdncmVnYXRpb25IZWxwZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0FnZ3JlZ2F0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYWJsZU9iamVjdCwgQ3VzdG9tRWxlbWVudCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgeyBPdmVycmlkZVR5cGUsIFBsYWNlbWVudCwgaW5zZXJ0Q3VzdG9tRWxlbWVudHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0NvbmZpZ3VyYWJsZU9iamVjdFwiO1xuaW1wb3J0IHsgaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0RhdGFGaWVsZEhlbHBlclwiO1xuaW1wb3J0IHsgSXNzdWVDYXRlZ29yeSwgSXNzdWVDYXRlZ29yeVR5cGUsIElzc3VlU2V2ZXJpdHkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0lzc3VlTWFuYWdlclwiO1xuaW1wb3J0IHsgS2V5SGVscGVyIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9LZXlcIjtcbmltcG9ydCB7IFVJIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ0hlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyByZXBsYWNlU3BlY2lhbENoYXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXJcIjtcbmltcG9ydCAqIGFzIFR5cGVHdWFyZHMgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHtcblx0aXNBbm5vdGF0aW9uT2ZUeXBlLFxuXHRpc05hdmlnYXRpb25Qcm9wZXJ0eSxcblx0aXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdGlzUHJvcGVydHksXG5cdGlzVHlwZURlZmluaXRpb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHtcblx0ZW5oYW5jZURhdGFNb2RlbFBhdGgsXG5cdGdldENvbnRleHRQcm9wZXJ0eVJlc3RyaWN0aW9uLFxuXHRnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoLFxuXHRnZXRUYXJnZXRPYmplY3RQYXRoLFxuXHR0eXBlIERhdGFNb2RlbE9iamVjdFBhdGhcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0RGlzcGxheU1vZGUsIHR5cGUgRGlzcGxheU1vZGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EaXNwbGF5TW9kZUZvcm1hdHRlclwiO1xuaW1wb3J0IHsgZ2V0UmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLCB0eXBlIFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0VudGl0eVNldEhlbHBlclwiO1xuaW1wb3J0IHsgaGFzRmllbGRDb250cm9sTm90TWFuZGF0b3J5LCBpc1N0YXRpY2FsbHlNYW5kYXRvcnkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9GaWVsZENvbnRyb2xIZWxwZXJcIjtcbmltcG9ydCB7XG5cdGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eVBhdGgsXG5cdGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoLFxuXHRnZXRBc3NvY2lhdGVkVGltZXpvbmVQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgsXG5cdGdldFN0YXRpY1RpbWV6b25lLFxuXHRnZXRTdGF0aWNVbml0T3JDdXJyZW5jeSxcblx0aXNUaW1lem9uZVxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHsgaXNNdWx0aVZhbHVlRmllbGQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9VSUZvcm1hdHRlcnNcIjtcbmltcG9ydCB0eXBlIHsgRGVmYXVsdFR5cGVGb3JFZG1UeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3R5cGUvRURNXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlc3RyaWN0ZWQtaW1wb3J0c1xuaW1wb3J0IHRhYmxlRm9ybWF0dGVycyBmcm9tIFwic2FwL2ZlL21hY3Jvcy9mb3JtYXR0ZXJzL1RhYmxlRm9ybWF0dGVyXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSB7IE1EQ1RhYmxlUHJvcGVydHlJbmZvIGFzIFByb3BlcnR5SW5mbywgVmlzdWFsU2V0dGluZ3MgfSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgU2ltcGxlVHlwZSBmcm9tIFwic2FwL3VpL21vZGVsL1NpbXBsZVR5cGVcIjtcblxuLy8gQ3VzdG9tIENvbHVtbiBmcm9tIE1hbmlmZXN0XG50eXBlIE1hbmlmZXN0RGVmaW5lZEN1c3RvbUNvbHVtbiA9IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbiAmIHtcblx0dHlwZT86IENvbHVtblR5cGUuRGVmYXVsdDtcbn07XG5cbi8vIFNsb3QgQ29sdW1uIGZyb20gQnVpbGRpbmcgQmxvY2tcbnR5cGUgRnJhZ21lbnREZWZpbmVkU2xvdENvbHVtbiA9IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbiAmIHtcblx0dHlwZTogQ29sdW1uVHlwZS5TbG90O1xufTtcbi8vIFByb3BlcnRpZXMgYWxsIENvbHVtblR5cGVzIGhhdmU6XG50eXBlIEJhc2VUYWJsZUNvbHVtbiA9IENvbmZpZ3VyYWJsZU9iamVjdCAmIHtcblx0dHlwZTogQ29sdW1uVHlwZTsgLy9PcmlnaW4gb2YgdGhlIHNvdXJjZSB3aGVyZSB3ZSBhcmUgZ2V0dGluZyB0aGUgdGVtcGxhdGVkIGluZm9ybWF0aW9uIGZyb21cblx0d2lkdGg/OiBzdHJpbmc7XG5cdHdpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyPzogYm9vbGVhbjtcblx0aW1wb3J0YW5jZT86IEltcG9ydGFuY2U7XG5cdGhvcml6b250YWxBbGlnbj86IEhvcml6b250YWxBbGlnbjtcblx0YXZhaWxhYmlsaXR5PzogQXZhaWxhYmlsaXR5VHlwZTtcblx0aXNOYXZpZ2FibGU/OiBib29sZWFuO1xuXHRjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbjtcblx0bGFiZWw/OiBzdHJpbmc7XG5cdHRvb2x0aXA/OiBzdHJpbmc7XG59O1xuXG4vLyBQcm9wZXJ0aWVzIG9uIEN1c3RvbSBDb2x1bW5zIGFuZCBTbG90IENvbHVtbnNcbmV4cG9ydCB0eXBlIEN1c3RvbUJhc2VkVGFibGVDb2x1bW4gPSBCYXNlVGFibGVDb2x1bW4gJiB7XG5cdGlkOiBzdHJpbmc7XG5cdG5hbWU6IHN0cmluZztcblx0aGVhZGVyPzogc3RyaW5nO1xuXHR0ZW1wbGF0ZTogc3RyaW5nIHwgQ29udHJvbDtcblx0cHJvcGVydHlJbmZvcz86IHN0cmluZ1tdO1xuXHRleHBvcnRTZXR0aW5ncz86IENvbHVtbkV4cG9ydFNldHRpbmdzIHwgbnVsbDtcblx0Zm9ybWF0T3B0aW9uczogRm9ybWF0T3B0aW9uc1R5cGU7XG5cdGlzR3JvdXBhYmxlOiBib29sZWFuO1xuXHRpc05hdmlnYWJsZTogYm9vbGVhbjtcblx0c29ydGFibGU6IGJvb2xlYW47XG5cdHZpc3VhbFNldHRpbmdzOiB7IHdpZHRoQ2FsY3VsYXRpb246IG51bGwgfTtcblx0cHJvcGVydGllcz86IHN0cmluZ1tdO1xuXHRyZXF1aXJlZD86IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xufTtcblxuZXhwb3J0IHR5cGUgQ29tcHV0ZWRUYWJsZUNvbHVtbiA9IEJhc2VUYWJsZUNvbHVtbiAmIHtcblx0bmFtZTogc3RyaW5nO1xuXHRsYWJlbDogc3RyaW5nO1xuXHRwcm9wZXJ0eUtleTogc3RyaW5nO1xuXHRpc0RyYWZ0SW5kaWNhdG9yPzogYm9vbGVhbjtcblx0aXNTaXR1YXRpb25zSW5kaWNhdG9yPzogYm9vbGVhbjtcblx0Zm9ybWF0T3B0aW9ucz86IEZvcm1hdE9wdGlvbnNUeXBlIHwgbnVsbDtcblx0cHJvcGVydHlJbmZvcz86IHN0cmluZ1tdO1xuXHRleHBvcnRTZXR0aW5ncz86IENvbHVtbkV4cG9ydFNldHRpbmdzIHwgbnVsbDtcblx0Y2xpcGJvYXJkU2V0dGluZ3M/OiBPYmplY3QgfCBudWxsO1xuXHRyZXF1aXJlZD86IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xufTtcblxuLy8gUHJvcGVydGllcyBkZXJpdmVkIGZyb20gTWFuaWZlc3QgdG8gb3ZlcnJpZGUgQW5ub3RhdGlvbiBjb25maWd1cmF0aW9uc1xudHlwZSBBbm5vdGF0aW9uVGFibGVDb2x1bW5Gb3JPdmVycmlkZSA9IEJhc2VUYWJsZUNvbHVtbiAmIHtcblx0c2V0dGluZ3M/OiBUYWJsZUNvbHVtblNldHRpbmdzO1xuXHRmb3JtYXRPcHRpb25zPzogRm9ybWF0T3B0aW9uc1R5cGU7XG5cdGV4cG9ydFNldHRpbmdzPzogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCBudWxsO1xufTtcblxuZXhwb3J0IHR5cGUgUHJvcGVydHlUeXBlQ29uc3RyYWludHMgPSBQYXJ0aWFsPHtcblx0c2NhbGU6IG51bWJlcjtcblx0cHJlY2lzaW9uOiBudW1iZXI7XG5cdG1heExlbmd0aDogbnVtYmVyO1xuXHRudWxsYWJsZTogYm9vbGVhbjtcblx0bWluaW11bTogc3RyaW5nO1xuXHRtYXhpbXVtOiBzdHJpbmc7XG5cdGlzRGlnaXRTZXF1ZW5jZTogYm9vbGVhbjtcbn0+O1xuXG5leHBvcnQgdHlwZSBQcm9wZXJ0eVR5cGVGb3JtYXRPcHRpb25zID0gUGFydGlhbDx7XG5cdHBhcnNlQXNTdHJpbmc6IGJvb2xlYW47XG5cdGVtcHR5U3RyaW5nOiBzdHJpbmc7XG5cdHBhcnNlS2VlcHNFbXB0eVN0cmluZzogYm9vbGVhbjtcblx0c3R5bGU6IHN0cmluZztcbn0+O1xuXG5leHBvcnQgdHlwZSBQcm9wZXJ0eVR5cGVDb25maWcgPSB7XG5cdHR5cGU/OiBzdHJpbmc7XG5cdGNvbnN0cmFpbnRzPzogUHJvcGVydHlUeXBlQ29uc3RyYWludHM7XG5cdGZvcm1hdE9wdGlvbnM/OiBQcm9wZXJ0eVR5cGVGb3JtYXRPcHRpb25zO1xuXHR0eXBlSW5zdGFuY2U/OiBTaW1wbGVUeXBlO1xuXHRiYXNlVHlwZT86IHN0cmluZztcblx0Y2xhc3NOYW1lPzoga2V5b2YgdHlwZW9mIERlZmF1bHRUeXBlRm9yRWRtVHlwZTtcbn07XG5cbmV4cG9ydCB0eXBlIENvbHVtbkV4cG9ydFNldHRpbmdzID0gUHJvcGVydHlJbmZvW1wiZXhwb3J0U2V0dGluZ3NcIl0gJiB7XG5cdGRhdGFQb2ludFRhcmdldFZhbHVlPzogc3RyaW5nO1xuXHRpc0N1cnJlbmN5PzogYm9vbGVhbjtcbn07XG5cbi8vIFByb3BlcnRpZXMgZm9yIEFubm90YXRpb24gQ29sdW1uc1xuZXhwb3J0IHR5cGUgQW5ub3RhdGlvblRhYmxlQ29sdW1uID0gUHJvcGVydHlJbmZvICZcblx0QW5ub3RhdGlvblRhYmxlQ29sdW1uRm9yT3ZlcnJpZGUgJiB7XG5cdFx0bmFtZTogc3RyaW5nO1xuXHRcdGFubm90YXRpb25QYXRoOiBzdHJpbmc7XG5cdFx0cmVsYXRpdmVQYXRoOiBzdHJpbmc7XG5cdFx0dG9vbHRpcD86IHN0cmluZztcblx0XHRncm91cExhYmVsPzogc3RyaW5nO1xuXHRcdGdyb3VwPzogc3RyaW5nO1xuXHRcdEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucz86IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xuXHRcdHNob3dEYXRhRmllbGRzTGFiZWw/OiBib29sZWFuO1xuXHRcdHJlcXVpcmVkPzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG5cdFx0aXNHcm91cGFibGU/OiBib29sZWFuO1xuXHRcdHVuaXRUZXh0Pzogc3RyaW5nO1xuXHRcdHRpbWV6b25lVGV4dD86IHN0cmluZztcblx0XHR0aW1lem9uZT86IHN0cmluZztcblx0XHRzZW1hbnRpY09iamVjdFBhdGg/OiBzdHJpbmc7XG5cdFx0dGV4dEFycmFuZ2VtZW50Pzoge1xuXHRcdFx0dGV4dFByb3BlcnR5OiBzdHJpbmc7XG5cdFx0XHRtb2RlOiBEaXNwbGF5TW9kZTtcblx0XHR9O1xuXHRcdGFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zPzogc3RyaW5nW107XG5cdFx0dHlwZUNvbmZpZz86IFByb3BlcnR5VHlwZUNvbmZpZztcblx0XHRpc1BhcnRPZkxpbmVJdGVtPzogYm9vbGVhbjsgLy8gdGVtcG9yYXJ5IGluZGljYXRvciB0byBvbmx5IGFsbG93IGZpbHRlcmluZyBvbiBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgd2hlbiB0aGV5J3JlIHBhcnQgb2YgYSBsaW5lIGl0ZW1cblx0XHRpc1BhcnRPZkN1c3RvbUNvbHVtbj86IGJvb2xlYW47XG5cdFx0YWRkaXRpb25hbExhYmVscz86IHN0cmluZ1tdO1xuXHRcdGV4cG9ydERhdGFQb2ludFRhcmdldFZhbHVlPzogc3RyaW5nO1xuXHRcdGV4dGVuc2lvbj86IEV4dGVuc2lvbkZvckFuYWx5dGljcztcblx0XHRpc011bHRpVmFsdWU/OiBib29sZWFuO1xuXHRcdGRlc2NyaXB0aW9uUHJvcGVydHk/OiBzdHJpbmc7XG5cdFx0bW9kZT86IERpc3BsYXlNb2RlO1xuXHRcdHZhbHVlUHJvcGVydHk/OiBzdHJpbmc7XG5cdH07XG5cbmV4cG9ydCB0eXBlIEV4dGVuc2lvbkZvckFuYWx5dGljcyA9IFByb3BlcnR5SW5mb1tcImV4dGVuc2lvblwiXSAmIHtcblx0YWRkaXRpb25hbFByb3BlcnRpZXM/OiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCB0eXBlIFRhYmxlQ29sdW1uID0gQ3VzdG9tQmFzZWRUYWJsZUNvbHVtbiB8IEFubm90YXRpb25UYWJsZUNvbHVtbiB8IENvbXB1dGVkVGFibGVDb2x1bW47XG5cbnR5cGUgTWFuaWZlc3RDb2x1bW4gPSBDdXN0b21FbGVtZW50PEN1c3RvbUJhc2VkVGFibGVDb2x1bW4gfCBBbm5vdGF0aW9uVGFibGVDb2x1bW5Gb3JPdmVycmlkZT47XG5cbmV4cG9ydCBlbnVtIENvbHVtblR5cGUge1xuXHREZWZhdWx0ID0gXCJEZWZhdWx0XCIsIC8vIERlZmF1bHQgVHlwZSAoQ3VzdG9tIENvbHVtbilcblx0QW5ub3RhdGlvbiA9IFwiQW5ub3RhdGlvblwiLFxuXHRTbG90ID0gXCJTbG90XCIsXG5cdENvbXB1dGVkID0gXCJDb21wdXRlZFwiXG59XG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGNvbHVtbnMsIGFubm90YXRpb24tYmFzZWQgYXMgd2VsbCBhcyBtYW5pZmVzdC1iYXNlZC5cbiAqIFRoZXkgYXJlIHNvcnRlZCBhbmQgc29tZSBwcm9wZXJ0aWVzIGNhbiBiZSBvdmVyd3JpdHRlbiB2aWEgdGhlIG1hbmlmZXN0IChjaGVjayBvdXQgdGhlIGtleXMgdGhhdCBjYW4gYmUgb3ZlcndyaXR0ZW4pLlxuICogQHBhcmFtIGxpbmVJdGVtQW5ub3RhdGlvbiBDb2xsZWN0aW9uIG9mIGRhdGEgZmllbGRzIGZvciByZXByZXNlbnRhdGlvbiBpbiBhIHRhYmxlIG9yIGxpc3RcbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGhlIHR5cGUgb2YgdGhlIHRhYmxlXG4gKiBAcGFyYW0gdmlzdWFsaXphdGlvblBhdGhcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyBSZXR1cm5zIGFsbCB0YWJsZSBjb2x1bW5zIHRoYXQgc2hvdWxkIGJlIGF2YWlsYWJsZSwgcmVnYXJkbGVzcyBvZiB0ZW1wbGF0aW5nIG9yIHBlcnNvbmFsaXphdGlvbiBvciB0aGVpciBvcmlnaW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlQ29sdW1ucyhcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogVGFibGVDb2x1bW5bXSB7XG5cdGNvbnN0IGFubm90YXRpb25Db2x1bW5zID0gZ2V0Q29sdW1uc0Zyb21Bbm5vdGF0aW9ucyhsaW5lSXRlbUFubm90YXRpb24sIHRhYmxlVHlwZSwgdmlzdWFsaXphdGlvblBhdGgsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBtYW5pZmVzdENvbHVtbnMgPSBnZXRDb2x1bW5zRnJvbU1hbmlmZXN0KFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbjxUYWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbj4odmlzdWFsaXphdGlvblBhdGgpLmNvbHVtbnMgPz8ge30sXG5cdFx0YW5ub3RhdGlvbkNvbHVtbnMsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25FbnRpdHlUeXBlKGxpbmVJdGVtQW5ub3RhdGlvbilcblx0KTtcblxuXHRjb25zdCB0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10gPSBpbnNlcnRDdXN0b21FbGVtZW50cyhcblx0XHRhbm5vdGF0aW9uQ29sdW1ucyBhcyBUYWJsZUNvbHVtbltdLFxuXHRcdG1hbmlmZXN0Q29sdW1ucyBhcyBSZWNvcmQ8c3RyaW5nLCBDdXN0b21FbGVtZW50PFRhYmxlQ29sdW1uPj4sXG5cdFx0e1xuXHRcdFx0d2lkdGg6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0XHR3aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlcjogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdGltcG9ydGFuY2U6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0XHRob3Jpem9udGFsQWxpZ246IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0XHRhdmFpbGFiaWxpdHk6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0XHRpc05hdmlnYWJsZTogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdHNldHRpbmdzOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdFx0Zm9ybWF0T3B0aW9uczogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdGV4cG9ydFNldHRpbmdzOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlXG5cdFx0fVxuXHQpO1xuXG5cdHJldHVybiBhZGRDb21wdXRlZENvbHVtbnModGFibGVDb2x1bW5zLCB0YWJsZVR5cGUsIHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRDb2x1bW5CeVBhdGgocGF0aDogc3RyaW5nLCB0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10pOiBUYWJsZUNvbHVtbiB8IHVuZGVmaW5lZCB7XG5cdHJldHVybiB0YWJsZUNvbHVtbnMuZmluZCgoY29sdW1uKSA9PiB7XG5cdFx0Y29uc3QgYW5ub3RhdGlvbkNvbHVtbiA9IGNvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW4ucHJvcGVydHlJbmZvcyA9PT0gdW5kZWZpbmVkICYmIGFubm90YXRpb25Db2x1bW4ucmVsYXRpdmVQYXRoID09PSBwYXRoO1xuXHR9KTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSAndW5pdCcsICd0ZXh0QXJyYW5nZW1lbnQnLCAndGltZXpvbmUnIGFuZCAnZXhwb3J0c2V0dGluZ3MnIHByb3BlcnRpZXMgaW4gY29sdW1ucyB3aGVuIG5lY2Vzc2FyeS5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSB0YWJsZUNvbHVtbnMgVGhlIGNvbHVtbnMgdG8gYmUgdXBkYXRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTGlua2VkUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LCB0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10pOiB2b2lkIHtcblx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcihjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCkpLmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0dGFibGVDb2x1bW5zLmZvckVhY2goKG9Db2x1bW4pID0+IHtcblx0XHRjb25zdCB0YWJsZUNvbHVtbiA9IG9Db2x1bW4gYXMgQW5ub3RhdGlvblRhYmxlQ29sdW1uO1xuXHRcdGlmICh0YWJsZUNvbHVtbi5wcm9wZXJ0eUluZm9zID09PSB1bmRlZmluZWQgJiYgdGFibGVDb2x1bW4ucmVsYXRpdmVQYXRoKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQcm9wZXJ0eT4oZGF0YU1vZGVsT2JqZWN0UGF0aCwgdGFibGVDb2x1bW4ucmVsYXRpdmVQYXRoKTtcblx0XHRcdGNvbnN0IHByb3BlcnR5ID0gcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdDtcblx0XHRcdGlmIChwcm9wZXJ0eSkge1xuXHRcdFx0XHRhZGRDdXJyZW5jeU9yVW9NVG9Qcm9wZXJ0eShwcm9wZXJ0eSwgcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLCB0YWJsZUNvbHVtbnMsIHRhYmxlQ29sdW1uKTtcblx0XHRcdFx0Y29uc3QgdGltZXpvbmVQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5KHByb3BlcnR5KTtcblx0XHRcdFx0Y29uc3QgdGltZXpvbmUgPSBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGltZXpvbmU7XG5cdFx0XHRcdGlmICh0aW1lem9uZVByb3BlcnR5KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1RpbWV6b25lQ29sdW1uID0gZmluZENvbHVtbkJ5UGF0aCh0aW1lem9uZVByb3BlcnR5Lm5hbWUsIHRhYmxlQ29sdW1ucyk7XG5cdFx0XHRcdFx0dGFibGVDb2x1bW4udGltZXpvbmUgPSBvVGltZXpvbmVDb2x1bW4/Lm5hbWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAodGltZXpvbmUpIHtcblx0XHRcdFx0XHR0YWJsZUNvbHVtbi50aW1lem9uZVRleHQgPSB0aW1lem9uZS50b1N0cmluZygpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFkZFRleHRBcnJhbmdlbnRJbmZvVG9Qcm9wZXJ0eShwcm9wZXJ0eSwgcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLCB0YWJsZUNvbHVtbnMsIHRhYmxlQ29sdW1uKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG4vKipcbiAqIEFkZHMgdGhlIFwidW5pdFwiIHByb3BlcnR5IGludG8gdGhlIGNvbHVtbnMgd2hlbiBuZWNjZXNhcnkgZm9yIGNvbHVtbnMgd2l0aCB1bml0IG9mIG1lYXN1cmUgYW5kIGN1cnJlbmNpZXMuXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHJlZmVyZW5jZWQgb24gdGhlIGNvbHVtblxuICogQHBhcmFtIHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCBUaGUgcHJvcGVydHkgRGF0YU1vZGVsT2JqZWN0UGF0aC5cbiAqIEBwYXJhbSB0YWJsZUNvbHVtbnMgVGhlIGxpc3Qgb2YgY29sdW1ucyBkaXNwbGF5ZWQgb24gdGhlIHRhYmxlXG4gKiBAcGFyYW0gdGFibGVDb2x1bW4gVGhlIHRhYmxlIGNvbHVtbiB3aGljaCBhZGRzIHRoZSBjdXJyZW5jeSBvciB1bml0XG4gKi9cbmZ1bmN0aW9uIGFkZEN1cnJlbmN5T3JVb01Ub1Byb3BlcnR5KFxuXHRwcm9wZXJ0eTogUHJvcGVydHksXG5cdHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT4sXG5cdHRhYmxlQ29sdW1uczogVGFibGVDb2x1bW5bXSxcblx0dGFibGVDb2x1bW46IEFubm90YXRpb25UYWJsZUNvbHVtblxuKTogdm9pZCB7XG5cdGNvbnN0IGN1cnJlbmN5T3JVb01Qcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5UGF0aChwcm9wZXJ0eSkgfHwgZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgocHJvcGVydHkpO1xuXHRpZiAoY3VycmVuY3lPclVvTVByb3BlcnR5KSB7XG5cdFx0Y29uc3QgY3VycmVuY3lPclVvTVByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFByb3BlcnR5Pihwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsIGN1cnJlbmN5T3JVb01Qcm9wZXJ0eSk7XG5cdFx0Y29uc3QgY3VycmVuY3lPclVvTVJlbGF0aXZlUGF0aCA9IGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgoY3VycmVuY3lPclVvTVByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdFx0aWYgKGN1cnJlbmN5T3JVb01SZWxhdGl2ZVBhdGgpIHtcblx0XHRcdGNvbnN0IHVuaXRDb2x1bW4gPSBmaW5kQ29sdW1uQnlQYXRoKGN1cnJlbmN5T3JVb01SZWxhdGl2ZVBhdGgsIHRhYmxlQ29sdW1ucyk7XG5cdFx0XHR0YWJsZUNvbHVtbi51bml0ID0gdW5pdENvbHVtbj8ubmFtZTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Y29uc3QgdW5pdCA9IHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5IHx8IHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQ7XG5cdFx0aWYgKHVuaXQpIHtcblx0XHRcdHRhYmxlQ29sdW1uLnVuaXRUZXh0ID0gYCR7dW5pdH1gO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIEFkZCB0aGUgXCJ0ZXh0QXJyYW5nZW1lbnRcIiBvYmplY3QgdG8gY29sdW1ucyB3aGVuIG5lY2Vzc2FyeSBmb3IgY29sdW1ucyBjb250YWluaW5nIHRleHQsIHN1Y2ggYXMgZGVzY3JpcHRpb25zLlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSByZWZlcmVuY2VkIGJ5IHRoZSBjb2x1bW5cbiAqIEBwYXJhbSBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggVGhlIHByb3BlcnR5IERhdGFNb2RlbE9iamVjdFBhdGguXG4gKiBAcGFyYW0gdGFibGVDb2x1bW5zIFRoZSBsaXN0IG9mIGNvbHVtbnMgZGlzcGxheWVkIG9uIHRoZSB0YWJsZVxuICogQHBhcmFtIHRhYmxlQ29sdW1uIFRoZSB0YWJsZSBjb2x1bW4gd2hpY2ggYWRkcyB0aGUgdGV4dFxuICovXG5mdW5jdGlvbiBhZGRUZXh0QXJyYW5nZW50SW5mb1RvUHJvcGVydHkoXG5cdHByb3BlcnR5OiBQcm9wZXJ0eSxcblx0cHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pixcblx0dGFibGVDb2x1bW5zOiBUYWJsZUNvbHVtbltdLFxuXHR0YWJsZUNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uXG4pOiB2b2lkIHtcblx0Y29uc3QgZGlzcGxheU1vZGUgPSBnZXREaXNwbGF5TW9kZShwcm9wZXJ0eSwgcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUpLFxuXHRcdHRleHRQcm9wZXJ0eVBhdGggPSBnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5UGF0aChwcm9wZXJ0eSk7XG5cdGlmICh0ZXh0UHJvcGVydHlQYXRoICYmIGRpc3BsYXlNb2RlICE9PSBcIlZhbHVlXCIpIHtcblx0XHRjb25zdCB0ZXh0UHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8UHJvcGVydHk+KHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCwgdGV4dFByb3BlcnR5UGF0aCk7XG5cdFx0Y29uc3QgdGV4dFJlbGF0aXZlUGF0aCA9IGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgodGV4dFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdFx0aWYgKHRleHRSZWxhdGl2ZVBhdGgpIHtcblx0XHRcdGNvbnN0IHRleHRDb2x1bW4gPSBmaW5kQ29sdW1uQnlQYXRoKHRleHRSZWxhdGl2ZVBhdGgsIHRhYmxlQ29sdW1ucyk7XG5cdFx0XHRpZiAodGV4dENvbHVtbiAmJiB0ZXh0Q29sdW1uLm5hbWUgIT09IHRhYmxlQ29sdW1uLm5hbWUpIHtcblx0XHRcdFx0dGFibGVDb2x1bW4udGV4dEFycmFuZ2VtZW50ID0ge1xuXHRcdFx0XHRcdHRleHRQcm9wZXJ0eTogdGV4dENvbHVtbi5uYW1lLFxuXHRcdFx0XHRcdG1vZGU6IGRpc3BsYXlNb2RlXG5cdFx0XHRcdH07XG5cdFx0XHRcdC8vIElmIHRleHQgcHJvcGVydGllcyBhcmUgdXNlZCBidXQgaGlkZGVuLCB3ZSBtdXN0IGluY2x1ZGUgdGhlbSB0byB0aGUgZXhwb3J0IGFzIHRoZXJlIGFyZSB1c2VkIGluIHRoZSBwYXN0ZVxuXHRcdFx0XHRpZiAoIXRleHRDb2x1bW4uZXhwb3J0U2V0dGluZ3MpIHtcblx0XHRcdFx0XHR0ZXh0Q29sdW1uLmV4cG9ydFNldHRpbmdzID0geyB0eXBlOiBcIlN0cmluZ1wiIH07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgY29sdW1ucyBmcm9tIHRoZSBlbnRpdHlUeXBlLlxuICogQHBhcmFtIGNvbHVtbnNUb0JlQ3JlYXRlZCBUaGUgY29sdW1ucyB0byBiZSBjcmVhdGVkLlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHRhcmdldCBlbnRpdHkgdHlwZS5cbiAqIEBwYXJhbSBhbm5vdGF0aW9uQ29sdW1ucyBUaGUgYXJyYXkgb2YgY29sdW1ucyBjcmVhdGVkIGJhc2VkIG9uIExpbmVJdGVtIGFubm90YXRpb25zLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIHRhYmxlVHlwZSBUaGUgdGFibGUgdHlwZS5cbiAqIEBwYXJhbSB0YWJsZUNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSBvZiB0aGUgdGFibGUuXG4gKiBAcGFyYW0gZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCBUaGUgbWFwIG9mIHByb3BlcnRpZXMgcmVmZXJlbmNlZCBhcyBkZXNjcmlwdGlvbiBvbiBhIHRleHQgYXJyYW5nZW1lbnQgYW5ub3RhdGlvbi5cbiAqIEBwYXJhbSByZXN0cmljdGlvbnNPblByb3BlcnRpZXMgVGhlIGV4aXN0aW5nIHJlc3RyaWN0aW9ucyBvbiBwcm9wZXJ0aWVzXG4gKiBAcmV0dXJucyBUaGUgY29sdW1uIGZyb20gdGhlIGVudGl0eVR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IGdldENvbHVtbnNGcm9tRW50aXR5VHlwZSA9IGZ1bmN0aW9uIChcblx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGFubm90YXRpb25Db2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0dGFibGVDcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZSxcblx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcDogUmVjb3JkPHN0cmluZywgRGlzcGxheU1vZGU+LFxuXHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM/OiBSZXN0cmljdGlvbnNPblByb3BlcnRpZXNcbik6IEFubm90YXRpb25UYWJsZUNvbHVtbltdIHtcblx0aWYgKGFubm90YXRpb25Db2x1bW5zID09PSB1bmRlZmluZWQpIHtcblx0XHRhbm5vdGF0aW9uQ29sdW1ucyA9IFtdO1xuXHR9XG5cblx0bGV0IHByb3BlcnRpZXNOb3RUb0JlQ29uc2lkZXJlZDogc3RyaW5nW10gPSBbXTtcblx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGdyb3VwYWJsZVByb3BlcnRpZXMgPSBhZ2dyZWdhdGlvbkhlbHBlci5nZXRHcm91cGFibGVQcm9wZXJ0aWVzKCk7XG5cdC8vRm9yIEFuYWx5dGljYWwgdGFibGUsIHdlIGV4Y2x1ZGUgYWxsIHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IGdyb3VwYWJsZSBhbmQgdXNlZCBhcyBUZXh0IGluIGEgZ3JvdXBhYmxlIFByb3BlcnR5LlxuXHRpZiAodGFibGVUeXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiICYmIGFnZ3JlZ2F0aW9uSGVscGVyLmlzQW5hbHl0aWNzU3VwcG9ydGVkKCkgJiYgZ3JvdXBhYmxlUHJvcGVydGllcykge1xuXHRcdHByb3BlcnRpZXNOb3RUb0JlQ29uc2lkZXJlZCA9IGdyb3VwYWJsZVByb3BlcnRpZXNcblx0XHRcdC5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS4kdGFyZ2V0KVxuXHRcdFx0LmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQgIT09IHVuZGVmaW5lZClcblx0XHRcdC5tYXAoKHRhcmdldCkgPT4gZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eSh0YXJnZXQgYXMgUHJvcGVydHkpKVxuXHRcdFx0LmZpbHRlcigodGV4dFByb3ApID0+IHRleHRQcm9wICYmICFhZ2dyZWdhdGlvbkhlbHBlci5pc1Byb3BlcnR5R3JvdXBhYmxlKHRleHRQcm9wKSlcblx0XHRcdC5tYXAoKHByb3ApID0+IHByb3A/Lm5hbWUpXG5cdFx0XHQuZmlsdGVyKChuYW1lKSA9PiBuYW1lICE9PSB1bmRlZmluZWQpIGFzIHN0cmluZ1tdO1xuXHR9XG5cdGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eTogUHJvcGVydHkpID0+IHtcblx0XHQvLyBDYXRjaCBhbHJlYWR5IGV4aXN0aW5nIGNvbHVtbnMgLSB3aGljaCB3ZXJlIGFkZGVkIGJlZm9yZSBieSBMaW5lSXRlbSBBbm5vdGF0aW9uc1xuXHRcdGNvbnN0IGV4aXN0cyA9IGFubm90YXRpb25Db2x1bW5zLnNvbWUoKGNvbHVtbikgPT4ge1xuXHRcdFx0cmV0dXJuIGNvbHVtbi5uYW1lID09PSBwcm9wZXJ0eS5uYW1lO1xuXHRcdH0pO1xuXHRcdC8vIGlmIHRhcmdldCB0eXBlIGV4aXN0cywgaXQgaXMgYSBjb21wbGV4IHByb3BlcnR5IGFuZCBzaG91bGQgYmUgaWdub3JlZFxuXHRcdGlmICghcHJvcGVydHkudGFyZ2V0VHlwZSAmJiAhZXhpc3RzICYmICFwcm9wZXJ0aWVzTm90VG9CZUNvbnNpZGVyZWQuaW5jbHVkZXMocHJvcGVydHkubmFtZSkpIHtcblx0XHRcdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbzogQ29tcGxleFByb3BlcnR5SW5mbyA9IGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyhcblx0XHRcdFx0cHJvcGVydHkubmFtZSxcblx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdHRhYmxlVHlwZVxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzKTtcblx0XHRcdGNvbnN0IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5hZGRpdGlvbmFsUHJvcGVydGllcyk7XG5cdFx0XHQvLyBJbmNsdWRlIHRoZSB0ZXh0IHByb3BlcnRpZXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgdGV4dCBhcnJhbmdlbWVudFxuXHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZXMuZm9yRWFjaCgobmFtZSkgPT4ge1xuXHRcdFx0XHRhZGRQcm9wZXJ0eVRvRGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcChkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLCByZWxhdGVkUHJvcGVydGllc0luZm8sIG5hbWUpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IGNvbHVtbkluZm8gPSBnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5KFxuXHRcdFx0XHRwcm9wZXJ0eSxcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKHByb3BlcnR5LmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdHByb3BlcnR5Lm5hbWUsXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdGFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyxcblx0XHRcdFx0dGFibGVDcmVhdGlvbk1vZGUsXG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzSW5mb1xuXHRcdFx0KTtcblx0XHRcdGlmIChyZWxhdGVkUHJvcGVydHlOYW1lcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNvbHVtbkluZm8ucHJvcGVydHlJbmZvcyA9IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzO1xuXHRcdFx0XHRpZiAocmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFNldHRpbmdzLmRhdGFQb2ludFRhcmdldFZhbHVlKSB7XG5cdFx0XHRcdFx0Y29sdW1uSW5mby5leHBvcnREYXRhUG9pbnRUYXJnZXRWYWx1ZSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRTZXR0aW5ncy5kYXRhUG9pbnRUYXJnZXRWYWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBDb2xsZWN0IGluZm9ybWF0aW9uIG9mIHJlbGF0ZWQgY29sdW1ucyB0byBiZSBjcmVhdGVkLlxuXHRcdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lcy5mb3JFYWNoKChuYW1lKSA9PiB7XG5cdFx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW25hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbbmFtZV0uYW5ub3RhdGlvblByb3BlcnR5O1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGlmIChhZGRpdGlvbmFsUHJvcGVydHlOYW1lcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNvbHVtbkluZm8uYWRkaXRpb25hbFByb3BlcnR5SW5mb3MgPSBhZGRpdGlvbmFsUHJvcGVydHlOYW1lcztcblx0XHRcdFx0Ly8gQ3JlYXRlIGNvbHVtbnMgZm9yIGFkZGl0aW9uYWwgcHJvcGVydGllcyBpZGVudGlmaWVkIGZvciBBTFAgdXNlIGNhc2UuXG5cdFx0XHRcdGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzLmZvckVhY2goKGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWUpID0+IHtcblx0XHRcdFx0XHQvLyBJbnRlbnRpb25hbCBvdmVyd3JpdGUgYXMgd2UgcmVxdWlyZSBvbmx5IG9uZSBuZXcgUHJvcGVydHlJbmZvIGZvciBhIHJlbGF0ZWQgUHJvcGVydHkuXG5cdFx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW2FkZGl0aW9uYWxQcm9wZXJ0eU5hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmFkZGl0aW9uYWxQcm9wZXJ0aWVzW2FkZGl0aW9uYWxQcm9wZXJ0eU5hbWVdO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGFubm90YXRpb25Db2x1bW5zLnB1c2goY29sdW1uSW5mbyk7XG5cdFx0fVxuXHRcdC8vIEluIGNhc2UgYSBwcm9wZXJ0eSBoYXMgZGVmaW5lZCBhICNUZXh0T25seSB0ZXh0IGFycmFuZ2VtZW50IHRoYXQgcG9pbnRzIHRvIGEgdGV4dCBwcm9wZXJ0eSAoYW5kIG5vdCBhICdoYXJkIGNvZGVkIHRleHQnKSBkb24ndCBvbmx5IGNyZWF0ZSB0aGUgY29tcGxleCBwcm9wZXJ0eSB3aXRoIHRoZSB0ZXh0IHByb3BlcnR5IGFzIGEgY2hpbGQgcHJvcGVydHksXG5cdFx0Ly8gYnV0IGFsc28gdGhlIHByb3BlcnR5IGl0c2VsZiBhcyBpdCBjYW4gYmUgdXNlZCBhcyB3aXRoaW4gdGhlIHNvcnRDb25kaXRpb25zIG9yIG9uIGN1c3RvbSBjb2x1bW5zLlxuXHRcdC8vIFRoaXMgc3RlcCBtdXN0IGJlIHZhbGlkIGFsc28gZnJvbSB0aGUgY29sdW1ucyBhZGRlZCB2aWEgTGluZUl0ZW1zIG9yIGZyb20gYSBjb2x1bW4gYXZhaWxhYmxlIG9uIHRoZSBwMTNuLlxuXHRcdGlmIChnZXREaXNwbGF5TW9kZShwcm9wZXJ0eSwgZW50aXR5VHlwZSkgPT09IFwiRGVzY3JpcHRpb25cIikge1xuXHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzPy5ub25Tb3J0YWJsZVByb3BlcnRpZXMucHVzaChwcm9wZXJ0eS5uYW1lKTtcblx0XHRcdGlmIChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbihwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dCkpIHtcblx0XHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMucHVzaChcblx0XHRcdFx0XHRnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5KFxuXHRcdFx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgocHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdFx0XHRcdHByb3BlcnR5Lm5hbWUsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0YWdncmVnYXRpb25IZWxwZXIsXG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCxcblx0XHRcdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyxcblx0XHRcdFx0XHRcdHRhYmxlQ3JlYXRpb25Nb2RlXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdC8vIENyZWF0ZSBhIHByb3BlcnR5SW5mbyBmb3IgZWFjaCByZWxhdGVkIHByb3BlcnR5LlxuXHRjb25zdCByZWxhdGVkQ29sdW1ucyA9IF9jcmVhdGVSZWxhdGVkQ29sdW1ucyhcblx0XHRjb2x1bW5zVG9CZUNyZWF0ZWQsXG5cdFx0YW5ub3RhdGlvbkNvbHVtbnMsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRlbnRpdHlUeXBlLFxuXHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAsXG5cdFx0dGFibGVUeXBlLFxuXHRcdHRhYmxlQ3JlYXRpb25Nb2RlLFxuXHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllc1xuXHQpO1xuXHRyZXR1cm4gYW5ub3RhdGlvbkNvbHVtbnMuY29uY2F0KHJlbGF0ZWRDb2x1bW5zKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgY29sdW1uIGRlZmluaXRpb24gZnJvbSBhIHByb3BlcnR5LlxuICogQHBhcmFtIHByb3BlcnR5IEVudGl0eSB0eXBlIHByb3BlcnR5IGZvciB3aGljaCB0aGUgY29sdW1uIGlzIGNyZWF0ZWRcbiAqIEBwYXJhbSBmdWxsUHJvcGVydHlQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHRhcmdldCBwcm9wZXJ0eVxuICogQHBhcmFtIHJlbGF0aXZlUGF0aCBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgdGFyZ2V0IHByb3BlcnR5IGJhc2VkIG9uIHRoZSBjb250ZXh0XG4gKiBAcGFyYW0gdXNlRGF0YUZpZWxkUHJlZml4IFNob3VsZCBiZSBwcmVmaXhlZCB3aXRoIFwiRGF0YUZpZWxkOjpcIiwgZWxzZSBpdCB3aWxsIGJlIHByZWZpeGVkIHdpdGggXCJQcm9wZXJ0eTo6XCJcbiAqIEBwYXJhbSBhdmFpbGFibGVGb3JBZGFwdGF0aW9uIERlY2lkZXMgd2hldGhlciB0aGUgY29sdW1uIHNob3VsZCBiZSBhdmFpbGFibGUgZm9yIGFkYXB0YXRpb25cbiAqIEBwYXJhbSBhZ2dyZWdhdGlvbkhlbHBlciBUaGUgYWdncmVnYXRpb25IZWxwZXIgZm9yIHRoZSBlbnRpdHlcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAgVGhlIG1hcCBvZiBwcm9wZXJ0aWVzIHJlZmVyZW5jZWQgYXMgZGVzY3JpcHRpb24gb24gYSB0ZXh0IGFycmFuZ2VtZW50IGFubm90YXRpb25cbiAqIEBwYXJhbSByZXN0cmljdGlvbnNPblByb3BlcnRpZXMgVGhlIGV4aXN0aW5nIHJlc3RyaWN0aW9ucyBvbiBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHRhYmxlXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXNJbmZvIFRoZSBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgc28gZmFyIGZvciB0aGUgY29sdW1uXG4gKiBAcGFyYW0gcmVsYXRpdmVQYXRoRm9yTXVsdGlWYWx1ZSBUaGUgTURDIHBhdGggdXNlZCBmb3IgdGhlIDE6biBwcm9wZXJ0eSB0byBhbGxvdyBmaWx0ZXJpbmcgZnJvbSBNRENcbiAqIEByZXR1cm5zIFRoZSBhbm5vdGF0aW9uIGNvbHVtbiBkZWZpbml0aW9uXG4gKi9cbmNvbnN0IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkgPSBmdW5jdGlvbiAoXG5cdHByb3BlcnR5OiBQcm9wZXJ0eSxcblx0ZnVsbFByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRyZWxhdGl2ZVBhdGg6IHN0cmluZyxcblx0dXNlRGF0YUZpZWxkUHJlZml4OiBib29sZWFuLFxuXHRhdmFpbGFibGVGb3JBZGFwdGF0aW9uOiBib29sZWFuLFxuXHRhZ2dyZWdhdGlvbkhlbHBlcjogQWdncmVnYXRpb25IZWxwZXIsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcDogUmVjb3JkPHN0cmluZywgRGlzcGxheU1vZGU+LFxuXHR0YWJsZVR5cGU/OiBUYWJsZVR5cGUsXG5cdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcz86IFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyxcblx0dGFibGVDcmVhdGlvbk1vZGU/OiBDcmVhdGlvbk1vZGUsXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz86IENvbXBsZXhQcm9wZXJ0eUluZm8sXG5cdHJlbGF0aXZlUGF0aEZvck11bHRpVmFsdWU/OiBzdHJpbmdcbik6IEFubm90YXRpb25UYWJsZUNvbHVtbiB7XG5cdGNvbnN0IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGggPSBnZXRTZW1hbnRpY09iamVjdFBhdGgoY29udmVydGVyQ29udGV4dCwgcHJvcGVydHkpO1xuXHRjb25zdCBpc0hpZGRlbiA9IGlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuKHByb3BlcnR5KTtcblx0Y29uc3QgZ3JvdXBQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBwcm9wZXJ0eS5uYW1lID8gX3NsaWNlQXRTbGFzaChwcm9wZXJ0eS5uYW1lLCB0cnVlLCBmYWxzZSkgOiB1bmRlZmluZWQ7XG5cdGNvbnN0IGlzR3JvdXA6IGJvb2xlYW4gPSBncm91cFBhdGggIT0gcHJvcGVydHkubmFtZTtcblx0Y29uc3QgbGFiZWwgPSBnZXRMYWJlbChwcm9wZXJ0eSwgaXNHcm91cCk7XG5cdGNvbnN0IGRhdGFUeXBlID0gZ2V0RGF0YUZpZWxkRGF0YVR5cGUocHJvcGVydHkpO1xuXHRjb25zdCBwcm9wZXJ0eVR5cGVDb25maWcgPSBnZXRUeXBlQ29uZmlnKHByb3BlcnR5LCBkYXRhVHlwZSk7XG5cdGNvbnN0IGlzQVByb3BlcnR5RnJvbVRleHRPbmx5QW5ub3RhdGlvbiA9IGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXBbcmVsYXRpdmVQYXRoXSA9PT0gXCJEZXNjcmlwdGlvblwiO1xuXHRjb25zdCBzb3J0YWJsZSA9XG5cdFx0KCFpc0hpZGRlbiB8fCBpc0FQcm9wZXJ0eUZyb21UZXh0T25seUFubm90YXRpb24pICYmICFyZXN0cmljdGlvbnNPblByb3BlcnRpZXM/Lm5vblNvcnRhYmxlUHJvcGVydGllcy5pbmNsdWRlcyhyZWxhdGl2ZVBhdGgpO1xuXHRjb25zdCBpc0FuYWx5dGljYWxUYWJsZSA9IGFnZ3JlZ2F0aW9uSGVscGVyLmlzQW5hbHl0aWNzU3VwcG9ydGVkKCkgJiYgdGFibGVUeXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiO1xuXHRjb25zdCBmaWx0ZXJhYmxlID0gIXJlc3RyaWN0aW9uc09uUHJvcGVydGllcz8ubm9uRmlsdGVyYWJsZVByb3BlcnRpZXMuaW5jbHVkZXMocmVsYXRpdmVQYXRoKTtcblx0Ly8gZ3JvdXBhYmxlIHByb3BlcnRpZXMgb24gYW4gYW5hbHl0aWNhbCB0YWJsZSBzaG91bGQgY29uc2lkZXIgaGlkZGVuIHByb3BlcnRpZXMgYW5kIHRleHQgb25seSBhbm5vdGF0aW9ucyBhcyBvdGhlciB0YWJsZSB0eXBlcyBkb1xuXHRjb25zdCBncm91cGFibGUgPSBpc0FuYWx5dGljYWxUYWJsZVxuXHRcdD8gISFhZ2dyZWdhdGlvbkhlbHBlci5pc1Byb3BlcnR5R3JvdXBhYmxlKHByb3BlcnR5KSAmJiAoIWlzSGlkZGVuIHx8IGlzQVByb3BlcnR5RnJvbVRleHRPbmx5QW5ub3RhdGlvbilcblx0XHQ6IHNvcnRhYmxlO1xuXHRjb25zdCB0eXBlQ29uZmlnID0ge1xuXHRcdGNsYXNzTmFtZTogcHJvcGVydHkudHlwZSB8fCBkYXRhVHlwZSxcblx0XHRmb3JtYXRPcHRpb25zOiBwcm9wZXJ0eVR5cGVDb25maWcuZm9ybWF0T3B0aW9ucyxcblx0XHRjb25zdHJhaW50czogcHJvcGVydHlUeXBlQ29uZmlnLmNvbnN0cmFpbnRzXG5cdH07XG5cdGxldCBleHBvcnRTZXR0aW5nczogUHJvcGVydHlJbmZvW1wiZXhwb3J0U2V0dGluZ3NcIl0gPSBudWxsO1xuXHRpZiAoX2lzRXhwb3J0YWJsZUNvbHVtbihwcm9wZXJ0eSkpIHtcblx0XHRleHBvcnRTZXR0aW5ncyA9IGNyZWF0ZUNvbHVtbkV4cG9ydFNldHRpbmdzKHByb3BlcnR5LCByZWxhdGVkUHJvcGVydGllc0luZm8pO1xuXHR9XG5cdGNvbnN0IGF2YWlsYWJpbGl0eSA9ICFpc0hpZGRlbiAmJiBhdmFpbGFibGVGb3JBZGFwdGF0aW9uID8gXCJBZGFwdGF0aW9uXCIgOiBcIkhpZGRlblwiO1xuXHRjb25zdCBjb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkID0gX2dldENvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscyhyZWxhdGl2ZVBhdGgsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRpZiAocmVsYXRpdmVQYXRoRm9yTXVsdGlWYWx1ZSkge1xuXHRcdHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlUGF0aEZvck11bHRpVmFsdWU7XG5cdH1cblx0Y29uc3QgbmFtZSA9IHVzZURhdGFGaWVsZFByZWZpeCA/IHJlbGF0aXZlUGF0aCA6IGBQcm9wZXJ0eTo6JHtyZWxhdGl2ZVBhdGh9YDtcblx0Y29uc3Qga2V5ID0gKHVzZURhdGFGaWVsZFByZWZpeCA/IFwiRGF0YUZpZWxkOjpcIiA6IFwiUHJvcGVydHk6OlwiKSArIHJlcGxhY2VTcGVjaWFsQ2hhcnMocmVsYXRpdmVQYXRoKTtcblxuXHRjb25zdCBjb2x1bW46IEFubm90YXRpb25UYWJsZUNvbHVtbiA9IHtcblx0XHRrZXk6IGtleSxcblx0XHR0eXBlOiBDb2x1bW5UeXBlLkFubm90YXRpb24sXG5cdFx0ZGF0YVR5cGU6IGRhdGFUeXBlID8/IHByb3BlcnR5LnR5cGUsXG5cdFx0bGFiZWw6IGxhYmVsID8/IHByb3BlcnR5Lm5hbWUsXG5cdFx0Z3JvdXBMYWJlbDogaXNHcm91cCA/IGdldExhYmVsKHByb3BlcnR5KSA6IHVuZGVmaW5lZCxcblx0XHRncm91cDogaXNHcm91cCA/IGdyb3VwUGF0aCA6IHVuZGVmaW5lZCxcblx0XHRhbm5vdGF0aW9uUGF0aDogZnVsbFByb3BlcnR5UGF0aCxcblx0XHRzZW1hbnRpY09iamVjdFBhdGg6IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGgsXG5cdFx0YXZhaWxhYmlsaXR5OiBhdmFpbGFiaWxpdHksXG5cdFx0bmFtZTogbmFtZSxcblx0XHRyZWxhdGl2ZVBhdGg6IHJlbGF0aXZlUGF0aCxcblx0XHRzb3J0YWJsZTogc29ydGFibGUsXG5cdFx0ZmlsdGVyYWJsZTogZmlsdGVyYWJsZSxcblx0XHRpc0dyb3VwYWJsZTogZ3JvdXBhYmxlLFxuXHRcdGlzS2V5OiBwcm9wZXJ0eS5pc0tleSxcblx0XHRleHBvcnRTZXR0aW5nczogZXhwb3J0U2V0dGluZ3MsXG5cdFx0Y2FzZVNlbnNpdGl2ZTogaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdHR5cGVDb25maWc6IHR5cGVDb25maWcgYXMgUHJvcGVydHlUeXBlQ29uZmlnLFxuXHRcdGltcG9ydGFuY2U6IGdldEltcG9ydGFuY2UoY29udmVydGVyQ29udGV4dCwgcHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0KSxcblx0XHRyZXF1aXJlZDogaXNSZXF1aXJlZENvbHVtbihjb252ZXJ0ZXJDb250ZXh0LCBwcm9wZXJ0eSwgdGFibGVDcmVhdGlvbk1vZGUpLFxuXHRcdGFkZGl0aW9uYWxMYWJlbHM6IGNvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVsc1xuXHR9O1xuXHRfYWRkVG9vbFRpcChwcm9wZXJ0eSwgY29sdW1uKTtcblx0X3NldEV4cG9ydFNldHRpbmdzRm9yRGF0YVBvaW50KHByb3BlcnR5LCBjb2x1bW4pO1xuXHRpZiAoaXNBbmFseXRpY2FsVGFibGUpIHtcblx0XHRzZXRUZWNobmljYWxFeHRlbnNpb24oY29sdW1uLCBwcm9wZXJ0eSwgYWdncmVnYXRpb25IZWxwZXIsIGNvbnZlcnRlckNvbnRleHQsIHJlbGF0aXZlUGF0aCk7XG5cdH1cblx0cmV0dXJuIGNvbHVtbjtcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgdGVjaG5pY2FsIGV4dGVuc2lvbiBmb3IgYW5hbHl0aWNzIHNjZW5hcmlvcy5cbiAqIEBwYXJhbSBjb2x1bW4gVGhlIHRhYmxlIGNvbHVtblxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSBsaW5rZWQgdG8gdGhlIGNvbHVtblxuICogQHBhcmFtIGFnZ3JlZ2F0aW9uSGVscGVyIFRoZSBhZ2dyZWdhdGlvbiBoZWxwZXJcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHJlbGF0aXZlUGF0aCBUaGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcHJvcGVydHlcbiAqL1xuY29uc3Qgc2V0VGVjaG5pY2FsRXh0ZW5zaW9uID0gZnVuY3Rpb24gKFxuXHRjb2x1bW46IEFubm90YXRpb25UYWJsZUNvbHVtbixcblx0cHJvcGVydHk6IFByb3BlcnR5LFxuXHRhZ2dyZWdhdGlvbkhlbHBlcjogQWdncmVnYXRpb25IZWxwZXIsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmdcbik6IHZvaWQge1xuXHRjb25zdCBpc0RyYWZ0U3VwcG9ydGVkID0gTW9kZWxIZWxwZXIuaXNPYmplY3RQYXRoRHJhZnRTdXBwb3J0ZWQoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkpO1xuXHRjb25zdCBkcmFmdFByb3BlcnRpZXMgPSBbXCJIYXNBY3RpdmVFbnRpdHlcIiwgXCJIYXNEcmFmdEVudGl0eVwiLCBcIklzQWN0aXZlRW50aXR5XCJdO1xuXHRjb25zdCBpc0RyYWZ0UHJvcGVydHkgPSBkcmFmdFByb3BlcnRpZXMuaW5jbHVkZXMocmVsYXRpdmVQYXRoKTtcblx0Y29uc3QgaXNHcm91cGFibGVQcm9wZXJ0eSA9ICEhYWdncmVnYXRpb25IZWxwZXIuaXNQcm9wZXJ0eUdyb3VwYWJsZShwcm9wZXJ0eSk7XG5cdGlmIChcblx0XHQoaXNEcmFmdFN1cHBvcnRlZCAmJiBpc0RyYWZ0UHJvcGVydHkpIHx8XG5cdFx0Ly8gY29sdW1uLmlzR3JvdXBhYmxlIGNhbiBiZSBmYWxzZSB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBoaWRkZW4gYnV0IGl0IGNvdWxkIGJlIHRlY2huaWNhbGx5IGdyb3VwYWJsZVxuXHRcdChpc0dyb3VwYWJsZVByb3BlcnR5ICYmICFjb2x1bW4uaXNHcm91cGFibGUpXG5cdCkge1xuXHRcdGNvbHVtbi5leHRlbnNpb24gPSB7XG5cdFx0XHR0ZWNobmljYWxseUFnZ3JlZ2F0YWJsZTogZmFsc2UsXG5cdFx0XHR0ZWNobmljYWxseUdyb3VwYWJsZTogdHJ1ZVxuXHRcdH07XG5cdH1cbn07XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBleHBvcnQgc2V0dGluZ3MgZm9yIGEgZ2l2ZW4gY29sdW1uLlxuICogQHBhcmFtIGNvbHVtbiBUaGUgZ2l2ZW4gY29sdW1uIGZyb20gYSBsaW5lIGl0ZW0gYXMgYSBkYXRhIGZpZWxkIG9yIGEgcHJvcGVydHkgZnJvbSB0aGUgZW50aXR5IHR5cGVcbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllc0luZm8gVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBsaW5rZWQgdG8gdGhlIGNvbHVtbiAobmFtZWQgYWxzbyBjb21wbGV4IHByb3BlcnR5KVxuICogQHJldHVybnMgVGhlIGV4cG9ydCBzZXR0aW5ncyBpbiBhIHRoZSBnaXZlbiBjb2x1bW5cbiAqL1xuY29uc3QgY3JlYXRlQ29sdW1uRXhwb3J0U2V0dGluZ3MgPSBmdW5jdGlvbiAoXG5cdGNvbHVtbjogUHJvcGVydHkgfCBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHRyZWxhdGVkUHJvcGVydGllc0luZm8/OiBDb21wbGV4UHJvcGVydHlJbmZvXG4pOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyB7XG5cdGxldCB1bml0UHJvcGVydHksIHRpbWV6b25lUHJvcGVydHksIHVuaXRUZXh0LCB0aW1lem9uZVRleHQsIHV0YywgaXNBVGltZXpvbmUsIGN1cnJlbmN5UHJvcGVydHksIHNjYWxlO1xuXHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lcyA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyA/IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzKSA6IFtdO1xuXHRpZiAocmVsYXRlZFByb3BlcnRpZXNJbmZvICYmIHJlbGF0ZWRQcm9wZXJ0eU5hbWVzPy5sZW5ndGggPT09IDEpIHtcblx0XHQvLyBDcmVhdGUgdGhlIGV4cG9ydCBzZXR0aW5ncyBvZiBhIGNvbHVtbiBiYXNlZCBvbiB0aGUgcmVsYXRlZCAoY2hpbGQpIHByb3BlcnR5IGluIGNhc2UgdGhlcmUgaXMgb25seSBvbmUuXG5cdFx0Ly8gVGhpcyBpcyByZXF1aXJlZCB3aGVuIHdlIGhhdmUgYSB0ZXh0IG9ubHkgYW5ub3RhdGlvbiB0byBjb21wdXRlIHRoZSBleHBvcnQgc2V0dGluZ3MgZnJvbSB0aGUgdGV4dCBpbnN0ZWFkIG9mIHRoZSB2YWx1ZVxuXHRcdGNvbHVtbiA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzW3JlbGF0ZWRQcm9wZXJ0eU5hbWVzWzBdXS5hbm5vdGF0aW9uUHJvcGVydHk7XG5cdH1cblx0Y29uc3QgZGF0YVR5cGUgPSBnZXREYXRhRmllbGREYXRhVHlwZShjb2x1bW4pO1xuXHRpZiAoaXNQcm9wZXJ0eShjb2x1bW4pKSB7XG5cdFx0dW5pdFByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eShjb2x1bW4pO1xuXHRcdGN1cnJlbmN5UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eShjb2x1bW4pO1xuXHRcdHRpbWV6b25lUHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkVGltZXpvbmVQcm9wZXJ0eShjb2x1bW4pO1xuXHRcdHVuaXRUZXh0ID0gZ2V0U3RhdGljVW5pdE9yQ3VycmVuY3koY29sdW1uKTtcblx0XHR0aW1lem9uZVRleHQgPSBnZXRTdGF0aWNUaW1lem9uZShjb2x1bW4pO1xuXHRcdGlzQVRpbWV6b25lID0gaXNUaW1lem9uZShjb2x1bW4pO1xuXHRcdHNjYWxlID0gY29sdW1uLnNjYWxlO1xuXHR9XG5cdHVuaXRQcm9wZXJ0eSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3M/LnVuaXRQcm9wZXJ0eSA/PyB1bml0UHJvcGVydHk/Lm5hbWUgPz8gY3VycmVuY3lQcm9wZXJ0eT8ubmFtZTtcblx0dGltZXpvbmVQcm9wZXJ0eSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3M/LnRpbWV6b25lUHJvcGVydHkgPz8gdGltZXpvbmVQcm9wZXJ0eT8ubmFtZTtcblx0c2NhbGUgPSByZWxhdGVkUHJvcGVydGllc0luZm8/LmV4cG9ydFNldHRpbmdzPy5zY2FsZSA/PyBzY2FsZTtcblx0Y29uc3QgZXhwb3J0VHlwZSA9IGdldEV4cG9ydERhdGFUeXBlKGRhdGFUeXBlLCBpc0FUaW1lem9uZSwgISFjdXJyZW5jeVByb3BlcnR5LCByZWxhdGVkUHJvcGVydGllc0luZm8/LmV4cG9ydFNldHRpbmdzKTtcblx0aWYgKHRpbWV6b25lUHJvcGVydHkgfHwgKGV4cG9ydFR5cGUgPT09IFwiRGF0ZVRpbWVcIiAmJiAhdGltZXpvbmVUZXh0KSkge1xuXHRcdHV0YyA9IGZhbHNlO1xuXHR9XG5cdGNvbnN0IGV4cG9ydFNldHRpbmdzOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyA9IHtcblx0XHR0eXBlOiBleHBvcnRUeXBlLFxuXHRcdGlucHV0Rm9ybWF0OiBnZXREYXRlSW5wdXRGb3JtYXQoZGF0YVR5cGUpLFxuXHRcdGRlbGltaXRlcjogZ2V0RGVsaW1pdGVyKGRhdGFUeXBlKSxcblx0XHRzY2FsZTogc2NhbGUsXG5cdFx0dW5pdFByb3BlcnR5OiB1bml0UHJvcGVydHksXG5cdFx0dW5pdDogcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncy51bml0ID8/IHVuaXRUZXh0LFxuXHRcdHRpbWV6b25lUHJvcGVydHk6IHRpbWV6b25lUHJvcGVydHksXG5cdFx0dGltZXpvbmU6IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3MudGltZXpvbmUgPz8gdGltZXpvbmVUZXh0Py50b1N0cmluZygpLFxuXHRcdHRlbXBsYXRlOiByZWxhdGVkUHJvcGVydGllc0luZm8/LmV4cG9ydFNldHRpbmdzLnRlbXBsYXRlLFxuXHRcdC8vb25seSBpbiBjYXNlIG9mIGNvbXBsZXggcHJvcGVydGllcywgd3JhcCB0aGUgY2VsbCBjb250ZW50XHRvbiB0aGUgZXhjZWwgZXhwb3J0ZWQgZmlsZVxuXHRcdHdyYXA6IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3Mud3JhcCxcblx0XHR1dGM6IHV0Yyxcblx0XHRwcm9wZXJ0eTogcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncy5wcm9wZXJ0eVxuXHR9O1xuXHRpZiAoZXhwb3J0U2V0dGluZ3MudW5pdFByb3BlcnR5IHx8IGV4cG9ydFNldHRpbmdzLnVuaXQpIHtcblx0XHRleHBvcnRTZXR0aW5ncy5hdXRvU2NhbGUgPSB0cnVlO1xuXHR9XG5cdHJldHVybiByZW1vdmVVbmRlZmluZWRGcm9tRXhwb3J0U2V0dGluZ3MoZXhwb3J0U2V0dGluZ3MpO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBleHBvcnQgZm9ybWF0IHRlbXBsYXRlIGZvciBjb2x1bW5zIHdpdGggZGF0ZXMuXG4gKiBAcGFyYW0gZGF0YVR5cGUgVGhlIGRhdGEgdHlwZSBvZiB0aGUgY29sdW1uXG4gKiBAcmV0dXJucyBUaGUgaW5wdXRGb3JtYXRcbiAqL1xuY29uc3QgZ2V0RGF0ZUlucHV0Rm9ybWF0ID0gZnVuY3Rpb24gKGRhdGFUeXBlPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIGRhdGFUeXBlID09PSBcIkVkbS5EYXRlXCIgPyBcIllZWVktTU0tRERcIiA6IHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgZGVsaW1pdGVyIGluIG51bWVyaWMgY29sdW1ucy5cbiAqIFRoZSBkZWxpbWl0ZXIgaXMgdXNlZCB0byBkaXNwbGF5IHRob3VzYW5kcyBzZXBhcmF0b3IgaW4gbnVtZXJpYyBjb2x1bW5zLlxuICogQHBhcmFtIGRhdGFUeXBlIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGNvbHVtblxuICogQHJldHVybnMgVHJ1ZSB0byBkaXNwbGF5IHRob3VzYW5kcyBzZXBhcmF0b3IgaW4gbnVtZXJpYyBjb2x1bW5zXG4gKi9cbmNvbnN0IGdldERlbGltaXRlciA9IGZ1bmN0aW9uIChkYXRhVHlwZT86IHN0cmluZyk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuXHRyZXR1cm4gZGF0YVR5cGUgPT09IFwiRWRtLkludDY0XCIgPyB0cnVlIDogdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIHVuZGVmaW5lZCB2YWx1ZXMgZnJvbSB0aGUgZXhwb3J0IHNldHRpbmdzIG9iamVjdCBvZiBhIGNvbHVtbi5cbiAqIEBwYXJhbSBleHBvcnRTZXR0aW5ncyBUaGUgZXhwb3J0IHNldHRpbmdzIGNvbmZpZ3VyYXRpb25zIGZvciBhIGNvbHVtblxuICogQHJldHVybnMgVGhlIGV4cG9ydCBzZXR0aW5ncyBjb25maWd1cmF0aW9ucyB3aXRob3V0IHVuZGVmaW5lZCB2YWx1ZXNcbiAqL1xuY29uc3QgcmVtb3ZlVW5kZWZpbmVkRnJvbUV4cG9ydFNldHRpbmdzID0gZnVuY3Rpb24gKGV4cG9ydFNldHRpbmdzOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyk6IENvbHVtbkV4cG9ydFNldHRpbmdzIHtcblx0Ly9SZW1vdmUgdW5kZWZpbmVkIHNldHRpbmdzIGZyb20gZXhwb3J0U2V0dGluZyBvYmplY3Rcblx0Zm9yIChjb25zdCBzZXR0aW5nIGluIGV4cG9ydFNldHRpbmdzKSB7XG5cdFx0aWYgKGV4cG9ydFNldHRpbmdzW3NldHRpbmcgYXMga2V5b2YgQ29sdW1uRXhwb3J0U2V0dGluZ3NdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGRlbGV0ZSBleHBvcnRTZXR0aW5nc1tzZXR0aW5nIGFzIGtleW9mIENvbHVtbkV4cG9ydFNldHRpbmdzXTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGV4cG9ydFNldHRpbmdzO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIEJvb2xlYW4gdHJ1ZSBmb3IgZXhwb3J0YWJsZSBjb2x1bW5zLCBmYWxzZSBmb3Igbm9uIGV4cG9ydGFibGUgY29sdW1ucy5cbiAqIEBwYXJhbSBzb3VyY2UgVGhlIGRhdGFGaWVsZCBvciBwcm9wZXJ0eSB0byBiZSBldmFsdWF0ZWRcbiAqIEByZXR1cm5zIFRydWUgZm9yIGV4cG9ydGFibGUgY29sdW1uLCBmYWxzZSBmb3Igbm9uIGV4cG9ydGFibGUgY29sdW1uXG4gKi9cbmZ1bmN0aW9uIF9pc0V4cG9ydGFibGVDb2x1bW4oc291cmNlOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHkpOiBib29sZWFuIHtcblx0bGV0IHByb3BlcnR5VHlwZSwgcHJvcGVydHk7XG5cdGNvbnN0IGRhdGFGaWVsZERlZmF1bHRQcm9wZXJ0eSA9IChzb3VyY2UgYXMgUHJvcGVydHkpLmFubm90YXRpb25zLlVJPy5EYXRhRmllbGREZWZhdWx0O1xuXHRpZiAoaXNQcm9wZXJ0eShzb3VyY2UpKSB7XG5cdFx0aWYgKGlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuKHNvdXJjZSkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cHJvcGVydHlUeXBlID0gZGF0YUZpZWxkRGVmYXVsdFByb3BlcnR5Py4kVHlwZTtcblx0fSBlbHNlIGlmIChpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihzb3VyY2UpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9IGVsc2Uge1xuXHRcdHByb3BlcnR5ID0gc291cmNlO1xuXHRcdHByb3BlcnR5VHlwZSA9IHByb3BlcnR5LiRUeXBlO1xuXHRcdGlmIChwcm9wZXJ0eVR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiYgKHByb3BlcnR5IGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pLlRhcmdldD8uJHRhcmdldD8uJFR5cGUpIHtcblx0XHRcdC8vRm9yIENoYXJ0XG5cdFx0XHRwcm9wZXJ0eVR5cGUgPSAocHJvcGVydHkgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZTtcblx0XHRcdHJldHVybiBwcm9wZXJ0eVR5cGUgIT09IHVuZGVmaW5lZCAmJiAhVUlBbm5vdGF0aW9uVHlwZXMuQ2hhcnREZWZpbml0aW9uVHlwZS5pbmNsdWRlcyhwcm9wZXJ0eVR5cGUpO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHQocHJvcGVydHkgYXMgRGF0YUZpZWxkKS5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvcmU/Lk1lZGlhVHlwZT8udGVybSA9PT0gXCJPcmcuT0RhdGEuQ29yZS5WMS5NZWRpYVR5cGVcIiAmJlxuXHRcdFx0KHByb3BlcnR5IGFzIERhdGFGaWVsZCkuVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db3JlPy5pc1VSTCAhPT0gdHJ1ZVxuXHRcdCkge1xuXHRcdFx0Ly9Gb3IgU3RyZWFtXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBwcm9wZXJ0eVR5cGVcblx0XHQ/ICFbXG5cdFx0XHRcdFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbixcblx0XHRcdFx0VUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uLFxuXHRcdFx0XHRVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb25Hcm91cFxuXHRcdCAgXS5pbmNsdWRlcyhwcm9wZXJ0eVR5cGUpXG5cdFx0OiB0cnVlO1xufVxuXG4vKipcbiAqIFJldHVybnMgQm9vbGVhbiB0cnVlIGZvciB2YWxpZCBjb2x1bW5zLCBmYWxzZSBmb3IgaW52YWxpZCBjb2x1bW5zLlxuICogQHBhcmFtIGRhdGFGaWVsZCBEaWZmZXJlbnQgRGF0YUZpZWxkIHR5cGVzIGRlZmluZWQgaW4gdGhlIGFubm90YXRpb25zXG4gKiBAcmV0dXJucyBUcnVlIGZvciB2YWxpZCBjb2x1bW5zLCBmYWxzZSBmb3IgaW52YWxpZCBjb2x1bW5zXG4gKi9cbmNvbnN0IF9pc1ZhbGlkQ29sdW1uID0gZnVuY3Rpb24gKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IGJvb2xlYW4ge1xuXHRzd2l0Y2ggKGRhdGFGaWVsZC4kVHlwZSkge1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0cmV0dXJuICEhZGF0YUZpZWxkLklubGluZTtcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0Ly8gVG9kbzogUmVwbGFjZSB3aXRoIHByb3BlciBMb2cgc3RhdGVtZW50IG9uY2UgYXZhaWxhYmxlXG5cdFx0XHQvLyAgdGhyb3cgbmV3IEVycm9yKFwiVW5oYW5kbGVkIERhdGFGaWVsZCBBYnN0cmFjdCB0eXBlOiBcIiArIGRhdGFGaWVsZC4kVHlwZSk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYmluZGluZyBleHByZXNzaW9uIHRvIGV2YWx1YXRlIHRoZSB2aXNpYmlsaXR5IG9mIGEgRGF0YUZpZWxkIG9yIERhdGFQb2ludCBhbm5vdGF0aW9uLlxuICpcbiAqIFNBUCBGaW9yaSBlbGVtZW50cyB3aWxsIGV2YWx1YXRlIGVpdGhlciB0aGUgVUkuSGlkZGVuIGFubm90YXRpb24gZGVmaW5lZCBvbiB0aGUgYW5ub3RhdGlvbiBpdHNlbGYgb3Igb24gdGhlIHRhcmdldCBwcm9wZXJ0eS5cbiAqIEBwYXJhbSBkYXRhRmllbGRNb2RlbFBhdGggVGhlIG1ldGFwYXRoIHJlZmVycmluZyB0byB0aGUgYW5ub3RhdGlvbiB0aGF0IGlzIGV2YWx1YXRlZCBieSBTQVAgRmlvcmkgZWxlbWVudHMuXG4gKiBAcmV0dXJucyBBbiBleHByZXNzaW9uIHRoYXQgeW91IGNhbiBiaW5kIHRvIHRoZSBVSS5cbiAqL1xuY29uc3QgX2dldFZpc2libGVFeHByZXNzaW9uID0gZnVuY3Rpb24gKFxuXHRkYXRhRmllbGRNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8RGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcz5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IHRhcmdldE9iamVjdCA9IGRhdGFGaWVsZE1vZGVsUGF0aC50YXJnZXRPYmplY3Q7XG5cdGxldCBwcm9wZXJ0eVZhbHVlO1xuXHRpZiAodGFyZ2V0T2JqZWN0KSB7XG5cdFx0c3dpdGNoICh0YXJnZXRPYmplY3QuJFR5cGUpIHtcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGU6XG5cdFx0XHRcdHByb3BlcnR5VmFsdWUgPSB0YXJnZXRPYmplY3QuVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0XHRcdC8vIGlmIGl0IGlzIGEgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBwb2ludGluZyB0byBhIERhdGFQb2ludCB3ZSBsb29rIGF0IHRoZSBkYXRhUG9pbnQncyB2YWx1ZVxuXHRcdFx0XHRpZiAodGFyZ2V0T2JqZWN0Py5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlKSB7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IHRhcmdldE9iamVjdC5UYXJnZXQuJHRhcmdldD8uVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRjb25zdCBpc0FuYWx5dGljYWxHcm91cEhlYWRlckV4cGFuZGVkID0gLypmb3JtYXRPcHRpb25zPy5pc0FuYWx5dGljcyA/IFVJLklzRXhwYW5kZWQgOiovIGNvbnN0YW50KGZhbHNlKTtcblx0Y29uc3QgaXNBbmFseXRpY2FsTGVhZiA9IC8qZm9ybWF0T3B0aW9ucz8uaXNBbmFseXRpY3MgPyBlcXVhbChVSS5Ob2RlTGV2ZWwsIDApIDoqLyBjb25zdGFudChmYWxzZSk7XG5cdC8vIEEgZGF0YSBmaWVsZCBpcyB2aXNpYmxlIGlmOlxuXHQvLyAtIHRoZSBVSS5IaWRkZW4gZXhwcmVzc2lvbiBpbiB0aGUgb3JpZ2luYWwgYW5ub3RhdGlvbiBkb2VzIG5vdCBldmFsdWF0ZSB0byAndHJ1ZSdcblx0Ly8gLSB0aGUgVUkuSGlkZGVuIGV4cHJlc3Npb24gaW4gdGhlIHRhcmdldCBwcm9wZXJ0eSBkb2VzIG5vdCBldmFsdWF0ZSB0byAndHJ1ZSdcblx0Ly8gLSBpbiBjYXNlIG9mIEFuYWx5dGljcyBpdCdzIG5vdCB2aXNpYmxlIGZvciBhbiBleHBhbmRlZCBHcm91cEhlYWRlclxuXHRyZXR1cm4gYW5kKFxuXHRcdC4uLltcblx0XHRcdG5vdChlcXVhbChnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24odGFyZ2V0T2JqZWN0Py5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbiksIHRydWUpKSxcblx0XHRcdGlmRWxzZShcblx0XHRcdFx0ISFwcm9wZXJ0eVZhbHVlLFxuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlICYmIG5vdChlcXVhbChnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24ocHJvcGVydHlWYWx1ZS5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbiksIHRydWUpKSxcblx0XHRcdFx0dHJ1ZVxuXHRcdFx0KSxcblx0XHRcdG9yKG5vdChpc0FuYWx5dGljYWxHcm91cEhlYWRlckV4cGFuZGVkKSwgaXNBbmFseXRpY2FsTGVhZilcblx0XHRdXG5cdCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgaGlkZGVuIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIGEgZmllbGQgZ3JvdXAuXG4gKiBAcGFyYW0gZGF0YUZpZWxkR3JvdXAgRGF0YUZpZWxkIGRlZmluZWQgaW4gdGhlIGFubm90YXRpb25zXG4gKiBAcmV0dXJucyBDb21waWxlIGJpbmRpbmcgb2YgZmllbGQgZ3JvdXAgZXhwcmVzc2lvbnMuXG4gKi9cbmNvbnN0IF9nZXRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMgPSBmdW5jdGlvbiAoZGF0YUZpZWxkR3JvdXA6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IGZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9uczogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+W10gPSBbXTtcblx0aWYgKFxuXHRcdGRhdGFGaWVsZEdyb3VwLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uICYmXG5cdFx0ZGF0YUZpZWxkR3JvdXAuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRmllbGRHcm91cFR5cGVcblx0KSB7XG5cdFx0aWYgKGRhdGFGaWVsZEdyb3VwPy5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbikge1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKG5vdChlcXVhbChnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24oZGF0YUZpZWxkR3JvdXAuYW5ub3RhdGlvbnMuVUkuSGlkZGVuKSwgdHJ1ZSkpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGF0YUZpZWxkR3JvdXAuVGFyZ2V0LiR0YXJnZXQuRGF0YT8uZm9yRWFjaCgoaW5uZXJEYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXMpID0+IHtcblx0XHRcdFx0ZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zLnB1c2goXG5cdFx0XHRcdFx0X2dldFZpc2libGVFeHByZXNzaW9uKHsgdGFyZ2V0T2JqZWN0OiBpbm5lckRhdGFGaWVsZCB9IGFzIERhdGFNb2RlbE9iamVjdFBhdGg8XG5cdFx0XHRcdFx0XHREYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgRGF0YVBvaW50VHlwZVR5cGVzXG5cdFx0XHRcdFx0Pilcblx0XHRcdFx0KTtcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKGlmRWxzZShvciguLi5maWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMpLCBjb25zdGFudCh0cnVlKSwgY29uc3RhbnQoZmFsc2UpKSk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGFiZWwgZm9yIHRoZSBwcm9wZXJ0eSBhbmQgZGF0YUZpZWxkLlxuICogQHBhcmFtIFtwcm9wZXJ0eV0gUHJvcGVydHksIERhdGFGaWVsZCBvciBOYXZpZ2F0aW9uIFByb3BlcnR5IGRlZmluZWQgaW4gdGhlIGFubm90YXRpb25zXG4gKiBAcGFyYW0gaXNHcm91cFxuICogQHJldHVybnMgTGFiZWwgb2YgdGhlIHByb3BlcnR5IG9yIERhdGFGaWVsZFxuICovXG5jb25zdCBnZXRMYWJlbCA9IGZ1bmN0aW9uIChwcm9wZXJ0eTogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5IHwgTmF2aWdhdGlvblByb3BlcnR5LCBpc0dyb3VwID0gZmFsc2UpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAoIXByb3BlcnR5KSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRpZiAoaXNQcm9wZXJ0eShwcm9wZXJ0eSkgfHwgaXNOYXZpZ2F0aW9uUHJvcGVydHkocHJvcGVydHkpKSB7XG5cdFx0Y29uc3QgZGF0YUZpZWxkRGVmYXVsdCA9IChwcm9wZXJ0eSBhcyBQcm9wZXJ0eSkuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0O1xuXHRcdGlmIChkYXRhRmllbGREZWZhdWx0ICYmICFkYXRhRmllbGREZWZhdWx0LnF1YWxpZmllciAmJiBkYXRhRmllbGREZWZhdWx0LkxhYmVsKSB7XG5cdFx0XHRyZXR1cm4gZGF0YUZpZWxkRGVmYXVsdC5MYWJlbD8udG9TdHJpbmcoKTtcblx0XHR9XG5cdFx0cmV0dXJuIHByb3BlcnR5LmFubm90YXRpb25zLkNvbW1vbj8uTGFiZWw/LnRvU3RyaW5nKCkgPz8gcHJvcGVydHkubmFtZTtcblx0fSBlbHNlIGlmIChpc0RhdGFGaWVsZFR5cGVzKHByb3BlcnR5KSkge1xuXHRcdGlmICghIWlzR3JvdXAgJiYgcHJvcGVydHkuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb24pIHtcblx0XHRcdHJldHVybiBwcm9wZXJ0eT8uTGFiZWw/LnRvU3RyaW5nKCk7XG5cdFx0fVxuXHRcdHJldHVybiAoXG5cdFx0XHRwcm9wZXJ0eT8uTGFiZWw/LnRvU3RyaW5nKCkgPz9cblx0XHRcdGNvbXBpbGVFeHByZXNzaW9uKFxuXHRcdFx0XHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24ocHJvcGVydHkuVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkxhYmVsLCBbXSwgcHJvcGVydHkuVmFsdWU/LiR0YXJnZXQ/Lm5hbWUpXG5cdFx0XHQpXG5cdFx0KTtcblx0fSBlbHNlIGlmIChwcm9wZXJ0eS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikge1xuXHRcdHJldHVybiAoXG5cdFx0XHRwcm9wZXJ0eS5MYWJlbD8udG9TdHJpbmcoKSA/P1xuXHRcdFx0Y29tcGlsZUV4cHJlc3Npb24oXG5cdFx0XHRcdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbigocHJvcGVydHkuVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludCk/LlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5MYWJlbD8udmFsdWVPZigpKVxuXHRcdFx0KVxuXHRcdCk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHByb3BlcnR5LkxhYmVsPy50b1N0cmluZygpO1xuXHR9XG59O1xuXG5jb25zdCBfZ2V0VG9vbHRpcCA9IGZ1bmN0aW9uIChzb3VyY2U6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBQcm9wZXJ0eSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmICghc291cmNlKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRpZiAoaXNQcm9wZXJ0eShzb3VyY2UpIHx8IHNvdXJjZS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5RdWlja0luZm8pIHtcblx0XHRyZXR1cm4gc291cmNlLmFubm90YXRpb25zPy5Db21tb24/LlF1aWNrSW5mb1xuXHRcdFx0PyBjb21waWxlRXhwcmVzc2lvbihnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24oc291cmNlLmFubm90YXRpb25zLkNvbW1vbi5RdWlja0luZm8pKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoaXNEYXRhRmllbGRUeXBlcyhzb3VyY2UpKSB7XG5cdFx0cmV0dXJuIHNvdXJjZS5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uUXVpY2tJbmZvXG5cdFx0XHQ/IGNvbXBpbGVFeHByZXNzaW9uKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihzb3VyY2UuVmFsdWUuJHRhcmdldC5hbm5vdGF0aW9ucy5Db21tb24uUXVpY2tJbmZvKSlcblx0XHRcdDogdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKHNvdXJjZS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikge1xuXHRcdGNvbnN0IGRhdGFwb2ludFRhcmdldCA9IHNvdXJjZS5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50O1xuXHRcdHJldHVybiBkYXRhcG9pbnRUYXJnZXQ/LlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5RdWlja0luZm9cblx0XHRcdD8gY29tcGlsZUV4cHJlc3Npb24oZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKGRhdGFwb2ludFRhcmdldC5WYWx1ZS4kdGFyZ2V0LmFubm90YXRpb25zLkNvbW1vbi5RdWlja0luZm8pKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJvd1N0YXR1c1Zpc2liaWxpdHkoY29sTmFtZTogc3RyaW5nLCBpc1NlbWFudGljS2V5SW5GaWVsZEdyb3VwPzogYm9vbGVhbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBmb3JtYXRSZXN1bHQoXG5cdFx0W1xuXHRcdFx0cGF0aEluTW9kZWwoYHNlbWFudGljS2V5SGFzRHJhZnRJbmRpY2F0b3JgLCBcImludGVybmFsXCIpLFxuXHRcdFx0cGF0aEluTW9kZWwoYGZpbHRlcmVkTWVzc2FnZXNgLCBcImludGVybmFsXCIpLFxuXHRcdFx0Y29sTmFtZSxcblx0XHRcdGlzU2VtYW50aWNLZXlJbkZpZWxkR3JvdXBcblx0XHRdLFxuXHRcdHRhYmxlRm9ybWF0dGVycy5nZXRFcnJvclN0YXR1c1RleHRWaXNpYmlsaXR5Rm9ybWF0dGVyXG5cdCk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIFByb3BlcnR5SW5mbyBmb3IgZWFjaCBpZGVudGlmaWVkIHByb3BlcnR5IGNvbnN1bWVkIGJ5IGEgTGluZUl0ZW0uXG4gKiBAcGFyYW0gY29sdW1uc1RvQmVDcmVhdGVkIElkZW50aWZpZWQgcHJvcGVydGllcy5cbiAqIEBwYXJhbSBleGlzdGluZ0NvbHVtbnMgVGhlIGxpc3Qgb2YgY29sdW1ucyBjcmVhdGVkIGZvciBMaW5lSXRlbXMgYW5kIFByb3BlcnRpZXMgb2YgZW50aXR5VHlwZS5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBlbnRpdHkgdHlwZSBmb3IgdGhlIExpbmVJdGVtXG4gKiBAcGFyYW0gZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCBUaGUgbWFwIG9mIHByb3BlcnRpZXMgcmVmZXJlbmNlZCBhcyB0ZXh0IG9uIGEgdGV4dCBhcnJhbmdlbWVudCBhbm5vdGF0aW9uLlxuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB0YWJsZVxuICogQHBhcmFtIHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyBUaGUgZXhpc3RpbmcgcmVzdHJpY3Rpb25zIG9uIHByb3BlcnRpZXNcbiAqIEByZXR1cm5zIFRoZSBhcnJheSBvZiBjb2x1bW5zIGNyZWF0ZWQuXG4gKi9cbmNvbnN0IF9jcmVhdGVSZWxhdGVkQ29sdW1ucyA9IGZ1bmN0aW9uIChcblx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4sXG5cdGV4aXN0aW5nQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcDogUmVjb3JkPHN0cmluZywgRGlzcGxheU1vZGU+LFxuXHR0YWJsZVR5cGU/OiBUYWJsZVR5cGUsXG5cdHRhYmxlQ3JlYXRpb25Nb2RlPzogQ3JlYXRpb25Nb2RlLFxuXHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM/OiBSZXN0cmljdGlvbnNPblByb3BlcnRpZXNcbik6IEFubm90YXRpb25UYWJsZUNvbHVtbltdIHtcblx0Y29uc3QgcmVsYXRlZENvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdID0gW107XG5cdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cdE9iamVjdC5rZXlzKGNvbHVtbnNUb0JlQ3JlYXRlZCkuZm9yRWFjaCgobmFtZSkgPT4ge1xuXHRcdGNvbnN0IHByb3BlcnR5ID0gY29sdW1uc1RvQmVDcmVhdGVkW25hbWVdLFxuXHRcdFx0YW5ub3RhdGlvblBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFic29sdXRlQW5ub3RhdGlvblBhdGgobmFtZSksXG5cdFx0XHQvLyBDaGVjayB3aGV0aGVyIHRoZSByZWxhdGVkIGNvbHVtbiBhbHJlYWR5IGV4aXN0cy5cblx0XHRcdHJlbGF0ZWRDb2x1bW4gPSBleGlzdGluZ0NvbHVtbnMuZmluZCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA9PT0gbmFtZSk7XG5cdFx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcihjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCkpLmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0XHRjb25zdCBwcm9wZXJ0eU9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KGRhdGFNb2RlbE9iamVjdFBhdGgsIG5hbWUpO1xuXHRcdGlmIChpc011bHRpVmFsdWVGaWVsZChwcm9wZXJ0eU9iamVjdFBhdGgpKSB7XG5cdFx0XHRjb25zdCBuZXdOYW1lUmVsYXRpdmVUYXJnZXRQYXRoID0gZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aChwcm9wZXJ0eU9iamVjdFBhdGgsIGZhbHNlLCB0cnVlKTtcblx0XHRcdGNvbnN0IGNvbHVtbiA9IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRhbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0bmFtZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyxcblx0XHRcdFx0dGFibGVDcmVhdGlvbk1vZGUsXG5cdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0bmV3TmFtZVJlbGF0aXZlVGFyZ2V0UGF0aFxuXHRcdFx0KTtcblx0XHRcdGNvbXB1dGVIaWRkZW5PblJlbGF0ZWRDb2x1bW5zKGV4aXN0aW5nQ29sdW1ucywgbmFtZSwgY29sdW1uKTtcblx0XHRcdHJlbGF0ZWRDb2x1bW5zLnB1c2goY29sdW1uKTtcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXBbbmFtZV0gPSBuZXdOYW1lUmVsYXRpdmVUYXJnZXRQYXRoID8/IG5hbWU7XG5cdFx0fSBlbHNlIGlmIChyZWxhdGVkQ29sdW1uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIENhc2UgMTogS2V5IGNvbnRhaW5zIERhdGFGaWVsZCBwcmVmaXggdG8gZW5zdXJlIGFsbCBwcm9wZXJ0eSBjb2x1bW5zIGhhdmUgdGhlIHNhbWUga2V5IGZvcm1hdC5cblx0XHRcdC8vIE5ldyBjcmVhdGVkIHByb3BlcnR5IGNvbHVtbiBpcyBzZXQgdG8gaGlkZGVuLlxuXHRcdFx0Y29uc3QgY29sdW1uID0gZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eShcblx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdGFubm90YXRpb25QYXRoLFxuXHRcdFx0XHRuYW1lLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0YWdncmVnYXRpb25IZWxwZXIsXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAsXG5cdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHRcdFx0XHR0YWJsZUNyZWF0aW9uTW9kZVxuXHRcdFx0KTtcblx0XHRcdGNvbXB1dGVIaWRkZW5PblJlbGF0ZWRDb2x1bW5zKGV4aXN0aW5nQ29sdW1ucywgbmFtZSwgY29sdW1uKTtcblx0XHRcdHJlbGF0ZWRDb2x1bW5zLnB1c2goY29sdW1uKTtcblx0XHR9IGVsc2UgaWYgKHJlbGF0ZWRDb2x1bW4uYW5ub3RhdGlvblBhdGggIT09IGFubm90YXRpb25QYXRoIHx8IHJlbGF0ZWRDb2x1bW4ucHJvcGVydHlJbmZvcykge1xuXHRcdFx0Ly8gQ2FzZSAyOiBUaGUgZXhpc3RpbmcgY29sdW1uIHBvaW50cyB0byBhIExpbmVJdGVtIChvcilcblx0XHRcdC8vIENhc2UgMzogVGhpcyBpcyBhIHNlbGYgcmVmZXJlbmNlIGZyb20gYW4gZXhpc3RpbmcgY29sdW1uXG5cdFx0XHRjb25zdCBuZXdOYW1lID0gYFByb3BlcnR5Ojoke25hbWV9YDtcblx0XHRcdC8vIENoZWNraW5nIHdoZXRoZXIgdGhlIHJlbGF0ZWQgcHJvcGVydHkgY29sdW1uIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCBpbiBhIHByZXZpb3VzIGl0ZXJhdGlvbi5cblx0XHRcdGlmICghZXhpc3RpbmdDb2x1bW5zLnNvbWUoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUgPT09IG5ld05hbWUpKSB7XG5cdFx0XHRcdC8vIENyZWF0ZSBhIG5ldyBwcm9wZXJ0eSBjb2x1bW4gd2l0aCAnUHJvcGVydHk6OicgcHJlZml4LFxuXHRcdFx0XHQvLyBTZXQgaXQgdG8gaGlkZGVuIGFzIGl0IGlzIG9ubHkgY29uc3VtZWQgYnkgQ29tcGxleCBwcm9wZXJ0eSBpbmZvcy5cblx0XHRcdFx0Y29uc3QgY29sdW1uID0gZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eShcblx0XHRcdFx0XHRwcm9wZXJ0eSxcblx0XHRcdFx0XHRhbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0XHRuYW1lLFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdGFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCxcblx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdHRhYmxlQ3JlYXRpb25Nb2RlXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbXB1dGVIaWRkZW5PblJlbGF0ZWRDb2x1bW5zKGV4aXN0aW5nQ29sdW1ucywgbmFtZSwgY29sdW1uKTtcblx0XHRcdFx0cmVsYXRlZENvbHVtbnMucHVzaChjb2x1bW4pO1xuXHRcdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lTWFwW25hbWVdID0gbmV3TmFtZTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdGV4aXN0aW5nQ29sdW1ucy5zb21lKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lID09PSBuZXdOYW1lKSAmJlxuXHRcdFx0XHRleGlzdGluZ0NvbHVtbnMuc29tZSgoY29sdW1uKSA9PiBjb2x1bW4ucHJvcGVydHlJbmZvcz8uaW5jbHVkZXMobmFtZSkpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZU1hcFtuYW1lXSA9IG5ld05hbWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0Ly8gVGhlIHByb3BlcnR5ICduYW1lJyBoYXMgYmVlbiBwcmVmaXhlZCB3aXRoICdQcm9wZXJ0eTo6JyBmb3IgdW5pcXVlbmVzcy5cblx0Ly8gVXBkYXRlIHRoZSBzYW1lIGluIG90aGVyIHByb3BlcnR5SW5mb3NbXSByZWZlcmVuY2VzIHdoaWNoIHBvaW50IHRvIHRoaXMgcHJvcGVydHkuXG5cdGV4aXN0aW5nQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcblx0XHRjb2x1bW4ucHJvcGVydHlJbmZvcyA9IGNvbHVtbi5wcm9wZXJ0eUluZm9zPy5tYXAoKHByb3BlcnR5SW5mbykgPT4gcmVsYXRlZFByb3BlcnR5TmFtZU1hcFtwcm9wZXJ0eUluZm9dID8/IHByb3BlcnR5SW5mbyk7XG5cdFx0Y29sdW1uLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zID0gY29sdW1uLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zPy5tYXAoXG5cdFx0XHQocHJvcGVydHlJbmZvKSA9PiByZWxhdGVkUHJvcGVydHlOYW1lTWFwW3Byb3BlcnR5SW5mb10gPz8gcHJvcGVydHlJbmZvXG5cdFx0KTtcblx0fSk7XG5cdHJldHVybiByZWxhdGVkQ29sdW1ucztcbn07XG5cbi8qKlxuICogR2V0dGluZyB0aGUgQ29sdW1uIE5hbWVcbiAqIElmIGl0IHBvaW50cyB0byBhIERhdGFGaWVsZCB3aXRoIG9uZSBwcm9wZXJ0eSBvciBEYXRhUG9pbnQgd2l0aCBvbmUgcHJvcGVydHksIGl0IHdpbGwgdXNlIHRoZSBwcm9wZXJ0eSBuYW1lXG4gKiBoZXJlIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgZXhpc3RpbmcgZmxleCBjaGFuZ2VzLlxuICogQHBhcmFtIGRhdGFGaWVsZCBEaWZmZXJlbnQgRGF0YUZpZWxkIHR5cGVzIGRlZmluZWQgaW4gdGhlIGFubm90YXRpb25zXG4gKiBAcmV0dXJucyBUaGUgbmFtZSBvZiBhbm5vdGF0aW9uIGNvbHVtbnNcbiAqL1xuY29uc3QgX2dldEFubm90YXRpb25Db2x1bW5OYW1lID0gZnVuY3Rpb24gKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IHN0cmluZyB7XG5cdC8vIFRoaXMgaXMgbmVlZGVkIGFzIHdlIGhhdmUgZmxleGliaWxpdHkgY2hhbmdlcyBhbHJlYWR5IHRoYXQgd2UgaGF2ZSB0byBjaGVjayBhZ2FpbnN0XG5cdGlmIChpc0RhdGFGaWVsZFR5cGVzKGRhdGFGaWVsZCkgJiYgZGF0YUZpZWxkLlZhbHVlPy5wYXRoKSB7XG5cdFx0cmV0dXJuIGRhdGFGaWVsZC5WYWx1ZT8ucGF0aDtcblx0fSBlbHNlIGlmIChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiYgKGRhdGFGaWVsZC5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50KT8uVmFsdWU/LnBhdGgpIHtcblx0XHQvLyBUaGlzIGlzIGZvciByZW1vdmluZyBkdXBsaWNhdGUgcHJvcGVydGllcy4gRm9yIGV4YW1wbGUsICdQcm9ncmVzcycgUHJvcGVydHkgaXMgcmVtb3ZlZCBpZiBpdCBpcyBhbHJlYWR5IGRlZmluZWQgYXMgYSBEYXRhUG9pbnRcblx0XHRyZXR1cm4gKGRhdGFGaWVsZC5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50KT8uVmFsdWUucGF0aDtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpO1xuXHR9XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGRhdGEgZmllbGQgbGFiZWxzIGhhdmUgdG8gYmUgZGlzcGxheWVkIGluIHRoZSB0YWJsZS5cbiAqIEBwYXJhbSBmaWVsZEdyb3VwTmFtZSBUaGUgYERhdGFGaWVsZGAgbmFtZSBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0gdmlzdWFsaXphdGlvblBhdGhcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyBgc2hvd0RhdGFGaWVsZHNMYWJlbGAgdmFsdWUgZnJvbSB0aGUgbWFuaWZlc3RcbiAqL1xuY29uc3QgX2dldFNob3dEYXRhRmllbGRzTGFiZWwgPSBmdW5jdGlvbiAoXG5cdGZpZWxkR3JvdXBOYW1lOiBzdHJpbmcsXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IGNvbHVtbnMgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb248VGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24+KHZpc3VhbGl6YXRpb25QYXRoKT8uY29sdW1ucztcblx0Y29uc3QgY29sdW1uS2V5cyA9IGNvbHVtbnMgJiYgT2JqZWN0LmtleXMoY29sdW1ucyk7XG5cdHJldHVybiAoXG5cdFx0Y29sdW1uS2V5cyAmJlxuXHRcdCEhY29sdW1uS2V5cy5maW5kKGZ1bmN0aW9uIChrZXk6IHN0cmluZykge1xuXHRcdFx0cmV0dXJuIGtleSA9PT0gZmllbGRHcm91cE5hbWUgJiYgKGNvbHVtbnNba2V5XSBhcyBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW5Gb3JPdmVycmlkZSkuc2hvd0RhdGFGaWVsZHNMYWJlbDtcblx0XHR9KVxuXHQpO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB3aXRoIHJlc3BlY3QgdG8gdGhlIHJvb3QgZW50aXR5LlxuICogQHBhcmFtIGRhdGFGaWVsZCBUaGUgYERhdGFGaWVsZGAgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhcbiAqL1xuY29uc3QgX2dldFJlbGF0aXZlUGF0aCA9IGZ1bmN0aW9uIChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpOiBzdHJpbmcge1xuXHRsZXQgcmVsYXRpdmVQYXRoID0gXCJcIjtcblx0c3dpdGNoIChkYXRhRmllbGQuJFR5cGUpIHtcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRcdHJlbGF0aXZlUGF0aCA9IChkYXRhRmllbGQgYXMgRGF0YUZpZWxkKT8uVmFsdWU/LnBhdGg7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0XHRyZWxhdGl2ZVBhdGggPSBkYXRhRmllbGQ/LlRhcmdldD8udmFsdWU7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbkdyb3VwOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbkdyb3VwOlxuXHRcdFx0cmVsYXRpdmVQYXRoID0gS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpO1xuXHRcdFx0YnJlYWs7XG5cdH1cblx0cmV0dXJuIHJlbGF0aXZlUGF0aDtcbn07XG5cbmNvbnN0IF9zbGljZUF0U2xhc2ggPSBmdW5jdGlvbiAocGF0aDogc3RyaW5nLCBpc0xhc3RTbGFzaDogYm9vbGVhbiwgaXNMYXN0UGFydDogYm9vbGVhbik6IHN0cmluZyB7XG5cdGNvbnN0IGlTbGFzaEluZGV4ID0gaXNMYXN0U2xhc2ggPyBwYXRoLmxhc3RJbmRleE9mKFwiL1wiKSA6IHBhdGguaW5kZXhPZihcIi9cIik7XG5cdGlmIChpU2xhc2hJbmRleCA9PT0gLTEpIHtcblx0XHRyZXR1cm4gcGF0aDtcblx0fVxuXHRyZXR1cm4gaXNMYXN0UGFydCA/IHBhdGguc3Vic3RyaW5nKGlTbGFzaEluZGV4ICsgMSwgcGF0aC5sZW5ndGgpIDogcGF0aC5zdWJzdHJpbmcoMCwgaVNsYXNoSW5kZXgpO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBjb2x1bW4gY29udGFpbnMgYSBtdWx0aS12YWx1ZSBmaWVsZC5cbiAqIEBwYXJhbSBkYXRhRmllbGQgVGhlIERhdGFGaWVsZCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgRGF0YUZpZWxkIGNvcnJlc3BvbmRzIHRvIGEgbXVsdGktdmFsdWUgZmllbGQuXG4gKi9cbmNvbnN0IF9pc0NvbHVtbk11bHRpVmFsdWVkID0gZnVuY3Rpb24gKFxuXHRkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogYm9vbGVhbiB7XG5cdGlmIChpc0RhdGFGaWVsZFR5cGVzKGRhdGFGaWVsZCkgJiYgaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24oZGF0YUZpZWxkLlZhbHVlKSkge1xuXHRcdGNvbnN0IHByb3BlcnR5T2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFBhZ2VDb250ZXh0UGF0aFRhcmdldD4oXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSxcblx0XHRcdGRhdGFGaWVsZC5WYWx1ZS5wYXRoXG5cdFx0KTtcblx0XHRyZXR1cm4gaXNNdWx0aVZhbHVlRmllbGQocHJvcGVydHlPYmplY3RQYXRoKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBjb2x1bW4gaXMgc29ydGFibGUuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBkYXRhIGZpZWxkIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHByb3BlcnR5UGF0aCBUaGUgcHJvcGVydHkgcGF0aFxuICogQHBhcmFtIG5vblNvcnRhYmxlQ29sdW1ucyBDb2xsZWN0aW9uIG9mIG5vbi1zb3J0YWJsZSBjb2x1bW4gbmFtZXMgYXMgcGVyIGFubm90YXRpb25cbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllc0luZm8gVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBsaW5rZWQgdG8gdGhlIGNvbHVtblxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY29sdW1uIGlzIHNvcnRhYmxlXG4gKi9cbmNvbnN0IF9pc0NvbHVtblNvcnRhYmxlID0gZnVuY3Rpb24gKFxuXHRkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdHByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRub25Tb3J0YWJsZUNvbHVtbnM6IHN0cmluZ1tdLFxuXHRyZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm9cbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gKFxuXHRcdCFub25Tb3J0YWJsZUNvbHVtbnMuaW5jbHVkZXMocHJvcGVydHlQYXRoKSAmJiAvLyBDb2x1bW4gaXMgbm90IG1hcmtlZCBhcyBub24tc29ydGFibGUgdmlhIGFubm90YXRpb25cblx0XHQoKChkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZCB8fCBkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24pICYmXG5cdFx0XHRPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllcykuc29tZSgocHJvcE5hbWUpID0+IHtcblx0XHRcdFx0Y29uc3QgaXNIaWRkZW4gPSBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1twcm9wTmFtZV0uYW5ub3RhdGlvblByb3BlcnR5KTtcblx0XHRcdFx0cmV0dXJuICFpc0hpZGRlbiAmJiAhbm9uU29ydGFibGVDb2x1bW5zLmluY2x1ZGVzKHByb3BOYW1lKTtcblx0XHRcdH0pKSB8fFxuXHRcdFx0ZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsIHx8XG5cdFx0XHRkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb24gfHxcblx0XHRcdGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbilcblx0KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIGZpbHRlcmluZyBvbiB0aGUgdGFibGUgaXMgY2FzZSBzZW5zaXRpdmUuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyBSZXR1cm5zICdmYWxzZScgaWYgRmlsdGVyRnVuY3Rpb25zIGFubm90YXRpb24gc3VwcG9ydHMgJ3RvbG93ZXInLCBlbHNlICd0cnVlJ1xuICovXG5leHBvcnQgY29uc3QgaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlID0gZnVuY3Rpb24gKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pik6IGJvb2xlYW4ge1xuXHRjb25zdCBmaWx0ZXJGdW5jdGlvbnM6IEZpbHRlckZ1bmN0aW9ucyB8IHVuZGVmaW5lZCA9IF9nZXRGaWx0ZXJGdW5jdGlvbnMoY29udmVydGVyQ29udGV4dCk7XG5cdHJldHVybiBNb2RlbEhlbHBlci5pc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUodW5kZWZpbmVkLCBmaWx0ZXJGdW5jdGlvbnMpO1xufTtcblxuZnVuY3Rpb24gX2dldEZpbHRlckZ1bmN0aW9ucyhDb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBGaWx0ZXJGdW5jdGlvbnMgfCB1bmRlZmluZWQge1xuXHRjb25zdCBlbnRpdHlTZXQgPSBDb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpO1xuXHRpZiAoVHlwZUd1YXJkcy5pc0VudGl0eVNldChlbnRpdHlTZXQpKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdGVudGl0eVNldC5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LkZpbHRlckZ1bmN0aW9ucyA/P1xuXHRcdFx0Q29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlDb250YWluZXIoKS5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LkZpbHRlckZ1bmN0aW9uc1xuXHRcdCk7XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGRlZmF1bHQgZm9ybWF0IG9wdGlvbnMgZm9yIHRleHQgZmllbGRzIGluIGEgdGFibGUuXG4gKiBAcGFyYW0gZm9ybWF0T3B0aW9uc1xuICogQHJldHVybnMgQ29sbGVjdGlvbiBvZiBmb3JtYXQgb3B0aW9ucyB3aXRoIGRlZmF1bHQgdmFsdWVzXG4gKi9cbmZ1bmN0aW9uIF9nZXREZWZhdWx0Rm9ybWF0T3B0aW9uc0ZvclRhYmxlKGZvcm1hdE9wdGlvbnM6IEZvcm1hdE9wdGlvbnNUeXBlIHwgdW5kZWZpbmVkKTogRm9ybWF0T3B0aW9uc1R5cGUgfCB1bmRlZmluZWQge1xuXHRyZXR1cm4gZm9ybWF0T3B0aW9ucyA9PT0gdW5kZWZpbmVkXG5cdFx0PyB1bmRlZmluZWRcblx0XHQ6IHtcblx0XHRcdFx0dGV4dExpbmVzRWRpdDogNCxcblx0XHRcdFx0Li4uZm9ybWF0T3B0aW9uc1xuXHRcdCAgfTtcbn1cblxuZnVuY3Rpb24gX2ZpbmRTZW1hbnRpY0tleVZhbHVlcyhzZW1hbnRpY0tleXM6IFNlbWFudGljS2V5LCBuYW1lOiBzdHJpbmcpOiB7IHZhbHVlczogc3RyaW5nW107IHNlbWFudGljS2V5Rm91bmQ6IGJvb2xlYW4gfSB7XG5cdGNvbnN0IGFTZW1hbnRpY0tleVZhbHVlczogc3RyaW5nW10gPSBbXTtcblx0bGV0IGJTZW1hbnRpY0tleUZvdW5kID0gZmFsc2U7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgc2VtYW50aWNLZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0YVNlbWFudGljS2V5VmFsdWVzLnB1c2goc2VtYW50aWNLZXlzW2ldLnZhbHVlKTtcblx0XHRpZiAoc2VtYW50aWNLZXlzW2ldLnZhbHVlID09PSBuYW1lKSB7XG5cdFx0XHRiU2VtYW50aWNLZXlGb3VuZCA9IHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7XG5cdFx0dmFsdWVzOiBhU2VtYW50aWNLZXlWYWx1ZXMsXG5cdFx0c2VtYW50aWNLZXlGb3VuZDogYlNlbWFudGljS2V5Rm91bmRcblx0fTtcbn1cblxuZnVuY3Rpb24gX2ZpbmRQcm9wZXJ0aWVzKFxuXHRzZW1hbnRpY0tleVZhbHVlczogc3RyaW5nW10sXG5cdGZpZWxkR3JvdXBQcm9wZXJ0aWVzOiBzdHJpbmdbXVxuKTogeyBzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBib29sZWFuOyBmaWVsZEdyb3VwUHJvcGVydHlQYXRoPzogc3RyaW5nIH0ge1xuXHRsZXQgc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCA9IGZhbHNlO1xuXHRsZXQgc1Byb3BlcnR5UGF0aDtcblx0aWYgKHNlbWFudGljS2V5VmFsdWVzICYmIHNlbWFudGljS2V5VmFsdWVzLmxlbmd0aCA+PSAxICYmIGZpZWxkR3JvdXBQcm9wZXJ0aWVzICYmIGZpZWxkR3JvdXBQcm9wZXJ0aWVzLmxlbmd0aCA+PSAxKSB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzZW1hbnRpY0tleVZhbHVlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKFtzZW1hbnRpY0tleVZhbHVlc1tpXV0uc29tZSgodG1wKSA9PiBmaWVsZEdyb3VwUHJvcGVydGllcy5pbmNsdWRlcyh0bXApKSkge1xuXHRcdFx0XHRzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwID0gdHJ1ZTtcblx0XHRcdFx0c1Byb3BlcnR5UGF0aCA9IHNlbWFudGljS2V5VmFsdWVzW2ldO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHtcblx0XHRzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwLFxuXHRcdGZpZWxkR3JvdXBQcm9wZXJ0eVBhdGg6IHNQcm9wZXJ0eVBhdGhcblx0fTtcbn1cblxuLyoqXG4gKiBGaW5kIHRoZSBmaXJzdCBwcm9wZXJ0eSBpbiB0aGUgZmllbGRHcm91cCB0aGF0IGlzIHBhcnQgb2YgdGhlIHNlbWFudGljIGtleXMuXG4gKiBAcGFyYW0gZGF0YUZpZWxkR3JvdXBcbiAqIEBwYXJhbSBzZW1hbnRpY0tleVZhbHVlc1xuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgYSBmbGFnIHRydWUgaWYgYSBwcm9wZXJ0eSBpcyBmb3VuZCBhbmQgYSBwcm9wZXJ0eVBhdGguXG4gKi9cbmZ1bmN0aW9uIF9maW5kU2VtYW50aWNLZXlWYWx1ZXNJbkZpZWxkR3JvdXAoXG5cdGRhdGFGaWVsZEdyb3VwOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgbnVsbCxcblx0c2VtYW50aWNLZXlWYWx1ZXM6IHN0cmluZ1tdXG4pOiB7IHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXA6IGJvb2xlYW47IHByb3BlcnR5UGF0aD86IHN0cmluZyB9IHtcblx0Ly8gdGhpcyBpbmZvIGlzIHVzZWQgaW4gRmllbGRIZWxwZXIjaXNEcmFmdEluZGljYXRvclZpc2libGVJbkZpZWxkR3JvdXAgdG8gc2hvdyBhIGRyYWZ0IGluZGljYXRvciBhdCB0aGUgZW5kIG9mIGEgZmllbGQgZ3JvdXBcblx0Y29uc3QgYVByb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cdGxldCBfcHJvcGVydGllc0ZvdW5kOiB7IHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXA6IGJvb2xlYW47IGZpZWxkR3JvdXBQcm9wZXJ0eVBhdGg/OiBzdHJpbmcgfSA9IHtcblx0XHRzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBmYWxzZSxcblx0XHRmaWVsZEdyb3VwUHJvcGVydHlQYXRoOiB1bmRlZmluZWRcblx0fTtcblx0aWYgKFxuXHRcdGRhdGFGaWVsZEdyb3VwICYmXG5cdFx0ZGF0YUZpZWxkR3JvdXAuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiZcblx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZVxuXHQpIHtcblx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQuJHRhcmdldC5EYXRhPy5mb3JFYWNoKChpbm5lckRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykgPT4ge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoaW5uZXJEYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZCB8fCBpbm5lckRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybCkgJiZcblx0XHRcdFx0aW5uZXJEYXRhRmllbGQuVmFsdWVcblx0XHRcdCkge1xuXHRcdFx0XHRhUHJvcGVydGllcy5wdXNoKGlubmVyRGF0YUZpZWxkLlZhbHVlLnBhdGgpO1xuXHRcdFx0fVxuXHRcdFx0X3Byb3BlcnRpZXNGb3VuZCA9IF9maW5kUHJvcGVydGllcyhzZW1hbnRpY0tleVZhbHVlcywgYVByb3BlcnRpZXMpO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0c2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cDogX3Byb3BlcnRpZXNGb3VuZC5zZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwLFxuXHRcdHByb3BlcnR5UGF0aDogX3Byb3BlcnRpZXNGb3VuZC5maWVsZEdyb3VwUHJvcGVydHlQYXRoXG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBkZWZhdWx0IGZvcm1hdCBvcHRpb25zIHdpdGggZHJhZnRJbmRpY2F0b3IgZm9yIGEgY29sdW1uLlxuICogQHBhcmFtIG5hbWVcbiAqIEBwYXJhbSBzZW1hbnRpY0tleXNcbiAqIEBwYXJhbSBkYXRhRmllbGRHcm91cFxuICogQHJldHVybnMgQ29sbGVjdGlvbiBvZiBmb3JtYXQgb3B0aW9ucyB3aXRoIGRlZmF1bHQgdmFsdWVzXG4gKi9cbmZ1bmN0aW9uIGdldERlZmF1bHREcmFmdEluZGljYXRvckZvckNvbHVtbihcblx0bmFtZTogc3RyaW5nLFxuXHRzZW1hbnRpY0tleXM6IFNlbWFudGljS2V5LFxuXHRkYXRhRmllbGRHcm91cDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IG51bGxcbik6IFBhcnRpYWw8e1xuXHRmaWVsZEdyb3VwRHJhZnRJbmRpY2F0b3JQcm9wZXJ0eVBhdGg6IHN0cmluZztcblx0ZmllbGRHcm91cE5hbWU6IHN0cmluZztcblx0c2hvd0Vycm9yT2JqZWN0U3RhdHVzOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0aGFzRHJhZnRJbmRpY2F0b3I6IGJvb2xlYW47XG59PiB7XG5cdGlmICghc2VtYW50aWNLZXlzKSB7XG5cdFx0cmV0dXJuIHt9O1xuXHR9XG5cdGNvbnN0IHNlbWFudGljS2V5ID0gX2ZpbmRTZW1hbnRpY0tleVZhbHVlcyhzZW1hbnRpY0tleXMsIG5hbWUpO1xuXHRjb25zdCBzZW1hbnRpY0tleUluRmllbGRHcm91cCA9IF9maW5kU2VtYW50aWNLZXlWYWx1ZXNJbkZpZWxkR3JvdXAoZGF0YUZpZWxkR3JvdXAsIHNlbWFudGljS2V5LnZhbHVlcyk7XG5cdGlmIChzZW1hbnRpY0tleUluRmllbGRHcm91cC5zZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwKSB7XG5cdFx0Ly8gU2VtYW50aWMgS2V5IGhhcyBhIHByb3BlcnR5IGluIGEgRmllbGRHcm91cFxuXHRcdHJldHVybiB7XG5cdFx0XHQvL1RPRE8gd2Ugc2hvdWxkIHJhdGhlciBzdG9yZSBoYXNTZW1hbnRpY0tleUluRmllbGRHcm91cFxuXHRcdFx0ZmllbGRHcm91cERyYWZ0SW5kaWNhdG9yUHJvcGVydHlQYXRoOiBzZW1hbnRpY0tleUluRmllbGRHcm91cC5wcm9wZXJ0eVBhdGgsXG5cdFx0XHRmaWVsZEdyb3VwTmFtZTogbmFtZSxcblx0XHRcdHNob3dFcnJvck9iamVjdFN0YXR1czogY29tcGlsZUV4cHJlc3Npb24oZ2V0Um93U3RhdHVzVmlzaWJpbGl0eShuYW1lLCB0cnVlKSlcblx0XHR9O1xuXHR9IGVsc2UgaWYgKHNlbWFudGljS2V5LnNlbWFudGljS2V5Rm91bmQpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aGFzRHJhZnRJbmRpY2F0b3I6IHRydWUsXG5cdFx0XHRzaG93RXJyb3JPYmplY3RTdGF0dXM6IGNvbXBpbGVFeHByZXNzaW9uKGdldFJvd1N0YXR1c1Zpc2liaWxpdHkobmFtZSwgZmFsc2UpKVxuXHRcdH07XG5cdH1cblx0cmV0dXJuIHt9O1xufVxuXG5mdW5jdGlvbiBfZ2V0SW1wTnVtYmVyKGRhdGFGaWVsZDogRGF0YUZpZWxkVHlwZXMpOiBudW1iZXIge1xuXHRjb25zdCBpbXBvcnRhbmNlID0gZGF0YUZpZWxkPy5hbm5vdGF0aW9ucz8uVUk/LkltcG9ydGFuY2UgYXMgc3RyaW5nO1xuXHRpZiAoaW1wb3J0YW5jZSAmJiBpbXBvcnRhbmNlLmluY2x1ZGVzKFwiVUkuSW1wb3J0YW5jZVR5cGUvSGlnaFwiKSkge1xuXHRcdHJldHVybiAzO1xuXHR9XG5cdGlmIChpbXBvcnRhbmNlICYmIGltcG9ydGFuY2UuaW5jbHVkZXMoXCJVSS5JbXBvcnRhbmNlVHlwZS9NZWRpdW1cIikpIHtcblx0XHRyZXR1cm4gMjtcblx0fVxuXHRpZiAoaW1wb3J0YW5jZSAmJiBpbXBvcnRhbmNlLmluY2x1ZGVzKFwiVUkuSW1wb3J0YW5jZVR5cGUvTG93XCIpKSB7XG5cdFx0cmV0dXJuIDE7XG5cdH1cblx0cmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIF9nZXREYXRhRmllbGRJbXBvcnRhbmNlKGRhdGFGaWVsZDogRGF0YUZpZWxkVHlwZXMpOiBJbXBvcnRhbmNlIHtcblx0Y29uc3QgaW1wb3J0YW5jZSA9IGRhdGFGaWVsZD8uYW5ub3RhdGlvbnM/LlVJPy5JbXBvcnRhbmNlIGFzIHN0cmluZztcblx0cmV0dXJuIGltcG9ydGFuY2UgPyAoaW1wb3J0YW5jZS5zcGxpdChcIi9cIilbMV0gYXMgSW1wb3J0YW5jZSkgOiBJbXBvcnRhbmNlLk5vbmU7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgZXhwb3J0IHNldHRpbmdzIG9mIGEgY29sdW1uIGNvbnRhaW5pbmcgZGF0YXBvaW50cy5cbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgcmVmZXJlbmNlZCBvbiBhIGdpdmVuIGNvbHVtblxuICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIHRvIGJlIHVwZGF0ZWRcbiAqL1xuZnVuY3Rpb24gX3NldEV4cG9ydFNldHRpbmdzRm9yRGF0YVBvaW50KHByb3BlcnR5OiBQcm9wZXJ0eSwgY29sdW1uOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4pOiB2b2lkIHtcblx0Y29uc3QgdGFyZ2V0VmFsdWVmcm9tRFAgPSBnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50KHByb3BlcnR5KTtcblx0aWYgKFxuXHRcdGlzRGF0YVBvaW50RnJvbURhdGFGaWVsZERlZmF1bHQocHJvcGVydHkpICYmXG5cdFx0dHlwZW9mIHRhcmdldFZhbHVlZnJvbURQID09PSBcInN0cmluZ1wiICYmXG5cdFx0Y29sdW1uLmV4cG9ydFNldHRpbmdzICYmXG5cdFx0Y29sdW1uLmV4cG9ydFNldHRpbmdzPy51bml0ICE9PSBcIiVcIlxuXHQpIHtcblx0XHRjb2x1bW4uZXhwb3J0RGF0YVBvaW50VGFyZ2V0VmFsdWUgPSB0YXJnZXRWYWx1ZWZyb21EUDtcblx0XHRjb2x1bW4uZXhwb3J0U2V0dGluZ3MudGVtcGxhdGUgPSBcInswfS9cIiArIHRhcmdldFZhbHVlZnJvbURQO1xuXHR9XG59XG5cbmZ1bmN0aW9uIF9nZXRNYXhJbXBvcnRhbmNlKGZpZWxkczogRGF0YUZpZWxkVHlwZXNbXSk6IEltcG9ydGFuY2Uge1xuXHRpZiAoZmllbGRzICYmIGZpZWxkcy5sZW5ndGggPiAwKSB7XG5cdFx0bGV0IG1heEltcE51bWJlciA9IC0xO1xuXHRcdGxldCBpbXBOdW1iZXIgPSAtMTtcblx0XHRsZXQgRGF0YUZpZWxkV2l0aE1heEltcG9ydGFuY2U7XG5cdFx0Zm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcblx0XHRcdGltcE51bWJlciA9IF9nZXRJbXBOdW1iZXIoZmllbGQpO1xuXHRcdFx0aWYgKGltcE51bWJlciA+IG1heEltcE51bWJlcikge1xuXHRcdFx0XHRtYXhJbXBOdW1iZXIgPSBpbXBOdW1iZXI7XG5cdFx0XHRcdERhdGFGaWVsZFdpdGhNYXhJbXBvcnRhbmNlID0gZmllbGQ7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBfZ2V0RGF0YUZpZWxkSW1wb3J0YW5jZShEYXRhRmllbGRXaXRoTWF4SW1wb3J0YW5jZSBhcyBEYXRhRmllbGRUeXBlcyk7XG5cdH1cblx0cmV0dXJuIEltcG9ydGFuY2UuTm9uZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbXBvcnRhbmNlIHZhbHVlIGZvciBhIGNvbHVtbi5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gZGF0YUZpZWxkXG4gKiBAcmV0dXJucyBUaGUgaW1wb3J0YW5jZSB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW1wb3J0YW5jZShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCB1bmRlZmluZWRcbik6IEltcG9ydGFuY2UgfCB1bmRlZmluZWQge1xuXHRpZiAoIWRhdGFGaWVsZCkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0Y29uc3Qgc2VtYW50aWNLZXlzID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkudGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucy5Db21tb24/LlNlbWFudGljS2V5ID8/IFtdO1xuXHRjb25zdCByZXF1aXJlZFByb3BlcnRpZXMgPSBnZXRSZXF1aXJlZFByb3BlcnRpZXMoY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGhpZ2hLZXlzID0gWy4uLnNlbWFudGljS2V5cywgLi4ucmVxdWlyZWRQcm9wZXJ0aWVzXS5tYXAoKHByb3BlcnR5UGF0aCkgPT4gcHJvcGVydHlQYXRoLiR0YXJnZXQ/LmZ1bGx5UXVhbGlmaWVkTmFtZSk7XG5cdC8vRXZhbHVhdGUgZGVmYXVsdCBJbXBvcnRhbmNlIGlzIG5vdCBzZXQgZXhwbGljaXRseVxuXHRsZXQgZmllbGRzV2l0aEltcG9ydGFuY2U7XG5cdGlmIChpc0Fubm90YXRpb25PZlR5cGU8RGF0YUZpZWxkRm9yQW5ub3RhdGlvbj4oZGF0YUZpZWxkLCBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uKSkge1xuXHRcdGNvbnN0IGRhdGFGaWVsZFRhcmdldCA9IGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldDtcblx0XHRpZiAoaXNBbm5vdGF0aW9uT2ZUeXBlPEZpZWxkR3JvdXA+KGRhdGFGaWVsZFRhcmdldCwgVUlBbm5vdGF0aW9uVHlwZXMuRmllbGRHcm91cFR5cGUpKSB7XG5cdFx0XHRjb25zdCBmaWVsZEdyb3VwRGF0YSA9IGRhdGFGaWVsZFRhcmdldC5EYXRhO1xuXHRcdFx0Ly9JZiBhIEZpZWxkR3JvdXAgY29udGFpbnMgYSBzZW1hbnRpY0tleSBvciByZXF1aXJlZCBwcm9wZXJ0eSwgaW1wb3J0YW5jZSBzZXQgdG8gSGlnaFxuXHRcdFx0aWYgKFxuXHRcdFx0XHRmaWVsZEdyb3VwRGF0YS5zb21lKGZ1bmN0aW9uIChmaWVsZEdyb3VwRGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogYm9vbGVhbiB7XG5cdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdGlzRGF0YUZpZWxkVHlwZXMoZmllbGRHcm91cERhdGFGaWVsZCkgJiYgaGlnaEtleXMuaW5jbHVkZXMoZmllbGRHcm91cERhdGFGaWVsZC5WYWx1ZT8uJHRhcmdldD8uZnVsbHlRdWFsaWZpZWROYW1lKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0pXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIEltcG9ydGFuY2UuSGlnaDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vSWYgdGhlIERhdGFGaWVsZEZvckFubm90YXRpb24gaGFzIGFuIEltcG9ydGFuY2Ugd2UgdGFrZSBpdFxuXHRcdFx0XHRpZiAoZGF0YUZpZWxkPy5hbm5vdGF0aW9ucz8uVUk/LkltcG9ydGFuY2UpIHtcblx0XHRcdFx0XHRyZXR1cm4gX2dldERhdGFGaWVsZEltcG9ydGFuY2UoZGF0YUZpZWxkIGFzIHVua25vd24gYXMgRGF0YUZpZWxkVHlwZXMpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIGVsc2UgdGhlIGhpZ2hlc3QgaW1wb3J0YW5jZSAoaWYgYW55KSBpcyByZXR1cm5lZFxuXHRcdFx0XHRmaWVsZHNXaXRoSW1wb3J0YW5jZSA9IGZpZWxkR3JvdXBEYXRhLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuXHRcdFx0XHRcdHJldHVybiBpdGVtPy5hbm5vdGF0aW9ucz8uVUk/LkltcG9ydGFuY2U7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gX2dldE1heEltcG9ydGFuY2UoZmllbGRzV2l0aEltcG9ydGFuY2UgYXMgRGF0YUZpZWxkVHlwZXNbXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBoaWdoS2V5cy5pbmNsdWRlcygoZGF0YUZpZWxkIGFzIERhdGFGaWVsZFR5cGVzKS5WYWx1ZT8uJHRhcmdldD8uZnVsbHlRdWFsaWZpZWROYW1lKVxuXHRcdD8gSW1wb3J0YW5jZS5IaWdoXG5cdFx0OiBfZ2V0RGF0YUZpZWxkSW1wb3J0YW5jZShkYXRhRmllbGQgYXMgdW5rbm93biBhcyBEYXRhRmllbGRUeXBlcyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBsaW5lIGl0ZW1zIGZyb20gbWV0YWRhdGEgYW5ub3RhdGlvbnMuXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgd2l0aCB0aGVpciBhbm5vdGF0aW9uc1xuICogQHBhcmFtIHRhYmxlVHlwZSBUaGUgdGFibGUgdHlwZVxuICogQHBhcmFtIHZpc3VhbGl6YXRpb25QYXRoIFRoZSB2aXN1YWxpemF0aW9uIHBhdGhcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgVGhlIGNvbHVtbnMgZnJvbSB0aGUgYW5ub3RhdGlvbnNcbiAqL1xuY29uc3QgZ2V0Q29sdW1uc0Zyb21Bbm5vdGF0aW9ucyA9IGZ1bmN0aW9uIChcblx0bGluZUl0ZW1Bbm5vdGF0aW9uOiBMaW5lSXRlbSxcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10ge1xuXHRjb25zdCBlbnRpdHlUeXBlOiBFbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZShsaW5lSXRlbUFubm90YXRpb24pLFxuXHRcdGFubm90YXRpb25Db2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSA9IFtdLFxuXHRcdGNvbHVtbnNUb0JlQ3JlYXRlZDogUmVjb3JkPHN0cmluZywgUHJvcGVydHk+ID0ge30sXG5cdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcDogUmVjb3JkPHN0cmluZywgRGlzcGxheU1vZGU+ID0ge30sXG5cdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzID0gZ2V0UmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdHRhYmxlTWFuaWZlc3RTZXR0aW5nczogVGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24gPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odmlzdWFsaXphdGlvblBhdGgpLFxuXHRcdGRlZmF1bHRDcmVhdGlvbk1vZGUgPVxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5nZXRTYXBGZU1hbmlmZXN0Q29uZmlndXJhdGlvbigpPy5tYWNyb3M/LnRhYmxlPy5kZWZhdWx0Q3JlYXRpb25Nb2RlID09PVxuXHRcdFx0XCJJbmxpbmVDcmVhdGlvblJvd3NcIlxuXHRcdFx0XHQ/IENyZWF0aW9uTW9kZS5JbmxpbmVDcmVhdGlvblJvd3Ncblx0XHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0dGFibGVDcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZSA9XG5cdFx0XHR0YWJsZU1hbmlmZXN0U2V0dGluZ3M/LnRhYmxlU2V0dGluZ3M/LmNyZWF0aW9uTW9kZT8ubmFtZSA/PyBkZWZhdWx0Q3JlYXRpb25Nb2RlID8/IENyZWF0aW9uTW9kZS5JbmxpbmU7XG5cdGNvbnN0IHNlbWFudGljS2V5czogU2VtYW50aWNLZXkgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25zQnlUZXJtKFwiQ29tbW9uXCIsIENvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY0tleSwgW1xuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpXG5cdF0pWzBdIGFzIFNlbWFudGljS2V5O1xuXHRpZiAobGluZUl0ZW1Bbm5vdGF0aW9uKSB7XG5cdFx0Y29uc3QgdGFibGVDb252ZXJ0ZXJDb250ZXh0ID0gY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZXJDb250ZXh0Rm9yPFBhZ2VDb250ZXh0UGF0aFRhcmdldD4oXG5cdFx0XHRnZXRUYXJnZXRPYmplY3RQYXRoKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKVxuXHRcdCk7XG5cdFx0bGluZUl0ZW1Bbm5vdGF0aW9uLmZvckVhY2goKGRhdGFGaWVsZCkgPT4ge1xuXHRcdFx0Ly8gVE9ETzogdmFyaWFibGUgbmFtZSBzaG91bGQgYmUgZGF0YWZpZWxkIGFuZCBub3QgbGluZUl0ZW1cblx0XHRcdGlmICghX2lzVmFsaWRDb2x1bW4oZGF0YUZpZWxkKSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRsZXQgZXhwb3J0U2V0dGluZ3M6IFByb3BlcnR5SW5mb1tcImV4cG9ydFNldHRpbmdzXCJdID0gbnVsbDtcblx0XHRcdGNvbnN0IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGggPVxuXHRcdFx0XHRpc0RhdGFGaWVsZFR5cGVzKGRhdGFGaWVsZCkgJiYgZGF0YUZpZWxkLlZhbHVlPy4kdGFyZ2V0Py5mdWxseVF1YWxpZmllZE5hbWVcblx0XHRcdFx0XHQ/IGdldFNlbWFudGljT2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LCBkYXRhRmllbGQpXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRjb25zdCByZWxhdGl2ZVBhdGggPSBfZ2V0UmVsYXRpdmVQYXRoKGRhdGFGaWVsZCk7XG5cdFx0XHQvLyBEZXRlcm1pbmUgcHJvcGVydGllcyB3aGljaCBhcmUgY29uc3VtZWQgYnkgdGhpcyBMaW5lSXRlbS5cblx0XHRcdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbzogQ29tcGxleFByb3BlcnR5SW5mbyA9IGNvbGxlY3RSZWxhdGVkUHJvcGVydGllc1JlY3Vyc2l2ZWx5KGRhdGFGaWVsZCwgY29udmVydGVyQ29udGV4dCwgdGFibGVUeXBlKTtcblx0XHRcdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzKTtcblx0XHRcdGNvbnN0IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5hZGRpdGlvbmFsUHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBncm91cFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHJlbGF0aXZlUGF0aCA/IF9zbGljZUF0U2xhc2gocmVsYXRpdmVQYXRoLCB0cnVlLCBmYWxzZSkgOiB1bmRlZmluZWQ7XG5cdFx0XHRjb25zdCBpc0dyb3VwOiBib29sZWFuID0gZ3JvdXBQYXRoICE9IHJlbGF0aXZlUGF0aDtcblx0XHRcdGNvbnN0IGxhYmVsID0gZ2V0TGFiZWwoZGF0YUZpZWxkLCBpc0dyb3VwKTtcblx0XHRcdGNvbnN0IG5hbWUgPSBfZ2V0QW5ub3RhdGlvbkNvbHVtbk5hbWUoZGF0YUZpZWxkKTtcblx0XHRcdGNvbnN0IGlzRmllbGRHcm91cENvbHVtbjogYm9vbGVhbiA9IGdyb3VwUGF0aCA/IGdyb3VwUGF0aC5pbmNsdWRlcyhgQCR7VUlBbm5vdGF0aW9uVGVybXMuRmllbGRHcm91cH1gKSA6IGZhbHNlO1xuXHRcdFx0Y29uc3Qgc2hvd0RhdGFGaWVsZHNMYWJlbDogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGlzRmllbGRHcm91cENvbHVtblxuXHRcdFx0XHQ/IF9nZXRTaG93RGF0YUZpZWxkc0xhYmVsKG5hbWUsIHZpc3VhbGl6YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0KVxuXHRcdFx0XHQ6IGZhbHNlO1xuXHRcdFx0Y29uc3QgZGF0YVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGdldERhdGFGaWVsZERhdGFUeXBlKGRhdGFGaWVsZCk7XG5cdFx0XHRjb25zdCBmb3JtYXRPcHRpb25zID0gX2dldERlZmF1bHRGb3JtYXRPcHRpb25zRm9yVGFibGUoZ2V0RGVmYXVsdERyYWZ0SW5kaWNhdG9yRm9yQ29sdW1uKG5hbWUsIHNlbWFudGljS2V5cywgZGF0YUZpZWxkKSk7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxEYXRhRmllbGRBYnN0cmFjdFR5cGVzPihcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksXG5cdFx0XHRcdHJlbGF0aXZlUGF0aFxuXHRcdFx0KTtcblx0XHRcdC8vIERldGVybWluZSBpZiB3ZSBuZWVkIGEgc2l0dWF0aW9ucyBpbmRpY2F0b3Jcblx0XHRcdGNvbnN0IG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBOYXZpZ2F0aW9uUHJvcGVydHlbXSA9IHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzO1xuXHRcdFx0Y29uc3Qgc2l0dWF0aW9uc05hdlByb3BzID0gbmF2aWdhdGlvblByb3BlcnRpZXMuZmlsdGVyKFxuXHRcdFx0XHQobmF2aWdhdGlvblByb3BlcnR5KSA9PlxuXHRcdFx0XHRcdCFuYXZpZ2F0aW9uUHJvcGVydHkuaXNDb2xsZWN0aW9uICYmXG5cdFx0XHRcdFx0bmF2aWdhdGlvblByb3BlcnR5LnRhcmdldFR5cGUuYW5ub3RhdGlvbnMuQ29tbW9uPy5TQVBPYmplY3ROb2RlVHlwZT8uTmFtZSA9PT0gXCJCdXNpbmVzc1NpdHVhdGlvblwiXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3Qgc2l0dWF0aW9uc05hdlByb3A6IE5hdmlnYXRpb25Qcm9wZXJ0eSB8IHVuZGVmaW5lZCA9IHNpdHVhdGlvbnNOYXZQcm9wcy5sZW5ndGggPj0gMSA/IHNpdHVhdGlvbnNOYXZQcm9wc1swXSA6IHVuZGVmaW5lZDtcblx0XHRcdGlmIChzaXR1YXRpb25zTmF2UHJvcCAmJiBmb3JtYXRPcHRpb25zKSB7XG5cdFx0XHRcdGZvcm1hdE9wdGlvbnMuaGFzU2l0dWF0aW9uc0luZGljYXRvciA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdGxldCBmaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnM6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiZcblx0XHRcdFx0ZGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkZpZWxkR3JvdXBUeXBlXG5cdFx0XHQpIHtcblx0XHRcdFx0ZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zID0gX2dldEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyhkYXRhRmllbGQpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaXNNdWx0aVZhbHVlID0gX2lzQ29sdW1uTXVsdGlWYWx1ZWQoZGF0YUZpZWxkLCB0YWJsZUNvbnZlcnRlckNvbnRleHQpO1xuXHRcdFx0aWYgKCFpc011bHRpVmFsdWUgJiYgX2lzRXhwb3J0YWJsZUNvbHVtbihkYXRhRmllbGQpKSB7XG5cdFx0XHRcdC8vZXhjbHVkZSB0aGUgdHlwZXMgbGlzdGVkIGFib3ZlIGZvciB0aGUgRXhwb3J0IChnZW5lcmF0ZXMgZXJyb3Igb24gRXhwb3J0IGFzIFBERilcblx0XHRcdFx0ZXhwb3J0U2V0dGluZ3MgPSBjcmVhdGVDb2x1bW5FeHBvcnRTZXR0aW5ncyhkYXRhRmllbGQsIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyk7XG5cdFx0XHR9XG5cdFx0XHRsZXQgcHJvcGVydHlUeXBlQ29uZmlnOiBQcm9wZXJ0eVR5cGVDb25maWcgfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoZGF0YVR5cGUpIHtcblx0XHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnID0gZ2V0VHlwZUNvbmZpZyhkYXRhRmllbGQsIGRhdGFUeXBlKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHR5cGVDb25maWc6IFByb3BlcnR5VHlwZUNvbmZpZyA9IHtcblx0XHRcdFx0Y2xhc3NOYW1lOiBkYXRhVHlwZSBhcyBrZXlvZiB0eXBlb2YgRGVmYXVsdFR5cGVGb3JFZG1UeXBlLFxuXHRcdFx0XHRmb3JtYXRPcHRpb25zOiB7XG5cdFx0XHRcdFx0Li4uZm9ybWF0T3B0aW9ucyxcblx0XHRcdFx0XHQuLi5wcm9wZXJ0eVR5cGVDb25maWc/LmZvcm1hdE9wdGlvbnNcblx0XHRcdFx0fSxcblx0XHRcdFx0Y29uc3RyYWludHM6IHByb3BlcnR5VHlwZUNvbmZpZz8uY29uc3RyYWludHNcblx0XHRcdH07XG5cdFx0XHRjb25zdCB2aXN1YWxTZXR0aW5nczogVmlzdWFsU2V0dGluZ3MgPSB7fTtcblx0XHRcdGlmICghZGF0YVR5cGUgfHwgIXR5cGVDb25maWcpIHtcblx0XHRcdFx0Ly8gZm9yIGNoYXJ0c1xuXHRcdFx0XHR2aXN1YWxTZXR0aW5ncy53aWR0aENhbGN1bGF0aW9uID0gbnVsbDtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHNvcnRhYmxlID1cblx0XHRcdFx0IWlzTXVsdGlWYWx1ZSAmJlxuXHRcdFx0XHRfaXNDb2x1bW5Tb3J0YWJsZShkYXRhRmllbGQsIHJlbGF0aXZlUGF0aCwgcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLm5vblNvcnRhYmxlUHJvcGVydGllcywgcmVsYXRlZFByb3BlcnRpZXNJbmZvKTtcblx0XHRcdGNvbnN0IGF2YWlsYWJpbGl0eSA9IGlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuKGRhdGFGaWVsZCkgPyBcIkhpZGRlblwiIDogXCJEZWZhdWx0XCI7XG5cdFx0XHRjb25zdCBjb2x1bW46IEFubm90YXRpb25UYWJsZUNvbHVtbiA9IHtcblx0XHRcdFx0a2V5OiBLZXlIZWxwZXIuZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkKGRhdGFGaWVsZCksXG5cdFx0XHRcdHR5cGU6IENvbHVtblR5cGUuQW5ub3RhdGlvbixcblx0XHRcdFx0bGFiZWw6IGxhYmVsID8/IG5hbWUsXG5cdFx0XHRcdGdyb3VwTGFiZWw6IGlzR3JvdXAgPyBnZXRMYWJlbChkYXRhRmllbGQpIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRncm91cDogaXNHcm91cCA/IGdyb3VwUGF0aCA6IHVuZGVmaW5lZCxcblx0XHRcdFx0RmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zOiBmaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMsXG5cdFx0XHRcdGFubm90YXRpb25QYXRoOiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgoZGF0YUZpZWxkLmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdHNlbWFudGljT2JqZWN0UGF0aDogc2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0YXZhaWxhYmlsaXR5OiBhdmFpbGFiaWxpdHksXG5cdFx0XHRcdG5hbWU6IG5hbWUsXG5cdFx0XHRcdHNob3dEYXRhRmllbGRzTGFiZWw6IHNob3dEYXRhRmllbGRzTGFiZWwsXG5cdFx0XHRcdHJlcXVpcmVkOiBpc1JlcXVpcmVkQ29sdW1uKGNvbnZlcnRlckNvbnRleHQsIGRhdGFGaWVsZCBhcyBEYXRhRmllbGRUeXBlcywgdGFibGVDcmVhdGlvbk1vZGUpLFxuXHRcdFx0XHRyZWxhdGl2ZVBhdGg6IHJlbGF0aXZlUGF0aCxcblx0XHRcdFx0c29ydGFibGU6IHNvcnRhYmxlLFxuXHRcdFx0XHRwcm9wZXJ0eUluZm9zOiByZWxhdGVkUHJvcGVydHlOYW1lcy5sZW5ndGggPyByZWxhdGVkUHJvcGVydHlOYW1lcyA6IHVuZGVmaW5lZCxcblx0XHRcdFx0YWRkaXRpb25hbFByb3BlcnR5SW5mb3M6IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzLmxlbmd0aCA+IDAgPyBhZGRpdGlvbmFsUHJvcGVydHlOYW1lcyA6IHVuZGVmaW5lZCxcblx0XHRcdFx0ZXhwb3J0U2V0dGluZ3M6IGV4cG9ydFNldHRpbmdzLFxuXHRcdFx0XHR3aWR0aDogKGRhdGFGaWVsZC5hbm5vdGF0aW9ucz8uSFRNTDU/LkNzc0RlZmF1bHRzPy53aWR0aD8udmFsdWVPZigpIGFzIHN0cmluZykgfHwgdW5kZWZpbmVkLFxuXHRcdFx0XHRpbXBvcnRhbmNlOiBnZXRJbXBvcnRhbmNlKGNvbnZlcnRlckNvbnRleHQsIGRhdGFGaWVsZCBhcyBEYXRhRmllbGRUeXBlcyksXG5cdFx0XHRcdGlzTmF2aWdhYmxlOiB0cnVlLFxuXHRcdFx0XHRmb3JtYXRPcHRpb25zOiBmb3JtYXRPcHRpb25zLFxuXHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUoY29udmVydGVyQ29udGV4dCksXG5cdFx0XHRcdHR5cGVDb25maWc6IHR5cGVDb25maWcsXG5cdFx0XHRcdHZpc3VhbFNldHRpbmdzOiB2aXN1YWxTZXR0aW5ncyBhcyBQcm9wZXJ0eUluZm9bXCJ2aXN1YWxTZXR0aW5nc1wiXSxcblx0XHRcdFx0dGltZXpvbmVUZXh0OiBleHBvcnRTZXR0aW5ncz8udGltZXpvbmUsXG5cdFx0XHRcdGlzUGFydE9mTGluZUl0ZW06IHRydWUsXG5cdFx0XHRcdGRhdGFUeXBlOiBkYXRhVHlwZSA/PyAoXCJFZG0uU3RyaW5nXCIgYXMga2V5b2YgdHlwZW9mIERlZmF1bHRUeXBlRm9yRWRtVHlwZSksXG5cdFx0XHRcdGlzTXVsdGlWYWx1ZVxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IHRvb2x0aXAgPSBfZ2V0VG9vbHRpcChkYXRhRmllbGQpID8/IGxhYmVsO1xuXHRcdFx0aWYgKHRvb2x0aXApIHtcblx0XHRcdFx0Y29sdW1uLnRvb2x0aXAgPSB0b29sdGlwO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRTZXR0aW5ncy5kYXRhUG9pbnRUYXJnZXRWYWx1ZSkge1xuXHRcdFx0XHRjb2x1bW4uZXhwb3J0RGF0YVBvaW50VGFyZ2V0VmFsdWUgPSByZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3MuZGF0YVBvaW50VGFyZ2V0VmFsdWU7XG5cdFx0XHR9XG5cdFx0XHRhbm5vdGF0aW9uQ29sdW1ucy5wdXNoKGNvbHVtbik7XG5cdFx0XHQvLyBDb2xsZWN0IGluZm9ybWF0aW9uIG9mIHJlbGF0ZWQgY29sdW1ucyB0byBiZSBjcmVhdGVkLlxuXHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZXMuZm9yRWFjaCgocmVsYXRlZFByb3BlcnR5TmFtZSkgPT4ge1xuXHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbcmVsYXRlZFByb3BlcnR5TmFtZV0gPSByZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1tyZWxhdGVkUHJvcGVydHlOYW1lXS5hbm5vdGF0aW9uUHJvcGVydHk7XG5cdFx0XHRcdC8vIEluIGNhc2Ugb2YgYSBtdWx0aS12YWx1ZSwgcmVsYXRlZCBwcm9wZXJ0aWVzIGNhbm5vdCBiZSBzb3J0ZWQgYXMgd2UgZ28gdGhyb3VnaCBhIDEtbiByZWxhdGlvblxuXHRcdFx0XHRpZiAoaXNNdWx0aVZhbHVlKSB7XG5cdFx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLm5vblNvcnRhYmxlUHJvcGVydGllcy5wdXNoKHJlbGF0ZWRQcm9wZXJ0eU5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFkZFByb3BlcnR5VG9EaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwKFxuXHRcdFx0XHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAsXG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXNJbmZvLFxuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVcblx0XHRcdFx0KTtcblx0XHRcdFx0Ly8gSW4gY2FzZSB0aGUgbGluZUl0ZW0gcG9pbnRzIHRvIGEgbmF2aWdhdGlvbiBwcm9wZXJ0eSB3aXRoIGEgdGV4dEFycmFuZ2VtZW50IFRleHRPbmx5LCB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgY29sdW1uIHdpdGggdGhlIHZhbHVlIG5hdmlnYXRpb24gcHJvcGVydHkuXG5cdFx0XHRcdC8vIFRoZSB0ZXh0IHByb3BlcnR5IGlzIHJlZmVyZW5jZWQgb24gdGhlIHJlbGF0ZWQgcHJvcGVydGllcyBvZiB0aGUgbGluZUl0ZW0sIHNvIHdpbGwgYmUgY3JlYXRlZCBvbiB0aGUgX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zIG1ldGhvZC5cblx0XHRcdFx0aWYgKHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzW3JlbGF0ZWRQcm9wZXJ0eU5hbWVdLmRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uID09PSBcIkRlc2NyaXB0aW9uXCIpIHtcblx0XHRcdFx0XHRjcmVhdGVQcm9wZXJ0eUFubm90YXRlZFRleHRPbmx5KFxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRcdHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHRcdFx0XHRcdGRhdGFGaWVsZCxcblx0XHRcdFx0XHRcdGNvbHVtbnNUb0JlQ3JlYXRlZCxcblx0XHRcdFx0XHRcdHJlbGF0aXZlUGF0aCxcblx0XHRcdFx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllc1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0Ly8gQ3JlYXRlIGNvbHVtbnMgZm9yIGFkZGl0aW9uYWwgcHJvcGVydGllcyBpZGVudGlmaWVkIGZvciBBTFAgdXNlIGNhc2UuXG5cdFx0XHRhZGRpdGlvbmFsUHJvcGVydHlOYW1lcy5mb3JFYWNoKChhZGRpdGlvbmFsUHJvcGVydHlOYW1lKSA9PiB7XG5cdFx0XHRcdC8vIEludGVudGlvbmFsIG92ZXJ3cml0ZSBhcyB3ZSByZXF1aXJlIG9ubHkgb25lIG5ldyBQcm9wZXJ0eUluZm8gZm9yIGEgcmVsYXRlZCBQcm9wZXJ0eS5cblx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW2FkZGl0aW9uYWxQcm9wZXJ0eU5hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmFkZGl0aW9uYWxQcm9wZXJ0aWVzW2FkZGl0aW9uYWxQcm9wZXJ0eU5hbWVdO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblx0Ly8gR2V0IGNvbHVtbnMgZnJvbSB0aGUgUHJvcGVydGllcyBvZiBFbnRpdHlUeXBlXG5cdHJldHVybiBnZXRDb2x1bW5zRnJvbUVudGl0eVR5cGUoXG5cdFx0Y29sdW1uc1RvQmVDcmVhdGVkLFxuXHRcdGVudGl0eVR5cGUsXG5cdFx0YW5ub3RhdGlvbkNvbHVtbnMsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHR0YWJsZVR5cGUsXG5cdFx0dGFibGVDcmVhdGlvbk1vZGUsXG5cdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCxcblx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXNcblx0KTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgcHJvcGVydHkgbmFtZXMgZnJvbSB0aGUgbWFuaWZlc3QgYW5kIGNoZWNrcyBhZ2FpbnN0IGV4aXN0aW5nIHByb3BlcnRpZXMgYWxyZWFkeSBhZGRlZCBieSBhbm5vdGF0aW9ucy5cbiAqIElmIGEgbm90IHlldCBzdG9yZWQgcHJvcGVydHkgaXMgZm91bmQgaXQgYWRkcyBpdCBmb3Igc29ydGluZyBhbmQgZmlsdGVyaW5nIG9ubHkgdG8gdGhlIGFubm90YXRpb25Db2x1bW5zLlxuICogQHBhcmFtIHByb3BlcnRpZXNcbiAqIEBwYXJhbSBhbm5vdGF0aW9uQ29sdW1uc1xuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBlbnRpdHlUeXBlXG4gKiBAcmV0dXJucyBUaGUgY29sdW1ucyBmcm9tIHRoZSBhbm5vdGF0aW9uc1xuICovXG5jb25zdCBfZ2V0UHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIChcblx0cHJvcGVydGllczogc3RyaW5nW10gfCBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdGFubm90YXRpb25Db2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlXG4pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG5cdGxldCBtYXRjaGVkUHJvcGVydGllczogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cdGlmIChBcnJheS5pc0FycmF5KHByb3BlcnRpZXMpKSB7XG5cdFx0bWF0Y2hlZFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLm1hcChmdW5jdGlvbiAocHJvcGVydHlQYXRoKSB7XG5cdFx0XHRjb25zdCBhbm5vdGF0aW9uQ29sdW1uID0gYW5ub3RhdGlvbkNvbHVtbnMuZmluZChmdW5jdGlvbiAoYW5ub3RhdGlvbkNvbHVtbikge1xuXHRcdFx0XHRyZXR1cm4gYW5ub3RhdGlvbkNvbHVtbi5yZWxhdGl2ZVBhdGggPT09IHByb3BlcnR5UGF0aCAmJiBhbm5vdGF0aW9uQ29sdW1uLnByb3BlcnR5SW5mb3MgPT09IHVuZGVmaW5lZDtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKGFubm90YXRpb25Db2x1bW4pIHtcblx0XHRcdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW4ubmFtZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHJlbGF0ZWRDb2x1bW5zID0gX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zKFxuXHRcdFx0XHRcdHsgW3Byb3BlcnR5UGF0aF06IGVudGl0eVR5cGUucmVzb2x2ZVBhdGgocHJvcGVydHlQYXRoKSB9LFxuXHRcdFx0XHRcdGFubm90YXRpb25Db2x1bW5zLFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0ZW50aXR5VHlwZSxcblx0XHRcdFx0XHR7fVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRhbm5vdGF0aW9uQ29sdW1ucy5wdXNoKHJlbGF0ZWRDb2x1bW5zWzBdKTtcblx0XHRcdFx0cmV0dXJuIHJlbGF0ZWRDb2x1bW5zWzBdLm5hbWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIG1hdGNoZWRQcm9wZXJ0aWVzO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBmaWVsZCBncm91cCBoYXMgdG8gYmUgZmxhZ2dlZCBhcyByZXF1aXJlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGZpZWxkR3JvdXAgVGhlIGZpZWxkR3JvdXAgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHVuZGVybHlpbmcgdGFibGVcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGZpZWxkR3JvdXAgaXMgcmVxdWlyZWQuXG4gKi9cbmNvbnN0IGlzUmVxdWlyZWRGaWVsZEdyb3VwID0gZnVuY3Rpb24gKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGZpZWxkR3JvdXA6IEZpZWxkR3JvdXAsXG5cdHRhYmxlQ3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGVcbik6IGJvb2xlYW4ge1xuXHRjb25zdCBmaWVsZEdyb3VwRGF0YSA9IGZpZWxkR3JvdXAuRGF0YTtcblx0cmV0dXJuIGZpZWxkR3JvdXBEYXRhLnNvbWUoZnVuY3Rpb24gKGl0ZW0pIHtcblx0XHQvLyB3ZSBleGNsdWRlIGJvb2xlYW4gdHlwZSwgdGhlIGVuZC11c2VyIG1heSB3YW50IHRvIGtlZXAgdGhlIHVuZGVybHlpbmcgY2hlY2sgYm94IGVtcHR5IG9uIHB1cnBvc2Vcblx0XHRpZiAoaXNEYXRhRmllbGQoaXRlbSkgJiYgaXRlbT8uVmFsdWU/LiR0YXJnZXQudHlwZSAhPT0gXCJFZG0uQm9vbGVhblwiKSB7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRpc1N0YXRpY2FsbHlNYW5kYXRvcnkoaXRlbSkgfHxcblx0XHRcdFx0KHRhYmxlQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzICYmXG5cdFx0XHRcdFx0aXNBbm5vdGF0ZWRSZXF1aXJlZFByb3BlcnR5KGl0ZW0uVmFsdWUuJHRhcmdldC5mdWxseVF1YWxpZmllZE5hbWUsIGNvbnZlcnRlckNvbnRleHQpKVxuXHRcdFx0KTtcblx0XHR9XG5cdH0pO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIGhhcyB0byBiZSBmbGFnZ2VkIGFzIHJlcXVpcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBUaGUgcHJvcGVydHkgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHVuZGVybHlpbmcgdGFibGVcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHJlcXVpcmVkLlxuICovXG5jb25zdCBpc1JlcXVpcmVkRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiA9IGZ1bmN0aW9uIChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRkYXRhRmllbGRGb3JBbm5vdGF0aW9uOiBEYXRhRmllbGRGb3JBbm5vdGF0aW9uLFxuXHR0YWJsZUNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlXG4pOiBib29sZWFuIHtcblx0Y29uc3QgZGF0YUZpZWxkVGFyZ2V0ID0gZGF0YUZpZWxkRm9yQW5ub3RhdGlvbi5UYXJnZXQuJHRhcmdldDtcblx0Y29uc3QgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbkZpZWxkQ29udHJvbE5vdE1hbmRhdG9yeSA9IGhhc0ZpZWxkQ29udHJvbE5vdE1hbmRhdG9yeShkYXRhRmllbGRGb3JBbm5vdGF0aW9uKTtcblx0Ly8gQ2hlY2sgaWYgdGhlIERhdGFGaWVsZEZvckFubm90YXRpb24gcG9pbnRzIHRvIGEgRmllbGRHcm91cFxuXHRpZiAoaGFzRmllbGRHcm91cFRhcmdldChkYXRhRmllbGRGb3JBbm5vdGF0aW9uKSkge1xuXHRcdGlmIChpc1JlcXVpcmVkRmllbGRHcm91cChjb252ZXJ0ZXJDb250ZXh0LCBkYXRhRmllbGRUYXJnZXQgYXMgRmllbGRHcm91cCwgdGFibGVDcmVhdGlvbk1vZGUpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0Y29uc3QgZmllbGRHcm91cERhdGEgPSAoZGF0YUZpZWxkVGFyZ2V0IGFzIEZpZWxkR3JvdXApLkRhdGE7XG5cdFx0cmV0dXJuIGZpZWxkR3JvdXBEYXRhLnNvbWUoKGlubmVyRGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKSA9PiB7XG5cdFx0XHRyZXR1cm4gaXNSZXF1aXJlZENvbHVtbihjb252ZXJ0ZXJDb250ZXh0LCBpbm5lckRhdGFGaWVsZCwgdGFibGVDcmVhdGlvbk1vZGUpO1xuXHRcdH0pO1xuXHR9XG5cdC8qSWYgdGhlIHVuZGVybHlpbmcgZGF0YXBvaW50IGlzIGEgcmF0aW5nIGluZGljYXRvciwgdGhlIGVuZC11c2VyIG1heSB3YW50IHRvIGtlZXAgdGhlIHJhdGluZyBlbXB0eSAodmFsdWUgMCkgb24gcHVycG9zZS5cblx0QmVzaWRlcywgY3VycmVudGx5LCBvbmx5IGEgZmllbGRDb250cm9sIHNldCBvbiBhIGRhdGFGaWVsZEZvckFubm90YXRpb24gcG9pbnRpbmcgdG8gYSBkYXRhUG9pbnQgaGFzIGFuIGluZmx1ZW5jZSBpbiB0aGUgdGFibGUuXG5cdEFjY29yZGluZ2x5LCBpZiBhIGRhdGFwb2ludCBjb21lcyBmcm9tIGEgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiB3aXRoIGEgZmllbGRDb250cm9sIHNldCBhcyBub3QgbWFuZGF0b3J5LCB0aGlzIGRhdGFQb2ludCBtdXN0IG5vdCBiZSBmbGFnZ2VkIGFzIFwicmVxdWlyZWRcIiovXG5cdGlmIChoYXNEYXRhUG9pbnRUYXJnZXQoZGF0YUZpZWxkRm9yQW5ub3RhdGlvbikgJiYgKGRhdGFGaWVsZFRhcmdldCBhcyBEYXRhUG9pbnQpLlZpc3VhbGl6YXRpb24gIT09IFwiVUkuVmlzdWFsaXphdGlvblR5cGUvUmF0aW5nXCIpIHtcblx0XHRpZiAoRGF0YUZpZWxkRm9yQW5ub3RhdGlvbkZpZWxkQ29udHJvbE5vdE1hbmRhdG9yeSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRpZiAoaXNTdGF0aWNhbGx5TWFuZGF0b3J5KGRhdGFGaWVsZEZvckFubm90YXRpb24pKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGlzUmVxdWlyZWREYXRhUG9pbnQoY29udmVydGVyQ29udGV4dCwgZGF0YUZpZWxkVGFyZ2V0IGFzIERhdGFQb2ludCwgdGFibGVDcmVhdGlvbk1vZGUpO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgcHJvcGVydHkgaGFzIHRvIGJlIGZsYWdnZWQgYXMgcmVxdWlyZWQuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHVuZGVybHlpbmcgdGFibGVcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHJlcXVpcmVkLlxuICovXG5jb25zdCBpc1JlcXVpcmVkUHJvcGVydHkgPSBmdW5jdGlvbiAoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0cHJvcGVydHk6IFByb3BlcnR5LFxuXHR0YWJsZUNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlXG4pOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHRwcm9wZXJ0eS50eXBlICE9PSBcIkVkbS5Cb29sZWFuXCIgJiZcblx0XHQhaXNSYXRpbmdWaXN1YWxpemF0aW9uRnJvbURhdGFGaWVsZERlZmF1bHQocHJvcGVydHkpICYmXG5cdFx0KGlzU3RhdGljYWxseU1hbmRhdG9yeShwcm9wZXJ0eSkgfHxcblx0XHRcdCh0YWJsZUNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93cyAmJlxuXHRcdFx0XHRpc0Fubm90YXRlZFJlcXVpcmVkUHJvcGVydHkocHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lLCBjb252ZXJ0ZXJDb250ZXh0KSkpXG5cdCk7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGRhdGFQb2ludCBoYXMgdG8gYmUgZmxhZ2dlZCBhcyByZXF1aXJlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGRhdGFQb2ludCBUaGUgZGF0YVBvaW50IGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB1bmRlcmx5aW5nIHRhYmxlXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBkYXRhUG9pbnQgaXMgcmVxdWlyZWQuXG4gKi9cbmNvbnN0IGlzUmVxdWlyZWREYXRhUG9pbnQgPSBmdW5jdGlvbiAoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZGF0YVBvaW50OiBEYXRhUG9pbnQsXG5cdHRhYmxlQ3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGVcbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gKFxuXHRcdGlzU3RhdGljYWxseU1hbmRhdG9yeShkYXRhUG9pbnQpIHx8XG5cdFx0KHRhYmxlQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzICYmXG5cdFx0XHRpc0Fubm90YXRlZFJlcXVpcmVkUHJvcGVydHkoZGF0YVBvaW50LlZhbHVlLiR0YXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lLCBjb252ZXJ0ZXJDb250ZXh0KSlcblx0KTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgdW5kZXJseWluZyBjb2x1bW4gaGFzIHRvIGJlIGZsYWdnZWQgYXMgcmVxdWlyZWQuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB0YWJsZUNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSBvZiB0aGUgdW5kZXJseWluZyB0YWJsZVxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlICdyZXF1aXJlZCcgcHJvcGVydHkgb2YgdGhlIHRhYmxlIGNvbHVtbi5cbiAqL1xuY29uc3QgaXNSZXF1aXJlZENvbHVtbiA9IGZ1bmN0aW9uIChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHR0YXJnZXQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBQcm9wZXJ0eSxcblx0dGFibGVDcmVhdGlvbk1vZGU/OiBDcmVhdGlvbk1vZGVcbik6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHtcblx0Y29uc3QgY3JlYXRpb25Nb2RlID0gdGFibGVDcmVhdGlvbk1vZGUgfHwgQ3JlYXRpb25Nb2RlLklubGluZTtcblx0aWYgKFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0IHx8XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZVxuXHQpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGlmIChpc1Byb3BlcnR5KHRhcmdldCkpIHtcblx0XHRyZXR1cm4gaXNSZXF1aXJlZFByb3BlcnR5KGNvbnZlcnRlckNvbnRleHQsIHRhcmdldCwgY3JlYXRpb25Nb2RlKSA/IGNvbXBpbGVFeHByZXNzaW9uKFVJLklzRWRpdGFibGUpIDogdW5kZWZpbmVkO1xuXHR9XG5cdC8vIENoZWNrIGlmIHRoZSBkYXRhRmllbGQgaXMgb2YgdHlwZSBEYXRhRmllbGRGb3JBbm5vdGF0aW9uXG5cdGlmIChpc0RhdGFGaWVsZEZvckFubm90YXRpb24odGFyZ2V0KSkge1xuXHRcdHJldHVybiBpc1JlcXVpcmVkRGF0YUZpZWxkRm9yQW5ub3RhdGlvbihjb252ZXJ0ZXJDb250ZXh0LCB0YXJnZXQsIGNyZWF0aW9uTW9kZSkgPyBjb21waWxlRXhwcmVzc2lvbihVSS5Jc0VkaXRhYmxlKSA6IHVuZGVmaW5lZDtcblx0fVxuXHQvL0lmIHRoZSB1bmRlcmx5aW5nIHByb3BlcnR5IGlzIGEgYm9vbGVhbiwgdGhlIGVuZC11c2VyIG1heSB3YW50IHRvIGtlZXAgdGhlIGNoZWNrIGJveCBlbXB0eSBvbiBwdXJwb3NlXG5cdGlmIChpc0RhdGFGaWVsZCh0YXJnZXQpICYmIHRhcmdldC5WYWx1ZT8uJHRhcmdldD8udHlwZSAhPT0gXCJFZG0uQm9vbGVhblwiKSB7XG5cdFx0cmV0dXJuIGlzU3RhdGljYWxseU1hbmRhdG9yeSh0YXJnZXQpIHx8XG5cdFx0XHQoY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzICYmXG5cdFx0XHRcdGlzQW5ub3RhdGVkUmVxdWlyZWRQcm9wZXJ0eSh0YXJnZXQuVmFsdWUuJHRhcmdldC5mdWxseVF1YWxpZmllZE5hbWUsIGNvbnZlcnRlckNvbnRleHQpKVxuXHRcdFx0PyBjb21waWxlRXhwcmVzc2lvbihVSS5Jc0VkaXRhYmxlKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IF9hcHBlbmRDdXN0b21UZW1wbGF0ZSA9IGZ1bmN0aW9uIChcblx0cHJvcGVydGllczogc3RyaW5nW10gfCB1bmRlZmluZWQsXG5cdGV4cG9ydFByb3BlcnRpZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAoQXJyYXkuaXNBcnJheShleHBvcnRQcm9wZXJ0aWVzKSkge1xuXHRcdHByb3BlcnRpZXMgPSBleHBvcnRQcm9wZXJ0aWVzO1xuXHR9XG5cdGlmIChwcm9wZXJ0aWVzKSB7XG5cdFx0cmV0dXJuIHByb3BlcnRpZXNcblx0XHRcdC5tYXAoKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRcdHJldHVybiBgeyR7cHJvcGVydGllcyEuaW5kZXhPZihwcm9wZXJ0eSl9fWA7XG5cdFx0XHR9KVxuXHRcdFx0LmpvaW4oYCR7XCJcXG5cIn1gKTtcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRhYmxlIGNvbHVtbiBkZWZpbml0aW9ucyBmcm9tIG1hbmlmZXN0LlxuICpcbiAqIFRoZXNlIG1heSBiZSBjdXN0b20gY29sdW1ucyBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdCwgc2xvdCBjb2x1bW5zIGNvbWluZyB0aHJvdWdoXG4gKiBhIGJ1aWxkaW5nIGJsb2NrLCBvciBhbm5vdGF0aW9uIGNvbHVtbnMgdG8gb3ZlcndyaXRlIGFubm90YXRpb24tYmFzZWQgY29sdW1ucy5cbiAqIEBwYXJhbSBjb2x1bW5zXG4gKiBAcGFyYW0gYW5ub3RhdGlvbkNvbHVtbnNcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gZW50aXR5VHlwZVxuICogQHJldHVybnMgVGhlIGNvbHVtbnMgZnJvbSB0aGUgbWFuaWZlc3RcbiAqL1xuY29uc3QgZ2V0Q29sdW1uc0Zyb21NYW5pZmVzdCA9IGZ1bmN0aW9uIChcblx0Y29sdW1uczogUmVjb3JkPHN0cmluZywgQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uIHwgQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uRm9yT3ZlcnJpZGU+LFxuXHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZVxuKTogUmVjb3JkPHN0cmluZywgTWFuaWZlc3RDb2x1bW4+IHtcblx0Y29uc3QgaW50ZXJuYWxDb2x1bW5zOiBSZWNvcmQ8c3RyaW5nLCBNYW5pZmVzdENvbHVtbj4gPSB7fTtcblx0ZnVuY3Rpb24gaXNDb2x1bW5PdmVycmlkZShcblx0XHRjb2x1bW46IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbiB8IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbkZvck92ZXJyaWRlLFxuXHRcdGtleTogc3RyaW5nXG5cdCk6IGNvbHVtbiBpcyBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW5Gb3JPdmVycmlkZSB7XG5cdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW5zLnNvbWUoKGFubm90YXRpb25Db2x1bW4pID0+IGFubm90YXRpb25Db2x1bW4ua2V5ID09PSBrZXkpO1xuXHR9XG5cdGZ1bmN0aW9uIGlzU2xvdENvbHVtbihtYW5pZmVzdENvbHVtbjogQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uKTogbWFuaWZlc3RDb2x1bW4gaXMgRnJhZ21lbnREZWZpbmVkU2xvdENvbHVtbiB7XG5cdFx0cmV0dXJuIG1hbmlmZXN0Q29sdW1uLnR5cGUgPT09IENvbHVtblR5cGUuU2xvdDtcblx0fVxuXHRmdW5jdGlvbiBpc0N1c3RvbUNvbHVtbihtYW5pZmVzdENvbHVtbjogQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uKTogbWFuaWZlc3RDb2x1bW4gaXMgTWFuaWZlc3REZWZpbmVkQ3VzdG9tQ29sdW1uIHtcblx0XHRyZXR1cm4gbWFuaWZlc3RDb2x1bW4udHlwZSA9PT0gdW5kZWZpbmVkICYmICEhbWFuaWZlc3RDb2x1bW4udGVtcGxhdGU7XG5cdH1cblx0ZnVuY3Rpb24gX3VwZGF0ZUxpbmtlZFByb3BlcnRpZXNPbkN1c3RvbUNvbHVtbnMocHJvcGVydHlJbmZvczogc3RyaW5nW10sIGFubm90YXRpb25UYWJsZUNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdKTogdm9pZCB7XG5cdFx0Y29uc3QgcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzID0gZ2V0UmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQpO1xuXHRcdHByb3BlcnR5SW5mb3MuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcblx0XHRcdGFubm90YXRpb25UYWJsZUNvbHVtbnMuZm9yRWFjaCgocHJvcCkgPT4ge1xuXHRcdFx0XHRpZiAocHJvcC5uYW1lID09PSBwcm9wZXJ0eSkge1xuXHRcdFx0XHRcdHByb3Auc29ydGFibGUgPSAhcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLm5vblNvcnRhYmxlUHJvcGVydGllcy5pbmNsdWRlcyhwcm9wZXJ0eS5yZXBsYWNlKFwiUHJvcGVydHk6OlwiLCBcIlwiKSk7XG5cdFx0XHRcdFx0cHJvcC5pc0dyb3VwYWJsZSA9IHByb3Auc29ydGFibGU7XG5cdFx0XHRcdFx0cHJvcC5maWx0ZXJhYmxlID0gIXJlc3RyaWN0aW9uc09uUHJvcGVydGllcy5ub25GaWx0ZXJhYmxlUHJvcGVydGllcy5pbmNsdWRlcyhwcm9wZXJ0eS5yZXBsYWNlKFwiUHJvcGVydHk6OlwiLCBcIlwiKSk7XG5cdFx0XHRcdFx0cHJvcC5pc1BhcnRPZkN1c3RvbUNvbHVtbiA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cdGZvciAoY29uc3Qga2V5IGluIGNvbHVtbnMpIHtcblx0XHRjb25zdCBtYW5pZmVzdENvbHVtbiA9IGNvbHVtbnNba2V5XTtcblx0XHRLZXlIZWxwZXIudmFsaWRhdGVLZXkoa2V5KTtcblx0XHQvLyBCYXNlVGFibGVDb2x1bW5cblx0XHRjb25zdCBiYXNlVGFibGVDb2x1bW4gPSB7XG5cdFx0XHRrZXk6IGtleSxcblx0XHRcdHdpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyOiBtYW5pZmVzdENvbHVtbi53aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlcixcblx0XHRcdHdpZHRoOiBtYW5pZmVzdENvbHVtbi53aWR0aCB8fCB1bmRlZmluZWQsXG5cdFx0XHRwb3NpdGlvbjoge1xuXHRcdFx0XHRhbmNob3I6IG1hbmlmZXN0Q29sdW1uLnBvc2l0aW9uPy5hbmNob3IsXG5cdFx0XHRcdHBsYWNlbWVudDogbWFuaWZlc3RDb2x1bW4ucG9zaXRpb24gPT09IHVuZGVmaW5lZCA/IFBsYWNlbWVudC5BZnRlciA6IG1hbmlmZXN0Q29sdW1uLnBvc2l0aW9uLnBsYWNlbWVudFxuXHRcdFx0fSxcblx0XHRcdGNhc2VTZW5zaXRpdmU6IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShjb252ZXJ0ZXJDb250ZXh0KVxuXHRcdH07XG5cdFx0aWYgKGlzQ29sdW1uT3ZlcnJpZGUobWFuaWZlc3RDb2x1bW4sIGtleSkpIHtcblx0XHRcdGNvbnN0IHByb3BlcnRpZXNUb092ZXJ3cml0ZUFubm90YXRpb25Db2x1bW46IEN1c3RvbUVsZW1lbnQ8QW5ub3RhdGlvblRhYmxlQ29sdW1uRm9yT3ZlcnJpZGU+ID0ge1xuXHRcdFx0XHQuLi5iYXNlVGFibGVDb2x1bW4sXG5cdFx0XHRcdGltcG9ydGFuY2U6IG1hbmlmZXN0Q29sdW1uPy5pbXBvcnRhbmNlLFxuXHRcdFx0XHRob3Jpem9udGFsQWxpZ246IG1hbmlmZXN0Q29sdW1uPy5ob3Jpem9udGFsQWxpZ24sXG5cdFx0XHRcdGF2YWlsYWJpbGl0eTogbWFuaWZlc3RDb2x1bW4/LmF2YWlsYWJpbGl0eSxcblx0XHRcdFx0dHlwZTogQ29sdW1uVHlwZS5Bbm5vdGF0aW9uLFxuXHRcdFx0XHRpc05hdmlnYWJsZTogdW5kZWZpbmVkLFxuXHRcdFx0XHRzZXR0aW5nczogbWFuaWZlc3RDb2x1bW4uc2V0dGluZ3MsXG5cdFx0XHRcdGZvcm1hdE9wdGlvbnM6IF9nZXREZWZhdWx0Rm9ybWF0T3B0aW9uc0ZvclRhYmxlKG1hbmlmZXN0Q29sdW1uLmZvcm1hdE9wdGlvbnMpLFxuXHRcdFx0XHRleHBvcnRTZXR0aW5nczogZ2V0Q3VzdG9tRXhwb3J0U2V0dGluZ3MoXG5cdFx0XHRcdFx0bWFuaWZlc3RDb2x1bW4/LmV4cG9ydFNldHRpbmdzLFxuXHRcdFx0XHRcdGFubm90YXRpb25Db2x1bW5zLFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0ZW50aXR5VHlwZSxcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0a2V5XG5cdFx0XHRcdClcblx0XHRcdH07XG5cdFx0XHRpbnRlcm5hbENvbHVtbnNba2V5XSA9IHByb3BlcnRpZXNUb092ZXJ3cml0ZUFubm90YXRpb25Db2x1bW47XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5SW5mb3M6IHN0cmluZ1tdIHwgdW5kZWZpbmVkID0gX2dldFByb3BlcnR5TmFtZXMoXG5cdFx0XHRcdG1hbmlmZXN0Q29sdW1uLnByb3BlcnRpZXMsXG5cdFx0XHRcdGFubm90YXRpb25Db2x1bW5zLFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRlbnRpdHlUeXBlXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgdG9vbHRpcFRleHQgPSBjb252ZXJ0ZXJDb250ZXh0LmZldGNoVGV4dEZyb21NZXRhTW9kZWwobWFuaWZlc3RDb2x1bW4udG9vbHRpcCksXG5cdFx0XHRcdGhlYWRlclRleHQgPSBjb252ZXJ0ZXJDb250ZXh0LmZldGNoVGV4dEZyb21NZXRhTW9kZWwobWFuaWZlc3RDb2x1bW4uaGVhZGVyKTtcblxuXHRcdFx0Y29uc3QgY3VzdG9tQ29sdW1uRXhwb3J0U2V0dGluZ3M6IENvbHVtbkV4cG9ydFNldHRpbmdzIHwgbnVsbCA9IHByb3BlcnR5SW5mb3Ncblx0XHRcdFx0PyBnZXRDdXN0b21FeHBvcnRTZXR0aW5ncyhtYW5pZmVzdENvbHVtbj8uZXhwb3J0U2V0dGluZ3MsIGFubm90YXRpb25Db2x1bW5zLCBjb252ZXJ0ZXJDb250ZXh0LCBlbnRpdHlUeXBlLCBwcm9wZXJ0eUluZm9zKVxuXHRcdFx0XHQ6IG51bGw7XG5cdFx0XHRjb25zdCBiYXNlTWFuaWZlc3RDb2x1bW4gPSB7XG5cdFx0XHRcdC4uLmJhc2VUYWJsZUNvbHVtbixcblx0XHRcdFx0aGVhZGVyOiBoZWFkZXJUZXh0LFxuXHRcdFx0XHRpbXBvcnRhbmNlOiBtYW5pZmVzdENvbHVtbj8uaW1wb3J0YW5jZSB8fCBJbXBvcnRhbmNlLk5vbmUsXG5cdFx0XHRcdGhvcml6b250YWxBbGlnbjogbWFuaWZlc3RDb2x1bW4/Lmhvcml6b250YWxBbGlnbiB8fCBIb3Jpem9udGFsQWxpZ24uQmVnaW4sXG5cdFx0XHRcdGF2YWlsYWJpbGl0eTogbWFuaWZlc3RDb2x1bW4/LmF2YWlsYWJpbGl0eSB8fCBcIkRlZmF1bHRcIixcblx0XHRcdFx0dGVtcGxhdGU6IG1hbmlmZXN0Q29sdW1uLnRlbXBsYXRlLFxuXHRcdFx0XHRwcm9wZXJ0eUluZm9zOiBwcm9wZXJ0eUluZm9zLFxuXHRcdFx0XHRleHBvcnRTZXR0aW5nczogY3VzdG9tQ29sdW1uRXhwb3J0U2V0dGluZ3MsXG5cdFx0XHRcdGlkOiBgQ3VzdG9tQ29sdW1uOjoke2tleX1gLFxuXHRcdFx0XHRuYW1lOiBgQ3VzdG9tQ29sdW1uOjoke2tleX1gLFxuXHRcdFx0XHQvL05lZWRlZCBmb3IgTURDOlxuXHRcdFx0XHRmb3JtYXRPcHRpb25zOiB7IHRleHRMaW5lc0VkaXQ6IDQgfSxcblx0XHRcdFx0aXNHcm91cGFibGU6IGZhbHNlLFxuXHRcdFx0XHRpc05hdmlnYWJsZTogZmFsc2UsXG5cdFx0XHRcdHNvcnRhYmxlOiBmYWxzZSxcblx0XHRcdFx0dmlzdWFsU2V0dGluZ3M6IHsgd2lkdGhDYWxjdWxhdGlvbjogbnVsbCB9LFxuXHRcdFx0XHR0b29sdGlwOiB0b29sdGlwVGV4dCA/IHRvb2x0aXBUZXh0IDogaGVhZGVyVGV4dCxcblx0XHRcdFx0cHJvcGVydGllczogbWFuaWZlc3RDb2x1bW4ucHJvcGVydGllcyxcblx0XHRcdFx0cmVxdWlyZWQ6XG5cdFx0XHRcdFx0bWFuaWZlc3RDb2x1bW4ucmVxdWlyZWQgJiZcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCAmJlxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5BbmFseXRpY2FsTGlzdFBhZ2Vcblx0XHRcdFx0XHRcdD8gY29tcGlsZUV4cHJlc3Npb24oVUkuSXNFZGl0YWJsZSlcblx0XHRcdFx0XHRcdDogdW5kZWZpbmVkXG5cdFx0XHR9O1xuXHRcdFx0aWYgKHByb3BlcnR5SW5mb3MpIHtcblx0XHRcdFx0X3VwZGF0ZUxpbmtlZFByb3BlcnRpZXNPbkN1c3RvbUNvbHVtbnMocHJvcGVydHlJbmZvcywgYW5ub3RhdGlvbkNvbHVtbnMpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGlzU2xvdENvbHVtbihtYW5pZmVzdENvbHVtbikpIHtcblx0XHRcdFx0Y29uc3QgY3VzdG9tVGFibGVDb2x1bW46IEN1c3RvbUVsZW1lbnQ8Q3VzdG9tQmFzZWRUYWJsZUNvbHVtbj4gPSB7XG5cdFx0XHRcdFx0Li4uYmFzZU1hbmlmZXN0Q29sdW1uLFxuXHRcdFx0XHRcdHR5cGU6IENvbHVtblR5cGUuU2xvdFxuXHRcdFx0XHR9O1xuXHRcdFx0XHRpbnRlcm5hbENvbHVtbnNba2V5XSA9IGN1c3RvbVRhYmxlQ29sdW1uO1xuXHRcdFx0fSBlbHNlIGlmIChpc0N1c3RvbUNvbHVtbihtYW5pZmVzdENvbHVtbikpIHtcblx0XHRcdFx0Y29uc3QgY3VzdG9tVGFibGVDb2x1bW46IEN1c3RvbUVsZW1lbnQ8Q3VzdG9tQmFzZWRUYWJsZUNvbHVtbj4gPSB7XG5cdFx0XHRcdFx0Li4uYmFzZU1hbmlmZXN0Q29sdW1uLFxuXHRcdFx0XHRcdHR5cGU6IENvbHVtblR5cGUuRGVmYXVsdFxuXHRcdFx0XHR9O1xuXHRcdFx0XHRpbnRlcm5hbENvbHVtbnNba2V5XSA9IGN1c3RvbVRhYmxlQ29sdW1uO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgbWVzc2FnZSA9IGBUaGUgYW5ub3RhdGlvbiBjb2x1bW4gJyR7a2V5fScgcmVmZXJlbmNlZCBpbiB0aGUgbWFuaWZlc3QgaXMgbm90IGZvdW5kYDtcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHRcdC5nZXREaWFnbm9zdGljcygpXG5cdFx0XHRcdFx0LmFkZElzc3VlKFxuXHRcdFx0XHRcdFx0SXNzdWVDYXRlZ29yeS5NYW5pZmVzdCxcblx0XHRcdFx0XHRcdElzc3VlU2V2ZXJpdHkuTG93LFxuXHRcdFx0XHRcdFx0bWVzc2FnZSxcblx0XHRcdFx0XHRcdElzc3VlQ2F0ZWdvcnlUeXBlLFxuXHRcdFx0XHRcdFx0SXNzdWVDYXRlZ29yeVR5cGU/LkFubm90YXRpb25Db2x1bW5zPy5JbnZhbGlkS2V5XG5cdFx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIGludGVybmFsQ29sdW1ucztcbn07XG5cbi8qKlxuICogQWRkcyBjb21wdXRlZCBjb2x1bW5zIHN1Y2ggYXMgdGhlIGRyYWZ0IHN0YXR1cyBhbmQgc2l0dWF0aW9ucyBzdGF0dXMuXG4gKiBAcGFyYW0gdGFibGVDb2x1bW5zIFRoZSB0YWJsZSBjb2x1bW5zIGNvbGxlY3RlZCBzbyBmYXJcbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGhlIHRhYmxlIHR5cGVcbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBlbnJpY2hlZCBzZXQgb2YgdGFibGUgY29sdW1uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkQ29tcHV0ZWRDb2x1bW5zKFxuXHR0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IFRhYmxlQ29sdW1uW10ge1xuXHRpZiAoIVtcIkdyaWRUYWJsZVwiLCBcIlRyZWVUYWJsZVwiLCBcIkFuYWx5dGljYWxUYWJsZVwiXS5pbmNsdWRlcyh0YWJsZVR5cGUpKSB7XG5cdFx0Ly8gQ29tcHV0ZWQgY29sdW1ucyBhcmUgbm90IHVzZWQgaW4gUmVzcG9uc2l2ZSB0YWJsZXNcblx0XHRyZXR1cm4gdGFibGVDb2x1bW5zO1xuXHR9XG5cblx0Ly8gSW4gY2FzZSBhIGdyaWQgdGFibGUgb3IgdHJlZSB0YWJsZSBpcyB1c2VkLCB3ZSBkaXNwbGF5IHRoZSBzaXR1YXRpb25zIGluZGljYXRvciBpbiBhIHNlcGFyYXRlIGNvbHVtblxuXHQvLyBzbyB3ZSBoYXZlIHRvIGRpc2FibGUgaXQgaGVyZSB0byBlbnN1cmUsIHRoYXQgdGhlIGZpZWxkIGJ1aWxkaW5nIGJsb2NrXG5cdC8vIGRvZXMgbm90IHJlbmRlciBpdCBpbnRvIHRoZSBJRCBjb2x1bW5cblx0Y29uc3QgY29sdW1uV2l0aFNpdHVhdGlvbnNJbmRpY2F0b3I6IFRhYmxlQ29sdW1uIHwgdW5kZWZpbmVkID0gdGFibGVDb2x1bW5zLmZpbmQoXG5cdFx0KGNvbHVtbikgPT4gY29sdW1uLmZvcm1hdE9wdGlvbnM/Lmhhc1NpdHVhdGlvbnNJbmRpY2F0b3IgIT09IHVuZGVmaW5lZCAmJiBjb2x1bW4uZm9ybWF0T3B0aW9ucz8uaGFzU2l0dWF0aW9uc0luZGljYXRvciA9PT0gdHJ1ZVxuXHQpO1xuXHRpZiAoY29sdW1uV2l0aFNpdHVhdGlvbnNJbmRpY2F0b3I/LmZvcm1hdE9wdGlvbnMpIHtcblx0XHQvLyBTd2l0Y2ggb2ZmIHRoZSBzaXR1YXRpb25zIGluZGljYXRvciBpbiB0aGUgZm91bmQgY29sdW1uXG5cdFx0Y29sdW1uV2l0aFNpdHVhdGlvbnNJbmRpY2F0b3IuZm9ybWF0T3B0aW9ucy5oYXNTaXR1YXRpb25zSW5kaWNhdG9yID0gZmFsc2U7XG5cblx0XHQvLyBJbnNlcnQgYSBzZXBhcmF0ZSBzaXR1YXRpb25zIGluZGljYXRvciBjb2x1bW5cblx0XHRjb25zdCBzaXR1YXRpb25zSW5kaWNhdG9yQ29sdW1uOiBDb21wdXRlZFRhYmxlQ29sdW1uID0ge1xuXHRcdFx0a2V5OiBcInNpdHVhdGlvbnNJbmRpY2F0b3JcIixcblx0XHRcdG5hbWU6IFwic2l0dWF0aW9uc0luZGljYXRvclwiLFxuXHRcdFx0cHJvcGVydHlLZXk6IGNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yLm5hbWUsXG5cdFx0XHRpc1NpdHVhdGlvbnNJbmRpY2F0b3I6IHRydWUsXG5cdFx0XHRhdmFpbGFiaWxpdHk6IFwiRGVmYXVsdFwiLFxuXHRcdFx0bGFiZWw6IFwie3NhcC5mZS5pMThuPkNfU0lUVUFUSU9OU19TVEFUVVNfQ09MVU1OX0xBQkVMX1RPT0xUSVB9XCIsXG5cdFx0XHR0b29sdGlwOiBcIntzYXAuZmUuaTE4bj5DX1NJVFVBVElPTlNfU1RBVFVTX0NPTFVNTl9MQUJFTF9UT09MVElQfVwiLFxuXHRcdFx0dHlwZTogQ29sdW1uVHlwZS5Db21wdXRlZCxcblx0XHRcdGZvcm1hdE9wdGlvbnM6IG51bGwsXG5cdFx0XHRleHBvcnRTZXR0aW5nczogbnVsbCxcblx0XHRcdGNsaXBib2FyZFNldHRpbmdzOiBudWxsLFxuXHRcdFx0cHJvcGVydHlJbmZvczogdW5kZWZpbmVkLFxuXHRcdFx0Y2FzZVNlbnNpdGl2ZTogZmFsc2Vcblx0XHR9O1xuXG5cdFx0Ly8gUGxhY2UgdGhlIGRyYWZ0IHN0YXR1cyBjb2x1bW4gYWZ0ZXIgdGhlIGZpcnN0IHZpc2libGUgY29sdW1uXG5cdFx0Y29uc3QgaW5kZXhPZkZpcnN0VmlzaWJsZUNvbHVtbjogaW50ID0gdGFibGVDb2x1bW5zLmZpbmRJbmRleCgoY29sdW1uKSA9PiBjb2x1bW4uYXZhaWxhYmlsaXR5ICE9PSBcIkhpZGRlblwiKTtcblx0XHR0YWJsZUNvbHVtbnMuc3BsaWNlKGluZGV4T2ZGaXJzdFZpc2libGVDb2x1bW4gKyAxLCAwLCBzaXR1YXRpb25zSW5kaWNhdG9yQ29sdW1uKTtcblx0fVxuXG5cdC8vIEluIGNhc2UgYSBncmlkIHRhYmxlIG9yIHRyZWUgdGFibGUgaXMgdXNlZCwgd2UgZGlzcGxheSB0aGUgZHJhZnQgaW5kaWNhdG9yIGluIGEgc2VwYXJhdGUgY29sdW1uXG5cdC8vIHNvIHdlIGhhdmUgdG8gZGlzYWJsZSBpdCBoZXJlIHRvIGVuc3VyZSwgdGhhdCB0aGUgZmllbGQgYnVpbGRpbmcgYmxvY2tcblx0Ly8gZG9lcyBub3QgcmVuZGVyIGl0IGludG8gdGhlIElEIGNvbHVtblxuXHQvLyBUaGUgYWRkaXRpb25hbCBjb2x1bW4gaXMgb25seSBhZGRlZCBmb3IgdGFibGVzIG9uIGEgTFIgYW5kIGluIGNhc2UgdGVoZSBlbnRpdHkgaXMgZHJhZnQgZW5hYmxlZCFcblx0Y29uc3QgY29sdW1uc1dpdGhEcmFmdEluZGljYXRvcjogVGFibGVDb2x1bW5bXSA9IHRhYmxlQ29sdW1ucy5maWx0ZXIoKGNvbHVtbikgPT4gY29sdW1uLmZvcm1hdE9wdGlvbnM/Lmhhc0RyYWZ0SW5kaWNhdG9yID09PSB0cnVlKTtcblx0aWYgKFxuXHRcdGNvbHVtbnNXaXRoRHJhZnRJbmRpY2F0b3IubGVuZ3RoICYmXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQgJiZcblx0XHQoTW9kZWxIZWxwZXIuaXNEcmFmdE5vZGUoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKSkgfHwgTW9kZWxIZWxwZXIuaXNEcmFmdFJvb3QoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKSkpXG5cdCkge1xuXHRcdC8vIFN3aXRjaCBvZmYgdGhlIGRyYWZ0IGluZGljYXRvciBpbiB0aGUgZm91bmQgY29sdW1uXG5cdFx0Y29sdW1uc1dpdGhEcmFmdEluZGljYXRvci5mb3JFYWNoKChjb2x1bW5XaXRoRHJhZnRJbmRpY2F0b3I6IFRhYmxlQ29sdW1uKSA9PiB7XG5cdFx0XHRpZiAoY29sdW1uV2l0aERyYWZ0SW5kaWNhdG9yPy5mb3JtYXRPcHRpb25zKSB7XG5cdFx0XHRcdGNvbHVtbldpdGhEcmFmdEluZGljYXRvci5mb3JtYXRPcHRpb25zLmhhc0RyYWZ0SW5kaWNhdG9yID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBJbnNlcnQgYSBzZXBhcmF0ZSBkcmFmdCBpbmRpY2F0b3IgY29sdW1uXG5cdFx0Y29uc3QgZHJhZnRJbmRpY2F0b3JDb2x1bW46IENvbXB1dGVkVGFibGVDb2x1bW4gPSB7XG5cdFx0XHRrZXk6IFwiZHJhZnRTdGF0dXNcIixcblx0XHRcdG5hbWU6IFwiZHJhZnRTdGF0dXNcIixcblx0XHRcdHByb3BlcnR5S2V5OiBjb2x1bW5zV2l0aERyYWZ0SW5kaWNhdG9yWzBdLm5hbWUsXG5cdFx0XHRpc0RyYWZ0SW5kaWNhdG9yOiB0cnVlLFxuXHRcdFx0YXZhaWxhYmlsaXR5OiBcIkRlZmF1bHRcIixcblx0XHRcdGxhYmVsOiBcIntzYXAuZmUuaTE4bj5DX0RSQUZUX1NUQVRVU19DT0xVTU5fTEFCRUxfVE9PTFRJUH1cIixcblx0XHRcdHRvb2x0aXA6IFwie3NhcC5mZS5pMThuPkNfRFJBRlRfU1RBVFVTX0NPTFVNTl9MQUJFTF9UT09MVElQfVwiLFxuXHRcdFx0dHlwZTogQ29sdW1uVHlwZS5Db21wdXRlZCxcblx0XHRcdGZvcm1hdE9wdGlvbnM6IG51bGwsXG5cdFx0XHRleHBvcnRTZXR0aW5nczogbnVsbCxcblx0XHRcdGNhc2VTZW5zaXRpdmU6IGZhbHNlLFxuXHRcdFx0Y2xpcGJvYXJkU2V0dGluZ3M6IG51bGxcblx0XHR9O1xuXHRcdGxldCBjb2x1bW5JbmRleFRvSW5zZXJ0QWZ0ZXI6IGludCA9IDA7XG5cdFx0aWYgKGNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yKSB7XG5cdFx0XHQvLyBJZiB0aGVyZSdzIGEgc2l0dWF0aW9ucyBpbmRpY2F0b3IgY29sdW1uLCBwbGFjZSB0aGUgZHJhZnQgc3RhdHVzIGNvbHVtbiBiZWZvcmUgaXRcblx0XHRcdGNvbHVtbkluZGV4VG9JbnNlcnRBZnRlciA9XG5cdFx0XHRcdHRhYmxlQ29sdW1ucy5maW5kSW5kZXgoKGNvbHVtbikgPT4gKGNvbHVtbiBhcyBDb21wdXRlZFRhYmxlQ29sdW1uKS5pc1NpdHVhdGlvbnNJbmRpY2F0b3IgPT09IHRydWUpIC0gMTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gT3RoZXJ3aXNlIHBsYWNlIHRoZSBkcmFmdCBzdGF0dXMgY29sdW1uIGFmdGVyIHRoZSBmaXJzdCB2aXNpYmxlIGNvbHVtblxuXHRcdFx0Y29sdW1uSW5kZXhUb0luc2VydEFmdGVyID0gdGFibGVDb2x1bW5zLmZpbmRJbmRleCgoY29sdW1uKSA9PiBjb2x1bW4uYXZhaWxhYmlsaXR5ICE9PSBcIkhpZGRlblwiKTtcblx0XHR9XG5cdFx0dGFibGVDb2x1bW5zLnNwbGljZShjb2x1bW5JbmRleFRvSW5zZXJ0QWZ0ZXIgKyAxLCAwLCBkcmFmdEluZGljYXRvckNvbHVtbik7XG5cdH1cblxuXHRyZXR1cm4gdGFibGVDb2x1bW5zO1xufVxuXG4vKipcbiAqIFByb3ZpZGVzIHRoZSByZXF1aXJlZCBwcm9wZXJ0aWVzIHNldCBvbiB0aGUgYW5ub3RhdGlvbnMuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCAgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgVGhlIHBhdGhzIG9mIHRoZSByZXN0cmljdGVkIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlcXVpcmVkUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBQcm9wZXJ0eVBhdGhbXSB7XG5cdHJldHVybiBnZXRDb250ZXh0UHJvcGVydHlSZXN0cmljdGlvbihcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSxcblx0XHQoY2FwYWJpbGl0aWVzKSA9PiB7XG5cdFx0XHRyZXR1cm4gKGNhcGFiaWxpdGllcyBhcyBFbnRpdHlTZXRBbm5vdGF0aW9uc19DYXBhYmlsaXRpZXMgfCB1bmRlZmluZWQpPy5JbnNlcnRSZXN0cmljdGlvbnM/LlJlcXVpcmVkUHJvcGVydGllcztcblx0XHR9LFxuXHRcdGZhbHNlXG5cdCk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgcHJvcGVydHkgaXMgYW5ub3RhdGVkIGFzIGEgcmVxdWlyZWQgcHJvcGVydHkuXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHlcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHJlcXVpcmVkXG4gKi9cbmZ1bmN0aW9uIGlzQW5ub3RhdGVkUmVxdWlyZWRQcm9wZXJ0eShuYW1lOiBzdHJpbmcsIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQpXG5cdFx0Lm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5LiR0YXJnZXQ/LmZ1bGx5UXVhbGlmaWVkTmFtZSlcblx0XHQuaW5jbHVkZXMobmFtZSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZGF0YSB0eXBlIG9mIGEgY29sdW1uIGZvciB0aGUgZXhwb3J0LlxuICogQHBhcmFtIGRhdGFUeXBlIFRoZSBkYXRhIHR5cGUgb2YgYSBwcm9wZXJ0eSwgY29sdW1uXG4gKiBAcGFyYW0gaXNBVGltZXpvbmUgSXMgdGhlIGdpdmVuIHByb3BlcnR5IGEgdGltZXpvbmVcbiAqIEBwYXJhbSBpc0N1cnJlbmN5IElzIHRoZSBnaXZlbiBwcm9wZXJ0eSBhIGN1cnJlbmN5XG4gKiBAcGFyYW0gZXhwb3J0U2V0dGluZ3MgVGhlIGFscmVhZHkgZGV0ZWN0ZWQgZXhwb3J0IHNldHRpbmdzIGZyb20gZGF0YWZpZWxkc1xuICogQHJldHVybnMgVGhlIHN1cHBvcnRlZCBleHBvcnQgdHlwZVxuICovXG5mdW5jdGlvbiBnZXRFeHBvcnREYXRhVHlwZShcblx0ZGF0YVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0aXNBVGltZXpvbmUgPSBmYWxzZSxcblx0aXNDdXJyZW5jeSA9IGZhbHNlLFxuXHRleHBvcnRTZXR0aW5ncz86IENvbHVtbkV4cG9ydFNldHRpbmdzXG4pOiBzdHJpbmcge1xuXHRsZXQgZXhwb3J0RGF0YVR5cGUgPSBcIlN0cmluZ1wiO1xuXHRpZiAoIWRhdGFUeXBlIHx8IGV4cG9ydFNldHRpbmdzPy5kYXRhUG9pbnRUYXJnZXRWYWx1ZSkge1xuXHRcdHJldHVybiBleHBvcnREYXRhVHlwZTtcblx0fVxuXHRpZiAoZXhwb3J0U2V0dGluZ3M/LmlzQ3VycmVuY3kgfHwgaXNDdXJyZW5jeSkge1xuXHRcdHJldHVybiBcIkN1cnJlbmN5XCI7XG5cdH1cblx0aWYgKGlzQVRpbWV6b25lKSB7XG5cdFx0cmV0dXJuIFwiVGltZXpvbmVcIjtcblx0fVxuXHRpZiAoZXhwb3J0U2V0dGluZ3M/LndyYXApIHtcblx0XHRyZXR1cm4gZXhwb3J0RGF0YVR5cGU7XG5cdH1cblx0c3dpdGNoIChkYXRhVHlwZSkge1xuXHRcdGNhc2UgXCJFZG0uRGVjaW1hbFwiOlxuXHRcdGNhc2UgXCJFZG0uSW50MzJcIjpcblx0XHRjYXNlIFwiRWRtLkludDY0XCI6XG5cdFx0Y2FzZSBcIkVkbS5Eb3VibGVcIjpcblx0XHRjYXNlIFwiRWRtLkJ5dGVcIjpcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJOdW1iZXJcIjtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJFZG0uRGF0ZU9mVGltZVwiOlxuXHRcdGNhc2UgXCJFZG0uRGF0ZVwiOlxuXHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIkRhdGVcIjtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJFZG0uRGF0ZVRpbWVPZmZzZXRcIjpcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJEYXRlVGltZVwiO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkVkbS5UaW1lT2ZEYXlcIjpcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJUaW1lXCI7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiRWRtLkJvb2xlYW5cIjpcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJCb29sZWFuXCI7XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIlN0cmluZ1wiO1xuXHR9XG5cdHJldHVybiBleHBvcnREYXRhVHlwZTtcbn1cblxuLyoqXG4gKiBBZGRzIHRoZSB0b29sdGlwIGNvbmZpZ3VyYXRpb24gZm9yIGEgZ2l2ZW4gY29sdW1uLlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSByZWZlcmVuY2VkIG9uIHRoZSBjb2x1bW5cbiAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiB0byBiZSB1cGRhdGVkXG4gKi9cbmZ1bmN0aW9uIF9hZGRUb29sVGlwKHByb3BlcnR5OiBQcm9wZXJ0eSwgY29sdW1uOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4pOiB2b2lkIHtcblx0Y29uc3QgdG9vbHRpcCA9IF9nZXRUb29sdGlwKHByb3BlcnR5KSA/PyBjb2x1bW4ubGFiZWw7XG5cdGlmICh0b29sdGlwKSB7XG5cdFx0Y29sdW1uLnRvb2x0aXAgPSB0b29sdGlwO1xuXHR9XG59XG5cbmZ1bmN0aW9uIF9nZXRDb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHMoXG5cdHJlbGF0aXZlUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgbmF2aWdhdGlvblByb3BlcnRpZXMgPSBlbmhhbmNlRGF0YU1vZGVsUGF0aChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSwgcmVsYXRpdmVQYXRoKS5uYXZpZ2F0aW9uUHJvcGVydGllcztcblx0aWYgKG5hdmlnYXRpb25Qcm9wZXJ0aWVzPy5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgY29sbGVjdGVkTmF2aWdhdGlvblByb3BlcnR5TGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZvckVhY2goKG5hdlByb3BlcnR5KSA9PiB7XG5cdFx0XHRjb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHMucHVzaChnZXRMYWJlbChuYXZQcm9wZXJ0eSkgfHwgbmF2UHJvcGVydHkubmFtZSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGNvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscztcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBwcm9wZXJ0eSB1c2luZyB0aGUgdGV4dCBhcnJhbmdlbWVudCBhbm5vdGF0aW9uIHNldCB0byB0ZXh0IG9ubHkuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHQuXG4gKiBAcGFyYW0gcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIFRoZSBjb3JyZXNwb25kaW5nIERhdGFNb2RlbE9iamVjdFBhdGguXG4gKiBAcGFyYW0gbGluZUl0ZW0gVGhlIGNvbHVtbiB0byBiZSBldmFsdWF0ZWQuXG4gKiBAcGFyYW0gY29sdW1uc1RvQmVDcmVhdGVkIFRoZSBsaXN0IG9mIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cbiAqIEBwYXJhbSByZWxhdGl2ZVBhdGggVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHRhcmdldCBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgY29udGV4dC5cbiAqIEBwYXJhbSByZXN0cmljdGlvbnNPblByb3BlcnRpZXMgVGhlIGV4aXN0aW5nIHJlc3RyaWN0aW9ucyBvbiBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVByb3BlcnR5QW5ub3RhdGVkVGV4dE9ubHkoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0cHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPERhdGFGaWVsZEFic3RyYWN0VHlwZXM+LFxuXHRsaW5lSXRlbTogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4sXG5cdHJlbGF0aXZlUGF0aDogc3RyaW5nLFxuXHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM6IFJlc3RyaWN0aW9uc09uUHJvcGVydGllc1xuKTogdm9pZCB7XG5cdGNvbnN0IGlzUHJvcGVydHlOYXZpZ2F0ZWQgPVxuXHRcdHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGggIT09IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aDtcblx0aWYgKGlzUHJvcGVydHlOYXZpZ2F0ZWQgJiYgaXNEYXRhRmllbGQobGluZUl0ZW0pKSB7XG5cdFx0Y29sdW1uc1RvQmVDcmVhdGVkW3JlbGF0aXZlUGF0aF0gPSBsaW5lSXRlbS5WYWx1ZS4kdGFyZ2V0O1xuXHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcy5ub25Tb3J0YWJsZVByb3BlcnRpZXMucHVzaChyZWxhdGl2ZVBhdGgpO1xuXHR9IGVsc2UgaWYgKGlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvbihsaW5lSXRlbSkgJiYgaGFzRmllbGRHcm91cFRhcmdldChsaW5lSXRlbSkpIHtcblx0XHQobGluZUl0ZW0uVGFyZ2V0LiR0YXJnZXQgYXMgRmllbGRHcm91cCkuRGF0YS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuXHRcdFx0aWYgKGlzRGF0YUZpZWxkKGZpZWxkKSAmJiBnZXREaXNwbGF5TW9kZShmaWVsZC5WYWx1ZS4kdGFyZ2V0LCBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZSkgPT09IFwiRGVzY3JpcHRpb25cIikge1xuXHRcdFx0XHRjb25zdCBpbmhlcmVkUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGgoXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksXG5cdFx0XHRcdFx0ZmllbGQuVmFsdWUucGF0aFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBpc0luaGVyZWRQcm9wZXJ0eU5hdmlnYXRlZCA9XG5cdFx0XHRcdFx0aW5oZXJlZFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGggIT09XG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkubmF2aWdhdGlvblByb3BlcnRpZXMubGVuZ3RoO1xuXHRcdFx0XHRpZiAoaXNJbmhlcmVkUHJvcGVydHlOYXZpZ2F0ZWQpIHtcblx0XHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbZmllbGQuVmFsdWUucGF0aF0gPSBmaWVsZC5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcy5ub25Tb3J0YWJsZVByb3BlcnRpZXMucHVzaChmaWVsZC5WYWx1ZS5wYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBwcm9wZXJ0eSB0eXBlIGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gdGhlIHByb3ZpZGVkIHByb3BlcnR5IG9yIGRhdGEgdHlwZS5cbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgb3IgZGF0YSBmaWVsZCB0byBkZXRlcm1pbmUgdGhlIHR5cGUgY29uZmlndXJhdGlvbiBmb3IuXG4gKiBAcGFyYW0gZGF0YVR5cGUgVGhlIGRhdGEgdHlwZSB0byB1c2UgZm9yIHR5cGUgY29uZmlndXJhdGlvbiBpZiBub3QgZGV0ZXJtaW5lZCBmcm9tIHRoZSBwcm9wZXJ0eS5cbiAqIEByZXR1cm5zIFRoZSBwcm9wZXJ0eSB0eXBlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZUNvbmZpZyhwcm9wZXJ0eTogUHJvcGVydHkgfCBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgdW5kZWZpbmVkLCBkYXRhVHlwZT86IHN0cmluZyk6IFByb3BlcnR5VHlwZUNvbmZpZyB7XG5cdGxldCB0YXJnZXRNYXBwaW5nLFxuXHRcdGZvcm1hdE9wdGlvbnM6IFByb3BlcnR5VHlwZUZvcm1hdE9wdGlvbnMgfCB1bmRlZmluZWQgPSB7fTtcblx0aWYgKGlzUHJvcGVydHkocHJvcGVydHkpKSB7XG5cdFx0dGFyZ2V0TWFwcGluZyA9IGlzVHlwZURlZmluaXRpb24ocHJvcGVydHkudGFyZ2V0VHlwZSlcblx0XHRcdD8gRURNX1RZUEVfTUFQUElOR1twcm9wZXJ0eS50YXJnZXRUeXBlLnVuZGVybHlpbmdUeXBlXVxuXHRcdFx0OiBFRE1fVFlQRV9NQVBQSU5HW3Byb3BlcnR5LnR5cGVdO1xuXHR9XG5cdGlmICghdGFyZ2V0TWFwcGluZyAmJiBkYXRhVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dGFyZ2V0TWFwcGluZyA9IEVETV9UWVBFX01BUFBJTkdbZGF0YVR5cGVdO1xuXHR9XG5cdGNvbnN0IHByb3BlcnR5VHlwZUNvbmZpZzogUHJvcGVydHlUeXBlQ29uZmlnID0ge1xuXHRcdHR5cGU6IHRhcmdldE1hcHBpbmc/LnR5cGVcblx0fTtcblx0aWYgKHRhcmdldE1hcHBpbmcgJiYgaXNQcm9wZXJ0eShwcm9wZXJ0eSkpIHtcblx0XHRjb25zdCBjb25zdHJhaW50cyA9IHNldFVwQ29uc3RyYWludHModGFyZ2V0TWFwcGluZywgcHJvcGVydHkpO1xuXHRcdGlmIChPYmplY3Qua2V5cyhjb25zdHJhaW50cykubGVuZ3RoKSB7XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWcuY29uc3RyYWludHMgPSBjb25zdHJhaW50cztcblx0XHR9XG5cdH1cblx0aWYgKHByb3BlcnR5VHlwZUNvbmZpZy50eXBlICE9PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmVhbVwiKSB7XG5cdFx0aWYgKFxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuSW50XCIpID09PSAwIHx8XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Eb3VibGVcIikgPT09IDBcblx0XHQpIHtcblx0XHRcdGZvcm1hdE9wdGlvbnMgPSB7IHBhcnNlQXNTdHJpbmc6IGZhbHNlLCBlbXB0eVN0cmluZzogXCJcIiB9O1xuXHRcdH1cblx0XHRpZiAocHJvcGVydHlUeXBlQ29uZmlnLnR5cGUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyaW5nXCIgJiYgcHJvcGVydHlUeXBlQ29uZmlnLmNvbnN0cmFpbnRzPy5udWxsYWJsZSA9PT0gZmFsc2UpIHtcblx0XHRcdGZvcm1hdE9wdGlvbnMgPSB7IHBhcnNlS2VlcHNFbXB0eVN0cmluZzogdHJ1ZSB9O1xuXHRcdH1cblx0fVxuXHRpZiAoT2JqZWN0LmtleXMoZm9ybWF0T3B0aW9ucykubGVuZ3RoKSB7XG5cdFx0cHJvcGVydHlUeXBlQ29uZmlnLmZvcm1hdE9wdGlvbnMgPSBmb3JtYXRPcHRpb25zO1xuXHR9XG5cdHJldHVybiBwcm9wZXJ0eVR5cGVDb25maWc7XG59XG5cbi8qKlxuICogQWRkIGEgZGVzY3JpcHRpb24gcHJvcGVydHkgdG8gdGhlIGxpc3Qgb2YgZGVzY3JpcHRpb24gcHJvcGVydGllcyB1c2VkIGJ5IHRoZSBjb2x1bW5zIG9mIGEgdGFibGUuXG4gKiBAcGFyYW0gZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCBUaGUgbGlzdCBvZiBwcm9wZXJ0aWVzIHJlZmVyZW5jZWQgYXMgdGV4dCBvbiBhIHRleHQgYXJyYW5nZW1lbnQgYW5ub3RhdGlvblxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGxpbmtlZCB0byB0aGUgY29sdW1uIChuYW1lZCBhbHNvIGNvbXBsZXggcHJvcGVydHkpXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnR5TmFtZSBUaGUgcHJvcGVydHkgbmFtZSB0byBiZSBhZGRlZFxuICovXG5mdW5jdGlvbiBhZGRQcm9wZXJ0eVRvRGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcChcblx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcDogUmVjb3JkPHN0cmluZywgRGlzcGxheU1vZGU+LFxuXHRyZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm8sXG5cdHJlbGF0ZWRQcm9wZXJ0eU5hbWU6IHN0cmluZ1xuKTogdm9pZCB7XG5cdGlmIChcblx0XHRyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1tyZWxhdGVkUHJvcGVydHlOYW1lXS5kaXNwbGF5TW9kZU9mUHJvcGVydHlVc2VkQXNEZXNjcmlwdGlvbiAmJlxuXHRcdCFkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwW3JlbGF0ZWRQcm9wZXJ0eU5hbWVdXG5cdCkge1xuXHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXBbcmVsYXRlZFByb3BlcnR5TmFtZV0gPVxuXHRcdFx0cmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbcmVsYXRlZFByb3BlcnR5TmFtZV0uZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24hO1xuXHR9XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIHJlZmVyZW5jZWQgcHJvcGVydGllcyBvZiBhIExpbmVJdGVtIGluIGNhc2UgdGhlIExpbmVJdGVtIGlzIGFubm90YXRlZCBhcyBoaWRkZW4uXG4gKiBAcGFyYW0gZXhpc3RpbmdDb2x1bW5zIFRoZSBsaXN0IG9mIGNvbHVtbnMgY3JlYXRlZCBmcm9tIExpbmVJdGVtcyBhbmQgZnJvbSBwcm9wZXJ0aWVzIG9mIGVudGl0eVR5cGVcbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBldmFsdWF0ZWRcbiAqIEBwYXJhbSBjb2x1bW4gVGhlIGdpdmVuIGNvbHVtbiBmcm9tIGxpbmVJdGVtIG9yIHByb3BlcnR5IG9mIGVudGl0eVNldFxuICovXG5mdW5jdGlvbiBjb21wdXRlSGlkZGVuT25SZWxhdGVkQ29sdW1ucyhleGlzdGluZ0NvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLCBuYW1lOiBzdHJpbmcsIGNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uKTogdm9pZCB7XG5cdGNvbnN0IHJlbGF0ZWRBbm5vdGF0aW9uQ29sdW1ucyA9IGV4aXN0aW5nQ29sdW1ucy5maWx0ZXIoXG5cdFx0KGV4aXN0aW5nQ29sdW1uKSA9PlxuXHRcdFx0KGV4aXN0aW5nQ29sdW1uLnByb3BlcnR5SW5mb3M/LmluY2x1ZGVzKG5hbWUpICYmIGV4aXN0aW5nQ29sdW1uLmlzUGFydE9mTGluZUl0ZW0pIHx8XG5cdFx0XHQoZXhpc3RpbmdDb2x1bW4uaXNQYXJ0T2ZMaW5lSXRlbSAmJiBleGlzdGluZ0NvbHVtbi5yZWxhdGl2ZVBhdGggPT09IGNvbHVtbi5yZWxhdGl2ZVBhdGgpXG5cdCk7XG5cdGNvbHVtbi5pc1BhcnRPZkxpbmVJdGVtID0gISFyZWxhdGVkQW5ub3RhdGlvbkNvbHVtbnMubGVuZ3RoO1xuXHRpZiAoXG5cdFx0cmVsYXRlZEFubm90YXRpb25Db2x1bW5zLmxlbmd0aCAmJlxuXHRcdCFyZWxhdGVkQW5ub3RhdGlvbkNvbHVtbnM/LnNvbWUoKGFubm90YXRpb25Db2x1bW4pID0+IGFubm90YXRpb25Db2x1bW4uYXZhaWxhYmlsaXR5ICE9PSBcIkhpZGRlblwiKVxuXHQpIHtcblx0XHRjb2x1bW4uc29ydGFibGUgPSBmYWxzZTtcblx0XHRjb2x1bW4uaXNHcm91cGFibGUgPSBmYWxzZTtcblx0XHRjb2x1bW4uZmlsdGVyYWJsZSA9IGZhbHNlO1xuXHR9XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZXhwb3J0IHNldHRpbmdzIHByb3BlcnRpZXMgb2YgYSBtYW5pZmVzdCBjb2x1bW4uXG4gKiBAcGFyYW0gZXhwb3J0U2V0dGluZ3MgVGhlIGN1c3RvbWl6ZWQvb3ZlcndyaXR0ZW4gZXhwb3J0IHNldHRpbmdzIG9mIGEgbWFuaWZlc3QgY29sdW1uXG4gKiBAcGFyYW0gYW5ub3RhdGlvbkNvbHVtbnMgVGhlIGxpc3Qgb2YgY29sdW1ucyBjcmVhdGVkIGZyb20gTGluZUl0ZW1zXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB0YXJnZXQgZW50aXR5IHR5cGVcbiAqIEBwYXJhbSBwcm9wZXJ0eUluZm9zIFRoZSBwcm9wZXJ0aWVzIGxpbmtlZCB0byBhIGNvbXBsZXggY29sdW1uXG4gKiBAcGFyYW0gY29sdW1uS2V5IFRoZSBjb2x1bW4ga2V5IG9mIHRoZSBjb2x1bW4gdG8gYmUgb3ZlcndyaXR0ZW5cbiAqIEByZXR1cm5zIFRoZSBleHBvcnQgc2V0dGluZ3Mgb2YgdGhlIGNvbHVtbiBtZXJnaW5nIGN1c3RvbWl6ZWQgZXhwb3J0IHNldHRpbmdzIHdpdGggdGhlIGRlZmF1bHQgdmFsdWVzIGRldGVjdGVkIG9uIHRoZSBhbm5vdGF0aW9uIGNvbHVtblxuICovXG5mdW5jdGlvbiBnZXRDdXN0b21FeHBvcnRTZXR0aW5ncyhcblx0ZXhwb3J0U2V0dGluZ3M6IENvbHVtbkV4cG9ydFNldHRpbmdzIHwgdW5kZWZpbmVkLFxuXHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0cHJvcGVydHlJbmZvcz86IHN0cmluZ1tdLFxuXHRjb2x1bW5LZXk/OiBzdHJpbmdcbik6IENvbHVtbkV4cG9ydFNldHRpbmdzIHwgbnVsbCB7XG5cdGxldCBjb2x1bW5Gcm9tQW5ub3RhdGlvbnM7XG5cdGlmIChjb2x1bW5LZXkpIHtcblx0XHRjb2x1bW5Gcm9tQW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uQ29sdW1ucy5maW5kKChhbm5vdGF0aW9uQ29sdW1uKSA9PiBhbm5vdGF0aW9uQ29sdW1uLmtleSA9PT0gY29sdW1uS2V5KTtcblx0XHRpZiAoY29sdW1uRnJvbUFubm90YXRpb25zPy5leHBvcnRTZXR0aW5ncyA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGNvbHVtbkZyb21Bbm5vdGF0aW9ucz8uZXhwb3J0U2V0dGluZ3M7XG5cdFx0fVxuXHR9XG5cdGNvbnN0IGVuYWJsZVdyYXBwaW5nID1cblx0XHRleHBvcnRTZXR0aW5ncz8ud3JhcCA/P1xuXHRcdCghIShleHBvcnRTZXR0aW5ncz8ucHJvcGVydHkgJiYgZXhwb3J0U2V0dGluZ3MucHJvcGVydHk/Lmxlbmd0aCA+IDEpIHx8ICEhKHByb3BlcnR5SW5mb3MgJiYgcHJvcGVydHlJbmZvcy5sZW5ndGggPiAxKSk7XG5cdGNvbnN0IGN1c3RvbUV4cG9ydFNldHRpbmdzOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyA9IHtcblx0XHQuLi5jb2x1bW5Gcm9tQW5ub3RhdGlvbnM/LmV4cG9ydFNldHRpbmdzLFxuXHRcdHR5cGU6IGV4cG9ydFNldHRpbmdzPy50eXBlID8/IGNvbHVtbkZyb21Bbm5vdGF0aW9ucz8uZXhwb3J0U2V0dGluZ3M/LnR5cGUsXG5cdFx0dGVtcGxhdGU6XG5cdFx0XHRleHBvcnRTZXR0aW5ncz8udGVtcGxhdGUgPz9cblx0XHRcdF9hcHBlbmRDdXN0b21UZW1wbGF0ZShwcm9wZXJ0eUluZm9zLCBleHBvcnRTZXR0aW5ncz8ucHJvcGVydHkpID8/XG5cdFx0XHRjb2x1bW5Gcm9tQW5ub3RhdGlvbnM/LmV4cG9ydFNldHRpbmdzPy50ZW1wbGF0ZSxcblx0XHRwcm9wZXJ0eTogZXhwb3J0U2V0dGluZ3M/LnByb3BlcnR5XG5cdFx0XHQ/IF9nZXRQcm9wZXJ0eU5hbWVzKGV4cG9ydFNldHRpbmdzPy5wcm9wZXJ0eSwgYW5ub3RhdGlvbkNvbHVtbnMsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUpXG5cdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHR3aWR0aDogZXhwb3J0U2V0dGluZ3M/LndpZHRoLFxuXHRcdHdyYXA6IGVuYWJsZVdyYXBwaW5nXG5cdH07XG5cdHJldHVybiByZW1vdmVVbmRlZmluZWRGcm9tRXhwb3J0U2V0dGluZ3MoY3VzdG9tRXhwb3J0U2V0dGluZ3MpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQW1HQTtFQU1BO0VBS0E7RUFJQTtFQWNBO0VBOEJBO0VBc0NBO0VBQUEsSUEwQ1lBLFVBQVUsMEJBQVZBLFVBQVU7SUFBVkEsVUFBVTtJQUNBO0lBRFZBLFVBQVU7SUFBVkEsVUFBVTtJQUFWQSxVQUFVO0lBQUEsT0FBVkEsVUFBVTtFQUFBO0VBTXRCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVJBQyxRQUFBLENBQUFELFVBQUEsR0FBQUEsVUFBQTtFQVNPLFNBQVNFLGVBQWVBLENBQzlCQyxrQkFBNEIsRUFDNUJDLFNBQW9CLEVBQ3BCQyxpQkFBeUIsRUFDekJDLGdCQUF5RCxFQUN6QztJQUNoQixNQUFNQyxpQkFBaUIsR0FBR0MseUJBQXlCLENBQUNMLGtCQUFrQixFQUFFQyxTQUFTLEVBQUVDLGlCQUFpQixFQUFFQyxnQkFBZ0IsQ0FBQztJQUN2SCxNQUFNRyxlQUFlLEdBQUdDLHNCQUFzQixDQUM3Q0osZ0JBQWdCLENBQUNLLCtCQUErQixDQUE2Qk4saUJBQWlCLENBQUMsQ0FBQ08sT0FBTyxJQUFJLENBQUMsQ0FBQyxFQUM3R0wsaUJBQWlCLEVBQ2pC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