@sapui5/sap.fe.core 1.136.0 → 1.136.1

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 (87) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AppComponent.js +4 -6
  4. package/src/sap/fe/core/AppComponent.ts +4 -4
  5. package/src/sap/fe/core/CommonUtils.js +41 -14
  6. package/src/sap/fe/core/CommonUtils.ts +47 -16
  7. package/src/sap/fe/core/IRowBindingInterface.js +1 -1
  8. package/src/sap/fe/core/IRowBindingInterface.ts +1 -1
  9. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +4 -1
  10. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +3 -0
  11. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +12 -4
  12. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +10 -3
  13. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +139 -5
  14. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +169 -4
  15. package/src/sap/fe/core/controllerextensions/EditFlow.js +48 -43
  16. package/src/sap/fe/core/controllerextensions/EditFlow.ts +54 -51
  17. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +39 -5
  18. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +38 -1
  19. package/src/sap/fe/core/controllerextensions/InternalRouting.js +12 -13
  20. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +10 -11
  21. package/src/sap/fe/core/controllerextensions/MessageHandler.js +32 -21
  22. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +31 -20
  23. package/src/sap/fe/core/controllerextensions/PageReady.js +6 -3
  24. package/src/sap/fe/core/controllerextensions/PageReady.ts +6 -2
  25. package/src/sap/fe/core/controllerextensions/Recommendations.js +3 -2
  26. package/src/sap/fe/core/controllerextensions/Recommendations.ts +7 -5
  27. package/src/sap/fe/core/controllerextensions/Share.js +6 -6
  28. package/src/sap/fe/core/controllerextensions/Share.ts +3 -4
  29. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +9 -11
  30. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +8 -13
  31. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +9 -9
  32. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +20 -10
  33. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +31 -8
  34. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +46 -9
  35. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +2 -2
  36. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +1 -1
  37. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +20 -18
  38. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +37 -23
  39. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +4 -3
  40. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +6 -1
  41. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +6 -3
  42. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +11 -3
  43. package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +5 -2
  44. package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +3 -2
  45. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +2 -2
  46. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +1 -1
  47. package/src/sap/fe/core/controls/CommandExecution.js +1 -1
  48. package/src/sap/fe/core/controls/CommandExecution.ts +1 -1
  49. package/src/sap/fe/core/controls/HideFormGroupAutomatically.js +3 -2
  50. package/src/sap/fe/core/controls/HideFormGroupAutomatically.ts +2 -0
  51. package/src/sap/fe/core/converters/controls/Common/Action.js +5 -2
  52. package/src/sap/fe/core/converters/controls/Common/Action.ts +4 -1
  53. package/src/sap/fe/core/converters/controls/Common/Chart.js +7 -2
  54. package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -1
  55. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +41 -58
  56. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +43 -111
  57. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +14 -6
  58. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +23 -6
  59. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +6 -3
  60. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +5 -2
  61. package/src/sap/fe/core/formatters/ValueFormatter.js +21 -1
  62. package/src/sap/fe/core/formatters/ValueFormatter.ts +19 -0
  63. package/src/sap/fe/core/fpm/manifest.json +1 -1
  64. package/src/sap/fe/core/helpers/DeleteHelper.js +2 -2
  65. package/src/sap/fe/core/helpers/DeleteHelper.ts +1 -1
  66. package/src/sap/fe/core/helpers/ModelHelper.js +2 -2
  67. package/src/sap/fe/core/helpers/ModelHelper.ts +1 -1
  68. package/src/sap/fe/core/helpers/PasteHelper.js +2 -2
  69. package/src/sap/fe/core/helpers/PasteHelper.ts +1 -1
  70. package/src/sap/fe/core/helpers/StableIdHelper.js +2 -2
  71. package/src/sap/fe/core/helpers/StableIdHelper.ts +4 -1
  72. package/src/sap/fe/core/helpers/TitleHelper.js +13 -6
  73. package/src/sap/fe/core/helpers/TitleHelper.ts +19 -6
  74. package/src/sap/fe/core/library.js +1 -1
  75. package/src/sap/fe/core/messagebundle.properties +0 -1
  76. package/src/sap/fe/core/rootView/Fcl.controller.js +9 -15
  77. package/src/sap/fe/core/rootView/Fcl.controller.ts +9 -15
  78. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +9 -6
  79. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +7 -6
  80. package/src/sap/fe/core/templating/DataModelPathHelper.js +2 -2
  81. package/src/sap/fe/core/templating/DataModelPathHelper.ts +1 -1
  82. package/src/sap/fe/core/templating/EntitySetHelper.js +60 -48
  83. package/src/sap/fe/core/templating/EntitySetHelper.ts +80 -58
  84. package/src/sap/fe/core/templating/SemanticObjectHelper.js +6 -4
  85. package/src/sap/fe/core/templating/SemanticObjectHelper.ts +5 -5
  86. package/src/sap/fe/core/templating/UIFormatters.js +7 -1
  87. package/src/sap/fe/core/templating/UIFormatters.ts +4 -0
@@ -57,6 +57,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
57
57
  var Importance = ManifestSettings.Importance;
58
58
  var HorizontalAlign = ManifestSettings.HorizontalAlign;
59
59
  var CreationMode = ManifestSettings.CreationMode;
60
+ var setUpConstraints = BindingToolkit.setUpConstraints;
60
61
  var pathInModel = BindingToolkit.pathInModel;
61
62
  var or = BindingToolkit.or;
62
63
  var not = BindingToolkit.not;
@@ -250,8 +251,6 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
250
251
  columnsToBeCreated[name] = relatedPropertiesInfo.properties[name].annotationProperty;
251
252
  });
252
253
  }
253
- // update Property Label when it's referenced only once in a column, new label will be the label of the column
254
- updatePropertyLabel(annotationColumns, columnsToBeCreated, columnInfo);
255
254
  if (additionalPropertyNames.length > 0) {
256
255
  columnInfo.additionalPropertyInfos = additionalPropertyNames;
257
256
  // Create columns for additional properties identified for ALP use case.
@@ -304,7 +303,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
304
303
  const propertyTypeConfig = getTypeConfig(property, dataType);
305
304
  const isAPropertyFromTextOnlyAnnotation = displayModeOfDescriptionPropertiesMap[relativePath] === "Description";
306
305
  const sortable = (!isHidden || isAPropertyFromTextOnlyAnnotation) && !restrictionsOnProperties?.nonSortableProperties.includes(relativePath);
307
- const filterable = !isAPropertyFromTextOnlyAnnotation && !restrictionsOnProperties?.nonFilterableProperties.includes(relativePath);
306
+ const filterable = !restrictionsOnProperties?.nonFilterableProperties.includes(relativePath);
308
307
  const typeConfig = {
309
308
  className: property.type || dataType,
310
309
  formatOptions: propertyTypeConfig.formatOptions,
@@ -314,7 +313,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
314
313
  if (_isExportableColumn(property)) {
315
314
  exportSettings = createColumnExportSettings(property, relatedPropertiesInfo);
316
315
  }
317
- const availability = !isHidden && (availableForAdaptation || displayModeOfDescriptionPropertiesMap[relativePath]) ? "Adaptation" : "Hidden";
316
+ const availability = !isHidden && availableForAdaptation ? "Adaptation" : "Hidden";
318
317
  const collectedNavigationPropertyLabels = _getCollectedNavigationPropertyLabels(relativePath, converterContext);
319
318
  if (relativePathForMultiValue) {
320
319
  relativePath = relativePathForMultiValue;
@@ -442,22 +441,6 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
442
441
  return exportSettings;
443
442
  };
444
443
 
445
- /**
446
- * Update property label in case it's only referenced in one column. The label of the column must be used instead of the property label.
447
- * This update also is applied for the tooltip as it is based on the column's label.
448
- * @param annotationColumns The array of columns created based on LineItem annotations.
449
- * @param columnsToBeCreated The columns to be created
450
- * @param columnInfo The column definition
451
- * @param columnName The name of the column
452
- */
453
- function updatePropertyLabel(annotationColumns, columnsToBeCreated, columnInfo, columnName) {
454
- const linkedAnnotationColumns = annotationColumns.filter(col => col.propertyInfos?.includes(columnInfo.relativePath) || columnName && col.propertyInfos?.includes(columnName));
455
- if (linkedAnnotationColumns?.length === 1 && (columnsToBeCreated[columnInfo.relativePath] || columnName && columnsToBeCreated[columnName]) && linkedAnnotationColumns[0].propertyInfos?.length === 1) {
456
- columnInfo.label = linkedAnnotationColumns[0].label;
457
- columnInfo.tooltip = linkedAnnotationColumns[0].tooltip;
458
- }
459
- }
460
-
461
444
  /**
462
445
  * Returns Boolean true for exportable columns, false for non exportable columns.
463
446
  * @param source The dataField or property to be evaluated
@@ -650,7 +633,6 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
650
633
  const newNameRelativeTargetPath = getContextRelativeTargetObjectPath(propertyObjectPath, false, true);
651
634
  const column = getColumnDefinitionFromProperty(property, annotationPath, name, true, false, aggregationHelper, converterContext, displayModeOfDescriptionPropertiesMap, restrictionsOnProperties, tableCreationMode, undefined, newNameRelativeTargetPath);
652
635
  computeHiddenOnRelatedColumns(existingColumns, name, column);
653
- updatePropertyLabel(existingColumns, columnsToBeCreated, column, name);
654
636
  relatedColumns.push(column);
655
637
  relatedPropertyNameMap[name] = newNameRelativeTargetPath ?? name;
656
638
  } else if (relatedColumn === undefined) {
@@ -658,7 +640,6 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
658
640
  // New created property column is set to hidden.
659
641
  const column = getColumnDefinitionFromProperty(property, annotationPath, name, true, false, aggregationHelper, converterContext, displayModeOfDescriptionPropertiesMap, restrictionsOnProperties, tableCreationMode);
660
642
  computeHiddenOnRelatedColumns(existingColumns, name, column);
661
- updatePropertyLabel(existingColumns, columnsToBeCreated, column);
662
643
  relatedColumns.push(column);
663
644
  } else if (relatedColumn.annotationPath !== annotationPath || relatedColumn.propertyInfos) {
664
645
  // Case 2: The existing column points to a LineItem (or)
@@ -670,19 +651,11 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
670
651
  // Set it to hidden as it is only consumed by Complex property infos.
671
652
  const column = getColumnDefinitionFromProperty(property, annotationPath, name, false, false, aggregationHelper, converterContext, displayModeOfDescriptionPropertiesMap, restrictionsOnProperties, tableCreationMode);
672
653
  computeHiddenOnRelatedColumns(existingColumns, name, column);
673
- updatePropertyLabel(existingColumns, columnsToBeCreated, column);
674
654
  relatedColumns.push(column);
675
655
  relatedPropertyNameMap[name] = newName;
676
656
  } else if (existingColumns.some(column => column.name === newName) && existingColumns.some(column => column.propertyInfos?.includes(name))) {
677
657
  relatedPropertyNameMap[name] = newName;
678
658
  }
679
- } else if (displayModeOfDescriptionPropertiesMap[name] === "Description" && !relatedColumn.filterable && !restrictionsOnProperties?.nonFilterableProperties.includes(name)) {
680
- // Case 4: The column is a referenced text only property. Set it to hidden, non sortable nor groupable.
681
- // Case 5: The column isn't already available for filtering as it could be referenced on another column (e.g. text first).
682
- restrictionsOnProperties?.nonSortableProperties.push(name);
683
- const column = getColumnDefinitionFromProperty(property, annotationPath, name, false, false, aggregationHelper, converterContext, {}, restrictionsOnProperties, tableCreationMode);
684
- column.isGroupable = false;
685
- relatedColumns.push(column);
686
659
  }
687
660
  });
688
661
  // The property 'name' has been prefixed with 'Property::' for uniqueness.
@@ -1067,9 +1040,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
1067
1040
  ...formatOptions,
1068
1041
  ...propertyTypeConfig?.formatOptions
1069
1042
  },
1070
- constraints: {
1071
- ...propertyTypeConfig?.constraints
1072
- }
1043
+ constraints: propertyTypeConfig?.constraints
1073
1044
  };
1074
1045
  const visualSettings = {};
1075
1046
  if (!dataType || !typeConfig) {
@@ -1606,35 +1577,47 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
1606
1577
  });
1607
1578
  }
1608
1579
  }
1609
- function getTypeConfig(oProperty, dataType) {
1610
- let oTargetMapping;
1611
- if (isProperty(oProperty)) {
1612
- oTargetMapping = isTypeDefinition(oProperty.targetType) ? EDM_TYPE_MAPPING[oProperty.targetType.underlyingType] : EDM_TYPE_MAPPING[oProperty.type];
1580
+
1581
+ /**
1582
+ * Retrieves the property type configuration based on the provided property or data type.
1583
+ * @param property The property or data field to determine the type configuration for.
1584
+ * @param dataType The data type to use for type configuration if not determined from the property.
1585
+ * @returns The property type configuration object.
1586
+ */
1587
+ function getTypeConfig(property, dataType) {
1588
+ let targetMapping,
1589
+ formatOptions = {};
1590
+ if (isProperty(property)) {
1591
+ targetMapping = isTypeDefinition(property.targetType) ? EDM_TYPE_MAPPING[property.targetType.underlyingType] : EDM_TYPE_MAPPING[property.type];
1613
1592
  }
1614
- if (oTargetMapping === undefined && dataType !== undefined) {
1615
- oTargetMapping = EDM_TYPE_MAPPING[dataType];
1593
+ if (!targetMapping && dataType !== undefined) {
1594
+ targetMapping = EDM_TYPE_MAPPING[dataType];
1616
1595
  }
1617
1596
  const propertyTypeConfig = {
1618
- type: oTargetMapping?.type,
1619
- constraints: {},
1620
- formatOptions: {}
1597
+ type: targetMapping?.type
1621
1598
  };
1622
- if (isProperty(oProperty) && oTargetMapping !== undefined) {
1623
- propertyTypeConfig.constraints = {
1624
- scale: oTargetMapping.constraints?.$Scale ? oProperty.scale : undefined,
1625
- precision: oTargetMapping.constraints?.$Precision ? oProperty.precision : undefined,
1626
- maxLength: oTargetMapping.constraints?.$MaxLength ? oProperty.maxLength : undefined,
1627
- nullable: oTargetMapping.constraints?.$Nullable ? oProperty.nullable : undefined,
1628
- minimum: oTargetMapping.constraints?.["@Org.OData.Validation.V1.Minimum/$Decimal"] && !isNaN(oProperty.annotations?.Validation?.Minimum) ? `${oProperty.annotations?.Validation?.Minimum}` : undefined,
1629
- maximum: oTargetMapping.constraints?.["@Org.OData.Validation.V1.Maximum/$Decimal"] && !isNaN(oProperty.annotations?.Validation?.Maximum) ? `${oProperty.annotations?.Validation?.Maximum}` : undefined,
1630
- isDigitSequence: propertyTypeConfig.type === "sap.ui.model.odata.type.String" && oTargetMapping.constraints?.[`@${"com.sap.vocabularies.Common.v1.IsDigitSequence"}`] && oProperty.annotations?.Common?.IsDigitSequence ? true : undefined
1631
- };
1599
+ if (targetMapping && isProperty(property)) {
1600
+ const constraints = setUpConstraints(targetMapping, property);
1601
+ if (Object.keys(constraints).length) {
1602
+ propertyTypeConfig.constraints = constraints;
1603
+ }
1604
+ }
1605
+ if (propertyTypeConfig.type !== "sap.ui.model.odata.type.Stream") {
1606
+ if (propertyTypeConfig?.type?.indexOf("sap.ui.model.odata.type.Int") === 0 || propertyTypeConfig?.type?.indexOf("sap.ui.model.odata.type.Double") === 0) {
1607
+ formatOptions = {
1608
+ parseAsString: false,
1609
+ emptyString: ""
1610
+ };
1611
+ }
1612
+ if (propertyTypeConfig.type === "sap.ui.model.odata.type.String" && propertyTypeConfig.constraints?.nullable === false) {
1613
+ formatOptions = {
1614
+ parseKeepsEmptyString: true
1615
+ };
1616
+ }
1617
+ }
1618
+ if (Object.keys(formatOptions).length) {
1619
+ propertyTypeConfig.formatOptions = formatOptions;
1632
1620
  }
1633
- propertyTypeConfig.formatOptions = {
1634
- parseAsString: propertyTypeConfig?.type?.indexOf("sap.ui.model.odata.type.Int") === 0 || propertyTypeConfig?.type?.indexOf("sap.ui.model.odata.type.Double") === 0 ? false : undefined,
1635
- emptyString: propertyTypeConfig?.type?.indexOf("sap.ui.model.odata.type.Int") === 0 || propertyTypeConfig?.type?.indexOf("sap.ui.model.odata.type.Double") === 0 ? "" : undefined,
1636
- parseKeepsEmptyString: propertyTypeConfig.type === "sap.ui.model.odata.type.String" && propertyTypeConfig.constraints.nullable === false ? true : undefined
1637
- };
1638
1621
  return propertyTypeConfig;
1639
1622
  }
1640
1623
 
@@ -1698,4 +1681,4 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/ManifestSet
1698
1681
  }
1699
1682
  return _exports;
1700
1683
  }, false);
1701
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb2x1bW5UeXBlIiwiX2V4cG9ydHMiLCJnZXRUYWJsZUNvbHVtbnMiLCJsaW5lSXRlbUFubm90YXRpb24iLCJ0YWJsZVR5cGUiLCJ2aXN1YWxpemF0aW9uUGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJhbm5vdGF0aW9uQ29sdW1ucyIsImdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMiLCJtYW5pZmVzdENvbHVtbnMiLCJnZXRDb2x1bW5zRnJvbU1hbmlmZXN0IiwiZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbiIsImNvbHVtbnMiLCJnZXRBbm5vdGF0aW9uRW50aXR5VHlwZSIsInRhYmxlQ29sdW1ucyIsImluc2VydEN1c3RvbUVsZW1lbnRzIiwid2lkdGgiLCJPdmVycmlkZVR5cGUiLCJvdmVyd3JpdGUiLCJ3aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlciIsImltcG9ydGFuY2UiLCJob3Jpem9udGFsQWxpZ24iLCJhdmFpbGFiaWxpdHkiLCJpc05hdmlnYWJsZSIsInNldHRpbmdzIiwiZm9ybWF0T3B0aW9ucyIsImV4cG9ydFNldHRpbmdzIiwiYWRkQ29tcHV0ZWRDb2x1bW5zIiwiZmluZENvbHVtbkJ5UGF0aCIsInBhdGgiLCJmaW5kIiwiY29sdW1uIiwiYW5ub3RhdGlvbkNvbHVtbiIsInByb3BlcnR5SW5mb3MiLCJ1bmRlZmluZWQiLCJyZWxhdGl2ZVBhdGgiLCJ1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsImdldENvbnZlcnRlckNvbnRleHRGb3IiLCJnZXRDb250ZXh0UGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJmb3JFYWNoIiwib0NvbHVtbiIsInRhYmxlQ29sdW1uIiwicHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwiZW5oYW5jZURhdGFNb2RlbFBhdGgiLCJwcm9wZXJ0eSIsInRhcmdldE9iamVjdCIsImFkZEN1cnJlbmN5T3JVb01Ub1Byb3BlcnR5IiwidGltZXpvbmVQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5IiwidGltZXpvbmUiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIlRpbWV6b25lIiwib1RpbWV6b25lQ29sdW1uIiwibmFtZSIsInRpbWV6b25lVGV4dCIsInRvU3RyaW5nIiwiYWRkVGV4dEFycmFuZ2VudEluZm9Ub1Byb3BlcnR5IiwiY3VycmVuY3lPclVvTVByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoIiwiZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgiLCJjdXJyZW5jeU9yVW9NUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwiY3VycmVuY3lPclVvTVJlbGF0aXZlUGF0aCIsImdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgiLCJ1bml0Q29sdW1uIiwidW5pdCIsIk1lYXN1cmVzIiwiSVNPQ3VycmVuY3kiLCJVbml0IiwidW5pdFRleHQiLCJkaXNwbGF5TW9kZSIsImdldERpc3BsYXlNb2RlIiwidGV4dFByb3BlcnR5UGF0aCIsImdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoIiwidGV4dFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCIsInRleHRSZWxhdGl2ZVBhdGgiLCJ0ZXh0Q29sdW1uIiwidGV4dEFycmFuZ2VtZW50IiwidGV4dFByb3BlcnR5IiwibW9kZSIsInR5cGUiLCJnZXRDb2x1bW5zRnJvbUVudGl0eVR5cGUiLCJjb2x1bW5zVG9CZUNyZWF0ZWQiLCJlbnRpdHlUeXBlIiwidGFibGVDcmVhdGlvbk1vZGUiLCJkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwIiwicmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIiwicHJvcGVydGllc05vdFRvQmVDb25zaWRlcmVkIiwiYWdncmVnYXRpb25IZWxwZXIiLCJBZ2dyZWdhdGlvbkhlbHBlciIsImdyb3VwYWJsZVByb3BlcnRpZXMiLCJnZXRHcm91cGFibGVQcm9wZXJ0aWVzIiwiaXNBbmFseXRpY3NTdXBwb3J0ZWQiLCJtYXAiLCIkdGFyZ2V0IiwiZmlsdGVyIiwidGFyZ2V0IiwiZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eSIsInRleHRQcm9wIiwiaXNQcm9wZXJ0eUdyb3VwYWJsZSIsInByb3AiLCJlbnRpdHlQcm9wZXJ0aWVzIiwiZXhpc3RzIiwic29tZSIsInRhcmdldFR5cGUiLCJpbmNsdWRlcyIsInJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyIsImNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyIsInJlbGF0ZWRQcm9wZXJ0eU5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsInByb3BlcnRpZXMiLCJhZGRpdGlvbmFsUHJvcGVydHlOYW1lcyIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwiYWRkUHJvcGVydHlUb0Rpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAiLCJjb2x1bW5JbmZvIiwiZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eSIsImdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJsZW5ndGgiLCJkYXRhUG9pbnRUYXJnZXRWYWx1ZSIsImV4cG9ydERhdGFQb2ludFRhcmdldFZhbHVlIiwiYW5ub3RhdGlvblByb3BlcnR5IiwidXBkYXRlUHJvcGVydHlMYWJlbCIsImFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zIiwiYWRkaXRpb25hbFByb3BlcnR5TmFtZSIsInB1c2giLCJub25Tb3J0YWJsZVByb3BlcnRpZXMiLCJpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiIsIlRleHQiLCJyZWxhdGVkQ29sdW1ucyIsIl9jcmVhdGVSZWxhdGVkQ29sdW1ucyIsImNvbmNhdCIsImZ1bGxQcm9wZXJ0eVBhdGgiLCJ1c2VEYXRhRmllbGRQcmVmaXgiLCJhdmFpbGFibGVGb3JBZGFwdGF0aW9uIiwicmVsYXRpdmVQYXRoRm9yTXVsdGlWYWx1ZSIsInNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGgiLCJnZXRTZW1hbnRpY09iamVjdFBhdGgiLCJpc0hpZGRlbiIsImlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuIiwiZ3JvdXBQYXRoIiwiX3NsaWNlQXRTbGFzaCIsImlzR3JvdXAiLCJsYWJlbCIsImdldExhYmVsIiwiZGF0YVR5cGUiLCJnZXREYXRhRmllbGREYXRhVHlwZSIsInByb3BlcnR5VHlwZUNvbmZpZyIsImdldFR5cGVDb25maWciLCJpc0FQcm9wZXJ0eUZyb21UZXh0T25seUFubm90YXRpb24iLCJzb3J0YWJsZSIsImZpbHRlcmFibGUiLCJub25GaWx0ZXJhYmxlUHJvcGVydGllcyIsInR5cGVDb25maWciLCJjbGFzc05hbWUiLCJjb25zdHJhaW50cyIsIl9pc0V4cG9ydGFibGVDb2x1bW4iLCJjcmVhdGVDb2x1bW5FeHBvcnRTZXR0aW5ncyIsImNvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscyIsIl9nZXRDb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHMiLCJrZXkiLCJyZXBsYWNlU3BlY2lhbENoYXJzIiwiQW5ub3RhdGlvbiIsImdyb3VwTGFiZWwiLCJncm91cCIsImFubm90YXRpb25QYXRoIiwic2VtYW50aWNPYmplY3RQYXRoIiwiaXNHcm91cGFibGUiLCJpc0tleSIsImNhc2VTZW5zaXRpdmUiLCJpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUiLCJnZXRJbXBvcnRhbmNlIiwiVUkiLCJEYXRhRmllbGREZWZhdWx0IiwicmVxdWlyZWQiLCJpc1JlcXVpcmVkQ29sdW1uIiwiYWRkaXRpb25hbExhYmVscyIsIl9hZGRUb29sVGlwIiwiX3NldEV4cG9ydFNldHRpbmdzRm9yRGF0YVBvaW50IiwiTW9kZWxIZWxwZXIiLCJpc09iamVjdFBhdGhEcmFmdFN1cHBvcnRlZCIsImV4dGVuc2lvbiIsInRlY2huaWNhbGx5QWdncmVnYXRhYmxlIiwidGVjaG5pY2FsbHlHcm91cGFibGUiLCJ1bml0UHJvcGVydHkiLCJ1dGMiLCJpc0FUaW1lem9uZSIsImN1cnJlbmN5UHJvcGVydHkiLCJzY2FsZSIsImlzUHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkiLCJnZXRTdGF0aWNVbml0T3JDdXJyZW5jeSIsImdldFN0YXRpY1RpbWV6b25lIiwiaXNUaW1lem9uZSIsImV4cG9ydFR5cGUiLCJnZXRFeHBvcnREYXRhVHlwZSIsImlucHV0Rm9ybWF0IiwiZ2V0RGF0ZUlucHV0Rm9ybWF0IiwiZGVsaW1pdGVyIiwiZ2V0RGVsaW1pdGVyIiwidGVtcGxhdGUiLCJ3cmFwIiwiYXV0b1NjYWxlIiwicmVtb3ZlVW5kZWZpbmVkRnJvbUV4cG9ydFNldHRpbmdzIiwic2V0dGluZyIsImNvbHVtbk5hbWUiLCJsaW5rZWRBbm5vdGF0aW9uQ29sdW1ucyIsImNvbCIsInRvb2x0aXAiLCJzb3VyY2UiLCJwcm9wZXJ0eVR5cGUiLCJkYXRhRmllbGREZWZhdWx0UHJvcGVydHkiLCIkVHlwZSIsIlRhcmdldCIsIlZhbHVlIiwiQ29yZSIsIk1lZGlhVHlwZSIsInRlcm0iLCJpc1VSTCIsIl9pc1ZhbGlkQ29sdW1uIiwiZGF0YUZpZWxkIiwiSW5saW5lIiwiX2dldFZpc2libGVFeHByZXNzaW9uIiwiZGF0YUZpZWxkTW9kZWxQYXRoIiwicHJvcGVydHlWYWx1ZSIsImlzQW5hbHl0aWNhbEdyb3VwSGVhZGVyRXhwYW5kZWQiLCJjb25zdGFudCIsImlzQW5hbHl0aWNhbExlYWYiLCJhbmQiLCJub3QiLCJlcXVhbCIsImdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbiIsIkhpZGRlbiIsImlmRWxzZSIsIm9yIiwiX2dldEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyIsImRhdGFGaWVsZEdyb3VwIiwiZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zIiwiY29tcGlsZUV4cHJlc3Npb24iLCJEYXRhIiwiaW5uZXJEYXRhRmllbGQiLCJhcmd1bWVudHMiLCJpc05hdmlnYXRpb25Qcm9wZXJ0eSIsImRhdGFGaWVsZERlZmF1bHQiLCJxdWFsaWZpZXIiLCJMYWJlbCIsImlzRGF0YUZpZWxkVHlwZXMiLCJ2YWx1ZU9mIiwiX2dldFRvb2x0aXAiLCJRdWlja0luZm8iLCJkYXRhcG9pbnRUYXJnZXQiLCJnZXRSb3dTdGF0dXNWaXNpYmlsaXR5IiwiY29sTmFtZSIsImlzU2VtYW50aWNLZXlJbkZpZWxkR3JvdXAiLCJmb3JtYXRSZXN1bHQiLCJwYXRoSW5Nb2RlbCIsInRhYmxlRm9ybWF0dGVycyIsImdldEVycm9yU3RhdHVzVGV4dFZpc2liaWxpdHlGb3JtYXR0ZXIiLCJleGlzdGluZ0NvbHVtbnMiLCJyZWxhdGVkUHJvcGVydHlOYW1lTWFwIiwiZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aCIsInJlbGF0ZWRDb2x1bW4iLCJwcm9wZXJ0eU9iamVjdFBhdGgiLCJpc011bHRpVmFsdWVGaWVsZCIsIm5ld05hbWVSZWxhdGl2ZVRhcmdldFBhdGgiLCJjb21wdXRlSGlkZGVuT25SZWxhdGVkQ29sdW1ucyIsIm5ld05hbWUiLCJwcm9wZXJ0eUluZm8iLCJfZ2V0QW5ub3RhdGlvbkNvbHVtbk5hbWUiLCJLZXlIZWxwZXIiLCJnZW5lcmF0ZUtleUZyb21EYXRhRmllbGQiLCJfZ2V0U2hvd0RhdGFGaWVsZHNMYWJlbCIsImZpZWxkR3JvdXBOYW1lIiwiY29sdW1uS2V5cyIsInNob3dEYXRhRmllbGRzTGFiZWwiLCJfZ2V0UmVsYXRpdmVQYXRoIiwidmFsdWUiLCJpc0xhc3RTbGFzaCIsImlzTGFzdFBhcnQiLCJpU2xhc2hJbmRleCIsImxhc3RJbmRleE9mIiwiaW5kZXhPZiIsInN1YnN0cmluZyIsIl9pc0NvbHVtbk11bHRpVmFsdWVkIiwiX2lzQ29sdW1uU29ydGFibGUiLCJwcm9wZXJ0eVBhdGgiLCJub25Tb3J0YWJsZUNvbHVtbnMiLCJwcm9wTmFtZSIsImZpbHRlckZ1bmN0aW9ucyIsIl9nZXRGaWx0ZXJGdW5jdGlvbnMiLCJDb252ZXJ0ZXJDb250ZXh0IiwiZW50aXR5U2V0IiwiZ2V0RW50aXR5U2V0IiwiVHlwZUd1YXJkcyIsImlzRW50aXR5U2V0IiwiQ2FwYWJpbGl0aWVzIiwiRmlsdGVyRnVuY3Rpb25zIiwiZ2V0RW50aXR5Q29udGFpbmVyIiwiX2dldERlZmF1bHRGb3JtYXRPcHRpb25zRm9yVGFibGUiLCJ0ZXh0TGluZXNFZGl0IiwiX2ZpbmRTZW1hbnRpY0tleVZhbHVlcyIsInNlbWFudGljS2V5cyIsImFTZW1hbnRpY0tleVZhbHVlcyIsImJTZW1hbnRpY0tleUZvdW5kIiwiaSIsInZhbHVlcyIsInNlbWFudGljS2V5Rm91bmQiLCJfZmluZFByb3BlcnRpZXMiLCJzZW1hbnRpY0tleVZhbHVlcyIsImZpZWxkR3JvdXBQcm9wZXJ0aWVzIiwic2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCIsInNQcm9wZXJ0eVBhdGgiLCJ0bXAiLCJmaWVsZEdyb3VwUHJvcGVydHlQYXRoIiwiX2ZpbmRTZW1hbnRpY0tleVZhbHVlc0luRmllbGRHcm91cCIsImFQcm9wZXJ0aWVzIiwiX3Byb3BlcnRpZXNGb3VuZCIsImdldERlZmF1bHREcmFmdEluZGljYXRvckZvckNvbHVtbiIsInNlbWFudGljS2V5Iiwic2VtYW50aWNLZXlJbkZpZWxkR3JvdXAiLCJmaWVsZEdyb3VwRHJhZnRJbmRpY2F0b3JQcm9wZXJ0eVBhdGgiLCJzaG93RXJyb3JPYmplY3RTdGF0dXMiLCJoYXNEcmFmdEluZGljYXRvciIsIl9nZXRJbXBOdW1iZXIiLCJJbXBvcnRhbmNlIiwiX2dldERhdGFGaWVsZEltcG9ydGFuY2UiLCJzcGxpdCIsIk5vbmUiLCJ0YXJnZXRWYWx1ZWZyb21EUCIsImdldFRhcmdldFZhbHVlT25EYXRhUG9pbnQiLCJpc0RhdGFQb2ludEZyb21EYXRhRmllbGREZWZhdWx0IiwiX2dldE1heEltcG9ydGFuY2UiLCJmaWVsZHMiLCJtYXhJbXBOdW1iZXIiLCJpbXBOdW1iZXIiLCJEYXRhRmllbGRXaXRoTWF4SW1wb3J0YW5jZSIsImZpZWxkIiwidGFyZ2V0RW50aXR5VHlwZSIsIlNlbWFudGljS2V5IiwicmVxdWlyZWRQcm9wZXJ0aWVzIiwiZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzIiwiaGlnaEtleXMiLCJmaWVsZHNXaXRoSW1wb3J0YW5jZSIsImlzQW5ub3RhdGlvbk9mVHlwZSIsImRhdGFGaWVsZFRhcmdldCIsImZpZWxkR3JvdXBEYXRhIiwiZmllbGRHcm91cERhdGFGaWVsZCIsIkhpZ2giLCJpdGVtIiwiZ2V0UmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIiwidGFibGVNYW5pZmVzdFNldHRpbmdzIiwiZGVmYXVsdENyZWF0aW9uTW9kZSIsImdldE1hbmlmZXN0V3JhcHBlciIsImdldFNhcEZlTWFuaWZlc3RDb25maWd1cmF0aW9uIiwibWFjcm9zIiwidGFibGUiLCJDcmVhdGlvbk1vZGUiLCJJbmxpbmVDcmVhdGlvblJvd3MiLCJ0YWJsZVNldHRpbmdzIiwiY3JlYXRpb25Nb2RlIiwiZ2V0QW5ub3RhdGlvbnNCeVRlcm0iLCJnZXRFbnRpdHlUeXBlIiwidGFibGVDb252ZXJ0ZXJDb250ZXh0IiwiZ2V0VGFyZ2V0T2JqZWN0UGF0aCIsImNvbGxlY3RSZWxhdGVkUHJvcGVydGllc1JlY3Vyc2l2ZWx5IiwiaXNGaWVsZEdyb3VwQ29sdW1uIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJzaXR1YXRpb25zTmF2UHJvcHMiLCJuYXZpZ2F0aW9uUHJvcGVydHkiLCJpc0NvbGxlY3Rpb24iLCJTQVBPYmplY3ROb2RlVHlwZSIsIk5hbWUiLCJzaXR1YXRpb25zTmF2UHJvcCIsImhhc1NpdHVhdGlvbnNJbmRpY2F0b3IiLCJpc011bHRpVmFsdWUiLCJ2aXN1YWxTZXR0aW5ncyIsIndpZHRoQ2FsY3VsYXRpb24iLCJGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMiLCJIVE1MNSIsIkNzc0RlZmF1bHRzIiwiaXNQYXJ0T2ZMaW5lSXRlbSIsInJlbGF0ZWRQcm9wZXJ0eU5hbWUiLCJkaXNwbGF5TW9kZU9mUHJvcGVydHlVc2VkQXNEZXNjcmlwdGlvbiIsImNyZWF0ZVByb3BlcnR5QW5ub3RhdGVkVGV4dE9ubHkiLCJfZ2V0UHJvcGVydHlOYW1lcyIsIm1hdGNoZWRQcm9wZXJ0aWVzIiwiQXJyYXkiLCJpc0FycmF5IiwicmVzb2x2ZVBhdGgiLCJpc1JlcXVpcmVkRmllbGRHcm91cCIsImZpZWxkR3JvdXAiLCJpc0RhdGFGaWVsZCIsImlzU3RhdGljYWxseU1hbmRhdG9yeSIsImlzQW5ub3RhdGVkUmVxdWlyZWRQcm9wZXJ0eSIsImlzUmVxdWlyZWREYXRhRmllbGRGb3JBbm5vdGF0aW9uIiwiZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiIsIkRhdGFGaWVsZEZvckFubm90YXRpb25GaWVsZENvbnRyb2xOb3RNYW5kYXRvcnkiLCJoYXNGaWVsZENvbnRyb2xOb3RNYW5kYXRvcnkiLCJoYXNGaWVsZEdyb3VwVGFyZ2V0IiwiaGFzRGF0YVBvaW50VGFyZ2V0IiwiVmlzdWFsaXphdGlvbiIsImlzUmVxdWlyZWREYXRhUG9pbnQiLCJpc1JlcXVpcmVkUHJvcGVydHkiLCJpc1JhdGluZ1Zpc3VhbGl6YXRpb25Gcm9tRGF0YUZpZWxkRGVmYXVsdCIsImRhdGFQb2ludCIsImdldFRlbXBsYXRlVHlwZSIsIlRlbXBsYXRlVHlwZSIsIkxpc3RSZXBvcnQiLCJBbmFseXRpY2FsTGlzdFBhZ2UiLCJJc0VkaXRhYmxlIiwiaXNEYXRhRmllbGRGb3JBbm5vdGF0aW9uIiwiX2FwcGVuZEN1c3RvbVRlbXBsYXRlIiwiZXhwb3J0UHJvcGVydGllcyIsImpvaW4iLCJpbnRlcm5hbENvbHVtbnMiLCJpc0NvbHVtbk92ZXJyaWRlIiwiaXNTbG90Q29sdW1uIiwibWFuaWZlc3RDb2x1bW4iLCJTbG90IiwiaXNDdXN0b21Db2x1bW4iLCJfdXBkYXRlTGlua2VkUHJvcGVydGllc09uQ3VzdG9tQ29sdW1ucyIsImFubm90YXRpb25UYWJsZUNvbHVtbnMiLCJyZXBsYWNlIiwiaXNQYXJ0T2ZDdXN0b21Db2x1bW4iLCJ2YWxpZGF0ZUtleSIsImJhc2VUYWJsZUNvbHVtbiIsInBvc2l0aW9uIiwiYW5jaG9yIiwicGxhY2VtZW50IiwiUGxhY2VtZW50IiwiQWZ0ZXIiLCJwcm9wZXJ0aWVzVG9PdmVyd3JpdGVBbm5vdGF0aW9uQ29sdW1uIiwiZ2V0Q3VzdG9tRXhwb3J0U2V0dGluZ3MiLCJ0b29sdGlwVGV4dCIsImZldGNoVGV4dEZyb21NZXRhTW9kZWwiLCJoZWFkZXJUZXh0IiwiaGVhZGVyIiwiY3VzdG9tQ29sdW1uRXhwb3J0U2V0dGluZ3MiLCJiYXNlTWFuaWZlc3RDb2x1bW4iLCJIb3Jpem9udGFsQWxpZ24iLCJCZWdpbiIsImlkIiwiY3VzdG9tVGFibGVDb2x1bW4iLCJEZWZhdWx0IiwibWVzc2FnZSIsImdldERpYWdub3N0aWNzIiwiYWRkSXNzdWUiLCJJc3N1ZUNhdGVnb3J5IiwiTWFuaWZlc3QiLCJJc3N1ZVNldmVyaXR5IiwiTG93IiwiSXNzdWVDYXRlZ29yeVR5cGUiLCJBbm5vdGF0aW9uQ29sdW1ucyIsIkludmFsaWRLZXkiLCJjb2x1bW5XaXRoU2l0dWF0aW9uc0luZGljYXRvciIsInNpdHVhdGlvbnNJbmRpY2F0b3JDb2x1bW4iLCJwcm9wZXJ0eUtleSIsImlzU2l0dWF0aW9uc0luZGljYXRvciIsIkNvbXB1dGVkIiwiY2xpcGJvYXJkU2V0dGluZ3MiLCJpbmRleE9mRmlyc3RWaXNpYmxlQ29sdW1uIiwiZmluZEluZGV4Iiwic3BsaWNlIiwiY29sdW1uc1dpdGhEcmFmdEluZGljYXRvciIsImlzRHJhZnROb2RlIiwiaXNEcmFmdFJvb3QiLCJjb2x1bW5XaXRoRHJhZnRJbmRpY2F0b3IiLCJkcmFmdEluZGljYXRvckNvbHVtbiIsImlzRHJhZnRJbmRpY2F0b3IiLCJjb2x1bW5JbmRleFRvSW5zZXJ0QWZ0ZXIiLCJnZXRDb250ZXh0UHJvcGVydHlSZXN0cmljdGlvbiIsImNhcGFiaWxpdGllcyIsIkluc2VydFJlc3RyaWN0aW9ucyIsIlJlcXVpcmVkUHJvcGVydGllcyIsImlzQ3VycmVuY3kiLCJleHBvcnREYXRhVHlwZSIsIm5hdlByb3BlcnR5IiwibGluZUl0ZW0iLCJpc1Byb3BlcnR5TmF2aWdhdGVkIiwiaW5oZXJlZFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCIsImlzSW5oZXJlZFByb3BlcnR5TmF2aWdhdGVkIiwib1Byb3BlcnR5Iiwib1RhcmdldE1hcHBpbmciLCJpc1R5cGVEZWZpbml0aW9uIiwiRURNX1RZUEVfTUFQUElORyIsInVuZGVybHlpbmdUeXBlIiwiJFNjYWxlIiwicHJlY2lzaW9uIiwiJFByZWNpc2lvbiIsIm1heExlbmd0aCIsIiRNYXhMZW5ndGgiLCJudWxsYWJsZSIsIiROdWxsYWJsZSIsIm1pbmltdW0iLCJpc05hTiIsIlZhbGlkYXRpb24iLCJNaW5pbXVtIiwibWF4aW11bSIsIk1heGltdW0iLCJpc0RpZ2l0U2VxdWVuY2UiLCJJc0RpZ2l0U2VxdWVuY2UiLCJwYXJzZUFzU3RyaW5nIiwiZW1wdHlTdHJpbmciLCJwYXJzZUtlZXBzRW1wdHlTdHJpbmciLCJyZWxhdGVkQW5ub3RhdGlvbkNvbHVtbnMiLCJleGlzdGluZ0NvbHVtbiIsImNvbHVtbktleSIsImNvbHVtbkZyb21Bbm5vdGF0aW9ucyIsImVuYWJsZVdyYXBwaW5nIiwiY3VzdG9tRXhwb3J0U2V0dGluZ3MiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkNvbHVtbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbnRpdHlUeXBlLCBOYXZpZ2F0aW9uUHJvcGVydHksIFByb3BlcnR5LCBQcm9wZXJ0eVBhdGggfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgRmlsdGVyRnVuY3Rpb25zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9DYXBhYmlsaXRpZXNcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5U2V0QW5ub3RhdGlvbnNfQ2FwYWJpbGl0aWVzIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9DYXBhYmlsaXRpZXNfRWRtXCI7XG5pbXBvcnQgdHlwZSB7IFNlbWFudGljS2V5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25cIjtcbmltcG9ydCB7IENvbW1vbkFubm90YXRpb25UZXJtcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uXCI7XG5pbXBvcnQgdHlwZSB7XG5cdERhdGFGaWVsZCxcblx0RGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0RGF0YUZpZWxkRm9yQW5ub3RhdGlvbixcblx0RGF0YUZpZWxkVHlwZXMsXG5cdERhdGFQb2ludCxcblx0RGF0YVBvaW50VHlwZVR5cGVzLFxuXHRGaWVsZEdyb3VwLFxuXHRMaW5lSXRlbVxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgeyBVSUFubm90YXRpb25UZXJtcywgVUlBbm5vdGF0aW9uVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiwgQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB7XG5cdEVETV9UWVBFX01BUFBJTkcsXG5cdGFuZCxcblx0Y29tcGlsZUV4cHJlc3Npb24sXG5cdGNvbnN0YW50LFxuXHRlcXVhbCxcblx0Zm9ybWF0UmVzdWx0LFxuXHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24sXG5cdGlmRWxzZSxcblx0bm90LFxuXHRvcixcblx0cGF0aEluTW9kZWxcbn0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgdHlwZSBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB0eXBlIHtcblx0QXZhaWxhYmlsaXR5VHlwZSxcblx0Q3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uLFxuXHRDdXN0b21EZWZpbmVkVGFibGVDb2x1bW5Gb3JPdmVycmlkZSxcblx0Rm9ybWF0T3B0aW9uc1R5cGUsXG5cdFRhYmxlQ29sdW1uU2V0dGluZ3MsXG5cdFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IENyZWF0aW9uTW9kZSwgSG9yaXpvbnRhbEFsaWduLCBJbXBvcnRhbmNlLCBUZW1wbGF0ZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgdHlwZSB7IFBhZ2VDb250ZXh0UGF0aFRhcmdldCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL1RlbXBsYXRlQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSB7IENvbXBsZXhQcm9wZXJ0eUluZm8gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9hbm5vdGF0aW9ucy9EYXRhRmllbGRcIjtcbmltcG9ydCB7XG5cdGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyxcblx0Y29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHksXG5cdGdldERhdGFGaWVsZERhdGFUeXBlLFxuXHRnZXRTZW1hbnRpY09iamVjdFBhdGgsXG5cdGdldFRhcmdldFZhbHVlT25EYXRhUG9pbnQsXG5cdGhhc0RhdGFQb2ludFRhcmdldCxcblx0aGFzRmllbGRHcm91cFRhcmdldCxcblx0aXNEYXRhRmllbGQsXG5cdGlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvbixcblx0aXNEYXRhRmllbGRUeXBlcyxcblx0aXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdCxcblx0aXNSYXRpbmdWaXN1YWxpemF0aW9uRnJvbURhdGFGaWVsZERlZmF1bHRcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvYW5ub3RhdGlvbnMvRGF0YUZpZWxkXCI7XG5pbXBvcnQgeyB0eXBlIFRhYmxlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9UYWJsZVwiO1xuaW1wb3J0IHsgQWdncmVnYXRpb25IZWxwZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0FnZ3JlZ2F0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYWJsZU9iamVjdCwgQ3VzdG9tRWxlbWVudCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgeyBPdmVycmlkZVR5cGUsIFBsYWNlbWVudCwgaW5zZXJ0Q3VzdG9tRWxlbWVudHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0NvbmZpZ3VyYWJsZU9iamVjdFwiO1xuaW1wb3J0IHsgaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0RhdGFGaWVsZEhlbHBlclwiO1xuaW1wb3J0IHsgSXNzdWVDYXRlZ29yeSwgSXNzdWVDYXRlZ29yeVR5cGUsIElzc3VlU2V2ZXJpdHkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0lzc3VlTWFuYWdlclwiO1xuaW1wb3J0IHsgS2V5SGVscGVyIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9LZXlcIjtcbmltcG9ydCB7IFVJIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ0hlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyByZXBsYWNlU3BlY2lhbENoYXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU3RhYmxlSWRIZWxwZXJcIjtcbmltcG9ydCAqIGFzIFR5cGVHdWFyZHMgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHtcblx0aXNBbm5vdGF0aW9uT2ZUeXBlLFxuXHRpc05hdmlnYXRpb25Qcm9wZXJ0eSxcblx0aXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdGlzUHJvcGVydHksXG5cdGlzVHlwZURlZmluaXRpb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHtcblx0ZW5oYW5jZURhdGFNb2RlbFBhdGgsXG5cdGdldENvbnRleHRQcm9wZXJ0eVJlc3RyaWN0aW9uLFxuXHRnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoLFxuXHRnZXRUYXJnZXRPYmplY3RQYXRoLFxuXHR0eXBlIERhdGFNb2RlbE9iamVjdFBhdGhcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0RGlzcGxheU1vZGUsIHR5cGUgRGlzcGxheU1vZGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EaXNwbGF5TW9kZUZvcm1hdHRlclwiO1xuaW1wb3J0IHsgZ2V0UmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLCB0eXBlIFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0VudGl0eVNldEhlbHBlclwiO1xuaW1wb3J0IHsgaGFzRmllbGRDb250cm9sTm90TWFuZGF0b3J5LCBpc1N0YXRpY2FsbHlNYW5kYXRvcnkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9GaWVsZENvbnRyb2xIZWxwZXJcIjtcbmltcG9ydCB7XG5cdGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eVBhdGgsXG5cdGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoLFxuXHRnZXRBc3NvY2lhdGVkVGltZXpvbmVQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgsXG5cdGdldFN0YXRpY1RpbWV6b25lLFxuXHRnZXRTdGF0aWNVbml0T3JDdXJyZW5jeSxcblx0aXNUaW1lem9uZVxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHsgaXNNdWx0aVZhbHVlRmllbGQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9VSUZvcm1hdHRlcnNcIjtcbmltcG9ydCB0eXBlIHsgRGVmYXVsdFR5cGVGb3JFZG1UeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3R5cGUvRURNXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlc3RyaWN0ZWQtaW1wb3J0c1xuaW1wb3J0IHRhYmxlRm9ybWF0dGVycyBmcm9tIFwic2FwL2ZlL21hY3Jvcy9mb3JtYXR0ZXJzL1RhYmxlRm9ybWF0dGVyXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSB7IE1EQ1RhYmxlUHJvcGVydHlJbmZvIGFzIFByb3BlcnR5SW5mbywgVmlzdWFsU2V0dGluZ3MgfSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuXG4vLyBDdXN0b20gQ29sdW1uIGZyb20gTWFuaWZlc3RcbnR5cGUgTWFuaWZlc3REZWZpbmVkQ3VzdG9tQ29sdW1uID0gQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uICYge1xuXHR0eXBlPzogQ29sdW1uVHlwZS5EZWZhdWx0O1xufTtcblxuLy8gU2xvdCBDb2x1bW4gZnJvbSBCdWlsZGluZyBCbG9ja1xudHlwZSBGcmFnbWVudERlZmluZWRTbG90Q29sdW1uID0gQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uICYge1xuXHR0eXBlOiBDb2x1bW5UeXBlLlNsb3Q7XG59O1xuLy8gUHJvcGVydGllcyBhbGwgQ29sdW1uVHlwZXMgaGF2ZTpcbnR5cGUgQmFzZVRhYmxlQ29sdW1uID0gQ29uZmlndXJhYmxlT2JqZWN0ICYge1xuXHR0eXBlOiBDb2x1bW5UeXBlOyAvL09yaWdpbiBvZiB0aGUgc291cmNlIHdoZXJlIHdlIGFyZSBnZXR0aW5nIHRoZSB0ZW1wbGF0ZWQgaW5mb3JtYXRpb24gZnJvbVxuXHR3aWR0aD86IHN0cmluZztcblx0d2lkdGhJbmNsdWRpbmdDb2x1bW5IZWFkZXI/OiBib29sZWFuO1xuXHRpbXBvcnRhbmNlPzogSW1wb3J0YW5jZTtcblx0aG9yaXpvbnRhbEFsaWduPzogSG9yaXpvbnRhbEFsaWduO1xuXHRhdmFpbGFiaWxpdHk/OiBBdmFpbGFiaWxpdHlUeXBlO1xuXHRpc05hdmlnYWJsZT86IGJvb2xlYW47XG5cdGNhc2VTZW5zaXRpdmU/OiBib29sZWFuO1xuXHRsYWJlbD86IHN0cmluZztcblx0dG9vbHRpcD86IHN0cmluZztcbn07XG5cbi8vIFByb3BlcnRpZXMgb24gQ3VzdG9tIENvbHVtbnMgYW5kIFNsb3QgQ29sdW1uc1xuZXhwb3J0IHR5cGUgQ3VzdG9tQmFzZWRUYWJsZUNvbHVtbiA9IEJhc2VUYWJsZUNvbHVtbiAmIHtcblx0aWQ6IHN0cmluZztcblx0bmFtZTogc3RyaW5nO1xuXHRoZWFkZXI/OiBzdHJpbmc7XG5cdHRlbXBsYXRlOiBzdHJpbmcgfCBDb250cm9sO1xuXHRwcm9wZXJ0eUluZm9zPzogc3RyaW5nW107XG5cdGV4cG9ydFNldHRpbmdzPzogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCBudWxsO1xuXHRmb3JtYXRPcHRpb25zOiBGb3JtYXRPcHRpb25zVHlwZTtcblx0aXNHcm91cGFibGU6IGJvb2xlYW47XG5cdGlzTmF2aWdhYmxlOiBib29sZWFuO1xuXHRzb3J0YWJsZTogYm9vbGVhbjtcblx0dmlzdWFsU2V0dGluZ3M6IHsgd2lkdGhDYWxjdWxhdGlvbjogbnVsbCB9O1xuXHRwcm9wZXJ0aWVzPzogc3RyaW5nW107XG5cdHJlcXVpcmVkPzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG59O1xuXG5leHBvcnQgdHlwZSBDb21wdXRlZFRhYmxlQ29sdW1uID0gQmFzZVRhYmxlQ29sdW1uICYge1xuXHRuYW1lOiBzdHJpbmc7XG5cdGxhYmVsOiBzdHJpbmc7XG5cdHByb3BlcnR5S2V5OiBzdHJpbmc7XG5cdGlzRHJhZnRJbmRpY2F0b3I/OiBib29sZWFuO1xuXHRpc1NpdHVhdGlvbnNJbmRpY2F0b3I/OiBib29sZWFuO1xuXHRmb3JtYXRPcHRpb25zPzogRm9ybWF0T3B0aW9uc1R5cGUgfCBudWxsO1xuXHRwcm9wZXJ0eUluZm9zPzogc3RyaW5nW107XG5cdGV4cG9ydFNldHRpbmdzPzogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCBudWxsO1xuXHRjbGlwYm9hcmRTZXR0aW5ncz86IE9iamVjdCB8IG51bGw7XG5cdHJlcXVpcmVkPzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG59O1xuXG4vLyBQcm9wZXJ0aWVzIGRlcml2ZWQgZnJvbSBNYW5pZmVzdCB0byBvdmVycmlkZSBBbm5vdGF0aW9uIGNvbmZpZ3VyYXRpb25zXG50eXBlIEFubm90YXRpb25UYWJsZUNvbHVtbkZvck92ZXJyaWRlID0gQmFzZVRhYmxlQ29sdW1uICYge1xuXHRzZXR0aW5ncz86IFRhYmxlQ29sdW1uU2V0dGluZ3M7XG5cdGZvcm1hdE9wdGlvbnM/OiBGb3JtYXRPcHRpb25zVHlwZTtcblx0ZXhwb3J0U2V0dGluZ3M/OiBDb2x1bW5FeHBvcnRTZXR0aW5ncyB8IG51bGw7XG59O1xuXG50eXBlIFByb3BlcnR5VHlwZUNvbnN0cmFpbnRzID0gUGFydGlhbDx7XG5cdHNjYWxlOiBudW1iZXI7XG5cdHByZWNpc2lvbjogbnVtYmVyO1xuXHRtYXhMZW5ndGg6IG51bWJlcjtcblx0bnVsbGFibGU6IGJvb2xlYW47XG5cdG1pbmltdW06IHN0cmluZztcblx0bWF4aW11bTogc3RyaW5nO1xuXHRpc0RpZ2l0U2VxdWVuY2U6IGJvb2xlYW47XG59PjtcblxuZXhwb3J0IHR5cGUgUHJvcGVydHlUeXBlRm9ybWF0T3B0aW9ucyA9IFBhcnRpYWw8e1xuXHRwYXJzZUFzU3RyaW5nOiBib29sZWFuO1xuXHRlbXB0eVN0cmluZzogc3RyaW5nO1xuXHRwYXJzZUtlZXBzRW1wdHlTdHJpbmc6IGJvb2xlYW47XG5cdHN0eWxlOiBzdHJpbmc7XG59PjtcblxuZXhwb3J0IHR5cGUgUHJvcGVydHlUeXBlQ29uZmlnID0ge1xuXHR0eXBlPzogc3RyaW5nO1xuXHRjb25zdHJhaW50czogUHJvcGVydHlUeXBlQ29uc3RyYWludHM7XG5cdGZvcm1hdE9wdGlvbnM6IFByb3BlcnR5VHlwZUZvcm1hdE9wdGlvbnM7XG5cdHR5cGVJbnN0YW5jZT86IHVua25vd247XG5cdGJhc2VUeXBlPzogc3RyaW5nO1xuXHRjbGFzc05hbWU/OiBrZXlvZiB0eXBlb2YgRGVmYXVsdFR5cGVGb3JFZG1UeXBlO1xufTtcblxuZXhwb3J0IHR5cGUgQ29sdW1uRXhwb3J0U2V0dGluZ3MgPSBQcm9wZXJ0eUluZm9bXCJleHBvcnRTZXR0aW5nc1wiXSAmIHtcblx0ZGF0YVBvaW50VGFyZ2V0VmFsdWU/OiBzdHJpbmc7XG5cdGlzQ3VycmVuY3k/OiBib29sZWFuO1xufTtcblxuLy8gUHJvcGVydGllcyBmb3IgQW5ub3RhdGlvbiBDb2x1bW5zXG5leHBvcnQgdHlwZSBBbm5vdGF0aW9uVGFibGVDb2x1bW4gPSBQcm9wZXJ0eUluZm8gJlxuXHRBbm5vdGF0aW9uVGFibGVDb2x1bW5Gb3JPdmVycmlkZSAmIHtcblx0XHRuYW1lOiBzdHJpbmc7XG5cdFx0YW5ub3RhdGlvblBhdGg6IHN0cmluZztcblx0XHRyZWxhdGl2ZVBhdGg6IHN0cmluZztcblx0XHR0b29sdGlwPzogc3RyaW5nO1xuXHRcdGdyb3VwTGFiZWw/OiBzdHJpbmc7XG5cdFx0Z3JvdXA/OiBzdHJpbmc7XG5cdFx0RmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zPzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG5cdFx0c2hvd0RhdGFGaWVsZHNMYWJlbD86IGJvb2xlYW47XG5cdFx0cmVxdWlyZWQ/OiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0XHRpc0dyb3VwYWJsZT86IGJvb2xlYW47XG5cdFx0dW5pdFRleHQ/OiBzdHJpbmc7XG5cdFx0dGltZXpvbmVUZXh0Pzogc3RyaW5nO1xuXHRcdHRpbWV6b25lPzogc3RyaW5nO1xuXHRcdHNlbWFudGljT2JqZWN0UGF0aD86IHN0cmluZztcblx0XHR0ZXh0QXJyYW5nZW1lbnQ/OiB7XG5cdFx0XHR0ZXh0UHJvcGVydHk6IHN0cmluZztcblx0XHRcdG1vZGU6IERpc3BsYXlNb2RlO1xuXHRcdH07XG5cdFx0YWRkaXRpb25hbFByb3BlcnR5SW5mb3M/OiBzdHJpbmdbXTtcblx0XHR0eXBlQ29uZmlnPzogUHJvcGVydHlUeXBlQ29uZmlnO1xuXHRcdGlzUGFydE9mTGluZUl0ZW0/OiBib29sZWFuOyAvLyB0ZW1wb3JhcnkgaW5kaWNhdG9yIHRvIG9ubHkgYWxsb3cgZmlsdGVyaW5nIG9uIG5hdmlnYXRpb24gcHJvcGVydGllcyB3aGVuIHRoZXkncmUgcGFydCBvZiBhIGxpbmUgaXRlbVxuXHRcdGlzUGFydE9mQ3VzdG9tQ29sdW1uPzogYm9vbGVhbjtcblx0XHRhZGRpdGlvbmFsTGFiZWxzPzogc3RyaW5nW107XG5cdFx0ZXhwb3J0RGF0YVBvaW50VGFyZ2V0VmFsdWU/OiBzdHJpbmc7XG5cdFx0ZXh0ZW5zaW9uPzogRXh0ZW5zaW9uRm9yQW5hbHl0aWNzO1xuXHRcdGlzTXVsdGlWYWx1ZT86IGJvb2xlYW47XG5cdFx0ZGVzY3JpcHRpb25Qcm9wZXJ0eT86IHN0cmluZztcblx0XHRtb2RlPzogRGlzcGxheU1vZGU7XG5cdFx0dmFsdWVQcm9wZXJ0eT86IHN0cmluZztcblx0fTtcblxuZXhwb3J0IHR5cGUgRXh0ZW5zaW9uRm9yQW5hbHl0aWNzID0gUHJvcGVydHlJbmZvW1wiZXh0ZW5zaW9uXCJdICYge1xuXHRhZGRpdGlvbmFsUHJvcGVydGllcz86IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IHR5cGUgVGFibGVDb2x1bW4gPSBDdXN0b21CYXNlZFRhYmxlQ29sdW1uIHwgQW5ub3RhdGlvblRhYmxlQ29sdW1uIHwgQ29tcHV0ZWRUYWJsZUNvbHVtbjtcblxudHlwZSBNYW5pZmVzdENvbHVtbiA9IEN1c3RvbUVsZW1lbnQ8Q3VzdG9tQmFzZWRUYWJsZUNvbHVtbiB8IEFubm90YXRpb25UYWJsZUNvbHVtbkZvck92ZXJyaWRlPjtcblxuZXhwb3J0IGVudW0gQ29sdW1uVHlwZSB7XG5cdERlZmF1bHQgPSBcIkRlZmF1bHRcIiwgLy8gRGVmYXVsdCBUeXBlIChDdXN0b20gQ29sdW1uKVxuXHRBbm5vdGF0aW9uID0gXCJBbm5vdGF0aW9uXCIsXG5cdFNsb3QgPSBcIlNsb3RcIixcblx0Q29tcHV0ZWQgPSBcIkNvbXB1dGVkXCJcbn1cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgY29sdW1ucywgYW5ub3RhdGlvbi1iYXNlZCBhcyB3ZWxsIGFzIG1hbmlmZXN0LWJhc2VkLlxuICogVGhleSBhcmUgc29ydGVkIGFuZCBzb21lIHByb3BlcnRpZXMgY2FuIGJlIG92ZXJ3cml0dGVuIHZpYSB0aGUgbWFuaWZlc3QgKGNoZWNrIG91dCB0aGUga2V5cyB0aGF0IGNhbiBiZSBvdmVyd3JpdHRlbikuXG4gKiBAcGFyYW0gbGluZUl0ZW1Bbm5vdGF0aW9uIENvbGxlY3Rpb24gb2YgZGF0YSBmaWVsZHMgZm9yIHJlcHJlc2VudGF0aW9uIGluIGEgdGFibGUgb3IgbGlzdFxuICogQHBhcmFtIHRhYmxlVHlwZSBUaGUgdHlwZSBvZiB0aGUgdGFibGVcbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIFJldHVybnMgYWxsIHRhYmxlIGNvbHVtbnMgdGhhdCBzaG91bGQgYmUgYXZhaWxhYmxlLCByZWdhcmRsZXNzIG9mIHRlbXBsYXRpbmcgb3IgcGVyc29uYWxpemF0aW9uIG9yIHRoZWlyIG9yaWdpblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFibGVDb2x1bW5zKFxuXHRsaW5lSXRlbUFubm90YXRpb246IExpbmVJdGVtLFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBUYWJsZUNvbHVtbltdIHtcblx0Y29uc3QgYW5ub3RhdGlvbkNvbHVtbnMgPSBnZXRDb2x1bW5zRnJvbUFubm90YXRpb25zKGxpbmVJdGVtQW5ub3RhdGlvbiwgdGFibGVUeXBlLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IG1hbmlmZXN0Q29sdW1ucyA9IGdldENvbHVtbnNGcm9tTWFuaWZlc3QoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uPFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uPih2aXN1YWxpemF0aW9uUGF0aCkuY29sdW1ucyA/PyB7fSxcblx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKVxuXHQpO1xuXG5cdGNvbnN0IHRhYmxlQ29sdW1uczogVGFibGVDb2x1bW5bXSA9IGluc2VydEN1c3RvbUVsZW1lbnRzKFxuXHRcdGFubm90YXRpb25Db2x1bW5zIGFzIFRhYmxlQ29sdW1uW10sXG5cdFx0bWFuaWZlc3RDb2x1bW5zIGFzIFJlY29yZDxzdHJpbmcsIEN1c3RvbUVsZW1lbnQ8VGFibGVDb2x1bW4+Pixcblx0XHR7XG5cdFx0XHR3aWR0aDogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdHdpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdFx0aW1wb3J0YW5jZTogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdGhvcml6b250YWxBbGlnbjogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdGF2YWlsYWJpbGl0eTogT3ZlcnJpZGVUeXBlLm92ZXJ3cml0ZSxcblx0XHRcdGlzTmF2aWdhYmxlOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdFx0c2V0dGluZ3M6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGUsXG5cdFx0XHRmb3JtYXRPcHRpb25zOiBPdmVycmlkZVR5cGUub3ZlcndyaXRlLFxuXHRcdFx0ZXhwb3J0U2V0dGluZ3M6IE92ZXJyaWRlVHlwZS5vdmVyd3JpdGVcblx0XHR9XG5cdCk7XG5cblx0cmV0dXJuIGFkZENvbXB1dGVkQ29sdW1ucyh0YWJsZUNvbHVtbnMsIHRhYmxlVHlwZSwgdmlzdWFsaXphdGlvblBhdGgsIGNvbnZlcnRlckNvbnRleHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZENvbHVtbkJ5UGF0aChwYXRoOiBzdHJpbmcsIHRhYmxlQ29sdW1uczogVGFibGVDb2x1bW5bXSk6IFRhYmxlQ29sdW1uIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIHRhYmxlQ29sdW1ucy5maW5kKChjb2x1bW4pID0+IHtcblx0XHRjb25zdCBhbm5vdGF0aW9uQ29sdW1uID0gY29sdW1uIGFzIEFubm90YXRpb25UYWJsZUNvbHVtbjtcblx0XHRyZXR1cm4gYW5ub3RhdGlvbkNvbHVtbi5wcm9wZXJ0eUluZm9zID09PSB1bmRlZmluZWQgJiYgYW5ub3RhdGlvbkNvbHVtbi5yZWxhdGl2ZVBhdGggPT09IHBhdGg7XG5cdH0pO1xufVxuXG4vKipcbiAqIFNldHMgdGhlICd1bml0JywgJ3RleHRBcnJhbmdlbWVudCcsICd0aW1lem9uZScgYW5kICdleHBvcnRzZXR0aW5ncycgcHJvcGVydGllcyBpbiBjb2x1bW5zIHdoZW4gbmVjZXNzYXJ5LlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHRhYmxlQ29sdW1ucyBUaGUgY29sdW1ucyB0byBiZSB1cGRhdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsIHRhYmxlQ29sdW1uczogVGFibGVDb2x1bW5bXSk6IHZvaWQge1xuXHRjb25zdCBkYXRhTW9kZWxPYmplY3RQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZXJDb250ZXh0Rm9yKGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKSkuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHR0YWJsZUNvbHVtbnMuZm9yRWFjaCgob0NvbHVtbikgPT4ge1xuXHRcdGNvbnN0IHRhYmxlQ29sdW1uID0gb0NvbHVtbiBhcyBBbm5vdGF0aW9uVGFibGVDb2x1bW47XG5cdFx0aWYgKHRhYmxlQ29sdW1uLnByb3BlcnR5SW5mb3MgPT09IHVuZGVmaW5lZCAmJiB0YWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGgpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFByb3BlcnR5PihkYXRhTW9kZWxPYmplY3RQYXRoLCB0YWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGgpO1xuXHRcdFx0Y29uc3QgcHJvcGVydHkgPSBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0O1xuXHRcdFx0aWYgKHByb3BlcnR5KSB7XG5cdFx0XHRcdGFkZEN1cnJlbmN5T3JVb01Ub1Byb3BlcnR5KHByb3BlcnR5LCBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsIHRhYmxlQ29sdW1ucywgdGFibGVDb2x1bW4pO1xuXHRcdFx0XHRjb25zdCB0aW1lem9uZVByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHkocHJvcGVydHkpO1xuXHRcdFx0XHRjb25zdCB0aW1lem9uZSA9IHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UaW1lem9uZTtcblx0XHRcdFx0aWYgKHRpbWV6b25lUHJvcGVydHkpIHtcblx0XHRcdFx0XHRjb25zdCBvVGltZXpvbmVDb2x1bW4gPSBmaW5kQ29sdW1uQnlQYXRoKHRpbWV6b25lUHJvcGVydHkubmFtZSwgdGFibGVDb2x1bW5zKTtcblx0XHRcdFx0XHR0YWJsZUNvbHVtbi50aW1lem9uZSA9IG9UaW1lem9uZUNvbHVtbj8ubmFtZTtcblx0XHRcdFx0fSBlbHNlIGlmICh0aW1lem9uZSkge1xuXHRcdFx0XHRcdHRhYmxlQ29sdW1uLnRpbWV6b25lVGV4dCA9IHRpbWV6b25lLnRvU3RyaW5nKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YWRkVGV4dEFycmFuZ2VudEluZm9Ub1Byb3BlcnR5KHByb3BlcnR5LCBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsIHRhYmxlQ29sdW1ucywgdGFibGVDb2x1bW4pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59XG5cbi8qKlxuICogQWRkcyB0aGUgXCJ1bml0XCIgcHJvcGVydHkgaW50byB0aGUgY29sdW1ucyB3aGVuIG5lY2Nlc2FyeSBmb3IgY29sdW1ucyB3aXRoIHVuaXQgb2YgbWVhc3VyZSBhbmQgY3VycmVuY2llcy5cbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgcmVmZXJlbmNlZCBvbiB0aGUgY29sdW1uXG4gKiBAcGFyYW0gcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIFRoZSBwcm9wZXJ0eSBEYXRhTW9kZWxPYmplY3RQYXRoLlxuICogQHBhcmFtIHRhYmxlQ29sdW1ucyBUaGUgbGlzdCBvZiBjb2x1bW5zIGRpc3BsYXllZCBvbiB0aGUgdGFibGVcbiAqIEBwYXJhbSB0YWJsZUNvbHVtbiBUaGUgdGFibGUgY29sdW1uIHdoaWNoIGFkZHMgdGhlIGN1cnJlbmN5IG9yIHVuaXRcbiAqL1xuZnVuY3Rpb24gYWRkQ3VycmVuY3lPclVvTVRvUHJvcGVydHkoXG5cdHByb3BlcnR5OiBQcm9wZXJ0eSxcblx0cHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pixcblx0dGFibGVDb2x1bW5zOiBUYWJsZUNvbHVtbltdLFxuXHR0YWJsZUNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uXG4pOiB2b2lkIHtcblx0Y29uc3QgY3VycmVuY3lPclVvTVByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoKHByb3BlcnR5KSB8fCBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5UGF0aChwcm9wZXJ0eSk7XG5cdGlmIChjdXJyZW5jeU9yVW9NUHJvcGVydHkpIHtcblx0XHRjb25zdCBjdXJyZW5jeU9yVW9NUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8UHJvcGVydHk+KHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCwgY3VycmVuY3lPclVvTVByb3BlcnR5KTtcblx0XHRjb25zdCBjdXJyZW5jeU9yVW9NUmVsYXRpdmVQYXRoID0gZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aChjdXJyZW5jeU9yVW9NUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoKTtcblx0XHRpZiAoY3VycmVuY3lPclVvTVJlbGF0aXZlUGF0aCkge1xuXHRcdFx0Y29uc3QgdW5pdENvbHVtbiA9IGZpbmRDb2x1bW5CeVBhdGgoY3VycmVuY3lPclVvTVJlbGF0aXZlUGF0aCwgdGFibGVDb2x1bW5zKTtcblx0XHRcdHRhYmxlQ29sdW1uLnVuaXQgPSB1bml0Q29sdW1uPy5uYW1lO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRjb25zdCB1bml0ID0gcHJvcGVydHk/LmFubm90YXRpb25zPy5NZWFzdXJlcz8uSVNPQ3VycmVuY3kgfHwgcHJvcGVydHk/LmFubm90YXRpb25zPy5NZWFzdXJlcz8uVW5pdDtcblx0XHRpZiAodW5pdCkge1xuXHRcdFx0dGFibGVDb2x1bW4udW5pdFRleHQgPSBgJHt1bml0fWA7XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogQWRkIHRoZSBcInRleHRBcnJhbmdlbWVudFwiIG9iamVjdCB0byBjb2x1bW5zIHdoZW4gbmVjZXNzYXJ5IGZvciBjb2x1bW5zIGNvbnRhaW5pbmcgdGV4dCwgc3VjaCBhcyBkZXNjcmlwdGlvbnMuXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHJlZmVyZW5jZWQgYnkgdGhlIGNvbHVtblxuICogQHBhcmFtIHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCBUaGUgcHJvcGVydHkgRGF0YU1vZGVsT2JqZWN0UGF0aC5cbiAqIEBwYXJhbSB0YWJsZUNvbHVtbnMgVGhlIGxpc3Qgb2YgY29sdW1ucyBkaXNwbGF5ZWQgb24gdGhlIHRhYmxlXG4gKiBAcGFyYW0gdGFibGVDb2x1bW4gVGhlIHRhYmxlIGNvbHVtbiB3aGljaCBhZGRzIHRoZSB0ZXh0XG4gKi9cbmZ1bmN0aW9uIGFkZFRleHRBcnJhbmdlbnRJbmZvVG9Qcm9wZXJ0eShcblx0cHJvcGVydHk6IFByb3BlcnR5LFxuXHRwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+LFxuXHR0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdHRhYmxlQ29sdW1uOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5cbik6IHZvaWQge1xuXHRjb25zdCBkaXNwbGF5TW9kZSA9IGdldERpc3BsYXlNb2RlKHByb3BlcnR5KSxcblx0XHR0ZXh0UHJvcGVydHlQYXRoID0gZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgocHJvcGVydHkpO1xuXHRpZiAodGV4dFByb3BlcnR5UGF0aCAmJiBkaXNwbGF5TW9kZSAhPT0gXCJWYWx1ZVwiKSB7XG5cdFx0Y29uc3QgdGV4dFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFByb3BlcnR5Pihwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsIHRleHRQcm9wZXJ0eVBhdGgpO1xuXHRcdGNvbnN0IHRleHRSZWxhdGl2ZVBhdGggPSBnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoKHRleHRQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRcdGlmICh0ZXh0UmVsYXRpdmVQYXRoKSB7XG5cdFx0XHRjb25zdCB0ZXh0Q29sdW1uID0gZmluZENvbHVtbkJ5UGF0aCh0ZXh0UmVsYXRpdmVQYXRoLCB0YWJsZUNvbHVtbnMpO1xuXHRcdFx0aWYgKHRleHRDb2x1bW4gJiYgdGV4dENvbHVtbi5uYW1lICE9PSB0YWJsZUNvbHVtbi5uYW1lKSB7XG5cdFx0XHRcdHRhYmxlQ29sdW1uLnRleHRBcnJhbmdlbWVudCA9IHtcblx0XHRcdFx0XHR0ZXh0UHJvcGVydHk6IHRleHRDb2x1bW4ubmFtZSxcblx0XHRcdFx0XHRtb2RlOiBkaXNwbGF5TW9kZVxuXHRcdFx0XHR9O1xuXHRcdFx0XHQvLyBJZiB0ZXh0IHByb3BlcnRpZXMgYXJlIHVzZWQgYnV0IGhpZGRlbiwgd2UgbXVzdCBpbmNsdWRlIHRoZW0gdG8gdGhlIGV4cG9ydCBhcyB0aGVyZSBhcmUgdXNlZCBpbiB0aGUgcGFzdGVcblx0XHRcdFx0aWYgKCF0ZXh0Q29sdW1uLmV4cG9ydFNldHRpbmdzKSB7XG5cdFx0XHRcdFx0dGV4dENvbHVtbi5leHBvcnRTZXR0aW5ncyA9IHsgdHlwZTogXCJTdHJpbmdcIiB9O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGNvbHVtbnMgZnJvbSB0aGUgZW50aXR5VHlwZS5cbiAqIEBwYXJhbSBjb2x1bW5zVG9CZUNyZWF0ZWQgVGhlIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB0YXJnZXQgZW50aXR5IHR5cGUuXG4gKiBAcGFyYW0gYW5ub3RhdGlvbkNvbHVtbnMgVGhlIGFycmF5IG9mIGNvbHVtbnMgY3JlYXRlZCBiYXNlZCBvbiBMaW5lSXRlbSBhbm5vdGF0aW9ucy5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGhlIHRhYmxlIHR5cGUuXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHRhYmxlLlxuICogQHBhcmFtIGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAgVGhlIG1hcCBvZiBwcm9wZXJ0aWVzIHJlZmVyZW5jZWQgYXMgZGVzY3JpcHRpb24gb24gYSB0ZXh0IGFycmFuZ2VtZW50IGFubm90YXRpb24uXG4gKiBAcGFyYW0gcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIFRoZSBleGlzdGluZyByZXN0cmljdGlvbnMgb24gcHJvcGVydGllc1xuICogQHJldHVybnMgVGhlIGNvbHVtbiBmcm9tIHRoZSBlbnRpdHlUeXBlXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb2x1bW5zRnJvbUVudGl0eVR5cGUgPSBmdW5jdGlvbiAoXG5cdGNvbHVtbnNUb0JlQ3JlYXRlZDogUmVjb3JkPHN0cmluZywgUHJvcGVydHk+LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdHRhYmxlQ3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUsXG5cdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXA6IFJlY29yZDxzdHJpbmcsIERpc3BsYXlNb2RlPixcblx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzPzogUmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzXG4pOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSB7XG5cdGlmIChhbm5vdGF0aW9uQ29sdW1ucyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0YW5ub3RhdGlvbkNvbHVtbnMgPSBbXTtcblx0fVxuXG5cdGxldCBwcm9wZXJ0aWVzTm90VG9CZUNvbnNpZGVyZWQ6IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBncm91cGFibGVQcm9wZXJ0aWVzID0gYWdncmVnYXRpb25IZWxwZXIuZ2V0R3JvdXBhYmxlUHJvcGVydGllcygpO1xuXHQvL0ZvciBBbmFseXRpY2FsIHRhYmxlLCB3ZSBleGNsdWRlIGFsbCBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5vdCBncm91cGFibGUgYW5kIHVzZWQgYXMgVGV4dCBpbiBhIGdyb3VwYWJsZSBQcm9wZXJ0eS5cblx0aWYgKHRhYmxlVHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIiAmJiBhZ2dyZWdhdGlvbkhlbHBlci5pc0FuYWx5dGljc1N1cHBvcnRlZCgpICYmIGdyb3VwYWJsZVByb3BlcnRpZXMpIHtcblx0XHRwcm9wZXJ0aWVzTm90VG9CZUNvbnNpZGVyZWQgPSBncm91cGFibGVQcm9wZXJ0aWVzXG5cdFx0XHQubWFwKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkuJHRhcmdldClcblx0XHRcdC5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0ICE9PSB1bmRlZmluZWQpXG5cdFx0XHQubWFwKCh0YXJnZXQpID0+IGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHkodGFyZ2V0IGFzIFByb3BlcnR5KSlcblx0XHRcdC5maWx0ZXIoKHRleHRQcm9wKSA9PiB0ZXh0UHJvcCAmJiAhYWdncmVnYXRpb25IZWxwZXIuaXNQcm9wZXJ0eUdyb3VwYWJsZSh0ZXh0UHJvcCkpXG5cdFx0XHQubWFwKChwcm9wKSA9PiBwcm9wPy5uYW1lKVxuXHRcdFx0LmZpbHRlcigobmFtZSkgPT4gbmFtZSAhPT0gdW5kZWZpbmVkKSBhcyBzdHJpbmdbXTtcblx0fVxuXHRlbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHk6IFByb3BlcnR5KSA9PiB7XG5cdFx0Ly8gQ2F0Y2ggYWxyZWFkeSBleGlzdGluZyBjb2x1bW5zIC0gd2hpY2ggd2VyZSBhZGRlZCBiZWZvcmUgYnkgTGluZUl0ZW0gQW5ub3RhdGlvbnNcblx0XHRjb25zdCBleGlzdHMgPSBhbm5vdGF0aW9uQ29sdW1ucy5zb21lKChjb2x1bW4pID0+IHtcblx0XHRcdHJldHVybiBjb2x1bW4ubmFtZSA9PT0gcHJvcGVydHkubmFtZTtcblx0XHR9KTtcblx0XHQvLyBpZiB0YXJnZXQgdHlwZSBleGlzdHMsIGl0IGlzIGEgY29tcGxleCBwcm9wZXJ0eSBhbmQgc2hvdWxkIGJlIGlnbm9yZWRcblx0XHRpZiAoIXByb3BlcnR5LnRhcmdldFR5cGUgJiYgIWV4aXN0cyAmJiAhcHJvcGVydGllc05vdFRvQmVDb25zaWRlcmVkLmluY2x1ZGVzKHByb3BlcnR5Lm5hbWUpKSB7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm8gPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMoXG5cdFx0XHRcdHByb3BlcnR5Lm5hbWUsXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHR0YWJsZVR5cGVcblx0XHRcdCk7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBhZGRpdGlvbmFsUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXMpO1xuXHRcdFx0Ly8gSW5jbHVkZSB0aGUgdGV4dCBwcm9wZXJ0aWVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHRleHQgYXJyYW5nZW1lbnRcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmZvckVhY2goKG5hbWUpID0+IHtcblx0XHRcdFx0YWRkUHJvcGVydHlUb0Rpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAoZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCwgcmVsYXRlZFByb3BlcnRpZXNJbmZvLCBuYW1lKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRjb25zdCBjb2x1bW5JbmZvID0gZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eShcblx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChwcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRwcm9wZXJ0eS5uYW1lLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCxcblx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHRcdFx0XHR0YWJsZUNyZWF0aW9uTW9kZSxcblx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXNJbmZvXG5cdFx0XHQpO1xuXHRcdFx0aWYgKHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Y29sdW1uSW5mby5wcm9wZXJ0eUluZm9zID0gcmVsYXRlZFByb3BlcnR5TmFtZXM7XG5cdFx0XHRcdGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3MuZGF0YVBvaW50VGFyZ2V0VmFsdWUpIHtcblx0XHRcdFx0XHRjb2x1bW5JbmZvLmV4cG9ydERhdGFQb2ludFRhcmdldFZhbHVlID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFNldHRpbmdzLmRhdGFQb2ludFRhcmdldFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIENvbGxlY3QgaW5mb3JtYXRpb24gb2YgcmVsYXRlZCBjb2x1bW5zIHRvIGJlIGNyZWF0ZWQuXG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmZvckVhY2goKG5hbWUpID0+IHtcblx0XHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbbmFtZV0gPSByZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1tuYW1lXS5hbm5vdGF0aW9uUHJvcGVydHk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0Ly8gdXBkYXRlIFByb3BlcnR5IExhYmVsIHdoZW4gaXQncyByZWZlcmVuY2VkIG9ubHkgb25jZSBpbiBhIGNvbHVtbiwgbmV3IGxhYmVsIHdpbGwgYmUgdGhlIGxhYmVsIG9mIHRoZSBjb2x1bW5cblx0XHRcdHVwZGF0ZVByb3BlcnR5TGFiZWwoYW5ub3RhdGlvbkNvbHVtbnMsIGNvbHVtbnNUb0JlQ3JlYXRlZCwgY29sdW1uSW5mbyk7XG5cdFx0XHRpZiAoYWRkaXRpb25hbFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb2x1bW5JbmZvLmFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zID0gYWRkaXRpb25hbFByb3BlcnR5TmFtZXM7XG5cdFx0XHRcdC8vIENyZWF0ZSBjb2x1bW5zIGZvciBhZGRpdGlvbmFsIHByb3BlcnRpZXMgaWRlbnRpZmllZCBmb3IgQUxQIHVzZSBjYXNlLlxuXHRcdFx0XHRhZGRpdGlvbmFsUHJvcGVydHlOYW1lcy5mb3JFYWNoKChhZGRpdGlvbmFsUHJvcGVydHlOYW1lKSA9PiB7XG5cdFx0XHRcdFx0Ly8gSW50ZW50aW9uYWwgb3ZlcndyaXRlIGFzIHdlIHJlcXVpcmUgb25seSBvbmUgbmV3IFByb3BlcnR5SW5mbyBmb3IgYSByZWxhdGVkIFByb3BlcnR5LlxuXHRcdFx0XHRcdGNvbHVtbnNUb0JlQ3JlYXRlZFthZGRpdGlvbmFsUHJvcGVydHlOYW1lXSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5hZGRpdGlvbmFsUHJvcGVydGllc1thZGRpdGlvbmFsUHJvcGVydHlOYW1lXTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRhbm5vdGF0aW9uQ29sdW1ucy5wdXNoKGNvbHVtbkluZm8pO1xuXHRcdH1cblx0XHQvLyBJbiBjYXNlIGEgcHJvcGVydHkgaGFzIGRlZmluZWQgYSAjVGV4dE9ubHkgdGV4dCBhcnJhbmdlbWVudCB0aGF0IHBvaW50cyB0byBhIHRleHQgcHJvcGVydHkgKGFuZCBub3QgYSAnaGFyZCBjb2RlZCB0ZXh0JykgZG9uJ3Qgb25seSBjcmVhdGUgdGhlIGNvbXBsZXggcHJvcGVydHkgd2l0aCB0aGUgdGV4dCBwcm9wZXJ0eSBhcyBhIGNoaWxkIHByb3BlcnR5LFxuXHRcdC8vIGJ1dCBhbHNvIHRoZSBwcm9wZXJ0eSBpdHNlbGYgYXMgaXQgY2FuIGJlIHVzZWQgYXMgd2l0aGluIHRoZSBzb3J0Q29uZGl0aW9ucyBvciBvbiBjdXN0b20gY29sdW1ucy5cblx0XHQvLyBUaGlzIHN0ZXAgbXVzdCBiZSB2YWxpZCBhbHNvIGZyb20gdGhlIGNvbHVtbnMgYWRkZWQgdmlhIExpbmVJdGVtcyBvciBmcm9tIGEgY29sdW1uIGF2YWlsYWJsZSBvbiB0aGUgcDEzbi5cblx0XHRpZiAoZ2V0RGlzcGxheU1vZGUocHJvcGVydHkpID09PSBcIkRlc2NyaXB0aW9uXCIpIHtcblx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcz8ubm9uU29ydGFibGVQcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkubmFtZSk7XG5cdFx0XHRpZiAoaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24ocHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb24/LlRleHQpKSB7XG5cdFx0XHRcdGFubm90YXRpb25Db2x1bW5zLnB1c2goXG5cdFx0XHRcdFx0Z2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eShcblx0XHRcdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKHByb3BlcnR5LmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eS5uYW1lLFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRcdGFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAsXG5cdFx0XHRcdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXMsXG5cdFx0XHRcdFx0XHR0YWJsZUNyZWF0aW9uTW9kZVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXHQvLyBDcmVhdGUgYSBwcm9wZXJ0eUluZm8gZm9yIGVhY2ggcmVsYXRlZCBwcm9wZXJ0eS5cblx0Y29uc3QgcmVsYXRlZENvbHVtbnMgPSBfY3JlYXRlUmVsYXRlZENvbHVtbnMoXG5cdFx0Y29sdW1uc1RvQmVDcmVhdGVkLFxuXHRcdGFubm90YXRpb25Db2x1bW5zLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0ZW50aXR5VHlwZSxcblx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdHRhYmxlQ3JlYXRpb25Nb2RlLFxuXHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllc1xuXHQpO1xuXHRyZXR1cm4gYW5ub3RhdGlvbkNvbHVtbnMuY29uY2F0KHJlbGF0ZWRDb2x1bW5zKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgY29sdW1uIGRlZmluaXRpb24gZnJvbSBhIHByb3BlcnR5LlxuICogQHBhcmFtIHByb3BlcnR5IEVudGl0eSB0eXBlIHByb3BlcnR5IGZvciB3aGljaCB0aGUgY29sdW1uIGlzIGNyZWF0ZWRcbiAqIEBwYXJhbSBmdWxsUHJvcGVydHlQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHRhcmdldCBwcm9wZXJ0eVxuICogQHBhcmFtIHJlbGF0aXZlUGF0aCBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgdGFyZ2V0IHByb3BlcnR5IGJhc2VkIG9uIHRoZSBjb250ZXh0XG4gKiBAcGFyYW0gdXNlRGF0YUZpZWxkUHJlZml4IFNob3VsZCBiZSBwcmVmaXhlZCB3aXRoIFwiRGF0YUZpZWxkOjpcIiwgZWxzZSBpdCB3aWxsIGJlIHByZWZpeGVkIHdpdGggXCJQcm9wZXJ0eTo6XCJcbiAqIEBwYXJhbSBhdmFpbGFibGVGb3JBZGFwdGF0aW9uIERlY2lkZXMgd2hldGhlciB0aGUgY29sdW1uIHNob3VsZCBiZSBhdmFpbGFibGUgZm9yIGFkYXB0YXRpb25cbiAqIEBwYXJhbSBhZ2dyZWdhdGlvbkhlbHBlciBUaGUgYWdncmVnYXRpb25IZWxwZXIgZm9yIHRoZSBlbnRpdHlcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAgVGhlIG1hcCBvZiBwcm9wZXJ0aWVzIHJlZmVyZW5jZWQgYXMgZGVzY3JpcHRpb24gb24gYSB0ZXh0IGFycmFuZ2VtZW50IGFubm90YXRpb25cbiAqIEBwYXJhbSByZXN0cmljdGlvbnNPblByb3BlcnRpZXMgVGhlIGV4aXN0aW5nIHJlc3RyaWN0aW9ucyBvbiBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHRhYmxlXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXNJbmZvIFRoZSBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgc28gZmFyIGZvciB0aGUgY29sdW1uXG4gKiBAcGFyYW0gcmVsYXRpdmVQYXRoRm9yTXVsdGlWYWx1ZSBUaGUgTURDIHBhdGggdXNlZCBmb3IgdGhlIDE6biBwcm9wZXJ0eSB0byBhbGxvdyBmaWx0ZXJpbmcgZnJvbSBNRENcbiAqIEByZXR1cm5zIFRoZSBhbm5vdGF0aW9uIGNvbHVtbiBkZWZpbml0aW9uXG4gKi9cbmNvbnN0IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkgPSBmdW5jdGlvbiAoXG5cdHByb3BlcnR5OiBQcm9wZXJ0eSxcblx0ZnVsbFByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRyZWxhdGl2ZVBhdGg6IHN0cmluZyxcblx0dXNlRGF0YUZpZWxkUHJlZml4OiBib29sZWFuLFxuXHRhdmFpbGFibGVGb3JBZGFwdGF0aW9uOiBib29sZWFuLFxuXHRhZ2dyZWdhdGlvbkhlbHBlcjogQWdncmVnYXRpb25IZWxwZXIsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcDogUmVjb3JkPHN0cmluZywgRGlzcGxheU1vZGU+LFxuXHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM/OiBSZXN0cmljdGlvbnNPblByb3BlcnRpZXMsXG5cdHRhYmxlQ3JlYXRpb25Nb2RlPzogQ3JlYXRpb25Nb2RlLFxuXHRyZWxhdGVkUHJvcGVydGllc0luZm8/OiBDb21wbGV4UHJvcGVydHlJbmZvLFxuXHRyZWxhdGl2ZVBhdGhGb3JNdWx0aVZhbHVlPzogc3RyaW5nXG4pOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4ge1xuXHRjb25zdCBzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoID0gZ2V0U2VtYW50aWNPYmplY3RQYXRoKGNvbnZlcnRlckNvbnRleHQsIHByb3BlcnR5KTtcblx0Y29uc3QgaXNIaWRkZW4gPSBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihwcm9wZXJ0eSk7XG5cdGNvbnN0IGdyb3VwUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkID0gcHJvcGVydHkubmFtZSA/IF9zbGljZUF0U2xhc2gocHJvcGVydHkubmFtZSwgdHJ1ZSwgZmFsc2UpIDogdW5kZWZpbmVkO1xuXHRjb25zdCBpc0dyb3VwOiBib29sZWFuID0gZ3JvdXBQYXRoICE9IHByb3BlcnR5Lm5hbWU7XG5cdGNvbnN0IGxhYmVsID0gZ2V0TGFiZWwocHJvcGVydHksIGlzR3JvdXApO1xuXHRjb25zdCBkYXRhVHlwZSA9IGdldERhdGFGaWVsZERhdGFUeXBlKHByb3BlcnR5KTtcblx0Y29uc3QgcHJvcGVydHlUeXBlQ29uZmlnID0gZ2V0VHlwZUNvbmZpZyhwcm9wZXJ0eSwgZGF0YVR5cGUpO1xuXHRjb25zdCBpc0FQcm9wZXJ0eUZyb21UZXh0T25seUFubm90YXRpb24gPSBkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwW3JlbGF0aXZlUGF0aF0gPT09IFwiRGVzY3JpcHRpb25cIjtcblx0Y29uc3Qgc29ydGFibGUgPVxuXHRcdCghaXNIaWRkZW4gfHwgaXNBUHJvcGVydHlGcm9tVGV4dE9ubHlBbm5vdGF0aW9uKSAmJiAhcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzPy5ub25Tb3J0YWJsZVByb3BlcnRpZXMuaW5jbHVkZXMocmVsYXRpdmVQYXRoKTtcblx0Y29uc3QgZmlsdGVyYWJsZSA9ICFpc0FQcm9wZXJ0eUZyb21UZXh0T25seUFubm90YXRpb24gJiYgIXJlc3RyaWN0aW9uc09uUHJvcGVydGllcz8ubm9uRmlsdGVyYWJsZVByb3BlcnRpZXMuaW5jbHVkZXMocmVsYXRpdmVQYXRoKTtcblx0Y29uc3QgdHlwZUNvbmZpZyA9IHtcblx0XHRjbGFzc05hbWU6IHByb3BlcnR5LnR5cGUgfHwgZGF0YVR5cGUsXG5cdFx0Zm9ybWF0T3B0aW9uczogcHJvcGVydHlUeXBlQ29uZmlnLmZvcm1hdE9wdGlvbnMsXG5cdFx0Y29uc3RyYWludHM6IHByb3BlcnR5VHlwZUNvbmZpZy5jb25zdHJhaW50c1xuXHR9O1xuXHRsZXQgZXhwb3J0U2V0dGluZ3M6IFByb3BlcnR5SW5mb1tcImV4cG9ydFNldHRpbmdzXCJdID0gbnVsbDtcblx0aWYgKF9pc0V4cG9ydGFibGVDb2x1bW4ocHJvcGVydHkpKSB7XG5cdFx0ZXhwb3J0U2V0dGluZ3MgPSBjcmVhdGVDb2x1bW5FeHBvcnRTZXR0aW5ncyhwcm9wZXJ0eSwgcmVsYXRlZFByb3BlcnRpZXNJbmZvKTtcblx0fVxuXHRjb25zdCBhdmFpbGFiaWxpdHk6IEF2YWlsYWJpbGl0eVR5cGUgPVxuXHRcdCFpc0hpZGRlbiAmJiAoYXZhaWxhYmxlRm9yQWRhcHRhdGlvbiB8fCBkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwW3JlbGF0aXZlUGF0aF0pID8gXCJBZGFwdGF0aW9uXCIgOiBcIkhpZGRlblwiO1xuXHRjb25zdCBjb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkID0gX2dldENvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscyhyZWxhdGl2ZVBhdGgsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRpZiAocmVsYXRpdmVQYXRoRm9yTXVsdGlWYWx1ZSkge1xuXHRcdHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlUGF0aEZvck11bHRpVmFsdWU7XG5cdH1cblx0Y29uc3QgbmFtZSA9IHVzZURhdGFGaWVsZFByZWZpeCA/IHJlbGF0aXZlUGF0aCA6IGBQcm9wZXJ0eTo6JHtyZWxhdGl2ZVBhdGh9YDtcblx0Y29uc3Qga2V5ID0gKHVzZURhdGFGaWVsZFByZWZpeCA/IFwiRGF0YUZpZWxkOjpcIiA6IFwiUHJvcGVydHk6OlwiKSArIHJlcGxhY2VTcGVjaWFsQ2hhcnMocmVsYXRpdmVQYXRoKTtcblxuXHRjb25zdCBjb2x1bW46IEFubm90YXRpb25UYWJsZUNvbHVtbiA9IHtcblx0XHRrZXk6IGtleSxcblx0XHR0eXBlOiBDb2x1bW5UeXBlLkFubm90YXRpb24sXG5cdFx0ZGF0YVR5cGU6IGRhdGFUeXBlID8/IHByb3BlcnR5LnR5cGUsXG5cdFx0bGFiZWw6IGxhYmVsID8/IHByb3BlcnR5Lm5hbWUsXG5cdFx0Z3JvdXBMYWJlbDogaXNHcm91cCA/IGdldExhYmVsKHByb3BlcnR5KSA6IHVuZGVmaW5lZCxcblx0XHRncm91cDogaXNHcm91cCA/IGdyb3VwUGF0aCA6IHVuZGVmaW5lZCxcblx0XHRhbm5vdGF0aW9uUGF0aDogZnVsbFByb3BlcnR5UGF0aCxcblx0XHRzZW1hbnRpY09iamVjdFBhdGg6IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGgsXG5cdFx0YXZhaWxhYmlsaXR5OiBhdmFpbGFiaWxpdHksXG5cdFx0bmFtZTogbmFtZSxcblx0XHRyZWxhdGl2ZVBhdGg6IHJlbGF0aXZlUGF0aCxcblx0XHRzb3J0YWJsZTogc29ydGFibGUsXG5cdFx0ZmlsdGVyYWJsZTogZmlsdGVyYWJsZSxcblx0XHRpc0dyb3VwYWJsZTogYWdncmVnYXRpb25IZWxwZXIuaXNBbmFseXRpY3NTdXBwb3J0ZWQoKSA/ICEhYWdncmVnYXRpb25IZWxwZXIuaXNQcm9wZXJ0eUdyb3VwYWJsZShwcm9wZXJ0eSkgOiBzb3J0YWJsZSxcblx0XHRpc0tleTogcHJvcGVydHkuaXNLZXksXG5cdFx0ZXhwb3J0U2V0dGluZ3M6IGV4cG9ydFNldHRpbmdzLFxuXHRcdGNhc2VTZW5zaXRpdmU6IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHR0eXBlQ29uZmlnOiB0eXBlQ29uZmlnIGFzIFByb3BlcnR5VHlwZUNvbmZpZyxcblx0XHRpbXBvcnRhbmNlOiBnZXRJbXBvcnRhbmNlKGNvbnZlcnRlckNvbnRleHQsIHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdCksXG5cdFx0cmVxdWlyZWQ6IGlzUmVxdWlyZWRDb2x1bW4oY29udmVydGVyQ29udGV4dCwgcHJvcGVydHksIHRhYmxlQ3JlYXRpb25Nb2RlKSxcblx0XHRhZGRpdGlvbmFsTGFiZWxzOiBjb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHNcblx0fTtcblx0X2FkZFRvb2xUaXAocHJvcGVydHksIGNvbHVtbik7XG5cdF9zZXRFeHBvcnRTZXR0aW5nc0ZvckRhdGFQb2ludChwcm9wZXJ0eSwgY29sdW1uKTtcblxuXHRpZiAoXG5cdFx0YWdncmVnYXRpb25IZWxwZXIuaXNBbmFseXRpY3NTdXBwb3J0ZWQoKSAmJlxuXHRcdE1vZGVsSGVscGVyLmlzT2JqZWN0UGF0aERyYWZ0U3VwcG9ydGVkKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKSAmJlxuXHRcdChyZWxhdGl2ZVBhdGggPT09IFwiSGFzQWN0aXZlRW50aXR5XCIgfHwgcmVsYXRpdmVQYXRoID09PSBcIkhhc0RyYWZ0RW50aXR5XCIgfHwgcmVsYXRpdmVQYXRoID09PSBcIklzQWN0aXZlRW50aXR5XCIpXG5cdCkge1xuXHRcdC8vIEluIGNhc2Ugb2YgYW5hbHl0aWNhbCB0YWJsZSBvbiBhIGRyYWZ0LWVuYWJsZWQgZW50aXR5LCB3ZSBhbHdheXMgY29uc2lkZXIgdGhlIEhhc0RyYWZ0RW50aXR5LCBIYXNBY3RpdmVFbnRpdHkgYW5kIElzQWN0aXZlRW50aXR5IHByb3BlcnRpZXMgYXNcblx0XHQvLyB0ZWNobmljYWxseSBncm91cGFibGUsIGFzIHdlIG5lZWQgdG8gbG9hZCB0aGVtIGZvciBvdXIgaW50ZXJuYWwgbG9naWMuXG5cdFx0Y29sdW1uLmV4dGVuc2lvbiA9IHtcblx0XHRcdHRlY2huaWNhbGx5QWdncmVnYXRhYmxlOiBmYWxzZSxcblx0XHRcdHRlY2huaWNhbGx5R3JvdXBhYmxlOiB0cnVlXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gY29sdW1uO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgdGhlIGV4cG9ydCBzZXR0aW5ncyBmb3IgYSBnaXZlbiBjb2x1bW4uXG4gKiBAcGFyYW0gY29sdW1uIFRoZSBnaXZlbiBjb2x1bW4gZnJvbSBhIGxpbmUgaXRlbSBhcyBhIGRhdGEgZmllbGQgb3IgYSBwcm9wZXJ0eSBmcm9tIHRoZSBlbnRpdHkgdHlwZVxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGxpbmtlZCB0byB0aGUgY29sdW1uIChuYW1lZCBhbHNvIGNvbXBsZXggcHJvcGVydHkpXG4gKiBAcmV0dXJucyBUaGUgZXhwb3J0IHNldHRpbmdzIGluIGEgdGhlIGdpdmVuIGNvbHVtblxuICovXG5jb25zdCBjcmVhdGVDb2x1bW5FeHBvcnRTZXR0aW5ncyA9IGZ1bmN0aW9uIChcblx0Y29sdW1uOiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz86IENvbXBsZXhQcm9wZXJ0eUluZm9cbik6IENvbHVtbkV4cG9ydFNldHRpbmdzIHtcblx0bGV0IHVuaXRQcm9wZXJ0eSwgdGltZXpvbmVQcm9wZXJ0eSwgdW5pdFRleHQsIHRpbWV6b25lVGV4dCwgdXRjLCBpc0FUaW1lem9uZSwgY3VycmVuY3lQcm9wZXJ0eSwgc2NhbGU7XG5cdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvID8gT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXMpIDogW107XG5cdGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8gJiYgcmVsYXRlZFByb3BlcnR5TmFtZXM/Lmxlbmd0aCA9PT0gMSkge1xuXHRcdC8vIENyZWF0ZSB0aGUgZXhwb3J0IHNldHRpbmdzIG9mIGEgY29sdW1uIGJhc2VkIG9uIHRoZSByZWxhdGVkIChjaGlsZCkgcHJvcGVydHkgaW4gY2FzZSB0aGVyZSBpcyBvbmx5IG9uZS5cblx0XHQvLyBUaGlzIGlzIHJlcXVpcmVkIHdoZW4gd2UgaGF2ZSBhIHRleHQgb25seSBhbm5vdGF0aW9uIHRvIGNvbXB1dGUgdGhlIGV4cG9ydCBzZXR0aW5ncyBmcm9tIHRoZSB0ZXh0IGluc3RlYWQgb2YgdGhlIHZhbHVlXG5cdFx0Y29sdW1uID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbcmVsYXRlZFByb3BlcnR5TmFtZXNbMF1dLmFubm90YXRpb25Qcm9wZXJ0eTtcblx0fVxuXHRjb25zdCBkYXRhVHlwZSA9IGdldERhdGFGaWVsZERhdGFUeXBlKGNvbHVtbik7XG5cdGlmIChpc1Byb3BlcnR5KGNvbHVtbikpIHtcblx0XHR1bml0UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KGNvbHVtbik7XG5cdFx0Y3VycmVuY3lQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5KGNvbHVtbik7XG5cdFx0dGltZXpvbmVQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5KGNvbHVtbik7XG5cdFx0dW5pdFRleHQgPSBnZXRTdGF0aWNVbml0T3JDdXJyZW5jeShjb2x1bW4pO1xuXHRcdHRpbWV6b25lVGV4dCA9IGdldFN0YXRpY1RpbWV6b25lKGNvbHVtbik7XG5cdFx0aXNBVGltZXpvbmUgPSBpc1RpbWV6b25lKGNvbHVtbik7XG5cdFx0c2NhbGUgPSBjb2x1bW4uc2NhbGU7XG5cdH1cblx0dW5pdFByb3BlcnR5ID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncz8udW5pdFByb3BlcnR5ID8/IHVuaXRQcm9wZXJ0eT8ubmFtZSA/PyBjdXJyZW5jeVByb3BlcnR5Py5uYW1lO1xuXHR0aW1lem9uZVByb3BlcnR5ID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncz8udGltZXpvbmVQcm9wZXJ0eSA/PyB0aW1lem9uZVByb3BlcnR5Py5uYW1lO1xuXHRzY2FsZSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3M/LnNjYWxlID8/IHNjYWxlO1xuXHRjb25zdCBleHBvcnRUeXBlID0gZ2V0RXhwb3J0RGF0YVR5cGUoZGF0YVR5cGUsIGlzQVRpbWV6b25lLCAhIWN1cnJlbmN5UHJvcGVydHksIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3MpO1xuXHRpZiAodGltZXpvbmVQcm9wZXJ0eSB8fCAoZXhwb3J0VHlwZSA9PT0gXCJEYXRlVGltZVwiICYmICF0aW1lem9uZVRleHQpKSB7XG5cdFx0dXRjID0gZmFsc2U7XG5cdH1cblx0Y29uc3QgZXhwb3J0U2V0dGluZ3M6IENvbHVtbkV4cG9ydFNldHRpbmdzID0ge1xuXHRcdHR5cGU6IGV4cG9ydFR5cGUsXG5cdFx0aW5wdXRGb3JtYXQ6IGdldERhdGVJbnB1dEZvcm1hdChkYXRhVHlwZSksXG5cdFx0ZGVsaW1pdGVyOiBnZXREZWxpbWl0ZXIoZGF0YVR5cGUpLFxuXHRcdHNjYWxlOiBzY2FsZSxcblx0XHR1bml0UHJvcGVydHk6IHVuaXRQcm9wZXJ0eSxcblx0XHR1bml0OiByZWxhdGVkUHJvcGVydGllc0luZm8/LmV4cG9ydFNldHRpbmdzLnVuaXQgPz8gdW5pdFRleHQsXG5cdFx0dGltZXpvbmVQcm9wZXJ0eTogdGltZXpvbmVQcm9wZXJ0eSxcblx0XHR0aW1lem9uZTogcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncy50aW1lem9uZSA/PyB0aW1lem9uZVRleHQ/LnRvU3RyaW5nKCksXG5cdFx0dGVtcGxhdGU6IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3MudGVtcGxhdGUsXG5cdFx0Ly9vbmx5IGluIGNhc2Ugb2YgY29tcGxleCBwcm9wZXJ0aWVzLCB3cmFwIHRoZSBjZWxsIGNvbnRlbnRcdG9uIHRoZSBleGNlbCBleHBvcnRlZCBmaWxlXG5cdFx0d3JhcDogcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncy53cmFwLFxuXHRcdHV0YzogdXRjXG5cdH07XG5cdGlmIChleHBvcnRTZXR0aW5ncy51bml0UHJvcGVydHkgfHwgZXhwb3J0U2V0dGluZ3MudW5pdCkge1xuXHRcdGV4cG9ydFNldHRpbmdzLmF1dG9TY2FsZSA9IHRydWU7XG5cdH1cblx0cmV0dXJuIHJlbW92ZVVuZGVmaW5lZEZyb21FeHBvcnRTZXR0aW5ncyhleHBvcnRTZXR0aW5ncyk7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIGV4cG9ydCBmb3JtYXQgdGVtcGxhdGUgZm9yIGNvbHVtbnMgd2l0aCBkYXRlcy5cbiAqIEBwYXJhbSBkYXRhVHlwZSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBjb2x1bW5cbiAqIEByZXR1cm5zIFRoZSBpbnB1dEZvcm1hdFxuICovXG5jb25zdCBnZXREYXRlSW5wdXRGb3JtYXQgPSBmdW5jdGlvbiAoZGF0YVR5cGU/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRyZXR1cm4gZGF0YVR5cGUgPT09IFwiRWRtLkRhdGVcIiA/IFwiWVlZWS1NTS1ERFwiIDogdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBkZWxpbWl0ZXIgaW4gbnVtZXJpYyBjb2x1bW5zLlxuICogVGhlIGRlbGltaXRlciBpcyB1c2VkIHRvIGRpc3BsYXkgdGhvdXNhbmRzIHNlcGFyYXRvciBpbiBudW1lcmljIGNvbHVtbnMuXG4gKiBAcGFyYW0gZGF0YVR5cGUgVGhlIGRhdGEgdHlwZSBvZiB0aGUgY29sdW1uXG4gKiBAcmV0dXJucyBUcnVlIHRvIGRpc3BsYXkgdGhvdXNhbmRzIHNlcGFyYXRvciBpbiBudW1lcmljIGNvbHVtbnNcbiAqL1xuY29uc3QgZ2V0RGVsaW1pdGVyID0gZnVuY3Rpb24gKGRhdGFUeXBlPzogc3RyaW5nKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG5cdHJldHVybiBkYXRhVHlwZSA9PT0gXCJFZG0uSW50NjRcIiA/IHRydWUgOiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgdW5kZWZpbmVkIHZhbHVlcyBmcm9tIHRoZSBleHBvcnQgc2V0dGluZ3Mgb2JqZWN0IG9mIGEgY29sdW1uLlxuICogQHBhcmFtIGV4cG9ydFNldHRpbmdzIFRoZSBleHBvcnQgc2V0dGluZ3MgY29uZmlndXJhdGlvbnMgZm9yIGEgY29sdW1uXG4gKiBAcmV0dXJucyBUaGUgZXhwb3J0IHNldHRpbmdzIGNvbmZpZ3VyYXRpb25zIHdpdGhvdXQgdW5kZWZpbmVkIHZhbHVlc1xuICovXG5jb25zdCByZW1vdmVVbmRlZmluZWRGcm9tRXhwb3J0U2V0dGluZ3MgPSBmdW5jdGlvbiAoZXhwb3J0U2V0dGluZ3M6IENvbHVtbkV4cG9ydFNldHRpbmdzKTogQ29sdW1uRXhwb3J0U2V0dGluZ3Mge1xuXHQvL1JlbW92ZSB1bmRlZmluZWQgc2V0dGluZ3MgZnJvbSBleHBvcnRTZXR0aW5nIG9iamVjdFxuXHRmb3IgKGNvbnN0IHNldHRpbmcgaW4gZXhwb3J0U2V0dGluZ3MpIHtcblx0XHRpZiAoZXhwb3J0U2V0dGluZ3Nbc2V0dGluZyBhcyBrZXlvZiBDb2x1bW5FeHBvcnRTZXR0aW5nc10gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ZGVsZXRlIGV4cG9ydFNldHRpbmdzW3NldHRpbmcgYXMga2V5b2YgQ29sdW1uRXhwb3J0U2V0dGluZ3NdO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZXhwb3J0U2V0dGluZ3M7XG59O1xuXG4vKipcbiAqIFVwZGF0ZSBwcm9wZXJ0eSBsYWJlbCBpbiBjYXNlIGl0J3Mgb25seSByZWZlcmVuY2VkIGluIG9uZSBjb2x1bW4uIFRoZSBsYWJlbCBvZiB0aGUgY29sdW1uIG11c3QgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBwcm9wZXJ0eSBsYWJlbC5cbiAqIFRoaXMgdXBkYXRlIGFsc28gaXMgYXBwbGllZCBmb3IgdGhlIHRvb2x0aXAgYXMgaXQgaXMgYmFzZWQgb24gdGhlIGNvbHVtbidzIGxhYmVsLlxuICogQHBhcmFtIGFubm90YXRpb25Db2x1bW5zIFRoZSBhcnJheSBvZiBjb2x1bW5zIGNyZWF0ZWQgYmFzZWQgb24gTGluZUl0ZW0gYW5ub3RhdGlvbnMuXG4gKiBAcGFyYW0gY29sdW1uc1RvQmVDcmVhdGVkIFRoZSBjb2x1bW5zIHRvIGJlIGNyZWF0ZWRcbiAqIEBwYXJhbSBjb2x1bW5JbmZvIFRoZSBjb2x1bW4gZGVmaW5pdGlvblxuICogQHBhcmFtIGNvbHVtbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbHVtblxuICovXG5mdW5jdGlvbiB1cGRhdGVQcm9wZXJ0eUxhYmVsKFxuXHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdGNvbHVtbnNUb0JlQ3JlYXRlZDogUmVjb3JkPHN0cmluZywgUHJvcGVydHk+LFxuXHRjb2x1bW5JbmZvOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4sXG5cdGNvbHVtbk5hbWU/OiBzdHJpbmdcbik6IHZvaWQge1xuXHRjb25zdCBsaW5rZWRBbm5vdGF0aW9uQ29sdW1ucyA9IGFubm90YXRpb25Db2x1bW5zLmZpbHRlcihcblx0XHQoY29sKSA9PiBjb2wucHJvcGVydHlJbmZvcz8uaW5jbHVkZXMoY29sdW1uSW5mby5yZWxhdGl2ZVBhdGgpIHx8IChjb2x1bW5OYW1lICYmIGNvbC5wcm9wZXJ0eUluZm9zPy5pbmNsdWRlcyhjb2x1bW5OYW1lKSlcblx0KTtcblx0aWYgKFxuXHRcdGxpbmtlZEFubm90YXRpb25Db2x1bW5zPy5sZW5ndGggPT09IDEgJiZcblx0XHQoY29sdW1uc1RvQmVDcmVhdGVkW2NvbHVtbkluZm8ucmVsYXRpdmVQYXRoXSB8fCAoY29sdW1uTmFtZSAmJiBjb2x1bW5zVG9CZUNyZWF0ZWRbY29sdW1uTmFtZV0pKSAmJlxuXHRcdGxpbmtlZEFubm90YXRpb25Db2x1bW5zWzBdLnByb3BlcnR5SW5mb3M/Lmxlbmd0aCA9PT0gMVxuXHQpIHtcblx0XHRjb2x1bW5JbmZvLmxhYmVsID0gbGlua2VkQW5ub3RhdGlvbkNvbHVtbnNbMF0ubGFiZWw7XG5cdFx0Y29sdW1uSW5mby50b29sdGlwID0gbGlua2VkQW5ub3RhdGlvbkNvbHVtbnNbMF0udG9vbHRpcDtcblx0fVxufVxuXG4vKipcbiAqIFJldHVybnMgQm9vbGVhbiB0cnVlIGZvciBleHBvcnRhYmxlIGNvbHVtbnMsIGZhbHNlIGZvciBub24gZXhwb3J0YWJsZSBjb2x1bW5zLlxuICogQHBhcmFtIHNvdXJjZSBUaGUgZGF0YUZpZWxkIG9yIHByb3BlcnR5IHRvIGJlIGV2YWx1YXRlZFxuICogQHJldHVybnMgVHJ1ZSBmb3IgZXhwb3J0YWJsZSBjb2x1bW4sIGZhbHNlIGZvciBub24gZXhwb3J0YWJsZSBjb2x1bW5cbiAqL1xuZnVuY3Rpb24gX2lzRXhwb3J0YWJsZUNvbHVtbihzb3VyY2U6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBQcm9wZXJ0eSk6IGJvb2xlYW4ge1xuXHRsZXQgcHJvcGVydHlUeXBlLCBwcm9wZXJ0eTtcblx0Y29uc3QgZGF0YUZpZWxkRGVmYXVsdFByb3BlcnR5ID0gKHNvdXJjZSBhcyBQcm9wZXJ0eSkuYW5ub3RhdGlvbnMuVUk/LkRhdGFGaWVsZERlZmF1bHQ7XG5cdGlmIChpc1Byb3BlcnR5KHNvdXJjZSkpIHtcblx0XHRpZiAoaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4oc291cmNlKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRwcm9wZXJ0eVR5cGUgPSBkYXRhRmllbGREZWZhdWx0UHJvcGVydHk/LiRUeXBlO1xuXHR9IGVsc2UgaWYgKGlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuKHNvdXJjZSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0gZWxzZSB7XG5cdFx0cHJvcGVydHkgPSBzb3VyY2U7XG5cdFx0cHJvcGVydHlUeXBlID0gcHJvcGVydHkuJFR5cGU7XG5cdFx0aWYgKHByb3BlcnR5VHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiAmJiAocHJvcGVydHkgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSkge1xuXHRcdFx0Ly9Gb3IgQ2hhcnRcblx0XHRcdHByb3BlcnR5VHlwZSA9IChwcm9wZXJ0eSBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKS5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlO1xuXHRcdFx0cmV0dXJuIHByb3BlcnR5VHlwZSAhPT0gdW5kZWZpbmVkICYmICFVSUFubm90YXRpb25UeXBlcy5DaGFydERlZmluaXRpb25UeXBlLmluY2x1ZGVzKHByb3BlcnR5VHlwZSk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdChwcm9wZXJ0eSBhcyBEYXRhRmllbGQpLlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29yZT8uTWVkaWFUeXBlPy50ZXJtID09PSBcIk9yZy5PRGF0YS5Db3JlLlYxLk1lZGlhVHlwZVwiICYmXG5cdFx0XHQocHJvcGVydHkgYXMgRGF0YUZpZWxkKS5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvcmU/LmlzVVJMICE9PSB0cnVlXG5cdFx0KSB7XG5cdFx0XHQvL0ZvciBTdHJlYW1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHByb3BlcnR5VHlwZVxuXHRcdD8gIVtcblx0XHRcdFx0VUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uLFxuXHRcdFx0XHRVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24sXG5cdFx0XHRcdFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbkdyb3VwXG5cdFx0ICBdLmluY2x1ZGVzKHByb3BlcnR5VHlwZSlcblx0XHQ6IHRydWU7XG59XG5cbi8qKlxuICogUmV0dXJucyBCb29sZWFuIHRydWUgZm9yIHZhbGlkIGNvbHVtbnMsIGZhbHNlIGZvciBpbnZhbGlkIGNvbHVtbnMuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERpZmZlcmVudCBEYXRhRmllbGQgdHlwZXMgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEByZXR1cm5zIFRydWUgZm9yIHZhbGlkIGNvbHVtbnMsIGZhbHNlIGZvciBpbnZhbGlkIGNvbHVtbnNcbiAqL1xuY29uc3QgX2lzVmFsaWRDb2x1bW4gPSBmdW5jdGlvbiAoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogYm9vbGVhbiB7XG5cdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRyZXR1cm4gISFkYXRhRmllbGQuSW5saW5lO1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHQvLyBUb2RvOiBSZXBsYWNlIHdpdGggcHJvcGVyIExvZyBzdGF0ZW1lbnQgb25jZSBhdmFpbGFibGVcblx0XHRcdC8vICB0aHJvdyBuZXcgRXJyb3IoXCJVbmhhbmRsZWQgRGF0YUZpZWxkIEFic3RyYWN0IHR5cGU6IFwiICsgZGF0YUZpZWxkLiRUeXBlKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUgdGhlIHZpc2liaWxpdHkgb2YgYSBEYXRhRmllbGQgb3IgRGF0YVBvaW50IGFubm90YXRpb24uXG4gKlxuICogU0FQIEZpb3JpIGVsZW1lbnRzIHdpbGwgZXZhbHVhdGUgZWl0aGVyIHRoZSBVSS5IaWRkZW4gYW5ub3RhdGlvbiBkZWZpbmVkIG9uIHRoZSBhbm5vdGF0aW9uIGl0c2VsZiBvciBvbiB0aGUgdGFyZ2V0IHByb3BlcnR5LlxuICogQHBhcmFtIGRhdGFGaWVsZE1vZGVsUGF0aCBUaGUgbWV0YXBhdGggcmVmZXJyaW5nIHRvIHRoZSBhbm5vdGF0aW9uIHRoYXQgaXMgZXZhbHVhdGVkIGJ5IFNBUCBGaW9yaSBlbGVtZW50cy5cbiAqIEByZXR1cm5zIEFuIGV4cHJlc3Npb24gdGhhdCB5b3UgY2FuIGJpbmQgdG8gdGhlIFVJLlxuICovXG5jb25zdCBfZ2V0VmlzaWJsZUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoXG5cdGRhdGFGaWVsZE1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgRGF0YVBvaW50VHlwZVR5cGVzPlxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgdGFyZ2V0T2JqZWN0ID0gZGF0YUZpZWxkTW9kZWxQYXRoLnRhcmdldE9iamVjdDtcblx0bGV0IHByb3BlcnR5VmFsdWU7XG5cdGlmICh0YXJnZXRPYmplY3QpIHtcblx0XHRzd2l0Y2ggKHRhcmdldE9iamVjdC4kVHlwZSkge1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZTpcblx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IHRhcmdldE9iamVjdC5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRcdFx0Ly8gaWYgaXQgaXMgYSBEYXRhRmllbGRGb3JBbm5vdGF0aW9uIHBvaW50aW5nIHRvIGEgRGF0YVBvaW50IHdlIGxvb2sgYXQgdGhlIGRhdGFQb2ludCdzIHZhbHVlXG5cdFx0XHRcdGlmICh0YXJnZXRPYmplY3Q/LlRhcmdldD8uJHRhcmdldD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGUpIHtcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdGFyZ2V0T2JqZWN0LlRhcmdldC4kdGFyZ2V0Py5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjpcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHByb3BlcnR5VmFsdWUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdGNvbnN0IGlzQW5hbHl0aWNhbEdyb3VwSGVhZGVyRXhwYW5kZWQgPSAvKmZvcm1hdE9wdGlvbnM/LmlzQW5hbHl0aWNzID8gVUkuSXNFeHBhbmRlZCA6Ki8gY29uc3RhbnQoZmFsc2UpO1xuXHRjb25zdCBpc0FuYWx5dGljYWxMZWFmID0gLypmb3JtYXRPcHRpb25zPy5pc0FuYWx5dGljcyA/IGVxdWFsKFVJLk5vZGVMZXZlbCwgMCkgOiovIGNvbnN0YW50KGZhbHNlKTtcblx0Ly8gQSBkYXRhIGZpZWxkIGlzIHZpc2libGUgaWY6XG5cdC8vIC0gdGhlIFVJLkhpZGRlbiBleHByZXNzaW9uIGluIHRoZSBvcmlnaW5hbCBhbm5vdGF0aW9uIGRvZXMgbm90IGV2YWx1YXRlIHRvICd0cnVlJ1xuXHQvLyAtIHRoZSBVSS5IaWRkZW4gZXhwcmVzc2lvbiBpbiB0aGUgdGFyZ2V0IHByb3BlcnR5IGRvZXMgbm90IGV2YWx1YXRlIHRvICd0cnVlJ1xuXHQvLyAtIGluIGNhc2Ugb2YgQW5hbHl0aWNzIGl0J3Mgbm90IHZpc2libGUgZm9yIGFuIGV4cGFuZGVkIEdyb3VwSGVhZGVyXG5cdHJldHVybiBhbmQoXG5cdFx0Li4uW1xuXHRcdFx0bm90KGVxdWFsKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbih0YXJnZXRPYmplY3Q/LmFubm90YXRpb25zPy5VST8uSGlkZGVuKSwgdHJ1ZSkpLFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHQhIXByb3BlcnR5VmFsdWUsXG5cdFx0XHRcdHByb3BlcnR5VmFsdWUgJiYgbm90KGVxdWFsKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihwcm9wZXJ0eVZhbHVlLmFubm90YXRpb25zPy5VST8uSGlkZGVuKSwgdHJ1ZSkpLFxuXHRcdFx0XHR0cnVlXG5cdFx0XHQpLFxuXHRcdFx0b3Iobm90KGlzQW5hbHl0aWNhbEdyb3VwSGVhZGVyRXhwYW5kZWQpLCBpc0FuYWx5dGljYWxMZWFmKVxuXHRcdF1cblx0KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBoaWRkZW4gYmluZGluZyBleHByZXNzaW9ucyBmb3IgYSBmaWVsZCBncm91cC5cbiAqIEBwYXJhbSBkYXRhRmllbGRHcm91cCBEYXRhRmllbGQgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEByZXR1cm5zIENvbXBpbGUgYmluZGluZyBvZiBmaWVsZCBncm91cCBleHByZXNzaW9ucy5cbiAqL1xuY29uc3QgX2dldEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyA9IGZ1bmN0aW9uIChkYXRhRmllbGRHcm91cDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IFtdO1xuXHRpZiAoXG5cdFx0ZGF0YUZpZWxkR3JvdXAuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiZcblx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZVxuXHQpIHtcblx0XHRpZiAoZGF0YUZpZWxkR3JvdXA/LmFubm90YXRpb25zPy5VST8uSGlkZGVuKSB7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24obm90KGVxdWFsKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihkYXRhRmllbGRHcm91cC5hbm5vdGF0aW9ucy5VSS5IaWRkZW4pLCB0cnVlKSkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQuJHRhcmdldC5EYXRhPy5mb3JFYWNoKChpbm5lckRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcykgPT4ge1xuXHRcdFx0XHRmaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMucHVzaChcblx0XHRcdFx0XHRfZ2V0VmlzaWJsZUV4cHJlc3Npb24oeyB0YXJnZXRPYmplY3Q6IGlubmVyRGF0YUZpZWxkIH0gYXMgRGF0YU1vZGVsT2JqZWN0UGF0aDxcblx0XHRcdFx0XHRcdERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXNcblx0XHRcdFx0XHQ+KVxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oaWZFbHNlKG9yKC4uLmZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyksIGNvbnN0YW50KHRydWUpLCBjb25zdGFudChmYWxzZSkpKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsYWJlbCBmb3IgdGhlIHByb3BlcnR5IGFuZCBkYXRhRmllbGQuXG4gKiBAcGFyYW0gW3Byb3BlcnR5XSBQcm9wZXJ0eSwgRGF0YUZpZWxkIG9yIE5hdmlnYXRpb24gUHJvcGVydHkgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEBwYXJhbSBpc0dyb3VwXG4gKiBAcmV0dXJucyBMYWJlbCBvZiB0aGUgcHJvcGVydHkgb3IgRGF0YUZpZWxkXG4gKi9cbmNvbnN0IGdldExhYmVsID0gZnVuY3Rpb24gKHByb3BlcnR5OiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHkgfCBOYXZpZ2F0aW9uUHJvcGVydHksIGlzR3JvdXAgPSBmYWxzZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmICghcHJvcGVydHkpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGlmIChpc1Byb3BlcnR5KHByb3BlcnR5KSB8fCBpc05hdmlnYXRpb25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcblx0XHRjb25zdCBkYXRhRmllbGREZWZhdWx0ID0gKHByb3BlcnR5IGFzIFByb3BlcnR5KS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQ7XG5cdFx0aWYgKGRhdGFGaWVsZERlZmF1bHQgJiYgIWRhdGFGaWVsZERlZmF1bHQucXVhbGlmaWVyICYmIGRhdGFGaWVsZERlZmF1bHQuTGFiZWwpIHtcblx0XHRcdHJldHVybiBkYXRhRmllbGREZWZhdWx0LkxhYmVsPy50b1N0cmluZygpO1xuXHRcdH1cblx0XHRyZXR1cm4gcHJvcGVydHkuYW5ub3RhdGlvbnMuQ29tbW9uPy5MYWJlbD8udG9TdHJpbmcoKSA/PyBwcm9wZXJ0eS5uYW1lO1xuXHR9IGVsc2UgaWYgKGlzRGF0YUZpZWxkVHlwZXMocHJvcGVydHkpKSB7XG5cdFx0aWYgKCEhaXNHcm91cCAmJiBwcm9wZXJ0eS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0cmV0dXJuIHByb3BlcnR5Py5MYWJlbD8udG9TdHJpbmcoKTtcblx0XHR9XG5cdFx0cmV0dXJuIChcblx0XHRcdHByb3BlcnR5Py5MYWJlbD8udG9TdHJpbmcoKSA/P1xuXHRcdFx0Y29tcGlsZUV4cHJlc3Npb24oXG5cdFx0XHRcdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihwcm9wZXJ0eS5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uTGFiZWwsIFtdLCBwcm9wZXJ0eS5WYWx1ZT8uJHRhcmdldD8ubmFtZSlcblx0XHRcdClcblx0XHQpO1xuXHR9IGVsc2UgaWYgKHByb3BlcnR5LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdHByb3BlcnR5LkxhYmVsPy50b1N0cmluZygpID8/XG5cdFx0XHRjb21waWxlRXhwcmVzc2lvbihcblx0XHRcdFx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKChwcm9wZXJ0eS5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50KT8uVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkxhYmVsPy52YWx1ZU9mKCkpXG5cdFx0XHQpXG5cdFx0KTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gcHJvcGVydHkuTGFiZWw/LnRvU3RyaW5nKCk7XG5cdH1cbn07XG5cbmNvbnN0IF9nZXRUb29sdGlwID0gZnVuY3Rpb24gKHNvdXJjZTogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0aWYgKCFzb3VyY2UpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGlmIChpc1Byb3BlcnR5KHNvdXJjZSkgfHwgc291cmNlLmFubm90YXRpb25zPy5Db21tb24/LlF1aWNrSW5mbykge1xuXHRcdHJldHVybiBzb3VyY2UuYW5ub3RhdGlvbnM/LkNvbW1vbj8uUXVpY2tJbmZvXG5cdFx0XHQ/IGNvbXBpbGVFeHByZXNzaW9uKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihzb3VyY2UuYW5ub3RhdGlvbnMuQ29tbW9uLlF1aWNrSW5mbykpXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmIChpc0RhdGFGaWVsZFR5cGVzKHNvdXJjZSkpIHtcblx0XHRyZXR1cm4gc291cmNlLlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5RdWlja0luZm9cblx0XHRcdD8gY29tcGlsZUV4cHJlc3Npb24oZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHNvdXJjZS5WYWx1ZS4kdGFyZ2V0LmFubm90YXRpb25zLkNvbW1vbi5RdWlja0luZm8pKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoc291cmNlLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uKSB7XG5cdFx0Y29uc3QgZGF0YXBvaW50VGFyZ2V0ID0gc291cmNlLlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQ7XG5cdFx0cmV0dXJuIGRhdGFwb2ludFRhcmdldD8uVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LlF1aWNrSW5mb1xuXHRcdFx0PyBjb21waWxlRXhwcmVzc2lvbihnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24oZGF0YXBvaW50VGFyZ2V0LlZhbHVlLiR0YXJnZXQuYW5ub3RhdGlvbnMuQ29tbW9uLlF1aWNrSW5mbykpXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um93U3RhdHVzVmlzaWJpbGl0eShjb2xOYW1lOiBzdHJpbmcsIGlzU2VtYW50aWNLZXlJbkZpZWxkR3JvdXA/OiBib29sZWFuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGZvcm1hdFJlc3VsdChcblx0XHRbXG5cdFx0XHRwYXRoSW5Nb2RlbChgc2VtYW50aWNLZXlIYXNEcmFmdEluZGljYXRvcmAsIFwiaW50ZXJuYWxcIiksXG5cdFx0XHRwYXRoSW5Nb2RlbChgZmlsdGVyZWRNZXNzYWdlc2AsIFwiaW50ZXJuYWxcIiksXG5cdFx0XHRjb2xOYW1lLFxuXHRcdFx0aXNTZW1hbnRpY0tleUluRmllbGRHcm91cFxuXHRcdF0sXG5cdFx0dGFibGVGb3JtYXR0ZXJzLmdldEVycm9yU3RhdHVzVGV4dFZpc2liaWxpdHlGb3JtYXR0ZXJcblx0KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJvcGVydHlJbmZvIGZvciBlYWNoIGlkZW50aWZpZWQgcHJvcGVydHkgY29uc3VtZWQgYnkgYSBMaW5lSXRlbS5cbiAqIEBwYXJhbSBjb2x1bW5zVG9CZUNyZWF0ZWQgSWRlbnRpZmllZCBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIGV4aXN0aW5nQ29sdW1ucyBUaGUgbGlzdCBvZiBjb2x1bW5zIGNyZWF0ZWQgZm9yIExpbmVJdGVtcyBhbmQgUHJvcGVydGllcyBvZiBlbnRpdHlUeXBlLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGVudGl0eSB0eXBlIGZvciB0aGUgTGluZUl0ZW1cbiAqIEBwYXJhbSBkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwIFRoZSBtYXAgb2YgcHJvcGVydGllcyByZWZlcmVuY2VkIGFzIHRleHQgb24gYSB0ZXh0IGFycmFuZ2VtZW50IGFubm90YXRpb24uXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHRhYmxlXG4gKiBAcGFyYW0gcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIFRoZSBleGlzdGluZyByZXN0cmljdGlvbnMgb24gcHJvcGVydGllc1xuICogQHJldHVybnMgVGhlIGFycmF5IG9mIGNvbHVtbnMgY3JlYXRlZC5cbiAqL1xuY29uc3QgX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zID0gZnVuY3Rpb24gKFxuXHRjb2x1bW5zVG9CZUNyZWF0ZWQ6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5Pixcblx0ZXhpc3RpbmdDb2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwOiBSZWNvcmQ8c3RyaW5nLCBEaXNwbGF5TW9kZT4sXG5cdHRhYmxlQ3JlYXRpb25Nb2RlPzogQ3JlYXRpb25Nb2RlLFxuXHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM/OiBSZXN0cmljdGlvbnNPblByb3BlcnRpZXNcbik6IEFubm90YXRpb25UYWJsZUNvbHVtbltdIHtcblx0Y29uc3QgcmVsYXRlZENvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdID0gW107XG5cdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cdE9iamVjdC5rZXlzKGNvbHVtbnNUb0JlQ3JlYXRlZCkuZm9yRWFjaCgobmFtZSkgPT4ge1xuXHRcdGNvbnN0IHByb3BlcnR5ID0gY29sdW1uc1RvQmVDcmVhdGVkW25hbWVdLFxuXHRcdFx0YW5ub3RhdGlvblBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFic29sdXRlQW5ub3RhdGlvblBhdGgobmFtZSksXG5cdFx0XHQvLyBDaGVjayB3aGV0aGVyIHRoZSByZWxhdGVkIGNvbHVtbiBhbHJlYWR5IGV4aXN0cy5cblx0XHRcdHJlbGF0ZWRDb2x1bW4gPSBleGlzdGluZ0NvbHVtbnMuZmluZCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA9PT0gbmFtZSk7XG5cdFx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcihjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCkpLmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0XHRjb25zdCBwcm9wZXJ0eU9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KGRhdGFNb2RlbE9iamVjdFBhdGgsIG5hbWUpO1xuXHRcdGlmIChpc011bHRpVmFsdWVGaWVsZChwcm9wZXJ0eU9iamVjdFBhdGgpKSB7XG5cdFx0XHRjb25zdCBuZXdOYW1lUmVsYXRpdmVUYXJnZXRQYXRoID0gZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aChwcm9wZXJ0eU9iamVjdFBhdGgsIGZhbHNlLCB0cnVlKTtcblx0XHRcdGNvbnN0IGNvbHVtbiA9IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRhbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0bmFtZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXMsXG5cdFx0XHRcdHRhYmxlQ3JlYXRpb25Nb2RlLFxuXHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdG5ld05hbWVSZWxhdGl2ZVRhcmdldFBhdGhcblx0XHRcdCk7XG5cdFx0XHRjb21wdXRlSGlkZGVuT25SZWxhdGVkQ29sdW1ucyhleGlzdGluZ0NvbHVtbnMsIG5hbWUsIGNvbHVtbik7XG5cdFx0XHR1cGRhdGVQcm9wZXJ0eUxhYmVsKGV4aXN0aW5nQ29sdW1ucywgY29sdW1uc1RvQmVDcmVhdGVkLCBjb2x1bW4sIG5hbWUpO1xuXHRcdFx0cmVsYXRlZENvbHVtbnMucHVzaChjb2x1bW4pO1xuXHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZU1hcFtuYW1lXSA9IG5ld05hbWVSZWxhdGl2ZVRhcmdldFBhdGggPz8gbmFtZTtcblx0XHR9IGVsc2UgaWYgKHJlbGF0ZWRDb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gQ2FzZSAxOiBLZXkgY29udGFpbnMgRGF0YUZpZWxkIHByZWZpeCB0byBlbnN1cmUgYWxsIHByb3BlcnR5IGNvbHVtbnMgaGF2ZSB0aGUgc2FtZSBrZXkgZm9ybWF0LlxuXHRcdFx0Ly8gTmV3IGNyZWF0ZWQgcHJvcGVydHkgY29sdW1uIGlzIHNldCB0byBoaWRkZW4uXG5cdFx0XHRjb25zdCBjb2x1bW4gPSBnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5KFxuXHRcdFx0XHRwcm9wZXJ0eSxcblx0XHRcdFx0YW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdG5hbWUsXG5cdFx0XHRcdHRydWUsXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCxcblx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHRcdFx0XHR0YWJsZUNyZWF0aW9uTW9kZVxuXHRcdFx0KTtcblx0XHRcdGNvbXB1dGVIaWRkZW5PblJlbGF0ZWRDb2x1bW5zKGV4aXN0aW5nQ29sdW1ucywgbmFtZSwgY29sdW1uKTtcblx0XHRcdHVwZGF0ZVByb3BlcnR5TGFiZWwoZXhpc3RpbmdDb2x1bW5zLCBjb2x1bW5zVG9CZUNyZWF0ZWQsIGNvbHVtbik7XG5cdFx0XHRyZWxhdGVkQ29sdW1ucy5wdXNoKGNvbHVtbik7XG5cdFx0fSBlbHNlIGlmIChyZWxhdGVkQ29sdW1uLmFubm90YXRpb25QYXRoICE9PSBhbm5vdGF0aW9uUGF0aCB8fCByZWxhdGVkQ29sdW1uLnByb3BlcnR5SW5mb3MpIHtcblx0XHRcdC8vIENhc2UgMjogVGhlIGV4aXN0aW5nIGNvbHVtbiBwb2ludHMgdG8gYSBMaW5lSXRlbSAob3IpXG5cdFx0XHQvLyBDYXNlIDM6IFRoaXMgaXMgYSBzZWxmIHJlZmVyZW5jZSBmcm9tIGFuIGV4aXN0aW5nIGNvbHVtblxuXHRcdFx0Y29uc3QgbmV3TmFtZSA9IGBQcm9wZXJ0eTo6JHtuYW1lfWA7XG5cdFx0XHQvLyBDaGVja2luZyB3aGV0aGVyIHRoZSByZWxhdGVkIHByb3BlcnR5IGNvbHVtbiBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgaW4gYSBwcmV2aW91cyBpdGVyYXRpb24uXG5cdFx0XHRpZiAoIWV4aXN0aW5nQ29sdW1ucy5zb21lKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lID09PSBuZXdOYW1lKSkge1xuXHRcdFx0XHQvLyBDcmVhdGUgYSBuZXcgcHJvcGVydHkgY29sdW1uIHdpdGggJ1Byb3BlcnR5OjonIHByZWZpeCxcblx0XHRcdFx0Ly8gU2V0IGl0IHRvIGhpZGRlbiBhcyBpdCBpcyBvbmx5IGNvbnN1bWVkIGJ5IENvbXBsZXggcHJvcGVydHkgaW5mb3MuXG5cdFx0XHRcdGNvbnN0IGNvbHVtbiA9IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdFx0YW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAsXG5cdFx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdHRhYmxlQ3JlYXRpb25Nb2RlXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbXB1dGVIaWRkZW5PblJlbGF0ZWRDb2x1bW5zKGV4aXN0aW5nQ29sdW1ucywgbmFtZSwgY29sdW1uKTtcblx0XHRcdFx0dXBkYXRlUHJvcGVydHlMYWJlbChleGlzdGluZ0NvbHVtbnMsIGNvbHVtbnNUb0JlQ3JlYXRlZCwgY29sdW1uKTtcblx0XHRcdFx0cmVsYXRlZENvbHVtbnMucHVzaChjb2x1bW4pO1xuXHRcdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lTWFwW25hbWVdID0gbmV3TmFtZTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdGV4aXN0aW5nQ29sdW1ucy5zb21lKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lID09PSBuZXdOYW1lKSAmJlxuXHRcdFx0XHRleGlzdGluZ0NvbHVtbnMuc29tZSgoY29sdW1uKSA9PiBjb2x1bW4ucHJvcGVydHlJbmZvcz8uaW5jbHVkZXMobmFtZSkpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZU1hcFtuYW1lXSA9IG5ld05hbWU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXBbbmFtZV0gPT09IFwiRGVzY3JpcHRpb25cIiAmJlxuXHRcdFx0IXJlbGF0ZWRDb2x1bW4uZmlsdGVyYWJsZSAmJlxuXHRcdFx0IXJlc3RyaWN0aW9uc09uUHJvcGVydGllcz8ubm9uRmlsdGVyYWJsZVByb3BlcnRpZXMuaW5jbHVkZXMobmFtZSlcblx0XHQpIHtcblx0XHRcdC8vIENhc2UgNDogVGhlIGNvbHVtbiBpcyBhIHJlZmVyZW5jZWQgdGV4dCBvbmx5IHByb3BlcnR5LiBTZXQgaXQgdG8gaGlkZGVuLCBub24gc29ydGFibGUgbm9yIGdyb3VwYWJsZS5cblx0XHRcdC8vIENhc2UgNTogVGhlIGNvbHVtbiBpc24ndCBhbHJlYWR5IGF2YWlsYWJsZSBmb3IgZmlsdGVyaW5nIGFzIGl0IGNvdWxkIGJlIHJlZmVyZW5jZWQgb24gYW5vdGhlciBjb2x1bW4gKGUuZy4gdGV4dCBmaXJzdCkuXG5cdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM/Lm5vblNvcnRhYmxlUHJvcGVydGllcy5wdXNoKG5hbWUpO1xuXHRcdFx0Y29uc3QgY29sdW1uID0gZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eShcblx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdGFubm90YXRpb25QYXRoLFxuXHRcdFx0XHRuYW1lLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHR7fSxcblx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHRcdFx0XHR0YWJsZUNyZWF0aW9uTW9kZVxuXHRcdFx0KTtcblx0XHRcdGNvbHVtbi5pc0dyb3VwYWJsZSA9IGZhbHNlO1xuXHRcdFx0cmVsYXRlZENvbHVtbnMucHVzaChjb2x1bW4pO1xuXHRcdH1cblx0fSk7XG5cdC8vIFRoZSBwcm9wZXJ0eSAnbmFtZScgaGFzIGJlZW4gcHJlZml4ZWQgd2l0aCAnUHJvcGVydHk6OicgZm9yIHVuaXF1ZW5lc3MuXG5cdC8vIFVwZGF0ZSB0aGUgc2FtZSBpbiBvdGhlciBwcm9wZXJ0eUluZm9zW10gcmVmZXJlbmNlcyB3aGljaCBwb2ludCB0byB0aGlzIHByb3BlcnR5LlxuXHRleGlzdGluZ0NvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG5cdFx0Y29sdW1uLnByb3BlcnR5SW5mb3MgPSBjb2x1bW4ucHJvcGVydHlJbmZvcz8ubWFwKChwcm9wZXJ0eUluZm8pID0+IHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXBbcHJvcGVydHlJbmZvXSA/PyBwcm9wZXJ0eUluZm8pO1xuXHRcdGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcyA9IGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcz8ubWFwKFxuXHRcdFx0KHByb3BlcnR5SW5mbykgPT4gcmVsYXRlZFByb3BlcnR5TmFtZU1hcFtwcm9wZXJ0eUluZm9dID8/IHByb3BlcnR5SW5mb1xuXHRcdCk7XG5cdH0pO1xuXHRyZXR1cm4gcmVsYXRlZENvbHVtbnM7XG59O1xuXG4vKipcbiAqIEdldHRpbmcgdGhlIENvbHVtbiBOYW1lXG4gKiBJZiBpdCBwb2ludHMgdG8gYSBEYXRhRmllbGQgd2l0aCBvbmUgcHJvcGVydHkgb3IgRGF0YVBvaW50IHdpdGggb25lIHByb3BlcnR5LCBpdCB3aWxsIHVzZSB0aGUgcHJvcGVydHkgbmFtZVxuICogaGVyZSB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGV4aXN0aW5nIGZsZXggY2hhbmdlcy5cbiAqIEBwYXJhbSBkYXRhRmllbGQgRGlmZmVyZW50IERhdGFGaWVsZCB0eXBlcyBkZWZpbmVkIGluIHRoZSBhbm5vdGF0aW9uc1xuICogQHJldHVybnMgVGhlIG5hbWUgb2YgYW5ub3RhdGlvbiBjb2x1bW5zXG4gKi9cbmNvbnN0IF9nZXRBbm5vdGF0aW9uQ29sdW1uTmFtZSA9IGZ1bmN0aW9uIChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpOiBzdHJpbmcge1xuXHQvLyBUaGlzIGlzIG5lZWRlZCBhcyB3ZSBoYXZlIGZsZXhpYmlsaXR5IGNoYW5nZXMgYWxyZWFkeSB0aGF0IHdlIGhhdmUgdG8gY2hlY2sgYWdhaW5zdFxuXHRpZiAoaXNEYXRhRmllbGRUeXBlcyhkYXRhRmllbGQpICYmIGRhdGFGaWVsZC5WYWx1ZT8ucGF0aCkge1xuXHRcdHJldHVybiBkYXRhRmllbGQuVmFsdWU/LnBhdGg7XG5cdH0gZWxzZSBpZiAoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uICYmIChkYXRhRmllbGQuVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludCk/LlZhbHVlPy5wYXRoKSB7XG5cdFx0Ly8gVGhpcyBpcyBmb3IgcmVtb3ZpbmcgZHVwbGljYXRlIHByb3BlcnRpZXMuIEZvciBleGFtcGxlLCAnUHJvZ3Jlc3MnIFByb3BlcnR5IGlzIHJlbW92ZWQgaWYgaXQgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIGEgRGF0YVBvaW50XG5cdFx0cmV0dXJuIChkYXRhRmllbGQuVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludCk/LlZhbHVlLnBhdGg7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKTtcblx0fVxufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBkYXRhIGZpZWxkIGxhYmVscyBoYXZlIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgdGFibGUuXG4gKiBAcGFyYW0gZmllbGRHcm91cE5hbWUgVGhlIGBEYXRhRmllbGRgIG5hbWUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMgYHNob3dEYXRhRmllbGRzTGFiZWxgIHZhbHVlIGZyb20gdGhlIG1hbmlmZXN0XG4gKi9cbmNvbnN0IF9nZXRTaG93RGF0YUZpZWxkc0xhYmVsID0gZnVuY3Rpb24gKFxuXHRmaWVsZEdyb3VwTmFtZTogc3RyaW5nLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuXHRjb25zdCBjb2x1bW5zID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uPFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uPih2aXN1YWxpemF0aW9uUGF0aCk/LmNvbHVtbnM7XG5cdGNvbnN0IGNvbHVtbktleXMgPSBjb2x1bW5zICYmIE9iamVjdC5rZXlzKGNvbHVtbnMpO1xuXHRyZXR1cm4gKFxuXHRcdGNvbHVtbktleXMgJiZcblx0XHQhIWNvbHVtbktleXMuZmluZChmdW5jdGlvbiAoa2V5OiBzdHJpbmcpIHtcblx0XHRcdHJldHVybiBrZXkgPT09IGZpZWxkR3JvdXBOYW1lICYmIChjb2x1bW5zW2tleV0gYXMgQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uRm9yT3ZlcnJpZGUpLnNob3dEYXRhRmllbGRzTGFiZWw7XG5cdFx0fSlcblx0KTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcHJvcGVydHkgd2l0aCByZXNwZWN0IHRvIHRoZSByb290IGVudGl0eS5cbiAqIEBwYXJhbSBkYXRhRmllbGQgVGhlIGBEYXRhRmllbGRgIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRoXG4gKi9cbmNvbnN0IF9nZXRSZWxhdGl2ZVBhdGggPSBmdW5jdGlvbiAoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogc3RyaW5nIHtcblx0bGV0IHJlbGF0aXZlUGF0aCA9IFwiXCI7XG5cdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0XHRyZWxhdGl2ZVBhdGggPSAoZGF0YUZpZWxkIGFzIERhdGFGaWVsZCk/LlZhbHVlPy5wYXRoO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uOlxuXHRcdFx0cmVsYXRpdmVQYXRoID0gZGF0YUZpZWxkPy5UYXJnZXQ/LnZhbHVlO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb25Hcm91cDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb25Hcm91cDpcblx0XHRcdHJlbGF0aXZlUGF0aCA9IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKTtcblx0XHRcdGJyZWFrO1xuXHR9XG5cdHJldHVybiByZWxhdGl2ZVBhdGg7XG59O1xuXG5jb25zdCBfc2xpY2VBdFNsYXNoID0gZnVuY3Rpb24gKHBhdGg6IHN0cmluZywgaXNMYXN0U2xhc2g6IGJvb2xlYW4sIGlzTGFzdFBhcnQ6IGJvb2xlYW4pOiBzdHJpbmcge1xuXHRjb25zdCBpU2xhc2hJbmRleCA9IGlzTGFzdFNsYXNoID8gcGF0aC5sYXN0SW5kZXhPZihcIi9cIikgOiBwYXRoLmluZGV4T2YoXCIvXCIpO1xuXHRpZiAoaVNsYXNoSW5kZXggPT09IC0xKSB7XG5cdFx0cmV0dXJuIHBhdGg7XG5cdH1cblx0cmV0dXJuIGlzTGFzdFBhcnQgPyBwYXRoLnN1YnN0cmluZyhpU2xhc2hJbmRleCArIDEsIHBhdGgubGVuZ3RoKSA6IHBhdGguc3Vic3RyaW5nKDAsIGlTbGFzaEluZGV4KTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgY29sdW1uIGNvbnRhaW5zIGEgbXVsdGktdmFsdWUgZmllbGQuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBEYXRhRmllbGQgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIERhdGFGaWVsZCBjb3JyZXNwb25kcyB0byBhIG11bHRpLXZhbHVlIGZpZWxkLlxuICovXG5jb25zdCBfaXNDb2x1bW5NdWx0aVZhbHVlZCA9IGZ1bmN0aW9uIChcblx0ZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IGJvb2xlYW4ge1xuXHRpZiAoaXNEYXRhRmllbGRUeXBlcyhkYXRhRmllbGQpICYmIGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKGRhdGFGaWVsZC5WYWx1ZSkpIHtcblx0XHRjb25zdCBwcm9wZXJ0eU9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KFxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksXG5cdFx0XHRkYXRhRmllbGQuVmFsdWUucGF0aFxuXHRcdCk7XG5cdFx0cmV0dXJuIGlzTXVsdGlWYWx1ZUZpZWxkKHByb3BlcnR5T2JqZWN0UGF0aCk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIGEgY29sdW1uIGlzIHNvcnRhYmxlLlxuICogQHBhcmFtIGRhdGFGaWVsZCBUaGUgZGF0YSBmaWVsZCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSBwcm9wZXJ0eVBhdGggVGhlIHByb3BlcnR5IHBhdGhcbiAqIEBwYXJhbSBub25Tb3J0YWJsZUNvbHVtbnMgQ29sbGVjdGlvbiBvZiBub24tc29ydGFibGUgY29sdW1uIG5hbWVzIGFzIHBlciBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXNJbmZvIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgbGlua2VkIHRvIHRoZSBjb2x1bW5cbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGNvbHVtbiBpcyBzb3J0YWJsZVxuICovXG5jb25zdCBfaXNDb2x1bW5Tb3J0YWJsZSA9IGZ1bmN0aW9uIChcblx0ZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHRwcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0bm9uU29ydGFibGVDb2x1bW5zOiBzdHJpbmdbXSxcblx0cmVsYXRlZFByb3BlcnRpZXNJbmZvOiBDb21wbGV4UHJvcGVydHlJbmZvXG4pOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHQhbm9uU29ydGFibGVDb2x1bW5zLmluY2x1ZGVzKHByb3BlcnR5UGF0aCkgJiYgLy8gQ29sdW1uIGlzIG5vdCBtYXJrZWQgYXMgbm9uLXNvcnRhYmxlIHZpYSBhbm5vdGF0aW9uXG5cdFx0KCgoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQgfHwgZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uKSAmJlxuXHRcdFx0T2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXMpLnNvbWUoKHByb3BOYW1lKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGlzSGlkZGVuID0gaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4ocmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbcHJvcE5hbWVdLmFubm90YXRpb25Qcm9wZXJ0eSk7XG5cdFx0XHRcdHJldHVybiAhaXNIaWRkZW4gJiYgIW5vblNvcnRhYmxlQ29sdW1ucy5pbmNsdWRlcyhwcm9wTmFtZSk7XG5cdFx0XHR9KSkgfHxcblx0XHRcdGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybCB8fFxuXHRcdFx0ZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uIHx8XG5cdFx0XHRkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb24pXG5cdCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBmaWx0ZXJpbmcgb24gdGhlIHRhYmxlIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgUmV0dXJucyAnZmFsc2UnIGlmIEZpbHRlckZ1bmN0aW9ucyBhbm5vdGF0aW9uIHN1cHBvcnRzICd0b2xvd2VyJywgZWxzZSAndHJ1ZSdcbiAqL1xuZXhwb3J0IGNvbnN0IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSA9IGZ1bmN0aW9uIChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBib29sZWFuIHtcblx0Y29uc3QgZmlsdGVyRnVuY3Rpb25zOiBGaWx0ZXJGdW5jdGlvbnMgfCB1bmRlZmluZWQgPSBfZ2V0RmlsdGVyRnVuY3Rpb25zKGNvbnZlcnRlckNvbnRleHQpO1xuXHRyZXR1cm4gTW9kZWxIZWxwZXIuaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKHVuZGVmaW5lZCwgZmlsdGVyRnVuY3Rpb25zKTtcbn07XG5cbmZ1bmN0aW9uIF9nZXRGaWx0ZXJGdW5jdGlvbnMoQ29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KTogRmlsdGVyRnVuY3Rpb25zIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgZW50aXR5U2V0ID0gQ29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKTtcblx0aWYgKFR5cGVHdWFyZHMuaXNFbnRpdHlTZXQoZW50aXR5U2V0KSkge1xuXHRcdHJldHVybiAoXG5cdFx0XHRlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5GaWx0ZXJGdW5jdGlvbnMgPz9cblx0XHRcdENvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5Q29udGFpbmVyKCkuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5GaWx0ZXJGdW5jdGlvbnNcblx0XHQpO1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmV0dXJucyBkZWZhdWx0IGZvcm1hdCBvcHRpb25zIGZvciB0ZXh0IGZpZWxkcyBpbiBhIHRhYmxlLlxuICogQHBhcmFtIGZvcm1hdE9wdGlvbnNcbiAqIEByZXR1cm5zIENvbGxlY3Rpb24gb2YgZm9ybWF0IG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlc1xuICovXG5mdW5jdGlvbiBfZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZShmb3JtYXRPcHRpb25zOiBGb3JtYXRPcHRpb25zVHlwZSB8IHVuZGVmaW5lZCk6IEZvcm1hdE9wdGlvbnNUeXBlIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIGZvcm1hdE9wdGlvbnMgPT09IHVuZGVmaW5lZFxuXHRcdD8gdW5kZWZpbmVkXG5cdFx0OiB7XG5cdFx0XHRcdHRleHRMaW5lc0VkaXQ6IDQsXG5cdFx0XHRcdC4uLmZvcm1hdE9wdGlvbnNcblx0XHQgIH07XG59XG5cbmZ1bmN0aW9uIF9maW5kU2VtYW50aWNLZXlWYWx1ZXMoc2VtYW50aWNLZXlzOiBTZW1hbnRpY0tleSwgbmFtZTogc3RyaW5nKTogeyB2YWx1ZXM6IHN0cmluZ1tdOyBzZW1hbnRpY0tleUZvdW5kOiBib29sZWFuIH0ge1xuXHRjb25zdCBhU2VtYW50aWNLZXlWYWx1ZXM6IHN0cmluZ1tdID0gW107XG5cdGxldCBiU2VtYW50aWNLZXlGb3VuZCA9IGZhbHNlO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IHNlbWFudGljS2V5cy5sZW5ndGg7IGkrKykge1xuXHRcdGFTZW1hbnRpY0tleVZhbHVlcy5wdXNoKHNlbWFudGljS2V5c1tpXS52YWx1ZSk7XG5cdFx0aWYgKHNlbWFudGljS2V5c1tpXS52YWx1ZSA9PT0gbmFtZSkge1xuXHRcdFx0YlNlbWFudGljS2V5Rm91bmQgPSB0cnVlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4ge1xuXHRcdHZhbHVlczogYVNlbWFudGljS2V5VmFsdWVzLFxuXHRcdHNlbWFudGljS2V5Rm91bmQ6IGJTZW1hbnRpY0tleUZvdW5kXG5cdH07XG59XG5cbmZ1bmN0aW9uIF9maW5kUHJvcGVydGllcyhcblx0c2VtYW50aWNLZXlWYWx1ZXM6IHN0cmluZ1tdLFxuXHRmaWVsZEdyb3VwUHJvcGVydGllczogc3RyaW5nW11cbik6IHsgc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cDogYm9vbGVhbjsgZmllbGRHcm91cFByb3BlcnR5UGF0aD86IHN0cmluZyB9IHtcblx0bGV0IHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXAgPSBmYWxzZTtcblx0bGV0IHNQcm9wZXJ0eVBhdGg7XG5cdGlmIChzZW1hbnRpY0tleVZhbHVlcyAmJiBzZW1hbnRpY0tleVZhbHVlcy5sZW5ndGggPj0gMSAmJiBmaWVsZEdyb3VwUHJvcGVydGllcyAmJiBmaWVsZEdyb3VwUHJvcGVydGllcy5sZW5ndGggPj0gMSkge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc2VtYW50aWNLZXlWYWx1ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmIChbc2VtYW50aWNLZXlWYWx1ZXNbaV1dLnNvbWUoKHRtcCkgPT4gZmllbGRHcm91cFByb3BlcnRpZXMuaW5jbHVkZXModG1wKSkpIHtcblx0XHRcdFx0c2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCA9IHRydWU7XG5cdFx0XHRcdHNQcm9wZXJ0eVBhdGggPSBzZW1hbnRpY0tleVZhbHVlc1tpXTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7XG5cdFx0c2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cDogc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCxcblx0XHRmaWVsZEdyb3VwUHJvcGVydHlQYXRoOiBzUHJvcGVydHlQYXRoXG5cdH07XG59XG5cbi8qKlxuICogRmluZCB0aGUgZmlyc3QgcHJvcGVydHkgaW4gdGhlIGZpZWxkR3JvdXAgdGhhdCBpcyBwYXJ0IG9mIHRoZSBzZW1hbnRpYyBrZXlzLlxuICogQHBhcmFtIGRhdGFGaWVsZEdyb3VwXG4gKiBAcGFyYW0gc2VtYW50aWNLZXlWYWx1ZXNcbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIGEgZmxhZyB0cnVlIGlmIGEgcHJvcGVydHkgaXMgZm91bmQgYW5kIGEgcHJvcGVydHlQYXRoLlxuICovXG5mdW5jdGlvbiBfZmluZFNlbWFudGljS2V5VmFsdWVzSW5GaWVsZEdyb3VwKFxuXHRkYXRhRmllbGRHcm91cDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IG51bGwsXG5cdHNlbWFudGljS2V5VmFsdWVzOiBzdHJpbmdbXVxuKTogeyBzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBib29sZWFuOyBwcm9wZXJ0eVBhdGg/OiBzdHJpbmcgfSB7XG5cdC8vIHRoaXMgaW5mbyBpcyB1c2VkIGluIEZpZWxkSGVscGVyI2lzRHJhZnRJbmRpY2F0b3JWaXNpYmxlSW5GaWVsZEdyb3VwIHRvIHNob3cgYSBkcmFmdCBpbmRpY2F0b3IgYXQgdGhlIGVuZCBvZiBhIGZpZWxkIGdyb3VwXG5cdGNvbnN0IGFQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRsZXQgX3Byb3BlcnRpZXNGb3VuZDogeyBzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBib29sZWFuOyBmaWVsZEdyb3VwUHJvcGVydHlQYXRoPzogc3RyaW5nIH0gPSB7XG5cdFx0c2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cDogZmFsc2UsXG5cdFx0ZmllbGRHcm91cFByb3BlcnR5UGF0aDogdW5kZWZpbmVkXG5cdH07XG5cdGlmIChcblx0XHRkYXRhRmllbGRHcm91cCAmJlxuXHRcdGRhdGFGaWVsZEdyb3VwLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uICYmXG5cdFx0ZGF0YUZpZWxkR3JvdXAuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRmllbGRHcm91cFR5cGVcblx0KSB7XG5cdFx0ZGF0YUZpZWxkR3JvdXAuVGFyZ2V0LiR0YXJnZXQuRGF0YT8uZm9yRWFjaCgoaW5uZXJEYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRcdGlmIChcblx0XHRcdFx0KGlubmVyRGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQgfHwgaW5uZXJEYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmwpICYmXG5cdFx0XHRcdGlubmVyRGF0YUZpZWxkLlZhbHVlXG5cdFx0XHQpIHtcblx0XHRcdFx0YVByb3BlcnRpZXMucHVzaChpbm5lckRhdGFGaWVsZC5WYWx1ZS5wYXRoKTtcblx0XHRcdH1cblx0XHRcdF9wcm9wZXJ0aWVzRm91bmQgPSBfZmluZFByb3BlcnRpZXMoc2VtYW50aWNLZXlWYWx1ZXMsIGFQcm9wZXJ0aWVzKTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXA6IF9wcm9wZXJ0aWVzRm91bmQuc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCxcblx0XHRwcm9wZXJ0eVBhdGg6IF9wcm9wZXJ0aWVzRm91bmQuZmllbGRHcm91cFByb3BlcnR5UGF0aFxuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgZGVmYXVsdCBmb3JtYXQgb3B0aW9ucyB3aXRoIGRyYWZ0SW5kaWNhdG9yIGZvciBhIGNvbHVtbi5cbiAqIEBwYXJhbSBuYW1lXG4gKiBAcGFyYW0gc2VtYW50aWNLZXlzXG4gKiBAcGFyYW0gZGF0YUZpZWxkR3JvdXBcbiAqIEByZXR1cm5zIENvbGxlY3Rpb24gb2YgZm9ybWF0IG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlc1xuICovXG5mdW5jdGlvbiBnZXREZWZhdWx0RHJhZnRJbmRpY2F0b3JGb3JDb2x1bW4oXG5cdG5hbWU6IHN0cmluZyxcblx0c2VtYW50aWNLZXlzOiBTZW1hbnRpY0tleSxcblx0ZGF0YUZpZWxkR3JvdXA6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBudWxsXG4pOiBQYXJ0aWFsPHtcblx0ZmllbGRHcm91cERyYWZ0SW5kaWNhdG9yUHJvcGVydHlQYXRoOiBzdHJpbmc7XG5cdGZpZWxkR3JvdXBOYW1lOiBzdHJpbmc7XG5cdHNob3dFcnJvck9iamVjdFN0YXR1czogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG5cdGhhc0RyYWZ0SW5kaWNhdG9yOiBib29sZWFuO1xufT4ge1xuXHRpZiAoIXNlbWFudGljS2V5cykge1xuXHRcdHJldHVybiB7fTtcblx0fVxuXHRjb25zdCBzZW1hbnRpY0tleSA9IF9maW5kU2VtYW50aWNLZXlWYWx1ZXMoc2VtYW50aWNLZXlzLCBuYW1lKTtcblx0Y29uc3Qgc2VtYW50aWNLZXlJbkZpZWxkR3JvdXAgPSBfZmluZFNlbWFudGljS2V5VmFsdWVzSW5GaWVsZEdyb3VwKGRhdGFGaWVsZEdyb3VwLCBzZW1hbnRpY0tleS52YWx1ZXMpO1xuXHRpZiAoc2VtYW50aWNLZXlJbkZpZWxkR3JvdXAuc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCkge1xuXHRcdC8vIFNlbWFudGljIEtleSBoYXMgYSBwcm9wZXJ0eSBpbiBhIEZpZWxkR3JvdXBcblx0XHRyZXR1cm4ge1xuXHRcdFx0Ly9UT0RPIHdlIHNob3VsZCByYXRoZXIgc3RvcmUgaGFzU2VtYW50aWNLZXlJbkZpZWxkR3JvdXBcblx0XHRcdGZpZWxkR3JvdXBEcmFmdEluZGljYXRvclByb3BlcnR5UGF0aDogc2VtYW50aWNLZXlJbkZpZWxkR3JvdXAucHJvcGVydHlQYXRoLFxuXHRcdFx0ZmllbGRHcm91cE5hbWU6IG5hbWUsXG5cdFx0XHRzaG93RXJyb3JPYmplY3RTdGF0dXM6IGNvbXBpbGVFeHByZXNzaW9uKGdldFJvd1N0YXR1c1Zpc2liaWxpdHkobmFtZSwgdHJ1ZSkpXG5cdFx0fTtcblx0fSBlbHNlIGlmIChzZW1hbnRpY0tleS5zZW1hbnRpY0tleUZvdW5kKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGhhc0RyYWZ0SW5kaWNhdG9yOiB0cnVlLFxuXHRcdFx0c2hvd0Vycm9yT2JqZWN0U3RhdHVzOiBjb21waWxlRXhwcmVzc2lvbihnZXRSb3dTdGF0dXNWaXNpYmlsaXR5KG5hbWUsIGZhbHNlKSlcblx0XHR9O1xuXHR9XG5cdHJldHVybiB7fTtcbn1cblxuZnVuY3Rpb24gX2dldEltcE51bWJlcihkYXRhRmllbGQ6IERhdGFGaWVsZFR5cGVzKTogbnVtYmVyIHtcblx0Y29uc3QgaW1wb3J0YW5jZSA9IGRhdGFGaWVsZD8uYW5ub3RhdGlvbnM/LlVJPy5JbXBvcnRhbmNlIGFzIHN0cmluZztcblx0aWYgKGltcG9ydGFuY2UgJiYgaW1wb3J0YW5jZS5pbmNsdWRlcyhcIlVJLkltcG9ydGFuY2VUeXBlL0hpZ2hcIikpIHtcblx0XHRyZXR1cm4gMztcblx0fVxuXHRpZiAoaW1wb3J0YW5jZSAmJiBpbXBvcnRhbmNlLmluY2x1ZGVzKFwiVUkuSW1wb3J0YW5jZVR5cGUvTWVkaXVtXCIpKSB7XG5cdFx0cmV0dXJuIDI7XG5cdH1cblx0aWYgKGltcG9ydGFuY2UgJiYgaW1wb3J0YW5jZS5pbmNsdWRlcyhcIlVJLkltcG9ydGFuY2VUeXBlL0xvd1wiKSkge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cdHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBfZ2V0RGF0YUZpZWxkSW1wb3J0YW5jZShkYXRhRmllbGQ6IERhdGFGaWVsZFR5cGVzKTogSW1wb3J0YW5jZSB7XG5cdGNvbnN0IGltcG9ydGFuY2UgPSBkYXRhRmllbGQ/LmFubm90YXRpb25zPy5VST8uSW1wb3J0YW5jZSBhcyBzdHJpbmc7XG5cdHJldHVybiBpbXBvcnRhbmNlID8gKGltcG9ydGFuY2Uuc3BsaXQoXCIvXCIpWzFdIGFzIEltcG9ydGFuY2UpIDogSW1wb3J0YW5jZS5Ob25lO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIGV4cG9ydCBzZXR0aW5ncyBvZiBhIGNvbHVtbiBjb250YWluaW5nIGRhdGFwb2ludHMuXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHJlZmVyZW5jZWQgb24gYSBnaXZlbiBjb2x1bW5cbiAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiB0byBiZSB1cGRhdGVkXG4gKi9cbmZ1bmN0aW9uIF9zZXRFeHBvcnRTZXR0aW5nc0ZvckRhdGFQb2ludChwcm9wZXJ0eTogUHJvcGVydHksIGNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uKTogdm9pZCB7XG5cdGNvbnN0IHRhcmdldFZhbHVlZnJvbURQID0gZ2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludChwcm9wZXJ0eSk7XG5cdGlmIChcblx0XHRpc0RhdGFQb2ludEZyb21EYXRhRmllbGREZWZhdWx0KHByb3BlcnR5KSAmJlxuXHRcdHR5cGVvZiB0YXJnZXRWYWx1ZWZyb21EUCA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdGNvbHVtbi5leHBvcnRTZXR0aW5ncyAmJlxuXHRcdGNvbHVtbi5leHBvcnRTZXR0aW5ncz8udW5pdCAhPT0gXCIlXCJcblx0KSB7XG5cdFx0Y29sdW1uLmV4cG9ydERhdGFQb2ludFRhcmdldFZhbHVlID0gdGFyZ2V0VmFsdWVmcm9tRFA7XG5cdFx0Y29sdW1uLmV4cG9ydFNldHRpbmdzLnRlbXBsYXRlID0gXCJ7MH0vXCIgKyB0YXJnZXRWYWx1ZWZyb21EUDtcblx0fVxufVxuXG5mdW5jdGlvbiBfZ2V0TWF4SW1wb3J0YW5jZShmaWVsZHM6IERhdGFGaWVsZFR5cGVzW10pOiBJbXBvcnRhbmNlIHtcblx0aWYgKGZpZWxkcyAmJiBmaWVsZHMubGVuZ3RoID4gMCkge1xuXHRcdGxldCBtYXhJbXBOdW1iZXIgPSAtMTtcblx0XHRsZXQgaW1wTnVtYmVyID0gLTE7XG5cdFx0bGV0IERhdGFGaWVsZFdpdGhNYXhJbXBvcnRhbmNlO1xuXHRcdGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG5cdFx0XHRpbXBOdW1iZXIgPSBfZ2V0SW1wTnVtYmVyKGZpZWxkKTtcblx0XHRcdGlmIChpbXBOdW1iZXIgPiBtYXhJbXBOdW1iZXIpIHtcblx0XHRcdFx0bWF4SW1wTnVtYmVyID0gaW1wTnVtYmVyO1xuXHRcdFx0XHREYXRhRmllbGRXaXRoTWF4SW1wb3J0YW5jZSA9IGZpZWxkO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gX2dldERhdGFGaWVsZEltcG9ydGFuY2UoRGF0YUZpZWxkV2l0aE1heEltcG9ydGFuY2UgYXMgRGF0YUZpZWxkVHlwZXMpO1xuXHR9XG5cdHJldHVybiBJbXBvcnRhbmNlLk5vbmU7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW1wb3J0YW5jZSB2YWx1ZSBmb3IgYSBjb2x1bW4uXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIGRhdGFGaWVsZFxuICogQHJldHVybnMgVGhlIGltcG9ydGFuY2UgdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEltcG9ydGFuY2UoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgdW5kZWZpbmVkXG4pOiBJbXBvcnRhbmNlIHwgdW5kZWZpbmVkIHtcblx0aWYgKCFkYXRhRmllbGQpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGNvbnN0IHNlbWFudGljS2V5cyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnMuQ29tbW9uPy5TZW1hbnRpY0tleSA/PyBbXTtcblx0Y29uc3QgcmVxdWlyZWRQcm9wZXJ0aWVzID0gZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBoaWdoS2V5cyA9IFsuLi5zZW1hbnRpY0tleXMsIC4uLnJlcXVpcmVkUHJvcGVydGllc10ubWFwKChwcm9wZXJ0eVBhdGgpID0+IHByb3BlcnR5UGF0aC4kdGFyZ2V0Py5mdWxseVF1YWxpZmllZE5hbWUpO1xuXHQvL0V2YWx1YXRlIGRlZmF1bHQgSW1wb3J0YW5jZSBpcyBub3Qgc2V0IGV4cGxpY2l0bHlcblx0bGV0IGZpZWxkc1dpdGhJbXBvcnRhbmNlO1xuXHRpZiAoaXNBbm5vdGF0aW9uT2ZUeXBlPERhdGFGaWVsZEZvckFubm90YXRpb24+KGRhdGFGaWVsZCwgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikpIHtcblx0XHRjb25zdCBkYXRhRmllbGRUYXJnZXQgPSBkYXRhRmllbGQuVGFyZ2V0LiR0YXJnZXQ7XG5cdFx0aWYgKGlzQW5ub3RhdGlvbk9mVHlwZTxGaWVsZEdyb3VwPihkYXRhRmllbGRUYXJnZXQsIFVJQW5ub3RhdGlvblR5cGVzLkZpZWxkR3JvdXBUeXBlKSkge1xuXHRcdFx0Y29uc3QgZmllbGRHcm91cERhdGEgPSBkYXRhRmllbGRUYXJnZXQuRGF0YTtcblx0XHRcdC8vSWYgYSBGaWVsZEdyb3VwIGNvbnRhaW5zIGEgc2VtYW50aWNLZXkgb3IgcmVxdWlyZWQgcHJvcGVydHksIGltcG9ydGFuY2Ugc2V0IHRvIEhpZ2hcblx0XHRcdGlmIChcblx0XHRcdFx0ZmllbGRHcm91cERhdGEuc29tZShmdW5jdGlvbiAoZmllbGRHcm91cERhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IGJvb2xlYW4ge1xuXHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRpc0RhdGFGaWVsZFR5cGVzKGZpZWxkR3JvdXBEYXRhRmllbGQpICYmIGhpZ2hLZXlzLmluY2x1ZGVzKGZpZWxkR3JvdXBEYXRhRmllbGQuVmFsdWU/LiR0YXJnZXQ/LmZ1bGx5UXVhbGlmaWVkTmFtZSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiBJbXBvcnRhbmNlLkhpZ2g7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvL0lmIHRoZSBEYXRhRmllbGRGb3JBbm5vdGF0aW9uIGhhcyBhbiBJbXBvcnRhbmNlIHdlIHRha2UgaXRcblx0XHRcdFx0aWYgKGRhdGFGaWVsZD8uYW5ub3RhdGlvbnM/LlVJPy5JbXBvcnRhbmNlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIF9nZXREYXRhRmllbGRJbXBvcnRhbmNlKGRhdGFGaWVsZCBhcyB1bmtub3duIGFzIERhdGFGaWVsZFR5cGVzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBlbHNlIHRoZSBoaWdoZXN0IGltcG9ydGFuY2UgKGlmIGFueSkgaXMgcmV0dXJuZWRcblx0XHRcdFx0ZmllbGRzV2l0aEltcG9ydGFuY2UgPSBmaWVsZEdyb3VwRGF0YS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcblx0XHRcdFx0XHRyZXR1cm4gaXRlbT8uYW5ub3RhdGlvbnM/LlVJPy5JbXBvcnRhbmNlO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIF9nZXRNYXhJbXBvcnRhbmNlKGZpZWxkc1dpdGhJbXBvcnRhbmNlIGFzIERhdGFGaWVsZFR5cGVzW10pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gaGlnaEtleXMuaW5jbHVkZXMoKGRhdGFGaWVsZCBhcyBEYXRhRmllbGRUeXBlcykuVmFsdWU/LiR0YXJnZXQ/LmZ1bGx5UXVhbGlmaWVkTmFtZSlcblx0XHQ/IEltcG9ydGFuY2UuSGlnaFxuXHRcdDogX2dldERhdGFGaWVsZEltcG9ydGFuY2UoZGF0YUZpZWxkIGFzIHVua25vd24gYXMgRGF0YUZpZWxkVHlwZXMpO1xufVxuXG4vKipcbiAqIFJldHVybnMgbGluZSBpdGVtcyBmcm9tIG1ldGFkYXRhIGFubm90YXRpb25zLlxuICogQHBhcmFtIGxpbmVJdGVtQW5ub3RhdGlvbiBDb2xsZWN0aW9uIG9mIGRhdGEgZmllbGRzIHdpdGggdGhlaXIgYW5ub3RhdGlvbnNcbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGhlIHRhYmxlIHR5cGVcbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aCBUaGUgdmlzdWFsaXphdGlvbiBwYXRoXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBjb2x1bW5zIGZyb20gdGhlIGFubm90YXRpb25zXG4gKi9cbmNvbnN0IGdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMgPSBmdW5jdGlvbiAoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IEFubm90YXRpb25UYWJsZUNvbHVtbltdIHtcblx0Y29uc3QgZW50aXR5VHlwZTogRW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKSxcblx0XHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10gPSBbXSxcblx0XHRjb2x1bW5zVG9CZUNyZWF0ZWQ6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5PiA9IHt9LFxuXHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXA6IFJlY29yZDxzdHJpbmcsIERpc3BsYXlNb2RlPiA9IHt9LFxuXHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyA9IGdldFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHR0YWJsZU1hbmlmZXN0U2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKSxcblx0XHRkZWZhdWx0Q3JlYXRpb25Nb2RlID1cblx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuZ2V0U2FwRmVNYW5pZmVzdENvbmZpZ3VyYXRpb24oKT8ubWFjcm9zPy50YWJsZT8uZGVmYXVsdENyZWF0aW9uTW9kZSA9PT1cblx0XHRcdFwiSW5saW5lQ3JlYXRpb25Sb3dzXCJcblx0XHRcdFx0PyBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdHRhYmxlQ3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUgPVxuXHRcdFx0dGFibGVNYW5pZmVzdFNldHRpbmdzPy50YWJsZVNldHRpbmdzPy5jcmVhdGlvbk1vZGU/Lm5hbWUgPz8gZGVmYXVsdENyZWF0aW9uTW9kZSA/PyBDcmVhdGlvbk1vZGUuSW5saW5lO1xuXHRjb25zdCBzZW1hbnRpY0tleXM6IFNlbWFudGljS2V5ID0gY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uc0J5VGVybShcIkNvbW1vblwiLCBDb21tb25Bbm5vdGF0aW9uVGVybXMuU2VtYW50aWNLZXksIFtcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKVxuXHRdKVswXSBhcyBTZW1hbnRpY0tleTtcblx0aWYgKGxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdGNvbnN0IHRhYmxlQ29udmVydGVyQ29udGV4dCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcjxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KFxuXHRcdFx0Z2V0VGFyZ2V0T2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSlcblx0XHQpO1xuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbi5mb3JFYWNoKChkYXRhRmllbGQpID0+IHtcblx0XHRcdC8vIFRPRE86IHZhcmlhYmxlIG5hbWUgc2hvdWxkIGJlIGRhdGFmaWVsZCBhbmQgbm90IGxpbmVJdGVtXG5cdFx0XHRpZiAoIV9pc1ZhbGlkQ29sdW1uKGRhdGFGaWVsZCkpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bGV0IGV4cG9ydFNldHRpbmdzOiBQcm9wZXJ0eUluZm9bXCJleHBvcnRTZXR0aW5nc1wiXSA9IG51bGw7XG5cdFx0XHRjb25zdCBzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoID1cblx0XHRcdFx0aXNEYXRhRmllbGRUeXBlcyhkYXRhRmllbGQpICYmIGRhdGFGaWVsZC5WYWx1ZT8uJHRhcmdldD8uZnVsbHlRdWFsaWZpZWROYW1lXG5cdFx0XHRcdFx0PyBnZXRTZW1hbnRpY09iamVjdFBhdGgoY29udmVydGVyQ29udGV4dCwgZGF0YUZpZWxkKVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgcmVsYXRpdmVQYXRoID0gX2dldFJlbGF0aXZlUGF0aChkYXRhRmllbGQpO1xuXHRcdFx0Ly8gRGV0ZXJtaW5lIHByb3BlcnRpZXMgd2hpY2ggYXJlIGNvbnN1bWVkIGJ5IHRoaXMgTGluZUl0ZW0uXG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm8gPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseShkYXRhRmllbGQsIGNvbnZlcnRlckNvbnRleHQsIHRhYmxlVHlwZSk7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBhZGRpdGlvbmFsUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXMpO1xuXHRcdFx0Y29uc3QgZ3JvdXBQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQgPSByZWxhdGl2ZVBhdGggPyBfc2xpY2VBdFNsYXNoKHJlbGF0aXZlUGF0aCwgdHJ1ZSwgZmFsc2UpIDogdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgaXNHcm91cDogYm9vbGVhbiA9IGdyb3VwUGF0aCAhPSByZWxhdGl2ZVBhdGg7XG5cdFx0XHRjb25zdCBsYWJlbCA9IGdldExhYmVsKGRhdGFGaWVsZCwgaXNHcm91cCk7XG5cdFx0XHRjb25zdCBuYW1lID0gX2dldEFubm90YXRpb25Db2x1bW5OYW1lKGRhdGFGaWVsZCk7XG5cdFx0XHRjb25zdCBpc0ZpZWxkR3JvdXBDb2x1bW46IGJvb2xlYW4gPSBncm91cFBhdGggPyBncm91cFBhdGguaW5jbHVkZXMoYEAke1VJQW5ub3RhdGlvblRlcm1zLkZpZWxkR3JvdXB9YCkgOiBmYWxzZTtcblx0XHRcdGNvbnN0IHNob3dEYXRhRmllbGRzTGFiZWw6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBpc0ZpZWxkR3JvdXBDb2x1bW5cblx0XHRcdFx0PyBfZ2V0U2hvd0RhdGFGaWVsZHNMYWJlbChuYW1lLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dClcblx0XHRcdFx0OiBmYWxzZTtcblx0XHRcdGNvbnN0IGRhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBnZXREYXRhRmllbGREYXRhVHlwZShkYXRhRmllbGQpO1xuXHRcdFx0Y29uc3QgZm9ybWF0T3B0aW9ucyA9IF9nZXREZWZhdWx0Rm9ybWF0T3B0aW9uc0ZvclRhYmxlKGdldERlZmF1bHREcmFmdEluZGljYXRvckZvckNvbHVtbihuYW1lLCBzZW1hbnRpY0tleXMsIGRhdGFGaWVsZCkpO1xuXHRcdFx0Y29uc3QgcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8RGF0YUZpZWxkQWJzdHJhY3RUeXBlcz4oXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLFxuXHRcdFx0XHRyZWxhdGl2ZVBhdGhcblx0XHRcdCk7XG5cdFx0XHQvLyBEZXRlcm1pbmUgaWYgd2UgbmVlZCBhIHNpdHVhdGlvbnMgaW5kaWNhdG9yXG5cdFx0XHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydGllczogTmF2aWdhdGlvblByb3BlcnR5W10gPSBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5uYXZpZ2F0aW9uUHJvcGVydGllcztcblx0XHRcdGNvbnN0IHNpdHVhdGlvbnNOYXZQcm9wcyA9IG5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZpbHRlcihcblx0XHRcdFx0KG5hdmlnYXRpb25Qcm9wZXJ0eSkgPT5cblx0XHRcdFx0XHQhbmF2aWdhdGlvblByb3BlcnR5LmlzQ29sbGVjdGlvbiAmJlxuXHRcdFx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0eS50YXJnZXRUeXBlLmFubm90YXRpb25zLkNvbW1vbj8uU0FQT2JqZWN0Tm9kZVR5cGU/Lk5hbWUgPT09IFwiQnVzaW5lc3NTaXR1YXRpb25cIlxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHNpdHVhdGlvbnNOYXZQcm9wOiBOYXZpZ2F0aW9uUHJvcGVydHkgfCB1bmRlZmluZWQgPSBzaXR1YXRpb25zTmF2UHJvcHMubGVuZ3RoID49IDEgPyBzaXR1YXRpb25zTmF2UHJvcHNbMF0gOiB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoc2l0dWF0aW9uc05hdlByb3AgJiYgZm9ybWF0T3B0aW9ucykge1xuXHRcdFx0XHRmb3JtYXRPcHRpb25zLmhhc1NpdHVhdGlvbnNJbmRpY2F0b3IgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0XHRcdGlmIChcblx0XHRcdFx0ZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uICYmXG5cdFx0XHRcdGRhdGFGaWVsZC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZVxuXHRcdFx0KSB7XG5cdFx0XHRcdGZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyA9IF9nZXRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMoZGF0YUZpZWxkKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGlzTXVsdGlWYWx1ZSA9IF9pc0NvbHVtbk11bHRpVmFsdWVkKGRhdGFGaWVsZCwgdGFibGVDb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdGlmICghaXNNdWx0aVZhbHVlICYmIF9pc0V4cG9ydGFibGVDb2x1bW4oZGF0YUZpZWxkKSkge1xuXHRcdFx0XHQvL2V4Y2x1ZGUgdGhlIHR5cGVzIGxpc3RlZCBhYm92ZSBmb3IgdGhlIEV4cG9ydCAoZ2VuZXJhdGVzIGVycm9yIG9uIEV4cG9ydCBhcyBQREYpXG5cdFx0XHRcdGV4cG9ydFNldHRpbmdzID0gY3JlYXRlQ29sdW1uRXhwb3J0U2V0dGluZ3MoZGF0YUZpZWxkLCByZWxhdGVkUHJvcGVydGllc0luZm8pO1xuXHRcdFx0fVxuXHRcdFx0bGV0IHByb3BlcnR5VHlwZUNvbmZpZzogUHJvcGVydHlUeXBlQ29uZmlnIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKGRhdGFUeXBlKSB7XG5cdFx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZyA9IGdldFR5cGVDb25maWcoZGF0YUZpZWxkLCBkYXRhVHlwZSk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCB0eXBlQ29uZmlnOiBQcm9wZXJ0eVR5cGVDb25maWcgPSB7XG5cdFx0XHRcdGNsYXNzTmFtZTogZGF0YVR5cGUgYXMga2V5b2YgdHlwZW9mIERlZmF1bHRUeXBlRm9yRWRtVHlwZSxcblx0XHRcdFx0Zm9ybWF0T3B0aW9uczoge1xuXHRcdFx0XHRcdC4uLmZvcm1hdE9wdGlvbnMsXG5cdFx0XHRcdFx0Li4ucHJvcGVydHlUeXBlQ29uZmlnPy5mb3JtYXRPcHRpb25zXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGNvbnN0cmFpbnRzOiB7IC4uLnByb3BlcnR5VHlwZUNvbmZpZz8uY29uc3RyYWludHMgfVxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IHZpc3VhbFNldHRpbmdzOiBWaXN1YWxTZXR0aW5ncyA9IHt9O1xuXHRcdFx0aWYgKCFkYXRhVHlwZSB8fCAhdHlwZUNvbmZpZykge1xuXHRcdFx0XHQvLyBmb3IgY2hhcnRzXG5cdFx0XHRcdHZpc3VhbFNldHRpbmdzLndpZHRoQ2FsY3VsYXRpb24gPSBudWxsO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgc29ydGFibGUgPVxuXHRcdFx0XHQhaXNNdWx0aVZhbHVlICYmXG5cdFx0XHRcdF9pc0NvbHVtblNvcnRhYmxlKGRhdGFGaWVsZCwgcmVsYXRpdmVQYXRoLCByZXN0cmljdGlvbnNPblByb3BlcnRpZXMubm9uU29ydGFibGVQcm9wZXJ0aWVzLCByZWxhdGVkUHJvcGVydGllc0luZm8pO1xuXHRcdFx0Y29uc3QgYXZhaWxhYmlsaXR5ID0gaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4oZGF0YUZpZWxkKSA/IFwiSGlkZGVuXCIgOiBcIkRlZmF1bHRcIjtcblx0XHRcdGNvbnN0IGNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uID0ge1xuXHRcdFx0XHRrZXk6IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKSxcblx0XHRcdFx0dHlwZTogQ29sdW1uVHlwZS5Bbm5vdGF0aW9uLFxuXHRcdFx0XHRsYWJlbDogbGFiZWwgPz8gbmFtZSxcblx0XHRcdFx0Z3JvdXBMYWJlbDogaXNHcm91cCA/IGdldExhYmVsKGRhdGFGaWVsZCkgOiB1bmRlZmluZWQsXG5cdFx0XHRcdGdyb3VwOiBpc0dyb3VwID8gZ3JvdXBQYXRoIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnM6IGZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyxcblx0XHRcdFx0YW5ub3RhdGlvblBhdGg6IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChkYXRhRmllbGQuZnVsbHlRdWFsaWZpZWROYW1lKSxcblx0XHRcdFx0c2VtYW50aWNPYmplY3RQYXRoOiBzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoLFxuXHRcdFx0XHRhdmFpbGFiaWxpdHk6IGF2YWlsYWJpbGl0eSxcblx0XHRcdFx0bmFtZTogbmFtZSxcblx0XHRcdFx0c2hvd0RhdGFGaWVsZHNMYWJlbDogc2hvd0RhdGFGaWVsZHNMYWJlbCxcblx0XHRcdFx0cmVxdWlyZWQ6IGlzUmVxdWlyZWRDb2x1bW4oY29udmVydGVyQ29udGV4dCwgZGF0YUZpZWxkIGFzIERhdGFGaWVsZFR5cGVzLCB0YWJsZUNyZWF0aW9uTW9kZSksXG5cdFx0XHRcdHJlbGF0aXZlUGF0aDogcmVsYXRpdmVQYXRoLFxuXHRcdFx0XHRzb3J0YWJsZTogc29ydGFibGUsXG5cdFx0XHRcdHByb3BlcnR5SW5mb3M6IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmxlbmd0aCA/IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRhZGRpdGlvbmFsUHJvcGVydHlJbmZvczogYWRkaXRpb25hbFByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCA/IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRleHBvcnRTZXR0aW5nczogZXhwb3J0U2V0dGluZ3MsXG5cdFx0XHRcdHdpZHRoOiAoZGF0YUZpZWxkLmFubm90YXRpb25zPy5IVE1MNT8uQ3NzRGVmYXVsdHM/LndpZHRoPy52YWx1ZU9mKCkgYXMgc3RyaW5nKSB8fCB1bmRlZmluZWQsXG5cdFx0XHRcdGltcG9ydGFuY2U6IGdldEltcG9ydGFuY2UoY29udmVydGVyQ29udGV4dCwgZGF0YUZpZWxkIGFzIERhdGFGaWVsZFR5cGVzKSxcblx0XHRcdFx0aXNOYXZpZ2FibGU6IHRydWUsXG5cdFx0XHRcdGZvcm1hdE9wdGlvbnM6IGZvcm1hdE9wdGlvbnMsXG5cdFx0XHRcdGNhc2VTZW5zaXRpdmU6IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHRcdFx0dHlwZUNvbmZpZzogdHlwZUNvbmZpZyxcblx0XHRcdFx0dmlzdWFsU2V0dGluZ3M6IHZpc3VhbFNldHRpbmdzIGFzIFByb3BlcnR5SW5mb1tcInZpc3VhbFNldHRpbmdzXCJdLFxuXHRcdFx0XHR0aW1lem9uZVRleHQ6IGV4cG9ydFNldHRpbmdzPy50aW1lem9uZSxcblx0XHRcdFx0aXNQYXJ0T2ZMaW5lSXRlbTogdHJ1ZSxcblx0XHRcdFx0ZGF0YVR5cGU6IGRhdGFUeXBlID8/IChcIkVkbS5TdHJpbmdcIiBhcyBrZXlvZiB0eXBlb2YgRGVmYXVsdFR5cGVGb3JFZG1UeXBlKSxcblx0XHRcdFx0aXNNdWx0aVZhbHVlXG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgdG9vbHRpcCA9IF9nZXRUb29sdGlwKGRhdGFGaWVsZCkgPz8gbGFiZWw7XG5cdFx0XHRpZiAodG9vbHRpcCkge1xuXHRcdFx0XHRjb2x1bW4udG9vbHRpcCA9IHRvb2x0aXA7XG5cdFx0XHR9XG5cdFx0XHRpZiAocmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFNldHRpbmdzLmRhdGFQb2ludFRhcmdldFZhbHVlKSB7XG5cdFx0XHRcdGNvbHVtbi5leHBvcnREYXRhUG9pbnRUYXJnZXRWYWx1ZSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5leHBvcnRTZXR0aW5ncy5kYXRhUG9pbnRUYXJnZXRWYWx1ZTtcblx0XHRcdH1cblx0XHRcdGFubm90YXRpb25Db2x1bW5zLnB1c2goY29sdW1uKTtcblx0XHRcdC8vIENvbGxlY3QgaW5mb3JtYXRpb24gb2YgcmVsYXRlZCBjb2x1bW5zIHRvIGJlIGNyZWF0ZWQuXG5cdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lcy5mb3JFYWNoKChyZWxhdGVkUHJvcGVydHlOYW1lKSA9PiB7XG5cdFx0XHRcdGNvbHVtbnNUb0JlQ3JlYXRlZFtyZWxhdGVkUHJvcGVydHlOYW1lXSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzW3JlbGF0ZWRQcm9wZXJ0eU5hbWVdLmFubm90YXRpb25Qcm9wZXJ0eTtcblx0XHRcdFx0Ly8gSW4gY2FzZSBvZiBhIG11bHRpLXZhbHVlLCByZWxhdGVkIHByb3BlcnRpZXMgY2Fubm90IGJlIHNvcnRlZCBhcyB3ZSBnbyB0aHJvdWdoIGEgMS1uIHJlbGF0aW9uXG5cdFx0XHRcdGlmIChpc011bHRpVmFsdWUpIHtcblx0XHRcdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXMubm9uU29ydGFibGVQcm9wZXJ0aWVzLnB1c2gocmVsYXRlZFByb3BlcnR5TmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YWRkUHJvcGVydHlUb0Rpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAoXG5cdFx0XHRcdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCxcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllc0luZm8sXG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBsaW5lSXRlbSBwb2ludHMgdG8gYSBuYXZpZ2F0aW9uIHByb3BlcnR5IHdpdGggYSB0ZXh0QXJyYW5nZW1lbnQgVGV4dE9ubHksIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSBjb2x1bW4gd2l0aCB0aGUgdmFsdWUgbmF2aWdhdGlvbiBwcm9wZXJ0eS5cblx0XHRcdFx0Ly8gVGhlIHRleHQgcHJvcGVydHkgaXMgcmVmZXJlbmNlZCBvbiB0aGUgcmVsYXRlZCBwcm9wZXJ0aWVzIG9mIHRoZSBsaW5lSXRlbSwgc28gd2lsbCBiZSBjcmVhdGVkIG9uIHRoZSBfY3JlYXRlUmVsYXRlZENvbHVtbnMgbWV0aG9kLlxuXHRcdFx0XHRpZiAocmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbcmVsYXRlZFByb3BlcnR5TmFtZV0uZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24gPT09IFwiRGVzY3JpcHRpb25cIikge1xuXHRcdFx0XHRcdGNyZWF0ZVByb3BlcnR5QW5ub3RhdGVkVGV4dE9ubHkoXG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdFx0cHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRcdFx0XHRcdFx0ZGF0YUZpZWxkLFxuXHRcdFx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkLFxuXHRcdFx0XHRcdFx0cmVsYXRpdmVQYXRoLFxuXHRcdFx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHQvLyBDcmVhdGUgY29sdW1ucyBmb3IgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgZm9yIEFMUCB1c2UgY2FzZS5cblx0XHRcdGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzLmZvckVhY2goKGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWUpID0+IHtcblx0XHRcdFx0Ly8gSW50ZW50aW9uYWwgb3ZlcndyaXRlIGFzIHdlIHJlcXVpcmUgb25seSBvbmUgbmV3IFByb3BlcnR5SW5mbyBmb3IgYSByZWxhdGVkIFByb3BlcnR5LlxuXHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbYWRkaXRpb25hbFByb3BlcnR5TmFtZV0gPSByZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXNbYWRkaXRpb25hbFByb3BlcnR5TmFtZV07XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXHQvLyBHZXQgY29sdW1ucyBmcm9tIHRoZSBQcm9wZXJ0aWVzIG9mIEVudGl0eVR5cGVcblx0cmV0dXJuIGdldENvbHVtbnNGcm9tRW50aXR5VHlwZShcblx0XHRjb2x1bW5zVG9CZUNyZWF0ZWQsXG5cdFx0ZW50aXR5VHlwZSxcblx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdHRhYmxlVHlwZSxcblx0XHR0YWJsZUNyZWF0aW9uTW9kZSxcblx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllc1xuXHQpO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBwcm9wZXJ0eSBuYW1lcyBmcm9tIHRoZSBtYW5pZmVzdCBhbmQgY2hlY2tzIGFnYWluc3QgZXhpc3RpbmcgcHJvcGVydGllcyBhbHJlYWR5IGFkZGVkIGJ5IGFubm90YXRpb25zLlxuICogSWYgYSBub3QgeWV0IHN0b3JlZCBwcm9wZXJ0eSBpcyBmb3VuZCBpdCBhZGRzIGl0IGZvciBzb3J0aW5nIGFuZCBmaWx0ZXJpbmcgb25seSB0byB0aGUgYW5ub3RhdGlvbkNvbHVtbnMuXG4gKiBAcGFyYW0gcHJvcGVydGllc1xuICogQHBhcmFtIGFubm90YXRpb25Db2x1bW5zXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIGVudGl0eVR5cGVcbiAqIEByZXR1cm5zIFRoZSBjb2x1bW5zIGZyb20gdGhlIGFubm90YXRpb25zXG4gKi9cbmNvbnN0IF9nZXRQcm9wZXJ0eU5hbWVzID0gZnVuY3Rpb24gKFxuXHRwcm9wZXJ0aWVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGVcbik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcblx0bGV0IG1hdGNoZWRQcm9wZXJ0aWVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblx0aWYgKEFycmF5LmlzQXJyYXkocHJvcGVydGllcykpIHtcblx0XHRtYXRjaGVkUHJvcGVydGllcyA9IHByb3BlcnRpZXMubWFwKGZ1bmN0aW9uIChwcm9wZXJ0eVBhdGgpIHtcblx0XHRcdGNvbnN0IGFubm90YXRpb25Db2x1bW4gPSBhbm5vdGF0aW9uQ29sdW1ucy5maW5kKGZ1bmN0aW9uIChhbm5vdGF0aW9uQ29sdW1uKSB7XG5cdFx0XHRcdHJldHVybiBhbm5vdGF0aW9uQ29sdW1uLnJlbGF0aXZlUGF0aCA9PT0gcHJvcGVydHlQYXRoICYmIGFubm90YXRpb25Db2x1bW4ucHJvcGVydHlJbmZvcyA9PT0gdW5kZWZpbmVkO1xuXHRcdFx0fSk7XG5cdFx0XHRpZiAoYW5ub3RhdGlvbkNvbHVtbikge1xuXHRcdFx0XHRyZXR1cm4gYW5ub3RhdGlvbkNvbHVtbi5uYW1lO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgcmVsYXRlZENvbHVtbnMgPSBfY3JlYXRlUmVsYXRlZENvbHVtbnMoXG5cdFx0XHRcdFx0eyBbcHJvcGVydHlQYXRoXTogZW50aXR5VHlwZS5yZXNvbHZlUGF0aChwcm9wZXJ0eVBhdGgpIH0sXG5cdFx0XHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMsXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRlbnRpdHlUeXBlLFxuXHRcdFx0XHRcdHt9XG5cdFx0XHRcdCk7XG5cdFx0XHRcdGFubm90YXRpb25Db2x1bW5zLnB1c2gocmVsYXRlZENvbHVtbnNbMF0pO1xuXHRcdFx0XHRyZXR1cm4gcmVsYXRlZENvbHVtbnNbMF0ubmFtZTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gbWF0Y2hlZFByb3BlcnRpZXM7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGZpZWxkIGdyb3VwIGhhcyB0byBiZSBmbGFnZ2VkIGFzIHJlcXVpcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gZmllbGRHcm91cCBUaGUgZmllbGRHcm91cCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB0YWJsZUNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSBvZiB0aGUgdW5kZXJseWluZyB0YWJsZVxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZmllbGRHcm91cCBpcyByZXF1aXJlZC5cbiAqL1xuY29uc3QgaXNSZXF1aXJlZEZpZWxkR3JvdXAgPSBmdW5jdGlvbiAoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZmllbGRHcm91cDogRmllbGRHcm91cCxcblx0dGFibGVDcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZVxuKTogYm9vbGVhbiB7XG5cdGNvbnN0IGZpZWxkR3JvdXBEYXRhID0gZmllbGRHcm91cC5EYXRhO1xuXHRyZXR1cm4gZmllbGRHcm91cERhdGEuc29tZShmdW5jdGlvbiAoaXRlbSkge1xuXHRcdC8vIHdlIGV4Y2x1ZGUgYm9vbGVhbiB0eXBlLCB0aGUgZW5kLXVzZXIgbWF5IHdhbnQgdG8ga2VlcCB0aGUgdW5kZXJseWluZyBjaGVjayBib3ggZW1wdHkgb24gcHVycG9zZVxuXHRcdGlmIChpc0RhdGFGaWVsZChpdGVtKSAmJiBpdGVtPy5WYWx1ZT8uJHRhcmdldC50eXBlICE9PSBcIkVkbS5Cb29sZWFuXCIpIHtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdGlzU3RhdGljYWxseU1hbmRhdG9yeShpdGVtKSB8fFxuXHRcdFx0XHQodGFibGVDcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmVDcmVhdGlvblJvd3MgJiZcblx0XHRcdFx0XHRpc0Fubm90YXRlZFJlcXVpcmVkUHJvcGVydHkoaXRlbS5WYWx1ZS4kdGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZSwgY29udmVydGVyQ29udGV4dCkpXG5cdFx0XHQpO1xuXHRcdH1cblx0fSk7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGRhdGFGaWVsZEZvckFubm90YXRpb24gaGFzIHRvIGJlIGZsYWdnZWQgYXMgcmVxdWlyZWQuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIFRoZSBwcm9wZXJ0eSBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB0YWJsZUNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSBvZiB0aGUgdW5kZXJseWluZyB0YWJsZVxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgcmVxdWlyZWQuXG4gKi9cbmNvbnN0IGlzUmVxdWlyZWREYXRhRmllbGRGb3JBbm5vdGF0aW9uID0gZnVuY3Rpb24gKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGRhdGFGaWVsZEZvckFubm90YXRpb246IERhdGFGaWVsZEZvckFubm90YXRpb24sXG5cdHRhYmxlQ3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGVcbik6IGJvb2xlYW4ge1xuXHRjb25zdCBkYXRhRmllbGRUYXJnZXQgPSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uLlRhcmdldC4kdGFyZ2V0O1xuXHRjb25zdCBEYXRhRmllbGRGb3JBbm5vdGF0aW9uRmllbGRDb250cm9sTm90TWFuZGF0b3J5ID0gaGFzRmllbGRDb250cm9sTm90TWFuZGF0b3J5KGRhdGFGaWVsZEZvckFubm90YXRpb24pO1xuXHQvLyBDaGVjayBpZiB0aGUgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBwb2ludHMgdG8gYSBGaWVsZEdyb3VwXG5cdGlmIChoYXNGaWVsZEdyb3VwVGFyZ2V0KGRhdGFGaWVsZEZvckFubm90YXRpb24pKSB7XG5cdFx0aWYgKGlzUmVxdWlyZWRGaWVsZEdyb3VwKGNvbnZlcnRlckNvbnRleHQsIGRhdGFGaWVsZFRhcmdldCBhcyBGaWVsZEdyb3VwLCB0YWJsZUNyZWF0aW9uTW9kZSkpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRjb25zdCBmaWVsZEdyb3VwRGF0YSA9IChkYXRhRmllbGRUYXJnZXQgYXMgRmllbGRHcm91cCkuRGF0YTtcblx0XHRyZXR1cm4gZmllbGRHcm91cERhdGEuc29tZSgoaW5uZXJEYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRcdHJldHVybiBpc1JlcXVpcmVkQ29sdW1uKGNvbnZlcnRlckNvbnRleHQsIGlubmVyRGF0YUZpZWxkLCB0YWJsZUNyZWF0aW9uTW9kZSk7XG5cdFx0fSk7XG5cdH1cblx0LypJZiB0aGUgdW5kZXJseWluZyBkYXRhcG9pbnQgaXMgYSByYXRpbmcgaW5kaWNhdG9yLCB0aGUgZW5kLXVzZXIgbWF5IHdhbnQgdG8ga2VlcCB0aGUgcmF0aW5nIGVtcHR5ICh2YWx1ZSAwKSBvbiBwdXJwb3NlLlxuXHRCZXNpZGVzLCBjdXJyZW50bHksIG9ubHkgYSBmaWVsZENvbnRyb2wgc2V0IG9uIGEgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBwb2ludGluZyB0byBhIGRhdGFQb2ludCBoYXMgYW4gaW5mbHVlbmNlIGluIHRoZSB0YWJsZS5cblx0QWNjb3JkaW5nbHksIGlmIGEgZGF0YXBvaW50IGNvbWVzIGZyb20gYSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIHdpdGggYSBmaWVsZENvbnRyb2wgc2V0IGFzIG5vdCBtYW5kYXRvcnksIHRoaXMgZGF0YVBvaW50IG11c3Qgbm90IGJlIGZsYWdnZWQgYXMgXCJyZXF1aXJlZFwiKi9cblx0aWYgKGhhc0RhdGFQb2ludFRhcmdldChkYXRhRmllbGRGb3JBbm5vdGF0aW9uKSAmJiAoZGF0YUZpZWxkVGFyZ2V0IGFzIERhdGFQb2ludCkuVmlzdWFsaXphdGlvbiAhPT0gXCJVSS5WaXN1YWxpemF0aW9uVHlwZS9SYXRpbmdcIikge1xuXHRcdGlmIChEYXRhRmllbGRGb3JBbm5vdGF0aW9uRmllbGRDb250cm9sTm90TWFuZGF0b3J5KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGlmIChpc1N0YXRpY2FsbHlNYW5kYXRvcnkoZGF0YUZpZWxkRm9yQW5ub3RhdGlvbikpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gaXNSZXF1aXJlZERhdGFQb2ludChjb252ZXJ0ZXJDb250ZXh0LCBkYXRhRmllbGRUYXJnZXQgYXMgRGF0YVBvaW50LCB0YWJsZUNyZWF0aW9uTW9kZSk7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBwcm9wZXJ0eSBoYXMgdG8gYmUgZmxhZ2dlZCBhcyByZXF1aXJlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB0YWJsZUNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSBvZiB0aGUgdW5kZXJseWluZyB0YWJsZVxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgcmVxdWlyZWQuXG4gKi9cbmNvbnN0IGlzUmVxdWlyZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRwcm9wZXJ0eTogUHJvcGVydHksXG5cdHRhYmxlQ3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGVcbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gKFxuXHRcdHByb3BlcnR5LnR5cGUgIT09IFwiRWRtLkJvb2xlYW5cIiAmJlxuXHRcdCFpc1JhdGluZ1Zpc3VhbGl6YXRpb25Gcm9tRGF0YUZpZWxkRGVmYXVsdChwcm9wZXJ0eSkgJiZcblx0XHQoaXNTdGF0aWNhbGx5TWFuZGF0b3J5KHByb3BlcnR5KSB8fFxuXHRcdFx0KHRhYmxlQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzICYmXG5cdFx0XHRcdGlzQW5ub3RhdGVkUmVxdWlyZWRQcm9wZXJ0eShwcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWUsIGNvbnZlcnRlckNvbnRleHQpKSlcblx0KTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YVBvaW50IGhhcyB0byBiZSBmbGFnZ2VkIGFzIHJlcXVpcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gZGF0YVBvaW50IFRoZSBkYXRhUG9pbnQgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHVuZGVybHlpbmcgdGFibGVcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGRhdGFQb2ludCBpcyByZXF1aXJlZC5cbiAqL1xuY29uc3QgaXNSZXF1aXJlZERhdGFQb2ludCA9IGZ1bmN0aW9uIChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRkYXRhUG9pbnQ6IERhdGFQb2ludCxcblx0dGFibGVDcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZVxuKTogYm9vbGVhbiB7XG5cdHJldHVybiAoXG5cdFx0aXNTdGF0aWNhbGx5TWFuZGF0b3J5KGRhdGFQb2ludCkgfHxcblx0XHQodGFibGVDcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmVDcmVhdGlvblJvd3MgJiZcblx0XHRcdGlzQW5ub3RhdGVkUmVxdWlyZWRQcm9wZXJ0eShkYXRhUG9pbnQuVmFsdWUuJHRhcmdldC5mdWxseVF1YWxpZmllZE5hbWUsIGNvbnZlcnRlckNvbnRleHQpKVxuXHQpO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSB1bmRlcmx5aW5nIGNvbHVtbiBoYXMgdG8gYmUgZmxhZ2dlZCBhcyByZXF1aXJlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB1bmRlcmx5aW5nIHRhYmxlXG4gKiBAcmV0dXJucyBUaGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgJ3JlcXVpcmVkJyBwcm9wZXJ0eSBvZiB0aGUgdGFibGUgY29sdW1uLlxuICovXG5jb25zdCBpc1JlcXVpcmVkQ29sdW1uID0gZnVuY3Rpb24gKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHRhcmdldDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5LFxuXHR0YWJsZUNyZWF0aW9uTW9kZT86IENyZWF0aW9uTW9kZVxuKTogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24ge1xuXHRjb25zdCBjcmVhdGlvbk1vZGUgPSB0YWJsZUNyZWF0aW9uTW9kZSB8fCBDcmVhdGlvbk1vZGUuSW5saW5lO1xuXHRpZiAoXG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQgfHxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlXG5cdCkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0aWYgKGlzUHJvcGVydHkodGFyZ2V0KSkge1xuXHRcdHJldHVybiBpc1JlcXVpcmVkUHJvcGVydHkoY29udmVydGVyQ29udGV4dCwgdGFyZ2V0LCBjcmVhdGlvbk1vZGUpID8gY29tcGlsZUV4cHJlc3Npb24oVUkuSXNFZGl0YWJsZSkgOiB1bmRlZmluZWQ7XG5cdH1cblx0Ly8gQ2hlY2sgaWYgdGhlIGRhdGFGaWVsZCBpcyBvZiB0eXBlIERhdGFGaWVsZEZvckFubm90YXRpb25cblx0aWYgKGlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvbih0YXJnZXQpKSB7XG5cdFx0cmV0dXJuIGlzUmVxdWlyZWREYXRhRmllbGRGb3JBbm5vdGF0aW9uKGNvbnZlcnRlckNvbnRleHQsIHRhcmdldCwgY3JlYXRpb25Nb2RlKSA/IGNvbXBpbGVFeHByZXNzaW9uKFVJLklzRWRpdGFibGUpIDogdW5kZWZpbmVkO1xuXHR9XG5cdC8vSWYgdGhlIHVuZGVybHlpbmcgcHJvcGVydHkgaXMgYSBib29sZWFuLCB0aGUgZW5kLXVzZXIgbWF5IHdhbnQgdG8ga2VlcCB0aGUgY2hlY2sgYm94IGVtcHR5IG9uIHB1cnBvc2Vcblx0aWYgKGlzRGF0YUZpZWxkKHRhcmdldCkgJiYgdGFyZ2V0LlZhbHVlPy4kdGFyZ2V0Py50eXBlICE9PSBcIkVkbS5Cb29sZWFuXCIpIHtcblx0XHRyZXR1cm4gaXNTdGF0aWNhbGx5TWFuZGF0b3J5KHRhcmdldCkgfHxcblx0XHRcdChjcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmVDcmVhdGlvblJvd3MgJiZcblx0XHRcdFx0aXNBbm5vdGF0ZWRSZXF1aXJlZFByb3BlcnR5KHRhcmdldC5WYWx1ZS4kdGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZSwgY29udmVydGVyQ29udGV4dCkpXG5cdFx0XHQ/IGNvbXBpbGVFeHByZXNzaW9uKFVJLklzRWRpdGFibGUpXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuY29uc3QgX2FwcGVuZEN1c3RvbVRlbXBsYXRlID0gZnVuY3Rpb24gKFxuXHRwcm9wZXJ0aWVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcblx0ZXhwb3J0UHJvcGVydGllczogc3RyaW5nW10gfCBzdHJpbmcgfCB1bmRlZmluZWRcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmIChBcnJheS5pc0FycmF5KGV4cG9ydFByb3BlcnRpZXMpKSB7XG5cdFx0cHJvcGVydGllcyA9IGV4cG9ydFByb3BlcnRpZXM7XG5cdH1cblx0aWYgKHByb3BlcnRpZXMpIHtcblx0XHRyZXR1cm4gcHJvcGVydGllc1xuXHRcdFx0Lm1hcCgocHJvcGVydHkpID0+IHtcblx0XHRcdFx0cmV0dXJuIGB7JHtwcm9wZXJ0aWVzIS5pbmRleE9mKHByb3BlcnR5KX19YDtcblx0XHRcdH0pXG5cdFx0XHQuam9pbihgJHtcIlxcblwifWApO1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGFibGUgY29sdW1uIGRlZmluaXRpb25zIGZyb20gbWFuaWZlc3QuXG4gKlxuICogVGhlc2UgbWF5IGJlIGN1c3RvbSBjb2x1bW5zIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0LCBzbG90IGNvbHVtbnMgY29taW5nIHRocm91Z2hcbiAqIGEgYnVpbGRpbmcgYmxvY2ssIG9yIGFubm90YXRpb24gY29sdW1ucyB0byBvdmVyd3JpdGUgYW5ub3RhdGlvbi1iYXNlZCBjb2x1bW5zLlxuICogQHBhcmFtIGNvbHVtbnNcbiAqIEBwYXJhbSBhbm5vdGF0aW9uQ29sdW1uc1xuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSBlbnRpdHlUeXBlXG4gKiBAcmV0dXJucyBUaGUgY29sdW1ucyBmcm9tIHRoZSBtYW5pZmVzdFxuICovXG5jb25zdCBnZXRDb2x1bW5zRnJvbU1hbmlmZXN0ID0gZnVuY3Rpb24gKFxuXHRjb2x1bW5zOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW4gfCBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW5Gb3JPdmVycmlkZT4sXG5cdGFubm90YXRpb25Db2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlXG4pOiBSZWNvcmQ8c3RyaW5nLCBNYW5pZmVzdENvbHVtbj4ge1xuXHRjb25zdCBpbnRlcm5hbENvbHVtbnM6IFJlY29yZDxzdHJpbmcsIE1hbmlmZXN0Q29sdW1uPiA9IHt9O1xuXHRmdW5jdGlvbiBpc0NvbHVtbk92ZXJyaWRlKFxuXHRcdGNvbHVtbjogQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uIHwgQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uRm9yT3ZlcnJpZGUsXG5cdFx0a2V5OiBzdHJpbmdcblx0KTogY29sdW1uIGlzIEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbkZvck92ZXJyaWRlIHtcblx0XHRyZXR1cm4gYW5ub3RhdGlvbkNvbHVtbnMuc29tZSgoYW5ub3RhdGlvbkNvbHVtbikgPT4gYW5ub3RhdGlvbkNvbHVtbi5rZXkgPT09IGtleSk7XG5cdH1cblx0ZnVuY3Rpb24gaXNTbG90Q29sdW1uKG1hbmlmZXN0Q29sdW1uOiBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW4pOiBtYW5pZmVzdENvbHVtbiBpcyBGcmFnbWVudERlZmluZWRTbG90Q29sdW1uIHtcblx0XHRyZXR1cm4gbWFuaWZlc3RDb2x1bW4udHlwZSA9PT0gQ29sdW1uVHlwZS5TbG90O1xuXHR9XG5cdGZ1bmN0aW9uIGlzQ3VzdG9tQ29sdW1uKG1hbmlmZXN0Q29sdW1uOiBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW4pOiBtYW5pZmVzdENvbHVtbiBpcyBNYW5pZmVzdERlZmluZWRDdXN0b21Db2x1bW4ge1xuXHRcdHJldHVybiBtYW5pZmVzdENvbHVtbi50eXBlID09PSB1bmRlZmluZWQgJiYgISFtYW5pZmVzdENvbHVtbi50ZW1wbGF0ZTtcblx0fVxuXHRmdW5jdGlvbiBfdXBkYXRlTGlua2VkUHJvcGVydGllc09uQ3VzdG9tQ29sdW1ucyhwcm9wZXJ0eUluZm9zOiBzdHJpbmdbXSwgYW5ub3RhdGlvblRhYmxlQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10pOiB2b2lkIHtcblx0XHRjb25zdCByZXN0cmljdGlvbnNPblByb3BlcnRpZXMgPSBnZXRSZXN0cmljdGlvbnNPblByb3BlcnRpZXMoY29udmVydGVyQ29udGV4dCk7XG5cdFx0cHJvcGVydHlJbmZvcy5mb3JFYWNoKChwcm9wZXJ0eSkgPT4ge1xuXHRcdFx0YW5ub3RhdGlvblRhYmxlQ29sdW1ucy5mb3JFYWNoKChwcm9wKSA9PiB7XG5cdFx0XHRcdGlmIChwcm9wLm5hbWUgPT09IHByb3BlcnR5KSB7XG5cdFx0XHRcdFx0cHJvcC5zb3J0YWJsZSA9ICFyZXN0cmljdGlvbnNPblByb3BlcnRpZXMubm9uU29ydGFibGVQcm9wZXJ0aWVzLmluY2x1ZGVzKHByb3BlcnR5LnJlcGxhY2UoXCJQcm9wZXJ0eTo6XCIsIFwiXCIpKTtcblx0XHRcdFx0XHRwcm9wLmlzR3JvdXBhYmxlID0gcHJvcC5zb3J0YWJsZTtcblx0XHRcdFx0XHRwcm9wLmZpbHRlcmFibGUgPSAhcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLm5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzLmluY2x1ZGVzKHByb3BlcnR5LnJlcGxhY2UoXCJQcm9wZXJ0eTo6XCIsIFwiXCIpKTtcblx0XHRcdFx0XHRwcm9wLmlzUGFydE9mQ3VzdG9tQ29sdW1uID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblx0Zm9yIChjb25zdCBrZXkgaW4gY29sdW1ucykge1xuXHRcdGNvbnN0IG1hbmlmZXN0Q29sdW1uID0gY29sdW1uc1trZXldO1xuXHRcdEtleUhlbHBlci52YWxpZGF0ZUtleShrZXkpO1xuXHRcdC8vIEJhc2VUYWJsZUNvbHVtblxuXHRcdGNvbnN0IGJhc2VUYWJsZUNvbHVtbiA9IHtcblx0XHRcdGtleToga2V5LFxuXHRcdFx0d2lkdGhJbmNsdWRpbmdDb2x1bW5IZWFkZXI6IG1hbmlmZXN0Q29sdW1uLndpZHRoSW5jbHVkaW5nQ29sdW1uSGVhZGVyLFxuXHRcdFx0d2lkdGg6IG1hbmlmZXN0Q29sdW1uLndpZHRoIHx8IHVuZGVmaW5lZCxcblx0XHRcdHBvc2l0aW9uOiB7XG5cdFx0XHRcdGFuY2hvcjogbWFuaWZlc3RDb2x1bW4ucG9zaXRpb24/LmFuY2hvcixcblx0XHRcdFx0cGxhY2VtZW50OiBtYW5pZmVzdENvbHVtbi5wb3NpdGlvbiA9PT0gdW5kZWZpbmVkID8gUGxhY2VtZW50LkFmdGVyIDogbWFuaWZlc3RDb2x1bW4ucG9zaXRpb24ucGxhY2VtZW50XG5cdFx0XHR9LFxuXHRcdFx0Y2FzZVNlbnNpdGl2ZTogaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKGNvbnZlcnRlckNvbnRleHQpXG5cdFx0fTtcblx0XHRpZiAoaXNDb2x1bW5PdmVycmlkZShtYW5pZmVzdENvbHVtbiwga2V5KSkge1xuXHRcdFx0Y29uc3QgcHJvcGVydGllc1RvT3ZlcndyaXRlQW5ub3RhdGlvbkNvbHVtbjogQ3VzdG9tRWxlbWVudDxBbm5vdGF0aW9uVGFibGVDb2x1bW5Gb3JPdmVycmlkZT4gPSB7XG5cdFx0XHRcdC4uLmJhc2VUYWJsZUNvbHVtbixcblx0XHRcdFx0aW1wb3J0YW5jZTogbWFuaWZlc3RDb2x1bW4/LmltcG9ydGFuY2UsXG5cdFx0XHRcdGhvcml6b250YWxBbGlnbjogbWFuaWZlc3RDb2x1bW4/Lmhvcml6b250YWxBbGlnbixcblx0XHRcdFx0YXZhaWxhYmlsaXR5OiBtYW5pZmVzdENvbHVtbj8uYXZhaWxhYmlsaXR5LFxuXHRcdFx0XHR0eXBlOiBDb2x1bW5UeXBlLkFubm90YXRpb24sXG5cdFx0XHRcdGlzTmF2aWdhYmxlOiB1bmRlZmluZWQsXG5cdFx0XHRcdHNldHRpbmdzOiBtYW5pZmVzdENvbHVtbi5zZXR0aW5ncyxcblx0XHRcdFx0Zm9ybWF0T3B0aW9uczogX2dldERlZmF1bHRGb3JtYXRPcHRpb25zRm9yVGFibGUobWFuaWZlc3RDb2x1bW4uZm9ybWF0T3B0aW9ucyksXG5cdFx0XHRcdGV4cG9ydFNldHRpbmdzOiBnZXRDdXN0b21FeHBvcnRTZXR0aW5ncyhcblx0XHRcdFx0XHRtYW5pZmVzdENvbHVtbj8uZXhwb3J0U2V0dGluZ3MsXG5cdFx0XHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMsXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRlbnRpdHlUeXBlLFxuXHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRrZXlcblx0XHRcdFx0KVxuXHRcdFx0fTtcblx0XHRcdGludGVybmFsQ29sdW1uc1trZXldID0gcHJvcGVydGllc1RvT3ZlcndyaXRlQW5ub3RhdGlvbkNvbHVtbjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlJbmZvczogc3RyaW5nW10gfCB1bmRlZmluZWQgPSBfZ2V0UHJvcGVydHlOYW1lcyhcblx0XHRcdFx0bWFuaWZlc3RDb2x1bW4ucHJvcGVydGllcyxcblx0XHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMsXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdGVudGl0eVR5cGVcblx0XHRcdCk7XG5cdFx0XHRjb25zdCB0b29sdGlwVGV4dCA9IGNvbnZlcnRlckNvbnRleHQuZmV0Y2hUZXh0RnJvbU1ldGFNb2RlbChtYW5pZmVzdENvbHVtbi50b29sdGlwKSxcblx0XHRcdFx0aGVhZGVyVGV4dCA9IGNvbnZlcnRlckNvbnRleHQuZmV0Y2hUZXh0RnJvbU1ldGFNb2RlbChtYW5pZmVzdENvbHVtbi5oZWFkZXIpO1xuXG5cdFx0XHRjb25zdCBjdXN0b21Db2x1bW5FeHBvcnRTZXR0aW5nczogQ29sdW1uRXhwb3J0U2V0dGluZ3MgfCBudWxsID0gcHJvcGVydHlJbmZvc1xuXHRcdFx0XHQ/IGdldEN1c3RvbUV4cG9ydFNldHRpbmdzKG1hbmlmZXN0Q29sdW1uPy5leHBvcnRTZXR0aW5ncywgYW5ub3RhdGlvbkNvbHVtbnMsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUsIHByb3BlcnR5SW5mb3MpXG5cdFx0XHRcdDogbnVsbDtcblx0XHRcdGNvbnN0IGJhc2VNYW5pZmVzdENvbHVtbiA9IHtcblx0XHRcdFx0Li4uYmFzZVRhYmxlQ29sdW1uLFxuXHRcdFx0XHRoZWFkZXI6IGhlYWRlclRleHQsXG5cdFx0XHRcdGltcG9ydGFuY2U6IG1hbmlmZXN0Q29sdW1uPy5pbXBvcnRhbmNlIHx8IEltcG9ydGFuY2UuTm9uZSxcblx0XHRcdFx0aG9yaXpvbnRhbEFsaWduOiBtYW5pZmVzdENvbHVtbj8uaG9yaXpvbnRhbEFsaWduIHx8IEhvcml6b250YWxBbGlnbi5CZWdpbixcblx0XHRcdFx0YXZhaWxhYmlsaXR5OiBtYW5pZmVzdENvbHVtbj8uYXZhaWxhYmlsaXR5IHx8IFwiRGVmYXVsdFwiLFxuXHRcdFx0XHR0ZW1wbGF0ZTogbWFuaWZlc3RDb2x1bW4udGVtcGxhdGUsXG5cdFx0XHRcdHByb3BlcnR5SW5mb3M6IHByb3BlcnR5SW5mb3MsXG5cdFx0XHRcdGV4cG9ydFNldHRpbmdzOiBjdXN0b21Db2x1bW5FeHBvcnRTZXR0aW5ncyxcblx0XHRcdFx0aWQ6IGBDdXN0b21Db2x1bW46OiR7a2V5fWAsXG5cdFx0XHRcdG5hbWU6IGBDdXN0b21Db2x1bW46OiR7a2V5fWAsXG5cdFx0XHRcdC8vTmVlZGVkIGZvciBNREM6XG5cdFx0XHRcdGZvcm1hdE9wdGlvbnM6IHsgdGV4dExpbmVzRWRpdDogNCB9LFxuXHRcdFx0XHRpc0dyb3VwYWJsZTogZmFsc2UsXG5cdFx0XHRcdGlzTmF2aWdhYmxlOiBmYWxzZSxcblx0XHRcdFx0c29ydGFibGU6IGZhbHNlLFxuXHRcdFx0XHR2aXN1YWxTZXR0aW5nczogeyB3aWR0aENhbGN1bGF0aW9uOiBudWxsIH0sXG5cdFx0XHRcdHRvb2x0aXA6IHRvb2x0aXBUZXh0ID8gdG9vbHRpcFRleHQgOiBoZWFkZXJUZXh0LFxuXHRcdFx0XHRwcm9wZXJ0aWVzOiBtYW5pZmVzdENvbHVtbi5wcm9wZXJ0aWVzLFxuXHRcdFx0XHRyZXF1aXJlZDpcblx0XHRcdFx0XHRtYW5pZmVzdENvbHVtbi5yZXF1aXJlZCAmJlxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0ICYmXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSAhPT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZVxuXHRcdFx0XHRcdFx0PyBjb21waWxlRXhwcmVzc2lvbihVSS5Jc0VkaXRhYmxlKVxuXHRcdFx0XHRcdFx0OiB1bmRlZmluZWRcblx0XHRcdH07XG5cdFx0XHRpZiAocHJvcGVydHlJbmZvcykge1xuXHRcdFx0XHRfdXBkYXRlTGlua2VkUHJvcGVydGllc09uQ3VzdG9tQ29sdW1ucyhwcm9wZXJ0eUluZm9zLCBhbm5vdGF0aW9uQ29sdW1ucyk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaXNTbG90Q29sdW1uKG1hbmlmZXN0Q29sdW1uKSkge1xuXHRcdFx0XHRjb25zdCBjdXN0b21UYWJsZUNvbHVtbjogQ3VzdG9tRWxlbWVudDxDdXN0b21CYXNlZFRhYmxlQ29sdW1uPiA9IHtcblx0XHRcdFx0XHQuLi5iYXNlTWFuaWZlc3RDb2x1bW4sXG5cdFx0XHRcdFx0dHlwZTogQ29sdW1uVHlwZS5TbG90XG5cdFx0XHRcdH07XG5cdFx0XHRcdGludGVybmFsQ29sdW1uc1trZXldID0gY3VzdG9tVGFibGVDb2x1bW47XG5cdFx0XHR9IGVsc2UgaWYgKGlzQ3VzdG9tQ29sdW1uKG1hbmlmZXN0Q29sdW1uKSkge1xuXHRcdFx0XHRjb25zdCBjdXN0b21UYWJsZUNvbHVtbjogQ3VzdG9tRWxlbWVudDxDdXN0b21CYXNlZFRhYmxlQ29sdW1uPiA9IHtcblx0XHRcdFx0XHQuLi5iYXNlTWFuaWZlc3RDb2x1bW4sXG5cdFx0XHRcdFx0dHlwZTogQ29sdW1uVHlwZS5EZWZhdWx0XG5cdFx0XHRcdH07XG5cdFx0XHRcdGludGVybmFsQ29sdW1uc1trZXldID0gY3VzdG9tVGFibGVDb2x1bW47XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBtZXNzYWdlID0gYFRoZSBhbm5vdGF0aW9uIGNvbHVtbiAnJHtrZXl9JyByZWZlcmVuY2VkIGluIHRoZSBtYW5pZmVzdCBpcyBub3QgZm91bmRgO1xuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdFx0LmdldERpYWdub3N0aWNzKClcblx0XHRcdFx0XHQuYWRkSXNzdWUoXG5cdFx0XHRcdFx0XHRJc3N1ZUNhdGVnb3J5Lk1hbmlmZXN0LFxuXHRcdFx0XHRcdFx0SXNzdWVTZXZlcml0eS5Mb3csXG5cdFx0XHRcdFx0XHRtZXNzYWdlLFxuXHRcdFx0XHRcdFx0SXNzdWVDYXRlZ29yeVR5cGUsXG5cdFx0XHRcdFx0XHRJc3N1ZUNhdGVnb3J5VHlwZT8uQW5ub3RhdGlvbkNvbHVtbnM/LkludmFsaWRLZXlcblx0XHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gaW50ZXJuYWxDb2x1bW5zO1xufTtcblxuLyoqXG4gKiBBZGRzIGNvbXB1dGVkIGNvbHVtbnMgc3VjaCBhcyB0aGUgZHJhZnQgc3RhdHVzIGFuZCBzaXR1YXRpb25zIHN0YXR1cy5cbiAqIEBwYXJhbSB0YWJsZUNvbHVtbnMgVGhlIHRhYmxlIGNvbHVtbnMgY29sbGVjdGVkIHNvIGZhclxuICogQHBhcmFtIHRhYmxlVHlwZSBUaGUgdGFibGUgdHlwZVxuICogQHBhcmFtIHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMgVGhlIGVucmljaGVkIHNldCBvZiB0YWJsZSBjb2x1bW5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRDb21wdXRlZENvbHVtbnMoXG5cdHRhYmxlQ29sdW1uczogVGFibGVDb2x1bW5bXSxcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdHZpc3VhbGl6YXRpb25QYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogVGFibGVDb2x1bW5bXSB7XG5cdGlmICghW1wiR3JpZFRhYmxlXCIsIFwiVHJlZVRhYmxlXCIsIFwiQW5hbHl0aWNhbFRhYmxlXCJdLmluY2x1ZGVzKHRhYmxlVHlwZSkpIHtcblx0XHQvLyBDb21wdXRlZCBjb2x1bW5zIGFyZSBub3QgdXNlZCBpbiBSZXNwb25zaXZlIHRhYmxlc1xuXHRcdHJldHVybiB0YWJsZUNvbHVtbnM7XG5cdH1cblxuXHQvLyBJbiBjYXNlIGEgZ3JpZCB0YWJsZSBvciB0cmVlIHRhYmxlIGlzIHVzZWQsIHdlIGRpc3BsYXkgdGhlIHNpdHVhdGlvbnMgaW5kaWNhdG9yIGluIGEgc2VwYXJhdGUgY29sdW1uXG5cdC8vIHNvIHdlIGhhdmUgdG8gZGlzYWJsZSBpdCBoZXJlIHRvIGVuc3VyZSwgdGhhdCB0aGUgZmllbGQgYnVpbGRpbmcgYmxvY2tcblx0Ly8gZG9lcyBub3QgcmVuZGVyIGl0IGludG8gdGhlIElEIGNvbHVtblxuXHRjb25zdCBjb2x1bW5XaXRoU2l0dWF0aW9uc0luZGljYXRvcjogVGFibGVDb2x1bW4gfCB1bmRlZmluZWQgPSB0YWJsZUNvbHVtbnMuZmluZChcblx0XHQoY29sdW1uKSA9PiBjb2x1bW4uZm9ybWF0T3B0aW9ucz8uaGFzU2l0dWF0aW9uc0luZGljYXRvciAhPT0gdW5kZWZpbmVkICYmIGNvbHVtbi5mb3JtYXRPcHRpb25zPy5oYXNTaXR1YXRpb25zSW5kaWNhdG9yID09PSB0cnVlXG5cdCk7XG5cdGlmIChjb2x1bW5XaXRoU2l0dWF0aW9uc0luZGljYXRvcj8uZm9ybWF0T3B0aW9ucykge1xuXHRcdC8vIFN3aXRjaCBvZmYgdGhlIHNpdHVhdGlvbnMgaW5kaWNhdG9yIGluIHRoZSBmb3VuZCBjb2x1bW5cblx0XHRjb2x1bW5XaXRoU2l0dWF0aW9uc0luZGljYXRvci5mb3JtYXRPcHRpb25zLmhhc1NpdHVhdGlvbnNJbmRpY2F0b3IgPSBmYWxzZTtcblxuXHRcdC8vIEluc2VydCBhIHNlcGFyYXRlIHNpdHVhdGlvbnMgaW5kaWNhdG9yIGNvbHVtblxuXHRcdGNvbnN0IHNpdHVhdGlvbnNJbmRpY2F0b3JDb2x1bW46IENvbXB1dGVkVGFibGVDb2x1bW4gPSB7XG5cdFx0XHRrZXk6IFwic2l0dWF0aW9uc0luZGljYXRvclwiLFxuXHRcdFx0bmFtZTogXCJzaXR1YXRpb25zSW5kaWNhdG9yXCIsXG5cdFx0XHRwcm9wZXJ0eUtleTogY29sdW1uV2l0aFNpdHVhdGlvbnNJbmRpY2F0b3IubmFtZSxcblx0XHRcdGlzU2l0dWF0aW9uc0luZGljYXRvcjogdHJ1ZSxcblx0XHRcdGF2YWlsYWJpbGl0eTogXCJEZWZhdWx0XCIsXG5cdFx0XHRsYWJlbDogXCJ7c2FwLmZlLmkxOG4+Q19TSVRVQVRJT05TX1NUQVRVU19DT0xVTU5fTEFCRUxfVE9PTFRJUH1cIixcblx0XHRcdHRvb2x0aXA6IFwie3NhcC5mZS5pMThuPkNfU0lUVUFUSU9OU19TVEFUVVNfQ09MVU1OX0xBQkVMX1RPT0xUSVB9XCIsXG5cdFx0XHR0eXBlOiBDb2x1bW5UeXBlLkNvbXB1dGVkLFxuXHRcdFx0Zm9ybWF0T3B0aW9uczogbnVsbCxcblx0XHRcdGV4cG9ydFNldHRpbmdzOiBudWxsLFxuXHRcdFx0Y2xpcGJvYXJkU2V0dGluZ3M6IG51bGwsXG5cdFx0XHRwcm9wZXJ0eUluZm9zOiB1bmRlZmluZWQsXG5cdFx0XHRjYXNlU2Vuc2l0aXZlOiBmYWxzZVxuXHRcdH07XG5cblx0XHQvLyBQbGFjZSB0aGUgZHJhZnQgc3RhdHVzIGNvbHVtbiBhZnRlciB0aGUgZmlyc3QgdmlzaWJsZSBjb2x1bW5cblx0XHRjb25zdCBpbmRleE9mRmlyc3RWaXNpYmxlQ29sdW1uOiBpbnQgPSB0YWJsZUNvbHVtbnMuZmluZEluZGV4KChjb2x1bW4pID0+IGNvbHVtbi5hdmFpbGFiaWxpdHkgIT09IFwiSGlkZGVuXCIpO1xuXHRcdHRhYmxlQ29sdW1ucy5zcGxpY2UoaW5kZXhPZkZpcnN0VmlzaWJsZUNvbHVtbiArIDEsIDAsIHNpdHVhdGlvbnNJbmRpY2F0b3JDb2x1bW4pO1xuXHR9XG5cblx0Ly8gSW4gY2FzZSBhIGdyaWQgdGFibGUgb3IgdHJlZSB0YWJsZSBpcyB1c2VkLCB3ZSBkaXNwbGF5IHRoZSBkcmFmdCBpbmRpY2F0b3IgaW4gYSBzZXBhcmF0ZSBjb2x1bW5cblx0Ly8gc28gd2UgaGF2ZSB0byBkaXNhYmxlIGl0IGhlcmUgdG8gZW5zdXJlLCB0aGF0IHRoZSBmaWVsZCBidWlsZGluZyBibG9ja1xuXHQvLyBkb2VzIG5vdCByZW5kZXIgaXQgaW50byB0aGUgSUQgY29sdW1uXG5cdC8vIFRoZSBhZGRpdGlvbmFsIGNvbHVtbiBpcyBvbmx5IGFkZGVkIGZvciB0YWJsZXMgb24gYSBMUiBhbmQgaW4gY2FzZSB0ZWhlIGVudGl0eSBpcyBkcmFmdCBlbmFibGVkIVxuXHRjb25zdCBjb2x1bW5zV2l0aERyYWZ0SW5kaWNhdG9yOiBUYWJsZUNvbHVtbltdID0gdGFibGVDb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiBjb2x1bW4uZm9ybWF0T3B0aW9ucz8uaGFzRHJhZnRJbmRpY2F0b3IgPT09IHRydWUpO1xuXHRpZiAoXG5cdFx0Y29sdW1uc1dpdGhEcmFmdEluZGljYXRvci5sZW5ndGggJiZcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCAmJlxuXHRcdChNb2RlbEhlbHBlci5pc0RyYWZ0Tm9kZShjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpKSB8fCBNb2RlbEhlbHBlci5pc0RyYWZ0Um9vdChjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpKSlcblx0KSB7XG5cdFx0Ly8gU3dpdGNoIG9mZiB0aGUgZHJhZnQgaW5kaWNhdG9yIGluIHRoZSBmb3VuZCBjb2x1bW5cblx0XHRjb2x1bW5zV2l0aERyYWZ0SW5kaWNhdG9yLmZvckVhY2goKGNvbHVtbldpdGhEcmFmdEluZGljYXRvcjogVGFibGVDb2x1bW4pID0+IHtcblx0XHRcdGlmIChjb2x1bW5XaXRoRHJhZnRJbmRpY2F0b3I/LmZvcm1hdE9wdGlvbnMpIHtcblx0XHRcdFx0Y29sdW1uV2l0aERyYWZ0SW5kaWNhdG9yLmZvcm1hdE9wdGlvbnMuaGFzRHJhZnRJbmRpY2F0b3IgPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIEluc2VydCBhIHNlcGFyYXRlIGRyYWZ0IGluZGljYXRvciBjb2x1bW5cblx0XHRjb25zdCBkcmFmdEluZGljYXRvckNvbHVtbjogQ29tcHV0ZWRUYWJsZUNvbHVtbiA9IHtcblx0XHRcdGtleTogXCJkcmFmdFN0YXR1c1wiLFxuXHRcdFx0bmFtZTogXCJkcmFmdFN0YXR1c1wiLFxuXHRcdFx0cHJvcGVydHlLZXk6IGNvbHVtbnNXaXRoRHJhZnRJbmRpY2F0b3JbMF0ubmFtZSxcblx0XHRcdGlzRHJhZnRJbmRpY2F0b3I6IHRydWUsXG5cdFx0XHRhdmFpbGFiaWxpdHk6IFwiRGVmYXVsdFwiLFxuXHRcdFx0bGFiZWw6IFwie3NhcC5mZS5pMThuPkNfRFJBRlRfU1RBVFVTX0NPTFVNTl9MQUJFTF9UT09MVElQfVwiLFxuXHRcdFx0dG9vbHRpcDogXCJ7c2FwLmZlLmkxOG4+Q19EUkFGVF9TVEFUVVNfQ09MVU1OX0xBQkVMX1RPT0xUSVB9XCIsXG5cdFx0XHR0eXBlOiBDb2x1bW5UeXBlLkNvbXB1dGVkLFxuXHRcdFx0Zm9ybWF0T3B0aW9uczogbnVsbCxcblx0XHRcdGV4cG9ydFNldHRpbmdzOiBudWxsLFxuXHRcdFx0Y2FzZVNlbnNpdGl2ZTogZmFsc2Vcblx0XHR9O1xuXHRcdGxldCBjb2x1bW5JbmRleFRvSW5zZXJ0QWZ0ZXI6IGludCA9IDA7XG5cdFx0aWYgKGNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yKSB7XG5cdFx0XHQvLyBJZiB0aGVyZSdzIGEgc2l0dWF0aW9ucyBpbmRpY2F0b3IgY29sdW1uLCBwbGFjZSB0aGUgZHJhZnQgc3RhdHVzIGNvbHVtbiBiZWZvcmUgaXRcblx0XHRcdGNvbHVtbkluZGV4VG9JbnNlcnRBZnRlciA9XG5cdFx0XHRcdHRhYmxlQ29sdW1ucy5maW5kSW5kZXgoKGNvbHVtbikgPT4gKGNvbHVtbiBhcyBDb21wdXRlZFRhYmxlQ29sdW1uKS5pc1NpdHVhdGlvbnNJbmRpY2F0b3IgPT09IHRydWUpIC0gMTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gT3RoZXJ3aXNlIHBsYWNlIHRoZSBkcmFmdCBzdGF0dXMgY29sdW1uIGFmdGVyIHRoZSBmaXJzdCB2aXNpYmxlIGNvbHVtblxuXHRcdFx0Y29sdW1uSW5kZXhUb0luc2VydEFmdGVyID0gdGFibGVDb2x1bW5zLmZpbmRJbmRleCgoY29sdW1uKSA9PiBjb2x1bW4uYXZhaWxhYmlsaXR5ICE9PSBcIkhpZGRlblwiKTtcblx0XHR9XG5cdFx0dGFibGVDb2x1bW5zLnNwbGljZShjb2x1bW5JbmRleFRvSW5zZXJ0QWZ0ZXIgKyAxLCAwLCBkcmFmdEluZGljYXRvckNvbHVtbik7XG5cdH1cblxuXHRyZXR1cm4gdGFibGVDb2x1bW5zO1xufVxuXG4vKipcbiAqIFByb3ZpZGVzIHRoZSByZXF1aXJlZCBwcm9wZXJ0aWVzIHNldCBvbiB0aGUgYW5ub3RhdGlvbnMuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCAgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgVGhlIHBhdGhzIG9mIHRoZSByZXN0cmljdGVkIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlcXVpcmVkUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBQcm9wZXJ0eVBhdGhbXSB7XG5cdHJldHVybiBnZXRDb250ZXh0UHJvcGVydHlSZXN0cmljdGlvbihcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSxcblx0XHQoY2FwYWJpbGl0aWVzKSA9PiB7XG5cdFx0XHRyZXR1cm4gKGNhcGFiaWxpdGllcyBhcyBFbnRpdHlTZXRBbm5vdGF0aW9uc19DYXBhYmlsaXRpZXMgfCB1bmRlZmluZWQpPy5JbnNlcnRSZXN0cmljdGlvbnM/LlJlcXVpcmVkUHJvcGVydGllcztcblx0XHR9LFxuXHRcdGZhbHNlXG5cdCk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgcHJvcGVydHkgaXMgYW5ub3RhdGVkIGFzIGEgcmVxdWlyZWQgcHJvcGVydHkuXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHlcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBpbnN0YW5jZSBvZiB0aGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHJlcXVpcmVkXG4gKi9cbmZ1bmN0aW9uIGlzQW5ub3RhdGVkUmVxdWlyZWRQcm9wZXJ0eShuYW1lOiBzdHJpbmcsIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQpXG5cdFx0Lm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5LiR0YXJnZXQ/LmZ1bGx5UXVhbGlmaWVkTmFtZSlcblx0XHQuaW5jbHVkZXMobmFtZSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZGF0YSB0eXBlIG9mIGEgY29sdW1uIGZvciB0aGUgZXhwb3J0LlxuICogQHBhcmFtIGRhdGFUeXBlIFRoZSBkYXRhIHR5cGUgb2YgYSBwcm9wZXJ0eSwgY29sdW1uXG4gKiBAcGFyYW0gaXNBVGltZXpvbmUgSXMgdGhlIGdpdmVuIHByb3BlcnR5IGEgdGltZXpvbmVcbiAqIEBwYXJhbSBpc0N1cnJlbmN5IElzIHRoZSBnaXZlbiBwcm9wZXJ0eSBhIGN1cnJlbmN5XG4gKiBAcGFyYW0gZXhwb3J0U2V0dGluZ3MgVGhlIGFscmVhZHkgZGV0ZWN0ZWQgZXhwb3J0IHNldHRpbmdzIGZyb20gZGF0YWZpZWxkc1xuICogQHJldHVybnMgVGhlIHN1cHBvcnRlZCBleHBvcnQgdHlwZVxuICovXG5mdW5jdGlvbiBnZXRFeHBvcnREYXRhVHlwZShcblx0ZGF0YVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0aXNBVGltZXpvbmUgPSBmYWxzZSxcblx0aXNDdXJyZW5jeSA9IGZhbHNlLFxuXHRleHBvcnRTZXR0aW5ncz86IENvbHVtbkV4cG9ydFNldHRpbmdzXG4pOiBzdHJpbmcge1xuXHRsZXQgZXhwb3J0RGF0YVR5cGUgPSBcIlN0cmluZ1wiO1xuXHRpZiAoIWRhdGFUeXBlIHx8IGV4cG9ydFNldHRpbmdzPy5kYXRhUG9pbnRUYXJnZXRWYWx1ZSkge1xuXHRcdHJldHVybiBleHBvcnREYXRhVHlwZTtcblx0fVxuXHRpZiAoZXhwb3J0U2V0dGluZ3M/LmlzQ3VycmVuY3kgfHwgaXNDdXJyZW5jeSkge1xuXHRcdHJldHVybiBcIkN1cnJlbmN5XCI7XG5cdH1cblx0aWYgKGlzQVRpbWV6b25lKSB7XG5cdFx0cmV0dXJuIFwiVGltZXpvbmVcIjtcblx0fVxuXHRpZiAoZXhwb3J0U2V0dGluZ3M/LndyYXApIHtcblx0XHRyZXR1cm4gZXhwb3J0RGF0YVR5cGU7XG5cdH1cblx0c3dpdGNoIChkYXRhVHlwZSkge1xuXHRcdGNhc2UgXCJFZG0uRGVjaW1hbFwiOlxuXHRcdGNhc2UgXCJFZG0uSW50MzJcIjpcblx0XHRjYXNlIFwiRWRtLkludDY0XCI6XG5cdFx0Y2FzZSBcIkVkbS5Eb3VibGVcIjpcblx0XHRjYXNlIFwiRWRtLkJ5dGVcIjpcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJOdW1iZXJcIjtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJFZG0uRGF0ZU9mVGltZVwiOlxuXHRcdGNhc2UgXCJFZG0uRGF0ZVwiOlxuXHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIkRhdGVcIjtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJFZG0uRGF0ZVRpbWVPZmZzZXRcIjpcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJEYXRlVGltZVwiO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkVkbS5UaW1lT2ZEYXlcIjpcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJUaW1lXCI7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiRWRtLkJvb2xlYW5cIjpcblx0XHRcdGV4cG9ydERhdGFUeXBlID0gXCJCb29sZWFuXCI7XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIlN0cmluZ1wiO1xuXHR9XG5cdHJldHVybiBleHBvcnREYXRhVHlwZTtcbn1cblxuLyoqXG4gKiBBZGRzIHRoZSB0b29sdGlwIGNvbmZpZ3VyYXRpb24gZm9yIGEgZ2l2ZW4gY29sdW1uLlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSByZWZlcmVuY2VkIG9uIHRoZSBjb2x1bW5cbiAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiB0byBiZSB1cGRhdGVkXG4gKi9cbmZ1bmN0aW9uIF9hZGRUb29sVGlwKHByb3BlcnR5OiBQcm9wZXJ0eSwgY29sdW1uOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4pOiB2b2lkIHtcblx0Y29uc3QgdG9vbHRpcCA9IF9nZXRUb29sdGlwKHByb3BlcnR5KSA/PyBjb2x1bW4ubGFiZWw7XG5cdGlmICh0b29sdGlwKSB7XG5cdFx0Y29sdW1uLnRvb2x0aXAgPSB0b29sdGlwO1xuXHR9XG59XG5cbmZ1bmN0aW9uIF9nZXRDb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHMoXG5cdHJlbGF0aXZlUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgbmF2aWdhdGlvblByb3BlcnRpZXMgPSBlbmhhbmNlRGF0YU1vZGVsUGF0aChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSwgcmVsYXRpdmVQYXRoKS5uYXZpZ2F0aW9uUHJvcGVydGllcztcblx0aWYgKG5hdmlnYXRpb25Qcm9wZXJ0aWVzPy5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3QgY29sbGVjdGVkTmF2aWdhdGlvblByb3BlcnR5TGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZvckVhY2goKG5hdlByb3BlcnR5KSA9PiB7XG5cdFx0XHRjb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHMucHVzaChnZXRMYWJlbChuYXZQcm9wZXJ0eSkgfHwgbmF2UHJvcGVydHkubmFtZSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGNvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscztcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBwcm9wZXJ0eSB1c2luZyB0aGUgdGV4dCBhcnJhbmdlbWVudCBhbm5vdGF0aW9uIHNldCB0byB0ZXh0IG9ubHkuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHQuXG4gKiBAcGFyYW0gcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIFRoZSBjb3JyZXNwb25kaW5nIERhdGFNb2RlbE9iamVjdFBhdGguXG4gKiBAcGFyYW0gbGluZUl0ZW0gVGhlIGNvbHVtbiB0byBiZSBldmFsdWF0ZWQuXG4gKiBAcGFyYW0gY29sdW1uc1RvQmVDcmVhdGVkIFRoZSBsaXN0IG9mIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cbiAqIEBwYXJhbSByZWxhdGl2ZVBhdGggVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHRhcmdldCBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgY29udGV4dC5cbiAqIEBwYXJhbSByZXN0cmljdGlvbnNPblByb3BlcnRpZXMgVGhlIGV4aXN0aW5nIHJlc3RyaWN0aW9ucyBvbiBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVByb3BlcnR5QW5ub3RhdGVkVGV4dE9ubHkoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0cHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPERhdGFGaWVsZEFic3RyYWN0VHlwZXM+LFxuXHRsaW5lSXRlbTogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0Y29sdW1uc1RvQmVDcmVhdGVkOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT4sXG5cdHJlbGF0aXZlUGF0aDogc3RyaW5nLFxuXHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM6IFJlc3RyaWN0aW9uc09uUHJvcGVydGllc1xuKTogdm9pZCB7XG5cdGNvbnN0IGlzUHJvcGVydHlOYXZpZ2F0ZWQgPVxuXHRcdHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGggIT09IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aDtcblx0aWYgKGlzUHJvcGVydHlOYXZpZ2F0ZWQgJiYgaXNEYXRhRmllbGQobGluZUl0ZW0pKSB7XG5cdFx0Y29sdW1uc1RvQmVDcmVhdGVkW3JlbGF0aXZlUGF0aF0gPSBsaW5lSXRlbS5WYWx1ZS4kdGFyZ2V0O1xuXHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcy5ub25Tb3J0YWJsZVByb3BlcnRpZXMucHVzaChyZWxhdGl2ZVBhdGgpO1xuXHR9IGVsc2UgaWYgKGlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvbihsaW5lSXRlbSkgJiYgaGFzRmllbGRHcm91cFRhcmdldChsaW5lSXRlbSkpIHtcblx0XHQobGluZUl0ZW0uVGFyZ2V0LiR0YXJnZXQgYXMgRmllbGRHcm91cCkuRGF0YS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuXHRcdFx0aWYgKGlzRGF0YUZpZWxkKGZpZWxkKSAmJiBnZXREaXNwbGF5TW9kZShmaWVsZC5WYWx1ZS4kdGFyZ2V0KSA9PT0gXCJEZXNjcmlwdGlvblwiKSB7XG5cdFx0XHRcdGNvbnN0IGluaGVyZWRQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aChcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSxcblx0XHRcdFx0XHRmaWVsZC5WYWx1ZS5wYXRoXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbnN0IGlzSW5oZXJlZFByb3BlcnR5TmF2aWdhdGVkID1cblx0XHRcdFx0XHRpbmhlcmVkUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aCAhPT1cblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKS5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGg7XG5cdFx0XHRcdGlmIChpc0luaGVyZWRQcm9wZXJ0eU5hdmlnYXRlZCkge1xuXHRcdFx0XHRcdGNvbHVtbnNUb0JlQ3JlYXRlZFtmaWVsZC5WYWx1ZS5wYXRoXSA9IGZpZWxkLlZhbHVlLiR0YXJnZXQ7XG5cdFx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLm5vblNvcnRhYmxlUHJvcGVydGllcy5wdXNoKGZpZWxkLlZhbHVlLnBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVDb25maWcob1Byb3BlcnR5OiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCB1bmRlZmluZWQsIGRhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9wZXJ0eVR5cGVDb25maWcge1xuXHRsZXQgb1RhcmdldE1hcHBpbmc7XG5cdGlmIChpc1Byb3BlcnR5KG9Qcm9wZXJ0eSkpIHtcblx0XHRvVGFyZ2V0TWFwcGluZyA9IGlzVHlwZURlZmluaXRpb24ob1Byb3BlcnR5LnRhcmdldFR5cGUpXG5cdFx0XHQ/IEVETV9UWVBFX01BUFBJTkdbb1Byb3BlcnR5LnRhcmdldFR5cGUudW5kZXJseWluZ1R5cGVdXG5cdFx0XHQ6IEVETV9UWVBFX01BUFBJTkdbb1Byb3BlcnR5LnR5cGVdO1xuXHR9XG5cdGlmIChvVGFyZ2V0TWFwcGluZyA9PT0gdW5kZWZpbmVkICYmIGRhdGFUeXBlICE9PSB1bmRlZmluZWQpIHtcblx0XHRvVGFyZ2V0TWFwcGluZyA9IEVETV9UWVBFX01BUFBJTkdbZGF0YVR5cGVdO1xuXHR9XG5cdGNvbnN0IHByb3BlcnR5VHlwZUNvbmZpZzogUHJvcGVydHlUeXBlQ29uZmlnID0ge1xuXHRcdHR5cGU6IG9UYXJnZXRNYXBwaW5nPy50eXBlLFxuXHRcdGNvbnN0cmFpbnRzOiB7fSxcblx0XHRmb3JtYXRPcHRpb25zOiB7fVxuXHR9O1xuXHRpZiAoaXNQcm9wZXJ0eShvUHJvcGVydHkpICYmIG9UYXJnZXRNYXBwaW5nICE9PSB1bmRlZmluZWQpIHtcblx0XHRwcm9wZXJ0eVR5cGVDb25maWcuY29uc3RyYWludHMgPSB7XG5cdFx0XHRzY2FsZTogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRTY2FsZSA/IG9Qcm9wZXJ0eS5zY2FsZSA6IHVuZGVmaW5lZCxcblx0XHRcdHByZWNpc2lvbjogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiRQcmVjaXNpb24gPyBvUHJvcGVydHkucHJlY2lzaW9uIDogdW5kZWZpbmVkLFxuXHRcdFx0bWF4TGVuZ3RoOiBvVGFyZ2V0TWFwcGluZy5jb25zdHJhaW50cz8uJE1heExlbmd0aCA/IG9Qcm9wZXJ0eS5tYXhMZW5ndGggOiB1bmRlZmluZWQsXG5cdFx0XHRudWxsYWJsZTogb1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LiROdWxsYWJsZSA/IG9Qcm9wZXJ0eS5udWxsYWJsZSA6IHVuZGVmaW5lZCxcblx0XHRcdG1pbmltdW06XG5cdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWluaW11bS8kRGVjaW1hbFwiXSAmJlxuXHRcdFx0XHQhaXNOYU4ob1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NaW5pbXVtKVxuXHRcdFx0XHRcdD8gYCR7b1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NaW5pbXVtfWBcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdG1heGltdW06XG5cdFx0XHRcdG9UYXJnZXRNYXBwaW5nLmNvbnN0cmFpbnRzPy5bXCJAT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWF4aW11bS8kRGVjaW1hbFwiXSAmJlxuXHRcdFx0XHQhaXNOYU4ob1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NYXhpbXVtKVxuXHRcdFx0XHRcdD8gYCR7b1Byb3BlcnR5LmFubm90YXRpb25zPy5WYWxpZGF0aW9uPy5NYXhpbXVtfWBcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdGlzRGlnaXRTZXF1ZW5jZTpcblx0XHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnLnR5cGUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU3RyaW5nXCIgJiZcblx0XHRcdFx0b1RhcmdldE1hcHBpbmcuY29uc3RyYWludHM/LltgQCR7Q29tbW9uQW5ub3RhdGlvblRlcm1zLklzRGlnaXRTZXF1ZW5jZX1gXSAmJlxuXHRcdFx0XHRvUHJvcGVydHkuYW5ub3RhdGlvbnM/LkNvbW1vbj8uSXNEaWdpdFNlcXVlbmNlXG5cdFx0XHRcdFx0PyB0cnVlXG5cdFx0XHRcdFx0OiB1bmRlZmluZWRcblx0XHR9O1xuXHR9XG5cdHByb3BlcnR5VHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zID0ge1xuXHRcdHBhcnNlQXNTdHJpbmc6XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5JbnRcIikgPT09IDAgfHxcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkRvdWJsZVwiKSA9PT0gMFxuXHRcdFx0XHQ/IGZhbHNlXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdGVtcHR5U3RyaW5nOlxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuSW50XCIpID09PSAwIHx8XG5cdFx0XHRwcm9wZXJ0eVR5cGVDb25maWc/LnR5cGU/LmluZGV4T2YoXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5Eb3VibGVcIikgPT09IDBcblx0XHRcdFx0PyBcIlwiXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdHBhcnNlS2VlcHNFbXB0eVN0cmluZzpcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZy50eXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmluZ1wiICYmIHByb3BlcnR5VHlwZUNvbmZpZy5jb25zdHJhaW50cy5udWxsYWJsZSA9PT0gZmFsc2Vcblx0XHRcdFx0PyB0cnVlXG5cdFx0XHRcdDogdW5kZWZpbmVkXG5cdH07XG5cdHJldHVybiBwcm9wZXJ0eVR5cGVDb25maWc7XG59XG5cbi8qKlxuICogQWRkIGEgZGVzY3JpcHRpb24gcHJvcGVydHkgdG8gdGhlIGxpc3Qgb2YgZGVzY3JpcHRpb24gcHJvcGVydGllcyB1c2VkIGJ5IHRoZSBjb2x1bW5zIG9mIGEgdGFibGUuXG4gKiBAcGFyYW0gZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCBUaGUgbGlzdCBvZiBwcm9wZXJ0aWVzIHJlZmVyZW5jZWQgYXMgdGV4dCBvbiBhIHRleHQgYXJyYW5nZW1lbnQgYW5ub3RhdGlvblxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGxpbmtlZCB0byB0aGUgY29sdW1uIChuYW1lZCBhbHNvIGNvbXBsZXggcHJvcGVydHkpXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnR5TmFtZSBUaGUgcHJvcGVydHkgbmFtZSB0byBiZSBhZGRlZFxuICovXG5mdW5jdGlvbiBhZGRQcm9wZXJ0eVRvRGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcChcblx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcDogUmVjb3JkPHN0cmluZywgRGlzcGxheU1vZGU+LFxuXHRyZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm8sXG5cdHJlbGF0ZWRQcm9wZXJ0eU5hbWU6IHN0cmluZ1xuKTogdm9pZCB7XG5cdGlmIChcblx0XHRyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1tyZWxhdGVkUHJvcGVydHlOYW1lXS5kaXNwbGF5TW9kZU9mUHJvcGVydHlVc2VkQXNEZXNjcmlwdGlvbiAmJlxuXHRcdCFkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwW3JlbGF0ZWRQcm9wZXJ0eU5hbWVdXG5cdCkge1xuXHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXBbcmVsYXRlZFByb3BlcnR5TmFtZV0gPVxuXHRcdFx0cmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbcmVsYXRlZFByb3BlcnR5TmFtZV0uZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24hO1xuXHR9XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIHJlZmVyZW5jZWQgcHJvcGVydGllcyBvZiBhIExpbmVJdGVtIGluIGNhc2UgdGhlIExpbmVJdGVtIGlzIGFubm90YXRlZCBhcyBoaWRkZW4uXG4gKiBAcGFyYW0gZXhpc3RpbmdDb2x1bW5zIFRoZSBsaXN0IG9mIGNvbHVtbnMgY3JlYXRlZCBmcm9tIExpbmVJdGVtcyBhbmQgZnJvbSBwcm9wZXJ0aWVzIG9mIGVudGl0eVR5cGVcbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBldmFsdWF0ZWRcbiAqIEBwYXJhbSBjb2x1bW4gVGhlIGdpdmVuIGNvbHVtbiBmcm9tIGxpbmVJdGVtIG9yIHByb3BlcnR5IG9mIGVudGl0eVNldFxuICovXG5mdW5jdGlvbiBjb21wdXRlSGlkZGVuT25SZWxhdGVkQ29sdW1ucyhleGlzdGluZ0NvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLCBuYW1lOiBzdHJpbmcsIGNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uKTogdm9pZCB7XG5cdGNvbnN0IHJlbGF0ZWRBbm5vdGF0aW9uQ29sdW1ucyA9IGV4aXN0aW5nQ29sdW1ucy5maWx0ZXIoXG5cdFx0KGV4aXN0aW5nQ29sdW1uKSA9PlxuXHRcdFx0KGV4aXN0aW5nQ29sdW1uLnByb3BlcnR5SW5mb3M/LmluY2x1ZGVzKG5hbWUpICYmIGV4aXN0aW5nQ29sdW1uLmlzUGFydE9mTGluZUl0ZW0pIHx8XG5cdFx0XHQoZXhpc3RpbmdDb2x1bW4uaXNQYXJ0T2ZMaW5lSXRlbSAmJiBleGlzdGluZ0NvbHVtbi5yZWxhdGl2ZVBhdGggPT09IGNvbHVtbi5yZWxhdGl2ZVBhdGgpXG5cdCk7XG5cdGNvbHVtbi5pc1BhcnRPZkxpbmVJdGVtID0gISFyZWxhdGVkQW5ub3RhdGlvbkNvbHVtbnMubGVuZ3RoO1xuXHRpZiAoXG5cdFx0cmVsYXRlZEFubm90YXRpb25Db2x1bW5zLmxlbmd0aCAmJlxuXHRcdCFyZWxhdGVkQW5ub3RhdGlvbkNvbHVtbnM/LnNvbWUoKGFubm90YXRpb25Db2x1bW4pID0+IGFubm90YXRpb25Db2x1bW4uYXZhaWxhYmlsaXR5ICE9PSBcIkhpZGRlblwiKVxuXHQpIHtcblx0XHRjb2x1bW4uc29ydGFibGUgPSBmYWxzZTtcblx0XHRjb2x1bW4uaXNHcm91cGFibGUgPSBmYWxzZTtcblx0XHRjb2x1bW4uZmlsdGVyYWJsZSA9IGZhbHNlO1xuXHR9XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZXhwb3J0IHNldHRpbmdzIHByb3BlcnRpZXMgb2YgYSBtYW5pZmVzdCBjb2x1bW4uXG4gKiBAcGFyYW0gZXhwb3J0U2V0dGluZ3MgVGhlIGN1c3RvbWl6ZWQvb3ZlcndyaXR0ZW4gZXhwb3J0IHNldHRpbmdzIG9mIGEgbWFuaWZlc3QgY29sdW1uXG4gKiBAcGFyYW0gYW5ub3RhdGlvbkNvbHVtbnMgVGhlIGxpc3Qgb2YgY29sdW1ucyBjcmVhdGVkIGZyb20gTGluZUl0ZW1zXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB0YXJnZXQgZW50aXR5IHR5cGVcbiAqIEBwYXJhbSBwcm9wZXJ0eUluZm9zIFRoZSBwcm9wZXJ0aWVzIGxpbmtlZCB0byBhIGNvbXBsZXggY29sdW1uXG4gKiBAcGFyYW0gY29sdW1uS2V5IFRoZSBjb2x1bW4ga2V5IG9mIHRoZSBjb2x1bW4gdG8gYmUgb3ZlcndyaXR0ZW5cbiAqIEByZXR1cm5zIFRoZSBleHBvcnQgc2V0dGluZ3Mgb2YgdGhlIGNvbHVtbiBtZXJnaW5nIGN1c3RvbWl6ZWQgZXhwb3J0IHNldHRpbmdzIHdpdGggdGhlIGRlZmF1bHQgdmFsdWVzIGRldGVjdGVkIG9uIHRoZSBhbm5vdGF0aW9uIGNvbHVtblxuICovXG5mdW5jdGlvbiBnZXRDdXN0b21FeHBvcnRTZXR0aW5ncyhcblx0ZXhwb3J0U2V0dGluZ3M6IENvbHVtbkV4cG9ydFNldHRpbmdzIHwgdW5kZWZpbmVkLFxuXHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0cHJvcGVydHlJbmZvcz86IHN0cmluZ1tdLFxuXHRjb2x1bW5LZXk/OiBzdHJpbmdcbik6IENvbHVtbkV4cG9ydFNldHRpbmdzIHwgbnVsbCB7XG5cdGxldCBjb2x1bW5Gcm9tQW5ub3RhdGlvbnM7XG5cdGlmIChjb2x1bW5LZXkpIHtcblx0XHRjb2x1bW5Gcm9tQW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uQ29sdW1ucy5maW5kKChhbm5vdGF0aW9uQ29sdW1uKSA9PiBhbm5vdGF0aW9uQ29sdW1uLmtleSA9PT0gY29sdW1uS2V5KTtcblx0XHRpZiAoY29sdW1uRnJvbUFubm90YXRpb25zPy5leHBvcnRTZXR0aW5ncyA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGNvbHVtbkZyb21Bbm5vdGF0aW9ucz8uZXhwb3J0U2V0dGluZ3M7XG5cdFx0fVxuXHR9XG5cdGNvbnN0IGVuYWJsZVdyYXBwaW5nID1cblx0XHRleHBvcnRTZXR0aW5ncz8ud3JhcCA/P1xuXHRcdCghIShleHBvcnRTZXR0aW5ncz8ucHJvcGVydHkgJiYgZXhwb3J0U2V0dGluZ3MucHJvcGVydHk/Lmxlbmd0aCA+IDEpIHx8ICEhKHByb3BlcnR5SW5mb3MgJiYgcHJvcGVydHlJbmZvcy5sZW5ndGggPiAxKSk7XG5cdGNvbnN0IGN1c3RvbUV4cG9ydFNldHRpbmdzOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyA9IHtcblx0XHQuLi5jb2x1bW5Gcm9tQW5ub3RhdGlvbnM/LmV4cG9ydFNldHRpbmdzLFxuXHRcdHR5cGU6IGV4cG9ydFNldHRpbmdzPy50eXBlID8/IGNvbHVtbkZyb21Bbm5vdGF0aW9ucz8uZXhwb3J0U2V0dGluZ3M/LnR5cGUsXG5cdFx0dGVtcGxhdGU6XG5cdFx0XHRleHBvcnRTZXR0aW5ncz8udGVtcGxhdGUgPz9cblx0XHRcdF9hcHBlbmRDdXN0b21UZW1wbGF0ZShwcm9wZXJ0eUluZm9zLCBleHBvcnRTZXR0aW5ncz8ucHJvcGVydHkpID8/XG5cdFx0XHRjb2x1bW5Gcm9tQW5ub3RhdGlvbnM/LmV4cG9ydFNldHRpbmdzPy50ZW1wbGF0ZSxcblx0XHRwcm9wZXJ0eTogZXhwb3J0U2V0dGluZ3M/LnByb3BlcnR5XG5cdFx0XHQ/IF9nZXRQcm9wZXJ0eU5hbWVzKGV4cG9ydFNldHRpbmdzPy5wcm9wZXJ0eSwgYW5ub3RhdGlvbkNvbHVtbnMsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUpXG5cdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHR3aWR0aDogZXhwb3J0U2V0dGluZ3M/LndpZHRoLFxuXHRcdHdyYXA6IGVuYWJsZVdyYXBwaW5nXG5cdH07XG5cdHJldHVybiByZW1vdmVVbmRlZmluZWRGcm9tRXhwb3J0U2V0dGluZ3MoY3VzdG9tRXhwb3J0U2V0dGluZ3MpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBa0dBO0VBS0E7RUFLQTtFQUlBO0VBY0E7RUE4QkE7RUFzQ0E7RUFBQSxJQTBDWUEsVUFBVSwwQkFBVkEsVUFBVTtJQUFWQSxVQUFVO0lBQ0E7SUFEVkEsVUFBVTtJQUFWQSxVQUFVO0lBQVZBLFVBQVU7SUFBQSxPQUFWQSxVQUFVO0VBQUE7RUFNdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBUkFDLFFBQUEsQ0FBQUQsVUFBQSxHQUFBQSxVQUFBO0VBU08sU0FBU0UsZUFBZUEsQ0FDOUJDLGtCQUE0QixFQUM1QkMsU0FBb0IsRUFDcEJDLGlCQUF5QixFQUN6QkMsZ0JBQXlELEVBQ3pDO0lBQ2hCLE1BQU1DLGlCQUFpQixHQUFHQyx5QkFBeUIsQ0FBQ0wsa0JBQWtCLEVBQUVDLFNBQVMs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
1684
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb2x1bW5UeXBlIiwiX2V4cG9ydHMiLCJnZXRUYWJsZUNvbHVtbnMiLCJsaW5lSXRlbUFubm90YXRpb24iLCJ0YWJsZVR5cGUiLCJ2aXN1YWxpemF0aW9uUGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJhbm5vdGF0aW9uQ29sdW1ucyIsImdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMiLCJtYW5pZmVzdENvbHVtbnMiLCJnZXRDb2x1bW5zRnJvbU1hbmlmZXN0IiwiZ2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbiIsImNvbHVtbnMiLCJnZXRBbm5vdGF0aW9uRW50aXR5VHlwZSIsInRhYmxlQ29sdW1ucyIsImluc2VydEN1c3RvbUVsZW1lbnRzIiwid2lkdGgiLCJPdmVycmlkZVR5cGUiLCJvdmVyd3JpdGUiLCJ3aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlciIsImltcG9ydGFuY2UiLCJob3Jpem9udGFsQWxpZ24iLCJhdmFpbGFiaWxpdHkiLCJpc05hdmlnYWJsZSIsInNldHRpbmdzIiwiZm9ybWF0T3B0aW9ucyIsImV4cG9ydFNldHRpbmdzIiwiYWRkQ29tcHV0ZWRDb2x1bW5zIiwiZmluZENvbHVtbkJ5UGF0aCIsInBhdGgiLCJmaW5kIiwiY29sdW1uIiwiYW5ub3RhdGlvbkNvbHVtbiIsInByb3BlcnR5SW5mb3MiLCJ1bmRlZmluZWQiLCJyZWxhdGl2ZVBhdGgiLCJ1cGRhdGVMaW5rZWRQcm9wZXJ0aWVzIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsImdldENvbnZlcnRlckNvbnRleHRGb3IiLCJnZXRDb250ZXh0UGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJmb3JFYWNoIiwib0NvbHVtbiIsInRhYmxlQ29sdW1uIiwicHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwiZW5oYW5jZURhdGFNb2RlbFBhdGgiLCJwcm9wZXJ0eSIsInRhcmdldE9iamVjdCIsImFkZEN1cnJlbmN5T3JVb01Ub1Byb3BlcnR5IiwidGltZXpvbmVQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5IiwidGltZXpvbmUiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIlRpbWV6b25lIiwib1RpbWV6b25lQ29sdW1uIiwibmFtZSIsInRpbWV6b25lVGV4dCIsInRvU3RyaW5nIiwiYWRkVGV4dEFycmFuZ2VudEluZm9Ub1Byb3BlcnR5IiwiY3VycmVuY3lPclVvTVByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoIiwiZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgiLCJjdXJyZW5jeU9yVW9NUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwiY3VycmVuY3lPclVvTVJlbGF0aXZlUGF0aCIsImdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgiLCJ1bml0Q29sdW1uIiwidW5pdCIsIk1lYXN1cmVzIiwiSVNPQ3VycmVuY3kiLCJVbml0IiwidW5pdFRleHQiLCJkaXNwbGF5TW9kZSIsImdldERpc3BsYXlNb2RlIiwidGV4dFByb3BlcnR5UGF0aCIsImdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoIiwidGV4dFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCIsInRleHRSZWxhdGl2ZVBhdGgiLCJ0ZXh0Q29sdW1uIiwidGV4dEFycmFuZ2VtZW50IiwidGV4dFByb3BlcnR5IiwibW9kZSIsInR5cGUiLCJnZXRDb2x1bW5zRnJvbUVudGl0eVR5cGUiLCJjb2x1bW5zVG9CZUNyZWF0ZWQiLCJlbnRpdHlUeXBlIiwidGFibGVDcmVhdGlvbk1vZGUiLCJkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwIiwicmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIiwicHJvcGVydGllc05vdFRvQmVDb25zaWRlcmVkIiwiYWdncmVnYXRpb25IZWxwZXIiLCJBZ2dyZWdhdGlvbkhlbHBlciIsImdyb3VwYWJsZVByb3BlcnRpZXMiLCJnZXRHcm91cGFibGVQcm9wZXJ0aWVzIiwiaXNBbmFseXRpY3NTdXBwb3J0ZWQiLCJtYXAiLCIkdGFyZ2V0IiwiZmlsdGVyIiwidGFyZ2V0IiwiZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eSIsInRleHRQcm9wIiwiaXNQcm9wZXJ0eUdyb3VwYWJsZSIsInByb3AiLCJlbnRpdHlQcm9wZXJ0aWVzIiwiZXhpc3RzIiwic29tZSIsInRhcmdldFR5cGUiLCJpbmNsdWRlcyIsInJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyIsImNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyIsInJlbGF0ZWRQcm9wZXJ0eU5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsInByb3BlcnRpZXMiLCJhZGRpdGlvbmFsUHJvcGVydHlOYW1lcyIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwiYWRkUHJvcGVydHlUb0Rpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAiLCJjb2x1bW5JbmZvIiwiZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eSIsImdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJsZW5ndGgiLCJkYXRhUG9pbnRUYXJnZXRWYWx1ZSIsImV4cG9ydERhdGFQb2ludFRhcmdldFZhbHVlIiwiYW5ub3RhdGlvblByb3BlcnR5IiwiYWRkaXRpb25hbFByb3BlcnR5SW5mb3MiLCJhZGRpdGlvbmFsUHJvcGVydHlOYW1lIiwicHVzaCIsIm5vblNvcnRhYmxlUHJvcGVydGllcyIsImlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIiwiVGV4dCIsInJlbGF0ZWRDb2x1bW5zIiwiX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zIiwiY29uY2F0IiwiZnVsbFByb3BlcnR5UGF0aCIsInVzZURhdGFGaWVsZFByZWZpeCIsImF2YWlsYWJsZUZvckFkYXB0YXRpb24iLCJyZWxhdGl2ZVBhdGhGb3JNdWx0aVZhbHVlIiwic2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCIsImdldFNlbWFudGljT2JqZWN0UGF0aCIsImlzSGlkZGVuIiwiaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4iLCJncm91cFBhdGgiLCJfc2xpY2VBdFNsYXNoIiwiaXNHcm91cCIsImxhYmVsIiwiZ2V0TGFiZWwiLCJkYXRhVHlwZSIsImdldERhdGFGaWVsZERhdGFUeXBlIiwicHJvcGVydHlUeXBlQ29uZmlnIiwiZ2V0VHlwZUNvbmZpZyIsImlzQVByb3BlcnR5RnJvbVRleHRPbmx5QW5ub3RhdGlvbiIsInNvcnRhYmxlIiwiZmlsdGVyYWJsZSIsIm5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIiwidHlwZUNvbmZpZyIsImNsYXNzTmFtZSIsImNvbnN0cmFpbnRzIiwiX2lzRXhwb3J0YWJsZUNvbHVtbiIsImNyZWF0ZUNvbHVtbkV4cG9ydFNldHRpbmdzIiwiY29sbGVjdGVkTmF2aWdhdGlvblByb3BlcnR5TGFiZWxzIiwiX2dldENvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscyIsImtleSIsInJlcGxhY2VTcGVjaWFsQ2hhcnMiLCJBbm5vdGF0aW9uIiwiZ3JvdXBMYWJlbCIsImdyb3VwIiwiYW5ub3RhdGlvblBhdGgiLCJzZW1hbnRpY09iamVjdFBhdGgiLCJpc0dyb3VwYWJsZSIsImlzS2V5IiwiY2FzZVNlbnNpdGl2ZSIsImlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsImdldEltcG9ydGFuY2UiLCJVSSIsIkRhdGFGaWVsZERlZmF1bHQiLCJyZXF1aXJlZCIsImlzUmVxdWlyZWRDb2x1bW4iLCJhZGRpdGlvbmFsTGFiZWxzIiwiX2FkZFRvb2xUaXAiLCJfc2V0RXhwb3J0U2V0dGluZ3NGb3JEYXRhUG9pbnQiLCJNb2RlbEhlbHBlciIsImlzT2JqZWN0UGF0aERyYWZ0U3VwcG9ydGVkIiwiZXh0ZW5zaW9uIiwidGVjaG5pY2FsbHlBZ2dyZWdhdGFibGUiLCJ0ZWNobmljYWxseUdyb3VwYWJsZSIsInVuaXRQcm9wZXJ0eSIsInV0YyIsImlzQVRpbWV6b25lIiwiY3VycmVuY3lQcm9wZXJ0eSIsInNjYWxlIiwiaXNQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSIsImdldFN0YXRpY1VuaXRPckN1cnJlbmN5IiwiZ2V0U3RhdGljVGltZXpvbmUiLCJpc1RpbWV6b25lIiwiZXhwb3J0VHlwZSIsImdldEV4cG9ydERhdGFUeXBlIiwiaW5wdXRGb3JtYXQiLCJnZXREYXRlSW5wdXRGb3JtYXQiLCJkZWxpbWl0ZXIiLCJnZXREZWxpbWl0ZXIiLCJ0ZW1wbGF0ZSIsIndyYXAiLCJhdXRvU2NhbGUiLCJyZW1vdmVVbmRlZmluZWRGcm9tRXhwb3J0U2V0dGluZ3MiLCJzZXR0aW5nIiwic291cmNlIiwicHJvcGVydHlUeXBlIiwiZGF0YUZpZWxkRGVmYXVsdFByb3BlcnR5IiwiJFR5cGUiLCJUYXJnZXQiLCJWYWx1ZSIsIkNvcmUiLCJNZWRpYVR5cGUiLCJ0ZXJtIiwiaXNVUkwiLCJfaXNWYWxpZENvbHVtbiIsImRhdGFGaWVsZCIsIklubGluZSIsIl9nZXRWaXNpYmxlRXhwcmVzc2lvbiIsImRhdGFGaWVsZE1vZGVsUGF0aCIsInByb3BlcnR5VmFsdWUiLCJpc0FuYWx5dGljYWxHcm91cEhlYWRlckV4cGFuZGVkIiwiY29uc3RhbnQiLCJpc0FuYWx5dGljYWxMZWFmIiwiYW5kIiwibm90IiwiZXF1YWwiLCJnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24iLCJIaWRkZW4iLCJpZkVsc2UiLCJvciIsIl9nZXRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMiLCJkYXRhRmllbGRHcm91cCIsImZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyIsImNvbXBpbGVFeHByZXNzaW9uIiwiRGF0YSIsImlubmVyRGF0YUZpZWxkIiwiYXJndW1lbnRzIiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJkYXRhRmllbGREZWZhdWx0IiwicXVhbGlmaWVyIiwiTGFiZWwiLCJpc0RhdGFGaWVsZFR5cGVzIiwidmFsdWVPZiIsIl9nZXRUb29sdGlwIiwiUXVpY2tJbmZvIiwiZGF0YXBvaW50VGFyZ2V0IiwiZ2V0Um93U3RhdHVzVmlzaWJpbGl0eSIsImNvbE5hbWUiLCJpc1NlbWFudGljS2V5SW5GaWVsZEdyb3VwIiwiZm9ybWF0UmVzdWx0IiwicGF0aEluTW9kZWwiLCJ0YWJsZUZvcm1hdHRlcnMiLCJnZXRFcnJvclN0YXR1c1RleHRWaXNpYmlsaXR5Rm9ybWF0dGVyIiwiZXhpc3RpbmdDb2x1bW5zIiwicmVsYXRlZFByb3BlcnR5TmFtZU1hcCIsImdldEFic29sdXRlQW5ub3RhdGlvblBhdGgiLCJyZWxhdGVkQ29sdW1uIiwicHJvcGVydHlPYmplY3RQYXRoIiwiaXNNdWx0aVZhbHVlRmllbGQiLCJuZXdOYW1lUmVsYXRpdmVUYXJnZXRQYXRoIiwiY29tcHV0ZUhpZGRlbk9uUmVsYXRlZENvbHVtbnMiLCJuZXdOYW1lIiwicHJvcGVydHlJbmZvIiwiX2dldEFubm90YXRpb25Db2x1bW5OYW1lIiwiS2V5SGVscGVyIiwiZ2VuZXJhdGVLZXlGcm9tRGF0YUZpZWxkIiwiX2dldFNob3dEYXRhRmllbGRzTGFiZWwiLCJmaWVsZEdyb3VwTmFtZSIsImNvbHVtbktleXMiLCJzaG93RGF0YUZpZWxkc0xhYmVsIiwiX2dldFJlbGF0aXZlUGF0aCIsInZhbHVlIiwiaXNMYXN0U2xhc2giLCJpc0xhc3RQYXJ0IiwiaVNsYXNoSW5kZXgiLCJsYXN0SW5kZXhPZiIsImluZGV4T2YiLCJzdWJzdHJpbmciLCJfaXNDb2x1bW5NdWx0aVZhbHVlZCIsIl9pc0NvbHVtblNvcnRhYmxlIiwicHJvcGVydHlQYXRoIiwibm9uU29ydGFibGVDb2x1bW5zIiwicHJvcE5hbWUiLCJmaWx0ZXJGdW5jdGlvbnMiLCJfZ2V0RmlsdGVyRnVuY3Rpb25zIiwiQ29udmVydGVyQ29udGV4dCIsImVudGl0eVNldCIsImdldEVudGl0eVNldCIsIlR5cGVHdWFyZHMiLCJpc0VudGl0eVNldCIsIkNhcGFiaWxpdGllcyIsIkZpbHRlckZ1bmN0aW9ucyIsImdldEVudGl0eUNvbnRhaW5lciIsIl9nZXREZWZhdWx0Rm9ybWF0T3B0aW9uc0ZvclRhYmxlIiwidGV4dExpbmVzRWRpdCIsIl9maW5kU2VtYW50aWNLZXlWYWx1ZXMiLCJzZW1hbnRpY0tleXMiLCJhU2VtYW50aWNLZXlWYWx1ZXMiLCJiU2VtYW50aWNLZXlGb3VuZCIsImkiLCJ2YWx1ZXMiLCJzZW1hbnRpY0tleUZvdW5kIiwiX2ZpbmRQcm9wZXJ0aWVzIiwic2VtYW50aWNLZXlWYWx1ZXMiLCJmaWVsZEdyb3VwUHJvcGVydGllcyIsInNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXAiLCJzUHJvcGVydHlQYXRoIiwidG1wIiwiZmllbGRHcm91cFByb3BlcnR5UGF0aCIsIl9maW5kU2VtYW50aWNLZXlWYWx1ZXNJbkZpZWxkR3JvdXAiLCJhUHJvcGVydGllcyIsIl9wcm9wZXJ0aWVzRm91bmQiLCJnZXREZWZhdWx0RHJhZnRJbmRpY2F0b3JGb3JDb2x1bW4iLCJzZW1hbnRpY0tleSIsInNlbWFudGljS2V5SW5GaWVsZEdyb3VwIiwiZmllbGRHcm91cERyYWZ0SW5kaWNhdG9yUHJvcGVydHlQYXRoIiwic2hvd0Vycm9yT2JqZWN0U3RhdHVzIiwiaGFzRHJhZnRJbmRpY2F0b3IiLCJfZ2V0SW1wTnVtYmVyIiwiSW1wb3J0YW5jZSIsIl9nZXREYXRhRmllbGRJbXBvcnRhbmNlIiwic3BsaXQiLCJOb25lIiwidGFyZ2V0VmFsdWVmcm9tRFAiLCJnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50IiwiaXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdCIsIl9nZXRNYXhJbXBvcnRhbmNlIiwiZmllbGRzIiwibWF4SW1wTnVtYmVyIiwiaW1wTnVtYmVyIiwiRGF0YUZpZWxkV2l0aE1heEltcG9ydGFuY2UiLCJmaWVsZCIsInRhcmdldEVudGl0eVR5cGUiLCJTZW1hbnRpY0tleSIsInJlcXVpcmVkUHJvcGVydGllcyIsImdldFJlcXVpcmVkUHJvcGVydGllcyIsImhpZ2hLZXlzIiwiZmllbGRzV2l0aEltcG9ydGFuY2UiLCJpc0Fubm90YXRpb25PZlR5cGUiLCJkYXRhRmllbGRUYXJnZXQiLCJmaWVsZEdyb3VwRGF0YSIsImZpZWxkR3JvdXBEYXRhRmllbGQiLCJIaWdoIiwiaXRlbSIsImdldFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyIsInRhYmxlTWFuaWZlc3RTZXR0aW5ncyIsImRlZmF1bHRDcmVhdGlvbk1vZGUiLCJnZXRNYW5pZmVzdFdyYXBwZXIiLCJnZXRTYXBGZU1hbmlmZXN0Q29uZmlndXJhdGlvbiIsIm1hY3JvcyIsInRhYmxlIiwiQ3JlYXRpb25Nb2RlIiwiSW5saW5lQ3JlYXRpb25Sb3dzIiwidGFibGVTZXR0aW5ncyIsImNyZWF0aW9uTW9kZSIsImdldEFubm90YXRpb25zQnlUZXJtIiwiZ2V0RW50aXR5VHlwZSIsInRhYmxlQ29udmVydGVyQ29udGV4dCIsImdldFRhcmdldE9iamVjdFBhdGgiLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseSIsImlzRmllbGRHcm91cENvbHVtbiIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwic2l0dWF0aW9uc05hdlByb3BzIiwibmF2aWdhdGlvblByb3BlcnR5IiwiaXNDb2xsZWN0aW9uIiwiU0FQT2JqZWN0Tm9kZVR5cGUiLCJOYW1lIiwic2l0dWF0aW9uc05hdlByb3AiLCJoYXNTaXR1YXRpb25zSW5kaWNhdG9yIiwiaXNNdWx0aVZhbHVlIiwidmlzdWFsU2V0dGluZ3MiLCJ3aWR0aENhbGN1bGF0aW9uIiwiRmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zIiwiSFRNTDUiLCJDc3NEZWZhdWx0cyIsImlzUGFydE9mTGluZUl0ZW0iLCJ0b29sdGlwIiwicmVsYXRlZFByb3BlcnR5TmFtZSIsImRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uIiwiY3JlYXRlUHJvcGVydHlBbm5vdGF0ZWRUZXh0T25seSIsIl9nZXRQcm9wZXJ0eU5hbWVzIiwibWF0Y2hlZFByb3BlcnRpZXMiLCJBcnJheSIsImlzQXJyYXkiLCJyZXNvbHZlUGF0aCIsImlzUmVxdWlyZWRGaWVsZEdyb3VwIiwiZmllbGRHcm91cCIsImlzRGF0YUZpZWxkIiwiaXNTdGF0aWNhbGx5TWFuZGF0b3J5IiwiaXNBbm5vdGF0ZWRSZXF1aXJlZFByb3BlcnR5IiwiaXNSZXF1aXJlZERhdGFGaWVsZEZvckFubm90YXRpb24iLCJkYXRhRmllbGRGb3JBbm5vdGF0aW9uIiwiRGF0YUZpZWxkRm9yQW5ub3RhdGlvbkZpZWxkQ29udHJvbE5vdE1hbmRhdG9yeSIsImhhc0ZpZWxkQ29udHJvbE5vdE1hbmRhdG9yeSIsImhhc0ZpZWxkR3JvdXBUYXJnZXQiLCJoYXNEYXRhUG9pbnRUYXJnZXQiLCJWaXN1YWxpemF0aW9uIiwiaXNSZXF1aXJlZERhdGFQb2ludCIsImlzUmVxdWlyZWRQcm9wZXJ0eSIsImlzUmF0aW5nVmlzdWFsaXphdGlvbkZyb21EYXRhRmllbGREZWZhdWx0IiwiZGF0YVBvaW50IiwiZ2V0VGVtcGxhdGVUeXBlIiwiVGVtcGxhdGVUeXBlIiwiTGlzdFJlcG9ydCIsIkFuYWx5dGljYWxMaXN0UGFnZSIsIklzRWRpdGFibGUiLCJpc0RhdGFGaWVsZEZvckFubm90YXRpb24iLCJfYXBwZW5kQ3VzdG9tVGVtcGxhdGUiLCJleHBvcnRQcm9wZXJ0aWVzIiwiam9pbiIsImludGVybmFsQ29sdW1ucyIsImlzQ29sdW1uT3ZlcnJpZGUiLCJpc1Nsb3RDb2x1bW4iLCJtYW5pZmVzdENvbHVtbiIsIlNsb3QiLCJpc0N1c3RvbUNvbHVtbiIsIl91cGRhdGVMaW5rZWRQcm9wZXJ0aWVzT25DdXN0b21Db2x1bW5zIiwiYW5ub3RhdGlvblRhYmxlQ29sdW1ucyIsInJlcGxhY2UiLCJpc1BhcnRPZkN1c3RvbUNvbHVtbiIsInZhbGlkYXRlS2V5IiwiYmFzZVRhYmxlQ29sdW1uIiwicG9zaXRpb24iLCJhbmNob3IiLCJwbGFjZW1lbnQiLCJQbGFjZW1lbnQiLCJBZnRlciIsInByb3BlcnRpZXNUb092ZXJ3cml0ZUFubm90YXRpb25Db2x1bW4iLCJnZXRDdXN0b21FeHBvcnRTZXR0aW5ncyIsInRvb2x0aXBUZXh0IiwiZmV0Y2hUZXh0RnJvbU1ldGFNb2RlbCIsImhlYWRlclRleHQiLCJoZWFkZXIiLCJjdXN0b21Db2x1bW5FeHBvcnRTZXR0aW5ncyIsImJhc2VNYW5pZmVzdENvbHVtbiIsIkhvcml6b250YWxBbGlnbiIsIkJlZ2luIiwiaWQiLCJjdXN0b21UYWJsZUNvbHVtbiIsIkRlZmF1bHQiLCJtZXNzYWdlIiwiZ2V0RGlhZ25vc3RpY3MiLCJhZGRJc3N1ZSIsIklzc3VlQ2F0ZWdvcnkiLCJNYW5pZmVzdCIsIklzc3VlU2V2ZXJpdHkiLCJMb3ciLCJJc3N1ZUNhdGVnb3J5VHlwZSIsIkFubm90YXRpb25Db2x1bW5zIiwiSW52YWxpZEtleSIsImNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yIiwic2l0dWF0aW9uc0luZGljYXRvckNvbHVtbiIsInByb3BlcnR5S2V5IiwiaXNTaXR1YXRpb25zSW5kaWNhdG9yIiwiQ29tcHV0ZWQiLCJjbGlwYm9hcmRTZXR0aW5ncyIsImluZGV4T2ZGaXJzdFZpc2libGVDb2x1bW4iLCJmaW5kSW5kZXgiLCJzcGxpY2UiLCJjb2x1bW5zV2l0aERyYWZ0SW5kaWNhdG9yIiwiaXNEcmFmdE5vZGUiLCJpc0RyYWZ0Um9vdCIsImNvbHVtbldpdGhEcmFmdEluZGljYXRvciIsImRyYWZ0SW5kaWNhdG9yQ29sdW1uIiwiaXNEcmFmdEluZGljYXRvciIsImNvbHVtbkluZGV4VG9JbnNlcnRBZnRlciIsImdldENvbnRleHRQcm9wZXJ0eVJlc3RyaWN0aW9uIiwiY2FwYWJpbGl0aWVzIiwiSW5zZXJ0UmVzdHJpY3Rpb25zIiwiUmVxdWlyZWRQcm9wZXJ0aWVzIiwiaXNDdXJyZW5jeSIsImV4cG9ydERhdGFUeXBlIiwibmF2UHJvcGVydHkiLCJsaW5lSXRlbSIsImlzUHJvcGVydHlOYXZpZ2F0ZWQiLCJpbmhlcmVkUHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwiaXNJbmhlcmVkUHJvcGVydHlOYXZpZ2F0ZWQiLCJ0YXJnZXRNYXBwaW5nIiwiaXNUeXBlRGVmaW5pdGlvbiIsIkVETV9UWVBFX01BUFBJTkciLCJ1bmRlcmx5aW5nVHlwZSIsInNldFVwQ29uc3RyYWludHMiLCJwYXJzZUFzU3RyaW5nIiwiZW1wdHlTdHJpbmciLCJudWxsYWJsZSIsInBhcnNlS2VlcHNFbXB0eVN0cmluZyIsInJlbGF0ZWRBbm5vdGF0aW9uQ29sdW1ucyIsImV4aXN0aW5nQ29sdW1uIiwiY29sdW1uS2V5IiwiY29sdW1uRnJvbUFubm90YXRpb25zIiwiZW5hYmxlV3JhcHBpbmciLCJjdXN0b21FeHBvcnRTZXR0aW5ncyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQ29sdW1ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEVudGl0eVR5cGUsIE5hdmlnYXRpb25Qcm9wZXJ0eSwgUHJvcGVydHksIFByb3BlcnR5UGF0aCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBGaWx0ZXJGdW5jdGlvbnMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NhcGFiaWxpdGllc1wiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXRBbm5vdGF0aW9uc19DYXBhYmlsaXRpZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NhcGFiaWxpdGllc19FZG1cIjtcbmltcG9ydCB0eXBlIHsgU2VtYW50aWNLZXkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW1vblwiO1xuaW1wb3J0IHsgQ29tbW9uQW5ub3RhdGlvblRlcm1zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25cIjtcbmltcG9ydCB0eXBlIHtcblx0RGF0YUZpZWxkLFxuXHREYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHREYXRhRmllbGRGb3JBbm5vdGF0aW9uLFxuXHREYXRhRmllbGRUeXBlcyxcblx0RGF0YVBvaW50LFxuXHREYXRhUG9pbnRUeXBlVHlwZXMsXG5cdEZpZWxkR3JvdXAsXG5cdExpbmVJdGVtXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB7IFVJQW5ub3RhdGlvblRlcm1zLCBVSUFubm90YXRpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB0eXBlIHsgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLCBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHtcblx0RURNX1RZUEVfTUFQUElORyxcblx0YW5kLFxuXHRjb21waWxlRXhwcmVzc2lvbixcblx0Y29uc3RhbnQsXG5cdGVxdWFsLFxuXHRmb3JtYXRSZXN1bHQsXG5cdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbixcblx0aWZFbHNlLFxuXHRub3QsXG5cdG9yLFxuXHRwYXRoSW5Nb2RlbCxcblx0c2V0VXBDb25zdHJhaW50c1xufSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB0eXBlIENvbnZlcnRlckNvbnRleHQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUge1xuXHRBdmFpbGFiaWxpdHlUeXBlLFxuXHRDdXN0b21EZWZpbmVkVGFibGVDb2x1bW4sXG5cdEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbkZvck92ZXJyaWRlLFxuXHRGb3JtYXRPcHRpb25zVHlwZSxcblx0VGFibGVDb2x1bW5TZXR0aW5ncyxcblx0VGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgQ3JlYXRpb25Nb2RlLCBIb3Jpem9udGFsQWxpZ24sIEltcG9ydGFuY2UsIFRlbXBsYXRlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB0eXBlIHsgUGFnZUNvbnRleHRQYXRoVGFyZ2V0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgQ29tcGxleFByb3BlcnR5SW5mbyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2Fubm90YXRpb25zL0RhdGFGaWVsZFwiO1xuaW1wb3J0IHtcblx0Y29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseSxcblx0Z2V0RGF0YUZpZWxkRGF0YVR5cGUsXG5cdGdldFNlbWFudGljT2JqZWN0UGF0aCxcblx0Z2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludCxcblx0aGFzRGF0YVBvaW50VGFyZ2V0LFxuXHRoYXNGaWVsZEdyb3VwVGFyZ2V0LFxuXHRpc0RhdGFGaWVsZCxcblx0aXNEYXRhRmllbGRGb3JBbm5vdGF0aW9uLFxuXHRpc0RhdGFGaWVsZFR5cGVzLFxuXHRpc0RhdGFQb2ludEZyb21EYXRhRmllbGREZWZhdWx0LFxuXHRpc1JhdGluZ1Zpc3VhbGl6YXRpb25Gcm9tRGF0YUZpZWxkRGVmYXVsdFxufSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9hbm5vdGF0aW9ucy9EYXRhRmllbGRcIjtcbmltcG9ydCB7IHR5cGUgVGFibGVUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL1RhYmxlXCI7XG5pbXBvcnQgeyBBZ2dyZWdhdGlvbkhlbHBlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQWdncmVnYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhYmxlT2JqZWN0LCBDdXN0b21FbGVtZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7IE92ZXJyaWRlVHlwZSwgUGxhY2VtZW50LCBpbnNlcnRDdXN0b21FbGVtZW50cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgeyBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvRGF0YUZpZWxkSGVscGVyXCI7XG5pbXBvcnQgeyBJc3N1ZUNhdGVnb3J5LCBJc3N1ZUNhdGVnb3J5VHlwZSwgSXNzdWVTZXZlcml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvSXNzdWVNYW5hZ2VyXCI7XG5pbXBvcnQgeyBLZXlIZWxwZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0tleVwiO1xuaW1wb3J0IHsgVUkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB7IHJlcGxhY2VTcGVjaWFsQ2hhcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TdGFibGVJZEhlbHBlclwiO1xuaW1wb3J0ICogYXMgVHlwZUd1YXJkcyBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQge1xuXHRpc0Fubm90YXRpb25PZlR5cGUsXG5cdGlzTmF2aWdhdGlvblByb3BlcnR5LFxuXHRpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0aXNQcm9wZXJ0eSxcblx0aXNUeXBlRGVmaW5pdGlvblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQge1xuXHRlbmhhbmNlRGF0YU1vZGVsUGF0aCxcblx0Z2V0Q29udGV4dFByb3BlcnR5UmVzdHJpY3Rpb24sXG5cdGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgsXG5cdGdldFRhcmdldE9iamVjdFBhdGgsXG5cdHR5cGUgRGF0YU1vZGVsT2JqZWN0UGF0aFxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBnZXREaXNwbGF5TW9kZSwgdHlwZSBEaXNwbGF5TW9kZSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0Rpc3BsYXlNb2RlRm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBnZXRSZXN0cmljdGlvbnNPblByb3BlcnRpZXMsIHR5cGUgUmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRW50aXR5U2V0SGVscGVyXCI7XG5pbXBvcnQgeyBoYXNGaWVsZENvbnRyb2xOb3RNYW5kYXRvcnksIGlzU3RhdGljYWxseU1hbmRhdG9yeSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0ZpZWxkQ29udHJvbEhlbHBlclwiO1xuaW1wb3J0IHtcblx0Z2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5UGF0aCxcblx0Z2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgsXG5cdGdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5UGF0aCxcblx0Z2V0U3RhdGljVGltZXpvbmUsXG5cdGdldFN0YXRpY1VuaXRPckN1cnJlbmN5LFxuXHRpc1RpbWV6b25lXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgeyBpc011bHRpVmFsdWVGaWVsZCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1VJRm9ybWF0dGVyc1wiO1xuaW1wb3J0IHR5cGUgeyBEZWZhdWx0VHlwZUZvckVkbVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdHlwZS9FRE1cIjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVzdHJpY3RlZC1pbXBvcnRzXG5pbXBvcnQgdGFibGVGb3JtYXR0ZXJzIGZyb20gXCJzYXAvZmUvbWFjcm9zL2Zvcm1hdHRlcnMvVGFibGVGb3JtYXR0ZXJcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIHsgTURDVGFibGVQcm9wZXJ0eUluZm8gYXMgUHJvcGVydHlJbmZvLCBWaXN1YWxTZXR0aW5ncyB9IGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBTaW1wbGVUeXBlIGZyb20gXCJzYXAvdWkvbW9kZWwvU2ltcGxlVHlwZVwiO1xuXG4vLyBDdXN0b20gQ29sdW1uIGZyb20gTWFuaWZlc3RcbnR5cGUgTWFuaWZlc3REZWZpbmVkQ3VzdG9tQ29sdW1uID0gQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uICYge1xuXHR0eXBlPzogQ29sdW1uVHlwZS5EZWZhdWx0O1xufTtcblxuLy8gU2xvdCBDb2x1bW4gZnJvbSBCdWlsZGluZyBCbG9ja1xudHlwZSBGcmFnbWVudERlZmluZWRTbG90Q29sdW1uID0gQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uICYge1xuXHR0eXBlOiBDb2x1bW5UeXBlLlNsb3Q7XG59O1xuLy8gUHJvcGVydGllcyBhbGwgQ29sdW1uVHlwZXMgaGF2ZTpcbnR5cGUgQmFzZVRhYmxlQ29sdW1uID0gQ29uZmlndXJhYmxlT2JqZWN0ICYge1xuXHR0eXBlOiBDb2x1bW5UeXBlOyAvL09yaWdpbiBvZiB0aGUgc291cmNlIHdoZXJlIHdlIGFyZSBnZXR0aW5nIHRoZSB0ZW1wbGF0ZWQgaW5mb3JtYXRpb24gZnJvbVxuXHR3aWR0aD86IHN0cmluZztcblx0d2lkdGhJbmNsdWRpbmdDb2x1bW5IZWFkZXI/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+LFxuXHR0YWJsZUNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG5cdHRhYmxlQ29sdW1uOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5cbik6IHZvaWQge1xuXHRjb25zdCBkaXNwbGF5TW9kZSA9IGdldERpc3BsYXlNb2RlKHByb3BlcnR5KSxcblx0XHR0ZXh0UHJvcGVydHlQYXRoID0gZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgocHJvcGVydHkpO1xuXHRpZiAodGV4dFByb3BlcnR5UGF0aCAmJiBkaXNwbGF5TW9kZSAhPT0gXCJWYWx1ZVwiKSB7XG5cdFx0Y29uc3QgdGV4dFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFByb3BlcnR5Pihwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsIHRleHRQcm9wZXJ0eVBhdGgpO1xuXHRcdGNvbnN0IHRleHRSZWxhdGl2ZVBhdGggPSBnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoKHRleHRQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRcdGlmICh0ZXh0UmVsYXRpdmVQYXRoKSB7XG5cdFx0XHRjb25zdCB0ZXh0Q29sdW1uID0gZmluZENvbHVtbkJ5UGF0aCh0ZXh0UmVsYXRpdmVQYXRoLCB0YWJsZUNvbHVtbnMpO1xuXHRcdFx0aWYgKHRleHRDb2x1bW4gJiYgdGV4dENvbHVtbi5uYW1lICE9PSB0YWJsZUNvbHVtbi5uYW1lKSB7XG5cdFx0XHRcdHRhYmxlQ29sdW1uLnRleHRBcnJhbmdlbWVudCA9IHtcblx0XHRcdFx0XHR0ZXh0UHJvcGVydHk6IHRleHRDb2x1bW4ubmFtZSxcblx0XHRcdFx0XHRtb2RlOiBkaXNwbGF5TW9kZVxuXHRcdFx0XHR9O1xuXHRcdFx0XHQvLyBJZiB0ZXh0IHByb3BlcnRpZXMgYXJlIHVzZWQgYnV0IGhpZGRlbiwgd2UgbXVzdCBpbmNsdWRlIHRoZW0gdG8gdGhlIGV4cG9ydCBhcyB0aGVyZSBhcmUgdXNlZCBpbiB0aGUgcGFzdGVcblx0XHRcdFx0aWYgKCF0ZXh0Q29sdW1uLmV4cG9ydFNldHRpbmdzKSB7XG5cdFx0XHRcdFx0dGV4dENvbHVtbi5leHBvcnRTZXR0aW5ncyA9IHsgdHlwZTogXCJTdHJpbmdcIiB9O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGNvbHVtbnMgZnJvbSB0aGUgZW50aXR5VHlwZS5cbiAqIEBwYXJhbSBjb2x1bW5zVG9CZUNyZWF0ZWQgVGhlIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB0YXJnZXQgZW50aXR5IHR5cGUuXG4gKiBAcGFyYW0gYW5ub3RhdGlvbkNvbHVtbnMgVGhlIGFycmF5IG9mIGNvbHVtbnMgY3JlYXRlZCBiYXNlZCBvbiBMaW5lSXRlbSBhbm5vdGF0aW9ucy5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGhlIHRhYmxlIHR5cGUuXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHRhYmxlLlxuICogQHBhcmFtIGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAgVGhlIG1hcCBvZiBwcm9wZXJ0aWVzIHJlZmVyZW5jZWQgYXMgZGVzY3JpcHRpb24gb24gYSB0ZXh0IGFycmFuZ2VtZW50IGFubm90YXRpb24uXG4gKiBAcGFyYW0gcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIFRoZSBleGlzdGluZyByZXN0cmljdGlvbnMgb24gcHJvcGVydGllc1xuICogQHJldHVybnMgVGhlIGNvbHVtbiBmcm9tIHRoZSBlbnRpdHlUeXBlXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb2x1bW5zRnJvbUVudGl0eVR5cGUgPSBmdW5jdGlvbiAoXG5cdGNvbHVtbnNUb0JlQ3JlYXRlZDogUmVjb3JkPHN0cmluZywgUHJvcGVydHk+LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdHRhYmxlQ3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUsXG5cdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXA6IFJlY29yZDxzdHJpbmcsIERpc3BsYXlNb2RlPixcblx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzPzogUmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzXG4pOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSB7XG5cdGlmIChhbm5vdGF0aW9uQ29sdW1ucyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0YW5ub3RhdGlvbkNvbHVtbnMgPSBbXTtcblx0fVxuXG5cdGxldCBwcm9wZXJ0aWVzTm90VG9CZUNvbnNpZGVyZWQ6IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBncm91cGFibGVQcm9wZXJ0aWVzID0gYWdncmVnYXRpb25IZWxwZXIuZ2V0R3JvdXBhYmxlUHJvcGVydGllcygpO1xuXHQvL0ZvciBBbmFseXRpY2FsIHRhYmxlLCB3ZSBleGNsdWRlIGFsbCBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5vdCBncm91cGFibGUgYW5kIHVzZWQgYXMgVGV4dCBpbiBhIGdyb3VwYWJsZSBQcm9wZXJ0eS5cblx0aWYgKHRhYmxlVHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIiAmJiBhZ2dyZWdhdGlvbkhlbHBlci5pc0FuYWx5dGljc1N1cHBvcnRlZCgpICYmIGdyb3VwYWJsZVByb3BlcnRpZXMpIHtcblx0XHRwcm9wZXJ0aWVzTm90VG9CZUNvbnNpZGVyZWQgPSBncm91cGFibGVQcm9wZXJ0aWVzXG5cdFx0XHQubWFwKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkuJHRhcmdldClcblx0XHRcdC5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0ICE9PSB1bmRlZmluZWQpXG5cdFx0XHQubWFwKCh0YXJnZXQpID0+IGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHkodGFyZ2V0IGFzIFByb3BlcnR5KSlcblx0XHRcdC5maWx0ZXIoKHRleHRQcm9wKSA9PiB0ZXh0UHJvcCAmJiAhYWdncmVnYXRpb25IZWxwZXIuaXNQcm9wZXJ0eUdyb3VwYWJsZSh0ZXh0UHJvcCkpXG5cdFx0XHQubWFwKChwcm9wKSA9PiBwcm9wPy5uYW1lKVxuXHRcdFx0LmZpbHRlcigobmFtZSkgPT4gbmFtZSAhPT0gdW5kZWZpbmVkKSBhcyBzdHJpbmdbXTtcblx0fVxuXHRlbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHk6IFByb3BlcnR5KSA9PiB7XG5cdFx0Ly8gQ2F0Y2ggYWxyZWFkeSBleGlzdGluZyBjb2x1bW5zIC0gd2hpY2ggd2VyZSBhZGRlZCBiZWZvcmUgYnkgTGluZUl0ZW0gQW5ub3RhdGlvbnNcblx0XHRjb25zdCBleGlzdHMgPSBhbm5vdGF0aW9uQ29sdW1ucy5zb21lKChjb2x1bW4pID0+IHtcblx0XHRcdHJldHVybiBjb2x1bW4ubmFtZSA9PT0gcHJvcGVydHkubmFtZTtcblx0XHR9KTtcblx0XHQvLyBpZiB0YXJnZXQgdHlwZSBleGlzdHMsIGl0IGlzIGEgY29tcGxleCBwcm9wZXJ0eSBhbmQgc2hvdWxkIGJlIGlnbm9yZWRcblx0XHRpZiAoIXByb3BlcnR5LnRhcmdldFR5cGUgJiYgIWV4aXN0cyAmJiAhcHJvcGVydGllc05vdFRvQmVDb25zaWRlcmVkLmluY2x1ZGVzKHByb3BlcnR5Lm5hbWUpKSB7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm8gPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMoXG5cdFx0XHRcdHByb3BlcnR5Lm5hbWUsXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHR0YWJsZVR5cGVcblx0XHRcdCk7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBhZGRpdGlvbmFsUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXMpO1xuXHRcdFx0Ly8gSW5jbHVkZSB0aGUgdGV4dCBwcm9wZXJ0aWVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHRleHQgYXJyYW5nZW1lbnRcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmZvckVhY2goKG5hbWUpID0+IHtcblx0XHRcdFx0YWRkUHJvcGVydHlUb0Rpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAoZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCwgcmVsYXRlZFByb3BlcnRpZXNJbmZvLCBuYW1lKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRjb25zdCBjb2x1bW5JbmZvID0gZ2V0Q29sdW1uRGVmaW5pdGlvbkZyb21Qcm9wZXJ0eShcblx0XHRcdFx0cHJvcGVydHksXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChwcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRwcm9wZXJ0eS5uYW1lLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCxcblx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHRcdFx0XHR0YWJsZUNyZWF0aW9uTW9kZSxcblx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXNJbmZvXG5cdFx0XHQpO1xuXHRcdFx0aWYgKHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Y29sdW1uSW5mby5wcm9wZXJ0eUluZm9zID0gcmVsYXRlZFByb3BlcnR5TmFtZXM7XG5cdFx0XHRcdGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3MuZGF0YVBvaW50VGFyZ2V0VmFsdWUpIHtcblx0XHRcdFx0XHRjb2x1bW5JbmZvLmV4cG9ydERhdGFQb2ludFRhcmdldFZhbHVlID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFNldHRpbmdzLmRhdGFQb2ludFRhcmdldFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIENvbGxlY3QgaW5mb3JtYXRpb24gb2YgcmVsYXRlZCBjb2x1bW5zIHRvIGJlIGNyZWF0ZWQuXG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmZvckVhY2goKG5hbWUpID0+IHtcblx0XHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbbmFtZV0gPSByZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1tuYW1lXS5hbm5vdGF0aW9uUHJvcGVydHk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Y29sdW1uSW5mby5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcyA9IGFkZGl0aW9uYWxQcm9wZXJ0eU5hbWVzO1xuXHRcdFx0XHQvLyBDcmVhdGUgY29sdW1ucyBmb3IgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgZm9yIEFMUCB1c2UgY2FzZS5cblx0XHRcdFx0YWRkaXRpb25hbFByb3BlcnR5TmFtZXMuZm9yRWFjaCgoYWRkaXRpb25hbFByb3BlcnR5TmFtZSkgPT4ge1xuXHRcdFx0XHRcdC8vIEludGVudGlvbmFsIG92ZXJ3cml0ZSBhcyB3ZSByZXF1aXJlIG9ubHkgb25lIG5ldyBQcm9wZXJ0eUluZm8gZm9yIGEgcmVsYXRlZCBQcm9wZXJ0eS5cblx0XHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbYWRkaXRpb25hbFByb3BlcnR5TmFtZV0gPSByZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXNbYWRkaXRpb25hbFByb3BlcnR5TmFtZV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMucHVzaChjb2x1bW5JbmZvKTtcblx0XHR9XG5cdFx0Ly8gSW4gY2FzZSBhIHByb3BlcnR5IGhhcyBkZWZpbmVkIGEgI1RleHRPbmx5IHRleHQgYXJyYW5nZW1lbnQgdGhhdCBwb2ludHMgdG8gYSB0ZXh0IHByb3BlcnR5IChhbmQgbm90IGEgJ2hhcmQgY29kZWQgdGV4dCcpIGRvbid0IG9ubHkgY3JlYXRlIHRoZSBjb21wbGV4IHByb3BlcnR5IHdpdGggdGhlIHRleHQgcHJvcGVydHkgYXMgYSBjaGlsZCBwcm9wZXJ0eSxcblx0XHQvLyBidXQgYWxzbyB0aGUgcHJvcGVydHkgaXRzZWxmIGFzIGl0IGNhbiBiZSB1c2VkIGFzIHdpdGhpbiB0aGUgc29ydENvbmRpdGlvbnMgb3Igb24gY3VzdG9tIGNvbHVtbnMuXG5cdFx0Ly8gVGhpcyBzdGVwIG11c3QgYmUgdmFsaWQgYWxzbyBmcm9tIHRoZSBjb2x1bW5zIGFkZGVkIHZpYSBMaW5lSXRlbXMgb3IgZnJvbSBhIGNvbHVtbiBhdmFpbGFibGUgb24gdGhlIHAxM24uXG5cdFx0aWYgKGdldERpc3BsYXlNb2RlKHByb3BlcnR5KSA9PT0gXCJEZXNjcmlwdGlvblwiKSB7XG5cdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM/Lm5vblNvcnRhYmxlUHJvcGVydGllcy5wdXNoKHByb3BlcnR5Lm5hbWUpO1xuXHRcdFx0aWYgKGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UZXh0KSkge1xuXHRcdFx0XHRhbm5vdGF0aW9uQ29sdW1ucy5wdXNoKFxuXHRcdFx0XHRcdGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eSxcblx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChwcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRcdFx0cHJvcGVydHkubmFtZSxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHRhZ2dyZWdhdGlvbkhlbHBlcixcblx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdFx0XHRcdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0dGFibGVDcmVhdGlvbk1vZGVcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0Ly8gQ3JlYXRlIGEgcHJvcGVydHlJbmZvIGZvciBlYWNoIHJlbGF0ZWQgcHJvcGVydHkuXG5cdGNvbnN0IHJlbGF0ZWRDb2x1bW5zID0gX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zKFxuXHRcdGNvbHVtbnNUb0JlQ3JlYXRlZCxcblx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdGVudGl0eVR5cGUsXG5cdFx0ZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcCxcblx0XHR0YWJsZUNyZWF0aW9uTW9kZSxcblx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXNcblx0KTtcblx0cmV0dXJuIGFubm90YXRpb25Db2x1bW5zLmNvbmNhdChyZWxhdGVkQ29sdW1ucyk7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIGNvbHVtbiBkZWZpbml0aW9uIGZyb20gYSBwcm9wZXJ0eS5cbiAqIEBwYXJhbSBwcm9wZXJ0eSBFbnRpdHkgdHlwZSBwcm9wZXJ0eSBmb3Igd2hpY2ggdGhlIGNvbHVtbiBpcyBjcmVhdGVkXG4gKiBAcGFyYW0gZnVsbFByb3BlcnR5UGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSB0YXJnZXQgcHJvcGVydHlcbiAqIEBwYXJhbSByZWxhdGl2ZVBhdGggVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHRhcmdldCBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgY29udGV4dFxuICogQHBhcmFtIHVzZURhdGFGaWVsZFByZWZpeCBTaG91bGQgYmUgcHJlZml4ZWQgd2l0aCBcIkRhdGFGaWVsZDo6XCIsIGVsc2UgaXQgd2lsbCBiZSBwcmVmaXhlZCB3aXRoIFwiUHJvcGVydHk6OlwiXG4gKiBAcGFyYW0gYXZhaWxhYmxlRm9yQWRhcHRhdGlvbiBEZWNpZGVzIHdoZXRoZXIgdGhlIGNvbHVtbiBzaG91bGQgYmUgYXZhaWxhYmxlIGZvciBhZGFwdGF0aW9uXG4gKiBAcGFyYW0gYWdncmVnYXRpb25IZWxwZXIgVGhlIGFnZ3JlZ2F0aW9uSGVscGVyIGZvciB0aGUgZW50aXR5XG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwIFRoZSBtYXAgb2YgcHJvcGVydGllcyByZWZlcmVuY2VkIGFzIGRlc2NyaXB0aW9uIG9uIGEgdGV4dCBhcnJhbmdlbWVudCBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIFRoZSBleGlzdGluZyByZXN0cmljdGlvbnMgb24gcHJvcGVydGllc1xuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB0YWJsZVxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyBUaGUgcHJvcGVydGllcyBpZGVudGlmaWVkIHNvIGZhciBmb3IgdGhlIGNvbHVtblxuICogQHBhcmFtIHJlbGF0aXZlUGF0aEZvck11bHRpVmFsdWUgVGhlIE1EQyBwYXRoIHVzZWQgZm9yIHRoZSAxOm4gcHJvcGVydHkgdG8gYWxsb3cgZmlsdGVyaW5nIGZyb20gTURDXG4gKiBAcmV0dXJucyBUaGUgYW5ub3RhdGlvbiBjb2x1bW4gZGVmaW5pdGlvblxuICovXG5jb25zdCBnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5ID0gZnVuY3Rpb24gKFxuXHRwcm9wZXJ0eTogUHJvcGVydHksXG5cdGZ1bGxQcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmcsXG5cdHVzZURhdGFGaWVsZFByZWZpeDogYm9vbGVhbixcblx0YXZhaWxhYmxlRm9yQWRhcHRhdGlvbjogYm9vbGVhbixcblx0YWdncmVnYXRpb25IZWxwZXI6IEFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXA6IFJlY29yZDxzdHJpbmcsIERpc3BsYXlNb2RlPixcblx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzPzogUmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLFxuXHR0YWJsZUNyZWF0aW9uTW9kZT86IENyZWF0aW9uTW9kZSxcblx0cmVsYXRlZFByb3BlcnRpZXNJbmZvPzogQ29tcGxleFByb3BlcnR5SW5mbyxcblx0cmVsYXRpdmVQYXRoRm9yTXVsdGlWYWx1ZT86IHN0cmluZ1xuKTogQW5ub3RhdGlvblRhYmxlQ29sdW1uIHtcblx0Y29uc3Qgc2VtYW50aWNPYmplY3RBbm5vdGF0aW9uUGF0aCA9IGdldFNlbWFudGljT2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LCBwcm9wZXJ0eSk7XG5cdGNvbnN0IGlzSGlkZGVuID0gaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4ocHJvcGVydHkpO1xuXHRjb25zdCBncm91cFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHByb3BlcnR5Lm5hbWUgPyBfc2xpY2VBdFNsYXNoKHByb3BlcnR5Lm5hbWUsIHRydWUsIGZhbHNlKSA6IHVuZGVmaW5lZDtcblx0Y29uc3QgaXNHcm91cDogYm9vbGVhbiA9IGdyb3VwUGF0aCAhPSBwcm9wZXJ0eS5uYW1lO1xuXHRjb25zdCBsYWJlbCA9IGdldExhYmVsKHByb3BlcnR5LCBpc0dyb3VwKTtcblx0Y29uc3QgZGF0YVR5cGUgPSBnZXREYXRhRmllbGREYXRhVHlwZShwcm9wZXJ0eSk7XG5cdGNvbnN0IHByb3BlcnR5VHlwZUNvbmZpZyA9IGdldFR5cGVDb25maWcocHJvcGVydHksIGRhdGFUeXBlKTtcblx0Y29uc3QgaXNBUHJvcGVydHlGcm9tVGV4dE9ubHlBbm5vdGF0aW9uID0gZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcFtyZWxhdGl2ZVBhdGhdID09PSBcIkRlc2NyaXB0aW9uXCI7XG5cdGNvbnN0IHNvcnRhYmxlID1cblx0XHQoIWlzSGlkZGVuIHx8IGlzQVByb3BlcnR5RnJvbVRleHRPbmx5QW5ub3RhdGlvbikgJiYgIXJlc3RyaWN0aW9uc09uUHJvcGVydGllcz8ubm9uU29ydGFibGVQcm9wZXJ0aWVzLmluY2x1ZGVzKHJlbGF0aXZlUGF0aCk7XG5cdGNvbnN0IGZpbHRlcmFibGUgPSAhcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzPy5ub25GaWx0ZXJhYmxlUHJvcGVydGllcy5pbmNsdWRlcyhyZWxhdGl2ZVBhdGgpO1xuXHRjb25zdCB0eXBlQ29uZmlnID0ge1xuXHRcdGNsYXNzTmFtZTogcHJvcGVydHkudHlwZSB8fCBkYXRhVHlwZSxcblx0XHRmb3JtYXRPcHRpb25zOiBwcm9wZXJ0eVR5cGVDb25maWcuZm9ybWF0T3B0aW9ucyxcblx0XHRjb25zdHJhaW50czogcHJvcGVydHlUeXBlQ29uZmlnLmNvbnN0cmFpbnRzXG5cdH07XG5cdGxldCBleHBvcnRTZXR0aW5nczogUHJvcGVydHlJbmZvW1wiZXhwb3J0U2V0dGluZ3NcIl0gPSBudWxsO1xuXHRpZiAoX2lzRXhwb3J0YWJsZUNvbHVtbihwcm9wZXJ0eSkpIHtcblx0XHRleHBvcnRTZXR0aW5ncyA9IGNyZWF0ZUNvbHVtbkV4cG9ydFNldHRpbmdzKHByb3BlcnR5LCByZWxhdGVkUHJvcGVydGllc0luZm8pO1xuXHR9XG5cdGNvbnN0IGF2YWlsYWJpbGl0eSA9ICFpc0hpZGRlbiAmJiBhdmFpbGFibGVGb3JBZGFwdGF0aW9uID8gXCJBZGFwdGF0aW9uXCIgOiBcIkhpZGRlblwiO1xuXHRjb25zdCBjb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkID0gX2dldENvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscyhyZWxhdGl2ZVBhdGgsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRpZiAocmVsYXRpdmVQYXRoRm9yTXVsdGlWYWx1ZSkge1xuXHRcdHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlUGF0aEZvck11bHRpVmFsdWU7XG5cdH1cblx0Y29uc3QgbmFtZSA9IHVzZURhdGFGaWVsZFByZWZpeCA/IHJlbGF0aXZlUGF0aCA6IGBQcm9wZXJ0eTo6JHtyZWxhdGl2ZVBhdGh9YDtcblx0Y29uc3Qga2V5ID0gKHVzZURhdGFGaWVsZFByZWZpeCA/IFwiRGF0YUZpZWxkOjpcIiA6IFwiUHJvcGVydHk6OlwiKSArIHJlcGxhY2VTcGVjaWFsQ2hhcnMocmVsYXRpdmVQYXRoKTtcblxuXHRjb25zdCBjb2x1bW46IEFubm90YXRpb25UYWJsZUNvbHVtbiA9IHtcblx0XHRrZXk6IGtleSxcblx0XHR0eXBlOiBDb2x1bW5UeXBlLkFubm90YXRpb24sXG5cdFx0ZGF0YVR5cGU6IGRhdGFUeXBlID8/IHByb3BlcnR5LnR5cGUsXG5cdFx0bGFiZWw6IGxhYmVsID8/IHByb3BlcnR5Lm5hbWUsXG5cdFx0Z3JvdXBMYWJlbDogaXNHcm91cCA/IGdldExhYmVsKHByb3BlcnR5KSA6IHVuZGVmaW5lZCxcblx0XHRncm91cDogaXNHcm91cCA/IGdyb3VwUGF0aCA6IHVuZGVmaW5lZCxcblx0XHRhbm5vdGF0aW9uUGF0aDogZnVsbFByb3BlcnR5UGF0aCxcblx0XHRzZW1hbnRpY09iamVjdFBhdGg6IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGgsXG5cdFx0YXZhaWxhYmlsaXR5OiBhdmFpbGFiaWxpdHksXG5cdFx0bmFtZTogbmFtZSxcblx0XHRyZWxhdGl2ZVBhdGg6IHJlbGF0aXZlUGF0aCxcblx0XHRzb3J0YWJsZTogc29ydGFibGUsXG5cdFx0ZmlsdGVyYWJsZTogZmlsdGVyYWJsZSxcblx0XHRpc0dyb3VwYWJsZTogYWdncmVnYXRpb25IZWxwZXIuaXNBbmFseXRpY3NTdXBwb3J0ZWQoKSA/ICEhYWdncmVnYXRpb25IZWxwZXIuaXNQcm9wZXJ0eUdyb3VwYWJsZShwcm9wZXJ0eSkgOiBzb3J0YWJsZSxcblx0XHRpc0tleTogcHJvcGVydHkuaXNLZXksXG5cdFx0ZXhwb3J0U2V0dGluZ3M6IGV4cG9ydFNldHRpbmdzLFxuXHRcdGNhc2VTZW5zaXRpdmU6IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHR0eXBlQ29uZmlnOiB0eXBlQ29uZmlnIGFzIFByb3BlcnR5VHlwZUNvbmZpZyxcblx0XHRpbXBvcnRhbmNlOiBnZXRJbXBvcnRhbmNlKGNvbnZlcnRlckNvbnRleHQsIHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdCksXG5cdFx0cmVxdWlyZWQ6IGlzUmVxdWlyZWRDb2x1bW4oY29udmVydGVyQ29udGV4dCwgcHJvcGVydHksIHRhYmxlQ3JlYXRpb25Nb2RlKSxcblx0XHRhZGRpdGlvbmFsTGFiZWxzOiBjb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHNcblx0fTtcblx0X2FkZFRvb2xUaXAocHJvcGVydHksIGNvbHVtbik7XG5cdF9zZXRFeHBvcnRTZXR0aW5nc0ZvckRhdGFQb2ludChwcm9wZXJ0eSwgY29sdW1uKTtcblxuXHRpZiAoXG5cdFx0YWdncmVnYXRpb25IZWxwZXIuaXNBbmFseXRpY3NTdXBwb3J0ZWQoKSAmJlxuXHRcdE1vZGVsSGVscGVyLmlzT2JqZWN0UGF0aERyYWZ0U3VwcG9ydGVkKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpKSAmJlxuXHRcdChyZWxhdGl2ZVBhdGggPT09IFwiSGFzQWN0aXZlRW50aXR5XCIgfHwgcmVsYXRpdmVQYXRoID09PSBcIkhhc0RyYWZ0RW50aXR5XCIgfHwgcmVsYXRpdmVQYXRoID09PSBcIklzQWN0aXZlRW50aXR5XCIpXG5cdCkge1xuXHRcdC8vIEluIGNhc2Ugb2YgYW5hbHl0aWNhbCB0YWJsZSBvbiBhIGRyYWZ0LWVuYWJsZWQgZW50aXR5LCB3ZSBhbHdheXMgY29uc2lkZXIgdGhlIEhhc0RyYWZ0RW50aXR5LCBIYXNBY3RpdmVFbnRpdHkgYW5kIElzQWN0aXZlRW50aXR5IHByb3BlcnRpZXMgYXNcblx0XHQvLyB0ZWNobmljYWxseSBncm91cGFibGUsIGFzIHdlIG5lZWQgdG8gbG9hZCB0aGVtIGZvciBvdXIgaW50ZXJuYWwgbG9naWMuXG5cdFx0Y29sdW1uLmV4dGVuc2lvbiA9IHtcblx0XHRcdHRlY2huaWNhbGx5QWdncmVnYXRhYmxlOiBmYWxzZSxcblx0XHRcdHRlY2huaWNhbGx5R3JvdXBhYmxlOiB0cnVlXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gY29sdW1uO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgdGhlIGV4cG9ydCBzZXR0aW5ncyBmb3IgYSBnaXZlbiBjb2x1bW4uXG4gKiBAcGFyYW0gY29sdW1uIFRoZSBnaXZlbiBjb2x1bW4gZnJvbSBhIGxpbmUgaXRlbSBhcyBhIGRhdGEgZmllbGQgb3IgYSBwcm9wZXJ0eSBmcm9tIHRoZSBlbnRpdHkgdHlwZVxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGxpbmtlZCB0byB0aGUgY29sdW1uIChuYW1lZCBhbHNvIGNvbXBsZXggcHJvcGVydHkpXG4gKiBAcmV0dXJucyBUaGUgZXhwb3J0IHNldHRpbmdzIGluIGEgdGhlIGdpdmVuIGNvbHVtblxuICovXG5jb25zdCBjcmVhdGVDb2x1bW5FeHBvcnRTZXR0aW5ncyA9IGZ1bmN0aW9uIChcblx0Y29sdW1uOiBQcm9wZXJ0eSB8IERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz86IENvbXBsZXhQcm9wZXJ0eUluZm9cbik6IENvbHVtbkV4cG9ydFNldHRpbmdzIHtcblx0bGV0IHVuaXRQcm9wZXJ0eSwgdGltZXpvbmVQcm9wZXJ0eSwgdW5pdFRleHQsIHRpbWV6b25lVGV4dCwgdXRjLCBpc0FUaW1lem9uZSwgY3VycmVuY3lQcm9wZXJ0eSwgc2NhbGU7XG5cdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVzID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvID8gT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXMpIDogW107XG5cdGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8gJiYgcmVsYXRlZFByb3BlcnR5TmFtZXM/Lmxlbmd0aCA9PT0gMSkge1xuXHRcdC8vIENyZWF0ZSB0aGUgZXhwb3J0IHNldHRpbmdzIG9mIGEgY29sdW1uIGJhc2VkIG9uIHRoZSByZWxhdGVkIChjaGlsZCkgcHJvcGVydHkgaW4gY2FzZSB0aGVyZSBpcyBvbmx5IG9uZS5cblx0XHQvLyBUaGlzIGlzIHJlcXVpcmVkIHdoZW4gd2UgaGF2ZSBhIHRleHQgb25seSBhbm5vdGF0aW9uIHRvIGNvbXB1dGUgdGhlIGV4cG9ydCBzZXR0aW5ncyBmcm9tIHRoZSB0ZXh0IGluc3RlYWQgb2YgdGhlIHZhbHVlXG5cdFx0Y29sdW1uID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbcmVsYXRlZFByb3BlcnR5TmFtZXNbMF1dLmFubm90YXRpb25Qcm9wZXJ0eTtcblx0fVxuXHRjb25zdCBkYXRhVHlwZSA9IGdldERhdGFGaWVsZERhdGFUeXBlKGNvbHVtbik7XG5cdGlmIChpc1Byb3BlcnR5KGNvbHVtbikpIHtcblx0XHR1bml0UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KGNvbHVtbik7XG5cdFx0Y3VycmVuY3lQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5KGNvbHVtbik7XG5cdFx0dGltZXpvbmVQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5KGNvbHVtbik7XG5cdFx0dW5pdFRleHQgPSBnZXRTdGF0aWNVbml0T3JDdXJyZW5jeShjb2x1bW4pO1xuXHRcdHRpbWV6b25lVGV4dCA9IGdldFN0YXRpY1RpbWV6b25lKGNvbHVtbik7XG5cdFx0aXNBVGltZXpvbmUgPSBpc1RpbWV6b25lKGNvbHVtbik7XG5cdFx0c2NhbGUgPSBjb2x1bW4uc2NhbGU7XG5cdH1cblx0dW5pdFByb3BlcnR5ID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncz8udW5pdFByb3BlcnR5ID8/IHVuaXRQcm9wZXJ0eT8ubmFtZSA/PyBjdXJyZW5jeVByb3BlcnR5Py5uYW1lO1xuXHR0aW1lem9uZVByb3BlcnR5ID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncz8udGltZXpvbmVQcm9wZXJ0eSA/PyB0aW1lem9uZVByb3BlcnR5Py5uYW1lO1xuXHRzY2FsZSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3M/LnNjYWxlID8/IHNjYWxlO1xuXHRjb25zdCBleHBvcnRUeXBlID0gZ2V0RXhwb3J0RGF0YVR5cGUoZGF0YVR5cGUsIGlzQVRpbWV6b25lLCAhIWN1cnJlbmN5UHJvcGVydHksIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3MpO1xuXHRpZiAodGltZXpvbmVQcm9wZXJ0eSB8fCAoZXhwb3J0VHlwZSA9PT0gXCJEYXRlVGltZVwiICYmICF0aW1lem9uZVRleHQpKSB7XG5cdFx0dXRjID0gZmFsc2U7XG5cdH1cblx0Y29uc3QgZXhwb3J0U2V0dGluZ3M6IENvbHVtbkV4cG9ydFNldHRpbmdzID0ge1xuXHRcdHR5cGU6IGV4cG9ydFR5cGUsXG5cdFx0aW5wdXRGb3JtYXQ6IGdldERhdGVJbnB1dEZvcm1hdChkYXRhVHlwZSksXG5cdFx0ZGVsaW1pdGVyOiBnZXREZWxpbWl0ZXIoZGF0YVR5cGUpLFxuXHRcdHNjYWxlOiBzY2FsZSxcblx0XHR1bml0UHJvcGVydHk6IHVuaXRQcm9wZXJ0eSxcblx0XHR1bml0OiByZWxhdGVkUHJvcGVydGllc0luZm8/LmV4cG9ydFNldHRpbmdzLnVuaXQgPz8gdW5pdFRleHQsXG5cdFx0dGltZXpvbmVQcm9wZXJ0eTogdGltZXpvbmVQcm9wZXJ0eSxcblx0XHR0aW1lem9uZTogcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncy50aW1lem9uZSA/PyB0aW1lem9uZVRleHQ/LnRvU3RyaW5nKCksXG5cdFx0dGVtcGxhdGU6IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbz8uZXhwb3J0U2V0dGluZ3MudGVtcGxhdGUsXG5cdFx0Ly9vbmx5IGluIGNhc2Ugb2YgY29tcGxleCBwcm9wZXJ0aWVzLCB3cmFwIHRoZSBjZWxsIGNvbnRlbnRcdG9uIHRoZSBleGNlbCBleHBvcnRlZCBmaWxlXG5cdFx0d3JhcDogcmVsYXRlZFByb3BlcnRpZXNJbmZvPy5leHBvcnRTZXR0aW5ncy53cmFwLFxuXHRcdHV0YzogdXRjXG5cdH07XG5cdGlmIChleHBvcnRTZXR0aW5ncy51bml0UHJvcGVydHkgfHwgZXhwb3J0U2V0dGluZ3MudW5pdCkge1xuXHRcdGV4cG9ydFNldHRpbmdzLmF1dG9TY2FsZSA9IHRydWU7XG5cdH1cblx0cmV0dXJuIHJlbW92ZVVuZGVmaW5lZEZyb21FeHBvcnRTZXR0aW5ncyhleHBvcnRTZXR0aW5ncyk7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIGV4cG9ydCBmb3JtYXQgdGVtcGxhdGUgZm9yIGNvbHVtbnMgd2l0aCBkYXRlcy5cbiAqIEBwYXJhbSBkYXRhVHlwZSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBjb2x1bW5cbiAqIEByZXR1cm5zIFRoZSBpbnB1dEZvcm1hdFxuICovXG5jb25zdCBnZXREYXRlSW5wdXRGb3JtYXQgPSBmdW5jdGlvbiAoZGF0YVR5cGU/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRyZXR1cm4gZGF0YVR5cGUgPT09IFwiRWRtLkRhdGVcIiA/IFwiWVlZWS1NTS1ERFwiIDogdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBkZWxpbWl0ZXIgaW4gbnVtZXJpYyBjb2x1bW5zLlxuICogVGhlIGRlbGltaXRlciBpcyB1c2VkIHRvIGRpc3BsYXkgdGhvdXNhbmRzIHNlcGFyYXRvciBpbiBudW1lcmljIGNvbHVtbnMuXG4gKiBAcGFyYW0gZGF0YVR5cGUgVGhlIGRhdGEgdHlwZSBvZiB0aGUgY29sdW1uXG4gKiBAcmV0dXJucyBUcnVlIHRvIGRpc3BsYXkgdGhvdXNhbmRzIHNlcGFyYXRvciBpbiBudW1lcmljIGNvbHVtbnNcbiAqL1xuY29uc3QgZ2V0RGVsaW1pdGVyID0gZnVuY3Rpb24gKGRhdGFUeXBlPzogc3RyaW5nKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG5cdHJldHVybiBkYXRhVHlwZSA9PT0gXCJFZG0uSW50NjRcIiA/IHRydWUgOiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgdW5kZWZpbmVkIHZhbHVlcyBmcm9tIHRoZSBleHBvcnQgc2V0dGluZ3Mgb2JqZWN0IG9mIGEgY29sdW1uLlxuICogQHBhcmFtIGV4cG9ydFNldHRpbmdzIFRoZSBleHBvcnQgc2V0dGluZ3MgY29uZmlndXJhdGlvbnMgZm9yIGEgY29sdW1uXG4gKiBAcmV0dXJucyBUaGUgZXhwb3J0IHNldHRpbmdzIGNvbmZpZ3VyYXRpb25zIHdpdGhvdXQgdW5kZWZpbmVkIHZhbHVlc1xuICovXG5jb25zdCByZW1vdmVVbmRlZmluZWRGcm9tRXhwb3J0U2V0dGluZ3MgPSBmdW5jdGlvbiAoZXhwb3J0U2V0dGluZ3M6IENvbHVtbkV4cG9ydFNldHRpbmdzKTogQ29sdW1uRXhwb3J0U2V0dGluZ3Mge1xuXHQvL1JlbW92ZSB1bmRlZmluZWQgc2V0dGluZ3MgZnJvbSBleHBvcnRTZXR0aW5nIG9iamVjdFxuXHRmb3IgKGNvbnN0IHNldHRpbmcgaW4gZXhwb3J0U2V0dGluZ3MpIHtcblx0XHRpZiAoZXhwb3J0U2V0dGluZ3Nbc2V0dGluZyBhcyBrZXlvZiBDb2x1bW5FeHBvcnRTZXR0aW5nc10gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ZGVsZXRlIGV4cG9ydFNldHRpbmdzW3NldHRpbmcgYXMga2V5b2YgQ29sdW1uRXhwb3J0U2V0dGluZ3NdO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZXhwb3J0U2V0dGluZ3M7XG59O1xuXG4vKipcbiAqIFJldHVybnMgQm9vbGVhbiB0cnVlIGZvciBleHBvcnRhYmxlIGNvbHVtbnMsIGZhbHNlIGZvciBub24gZXhwb3J0YWJsZSBjb2x1bW5zLlxuICogQHBhcmFtIHNvdXJjZSBUaGUgZGF0YUZpZWxkIG9yIHByb3BlcnR5IHRvIGJlIGV2YWx1YXRlZFxuICogQHJldHVybnMgVHJ1ZSBmb3IgZXhwb3J0YWJsZSBjb2x1bW4sIGZhbHNlIGZvciBub24gZXhwb3J0YWJsZSBjb2x1bW5cbiAqL1xuZnVuY3Rpb24gX2lzRXhwb3J0YWJsZUNvbHVtbihzb3VyY2U6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBQcm9wZXJ0eSk6IGJvb2xlYW4ge1xuXHRsZXQgcHJvcGVydHlUeXBlLCBwcm9wZXJ0eTtcblx0Y29uc3QgZGF0YUZpZWxkRGVmYXVsdFByb3BlcnR5ID0gKHNvdXJjZSBhcyBQcm9wZXJ0eSkuYW5ub3RhdGlvbnMuVUk/LkRhdGFGaWVsZERlZmF1bHQ7XG5cdGlmIChpc1Byb3BlcnR5KHNvdXJjZSkpIHtcblx0XHRpZiAoaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4oc291cmNlKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRwcm9wZXJ0eVR5cGUgPSBkYXRhRmllbGREZWZhdWx0UHJvcGVydHk/LiRUeXBlO1xuXHR9IGVsc2UgaWYgKGlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuKHNvdXJjZSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0gZWxzZSB7XG5cdFx0cHJvcGVydHkgPSBzb3VyY2U7XG5cdFx0cHJvcGVydHlUeXBlID0gcHJvcGVydHkuJFR5cGU7XG5cdFx0aWYgKHByb3BlcnR5VHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiAmJiAocHJvcGVydHkgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSkge1xuXHRcdFx0Ly9Gb3IgQ2hhcnRcblx0XHRcdHByb3BlcnR5VHlwZSA9IChwcm9wZXJ0eSBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKS5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlO1xuXHRcdFx0cmV0dXJuIHByb3BlcnR5VHlwZSAhPT0gdW5kZWZpbmVkICYmICFVSUFubm90YXRpb25UeXBlcy5DaGFydERlZmluaXRpb25UeXBlLmluY2x1ZGVzKHByb3BlcnR5VHlwZSk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdChwcm9wZXJ0eSBhcyBEYXRhRmllbGQpLlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29yZT8uTWVkaWFUeXBlPy50ZXJtID09PSBcIk9yZy5PRGF0YS5Db3JlLlYxLk1lZGlhVHlwZVwiICYmXG5cdFx0XHQocHJvcGVydHkgYXMgRGF0YUZpZWxkKS5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvcmU/LmlzVVJMICE9PSB0cnVlXG5cdFx0KSB7XG5cdFx0XHQvL0ZvciBTdHJlYW1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHByb3BlcnR5VHlwZVxuXHRcdD8gIVtcblx0XHRcdFx0VUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uLFxuXHRcdFx0XHRVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24sXG5cdFx0XHRcdFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbkdyb3VwXG5cdFx0ICBdLmluY2x1ZGVzKHByb3BlcnR5VHlwZSlcblx0XHQ6IHRydWU7XG59XG5cbi8qKlxuICogUmV0dXJucyBCb29sZWFuIHRydWUgZm9yIHZhbGlkIGNvbHVtbnMsIGZhbHNlIGZvciBpbnZhbGlkIGNvbHVtbnMuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERpZmZlcmVudCBEYXRhRmllbGQgdHlwZXMgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEByZXR1cm5zIFRydWUgZm9yIHZhbGlkIGNvbHVtbnMsIGZhbHNlIGZvciBpbnZhbGlkIGNvbHVtbnNcbiAqL1xuY29uc3QgX2lzVmFsaWRDb2x1bW4gPSBmdW5jdGlvbiAoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogYm9vbGVhbiB7XG5cdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRyZXR1cm4gISFkYXRhRmllbGQuSW5saW5lO1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHQvLyBUb2RvOiBSZXBsYWNlIHdpdGggcHJvcGVyIExvZyBzdGF0ZW1lbnQgb25jZSBhdmFpbGFibGVcblx0XHRcdC8vICB0aHJvdyBuZXcgRXJyb3IoXCJVbmhhbmRsZWQgRGF0YUZpZWxkIEFic3RyYWN0IHR5cGU6IFwiICsgZGF0YUZpZWxkLiRUeXBlKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUgdGhlIHZpc2liaWxpdHkgb2YgYSBEYXRhRmllbGQgb3IgRGF0YVBvaW50IGFubm90YXRpb24uXG4gKlxuICogU0FQIEZpb3JpIGVsZW1lbnRzIHdpbGwgZXZhbHVhdGUgZWl0aGVyIHRoZSBVSS5IaWRkZW4gYW5ub3RhdGlvbiBkZWZpbmVkIG9uIHRoZSBhbm5vdGF0aW9uIGl0c2VsZiBvciBvbiB0aGUgdGFyZ2V0IHByb3BlcnR5LlxuICogQHBhcmFtIGRhdGFGaWVsZE1vZGVsUGF0aCBUaGUgbWV0YXBhdGggcmVmZXJyaW5nIHRvIHRoZSBhbm5vdGF0aW9uIHRoYXQgaXMgZXZhbHVhdGVkIGJ5IFNBUCBGaW9yaSBlbGVtZW50cy5cbiAqIEByZXR1cm5zIEFuIGV4cHJlc3Npb24gdGhhdCB5b3UgY2FuIGJpbmQgdG8gdGhlIFVJLlxuICovXG5jb25zdCBfZ2V0VmlzaWJsZUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoXG5cdGRhdGFGaWVsZE1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgRGF0YVBvaW50VHlwZVR5cGVzPlxuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgdGFyZ2V0T2JqZWN0ID0gZGF0YUZpZWxkTW9kZWxQYXRoLnRhcmdldE9iamVjdDtcblx0bGV0IHByb3BlcnR5VmFsdWU7XG5cdGlmICh0YXJnZXRPYmplY3QpIHtcblx0XHRzd2l0Y2ggKHRhcmdldE9iamVjdC4kVHlwZSkge1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZTpcblx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IHRhcmdldE9iamVjdC5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRcdFx0Ly8gaWYgaXQgaXMgYSBEYXRhRmllbGRGb3JBbm5vdGF0aW9uIHBvaW50aW5nIHRvIGEgRGF0YVBvaW50IHdlIGxvb2sgYXQgdGhlIGRhdGFQb2ludCdzIHZhbHVlXG5cdFx0XHRcdGlmICh0YXJnZXRPYmplY3Q/LlRhcmdldD8uJHRhcmdldD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGUpIHtcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdGFyZ2V0T2JqZWN0LlRhcmdldC4kdGFyZ2V0Py5WYWx1ZS4kdGFyZ2V0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjpcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHByb3BlcnR5VmFsdWUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdGNvbnN0IGlzQW5hbHl0aWNhbEdyb3VwSGVhZGVyRXhwYW5kZWQgPSAvKmZvcm1hdE9wdGlvbnM/LmlzQW5hbHl0aWNzID8gVUkuSXNFeHBhbmRlZCA6Ki8gY29uc3RhbnQoZmFsc2UpO1xuXHRjb25zdCBpc0FuYWx5dGljYWxMZWFmID0gLypmb3JtYXRPcHRpb25zPy5pc0FuYWx5dGljcyA/IGVxdWFsKFVJLk5vZGVMZXZlbCwgMCkgOiovIGNvbnN0YW50KGZhbHNlKTtcblx0Ly8gQSBkYXRhIGZpZWxkIGlzIHZpc2libGUgaWY6XG5cdC8vIC0gdGhlIFVJLkhpZGRlbiBleHByZXNzaW9uIGluIHRoZSBvcmlnaW5hbCBhbm5vdGF0aW9uIGRvZXMgbm90IGV2YWx1YXRlIHRvICd0cnVlJ1xuXHQvLyAtIHRoZSBVSS5IaWRkZW4gZXhwcmVzc2lvbiBpbiB0aGUgdGFyZ2V0IHByb3BlcnR5IGRvZXMgbm90IGV2YWx1YXRlIHRvICd0cnVlJ1xuXHQvLyAtIGluIGNhc2Ugb2YgQW5hbHl0aWNzIGl0J3Mgbm90IHZpc2libGUgZm9yIGFuIGV4cGFuZGVkIEdyb3VwSGVhZGVyXG5cdHJldHVybiBhbmQoXG5cdFx0Li4uW1xuXHRcdFx0bm90KGVxdWFsKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbih0YXJnZXRPYmplY3Q/LmFubm90YXRpb25zPy5VST8uSGlkZGVuKSwgdHJ1ZSkpLFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHQhIXByb3BlcnR5VmFsdWUsXG5cdFx0XHRcdHByb3BlcnR5VmFsdWUgJiYgbm90KGVxdWFsKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihwcm9wZXJ0eVZhbHVlLmFubm90YXRpb25zPy5VST8uSGlkZGVuKSwgdHJ1ZSkpLFxuXHRcdFx0XHR0cnVlXG5cdFx0XHQpLFxuXHRcdFx0b3Iobm90KGlzQW5hbHl0aWNhbEdyb3VwSGVhZGVyRXhwYW5kZWQpLCBpc0FuYWx5dGljYWxMZWFmKVxuXHRcdF1cblx0KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBoaWRkZW4gYmluZGluZyBleHByZXNzaW9ucyBmb3IgYSBmaWVsZCBncm91cC5cbiAqIEBwYXJhbSBkYXRhRmllbGRHcm91cCBEYXRhRmllbGQgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEByZXR1cm5zIENvbXBpbGUgYmluZGluZyBvZiBmaWVsZCBncm91cCBleHByZXNzaW9ucy5cbiAqL1xuY29uc3QgX2dldEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyA9IGZ1bmN0aW9uIChkYXRhRmllbGRHcm91cDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zOiBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5bXSA9IFtdO1xuXHRpZiAoXG5cdFx0ZGF0YUZpZWxkR3JvdXAuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb24gJiZcblx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZVxuXHQpIHtcblx0XHRpZiAoZGF0YUZpZWxkR3JvdXA/LmFubm90YXRpb25zPy5VST8uSGlkZGVuKSB7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24obm90KGVxdWFsKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihkYXRhRmllbGRHcm91cC5hbm5vdGF0aW9ucy5VSS5IaWRkZW4pLCB0cnVlKSkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhRmllbGRHcm91cC5UYXJnZXQuJHRhcmdldC5EYXRhPy5mb3JFYWNoKChpbm5lckRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IERhdGFQb2ludFR5cGVUeXBlcykgPT4ge1xuXHRcdFx0XHRmaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMucHVzaChcblx0XHRcdFx0XHRfZ2V0VmlzaWJsZUV4cHJlc3Npb24oeyB0YXJnZXRPYmplY3Q6IGlubmVyRGF0YUZpZWxkIH0gYXMgRGF0YU1vZGVsT2JqZWN0UGF0aDxcblx0XHRcdFx0XHRcdERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXNcblx0XHRcdFx0XHQ+KVxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oaWZFbHNlKG9yKC4uLmZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyksIGNvbnN0YW50KHRydWUpLCBjb25zdGFudChmYWxzZSkpKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsYWJlbCBmb3IgdGhlIHByb3BlcnR5IGFuZCBkYXRhRmllbGQuXG4gKiBAcGFyYW0gW3Byb3BlcnR5XSBQcm9wZXJ0eSwgRGF0YUZpZWxkIG9yIE5hdmlnYXRpb24gUHJvcGVydHkgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbnNcbiAqIEBwYXJhbSBpc0dyb3VwXG4gKiBAcmV0dXJucyBMYWJlbCBvZiB0aGUgcHJvcGVydHkgb3IgRGF0YUZpZWxkXG4gKi9cbmNvbnN0IGdldExhYmVsID0gZnVuY3Rpb24gKHByb3BlcnR5OiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHkgfCBOYXZpZ2F0aW9uUHJvcGVydHksIGlzR3JvdXAgPSBmYWxzZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmICghcHJvcGVydHkpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGlmIChpc1Byb3BlcnR5KHByb3BlcnR5KSB8fCBpc05hdmlnYXRpb25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcblx0XHRjb25zdCBkYXRhRmllbGREZWZhdWx0ID0gKHByb3BlcnR5IGFzIFByb3BlcnR5KS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQ7XG5cdFx0aWYgKGRhdGFGaWVsZERlZmF1bHQgJiYgIWRhdGFGaWVsZERlZmF1bHQucXVhbGlmaWVyICYmIGRhdGFGaWVsZERlZmF1bHQuTGFiZWwpIHtcblx0XHRcdHJldHVybiBkYXRhRmllbGREZWZhdWx0LkxhYmVsPy50b1N0cmluZygpO1xuXHRcdH1cblx0XHRyZXR1cm4gcHJvcGVydHkuYW5ub3RhdGlvbnMuQ29tbW9uPy5MYWJlbD8udG9TdHJpbmcoKSA/PyBwcm9wZXJ0eS5uYW1lO1xuXHR9IGVsc2UgaWYgKGlzRGF0YUZpZWxkVHlwZXMocHJvcGVydHkpKSB7XG5cdFx0aWYgKCEhaXNHcm91cCAmJiBwcm9wZXJ0eS4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0cmV0dXJuIHByb3BlcnR5Py5MYWJlbD8udG9TdHJpbmcoKTtcblx0XHR9XG5cdFx0cmV0dXJuIChcblx0XHRcdHByb3BlcnR5Py5MYWJlbD8udG9TdHJpbmcoKSA/P1xuXHRcdFx0Y29tcGlsZUV4cHJlc3Npb24oXG5cdFx0XHRcdGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihwcm9wZXJ0eS5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uTGFiZWwsIFtdLCBwcm9wZXJ0eS5WYWx1ZT8uJHRhcmdldD8ubmFtZSlcblx0XHRcdClcblx0XHQpO1xuXHR9IGVsc2UgaWYgKHByb3BlcnR5LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdHByb3BlcnR5LkxhYmVsPy50b1N0cmluZygpID8/XG5cdFx0XHRjb21waWxlRXhwcmVzc2lvbihcblx0XHRcdFx0Z2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKChwcm9wZXJ0eS5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50KT8uVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkxhYmVsPy52YWx1ZU9mKCkpXG5cdFx0XHQpXG5cdFx0KTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gcHJvcGVydHkuTGFiZWw/LnRvU3RyaW5nKCk7XG5cdH1cbn07XG5cbmNvbnN0IF9nZXRUb29sdGlwID0gZnVuY3Rpb24gKHNvdXJjZTogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0aWYgKCFzb3VyY2UpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGlmIChpc1Byb3BlcnR5KHNvdXJjZSkgfHwgc291cmNlLmFubm90YXRpb25zPy5Db21tb24/LlF1aWNrSW5mbykge1xuXHRcdHJldHVybiBzb3VyY2UuYW5ub3RhdGlvbnM/LkNvbW1vbj8uUXVpY2tJbmZvXG5cdFx0XHQ/IGNvbXBpbGVFeHByZXNzaW9uKGdldEV4cHJlc3Npb25Gcm9tQW5ub3RhdGlvbihzb3VyY2UuYW5ub3RhdGlvbnMuQ29tbW9uLlF1aWNrSW5mbykpXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmIChpc0RhdGFGaWVsZFR5cGVzKHNvdXJjZSkpIHtcblx0XHRyZXR1cm4gc291cmNlLlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5RdWlja0luZm9cblx0XHRcdD8gY29tcGlsZUV4cHJlc3Npb24oZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uKHNvdXJjZS5WYWx1ZS4kdGFyZ2V0LmFubm90YXRpb25zLkNvbW1vbi5RdWlja0luZm8pKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoc291cmNlLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uKSB7XG5cdFx0Y29uc3QgZGF0YXBvaW50VGFyZ2V0ID0gc291cmNlLlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQ7XG5cdFx0cmV0dXJuIGRhdGFwb2ludFRhcmdldD8uVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LlF1aWNrSW5mb1xuXHRcdFx0PyBjb21waWxlRXhwcmVzc2lvbihnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24oZGF0YXBvaW50VGFyZ2V0LlZhbHVlLiR0YXJnZXQuYW5ub3RhdGlvbnMuQ29tbW9uLlF1aWNrSW5mbykpXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um93U3RhdHVzVmlzaWJpbGl0eShjb2xOYW1lOiBzdHJpbmcsIGlzU2VtYW50aWNLZXlJbkZpZWxkR3JvdXA/OiBib29sZWFuKTogQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGZvcm1hdFJlc3VsdChcblx0XHRbXG5cdFx0XHRwYXRoSW5Nb2RlbChgc2VtYW50aWNLZXlIYXNEcmFmdEluZGljYXRvcmAsIFwiaW50ZXJuYWxcIiksXG5cdFx0XHRwYXRoSW5Nb2RlbChgZmlsdGVyZWRNZXNzYWdlc2AsIFwiaW50ZXJuYWxcIiksXG5cdFx0XHRjb2xOYW1lLFxuXHRcdFx0aXNTZW1hbnRpY0tleUluRmllbGRHcm91cFxuXHRcdF0sXG5cdFx0dGFibGVGb3JtYXR0ZXJzLmdldEVycm9yU3RhdHVzVGV4dFZpc2liaWxpdHlGb3JtYXR0ZXJcblx0KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJvcGVydHlJbmZvIGZvciBlYWNoIGlkZW50aWZpZWQgcHJvcGVydHkgY29uc3VtZWQgYnkgYSBMaW5lSXRlbS5cbiAqIEBwYXJhbSBjb2x1bW5zVG9CZUNyZWF0ZWQgSWRlbnRpZmllZCBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIGV4aXN0aW5nQ29sdW1ucyBUaGUgbGlzdCBvZiBjb2x1bW5zIGNyZWF0ZWQgZm9yIExpbmVJdGVtcyBhbmQgUHJvcGVydGllcyBvZiBlbnRpdHlUeXBlLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGVudGl0eSB0eXBlIGZvciB0aGUgTGluZUl0ZW1cbiAqIEBwYXJhbSBkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwIFRoZSBtYXAgb2YgcHJvcGVydGllcyByZWZlcmVuY2VkIGFzIHRleHQgb24gYSB0ZXh0IGFycmFuZ2VtZW50IGFubm90YXRpb24uXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHRhYmxlXG4gKiBAcGFyYW0gcmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIFRoZSBleGlzdGluZyByZXN0cmljdGlvbnMgb24gcHJvcGVydGllc1xuICogQHJldHVybnMgVGhlIGFycmF5IG9mIGNvbHVtbnMgY3JlYXRlZC5cbiAqL1xuY29uc3QgX2NyZWF0ZVJlbGF0ZWRDb2x1bW5zID0gZnVuY3Rpb24gKFxuXHRjb2x1bW5zVG9CZUNyZWF0ZWQ6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5Pixcblx0ZXhpc3RpbmdDb2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwOiBSZWNvcmQ8c3RyaW5nLCBEaXNwbGF5TW9kZT4sXG5cdHRhYmxlQ3JlYXRpb25Nb2RlPzogQ3JlYXRpb25Nb2RlLFxuXHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXM/OiBSZXN0cmljdGlvbnNPblByb3BlcnRpZXNcbik6IEFubm90YXRpb25UYWJsZUNvbHVtbltdIHtcblx0Y29uc3QgcmVsYXRlZENvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdID0gW107XG5cdGNvbnN0IHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0Y29uc3QgYWdncmVnYXRpb25IZWxwZXIgPSBuZXcgQWdncmVnYXRpb25IZWxwZXIoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cdE9iamVjdC5rZXlzKGNvbHVtbnNUb0JlQ3JlYXRlZCkuZm9yRWFjaCgobmFtZSkgPT4ge1xuXHRcdGNvbnN0IHByb3BlcnR5ID0gY29sdW1uc1RvQmVDcmVhdGVkW25hbWVdLFxuXHRcdFx0YW5ub3RhdGlvblBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFic29sdXRlQW5ub3RhdGlvblBhdGgobmFtZSksXG5cdFx0XHQvLyBDaGVjayB3aGV0aGVyIHRoZSByZWxhdGVkIGNvbHVtbiBhbHJlYWR5IGV4aXN0cy5cblx0XHRcdHJlbGF0ZWRDb2x1bW4gPSBleGlzdGluZ0NvbHVtbnMuZmluZCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA9PT0gbmFtZSk7XG5cdFx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcihjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCkpLmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0XHRjb25zdCBwcm9wZXJ0eU9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KGRhdGFNb2RlbE9iamVjdFBhdGgsIG5hbWUpO1xuXHRcdGlmIChpc011bHRpVmFsdWVGaWVsZChwcm9wZXJ0eU9iamVjdFBhdGgpKSB7XG5cdFx0XHRjb25zdCBuZXdOYW1lUmVsYXRpdmVUYXJnZXRQYXRoID0gZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aChwcm9wZXJ0eU9iamVjdFBhdGgsIGZhbHNlLCB0cnVlKTtcblx0XHRcdGNvbnN0IGNvbHVtbiA9IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRhbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0bmFtZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXMsXG5cdFx0XHRcdHRhYmxlQ3JlYXRpb25Nb2RlLFxuXHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdG5ld05hbWVSZWxhdGl2ZVRhcmdldFBhdGhcblx0XHRcdCk7XG5cdFx0XHRjb21wdXRlSGlkZGVuT25SZWxhdGVkQ29sdW1ucyhleGlzdGluZ0NvbHVtbnMsIG5hbWUsIGNvbHVtbik7XG5cdFx0XHRyZWxhdGVkQ29sdW1ucy5wdXNoKGNvbHVtbik7XG5cdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lTWFwW25hbWVdID0gbmV3TmFtZVJlbGF0aXZlVGFyZ2V0UGF0aCA/PyBuYW1lO1xuXHRcdH0gZWxzZSBpZiAocmVsYXRlZENvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBDYXNlIDE6IEtleSBjb250YWlucyBEYXRhRmllbGQgcHJlZml4IHRvIGVuc3VyZSBhbGwgcHJvcGVydHkgY29sdW1ucyBoYXZlIHRoZSBzYW1lIGtleSBmb3JtYXQuXG5cdFx0XHQvLyBOZXcgY3JlYXRlZCBwcm9wZXJ0eSBjb2x1bW4gaXMgc2V0IHRvIGhpZGRlbi5cblx0XHRcdGNvbnN0IGNvbHVtbiA9IGdldENvbHVtbkRlZmluaXRpb25Gcm9tUHJvcGVydHkoXG5cdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRhbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0bmFtZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGFnZ3JlZ2F0aW9uSGVscGVyLFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXMsXG5cdFx0XHRcdHRhYmxlQ3JlYXRpb25Nb2RlXG5cdFx0XHQpO1xuXHRcdFx0Y29tcHV0ZUhpZGRlbk9uUmVsYXRlZENvbHVtbnMoZXhpc3RpbmdDb2x1bW5zLCBuYW1lLCBjb2x1bW4pO1xuXHRcdFx0cmVsYXRlZENvbHVtbnMucHVzaChjb2x1bW4pO1xuXHRcdH0gZWxzZSBpZiAocmVsYXRlZENvbHVtbi5hbm5vdGF0aW9uUGF0aCAhPT0gYW5ub3RhdGlvblBhdGggfHwgcmVsYXRlZENvbHVtbi5wcm9wZXJ0eUluZm9zKSB7XG5cdFx0XHQvLyBDYXNlIDI6IFRoZSBleGlzdGluZyBjb2x1bW4gcG9pbnRzIHRvIGEgTGluZUl0ZW0gKG9yKVxuXHRcdFx0Ly8gQ2FzZSAzOiBUaGlzIGlzIGEgc2VsZiByZWZlcmVuY2UgZnJvbSBhbiBleGlzdGluZyBjb2x1bW5cblx0XHRcdGNvbnN0IG5ld05hbWUgPSBgUHJvcGVydHk6OiR7bmFtZX1gO1xuXHRcdFx0Ly8gQ2hlY2tpbmcgd2hldGhlciB0aGUgcmVsYXRlZCBwcm9wZXJ0eSBjb2x1bW4gaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGluIGEgcHJldmlvdXMgaXRlcmF0aW9uLlxuXHRcdFx0aWYgKCFleGlzdGluZ0NvbHVtbnMuc29tZSgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA9PT0gbmV3TmFtZSkpIHtcblx0XHRcdFx0Ly8gQ3JlYXRlIGEgbmV3IHByb3BlcnR5IGNvbHVtbiB3aXRoICdQcm9wZXJ0eTo6JyBwcmVmaXgsXG5cdFx0XHRcdC8vIFNldCBpdCB0byBoaWRkZW4gYXMgaXQgaXMgb25seSBjb25zdW1lZCBieSBDb21wbGV4IHByb3BlcnR5IGluZm9zLlxuXHRcdFx0XHRjb25zdCBjb2x1bW4gPSBnZXRDb2x1bW5EZWZpbml0aW9uRnJvbVByb3BlcnR5KFxuXHRcdFx0XHRcdHByb3BlcnR5LFxuXHRcdFx0XHRcdGFubm90YXRpb25QYXRoLFxuXHRcdFx0XHRcdG5hbWUsXG5cdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0YWdncmVnYXRpb25IZWxwZXIsXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdFx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyxcblx0XHRcdFx0XHR0YWJsZUNyZWF0aW9uTW9kZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb21wdXRlSGlkZGVuT25SZWxhdGVkQ29sdW1ucyhleGlzdGluZ0NvbHVtbnMsIG5hbWUsIGNvbHVtbik7XG5cdFx0XHRcdHJlbGF0ZWRDb2x1bW5zLnB1c2goY29sdW1uKTtcblx0XHRcdFx0cmVsYXRlZFByb3BlcnR5TmFtZU1hcFtuYW1lXSA9IG5ld05hbWU7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRleGlzdGluZ0NvbHVtbnMuc29tZSgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSA9PT0gbmV3TmFtZSkgJiZcblx0XHRcdFx0ZXhpc3RpbmdDb2x1bW5zLnNvbWUoKGNvbHVtbikgPT4gY29sdW1uLnByb3BlcnR5SW5mb3M/LmluY2x1ZGVzKG5hbWUpKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXBbbmFtZV0gPSBuZXdOYW1lO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdC8vIFRoZSBwcm9wZXJ0eSAnbmFtZScgaGFzIGJlZW4gcHJlZml4ZWQgd2l0aCAnUHJvcGVydHk6OicgZm9yIHVuaXF1ZW5lc3MuXG5cdC8vIFVwZGF0ZSB0aGUgc2FtZSBpbiBvdGhlciBwcm9wZXJ0eUluZm9zW10gcmVmZXJlbmNlcyB3aGljaCBwb2ludCB0byB0aGlzIHByb3BlcnR5LlxuXHRleGlzdGluZ0NvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG5cdFx0Y29sdW1uLnByb3BlcnR5SW5mb3MgPSBjb2x1bW4ucHJvcGVydHlJbmZvcz8ubWFwKChwcm9wZXJ0eUluZm8pID0+IHJlbGF0ZWRQcm9wZXJ0eU5hbWVNYXBbcHJvcGVydHlJbmZvXSA/PyBwcm9wZXJ0eUluZm8pO1xuXHRcdGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcyA9IGNvbHVtbi5hZGRpdGlvbmFsUHJvcGVydHlJbmZvcz8ubWFwKFxuXHRcdFx0KHByb3BlcnR5SW5mbykgPT4gcmVsYXRlZFByb3BlcnR5TmFtZU1hcFtwcm9wZXJ0eUluZm9dID8/IHByb3BlcnR5SW5mb1xuXHRcdCk7XG5cdH0pO1xuXHRyZXR1cm4gcmVsYXRlZENvbHVtbnM7XG59O1xuXG4vKipcbiAqIEdldHRpbmcgdGhlIENvbHVtbiBOYW1lXG4gKiBJZiBpdCBwb2ludHMgdG8gYSBEYXRhRmllbGQgd2l0aCBvbmUgcHJvcGVydHkgb3IgRGF0YVBvaW50IHdpdGggb25lIHByb3BlcnR5LCBpdCB3aWxsIHVzZSB0aGUgcHJvcGVydHkgbmFtZVxuICogaGVyZSB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGV4aXN0aW5nIGZsZXggY2hhbmdlcy5cbiAqIEBwYXJhbSBkYXRhRmllbGQgRGlmZmVyZW50IERhdGFGaWVsZCB0eXBlcyBkZWZpbmVkIGluIHRoZSBhbm5vdGF0aW9uc1xuICogQHJldHVybnMgVGhlIG5hbWUgb2YgYW5ub3RhdGlvbiBjb2x1bW5zXG4gKi9cbmNvbnN0IF9nZXRBbm5vdGF0aW9uQ29sdW1uTmFtZSA9IGZ1bmN0aW9uIChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpOiBzdHJpbmcge1xuXHQvLyBUaGlzIGlzIG5lZWRlZCBhcyB3ZSBoYXZlIGZsZXhpYmlsaXR5IGNoYW5nZXMgYWxyZWFkeSB0aGF0IHdlIGhhdmUgdG8gY2hlY2sgYWdhaW5zdFxuXHRpZiAoaXNEYXRhRmllbGRUeXBlcyhkYXRhRmllbGQpICYmIGRhdGFGaWVsZC5WYWx1ZT8ucGF0aCkge1xuXHRcdHJldHVybiBkYXRhRmllbGQuVmFsdWU/LnBhdGg7XG5cdH0gZWxzZSBpZiAoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uICYmIChkYXRhRmllbGQuVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludCk/LlZhbHVlPy5wYXRoKSB7XG5cdFx0Ly8gVGhpcyBpcyBmb3IgcmVtb3ZpbmcgZHVwbGljYXRlIHByb3BlcnRpZXMuIEZvciBleGFtcGxlLCAnUHJvZ3Jlc3MnIFByb3BlcnR5IGlzIHJlbW92ZWQgaWYgaXQgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIGEgRGF0YVBvaW50XG5cdFx0cmV0dXJuIChkYXRhRmllbGQuVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludCk/LlZhbHVlLnBhdGg7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKTtcblx0fVxufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBkYXRhIGZpZWxkIGxhYmVscyBoYXZlIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgdGFibGUuXG4gKiBAcGFyYW0gZmllbGRHcm91cE5hbWUgVGhlIGBEYXRhRmllbGRgIG5hbWUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHZpc3VhbGl6YXRpb25QYXRoXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMgYHNob3dEYXRhRmllbGRzTGFiZWxgIHZhbHVlIGZyb20gdGhlIG1hbmlmZXN0XG4gKi9cbmNvbnN0IF9nZXRTaG93RGF0YUZpZWxkc0xhYmVsID0gZnVuY3Rpb24gKFxuXHRmaWVsZEdyb3VwTmFtZTogc3RyaW5nLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuXHRjb25zdCBjb2x1bW5zID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uPFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uPih2aXN1YWxpemF0aW9uUGF0aCk/LmNvbHVtbnM7XG5cdGNvbnN0IGNvbHVtbktleXMgPSBjb2x1bW5zICYmIE9iamVjdC5rZXlzKGNvbHVtbnMpO1xuXHRyZXR1cm4gKFxuXHRcdGNvbHVtbktleXMgJiZcblx0XHQhIWNvbHVtbktleXMuZmluZChmdW5jdGlvbiAoa2V5OiBzdHJpbmcpIHtcblx0XHRcdHJldHVybiBrZXkgPT09IGZpZWxkR3JvdXBOYW1lICYmIChjb2x1bW5zW2tleV0gYXMgQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uRm9yT3ZlcnJpZGUpLnNob3dEYXRhRmllbGRzTGFiZWw7XG5cdFx0fSlcblx0KTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcHJvcGVydHkgd2l0aCByZXNwZWN0IHRvIHRoZSByb290IGVudGl0eS5cbiAqIEBwYXJhbSBkYXRhRmllbGQgVGhlIGBEYXRhRmllbGRgIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRoXG4gKi9cbmNvbnN0IF9nZXRSZWxhdGl2ZVBhdGggPSBmdW5jdGlvbiAoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogc3RyaW5nIHtcblx0bGV0IHJlbGF0aXZlUGF0aCA9IFwiXCI7XG5cdHN3aXRjaCAoZGF0YUZpZWxkLiRUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0XHRyZWxhdGl2ZVBhdGggPSAoZGF0YUZpZWxkIGFzIERhdGFGaWVsZCk/LlZhbHVlPy5wYXRoO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uOlxuXHRcdFx0cmVsYXRpdmVQYXRoID0gZGF0YUZpZWxkPy5UYXJnZXQ/LnZhbHVlO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb25Hcm91cDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb25Hcm91cDpcblx0XHRcdHJlbGF0aXZlUGF0aCA9IEtleUhlbHBlci5nZW5lcmF0ZUtleUZyb21EYXRhRmllbGQoZGF0YUZpZWxkKTtcblx0XHRcdGJyZWFrO1xuXHR9XG5cdHJldHVybiByZWxhdGl2ZVBhdGg7XG59O1xuXG5jb25zdCBfc2xpY2VBdFNsYXNoID0gZnVuY3Rpb24gKHBhdGg6IHN0cmluZywgaXNMYXN0U2xhc2g6IGJvb2xlYW4sIGlzTGFzdFBhcnQ6IGJvb2xlYW4pOiBzdHJpbmcge1xuXHRjb25zdCBpU2xhc2hJbmRleCA9IGlzTGFzdFNsYXNoID8gcGF0aC5sYXN0SW5kZXhPZihcIi9cIikgOiBwYXRoLmluZGV4T2YoXCIvXCIpO1xuXHRpZiAoaVNsYXNoSW5kZXggPT09IC0xKSB7XG5cdFx0cmV0dXJuIHBhdGg7XG5cdH1cblx0cmV0dXJuIGlzTGFzdFBhcnQgPyBwYXRoLnN1YnN0cmluZyhpU2xhc2hJbmRleCArIDEsIHBhdGgubGVuZ3RoKSA6IHBhdGguc3Vic3RyaW5nKDAsIGlTbGFzaEluZGV4KTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgY29sdW1uIGNvbnRhaW5zIGEgbXVsdGktdmFsdWUgZmllbGQuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBEYXRhRmllbGQgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIERhdGFGaWVsZCBjb3JyZXNwb25kcyB0byBhIG11bHRpLXZhbHVlIGZpZWxkLlxuICovXG5jb25zdCBfaXNDb2x1bW5NdWx0aVZhbHVlZCA9IGZ1bmN0aW9uIChcblx0ZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IGJvb2xlYW4ge1xuXHRpZiAoaXNEYXRhRmllbGRUeXBlcyhkYXRhRmllbGQpICYmIGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKGRhdGFGaWVsZC5WYWx1ZSkpIHtcblx0XHRjb25zdCBwcm9wZXJ0eU9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KFxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCksXG5cdFx0XHRkYXRhRmllbGQuVmFsdWUucGF0aFxuXHRcdCk7XG5cdFx0cmV0dXJuIGlzTXVsdGlWYWx1ZUZpZWxkKHByb3BlcnR5T2JqZWN0UGF0aCk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIGEgY29sdW1uIGlzIHNvcnRhYmxlLlxuICogQHBhcmFtIGRhdGFGaWVsZCBUaGUgZGF0YSBmaWVsZCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSBwcm9wZXJ0eVBhdGggVGhlIHByb3BlcnR5IHBhdGhcbiAqIEBwYXJhbSBub25Tb3J0YWJsZUNvbHVtbnMgQ29sbGVjdGlvbiBvZiBub24tc29ydGFibGUgY29sdW1uIG5hbWVzIGFzIHBlciBhbm5vdGF0aW9uXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXNJbmZvIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgbGlua2VkIHRvIHRoZSBjb2x1bW5cbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGNvbHVtbiBpcyBzb3J0YWJsZVxuICovXG5jb25zdCBfaXNDb2x1bW5Tb3J0YWJsZSA9IGZ1bmN0aW9uIChcblx0ZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHRwcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0bm9uU29ydGFibGVDb2x1bW5zOiBzdHJpbmdbXSxcblx0cmVsYXRlZFByb3BlcnRpZXNJbmZvOiBDb21wbGV4UHJvcGVydHlJbmZvXG4pOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHQhbm9uU29ydGFibGVDb2x1bW5zLmluY2x1ZGVzKHByb3BlcnR5UGF0aCkgJiYgLy8gQ29sdW1uIGlzIG5vdCBtYXJrZWQgYXMgbm9uLXNvcnRhYmxlIHZpYSBhbm5vdGF0aW9uXG5cdFx0KCgoZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQgfHwgZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uKSAmJlxuXHRcdFx0T2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXMpLnNvbWUoKHByb3BOYW1lKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGlzSGlkZGVuID0gaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4ocmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbcHJvcE5hbWVdLmFubm90YXRpb25Qcm9wZXJ0eSk7XG5cdFx0XHRcdHJldHVybiAhaXNIaWRkZW4gJiYgIW5vblNvcnRhYmxlQ29sdW1ucy5pbmNsdWRlcyhwcm9wTmFtZSk7XG5cdFx0XHR9KSkgfHxcblx0XHRcdGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybCB8fFxuXHRcdFx0ZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uIHx8XG5cdFx0XHRkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb24pXG5cdCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBmaWx0ZXJpbmcgb24gdGhlIHRhYmxlIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgUmV0dXJucyAnZmFsc2UnIGlmIEZpbHRlckZ1bmN0aW9ucyBhbm5vdGF0aW9uIHN1cHBvcnRzICd0b2xvd2VyJywgZWxzZSAndHJ1ZSdcbiAqL1xuZXhwb3J0IGNvbnN0IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSA9IGZ1bmN0aW9uIChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4pOiBib29sZWFuIHtcblx0Y29uc3QgZmlsdGVyRnVuY3Rpb25zOiBGaWx0ZXJGdW5jdGlvbnMgfCB1bmRlZmluZWQgPSBfZ2V0RmlsdGVyRnVuY3Rpb25zKGNvbnZlcnRlckNvbnRleHQpO1xuXHRyZXR1cm4gTW9kZWxIZWxwZXIuaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKHVuZGVmaW5lZCwgZmlsdGVyRnVuY3Rpb25zKTtcbn07XG5cbmZ1bmN0aW9uIF9nZXRGaWx0ZXJGdW5jdGlvbnMoQ29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KTogRmlsdGVyRnVuY3Rpb25zIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgZW50aXR5U2V0ID0gQ29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXQoKTtcblx0aWYgKFR5cGVHdWFyZHMuaXNFbnRpdHlTZXQoZW50aXR5U2V0KSkge1xuXHRcdHJldHVybiAoXG5cdFx0XHRlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5GaWx0ZXJGdW5jdGlvbnMgPz9cblx0XHRcdENvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5Q29udGFpbmVyKCkuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5GaWx0ZXJGdW5jdGlvbnNcblx0XHQpO1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmV0dXJucyBkZWZhdWx0IGZvcm1hdCBvcHRpb25zIGZvciB0ZXh0IGZpZWxkcyBpbiBhIHRhYmxlLlxuICogQHBhcmFtIGZvcm1hdE9wdGlvbnNcbiAqIEByZXR1cm5zIENvbGxlY3Rpb24gb2YgZm9ybWF0IG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlc1xuICovXG5mdW5jdGlvbiBfZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZShmb3JtYXRPcHRpb25zOiBGb3JtYXRPcHRpb25zVHlwZSB8IHVuZGVmaW5lZCk6IEZvcm1hdE9wdGlvbnNUeXBlIHwgdW5kZWZpbmVkIHtcblx0cmV0dXJuIGZvcm1hdE9wdGlvbnMgPT09IHVuZGVmaW5lZFxuXHRcdD8gdW5kZWZpbmVkXG5cdFx0OiB7XG5cdFx0XHRcdHRleHRMaW5lc0VkaXQ6IDQsXG5cdFx0XHRcdC4uLmZvcm1hdE9wdGlvbnNcblx0XHQgIH07XG59XG5cbmZ1bmN0aW9uIF9maW5kU2VtYW50aWNLZXlWYWx1ZXMoc2VtYW50aWNLZXlzOiBTZW1hbnRpY0tleSwgbmFtZTogc3RyaW5nKTogeyB2YWx1ZXM6IHN0cmluZ1tdOyBzZW1hbnRpY0tleUZvdW5kOiBib29sZWFuIH0ge1xuXHRjb25zdCBhU2VtYW50aWNLZXlWYWx1ZXM6IHN0cmluZ1tdID0gW107XG5cdGxldCBiU2VtYW50aWNLZXlGb3VuZCA9IGZhbHNlO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IHNlbWFudGljS2V5cy5sZW5ndGg7IGkrKykge1xuXHRcdGFTZW1hbnRpY0tleVZhbHVlcy5wdXNoKHNlbWFudGljS2V5c1tpXS52YWx1ZSk7XG5cdFx0aWYgKHNlbWFudGljS2V5c1tpXS52YWx1ZSA9PT0gbmFtZSkge1xuXHRcdFx0YlNlbWFudGljS2V5Rm91bmQgPSB0cnVlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4ge1xuXHRcdHZhbHVlczogYVNlbWFudGljS2V5VmFsdWVzLFxuXHRcdHNlbWFudGljS2V5Rm91bmQ6IGJTZW1hbnRpY0tleUZvdW5kXG5cdH07XG59XG5cbmZ1bmN0aW9uIF9maW5kUHJvcGVydGllcyhcblx0c2VtYW50aWNLZXlWYWx1ZXM6IHN0cmluZ1tdLFxuXHRmaWVsZEdyb3VwUHJvcGVydGllczogc3RyaW5nW11cbik6IHsgc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cDogYm9vbGVhbjsgZmllbGRHcm91cFByb3BlcnR5UGF0aD86IHN0cmluZyB9IHtcblx0bGV0IHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXAgPSBmYWxzZTtcblx0bGV0IHNQcm9wZXJ0eVBhdGg7XG5cdGlmIChzZW1hbnRpY0tleVZhbHVlcyAmJiBzZW1hbnRpY0tleVZhbHVlcy5sZW5ndGggPj0gMSAmJiBmaWVsZEdyb3VwUHJvcGVydGllcyAmJiBmaWVsZEdyb3VwUHJvcGVydGllcy5sZW5ndGggPj0gMSkge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc2VtYW50aWNLZXlWYWx1ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmIChbc2VtYW50aWNLZXlWYWx1ZXNbaV1dLnNvbWUoKHRtcCkgPT4gZmllbGRHcm91cFByb3BlcnRpZXMuaW5jbHVkZXModG1wKSkpIHtcblx0XHRcdFx0c2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCA9IHRydWU7XG5cdFx0XHRcdHNQcm9wZXJ0eVBhdGggPSBzZW1hbnRpY0tleVZhbHVlc1tpXTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7XG5cdFx0c2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cDogc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCxcblx0XHRmaWVsZEdyb3VwUHJvcGVydHlQYXRoOiBzUHJvcGVydHlQYXRoXG5cdH07XG59XG5cbi8qKlxuICogRmluZCB0aGUgZmlyc3QgcHJvcGVydHkgaW4gdGhlIGZpZWxkR3JvdXAgdGhhdCBpcyBwYXJ0IG9mIHRoZSBzZW1hbnRpYyBrZXlzLlxuICogQHBhcmFtIGRhdGFGaWVsZEdyb3VwXG4gKiBAcGFyYW0gc2VtYW50aWNLZXlWYWx1ZXNcbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIGEgZmxhZyB0cnVlIGlmIGEgcHJvcGVydHkgaXMgZm91bmQgYW5kIGEgcHJvcGVydHlQYXRoLlxuICovXG5mdW5jdGlvbiBfZmluZFNlbWFudGljS2V5VmFsdWVzSW5GaWVsZEdyb3VwKFxuXHRkYXRhRmllbGRHcm91cDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IG51bGwsXG5cdHNlbWFudGljS2V5VmFsdWVzOiBzdHJpbmdbXVxuKTogeyBzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBib29sZWFuOyBwcm9wZXJ0eVBhdGg/OiBzdHJpbmcgfSB7XG5cdC8vIHRoaXMgaW5mbyBpcyB1c2VkIGluIEZpZWxkSGVscGVyI2lzRHJhZnRJbmRpY2F0b3JWaXNpYmxlSW5GaWVsZEdyb3VwIHRvIHNob3cgYSBkcmFmdCBpbmRpY2F0b3IgYXQgdGhlIGVuZCBvZiBhIGZpZWxkIGdyb3VwXG5cdGNvbnN0IGFQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRsZXQgX3Byb3BlcnRpZXNGb3VuZDogeyBzZW1hbnRpY0tleUhhc1Byb3BlcnR5SW5GaWVsZEdyb3VwOiBib29sZWFuOyBmaWVsZEdyb3VwUHJvcGVydHlQYXRoPzogc3RyaW5nIH0gPSB7XG5cdFx0c2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cDogZmFsc2UsXG5cdFx0ZmllbGRHcm91cFByb3BlcnR5UGF0aDogdW5kZWZpbmVkXG5cdH07XG5cdGlmIChcblx0XHRkYXRhRmllbGRHcm91cCAmJlxuXHRcdGRhdGFGaWVsZEdyb3VwLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uICYmXG5cdFx0ZGF0YUZpZWxkR3JvdXAuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRmllbGRHcm91cFR5cGVcblx0KSB7XG5cdFx0ZGF0YUZpZWxkR3JvdXAuVGFyZ2V0LiR0YXJnZXQuRGF0YT8uZm9yRWFjaCgoaW5uZXJEYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRcdGlmIChcblx0XHRcdFx0KGlubmVyRGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQgfHwgaW5uZXJEYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmwpICYmXG5cdFx0XHRcdGlubmVyRGF0YUZpZWxkLlZhbHVlXG5cdFx0XHQpIHtcblx0XHRcdFx0YVByb3BlcnRpZXMucHVzaChpbm5lckRhdGFGaWVsZC5WYWx1ZS5wYXRoKTtcblx0XHRcdH1cblx0XHRcdF9wcm9wZXJ0aWVzRm91bmQgPSBfZmluZFByb3BlcnRpZXMoc2VtYW50aWNLZXlWYWx1ZXMsIGFQcm9wZXJ0aWVzKTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHNlbWFudGljS2V5SGFzUHJvcGVydHlJbkZpZWxkR3JvdXA6IF9wcm9wZXJ0aWVzRm91bmQuc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCxcblx0XHRwcm9wZXJ0eVBhdGg6IF9wcm9wZXJ0aWVzRm91bmQuZmllbGRHcm91cFByb3BlcnR5UGF0aFxuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgZGVmYXVsdCBmb3JtYXQgb3B0aW9ucyB3aXRoIGRyYWZ0SW5kaWNhdG9yIGZvciBhIGNvbHVtbi5cbiAqIEBwYXJhbSBuYW1lXG4gKiBAcGFyYW0gc2VtYW50aWNLZXlzXG4gKiBAcGFyYW0gZGF0YUZpZWxkR3JvdXBcbiAqIEByZXR1cm5zIENvbGxlY3Rpb24gb2YgZm9ybWF0IG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlc1xuICovXG5mdW5jdGlvbiBnZXREZWZhdWx0RHJhZnRJbmRpY2F0b3JGb3JDb2x1bW4oXG5cdG5hbWU6IHN0cmluZyxcblx0c2VtYW50aWNLZXlzOiBTZW1hbnRpY0tleSxcblx0ZGF0YUZpZWxkR3JvdXA6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBudWxsXG4pOiBQYXJ0aWFsPHtcblx0ZmllbGRHcm91cERyYWZ0SW5kaWNhdG9yUHJvcGVydHlQYXRoOiBzdHJpbmc7XG5cdGZpZWxkR3JvdXBOYW1lOiBzdHJpbmc7XG5cdHNob3dFcnJvck9iamVjdFN0YXR1czogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb247XG5cdGhhc0RyYWZ0SW5kaWNhdG9yOiBib29sZWFuO1xufT4ge1xuXHRpZiAoIXNlbWFudGljS2V5cykge1xuXHRcdHJldHVybiB7fTtcblx0fVxuXHRjb25zdCBzZW1hbnRpY0tleSA9IF9maW5kU2VtYW50aWNLZXlWYWx1ZXMoc2VtYW50aWNLZXlzLCBuYW1lKTtcblx0Y29uc3Qgc2VtYW50aWNLZXlJbkZpZWxkR3JvdXAgPSBfZmluZFNlbWFudGljS2V5VmFsdWVzSW5GaWVsZEdyb3VwKGRhdGFGaWVsZEdyb3VwLCBzZW1hbnRpY0tleS52YWx1ZXMpO1xuXHRpZiAoc2VtYW50aWNLZXlJbkZpZWxkR3JvdXAuc2VtYW50aWNLZXlIYXNQcm9wZXJ0eUluRmllbGRHcm91cCkge1xuXHRcdC8vIFNlbWFudGljIEtleSBoYXMgYSBwcm9wZXJ0eSBpbiBhIEZpZWxkR3JvdXBcblx0XHRyZXR1cm4ge1xuXHRcdFx0Ly9UT0RPIHdlIHNob3VsZCByYXRoZXIgc3RvcmUgaGFzU2VtYW50aWNLZXlJbkZpZWxkR3JvdXBcblx0XHRcdGZpZWxkR3JvdXBEcmFmdEluZGljYXRvclByb3BlcnR5UGF0aDogc2VtYW50aWNLZXlJbkZpZWxkR3JvdXAucHJvcGVydHlQYXRoLFxuXHRcdFx0ZmllbGRHcm91cE5hbWU6IG5hbWUsXG5cdFx0XHRzaG93RXJyb3JPYmplY3RTdGF0dXM6IGNvbXBpbGVFeHByZXNzaW9uKGdldFJvd1N0YXR1c1Zpc2liaWxpdHkobmFtZSwgdHJ1ZSkpXG5cdFx0fTtcblx0fSBlbHNlIGlmIChzZW1hbnRpY0tleS5zZW1hbnRpY0tleUZvdW5kKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGhhc0RyYWZ0SW5kaWNhdG9yOiB0cnVlLFxuXHRcdFx0c2hvd0Vycm9yT2JqZWN0U3RhdHVzOiBjb21waWxlRXhwcmVzc2lvbihnZXRSb3dTdGF0dXNWaXNpYmlsaXR5KG5hbWUsIGZhbHNlKSlcblx0XHR9O1xuXHR9XG5cdHJldHVybiB7fTtcbn1cblxuZnVuY3Rpb24gX2dldEltcE51bWJlcihkYXRhRmllbGQ6IERhdGFGaWVsZFR5cGVzKTogbnVtYmVyIHtcblx0Y29uc3QgaW1wb3J0YW5jZSA9IGRhdGFGaWVsZD8uYW5ub3RhdGlvbnM/LlVJPy5JbXBvcnRhbmNlIGFzIHN0cmluZztcblx0aWYgKGltcG9ydGFuY2UgJiYgaW1wb3J0YW5jZS5pbmNsdWRlcyhcIlVJLkltcG9ydGFuY2VUeXBlL0hpZ2hcIikpIHtcblx0XHRyZXR1cm4gMztcblx0fVxuXHRpZiAoaW1wb3J0YW5jZSAmJiBpbXBvcnRhbmNlLmluY2x1ZGVzKFwiVUkuSW1wb3J0YW5jZVR5cGUvTWVkaXVtXCIpKSB7XG5cdFx0cmV0dXJuIDI7XG5cdH1cblx0aWYgKGltcG9ydGFuY2UgJiYgaW1wb3J0YW5jZS5pbmNsdWRlcyhcIlVJLkltcG9ydGFuY2VUeXBlL0xvd1wiKSkge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cdHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBfZ2V0RGF0YUZpZWxkSW1wb3J0YW5jZShkYXRhRmllbGQ6IERhdGFGaWVsZFR5cGVzKTogSW1wb3J0YW5jZSB7XG5cdGNvbnN0IGltcG9ydGFuY2UgPSBkYXRhRmllbGQ/LmFubm90YXRpb25zPy5VST8uSW1wb3J0YW5jZSBhcyBzdHJpbmc7XG5cdHJldHVybiBpbXBvcnRhbmNlID8gKGltcG9ydGFuY2Uuc3BsaXQoXCIvXCIpWzFdIGFzIEltcG9ydGFuY2UpIDogSW1wb3J0YW5jZS5Ob25lO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIGV4cG9ydCBzZXR0aW5ncyBvZiBhIGNvbHVtbiBjb250YWluaW5nIGRhdGFwb2ludHMuXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHJlZmVyZW5jZWQgb24gYSBnaXZlbiBjb2x1bW5cbiAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiB0byBiZSB1cGRhdGVkXG4gKi9cbmZ1bmN0aW9uIF9zZXRFeHBvcnRTZXR0aW5nc0ZvckRhdGFQb2ludChwcm9wZXJ0eTogUHJvcGVydHksIGNvbHVtbjogQW5ub3RhdGlvblRhYmxlQ29sdW1uKTogdm9pZCB7XG5cdGNvbnN0IHRhcmdldFZhbHVlZnJvbURQID0gZ2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludChwcm9wZXJ0eSk7XG5cdGlmIChcblx0XHRpc0RhdGFQb2ludEZyb21EYXRhRmllbGREZWZhdWx0KHByb3BlcnR5KSAmJlxuXHRcdHR5cGVvZiB0YXJnZXRWYWx1ZWZyb21EUCA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdGNvbHVtbi5leHBvcnRTZXR0aW5ncyAmJlxuXHRcdGNvbHVtbi5leHBvcnRTZXR0aW5ncz8udW5pdCAhPT0gXCIlXCJcblx0KSB7XG5cdFx0Y29sdW1uLmV4cG9ydERhdGFQb2ludFRhcmdldFZhbHVlID0gdGFyZ2V0VmFsdWVmcm9tRFA7XG5cdFx0Y29sdW1uLmV4cG9ydFNldHRpbmdzLnRlbXBsYXRlID0gXCJ7MH0vXCIgKyB0YXJnZXRWYWx1ZWZyb21EUDtcblx0fVxufVxuXG5mdW5jdGlvbiBfZ2V0TWF4SW1wb3J0YW5jZShmaWVsZHM6IERhdGFGaWVsZFR5cGVzW10pOiBJbXBvcnRhbmNlIHtcblx0aWYgKGZpZWxkcyAmJiBmaWVsZHMubGVuZ3RoID4gMCkge1xuXHRcdGxldCBtYXhJbXBOdW1iZXIgPSAtMTtcblx0XHRsZXQgaW1wTnVtYmVyID0gLTE7XG5cdFx0bGV0IERhdGFGaWVsZFdpdGhNYXhJbXBvcnRhbmNlO1xuXHRcdGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG5cdFx0XHRpbXBOdW1iZXIgPSBfZ2V0SW1wTnVtYmVyKGZpZWxkKTtcblx0XHRcdGlmIChpbXBOdW1iZXIgPiBtYXhJbXBOdW1iZXIpIHtcblx0XHRcdFx0bWF4SW1wTnVtYmVyID0gaW1wTnVtYmVyO1xuXHRcdFx0XHREYXRhRmllbGRXaXRoTWF4SW1wb3J0YW5jZSA9IGZpZWxkO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gX2dldERhdGFGaWVsZEltcG9ydGFuY2UoRGF0YUZpZWxkV2l0aE1heEltcG9ydGFuY2UgYXMgRGF0YUZpZWxkVHlwZXMpO1xuXHR9XG5cdHJldHVybiBJbXBvcnRhbmNlLk5vbmU7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW1wb3J0YW5jZSB2YWx1ZSBmb3IgYSBjb2x1bW4uXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIGRhdGFGaWVsZFxuICogQHJldHVybnMgVGhlIGltcG9ydGFuY2UgdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEltcG9ydGFuY2UoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgdW5kZWZpbmVkXG4pOiBJbXBvcnRhbmNlIHwgdW5kZWZpbmVkIHtcblx0aWYgKCFkYXRhRmllbGQpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGNvbnN0IHNlbWFudGljS2V5cyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnMuQ29tbW9uPy5TZW1hbnRpY0tleSA/PyBbXTtcblx0Y29uc3QgcmVxdWlyZWRQcm9wZXJ0aWVzID0gZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBoaWdoS2V5cyA9IFsuLi5zZW1hbnRpY0tleXMsIC4uLnJlcXVpcmVkUHJvcGVydGllc10ubWFwKChwcm9wZXJ0eVBhdGgpID0+IHByb3BlcnR5UGF0aC4kdGFyZ2V0Py5mdWxseVF1YWxpZmllZE5hbWUpO1xuXHQvL0V2YWx1YXRlIGRlZmF1bHQgSW1wb3J0YW5jZSBpcyBub3Qgc2V0IGV4cGxpY2l0bHlcblx0bGV0IGZpZWxkc1dpdGhJbXBvcnRhbmNlO1xuXHRpZiAoaXNBbm5vdGF0aW9uT2ZUeXBlPERhdGFGaWVsZEZvckFubm90YXRpb24+KGRhdGFGaWVsZCwgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikpIHtcblx0XHRjb25zdCBkYXRhRmllbGRUYXJnZXQgPSBkYXRhRmllbGQuVGFyZ2V0LiR0YXJnZXQ7XG5cdFx0aWYgKGlzQW5ub3RhdGlvbk9mVHlwZTxGaWVsZEdyb3VwPihkYXRhRmllbGRUYXJnZXQsIFVJQW5ub3RhdGlvblR5cGVzLkZpZWxkR3JvdXBUeXBlKSkge1xuXHRcdFx0Y29uc3QgZmllbGRHcm91cERhdGEgPSBkYXRhRmllbGRUYXJnZXQuRGF0YTtcblx0XHRcdC8vSWYgYSBGaWVsZEdyb3VwIGNvbnRhaW5zIGEgc2VtYW50aWNLZXkgb3IgcmVxdWlyZWQgcHJvcGVydHksIGltcG9ydGFuY2Ugc2V0IHRvIEhpZ2hcblx0XHRcdGlmIChcblx0XHRcdFx0ZmllbGRHcm91cERhdGEuc29tZShmdW5jdGlvbiAoZmllbGRHcm91cERhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IGJvb2xlYW4ge1xuXHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRpc0RhdGFGaWVsZFR5cGVzKGZpZWxkR3JvdXBEYXRhRmllbGQpICYmIGhpZ2hLZXlzLmluY2x1ZGVzKGZpZWxkR3JvdXBEYXRhRmllbGQuVmFsdWU/LiR0YXJnZXQ/LmZ1bGx5UXVhbGlmaWVkTmFtZSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiBJbXBvcnRhbmNlLkhpZ2g7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvL0lmIHRoZSBEYXRhRmllbGRGb3JBbm5vdGF0aW9uIGhhcyBhbiBJbXBvcnRhbmNlIHdlIHRha2UgaXRcblx0XHRcdFx0aWYgKGRhdGFGaWVsZD8uYW5ub3RhdGlvbnM/LlVJPy5JbXBvcnRhbmNlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIF9nZXREYXRhRmllbGRJbXBvcnRhbmNlKGRhdGFGaWVsZCBhcyB1bmtub3duIGFzIERhdGFGaWVsZFR5cGVzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBlbHNlIHRoZSBoaWdoZXN0IGltcG9ydGFuY2UgKGlmIGFueSkgaXMgcmV0dXJuZWRcblx0XHRcdFx0ZmllbGRzV2l0aEltcG9ydGFuY2UgPSBmaWVsZEdyb3VwRGF0YS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcblx0XHRcdFx0XHRyZXR1cm4gaXRlbT8uYW5ub3RhdGlvbnM/LlVJPy5JbXBvcnRhbmNlO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIF9nZXRNYXhJbXBvcnRhbmNlKGZpZWxkc1dpdGhJbXBvcnRhbmNlIGFzIERhdGFGaWVsZFR5cGVzW10pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gaGlnaEtleXMuaW5jbHVkZXMoKGRhdGFGaWVsZCBhcyBEYXRhRmllbGRUeXBlcykuVmFsdWU/LiR0YXJnZXQ/LmZ1bGx5UXVhbGlmaWVkTmFtZSlcblx0XHQ/IEltcG9ydGFuY2UuSGlnaFxuXHRcdDogX2dldERhdGFGaWVsZEltcG9ydGFuY2UoZGF0YUZpZWxkIGFzIHVua25vd24gYXMgRGF0YUZpZWxkVHlwZXMpO1xufVxuXG4vKipcbiAqIFJldHVybnMgbGluZSBpdGVtcyBmcm9tIG1ldGFkYXRhIGFubm90YXRpb25zLlxuICogQHBhcmFtIGxpbmVJdGVtQW5ub3RhdGlvbiBDb2xsZWN0aW9uIG9mIGRhdGEgZmllbGRzIHdpdGggdGhlaXIgYW5ub3RhdGlvbnNcbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGhlIHRhYmxlIHR5cGVcbiAqIEBwYXJhbSB2aXN1YWxpemF0aW9uUGF0aCBUaGUgdmlzdWFsaXphdGlvbiBwYXRoXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBjb2x1bW5zIGZyb20gdGhlIGFubm90YXRpb25zXG4gKi9cbmNvbnN0IGdldENvbHVtbnNGcm9tQW5ub3RhdGlvbnMgPSBmdW5jdGlvbiAoXG5cdGxpbmVJdGVtQW5ub3RhdGlvbjogTGluZUl0ZW0sXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHR2aXN1YWxpemF0aW9uUGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IEFubm90YXRpb25UYWJsZUNvbHVtbltdIHtcblx0Y29uc3QgZW50aXR5VHlwZTogRW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUobGluZUl0ZW1Bbm5vdGF0aW9uKSxcblx0XHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10gPSBbXSxcblx0XHRjb2x1bW5zVG9CZUNyZWF0ZWQ6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5PiA9IHt9LFxuXHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXA6IFJlY29yZDxzdHJpbmcsIERpc3BsYXlNb2RlPiA9IHt9LFxuXHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyA9IGdldFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHR0YWJsZU1hbmlmZXN0U2V0dGluZ3M6IFRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uKHZpc3VhbGl6YXRpb25QYXRoKSxcblx0XHRkZWZhdWx0Q3JlYXRpb25Nb2RlID1cblx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuZ2V0U2FwRmVNYW5pZmVzdENvbmZpZ3VyYXRpb24oKT8ubWFjcm9zPy50YWJsZT8uZGVmYXVsdENyZWF0aW9uTW9kZSA9PT1cblx0XHRcdFwiSW5saW5lQ3JlYXRpb25Sb3dzXCJcblx0XHRcdFx0PyBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzXG5cdFx0XHRcdDogdW5kZWZpbmVkLFxuXHRcdHRhYmxlQ3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUgPVxuXHRcdFx0dGFibGVNYW5pZmVzdFNldHRpbmdzPy50YWJsZVNldHRpbmdzPy5jcmVhdGlvbk1vZGU/Lm5hbWUgPz8gZGVmYXVsdENyZWF0aW9uTW9kZSA/PyBDcmVhdGlvbk1vZGUuSW5saW5lO1xuXHRjb25zdCBzZW1hbnRpY0tleXM6IFNlbWFudGljS2V5ID0gY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uc0J5VGVybShcIkNvbW1vblwiLCBDb21tb25Bbm5vdGF0aW9uVGVybXMuU2VtYW50aWNLZXksIFtcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKVxuXHRdKVswXSBhcyBTZW1hbnRpY0tleTtcblx0aWYgKGxpbmVJdGVtQW5ub3RhdGlvbikge1xuXHRcdGNvbnN0IHRhYmxlQ29udmVydGVyQ29udGV4dCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcjxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KFxuXHRcdFx0Z2V0VGFyZ2V0T2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSlcblx0XHQpO1xuXHRcdGxpbmVJdGVtQW5ub3RhdGlvbi5mb3JFYWNoKChkYXRhRmllbGQpID0+IHtcblx0XHRcdC8vIFRPRE86IHZhcmlhYmxlIG5hbWUgc2hvdWxkIGJlIGRhdGFmaWVsZCBhbmQgbm90IGxpbmVJdGVtXG5cdFx0XHRpZiAoIV9pc1ZhbGlkQ29sdW1uKGRhdGFGaWVsZCkpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bGV0IGV4cG9ydFNldHRpbmdzOiBQcm9wZXJ0eUluZm9bXCJleHBvcnRTZXR0aW5nc1wiXSA9IG51bGw7XG5cdFx0XHRjb25zdCBzZW1hbnRpY09iamVjdEFubm90YXRpb25QYXRoID1cblx0XHRcdFx0aXNEYXRhRmllbGRUeXBlcyhkYXRhRmllbGQpICYmIGRhdGFGaWVsZC5WYWx1ZT8uJHRhcmdldD8uZnVsbHlRdWFsaWZpZWROYW1lXG5cdFx0XHRcdFx0PyBnZXRTZW1hbnRpY09iamVjdFBhdGgoY29udmVydGVyQ29udGV4dCwgZGF0YUZpZWxkKVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgcmVsYXRpdmVQYXRoID0gX2dldFJlbGF0aXZlUGF0aChkYXRhRmllbGQpO1xuXHRcdFx0Ly8gRGV0ZXJtaW5lIHByb3BlcnRpZXMgd2hpY2ggYXJlIGNvbnN1bWVkIGJ5IHRoaXMgTGluZUl0ZW0uXG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydGllc0luZm86IENvbXBsZXhQcm9wZXJ0eUluZm8gPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseShkYXRhRmllbGQsIGNvbnZlcnRlckNvbnRleHQsIHRhYmxlVHlwZSk7XG5cdFx0XHRjb25zdCByZWxhdGVkUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllcyk7XG5cdFx0XHRjb25zdCBhZGRpdGlvbmFsUHJvcGVydHlOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllc0luZm8uYWRkaXRpb25hbFByb3BlcnRpZXMpO1xuXHRcdFx0Y29uc3QgZ3JvdXBQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQgPSByZWxhdGl2ZVBhdGggPyBfc2xpY2VBdFNsYXNoKHJlbGF0aXZlUGF0aCwgdHJ1ZSwgZmFsc2UpIDogdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgaXNHcm91cDogYm9vbGVhbiA9IGdyb3VwUGF0aCAhPSByZWxhdGl2ZVBhdGg7XG5cdFx0XHRjb25zdCBsYWJlbCA9IGdldExhYmVsKGRhdGFGaWVsZCwgaXNHcm91cCk7XG5cdFx0XHRjb25zdCBuYW1lID0gX2dldEFubm90YXRpb25Db2x1bW5OYW1lKGRhdGFGaWVsZCk7XG5cdFx0XHRjb25zdCBpc0ZpZWxkR3JvdXBDb2x1bW46IGJvb2xlYW4gPSBncm91cFBhdGggPyBncm91cFBhdGguaW5jbHVkZXMoYEAke1VJQW5ub3RhdGlvblRlcm1zLkZpZWxkR3JvdXB9YCkgOiBmYWxzZTtcblx0XHRcdGNvbnN0IHNob3dEYXRhRmllbGRzTGFiZWw6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBpc0ZpZWxkR3JvdXBDb2x1bW5cblx0XHRcdFx0PyBfZ2V0U2hvd0RhdGFGaWVsZHNMYWJlbChuYW1lLCB2aXN1YWxpemF0aW9uUGF0aCwgY29udmVydGVyQ29udGV4dClcblx0XHRcdFx0OiBmYWxzZTtcblx0XHRcdGNvbnN0IGRhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBnZXREYXRhRmllbGREYXRhVHlwZShkYXRhRmllbGQpO1xuXHRcdFx0Y29uc3QgZm9ybWF0T3B0aW9ucyA9IF9nZXREZWZhdWx0Rm9ybWF0T3B0aW9uc0ZvclRhYmxlKGdldERlZmF1bHREcmFmdEluZGljYXRvckZvckNvbHVtbihuYW1lLCBzZW1hbnRpY0tleXMsIGRhdGFGaWVsZCkpO1xuXHRcdFx0Y29uc3QgcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8RGF0YUZpZWxkQWJzdHJhY3RUeXBlcz4oXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLFxuXHRcdFx0XHRyZWxhdGl2ZVBhdGhcblx0XHRcdCk7XG5cdFx0XHQvLyBEZXRlcm1pbmUgaWYgd2UgbmVlZCBhIHNpdHVhdGlvbnMgaW5kaWNhdG9yXG5cdFx0XHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydGllczogTmF2aWdhdGlvblByb3BlcnR5W10gPSBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZS5uYXZpZ2F0aW9uUHJvcGVydGllcztcblx0XHRcdGNvbnN0IHNpdHVhdGlvbnNOYXZQcm9wcyA9IG5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZpbHRlcihcblx0XHRcdFx0KG5hdmlnYXRpb25Qcm9wZXJ0eSkgPT5cblx0XHRcdFx0XHQhbmF2aWdhdGlvblByb3BlcnR5LmlzQ29sbGVjdGlvbiAmJlxuXHRcdFx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0eS50YXJnZXRUeXBlLmFubm90YXRpb25zLkNvbW1vbj8uU0FQT2JqZWN0Tm9kZVR5cGU/Lk5hbWUgPT09IFwiQnVzaW5lc3NTaXR1YXRpb25cIlxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHNpdHVhdGlvbnNOYXZQcm9wOiBOYXZpZ2F0aW9uUHJvcGVydHkgfCB1bmRlZmluZWQgPSBzaXR1YXRpb25zTmF2UHJvcHMubGVuZ3RoID49IDEgPyBzaXR1YXRpb25zTmF2UHJvcHNbMF0gOiB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoc2l0dWF0aW9uc05hdlByb3AgJiYgZm9ybWF0T3B0aW9ucykge1xuXHRcdFx0XHRmb3JtYXRPcHRpb25zLmhhc1NpdHVhdGlvbnNJbmRpY2F0b3IgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjtcblx0XHRcdGlmIChcblx0XHRcdFx0ZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uICYmXG5cdFx0XHRcdGRhdGFGaWVsZC5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZVxuXHRcdFx0KSB7XG5cdFx0XHRcdGZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9ucyA9IF9nZXRGaWVsZEdyb3VwSGlkZGVuRXhwcmVzc2lvbnMoZGF0YUZpZWxkKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGlzTXVsdGlWYWx1ZSA9IF9pc0NvbHVtbk11bHRpVmFsdWVkKGRhdGFGaWVsZCwgdGFibGVDb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdGlmICghaXNNdWx0aVZhbHVlICYmIF9pc0V4cG9ydGFibGVDb2x1bW4oZGF0YUZpZWxkKSkge1xuXHRcdFx0XHQvL2V4Y2x1ZGUgdGhlIHR5cGVzIGxpc3RlZCBhYm92ZSBmb3IgdGhlIEV4cG9ydCAoZ2VuZXJhdGVzIGVycm9yIG9uIEV4cG9ydCBhcyBQREYpXG5cdFx0XHRcdGV4cG9ydFNldHRpbmdzID0gY3JlYXRlQ29sdW1uRXhwb3J0U2V0dGluZ3MoZGF0YUZpZWxkLCByZWxhdGVkUHJvcGVydGllc0luZm8pO1xuXHRcdFx0fVxuXHRcdFx0bGV0IHByb3BlcnR5VHlwZUNvbmZpZzogUHJvcGVydHlUeXBlQ29uZmlnIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKGRhdGFUeXBlKSB7XG5cdFx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZyA9IGdldFR5cGVDb25maWcoZGF0YUZpZWxkLCBkYXRhVHlwZSk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCB0eXBlQ29uZmlnOiBQcm9wZXJ0eVR5cGVDb25maWcgPSB7XG5cdFx0XHRcdGNsYXNzTmFtZTogZGF0YVR5cGUgYXMga2V5b2YgdHlwZW9mIERlZmF1bHRUeXBlRm9yRWRtVHlwZSxcblx0XHRcdFx0Zm9ybWF0T3B0aW9uczoge1xuXHRcdFx0XHRcdC4uLmZvcm1hdE9wdGlvbnMsXG5cdFx0XHRcdFx0Li4ucHJvcGVydHlUeXBlQ29uZmlnPy5mb3JtYXRPcHRpb25zXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGNvbnN0cmFpbnRzOiBwcm9wZXJ0eVR5cGVDb25maWc/LmNvbnN0cmFpbnRzXG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgdmlzdWFsU2V0dGluZ3M6IFZpc3VhbFNldHRpbmdzID0ge307XG5cdFx0XHRpZiAoIWRhdGFUeXBlIHx8ICF0eXBlQ29uZmlnKSB7XG5cdFx0XHRcdC8vIGZvciBjaGFydHNcblx0XHRcdFx0dmlzdWFsU2V0dGluZ3Mud2lkdGhDYWxjdWxhdGlvbiA9IG51bGw7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBzb3J0YWJsZSA9XG5cdFx0XHRcdCFpc011bHRpVmFsdWUgJiZcblx0XHRcdFx0X2lzQ29sdW1uU29ydGFibGUoZGF0YUZpZWxkLCByZWxhdGl2ZVBhdGgsIHJlc3RyaWN0aW9uc09uUHJvcGVydGllcy5ub25Tb3J0YWJsZVByb3BlcnRpZXMsIHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyk7XG5cdFx0XHRjb25zdCBhdmFpbGFiaWxpdHkgPSBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihkYXRhRmllbGQpID8gXCJIaWRkZW5cIiA6IFwiRGVmYXVsdFwiO1xuXHRcdFx0Y29uc3QgY29sdW1uOiBBbm5vdGF0aW9uVGFibGVDb2x1bW4gPSB7XG5cdFx0XHRcdGtleTogS2V5SGVscGVyLmdlbmVyYXRlS2V5RnJvbURhdGFGaWVsZChkYXRhRmllbGQpLFxuXHRcdFx0XHR0eXBlOiBDb2x1bW5UeXBlLkFubm90YXRpb24sXG5cdFx0XHRcdGxhYmVsOiBsYWJlbCA/PyBuYW1lLFxuXHRcdFx0XHRncm91cExhYmVsOiBpc0dyb3VwID8gZ2V0TGFiZWwoZGF0YUZpZWxkKSA6IHVuZGVmaW5lZCxcblx0XHRcdFx0Z3JvdXA6IGlzR3JvdXAgPyBncm91cFBhdGggOiB1bmRlZmluZWQsXG5cdFx0XHRcdEZpZWxkR3JvdXBIaWRkZW5FeHByZXNzaW9uczogZmllbGRHcm91cEhpZGRlbkV4cHJlc3Npb25zLFxuXHRcdFx0XHRhbm5vdGF0aW9uUGF0aDogY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGRhdGFGaWVsZC5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0XHRzZW1hbnRpY09iamVjdFBhdGg6IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvblBhdGgsXG5cdFx0XHRcdGF2YWlsYWJpbGl0eTogYXZhaWxhYmlsaXR5LFxuXHRcdFx0XHRuYW1lOiBuYW1lLFxuXHRcdFx0XHRzaG93RGF0YUZpZWxkc0xhYmVsOiBzaG93RGF0YUZpZWxkc0xhYmVsLFxuXHRcdFx0XHRyZXF1aXJlZDogaXNSZXF1aXJlZENvbHVtbihjb252ZXJ0ZXJDb250ZXh0LCBkYXRhRmllbGQgYXMgRGF0YUZpZWxkVHlwZXMsIHRhYmxlQ3JlYXRpb25Nb2RlKSxcblx0XHRcdFx0cmVsYXRpdmVQYXRoOiByZWxhdGl2ZVBhdGgsXG5cdFx0XHRcdHNvcnRhYmxlOiBzb3J0YWJsZSxcblx0XHRcdFx0cHJvcGVydHlJbmZvczogcmVsYXRlZFByb3BlcnR5TmFtZXMubGVuZ3RoID8gcmVsYXRlZFByb3BlcnR5TmFtZXMgOiB1bmRlZmluZWQsXG5cdFx0XHRcdGFkZGl0aW9uYWxQcm9wZXJ0eUluZm9zOiBhZGRpdGlvbmFsUHJvcGVydHlOYW1lcy5sZW5ndGggPiAwID8gYWRkaXRpb25hbFByb3BlcnR5TmFtZXMgOiB1bmRlZmluZWQsXG5cdFx0XHRcdGV4cG9ydFNldHRpbmdzOiBleHBvcnRTZXR0aW5ncyxcblx0XHRcdFx0d2lkdGg6IChkYXRhRmllbGQuYW5ub3RhdGlvbnM/LkhUTUw1Py5Dc3NEZWZhdWx0cz8ud2lkdGg/LnZhbHVlT2YoKSBhcyBzdHJpbmcpIHx8IHVuZGVmaW5lZCxcblx0XHRcdFx0aW1wb3J0YW5jZTogZ2V0SW1wb3J0YW5jZShjb252ZXJ0ZXJDb250ZXh0LCBkYXRhRmllbGQgYXMgRGF0YUZpZWxkVHlwZXMpLFxuXHRcdFx0XHRpc05hdmlnYWJsZTogdHJ1ZSxcblx0XHRcdFx0Zm9ybWF0T3B0aW9uczogZm9ybWF0T3B0aW9ucyxcblx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdFx0XHR0eXBlQ29uZmlnOiB0eXBlQ29uZmlnLFxuXHRcdFx0XHR2aXN1YWxTZXR0aW5nczogdmlzdWFsU2V0dGluZ3MgYXMgUHJvcGVydHlJbmZvW1widmlzdWFsU2V0dGluZ3NcIl0sXG5cdFx0XHRcdHRpbWV6b25lVGV4dDogZXhwb3J0U2V0dGluZ3M/LnRpbWV6b25lLFxuXHRcdFx0XHRpc1BhcnRPZkxpbmVJdGVtOiB0cnVlLFxuXHRcdFx0XHRkYXRhVHlwZTogZGF0YVR5cGUgPz8gKFwiRWRtLlN0cmluZ1wiIGFzIGtleW9mIHR5cGVvZiBEZWZhdWx0VHlwZUZvckVkbVR5cGUpLFxuXHRcdFx0XHRpc011bHRpVmFsdWVcblx0XHRcdH07XG5cdFx0XHRjb25zdCB0b29sdGlwID0gX2dldFRvb2x0aXAoZGF0YUZpZWxkKSA/PyBsYWJlbDtcblx0XHRcdGlmICh0b29sdGlwKSB7XG5cdFx0XHRcdGNvbHVtbi50b29sdGlwID0gdG9vbHRpcDtcblx0XHRcdH1cblx0XHRcdGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8uZXhwb3J0U2V0dGluZ3MuZGF0YVBvaW50VGFyZ2V0VmFsdWUpIHtcblx0XHRcdFx0Y29sdW1uLmV4cG9ydERhdGFQb2ludFRhcmdldFZhbHVlID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLmV4cG9ydFNldHRpbmdzLmRhdGFQb2ludFRhcmdldFZhbHVlO1xuXHRcdFx0fVxuXHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMucHVzaChjb2x1bW4pO1xuXHRcdFx0Ly8gQ29sbGVjdCBpbmZvcm1hdGlvbiBvZiByZWxhdGVkIGNvbHVtbnMgdG8gYmUgY3JlYXRlZC5cblx0XHRcdHJlbGF0ZWRQcm9wZXJ0eU5hbWVzLmZvckVhY2goKHJlbGF0ZWRQcm9wZXJ0eU5hbWUpID0+IHtcblx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW3JlbGF0ZWRQcm9wZXJ0eU5hbWVdID0gcmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbcmVsYXRlZFByb3BlcnR5TmFtZV0uYW5ub3RhdGlvblByb3BlcnR5O1xuXHRcdFx0XHQvLyBJbiBjYXNlIG9mIGEgbXVsdGktdmFsdWUsIHJlbGF0ZWQgcHJvcGVydGllcyBjYW5ub3QgYmUgc29ydGVkIGFzIHdlIGdvIHRocm91Z2ggYSAxLW4gcmVsYXRpb25cblx0XHRcdFx0aWYgKGlzTXVsdGlWYWx1ZSkge1xuXHRcdFx0XHRcdHJlc3RyaWN0aW9uc09uUHJvcGVydGllcy5ub25Tb3J0YWJsZVByb3BlcnRpZXMucHVzaChyZWxhdGVkUHJvcGVydHlOYW1lKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhZGRQcm9wZXJ0eVRvRGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcChcblx0XHRcdFx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwLFxuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzSW5mbyxcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydHlOYW1lXG5cdFx0XHRcdCk7XG5cdFx0XHRcdC8vIEluIGNhc2UgdGhlIGxpbmVJdGVtIHBvaW50cyB0byBhIG5hdmlnYXRpb24gcHJvcGVydHkgd2l0aCBhIHRleHRBcnJhbmdlbWVudCBUZXh0T25seSwgd2UgbmVlZCB0byBjcmVhdGUgdGhlIGNvbHVtbiB3aXRoIHRoZSB2YWx1ZSBuYXZpZ2F0aW9uIHByb3BlcnR5LlxuXHRcdFx0XHQvLyBUaGUgdGV4dCBwcm9wZXJ0eSBpcyByZWZlcmVuY2VkIG9uIHRoZSByZWxhdGVkIHByb3BlcnRpZXMgb2YgdGhlIGxpbmVJdGVtLCBzbyB3aWxsIGJlIGNyZWF0ZWQgb24gdGhlIF9jcmVhdGVSZWxhdGVkQ29sdW1ucyBtZXRob2QuXG5cdFx0XHRcdGlmIChyZWxhdGVkUHJvcGVydGllc0luZm8ucHJvcGVydGllc1tyZWxhdGVkUHJvcGVydHlOYW1lXS5kaXNwbGF5TW9kZU9mUHJvcGVydHlVc2VkQXNEZXNjcmlwdGlvbiA9PT0gXCJEZXNjcmlwdGlvblwiKSB7XG5cdFx0XHRcdFx0Y3JlYXRlUHJvcGVydHlBbm5vdGF0ZWRUZXh0T25seShcblx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsXG5cdFx0XHRcdFx0XHRkYXRhRmllbGQsXG5cdFx0XHRcdFx0XHRjb2x1bW5zVG9CZUNyZWF0ZWQsXG5cdFx0XHRcdFx0XHRyZWxhdGl2ZVBhdGgsXG5cdFx0XHRcdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXNcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdC8vIENyZWF0ZSBjb2x1bW5zIGZvciBhZGRpdGlvbmFsIHByb3BlcnRpZXMgaWRlbnRpZmllZCBmb3IgQUxQIHVzZSBjYXNlLlxuXHRcdFx0YWRkaXRpb25hbFByb3BlcnR5TmFtZXMuZm9yRWFjaCgoYWRkaXRpb25hbFByb3BlcnR5TmFtZSkgPT4ge1xuXHRcdFx0XHQvLyBJbnRlbnRpb25hbCBvdmVyd3JpdGUgYXMgd2UgcmVxdWlyZSBvbmx5IG9uZSBuZXcgUHJvcGVydHlJbmZvIGZvciBhIHJlbGF0ZWQgUHJvcGVydHkuXG5cdFx0XHRcdGNvbHVtbnNUb0JlQ3JlYXRlZFthZGRpdGlvbmFsUHJvcGVydHlOYW1lXSA9IHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5hZGRpdGlvbmFsUHJvcGVydGllc1thZGRpdGlvbmFsUHJvcGVydHlOYW1lXTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cdC8vIEdldCBjb2x1bW5zIGZyb20gdGhlIFByb3BlcnRpZXMgb2YgRW50aXR5VHlwZVxuXHRyZXR1cm4gZ2V0Q29sdW1uc0Zyb21FbnRpdHlUeXBlKFxuXHRcdGNvbHVtbnNUb0JlQ3JlYXRlZCxcblx0XHRlbnRpdHlUeXBlLFxuXHRcdGFubm90YXRpb25Db2x1bW5zLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0dGFibGVUeXBlLFxuXHRcdHRhYmxlQ3JlYXRpb25Nb2RlLFxuXHRcdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAsXG5cdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzXG5cdCk7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIHByb3BlcnR5IG5hbWVzIGZyb20gdGhlIG1hbmlmZXN0IGFuZCBjaGVja3MgYWdhaW5zdCBleGlzdGluZyBwcm9wZXJ0aWVzIGFscmVhZHkgYWRkZWQgYnkgYW5ub3RhdGlvbnMuXG4gKiBJZiBhIG5vdCB5ZXQgc3RvcmVkIHByb3BlcnR5IGlzIGZvdW5kIGl0IGFkZHMgaXQgZm9yIHNvcnRpbmcgYW5kIGZpbHRlcmluZyBvbmx5IHRvIHRoZSBhbm5vdGF0aW9uQ29sdW1ucy5cbiAqIEBwYXJhbSBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0gYW5ub3RhdGlvbkNvbHVtbnNcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0gZW50aXR5VHlwZVxuICogQHJldHVybnMgVGhlIGNvbHVtbnMgZnJvbSB0aGUgYW5ub3RhdGlvbnNcbiAqL1xuY29uc3QgX2dldFByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiAoXG5cdHByb3BlcnRpZXM6IHN0cmluZ1tdIHwgc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRhbm5vdGF0aW9uQ29sdW1uczogQW5ub3RhdGlvblRhYmxlQ29sdW1uW10sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZVxuKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuXHRsZXQgbWF0Y2hlZFByb3BlcnRpZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXHRpZiAoQXJyYXkuaXNBcnJheShwcm9wZXJ0aWVzKSkge1xuXHRcdG1hdGNoZWRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5tYXAoZnVuY3Rpb24gKHByb3BlcnR5UGF0aCkge1xuXHRcdFx0Y29uc3QgYW5ub3RhdGlvbkNvbHVtbiA9IGFubm90YXRpb25Db2x1bW5zLmZpbmQoZnVuY3Rpb24gKGFubm90YXRpb25Db2x1bW4pIHtcblx0XHRcdFx0cmV0dXJuIGFubm90YXRpb25Db2x1bW4ucmVsYXRpdmVQYXRoID09PSBwcm9wZXJ0eVBhdGggJiYgYW5ub3RhdGlvbkNvbHVtbi5wcm9wZXJ0eUluZm9zID09PSB1bmRlZmluZWQ7XG5cdFx0XHR9KTtcblx0XHRcdGlmIChhbm5vdGF0aW9uQ29sdW1uKSB7XG5cdFx0XHRcdHJldHVybiBhbm5vdGF0aW9uQ29sdW1uLm5hbWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCByZWxhdGVkQ29sdW1ucyA9IF9jcmVhdGVSZWxhdGVkQ29sdW1ucyhcblx0XHRcdFx0XHR7IFtwcm9wZXJ0eVBhdGhdOiBlbnRpdHlUeXBlLnJlc29sdmVQYXRoKHByb3BlcnR5UGF0aCkgfSxcblx0XHRcdFx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdGVudGl0eVR5cGUsXG5cdFx0XHRcdFx0e31cblx0XHRcdFx0KTtcblx0XHRcdFx0YW5ub3RhdGlvbkNvbHVtbnMucHVzaChyZWxhdGVkQ29sdW1uc1swXSk7XG5cdFx0XHRcdHJldHVybiByZWxhdGVkQ29sdW1uc1swXS5uYW1lO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBtYXRjaGVkUHJvcGVydGllcztcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZmllbGQgZ3JvdXAgaGFzIHRvIGJlIGZsYWdnZWQgYXMgcmVxdWlyZWQuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBmaWVsZEdyb3VwIFRoZSBmaWVsZEdyb3VwIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB1bmRlcmx5aW5nIHRhYmxlXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBmaWVsZEdyb3VwIGlzIHJlcXVpcmVkLlxuICovXG5jb25zdCBpc1JlcXVpcmVkRmllbGRHcm91cCA9IGZ1bmN0aW9uIChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRmaWVsZEdyb3VwOiBGaWVsZEdyb3VwLFxuXHR0YWJsZUNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlXG4pOiBib29sZWFuIHtcblx0Y29uc3QgZmllbGRHcm91cERhdGEgPSBmaWVsZEdyb3VwLkRhdGE7XG5cdHJldHVybiBmaWVsZEdyb3VwRGF0YS5zb21lKGZ1bmN0aW9uIChpdGVtKSB7XG5cdFx0Ly8gd2UgZXhjbHVkZSBib29sZWFuIHR5cGUsIHRoZSBlbmQtdXNlciBtYXkgd2FudCB0byBrZWVwIHRoZSB1bmRlcmx5aW5nIGNoZWNrIGJveCBlbXB0eSBvbiBwdXJwb3NlXG5cdFx0aWYgKGlzRGF0YUZpZWxkKGl0ZW0pICYmIGl0ZW0/LlZhbHVlPy4kdGFyZ2V0LnR5cGUgIT09IFwiRWRtLkJvb2xlYW5cIikge1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0aXNTdGF0aWNhbGx5TWFuZGF0b3J5KGl0ZW0pIHx8XG5cdFx0XHRcdCh0YWJsZUNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93cyAmJlxuXHRcdFx0XHRcdGlzQW5ub3RhdGVkUmVxdWlyZWRQcm9wZXJ0eShpdGVtLlZhbHVlLiR0YXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lLCBjb252ZXJ0ZXJDb250ZXh0KSlcblx0XHRcdCk7XG5cdFx0fVxuXHR9KTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBoYXMgdG8gYmUgZmxhZ2dlZCBhcyByZXF1aXJlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGRhdGFGaWVsZEZvckFubm90YXRpb24gVGhlIHByb3BlcnR5IGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB1bmRlcmx5aW5nIHRhYmxlXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyByZXF1aXJlZC5cbiAqL1xuY29uc3QgaXNSZXF1aXJlZERhdGFGaWVsZEZvckFubm90YXRpb24gPSBmdW5jdGlvbiAoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0ZGF0YUZpZWxkRm9yQW5ub3RhdGlvbjogRGF0YUZpZWxkRm9yQW5ub3RhdGlvbixcblx0dGFibGVDcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZVxuKTogYm9vbGVhbiB7XG5cdGNvbnN0IGRhdGFGaWVsZFRhcmdldCA9IGRhdGFGaWVsZEZvckFubm90YXRpb24uVGFyZ2V0LiR0YXJnZXQ7XG5cdGNvbnN0IERhdGFGaWVsZEZvckFubm90YXRpb25GaWVsZENvbnRyb2xOb3RNYW5kYXRvcnkgPSBoYXNGaWVsZENvbnRyb2xOb3RNYW5kYXRvcnkoZGF0YUZpZWxkRm9yQW5ub3RhdGlvbik7XG5cdC8vIENoZWNrIGlmIHRoZSBEYXRhRmllbGRGb3JBbm5vdGF0aW9uIHBvaW50cyB0byBhIEZpZWxkR3JvdXBcblx0aWYgKGhhc0ZpZWxkR3JvdXBUYXJnZXQoZGF0YUZpZWxkRm9yQW5ub3RhdGlvbikpIHtcblx0XHRpZiAoaXNSZXF1aXJlZEZpZWxkR3JvdXAoY29udmVydGVyQ29udGV4dCwgZGF0YUZpZWxkVGFyZ2V0IGFzIEZpZWxkR3JvdXAsIHRhYmxlQ3JlYXRpb25Nb2RlKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdGNvbnN0IGZpZWxkR3JvdXBEYXRhID0gKGRhdGFGaWVsZFRhcmdldCBhcyBGaWVsZEdyb3VwKS5EYXRhO1xuXHRcdHJldHVybiBmaWVsZEdyb3VwRGF0YS5zb21lKChpbm5lckRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykgPT4ge1xuXHRcdFx0cmV0dXJuIGlzUmVxdWlyZWRDb2x1bW4oY29udmVydGVyQ29udGV4dCwgaW5uZXJEYXRhRmllbGQsIHRhYmxlQ3JlYXRpb25Nb2RlKTtcblx0XHR9KTtcblx0fVxuXHQvKklmIHRoZSB1bmRlcmx5aW5nIGRhdGFwb2ludCBpcyBhIHJhdGluZyBpbmRpY2F0b3IsIHRoZSBlbmQtdXNlciBtYXkgd2FudCB0byBrZWVwIHRoZSByYXRpbmcgZW1wdHkgKHZhbHVlIDApIG9uIHB1cnBvc2UuXG5cdEJlc2lkZXMsIGN1cnJlbnRseSwgb25seSBhIGZpZWxkQ29udHJvbCBzZXQgb24gYSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIHBvaW50aW5nIHRvIGEgZGF0YVBvaW50IGhhcyBhbiBpbmZsdWVuY2UgaW4gdGhlIHRhYmxlLlxuXHRBY2NvcmRpbmdseSwgaWYgYSBkYXRhcG9pbnQgY29tZXMgZnJvbSBhIGRhdGFGaWVsZEZvckFubm90YXRpb24gd2l0aCBhIGZpZWxkQ29udHJvbCBzZXQgYXMgbm90IG1hbmRhdG9yeSwgdGhpcyBkYXRhUG9pbnQgbXVzdCBub3QgYmUgZmxhZ2dlZCBhcyBcInJlcXVpcmVkXCIqL1xuXHRpZiAoaGFzRGF0YVBvaW50VGFyZ2V0KGRhdGFGaWVsZEZvckFubm90YXRpb24pICYmIChkYXRhRmllbGRUYXJnZXQgYXMgRGF0YVBvaW50KS5WaXN1YWxpemF0aW9uICE9PSBcIlVJLlZpc3VhbGl6YXRpb25UeXBlL1JhdGluZ1wiKSB7XG5cdFx0aWYgKERhdGFGaWVsZEZvckFubm90YXRpb25GaWVsZENvbnRyb2xOb3RNYW5kYXRvcnkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKGlzU3RhdGljYWxseU1hbmRhdG9yeShkYXRhRmllbGRGb3JBbm5vdGF0aW9uKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBpc1JlcXVpcmVkRGF0YVBvaW50KGNvbnZlcnRlckNvbnRleHQsIGRhdGFGaWVsZFRhcmdldCBhcyBEYXRhUG9pbnQsIHRhYmxlQ3JlYXRpb25Nb2RlKTtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIHByb3BlcnR5IGhhcyB0byBiZSBmbGFnZ2VkIGFzIHJlcXVpcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIHRhYmxlQ3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIG9mIHRoZSB1bmRlcmx5aW5nIHRhYmxlXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyByZXF1aXJlZC5cbiAqL1xuY29uc3QgaXNSZXF1aXJlZFByb3BlcnR5ID0gZnVuY3Rpb24gKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdHByb3BlcnR5OiBQcm9wZXJ0eSxcblx0dGFibGVDcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZVxuKTogYm9vbGVhbiB7XG5cdHJldHVybiAoXG5cdFx0cHJvcGVydHkudHlwZSAhPT0gXCJFZG0uQm9vbGVhblwiICYmXG5cdFx0IWlzUmF0aW5nVmlzdWFsaXphdGlvbkZyb21EYXRhRmllbGREZWZhdWx0KHByb3BlcnR5KSAmJlxuXHRcdChpc1N0YXRpY2FsbHlNYW5kYXRvcnkocHJvcGVydHkpIHx8XG5cdFx0XHQodGFibGVDcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmVDcmVhdGlvblJvd3MgJiZcblx0XHRcdFx0aXNBbm5vdGF0ZWRSZXF1aXJlZFByb3BlcnR5KHByb3BlcnR5LmZ1bGx5UXVhbGlmaWVkTmFtZSwgY29udmVydGVyQ29udGV4dCkpKVxuXHQpO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBkYXRhUG9pbnQgaGFzIHRvIGJlIGZsYWdnZWQgYXMgcmVxdWlyZWQuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBkYXRhUG9pbnQgVGhlIGRhdGFQb2ludCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSB0YWJsZUNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSBvZiB0aGUgdW5kZXJseWluZyB0YWJsZVxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZGF0YVBvaW50IGlzIHJlcXVpcmVkLlxuICovXG5jb25zdCBpc1JlcXVpcmVkRGF0YVBvaW50ID0gZnVuY3Rpb24gKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGRhdGFQb2ludDogRGF0YVBvaW50LFxuXHR0YWJsZUNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlXG4pOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHRpc1N0YXRpY2FsbHlNYW5kYXRvcnkoZGF0YVBvaW50KSB8fFxuXHRcdCh0YWJsZUNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93cyAmJlxuXHRcdFx0aXNBbm5vdGF0ZWRSZXF1aXJlZFByb3BlcnR5KGRhdGFQb2ludC5WYWx1ZS4kdGFyZ2V0LmZ1bGx5UXVhbGlmaWVkTmFtZSwgY29udmVydGVyQ29udGV4dCkpXG5cdCk7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIHVuZGVybHlpbmcgY29sdW1uIGhhcyB0byBiZSBmbGFnZ2VkIGFzIHJlcXVpcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcGFyYW0gdGFibGVDcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgb2YgdGhlIHVuZGVybHlpbmcgdGFibGVcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSAncmVxdWlyZWQnIHByb3BlcnR5IG9mIHRoZSB0YWJsZSBjb2x1bW4uXG4gKi9cbmNvbnN0IGlzUmVxdWlyZWRDb2x1bW4gPSBmdW5jdGlvbiAoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0dGFyZ2V0OiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHksXG5cdHRhYmxlQ3JlYXRpb25Nb2RlPzogQ3JlYXRpb25Nb2RlXG4pOiBDb21waWxlZEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiB7XG5cdGNvbnN0IGNyZWF0aW9uTW9kZSA9IHRhYmxlQ3JlYXRpb25Nb2RlIHx8IENyZWF0aW9uTW9kZS5JbmxpbmU7XG5cdGlmIChcblx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCB8fFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5BbmFseXRpY2FsTGlzdFBhZ2Vcblx0KSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRpZiAoaXNQcm9wZXJ0eSh0YXJnZXQpKSB7XG5cdFx0cmV0dXJuIGlzUmVxdWlyZWRQcm9wZXJ0eShjb252ZXJ0ZXJDb250ZXh0LCB0YXJnZXQsIGNyZWF0aW9uTW9kZSkgPyBjb21waWxlRXhwcmVzc2lvbihVSS5Jc0VkaXRhYmxlKSA6IHVuZGVmaW5lZDtcblx0fVxuXHQvLyBDaGVjayBpZiB0aGUgZGF0YUZpZWxkIGlzIG9mIHR5cGUgRGF0YUZpZWxkRm9yQW5ub3RhdGlvblxuXHRpZiAoaXNEYXRhRmllbGRGb3JBbm5vdGF0aW9uKHRhcmdldCkpIHtcblx0XHRyZXR1cm4gaXNSZXF1aXJlZERhdGFGaWVsZEZvckFubm90YXRpb24oY29udmVydGVyQ29udGV4dCwgdGFyZ2V0LCBjcmVhdGlvbk1vZGUpID8gY29tcGlsZUV4cHJlc3Npb24oVUkuSXNFZGl0YWJsZSkgOiB1bmRlZmluZWQ7XG5cdH1cblx0Ly9JZiB0aGUgdW5kZXJseWluZyBwcm9wZXJ0eSBpcyBhIGJvb2xlYW4sIHRoZSBlbmQtdXNlciBtYXkgd2FudCB0byBrZWVwIHRoZSBjaGVjayBib3ggZW1wdHkgb24gcHVycG9zZVxuXHRpZiAoaXNEYXRhRmllbGQodGFyZ2V0KSAmJiB0YXJnZXQuVmFsdWU/LiR0YXJnZXQ/LnR5cGUgIT09IFwiRWRtLkJvb2xlYW5cIikge1xuXHRcdHJldHVybiBpc1N0YXRpY2FsbHlNYW5kYXRvcnkodGFyZ2V0KSB8fFxuXHRcdFx0KGNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93cyAmJlxuXHRcdFx0XHRpc0Fubm90YXRlZFJlcXVpcmVkUHJvcGVydHkodGFyZ2V0LlZhbHVlLiR0YXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lLCBjb252ZXJ0ZXJDb250ZXh0KSlcblx0XHRcdD8gY29tcGlsZUV4cHJlc3Npb24oVUkuSXNFZGl0YWJsZSlcblx0XHRcdDogdW5kZWZpbmVkO1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG5jb25zdCBfYXBwZW5kQ3VzdG9tVGVtcGxhdGUgPSBmdW5jdGlvbiAoXG5cdHByb3BlcnRpZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuXHRleHBvcnRQcm9wZXJ0aWVzOiBzdHJpbmdbXSB8IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0aWYgKEFycmF5LmlzQXJyYXkoZXhwb3J0UHJvcGVydGllcykpIHtcblx0XHRwcm9wZXJ0aWVzID0gZXhwb3J0UHJvcGVydGllcztcblx0fVxuXHRpZiAocHJvcGVydGllcykge1xuXHRcdHJldHVybiBwcm9wZXJ0aWVzXG5cdFx0XHQubWFwKChwcm9wZXJ0eSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gYHske3Byb3BlcnRpZXMhLmluZGV4T2YocHJvcGVydHkpfX1gO1xuXHRcdFx0fSlcblx0XHRcdC5qb2luKGAke1wiXFxuXCJ9YCk7XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0YWJsZSBjb2x1bW4gZGVmaW5pdGlvbnMgZnJvbSBtYW5pZmVzdC5cbiAqXG4gKiBUaGVzZSBtYXkgYmUgY3VzdG9tIGNvbHVtbnMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QsIHNsb3QgY29sdW1ucyBjb21pbmcgdGhyb3VnaFxuICogYSBidWlsZGluZyBibG9jaywgb3IgYW5ub3RhdGlvbiBjb2x1bW5zIHRvIG92ZXJ3cml0ZSBhbm5vdGF0aW9uLWJhc2VkIGNvbHVtbnMuXG4gKiBAcGFyYW0gY29sdW1uc1xuICogQHBhcmFtIGFubm90YXRpb25Db2x1bW5zXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIGVudGl0eVR5cGVcbiAqIEByZXR1cm5zIFRoZSBjb2x1bW5zIGZyb20gdGhlIG1hbmlmZXN0XG4gKi9cbmNvbnN0IGdldENvbHVtbnNGcm9tTWFuaWZlc3QgPSBmdW5jdGlvbiAoXG5cdGNvbHVtbnM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbiB8IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbkZvck92ZXJyaWRlPixcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGVcbik6IFJlY29yZDxzdHJpbmcsIE1hbmlmZXN0Q29sdW1uPiB7XG5cdGNvbnN0IGludGVybmFsQ29sdW1uczogUmVjb3JkPHN0cmluZywgTWFuaWZlc3RDb2x1bW4+ID0ge307XG5cdGZ1bmN0aW9uIGlzQ29sdW1uT3ZlcnJpZGUoXG5cdFx0Y29sdW1uOiBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW4gfCBDdXN0b21EZWZpbmVkVGFibGVDb2x1bW5Gb3JPdmVycmlkZSxcblx0XHRrZXk6IHN0cmluZ1xuXHQpOiBjb2x1bW4gaXMgQ3VzdG9tRGVmaW5lZFRhYmxlQ29sdW1uRm9yT3ZlcnJpZGUge1xuXHRcdHJldHVybiBhbm5vdGF0aW9uQ29sdW1ucy5zb21lKChhbm5vdGF0aW9uQ29sdW1uKSA9PiBhbm5vdGF0aW9uQ29sdW1uLmtleSA9PT0ga2V5KTtcblx0fVxuXHRmdW5jdGlvbiBpc1Nsb3RDb2x1bW4obWFuaWZlc3RDb2x1bW46IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbik6IG1hbmlmZXN0Q29sdW1uIGlzIEZyYWdtZW50RGVmaW5lZFNsb3RDb2x1bW4ge1xuXHRcdHJldHVybiBtYW5pZmVzdENvbHVtbi50eXBlID09PSBDb2x1bW5UeXBlLlNsb3Q7XG5cdH1cblx0ZnVuY3Rpb24gaXNDdXN0b21Db2x1bW4obWFuaWZlc3RDb2x1bW46IEN1c3RvbURlZmluZWRUYWJsZUNvbHVtbik6IG1hbmlmZXN0Q29sdW1uIGlzIE1hbmlmZXN0RGVmaW5lZEN1c3RvbUNvbHVtbiB7XG5cdFx0cmV0dXJuIG1hbmlmZXN0Q29sdW1uLnR5cGUgPT09IHVuZGVmaW5lZCAmJiAhIW1hbmlmZXN0Q29sdW1uLnRlbXBsYXRlO1xuXHR9XG5cdGZ1bmN0aW9uIF91cGRhdGVMaW5rZWRQcm9wZXJ0aWVzT25DdXN0b21Db2x1bW5zKHByb3BlcnR5SW5mb3M6IHN0cmluZ1tdLCBhbm5vdGF0aW9uVGFibGVDb2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSk6IHZvaWQge1xuXHRcdGNvbnN0IHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyA9IGdldFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyhjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRwcm9wZXJ0eUluZm9zLmZvckVhY2goKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRhbm5vdGF0aW9uVGFibGVDb2x1bW5zLmZvckVhY2goKHByb3ApID0+IHtcblx0XHRcdFx0aWYgKHByb3AubmFtZSA9PT0gcHJvcGVydHkpIHtcblx0XHRcdFx0XHRwcm9wLnNvcnRhYmxlID0gIXJlc3RyaWN0aW9uc09uUHJvcGVydGllcy5ub25Tb3J0YWJsZVByb3BlcnRpZXMuaW5jbHVkZXMocHJvcGVydHkucmVwbGFjZShcIlByb3BlcnR5OjpcIiwgXCJcIikpO1xuXHRcdFx0XHRcdHByb3AuaXNHcm91cGFibGUgPSBwcm9wLnNvcnRhYmxlO1xuXHRcdFx0XHRcdHByb3AuZmlsdGVyYWJsZSA9ICFyZXN0cmljdGlvbnNPblByb3BlcnRpZXMubm9uRmlsdGVyYWJsZVByb3BlcnRpZXMuaW5jbHVkZXMocHJvcGVydHkucmVwbGFjZShcIlByb3BlcnR5OjpcIiwgXCJcIikpO1xuXHRcdFx0XHRcdHByb3AuaXNQYXJ0T2ZDdXN0b21Db2x1bW4gPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXHRmb3IgKGNvbnN0IGtleSBpbiBjb2x1bW5zKSB7XG5cdFx0Y29uc3QgbWFuaWZlc3RDb2x1bW4gPSBjb2x1bW5zW2tleV07XG5cdFx0S2V5SGVscGVyLnZhbGlkYXRlS2V5KGtleSk7XG5cdFx0Ly8gQmFzZVRhYmxlQ29sdW1uXG5cdFx0Y29uc3QgYmFzZVRhYmxlQ29sdW1uID0ge1xuXHRcdFx0a2V5OiBrZXksXG5cdFx0XHR3aWR0aEluY2x1ZGluZ0NvbHVtbkhlYWRlcjogbWFuaWZlc3RDb2x1bW4ud2lkdGhJbmNsdWRpbmdDb2x1bW5IZWFkZXIsXG5cdFx0XHR3aWR0aDogbWFuaWZlc3RDb2x1bW4ud2lkdGggfHwgdW5kZWZpbmVkLFxuXHRcdFx0cG9zaXRpb246IHtcblx0XHRcdFx0YW5jaG9yOiBtYW5pZmVzdENvbHVtbi5wb3NpdGlvbj8uYW5jaG9yLFxuXHRcdFx0XHRwbGFjZW1lbnQ6IG1hbmlmZXN0Q29sdW1uLnBvc2l0aW9uID09PSB1bmRlZmluZWQgPyBQbGFjZW1lbnQuQWZ0ZXIgOiBtYW5pZmVzdENvbHVtbi5wb3NpdGlvbi5wbGFjZW1lbnRcblx0XHRcdH0sXG5cdFx0XHRjYXNlU2Vuc2l0aXZlOiBpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUoY29udmVydGVyQ29udGV4dClcblx0XHR9O1xuXHRcdGlmIChpc0NvbHVtbk92ZXJyaWRlKG1hbmlmZXN0Q29sdW1uLCBrZXkpKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0aWVzVG9PdmVyd3JpdGVBbm5vdGF0aW9uQ29sdW1uOiBDdXN0b21FbGVtZW50PEFubm90YXRpb25UYWJsZUNvbHVtbkZvck92ZXJyaWRlPiA9IHtcblx0XHRcdFx0Li4uYmFzZVRhYmxlQ29sdW1uLFxuXHRcdFx0XHRpbXBvcnRhbmNlOiBtYW5pZmVzdENvbHVtbj8uaW1wb3J0YW5jZSxcblx0XHRcdFx0aG9yaXpvbnRhbEFsaWduOiBtYW5pZmVzdENvbHVtbj8uaG9yaXpvbnRhbEFsaWduLFxuXHRcdFx0XHRhdmFpbGFiaWxpdHk6IG1hbmlmZXN0Q29sdW1uPy5hdmFpbGFiaWxpdHksXG5cdFx0XHRcdHR5cGU6IENvbHVtblR5cGUuQW5ub3RhdGlvbixcblx0XHRcdFx0aXNOYXZpZ2FibGU6IHVuZGVmaW5lZCxcblx0XHRcdFx0c2V0dGluZ3M6IG1hbmlmZXN0Q29sdW1uLnNldHRpbmdzLFxuXHRcdFx0XHRmb3JtYXRPcHRpb25zOiBfZ2V0RGVmYXVsdEZvcm1hdE9wdGlvbnNGb3JUYWJsZShtYW5pZmVzdENvbHVtbi5mb3JtYXRPcHRpb25zKSxcblx0XHRcdFx0ZXhwb3J0U2V0dGluZ3M6IGdldEN1c3RvbUV4cG9ydFNldHRpbmdzKFxuXHRcdFx0XHRcdG1hbmlmZXN0Q29sdW1uPy5leHBvcnRTZXR0aW5ncyxcblx0XHRcdFx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdGVudGl0eVR5cGUsXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdGtleVxuXHRcdFx0XHQpXG5cdFx0XHR9O1xuXHRcdFx0aW50ZXJuYWxDb2x1bW5zW2tleV0gPSBwcm9wZXJ0aWVzVG9PdmVyd3JpdGVBbm5vdGF0aW9uQ29sdW1uO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eUluZm9zOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCA9IF9nZXRQcm9wZXJ0eU5hbWVzKFxuXHRcdFx0XHRtYW5pZmVzdENvbHVtbi5wcm9wZXJ0aWVzLFxuXHRcdFx0XHRhbm5vdGF0aW9uQ29sdW1ucyxcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0ZW50aXR5VHlwZVxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHRvb2x0aXBUZXh0ID0gY29udmVydGVyQ29udGV4dC5mZXRjaFRleHRGcm9tTWV0YU1vZGVsKG1hbmlmZXN0Q29sdW1uLnRvb2x0aXApLFxuXHRcdFx0XHRoZWFkZXJUZXh0ID0gY29udmVydGVyQ29udGV4dC5mZXRjaFRleHRGcm9tTWV0YU1vZGVsKG1hbmlmZXN0Q29sdW1uLmhlYWRlcik7XG5cblx0XHRcdGNvbnN0IGN1c3RvbUNvbHVtbkV4cG9ydFNldHRpbmdzOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyB8IG51bGwgPSBwcm9wZXJ0eUluZm9zXG5cdFx0XHRcdD8gZ2V0Q3VzdG9tRXhwb3J0U2V0dGluZ3MobWFuaWZlc3RDb2x1bW4/LmV4cG9ydFNldHRpbmdzLCBhbm5vdGF0aW9uQ29sdW1ucywgY29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZSwgcHJvcGVydHlJbmZvcylcblx0XHRcdFx0OiBudWxsO1xuXHRcdFx0Y29uc3QgYmFzZU1hbmlmZXN0Q29sdW1uID0ge1xuXHRcdFx0XHQuLi5iYXNlVGFibGVDb2x1bW4sXG5cdFx0XHRcdGhlYWRlcjogaGVhZGVyVGV4dCxcblx0XHRcdFx0aW1wb3J0YW5jZTogbWFuaWZlc3RDb2x1bW4/LmltcG9ydGFuY2UgfHwgSW1wb3J0YW5jZS5Ob25lLFxuXHRcdFx0XHRob3Jpem9udGFsQWxpZ246IG1hbmlmZXN0Q29sdW1uPy5ob3Jpem9udGFsQWxpZ24gfHwgSG9yaXpvbnRhbEFsaWduLkJlZ2luLFxuXHRcdFx0XHRhdmFpbGFiaWxpdHk6IG1hbmlmZXN0Q29sdW1uPy5hdmFpbGFiaWxpdHkgfHwgXCJEZWZhdWx0XCIsXG5cdFx0XHRcdHRlbXBsYXRlOiBtYW5pZmVzdENvbHVtbi50ZW1wbGF0ZSxcblx0XHRcdFx0cHJvcGVydHlJbmZvczogcHJvcGVydHlJbmZvcyxcblx0XHRcdFx0ZXhwb3J0U2V0dGluZ3M6IGN1c3RvbUNvbHVtbkV4cG9ydFNldHRpbmdzLFxuXHRcdFx0XHRpZDogYEN1c3RvbUNvbHVtbjo6JHtrZXl9YCxcblx0XHRcdFx0bmFtZTogYEN1c3RvbUNvbHVtbjo6JHtrZXl9YCxcblx0XHRcdFx0Ly9OZWVkZWQgZm9yIE1EQzpcblx0XHRcdFx0Zm9ybWF0T3B0aW9uczogeyB0ZXh0TGluZXNFZGl0OiA0IH0sXG5cdFx0XHRcdGlzR3JvdXBhYmxlOiBmYWxzZSxcblx0XHRcdFx0aXNOYXZpZ2FibGU6IGZhbHNlLFxuXHRcdFx0XHRzb3J0YWJsZTogZmFsc2UsXG5cdFx0XHRcdHZpc3VhbFNldHRpbmdzOiB7IHdpZHRoQ2FsY3VsYXRpb246IG51bGwgfSxcblx0XHRcdFx0dG9vbHRpcDogdG9vbHRpcFRleHQgPyB0b29sdGlwVGV4dCA6IGhlYWRlclRleHQsXG5cdFx0XHRcdHByb3BlcnRpZXM6IG1hbmlmZXN0Q29sdW1uLnByb3BlcnRpZXMsXG5cdFx0XHRcdHJlcXVpcmVkOlxuXHRcdFx0XHRcdG1hbmlmZXN0Q29sdW1uLnJlcXVpcmVkICYmXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSAhPT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQgJiZcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlXG5cdFx0XHRcdFx0XHQ/IGNvbXBpbGVFeHByZXNzaW9uKFVJLklzRWRpdGFibGUpXG5cdFx0XHRcdFx0XHQ6IHVuZGVmaW5lZFxuXHRcdFx0fTtcblx0XHRcdGlmIChwcm9wZXJ0eUluZm9zKSB7XG5cdFx0XHRcdF91cGRhdGVMaW5rZWRQcm9wZXJ0aWVzT25DdXN0b21Db2x1bW5zKHByb3BlcnR5SW5mb3MsIGFubm90YXRpb25Db2x1bW5zKTtcblx0XHRcdH1cblx0XHRcdGlmIChpc1Nsb3RDb2x1bW4obWFuaWZlc3RDb2x1bW4pKSB7XG5cdFx0XHRcdGNvbnN0IGN1c3RvbVRhYmxlQ29sdW1uOiBDdXN0b21FbGVtZW50PEN1c3RvbUJhc2VkVGFibGVDb2x1bW4+ID0ge1xuXHRcdFx0XHRcdC4uLmJhc2VNYW5pZmVzdENvbHVtbixcblx0XHRcdFx0XHR0eXBlOiBDb2x1bW5UeXBlLlNsb3Rcblx0XHRcdFx0fTtcblx0XHRcdFx0aW50ZXJuYWxDb2x1bW5zW2tleV0gPSBjdXN0b21UYWJsZUNvbHVtbjtcblx0XHRcdH0gZWxzZSBpZiAoaXNDdXN0b21Db2x1bW4obWFuaWZlc3RDb2x1bW4pKSB7XG5cdFx0XHRcdGNvbnN0IGN1c3RvbVRhYmxlQ29sdW1uOiBDdXN0b21FbGVtZW50PEN1c3RvbUJhc2VkVGFibGVDb2x1bW4+ID0ge1xuXHRcdFx0XHRcdC4uLmJhc2VNYW5pZmVzdENvbHVtbixcblx0XHRcdFx0XHR0eXBlOiBDb2x1bW5UeXBlLkRlZmF1bHRcblx0XHRcdFx0fTtcblx0XHRcdFx0aW50ZXJuYWxDb2x1bW5zW2tleV0gPSBjdXN0b21UYWJsZUNvbHVtbjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBgVGhlIGFubm90YXRpb24gY29sdW1uICcke2tleX0nIHJlZmVyZW5jZWQgaW4gdGhlIG1hbmlmZXN0IGlzIG5vdCBmb3VuZGA7XG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdFx0XHQuZ2V0RGlhZ25vc3RpY3MoKVxuXHRcdFx0XHRcdC5hZGRJc3N1ZShcblx0XHRcdFx0XHRcdElzc3VlQ2F0ZWdvcnkuTWFuaWZlc3QsXG5cdFx0XHRcdFx0XHRJc3N1ZVNldmVyaXR5Lkxvdyxcblx0XHRcdFx0XHRcdG1lc3NhZ2UsXG5cdFx0XHRcdFx0XHRJc3N1ZUNhdGVnb3J5VHlwZSxcblx0XHRcdFx0XHRcdElzc3VlQ2F0ZWdvcnlUeXBlPy5Bbm5vdGF0aW9uQ29sdW1ucz8uSW52YWxpZEtleVxuXHRcdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBpbnRlcm5hbENvbHVtbnM7XG59O1xuXG4vKipcbiAqIEFkZHMgY29tcHV0ZWQgY29sdW1ucyBzdWNoIGFzIHRoZSBkcmFmdCBzdGF0dXMgYW5kIHNpdHVhdGlvbnMgc3RhdHVzLlxuICogQHBhcmFtIHRhYmxlQ29sdW1ucyBUaGUgdGFibGUgY29sdW1ucyBjb2xsZWN0ZWQgc28gZmFyXG4gKiBAcGFyYW0gdGFibGVUeXBlIFRoZSB0YWJsZSB0eXBlXG4gKiBAcGFyYW0gdmlzdWFsaXphdGlvblBhdGhcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgZW5yaWNoZWQgc2V0IG9mIHRhYmxlIGNvbHVtbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZENvbXB1dGVkQ29sdW1ucyhcblx0dGFibGVDb2x1bW5zOiBUYWJsZUNvbHVtbltdLFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0dmlzdWFsaXphdGlvblBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+XG4pOiBUYWJsZUNvbHVtbltdIHtcblx0aWYgKCFbXCJHcmlkVGFibGVcIiwgXCJUcmVlVGFibGVcIiwgXCJBbmFseXRpY2FsVGFibGVcIl0uaW5jbHVkZXModGFibGVUeXBlKSkge1xuXHRcdC8vIENvbXB1dGVkIGNvbHVtbnMgYXJlIG5vdCB1c2VkIGluIFJlc3BvbnNpdmUgdGFibGVzXG5cdFx0cmV0dXJuIHRhYmxlQ29sdW1ucztcblx0fVxuXG5cdC8vIEluIGNhc2UgYSBncmlkIHRhYmxlIG9yIHRyZWUgdGFibGUgaXMgdXNlZCwgd2UgZGlzcGxheSB0aGUgc2l0dWF0aW9ucyBpbmRpY2F0b3IgaW4gYSBzZXBhcmF0ZSBjb2x1bW5cblx0Ly8gc28gd2UgaGF2ZSB0byBkaXNhYmxlIGl0IGhlcmUgdG8gZW5zdXJlLCB0aGF0IHRoZSBmaWVsZCBidWlsZGluZyBibG9ja1xuXHQvLyBkb2VzIG5vdCByZW5kZXIgaXQgaW50byB0aGUgSUQgY29sdW1uXG5cdGNvbnN0IGNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yOiBUYWJsZUNvbHVtbiB8IHVuZGVmaW5lZCA9IHRhYmxlQ29sdW1ucy5maW5kKFxuXHRcdChjb2x1bW4pID0+IGNvbHVtbi5mb3JtYXRPcHRpb25zPy5oYXNTaXR1YXRpb25zSW5kaWNhdG9yICE9PSB1bmRlZmluZWQgJiYgY29sdW1uLmZvcm1hdE9wdGlvbnM/Lmhhc1NpdHVhdGlvbnNJbmRpY2F0b3IgPT09IHRydWVcblx0KTtcblx0aWYgKGNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yPy5mb3JtYXRPcHRpb25zKSB7XG5cdFx0Ly8gU3dpdGNoIG9mZiB0aGUgc2l0dWF0aW9ucyBpbmRpY2F0b3IgaW4gdGhlIGZvdW5kIGNvbHVtblxuXHRcdGNvbHVtbldpdGhTaXR1YXRpb25zSW5kaWNhdG9yLmZvcm1hdE9wdGlvbnMuaGFzU2l0dWF0aW9uc0luZGljYXRvciA9IGZhbHNlO1xuXG5cdFx0Ly8gSW5zZXJ0IGEgc2VwYXJhdGUgc2l0dWF0aW9ucyBpbmRpY2F0b3IgY29sdW1uXG5cdFx0Y29uc3Qgc2l0dWF0aW9uc0luZGljYXRvckNvbHVtbjogQ29tcHV0ZWRUYWJsZUNvbHVtbiA9IHtcblx0XHRcdGtleTogXCJzaXR1YXRpb25zSW5kaWNhdG9yXCIsXG5cdFx0XHRuYW1lOiBcInNpdHVhdGlvbnNJbmRpY2F0b3JcIixcblx0XHRcdHByb3BlcnR5S2V5OiBjb2x1bW5XaXRoU2l0dWF0aW9uc0luZGljYXRvci5uYW1lLFxuXHRcdFx0aXNTaXR1YXRpb25zSW5kaWNhdG9yOiB0cnVlLFxuXHRcdFx0YXZhaWxhYmlsaXR5OiBcIkRlZmF1bHRcIixcblx0XHRcdGxhYmVsOiBcIntzYXAuZmUuaTE4bj5DX1NJVFVBVElPTlNfU1RBVFVTX0NPTFVNTl9MQUJFTF9UT09MVElQfVwiLFxuXHRcdFx0dG9vbHRpcDogXCJ7c2FwLmZlLmkxOG4+Q19TSVRVQVRJT05TX1NUQVRVU19DT0xVTU5fTEFCRUxfVE9PTFRJUH1cIixcblx0XHRcdHR5cGU6IENvbHVtblR5cGUuQ29tcHV0ZWQsXG5cdFx0XHRmb3JtYXRPcHRpb25zOiBudWxsLFxuXHRcdFx0ZXhwb3J0U2V0dGluZ3M6IG51bGwsXG5cdFx0XHRjbGlwYm9hcmRTZXR0aW5nczogbnVsbCxcblx0XHRcdHByb3BlcnR5SW5mb3M6IHVuZGVmaW5lZCxcblx0XHRcdGNhc2VTZW5zaXRpdmU6IGZhbHNlXG5cdFx0fTtcblxuXHRcdC8vIFBsYWNlIHRoZSBkcmFmdCBzdGF0dXMgY29sdW1uIGFmdGVyIHRoZSBmaXJzdCB2aXNpYmxlIGNvbHVtblxuXHRcdGNvbnN0IGluZGV4T2ZGaXJzdFZpc2libGVDb2x1bW46IGludCA9IHRhYmxlQ29sdW1ucy5maW5kSW5kZXgoKGNvbHVtbikgPT4gY29sdW1uLmF2YWlsYWJpbGl0eSAhPT0gXCJIaWRkZW5cIik7XG5cdFx0dGFibGVDb2x1bW5zLnNwbGljZShpbmRleE9mRmlyc3RWaXNpYmxlQ29sdW1uICsgMSwgMCwgc2l0dWF0aW9uc0luZGljYXRvckNvbHVtbik7XG5cdH1cblxuXHQvLyBJbiBjYXNlIGEgZ3JpZCB0YWJsZSBvciB0cmVlIHRhYmxlIGlzIHVzZWQsIHdlIGRpc3BsYXkgdGhlIGRyYWZ0IGluZGljYXRvciBpbiBhIHNlcGFyYXRlIGNvbHVtblxuXHQvLyBzbyB3ZSBoYXZlIHRvIGRpc2FibGUgaXQgaGVyZSB0byBlbnN1cmUsIHRoYXQgdGhlIGZpZWxkIGJ1aWxkaW5nIGJsb2NrXG5cdC8vIGRvZXMgbm90IHJlbmRlciBpdCBpbnRvIHRoZSBJRCBjb2x1bW5cblx0Ly8gVGhlIGFkZGl0aW9uYWwgY29sdW1uIGlzIG9ubHkgYWRkZWQgZm9yIHRhYmxlcyBvbiBhIExSIGFuZCBpbiBjYXNlIHRlaGUgZW50aXR5IGlzIGRyYWZ0IGVuYWJsZWQhXG5cdGNvbnN0IGNvbHVtbnNXaXRoRHJhZnRJbmRpY2F0b3I6IFRhYmxlQ29sdW1uW10gPSB0YWJsZUNvbHVtbnMuZmlsdGVyKChjb2x1bW4pID0+IGNvbHVtbi5mb3JtYXRPcHRpb25zPy5oYXNEcmFmdEluZGljYXRvciA9PT0gdHJ1ZSk7XG5cdGlmIChcblx0XHRjb2x1bW5zV2l0aERyYWZ0SW5kaWNhdG9yLmxlbmd0aCAmJlxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0ICYmXG5cdFx0KE1vZGVsSGVscGVyLmlzRHJhZnROb2RlKGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkpIHx8IE1vZGVsSGVscGVyLmlzRHJhZnRSb290KGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkpKVxuXHQpIHtcblx0XHQvLyBTd2l0Y2ggb2ZmIHRoZSBkcmFmdCBpbmRpY2F0b3IgaW4gdGhlIGZvdW5kIGNvbHVtblxuXHRcdGNvbHVtbnNXaXRoRHJhZnRJbmRpY2F0b3IuZm9yRWFjaCgoY29sdW1uV2l0aERyYWZ0SW5kaWNhdG9yOiBUYWJsZUNvbHVtbikgPT4ge1xuXHRcdFx0aWYgKGNvbHVtbldpdGhEcmFmdEluZGljYXRvcj8uZm9ybWF0T3B0aW9ucykge1xuXHRcdFx0XHRjb2x1bW5XaXRoRHJhZnRJbmRpY2F0b3IuZm9ybWF0T3B0aW9ucy5oYXNEcmFmdEluZGljYXRvciA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gSW5zZXJ0IGEgc2VwYXJhdGUgZHJhZnQgaW5kaWNhdG9yIGNvbHVtblxuXHRcdGNvbnN0IGRyYWZ0SW5kaWNhdG9yQ29sdW1uOiBDb21wdXRlZFRhYmxlQ29sdW1uID0ge1xuXHRcdFx0a2V5OiBcImRyYWZ0U3RhdHVzXCIsXG5cdFx0XHRuYW1lOiBcImRyYWZ0U3RhdHVzXCIsXG5cdFx0XHRwcm9wZXJ0eUtleTogY29sdW1uc1dpdGhEcmFmdEluZGljYXRvclswXS5uYW1lLFxuXHRcdFx0aXNEcmFmdEluZGljYXRvcjogdHJ1ZSxcblx0XHRcdGF2YWlsYWJpbGl0eTogXCJEZWZhdWx0XCIsXG5cdFx0XHRsYWJlbDogXCJ7c2FwLmZlLmkxOG4+Q19EUkFGVF9TVEFUVVNfQ09MVU1OX0xBQkVMX1RPT0xUSVB9XCIsXG5cdFx0XHR0b29sdGlwOiBcIntzYXAuZmUuaTE4bj5DX0RSQUZUX1NUQVRVU19DT0xVTU5fTEFCRUxfVE9PTFRJUH1cIixcblx0XHRcdHR5cGU6IENvbHVtblR5cGUuQ29tcHV0ZWQsXG5cdFx0XHRmb3JtYXRPcHRpb25zOiBudWxsLFxuXHRcdFx0ZXhwb3J0U2V0dGluZ3M6IG51bGwsXG5cdFx0XHRjYXNlU2Vuc2l0aXZlOiBmYWxzZVxuXHRcdH07XG5cdFx0bGV0IGNvbHVtbkluZGV4VG9JbnNlcnRBZnRlcjogaW50ID0gMDtcblx0XHRpZiAoY29sdW1uV2l0aFNpdHVhdGlvbnNJbmRpY2F0b3IpIHtcblx0XHRcdC8vIElmIHRoZXJlJ3MgYSBzaXR1YXRpb25zIGluZGljYXRvciBjb2x1bW4sIHBsYWNlIHRoZSBkcmFmdCBzdGF0dXMgY29sdW1uIGJlZm9yZSBpdFxuXHRcdFx0Y29sdW1uSW5kZXhUb0luc2VydEFmdGVyID1cblx0XHRcdFx0dGFibGVDb2x1bW5zLmZpbmRJbmRleCgoY29sdW1uKSA9PiAoY29sdW1uIGFzIENvbXB1dGVkVGFibGVDb2x1bW4pLmlzU2l0dWF0aW9uc0luZGljYXRvciA9PT0gdHJ1ZSkgLSAxO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBPdGhlcndpc2UgcGxhY2UgdGhlIGRyYWZ0IHN0YXR1cyBjb2x1bW4gYWZ0ZXIgdGhlIGZpcnN0IHZpc2libGUgY29sdW1uXG5cdFx0XHRjb2x1bW5JbmRleFRvSW5zZXJ0QWZ0ZXIgPSB0YWJsZUNvbHVtbnMuZmluZEluZGV4KChjb2x1bW4pID0+IGNvbHVtbi5hdmFpbGFiaWxpdHkgIT09IFwiSGlkZGVuXCIpO1xuXHRcdH1cblx0XHR0YWJsZUNvbHVtbnMuc3BsaWNlKGNvbHVtbkluZGV4VG9JbnNlcnRBZnRlciArIDEsIDAsIGRyYWZ0SW5kaWNhdG9yQ29sdW1uKTtcblx0fVxuXG5cdHJldHVybiB0YWJsZUNvbHVtbnM7XG59XG5cbi8qKlxuICogUHJvdmlkZXMgdGhlIHJlcXVpcmVkIHByb3BlcnRpZXMgc2V0IG9uIHRoZSBhbm5vdGF0aW9ucy5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0ICBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgcGF0aHMgb2YgdGhlIHJlc3RyaWN0ZWQgcHJvcGVydGllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pik6IFByb3BlcnR5UGF0aFtdIHtcblx0cmV0dXJuIGdldENvbnRleHRQcm9wZXJ0eVJlc3RyaWN0aW9uKFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLFxuXHRcdChjYXBhYmlsaXRpZXMpID0+IHtcblx0XHRcdHJldHVybiAoY2FwYWJpbGl0aWVzIGFzIEVudGl0eVNldEFubm90YXRpb25zX0NhcGFiaWxpdGllcyB8IHVuZGVmaW5lZCk/Lkluc2VydFJlc3RyaWN0aW9ucz8uUmVxdWlyZWRQcm9wZXJ0aWVzO1xuXHRcdH0sXG5cdFx0ZmFsc2Vcblx0KTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBwcm9wZXJ0eSBpcyBhbm5vdGF0ZWQgYXMgYSByZXF1aXJlZCBwcm9wZXJ0eS5cbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eVxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGluc3RhbmNlIG9mIHRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgcmVxdWlyZWRcbiAqL1xuZnVuY3Rpb24gaXNBbm5vdGF0ZWRSZXF1aXJlZFByb3BlcnR5KG5hbWU6IHN0cmluZywgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KTogYm9vbGVhbiB7XG5cdHJldHVybiBnZXRSZXF1aXJlZFByb3BlcnRpZXMoY29udmVydGVyQ29udGV4dClcblx0XHQubWFwKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkuJHRhcmdldD8uZnVsbHlRdWFsaWZpZWROYW1lKVxuXHRcdC5pbmNsdWRlcyhuYW1lKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBkYXRhIHR5cGUgb2YgYSBjb2x1bW4gZm9yIHRoZSBleHBvcnQuXG4gKiBAcGFyYW0gZGF0YVR5cGUgVGhlIGRhdGEgdHlwZSBvZiBhIHByb3BlcnR5LCBjb2x1bW5cbiAqIEBwYXJhbSBpc0FUaW1lem9uZSBJcyB0aGUgZ2l2ZW4gcHJvcGVydHkgYSB0aW1lem9uZVxuICogQHBhcmFtIGlzQ3VycmVuY3kgSXMgdGhlIGdpdmVuIHByb3BlcnR5IGEgY3VycmVuY3lcbiAqIEBwYXJhbSBleHBvcnRTZXR0aW5ncyBUaGUgYWxyZWFkeSBkZXRlY3RlZCBleHBvcnQgc2V0dGluZ3MgZnJvbSBkYXRhZmllbGRzXG4gKiBAcmV0dXJucyBUaGUgc3VwcG9ydGVkIGV4cG9ydCB0eXBlXG4gKi9cbmZ1bmN0aW9uIGdldEV4cG9ydERhdGFUeXBlKFxuXHRkYXRhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRpc0FUaW1lem9uZSA9IGZhbHNlLFxuXHRpc0N1cnJlbmN5ID0gZmFsc2UsXG5cdGV4cG9ydFNldHRpbmdzPzogQ29sdW1uRXhwb3J0U2V0dGluZ3Ncbik6IHN0cmluZyB7XG5cdGxldCBleHBvcnREYXRhVHlwZSA9IFwiU3RyaW5nXCI7XG5cdGlmICghZGF0YVR5cGUgfHwgZXhwb3J0U2V0dGluZ3M/LmRhdGFQb2ludFRhcmdldFZhbHVlKSB7XG5cdFx0cmV0dXJuIGV4cG9ydERhdGFUeXBlO1xuXHR9XG5cdGlmIChleHBvcnRTZXR0aW5ncz8uaXNDdXJyZW5jeSB8fCBpc0N1cnJlbmN5KSB7XG5cdFx0cmV0dXJuIFwiQ3VycmVuY3lcIjtcblx0fVxuXHRpZiAoaXNBVGltZXpvbmUpIHtcblx0XHRyZXR1cm4gXCJUaW1lem9uZVwiO1xuXHR9XG5cdGlmIChleHBvcnRTZXR0aW5ncz8ud3JhcCkge1xuXHRcdHJldHVybiBleHBvcnREYXRhVHlwZTtcblx0fVxuXHRzd2l0Y2ggKGRhdGFUeXBlKSB7XG5cdFx0Y2FzZSBcIkVkbS5EZWNpbWFsXCI6XG5cdFx0Y2FzZSBcIkVkbS5JbnQzMlwiOlxuXHRcdGNhc2UgXCJFZG0uSW50NjRcIjpcblx0XHRjYXNlIFwiRWRtLkRvdWJsZVwiOlxuXHRcdGNhc2UgXCJFZG0uQnl0ZVwiOlxuXHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIk51bWJlclwiO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkVkbS5EYXRlT2ZUaW1lXCI6XG5cdFx0Y2FzZSBcIkVkbS5EYXRlXCI6XG5cdFx0XHRleHBvcnREYXRhVHlwZSA9IFwiRGF0ZVwiO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSBcIkVkbS5EYXRlVGltZU9mZnNldFwiOlxuXHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIkRhdGVUaW1lXCI7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiRWRtLlRpbWVPZkRheVwiOlxuXHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIlRpbWVcIjtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJFZG0uQm9vbGVhblwiOlxuXHRcdFx0ZXhwb3J0RGF0YVR5cGUgPSBcIkJvb2xlYW5cIjtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRleHBvcnREYXRhVHlwZSA9IFwiU3RyaW5nXCI7XG5cdH1cblx0cmV0dXJuIGV4cG9ydERhdGFUeXBlO1xufVxuXG4vKipcbiAqIEFkZHMgdGhlIHRvb2x0aXAgY29uZmlndXJhdGlvbiBmb3IgYSBnaXZlbiBjb2x1bW4uXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHJlZmVyZW5jZWQgb24gdGhlIGNvbHVtblxuICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIHRvIGJlIHVwZGF0ZWRcbiAqL1xuZnVuY3Rpb24gX2FkZFRvb2xUaXAocHJvcGVydHk6IFByb3BlcnR5LCBjb2x1bW46IEFubm90YXRpb25UYWJsZUNvbHVtbik6IHZvaWQge1xuXHRjb25zdCB0b29sdGlwID0gX2dldFRvb2x0aXAocHJvcGVydHkpID8/IGNvbHVtbi5sYWJlbDtcblx0aWYgKHRvb2x0aXApIHtcblx0XHRjb2x1bW4udG9vbHRpcCA9IHRvb2x0aXA7XG5cdH1cbn1cblxuZnVuY3Rpb24gX2dldENvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscyhcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmcsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PlxuKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuXHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydGllcyA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoKGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLCByZWxhdGl2ZVBhdGgpLm5hdmlnYXRpb25Qcm9wZXJ0aWVzO1xuXHRpZiAobmF2aWdhdGlvblByb3BlcnRpZXM/Lmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBjb2xsZWN0ZWROYXZpZ2F0aW9uUHJvcGVydHlMYWJlbHM6IHN0cmluZ1tdID0gW107XG5cdFx0bmF2aWdhdGlvblByb3BlcnRpZXMuZm9yRWFjaCgobmF2UHJvcGVydHkpID0+IHtcblx0XHRcdGNvbGxlY3RlZE5hdmlnYXRpb25Qcm9wZXJ0eUxhYmVscy5wdXNoKGdldExhYmVsKG5hdlByb3BlcnR5KSB8fCBuYXZQcm9wZXJ0eS5uYW1lKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gY29sbGVjdGVkTmF2aWdhdGlvblByb3BlcnR5TGFiZWxzO1xuXHR9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHByb3BlcnR5IHVzaW5nIHRoZSB0ZXh0IGFycmFuZ2VtZW50IGFubm90YXRpb24gc2V0IHRvIHRleHQgb25seS5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEBwYXJhbSBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggVGhlIGNvcnJlc3BvbmRpbmcgRGF0YU1vZGVsT2JqZWN0UGF0aC5cbiAqIEBwYXJhbSBsaW5lSXRlbSBUaGUgY29sdW1uIHRvIGJlIGV2YWx1YXRlZC5cbiAqIEBwYXJhbSBjb2x1bW5zVG9CZUNyZWF0ZWQgVGhlIGxpc3Qgb2YgY29sdW1ucyB0byBiZSBjcmVhdGVkLlxuICogQHBhcmFtIHJlbGF0aXZlUGF0aCBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgdGFyZ2V0IHByb3BlcnR5IGJhc2VkIG9uIHRoZSBjb250ZXh0LlxuICogQHBhcmFtIHJlc3RyaWN0aW9uc09uUHJvcGVydGllcyBUaGUgZXhpc3RpbmcgcmVzdHJpY3Rpb25zIG9uIHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gY3JlYXRlUHJvcGVydHlBbm5vdGF0ZWRUZXh0T25seShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8RGF0YUZpZWxkQWJzdHJhY3RUeXBlcz4sXG5cdGxpbmVJdGVtOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHRjb2x1bW5zVG9CZUNyZWF0ZWQ6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5Pixcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmcsXG5cdHJlc3RyaWN0aW9uc09uUHJvcGVydGllczogUmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzXG4pOiB2b2lkIHtcblx0Y29uc3QgaXNQcm9wZXJ0eU5hdmlnYXRlZCA9XG5cdFx0cHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aCAhPT0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkubmF2aWdhdGlvblByb3BlcnRpZXMubGVuZ3RoO1xuXHRpZiAoaXNQcm9wZXJ0eU5hdmlnYXRlZCAmJiBpc0RhdGFGaWVsZChsaW5lSXRlbSkpIHtcblx0XHRjb2x1bW5zVG9CZUNyZWF0ZWRbcmVsYXRpdmVQYXRoXSA9IGxpbmVJdGVtLlZhbHVlLiR0YXJnZXQ7XG5cdFx0cmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzLm5vblNvcnRhYmxlUHJvcGVydGllcy5wdXNoKHJlbGF0aXZlUGF0aCk7XG5cdH0gZWxzZSBpZiAoaXNEYXRhRmllbGRGb3JBbm5vdGF0aW9uKGxpbmVJdGVtKSAmJiBoYXNGaWVsZEdyb3VwVGFyZ2V0KGxpbmVJdGVtKSkge1xuXHRcdChsaW5lSXRlbS5UYXJnZXQuJHRhcmdldCBhcyBGaWVsZEdyb3VwKS5EYXRhLmZvckVhY2goKGZpZWxkKSA9PiB7XG5cdFx0XHRpZiAoaXNEYXRhRmllbGQoZmllbGQpICYmIGdldERpc3BsYXlNb2RlKGZpZWxkLlZhbHVlLiR0YXJnZXQpID09PSBcIkRlc2NyaXB0aW9uXCIpIHtcblx0XHRcdFx0Y29uc3QgaW5oZXJlZFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoKFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLFxuXHRcdFx0XHRcdGZpZWxkLlZhbHVlLnBhdGhcblx0XHRcdFx0KTtcblx0XHRcdFx0Y29uc3QgaXNJbmhlcmVkUHJvcGVydHlOYXZpZ2F0ZWQgPVxuXHRcdFx0XHRcdGluaGVyZWRQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMubGVuZ3RoICE9PVxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aDtcblx0XHRcdFx0aWYgKGlzSW5oZXJlZFByb3BlcnR5TmF2aWdhdGVkKSB7XG5cdFx0XHRcdFx0Y29sdW1uc1RvQmVDcmVhdGVkW2ZpZWxkLlZhbHVlLnBhdGhdID0gZmllbGQuVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0XHRyZXN0cmljdGlvbnNPblByb3BlcnRpZXMubm9uU29ydGFibGVQcm9wZXJ0aWVzLnB1c2goZmllbGQuVmFsdWUucGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgcHJvcGVydHkgdHlwZSBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwcm9wZXJ0eSBvciBkYXRhIHR5cGUuXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IG9yIGRhdGEgZmllbGQgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIGNvbmZpZ3VyYXRpb24gZm9yLlxuICogQHBhcmFtIGRhdGFUeXBlIFRoZSBkYXRhIHR5cGUgdG8gdXNlIGZvciB0eXBlIGNvbmZpZ3VyYXRpb24gaWYgbm90IGRldGVybWluZWQgZnJvbSB0aGUgcHJvcGVydHkuXG4gKiBAcmV0dXJucyBUaGUgcHJvcGVydHkgdHlwZSBjb25maWd1cmF0aW9uIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVDb25maWcocHJvcGVydHk6IFByb3BlcnR5IHwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IHVuZGVmaW5lZCwgZGF0YVR5cGU/OiBzdHJpbmcpOiBQcm9wZXJ0eVR5cGVDb25maWcge1xuXHRsZXQgdGFyZ2V0TWFwcGluZyxcblx0XHRmb3JtYXRPcHRpb25zOiBQcm9wZXJ0eVR5cGVGb3JtYXRPcHRpb25zIHwgdW5kZWZpbmVkID0ge307XG5cdGlmIChpc1Byb3BlcnR5KHByb3BlcnR5KSkge1xuXHRcdHRhcmdldE1hcHBpbmcgPSBpc1R5cGVEZWZpbml0aW9uKHByb3BlcnR5LnRhcmdldFR5cGUpXG5cdFx0XHQ/IEVETV9UWVBFX01BUFBJTkdbcHJvcGVydHkudGFyZ2V0VHlwZS51bmRlcmx5aW5nVHlwZV1cblx0XHRcdDogRURNX1RZUEVfTUFQUElOR1twcm9wZXJ0eS50eXBlXTtcblx0fVxuXHRpZiAoIXRhcmdldE1hcHBpbmcgJiYgZGF0YVR5cGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHRhcmdldE1hcHBpbmcgPSBFRE1fVFlQRV9NQVBQSU5HW2RhdGFUeXBlXTtcblx0fVxuXHRjb25zdCBwcm9wZXJ0eVR5cGVDb25maWc6IFByb3BlcnR5VHlwZUNvbmZpZyA9IHtcblx0XHR0eXBlOiB0YXJnZXRNYXBwaW5nPy50eXBlXG5cdH07XG5cdGlmICh0YXJnZXRNYXBwaW5nICYmIGlzUHJvcGVydHkocHJvcGVydHkpKSB7XG5cdFx0Y29uc3QgY29uc3RyYWludHMgPSBzZXRVcENvbnN0cmFpbnRzKHRhcmdldE1hcHBpbmcsIHByb3BlcnR5KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoY29uc3RyYWludHMpLmxlbmd0aCkge1xuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnLmNvbnN0cmFpbnRzID0gY29uc3RyYWludHM7XG5cdFx0fVxuXHR9XG5cdGlmIChwcm9wZXJ0eVR5cGVDb25maWcudHlwZSAhPT0gXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5TdHJlYW1cIikge1xuXHRcdGlmIChcblx0XHRcdHByb3BlcnR5VHlwZUNvbmZpZz8udHlwZT8uaW5kZXhPZihcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkludFwiKSA9PT0gMCB8fFxuXHRcdFx0cHJvcGVydHlUeXBlQ29uZmlnPy50eXBlPy5pbmRleE9mKFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuRG91YmxlXCIpID09PSAwXG5cdFx0KSB7XG5cdFx0XHRmb3JtYXRPcHRpb25zID0geyBwYXJzZUFzU3RyaW5nOiBmYWxzZSwgZW1wdHlTdHJpbmc6IFwiXCIgfTtcblx0XHR9XG5cdFx0aWYgKHByb3BlcnR5VHlwZUNvbmZpZy50eXBlID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmluZ1wiICYmIHByb3BlcnR5VHlwZUNvbmZpZy5jb25zdHJhaW50cz8ubnVsbGFibGUgPT09IGZhbHNlKSB7XG5cdFx0XHRmb3JtYXRPcHRpb25zID0geyBwYXJzZUtlZXBzRW1wdHlTdHJpbmc6IHRydWUgfTtcblx0XHR9XG5cdH1cblx0aWYgKE9iamVjdC5rZXlzKGZvcm1hdE9wdGlvbnMpLmxlbmd0aCkge1xuXHRcdHByb3BlcnR5VHlwZUNvbmZpZy5mb3JtYXRPcHRpb25zID0gZm9ybWF0T3B0aW9ucztcblx0fVxuXHRyZXR1cm4gcHJvcGVydHlUeXBlQ29uZmlnO1xufVxuXG4vKipcbiAqIEFkZCBhIGRlc2NyaXB0aW9uIHByb3BlcnR5IHRvIHRoZSBsaXN0IG9mIGRlc2NyaXB0aW9uIHByb3BlcnRpZXMgdXNlZCBieSB0aGUgY29sdW1ucyBvZiBhIHRhYmxlLlxuICogQHBhcmFtIGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAgVGhlIGxpc3Qgb2YgcHJvcGVydGllcyByZWZlcmVuY2VkIGFzIHRleHQgb24gYSB0ZXh0IGFycmFuZ2VtZW50IGFubm90YXRpb25cbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllc0luZm8gVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBsaW5rZWQgdG8gdGhlIGNvbHVtbiAobmFtZWQgYWxzbyBjb21wbGV4IHByb3BlcnR5KVxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0eU5hbWUgVGhlIHByb3BlcnR5IG5hbWUgdG8gYmUgYWRkZWRcbiAqL1xuZnVuY3Rpb24gYWRkUHJvcGVydHlUb0Rpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXAoXG5cdGRpc3BsYXlNb2RlT2ZEZXNjcmlwdGlvblByb3BlcnRpZXNNYXA6IFJlY29yZDxzdHJpbmcsIERpc3BsYXlNb2RlPixcblx0cmVsYXRlZFByb3BlcnRpZXNJbmZvOiBDb21wbGV4UHJvcGVydHlJbmZvLFxuXHRyZWxhdGVkUHJvcGVydHlOYW1lOiBzdHJpbmdcbik6IHZvaWQge1xuXHRpZiAoXG5cdFx0cmVsYXRlZFByb3BlcnRpZXNJbmZvLnByb3BlcnRpZXNbcmVsYXRlZFByb3BlcnR5TmFtZV0uZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24gJiZcblx0XHQhZGlzcGxheU1vZGVPZkRlc2NyaXB0aW9uUHJvcGVydGllc01hcFtyZWxhdGVkUHJvcGVydHlOYW1lXVxuXHQpIHtcblx0XHRkaXNwbGF5TW9kZU9mRGVzY3JpcHRpb25Qcm9wZXJ0aWVzTWFwW3JlbGF0ZWRQcm9wZXJ0eU5hbWVdID1cblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzSW5mby5wcm9wZXJ0aWVzW3JlbGF0ZWRQcm9wZXJ0eU5hbWVdLmRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uITtcblx0fVxufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSByZWZlcmVuY2VkIHByb3BlcnRpZXMgb2YgYSBMaW5lSXRlbSBpbiBjYXNlIHRoZSBMaW5lSXRlbSBpcyBhbm5vdGF0ZWQgYXMgaGlkZGVuLlxuICogQHBhcmFtIGV4aXN0aW5nQ29sdW1ucyBUaGUgbGlzdCBvZiBjb2x1bW5zIGNyZWF0ZWQgZnJvbSBMaW5lSXRlbXMgYW5kIGZyb20gcHJvcGVydGllcyBvZiBlbnRpdHlUeXBlXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgZXZhbHVhdGVkXG4gKiBAcGFyYW0gY29sdW1uIFRoZSBnaXZlbiBjb2x1bW4gZnJvbSBsaW5lSXRlbSBvciBwcm9wZXJ0eSBvZiBlbnRpdHlTZXRcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUhpZGRlbk9uUmVsYXRlZENvbHVtbnMoZXhpc3RpbmdDb2x1bW5zOiBBbm5vdGF0aW9uVGFibGVDb2x1bW5bXSwgbmFtZTogc3RyaW5nLCBjb2x1bW46IEFubm90YXRpb25UYWJsZUNvbHVtbik6IHZvaWQge1xuXHRjb25zdCByZWxhdGVkQW5ub3RhdGlvbkNvbHVtbnMgPSBleGlzdGluZ0NvbHVtbnMuZmlsdGVyKFxuXHRcdChleGlzdGluZ0NvbHVtbikgPT5cblx0XHRcdChleGlzdGluZ0NvbHVtbi5wcm9wZXJ0eUluZm9zPy5pbmNsdWRlcyhuYW1lKSAmJiBleGlzdGluZ0NvbHVtbi5pc1BhcnRPZkxpbmVJdGVtKSB8fFxuXHRcdFx0KGV4aXN0aW5nQ29sdW1uLmlzUGFydE9mTGluZUl0ZW0gJiYgZXhpc3RpbmdDb2x1bW4ucmVsYXRpdmVQYXRoID09PSBjb2x1bW4ucmVsYXRpdmVQYXRoKVxuXHQpO1xuXHRjb2x1bW4uaXNQYXJ0T2ZMaW5lSXRlbSA9ICEhcmVsYXRlZEFubm90YXRpb25Db2x1bW5zLmxlbmd0aDtcblx0aWYgKFxuXHRcdHJlbGF0ZWRBbm5vdGF0aW9uQ29sdW1ucy5sZW5ndGggJiZcblx0XHQhcmVsYXRlZEFubm90YXRpb25Db2x1bW5zPy5zb21lKChhbm5vdGF0aW9uQ29sdW1uKSA9PiBhbm5vdGF0aW9uQ29sdW1uLmF2YWlsYWJpbGl0eSAhPT0gXCJIaWRkZW5cIilcblx0KSB7XG5cdFx0Y29sdW1uLnNvcnRhYmxlID0gZmFsc2U7XG5cdFx0Y29sdW1uLmlzR3JvdXBhYmxlID0gZmFsc2U7XG5cdFx0Y29sdW1uLmZpbHRlcmFibGUgPSBmYWxzZTtcblx0fVxufVxuXG4vKipcbiAqIEdldHMgdGhlIGV4cG9ydCBzZXR0aW5ncyBwcm9wZXJ0aWVzIG9mIGEgbWFuaWZlc3QgY29sdW1uLlxuICogQHBhcmFtIGV4cG9ydFNldHRpbmdzIFRoZSBjdXN0b21pemVkL292ZXJ3cml0dGVuIGV4cG9ydCBzZXR0aW5ncyBvZiBhIG1hbmlmZXN0IGNvbHVtblxuICogQHBhcmFtIGFubm90YXRpb25Db2x1bW5zIFRoZSBsaXN0IG9mIGNvbHVtbnMgY3JlYXRlZCBmcm9tIExpbmVJdGVtc1xuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgdGFyZ2V0IGVudGl0eSB0eXBlXG4gKiBAcGFyYW0gcHJvcGVydHlJbmZvcyBUaGUgcHJvcGVydGllcyBsaW5rZWQgdG8gYSBjb21wbGV4IGNvbHVtblxuICogQHBhcmFtIGNvbHVtbktleSBUaGUgY29sdW1uIGtleSBvZiB0aGUgY29sdW1uIHRvIGJlIG92ZXJ3cml0dGVuXG4gKiBAcmV0dXJucyBUaGUgZXhwb3J0IHNldHRpbmdzIG9mIHRoZSBjb2x1bW4gbWVyZ2luZyBjdXN0b21pemVkIGV4cG9ydCBzZXR0aW5ncyB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlcyBkZXRlY3RlZCBvbiB0aGUgYW5ub3RhdGlvbiBjb2x1bW5cbiAqL1xuZnVuY3Rpb24gZ2V0Q3VzdG9tRXhwb3J0U2V0dGluZ3MoXG5cdGV4cG9ydFNldHRpbmdzOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyB8IHVuZGVmaW5lZCxcblx0YW5ub3RhdGlvbkNvbHVtbnM6IEFubm90YXRpb25UYWJsZUNvbHVtbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdHByb3BlcnR5SW5mb3M/OiBzdHJpbmdbXSxcblx0Y29sdW1uS2V5Pzogc3RyaW5nXG4pOiBDb2x1bW5FeHBvcnRTZXR0aW5ncyB8IG51bGwge1xuXHRsZXQgY29sdW1uRnJvbUFubm90YXRpb25zO1xuXHRpZiAoY29sdW1uS2V5KSB7XG5cdFx0Y29sdW1uRnJvbUFubm90YXRpb25zID0gYW5ub3RhdGlvbkNvbHVtbnMuZmluZCgoYW5ub3RhdGlvbkNvbHVtbikgPT4gYW5ub3RhdGlvbkNvbHVtbi5rZXkgPT09IGNvbHVtbktleSk7XG5cdFx0aWYgKGNvbHVtbkZyb21Bbm5vdGF0aW9ucz8uZXhwb3J0U2V0dGluZ3MgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBjb2x1bW5Gcm9tQW5ub3RhdGlvbnM/LmV4cG9ydFNldHRpbmdzO1xuXHRcdH1cblx0fVxuXHRjb25zdCBlbmFibGVXcmFwcGluZyA9XG5cdFx0ZXhwb3J0U2V0dGluZ3M/LndyYXAgPz9cblx0XHQoISEoZXhwb3J0U2V0dGluZ3M/LnByb3BlcnR5ICYmIGV4cG9ydFNldHRpbmdzLnByb3BlcnR5Py5sZW5ndGggPiAxKSB8fCAhIShwcm9wZXJ0eUluZm9zICYmIHByb3BlcnR5SW5mb3MubGVuZ3RoID4gMSkpO1xuXHRjb25zdCBjdXN0b21FeHBvcnRTZXR0aW5nczogQ29sdW1uRXhwb3J0U2V0dGluZ3MgPSB7XG5cdFx0Li4uY29sdW1uRnJvbUFubm90YXRpb25zPy5leHBvcnRTZXR0aW5ncyxcblx0XHR0eXBlOiBleHBvcnRTZXR0aW5ncz8udHlwZSA/PyBjb2x1bW5Gcm9tQW5ub3RhdGlvbnM/LmV4cG9ydFNldHRpbmdzPy50eXBlLFxuXHRcdHRlbXBsYXRlOlxuXHRcdFx0ZXhwb3J0U2V0dGluZ3M/LnRlbXBsYXRlID8/XG5cdFx0XHRfYXBwZW5kQ3VzdG9tVGVtcGxhdGUocHJvcGVydHlJbmZvcywgZXhwb3J0U2V0dGluZ3M/LnByb3BlcnR5KSA/P1xuXHRcdFx0Y29sdW1uRnJvbUFubm90YXRpb25zPy5leHBvcnRTZXR0aW5ncz8udGVtcGxhdGUsXG5cdFx0cHJvcGVydHk6IGV4cG9ydFNldHRpbmdzPy5wcm9wZXJ0eVxuXHRcdFx0PyBfZ2V0UHJvcGVydHlOYW1lcyhleHBvcnRTZXR0aW5ncz8ucHJvcGVydHksIGFubm90YXRpb25Db2x1bW5zLCBjb252ZXJ0ZXJDb250ZXh0LCBlbnRpdHlUeXBlKVxuXHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0d2lkdGg6IGV4cG9ydFNldHRpbmdzPy53aWR0aCxcblx0XHR3cmFwOiBlbmFibGVXcmFwcGluZ1xuXHR9O1xuXHRyZXR1cm4gcmVtb3ZlVW5kZWZpbmVkRnJvbUV4cG9ydFNldHRpbmdzKGN1c3RvbUV4cG9ydFNldHRpbmdzKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFtR0E7RUFNQTtFQUtBO0VBSUE7RUFjQTtFQThCQTtFQXNDQTtFQUFBLElBMENZQSxVQUFVLDBCQUFWQSxVQUFVO0lBQVZBLFVBQVU7SUFDQTtJQURWQSxVQUFVO0lBQVZBLFVBQVU7SUFBVkEsVUFBVTtJQUFBLE9BQVZBLFVBQVU7RUFBQTtFQU10QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFSQUMsUUFBQSxDQUFBRCxVQUFBLEdBQUFBLFVBQUE7RUFTTyxTQUFTRSxlQUFlQSxDQUM5QkMsa0JBQTRCLEVBQzVCQyxTQUFvQixFQUNwQkMsaUJB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVN1Uix1QkFBdUJBLENBQy9CdFosY0FBZ0QsRUFDaERuQixpQkFBMEMsRUFDMUNELGdCQUF5RCxFQUN6RCtFLFVBQXNCLEVBQ3RCcEQsYUFBd0IsRUFDeEIyYyxTQUFrQixFQUNZO0lBQzlCLElBQUlDLHFCQUFxQjtJQUN6QixJQUFJRCxTQUFTLEVBQUU7TUFDZEMscUJBQXFCLEdBQUd0ZSxpQkFBaUIsQ0FBQ3VCLElBQUksQ0FBRUUsZ0JBQWdCLElBQUtBLGdCQUFnQixDQUFDa0ksR0FBRyxLQUFLMFUsU0FBUyxDQUFDO01BQ3hHLElBQUlDLHFCQUFxQixFQUFFbmQsY0FBYyxLQUFLLElBQUksRUFBRTtRQUNuRCxPQUFPbWQscUJBQXFCLEVBQUVuZCxjQUFjO01BQzdDO0lBQ0Q7SUFDQSxNQUFNb2QsY0FBYyxHQUNuQnBkLGNBQWMsRUFBRWtMLElBQUksS0FDbkIsQ0FBQyxFQUFFbEwsY0FBYyxFQUFFb0IsUUFBUSxJQUFJcEIsY0FBYyxDQUFDb0IsUUFBUSxFQUFFMkUsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRXhGLGFBQWEsSUFBSUEsYUFBYSxDQUFDd0YsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZILE1BQU1zWCxvQkFBMEMsR0FBRztNQUNsRCxHQUFHRixxQkFBcUIsRUFBRW5kLGNBQWM7TUFDeEN3RCxJQUFJLEVBQUV4RCxjQUFjLEVBQUV3RCxJQUFJLElBQUkyWixxQkFBcUIsRUFBRW5kLGNBQWMsRUFBRXdELElBQUk7TUFDekV5SCxRQUFRLEVBQ1BqTCxjQUFjLEVBQUVpTCxRQUFRLElBQ3hCZ04scUJBQXFCLENBQUMxWCxhQUFhLEVBQUVQLGNBQWMsRUFBRW9CLFFBQVEsQ0FBQyxJQUM5RCtiLHFCQUFxQixFQUFFbmQsY0FBYyxFQUFFaUwsUUFBUTtNQUNoRDdKLFFBQVEsRUFBRXBCLGNBQWMsRUFBRW9CLFFBQVEsR0FDL0JrVixpQkFBaUIsQ0FBQ3RXLGNBQWMsRUFBRW9CLFFBQVEsRUFBRXZDLGlCQUFpQixFQUFFRCxnQkFBZ0IsRUFBRStFLFVBQVUsQ0FBQyxHQUM1Rm5ELFNBQVM7TUFDWmxCLEtBQUssRUFBRVUsY0FBYyxFQUFFVixLQUFLO01BQzVCNEwsSUFBSSxFQUFFa1M7SUFDUCxDQUFDO0lBQ0QsT0FBT2hTLGlDQUFpQyxDQUFDaVMsb0JBQW9CLENBQUM7RUFDL0Q7RUFBQyxPQUFBOWUsUUFBQTtBQUFBIiwiaWdub3JlTGlzdCI6W119